home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / cpmug / cpmug017.ark / FUNCTION.ASM < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  5.8 KB  |  333 lines

  1. ;   
  2. ; SYSTEM FUNCTIONS MODULE
  3. ; COPYRIGHT 1976 D. KRUGLINSKI
  4. ; SYSTEM CALL, MOVE, ACCELERATION, RANDOM
  5. ;
  6. MSTRT    EQU    0C00H    ;LOAD ADDRESS
  7. ;
  8. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  9. ; MACROS
  10. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  11. ; COMPLEMENT HL
  12. COMHL    MACRO
  13.     MOV    A,H
  14.     CMA
  15.     MOV    H,A
  16.     MOV    A,L
  17.     CMA
  18.     MOV    L,A
  19.     INX    H
  20.     ENDM
  21. ; LOAD HL INDEXED (BC=BASE)
  22. LDBLX    MACRO    OFSET
  23.     PUSH    D
  24.     LXI    H,OFSET
  25.     DAD    B
  26.     MOV    E,M
  27.     INX    H
  28.     MOV    D,M
  29.     XCHG
  30.     POP    D
  31.     ENDM
  32. ; STORE HL INDEXED (BC=BASE)
  33. SDBLX    MACRO    OFSET
  34.     PUSH    D
  35.     XCHG
  36.     LXI    H,OFSET
  37.     DAD    B
  38.     MOV    M,E
  39.     INX    H
  40.     MOV    M,D
  41.     POP    D
  42.     ENDM
  43. ; LOAD REG INDEXED (BC=BASE)
  44. ;  HL DESTROYED
  45. LOADX    MACRO    REG,OFSET
  46.     LXI    H,OFSET
  47.     DAD    B
  48.     MOV    REG,M
  49.     ENDM
  50. ; STORE REG INDEXED (BC=BASE)
  51. ;  HL DESTROYED
  52. STORX    MACRO    REG,OFSET
  53.     LXI    H,OFSET
  54.     DAD    B
  55.     MOV    M,REG
  56.     ENDM
  57. ;
  58.     ORG    38H    ;RST 7 ADDRESS
  59.     JMP    SYSCL
  60.     ORG    MSTRT    ;LOAD ADDRESS
  61. ;
  62. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  63. ; SYSTEM CALL FUNCTION
  64. ;    ENTERED ON RST 7 FOLLOWED BY FUNCTION #
  65. ;      DESTROYS HL ONLY
  66. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  67. SYSCL:    POP    H    ;GET CALL # ADDR
  68.     INX    H
  69.     PUSH    H    ;RETURN ADDRESS
  70.     DCX    H    ;CALL # ADDRESS
  71.     PUSH    D    ;SAVE DE
  72.     MOV    E,M
  73.     MVI    D,0    ;CALL # IN DE
  74.     LXI    H,CALTB    ;CALL TABLE BASE
  75.     DAD    D
  76.     DAD    D    ;ADD #
  77.     MOV    E,M
  78.     INX    H
  79.     MOV    D,M
  80.     XCHG        ;ADDR IN HL
  81.     POP    D    ;RESTORE DE
  82.     PCHL        ;JUMP TO SUBROUTINE
  83. CALTB:    DW    MOVE
  84.     DW    ACCEL
  85.     DW    RAND
  86.     DW    0
  87. ;
  88. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  89. ; GENERAL PURPOSE MOVE FUNCTION
  90. ; ASSUMES FIRST OBJECT BLOCK LOCATIONS AS FOLLOWS:
  91. ;    0    X(N)
  92. ;    1
  93. ;    2    X(N-1)
  94. ;    3
  95. ;    4    X ACCELERATION
  96. ;    5
  97. ;    6    Y(N)
  98. ;    7
  99. ;    8    Y(N-1)
  100. ;    9
  101. ;    A    Y ACCELERATION
  102. ;    B
  103. ;    C    POINTER TO 'MBEAM' INSTR
  104. ;    D
  105. ; CALL: SCALL 0
  106. ;
  107. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  108. MOVE:    PUSH    B    ;SAVE BC
  109.     CALL    MOV1    ;UPDATE X
  110.     CALL    MOV1    ;UPDATE Y
  111.     LDAX    B    ;INST PNTR IN DE
  112.     MOV    E,A
  113.     INX    B
  114.     LDAX    B
  115.     MOV    D,A
  116.     INX    D    ;X COORD ADDRESS
  117.     POP    B    ;ORIG BC (TOP OF LIST)
  118.     LOADX    A,1    ;X(N) H.O.
  119.     ADI    80H    ;ZERO AT SCREEN CENTER
  120.     STAX    D    ;X COORD
  121.     INX    D    ;Y COORD ADDR
  122.     LOADX    A,7    ;Y(N) H.O.
  123.     ADI    80H    ;ZERO AT SCREEN CENTER
  124.     STAX    D    ;Y COORD
  125.     RET
  126. ; UPDATE EITHER X OR Y
  127. MOV1:    PUSH    B    ;SAVE BC FOR X(N)
  128.     LDAX    B    ;X(N) TO DE
  129.     MOV    E,A
  130.     INX    B
  131.     LDAX    B
  132.     MOV    D,A
  133.     INX    B    ;-X(N-1) TO HL
  134.     LDAX    B    ; AND DE TO NEW X(N-1)
  135.     CMA
  136.     MOV    L,A
  137.     MOV    A,E
  138.     STAX    B
  139.     INX    B
  140.     LDAX    B
  141.     CMA
  142.     MOV    H,A
  143.     MOV    A,D
  144.     STAX    B
  145.     INX    H
  146.     DAD    D    ;HL+DE+DE TO HL
  147.     DAD    D
  148.     INX    B    ;XACC TO DE
  149.     LDAX    B
  150.     MOV    E,A
  151.     INX    B
  152.     LDAX    B
  153.     MOV    D,A
  154.     DAD    D    ;HL+XACC TO HL
  155.     POP    D    ;BC FOR X(N)
  156.     MOV    A,L    ;HL TO NEW X(N) 
  157.     STAX    D
  158.     INX    D
  159.     MOV    A,H
  160.     STAX    D
  161.     INX    B    ;SETUP FOR NEXT BYTE
  162.     RET
  163. ;
  164. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  165. ; ORBITAL ACCELERATION LOOKUP FUNCTION
  166. ;    1024-VALUE VERSION (2 BYTES/VALUE)
  167. ;    CALL:    SCALL    1
  168. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  169. ;
  170. ATAB    EQU    0E00H    ;LOCATION OF ACC TABLE
  171. XN    SET    0
  172. XACC    SET    4
  173. YN    SET    6
  174. YACC    SET    0AH
  175. ;   ADJUST X & Y FOR TABLE LOOKUP & SET SHIFT COUNT
  176. ACCEL:    MVI    A,3
  177.     STA    SHCNT    ;SET SHIFT COUNT (6 SHIFTS)
  178.     LDBLX    XN    ;X VALUE
  179.     MOV    A,H
  180.     STA    HOXN    ;SAVE H.O. X
  181.     CPI    0
  182.     JP    POSX    ;ABS VALUE X
  183.     COMHL
  184. POSX:    XCHG        ;IN DE
  185.     LDBLX    YN    ;Y VALUE
  186.     MOV    A,H
  187.     STA    HOYN    ;SAVE H.O. Y
  188.     CPI    0
  189.     JP    POSY    ;ABS VALUE OF Y
  190.     COMHL
  191. POSY:    MOV    A,H    ;IN HL
  192.     ORA    D    ;COMBINE H.O. X & Y
  193.     CPI    40H
  194.     JP    GETAD    ;JUMP IF > OR = 40H
  195.     DAD    H    ;DOUBLE Y IN HL
  196.     XCHG
  197.     DAD    H    ;DOUBLE X IN DE
  198.     XCHG
  199.     LDA    SHCNT
  200.     DCR    A
  201.     STA    SHCNT    ;DECREMENT SHIFT COUNT
  202.     JNZ    POSY    ;LOOP IF > 0
  203. ;   COMPUTE XACC TABLE OFFSET FROM X & Y (IN DE)
  204. GETAD:    MOV    A,D    ;H.O. X
  205.     RRC
  206.     RRC
  207.     RRC
  208.     RRC        ;ROTATE RIGHT 4
  209.     MOV    E,A
  210.     ANI    7H
  211.     MOV    D,A    ;H.O. TABLE OFFSET
  212.     MOV    A,E
  213.     ANI    0C0H
  214.     MOV    E,A
  215.     MOV    A,H    ;H.O. Y
  216.     RRC
  217.     ANI    3EH
  218.     ORA    E
  219.     MOV    E,A    ;L.O. TABLE OFFSET
  220.     PUSH    D    ;SAVE OFFSET FOR LATER
  221.     CALL    RETRV    ;GET ACC VAULE
  222. ;   MAKE XACC SIGN AGREE WITH -X COORD
  223.     LDA    HOXN    ;H.O. X VALUE
  224.     CPI    0    ;TEST SIGN
  225.     JM    XMINS
  226.     COMHL        ;POS - COMP XACC
  227. XMINS:    SDBLX    XACC    ;STORE IN OBJ BLK
  228. ;   COMPUTE YACC TABLE OFFSET FROM XACC OFFSET
  229.     POP    H    ;XACC OFFSET IN HL
  230.     MOV    A,L
  231.     RRC
  232.     RRC
  233.     RRC
  234.     MOV    E,A
  235.     ANI    7H
  236.     MOV    D,A    ;H.O. TABLE OFFSET
  237.     MOV    A,E
  238.     ANI    0C0H
  239.     MOV    E,A
  240.     MOV    A,L
  241.     ANI    0C0H
  242.     ORA    H
  243.     RLC
  244.     RLC
  245.     RLC
  246.     ORA    E
  247.     MOV    E,A    ;L.O. OFFSET
  248.     CALL    RETRV    ;GET YACC VALUE
  249. ;   MAKE YACC SIGN AGREE WITH -Y COORD
  250.     LDA    HOYN
  251.     CPI    0
  252.     JM    YMINS
  253.     COMHL
  254. YMINS:    SDBLX    YACC    ;STORE YACC IN OBJ BLK
  255.     RET        ;RETURN TO CALLING PROGRAM
  256. ;
  257. ; SUBROUTINE TO RESTORE ACC VALUE FROM TABLE TO HL
  258. ;  AND ADJUST ACC BY SHIFT COUNT
  259. ;  INPUT: OFFSET IN DE
  260. RETRV:    LXI    H,ATAB    ;TABLE BASE
  261.     DAD    D    ;ADD OFFSET
  262.     MOV    E,M
  263.     INX    H
  264.     MOV    D,M    ;DATA IN DE
  265.     PUSH    B
  266.     LDA    SHCNT    ;SAVE SHIFT COUNT IN B
  267.     MOV    B,A
  268.     CPI    0
  269.     JZ    EXIT    ;SHIFT COUNT=0
  270. ;   SHIFT DE RIGHT 2 (DE < 1000)
  271.     MOV    A,D
  272.     RRC
  273.     RRC
  274.     MOV    D,A
  275.     MOV    A,E
  276.     RRC
  277.     RRC
  278.     PUSH    PSW    ;SAVE CARRY FOR ROUNDING
  279.     ANI    3FH
  280.     ORA    D
  281.     MOV    E,A
  282.     MVI    D,0
  283. ;   DECREMENT & TEST SHIFT COUNT
  284. LOOP:    DCR    B
  285.     JZ    ROUND    ;DONE SHIFTING
  286. ;   SHIFT E RIGHT 2 (D=0)
  287.     POP    PSW    ;SANE STACK
  288.     MOV    A,E
  289.     RRC
  290.     RRC
  291.     PUSH    PSW    ;SAVE CARRY
  292.     ANI    3FH
  293.     MOV    E,A
  294.     JMP    LOOP
  295. ROUND:    POP    PSW    ;RESTORE CARRY FROM LAST SFT
  296.     MOV    A,E    ;L.O. ACC
  297.     ACI    0    ;ROUND
  298.     MOV    E,A    ;RESTORE E
  299. EXIT:    XCHG        ;ACC IN HL
  300.     POP    B    ;RESTORE INDEX REG
  301.     RET
  302. ;
  303. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  304. ; RANDOM NUMBER FUNCTION
  305. ;   GENERATES A NEW RANDOM NUMBER IN A AND 'RND'
  306. ;   CALL:    SCALL     2
  307. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  308. ;
  309. RAND:    LXI    H,RND
  310.     MOV    A,M
  311.     CPI    0
  312.     JNZ    RANSKP
  313.     INR    A
  314. RANSKP:
  315.     MOV    M,A
  316.     STC
  317.     ANI    8EH    ;FEEDBACK MASK,CLEAR CARRY
  318.     JPE    CLEAR    ;XOR FEEDBACK BITS
  319.     CMC        ;SET CARRY IF XOR TRUE
  320. CLEAR:    MOV    A,M    ;RESTORE RND
  321.     RAL        ;SHIFT IN CARRY
  322.     MOV    M,A    ;IN MEMORY
  323.     RET
  324. ;
  325. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  326. ; WORKING STORAGE
  327. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  328. RND:    DB    23H    ;RANDOM NUMBER
  329. HOXN:    DB    0    ;H.O. X VALUE
  330. HOYN:    DB    0    ;H.O. Y VALUE
  331. SHCNT:    DB    0    ;ACC SHIFT COUNT
  332.     END
  333.