home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol075 / invaders.z80 < prev    next >
Encoding:
Text File  |  1984-04-29  |  31.6 KB  |  1,967 lines

  1. ;    ***** INVADERS *****
  2. ;
  3. ; Space invaders for Z80 + ETI-640.
  4. ; Need CP/M 2.X due to use of direct I/O system call.
  5. ;
  6. ; The following patches will be required for different systems
  7. ;    1.  SCREEN....Patch to the start address of your VDU.
  8. ;    2.  FLASH.....Should equal 1 for standard ETI640.
  9. ;
  10. INVADR:    ORG    0100H    ;Origin in TPA of CP/M.
  11. ;
  12. ; CPM EQUATES
  13. BIOS    EQU    5    ;System call entry point.
  14. RDCON    EQU    1    ;Read console function number.
  15. DIRIO    EQU    6    ;Direct I/O function number.
  16. BOOT    EQU    0    ;Warm-boot CP/M.
  17. CTRLC    EQU    3    ;Exit character.
  18. ;
  19. SCREEN    EQU    0E800H    ;Start of screen RAM.
  20. ;
  21. TOPLFT    EQU    SCREEN        ;Top left of screen.
  22. TOPRIT    EQU    SCREEN+3FH    ;Top right of screen.
  23. BOTLFT    EQU    SCREEN+3C0H    ;Bottom left of screen.
  24. BOTRIT    EQU    SCREEN+3FFH    ;Bottom right of screen.
  25. ;
  26. GRFBIT    EQU    2    ;Weighting of chunky graphic attribute.
  27. FLASH    EQU    1    ;Flashing attribute for ETI640 = 1...
  28.             ;(prog. char. select on color VDU).
  29. SWITCH    EQU    64    ;Parallel input port for game controls.
  30.             ;(9 for DG-Z80).
  31. ;
  32. TITLDL    EQU    150    ;Delay to allow reading of titles.
  33. MYSSDL    EQU    25    ;Delay to allow viewing of mystery
  34.             ;ship score (when hit).
  35. ;
  36. ;--------------------------------------------------------------
  37. ;
  38. START:
  39. ;    LD    A,1    ;Init CTC timer chan. 0 (DG-Z80).
  40. ;    OUT    (4),A    ;(Not essential to operation).
  41.     LD    A,090H    ; INITIALIZE 8255 A IN
  42.     OUT    (64),A
  43.     JR    MAIN
  44. ;
  45. ;--------------------------------------------------------------
  46. ; I/O ROUTINES.
  47. ;
  48. ; Get character from keyboard, return to CP/M if CTRL-C.
  49. WAITCH:    CALL    GETCH
  50.     JR    Z,WAITCH
  51.     RET
  52. ;
  53. ; Get character if there, else return with zero flag,
  54. ; return to CP/M if control-C.
  55. GETCH:    PUSH    DE
  56.     PUSH    BC
  57.     PUSH    HL
  58.     LD    C,DIRIO    ;Direct I/O function.
  59.     LD    E,0FFH    ;  (input)
  60.     CALL    BIOS
  61.     POP    HL
  62.     POP    BC
  63.     POP    DE
  64.     OR    A,A    ;Zero means nothing available.
  65.     RET    Z    ;Back to caller then.
  66.     CP    CTRLC
  67.     RET    NZ    ;Back to caller with char if no ctrl-C
  68.     JP    BOOT    ;Else, reboot.
  69. ;
  70. ; Read least significant 3 bits of switch port into <B>.
  71. ; (3 player buttons for LEFT, RIGHT, and FIRE - all active low)
  72. GETSW:    IN    A,(SWITCH)
  73.     XOR    7
  74.     LD    B,A
  75.     RET        ;Return with key-pressed=1.
  76. ;
  77.     DEFB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;Patch space.
  78.     DEFB    0,0,0,0,0,0,0,0,0,0,0
  79. ;
  80. ;-------------------------------------------------------------
  81. ; START OF MAIN PROGRAM.
  82. ;
  83. ; Clear screen and set graphic attributes at all locations.
  84. ; Incorporate flash function at screen boundaries.
  85. ;
  86. MAIN:    LD    HL,TOPLFT ;Point to top left of screen.
  87. CLS:    LD    (HL),0
  88.     CALL    CKSCRN    ;Ensure that we are on screen.
  89.     SET    2,H    ;Point <HL> to character attribute RAM.
  90.     JR    Z,CLS1    ;Skip if not at boundary.
  91.     LD    (HL),GRFBIT+FLASH ;Else incorporate flash.
  92.     JR    CLS2
  93. CLS1:    LD    (HL),GRFBIT ;Set graphic attribute.
  94. CLS2:    RES    2,H    ;Point to screen ram.
  95.     INC    HL    ;Next location.
  96.     BIT    2,H    ;All of screen blanked?
  97.     JR    Z,CLS    ;Continue if not.
  98. ;
  99. ; Draw "chaser" of dots on perimeter of screen.
  100.     LD    A,28H    ;Init counter.
  101.     LD    (COUNTR),A
  102.     LD    HL,SCREEN+80H ;Init screen pointer.
  103.     LD    (SCRADR),HL ;Save as current screen address
  104.     LD    BC,7
  105.     LD    IX,BORDR1 ;Put border patterns on screen.
  106.     LD    IY,BORDR2
  107. A0071:    PUSH    BC
  108.     LD    A,(COUNTR) ;Update counter.
  109.     SUB    4
  110.     AND    3FH
  111.     LD    (COUNTR),A
  112.     LD    B,A
  113. A007D:    LD    A,(IX+0) ;Get byte from border pattern table.
  114.     INC    A    ;Test for -1 (terminator).
  115.     JR    NZ,A0088 ;Skip if not.
  116.     LD    DE,-24    ;Else, back up IX pointer.
  117.     ADD    IX,DE
  118. A0088:    CALL    CHASER    ;Draw "chaser" dots at screen boundary.
  119. ;
  120. ;Check player switches, skip preamble if any one pressed.
  121.     IN    A,(SWITCH)
  122.     AND    7
  123.     CP    7
  124.     JR    NZ,A00BE
  125.     CALL    WAIT    ;Delay.
  126.     LD    DE,6
  127.     ADD    IX,DE
  128.     DJNZ    A007D
  129.     POP    BC
  130.     CALL    PTITLE    ;Print "SPACE INVADERS" in large letters.
  131.     PUSH    IX
  132.     PUSH    IY
  133.     POP    IX
  134.     POP    IY
  135.     DEC    BC    ;..a total of 4 times.
  136.     LD    A,B
  137.     OR    C
  138.     JR    NZ,A0071
  139. ;
  140.     LD    HL,AUTHMS    ;Print author message
  141.     LD    DE,SCREEN+389H    ;...near bottom line.
  142.     CALL    PRMSG
  143. ;
  144.     LD    B,TITLDL    ;Delay....
  145. A00B9:    CALL    WAIT
  146.     DJNZ    A00B9
  147. ;
  148. A00BE:    CALL    CLRSCN
  149.     LD    IX,T0ED9
  150.     LD    HL,0
  151.     LD    (CSCORL),HL    ;Zero current score.
  152.     LD    (RSCORE),HL    ;Zero previous highest score.
  153.     LD    A,3        ;Init number of spare cannon.
  154.     LD    (NUMCAN),A
  155.     CALL    A095E        ;Display advancing armies and
  156.                 ;current score of zero.
  157. ;
  158. NUGAME:    CALL    A08BD
  159.     CALL    A08D7
  160.     LD    HL,STTKEY ;Print "press any key to start"
  161.     LD    DE,SCREEN+28EH ;...near screen centre.
  162.     CALL    PRMSG
  163.     LD    DE,(CSCORL) ;Compare current score with
  164.     LD    HL,(RSCORE) ;  previous high score.
  165.     AND    A
  166.     SBC    HL,DE
  167.     JR    NC,YAWN ;Skip if current score nothing special
  168.     LD    (RSCORE),DE ;Else, point to current score.
  169.     LD    HL,NEWHI    ;Print "NEW HIGH SCORE"
  170.     LD    DE,SCREEN+10H    ;...on top line.
  171.     CALL    PRMSG
  172.     LD    HL,PRESSN    ;Print "press N to..." 
  173.     LD    DE,SCREEN+4AH    ;...on line 2.
  174.     CALL    PRMSG
  175.     LD    DE,HIGHSCR    ;Copy new high score to buffer
  176.     LD    HL,HIGHMS    ;Point to "High Score" message
  177.     LD    BC,12        ;12 bytes to move.
  178.     LDIR
  179.     CALL    WAITCH        ;Get char from keyboard.
  180.     AND    0DFH
  181.     CP    'N'        ;Start new game if not "N".
  182.     JR    NZ,RUN
  183. ;
  184. ; N key pressed, get player's name for highest score record.
  185.     CALL    CLRSCN
  186.     LD    DE,SCREEN+216H    ;Player's name goes here.
  187.     LD    HL,HIGHSCR
  188. GTNAME:    LD    A,5FH    ;Put prompt on screen (underline).
  189.     LD    (DE),A
  190.     XOR    A    ;Set character attributes.
  191.     SET    2,D
  192.     LD    (DE),A
  193.     RES    2,D    ;Point to screen RAM.
  194.     LD    BC,4    ;Move 4 bytes.
  195.     PUSH    HL    ;Save highscore pointer.
  196.     PUSH    DE    ;Save screen pointer.
  197.     EX    DE,HL
  198.     LD    HL,T0D76
  199.     LDIR
  200.     POP    DE
  201.     POP    HL
  202.     CALL    WAITCH    ;Get character from keyboard.
  203.     CP    0DH    ;Carriage return? (name terminator).
  204.     JR    Z,NUGAME ;Start new game if so.
  205.     CP    7FH    ;Delete?
  206.     JR    Z,A0149    ;Skip if so.
  207.     CP    8    ;Backspace?
  208.     JR    NZ,NAME ;Character of player's name if not.
  209. ; Process delete or backspace character.
  210. A0149:    LD    A,E
  211.     CP    16H    ;Are we already at start of name?
  212.     JR    Z,GTNAME ;Go no further back if so.
  213.     LD    A,' '    ;Replace character by space.
  214.     LD    (DE),A
  215.     DEC    DE    ;Back up pointers.
  216.     DEC    HL
  217.     JR    GTNAME
  218. ;
  219. NAME:    LD    (HL),A    ;Echo player's name to screen.
  220.     LD    (DE),A    ;Save name also for later scores.
  221.     LD    A,E
  222.     CP    2AH    ;Limit length of name.
  223.     JR    Z,GTNAME
  224.     INC    DE    ;Process next character of name.
  225.     INC    HL
  226.     JR    GTNAME
  227. ;
  228. YAWN:    CALL    WAITCH    ;Get character from keyboard.
  229. ;
  230. ; Key pressed - start game.
  231. RUN:    LD    HL,0
  232.     LD    (CSCORL),HL ;Zero current score.
  233.     LD    A,3    ;3 spare cannon.
  234.     LD    (NUMCAN),A
  235.     LD    A,6    ;Init speed control byte.
  236.     LD    (SPEED),A
  237.     XOR    A    ;Init game frame counter.
  238.     LD    (FRAMES),A
  239.     CALL    CLRSCN
  240.     CALL    A095E
  241. ;
  242. ;**************************************************************
  243. ; MAIN GAME EXECUTION LOOP
  244. ;
  245. GMLOOP:    CALL    SETUP    ;Set up player defences and tanks,
  246.             ;advancing armies and score.
  247.     CALL    A0211
  248.     JR    NZ,GAMOVR
  249.     CALL    A0542
  250.     CALL    GETCH    ;Exit if user wants out.
  251.     CALL    A05DA
  252.     JR    NZ,GAMOVR
  253.     CALL    A0833
  254.     CALL    A0542
  255.     CALL    A05DA
  256.     JR    NZ,GAMOVR
  257.     LD    A,(SPEED)
  258.     JR    A01A6
  259. ;
  260. DELAY:    LD    B,0    ;Delay.....
  261. DELA1:    DJNZ    DELA1
  262. DELA2:    DJNZ    DELA2
  263. A01A6:    DEC    A    ;Faster.
  264.     JR    NZ,DELAY
  265.     JP    GMLOOP
  266. ;
  267. ;**************************************************************
  268. ;
  269. GAMOVR:    LD    HL,OVERMS    ;Point to "Game Over" message
  270.     LD    DE,SCREEN+210H    ;...near centre of screen.
  271.     CALL    PRMSG        ;Print message.
  272.     JP    NUGAME        ;Prepare to restart.
  273. ;
  274. SETUP:    LD    A,(FRAMES)    ;Get frame count.
  275.     DEC    A        ;Count frames.
  276.     JP    M,A01C4        ;Skip if first frame.
  277.     AND    0FH        ;Else, limit to 0-15
  278.     LD    (FRAMES),A    ;...and update count.
  279. A01C4:    CALL    GETSW        ;Read player's switches.
  280.     BIT    2,B        ;FIRE switch pressed?
  281.     JR    NZ,FIRE        ;Fire if so.
  282.     LD    A,-1        ;Else, set firing flag to -1.
  283.     LD    (FIREFL),A
  284. A01D0:    BIT    0,B        ;LEFT switch pressed?
  285.     JR    NZ,LEFT        ;Move cannon left if so.
  286.     BIT    1,B        ;RIGHT switch pressed?
  287.     RET    Z        ;Return if none pressed.
  288. ;
  289. RIGHT:    LD    A,(CANPOS)    ;Get active cannon's position.
  290.     INC    A        ;Prepare to move it right.
  291.     CP    3CH        ;Do nothing if too far right.
  292.     RET    NC
  293.     LD    (CANPOS),A    ;Else, update position.
  294.     JP    A09D0
  295. ;
  296. LEFT:    LD    A,(CANPOS)    ;Get active cannon's position.
  297.     DEC    A        ;Prepare to m/ve it right.
  298.     CP    0FFH        ;Do nothing if too far left.
  299.     RET    Z
  300.     LD    (CANPOS),A    ;Else, update position.
  301.     JP    A09D0
  302. ;
  303. ; Fire cannon.
  304. FIRE:    LD    A,(FIREFL)    ;Test fire flag.
  305.     LD    A,(FRAMES)
  306.     OR    A
  307.     JR    NZ,A01D0    ;Skip if not first frame.
  308.     LD    A,9        ;9 frames to a standard game.
  309.     LD    (FRAMES),A
  310.     XOR    A        ;Zero fire flag.
  311.     LD    (FIREFL),A
  312.     LD    A,99H        ;Load cannon.
  313.     LD    HL,(D0E4B)
  314.     RES    2,H
  315.     CALL    XFER    ;Transfer byte to image and screen
  316.     RET
  317. ;
  318. A0211:    LD    A,(D0E50) ;Toggle.
  319.     INC    A
  320.     AND    1
  321.     LD    (D0E50),A
  322.     LD    HL,ATTIMG ;Point to attribute image array.
  323. A021D:    XOR    A    ;Scan past next zero in table.
  324.     LD    B,A
  325.     LD    C,A
  326.     CPIR
  327.     LD    (ARRYAD),HL ;Save array address.
  328.     DEC    HL       ;Subtract CPIR overshoot.
  329.     RES    2,H       ;Point to equiv loc. in screen image
  330.     LD    A,(HL)    ;Get contents.
  331.     LD    C,59H
  332.     CP    0BH    ;Laser bolt from cannon?
  333.     JP    Z,A047A
  334.     LD    C,6CH
  335.     CP    4
  336.     JP    Z,A047A
  337.     LD    C,4
  338.     CP    6CH
  339.     JP    Z,A0473
  340.     LD    C,0BH
  341.     CP    59H
  342.     JP    Z,A0473
  343.     CP    7FH
  344.     JP    Z,A053C
  345.     CP    0A0H
  346.     JP    Z,A0465
  347.     CP    19H
  348.     JR    Z,A025E
  349.     CP    99H
  350.     JR    Z,A0259
  351.     XOR    A
  352.     RET
  353. ;
  354. A0259:    CALL    A09D0
  355.     JR    A0269
  356. ;
  357. A025E:    XOR    A    ;Zero screen image and screen.
  358.     CALL    XFER
  359.     SET    2,H    ;Set graphic attributes in image and
  360.             ;on screen.
  361.     LD    A,GRFBIT
  362.     CALL    XFER
  363. A0269:    SET    2,H
  364.     LD    BC,-64    ;Decrement.
  365.     ADD    HL,BC
  366.     BIT    2,H    ;All done?
  367.     JP    Z,A053C    ;Continue if not.
  368.     BIT    1,(HL)
  369.     JR    NZ,A028A
  370.     RES    2,H
  371.     LD    A,(HL)
  372.     CP    19H
  373.     JP    Z,A053C
  374. A0280:    RES    2,H
  375.     LD    A,0A0H
  376.     CALL    XFER    ;Transfer to image and screen
  377.     JP    A053C
  378. ;
  379. A028A:    RES    2,H
  380.     LD    A,(HL)
  381.     OR    A
  382.     JP    Z,A0320
  383.     CALL    A032E
  384.     JP    Z,A053C
  385.     PUSH    HL
  386.     LD    DE,1040H
  387.     AND    A
  388.     SBC    HL,DE
  389.     POP    HL
  390.     JR    C,HITMYS    ;Mystery ship hit.
  391.     PUSH    HL
  392.     LD    DE,1300H
  393.     AND    A
  394.     SBC    HL,DE
  395.     POP    HL
  396.     JR    NC,A02AE
  397.     JP    A053C
  398. ;
  399. A02AE:    LD    A,(HL)
  400.     LD    C,A
  401.     SRL    A
  402.     AND    C
  403.     CALL    XFER    ;Transfer to image and screen
  404.     JP    A053C
  405. ;
  406. ; Mystery ship hit.
  407. HITMYS:    LD    A,(D0E64)
  408.     LD    L,A
  409.     LD    H,IMAGE/256
  410.     LD    B,7
  411.     PUSH    HL
  412. ; Show missile contacting mystery ship, then replace ship
  413. ; by solid rectangle.
  414. A02C2:    LD    A,0A0H
  415.     CALL    XFER
  416.     SET    2,H
  417.     XOR    A
  418.     CALL    XFER
  419.     RES    2,H
  420.     INC    HL
  421.     DJNZ    A02C2
  422.     CALL    A08A8    ;Get random number.
  423.     AND    3    ;Limit to 3.
  424.     INC    A    ;Mystery scores range from 100-400.
  425.     LD    L,A
  426.     SLA    L    ;*2
  427.     SLA    L    ;*4
  428.     SLA    L    ;*8
  429.     SLA    L    ;*16
  430.     LD    H,0
  431.     CALL    A0912    ;Add to score.
  432.     POP    HL    ;Get screen pointer to mystery ship.
  433.     INC    HL    ;Score goes in centre of rectangle.
  434.     INC    HL
  435.     OR    '0'    ;Form ASCII digit.
  436.     CALL    XFER    ;Put high byte of score over mystery.
  437.     INC    HL
  438.     LD    A,'0'    ;Follow high byte by 2 zeros.
  439.     CALL    XFER
  440.     INC    HL
  441.     CALL    XFER
  442.     LD    B,MYSSDL ;Delay to enable reading of score.
  443. A02FA:    CALL    WAIT    
  444.     DJNZ    A02FA
  445. A02FF:    PUSH    BC
  446.     PUSH    HL
  447.     LD    H,IMAGE/256
  448.     LD    A,(D0E64)
  449.     LD    L,A
  450.     LD    B,7
  451. A0309:    LD    A,0A0H    ;Replace invader by solid block.
  452.     CALL    XFER
  453.     SET    2,H
  454.     XOR    A
  455.     CALL    XFER
  456.     RES    2,H
  457.     INC    HL
  458.     DJNZ    A0309
  459.     XOR    A
  460.     LD    (D0E65),A
  461.     POP    HL
  462.     POP    BC
  463.     RET
  464. ;
  465. A0320:    LD    A,19H
  466.     CALL    XFER
  467.     SET    2,H
  468.     XOR    A
  469.     CALL    XFER
  470.     JP    A053C
  471. ;
  472. ; Invader clobbered.
  473. A032E:    PUSH    BC
  474.     PUSH    DE
  475.     PUSH    HL
  476.     LD    A,3FH
  477.     AND    L
  478.     LD    C,A
  479.     LD    A,3
  480.     AND    H
  481.     RLCA
  482.     RLCA
  483.     RLCA
  484.     RLCA
  485.     LD    B,A
  486.     LD    A,0C0H
  487.     AND    L
  488.     RRCA
  489.     RRCA
  490.     RRCA
  491.     RRCA
  492.     OR    B
  493.     LD    B,A
  494.     INC    B
  495.     INC    B
  496.     INC    B
  497.     LD    A,(HL)
  498. A034A:    RLCA
  499.     JR    C,A0353
  500.     RLCA
  501.     JR    C,A0353
  502.     DEC    B
  503.     JR    A034A
  504. ;
  505. A0353:    LD    A,(D0E5D)
  506.     SRA    A
  507.     JP    M,A0361
  508.     CP    C
  509.     JR    Z,A0361
  510.     JP    NC,A040D
  511. A0361:    ADD    A,2CH
  512.     CP    C
  513.     JP    C,A040D
  514.     LD    A,(D0E58)
  515.     DEC    A
  516.     CP    B
  517.     JP    NC,A040D
  518.     ADD    A,1EH
  519.     CP    B
  520.     JP    C,A040D
  521.     CALL    A037C
  522.     POP    HL
  523.     POP    DE
  524.     POP    BC
  525.     RET
  526. ;
  527. A037C:    LD    IY,T0E6A
  528.     LD    (IY+0),0
  529.     LD    A,(D0E58)
  530.     SUB    B
  531.     NEG
  532.     LD    HL,T0E89
  533.     LD    DE,IMAGE/256
  534. A0390:    SUB    6
  535.     CP    0FEH
  536.     JR    NC,A040A
  537.     OR    A
  538.     JP    M,A03A0
  539.     ADD    HL,DE
  540.     INC    (IY+0)
  541.     JR    A0390
  542. ;
  543. A03A0:    LD    E,C
  544.     LD    D,1
  545. A03A3:    LD    B,(IY+0)
  546.     INC    B
  547.     LD    C,D
  548.     CALL    A0413
  549.     LD    A,E
  550.     SUB    C
  551.     CP    3
  552.     LD    C,D
  553.     JR    C,A03BB
  554.     INC    D
  555.     INC    HL
  556.     LD    A,D
  557.     CP    0CH
  558.     JR    C,A03A3
  559.     JR    A040A
  560. ;
  561. A03BB:    LD    A,(HL)
  562.     OR    A
  563.     JR    Z,A040A
  564.     LD    (HL),0
  565.     LD    B,(IY+0)
  566.     INC    B
  567.     CALL    A0413
  568.     LD    DE,SPACE  ;Clear space instead of invader.
  569.     CALL    A0B7C
  570.     CALL    A0B59
  571.     LD    B,3
  572. A03D3:    LD    A,0A0H
  573.     CALL    XFER
  574.     SET    2,H
  575.     XOR    A
  576.     CALL    XFER
  577.     RES    2,H
  578.     INC    HL
  579.     DJNZ    A03D3
  580.     LD    HL,2
  581.     BIT    0,(IY+0)
  582.     CALL    NZ,A0912
  583.     CALL    A0912
  584.     LD    A,(D0E6F)
  585.     DEC    A
  586.     LD    (D0E6F),A
  587.     JR    NZ,A0408
  588.     CALL    CLRSCN
  589.     CALL    A095E
  590.     LD    A,(SPEED)
  591.     DEC    A
  592.     JR    Z,A0408
  593.     LD    (SPEED),A
  594. A0408:    XOR    A
  595.     RET
  596. ;
  597. A040A:    XOR    A
  598.     INC    A
  599.     RET
  600. ;
  601. A040D:    POP    HL
  602.     POP    DE
  603.     POP    BC
  604.     XOR    A
  605.     INC    A
  606.     RET
  607. ;
  608. A0413:    PUSH    DE
  609.     LD    D,B    ;<DE>  <--  <BC>
  610.     LD    E,C
  611.     DEC    B
  612.     DEC    C
  613.     SLA    B
  614.     LD    A,B
  615.     SLA    B
  616.     ADD    A,B
  617.     LD    B,A
  618.     LD    A,(D0E58)
  619.     ADD    A,B
  620.     LD    B,A
  621.     LD    A,(D0E5D)
  622.     SRA    A
  623.     SLA    C
  624.     SLA    C
  625.     ADD    A,C
  626.     LD    C,A
  627.     LD    A,(D0E58)
  628.     BIT    1,A
  629.     LD    A,(D0E59)
  630.     JR    NZ,A044F
  631.     INC    C
  632.     CP    D
  633.     JR    C,A0463
  634.     JR    NZ,A0445
  635.     LD    A,(D0E5A)
  636.     CP    E
  637.     JR    C,A0463
  638. A0445:    LD    A,(D0E5D)
  639.     BIT    0,A
  640.     JR    NZ,A0463
  641.     DEC    C
  642.     JR    A0463
  643. ;
  644. A044F:    CP    D
  645.     JR    C,A0463
  646.     JR    NZ,A045B
  647.     LD    A,(D0E5A)
  648.     DEC    A
  649.     CP    E
  650.     JR    NC,A0463
  651. A045B:    LD    A,(D0E5D)
  652.     BIT    0,A
  653.     JR    Z,A0463
  654.     INC    C
  655. A0463:    POP    DE
  656.     RET
  657. ;
  658. A0465:    XOR    A
  659.     CALL    XFER
  660.     SET    2,H
  661.     LD    A,GRFBIT    ;Invader was hit.
  662.     CALL    XFER
  663.     JP    A053C
  664. ;
  665. A0473:    LD    A,C
  666.     CALL    XFER
  667.     JP    A053C
  668. ;
  669. A047A:    LD    A,(D0E50)
  670.     OR    A
  671.     JP    NZ,A053C
  672.     LD    A,C
  673.     LD    (D0E57),A
  674.     XOR    A
  675.     CALL    XFER
  676.     SET    2,H
  677.     LD    A,GRFBIT    ;Invaders fire.
  678.     CALL    XFER
  679.     LD    BC,40H
  680.     ADD    HL,BC
  681.     PUSH    HL
  682.     LD    BC,0E840H
  683.     ADD    HL,BC
  684.     POP    HL
  685.     JP    C,A053C
  686.     PUSH    HL
  687.     LD    BC,0E880H
  688.     ADD    HL,BC
  689.     POP    HL
  690.     JP    NC,A0513
  691.     RES    2,H
  692.     LD    A,(HL)
  693.     OR    A
  694.     JP    Z,A0513
  695.     LD    A,(CANPOS)
  696.     LD    C,A
  697.     LD    B,0FH
  698.     LD    DE,CANNON
  699. A04B6:    LD    HL,10
  700.     ADD    HL,DE
  701.     EX    DE,HL
  702.     CALL    A0502
  703.     DEC    B
  704.     LD    A,B
  705.     OR    A
  706.     JR    Z,A04CD
  707.     LD    HL,0FFFBH
  708.     ADD    HL,DE
  709.     EX    DE,HL
  710.     CALL    A0502
  711.     DJNZ    A04B6
  712. A04CD:    LD    B,5
  713. A04CF:    CALL    WAIT
  714.     DJNZ    A04CF
  715.     LD    HL,1380H
  716.     LD    B,40H
  717. A04D9:    XOR    A
  718.     CALL    XFER
  719.     SET    2,H
  720.     LD    A,GRFBIT    ;Clear cannon movement line.
  721.     CALL    XFER
  722.     RES    2,H
  723.     INC    HL
  724.     DJNZ    A04D9
  725.     LD    A,(NUMCAN)    ;Delete one spare cannon.
  726.     DEC    A
  727.     LD    (NUMCAN),A
  728.     CP    0FFH
  729.     JP    Z,A07A2
  730.     CALL    A09C2
  731.     LD    B,1EH
  732. A04FA:    CALL    WAIT
  733.     DJNZ    A04FA
  734.     JP    A053C
  735. ;
  736. A0502:    PUSH    BC
  737.     LD    A,5
  738.     LD    B,38H
  739.     CALL    DRAW
  740.     LD    B,3
  741. A050C:    CALL    WAIT
  742.     DJNZ    A050C
  743.     POP    BC
  744.     RET
  745. ;
  746. A0513:    SET    2,H
  747.     BIT    1,(HL)
  748.     JP    Z,A0280
  749.     RES    2,H
  750.     LD    A,(HL)
  751.     OR    A
  752.     JR    NZ,A052F
  753.     LD    A,(D0E57)
  754.     CALL    XFER
  755.     SET    2,H
  756.     XOR    A
  757.     CALL    XFER
  758.     JP    A053C
  759. ;
  760. A052F:    RES    2,H
  761.     LD    A,(HL)
  762.     LD    C,(HL)
  763.     SLA    A
  764.     AND    C
  765.     CALL    XFER
  766.     JP    A053C
  767. ;
  768. A053C:    LD    HL,(ARRYAD)
  769.     JP    A021D
  770. ;
  771. A0542:    LD    A,(D0E53)    ;Toggle flag.
  772.     INC    A
  773.     AND    1
  774.     LD    (D0E53),A
  775.     RET    NZ
  776.     LD    A,(D0E65)
  777.     OR    A
  778.     JR    Z,A0581
  779.     LD    C,A
  780.     LD    A,(D0E64)
  781.     ADD    A,C
  782.     LD    C,A
  783.     OR    A
  784.     JP    M,A02FF
  785.     CP    38H
  786.     JP    NC,A02FF
  787.     LD    (D0E64),A
  788.     LD    B,0
  789.     LD    DE,(D0E68)
  790.     LD    A,7
  791.     CALL    DRAW
  792.     LD    HL,7
  793.     ADD    HL,DE
  794.     LD    (D0E68),HL
  795.     LD    A,(HL)
  796.     CP    0FFH
  797.     RET    NZ
  798.     LD    HL,(D0E66)
  799.     LD    (D0E68),HL
  800.     RET
  801. ;
  802. A0581:    LD    A,(D0E58)
  803.     CP    6
  804.     RET    C
  805.     CALL    A08A8
  806.     RET    NZ
  807.     CALL    A08A8
  808.     BIT    0,A
  809.     LD    C,0FFH
  810.     LD    A,38H
  811.     JR    Z,A059A
  812.     LD    C,1
  813.     LD    A,0
  814. A059A:    LD    (D0E64),A
  815.     LD    A,C
  816.     LD    (D0E65),A
  817.     ADD    A,4
  818.     LD    C,A
  819.     LD    HL,MYSTRY
  820.     CALL    A08A8
  821.     AND    3
  822.     LD    B,A
  823.     JR    Z,A05BA
  824.     CP    C
  825.     JR    Z,A05BA
  826. A05B2:    LD    A,(HL)
  827.     CP    0FFH
  828.     INC    HL
  829.     JR    NZ,A05B2
  830.     DJNZ    A05B2
  831. A05BA:    LD    (D0E66),HL
  832.     LD    (D0E68),HL
  833.     RET
  834. ;
  835. A05C1:    PUSH    AF
  836.     PUSH    BC
  837.     LD    A,(D0E6E)
  838.     OR    A
  839.     JR    Z,A05D7
  840.     LD    A,(D0E5B)
  841.     LD    B,A
  842.     LD    A,(D0E5C)
  843.     LD    C,A
  844.     CALL    A0413
  845.     CALL    A037C
  846. A05D7:    POP    BC
  847.     POP    AF
  848.     RET
  849. ;
  850. A05DA:    LD    A,2
  851.     LD    (D0E6C),A
  852. A05DF:    CALL    A05ED
  853.     CALL    A05C1
  854.     RET    NZ
  855.     LD    HL,D0E6C
  856.     DEC    (HL)
  857.     JR    NZ,A05DF
  858.     RET
  859. ;
  860. A05ED:    XOR    A
  861.     LD    (D0E6E),A
  862.     LD    A,(D0E59)
  863.     LD    (D0E5B),A
  864.     LD    A,(D0E5A)
  865.     LD    (D0E5C),A
  866.     LD    A,(D0E58)
  867.     BIT    1,A
  868.     JR    Z,A0658
  869.     CALL    A0810
  870.     JR    Z,A0645
  871.     LD    B,A
  872.     LD    A,(D0E59)
  873.     DEC    A
  874.     SLA    A
  875.     LD    C,A
  876.     SLA    A
  877.     ADD    A,C
  878.     ADD    A,B
  879.     LD    B,A
  880.     LD    A,(D0E5A)
  881.     DEC    A
  882.     SLA    A
  883.     SLA    A
  884.     LD    C,A
  885.     LD    A,(D0E5D)
  886.     SRA    A
  887.     ADD    A,C
  888.     LD    C,A
  889.     LD    A,(D0E5D)
  890.     LD    DE,1
  891.     BIT    0,A
  892.     JR    Z,A0633
  893.     LD    DE,6
  894. A0633:    LD    A,(D0E59)
  895.     LD    HL,INVDR1    ;Start of ship data.
  896.     BIT    0,A
  897.     JR    NZ,A0640
  898.     LD    HL,INVDR2
  899. A0640:    ADD    HL,DE
  900.     EX    DE,HL
  901.     CALL    A0B7C
  902. A0645:    LD    A,(D0E5A)
  903.     INC    A
  904.     LD    (D0E5A),A
  905.     CP    0CH
  906.     JP    NZ,A078E
  907.     LD    A,1
  908.     LD    (D0E5A),A
  909.     JR    A06A8
  910. ;
  911. A0658:    CALL    A0810
  912.     JR    Z,A0699
  913.     LD    B,A
  914.     LD    A,(D0E59)
  915.     DEC    A
  916.     SLA    A
  917.     LD    C,A
  918.     SLA    A
  919.     ADD    A,C
  920.     ADD    A,B
  921.     LD    B,A
  922.     LD    A,(D0E5A)
  923.     DEC    A
  924.     SLA    A
  925.     SLA    A
  926.     LD    C,A
  927.     LD    A,(D0E5D)
  928.     SRA    A
  929.     ADD    A,C
  930.     LD    C,A
  931.     LD    A,(D0E5D)
  932.     LD    DE,0
  933.     BIT    0,A
  934.     JR    Z,A0687
  935.     LD    DE,5
  936. A0687:    LD    A,(D0E59)
  937.     LD    HL,INVDR1
  938.     BIT    0,A
  939.     JR    NZ,A0694
  940.     LD    HL,INVDR2
  941. A0694:    ADD    HL,DE
  942.     EX    DE,HL
  943.     CALL    A0B7C
  944. A0699:    LD    A,(D0E5A)
  945.     DEC    A
  946.     LD    (D0E5A),A
  947.     JP    NZ,A078E
  948.     LD    A,0BH
  949.     LD    (D0E5A),A
  950. ;
  951. A06A8:    LD    A,(D0E59)
  952.     DEC    A
  953.     LD    (D0E59),A
  954.     JP    NZ,A078E
  955.     JP    A06E7    ;Security measures deleted.
  956.     DEFB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  957.     DEFB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  958.     DEFB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  959. A06E7:    LD    A,5
  960.     LD    (D0E59),A
  961.     LD    A,(D0E58)
  962.     BIT    1,A
  963.     LD    A,(D0E5D)
  964.     LD    (D0E5E),A
  965.     JR    NZ,A06FB
  966.     INC    A
  967.     INC    A
  968. A06FB:    DEC    A
  969.     LD    (D0E5D),A
  970.     LD    A,(D0E6F)
  971.     CP    7
  972.     JR    NC,A075A
  973.     LD    DE,40H
  974.     LD    B,0DH
  975.     LD    A,(D0E58)
  976.     BIT    1,A
  977.     JR    Z,A071E
  978.     LD    HL,1041H
  979. A0715:    LD    A,(HL)
  980.     OR    A
  981.     JR    NZ,A072A
  982.     ADD    HL,DE
  983.     DJNZ    A0715
  984.     XOR    A
  985.     RET
  986. ;
  987. A071E:    LD    HL,107EH
  988. A0721:    LD    A,(HL)
  989.     OR    A
  990.     JR    NZ,A072A
  991.     ADD    HL,DE
  992.     DJNZ    A0721
  993.     XOR    A
  994.     RET
  995. ;
  996. A072A:    LD    A,(D0E58)
  997.     ADD    A,2
  998.     LD    (D0E58),A
  999.     LD    B,A
  1000.     LD    A,(D0E5E)
  1001.     LD    (D0E5D),A
  1002.     LD    C,A
  1003.     SRA    C
  1004.     CALL    A07A5
  1005.     RET    NZ
  1006.     LD    A,5
  1007.     LD    (D0E59),A
  1008.     LD    A,(D0E58)
  1009.     BIT    1,A
  1010.     JR    Z,A0756
  1011.     LD    A,1
  1012. A074E:    LD    (D0E5A),A
  1013.     XOR    A
  1014.     LD    (D0E6E),A
  1015.     RET
  1016. ;
  1017. A0756:    LD    A,0BH
  1018.     JR    A074E
  1019. ;
  1020. A075A:    LD    A,(D0E5D)
  1021.     CP    0FFH
  1022.     JR    Z,A0768
  1023.     CP    28H
  1024.     JR    Z,A0768
  1025.     JP    NZ,A078E
  1026. A0768:    LD    A,(D0E58)
  1027.     ADD    A,2
  1028.     LD    (D0E58),A
  1029.     LD    B,A
  1030.     BIT    1,A
  1031.     JR    Z,A0790
  1032.     LD    C,13H
  1033.     CALL    A07A5
  1034.     RET    NZ
  1035.     LD    A,26H
  1036.     LD    (D0E5D),A
  1037.     LD    A,1
  1038.     LD    (D0E5A),A
  1039. A0785:    LD    A,5
  1040.     LD    (D0E59),A
  1041.     XOR    A
  1042.     LD    (D0E6E),A
  1043. A078E:    XOR    A
  1044.     RET
  1045. ;
  1046. A0790:    LD    C,0
  1047.     CALL    A07A5
  1048.     RET    NZ
  1049.     XOR    A
  1050.     LD    (D0E5D),A
  1051.     LD    A,0BH
  1052.     LD    (D0E5A),A
  1053.     JP    A0785
  1054. ;
  1055. A07A2:    XOR    A
  1056.     INC    A
  1057.     RET
  1058. ;
  1059. A07A5:    PUSH    BC
  1060.     PUSH    DE
  1061.     PUSH    HL
  1062.     LD    IY,T0E6D
  1063.     LD    A,B
  1064.     ADD    A,18H
  1065.     LD    B,A
  1066.     LD    H,5
  1067.     RES    0,(IY+0)
  1068. A07B6:    PUSH    BC
  1069.     LD    A,B
  1070.     DEC    A
  1071.     JP    M,A07EE
  1072.     LD    L,0BH
  1073. A07BE:    LD    DE,INVDR2
  1074.     BIT    0,H
  1075.     JR    Z,A07C8
  1076.     LD    DE,INVDR1    ;Start of ship data.
  1077. A07C8:    LD    A,H
  1078.     LD    (D0E59),A
  1079.     LD    A,0CH
  1080.     SUB    L
  1081.     LD    (D0E5A),A
  1082.     CALL    A0810
  1083.     JR    Z,A07E1
  1084.     SET    0,(IY+0)
  1085.     CALL    A0B7C
  1086.     CALL    A0C24
  1087. A07E1:    PUSH    BC
  1088.     LD    B,0
  1089. A07E4:    DJNZ    A07E4    ;Delay.
  1090.     POP    BC
  1091.     INC    C
  1092. A07E8:    INC    C
  1093.     INC    C
  1094.     INC    C
  1095.     DEC    L
  1096.     JR    NZ,A07BE
  1097. A07EE:    BIT    0,(IY+0)
  1098.     JR    Z,A07FE
  1099.     LD    A,B
  1100.     CP    35H
  1101.     JR    C,A07FE
  1102.     XOR    A
  1103.     INC    A
  1104.     POP    BC
  1105.     JR    A080C
  1106. ;
  1107. A07FE:    POP    BC
  1108.     LD    A,B
  1109.     SUB    6
  1110.     LD    B,A
  1111.     DEC    H
  1112.     JR    NZ,A07B6
  1113.     LD    A,1
  1114.     LD    (D0E6C),A
  1115.     XOR    A
  1116. A080C:    POP    HL
  1117.     POP    DE
  1118.     POP    BC
  1119.     RET
  1120. ;
  1121. A0810:    EXX
  1122.     LD    B,A
  1123.     LD    A,(D0E59)
  1124.     RLCA
  1125.     RLCA
  1126.     RLCA
  1127.     RLCA
  1128.     LD    D,0
  1129.     LD    E,A
  1130.     LD    A,(D0E5A)
  1131.     ADD    A,E
  1132.     LD    E,A
  1133.     LD    HL,T0E78
  1134.     ADD    HL,DE
  1135.     BIT    0,(HL)
  1136.     LD    A,B
  1137.     EXX
  1138.     RET    NZ
  1139.     LD    A,(D0E6C)
  1140.     INC    A
  1141.     LD    (D0E6C),A
  1142.     XOR    A
  1143.     RET
  1144. ;
  1145. A0833:    LD    A,(D0E52)
  1146.     DEC    A
  1147.     AND    1FH
  1148.     LD    (D0E52),A
  1149.     RET    NZ
  1150.     LD    A,(SPEED)
  1151.     LD    C,A
  1152.     SLA    A
  1153.     ADD    A,C
  1154.     LD    (D0E52),A
  1155. A0847:    CALL    A08A8
  1156.     AND    0FH
  1157.     CP    0BH
  1158.     JR    NC,A0847
  1159.     LD    C,A
  1160.     LD    B,5
  1161.     LD    DE,0FFF0H
  1162.     LD    HL,T0EC9
  1163.     ADD    A,L
  1164.     LD    L,A
  1165.     JR    NC,A085E
  1166.     INC    H
  1167. A085E:    LD    A,(HL)
  1168.     OR    A
  1169.     JR    NZ,A086D
  1170.     ADD    HL,DE
  1171.     DJNZ    A085E
  1172.     CALL    A08A8
  1173.     AND    7
  1174.     JR    NZ,A0847
  1175.     RET
  1176. ;
  1177. A086D:    DEC    B
  1178.     LD    A,(D0E5D)
  1179.     SRA    A
  1180.     SLA    C
  1181.     SLA    C
  1182.     ADD    A,C
  1183.     LD    C,A
  1184.     SLA    B
  1185.     LD    A,B
  1186.     SLA    B
  1187.     ADD    A,B
  1188.     LD    B,A
  1189.     LD    A,(D0E58)
  1190. A0883:    ADD    A,B
  1191.     LD    B,A
  1192.     INC    C
  1193.     INC    C
  1194.     INC    B
  1195.     INC    B
  1196.     INC    B
  1197.     INC    B
  1198.     INC    B
  1199.     INC    B
  1200.     CALL    A0B59
  1201.     LD    A,(HL)
  1202.     OR    A
  1203.     RET    NZ
  1204.     CALL    A08A8    ;Get random number.
  1205.     BIT    0,A
  1206.     LD    A,4    ;Invader's laser flash (zigzag).
  1207.     JR    Z,A089E
  1208.     LD    A,0BH    ;Invader's bomb trace (down arrow).
  1209. A089E:    CALL    XFER
  1210.     SET    2,H
  1211.     XOR    A
  1212.     CALL    XFER
  1213.     RET
  1214. ;
  1215. A08A8:    PUSH    HL
  1216.     PUSH    BC
  1217.     LD    B,4
  1218.     LD    HL,D0E60
  1219.     LD    A,R        ;Get a random number.
  1220. A08B1:    XOR    (HL)
  1221.     RLCA
  1222.     LD    (HL),A
  1223.     INC    HL
  1224.     DJNZ    A08B1
  1225.     LD    (D0E60),A
  1226.     POP    BC
  1227.     POP    HL
  1228.     RET
  1229. ;
  1230. A08BD:    PUSH    HL
  1231.     PUSH    BC
  1232.     LD    HL,13D1H
  1233.     LD    B,2FH
  1234. A08C4:    LD    A,20H
  1235.     CALL    XFER
  1236.     SET    2,H
  1237.     XOR    A    ;Set character attributes.
  1238.     CALL    XFER
  1239.     RES    2,H
  1240.     INC    HL
  1241.     DJNZ    A08C4
  1242.     POP    BC
  1243.     POP    HL
  1244.     RET
  1245. ;
  1246. A08D7:    PUSH    HL
  1247.     PUSH    DE
  1248.     LD    HL,SCORMS    ;Print "Score"
  1249.     LD    DE,SCREEN+3D3H    ;near bottom right.
  1250.     CALL    PRMSG        ;Print message.
  1251.     LD    HL,(CSCORL)
  1252.     CALL    A092A
  1253.     LD    HL,(RSCORE)
  1254.     LD    A,H
  1255.     OR    L
  1256.     JR    Z,A08FE
  1257.     LD    HL,HIGHSCR    ;Score.
  1258.     LD    DE,SCREEN+3E1H
  1259.     CALL    PRMSG        ;Print message.
  1260.     LD    HL,(RSCORE)
  1261.     CALL    A092A
  1262. A08FE:    POP    DE
  1263.     POP    HL
  1264.     RET
  1265. ;
  1266. ; Print string pointed to by <HL> on screen at location <DE>
  1267. ; until null byte found in string.
  1268. PRMSG:    LD    A,(HL)    ;Get character.
  1269.     OR    A    ;Null terminator?
  1270.     JR    NZ,A0907 ;Skip if not.
  1271.     INC    HL    ;Else, bump pointer and return.
  1272.     RET
  1273. ;
  1274. A0907:    LD    (DE),A    ;Put character on screen.
  1275.     SET    2,D    ;Set character attributes in attr. ram
  1276.             ; (at F400H).
  1277.     XOR    A    ;   attribute = character.
  1278.     LD    (DE),A
  1279.     RES    2,D    ;Restore pointer to screen ram.
  1280.     INC    HL    ;Next character.
  1281.     INC    DE    ;Next screen location.
  1282.     JR    PRMSG
  1283. ;
  1284. A0912:    PUSH    AF    ;Part of score processing.
  1285.     PUSH    HL
  1286.     LD    A,(CSCORL) ;Low byte.
  1287.     ADD    A,L
  1288.     DAA
  1289.     LD    (CSCORL),A
  1290.     LD    A,(CSCORH) ;High byte.
  1291.     ADC    A,H
  1292.     DAA
  1293.     LD    (CSCORH),A
  1294.     CALL    A08D7
  1295.     POP    HL
  1296.     POP    AF
  1297.     RET
  1298. ;
  1299. A092A:    PUSH    BC
  1300.     PUSH    HL
  1301.     LD    B,4
  1302. A092E:    CALL    A0950
  1303.     PUSH    AF
  1304.     JR    NZ,A0936
  1305.     LD    A,0F0H
  1306. A0936:    ADD    A,30H
  1307.     LD    (DE),A
  1308.     INC    DE
  1309.     POP    AF
  1310.     JR    NZ,A0948
  1311.     DJNZ    A092E
  1312.     JR    A094A
  1313. ;
  1314. A0941:    CALL    A0950
  1315.     ADD    A,30H
  1316.     LD    (DE),A
  1317.     INC    DE
  1318. A0948:    DJNZ    A0941
  1319. A094A:    LD    A,30H
  1320.     LD    (DE),A
  1321.     POP    HL
  1322.     POP    BC
  1323.     RET
  1324. ;
  1325. A0950:    PUSH    BC
  1326.     LD    B,4
  1327. A0953:    RL    L
  1328.     RL    H
  1329.     RLA
  1330.     DJNZ    A0953
  1331.     AND    0FH
  1332.     POP    BC
  1333.     RET
  1334. ;
  1335. ; Fill table with 50H successive 1's.
  1336. A095E:    LD    HL,T0E89    ;Point to table.
  1337.     LD    B,50H
  1338. A0963:    LD    (HL),1
  1339.     INC    HL
  1340.     DJNZ    A0963
  1341.     XOR    A
  1342.     LD    (D0E65),A
  1343.     LD    A,37H
  1344.     LD    (D0E6F),A
  1345.     LD    A,5
  1346.     LD    (D0E59),A
  1347.     LD    A,0BH
  1348.     LD    (D0E5A),A
  1349.     LD    A,14H
  1350.     LD    (D0E5D),A
  1351.     LD    A,4
  1352.     LD    (D0E58),A
  1353.     LD    B,30H
  1354.     LD    C,7
  1355. A0989:    PUSH    BC
  1356.     LD    DE,FORTTOP    ;Draw top of fortress.
  1357.     LD    A,6        ;Fortress width.
  1358.     CALL    DRAW
  1359.     LD    A,4
  1360.     ADD    A,B
  1361.     LD    B,A
  1362.     LD    DE,FORTBOT    ;Draw base of fortress.
  1363.     LD    A,6        ;Width.
  1364.     CALL    DRAW
  1365.     POP    BC
  1366.     LD    A,0EH
  1367.     ADD    A,C
  1368.     LD    C,A
  1369.     CP    3BH
  1370.     JR    C,A0989
  1371.     CALL    A09C2
  1372.     LD    C,0AH
  1373.     LD    B,0C0H
  1374. A09AE:    CALL    A07A5
  1375.     INC    B
  1376.     INC    B
  1377.     LD    A,6
  1378.     CP    B
  1379.     JR    NZ,A09AE
  1380.     CALL    A08BD
  1381.     CALL    A08D7
  1382.     CALL    A09C2
  1383.     RET
  1384. ;
  1385. ; Draw defender's laser cannon.
  1386. A09C2:    LD    A,8    ;Initial offset from LH side of screen.
  1387.     LD    (CANPOS),A
  1388.     LD    HL,178AH
  1389.     LD    (D0E4B),HL
  1390.     CALL    A09FD
  1391. A09D0:    PUSH    BC
  1392.     PUSH    DE
  1393.     PUSH    HL
  1394.     LD    HL,(D0E4B)
  1395.     LD    A,GRFBIT
  1396.     CALL    XFER
  1397.     LD    DE,CANNON
  1398.     LD    B,38H
  1399.     LD    A,(CANPOS)
  1400.     LD    C,A
  1401.     LD    A,5
  1402.     CALL    DRAW    ;Draw the cannon.
  1403.     INC    C
  1404.     INC    C
  1405.     LD    HL,1780H
  1406.     LD    E,C
  1407.     LD    D,0
  1408.     ADD    HL,DE
  1409.     LD    (D0E4B),HL
  1410.     LD    A,D
  1411.     CALL    XFER    ;Draw the flash tube coils in cannon.
  1412.     POP    HL
  1413.     POP    DE
  1414.     POP    BC
  1415.     RET
  1416. ;
  1417. ; Draw spare cannon on bottom line of screen.
  1418. A09FD:    PUSH    AF
  1419.     PUSH    BC
  1420.     PUSH    DE
  1421.     PUSH    HL
  1422.     LD    DE,SCREEN+3C1H    ;Screen location.
  1423.     LD    A,(NUMCAN)    ;Any spare cannon left?
  1424.     OR    A
  1425.     JR    Z,A0A18        ;Skip if not.
  1426.     LD    B,A        ;Else, draw them
  1427.     XOR    A
  1428. A0A0C:    ADD    A,5        ;at intervals of 5.
  1429.     DJNZ    A0A0C
  1430.     LD    C,A        ;Put them on screen.
  1431.     LD    B,0
  1432.     LD    HL,SPARES
  1433.     LDIR
  1434. A0A18:    XOR    A
  1435.     LD    (DE),A
  1436.     INC    DE
  1437.     LD    A,E
  1438.     CP    0D1H
  1439.     JP    C,A0A18
  1440.     POP    HL
  1441.     POP    DE
  1442.     POP    BC
  1443.     POP    AF
  1444.     RET
  1445. ;
  1446. CHASER:    XOR    A        ;Blank screen corners.
  1447.     LD    (TOPLFT),A    ;Top left.
  1448.     LD    (TOPRIT),A    ;Top right.
  1449.     LD    (BOTLFT),A    ;Bottom left.
  1450.     LD    (BOTRIT),A    ;Bottom right.
  1451.     PUSH    BC
  1452.     LD    A,(IX+0)    ;Get data from border table.
  1453.     LD    HL,TOPLFT    ;Point to top left of screen.
  1454.     LD    BC,32        ;32 horiz dots to do
  1455.     LD    DE,2        ;..at intervals of 2 chars.
  1456.     CALL    DRAWLN        ;Draw top row.
  1457.     LD    A,(IX+1)    ;Clear the intermediate points.
  1458.     INC    HL        ;Starting at SCREEN+1.
  1459.     CALL    DRAWLN
  1460.     LD    A,(IX+2)    ;Draw bottom row of dots
  1461.     LD    HL,BOTLFT    ;starting at bottom left.
  1462.     CALL    DRAWLN
  1463.     INC    HL        ;Zero intermediate points.
  1464.     LD    A,(IX+3)
  1465.     CALL    DRAWLN
  1466.     LD    A,(IX+4)    ;Draw LH vertical dots
  1467.     LD    HL,TOPLFT    ;starting at top left.
  1468.     LD    BC,16        ;16 dots to do
  1469.     LD    DE,40H        ;at line spacing.
  1470.     CALL    DRAWLN
  1471.     LD    A,(IX+5)    ;Draw RH vertical dots
  1472.     LD    HL,TOPRIT    ;Starting at top right.
  1473.     LD    BC,16        ;16 to do.
  1474.     CALL    DRAWLN
  1475.     CALL    WAIT
  1476.     POP    BC
  1477.     RET
  1478. ;
  1479. DRAWLN:    PUSH    BC
  1480.     PUSH    HL
  1481.     LD    (D0E43),A
  1482. A0A7F:    LD    A,(D0E43)
  1483.     CALL    EDGECK
  1484.     JR    NZ,A0A8D
  1485.     CALL    A0B1A
  1486.     JR    NZ,A0A8D
  1487.     OR    (HL)
  1488. A0A8D:    LD    (HL),A
  1489.     ADD    HL,DE
  1490.     DEC    BC
  1491.     LD    A,B
  1492.     OR    C
  1493.     JR    NZ,A0A7F
  1494.     POP    HL
  1495.     POP    BC
  1496.     LD    A,(D0E43)
  1497.     RET
  1498. ;
  1499. ; Print "SPACE INVADERS" in large letters.
  1500. PTITLE:    PUSH    HL
  1501.     PUSH    BC
  1502.     PUSH    DE
  1503.     LD    DE,(SCRADR) ;Get screen address.
  1504.     LD    A,D    ;Check high byte.
  1505.     CP    [SCREEN+300H]/256
  1506.     JR    Z,A0AC5 ;Do nothing if out of range.
  1507.     LD    A,0CH    ;Add displacement from LH side.
  1508.     ADD    A,E
  1509.     LD    E,A
  1510.     LD    HL,INVTOP ;Point to top row data.
  1511.     LD    BC,29H      ;Length of string to transfer.
  1512.     PUSH    BC      ;Lower row is same length.
  1513.     LDIR          ;Transfer to screen.
  1514.     POP    BC      ;Recover length.
  1515.     LD    HL,17H      ;Add offset to bottom row.
  1516.     ADD    HL,DE
  1517.     EX    DE,HL
  1518.     LD    HL,INVBOT ;Print bottom row.
  1519.     LDIR
  1520.     LD    HL,4BH      ;Update screen address.
  1521.     ADD    HL,DE
  1522.     LD    (SCRADR),HL
  1523. A0AC5:    POP    DE
  1524.     POP    BC
  1525.     POP    HL
  1526.     RET
  1527. ;
  1528. CLRSCN:    PUSH    AF
  1529.     PUSH    HL
  1530.     LD    HL,IMAGE    ;Point to array image.
  1531. A0ACE:    XOR    A        ;Fill it with zeros.
  1532.     CALL    XFER
  1533.     SET    2,H
  1534.     LD    A,GRFBIT
  1535.     CALL    XFER
  1536.     RES    2,H
  1537.     INC    HL
  1538.     BIT    2,H        ;All done yet?
  1539.     JR    Z,A0ACE
  1540.     POP    HL
  1541.     POP    AF
  1542.     RET
  1543. ;
  1544.     LD    HL,SCREEN
  1545. A0AE6:    LD    (HL),0
  1546.     INC    HL
  1547.     BIT    2,H
  1548.     JR    Z,A0AE6
  1549. A0AED:    LD    A,L
  1550.     AND    3FH
  1551.     JR    Z,A0B0A
  1552.     INC    A
  1553.     AND    3FH
  1554.     JR    Z,A0B0A
  1555.     PUSH    HL
  1556.     RLC    L
  1557.     RL    H
  1558.     RLC    L
  1559.     RL    H
  1560.     LD    A,H
  1561.     POP    HL
  1562.     AND    0FH
  1563.     JR    Z,A0B0A
  1564.     CP    0FH
  1565.     JR    NZ,A0B0E
  1566. A0B0A:    LD    (HL),2
  1567.     JR    A0B10
  1568. ;
  1569. A0B0E:    LD    (HL),3
  1570. A0B10:    INC    HL
  1571.     BIT    3,H
  1572.     JR    Z,A0AED
  1573.     RET
  1574. ;
  1575. CKSCRN:    CALL    EDGECK    ;Check horizontal position.
  1576.     RET    Z    ;Return if at either edge.
  1577. A0B1A:    PUSH    HL
  1578.     PUSH    BC
  1579.     PUSH    DE
  1580.     LD    B,A    ;Save <A>.
  1581.     LD    DE,SCREEN+40H
  1582.     PUSH    HL
  1583.     AND    A
  1584.     SBC    HL,DE
  1585.     POP    HL
  1586.     JR    C,A0B33
  1587.     LD    DE,BOTLFT
  1588.     XOR    A
  1589.     SBC    HL,DE
  1590.     JR    NC,A0B33
  1591.     INC    A
  1592.     JR    A0B34
  1593. ;
  1594. A0B33:    XOR    A
  1595. A0B34:    LD    A,B    ;Restore <A>.
  1596.     POP    DE
  1597.     POP    BC
  1598.     POP    HL
  1599.     RET
  1600. ;
  1601. ; Check if at screen edges, return zero if so.
  1602. EDGECK:    PUSH    BC
  1603.     LD    B,A    ;Save <A>.
  1604.     LD    A,L    ;Get LSB of screen address.
  1605.     AND    3FH    ;At RH edge?
  1606.     JR    Z,A0B42    ;Return with zero if yes.
  1607.     CP    3FH    ;Else, see if at LH edge.
  1608. A0B42:    LD    A,B    ;Restore <A>.
  1609.     POP    BC
  1610.     RET
  1611. ;
  1612. WAIT:    PUSH    BC
  1613.     LD    BC,0BB8H
  1614. A0B49:    DEC    BC
  1615.     LD    A,B
  1616.     OR    C
  1617.     JR    NZ,A0B49
  1618.     POP    BC
  1619.     IN    A,(0)    ;Read data from port 0.
  1620.     RES    7,A    ;Strip parity.
  1621.     CP    1BH    ;Escape?
  1622.     RET    NZ    ;Return if not.
  1623.     LD    A,0AH
  1624.     RST    0
  1625. A0B59:    LD    A,B
  1626.     AND    3
  1627.     LD    (IX+1),A
  1628.     SUB    4
  1629.     NEG
  1630.     LD    (IX+3),A
  1631.     LD    A,B
  1632.     RRCA
  1633.     RRCA
  1634.     RRCA
  1635.     RRCA
  1636.     AND    3
  1637.     LD    H,A
  1638.     LD    A,B
  1639.     RLCA
  1640.     RLCA
  1641.     RLCA
  1642.     RLCA
  1643.     AND    0C0H
  1644.     OR    C
  1645.     LD    L,A
  1646.     LD    BC,1000H
  1647.     ADD    HL,BC
  1648.     RET
  1649. ;
  1650. A0B7C:    LD    A,4
  1651. DRAW:    LD    (IX+0),A
  1652.     PUSH    AF
  1653.     PUSH    BC
  1654.     PUSH    DE
  1655.     PUSH    HL
  1656.     CALL    A0B59
  1657.     JP    A0B8B
  1658. ;
  1659. A0B8B:    LD    A,(IX+3)
  1660.     AND    3
  1661.     PUSH    HL
  1662.     PUSH    DE
  1663.     OR    A
  1664.     JR    Z,A0B9E
  1665.     LD    B,A
  1666.     LD    A,0FFH
  1667. A0B98:    SRL    A
  1668.     SRL    A
  1669.     DJNZ    A0B98
  1670. A0B9E:    LD    (IX+4),A
  1671.     LD    C,(IX+0)
  1672. A0BA4:    LD    B,(IX+1)
  1673.     LD    A,(DE)
  1674.     INC    B
  1675.     JP    A0BB0
  1676. ;
  1677. A0BAC:    SLA    A
  1678.     SLA    A
  1679. A0BB0:    DJNZ    A0BAC
  1680.     LD    (IX+2),A
  1681.     CALL    A0BF2
  1682.     INC    DE
  1683.     INC    HL
  1684.     DEC    C
  1685.     JP    NZ,A0BA4
  1686.     LD    A,(IX+4)
  1687.     CPL
  1688.     LD    (IX+4),A
  1689.     POP    DE
  1690.     POP    HL
  1691.     LD    BC,0040H
  1692.     ADD    HL,BC
  1693.     LD    C,(IX+0)
  1694. A0BCE:    LD    B,(IX+3)
  1695.     LD    A,B
  1696.     AND    3
  1697.     JR    Z,A0BED
  1698.     INC    B
  1699.     LD    A,(DE)
  1700.     JP    A0BDF
  1701. ;
  1702. A0BDB:    SRL    A
  1703.     SRL    A
  1704. A0BDF:    DJNZ    A0BDB
  1705.     LD    (IX+2),A
  1706.     CALL    A0BF2
  1707.     INC    DE
  1708.     INC    HL
  1709.     DEC    C
  1710.     JP    NZ,A0BCE
  1711. A0BED:    POP    HL
  1712.     POP    DE
  1713.     POP    BC
  1714.     POP    AF
  1715.     RET
  1716. ;
  1717. A0BF2:    LD    A,(HL)
  1718.     SET    2,H
  1719.     BIT    1,(HL)
  1720.     RES    2,H
  1721.     JR    NZ,A0C13
  1722.     CP    19H
  1723.     JR    NZ,A0C09
  1724.     LD    A,(IX+2)
  1725.     OR    A
  1726.     RET    Z
  1727.     LD    A,0FFH
  1728.     LD    (D0E6E),A
  1729. A0C09:    SET    2,H
  1730.     LD    A,GRFBIT
  1731.     CALL    XFER
  1732.     RES    2,H
  1733.     XOR    A
  1734. A0C13:    AND    (IX+4)
  1735.     OR    (IX+2)
  1736. ;
  1737. ; Store a byte in image and on screen.
  1738. XFER:    PUSH    HL    ;Save current image address.
  1739.     LD    (HL),A    ;Store byte in image.
  1740.     EX    AF,AF'    ;Save data byte.
  1741.     LD    A,[SCREEN/256]-IMAGE/256
  1742.     ADD    A,H    ;Calculate equivalent screen address.
  1743.     LD    H,A
  1744.     EX    AF,AF'    ;Restore data.
  1745.     LD    (HL),A    ;Write to screen.
  1746.     POP    HL    ;Restore current image address.
  1747.     RET
  1748. ;
  1749. A0C24:    PUSH    BC
  1750.     DEC    B
  1751.     CALL    A0C2F
  1752.     DEC    B
  1753.     CALL    A0C2F
  1754.     POP    BC
  1755.     RET
  1756. ;
  1757. A0C2F:    PUSH    AF
  1758.     PUSH    BC
  1759.     PUSH    DE
  1760.     PUSH    HL
  1761.     CALL    A0B59
  1762.     LD    B,(IX+3)
  1763.     LD    A,0FCH
  1764. A0C3B:    RRCA
  1765.     RRCA
  1766.     DJNZ    A0C3B
  1767.     LD    C,A
  1768.     LD    B,4
  1769. A0C42:    LD    A,(HL)
  1770.     SET    2,H
  1771.     BIT    1,(HL)
  1772.     RES    2,H
  1773.     JR    Z,A0C4F
  1774.     AND    C
  1775.     CALL    XFER
  1776. A0C4F:    INC    HL
  1777.     DJNZ    A0C42
  1778.     POP    HL
  1779.     POP    DE
  1780.     POP    BC
  1781.     POP    AF
  1782.     RET
  1783. ;
  1784. ; Data for graphic objects.
  1785. INVDR1:    DEFB    0,66H,36H,44H,0    ;Type 1 invader (20 points).
  1786.     DEFB    0,8,79H,59H,0
  1787. INVDR2:    DEFB    0,0B8H,0B9H,10H,0 ;Type 2 invader (40 points).
  1788.     DEFB    0,0A0H,36H,0B4H,0
  1789. SPACE:    DEFB    0,0,0,0,0
  1790. MYSTRY:    DEFB    0,0E8H,0B3H,0B6H,0B9H,40H,0,0FFH ;Mystery 1.
  1791.     DEFB    0,0E8H,0B2H,0F7H,0B8H,40H,0,0FFH ;Mystery 2.
  1792.     DEFB    0,68H,0ADH,0ACH,2DH,40H,0,0FFH,0 ;Mystery 3.
  1793.     DEFB    60H,6,9,90H,60H,0,0,6,9,90H,60H,6,0,0 ;Wiggler.
  1794.     DEFB    9,90H,60H,6,9,0,0,90H,60H,6,9,90H,0,0FFH
  1795. CANNON:    DEFB    0,0EAH,7FH,0D5H,0    ;Charged laser cannon.
  1796.     DEFB    0,0EAH,0,0D5H,0        ;Empty laser cannon.
  1797.     DEFB    0,0EAH,8,0D5H,0        ;Cannon destroyed....
  1798.     DEFB    0,0ECH,10H,0D5H,0,80H,0E4H,84H
  1799.     DEFB    0D6H,10H,0A0H,0E2H,0D8H,0D0H,48H,0D0H,0E4H,0F0H
  1800.     DEFB    0A8H,50H,0C0H,0F0H,0F4H,0E0H,40H,0,0E0H,0F0H
  1801.     DEFB    80H,0,0,80H,0D0H,40H,0
  1802. SPARES:    DEFB    0E8H,0F0H,0D4H,0    ;Spare cannon 1.
  1803.     DEFB    0,0E8H,0F0H,0D4H,0    ;Spare cannon 2.
  1804.     DEFB    0,0E8H,0F0H,0D4H,0,0    ;Spare cannon 3.
  1805. ;
  1806. ;Top of fortress.
  1807. FORTTOP: DEFB    0B4H,0D4H,0D0H,0D0H,0F4H,14H
  1808. ;
  1809. ; Bottom of fortress.
  1810. FORTBOT: DEFB    3AH,3FH,3FH,3FH,3FH,10H
  1811. ;
  1812. ; Data for top row of "SPACE INVADERS" title.
  1813. INVTOP:    DEFB    96H,0C3H,4,0D7H,0C3H,14H,58H,9,50H,56H,3,4
  1814.     DEFB    0D7H,0C3H,1,0,0,0,0ABH,1,5DH,90H,55H,55H,0,55H
  1815.     DEFB    58H,9,50H,57H,3,54H,0D7H,0C3H,1,0D7H,0C3H,14H
  1816.     DEFB    96H,0C3H,4
  1817. ;
  1818. ; Data for bottom row of "SPACE INVADERS" title.
  1819. INVBOT:    DEFB    24H,30H,5,15H,0,0,17H,3,15H,25H,30H,4,35H
  1820.     DEFB    30H,10H,0,0,0,3AH,10H,15H,0,15H,9,18H,1,17H,3
  1821.     DEFB    15H,35H,30H,5H,35H,30H,10H,15H,9H,10H,24H,30H,5
  1822. ;
  1823. ; Data for "chaser" dots on edge of screen (Referenced by IX).
  1824. BORDR1:    DEFB    1,0,80H,0,1
  1825.     DEFB    8,2,0,40H,0
  1826.     DEFB    40H,20H,0
  1827.     DEFB    1,0,80H,10H,80H,0,2,0,40H,4,2,0FFH
  1828. ;
  1829. ; TABLE INITIALLY POINTED TO BY IY.
  1830. BORDR2:    DEFB    0,2,0,40H,4,2,0,1,0
  1831.     DEFB    80H,10H,80H,2,0,40H,0,40H,20H,1,0
  1832.     DEFB    80H,0,1,8,0FFH
  1833. T0D76:    DEFB    20H,3AH,20H,0
  1834. ;
  1835. AUTHMS:    DEFB    'written by '
  1836.     DEFB    'Matthew Starr and '
  1837.     DEFB    'Tim Morris-Yates',0
  1838. HIGHMS:    DEFB    'High '
  1839. SCORMS:    DEFB    'Score ',0
  1840. NEWHI:    DEFB    '  N E W   H I G H   S C O R E  ',0
  1841. PRESSN:    DEFB    '  press N to enthrone your name in glory  ',0
  1842. STTKEY:    DEFB    '  ***  Press any key to start ***  ',0
  1843. OVERMS:    DEFB    '  ***  G A M E   O V E R  ***  ',0
  1844. ;
  1845. D0E43:    DEFB    33H
  1846. COUNTR:    DEFB    0
  1847. SCRADR:    DEFW    0    ;Current screen address.
  1848. RSCORE:    DEFW    0    ;Record (highest) score.
  1849. CSCORL:    DEFB    0    ;Current game score (low byte)
  1850. CSCORH:    DEFB    0    ;   "     "     "   (high byte)
  1851. D0E4B:    DEFB    30H
  1852.     DEFB    30H
  1853.     DEFB    22H
  1854. CANPOS:    DEFB    0    ;Current horiz position of laser cannon
  1855. NUMCAN:    DEFB    3    ;No of spare cannon (initially 3).
  1856.     DEFB    21H
  1857. D0E50:    DEFB    3BH
  1858. FRAMES:    DEFB    0    ;Count of game frames.
  1859. D0E52:    DEFB    34H
  1860. D0E53:    DEFB    7EH
  1861. FIREFL:    DEFB    0    ;Fire flag (-1 if not firing, else 0).
  1862. ARRYAD:    DEFW    1F21H    ;Array address.
  1863. D0E57:    DEFB    26H
  1864. D0E58:    DEFB    0F0H
  1865. D0E59:    DEFB    0CDH
  1866. D0E5A:    DEFB    0D8H
  1867. D0E5B:    DEFB    0EH
  1868. D0E5C:    DEFB    21H
  1869. D0E5D:    DEFB    3CH
  1870. D0E5E:    DEFB    11H
  1871. SPEED:    DEFB    0
  1872. D0E60:    DEFB    0E5H
  1873.     DEFB    7EH
  1874. A0E62:    DEFB    21H
  1875.     DEFB    38H
  1876. D0E64:    DEFB    0F0H
  1877. D0E65:    DEFB    0CDH
  1878. D0E66:    DEFB    0D8H
  1879.     DEFB    0EH
  1880. D0E68:    DEFB    0E1H
  1881.     DEFB    3EH
  1882. T0E6A:    DEFB    3CH
  1883.     DEFB    0BEH
  1884. D0E6C:    DEFB    20H
  1885. T0E6D:    DEFB    65H
  1886. D0E6E:    DEFB    36H
  1887. D0E6F:    DEFB    0
  1888. HIGHSCR: DEFB    21H
  1889.     DEFB    30H
  1890.     DEFB    30H
  1891.     DEFB    22H
  1892.     DEFB    38H
  1893.     DEFB    0F0H
  1894.     DEFB    21H
  1895.     DEFB    3DH
  1896. T0E78:    DEFB    11H
  1897.     DEFB    34H
  1898.     DEFB    7EH
  1899.     DEFB    21H
  1900.     DEFB    35H
  1901.     DEFB    0F0H
  1902.     DEFB    0CDH
  1903.     DEFB    0D8H
  1904.     DEFB    0EH
  1905.     DEFB    21H
  1906.     DEFB    3DH
  1907.     DEFB    11H
  1908.     DEFB    3EH
  1909.     DEFB    18H
  1910.     DEFB    0BEH
  1911.     DEFB    20H
  1912.     DEFB    4AH
  1913. T0E89:    DEFB    36H
  1914.     DEFB    0
  1915.     DEFB    21H
  1916.     DEFB    30H
  1917.     DEFB    30H
  1918.     DEFB    22H
  1919.     DEFB    35H
  1920.     DEFB    0F0H
  1921.     DEFB    21H
  1922.     DEFB    3EH
  1923.     DEFB    11H
  1924.     DEFB    34H
  1925.     DEFB    7EH
  1926.     DEFB    21H
  1927.     DEFB    2BH
  1928.     DEFB    0F0H
  1929.     DEFB    0CDH
  1930.     DEFB    0D8H
  1931.     DEFB    0EH
  1932.     DEFB    21H
  1933.     DEFB    3EH
  1934.     DEFB    11H
  1935.     DEFB    3AH
  1936.     DEFB    41H
  1937.     DEFB    11H
  1938.     DEFB    0BEH
  1939.     DEFB    30H
  1940.     DEFB    2EH
  1941.     DEFB    36H,1,21H,30H,31H,22H,2BH,0F0H,21H,3FH,11H
  1942.     DEFB    34H,7EH,21H,2EH,0F0H,0CDH,0D8H,0EH,3EH,0CH
  1943.     DEFB    21H,3FH,11H,0BEH,30H,13H,36H,1,21H,30H,31H
  1944.     DEFB    22H,2EH,0F0H,21H
  1945. ;
  1946. T0EC9:    DEFB    40H
  1947.     DEFB    11H
  1948.     DEFB    34H
  1949.     DEFB    7EH
  1950.     DEFB    21H
  1951.     DEFB    31H
  1952.     DEFB    0F0H
  1953.     DEFB    0CDH
  1954.     DEFB    0D8H
  1955.     DEFW    0E08H
  1956.     DEFB    0D9H,0FBH,0EDH,4DH,0C5H
  1957. T0ED9:    DEFB    0EH
  1958. ;
  1959.     ORG    1000H
  1960. IMAGE:    DS    400H    ;Screen image array.
  1961. ATTIMG:    EQU    $    ;Screen attribute image array.
  1962. ;
  1963. ;**************************************************************
  1964. ;
  1965.     END
  1966.  
  1967.