\*** GRABIT DISASSEMBLY *** \C.R.Dewhurst, March 2001. \ *** ENVELOPEs *** 08C0 EQUB 1,7, 1,1,1,1,1,1, 121,-10,-5,-2,100,100 08D0 EQUB 2,7, -1,-1,-1,1,1,1, 121,-10,-5,-2,100,100 08E0 EQUB 3,1, -3,-3,-8,10,10,10, 126,-8,-8,-8,126,126 08F0 EQUB 4,7, 0,0,0,1,1,1, 121,-10,-5,-2,120,120 \*** Co-ordinates of 15 stars in backdrop *** \First byte column (0-79) \Second byte scan line (0-255) 0900 EQUB 35,168, 18,184, 33,189, 62,129 0908 EQUB 66,143, 54,134, 61,94, 13,193 0910 EQUB 70,72, 39,210, 28,107, 33,82 0918 EQUB 23,186, 56,193, 16,102 \pixel codes for stars 091E EQUB 1,4,5,16,17,20,21,2 \Alien attributes - aliens' flight paths \Byte 1 Starting x coordinate &0926,X > &2B00 \Byte 2 Starting y coordinate &0927,X > &2B01 \Byte 3 Alien type &0928,X > &2B04 \1=Balloon, 2=Mr Hat, 3=Ball, 4=Bird \Byte 4 Alien sprite number &929,X > &2B0A \Byte 5 > &2B0B,&2B09 \Byte 6 > &2B3D \Byte 7 > &2B15 \Byte 8 > &2B41 0926 EQUB 4,150,3,9,2,16,6,12 092E EQUB 72,150,2,6,2,8,6,12 0936 EQUB 28,150,1,5,1,5,4,8 093E EQUB 44,150,4,6,5,3,3,7 0946 EQUB 64,78,3,9,1,2,2,6 094E EQUB 12,78,2,6,2,1,2,5 \Player's path in demo 0980 EQUB 4,-6, -3,5, -3,-6, 4,5 0988 EQUB -3,5, 4,-6, -3,-6, 4,5 0990 EQUB -3,5 \Filler bytes for rest of page 9 09A0 EQUD 0,0,0,0 09C0 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \*** sound data *** 0A00 EQUW 1,1,99,9 \sound 0 0A08 EQUW 1,2,99,9 \sound 1 0A10 EQUW 2,-11,216,1 \sound 2 0A18 EQUW 0,4,6,10 \sound 3 0A20 EQUW 3,-11,100,3 \sound 4 0A28 EQUW 2,4,120,1 \sound 5 0A30 EQUW 3,-11,216,1 \sound 6 0A38 EQUW 1,4,99,3 \sound 7 \Filler bytes for rest of page &A 0A40 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0A80 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0AC0 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ *** User-defined Graphics Characters *** \"D.Ryder" logo CHR$224-227 0C00 EQUB &C3 \11000011 CHR$224 0C01 EQUB &A4 \10100100 0C02 EQUB &94 \10010100 0C03 EQUB &97 \10010111 0C04 EQUB &94 \10010100 0C05 EQUB &94 \10010100 0C06 EQUB &A4 \10100100 0C07 EQUB &DC \11011100 0C08 EQUB &80 \10000000 CHR$225 0C09 EQUB &40 \01000000 0C0A EQUB &52 \01010010 0C0B EQUB &92 \10010010 0C0C EQUB &92 \10010010 0C0D EQUB &4E \01001110 0C0E EQUB &42 \01000010 0C0F EQUB &3F \00111111 0C10 EQUB &08 \00001000 CHR$226 0C11 EQUB &08 \00001000 0C12 EQUB &08 \00001000 0C13 EQUB &09 \00001001 0C14 EQUB &7A \01111010 0C15 EQUB &8F \10001111 0C16 EQUB &86 \10000110 0C17 EQUB &79 \01111001 0C18:EQUB &00 \00000000 CHR$227 0C19 EQUB &00 \00000000 0C1A EQUB &10 \00010000 0C1B EQUB &CB \11001011 0C1C EQUB &2C \00101100 0C1D EQUB &E8 \11101000 0C1E EQUB &08 \00001000 0C1F EQUB &F8 \11111000 \ "VOYAGER" logo CHR$228-232 0C20 EQUB &88 \10001000 CHR$228 0C21 EQUB &89 \10001001 0C22 EQUB &8A \10001010 0C23 EQUB &8A \10001010 0C24 EQUB &8A \10001010 0C25 EQUB &52 \01010010 0C26 EQUB &52 \01010010 0C27 EQUB &21 \00100001 0C28 EQUB &00 \00000000 CHR$229 0C29 EQUB &92 \10010010 0C2A EQUB &52 \01010010 0C2B EQUB &52 \01010010 0C2C EQUB &4E \01001110 0C2D EQUB &42 \01000010 0C2E EQUB &42 \01000010 0C2F EQUB &9C \10011100 0C30 EQUB &00 \00000000 CHR$230 0C31 EQUB &63 \01100011 0C32 EQUB &94 \10010100 0C33 EQUB &94 \10010100 0C34 EQUB &F5 \11110101 0C35 EQUB &94 \10010100 0C36 EQUB &94 \10010100 0C37 EQUB &93 \10010011 0C38 EQUB &00 \00000000 CHR$231 0C39 EQUB &9D \10011101 0C3A EQUB &21 \00100001 0C3B EQUB &21 \00100001 0C3C EQUB &BD \10111101 0C3D EQUB &A1 \10100001 0C3E EQUB &A1 \10100001 0C3F EQUB &9D \10011101 0C40 EQUB &00 \00000000 CHR$232 0C41 EQUB &C0 \11000000 0C42 EQUB &20 \00100000 0C43 EQUB &20 \00100000 0C44 EQUB &C0 \11000000 0C45 EQUB &20 \00100000 0C46 EQUB &20 \00100000 0C47 EQUB &20 \00100000 \Filler bytes for rest of page &C 0C48 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0 0C80 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0CC0 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 P%=&1100 \ *** high names and high scores *** \ string of 18 bytes holding name \ followed by 2 bytes holding score in BCD 0E00 EQUB 224,225,226,227,13,13,0,0,0,0,0,0,0,0,0,0,0,0 0E12 EQUW &0600 0E14 EQUB 228,229,230,231,232,13,13,0,0,0,0,0,0,0,0,0,0,0 0E26 EQUW &0500 0E28 EQUB 224,225,226,227,13,13,0,0,0,0,0,0,0,0,0,0,0,0 0E3A EQUW &0400 0E3C EQUB 228,229,230,231,232,13,13,0,0,0,0,0,0,0,0,0,0,0 0E4C EQUW &0300 0E4E EQUB 224,225,226,227,13,13,0,0,0,0,0,0,0,0,0,0,0,0 0E60 EQUW &0200 0E62 EQUB 228,229,230,231,232,13,13,0,0,0,0,0,0,0,0,0,0,0 0E74 EQUW &0100 0E76 EQUB 224,225,226,227,13,13,0,0,0,0,0,0,0,0,0,0,0,0 0E88 EQUW &0000 0E8A EQUB 228,229,230,231,232,13,13,0,0,0,0,0,0,0,0,0,0,0 0E9C EQUW &FF00 0E9E EQUB 224,225,226,227,13,13,0,0,0,0,0,0,0,0,0,0,0,0 0EB0 EQUW &FE00 0EB2 EQUB 228,229,230,231,232,13,13,0,0,0,0,0,0,0,0,0,0,0 0EC4 EQUW &FD00 \Filler bytes for rest of page &E 0EC6 EQUB 0,0 0EC8 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0 \Page &F not used 0F00 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0F40 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0F80 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0FC0 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \Page &10 not used 1000 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 1040 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 1080 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 10C0 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ *** co-ordinates of fragments in explosion *** \ in groups of 3 bytes. \ Byte 1 the pixel code: \ 1 = black-red (01) \ 4 = black-green (02) \ 5 = black-yellow (03) \ 17 = black-magenta (05) \ 20 = black-cyan (06) \ Byte 2 x displacement in columns \ Byte 3 y displacement in scan lines from explosion centre 1100 EQUB 4,0,-6 1103 EQUB 1,-1,-6 1106 EQUB 5,4,-8 1109 EQUB 17,-1,-7 110C EQUB 20,-3,-7 110F EQUB 4,-4,-5 1112 EQUB 1,3,-10 1115 EQUB 5,-5,-8 1118 EQUB 17,-4,-5 111B EQUB 20,1,-4 111E EQUB 4,-1,-10 1121 EQUB 1,3,-4 1124 EQUB 5,-5,-8 1127 EQUB 17,-4,-6 112A EQUB 20,-1,-11 112D EQUB 4,-2,-11 1130 EQUB 1,-3,-11 1133 EQUB 5,-1,-11 1136 EQUB 17,-2,-12 1139 EQUB 20,4,-8 113C EQUB 4,-5,-8 113F EQUB 1,2,-5 1142 EQUB 5,-3,-10 1145 EQUB 17,1,-7 1148 EQUB 20,5,-11 114B EQUB 4,0,-6 114E EQUB 1,-4,-10 1151 EQUB 5,4,-5 1154 EQUB 17,-2,-12 1157 EQUB 20,1,-7 115A EQUB 4,-2,-12 115D EQUB 1,-1,-8 1160 EQUB 5,5,-8 1163 EQUB 17,-1,-4 1166 EQUB 20,-4,-8 1169 EQUB 4,1,-10 116C EQUB 1,-2,-10 116F EQUB 5,-1,-8 1172 EQUB 17,0,-11 1175 EQUB 20,-4,-11 1178 EQUB 4,-5,-4 117B EQUB 1,3,-4 117E EQUB 5,2,-9 1181 EQUB 17,4,-12 1184 EQUB 20,-3,-11 1187 EQUB 4,-1,-5 118A EQUB 1,-5,-12 118D EQUB 5,1,-12 1190 EQUB 17,-5,-5 1193 EQUB 20,2,-9 1196 EQUB 4,-5,-4 1199 EQUB 1,-3,-8 119C EQUB 5,-4,-12 119F EQUB 17,-1,-9 11A2 EQUB 20,3,-9 11A5 EQUB 4,2,-4 11A8 EQUB 1,4,-12 11AB EQUB 5,1,-6 11AE EQUB 17,-5,-8 11B1 EQUB 20,-5,-7 11B4 EQUD 0,0,0 11C0 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ *** Messages *** \ Note that text cursor is positioned in the relevant routines \ but CR always terminates a message 1200 EQUB 17,3:EQUS "Stage":EQUB 17,3,13 1208 EQUB 17,3:EQUS "Get Ready to play":EQUB 13 121D EQUB 17,3:EQUS "Welldone":EQUB 13 1228 EQUS "complete":EQUB 13 1231 EQUB 17,3:EQUS "Game Over":EQUB 13 123D EQUS "Press Space Bar":EQUB 13 124E EQUS "or Fire to start":EQUB 13 125F EQUS "Enter your name":EQUB 13 1270 EQUS "Enter Stage (1-6)":EQUB 13 1282 EQUS "Bonus Score":EQUB 13 128F EQUS "Press Escape to play":EQUB 13 \Filler bytes for rest of page &12 12A4 EQUD 0,0,0,0,0,0,0 12C0 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 1300 EQUB 23,1,0,0,0,0,0,0,0,0,0 \cursor off 130B EQUB 31,0,0 \VDU 31,0,0 130E EQUB 17,3:EQUS "Score" \COLOUR 3:PRINT "Score" 1315 EQUB 31,0,1:EQUS "00000" \PRINT TAB(0,1)"00000" 131D EQUB 31,0,3 \VDU 31,0,3 1320 EQUB 17,3:EQUS "OXYGEN" \COLOUR 3:PRINT"OXYGEN" 1328 EQUB 18,0,7 \GCOL 0,7 132B EQUB 25,4:EQUW 440,895 \MOVE 440,895 1331 EQUB 25,5:EQUW 1279,895 \DRAW 1279,895 1337 EQUB 25,5:EQUW 1279,931 \DRAW 1279,931 133D EQUB 25,5:EQUW 440,931 \DRAW 440,931 1343 EQUB 25,5:EQUW 440,895 \DRAW 440,895 1349 EQUB 18,0,7 \GCOL 0,3 134C EQUB 25,4:EQUW 120,812 \MOVE 120,812 1352 EQUB 25,5:EQUW 120,816 \DRAW 120,816 1358 EQUB 25,5:EQUW 56,816 \DRAW 56,816 135E EQUB 25,5:EQUW 56,756 \DRAW 56,756 1364 EQUB 25,5:EQUW 120,756 \DRAW 120,756 136A EQUB 25,5:EQUW 120,784 \DRAW 120,784 1370 EQUB 25,5:EQUW 88,784 \DRAW 88,784 1376 EQUB 25,4:EQUW 152,796 \MOVE 152,796 137C EQUB 25,5:EQUW 152,792 \DRAW 152,792 1382 EQUB 25,5:EQUW 152,788 \DRAW 152,788 1388 EQUB 25,5:EQUW 160,788 \DRAW 160,788 138E EQUB 25,4:EQUW 160,760 \MOVE 160,760 1394 EQUB 25,5:EQUW 160,784 \DRAW 160,784 139A EQUB 25,5:EQUW 184,784 \DRAW 184,784 13A0 EQUB 25,4:EQUW 200,760 \MOVE 200,760 13A6 EQUB 25,5:EQUW 200,780 \DRAW 200,780 13AC EQUB 25,5:EQUW 240,780 \DRAW 240,780 13B2 EQUB 25,5:EQUW 240,760 \DRAW 240,760 13B8 EQUB 25,4:EQUW 232,780 \MOVE 232,780 13BE EQUB 25,5:EQUW 232,800 \DRAW 232,800 13C4 EQUB 25,5:EQUW 208,800 \DRAW 208,800 13CA EQUB 25,5:EQUW 208,780 \DRAW 208,780 13D0 EQUB 25,4:EQUW 264,788 \MOVE 264,788 13D6 EQUB 25,5:EQUW 288,788 \DRAW 288,788 13DC EQUB 25,5:EQUW 288,756 \DRAW 288,756 13E2 EQUB 25,5:EQUW 256,756 \DRAW 256,756 13E8 EQUB 25,5:EQUW 256,820 \DRAW 256,820 13EE EQUB 25,4:EQUW 320,756 \MOVE 320,756 13F4 EQUB 25,5:EQUW 312,756 \DRAW 312,756 13FA EQUB 25,5:EQUW 312,788 \DRAW 312,788 1400 EQUB 25,69:EQUW 312,808 \PLOT 69,312,808 1406 EQUB 25,4:EQUW 352,816 \MOVE 352,816 140C EQUB 25,5:EQUW 352,748 \DRAW 352,748 1412 EQUB 25,5:EQUW 368,748 \DRAW 368,748 1418 EQUB 25,4:EQUW 376,800 \MOVE 376,800 141E EQUB 25,5:EQUW 336,800 \DRAW 336,800 1424 EQUB 25,5:EQUW 336,8 \DRAW 336,800 \Filler bytes for rest of page not used. 142A EQUB 0,0,0,0,0,0,0 1440 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 1480 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 14C0 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \ *** next level music pitch data *** 1500 EQUB 41,69,81,101,117,137,117,101,89,69 \Am arpeggio 150A EQUB 33,61,81,97,109,129,109,97,81,61 \G 1514 EQUB 25,53,73,89,101,121,101,89,73,53 \F 151E EQUB 21,49,69,81,97,117,129,145,165 \Em \filler bytes for rest of page. 1527 EQUB 0 1528 EQUD 0,0,0,0,0,0 1540 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 1580 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 15C0 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \*** Calculate Screen Address *** \Entry X=columns, Y=pixel rows 1600 STX &78 1602 STY &79 \Store X and Y coordinates. 1604 LDA #0 1606 STA &71 \Zeroise high byte of result. 1608 LDA &78 160A ASL A 160B ROL &71 160D ASL A 160E ROL &71 1610 ASL A 1611 ROL &71 \Multiply X coordinate by 8 1613 STA &70 \to give column offset. 1615 LDA &79 1617 LSR A 1618 LSR A 1619 LSR A \Divide Y pixel row by 8 to get char row 161A ASL A \Multiply by 2 to index into 2-byte address table 161B TAX 161C LDA &71 \Retrieve X*8 161E ADC #&30 \&30 is high byte of &3000 1620 STA &71 \address of top of Mode 2 screen. 1622 CLC 1623 LDA &C375,X \add in high byte of 640x table 1626 ADC &71 \in OS1.2 rom. 1628 STA &71 162A CLC 162B LDA &C376,X \add in lo byte of 640x table 162E ADC &70 1630 STA &70 \in OS1.2 rom 1632 LDA &71 1634 ADC #0 1636 STA &71 1638 CLC 1639 LDA &79 \Work out pixel (scan) line 163B AND #7 \by ANDing with 7. 163D ADC &70 \and adding to running result 163F STA &70 1641 LDA &71 1643 ADC #0 1645 STA &71 1647 RTS \Exit &70/1 = &3000 + X*8 + (YDIV8)*&280 + Y AND 7 \*** Sprite Routine *** \Entry A=sprite no. X=X coordinate Y=Y coordinate. 1648 PHA \Preserve Registers. 1649 STA &75 164B TXA 164C PHA 164D TYA 164E PHA 164F JSR &1600 \calculate screen address. 1652 CLC 1653 LDA &75 \Retrieve sprite number 1655 ASL A \*2 to index into table. 1656 TAX 1657 LDA &2C00,X \Get sprite address high byte. 165A STA &73 \Store in zero page 165C STA &16AF \and in code. 165F LDA &2C01,X \Get sprite address low byte. 1662 STA &72 \Store in zero page 1664 STA &16AE \and in code. 1667 LDY #0 \Byte 1 of sprite data 1669 LDA (&72),Y \is columns. 166B STA &74 166D INY \Byte 2 of sprite data 166E LDA (&72),Y \is rows. 1670 STA &75 1672 CLC 1673 LDA &72 1675 ADC #2 1677 STA &72 1679 LDA &73 167B ADC #0 \move sprite data pointer by 2 167D STA &73 \to point to actual sprite data 167F LDA &70 \Work out pixel line sprite 1681 AND #7 \lies on by ANDing with 7. 1683 STA &76 1685 STA &77 1687 SEC 1688 LDA &70 168A SBC &77 168C STA &70 \Work out address of top of cell 168E LDA &71 \which pixel line is in by 1690 SBC #0 \subtracting pixel line from screen address. 1692 STA &71 1694 LDX &74 \X=columns count. 1696 LDA #0 1698 STA &8F \Don't know why this here. 169A CLC 169B LDA &16AE \Add 2 to sprite address 169E ADC #2 \in code to point to actual data 16A0 STA &16AE \like we did at 1679 for ZP copy. 16A3 LDA &16AF 16A6 ADC #0 16A8 STA &16AF 16AB LDY &76 \Row pointer, starts equal to pixel line. \Get byte of sprite data 16AD LDA &FF00 \Dummy value altered at 165C/1664. \Next instruction is modified to STA (Ind),Y 16B0 EOR (&70),Y \EOR with screen 16B2 STA (&70),Y \Store on screen 16B4 CLC 16B5 LDA &16AE 16B8 ADC #1 16BA STA &16AE 16BD LDA &16AF 16C0 ADC #0 16C2 STA &16AF \Add 1 to sprite address 16C5 TYA 16C6 ADC #8 16C8 TAY \move to next column 16C9 DEX \and decrement column count and 16CA BNE &16AD \repeat until done one row of columns. 16CC LDX &74 \Retrieve column count 16CE INC &77 \Increment pixel row 16D0 LDA &77 16D2 CMP #8 \Are we at bottom of char cell? 16D4 BNE &16EB \no. 16D6 LDA #0 \Yes, 16D8 STA &77 \Make pixel row zero. 16DA INC &71 16DC INC &71 \screen=screen+&200 16DE CLC 16DF LDA &70 16E1 ADC #&80 \screen=screen+&80 16E3 STA &70 16E5 LDA &71 16E7 ADC #0 \ie move to next char row 16E9 STA &71 \by adding &280 to cell address. 16EB LDA &77 \Reset pixel row count 16ED STA &76 \to original value. 16EF TAY \and transfer to Y. 16F0 DEC &75 \decrement rows 16F2 BNE &16AD \and repeat until plotted all rows. 16F4 LDA #81 \opcode for EOR (Ind),Y 16F6 STA &16B0 \in case it was modified to STA (Ind),Y. 16F9 PLA 16FA TAY 16FB PLA 16FC TAX 16FD PLA \Restore registers 16FE RTS \and exit. \*** VDU A,X,Y *** \Executes a string of 3 VDU codes eg VDU31,X,Y 16FF NOP 1700 NOP 1701 NOP \3-byte workspace 1702 STA &16FF 1705 STX &1700 1708 STY &1701 \Store the 3 codes. 170B LDA &16FF \Retrieve 1st VDU code 170E JSR OSwrch \and print it. 1711 LDA &1700 \Retrieve 2nd VDU code 1714 JSR OSwrch \and print it. 1717 LDA &1701 \Retrieve 3rd VDU code 171A JMP OSwrch \and print it. \*** Scan Keyboard *** \Entry X=negative INKEY number 171D LDY #255 \Set up Y and 171F LDA #129 \A regs 1721 JSR OSbyte \call OSBYTE 129 1724 TXA \X=&FF if key was pressed 1725 RTS \=0 if key wasn't pressed. \*** Scan Joystick *** \Entry X=ADVAL value representing stick position 1726 LDA #128 1728 JSR OSbyte 172B TYA \Y=&FF if stick in position. 172C RTS \*** Perform equivalent Basic MODE2 *** 172D LDA #&30 172F STA &07 1731 LDA #0 1733 STA &06 \HIMEM=&3000 1735 LDA #22 1737 JSR OSwrch 173A LDA #2 173C JMP OSwrch \VDU22,2 \*** Make a sound *** \Entry A=sound #, see 0A00. 173F CLC 1740 ASL A \Work out &A00 + sound # *8 1741 ASL A \Multiply sound # by 8 1742 ASL A \as each sound data occupies 8 bytes. 1743 TAX \this becomes the low byte as we 1744 LDY #&0A \know that the hi byte is always &A. 1746 LDA #7 \OSword 7 - make sound. 1748 JMP OSword \*** Delay *** \Entry X=arbitrary delay # 174B TYA \Preserve Y 174C PHA \and A 174D LDY #128 174F DEY 1750 BNE &174F \Count down Y from 128 to 0. 1752 DEX 1753 BNE &174D \Count down X from delay # to 0. 1755 PLA 1756 TAY \Retrieve regs 1757 RTS \and exit. \*** Print Player Sprite *** 1758 LDX &2B00 \Player X 175B LDY &2B01 \and Y coordinates. 175E LDA &2B1F \Orientation 1761 BNE &1768 \<>0 if upside down. 1763 LDA #14 \Sprite 14=player upright, 1765 JMP &1648 \print sprite. 1768 LDA #0 \Sprite 0=player upside down, 176A JSR &1648 \print sprite. 176D LDA &2B0C \Pebble flag, 1770 BNE &1773 \<>0 if holding pebble. 1772 RTS \not holding pebble. 1773 CLC 1774 TYA 1775 ADC #10 \pebble 10 pixel lines below sprite top 1777 TAY \ie (X,Y+10). 1778 LDA #2 \Sprite 2 is pebble, 177A JMP &1648 \print it. \*** Execute VDU code in pages &13-&14 *** 177D LDA #0 177F STA &70 1781 LDA #&13 1783 STA &71 \Address = &1300. 1785 LDY #0 1787 LDA (&70),Y \Get VDU code 1789 JSR OSwrch \and print it. 178C CLC 178D LDA &70 178F ADC #1 1791 STA &70 1793 LDA &71 1795 ADC #0 1797 STA &71 \Add 1 to VDU code address 1799 LDA &71 179B CMP #&14 \is high byte &14? 179D BNE &1787 \No, not finished. 179F LDA &70 \High byte is &14 17A1 CMP #&2A \but is low byte &2A? 17A3 BNE &1787 \No, not finished. 17A5 RTS \Yes, exit. \*** Draw Scenery *** 17A6 LDY #74 \First brick at Y=74 17A8 LDX #0 17AA LDA #1 \Sprite 1=bricks. 17AC JSR &1648 \Print bricks at (0,Y) 17AF LDX #76 17B1 LDA #1 17B3 JSR &1648 \Print bricks at (76,Y) 17B6 CLC 17B7 TYA 17B8 ADC #8 \Move to next char cell 17BA TAY 17BB CMP #221 \and keep printing 17BD BCC &17A8 \until Y>220. 17BF LDX #0 \X=0 17C1 LDY #42 \First brick at (0,42) 17C3 LDA #1 \sprite 1=bricks. 17C5 JSR &186B \Print brick at (X,42) 17C8 LDY #58 17CA LDA #1 17CC JSR &186B \Print bricks at (X,58) 17CF LDA #145 \Opcode for STA (Ind),Y in 17D1 STA &16B0 \sprite code, overwrite screen data. 17D4 LDY #242 17D6 LDA #1 17D8 JSR &186B \Print brick at (X,242) 17DB LDA #145 \Opcode for STA (Ind),Y 17DD STA &16B0 17E0 LDY #226 17E2 JSR &186B \Print brick at (X,226) 17E5 CLC 17E6 TXA 17E7 ADC #4 \Move to next cell to right 17E9 TAX \by adding 4 columns. 17EA CMP #78 \and continue until X=78. 17EC BCC &17C1 17EE LDA #145 \Opcode for STA (Ind),Y 17F0 STA &16B0 17F3 LDA #18 17F5 LDX #0 17F7 LDY #0 17F9 JSR &1702 \VDU18,0,0 ie GCOL 0,0 17FC LDA #25 17FE LDX #4 1800 LDY #64 1802 JSR &1702 1805 LDA #2 1807 LDX #220 1809 LDY #2 \VDU25,4,64,2,220,2 180B JSR &1702 \ie MOVE 576,732 180E LDA #25 1810 LDX #4 1812 LDY #200 1814 JSR &1702 1817 LDA #2 1819 LDX #220 181B LDY #2 \VDU25,4,200,2,220,2 181D JSR &1702 \ie MOVE 712,732 1820 LDA #25 1822 LDX #85 1824 LDY #136 1826 JSR &1702 1829 LDA #2 182B LDX #52 182D LDY #3 \VDU25,85,136,2,52,3 182F JSR &1702 \ie PLOT 85,648,820 1832 LDX #38 1834 LDY #61 \Docking sprite at (38,61) 1836 LDA #145 \Opcode for STA (Ind),Y 1838 STA &16B0 183B LDA #8 \Sprite 8 = docking sprite. 183D JSR &1648 \Plot it 1840 RTS \and exit. \*** Plot and Store Pebbles *** \Pebble# 0 1 2 3 4 5 6 7 \X coord 6 15 24 33 42 51 60 69 1841 LDX #6 \6 pebbles. 1843 LDA #0 1845 STA &2B07 \Pebble #0. 1848 LDA #145 184A STA &16B0 \Opcode for STA (Ind),Y 184D LDY #224 \pebble at (X,224) 184F LDA #2 \Sprite 2 = pebble. 1851 JSR &1648 \Plot sprite. 1854 TXA 1855 PHA \Preserve X value/ 1856 LDX &2B07 \Retrieve pebble #. 1859 STA &0600,X \Store pebble coordinate. 185C INC &2B07 \increment pebble #. 185F PLA 1860 TAX \Retrieve X. 1861 CLC 1862 TXA 1863 ADC #9 \Move to next pebble's x coordinate. 1865 TAX 1866 CMP #74 \Are all pebbles plotted (X=74)? 1868 BCC &1848 \No, loop until they are. 186A RTS \Yes, exit. \*** Plot a pair of brick characters *** 186B TYA 186C PHA \Preserve Y coordinate. 186D LDA #1 \Sprite 1 = bricks. 186F JSR &1648 \Plot bricks at (X,Y) 1872 CLC 1873 TYA 1874 ADC #8 1876 TAY 1877 LDA #1 1879 JSR &1648 \Plot bricks at (X+8,Y) 187C PLA 187D TAY \Retrieve Y coordinate. 187E RTS \*** Restore object properties from page 5 *** \Entry X=multiple of 20. 187F LDA &0500,X 1882 STA &2B00 \X coordinate. 1885 LDA &0501,X 1888 STA &2B01 \Y coordinate. 188B LDA &0502,X 188E STA &2B02 1891 LDA &0503,X 1894 STA &2B03 1897 LDA &0504,X 189A STA &2B04 189D LDA &0505,X 18A0 STA &2B08 18A3 LDA &0506,X 18A6 STA &2B09 18A9 LDA &0507,X 18AC STA &2B0A 18AF LDA &0508,X 18B2 STA &2B0B 18B5 RTS \*** Store object properties in page 5 *** \Entry X=multiple of 20. 18B6 LDA &2B00 \X coordinate 18B9 STA &0500,X 18BC LDA &2B01 \Y coordinate 18BF STA &0501,X 18C2 LDA &2B02 18C5 STA &0502,X 18C8 LDA &2B03 18CB STA &0503,X 18CE LDA &2B04 18D1 STA &0504,X 18D4 LDA &2B08 18D7 STA &0505,X 18DA LDA &2B09 18DD STA &0506,X 18E0 LDA &2B0A 18E3 STA &0507,X 18E6 LDA &2B0B 18E9 STA &0508,X 18EC RTS \*** Plot pebble *** \Entry &2B00=X, &2B01=Y coordinate. 18ED LDX &2B00 18F0 LDY &2B01 18F3 LDA #2 \Sprite 2 = pebble. 18F5 JMP &1648 \*** Move aliens *** \NB Like in maths, dx and dy mean 'change in value of' \ie number added to object's X and Y coord to get new position. \ox and oy mean original values of X and Y. 18F8 LDA &2B00 18FB STA &2B05 \Copy x coord 18FE LDA &2B01 1901 STA &2B06 \and y coord. 1904 CLC 1905 LDA &2B00 1908 ADC &2B02 \X = X + dx 190B STA &2B00 190E CLC 190F LDA &2B01 1912 ADC &2B03 1915 STA &2B01 Y = Y + dy 1918 LDA &2B00 191B CMP #74 \IF X=74 191D BCC &192A 191F LDA &2B05 1922 STA &2B00 \X=ox 1925 LDA #253 1927 STA &2B02 \dx=-8 192A LDA &2B00 192D CMP #4 \IF X=4 192F BCS &193C 1931 LDA &2B05 \X=ox 1934 STA &2B00 1937 LDA #4 1939 STA &2B02 \dx=4 193C LDA &2B01 193F CMP #214 \IF Y>214 1941 BCC &194E 1943 LDA &2B06 1946 STA &2B01 \Y=oy 1949 LDA #250 194B STA &2B03 \dy=-6 194E LDA &2B01 1951 CMP #70 1953 BCS &1960 \IF Y<70 1955 LDA &2B06 1958 STA &2B01 \Y=oy 195B LDA #5 195D STA &2B03 \dy=5. 1960 RTS \*** Animate the aliens *** 1961 STX &2B07 \Object property index (0,20,40...) 1964 LDX &2B07 \Load object props index 1967 JSR &187F \Recall object props 196A JSR &19A0 \Erase alien sprites 196D JSR &18F8 \Move aliens and check limits 1970 JSR &1980 \Animate aliens 1973 JSR &19A0 \Reprint aliens 1976 LDX &2B07 \Object prop index 1979 JSR &18B6 \Store updated props 197C JSR &1B17 \Check for player/alien collision 197F RTS \*** Check alien type *** 1980 LDA &2B04 \Alien type 1983 CMP #1 \1=Balloon 1985 BNE &198A 1987 JMP &1A19 198A CMP #2 \2=Mr.Hat 198C BNE &1991 198E JMP &1A1C 1991 CMP #3 \3=Ball 1993 BNE &1998 1995 JMP &1A20 1998 CMP #4 \4=Bird 199A BNE &199F 199C JMP &1A47 199F RTS \*** Print aliens *** 19A0 LDA &2B04 \Load alien type 19A3 CMP #1 \1=Balloon 19A5 BNE &19AA 19A7 JMP &19F6 19AA CMP #2 \2=Mr.Hat 19AC BNE &19B1 19AE JMP &19E0 19B1 CMP #3 \3=Ball 19B3 BNE &19B8 19B5 JMP &1A02 19B8 CMP #4 \4=Bird 19BA BNE &19BF 19BC JMP &1A0E 19BF RTS \*** Animate balloon *** 19C0 LDA &2B0B 19C3 CMP #255 19C5 BNE &19C8 19C7 RTS 19C8 DEC &2B0B 19CB LDA &2B0B 19CE BEQ &19D1 19D0 RTS 19D1 LDA &2B09 19D4 STA &2B0B 19D7 LDA &2B0A \toggle sprite number 19DA EOR #1 \so balloon waggles its tether 19DC STA &2B0A 19DF RTS \*** Animate Mr Hat *** \With eyes looking left or right 19E0 LDX &2B00 19E3 LDY &2B01 19E6 LDA #3 \Sprite 3=Mr.Hat 19E8 JSR &1648 \print basic sprite. 19EB CLC 19EC TYA 19ED ADC #4 \Eyes are at (X,Y+4) 19EF TAY 19F0 LDA &2B0A \eye sprite # 19F3 JMP &1648 \Print eyes. \*** Print alien sprite *** \Entry &2B00=X Coord, &&2B01 Y Coord, &2B0A=sprite 19F6 LDX &2B00 19F9 LDY &2B01 19FC LDA &2B0A 19FF JMP &1648 \*** Print alien sprite *** \Entry &2B00=X Coord, &&2B01 Y Coord, &2B0A=sprite 1A02 LDX &2B00 1A05 LDY &2B01 1A08 LDA &2B0A 1A0B JMP &1648 \*** Bird sprite *** 1A0E LDX &2B00 1A11 LDY &2B01 1A14 LDA #13 \Sprite 13=bird. 1A16 JMP &1648 1A19 JMP &19C0 \jump to balloon routine 1A1C JMP &19C0 \jump to balloon routine 1A1F RTS \*** Animate ball *** \NB dx is a variable value here ie acceleration. 1A20 LDA &2B0B 1A23 CMP #255 \If dx=-1 1A25 BNE &1A28 1A27 RTS \exit else 1A28 DEC &2B0B \dx=dx-1 1A2B LDA &2B0B 1A2E BEQ &1A31 \IF dx<>0 1A30 RTS \exit 1A31 LDA &2B09 \else reset 1A34 STA &2B0B \dx to initial value. 1A37 CLC 1A38 LDA &2B0A \alien sprite (ball) frame 1A3B ADC #1 \add 1 to frame - 9,10,11,12 1A3D CMP #13 \If frame=13 1A3F BNE &1A43 1A41 LDA #9 \then reset to 9 1A43 STA &2B0A 1A46 RTS 1A47 JMP &19C0 \come here from 199C \*** Print string of characters at &1200+A *** \Entry A=offset into p.&12 \&2B13 contains 0 for blank text, <>0 for coloured text. 1A4A PHA 1A4B TYA 1A4C PHA 1A4D TXA 1A4E PHA \Preserve registers. 1A4F LDA #31 1A51 JSR OSwrch 1A54 PLA 1A55 JSR OSwrch 1A58 PLA 1A59 JSR OSwrch \VDU31,X,Y 1A5C LDA #&12 1A5E STA &71 1A60 PLA 1A61 STA &70 \address of string &1200+A 1A63 LDY #0 1A65 LDA &2B13 \text colour flag 1A68 BNE &1A74 \non-blank. 1A6A LDA #17 1A6C JSR OSwrch 1A6F LDA #0 1A71 JSR OSwrch \COLOUR 0 1A74 LDA (&70),Y \Get character of string 1A76 JSR OSwrch \and print it. 1A79 INY \Point to next char. 1A7A CMP #13 \Is current char CR? 1A7C BNE &1A65 \No. 1A7E RTS \Yes, CR marks end of text. \*** Print Digit *** \Entry A=digit to be printed in lower nybble. 1A7F PHA \Preserve number 1A80 LDA &2B13 \Text colour flag 1A83 BNE &1A8F \<>0 for coloured text 1A85 LDA #17 \=0 for black text so 1A87 JSR OSwrch 1A8A LDA #0 1A8C JSR OSwrch \COLOUR 0. 1A8F PLA \Retrieve A 1A90 CLC 1A91 AND #15 \Mask off low nybble. 1A93 ADC #48 \add ASC"0" to get "0" "1" etc. 1A95 JMP OSwrch \and print \*** Print Number *** \Entry A=number to be printed in BCD at (X,Y) 1A98 PHA 1A99 TYA 1A9A PHA 1A9B TXA 1A9C PHA \Preserve registers. 1A9D LDA #31 1A9F JSR OSwrch 1AA2 PLA 1AA3 JSR OSwrch 1AA6 PLA 1AA7 JSR OSwrch \PRINT TAB(X,Y); 1AAA PLA 1AAB PHA 1AAC LSR A 1AAD LSR A 1AAE LSR A 1AAF LSR A \move high nybble to low nybble position 1AB0 JSR &1A7F \print tens digit. 1AB3 PLA \retrieve number 1AB4 JMP &1A7F \and print units digit. \*** Collision Detection *** \Entry &2B16 left edge of 1st object \&2B17 right edge of 1st object \&2B18 top edge of 1st object \&2B19 bottom edge of 1st object \&2B1A left edge of 2nd object \&2B1B right edge of 2nd object \&2B1C top edge of 2nd object 1AB7 LDA #0 1AB9 STA &2B1E \set collision flag to FALSE initially. 1ABC CLC 1ABD LDA &2B16 \ Left edge of 1st object 1AC0 CMP &2B1A 1AC3 BEQ &1ACE \ =left edge of 2nd object 1AC5 BCC &1AD3 \ right edge of 2nd object. 1ACE LDA #1 1AD0 STA &2B1E \flag there has been a collision. 1AD3 LDA &2B17 \ Right edge of 1st object 1AD6 CMP &2B1A 1AD9 BEQ &1AE4 \ =left edge of 2nd object 1ADB BCC &1AE9 \ right edge of 2nd object. 1AE4 LDA #1 1AE6 STA &2B1E \flag there has been a collision 1AE9 CLC 1AEA LDA &2B18 \ Top edge of 1st object 1AED CMP &2B1C 1AF0 BEQ &1AFB \ = top edge of 2nd object 1AF2 BCC &1B01 \ < top edge of 2nd object. 1AF4 CMP &2B1D \ Top edge of 1st object 1AF7 BEQ &1AFB \ = bottom edge of 2nd object 1AF9 BCS &1B01 \ > bottom edge of 2nd object. 1AFB INC &2B1E \ Flag there has been collision 1AFE JMP &1B16 \ and jump to RTS. 1B01 CLC 1B02 LDA &2B19 \ Bottom edge of 1st object 1B05 CMP &2B1C 1B08 BEQ &1B13 \ = top edge of 2nd object 1B0A BCC &1B16 \ < top edge of 2nd object 1B0C CMP &2B1D \ Bottom edge of 1st object 1B0F BEQ &1B13 \ = bottom edge of 2nd object 1B11 BCS &1B16 \ > bottom edge of 2nd object. 1B13 INC &2B1E 1B16 RTS \*** Check if player collided with alien *** 1B17 LDA &0500 \Left edge of 1st object 1B1A STA &2B16 \=Player X coord. 1B1D ADC #5 \Right edge of 1st object 1B1F STA &2B17 \=X coord of player add 5. 1B22 LDA &0501 \Top edge of 1st object 1B25 STA &2B18 \=Player Y coord. 1B28 ADC #12 \Bottom edge of 1st object 1B2A STA &2B19 \=Player Y coord add 12. 1B2D LDA &0500,X \Left edge of 2nd object 1B30 STA &2B1A \=Alien X coord. 1B33 ADC #4 \Right edge of 2nd object 1B35 STA &2B1B \=Alien X coord add 4. 1B38 LDA &0501,X \Top edge of 2nd object 1B3B STA &2B1C \=Alien Y coord. 1B3E ADC #10 \Bottom edge of 2nd object 1B40 STA &2B1D \=Alien Y coord add 10. 1B43 JSR &1AB7 \Compare the two 1B46 LDA &2B1E 1B49 CMP #2 \Was there a collision? 1B4B BNE &1B57 \No. 1B4D LDA #0 \Yes, disable keyboard 1B4F STA &2B21 \in prep for explosion sequence. 1B52 LDA #0 1B54 STA &2B20 1B57 RTS \*** Plot Stars *** 1B58 LDA #0 1B5A STA &2B24 \Star index. 1B5D STA &2B29 \Colour index. 1B60 LDX &2B24 1B63 LDA &0901,X \Y coordinate of star 1B66 TAY 1B67 LDA &0900,X \X coordinate of star 1B6A TAX 1B6B JSR &1600 \Calculate screen address. 1B6E LDX &2B29 \retrieve star index. 1B71 LDY #0 1B73 LDA (&70),Y \Get byte from screen 1B75 EOR &091E,X \EOR with star colour 1B78 STA (&70),Y \and put back on screen. 1B7A INC &2B29 \increment colour index, 1B7D LDA &2B29 1B80 CMP #8 1B82 BNE &1B89 1B84 LDA #0 1B86 STA &2B29 \modulo 8. 1B89 INC &2B24 1B8C INC &2B24 \Increment star index 1B8F LDA &2B24 1B92 CMP #30 1B94 BNE &1B60 \Until all 30 stars plotted. 1B96 RTS \*** Scroll Stars *** 1B97 LDA #0 1B99 STA &2B24 \Star index=0 1B9C STA &2B29 1B9F JSR &1C1E \Choose star position 1BA2 LDX &2B24 \Retrieve star index 1BA5 LDA &0901,X \Get star's Y coordinate 1BA8 TAY 1BA9 LDA &0900,X \X coordinate 1BAC TAX 1BAD JSR &1600 \and calculate screen address. 1BB0 LDX &2B29 \Retrieve colour index 1BB3 LDY #0 1BB5 LDA (&70),Y \Get screen byte 1BB7 EOR &091E,X \EOR with star's colour 1BBA STA (&70),Y \and put back in screen. 1BBC LDX &2B24 \Retrieve star index. 1BBF LDA #1 \Set vertical displacement 1BC1 STA &2B25 \to 1 pixel initially. 1BC4 TXA \If star # 1BC5 AND #2 \is even 1BC7 BEQ &1BCE 1BC9 LDA #2 \then set displacaement to 2 pixels 1BCB STA &2B25 \(creating the parallax effect). 1BCE CLC 1BCF LDA &0901,X \Add displacement 1BD2 ADC &2B25 1BD5 STA &0901,X \to star's Y coordinate. 1BD8 CMP #221 \If Y coordinate is 221 1BDA BCC &1BEA \we are at bottom of screen 1BDC LDA #74 \so wrap round to top (Y=74). 1BDE STA &0901,X 1BE1 LDA &0900,X 1BE4 JSR &1C1E \Choose new X coordinate. 1BE7 STA &0900,X 1BEA LDA &0901,X \Star Y coordinate 1BED TAY 1BEE LDA &0900,X \Star X coordinate 1BF1 TAX 1BF2 JSR &1600 \Calculate screen address. 1BF5 LDX &2B29 \retrieve star colour 1BF8 LDY #0 1BFA LDA (&70),Y \Get screen byte 1BFC EOR &091E,X \EOR with star colour 1BFF STA (&70),Y \put back on screen. 1C01 INC &2B29 \Increment star colour index 1C04 LDA &2B29 1C07 CMP #8 1C09 BNE &1C10 1C0B LDA #0 \modulo 8. 1C0D STA &2B29 1C10 INC &2B24 1C13 INC &2B24 \Increment star index 1C16 LDA &2B24 1C19 CMP #30 1C1B BNE &1B9F \and continue until plotted 30 stars. 1C1D RTS \*** Choose new X coordinate for star *** 1C1E PHA \Preserve star's x coordinate. 1C1F INC &2B22 \Increment X displacement. 1C22 LDA &2B22 1C25 CMP #30 \If reached 30, 1C27 BCC &1C2E 1C29 LDA #5 1C2B STA &2B22 \wrap around to 5. 1C2E CLC 1C2F PLA 1C30 ADC &2B22 \Add x displacement 1C33 CMP #75 \If we get result 1C35 BCC &1C3A \more than 75, 1C37 LDA &2B22 \wrap round to left edge. 1C3A RTS \*** Plot Shard of Explosion *** 1C3B LDX &2B2D \Shard index. 1C3E LDY #0 \Shard is 1x2 pixels so 1C40 LDA (&70),Y \get screen byte of upper half 1C42 EOR &1100,X \EOR with shard colour 1C45 STA (&70),Y \and store back in screen, 1C47 INY 1C48 LDA (&70),Y \then do same for lower half. 1C4A EOR &1100,X 1C4D STA (&70),Y 1C4F RTS \*** Update Shard's Coordinates *** \NB As in maths, dx means 'change in direction of' \ie how much to add to get new coordinate of shard. 1C50 LDX &2B2D \Shard index. 1C53 LDA &1101,X \Shard X 1C56 STA &2B02 1C59 LDA &1102,X \Shard Y 1C5C STA &2B03 1C5F LDX &2B05 1C62 CLC 1C63 LDA &0401,X 1C66 ADC &2B02 1C69 STA &0401,X \X = X + dx 1C6C LDY #0 1C6E CMP #75 \IF X>74 1C70 BCC &1C73 1C72 INY \Y=Y+1 1C73 CMP #4 \IF X<4 1C75 BCS &1C78 1C77 INY \Y=Y+1 1C78 CLC 1C79 LDA &0402,X \Y = Y + dy 1C7C ADC &2B03 1C7F STA &0402,X 1C82 CMP #225 \IF X>225 1C84 BCC &1C87 1C86 INY \Y=Y+1 1C87 CMP #70 \IF Y<70 1C89 BCS &1C8C 1C8B INY \Y=Y+1 1C8C CPY #0 \If by now Y=0 then shard off screen 1C8E BEQ &1C95 1C90 LDA #1 \else shard still on screen 1C92 STA &0400,X \flag this by storing 1 in shard table. 1C95 RTS \*** Animate Explosion Shards *** 1C96 LDA #0 1C98 STA &2B05 \Shard index 1C9B LDA #0 1C9D STA &2B2D \Shard # 1CA0 LDX &2B05 \Retrieve shard index 1CA3 LDA &0400,X \Get shard flag, 1CA6 BEQ &1CD2 \If =0 shard off screen 1CA8 LDA &0402,X \else get shard Y 1CAB TAY 1CAC LDA &0401,X \and shard X 1CAF TAX 1CB0 JSR &1600 \Calculate screen address 1CB3 JSR &1C3B \Erase shards 1CB6 JSR &1C50 \Move shards 1CB9 LDX &2B05 \Retrieve shard index 1CBC DEC &0400,X 1CBF LDA &0400,X 1CC2 BEQ &1CD2 1CC4 LDA &0402,X \Shard Y 1CC7 TAY 1CC8 LDA &0401,X \Shard X 1CCB TAX 1CCC JSR &1600 \Calculate screen address 1CCF JSR &1C3B \Plot shard 1CD2 CLC 1CD3 LDA &2B2D 1CD6 ADC #3 \Move shard index on 3 1CD8 CMP #180 \Have we done all shards? 1CDA BNE &1CDE \No. 1CDC LDA #0 \Yes. 1CDE STA &2B2D 1CE1 CLC 1CE2 LDA &2B05 1CE5 ADC #3 1CE7 STA &2B05 1CEA CMP #180 1CEC BNE &1CA0 1CEE RTS \*** Explosion Routine *** 1CEF LDA #0 1CF1 STA &2B05 \Index into page 4 which contains table 1CF4 LDA #0 \of 2 byte coordinates x1,x2,y1,y2... 1CF6 STA &2B2D \Shard property index=0 1CF9 LDX &2B05 1CFC LDA &0400,X 1CFF BNE &1D29 1D01 CLC 1D02 TXA 1D03 ADC #2 1D05 STA &0400,X 1D08 LDA &2B2B 1D0B STA &0402,X 1D0E LDA &2B2C 1D11 STA &0401,X 1D14 JSR &1C50 1D17 LDX &2B05 1D1A LDA &0402,X \Shard Y coordinate 1D1D TAY 1D1E LDA &0401,X \Shard X coordinate 1D21 TAX 1D22 JSR &1600 \Calculate screen address 1D25 JSR &1C3B \Plot shard 1D28 CLC 1D29 LDA &2B2D 1D2C ADC #3 1D2E CMP #180 \Have we done all 60 (=180/3) shards? 1D30 BNE &1D34 \No. 1D32 LDA #0 1D34 STA &2B2D 1D37 CLC 1D38 LDA &2B05 \Displacement index 1D3B ADC #3 1D3D STA &2B05 1D40 CMP #180 1D42 BNE &1CF9 1D44 RTS \*** VDU31,X,Y *** 1D45 TYA 1D46 PHA 1D47 TXA 1D48 PHA \Preserve registers 1D49 LDA #31 1D4B JSR OSwrch 1D4E PLA 1D4F JSR OSwrch 1D52 PLA 1D53 JSR OSwrch 1D56 RTS \*** Print High Score Entry *** \Entry &2B00 = x coord \&2B01 = Y coord \&2B05 = position in high score table \&2B13 = 0 for blank text <>0 coloured text 1D57 LDA &2B13 \text colour 1D5A BNE &1D66 \coloured text 1D5C LDA #17 \Black text so 1D5E JSR OSwrch 1D61 LDA #0 1D63 JSR OSwrch \COLOUR 0. 1D66 LDX &2B00 1D69 LDY &2B01 1D6C JSR &1D45 \VDU31,?&2B00,?&2B01 1D6F LDX &2B05 \Index into high score string 1D72 LDA &0E00,X \Get character of string 1D75 JSR OSwrch \Print it 1D78 INX 1D79 LDA &0E00,X \If next character is CR 1D7C CMP #13 1D7E BNE &1D72 \We have finished printing. 1D80 RTS \*** Print High Score *** \Prints 5 digits of the score. \Entry &2B05 = position in table 1D81 CLC 1D82 LDA &2B05 Score is stored at 18th char 1D85 ADC #17 \onwards in table. 1D87 STA &2B2E 1D8A LDX &2B2E 1D8D LDA &0E00,X \Get BCD number 1D90 AND #15 \Mask off low nybble 1D92 LDX &2B00 1D95 INX 1D96 LDY &2B01 1D99 JSR &1D45 \VDU31,?&2B00,?&2B01 1D9C LDX &2B2E 1D9F LDA &0E00,X 1DA2 AND #15 1DA4 JSR &1A7F \Print 10 thousands. 1DA7 INC &2B2E \Point to next char of string 1DAA INC &2B00 1DAD INC &2B00 \Move cursor on 2 chars 1DB0 LDX &2B2E 1DB3 LDA &0E00,X \Get next byte of string. 1DB6 LDX &2B00 \X and 1DB9 LDY &2B01 \Y coordinate. 1DBC JSR &1A98 \Print thousands and hundreds 1DBF INC &2B2E 1DC2 INC &2B00 1DC5 INC &2B00 \Move cursor on 2 chars 1DC8 LDX &2B2E 1DCB LDA &0E00,X 1DCE LDX &2B00 1DD1 LDY &2B01 1DD4 JSR &1A98 \Print tens and units. 1DD7 RTS \*** Print High Scores *** 1DD8 LDA #17 1DDA LDX #3 1DDC LDY #6 1DDE JSR &1702 \COLOUR 3 1DE1 LDA #3 1DE3 STA &2B00 1DE6 LDA #10 1DE8 STA &2B01 \First entry printed at (3,10) 1DEB LDA #0 1DED STA &2B05 \High score entry 1DF0 LDA #17 1DF2 LDX #6 1DF4 LDY #6 1DF6 JSR &1702 \COLOUR 3 1DF9 LDA #2 1DFB STA &2B00 \X=2 1DFE JSR &1D57 \Print high score name at (2,Y). 1E01 LDA #17 1E03 LDX #7 1E05 LDY #6 1E07 JSR &1702 \COLOUR 6 1E0A LDA #12 1E0C STA &2B00 1E0F JSR &1D81 \Print score at (12,Y) 1E12 CLC \Each entry (name+score) is 20 chars long 1E13 LDA &2B05 1E16 ADC #20 \So add 20 to get to next one. 1E18 STA &2B05 1E1B INC &2B01 1E1E INC &2B01 \Move cursor down 2 lines. 1E21 LDA &2B01 1E24 CMP #22 \Will have reached 22 when finished. 1E26 BNE &1DF0 1E28 RTS \*** Move Cursor and Print Multicoloured Text *** \Entry (X,Y)=text cursor coordinates \A=low byte of string in page &12. \&2B2F is the colour which cycles for each char. 1E29 PHA 1E2A TYA 1E2B PHA 1E2C TXA 1E2D PHA \Preserve registers. 1E2E LDA #31 1E30 JSR OSwrch 1E33 PLA 1E34 JSR OSwrch 1E37 PLA 1E38 JSR OSwrch \VDU31,X,Y 1E3B LDA #&12 1E3D STA &71 1E3F PLA 1E40 STA &70 \String address &1800+A 1E42 LDY #0 1E44 LDA #17 1E46 JSR OSwrch 1E49 LDA &2B2F 1E4C JSR OSwrch \Character colour 1E4F LDA &2B13 1E52 BNE &1E5E \Coloured text 1E54 LDA #17 \Blank text so 1E56 JSR OSwrch 1E59 LDA #0 1E5B JSR OSwrch \COLOUR 0. 1E5E LDA (&70),Y \Get char of text. 1E60 JSR OSwrch 1E63 CLC 1E64 LDA &2B2F \Increment text colour 1E67 ADC #1 \Each character plotted in 1E69 CMP #8 \a different colour in the order 1E6B BNE &1E6F \1,2,3,4,5,6,7 1E6D LDA #1 \wrap round to 1 1E6F STA &2B2F. 1E72 CLC 1E73 LDA &70 1E75 ADC #1 1E77 STA &70 1E79 LDA &71 1E7B ADC #0 1E7D STA &71 \Increment string address. 1E7F LDA (&70),Y 1E81 CMP #13 \If next character is CR we've finished. 1E83 BNE &1E44 1E85 RTS \*** Check score against high score *** 1E86 LDA #0 1E88 STA &2B05 \High score position=0. 1E8B LDA #255 1E8D STA &2B35 1E90 LDA #10 1E92 STA &2B01 1E95 CLC 1E96 LDA &2B05 \Retrieve hiscore position 1E99 ADC #17 \Add 17 to get into hiscore 1E9B STA &2B2E \name string. 1E9E LDX &2B2E \Retrieve high score name string position 1EA1 LDA &2B32 \Compare byte 0 of score 1EA4 CMP &0E00,X \with byte 0 of hiscore. 1EA7 BEQ &1EAE \If equal compare next byte, 1EA9 BCC &1EC8 \if smaller check next hiscore, 1EAB JMP &1EE1 \else put score in at this position and exit. 1EAE LDA &2B33 \Check byte 1 of score 1EB1 CMP &0E01,X \against byte 1 of hiscore. 1EB4 BEQ &1EBB \If equal compare next byte, 1EB6 BCC &1EC8 \if smaller check next hiscore, 1EB8 JMP &1EE1 \else put score in at this position and exit. 1EBB LDA &2B34 \Check byte 2 of score 1EBE CMP &0E02,X \against byte 2 of hiscore. 1EC1 BEQ &1EE1 \If equal compare next byte 1EC3 BCC &1EC8 \if smaller check next hiscore, 1EC5 JMP &1EE1 \else put score in at this position and exit. 1EC8 INC &2B01 1ECB INC &2B01 \Move cursor down 2 lines. 1ECE CLC 1ECF LDA &2B05 1ED2 ADC #20 1ED4 STA &2B05 \Move pointer to next string. 1ED7 CMP #120 1ED9 BNE &1E95 1EDB LDA #255 1EDD STA &2B35 1EE0 RTS \*** Put score in High Score Table *** \X=offset into hiscore table. 1EE1 LDA &2B05 \Hiscore position 1EE4 STA &2B35 1EE7 DEC &2B05 \minus one. 1EEA LDX #119 \Move all scores below in table down one position. 1EEC LDA &0E00,X \(up one position in memory) 1EEF STA &0E14,X 1EF2 DEX 1EF3 CPX &2B05 1EF6 BNE &1EEC 1EF8 LDA #15 1EFA LDX #0 \Clear keyboard 1EFC JSR OSbyte \*FX15,0. 1EFF CLC 1F00 LDA &2B35 \Hiscore pointer 1F03 ADC #17 \add 17 to point to score 1F05 TAX 1F06 LDA &2B32 \Put byte 0 of score 1F09 STA &0E00,X \in byte 0 of hiscore. 1F0C LDA &2B33 \Put byte 1 of score 1F0F STA &0E01,X \in byte 1 of hiscore. 1F12 LDA &2B34 \Put byte 2 of score 1F15 STA &0E02,X \in byte 2 of hiscore. 1F18 CLC 1F19 LDA &2B35 \Restore 1F1C STA &2B05 \high score position 1F1F STA &2B37 1F22 ADC #10 \Allow 10 chars to be typed in. 1F24 STA &2B36 1F27 LDX &2B37 1F2A LDA #32 \Clear old name in table 1F2C STA &0E00,X \by blanking string 1F2F INX \with spaces (CHR$32). 1F30 CPX &2B36 1F33 BNE &1F2A 1F35 LDA #13 \add CR at end. 1F37 STA &0E00,X 1F3A LDA #6 1F3C STA &2B28 1F3F LDA &2B05 1F42 PHA \Preserve hiscore position 1F43 LDA &2B01 \and Y cursor. 1F46 PHA 1F47 LDA #1 1F49 STA &2B13 \flag coloured text. 1F4C JSR &1DD8 \Print hiscore table with blank space in it. 1F4F PLA 1F50 STA &2B01 \Restore Y cursor position 1F53 PLA 1F54 STA &2B05 \and hiscore position 1F57 LDX #2 1F59 LDY #24 \PRINT TAB(2,24) 1F5B LDA #&5F \text at &125F, 1F5D JSR &1E29 \"Enter your name". 1F60 LDX #2 1F62 LDY &2B01 1F65 JSR &1D45 \PRINT TAB(2,Y); 1F68 LDA #17 1F6A LDX #132 1F6C LDY #6 1F6E JSR &1702 \COLOUR 132 1F71 LDX #10 1F73 LDA #32 1F75 JSR OSwrch 1F78 DEX 1F79 BNE &1F73 \PRINT STRING$(10,CHR$32) 1F7B LDX #2 1F7D LDY &2B01 1F80 JSR &1D45 \PRINT TAB(2,Y); 1F83 LDA #17 1F85 LDX #7 1F87 LDY #6 1F89 JSR &1702 \COLOUR 6 1F8C LDX #0 1F8E LDY #0 1F90 LDA #129 1F92 JSR OSbyte \Scan keyboard 1F95 STX &2B38 \store ASCII value of key in &2B38 1F98 CPY #0 \If Y=0 no key was pressed 1F9A BNE &1F8C \so loop until one has. 1F9C LDA &2B38 1F9F CMP #127 \Was DELETE pressed? 1FA1 BNE &1FBE \No. 1FA3 LDA &2B05 \Yes, 1FA6 CMP &2B37 \are we at start of string? 1FA9 BEQ &1FE7 \Yes, not allowed to delete there. 1FAB DEC &2B05 \Else decrement position 1FAE LDA #32 \and replace char 1FB0 LDX &2B05 1FB3 STA &0E00,X \in table with space. 1FB6 LDA #127 \Delete and backspace 1FB8 JSR OSwrch \on screen, 1FBB JMP &1F8C \then jump back to loop. 1FBE LDA &2B38 1FC1 CMP #13 \Was RETURN pressed? 1FC3 BEQ &1FEF \Yes, finished typing. 1FC5 LDA &2B05 \Else if the text pointer 1FC8 CMP &2B36 \is at maximum 1FCB BEQ &1FE7 \we also have finished. 1FCD LDA &2B38 1FD0 CMP #32 1FD2 BCC &1FE7 1FD4 CMP #128 1FD6 BCS &1FE7 \Only allow chars 32-127. 1FD8 LDX &2B05 1FDB STA &0E00,X \Put valid char in string. 1FDE JSR OSwrch 1FE1 INC &2B05 \Increment position 1FE4 JMP &1F8C \and jump back to loop. 1FE7 LDA #7 \Key press isn't allowed 1FE9 JSR OSwrch \so make a beep 1FEC JMP &1F8C \and return to loop. 1FEF LDX &2B36 1FF2 INX 1FF3 LDA #13 \Add a CR 1FF5 STA &0E00,X \at end of string. 1FF8 LDA #17 1FFA LDX #128 1FFC LDY #6 1FFE JSR &1702 \COLOUR 128 2001 LDA #1 2003 STA &2B13 \Coloured text. 2006 JSR &1DD8 \Display updated hiscore table 2009 RTS \and exit. \*** Check Keyboard or Joystick *** 200A LDA &2B20 \Are the keys enabled? 200D BNE &2010 \Yes 200F RTS \No, in middle of explosion so exit. 2010 LDA &2B3F \Using joystick? 2013 BEQ &201F \No. 2015 LDX #1 2017 JSR &1726 \Read stick. 201A PHA \preserve ADC value. 201B CMP #200 \If >=200 201D BCS &2026 \stick not pushed left. 201F LDX #158 \INKEY-98 (Z) 2021 JSR &171D \scan keyboard 2024 BEQ &2030 \Z wasn't pressed. 2026 LDA &2B00 \IF X<5 2029 CMP #5 \player is at far left 202B BCC &2030 \so no further left. 202D DEC &2B00 \Else X=X-1 2030 LDA &2B3F \Using joystick? 2033 BEQ &203A \No. 2035 PLA \Retrieve ADC value 2036 CMP #55 \If <55 2038 BCC &2041 \stick not pushed right. 203A LDX #189 \INKEY-67 (X) 203C JSR &171D \scan keyboard 203F BEQ &204B \X wasn't pressed. 2041 LDA &2B00 \IF X>70 2044 CMP #71 \player is at far right 2046 BCS &204B \so no further right. 2048 INC &2B00 \Else X=X+1 204B LDA &2B3F \Using joystick? 204E BEQ &205A \No 2050 LDX #2 2052 JSR &1726 \Check stick. 2055 PHA \preserve ADC value. 2056 CMP #200 \If >=200 2058 BCS &2061 \stick 205A LDX #183 \INKEY-73 (:) 205C JSR &171D \scan keyboard. 205F BEQ &206E \Up key wasn't pressed. 2061 LDA &2B01 \If Y<74 2064 CMP #74 \player is at top 2066 BCC &206E \so no futher up. 2068 DEC &2B01 \Else Y=Y-1 206B DEC &2B01 206E LDA &2B3F \Using joystick? 2071 BEQ &2078 \No. 2073 PLA \Retrieve ADC value 2074 CMP #55 \If <55 2076 BCC &207F \stick not up. 2078 LDX #151 \INKEY-105 (/) 207A JSR &171D \scan keyboard. 207D BEQ &208C \Down key wasn't pressed. 207F LDA &2B01 \IF Y>=214 2082 CMP #214 \player at bottom 2084 BCS &208C \so no further down. 2086 INC &2B01 \Else Y=Y+1 2089 INC &2B01 208C RTS 208D BRK 208E BRK 208F BRK \Next section of code isn't used and is incomplete \The working version is at 2102 onwards 2090 LDX #0 2092 JSR &187F 2095 LDA #19 2097 JSR OSbyte 209A JSR &1758 209D LDA &2B46 20A0 BNE &20A5 20A2 JSR &200A 20A5 JSR &2613 20A8 LDA &2B46 20AB BNE &20B3 20AD LDA &2B21 20B0 STA &2B1F 20B3 JSR &22AD 20B6 JSR &2129 20B9 JSR &1758 20BC LDA &2B0C 20BF BEQ &20E5 20C1 LDA &2B1F 20C4 BEQ &20E5 20C6 DEC &2B4A 20C9 LDA &2B4A 20CC BNE &20E5 20CE LDA #21 20D0 LDX #6 20D2 JSR OSbyte 20D5 LDA #4 20D7 STA &2B4A 20DA LDA &2B01 20DD STA &0A14 20E0 LDA #2 20E2 JSR &173F 20E5 JSR &20EE 20E8 LDX #0 20EA JSR &18B6 20ED RTS 20EE LDA &2B1F 20F1 BNE &20F4 20F3 RTS 20F4 LDA &2B0C 20F7 BEQ &20FA 20F9 RTS 20FA LDA &2B01 20FD CMP #213 20FF BCS &20A2 2101 BRK \*** Retrieve, Check and Store Player Properties *** 2102 JSR &187F \Retrieve player props 2105 LDA #19 2107 JSR OSbyte \*FX19 210A JSR &1758 \Print player character 210D LDA &2B46 \Demo in progress? 2110 BNE &2115 \Yes. 2112 JSR &200A \Scan keyboard/joystick 2115 JSR &267E \Check if player picking up pebble 2118 LDA &2B46 211B BNE &2123 211D LDA &2B21 2120 STA &2B1F 2123 JSR &2318 \Make sound with pitch relating to Y position 2126 JSR &2199 \Check if player has docked 2129 JSR &1758 \Print player with pebble if necessary. 212C LDA &2B0C \Is player holding pebble? 212F BEQ &2155 \No. 2131 LDA &2B1F \Player orientation 2134 BEQ &2155 \upright. 2136 DEC &2B4A 2139 LDA &2B4A 213C BNE &2155 213E LDA #21 2140 LDX #6 \*fx21,6 2142 JSR OSbyte \clear sound channel 2. 2145 LDA #4 2147 STA &2B4A 214A LDA &2B01 \Player Y coordinate 214D STA &0A14 \becomes pitch in sound #2 2150 LDA #2 2152 JSR &173F \SOUND 2,-11,Y,1 2155 JSR &215E \Check if collecting pebble. 2158 LDX #0 215A JSR &18B6 \Store updated player props 215D RTS \and exit. \*** Check Player Picking up Pebble *** 215E LDA &2B1F \Is player upright 2161 BNE &2164 \Yes. 2163 RTS \No, can't pick up pebble upside down. 2164 LDA &2B0C \Is player holding pebble? 2167 BEQ &216A \No 2169 RTS \Yes, can't hold 2 at once so exit. 216A LDA &2B01 216D CMP #213 \Player Y coordinate 216F BCS &2174 \must be 213 or greater to pick pebble 2171 LDA #0 \Not far enough down screen 2173 RTS \so exit flagging no pebble picked up. 2174 LDX #0 2176 LDA &2B00 \Check player X coordinate 2179 CMP &0600,X \against X coords of pebbles. 217C BEQ &2186 \Aligned. 217E INX \else check next pebble 217F CPX #8 \If all 8 checked and no match found 2181 BNE &2176 2183 LDA #0 \player not in right X position 2185 RTS \so exit. 2186 LDA #1 2188 STA &2B0C \Flag that player is holding pebble 218B LDA #0 \and set X coordinate in pebble 218D STA &0600,X \table to show it's gone. 2190 LDA #1 2192 LDX &2B4B \Pebble # is pitch of note 2195 JSR &2704 \Make sound according to pebble # 2198 RTS \and exit. \*** Player Docked *** \Make sound relating to pebble number 2199 LDA &2B0C \Is player holding pebble? 219C BNE &219F \Yes. 219E RTS \No so exit. 219F LDA &2B00 \Check player's X coordinate 21A2 CMP #38 \is 38 21A4 BEQ &21A7 21A6 RTS 21A7 LDA &2B01 21AA CMP #74 \and Y coordinate is 74 21AC BCC &21AF \(position of docking sprite). 21AE RTS \Not engaged on docking sprite. 21AF LDA #1 21B1 LDX &2B4B \Pebble # 21B4 JSR &2704 \Make sound relating to pebble # 21B7 CLC 21B8 LDA &2B4B 21BB ADC #12 \Move pebble pitch up 3 semitones 21BD STA &2B4B \by adding 12 to pitch. 21C0 LDA #0 21C2 STA &2B0C \Flag no longer holding pebble. 21C5 DEC &2B14 \Decrement # pebbles left to collect. 21C8 LDA #1 21CA STA &2B43 21CD LDA &2B39 \Add pebble weighting 21D0 JSR &2572 \to score. 21D3 JSR &2541 \Update score. 21D6 SEC 21D7 CLC 21D8 LDA &2B39 \Increase pebble weighting 21DB ADC #&10 \by 10 points (&10 in BCD) 21DD STA &2B39 21E0 CLD 21E1 RTS \*** Move Alien Sprites *** 21E2 LDA #20 \Property index of 1st alien 21E4 STA &2B05 \is 20. 21E7 LDA &2B0E 21EA PHA \Preserve level #. 21EB LDA #0 21ED STA &2B0F 21F0 LDY &2B0F 21F3 JSR &25C3 21F6 DEY 21F7 BNE &21F3 21F9 LDX &2B0F 21FC LDA &0926,X 21FF STA &2B00 \Alien X 2202 LDA &0927,X 2205 STA &2B01 \Alien Y 2208 LDA &2B3A 220B STA &2B02 220E LDA &2B3B 2211 STA &2B03 2214 LDA &0928,X 2217 STA &2B04 \Alien type 221A LDA &0929,X 221D STA &2B0A \Alien sprite 2220 LDA &092A,X 2223 STA &2B0B 2226 STA &2B09 \Frame speed. 2229 LDA &092C,X 222C STA &2B15 222F LDA &092B,X 2232 STA &2B3D 2235 LDA &092D,X 2238 STA &2B41 223B LDX &2B05 223E JSR &18B6 \Store alien props 2241 JSR &19A0 \Reprint aliens. 2244 CLC 2245 LDA &2B05 2248 ADC #20 224A STA &2B05 \add 20 to prop index for next alien. 224D CLC 224E LDA &2B0F 2251 ADC #8 2253 STA &2B0F 2256 DEC &2B0E 2259 LDA &2B0E 225C BNE &21F0 225E PLA 225F STA &2B0E 2262 LDA &2B05 2265 STA &2B10 2268 RTS 2269 JSR &1B58 \Plot stars 226C LDA #1 226E STA &2B13 \Coloured text. 2271 JSR &2287 \Print congratulatory message. 2274 LDY #60 2276 JSR &24FA \Print "Get Ready" and stage # 2279 DEY 227A BNE &2276 \60 times! 227C JSR &1B58 \Plot stars 227F LDA #0 2281 STA &2B13 \Black text. 2284 JMP &2287 \*** Print Get Ready and level number *** 2287 LDX #6 2289 LDY #12 228B LDA #0 228D JSR &1A4A \PRINT TAB(6,12) 2290 LDX #1 2292 LDY #16 2294 LDA #&08 \text at &1208 2296 JSR &1A4A \"Get Ready" 2299 LDA #17 229B LDX #3 229D LDY #6 229F JSR &1702 \COLOUR 3 22A2 LDX #12 22A4 LDY #12 22A6 LDA &2B0E \PRINT TAB(12,18) 22A9 JMP &1A98 \level number 22AC JSR &2710 \ 22AF JSR &22FB \Print the aliens. 22B2 LDX #0 22B4 JSR &187F \Restore player props 22B7 JSR &1758 \Print player char 22BA LDA #1 22BC STA &2B13 \Coloured text 22BF JSR &22D5 \Print "Well Done" and stag # complete. 22C2 LDY #66 22C4 JSR &24FA \Scroll the stars 22C7 DEY 22C8 BNE &22C4 \66 times. 22CA JSR &1B58 \Replot stars 22CD LDA #0 22CF STA &2B13 \Black text 22D2 JSR &1702 \So we erase 22D5 LDX #6 22D7 LDY #14 22D9 LDA #&1D \text at &121D 22DB JSR &1A4A 22DE LDX #6 22E0 LDY #16 22E2 LDA #0 22E4 JSR &1A4A 22E7 LDX #12 22E9 LDY #16 \PRINT TAB(12,16) 22EB LDA &2B0E \stage # 22EE JSR &1A98 22F1 LDX #6 22F3 LDY #18 22F5 LDA #&28 \Text at &1228. 22F7 JMP &1A4A \"Complete" 22FA RTS \*** Retrieve Properties of and Erase Aliens *** 22FB LDA #20 \1st alien 22FD STA &2B0D \has prop index of 20. 2300 LDX &2B0D 2303 JSR &187F \Retrieve alien props 2306 JSR &19A0 \and erase aliens. 2309 CLC 230A LDA &2B0D 230D ADC #20 \Point to next alien's props 230F STA &2B0D 2312 CMP &2B10 \Have we reached max # aliens on screen? 2315 BNE &2300 \No, back to loop. 2317 RTS \Yes, exit. \*** Make Sound Relating to Player Y Coordinate *** 2318 LDA &2B1F 231B BEQ &231E \Player upright 231D RTS \Upside-down so no need to make sound. 231E LDA &2B01 2321 CMP #214 2323 BCS &234C \Player Y coord >=214 2325 LDA #21 2327 LDX #6 2329 JSR OSbyte \Flush sound channel 2. 232C LDA #21 232E LDX #7 2330 JSR OSbyte \Flush sound channel 3 2333 LDA &2B01 \Player Y coord 2336 STA &0A14 \becomes pitch 2339 STA &0A34 \of sound. 233C LDA #2 233E JSR &173F \SOUND 2,-11,Y,1 2341 LDA #6 2343 JSR &173F \SOUND 3,-11,Y,1 2346 INC &2B01 2349 INC &2B01 \Y=Y+2 234C LDA &2B01 234F CMP #214 \ 2351 BCC &2381 2353 LDA &2B31 \Explosion flag 2356 BNE &2381 \=FALSE 2358 SEC \Player killed so init explosion 2359 LDA &2B00 235C SBC #1 \X centre of explosion is 235E STA &2B2C \player X coord subtract 1. 2361 CLC 2362 LDA &2B01 \Y centre of explosion is 2365 ADC #12 2367 STA &2B2B \player Y coord add 12. 236A JSR &1CEF 236D LDA #3 236F JSR &173F \SOUND 0,4,6,10 2372 LDA #1 2374 STA &2B31 \Explosion counter. 2377 JSR &1758 \Erase player character. 237A LDA &2B15 237D ASL A 237E STA &2B15 2381 LDA &2B31 \Explosion in process? 2384 BEQ &2395 \No. 2386 INC &2B31 \Increment explosion counter 2389 LDA &2B31 238C CMP #100 \Until reached 100. 238E BNE &2395 2390 LDA #1 2392 STA &2B26 \Set dead flag. 2395 RTS \*** Plot 4 Player Sprites Representing Lives *** \at 60,66,72,78 2396 LDA #60 2398 STA &2B00 239B LDA #4 239D STA &2B01 \Coordinates of 1st sprite (60,4). 23A0 LDA #1 23A2 STA &2B1F \Player upright. 23A5 JSR &1758 \Plot sprite. 23A8 CLC 23A9 LDA &2B00 23AC ADC #6 23AE STA &2B00 \X=X+6 23B1 CMP #77 23B3 BCC &23A0 \Loop until plotted lives. 23B5 RTS \*** Erase Life *** 23B6 LDA #78 23B8 STA &2B00 23BB LDA #4 23BD STA &2B01 \1st life to erase at (78,4) 23C0 LDA &2B23 23C3 PHA \Preserve # lives. 23C4 SEC \while we use it as a counter. 23C5 LDA &2B00 \Work out # lives to erase 23C8 SBC #6 \by 23CA STA &2B00 \Moving print position left 23CD DEC &2B23 23D0 LDA &2B23 \and decrementing lives. 23D3 BNE &23C4 23D5 LDA #1 \Sprite 1 23D7 STA &2B1F \Player upright 23DA JSR &1758 \Erase sprite 23DD PLA 23DE STA &2B23 \and restore # lives. 23E1 RTS \*** Initialise Player Properties *** 23E2 LDA #38 23E4 STA &2B00 \X=38 23E7 LDA #74 23E9 STA &2B01 \Y=74 23EC LDA #0 23EE STA &2B0C \Set pebble holding flag to FALSE. 23F1 LDA #1 23F3 STA &2B20 23F6 LDA #1 \Player orientation 23F8 STA &2B1F \upright (sprite 1). 23FB LDA #1 23FD STA &2B21 2400 LDX #0 2402 JSR &18B6 \Store player props 2405 RTS 2406 JSR &22FB \Retrieve alien props and erase aliens. 2409 JSR &23E2 \Init player props. 240C JSR &1B58 \Plot stars. 240F DEC &2B23 \Decrement lives. 2412 RTS \*** Game Over *** 2413 JSR &1B58 \Plot stars. 2416 LDA #1 2418 STA &2B13 \Coloured text. 241B JSR &2431 \Print "Game Over" 241E LDY #50 2420 JSR &24FA \Scroll stars 2423 DEY 2424 BNE &2420 \50 times. 2426 JSR &1B58 \Replot stars. 2429 LDA #0 242B STA &2B13 \Blank text. 242E JMP &2431 \Erase "Game Over" message. \*** Print Game Over Message *** 2431 LDX #6 2433 LDY #16 2435 LDA #&31 \Text at &1231 2437 JMP &1A4A 243A DEC &2B27 \Empty oxygen tank by decrementing 243D LDA &2B27 \oxygen level and 2440 BEQ &2443 \and looping till zero. 2442 RTS \*** Plot Oxygen Level in Correct Colour *** 2443 LDA #&2A \Oxygen level starts at &2A in BCD 2445 STA &2B27 \NB drops to &29 at start. 2448 LDA &2B2A 244B CMP #28 244D BNE &2459 244F LDA #0 2451 STA &2B21 2454 LDA #0 2456 STA &2B20 2459 LDA &2B2A 245C CMP #37 245E BCS &246A 2460 LDA &2B1F 2463 BEQ &246A 2465 LDA #4 2467 JSR &173F 246A LDA &2B2A 246D CMP #28 246F BEQ &247D 2471 DEC &2B2A 2474 LDA &2B2A 2477 STA &2B00 247A JSR &24AD \Draw oxygen tank. 247D RTS \*** Subtract 1 from Oxygen Level in BCD *** 247E SEC 247F SED 2480 LDA &2B27 2483 SBC #1 2485 STA &2B27 2488 CLD 2489 RTS \*** Print OXYGEN *** 248A LDX #9 248C LDY #2 \PRINT TAB(9,2) 248E LDA &2B27 2491 JMP &1A98 \oxygen level. 2494 RTS \*** Fill Oxygen Tank *** 2495 LDA #28 \X=28 2497 STA &2B00 249A LDA #&4C 249C STA &2B2A 249F JSR &24AD \Fill section of tank. 24A2 INC &2B00 \X=X+1 24A5 LDA &2B00 24A8 CMP #77 \UNTIL X=77. 24AA BNE &249F 24AC RTS \*** Colour the Pixels in Oxygen Tank *** \Entry &2B00 contains X column 24AD LDX &2B00 24B0 LDY #30 24B2 JSR &1600 \Calculate screen 24B5 LDA #12 24B7 STA &2B28 \Pixel code for Green/Green 24BA LDA &2B00 24BD CMP #36 \IF X<36 24BF BCS &24C6 24C1 LDA #3 24C3 STA &2B28 \Set pixel code to Red/Red 24C6 LDA &2B2A 24C9 CMP #29 \IF X<29 24CB BCS &24D2 24CD LDA #0 24CF STA &2B28 \Set pixel code to Black/Black 24D2 LDY #3 24D4 JSR &24EF \Fill screen bytes 24D7 CLC 24D8 LDA &70 24DA ADC #8 24DC STA &70 24DE LDA &71 24E0 ADC #0 \Move to next column 24E2 STA &71 \by adding 8 to screen address. 24E4 LDA #0 24E6 STA &2B28 \Pixel code black/black 24E9 LDY #3 24EB JSR &24EF \Fill screen bytes 24EE RTS \*** Fill Column on Screen *** \Entry &2B28 contains pixel code 24EF LDA &2B28 \Retrieve pixel code 24F2 STA (&70),Y \store in screen 24F4 INY \move to next pixel line 24F5 CPY #9 \until done 8 lines. 24F7 BNE &24EF 24F9 RTS \*** Scroll Stars and Delay *** 24FA TYA 24FB PHA \Preserve Y 24FC LDX #94 24FE JSR &174B \Delay value 94 2501 JSR &1B97 \Scroll stars. 2504 PLA 2505 TAY \Restore Y 2506 RTS \*** Print Press Space or Fire To Start *** 2507 LDA #17 2509 LDX #3 250B LDY #27 250D JSR &1702 \COLOUR 3 2510 LDA #&3D \text at &123D 2512 LDX #2 2514 LDY #24 2516 JSR &1E29 \PRINT TAB(2,24) 2519 LDA #&1C \text at &12AE 251B LDX #2 251D LDY #26 \PRINT TAB(2,26) 251F JSR &1E29 2522 RTS \*** Change Colour of Text Characters *** \This gives the flashing effect. 2523 DEC &2B45 \Decrement timer 2526 LDA &2B45 2529 BEQ &252C \If timer is zero change colour 252B RTS \timer not zero yet. 252C LDA #2 \Reset timer 252E STA &2B45 2531 SEC 2532 LDA &2B2F 2535 SBC #1 \Decrement text colour 2537 CMP #1 \modulo 7 so it cycles 2539 BCS &253D \7 6 5 4 3 2 1 7 6 ... 253B LDA #7 253D STA &2B2F 2540 RTS \*** Print Score *** 2541 LDA #1 2543 STA &2B13 \Coloured text. 2546 LDA #17 2548 LDX #3 254A LDY #6 254C JSR &1702 \COLOUR 3 254F LDX #0 2551 LDY #1 2553 JSR &1D45 \PRINT TAB(0,1) 2556 LDA &2B32 2559 AND #15 \Mask off low nybble of byte 3, 255B JSR &1A7F \digit 4 of score, and print it. 255E LDA &2B33 2561 LDX #1 2563 LDY #1 \PRINT TAB(1,1) 2565 JSR &1A98 \digits 3 and 2 of score. 2568 LDA &2B34 256B LDX #3 256D LDY #1 \PRINT TAB(3,1) 256F JMP &1A98 \digits 1 and 0 of score \*** Add A to Score *** 2572 CLC 2573 SED 2574 ADC &2B34 2577 STA &2B34 \byte 0 of score 257A LDA &2B33 257D ADC #0 257F STA &2B33 \byte 1 of score 2582 LDA &2B32 2585 ADC #0 2587 STA &2B32 \byte 2 of score 258A CLD 258B LDA &2B46 258E BEQ &2591 2590 RTS 2591 LDA &2B33 \Award extra life 2594 CMP &2B47 \If score > hiscore. 2597 BEQ &259C 2599 BCS &259C 259B RTS \*** Increment Lives *** 259C LDA &2B00 259F PHA 25A0 LDA &2B01 25A3 PHA \Preserve coordinates. 25A4 JSR &23B6 \Print lives 25A7 PLA 25A8 STA &2B01 25AB PLA 25AC STA &2B00 \Restore coordinates 25AF LDA #5 25B1 JSR &173F \Make got-it sound 25B4 INC &2B23 \Increment lives 25B7 SED 25B8 CLC 25B9 LDA &2B47 25BC ADC #&10 \Award 10 points in BCD. 25BE STA &2B47 25C1 CLD 25C2 RTS 25C3 LDX &2B3C 25C6 LDA &0980,X 25C9 STA &2B3A 25CC LDA &0981,X 25CF STA &2B3B 25D2 CLC 25D3 LDA &2B3C 25D6 ADC #2 25D8 CMP #18 25DA BNE &25DE 25DC LDA #0 25DE STA &2B3C 25E1 RTS \*** Player Types Stage Number *** 25E2 LDA #17 25E4 LDX #3 25E6 LDY #6 25E8 JSR &1702 \COLOUR 3 25EB LDA #1 25ED STA &2B13 \Coloured text. 25F0 LDX #2 25F2 LDY #24 25F4 LDA #&70 \Text at &1230, 25F6 JSR &1A4A \"Enter Stage (1-6)". 25F9 LDA #15 25FB LDX #0 25FD JSR OSbyte \*fx15,0 clear keyboard. 2600 JSR OSrdch \Get key press. 2603 CMP #49 \Must be in range "1" to "6". 2605 BCC &2600 \ASCII values <49 not allowed, 2607 CMP #55 \ 2609 BCS &2600 \ASCII values >=54 not allowed. 260B SEC 260C SBC #48 \Derive stage # by subtracting 48 260E STA &2B0E \from ASCII code. 2611 LDA #0 2613 STA &2B13 \Blank text. 2616 LDX #2 2618 LDY #24 261A LDA #&70 261C JSR &1A4A \Erase "Enter Stage". 261F RTS \*** Award Bonus Score *** 2620 LDA #17 2622 LDX #3 2624 LDY #6 2626 JSR &1702 \COLOUR 3 2629 LDA #1 262B STA &2B13 \Coloured text 262E LDA #17 2630 LDX #3 2632 LDY #6 2634 LDX #4 2636 LDY #15 \PRINT TAB(4,15) 2638 LDA #&82 \text at &1282 263A JSR &1E29 \"Bonus score" 263D LDA #&10 263F JSR &2572 \Add 10 points, BCD. 2642 JSR &2541 \Update score display. 2645 LDA &2B2A 2648 CMP #27 \Check o2 level 264A BEQ &266E \Empty, 264C STA &2B00 \else award points 264F DEC &2B2A \every o2 unit left 2652 STA &0A14 \o2 level is pitch of sound 2655 LDA #2 2657 JSR &173F \SOUND 2,-11,o2 level,1 265A LDX #4 265C LDY #15 265E LDA #&82 \Text at &1282 2660 JSR &1E29 \PRINT "Bonus Score" 2663 JSR &24AD \Update o2 meter. 2666 LDX #200 2668 JSR &174B \Delay. 266B JMP &263D \Keep adding 10pts till o2 all gone. 266E LDA #0 2670 STA &2B13 \Blank text 2673 LDX #4 2675 LDY #15 2677 LDA #&82 \Text at &1282 2679 JSR &1E29 \Erase "Bonus Score" 267C RTS \and exit. 267D RTS \*** Check if Player Picking Up Pebble *** 267E LDA &2B1F \Orientation 2681 BNE &2684 \upright 2683 RTS \upside down (killed) so exit. 2684 LDA &2B46 2687 BNE &268A 2689 RTS 268A LDA &2B0C 268D CMP #1 \Holding pebble? 268F BEQ &26E2 \Yes 2691 LDA &2B43 2694 BEQ &26B5 2696 CLC 2697 LDA &2B44 269A ADC #1 269C CMP #8 269E BNE &26A2 26A0 LDA #0 26A2 STA &2B44 26A5 LDX &2B44 26A8 LDA &0600,X \Pebble X coordinate 26AB BEQ &2696 \=0 if already collected 26AD STA &2B42 26B0 LDA #0 26B2 STA &2B43 26B5 LDA &2B00 26B8 CMP &2B42 26BB BEQ &26D4 \PlayerX = PebbleX 26BD LDA &2B00 26C0 CMP &2B42 26C3 BCC &26C8 \PlayerX < PebbleX 26C5 DEC &2B00 26C8 LDA &2B00 26CB CMP &2B42 26CE BCS &26D3 \(PlayerX -1) > PebbleX 26D0 INC &2B00 26D3 RTS 26D4 LDA &2B01 26D7 CMP #213 26D9 BCS &26E1 \PlayerY >= 213 26DB INC &2B01 26DE INC &2B01 \Y=Y+1 26E1 RTS \*** Check if Player Has Reached Docking Char *** 26E2 LDA &2B00 26E5 CMP #38 26E7 BCC &26EC \Player Y < 38 26E9 DEC &2B00 26EC LDA &2B00 26EF CMP #38 26F1 BCS &26F6 \(PlayerX-1) >= 38 26F3 INC &2B00 \X=X+1 26F6 LDA &2B01 26F9 CMP #74 26FB BCC &2703 \PlayerY < 74 26FD DEC &2B01 2700 DEC &2B01 \Y=Y-1 2703 RTS \*** Sound note of Next Level Ditty *** 2704 STA &0A38 \Channel 2707 STX &0A3C \Pitch 270A LDA #7 270C JSR &173F \SOUND A,4,X,3 270F RTS \*** Next Level Ditty *** 2710 LDA #15 2712 LDX #0 2714 JSR OSbyte \Clear buffers 2717 LDX #0 2719 STX &2B05 \Data pointer 271C LDX &2B05 271F LDA &1500,X \Pitch of next note 2722 STA &2B06 2725 LDA #1 2727 LDX &2B06 272A JSR &2704 \SOUND 1,4,pitch,3 272D LDA #2 272F LDX &2B06 2732 JSR &2704 \SOUND 2,4,pitch,3 2735 LDA #3 2737 LDX &2B06 273A JSR &2704 \SOUND 3,4,pitch,3 273D LDX #0 273F JSR &174B 2742 INC &2B05 \Increment note pointer 2745 LDA &2B05 2748 CMP #39 \Until done 38 notes. 274A BNE &271C 274C RTS \*** EXECUTION POINT *** 274D LDA #0 274F STA &2B3C 2752 STA &2B44 2755 LDA #1 2757 STA &2B40 \Level # =1 275A JSR &25C3 \Retrieve alien path data. 275D LDA #1 275F STA &2B3E \Coloured text. 2762 STA &2B45 \Text char colour period 2765 STA &2B4A 2768 JSR &172D \MODE 2 276B JSR &17A6 \Plot walls. 276E JSR &177D \Plot logos and oxygen tank. 2771 JSR &1841 \Plot pebbles 2774 JSR &2495 \Fill o2 tank. 2777 LDA #17 2779 LDX #132 277B LDY #6 277D JSR &1702 \COLOUR 132 2780 LDX #15 2782 LDY #30 2784 JSR &1D45 \PRINT TAB(15,30); 2787 LDA #224 2789 LDX #225 278B LDY #226 278D JSR &1702 2790 LDA #227 \VDU224,225,226,227 2792 JSR OSwrch \227 (D.Ryder logo) 2795 LDA #17 2797 LDX #132 2799 LDY #6 279B JSR &1702 \COLOUR 132 279E LDX #1 27A0 LDY #30 27A2 JSR &1D45 \PRINT TAB(1,30) 27A5 LDA #228 27A7 LDX #229 27A9 LDY #230 27AB JSR &1702 27AE LDA #231 27B0 JSR OSwrch 27B3 LDA #232 \VDU228,229,230,231,232 27B5 JSR OSwrch \(VOYAGER logo) 27B8 LDA #17 27BA LDX #128 27BC LDY #6 27BE JSR &1702 \COLOUR 128 27C1 LDA #1 \Set colour of 1st char in text 27C3 STA &2B2F \to red. 27C6 LDA #229 27C8 LDX #32 27CA LDY #0 27CC JSR OSbyte \*fx229,32 disable ESCAPE. 27CF LDA #230 27D1 LDX #1 27D3 LDY #0 27D5 JSR OSbyte \Determine ESCAPE effects. 27D8 LDA #4 27DA LDX #1 27DC JSR OSbyte \*FX4,1 cursor keys produce ASCII values. 27DF LDA #10 27E1 LDX #5 \*FX10,5 27E3 JSR OSbyte \Set 1st flash rate colour 27E6 LDA #9 27E8 LDX #5 27EA JSR OSbyte \Set 2nd flash rate colour 27ED LDA #0 27EF LDX #0 27F1 STA &0400,X \Zeroise explosion shard props. 27F4 INX 27F5 CPX #190 \(60 shards * 3 = 190). 27F7 BNE &27F1 27F9 LDA #1 27FB STA &2B13 \Coloured text. 27FE JSR &2507 \Print "Press Space or Fire" 2801 JSR &1DD8 \Print hiscore 2804 LDA #1 2806 STA &2B30 2809 LDA #0 280B STA &2B46 280E JSR &1B58 \Plot stars 2811 JSR &23E2 \Init player props 2814 LDA #70 2816 STA &2B00 \PlayerX = 70 2819 LDA #174 281B STA &2B01 \PlayerY = 174 281E LDX #0 \Object index 0=player, 2820 JSR &18B6 \store player props 2823 JSR &1758 \Print player sprite 2826 LDA #255 2828 STA &2B48 \dy=-1 (down) 282B LDA #1 282D STA &2B27 \dx=1 (right) 2830 JSR &25C3 2833 JSR &1B97 \Scroll stars 2836 LDA &2B2F 2839 PHA \Preserve text f'ground colour 283A JSR &2507 \PRINT "Press Space or Fire" 283D PLA 283E STA &2B2F \Restore text f'ground colour 2841 JSR &2523 \Decrement text colour period 2844 CLC 2845 LDA &2B44 2848 ADC #1 284A CMP #8 284C BNE &2850 284E LDA #0 2850 STA &2B44 2853 LDX #0 2855 JSR &187F \Restore player props 2858 JSR &1758 \Erase player sprite 285B CLC 285C LDA &2B00 285F ADC &2B48 2862 STA &2B00 \PlayerX = PlayerX + dx 2865 LDA &2B00 2868 CMP #4 286A BNE &2876 \IF PlayerX = 4 286C LDA #5 286E JSR &173F \SOUND 2,4,120,1 2871 LDA #1 2873 STA &2B48 \dx=1 (player right) 2876 CMP #71 2878 BNE &2884 \IF PlayerX = 71 287A LDA #5 287C JSR &173F \SOUND 2,4,120,1 287F LDA #255 2881 STA &2B48 \dx=-1 (player left) 2884 JSR &1758 \Reprint player sprite 2887 LDX #0 2889 JSR &18B6 \Store player props 288C LDA &2B00 288F CMP #38 2891 BNE &28A7 \IF PlayerX = 38 2893 LDA &2B00 2896 STA &2B2C 2899 LDA &2B01 \set explosion centre 289C STA &2B2B \to player coords 289F JSR &1CEF \and blow up player 28A2 LDA #3 28A4 JSR &173F \SOUND 0,4,6,10 28A7 JSR &1C96 \Move explosion shards 28AA JSR &243A 28AD JSR &243A 28B0 JSR &243A 28B3 JSR &243A 28B6 JSR &243A 28B9 JSR &243A \6x delay 28BC LDA &2B2A \Oxygen 28BF CMP #28 28C1 BNE &28C8 28C3 LDA #1 28C5 STA &2B46 28C8 LDA &2B46 28CB BNE &28EE \Not in demo mode 28CD LDX #0 28CF STX &2B3F 28D2 JSR &1726 \Scan joystick 28D5 TXA 28D6 AND #3 \ADC value bits 0+1 28D8 CMP #1 \=1 if fire button pressed 28DA BNE &28E4 28DC LDA #1 28DE STA &2B3F \Flag player wants to use joystick 28E1 JMP &28EE \and continue. 28E4 LDX #157 \INKEY-99 (space) 28E6 JSR &171D \scan keyboard 28E9 BNE &28EE \not pressed space 28EB JMP &2830 \Loop until space or fire. 28EE JSR &1B58 \Plot stars 28F1 LDX #0 28F3 JSR &187F \Retrieve player props 28F6 JSR &1758 \Print player. 28F9 LDX #40 28FB TXA 28FC PHA 28FD LDA #19 28FF JSR OSbyte \*FX19 2902 JSR &1C96 \Animate shards 2905 PLA 2906 TAX 2907 DEX 2908 BNE &28FB \until done 40x. 290A LDA #0 290C STA &2B13 \Blank text 290F JSR &2507 \PRINT "Press Space or Fire" 2912 LDA #1 2914 STA &2B49 2917 LDA &2B46 291A BNE &291F \Not in demo mode 291C JSR &25E2 \Ask user to type stage # 291F LDA #0 2921 STA &2B13 \Blank text 2924 JSR &1DD8 \Erase hiscores 2927 JSR &23E2 \init player coords 292A LDA &2B46 292D BEQ &293A \Not in demo mode 292F LDA #0 2931 STA &2B20 \Disable keys 2934 LDA &2B40 2937 STA &2B0E \Copy of stage # 293A CLC 293B LDA &2B40 293E ADC #1 2940 CMP #7 2942 BNE &2946 2944 LDA #1 2946 STA &2B40 \Stage = (Stage+1) MOD 7 2949 LDA &2B46 294C BEQ &2965 \Stage is 0 294E LDA #1 2950 STA &2B13 \Coloured text 2953 LDA #17 2955 LDX #7 2957 LDY #6 \COLOUR 7 2959 JSR &1702 295C LDA #&8F \Text at &128F 295E LDX #0 2960 LDY #5 \PRINT TAB(0,5) 2962 JSR &1A4A \"Press Escape to play" 2965 LDA #0 2967 STA &2B32 296A STA &2B33 296D STA &2B34 \Score=0 2970 LDA #16 2972 STA &2B47 2975 LDA #3 2977 STA &2B23 \lives=3 297A LDA #1 297C STA &2B49 297F LDA #1 2981 STA &2B13 \Coloured text 2984 JSR &2541 \Print score 2987 JSR &2396 \Plot lives 298A LDA #0 298C LDX #0 298E STA &0400,X 2991 INX 2992 CPX #190 2994 BNE &298E \Clear explosion shard props 2996 LDA #0 2998 STA &2B31 \Explosion flag = FALSE 299B LDA &2B23 \Have all lives been lost? 299E BNE &29AE \No. 29A0 JSR &2413 \Yes, print "Game Over" etc 29A3 LDA &2B46 \In demo mode? 29A6 BNE &29AB \Yes. 29A8 JSR &1E86 \Check score against high score 29AB JMP &27ED \Loop UNTIL FALSE 29AE JSR &23B6 \Plot lives 29B1 JSR &2495 29B4 LDA #10 29B6 STA &2B27 29B9 LDA #20 \Timer 29BB STA &2B12 29BE LDA #25 29C0 STA &2B4B \Pebble pitch=25 29C3 LDA #35 29C5 STA &2B2C \PlayerX=35 29C8 LDA #213 29CA STA &2B2B \PlayerY=213 29CD LDA #0 29CF STA &2B26 \dead=FALSE 29D2 JSR &1841 \Plot and store pebble positions 29D5 LDA #1 29D7 STA &2B43 29DA LDA #&10 \# points for collecting first 29DC STA &2B39 \pebble= 10 in BCD. 29DF LDA #20 29E1 STA &2B4B \1st alien object prop index = 20 29E4 LDA #8 29E6 STA &2B14 \Pebbles to collect = 8. 29E9 LDX #0 29EB JSR &187F \Retrieve player props 29EE JSR &1758 \Print player 29F1 JSR &21E2 \Print aliens 29F4 JSR &2269 \Print "Get Ready" 29F7 JSR &1B58 \Plot stars 29FA LDA #2 29FC STA &2B11 29FF LDA #20 2A01 STA &2B0D \Alien object prop index = 20. 2A04 CLC 2A05 LDA &2B44 2A08 ADC #1 2A0A CMP #8 2A0C BNE &2A10 \stage=(stage+1)MOD8 2A0E LDA #0 2A10 STA &2B44 2A13 DEC &2B11 \Decrement aux.keys timer 2A16 LDA &2B11 \(Aux.keys not checked every time round) 2A19 BNE &2A79 \Not yet 0 2A1B LDA &2B15 2A1E STA &2B11 \Reset aux.timer 2A21 JSR &2100 \Check for picking up pebble 2A24 LDX #143 \INKEY-113 (ESCAPE) 2A26 JSR &171D \Was ESCAPE pressed? 2A29 BEQ &2A2E \No. 2A2B JMP &274D \Go back to start 2A2E LDX #150 \INKEY-106 (Copy) 2A30 JSR &171D \Was Copy pressed? 2A33 BEQ &2A3C \No. 2A35 LDX #166 \INKEY-90 (Delete) 2A37 JSR &171D \Was Delete pressed? 2A3A BEQ &2A35 \No - loop ie freeze until it has. 2A3C LDA &0500 \Player X 2A3F STA &2B2C 2A42 LDA &0501 \Player Y 2A45 STA &2B2B 2A48 JSR &1C96 \Animate shards if explosion happening 2A4B JSR &243A \Decrease oxygen 2A4E LDA &2B14 \Have all pebbles been collected? 2A51 BNE &2A6E \No. 2A53 JSR &22AC \Yes, next level routine. 2A56 JSR &2620 \Award bonuses. 2A59 CLC 2A5A LDA &2B0E 2A5D ADC #1 2A5F CMP #7 2A61 BNE &2A65 2A63 LDA #1 2A65 STA &2B0E \stage=(stage+1) MOD 7 2A68 JSR &2495 \Refill o2 tank 2A6B JMP &29C3 \and jump back to loop. 2A6E LDA &2B26 \Is player dead? 2A71 BEQ &2A79 \No. 2A73 JSR &2406 \Forfeit life, reset player coords. 2A76 JMP &2996 \Jump back to check if lost all lives etc. 2A79 DEC &2B3E 2A7C LDA &2B3E 2A7F BNE &2A8A 2A81 LDA &2B41 2A84 STA &2B3E 2A87 JSR &1B97 \Scroll stars 2A8A JSR &1C1E \Choose star's new X coordinate at top 2A8D DEC &2B12 \Decrement timer 2A90 LDA &2B12 2A93 BEQ &2A98 \If timer=0 move aliens 2A95 JMP &2A04 \Increment stage 2A98 LDA &2B3D 2A9B STA &2B12 \Reset timer 2A9E LDX &2B0D \Alien object prop index 2AA1 JSR &1961 \Animate aliens 2AA4 CLC 2AA5 LDA &2B0D 2AA8 ADC #20 \index to next alien 2AAA CMP &2B10 \Have we moved all aliens on screen? 2AAD BNE &2AB1 \No. 2AAF LDA #20 \Yes, loop back to 1st alien 2AB1 STA &2B0D 2AB4 JMP &2A04 \and loop until game finished. 2AB7 RTS 2AB8 ??? 2AB9 JMP &2A09 2ABC RTS \Filler bytes for rest of page &2A. 2ABD EQUB 0,0,0 2AC0 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 2B00 NOP \Player X coordinate 2B01 NOP \Player Y coordinate 2B02 NOP 2B03 NOP 2B04 NOP \Alien type 1-4 2B05 NOP \Position in hiscore table, see 1D57 2B06 NOP 2B07 NOP \Pebble #, see 1841 2B08 NOP 2B09 NOP \Initial object accelaration 2B0A NOP \Alien sprite 2B0B NOP \Frame speed 2B0C NOP \<>0 if holding pebble, =0 if not 2B0D NOP \Object property index, multiple of 20 2B0E NOP \Copy of stage # 2B0F NOP \Alien property index 2B10 NOP \Max object prop index value 2B11 NOP \Auxiliary keys (Escape,Copy,Delete) timer 2B12 NOP \# times player moves per alien move 2B13 NOP \Text colour =0 for black, <>0 for coloured text 2B14 NOP \# pebbles left to collect 2B15 NOP \Aux.keys timer initial value \Collision detection workspace 2B16 RTS \PlayerX 2B17 RTS \PlayerX+5 2B18 RTS \PlayerY 2B19 RTS \PlayerY+12 2B1A RTS \AlienX 2B1B RTS \AlienX+4 2B1C RTS \AlienY 2B1D RTS \AlienY+12 2B1E RTS \Collision value 2B1F NOP \=0 if player upright, <>0 upside down 2B20 NOP \=0 ignore keys, <>0 scan keys 2B21 NOP \Player see 211d,1B4F,20AD 2B22 NOP \Star X displacement see 1C1E 2B23 NOP \Lives 2B24 NOP \Star index 2B25 NOP \Star displacement, 1 or 2 2B26 NOP \Dead flag 2B27 NOP \Oxygen level, BCD 2B28 NOP 2B29 NOP \Pixel line within char cell 2B2A NOP \Oxygen level, binary 2B2B NOP \Copy of PlayerX 2B2C NOP \Copy of PlayerY 2B2D NOP \Shard property index 2B2E NOP 2B2F NOP \Text char colour (see 1E29) 2B30 NOP \see 2806 2B31 NOP \Explosion flag, =1 if in progress 2B32 NOP \Byte 0 of score (10s,units) 2B33 NOP \Byte 1 of score (100s,1000s) 2B34 NOP \Byte 2 of score (10000s) 2B35 NOP 2B36 NOP \Last byte of hiscore table entry 2B37 NOP \1st byte of hiscore table entry 2B38 NOP \ASCII code of key entered in hiscore table 2B39 NOP \Pebble weighting ie points given for pebble 2B3A NOP \Alien X direction 2B3B NOP \Alien Y direction 2B3C NOP \see 25DE,274F 2B3D NOP \Timer initial value, see 2A98 2B3E NOP \See 2A79,275D 2B3F NOP \Joystick flag, <>0 if in use 2B40 NOP \Stage # (1-6) 2B41 NOP \see 2A81 2B42 NOP \Pebble X coord when checking for pickup 2B43 NOP \=1 at 29D5, see 2691 2B44 NOP \See 2845,2A05,2697,2752 2B45 NOP \Text colour change period, see 2523 2B46 NOP \Demo flag, <>0 if in demo mode 2B47 NOP \Player dx in demo, see 2970 2B48 NOP \Player dy in demo 2B49 NOP \See 2914,297C 2B4A NOP \See 2139, =4 @ 2147, 1 @ 2765 2B4B NOP \=35 @ 29C3 \ Filler bytes for rest of page &2B 2B4C EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0 2B80 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 2BC0 EQUD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 \*** Sprite Data Addresses *** \Stored hi-lo 2C00 EQUB &2C,&1E \0 Player upright 2C02 EQUB &2C,&5C \1 Bricks 2C04 EQUB &2C,&7E \2 Pebble 2C06 EQUB &2C,&99 \3 Mr.Hat 2C08 EQUB &2C,&FD \4 Balloon 1 2C0A EQUB &2D,&2F \5 Balloon 2 2C0C EQUB &2D,&3D \6 Mr.Hat's eyes looking right 2C10 EQUB &2D,&4B \7 Mr.Hat's eyes looking left 2C12 EQUB &2D,&89 \8 Docking charater 2C14 EQUB &2D,&BB \9 Ball 1 2C16 EQUB &2D,&ED \10 Ball 2 2C18 EQUB &2E,&1F \11 Ball 3 2C1A EQUB &2E,&51 \12 Ball 4 2C1C EQUB &2E,&83 \13 Player upside-down \Each sprite comprises 2 bytes (columns, rows) \followed by the sprite data itself. \ *** Player upright *** 2C1E EQUB 5,12 2C20 EQUB &01,&03,&03,&03,&02 \0111111110 2C25 EQUB &03,&3F,&03,&3F,&03 \1177117711 2C2A EQUB &03,&3A,&03,&35,&03 \1174114711 2C2F EQUB &01,&3A,&03,&35,&02 \0174114710 2C34 EQUB &01,&03,&03,&03,&02 \0111111110 2C39 EQUB &00,&0F,&33,&0F,&00 \0033553300 2C3E EQUB &00,&1B,&03,&27,&00 \0035115300 2C43 EQUB &05,&0F,&33,&0F,&0A \0333553330 2C48 EQUB &0F,&0F,&0F,&0F,&0F \3333333333 2C4D EQUB &0F,&00,&00,&00,&0F \3300000033 2C52 EQUB &0F,&0A,&00,&05,&0F \3330000333 2C57 EQUB &05,&00,&00,&00,&0A \0300000030 \ *** Bricks *** 2C5C EQUB 4,8 2C5E EQUB &30,&30,&20,&30 \44444044 2C62 EQUB &30,&30,&20,&30 \44444044 2C66 EQUB &30,&30,&20,&30 \44444044 2C6A EQUB &00,&00,&00,&00 \00000000 2C6E EQUB &30,&10,&30,&30 \44044444 2C72 EQUB &30,&10,&30,&30 \44044444 2C76 EQUB &30,&10,&30,&30 \44044444 2C7A EQUB &00,&00,&00,&00 \00000000 \ *** Pebble *** 2C7E EQUB 5,5 2C80 EQUB &00,&14,&3C,&28,&00 \0006666000 2C85 EQUB &00,&3C,&3C,&3C,&00 \0066666600 2C8A EQUB &00,&3C,&3C,&3C,&00 \0066666600 2C8F EQUB &00,&3C,&3C,&3C,&00 \0066666600 2C94 EQUB &00,&14,&3C,&28,&00 \0006666000 \ *** Mr.Hat *** 2C99 EQUB 4,12 2C9B EQUB &00,&0C,&0C,&00 \00222200 2C9F EQUB &08,&0C,&0C,&04 \20222202 2CA3 EQUB &04,&0C,&0C,&08 \02222220 2CA7 EQUB &01,&03,&03,&02 \01111110 2CAB EQUB &02,&01,&02,&01 \10011001 2CAF EQUB &02,&01,&02,&01 \10011001 2CB3 EQUB &02,&01,&02,&01 \10011001 2CB7 EQUB &03,&07,&0B,&03 \11133111 2CBB EQUB &01,&03,&03,&02 \01111110 2CBF EQUB &00,&03,&03,&00 \00111100 2CC3 EQUB &05,&02,&01,&0A \03100130 2CC7 EQUB &0F,&0A,&05,&0F \33300333 \ *** Balloon 1 *** 2CCB EQUB 4,12 2CCD EQUB &00,&11,&22,&00 \00055000 2CD1 EQUB &00,&33,&33,&00 \00555500 2CD5 EQUB &11,&33,&33,&22 \05555550 2CD9 EQUB &33,&33,&33,&33 \55555555 2CDD EQUB &33,&33,&33,&33 \55555555 2CE1 EQUB &11,&33,&33,&22 \05555550 2CE5 EQUB &00,&37,&33,&00 \00575500 2CE9 EQUB &00,&11,&2A,&00 \00057000 2CED EQUB &00,&15,&00,&00 \00070000 2CF1 EQUB &00,&2A,&00,&00 \00700000 2CF5 EQUB &00,&15,&00,&00 \00070000 2CF9 EQUB &00,&00,&2A,&00 \00007000 \ *** Balloon 2 *** 2CFD EQUB 4,12 2CFF EQUB &00,&11,&22,&00 \00055000 2D03 EQUB &00,&33,&33,&00 \00555500 2D07 EQUB &11,&33,&33,&22 \05555550 2D0B EQUB &33,&33,&33,&33 \55555555 2D0F EQUB &33,&33,&33,&33 \55555555 2D13 EQUB &11,&33,&33,&22 \05555550 2D17 EQUB &00,&33,&3B,&00 \00557500 2D1B EQUB &00,&15,&22,&00 \00075000 2D1F EQUB &00,&00,&2A,&00 \00007000 2D23 EQUB &00,&00,&15,&00 \00000700 2D27 EQUB &00,&00,&2A,&00 \00007000 2D2B EQUB &00,&15,&00,&00 \00070000 \ *** Mr.Hat's Eyes Left *** 2D2F EQUB 4,3 2D31 EQUB &15,&2A,&15,&2A \07700770 2D35 EQUB &10,&2A,&10,&2A \04700470 2D39 EQUB &10,&2A,&10,&2A \04700470 \ *** Mr.Hat's Eyes Right *** 2C3D EQUB 4,3 2D3F EQUB &15,&2A,&15,&2A \07700770 2D43 EQUB &15,&20,&15,&20 \07400740 2D47 EQUB &15,&20,&15,&20 \07400740 \ *** Docking Character *** 2C4B EQUB 5,12 2D4D EQUB &00,&17,&03,&2B,&00 \0017117100 2D52 EQUB &00,&01,&3F,&02,&00 \0001771000 2D57 EQUB &00,&00,&03,&00,&00 \0000110000 2D5C EQUB &00,&10,&03,&20,&00 \0004114000 2D61 EQUB &00,&3A,&03,&35,&00 \0074114700 2D66 EQUB &15,&30,&03,&30,&2A \0744114470 2D6B EQUB &3F,&3F,&03,&3F,&3F \7777117777 2D70 EQUB &3F,&2A,&03,&15,&3F \7770110777 2D75 EQUB &3F,&2A,&03,&15,&3F \7770110777 2D7A EQUB &3F,&00,&03,&00,&3F \7700110077 2D7F EQUB &15,&01,&00,&02,&2A \0701001070 2D84 EQUB &15,&00,&00,&00,&2A \0700000070 \ *** Ball 1 *** 2D89 EQUB 4,12 2D8B EQUB &00,&30,&30,&00 \00444400 2D8F EQUB &01,&30,&30,&20 \01444440 2D93 EQUB &01,&30,&30,&20 \01444440 2D97 EQUB &03,&30,&24,&18 \11444224 2D9B EQUB &03,&30,&0C,&0C \11442222 2D9F EQUB &03,&12,&0C,&0C \11142222 2DA3 EQUB &03,&03,&0E,&0C \11113222 2DA7 EQUB &03,&03,&0F,&0C \11113322 2DAB EQUB &0B,&07,&0F,&0C \31133322 2DAF EQUB &05,&0F,&0F,&08 \03333320 2DB3 EQUB &05,&0F,&0F,&08 \03333320 2DB7 EQUB &00,&0F,&0F,&00 \00333300 \ *** Ball 2 *** 2DBB EQUB 4,12 2DBD EQUB &00,&03,&03,&00 \00111100 2DC1 EQUB &05,&03,&03,&02 \03111110 2DC5 EQUB &05,&03,&03,&02 \03111110 2DC9 EQUB &0F,&03,&12,&21 \33111441 2DCD EQUB &0F,&03,&30,&30 \33114444 2DD1 EQUB &0F,&0B,&30,&30 \33314444 2DD5 EQUB &0F,&0F,&18,&30 \33332444 2DD9 EQUB &0F,&0F,&0C,&30 \33332244 2DDD EQUB &0F,&0F,&0C,&30 \33332244 2DE1 EQUB &0D,&0E,&0C,&30 \23322244 2DE5 EQUB &04,&0C,&0C,&20 \02222240 2DE9 EQUB &00,&0C,&0C,&20 \00222240 \ *** Ball 3 *** 2BED EQUB 4,12 2DEF EQUB &00,&0F,&0F,&00 \00333300 2DF3 EQUB &04,&0F,&0F,&0A \02333330 2DF7 EQUB &04,&0F,&0F,&0A \02333330 2DFB EQUB &0C,&0F,&0B,&07 \22333113 2DFF EQUB &0C,&0F,&03,&03 \22331111 2E03 EQUB &0C,&0D,&03,&03 \22231111 2E07 EQUB &0C,&0C,&21,&03 \22224111 2E0B EQUB &0C,&0C,&30,&03 \22224411 2E0F EQUB &24,&18,&30,&03 \42244411 2E13 EQUB &10,&30,&30,&02 \04444410 2E17 EQUB &10,&30,&30,&02 \04444410 2E1B EQUB &00,&30,&30,&00 \00444400 \ *** Ball 4 *** 2B1f EQUB 4,12 2E21 EQUB &00,&0C,&0C,&00 \00222200 2E25 EQUB &10,&0C,&0C,&08 \04222220 2E29 EQUB &10,&0C,&0C,&08 \04222220 2E2D EQUB &30,&0C,&0D,&0E \44222332 2E31 EQUB &30,&0C,&0F,&0F \44223333 2E35 EQUB &30,&24,&0F,&0F \44423333 2E39 EQUB &30,&30,&07,&0F \44441333 2E3D EQUB &30,&30,&03,&0F \44441133 2E41 EQUB &12,&21,&03,&0F \14411133 2E45 EQUB &01,&03,&03,&0A \01111130 2E49 EQUB &01,&03,&03,&0A \01111130 2E4D EQUB &00,&03,&03,&00 \00111100 \ *** Bird *** 2E51 EQUB 4,12 2E53 EQUB &80,&00,&00,&40 \80000008 2E57 EQUB &80,&00,&00,&40 \80000008 2E5B EQUB &C0,&00,&00,&C0 \88000088 2E5F EQUB &C0,&01,&02,&C0 \88011088 2E63 EQUB &40,&0B,&07,&80 \08311380 2E67 EQUB &01,&0B,&07,&02 \01311310 2E6B EQUB &55,&03,&03,&AA \0F1111F0 2E6F EQUB &FF,&07,&0B,&FF \FF1331FF 2E73 EQUB &FF,&01,&02,&FF \FF0110FF 2E77 EQUB &AA,&00,&00,&55 \F000000F 2E7B EQUB &AA,&00,&00,&55 \F000000F 2E7F EQUB &00,&00,&00,&00 \00000000 \ *** Player Upside-Down *** 2E83 EQUB 5,12 2E85 EQUB &05,&00,&00,&00,&0A \0300000030 2E8A EQUB &0F,&0A,&00,&05,&0F \3330000333 2E8F EQUB &0F,&00,&00,&00,&0F \3300000033 2E94 EQUB &0F,&0F,&0F,&0F,&0F \3333333333 2E99 EQUB &05,&0F,&33,&0F,&0A \0333553330 2E9E EQUB &00,&1B,&03,&27,&00 \0035115300 2EA3 EQUB &00,&0F,&33,&0F,&00 \0033553300 2EA8 EQUB &01,&03,&03,&03,&02 \0111111110 2EAD EQUB &01,&3F,&03,&3A,&02 \0177117410 2EB2 EQUB &03,&35,&03,&3A,&03 \1147117411 2EB7 EQUB &03,&35,&03,&3F,&03 \1147117711 2EBC EQUB &01,&03,&03,&03,&02 \0111111110