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

  1. ;    
  2. ;INTERRUPT HANDLERS & EXECUTIVE MODULE
  3. ; COPYRIGHT 1976 D. KRUGLINSKI
  4. ;
  5. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  6. ; SYSTEM LINKAGES
  7. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  8. ESTRT    EQU    300H    ;LOAD ADDRESS
  9. TADR    EQU    42H    ;ADDRESS OF # TASKS
  10. ;             FOLLOWED BY DISPATCH TABLE
  11. KINTA    EQU    10H    ;KBRD INT ADDR
  12. CINTA    EQU    18H    ;RTC INT ADDR
  13. KINTC    EQU    0FFC1H    ;KBRD INT CONROL ADDR
  14. KDCOD    EQU    44H    ;KEYBOARD DECODER ADDR
  15. TIME    EQU    3FH
  16.     ORG    KINTA    ;KEYBOARD INTERRUPT
  17.     JMP    KBENT    ;HANDLER ADDR
  18.     ORG    CINTA    ;RTC INTERRUPT
  19.     JMP    CENT    ;CLOCK HANDLER
  20.     ORG    TIME
  21.     DB    0
  22.     ORG    KDCOD
  23.     DW    KBDCD    ;DUMMY KB DECODER
  24.     ORG    ESTRT
  25. ;
  26. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  27. ; HANDLER FOR REAL-TIME CLOCK OR 'EXEC' COMMAND
  28. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  29. CENT:    PUSH    PSW
  30.     PUSH    H    ;SAVE ALL REGS
  31.     LXI    H,TIME
  32.     INR    M    ;INCREMENT TIME
  33.     LXI    H,TIME-1
  34.     MVI    A,1
  35.     CMP    M
  36.     JZ    CENTX
  37.     MOV    M,A
  38.     PUSH    B
  39.     PUSH    D
  40.     EI        ;ENABLE INTERRUPT
  41.     JMP    EXECU    ;GO TO EXECUTIVE
  42. CENTX:
  43.     POP    H    ;RESTORE REGS
  44.     POP    PSW
  45.     EI
  46.     RET        ;RETURN TO GRAPHICS
  47. ;
  48. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  49. ; HANDLER FOR KEYBOARD
  50. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  51. KBENT:    PUSH    PSW
  52.     PUSH    B
  53.     PUSH    D
  54.     PUSH    H
  55.     LDA    KINTC    ;REAC CHAR/CLEAR
  56.     EI
  57.     LXI    H,HRTN
  58.     PUSH    H    ;SAVE RETURN ADDR
  59.     LHLD    KDCOD    ;KEYBOARD DECODER
  60.     PCHL        ;SIMULATED 'CALL'
  61. HRTN:    POP    H
  62.     POP    D
  63.     POP    B
  64.     POP    PSW
  65.     RET        ;RTNNTERRUPTED PGM
  66. ;
  67. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  68. ; EXECUTIVE -- SCANS DISPATCH TABLE, DISPATCHES
  69. ;  PROGRAM WITH OBJECT BLOCK WHEN TIMES MATCH
  70. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  71. EXECU:    LXI    H,TIME
  72.     MOV    B,M    ;SAVE TIME IN B
  73.     LHLD    TADR    ;# OF TASKS
  74.     MOV    C,M
  75.     INX    H    ;TOP OF DISPATCH TABLE
  76.     LXI    D,5
  77. ELOOP:    MOV    A,M
  78.     ANA    B    ;MASK TIME FOR TASK
  79.     INX    H
  80.     CMP    M    ;COMPARE OBJECT TIME
  81.     JNZ    NOTEQ    ;DISPATCH IF EQUAL
  82.     PUSH    B    ;SAVE BC (TIME & #)
  83.     INX    H
  84.     MOV    C,M
  85.     INX    H
  86.     MOV    B,M    ;OBJECT BLOCK ADDR IN BC
  87.     INX    H
  88.     MOV    E,M
  89.     INX    H
  90.     MOV    D,M    ;PROGRAM ADDR IN DE
  91.     INX    H
  92.     PUSH    H    ;SAVE HL (POINTER IN LIST)
  93.     LXI    H,ERTN
  94.     PUSH    H    ;SAVE RETURN ADDRESS
  95.     XCHG        ;PROGRAM ADDRESS IN HL
  96.     PCHL        ;JUMP TO PROGRAM (CALL)
  97. ERTN:    POP    H    ;RESTORE POINTER
  98.     POP    B    ;RESTORE BC
  99.     LXI    D,5
  100.     JMP    ENDL    ;CONTINUE SCANNING TABLE
  101. NOTEQ:    DAD    D    ;HL=HL+5
  102. ENDL:    DCR    C    ;DECREMENT TASK CNT
  103.     JNZ    ELOOP    ;TEST NEXT TASK
  104.     LXI    H,TIME-1
  105.     MVI    M,0
  106.     POP    D
  107.     POP    B
  108.     POP    H
  109.     POP    PSW
  110.     RET        ;RETURN TO HANDLER
  111. ;   
  112. ;SPACE WAR APPLICATIONS MODULE
  113. ; COPYRIGHT 1976 D. KRUGLINSKI
  114. ;
  115. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  116. ; IMPORTANT CONSTANTS
  117. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  118. ASTRT    EQU    500H    ;LOAD ADDRESS
  119. BADR1    EQU    0FFFEH    ;BUTTON READ ADDRESS
  120. SUN    EQU    7    ;COLLISION RAD OF SUN
  121. INTVL    EQU    18H    ;DURATION OF EXPLOSION
  122. EPSLN    EQU    8H    ;COLLSIION RAD OF TORPEDOS
  123. ACON    EQU    8    ;ACCELERATION CONSTANT
  124. RMAX    EQU    12    ;TORPEDO TIMEOUT
  125. VCON    EQU    300H    ;TORPEDO RELATIVE VELOCITY
  126. HDLY    EQU    20H    ;HYPERSPACE EXIT DELAY
  127. LIMIT    EQU    7AH    ;SCREEN EDGE
  128. ;
  129. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  130. ; MACROS
  131. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  132. ;
  133. ; GRAPHICS MACROS
  134. MBEAM    MACRO    X,Y
  135.     DB    0
  136.     DB    X
  137.     DB    Y
  138.     ENDM
  139. ;
  140. MDISP    MACRO    X,Y
  141.     DB    2
  142.     DB    X
  143.     DB    Y
  144.     ENDM
  145. ;
  146. LVEC    MACRO    X,Y
  147.     DB    4
  148.     DB    X
  149.     DB    Y
  150.     ENDM
  151. ;
  152. SVEC    MACRO
  153.     DB     6
  154.     ENDM
  155. SV    MACRO    LEN,DIR
  156.     DB    DIR OR (LEN SHL 4)
  157.     ENDM
  158. SVF    MACRO    LEN,DIR
  159.     DB    DIR OR (LEN SHL 4) OR 8H
  160.     ENDM
  161. SVE    MACRO    LEN,DIR
  162.     DB    DIR OR (LEN SHL 4) OR 80H
  163.     ENDM
  164. SVEF    MACRO    LEN,DIR
  165.     DB    DIR OR (LEN SHL 4) OR 88H
  166.     ENDM
  167. ;
  168. PARAM    MACRO    SCL,ORN
  169.     DB    8
  170.     DB    ORN OR (SCL SHL 4)
  171.     ENDM
  172. ;
  173. JUMP    MACRO    ADDR
  174.     DB    0AH
  175.     DW    ADDR
  176.     ENDM
  177. ;
  178. JUMPS    MACRO    ADDR
  179.     DB    0CH
  180.     DW    ADDR
  181.     ENDM
  182. ;
  183. RETS    MACRO
  184.     DB    0EH
  185.     ENDM
  186. ;
  187. EXEC    MACRO
  188.     DB    10H
  189.     ENDM
  190. ;
  191. ; ENTRY MACRO FOR DISPATCH TABLE
  192. ENTRY    MACRO    MASK,TIME,OBJ,PROG
  193.     DB    MASK
  194.     DB    TIME
  195.     DW    OBJ
  196.     DW    PROG
  197.     ENDM
  198. ;
  199. ; SYSTEM CALL MACRO
  200. SCALL    MACRO    MODN
  201.     RST    7
  202.     DB    MODN
  203.     ENDM
  204. ;
  205. ; MACRO TO CREATE 12-BYTE COORDINATE BLK
  206. COORD    MACRO    XN,XM,XAC,YN,YM,YAC
  207.     DW    XN
  208.     DW    XM
  209.     DW    XAC
  210.     DW    YN
  211.     DW    YM
  212.     DW    YAC
  213.     ENDM
  214. ;
  215. ; MACRO TO LOAD REG INDEXED (BC=BASE)
  216. ;  DESTROYS HL
  217. LOADX    MACRO    REG,OFSET
  218.     LXI    H,OFSET
  219.     DAD    B
  220.     MOV    REG,M
  221.     ENDM
  222. ;
  223. ; MACRO TO STORE REG INDEXED (BC=BASE)
  224. ;  DESTROYS HL
  225. STORX    MACRO    REG,OFSET
  226.     LXI    H,OFSET
  227.     DAD    B
  228.     MOV    M,REG
  229.     ENDM
  230. ;
  231. ; MACRO TO LOAD 2 BYTES FROM OFSET
  232. ; INTO HL (BC=BASE ADDR)
  233. LDBLX    MACRO    OFSET
  234.     PUSH    D
  235.     LXI    H,OFSET
  236.     DAD    B
  237.     MOV    E,M
  238.     INX    H
  239.     MOV    D,M
  240.     XCHG
  241.     POP    D
  242.     ENDM
  243. ;
  244. ; MACRO TO STORE 2 BYTES IN OFSET
  245. ; FROM HL (BC=BASE ADDR)
  246. SDBLX    MACRO    OFSET
  247.     PUSH    D
  248.     XCHG
  249.     LXI    H,OFSET
  250.     DAD    B
  251.     MOV    M,E
  252.     INX    H
  253.     MOV    M,D
  254.     POP    D
  255.     ENDM
  256. ;
  257. ;MACRO TO TAKE ABSOLUTE VALUE OF A
  258. ABS    MACRO
  259.     CPI    0
  260.     JP    POS    ;JUMP IF A POS
  261.     CMA        ;COMPLEMENT A
  262. POS:
  263.     ENDM
  264. ;
  265. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  266. ; LINKAGE BETWEEN SYSTEM AND APPLICATION
  267. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  268. TIME    EQU    3FH
  269. NUMS    EQU    46H
  270.     ORG    40H
  271.     DW    START    ;DISPLAY FILE
  272.     ORG    42H
  273.     DW    NTSK    ;# TASKS + LIST
  274.     ORG    44H
  275.     DW    KBDCD    ;KEYBOARD DECODE
  276. ;
  277. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  278. ; DISPATCH TABLE + NUMBER OF OBJECTS
  279. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  280.     ORG    ASTRT
  281. NTSK:    DB    14    ;# TASKS
  282. ; DISPATCH TABLE
  283. IENT1:    ENTRY    0,0,SH1,INIT
  284. IENT2:    ENTRY    0,0,SH2,INIT
  285. PENT1:    ENTRY    0,1,SH1,SSTRT
  286. PENT2:    ENTRY    0,1,SH2,SSTRT
  287.     ENTRY    0,0,SH1,SFLY
  288.     ENTRY    0,0,SH2,SFLY
  289.     ENTRY    0,0,BU1,BFLY
  290.     ENTRY    0,0,BU2,BFLY
  291. GENT1:    ENTRY    0,1,SH1,FIRE
  292. GENT2:    ENTRY    0,1,SH2,FIRE
  293.     ENTRY    0FH,0,SC1,SCORE
  294.     ENTRY    0FH,8,SC2,SCORE
  295.     ENTRY    7H,2,SH1,ROT
  296.     ENTRY    7H,6,SH2,ROT
  297. ;
  298. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  299. ; OBJECT BLOCKS
  300. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  301. ;
  302. ;   SHIP OBJECT BLOCKS
  303. SH1:    COORD    0,0,0,0,0,0    ;DYNAMIC COORDS
  304.     DW    PPOS1    ;PNTR TO MBEAM INSTR
  305. ;  START POSTN
  306.     COORD    -6F00H,-7000H,0,6000H,6000H,0
  307.     DW    BU1    ;PNTR TO TORPEDO
  308.     DW    PEXH1+1    ;CALL EXHAUST/ZERO
  309.     DW    SHIP1    ;SHIP SUB
  310.     DW    PSUB1+1    ;CALL SHIP/EXPLO
  311.     DW    PDIR1+1    ;SHIP ORENT
  312.     DW    PENT1    ;BACK POINTER
  313.     DW    GENT1    ;FIRE ENTRY
  314.     DW    SC1    ;SCORE
  315.     DB    01H    ;ACC BUTTON MASK
  316.     DB    02H    ;FIRE MASK
  317.     DB    04H    ;CW MASK
  318.     DB    08H    ;CCW MASK
  319.     DB    0    ;INHIBIT FIRE
  320.     DB    0    ;ORIENTATION
  321.     DW    BADR1    ;BUTTON ADDRESS
  322.     DB    0CH    ;HYPERSPACE MASK
  323.     DB    0    ;HYPERSPACE FLAG
  324.     DB    0    ;INITIAL ORIENTATION
  325.     DW    IENT1    ;BACK PNTR TO INIT PGM
  326. SH2:    COORD    0,0,0,0,0,0
  327.     DW    PPOS2
  328.     COORD    6F00H,7000H,0,-6000H,-6000H,0
  329.     DW    BU2
  330.     DW    PEXH2+1
  331.     DW    SHIP2
  332.     DW    PSUB2+1
  333.     DW    PDIR2+1
  334.     DW    PENT2
  335.     DW    GENT2
  336.     DW    SC2
  337.     DB    10H
  338.     DB    20H
  339.     DB    40H
  340.     DB    80H
  341.     DB    0
  342.     DB    0
  343.     DW    BADR1
  344.     DB    0C0H
  345.     DB    0
  346.     DB    4
  347.     DW    IENT2
  348. ;   TORPEDO OBJECT BLOCKS
  349. BU1:    COORD    0,0,0,0,0,0    ;DYN COORDS
  350.     DW    BPOS1    ;PNTR TO MDISP INSTR
  351.     DW    BU2    ;PNTR TO NEXT TORPEDO
  352.     DB    0    ;COUNTDOWN SINCE FIRING
  353. BU2:    COORD    0,0,0,0,0,0
  354.     DW    BPOS2
  355.     DW    0
  356.     DB    0
  357. ;   SCORE OBJECT BLOCKS
  358. SC1:    DB    0    ;BINARY SCORE VAL
  359.     DW    SC11+1    ;1ST DIGIT
  360.     DW    SC12+1    ;2ND DIGIT
  361. SC2:    DB    0
  362.     DW    SC21+1
  363.     DW    SC22+1
  364. ; WORKING STORAGE LOCATION
  365. ORSAV:    DW    0
  366. ;
  367. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  368. ; DISPLAY FILE
  369. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  370. START:    EXEC
  371.     MBEAM    80H,80H    ;SUN
  372.     PARAM    0,0
  373.     JUMPS    SUNSB
  374. PPOS1:    MBEAM    0,0E0H
  375. PDIR1:    PARAM    1,0
  376. PEXH1:    JUMPS    NULL
  377. PSUB1:    JUMPS    SHIP1
  378. PPOS2:    MBEAM    0,0C0H
  379. PDIR2:    PARAM    1,0
  380. PEXH2:    JUMPS    NULL
  381. PSUB2:    JUMPS    SHIP2
  382. BPOS1:    MBEAM    0,0
  383. BPOS2:    MBEAM    0,0
  384.     PARAM    1,0
  385.     MBEAM    1,1
  386. SC11:    JUMPS    NULL
  387. SC12:    JUMPS    NULL
  388.     MBEAM    0D0H,1
  389. SC21:    JUMPS    NULL
  390. SC22:    JUMPS    NULL
  391.     JUMP    START
  392. ;
  393. SUNSB:    SVEC
  394.     SVF    6,0
  395.     SV    3,2
  396.     SV    3,3
  397.     SV    6,4
  398.     SV    3,5
  399.     SV    6,6
  400.     SV    3,7
  401.     SV    6,0
  402.     SV    3,1
  403.     SVE    3,2
  404.     RETS
  405. ;
  406. SHIP1:    SVEC
  407.     SVF    3,0
  408.     SV    2,5
  409.     SV    4,4
  410.     SV    2,2
  411.     SVF    2,6
  412.     SVF    4,0
  413.     SVF    2,1
  414.     SV    2,3
  415.     SV    4,4
  416.     SVE    2,6
  417.     RETS
  418. SHIP2:    SVEC
  419.     SV    3,0
  420.     SV    2,5
  421.     SV    4,4
  422.     SV    2,2
  423.     SVF    2,6
  424.     SVF    4,0
  425.     SVF    2,1
  426.     SV    2,3
  427.     SV    4,4
  428.     SVE    2,6
  429.     RETS
  430. EXPLO:    PARAM    2,0
  431.     SVEC
  432.     SVF    3,0
  433.     SV    6,4
  434.     SVF    3,2
  435.     SV    6,7
  436.     SVF    3,4
  437.     SV    6,2
  438.     SVF    3,0
  439.     SVE    6,5
  440.     RETS
  441. NULL:    RETS
  442. EXHST:    SVEC
  443.     SV    7,4
  444.     SVEF    7,0
  445.     RETS
  446. ;
  447. ; *********** PROGRAMS *************
  448. ;
  449. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  450. ;   INITIALIZATION PROGRAM
  451. ;  SCHEDULED AT START & BY CTL C
  452. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  453. SCPNT    SET    28H
  454. IEPNT    SET    35H
  455. PEPNT    SET    24H
  456. INIT:    LDBLX    SCPNT    ;GET SCORE ADDR
  457.     MVI    M,0    ;ZERO SCORE
  458.     LDBLX    PEPNT    ;GET ADDR OF SHIP ST
  459.     INX    H    ;TIME
  460.     MVI    M,0    ;SCHED SHIP START
  461.     LDBLX    IEPNT    ;ADDR OF INIT ENTRY
  462.     INX    H
  463.     MVI    M,1    ;DESCHED SELF
  464.     RET
  465. ;
  466. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  467. ;   SHIP START PROGRAM
  468. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  469. DC    SET    0
  470. STCRD    SET    0EH
  471. FBPNT    SET    1AH
  472. EXPNT    SET    1CH
  473. PLPNT    SET    1EH
  474. PCPNT    SET    20H
  475. PDPNT    SET    22H
  476. ORENT    SET    2FH
  477. HFLAG    SET    33H    ;HYPERSPACE FLAG
  478. IORNT    SET    34H    ;INITIAL ORIENTATION
  479. ; SELECT ACCORDING TO HFLAG
  480. SSTRT:    LOADX    A,HFLAG
  481.     CPI    0
  482.     JNZ    HYPR
  483. ;  CASE--H=0--NORMAL START--NOT HYPERSPACE
  484.     CALL    STRT    ;SHIP INST, DESCHED
  485.     CALL    BEGIN    ;ORENT=0,START POS
  486.     RET
  487. HYPR:    JM    HDEST
  488. ;  CASE--H=1--HYPERSPACE RETURN--NO DESTROY
  489.     CALL    STRT
  490.     CALL    HCORD    ;RANDOM COORDINATES
  491.     RET
  492. ;  CASE--H=-1--HYPERSPACE RETURN--DESTROY
  493. HDEST:    CALL    DSTRY
  494.     CALL    HCORD    ;RAND COORDS
  495.     RET
  496. ; ENDSELECT
  497. ;
  498. STRT:    LDBLX    PLPNT    ;NORMAL START
  499.     XCHG        ;SHIP SUB ADDR IN DE
  500.     LDBLX    PCPNT    ;CALL ADDR IN HL
  501.     MOV    M,E    ;SHIP SUB -> CALL
  502.     INX    H
  503.     MOV    M,D
  504.     LDBLX    PEPNT    ;ENTRY ADDR
  505.     MVI    M,0    ;MASK
  506.     INX    H
  507.     MVI    M,1    ;DESCHED SELF
  508.     RET
  509. ;
  510. BEGIN:    LOADX    A,IORNT    ;SET ORIENTATION
  511.     STORX    A,ORENT
  512.     LXI    H,STCRD    ;START COORD
  513.     DAD    B    ;  ADDR IN HL
  514.     MVI    D,12    ;12 BYTES TO MOVE
  515. PXLOP:    MOV    A,M    ; FROM START COORDS
  516.     STAX    B    ; TO DYN COORDS
  517.     INX    H
  518.     INX    B
  519.     DCR    D
  520.     JNZ    PXLOP
  521.     RET
  522. ;
  523. HCORD:    SCALL    2    ;RANDOM BYTE IN A
  524.     STORX    A,XN+1    ;H.O. X COORD
  525.     STORX    A,XNM+1
  526.     SCALL    2
  527.     STORX    A,YN+1    ;H.O. Y COORD
  528.     STORX    A,YNM+1
  529.     SCALL    2
  530.     STORX    A,XN    ;L.O. X (VELOCITY)
  531.     SCALL    2
  532.     STORX    A,XNM
  533.     SCALL    2
  534.     STORX    A,YN    ;L.O. Y
  535.     SCALL    2
  536.     STORX    A,YNM
  537.     MVI    A,0    ;ZERO HYPERSPACE FLAG
  538.     STORX    A,HFLAG
  539.     RET
  540. ;
  541. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  542. ;   SHIP FLY PROGRAM
  543. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  544. XN    SET    0H
  545. YN    SET    6H
  546. XNM    SET    2H
  547. YNM    SET    8H
  548. XACC    SET    04H
  549. YACC    SET    0AH
  550. INPNT    SET    0CH
  551. NBPNT    SET    0EH
  552. RCNT    SET    10H    ;TORPEDO TIMEOUT
  553. FIPNT    SET    26H
  554. ACCM    SET    2AH
  555. FIREM    SET    2BH
  556. CWM    SET    2CH
  557. CCWM    SET    2DH
  558. HYPM    SET    32H    ;HYPERSPACE MASK
  559. FINH    SET    2EH
  560. BAPNT    SET    30H
  561. ACON1    EQU    (5*ACON)/7
  562. SFLY:    SCALL    0    ;MOVE SHIP/EXPLO
  563.     SCALL    1    ;ACCELERATE
  564. ; TEST BUTTONS ONLY IF NOT IN HYPERSPACE
  565.     LOADX    A,HFLAG
  566.     CPI    0
  567.     RNZ
  568. ;  CHECK IF ACC BUTTON ON
  569.     LDBLX    BAPNT    ;BUTTON ADDR
  570.     MOV    D,M    ;BUTTON WORD
  571.     LOADX    A,ACCM    ;ACC MASK
  572.     ANA    D
  573.     LXI    D,NULL    ;NO EXHAUST
  574.     JZ    XHST    ;NO ACCELERATION
  575.     MVI    D,0
  576.     LOADX    E,ORENT
  577.     LXI    H,XATAB
  578.     DAD    D
  579.     DAD    D    ;X ACC ADDR FOR ORENT
  580.     MOV    E,M    ;XACC L.O.
  581.     INX    H
  582.     MOV    D,M    ;XACC H.O.
  583.     LDBLX    XACC    ;ADD TO ORIGINAL
  584.     DAD    D
  585.     SDBLX    XACC
  586. ;  SAME LOGIC FOR YACC
  587.     MVI    D,0
  588.     LOADX    E,ORENT
  589.     LXI    H,YATAB
  590.     DAD    D
  591.     DAD    D
  592.     MOV    E,M
  593.     INX    H
  594.     MOV    D,M
  595.     LDBLX    YACC
  596.     DAD    D
  597.     SDBLX    YACC
  598.     LXI    D,EXHST    ;EXHAUST
  599. XHST:    LDBLX    EXPNT    ;INSERT EXHAUST/ZERO
  600.     MOV    M,E    ;IN DISPLAY FILE
  601.     INX    H
  602.     MOV    M,D
  603. ;  TEST IF X NEAR EDGE
  604. ETST:    LOADX    A,XN+1
  605.     ABS
  606.     CPI    LIMIT
  607.     CP    SWAPX    ;YES
  608. ;  TEST IF Y NEAR EDGE
  609.     LOADX    A,YN+1
  610.     ABS
  611.     CPI    LIMIT
  612.     CP    SWAPY    ;YES
  613. ;  SHIP HIT SUN?
  614.     LOADX    A,XN+1
  615.     ABS
  616.     CPI    SUN    ;H.O. X < SUN RADIUS
  617.     JP    BTST
  618.     LOADX    A,YN+1
  619.     ABS
  620.     CPI    SUN    ;H.O. Y < SUN RADIUS
  621.     JP    BTST
  622.     CALL    DSTRY
  623.     RET
  624. ;  TEST FOR CLOSE TORPEDOS
  625. BTST:    LOADX    D,DC+1    ;HO X POS OF SHIP
  626.     LOADX    E,DC+7    ;HO Y POS OF SHIP
  627.     PUSH    B    ;SAVE SHIP BLK PNTR
  628.     LXI    H,BU1    ;FIRST TORPEDO BLK PNTR
  629. FLOOP:    MOV    B,H    ;HL ->BC
  630.     MOV    C,L
  631.     LOADX    A,RCNT    ;TORPEDO CLAIMED?
  632.     CPI    0    ;TEST FOR ZERO
  633.     JZ    NXBUL    ;NEXT TORPEDO
  634. NRTST:    LOADX    A,DC+1    ;HO X POS OF TORPEDO
  635.     SUB    D
  636.     ABS
  637.     CPI    EPSLN
  638.     JP    NXBUL    ;NOT CLOSE ENOUGH
  639.     LOADX    A,DC+7    ;HO Y POS OF TORPEDO
  640.     SUB    E    ;SUBT SHIP POS
  641.     ABS
  642.     CPI    EPSLN
  643.     JM    HIT    ;BOTH CLOSE ENOUGH
  644. NXBUL:    LDBLX    NBPNT    ;NEXT TORPEDO PNTR
  645.     SUB    A    ;ZERO A
  646.     CMP    H    ;CHECK OF H 0
  647.     JNZ    FLOOP    ;NO
  648.     CMP    L
  649.     JNZ    FLOOP    ;L NOT 0
  650.     POP    B    ;SANE STACK
  651.     RET        ;BOTH H&L ZERO
  652. HIT:    LDBLX    INPNT    ;TORPEDO POSTION
  653.     MVI    M,0    ;MBEAM INSTR (BLANK)
  654.     MVI    A,0    ;RELEASE TORPEDO
  655.     STORX    A,RCNT
  656.     POP    B    ;RESTORE SHIP BLK
  657.     CALL    DSTRY
  658.     RET
  659. ;  SUBROUTINE TO INCREMENT SCORE, SCHED
  660. ;  SHIP START AND REPLACE SHIP WITH EXPLOSION
  661. ;  ALSO USED IN HYPERSPACE PROCESSING
  662. DSTRY:    LDBLX    SCPNT    ;RESTORE SCORE ADDR
  663.     MOV    A,M    ;INCREMENT SCORE
  664.     INR    A
  665.     DAA
  666.     MOV    M,A
  667. ;  SCHED SHIP START
  668.     LDBLX    PEPNT    ;SHIP ENTRY ADDR
  669.     MVI    M,-1    ;MASK = -1
  670.     LDA    TIME
  671.     ADI    INTVL
  672.     INX    H
  673.     MOV    M,A    ;TIME+INTVAL TO PL ST
  674. ;  REPLACE SHIP WITH EXPLOSION
  675.     LXI    D,EXPLO    ;EXPLO SUB
  676.     LDBLX    PCPNT    ;SUB CALL
  677.     MOV    M,E
  678.     INX    H
  679.     MOV    M,D
  680.     RET
  681. ;
  682. SWAPX:    LDBLX    XN    ;SWAP X COORDS
  683.     XCHG
  684.     LDBLX    XNM
  685.     SDBLX    XN
  686.     XCHG
  687.     SDBLX    XNM
  688.     RET
  689. ;
  690. SWAPY:    LDBLX    YN    ;SWAP Y COORDS
  691.     XCHG
  692.     LDBLX    YNM
  693.     SDBLX    YN
  694.     XCHG
  695.     SDBLX    YNM
  696.     RET
  697. ;
  698. ;  ACCELERATION TABLE
  699. XATAB:    DW    0
  700.     DW    ACON1
  701. YATAB:    DW    ACON
  702.     DW    ACON1
  703.     DW    0
  704.     DW    -ACON1
  705.     DW    -ACON
  706.     DW    -ACON1
  707.     DW    0
  708.     DW    ACON1
  709. ;
  710. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  711. ;   TORPEDO FLY PROGRAM
  712. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  713. BFLY:    SCALL    1    ;ACCELERATION LOOKUP
  714.     SCALL    0    ;MOVE TORPEDO
  715. ;  TEST IF X NEAR SCREEN EDGE
  716.     LOADX    A,DC+1    ;HO X POS OF TORPEDO
  717.     ABS        ;ABS VALUE OF X
  718.     CPI    LIMIT    ;SUBTRCT LIMIT
  719.     JP    BLANK    ;NEAR EDGE IF + OR 0
  720. ;  TEST IF Y NEAR EDGE
  721.     LOADX    A,DC+7    ;HO Y POS OF TORPEDO
  722.     ABS
  723.     CPI    LIMIT
  724.     JP    BLANK    ;NOT NEAR EDGE
  725. ;  TORPEDO HIT SUN
  726.     LOADX    A,XN+1
  727.     ABS
  728.     CPI    SUN
  729.     RP        ;RETN IF NOT
  730.     LOADX    A,YN+1
  731.     ABS
  732.     CPI    SUN
  733.     RP    ;RETURN IF NOT
  734. BLANK:    LDBLX    INPNT    ;MBEAM/MDISP INST
  735.     MVI    M,0    ;MBEAM
  736.     MVI    A,0
  737.     STORX    A,RCNT    ;RELEASE TORPEDO
  738.     RET
  739. ;
  740. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  741. ;   TORPEDO FIRE PROGRAM
  742. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  743. GEPNT    SET    26H
  744. RCON    EQU    EPSLN*140H
  745. VCON1    EQU    (5*VCON)/7
  746. FIRE:    LDBLX    GEPNT    ;DISPATCH TABLE ENTRY FOR SHIP
  747.     INX    H
  748.     MVI    M,1    ;DESCHEDULE SELF
  749.     LOADX    A,ORENT
  750.     ADD    A    ;DOUBLE ORIENTATION
  751.     MOV    L,A    ;SAVE FOR LATER
  752.     MVI    H,0
  753.     SHLD    ORSAV
  754.     LDBLX    FBPNT    ;PNTR TO 1ST TORPEDO ->HL
  755.     PUSH    B    ;SAVE SHIP BLOCK BASE
  756. ;  FIND FREE TORPEDO
  757.     MOV    B,H    ;HL -> BC
  758.     MOV    C,L
  759.     LOADX    A,RCNT    ;TEST FOR CLAIMED TORPEDO
  760.     CPI    0
  761.     JZ    SHOOT    ;NOT CLAIMED
  762.     POP    B    ;SANE STACK
  763.     RET        ;NO FREE TORPEDOS
  764. ;  SHOOT A TORPEDO
  765. SHOOT:    LDBLX    INPNT    ;UNBLANK TORPEDO
  766.     MVI    M,2    ; 'MDISP'
  767.     MVI    A,RMAX    ;SET TIMEOUT COUNTER
  768.     STORX    A,RCNT    ; TO CLAIM TORPEDO
  769.     POP    H    ;SHIP OBJ BLK IN HL
  770.     MVI    D,10    ;10 BYTES TO MOVE
  771. XLOOP:    MOV    A,M    ;BYTE FROM SHIP COORDS
  772.     STAX    B    ;  INTO TORPEDO COORDS
  773.     INX    H    ;NEXT BYTE
  774.     INX    B
  775.     DCR    D    ;DECREMENT CNTR
  776.     JNZ    XLOOP    ;NOT DONE YET
  777.     LXI    H,-10
  778.     DAD    B    ;RESTORE TORPEDO BLK
  779.     MOV    B,H
  780.     MOV    C,L
  781. ;  COMPUTE INITIAL TORPEDO COORDINATES
  782. ;  X(N-1) & Y(N-1) ARE SHIP'S + COLLISION RAD
  783. ;  X(N) & Y(N) ARE SHIP'S + VELOCITY + COLL RAD
  784.     LHLD    ORSAV
  785.     LXI    D,XVTAB    ;X VELOCITY TABLE
  786.     DAD    D
  787.     MOV    E,M    ;XVEL IN DE
  788.     INX    H
  789.     MOV    D,M
  790.     LDBLX    XN
  791.     DAD    D    ;ADD VEL+COLL TO X(N)
  792.     SDBLX    XN
  793. ;
  794.     LHLD    ORSAV
  795.     LXI    D,XRTAB    ;COLL RAD TABLE
  796.     DAD    D
  797.     MOV    E,M
  798.     INX    H
  799.     MOV    D,M
  800.     LDBLX    XNM
  801.     DAD    D    ;ADD COLL TO X(N-1)
  802.     SDBLX    XNM
  803. ;
  804.     LHLD    ORSAV
  805.     LXI    D,YVTAB
  806.     DAD    D
  807.     MOV    E,M
  808.     INX    H
  809.     MOV    D,M
  810.     LDBLX    YN
  811.     DAD    D    ;ADD VEL+COLL TO Y(N)
  812.     SDBLX    YN
  813. ;
  814.     LHLD    ORSAV
  815.     LXI    D,YRTAB
  816.     DAD    D
  817.     MOV    E,M
  818.     INX    H
  819.     MOV    D,M
  820.     LDBLX    YNM
  821.     DAD    D    ;ADD COLL TO Y(N-1)
  822.     SDBLX    YNM
  823.     RET
  824. ;  COLLISION RADIUS TABLES
  825. XRTAB:    DW    0
  826.     DW    RCON
  827. YRTAB:    DW    RCON
  828.     DW    RCON
  829.     DW    0
  830.     DW    -RCON
  831.     DW    -RCON
  832.     DW    -RCON
  833.     DW    0
  834.     DW    RCON
  835. ;  H.O. VELOCITY + COLL RAD TABLES
  836. XVTAB:    DW    0
  837.     DW    VCON1+RCON
  838. YVTAB:    DW    VCON+RCON
  839.     DW    VCON1+RCON
  840.     DW    0
  841.     DW    -VCON1-RCON
  842.     DW    -VCON-RCON
  843.     DW    -VCON1-RCON
  844.     DW    0
  845.     DW    VCON1+RCON
  846. ;
  847. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  848. ;   SCORE PROGRAM
  849. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  850. SCRE    SET    0
  851. SDIG1    SET    1
  852. SDIG2    SET    3
  853. SCORE:    LOADX    A,SCRE    ;SCORE VALUE
  854.     ANI    0FH    ;RIGHT DIGIT
  855.     RLC        ;*2
  856.     ADI    NUMS    ;INDEX OF SUBR IN HL
  857.     MVI    H,0
  858.     MOV    L,A
  859.     MOV    E,M    ;SUBR ADDR IN DE
  860.     INX    H
  861.     MOV    D,M
  862.     LDBLX    SDIG2    ;PNTR TO DIGIT
  863.     MOV    M,E    ;SUBR ADDR IN DISPL FILE
  864.     INX    H
  865.     MOV    M,D
  866.     LOADX    A,SCRE    ;SCORE VALUE
  867.     ANI    0F0H    ;LEFT DIGIT
  868.     RRC        ;JUSTIFY & *2
  869.     RRC
  870.     RRC
  871.     ADI    NUMS
  872.     MVI    H,0
  873.     MOV    L,A
  874.     MOV    E,M
  875.     INX    H
  876.     MOV    D,M
  877.     LDBLX    SDIG1
  878.     MOV    M,E
  879.     INX    H
  880.     MOV    M,D    ;LEFT DIG IN DISPL FILE
  881.     RET        ;RETURN
  882. ;
  883. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  884. ;   PROGRAM TO ROTATE SHIPS, INITIATE TORPEDO FIRE,
  885. ;   DO HYPERSPACE PROCESSING & CHECK
  886. ;   FOR SPENT TORPEDOS
  887. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  888. ; DON'T CHECK BUTTONS IF ALREADY IN HYPERSPACE
  889. ROT:    LOADX    A,HFLAG
  890.     CPI    0
  891.     JNZ    SPNCK    ;CHECK FOR SPENT BULLETS ANYWAY
  892.     LDBLX    BAPNT
  893.     MOV    D,M    ;BUTTON WORD
  894. ;  CHECK FOR BOTH CW AND CCW,
  895. ;  INDICATING HYPERSPACE
  896.     LOADX    A,HYPM    ;MASK FOR HYPERSPACE
  897.     MOV    E,A
  898.     ANA    D
  899.     XRA    E
  900.     JNZ    CWCK    ;NO - CHECK FOR CW
  901. ;  BLANK SHIP
  902.     LXI    D,NULL    ;NULL GRAPHICS SUB
  903.     LDBLX    PCPNT    ;PNTR TO CALL
  904.     MOV    M,E
  905.     INX    H
  906.     MOV    M,D    ;INSERT
  907. ;  SCHEDULE SHIP START AFTER HDLY
  908.     LDBLX    PEPNT    ;SHIP START ENTRY
  909.     MVI    M,-1
  910.     LDA    TIME
  911.     ADI    HDLY
  912.     INX    H
  913.     MOV    M,A
  914. ;  SEE IF WE NEED TO DESTROY SHIP LATER
  915.     MVI    D,1
  916.     SCALL    2    ;RANDOM # IN A
  917.     CPI    0    ;> ZERO
  918.     JP    NODST    ;YES--DON'T DESTRY
  919.     MVI    D,-1    ;NO--DESTRY
  920. NODST:    STORX    D,HFLAG    ;INDICATE TO SSHIP START PGM
  921.     JMP    SPNCK
  922. ;  END OF HYPERSPACE PROCESSING
  923. ;  CHECK FOR CW (CLOCKWISE) ROTATION
  924. CWCK:    LOADX    A,CWM    ;MASK FOR CW
  925.     ANA    D
  926.     JZ    CCWCK    ;CHECK FOR CCW
  927.     LOADX    A,ORENT    ;OLD ORIENTATION
  928.     INR    A    ;UP BY 1
  929.     ANI    7
  930.     STORX    A,ORENT
  931. ;  CHECK FOR CCW (COUNTERCLOCKWISE)
  932. CCWCK:    LOADX    A,CCWM    ;MASK FOR CCW
  933.     ANA    D
  934.     JZ    DINS
  935.     LOADX    A,ORENT
  936.     DCR    A    ;DOWN BY 1
  937.     ANI    7
  938.     STORX    A,ORENT    ;INSERT ORENT IN DISPLAY FILE
  939. DINS:    LOADX    D,ORENT
  940.     LDBLX    PDPNT    ;ORENTATION IN DISPLAY
  941.     MOV    A,M
  942.     ANI    0F8H    ;STRIP OLD ORENT BITS
  943.     ORA    D    ;INSERT NEW
  944.     MOV    M,A
  945. ;  CHECK IF FIRE BUTTON ON
  946. FIRCK:    LDBLX    BAPNT    ;BUTTON ADDR
  947.     MOV    D,M    ;BUTTON WORD
  948.     LOADX    A,FIREM    ;FIRE MASK
  949.     ANA    D
  950.     JNZ    INCHK    ;SEE IF INHIBIT
  951.     MVI    A,0    ;NO FIRE -- CLEAR INH
  952.     STORX    A,FINH
  953.     JMP    SPNCK
  954. INCHK:    LOADX    A,FINH    ;CHECK INHIBIT FLG
  955.     CPI    0
  956.     JNZ    SPNCK    ;SET
  957.     MVI    A,1    ;NOT SET -- SET IT
  958.     STORX    A,FINH
  959.     LDBLX    FIPNT    ;SCHEDULE TORPEDO FIRE
  960.     INX    H
  961.     MVI    M,0
  962. ;  CHECK FOR SPENT TORPEDOS
  963. SPNCK:    LDBLX    FBPNT    ; TORPEDO POINTER
  964. ;  FIND CLAIMED TORPEDO WITH TIMEOUT
  965. ;  FOR THIS SHIP
  966.     MOV    B,H    ;HL -> BC
  967.     MOV    C,L
  968.     LOADX    A,RCNT
  969.     CPI    0    ;TEST FOR CLAIMED
  970.     RZ        ;NOT CLAIMED
  971.     DCR    A    ;DECREMENT TIMER
  972.     STORX    A,RCNT    ;RESTORE IN BLOCK
  973.     RNZ        ;NOT ZERO YET
  974.     LDBLX    INPNT
  975.     MVI    M,0    ;BLANK TORPEDO
  976.     RET
  977. ;
  978. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  979. ;   KEYBOARD DECODE PROGRAM
  980. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  981. CTLC    EQU    'C'
  982. KBDCD:    MOV    C,A    ;SAVE    CHAR
  983.     CPI    CTLC    ;"C"?
  984.     RNZ        ;RETURN IF NOT
  985.     LXI    H,IENT1+1    ;SCHED INIT1
  986.     MVI    M,0
  987.     LXI    H,IENT2+1    ;SCHED INIT2
  988.     MVI    M,0
  989.     RET
  990. ;
  991.     END
  992.