home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpmug / cpmug035.ark / POSIT.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  3KB  |  118 lines

  1. ; 23 MAR:PUT WITTENBERG'S 'FLY' ALGORITHM INTO POSIT.
  2. * POSIT * TYE SHULTZ / 3 FEB 79 / VERSION 1.2
  3. *
  4. * 'POSIT'  TRANSLATES THE OBJECT NAMEDD BY THE FIRST PARAMETER SO THAT
  5. * ITS CENTER-OF-GRAVITY (BYTES 2,3) IS AT SCREEN LOCATION
  6. * INDICATED BY THE NEXT TWO PARAMETERS.
  7. *
  8. * --IF CALLED AT 'POSCALL',RELOCATES OBJECT NAMED IN REG.D
  9. * TO POSITION B,C.
  10. *
  11. * SYSTEM SUBROUTINES: INPARM, OBJR, OBJW
  12. *
  13. * ALL REGISTERS ARE RESTORED ON EXIT.
  14. *
  15. PIXEL1X    EQU    2
  16. INPARM    EQU    5030H
  17. OBJR    EQU    5006H
  18. OBJW    EQU    5009H
  19. SPECODE    EQU    0FFH
  20. ENDFLAG    EQU    80H
  21.     ORG    2DB0H
  22. *
  23. *
  24. ;  GET OBJECT NUMBER, AND DESIRED X,Y OF FIRST PIXEL.
  25. ;
  26.     CALL    INPARM    ; SAVE OBJ # IN D.
  27.     MOV    D,E
  28.     XCHG        ; SAVE OBJ # TEMPORARILY IN H.
  29.     CALL    INPARM    ; SAVE NEW X IN B.
  30.     MOV    B,E
  31.     CALL    INPARM    ; SAVE NEX Y IN C.
  32.     MOV    C,E
  33.     XCHG        ; GET OBJ # BACK IN D.
  34. ;
  35. ;  FIGURE DISPLACEMENT FROM OLD FIRST  X TO NEW ONE.
  36. ;
  37.     MVI    E,PIXEL1X    ; SELECT BYTE 2 (X OF CTR OF GRAV).
  38.     CALL    OBJR    ; GET FIRST X  INTO 'A'.
  39.     SUB    B    ; SUBTRACT NEW FIRST X FROM IT.
  40.     CMA
  41.     INR    A    ; COMPLEMENT DISPLACEMENT.
  42.     MOV    H,A    ; SAVE DISPLACEMENT FOR TRANSLATION LOOP.
  43.     MOV    A,B    ; SAVE NEW FIRST X IN OBJECT.
  44.     CALL    OBJW
  45.     MOV    B,H    ; SET UP TRANSLATION VECTOR X.
  46. ;
  47. ;   FIGURE DISPLACEMENT FROM OLD FIRST Y TO NEW ONE.
  48. ;
  49.     INR    E    ; POINT E AT BYTE 6. (OLD FIRST Y COORD.)
  50.     CALL    OBJR    ; 'A' NOW HAS THE OLD Y.
  51.     SUB    C    ; SUBTRACT NEW Y FROM OLD.
  52.     CMA        ; NEGATE DISPLACEMENT.
  53.     INR    A    ; 
  54.     MOV    L,A    ; SAVE DISPLACEMMENT FOR TRANSLATION LOOP.
  55.     MOV    A,C    ; SET NEW FIRST PIXEL Y IN OBJECCT.
  56.     CALL    OBJW    
  57.     MOV    C,L    ; SET UPP TRANSLATION VECTOR  Y.
  58. ;
  59. ;
  60. ; -IF YOU ENTER TRANSLATE LOOP FROM ABOVE(POSIT) THEN
  61. ;  E=4 HERE, BECAUSE CTR OF GRAV.ALREADY FIXED.
  62. ;
  63. ;   SET UP FOR TRANSLATE LOOP.
  64. ;
  65. FLYIN:    MVI    H,SPECODE    ; SET H TO SPECIAL CODE.
  66.     MVI    L,ENDFLAG    ;L CONTAINS END-OF-OBJ.FLAG.
  67. ;
  68. ;   TRANSLATE LOOP...................................
  69. TRANS:    MOV    A,B
  70.     ORA    A
  71.     JP    FLNEXT
  72.     DCR    B    ;THIS MAKES A '-1' BE 'FE'
  73. FLNEXT:    INR    E    ;NEXT OBJ'S X-BYTE.
  74.     CALL    OBJR
  75.     CMP    H    ;IS IT SPECIAL CODE?
  76.     JNZ    FLADD    ;NO,SO GO DEAL WITH IT.
  77. ;YES,SPEC.CODE.IS IT SPEC.CODE 80(END OF OBJ?)
  78.     INR    E
  79.     CALL    OBJR
  80.     CMP    L    ;WHICH HOLDS 80
  81.     JNZ    FLNEXT
  82.     RET        ;ALL OVER.
  83. ;
  84. FLADD:    ADD    B    ;ADD X-CHANGE TO X VALUE.
  85.     JNC    NOINRA    ;IF THERE WAS A CARRY WE MUST
  86.     INR    A    ;'BUMP' RESULT.WE EFFECTIVELY
  87. NOINRA:    CMP    H    ;DO 1'S COMPLEMENT ARITH.
  88.     JNZ    NOIN
  89.     INR    A    ;THIS PUSHES FF UP TO 00.
  90. NOIN:    CALL    OBJW    ;PUT 'FLOWN' X OUT.
  91.     INR    E
  92.     CALL    OBJR
  93.     ADD    C    ;WE FLY Y NOW.
  94.     CALL    OBJW
  95.     JMP    FLNEXT
  96. ;
  97. ; FLY --- JMM  3/79
  98. ;  -ALGORITHM FROM WITTENBERG,AU 78.
  99. ;
  100. ;FLY TAKES 3 PARAMS: OBJECT, X-CHANGE, Y-CHANGE.IT MOVES
  101. ;THE OBJECT BY THAT DIS. ON EVERY CALL. SHARES CODE WITH
  102. ; 'POSIT'.
  103. ; FLY CAN BE CALLED A FLYCALL. OBJECT D IS FLOWN BY 
  104. ; DISTANCE (B,C ).
  105. ;
  106.     ORG    2E30H
  107. FLY:    CALL    INPARM
  108.     MOV    H,E
  109.     CALL    INPARM
  110.     MOV    B,E    ;DELTA-X IN B
  111.     CALL    INPARM
  112.     MOV    C,E    ;DELTA-Y IN C
  113.     MOV    D,H
  114. FLYCALL:MVI    E,1    ;POINTER IN OBJR CALLS (COMING UP)
  115.     JMP    FLYIN
  116. ;
  117.     END
  118.