/* * This work was originally done by Fred Taft (fred@hp-pcd.cv.hp.com). * Please forward any comments, corrections or additions back to Fred. * * Star Castle */ .org 0x0000; 0000 67 .byte "g GCE 1983",0x80; 000B 0D .word star_castle_music; 000D F8 .byte 0xF8; /* height */ 000E 50 .byte 0x50; /* width */ 000F 00 .byte 0x00; /* rel y */ 0010 B0 .byte 0xB0; /* rel x */ 0011 53 .byte "STAR CASTLE",0x80,0x00; star_castle: 001E 7DC83B tst $C83B; /* The following block of code is */ 0021 2724 beq restart_game;/* called only the first time the */ 0023 BDF1AA jsr $dptoD0; /* game is powered up, and only if*/ 0026 BDF1BA jsr $read_switches2; /* buttons 1,2 & 4 are all*/ 0029 B6C80F lda $C80F; /* simultaneously pressed. This */ 002C 810B cmpa #0x0B; /* code will display the name of the */ 002E 2617 bne restart_game;/* programmer, until either the*/ 0030 CCFB40 ldd #0xFB40; /* counter at C88A decrements to 0*/ 0033 FDC82A std $C82A; /* or the buttons are no longer */ 0036 CE0FA4 P0036: ldu #author; /* pressed. */ 0039 BDF38A jsr $printu2; 003C BDF192 jsr $waitrecal; 003F BDF2A5 jsr $intensity_to_5F; 0042 7AC88A dec $C88A; 0045 26EF bne P0036; /* * Initialize variables, and set the users score string * to its default values. */ restart_game: 0047 8EC880 ldx #0xC880; /* Initialize RAM area. / 004A BDF545 jsr $clear_256_bytes; 004D BDF1AF jsr $dptoC8; 0050 8605 lda #0x05; /* Set player 1's ship count. */ 0052 979D sta 0x9D; 0054 8EC8B0 ldx #0xC8B0; /* Init player 1's score string. */ 0057 BDF84F jsr $set_dft_score; 005A 8EC8D0 ldx #0xC8D0; /* Init player 2's score string. */ 005D BDF84F jsr $set_dft_score; /* Fill in the user's data area to its initial values. */ 0060 8EC8CC ldx #0xC8CC; /* Address of user 2's data area. */ 0063 8680 lda #0x80; 0065 A71D sta -3,x; /* Set player 2 state to "inactive". */ 0067 CCE090 ldd #0xE090; 006A ED13 std -13,x; /* Set initial (y,x) location. */ 006C 8630 lda #0x30; 006E A710 sta -16,x; /* Set initial cruiser rotation. */ 0070 8EC8AC ldx #0xC8AC; /* Address of user 1's data area. */ 0073 CC1070 ldd #0x1070; 0076 ED13 std -13,x; /* Set initial (y,x) location. */ 0078 8610 lda #0x10; 007A A710 sta -16,x; /* Set initial cruiser rotation. */ /* Ask user for the game #, and number of players. */ 007C CC0060 ldd #0x0060; /* Set initial ring rotation deltas. */ 007F FDC930 std $C930; 0082 CC0202 ldd #0x0202; /*At first, allow 2 games & 2 players.*/ 0085 0F91 clr 0x91; 0087 DD92 std 0x92; 0089 BDF7A9 jsr $get_players_game; 008C 047A lsr 0x7A; /* Check which game was selected. */ 008E 2503 blo P0093; 0090 74C931 P0090: lsr $C931; /* Game 2;use slower rotation deltas. */ 0093 0F7A P0093: clr 0x7A; 0095 0479 lsr 0x79; /* If 2 players were selected, then */ 0097 2715 beq P00AE; /* allow the user to select one of 3*/ 0099 8605 lda #0x05; /* 2 person games. */ 009B 97BD sta 0xBD; /* Init ship count for player 2. */ 009D CC0003 ldd #0x0003; /* Allow 3 games. */ 00A0 BDF7A9 jsr $get_players_game; 00A3 0C79 inc 0x79; 00A5 0A7A dec 0x7A; /* Determine if 2 person, simultaneous */ 00A7 967A lda 0x7A; /* play was chosen; i.e. if game 3 was */ 00A9 44 lsra; /* selected. */ 00AA 2702 beq P00AE; 00AC 0FC9 clr 0xC9; /* Flag simultaneous play. */ 00AE 0C24 P00AE: inc 0x24; 00B0 CCC9C8 ldd #0xC9C8; /* Address of player 1 bullet buffer. */ 00B3 DDAC std 0xAC; 00B5 CCC9F4 ldd #0xC9F4; /* Address of player 2 bullet buffer. */ 00B8 DDAE std 0xAE; 00BA DDCC std 0xCC; 00BC CCCA20 ldd #0xCA20; 00BF DDCE std 0xCE; 00C1 0A8F dec 0x8F; /* Backup both players info data areas.*/ 00C3 BD0BD1 jsr $change_player; 00C6 0A8F dec 0x8F; 00C8 FCCA62 ldd $CA62; 00CB FDC930 std $C930; 00CE BD0BD1 jsr $change_player; 00D1 0FE1 clr 0xE1; 00D3 BDF192 P00D3: jsr $waitrecal; 00D6 BDF289 jsr $do_sound; 00D9 8688 lda #0x88; /* Set the button mask required */ 00DB F6C88D ldb $C88D; /* by the read_switches routine.*/ 00DE 2701 beq P00E1; 00E0 43 coma; 00E1 BDF1B4 P00E1: jsr $read_switches; 00E4 BDF1F8 jsr $read_jstick; 00E7 BDF2A1 jsr $intensity_to_3F; 00EA B6C88D lda $C88D; /* Check if the game is over. */ 00ED 10260397 lbne P0488; /* * If player 1 is still alive, then transform his star * cruiser, and draw it. */ 00F1 108EC8AC ldy #0xC8AC; 00F5 A63D lda -3,y; /* Check if player 1 is alive. */ 00F7 2B1B bmi P0114; 00F9 A630 lda -16,y; /* Get cruiser's rotation value. */ 00FB C608 ldb #0x08; /* Load the number of points (9).*/ 00FD 8E0E1F ldx #star_cruiser1; /* Addr of cruiser 1's V list.*/ 0100 CEC932 ldu #0xC932; /* Addr of transformation buffer.*/ 0103 BDF610 jsr $rotate_vector_list2; 0106 EC33 ldd -13,y; /* Location of player 1's cruiser.*/ 0108 BDF2FC jsr $move_pen7F_to_d; 010B CC080D ldd #0x080D; /* (number of pts, scale factor).*/ 010E 8EC932 ldx #0xC932; 0111 BDF3B7 jsr $move_then_draw_VL_with_count4; /* * If player 2 is still alive, then transform his star * cruiser, and draw it. */ 0114 108EC8CC P0114: ldy #0xC8CC; 0118 A63D lda -3,y; /* Check if player 2 is alive. */ 011A 2B1B bmi P0137; 011C A630 lda -16,y; /* Get cruiser's rotation value. */ 011E C60A ldb #0x0A; /* Load the number of points (11).*/ 0120 8E0E31 ldx #star_cruiser2; /* Addr of cruiser 2's V list.*/ 0123 CEC932 ldu #0xC932; /* Addr of transformation buffer.*/ 0126 BDF610 jsr $rotate_vector_list2; 0129 EC33 ldd -13,y; /* Location of player 2's cruiser.*/ 012B BDF2FC jsr $move_pen7F_to_d; 012E CC0A0D ldd #0x0A0D; /* (number of pts, scale factor).*/ 0131 8EC932 ldx #0xC932; 0134 BDF3B7 jsr $move_then_draw_VL_with_count4; /* Update the position of all active bullets. */ 0137 BDF2A9 P0137: jsr $intensity_to_7F; 013A 8EC9C8 ldx #0xC9C8; /* Address of bullet buffer. */ 013D E600 P013D: ldb 0,x; /* Check if bullet is active. */ 013F 274F beq P0190; /* Bullet is inactive, so skip. */ 0141 2A26 bpl P0169; /* Bullet is exploding. */ 0143 6A09 dec 9,x; /* Decrement life span, and continue */ 0145 2747 beq P018E; /* only if bullet is still 'alive'. */ 0147 EC05 ldd 5,x; /* Get original y position. */ 0149 1E89 exg a,b; 014B E301 addd 1,x; /* Add the delta to it. */ 014D 1E89 exg a,b; 014F ED05 std 5,x; /* Update bullet's y position. */ 0151 EC07 ldd 7,x; /* Get original x position. */ 0153 E303 addd 3,x; /* Add the delta to it. */ 0155 ED07 std 7,x; /* Update bullet's x position. */ 0157 3410 pshs x; 0159 3006 leax 6,x; /* Draw a dot at the bullet's new */ 015B 867F lda #0x7F; /* position. */ 015D 9704 sta 0x04; 015F BDF2C1 jsr $dotix; 0162 BDF354 jsr $reset0ref; 0165 3510 puls x; 0167 2027 bra P0190; /* Bullet is exploding; so draw an explosion pattern */ 0169 EC06 P0169: ldd 6,x; /* Move to bullets position. */ 016B BDF2FC jsr $move_pen7F_to_d; 016E E60A ldb 10,x; 0170 CB25 addb #0x25; /* Increment the explosion scale */ 0172 E70A stb 10,x; /* factor. */ 0174 2515 blo P018B; 0176 2A01 bpl P0179; 0178 50 negb; 0179 54 P0179: lsrb; /* Use the upper nibble of this */ 017A 54 lsrb; /* value as the scale factor. */ 017B 54 lsrb; 017C 54 lsrb; 017D D704 stb 0x04; 017F 3410 pshs x; 0181 8E0F55 ldx #explosion_star; 0184 BDF46E jsr $drawl2; /* Draw the explosion pattern. */ 0187 3510 puls x; 0189 2005 bra P0190; 018B BDF354 P018B: jsr $reset0ref; 018E 6F00 P018E: clr 0,x; /* Flag that bullet is now inactive. */ 0190 300B P0190: leax 11,x; /* Advance ptr to next bullet, and */ 0192 8CCA20 cmpx #0xCA20; /* continue, if not at end of buffer.*/ 0195 26A6 bne P013D; /* Transform and draw the energy cannon */ 0197 B6C88E lda $C88E; /* Skip next block if energy cannon */ 019A 2628 bne P01C4; /* has exploded, or a new screen is */ 019C B6C88F lda $C88F; /* being set up. */ 019F 102600B4 lbne P0257; 01A3 BDF2A1 jsr $intensity_to_3F; 01A6 B6C8DE lda $C8DE; /* Transform the energy cannon's */ 01A9 C60C ldb #0x0C; /* vector list. */ 01AB 8E0E47 ldx #energy_cannon; 01AE CEC932 ldu #0xC932; 01B1 BDF610 jsr $rotate_vector_list2; 01B4 86CE lda #0xCE; 01B6 970C sta 0x0C; 01B8 CC0C0E ldd #0x0C0E; /* Move to the origin, and then draw */ 01BB 8EC932 ldx #0xC932; /* the transformed energy cannon.*/ 01BE BDF3B7 jsr $move_then_draw_VL_with_count4; 01C1 7E0257 jmp $P0257; /* Draw the energy cannon exploding */ 01C4 8501 P01C4: bita #0x01; 01C6 2724 beq P01EC; 01C8 86CE lda #0xCE; 01CA 970C sta 0x0C; 01CC F6C8DD ldb $C8DD; /* Increment the scale factor used */ 01CF CB19 addb #0x19; /* when drawing the explosion pattern.*/ 01D1 F7C8DD stb $C8DD; 01D4 250D blo P01E3; 01D6 2A01 bpl P01D9; 01D8 50 negb; 01D9 D704 P01D9: stb 0x04; 01DB 8E0F55 ldx #explosion_star; 01DE BDF46E jsr $drawl2; /* Draw the explosion pattern. */ 01E1 2074 bra P0257; /* Flag that the explosion is over */ 01E3 7FC8DD P01E3: clr $C8DD; 01E6 78C88E asl $C88E; 01E9 BDF354 jsr $reset0ref; /* Collapse the 3 walls inward */ 01EC 8EC8F3 P01EC: ldx #0xC8F3; 01EF 7FC882 clr $C882; 01F2 A684 P01F2: lda ,x; /* When a rings scale factor reaches */ 01F4 8104 cmpa #0x04; /* 4, flag that the ring has completely*/ 01F6 221A bhi P0212; /* collapsed, by incrementing C882. */ 01F8 7CC882 inc $C882; 01FB 8104 cmpa #0x04; 01FD 261A bne P0219; 01FF 3410 pshs x; /* Now clear all the patterns for this */ 0201 3002 leax 2,x; /* ring, so it will disappear. */ 0203 C607 ldb #0x07; 0205 BDF53F jsr $clear_blockxb; 0208 30881E leax 0x1E,x; 020B C607 ldb #0x07; 020D BDF53F jsr $clear_blockxb; 0210 3510 puls x; 0212 33881E P0212: leau 0x1E,x; /* Decrement the scale factor used */ 0215 6AC4 dec ,u; /* to draw this ring. */ 0217 6A84 dec ,x; 0219 300A P0219: leax 10,x; /* Go onto the next ring. */ 021B 8CC908 cmpx #0xC908; 021E 25D2 blo P01F2; /* See if all 3 rings have finally collapsed inward */ 0220 B6C882 lda $C882; /* If all 3 rings have collapsed, */ 0223 8103 cmpa #0x03; /* then force an explosion sound, */ 0225 2630 bne P0257; /* and have another explosion */ 0227 B6C877 lda $C877; /* pattern displayed. */ 022A 2708 beq P0234; 022C B6C890 lda $C890; 022F 8A80 ora #0x80; 0231 B7C890 sta $C890; 0234 F6C8DD P0234: ldb $C8DD; /* Calculate the scale factor to use */ 0237 CB0A addb #0x0A; /* when drawing the explosion pattern.*/ 0239 F7C8DD stb $C8DD; 023C 2513 blo P0251; 023E D704 stb 0x04; 0240 86CE lda #0xCE; 0242 970C sta 0x0C; 0244 860E lda #0x0E; 0246 B7C823 sta $C823; 0249 8E0F86 ldx #explosion_dots; 024C BDF2D5 jsr $dot_list; /* Draw the explosion pattern. */ 024F 2006 bra P0257; /* Flag that the level was cleared */ 0251 7FC88E P0251: clr $C88E; 0254 7AC88F dec $C88F; /* Process the fireball, if active */ 0257 BDF2A1 P0257: jsr $intensity_to_3F; 025A B6C8E1 lda $C8E1; 025D 10270076 lbeq P02D7; /* Fireball not active. */ 0261 2A39 bpl P029C; /* Fireball exploding. */ 0263 B6C890 lda $C890; /* Fireball moving. */ 0266 8A40 ora #0x40; 0268 B7C890 sta $C890; /* Force a fireball sound. */ 026B FCC8E6 ldd $C8E6; 026E 1E89 exg a,b; /* Update y position of fireball, */ 0270 F3C8E2 addd $C8E2; /* and check to see if it went off*/ 0273 295F bvs P02D4; /* the screen. */ 0275 1E89 exg a,b; 0277 FDC8E6 std $C8E6; 027A FCC8E8 ldd $C8E8; /* Update x position of fireball, */ 027D F3C8E4 addd $C8E4; /* and check to see if it went off*/ 0280 2952 bvs P02D4; /* the screen. */ 0282 FDC8E8 std $C8E8; 0285 FCC8E7 ldd $C8E7; /* Move to fireball's position. */ 0288 BDF2FC jsr $move_pen7F_to_d; 028B 8608 lda #0x08; 028D F6C8E0 ldb $C8E0; /* Draw the fireball. */ 0290 54 lsrb; 0291 8E0E61 ldx #fireball; 0294 BDF3B7 jsr $move_then_draw_VL_with_count4; 0297 7CC8E0 inc $C8E0; /* Increment the scale factor. */ 029A 203B bra P02D7; /* Process the exploding firebal */ 029C FCC8E7 P029C: ldd $C8E7; /* Move to fireball's position. */ 029F BDF2FC jsr $move_pen7F_to_d; 02A2 F6C8EA ldb $C8EA; 02A5 CB14 addb #0x14; /* Increment explosion's scale factor.*/ 02A7 F7C8EA stb $C8EA; 02AA 2512 blo P02BE; 02AC 54 lsrb; 02AD 54 lsrb; 02AE 54 lsrb; 02AF D704 stb 0x04; /* Set scale factor. */ 02B1 860E lda #0x0E; 02B3 B7C823 sta $C823; 02B6 8E0F86 ldx #explosion_dots; 02B9 BDF2D5 jsr $dot_list; /* Draw the explostion pattern. */ 02BC 2019 bra P02D7; /* Clean up after the fireball explosion has finished */ 02BE BDF354 P02BE: jsr $reset0ref; 02C1 7FC8EA clr $C8EA; /* Clear explosion scale factor.*/ 02C4 B6C89D lda $C89D; /* If both player 1 & 2 are out */ 02C7 BAC8BD ora $C8BD; /* of cruisers, then set the */ 02CA 2605 bne P02D1; /* 'game over' flag (C88D). */ 02CC 7AC88D dec $C88D; 02CF 2003 bra P02D4; /* Get ready for the next player */ 02D1 BD0382 P02D1: jsr $P0382; 02D4 7FC8E1 P02D4: clr $C8E1; /* Disable the fireball. */ /* Transform the 3 rotating rings */ 02D7 C608 P02D7: ldb #0x08; /* Number of vectors (9). */ 02D9 B6C8ED lda $C8ED; /* Ring 1's rotation value. */ 02DC 8E0F33 ldx #ring; /* Ptr to ring vector list. */ 02DF CEC932 ldu #0xC932; /* Ptr to xformation buffer.*/ 02E2 BDF610 jsr $rotate_vector_list2; 02E5 C608 ldb #0x08; /* Number of vectors (9). */ 02E7 B6C8EF lda $C8EF; /* Ring 2's rotation value. */ 02EA 8E0F33 ldx #ring; /* Ptr to ring vector list. */ 02ED BDF610 jsr $rotate_vector_list2; 02F0 C608 ldb #0x08; /* Number of vectors (9). */ 02F2 B6C8F1 lda $C8F1; /* Ring 3's rotation value. */ 02F5 8E0F33 ldx #ring; /* Ptr to ring vector list. */ 02F8 BDF610 jsr $rotate_vector_list2; /* Draw the 3 rotating rings */ 02FB CEC8F3 ldu #0xC8F3; /* Ptr to scales & line patterns. */ 02FE 8EC932 ldx #0xC932; /* Ptr to transformation buffer. */ 0301 BD0C4C jsr $draw_1_ring; /* Draw ring 1. */ 0304 BD0C4C jsr $draw_1_ring; /* Draw ring 2. */ 0307 BD0C4C jsr $draw_1_ring; /* Draw ring 3. */ 030A BDF2A9 jsr $intensity_to_7F; 030D 8EC932 ldx #0xC932; /* Hi-lite rings hit with 1 bullet. */ 0310 BD0C4C jsr $draw_1_ring; /* Draw ring 1. */ 0313 BD0C4C jsr $draw_1_ring; /* Draw ring 2. */ 0316 BD0C4C jsr $draw_1_ring; /* Draw ring 3. */ 0319 BDF2A1 jsr $intensity_to_3F; /* START OF ENERGY BOMB PROCESSING LOOP */ /* Process energy bombs */ 031C CEC978 ldu #0xC978; /* Addr of energy bomb buffer. */ 031F BDF517 P031F: jsr $get_random_a; 0322 8407 anda #0x07; /* Randomly select 1 of 8 vector */ 0324 8E0E73 ldx #energy_bomb_VL_table; 0327 48 asla; /* lists to be used when drawing */ 0328 AE86 ldx a,x; /* this energy bomb. */ 032A A65D lda -3,u; /* See if we should draw energy bomb */ 032C 8540 bita #0x40; /* or an explosion pattern. */ 032E 2616 bne P0346; 0330 4D tsta; 0331 102B00D5 lbmi P040A; /* Energy bomb is not in use. */ 0335 8117 cmpa #0x17; 0337 235E bls P0397; /* Energy bomb is still on a ring. */ /* Energy bomb is moving; draw its vector list */ 0339 EC53 ldd -13,u; /* Move to position of energy bomb. */ 033B BDF2FC jsr $move_pen7F_to_d; 033E C60B ldb #0x0B; 0340 BDF40E jsr $drawl1b; /* Draw the energy bomb. */ 0343 7E040A jmp $P040A; /* Draw an explosion pattern at position of energy bomb */ 0346 EC53 P0346: ldd -13,u; /* Move to position of energy bomb. */ 0348 BDF2FC jsr $move_pen7F_to_d; 034B E65E ldb -2,u; 034D CB14 addb #0x14; /* Increment explosion scale factor */ 034F E75E stb -2,u; /* and stop when it overflows. */ 0351 2513 blo P0366; 0353 54 lsrb; 0354 54 lsrb; 0355 54 lsrb; 0356 D704 stb 0x04; /* Set the scale factor. */ 0358 860E lda #0x0E; 035A B7C823 sta $C823; /* Number of dots to draw. */ 035D 8E0F86 ldx #explosion_dots; 0360 BDF2D5 jsr $dot_list; /* Draw the explosion dots. */ 0363 7E040A jmp $P040A; /* Clean up after an energy bomb explosion */ 0366 BDF354 P0366: jsr $reset0ref; 0369 6F5E clr -2,u; 036B 8680 lda #0x80; /* Flag that this slot is no longer */ 036D A75D sta -3,u; /* in use. */ 036F B6C89D lda $C89D; 0372 BAC8BD ora $C8BD; /* See if either player has any */ 0375 2606 bne P037D; /* cruisers left. */ 0377 7AC88D dec $C88D; 037A 7E040A jmp $P040A; /* Flag that game is over. */ /* See if "PLAYER X" string needs to be displayed */ 037D 8E0394 P037D: ldx #P0394; 0380 3410 P0380: pshs x; 0382 B6C879 P0382: lda $C879; /* If a 2 person, non-simultaneous */ 0385 270C beq P0393; /* game is being played, then force*/ 0387 B6C87A lda $C87A; /* the "PLAYER X" string to be shown by*/ 038A 44 lsra; /* setting the 'change player' counter*/ 038B 2606 bne P0393; 038D 7FC88B clr $C88B; /* Set 'change player' loop counter. */ 0390 7AC88B dec $C88B; 0393 39 P0393: rts; 0394 7E040A P0394: jmp $P040A; /* Draw the energy bomb on one of the rings */ 0397 7FC824 P0397: clr $C824; /* Temporarily disable reset of 0ref. */ 039A BFC880 stx $C880; /* Save pointer to vector list. */ 039D C6CE ldb #0xCE; 039F D70C stb 0x0C; 03A1 108EC8F3 ldy #0xC8F3; /* Addr of ring line patterns. */ 03A5 8EC932 ldx #0xC932; /* Addr of xformed ring vectors.*/ 03A8 44 lsra; 03A9 44 lsra; /* Use lower 4 bits of the bomb state */ 03AA 44 lsra; /* to determine which ring the bomb */ 03AB B7C885 sta $C885; /* is on, & then point 'y' to the */ 03AE 2708 P03AE: beq P03B8; /* patterns for the ring, and 'x' */ 03B0 312A leay 10,y; /* to the vector list for the ring.*/ 03B2 308812 leax 0x12,x; 03B5 4A deca; 03B6 20F6 bra P03AE; 03B8 A6A4 P03B8: lda ,y; /* Use the ring's scale factor. */ 03BA 9704 sta 0x04; 03BC B7C882 sta $C882; 03BF A65D lda -3,u; /* Determine which ring section to */ 03C1 8407 anda #0x07; /* put the energy bomb on. */ 03C3 B7C883 sta $C883; 03C6 B7C884 sta $C884; 03C9 BDF3BC P03C9: jsr $move_to_pt; 03CC 7AC883 dec $C883; /* Move to starting point for section.*/ 03CF 2CF8 bge P03C9; 03D1 B6C882 lda $C882; 03D4 44 lsra; 03D5 9704 sta 0x04; /* Now, move to center of section. */ 03D7 BDF3BC jsr $move_to_pt; 03DA BEC880 ldx $C880; 03DD 7CC824 inc $C824; /* Draw the energy bomb here. */ 03E0 C60B ldb #0x0B; 03E2 BDF40E jsr $drawl1b; 03E5 8EC8ED ldx #0xC8ED; 03E8 B6C885 lda $C885; 03EB 4A P03EB: deca; /* Now, determine what the (y,x) */ 03EC 2D04 blt P03F2; /* position is of this energy bomb. */ 03EE 3002 leax 2,x; 03F0 20F9 bra P03EB; 03F2 E684 P03F2: ldb ,x; 03F4 86C8 lda #0xC8; 03F6 1F8B tfr a,dp; 03F8 9684 lda 0x84; 03FA CB08 P03FA: addb #0x08; 03FC 4A deca; 03FD 2CFB bge P03FA; 03FF 9682 lda 0x82; 0401 BDF5FF jsr $convert_abs_angle_to_rise_run; 0404 ED53 P0404: std -13,u; /* Save the calculated position. */ 0406 86D0 lda #0xD0; 0408 1F8B tfr a,dp; 040A 33C820 P040A: leau 0x20,u; /* Process the next energy bomb */ 040D 1183C9B8 cmpu #0xC9B8; /* entry, until no more left. */ 0411 1023FF0A lbls P031F; /* END OF THE ENERGY BOMB PROCESSING LOOP */ 0415 BDF2A9 jsr $intensity_to_7F; 0418 B6C88C lda $C88C; 041B 272A beq P0447; 041D 81FF cmpa #0xFF; 041F 2600 bne P0421; /* Display "GAME OVER PLAYER 1/2" */ 0421 CCF950 P0421: ldd #0xF950; /* Set height & width of string. */ 0424 FDC82A std $C82A; 0427 CE0FD4 ldu #game_over; 042A BDF378 jsr $print_with_dft_hw; 042D CE0FE0 ldu #player1; 0430 8EC8AC ldx #0xC8AC; /* Determine if player 1 or 2. */ 0433 A611 lda -15,x; 0435 2703 beq P043A; 0437 CE0FEB ldu #player2; 043A BDF378 P043A: jsr $print_with_dft_hw; 043D 7AC88C dec $C88C; 0440 10260083 lbne display_scores; 0444 160080 lbra display_scores; /* Prepare for the next player to start playing */ 0447 B6C88E P0447: lda $C88E; /* Skip if energy cannon exploding. */ 044A 267B bne display_scores; 044C B6C88B lda $C88B; /* Display "PLAYER X" only if (while) */ 044F 2776 beq display_scores; /* loop counter != 0. */ 0451 81FF cmpa #0xFF; 0453 2615 bne P046A; 0455 BD0BD1 jsr $change_player; /* Backup dead players info. */ 0458 8EC8AC ldx #0xC8AC; 045B B6C8DC lda $C8DC; /* Get pointer to data area for */ 045E 2703 beq P0463; /* the next player. */ 0460 8EC8CC ldx #0xC8CC; 0463 A611 P0463: lda -15,x; /* If new player has no ships, then go */ 0465 2E03 bgt P046A; /* back to the user who just died. */ 0467 BD0BD1 jsr $change_player; 046A CCF950 P046A: ldd #0xF950; 046D FDC82A std $C82A; /* Display "PLAYER X" string. */ 0470 CE0FE0 ldu #player1; 0473 B6C8DC lda $C8DC; 0476 2703 beq P047B; 0478 CE0FEB ldu #player2; 047B BDF378 P047B: jsr $print_with_dft_hw; 047E 7AC88B dec $C88B; 0481 2744 beq display_scores; /* Decr the 'change player' */ 0483 7AC88B dec $C88B; /* counter. Stop displaying "PLAYER X"*/ 0486 203F bra display_scores; /* string when it decrs to 0. */ /* Display "GAME OVER" & see if user wants a new game */ 0488 BDF2A9 P0488: jsr $intensity_to_7F; 048B CCF950 ldd #0xF950; /* Set height & width of string. */ 048E FDC82A std $C82A; 0491 CE0FD6 ldu #game_over2; 0494 CC00D0 ldd #0x00D0; /* Position for displaying string. */ 0497 BDF2FC jsr $move_pen7F_to_d; 049A BDF495 jsr $display_string; 049D B6C879 lda $C879; /* Force both players scores to */ 04A0 2705 beq P04A7; /* be displayed. */ 04A2 8602 lda #0x02; 04A4 B7C87A sta $C87A; 04A7 7AC88A P04A7: dec $C88A; 04AA 260D bne P04B9; 04AC 7CC88A inc $C88A; 04AF B6C811 lda $C811; /* Restart new game if either button */ 04B2 8477 anda #0x77; /* 1, 2 or 3 is pressed on either */ 04B4 2703 beq P04B9; /* console. */ 04B6 7E0047 jmp $restart_game; /* If a new game is not eventually started, go to OS ROM */ 04B9 B6C826 P04B9: lda $C826; 04BC 44 lsra; /* Everyother pass thru loop */ 04BD 2408 bhs display_scores; /* decr counter; if it goes */ 04BF 7AC88D dec $C88D; /* to 0, then pass control */ 04C2 2603 bne display_scores; /* back to OS ROM. */ 04C4 7EF000 jmp $start_of_OS_ROM; /* Display the individual or simultaneous player scores */ display_scores: 04C7 CCFC47 ldd #0xFC47; /* Set height & width of string. */ 04CA FDC82A std $C82A; 04CD B6C879 lda $C879; /* Determine if both player's scores */ 04D0 2735 beq display_player1_score; /* are to be displayed */ 04D2 B6C87A lda $C87A; /* (simul play) or if only a single */ 04D5 44 lsra; /* players score is to be displayed. */ 04D6 2605 bne display_player2_score; 04D8 B6C8DC lda $C8DC; /* C8DC says who's turn it is. */ 04DB 272A beq display_player1_score; /* Display player 2's score */ display_player2_score: 04DD CC7F80 ldd #0x7F80; /* Position of score string. */ 04E0 BDF2FC jsr $move_pen7F_to_d; 04E3 CEC8D0 ldu #0xC8D0; /* Addr of player 2's score string. */ 04E6 BDF495 jsr $display_string; /* Display player 2's ship count */ 04E9 BD0C0F jsr $init_ship_count_buffer; 04EC B6C8BD lda $C8BD; /* Get the ship count. */ 04EF BD0C20 jsr $fill_ship_count_buffer; 04F2 CEC932 ldu #0xC932; /* Addr of ship count buffer. */ 04F5 CCFD30 ldd #0xFD30; /* Height & width to use. */ 04F8 FDC82A std $C82A; 04FB CC6F90 ldd #0x6F90; /* Position for displaying. */ 04FE BDF37A jsr $print_at_d; 0501 B6C87A lda $C87A; /* Display player 1's score only if */ 0504 44 lsra; /* game is over, or simultaneous play.*/ 0505 272A beq P0531; /* Display player 1's score */ display_player1_score: 0507 CC7F20 ldd #0x7F20; /* Position for displaying. */ 050A BDF2FC jsr $move_pen7F_to_d; 050D CEC8B0 ldu #0xC8B0; /* Addr of player 1's score string. */ 0510 CCFC47 ldd #0xFC47; /* Height & width to use. */ 0513 FDC82A std $C82A; 0516 BDF495 jsr $display_string; /* Display player 1's ship count */ 0519 BD0C0F jsr $init_ship_count_buffer; 051C B6C89D lda $C89D; /* Get the ship count. */ 051F BD0C20 jsr $fill_ship_count_buffer; 0522 CEC932 ldu #0xC932; /* Addr of ship count buffer. */ 0525 CCFD30 ldd #0xFD30; /* Height & width to use. */ 0528 FDC82A std $C82A; 052B CC6F20 ldd #0x6F20; /* Position for displaying. */ 052E BDF37A jsr $print_at_d; /* Make game sounds */ 0531 BDF1AF P0531: jsr $dptoC8; 0534 BD0C88 jsr $make_game_sounds; /* Don't process joystick or buttons if game is over */ 0537 968D lda 0x8D; 0539 1026FB96 lbne P00D3; /* Read joystick and buttons, for player 1 */ 053D CEC8AC ldu #0xC8AC; 0540 9611 lda 0x11; /* Get console 1 button states. */ 0542 D61B ldb 0x1B; /* Get joystick 1 state. */ 0544 2708 beq P054E; 0546 2B04 bmi P054C; 0548 8A02 ora #0x02; /* Convert joystick movements */ 054A 2002 bra P054E; /* into button presses, to make */ 054C 8A01 P054C: ora #0x01; /* processing easier. */ 054E A75B P054E: sta -5,u; /* Save user 1's button states. */ /* Read joystick and buttons, for player 2 */ 0550 9611 lda 0x11; /* Get console 1 button states. */ 0552 D61B ldb 0x1B; /* Get joystick 1 state. */ 0554 0D7A tst 0x7A; 0556 2706 beq P055E; /* If simultaneous play, then use */ 0558 44 lsra; /* the buttons on console 2 and */ 0559 44 lsra; /* and read the joystick state on */ 055A 44 lsra; /* console 2 also. */ 055B 44 lsra; 055C D61D ldb 0x1D; 055E 5D P055E: tstb; 055F 2708 beq P0569; 0561 2B04 bmi P0567; /* Convert joystick movements to */ 0563 8A02 ora #0x02; /* button presses, to help make */ 0565 2002 bra P0569; /* processing easier. */ 0567 8A01 P0567: ora #0x01; 0569 A7C81B P0569: sta 0x1B,u; /* Save player 2's button states.*/ /* Once a player is dead, delay awhile before restarting him */ 056C A65D P056C: lda -3,u; 056E 2A37 bpl P05A7; 0570 A651 lda -15,u; /* Check the user's ship count. */ 0572 1027010C lbeq P0682; 0576 6A5F dec -1,u; /* Reset player's data area once */ 0578 2715 beq P058F; /* the restart counter goes to 0.*/ 057A 6A5F dec -1,u; 057C 2711 beq P058F; 057E A65F lda -1,u; 0580 81F0 cmpa #0xF0; 0582 102200FC lbhi P0682; 0586 9690 lda 0x90; 0588 8A02 ora #0x02; 058A 9790 sta 0x90; 058C 7E0682 jmp $P0682; /* Reset the data area for this user */ 058F 6F5D P058F: clr -3,u; 0591 8E1070 ldx #0x1070; /* Player 1 initial position. */ 0594 8610 lda #0x10; /* Player 1 rotation value. */ 0596 1183C8CC cmpu #0xC8CC; /* Is this player 2? */ 059A 2505 blo P05A1; 059C 8EE090 ldx #0xE090; /* Player 2 initial position. */ 059F 8630 lda #0x30; /* Player 2 rotation value. */ 05A1 AF53 P05A1: stx -13,u; /* Set cruiser's position. */ 05A3 A750 sta -16,u; /* Set cruiser's rotation. */ 05A5 6F5A clr -6,u; 05A7 86FF P05A7: lda #0xFF; 05A9 A75F sta -1,u; /* Process the button states now */ /* Check for rotate left command */ 05AB A65B lda -5,u; 05AD 8501 bita #0x01; /* If button 1 was pressed, then */ 05AF 2702 beq P05B3; /* rotate the cruiser to the left. */ 05B1 6C50 inc -16,u; /* Check for rotate right command */ 05B3 8502 P05B3: bita #0x02; /* If button 2 was pressed, then */ 05B5 2702 beq P05B9; /* rotate the cruiser to the right.*/ 05B7 6A50 dec -16,u; /* Check for a bullet fire request */ 05B9 8508 P05B9: bita #0x08; /* If button 4 was pressed, then */ 05BB 2741 beq P05FE; /* search the bullet buffer for an */ 05BD D68E ldb 0x8E; /* available spot. */ 05BF DA8F orb 0x8F; 05C1 263B bne P05FE; /* Ignore, if energy cannon destroyed.*/ 05C3 AE40 ldx 0,u; 05C5 E600 P05C5: ldb 0,x; /* Find an available spot in buffer.*/ 05C7 2708 beq P05D1; 05C9 300B leax 11,x; 05CB AC42 cmpx 2,u; 05CD 26F6 bne P05C5; 05CF 202D bra P05FE; 05D1 9690 P05D1: lda 0x90; 05D3 8A20 ora #0x20; 05D5 9790 sta 0x90; 05D7 EC52 ldd -14,u; /* Use ship's y position as bullet's */ 05D9 ED05 std 5,x; /* initial y position. */ 05DB EC54 ldd -12,u; /* Use ship's x position as bullet's */ 05DD ED07 std 7,x; /* initial x position. */ 05DF E650 ldb -16,u; /* Calculate rise & run for the bullet.*/ 05E1 867F lda #0x7F; 05E3 BDF601 jsr $convert_angle_to_rise_run; 05E6 DD85 std 0x85; 05E8 D685 ldb 0x85; 05EA BD0C31 jsr $mult_rise_run_by_9; 05ED ED01 std 1,x; /* Save the rise. */ 05EF D686 ldb 0x86; 05F1 BD0C31 jsr $mult_rise_run_by_9; 05F4 ED03 std 3,x; /* Save the run. */ 05F6 8630 lda #0x30; 05F8 A709 sta 9,x; /* Set bullet's life span value. */ 05FA 6300 com 0,x; /* Flag that buffer spot is in use. */ /* Check for a thrust request */ 05FC A65B lda -5,u; 05FE 8504 P05FE: bita #0x04; /* If button 3 was pressed, then */ 0600 271F beq P0621; /* update the cruiser's velocity, and */ 0602 9690 lda 0x90; /* update the cruiser's position.*/ 0604 8A04 ora #0x04; 0606 9790 sta 0x90; /* Force a ship movement sound. */ 0608 A65A lda -6,u; 060A 810F cmpa #0x0F; 060C 2413 bhs P0621; 060E 6C5A inc -6,u; /* Increment cruisers velocity. */ 0610 D626 ldb 0x26; 0612 54 lsrb; 0613 54 lsrb; 0614 2402 bhs P0618; 0616 6C5A inc -6,u; 0618 E650 P0618: ldb -16,u; /* Calulate new rise & run values. */ 061A 867F lda #0x7F; 061C BDF601 jsr $convert_angle_to_rise_run; 061F ED57 std -9,u; 0621 9626 P0621: lda 0x26; /* Decrement velocity every so ofter. */ 0623 8503 bita #0x03; 0625 2602 bne P0629; 0627 6A5A dec -6,u; /* Modify cruiser position, if velocity > 0 */ 0629 A65A P0629: lda -6,u; /* Calculate new y position. */ 062B 2F53 ble P0680; 062D 44 lsra; 062E E657 ldb -9,u; 0630 BD0C33 jsr $mult_rise_run_by_a; 0633 EC52 ldd -14,u; /* Multiply velocity * rise, and */ 0635 1E89 exg a,b; /* add it to old y position. */ 0637 D380 addd 0x80; 0639 1E89 exg a,b; 063B ED52 std -14,u; /* Save new y position. */ 063D A65A lda -6,u; /* Calculate new x position. */ 063F E658 ldb -8,u; 0641 44 lsra; 0642 BD0C33 jsr $mult_rise_run_by_a; 0645 EC54 ldd -12,u; /* Multiply velocity * run, and */ 0647 D380 addd 0x80; /* add it to old x position. */ 0649 ED54 std -12,u; /* Save new x position. */ /* See if the cruiser is trying to enter the ring area */ 064B EC53 ldd -13,u; 064D BDF584 jsr $get_absolute_value_of_ab; 0650 DD80 std 0x80; 0652 D680 ldb 0x80; /* Calculate x*x + y*y. */ 0654 3D mul; 0655 DD82 std 0x82; 0657 9681 lda 0x81; 0659 D681 ldb 0x81; 065B 3D mul; 065C D382 addd 0x82; /* Compare absolute ship position */ 065E 10830384 cmpd #0x0384; /* to the outer ring dimensions. */ 0662 221E bhi P0682; /* Cruise has attempted to enter ring area; turn it around */ 0664 EC53 ldd -13,u; /* Calc angle of cruiser from origin. */ 0666 BDF593 jsr $convert_rise_run_to_angle; 0669 C00A subb #0x0A; /* Convert angle to Vectrex reference.*/ 066B E750 stb -16,u; /* Set new angle for cruiser. */ 066D 867F lda #0x7F; 066F BDF601 jsr $convert_angle_to_rise_run; 0672 ED57 std -9,u; /* Save rise & run deltas. */ 0674 8606 lda #0x06; 0676 A75A sta -6,u; /* Force velocity to 6. */ 0678 9690 lda 0x90; 067A 8A10 ora #0x10; /* Force a sound. */ 067C 9790 sta 0x90; 067E 2002 bra P0682; /* Force ships velocity to 0 */ 0680 6F5A P0680: clr -6,u; /* See if the fireball has hit a star cruiser */ 0682 AE53 P0682: ldx -13,u; 0684 A65D lda -3,u; 0686 2B70 bmi P06F8; 0688 96E1 lda 0xE1; 068A 2A0E bpl P069A; 068C 109EE7 ldy 0xE7; /* Fireball position. */ 068F 96E0 lda 0xE0; /* Use scale * 2 as the size */ 0691 D6E0 ldb 0xE0; /* of the fireball. */ 0693 44 lsra; 0694 54 lsrb; 0695 BDF8FF jsr $check_bullet_for_hit; 0698 252B blo P06C5; /* Check to see if an energy bomb has hit a star cruiser */ 069A 3440 P069A: pshs u; 069C CEC978 ldu #0xC978; /* Addr of energy bomb buffer. */ 069F A65D P069F: lda -3,u; 06A1 8520 bita #0x20; 06A3 270B beq P06B0; 06A5 10AE53 ldy -13,u; /* Position of energy bomb. */ 06A8 CC0404 ldd #0x0404; 06AB BDF8FF jsr $check_bullet_for_hit; 06AE 250D blo P06BD; /* Branch, if a hit. */ 06B0 33C820 P06B0: leau 0x20,u; /* Check next energy bomb. */ 06B3 1183C9B8 cmpu #0xC9B8; /* Stop, when last bomb checked. */ 06B7 23E6 bls P069F; 06B9 3540 puls u; 06BB 203B bra P06F8; /* Star cruiser was hit by an energy bomb */ 06BD 86C0 P06BD: lda #0xC0; 06BF A75D sta -3,u; 06C1 3540 puls u; 06C3 2002 bra P06C7; 06C5 97E1 P06C5: sta 0xE1; /* Force explosion at fireball (y,x). */ 06C7 635D P06C7: com -3,u; /* Flag player as dead. */ 06C9 9690 lda 0x90; 06CB 8A80 ora #0x80; /* Force an explosion sound. */ 06CD 9790 sta 0x90; 06CF 8602 lda #0x02; 06D1 979B sta 0x9B; 06D3 6A5F dec -1,u; /* Set the restart timer. */ 06D5 6A51 dec -15,u; /* Decrement players cruiser count. */ 06D7 2618 bne P06F1; 06D9 3440 pshs u; /* Game over for this player, so see */ 06DB 3044 leax 4,u; /* if his score is a new hi score. */ 06DD CECBEB ldu #0xCBEB; 06E0 BDF8D8 jsr $check_4_new_hi_score; 06E3 3540 puls u; 06E5 9679 lda 0x79; 06E7 2708 beq P06F1; /* If neither player has any cruisers */ 06E9 969D lda 0x9D; /* left, then flag that the game is */ 06EB 9ABD ora 0xBD; /* over. */ 06ED 2702 beq P06F1; 06EF 0A8C dec 0x8C; 06F1 AE40 P06F1: ldx 0,u; /* Clear out users bullet buffer. */ 06F3 C62B ldb #0x2B; 06F5 BDF53F jsr $clear_blockxb; 06F8 33C820 P06F8: leau 0x20,u; /* Process next player. */ 06FB 1183C8CC cmpu #0xC8CC; 06FF 1023FE69 lbls P056C; /* START OF ENERGY BOMB STATE AND POSITION PROCESSING LOOP */ /* Update the position and states of all energy bombs */ 0703 96AB lda 0xAB; 0705 9795 sta 0x95; /* Determine which player has the */ 0707 96CB lda 0xCB; /* slower ring rotation delta. */ 0709 9195 cmpa 0x95; /* Save it in C895. */ 070B 2202 bhi P070F; 070D 9795 sta 0x95; 070F 967A P070F: lda 0x7A; /* If not simultaneous play, then */ 0711 44 lsra; /* determine who the next player is */ 0712 260E bne P0722; /* and set up his restart counter. */ 0714 8EC8AC ldx #0xC8AC; 0717 96DC lda 0xDC; 0719 2603 bne P071E; 071B 8EC8CC ldx #0xC8CC; 071E 86FF P071E: lda #0xFF; /* Restart counter is set here. */ 0720 A71F sta -1,x; 0722 8EC978 P0722: ldx #0xC978; 0725 968E lda 0x8E; /* Make sure the game is not in */ 0727 9A8F ora 0x8F; /* the middle of setting up a */ 0729 2703 beq P072E; /* new level. */ 072B 7E0912 jmp $P0912; /* Determine state of energy bomb, and handle accordingly */ 072E A61D P072E: lda -3,x; 0730 102B018E lbmi P08C2; /* Bomb is not in use. */ 0734 8117 cmpa #0x17; 0736 102301A8 lbls P08E2; /* Bomb is still on a ring. */ /* Energy bomb is moving; so draw it towards a cruiser */ 073A EC13 ldd -13,x; 073C 47 ASRA; 073D 57 asrb; 073E DD80 std 0x80; 0740 DC9F ldd 0x9F; /* Determine the delta between player */ 0742 47 ASRA; /* 1's cruiser, and the energy bomb. */ 0743 57 asrb; 0744 9080 suba 0x80; 0746 D081 subb 0x81; 0748 DD82 std 0x82; 074A DCBF ldd 0xBF; /* Determine the delta between player */ 074C 47 ASRA; /* 2's cruiser, and the energy bomb. */ 074D 57 asrb; 074E 9080 suba 0x80; 0750 D081 subb 0x81; 0752 DD84 std 0x84; 0754 96A9 lda 0xA9; /* If both players are dead, then */ 0756 95C9 bita 0xC9; /* draw the energy bomb back towards */ 0758 2A08 bpl P0762; /* the rings. */ 075A DC80 ldd 0x80; 075C 40 nega; 075D 50 negb; 075E DD82 std 0x82; 0760 2038 bra P079A; /* The following block is for simultaneous play only */ /* Determine which cruiser is closer to the energy bomb */ 0762 4D P0762: tsta; 0763 2B31 bmi P0796; /* See if player 1 is alive. */ 0765 96C9 lda 0xC9; 0767 2B31 bmi P079A; /* See if player 2 is alive. */ 0769 DC82 ldd 0x82; 076B BDF584 jsr $get_absolute_value_of_ab; 076E DD80 std 0x80; 0770 D680 ldb 0x80; 0772 3D mul; 0773 DD86 std 0x86; 0775 9681 lda 0x81; 0777 D681 ldb 0x81; 0779 3D mul; 077A D386 addd 0x86; 077C DD86 std 0x86; 077E DC84 ldd 0x84; 0780 BDF584 jsr $get_absolute_value_of_ab; 0783 DD80 std 0x80; 0785 D680 ldb 0x80; 0787 3D mul; 0788 DD88 std 0x88; 078A 9681 lda 0x81; 078C D681 ldb 0x81; 078E 3D mul; 078F D388 addd 0x88; 0791 109386 cmpd 0x86; 0794 2204 bhi P079A; 0796 DC84 P0796: ldd 0x84; /* Use player 2's position. */ 0798 DD82 std 0x82; /* Determine the angle between energy bomb & cruiser */ 079A DC82 P079A: ldd 0x82; 079C BDF593 jsr $convert_rise_run_to_angle; 079F 9780 sta 0x80; 07A1 A610 lda -16,x; 07A3 843F anda #0x3F; 07A5 9080 suba 0x80; 07A7 9781 sta 0x81; 07A9 BDF584 jsr $get_absolute_value_of_ab; 07AC 843F anda #0x3F; 07AE 9782 sta 0x82; 07B0 9783 sta 0x83; 07B2 40 nega; 07B3 843F anda #0x3F; 07B5 9182 cmpa 0x82; 07B7 2402 bhs P07BB; 07B9 9782 sta 0x82; /* If small delta, then aim bomb at cruiser */ 07BB B6C930 P07BB: lda $C930; 07BE 9182 cmpa 0x82; /* If delta is < ring rotation, */ 07C0 2506 blo P07C8; /* set energy bombs angle of travel */ 07C2 9680 lda 0x80; /* equal to delta angle. */ 07C4 A710 sta -16,x; 07C6 201A bra P07E2; /* If large delta, then gradually draw bomb towards cruiser */ 07C8 8620 P07C8: lda #0x20; 07CA 9181 cmpa 0x81; /* If delta is > ring rotation, */ 07CC 230A bls P07D8; /* draw the energy bomb towards */ 07CE EC10 ldd -16,x; /* the cruiser, by modifying its*/ 07D0 B3C930 subd $C930; /* angle of travel by +- the ring */ 07D3 B3C930 subd $C930; /* rotation delta. */ 07D6 2008 bra P07E0; 07D8 EC10 P07D8: ldd -16,x; 07DA F3C930 addd $C930; 07DD F3C930 addd $C930; 07E0 ED10 P07E0: std -16,x; /* Now, update position, and position delta for the bomb */ 07E2 B6C931 P07E2: lda $C931; 07E5 43 coma; 07E6 A71C sta -4,x; 07E8 863F lda #0x3F; 07EA E610 ldb -16,x; /* Calculate rise & run. */ 07EC BDF5FF jsr $convert_abs_angle_to_rise_run; 07EF ED17 std -9,x; 07F1 B6C931 lda $C931; /* Scale rise & run by ring rotation */ 07F4 44 lsra; /* value; as ring rotates faster, the*/ 07F5 44 lsra; /* energy bombs will also travel */ 07F6 44 lsra; /* faster. */ 07F7 44 lsra; 07F8 9786 sta 0x86; 07FA BD0C33 jsr $mult_rise_run_by_a; 07FD EC14 ldd -12,x; /* Update the x position, and check */ 07FF D380 addd 0x80; /* for screen wrap. */ 0801 102900BD lbvs P08C2; 0805 ED14 std -12,x; 0807 9686 lda 0x86; 0809 E617 ldb -9,x; 080B BD0C33 jsr $mult_rise_run_by_a; 080E EC12 ldd -14,x; /* Update the y position, and check */ 0810 1E89 exg a,b; /* for screen wrap. */ 0812 D380 addd 0x80; 0814 102900AA lbvs P08C2; 0818 1E89 exg a,b; 081A ED12 std -14,x; /* If bomb is back in ring area, then reattach it */ 081C EC13 ldd -13,x; 081E BDF584 jsr $get_absolute_value_of_ab; 0821 DD86 std 0x86; 0823 D686 ldb 0x86; 0825 3D mul; 0826 DD84 std 0x84; 0828 9687 lda 0x87; 082A D687 ldb 0x87; 082C 3D mul; 082D D384 addd 0x84; 082F DD84 std 0x84; 0831 10830384 cmpd #0x0384; /* See if the bomb is within the */ 0835 2515 blo P084C; /* confines of the center ring area. */ 0837 6A00 dec 0,x; 0839 270D beq P0848; /* If bomb is still moving, then make */ 083B 9690 lda 0x90; /* a sound, and decrement it's life */ 083D 8A08 ora #0x08; /* span counter. */ 083F 9790 sta 0x90; 0841 8620 lda #0x20; /* Flag that bomb is still moving. */ 0843 A71D P0843: sta -3,x; 0845 7E0908 jmp $P0908; /* Flag that bomb is no longer in use; lifespan expired */ 0848 8680 P0848: lda #0x80; 084A 20F7 bra P0843; /* Determine which ring to attach energy bomb to */ 084C CEC8F3 P084C: ldu #0xC8F3; 084F 108EC8ED ldy #0xC8ED; 0853 0F80 clr 0x80; 0855 A6C4 P0855: lda ,u; /* Determine if the energy bomb is */ 0857 4A deca; /* within the confines of the ring */ 0858 1F89 tfr a,b; /* being checked. */ 085A 3D mul; 085B 109384 cmpd 0x84; 085E 2550 blo P08B0; 0860 A6C4 lda ,u; 0862 8008 suba #0x08; 0864 1F89 tfr a,b; 0866 3D mul; 0867 109384 cmpd 0x84; 086A 2244 bhi P08B0; /* Determine which ring section to energy attach bomb to */ 086C EC13 ldd -13,x; 086E BDF593 jsr $convert_rise_run_to_angle; 0871 A0A4 suba ,y; 0873 44 lsra; 0874 44 lsra; 0875 840F anda #0x0F; 0877 3410 pshs x; 0879 8E0F45 ldx #0x0F45; 087C A686 lda a,x; /* Determine if this section still exists. */ 087E 30C81E leax 0x1E,u; 0881 E6C6 ldb a,u; 0883 EA86 orb a,x; 0885 3510 puls x; 0887 2727 beq P08B0; /* See if any other bomb is already on this section */ 0889 8002 suba #0x02; 088B 9A80 ora 0x80; 088D 9781 sta 0x81; 088F F6C975 ldb $C975; /* Check bomb 1. */ 0892 C41F andb #0x1F; 0894 D181 cmpb 0x81; 0896 2718 beq P08B0; 0898 F6C995 ldb $C995; /* Check bomb 2. */ 089B C41F andb #0x1F; 089D D181 cmpb 0x81; 089F 270F beq P08B0; 08A1 F6C9B5 ldb $C9B5; /* Check bomb 3. */ 08A4 C41F andb #0x1F; 08A6 D181 cmpb 0x81; 08A8 2706 beq P08B0; 08AA A71D sta -3,x; /* Available; place bomb here. */ 08AC 6F00 clr 0,x; 08AE 2058 bra P0908; /* Section not available or occupied, so check next ring */ 08B0 9680 P08B0: lda 0x80; 08B2 8B08 adda #0x08; 08B4 9780 sta 0x80; 08B6 334A leau 10,u; 08B8 3122 leay 2,y; 08BA 108CC8F1 cmpy #0xC8F1; 08BE 2395 bls P0855; 08C0 2046 bra P0908; /* See if we need to start up another energy bomb */ 08C2 A61D P08C2: lda -3,x; 08C4 8540 bita #0x40; 08C6 2640 bne P0908; 08C8 0AEB dec 0xEB; /* Decrement reseed counter. */ 08CA 263C bne P0908; /* Restart new bomb when it goes to 0. */ 08CC F6C931 ldb $C931; 08CF 54 lsrb; 08D0 D7EB stb 0xEB; /* Reset the reseed counter. */ 08D2 8620 lda #0x20; 08D4 A71D sta -3,x; /* Flag bomb state as 'moving'. */ 08D6 96DE lda 0xDE; 08D8 A710 sta -16,x; /* Use energy cannons angle. */ 08DA 4F clra; 08DB 5F clrb; 08DC ED13 std -13,x; /* Start bomb from origin. */ 08DE A700 sta 0,x; /* Clear lifespan. */ 08E0 2026 bra P0908; /* See if time to force energy bomb off a ring */ 08E2 CEC8F3 P08E2: ldu #0xC8F3; 08E5 44 lsra; /* Use state/8 to determine which */ 08E6 44 lsra; /* ring energy bomb is attached to.*/ 08E7 44 lsra; 08E8 2705 P08E8: beq P08EF; 08EA 334A leau 10,u; 08EC 4A deca; 08ED 20F9 bra P08E8; 08EF 3342 P08EF: leau 2,u; /* If the ring no longer exists, or if */ 08F1 31C81E leay 0x1E,u; /* the 'time to move' counter has gone */ 08F4 A61D lda -3,x; /* to 0, then force the energy bomb to */ 08F6 8407 anda #0x07; /* start moving outwards, until it */ 08F8 E6A6 ldb a,y; /* hits a cruiser, or comes within the */ 08FA EAC6 orb a,u; /* confines of another ring. */ 08FC 2704 beq P0902; 08FE 6A1C dec -4,x; /* Update 'time to move' counter. */ 0900 2606 bne P0908; 0902 A61D P0902: lda -3,x; 0904 8A20 ora #0x20; /* Force energy bomb to start moving. */ 0906 A71D sta -3,x; 0908 308820 P0908: leax 0x20,x; /* Advance pointer to next energy */ 090B 8CC9B8 cmpx #0xC9B8; /* bomb. Stop when last on processed.*/ 090E 1023FE1C lbls P072E; /* END OF ENERGY BOMB STATE & POSITION PROCESSING LOOP */ /* Determin the confines of a given ring */ 0912 108EC8F3 P0912: ldy #0xC8F3; /* Ptr to ring line patterns. */ 0916 8EC8ED ldx #0xC8ED; /* Addr of ring 1 rotation value. */ 0919 0F91 clr 0x91; 091B 968E lda 0x8E; 091D 9A8F ora 0x8F; 091F 1026011D lbne P0A40; 0923 9690 lda 0x90; 0925 8A01 ora #0x01; 0927 9790 sta 0x90; 0929 A6A4 P0929: lda ,y; 092B 4A deca; 092C 1F89 tfr a,b; 092E 3D mul; 092F DD80 std 0x80; 0931 A6A4 lda ,y; 0933 8008 suba #0x08; 0935 1F89 tfr a,b; 0937 3D mul; 0938 DD82 std 0x82; /* Check each bullet for a hit on the energy cannon */ 093A CEC9C8 ldu #0xC9C8; /* Addr of player 1's bullet buffer. */ 093D A640 P093D: lda 0,u; /* See if bullet is active. */ 093F 102A00E8 lbpl P0A2B; 0943 3430 pshs x,y; 0945 AE46 ldx 6,u; /* Bullet's position. */ 0947 108E0000 ldy #0x0000; /* Energy cannon's position. */ 094B CC0303 ldd #0x0303; /* Size of energy cannon. */ 094E BDF8FF jsr $check_bullet_for_hit; 0951 3530 puls x,y; 0953 242E bhs P0983; /* Energy cannon destroyed by a bullet */ 0955 8680 lda #0x80; /* Energy cannon destroyed. */ 0957 B7C975 sta $C975; /* Disable energy bomb 1. */ 095A B7C995 sta $C995; /* Disable energy bomb 2. */ 095D B7C9B5 sta $C9B5; /* Disable energy bomb 3. */ 0960 9A90 ora 0x90; 0962 9790 sta 0x90; /* Force an explosion sound. */ 0964 8602 lda #0x02; 0966 979B sta 0x9B; 0968 0A8E dec 0x8E; /* Flag energy cannon is exploding. */ 096A 6F40 clr 0,u; /* Flag that bullet no longer in use.*/ 096C B6C931 lda $C931; /* Slightly increase ring rotation */ 096F 8B10 adda #0x10; /* value. */ 0971 2503 blo P0976; 0973 B7C931 sta $C931; 0976 CC1400 P0976: ldd #0x1400; /* Score a cannon hit for the player. */ 0979 BD0C77 jsr $update_players_score; 097C 301C leax -4,x; 097E 6C11 inc -15,x; /* Give the player another cruiser. */ 0980 7E0A85 jmp $P0A85; /* See if the bullet hit one of the energy bombs */ 0983 3420 P0983: pshs y; 0985 108EC978 ldy #0xC978; /* Addr of energy bomb buffer. */ 0989 A63D P0989: lda -3,y; 098B 8520 bita #0x20; 098D 2711 beq P09A0; 098F 3430 pshs x,y; 0991 AE46 ldx 6,u; /* Position of bullet. */ 0993 10AE33 ldy -13,y; /* Position of energy bomb. */ 0996 CC0202 ldd #0x0202; /* Size of energy bomb. */ 0999 BDF8FF jsr $check_bullet_for_hit; 099C 3530 puls x,y; 099E 250D blo P09AD; 09A0 31A820 P09A0: leay 0x20,y; /* Check next energy bomb. */ 09A3 108CC9B8 cmpy #0xC9B8; 09A7 23E0 bls P0989; 09A9 3520 puls y; 09AB 2014 bra P09C1; /* Energy bomb was destroyed by a bullet */ 09AD 8680 P09AD: lda #0x80; 09AF A73D sta -3,y; /* Flag bullet no longer in use. */ 09B1 9A90 ora 0x90; 09B3 9790 sta 0x90; /* Force an explosion sound. */ 09B5 8603 lda #0x03; 09B7 979B sta 0x9B; 09B9 8601 lda #0x01; /* Force an explosion pattern to be */ 09BB A740 sta 0,u; /* displayed at bullet's position. */ 09BD 3520 puls y; 09BF 206A bra P0A2B; /* See if the bullet hit a wall section */ 09C1 EC46 P09C1: ldd 6,u; 09C3 BDF584 jsr $get_absolute_value_of_ab; 09C6 D786 stb 0x86; 09C8 1F89 tfr a,b; /* See if the bullet is within the */ 09CA 3D mul; /* confines of a ring. */ 09CB DD84 std 0x84; 09CD 9686 lda 0x86; 09CF D686 ldb 0x86; 09D1 3D mul; 09D2 D384 addd 0x84; 09D4 109380 cmpd 0x80; 09D7 2252 bhi P0A2B; 09D9 109382 cmpd 0x82; 09DC 254D blo P0A2B; /* Determine which section of the wall we are at */ 09DE EC46 ldd 6,u; /* Bullet position. */ 09E0 BDF593 jsr $convert_rise_run_to_angle; 09E3 A084 suba ,x; 09E5 44 lsra; 09E6 44 lsra; 09E7 840F anda #0x0F; 09E9 3410 pshs x; 09EB 8E0F45 ldx #0x0F45; 09EE A686 lda a,x; /* Determine if this section exists or is already destroyed */ 09F0 30A81E leax 0x1E,y; 09F3 E6A6 ldb a,y; 09F5 EA86 orb a,x; 09F7 2730 beq P0A29; /* Add value of wall section to players score */ 09F9 3412 pshs a,x; 09FB 8EC8F3 ldx #0xC8F3; /* Addr of ring pattern arrays. */ 09FE C610 ldb #0x10; /* Value of outer wall section. */ 0A00 A6A4 lda ,y; 0A02 A184 P0A02: cmpa ,x; /* This loop calculates the value */ 0A04 2402 bhs P0A08; /* of the wall section hit. */ 0A06 CB10 addb #0x10; 0A08 300A P0A08: leax 10,x; 0A0A 8CC908 cmpx #0xC908; 0A0D 25F3 P0A0D: blo P0A02; 0A0F 4F clra; 0A10 BD0C77 jsr $update_players_score; 0A13 3512 puls a,x; 0A15 6F40 clr 0,u; /* Flag bullet no longer in use. */ 0A17 6FA6 clr a,y; /* Clear pattern for section hit(0 hit).*/ 0A19 6386 com a,x; /* Clr/set pattern 4 section hit(1 hit). */ 0A1B 260C bne P0A29; 0A1D 6C40 inc 0,u; 0A1F 8680 lda #0x80; /* Section destroyed, so force an */ 0A21 9A90 ora 0x90; /* explosion sound. (hit 2 times) */ 0A23 9790 sta 0x90; 0A25 8603 lda #0x03; 0A27 979B sta 0x9B; 0A29 3510 P0A29: puls x; 0A2B 334B P0A2B: leau 11,u; /* Advance ptr to next bullet. */ 0A2D 1183CA20 cmpu #0xCA20; /* Stop when last bullet processed. */ 0A31 1025FF08 lblo P093D; 0A35 312A leay 10,y; /* Get ptr to next ring's patterns. */ 0A37 3002 leax 2,x; /* Get ptr to next ring's rotation. */ 0A39 8CC8F1 cmpx #0xC8F1; /* Stop when last ring processed. */ 0A3C 1023FEE9 lbls P0929; /* A certain amount of time after the energy cannon was */ /* destroyed, reset the ring scale/pattern structure */ 0A40 8620 P0A40: lda #0x20; 0A42 918F cmpa 0x8F; 0A44 253F blo P0A85; 0A46 2203 bhi P0A4B; 0A48 BD0BA6 jsr $init_ring_scale_factors; /* See if we need to expand the inner walls */ 0A4B 8EC8F3 P0A4B: ldx #0xC8F3; /* Search the scale/pattern array, */ 0A4E 861E lda #0x1E; /* and find out which entry is for */ 0A50 A184 cmpa ,x; /* the outermost wall; it will have*/ 0A52 270C beq P0A60; /* a scale factor of 0x1E. The 'x'*/ 0A54 300A leax 10,x; /* register will point to the entry*/ 0A56 A184 cmpa ,x; /* once it is found. */ 0A58 2706 beq P0A60; 0A5A 300A leax 10,x; 0A5C A184 cmpa ,x; 0A5E 2625 bne P0A85; 0A60 3002 P0A60: leax 2,x; /* Skip over the scale factor and the */ 0A62 33881E leau 0x1E,x; /* first line pattern for this ring. */ 0A65 C607 ldb #0x07; 0A67 A685 P0A67: lda b,x; /* This loop counts the number of */ 0A69 AAC5 ora b,u; /* visible sections still left on */ 0A6B 2702 beq P0A6F; /* the outermost ring. The number*/ 0A6D 0C91 inc 0x91; /* of visible sections is saved in*/ 0A6F 5A P0A6F: decb; /* C891. */ 0A70 2CF5 bge P0A67; 0A72 9691 lda 0x91; /* See if any sections were left. */ 0A74 260F bne P0A85; /* Branch, if sections are still left.*/ 0A76 8606 lda #0x06; /* Set up a new scale factor for this */ 0A78 A71E sta -2,x; /* ring (6), and make it the inner */ 0A7A A75E sta -2,u; /* most ring. */ 0A7C 86FF lda #0xFF; /* Reset all the line patterns for */ 0A7E C607 ldb #0x07; /* this ring to 0xFF. */ 0A80 BDF552 jsr $clear_block_to_a; 0A83 97EC sta 0xEC; /* Set the 'wall expanding' flag. */ /* Update rotation value, so each ring rotates faster */ 0A85 FCC930 P0A85: ldd $C930; 0A88 D3F1 addd 0xF1; /* Update rotation for ring 1. */ 0A8A DDF1 std 0xF1; 0A8C FCC930 ldd $C930; 0A8F 43 coma; 0A90 53 comb; 0A91 D3EF addd 0xEF; /* Update rotation for ring 2. */ 0A93 DDEF std 0xEF; 0A95 FCC930 ldd $C930; 0A98 58 aslb; 0A99 49 rola; 0A9A D3ED addd 0xED; /* Update rotation for ring 3. */ 0A9C DDED std 0xED; 0A9E 9626 lda 0x26; /* Expand rings everyother pass. */ 0AA0 44 lsra; 0AA1 242E bhs P0AD1; /* Continue expanding rings, if necessary */ 0AA3 D6EC ldb 0xEC; /* If the 'expanding wall' flag */ 0AA5 272A beq P0AD1; /* (C8EC) is set, then increment the */ 0AA7 861E lda #0x1E; /* scale factor for each of the 3 */ 0AA9 8EC8F3 ldx #0xC8F3; /* rings, until the outermost one */ 0AAC 6C84 inc ,x; /* has a scale actor of 0x1E; at */ 0AAE 6C881E inc 0x1E,x; /* that point, clear the 'expanding */ 0AB1 A184 cmpa ,x; /* wall' flag. */ 0AB3 2602 bne P0AB7; 0AB5 0FEC clr 0xEC; 0AB7 300A P0AB7: leax 10,x; /* Increment the scale for the */ 0AB9 6C84 inc ,x; /* next ring. */ 0ABB 6C881E inc 0x1E,x; 0ABE A184 cmpa ,x; 0AC0 2602 bne P0AC4; 0AC2 0FEC clr 0xEC; /* Clear the 'expanding walls' flag. */ 0AC4 300A P0AC4: leax 10,x; /* Increment the scale for the */ 0AC6 6C84 inc ,x; /* next ring. */ 0AC8 6C881E inc 0x1E,x; 0ACB A184 cmpa ,x; 0ACD 2602 bne P0AD1; 0ACF 0FEC clr 0xEC; /* Clear the 'expanding walls' flag. */ 0AD1 968E P0AD1: lda 0x8E; /* Don't continue, if the energy cannon */ 0AD3 1026F5FC lbne P00D3; /* is being destroyed, or a new screen */ 0AD7 968F lda 0x8F; /* is being displayed. */ 0AD9 2705 beq P0AE0; 0ADB 0A8F dec 0x8F; 0ADD 7E00D3 jmp $P00D3; /* Have the energy cannon track one of the cruiser */ 0AE0 DC9F P0AE0: ldd 0x9F; /* Player 1 cruiser position. */ 0AE2 BDF593 jsr $convert_rise_run_to_angle; 0AE5 9780 sta 0x80; 0AE7 DCBF ldd 0xBF; /* Player 2 cruiser position. */ 0AE9 BDF593 jsr $convert_rise_run_to_angle; 0AEC 9781 sta 0x81; 0AEE 96DE lda 0xDE; /* Determine angle delta between */ 0AF0 843F anda #0x3F; /* cannon and cruiser 1. */ 0AF2 9080 suba 0x80; 0AF4 843F anda #0x3F; 0AF6 9782 sta 0x82; 0AF8 96DE lda 0xDE; /* Determine angle delta between */ 0AFA 843F anda #0x3F; /* cannon and cruiser 2. */ 0AFC 9081 suba 0x81; 0AFE 843F anda #0x3F; 0B00 D6A9 ldb 0xA9; /* If game is over, then just rotate */ 0B02 D5C9 bitb 0xC9; /* cannon around. */ 0B04 2A06 bpl P0B0C; 0B06 8605 lda #0x05; 0B08 9782 sta 0x82; 0B0A 2013 bra P0B1F; /* Determine which cruiser to track */ 0B0C 5D P0B0C: tstb; /* One player is dead, so determine */ 0B0D 2608 bne P0B17; /* which one is still alive, so we */ 0B0F D6C9 ldb 0xC9; /* can track him. */ 0B11 260A bne P0B1D; 0B13 9182 cmpa 0x82; 0B15 2E06 bgt P0B1D; 0B17 9782 P0B17: sta 0x82; 0B19 9681 lda 0x81; 0B1B 2002 bra P0B1F; 0B1D 9680 P0B1D: lda 0x80; /* Determine how to track one of the cruiser */ 0B1F D682 P0B1F: ldb 0x82; 0B21 9780 sta 0x80; 0B23 BDF584 jsr $get_absolute_value_of_ab; 0B26 C43F andb #0x3F; 0B28 D781 stb 0x81; 0B2A D783 stb 0x83; 0B2C 50 negb; 0B2D C43F andb #0x3F; 0B2F D181 cmpb 0x81; 0B31 2402 bhs P0B35; 0B33 D781 stb 0x81; /* Determine speed at which to track the cruiser */ 0B35 B6C930 P0B35: lda $C930; /* Ring rotation delta. */ 0B38 9181 cmpa 0x81; 0B3A 2553 blo P0B8F; 0B3C 9680 lda 0x80; 0B3E 843F anda #0x3F; /* Small delta; so track quickly. */ 0B40 97DE sta 0xDE; /* See if opening exists in the 3 rings in front of cannon */ 0B42 CEC8F3 ldu #0xC8F3; /* Addr of ring pattern array. */ 0B45 8EC8ED ldx #0xC8ED; /* Addr of ring 1 rotation value. */ 0B48 96DE P0B48: lda 0xDE; 0B4A A081 suba ,x++; 0B4C 44 lsra; 0B4D 44 lsra; 0B4E 840F anda #0x0F; /* Determine which segment of the */ 0B50 108E0F45 ldy #0x0F45; /* ring is faced by the cannon. */ 0B54 A6A6 lda a,y; 0B56 31C81E leay 0x1E,u; /* If both patterns are 0, then the */ 0B59 E6C6 ldb a,u; /* segment is open. */ 0B5B EAA6 orb a,y; 0B5D 2644 bne P0BA3; /* No opening exists. */ 0B5F 334A leau 10,u; /* Opening exists in this ring; go */ 0B61 8CC8F1 cmpx #0xC8F1; /* check the next one also. */ 0B64 23E2 bls P0B48; /* Fire a fireball at one of the star cruisers */ 0B66 96E1 lda 0xE1; 0B68 2639 bne P0BA3; /* See if fireball is already in use. */ 0B6A 03E1 com 0xE1; 0B6C 4F clra; 0B6D 5F clrb; 0B6E DDE6 std 0xE6; /* Set initial y position to 0. */ 0B70 DDE8 std 0xE8; /* Set initial x position to 0. */ 0B72 D6DE ldb 0xDE; 0B74 867F lda #0x7F; 0B76 BDF5FF jsr $convert_abs_angle_to_rise_run; 0B79 DD85 std 0x85; 0B7B D685 ldb 0x85; 0B7D BD0C31 jsr $mult_rise_run_by_9; 0B80 DDE2 std 0xE2; /* Save rise value. */ 0B82 D686 ldb 0x86; 0B84 BD0C31 jsr $mult_rise_run_by_9; 0B87 DDE4 std 0xE4; /* Save run value. */ 0B89 8606 lda #0x06; 0B8B 97E0 sta 0xE0; /* Set initial scale factor. */ 0B8D 2014 bra P0BA3; /* Slowly turn energy cannon, to track a cruiser */ 0B8F 8620 P0B8F: lda #0x20; 0B91 9182 cmpa 0x82; /* If the delta between the cannon */ 0B93 2307 bls P0B9C; /* and the cruiser is > the ring */ 0B95 DCDE ldd 0xDE; /* rotation delta, then update the */ 0B97 B3C930 subd $C930; /* cannons angle by the ring rotation */ 0B9A 2005 bra P0BA1; /* delta only; as this increases, so */ 0B9C DCDE P0B9C: ldd 0xDE; /* will the tracking speed of the */ 0B9E F3C930 addd $C930; /* energy cannon. */ 0BA1 DDDE P0BA1: std 0xDE; 0BA3 7E00D3 P0BA3: jmp $P00D3; /* * init_ring_scale_factors() * * This routine clears the scale/pattern buffer used * to describe the 3 rings, and then sets the initial * scale factors (0x0E, 0x16, 0x1E) for each of the rings. * * The pattern buffer is 60 bytes long (6 x 10 bytes), * and uses RAM locations C8F3-C92F. The first 3 entries * describe those ring sections which have no hits on them, * while the second 3 entries describe those ring sections * which have 1 hit on them (and are thus hi-lited). * * The format of the pattern buffer is as follows: * * scale, < 9 line patterns>, [Ring 1, no hits] * scale, < 9 line patterns>, [Ring 2, no hits] * scale, < 9 line patterns>, [Ring 3, no hits] * scale, < 9 line patterns>, [Ring 1, 1 hit] * scale, < 9 line patterns>, [Ring 2, 1 hit] * scale, < 9 line patterns> [Ring 3, 1 hit] */ init_ring_scale_factors: 0BA6 8EC8F3 ldx #0xC8F3; /* Clear the pattern buffer. */ 0BA9 C63C ldb #0x3C; 0BAB BDF53F jsr $clear_blockxb; 0BAE 8EC8F3 ldx #0xC8F3; 0BB1 CC0E00 ldd #0x0E00; /* Set ring 1's scale factor. */ 0BB4 ED84 std ,x; 0BB6 ED881E std 0x1E,x; 0BB9 300A leax 10,x; 0BBB CC1600 ldd #0x1600; /* Set ring 2's scale factor. */ 0BBE ED84 std ,x; 0BC0 ED881E std 0x1E,x; 0BC3 300A leax 10,x; 0BC5 CC1E00 ldd #0x1E00; /* Set ring 3's scale factor. */ 0BC8 ED84 std ,x; 0BCA ED881E std 0x1E,x; 0BCD A78828 sta 0x28,x; 0BD0 39 rts; /* * change_player() * * This routine is called after a players cruiser has * been destroyed. It will disable of of the energy * bombs and bullets. It will also save a copy of the * dead players game information in his backup area. * Lastly, it will switch the active player indicator * (C8DC), and copy the other players game info out * of his backup area and into the active player area. * The info backed up and restored is the ring patterns * and rotation values. */ change_player: 0BD1 8680 lda #0x80; 0BD3 B7C975 sta $C975; /* Disable energy bomb 1 */ 0BD6 B7C995 sta $C995; /* Disable energy bomb 2 */ 0BD9 B7C9B5 sta $C9B5; /* Disable energy bomb 3 */ 0BDC B6C88F lda $C88F; /* Re-init ring patterns, if energy */ 0BDF 2702 beq P0BE3; /* cannon was destroyed. */ 0BE1 8DC3 bsr init_ring_scale_factors; 0BE3 7FC88F P0BE3: clr $C88F; 0BE6 8EC9C8 ldx #0xC9C8; /* Clear the bullet buffer. */ 0BE9 C658 ldb #0x58; 0BEB BDF53F jsr $clear_blockxb; 0BEE 8D0D bsr prepare_for_backup; 0BF0 F7C8DC stb $C8DC; /* Save next player indicator. */ 0BF3 BDF683 jsr $move_block2; 0BF6 8D05 bsr prepare_for_backup; 0BF8 1E31 exg u,x; 0BFA 7EF683 jmp $move_block2; /* * prepare_for_backup() * * This procedure initializes the 'a' register with the * count of the number of bytes to backup, the 'u' register * with the address of the active players ring pattern array, * and the 'x' register with the address of the backup area * associated with the player being backed up; C8DC indicates * which player is being backed up. */ prepare_for_backup: 0BFD CEC8F3 ldu #0xC8F3; /* Load 'u' w/ ptr to ring patterns.*/ 0C00 8ECA25 ldx #0xCA25; 0C03 863F lda #0x3F; 0C05 F6C8DC ldb $C8DC; 0C08 2703 beq P0C0D; 0C0A 8ECA64 ldx #0xCA64; 0C0D 53 P0C0D: comb; /* Switch flag to show other user */ 0C0E 39 P0C0E: rts; /* is now active. */ /* * init_ship_count_buffer() * * Initialize the buffer used to display the number of * ships left for a user to the following: * * " ",0x80,0x80,0x80,0x80,0x80,0x80,0x80 * * The buffer starts at C932 */ init_ship_count_buffer: 0C0F 8EC932 ldx #0xC932; 0C12 C609 ldb #0x09; 0C14 BDF550 jsr $clear_block_to_0x80; 0C17 8620 lda #0x20; 0C19 A784 sta ,x; 0C1B A701 sta 1,x; 0C1D A702 sta 2,x; 0C1F 39 P0C1F: rts; /* * fill_ship_count_buffer() * * Fill the ship count buffer with a little spaceship * figure, one for each ship the user has left. If he * has more than 9 ships left, then display "X" instead * of the spaceship. * * At entry: * 'a' = number of ships. */ fill_ship_count_buffer: 0C20 C668 ldb #0x68; /* Code for small spaceship figure. */ 0C22 8109 cmpa #0x09; 0C24 2304 bls P0C2A; 0C26 8609 lda #0x09; 0C28 C010 subb #0x10; /* Use "X" instead. */ 0C2A 4A P0C2A: deca; 0C2B 2FF2 ble P0C1F; 0C2D E780 stb ,x+; /* Fill the buffer. */ 0C2F 20F9 bra P0C2A; /* * mult_rise_run_by_9() * mult_rise_run_by_a() * * This routine takes a rise or run value (in 'b') * and either multiples it by 9 or by the value in * the 'a' register. * * At entry: * 'b' = rise or run value. * 'a' = multiplier (for mult_rise_run_by_a only). * * At exit: * 'd' contains the result of the multiplication, * and so does C880. */ mult_rise_run_by_9: 0C31 8609 lda #0x09; mult_rise_run_by_a: 0C33 0F83 clr 0x83; 0C35 5D tstb; 0C36 2A02 bpl P0C3A; 0C38 0C83 inc 0x83; /* Keep track if value is negative. */ 0C3A BDF584 P0C3A: jsr $get_absolute_value_of_ab; 0C3D 3D mul; 0C3E DD80 std 0x80; 0C40 0483 lsr 0x83; 0C42 2407 bhs P0C4B; 0C44 43 coma; /* If the rise/run value was negative */ 0C45 53 comb; /* then take twos complement, to make */ 0C46 C30001 addd #0x0001; /* the result negative also. */ 0C49 DD80 std 0x80; 0C4B 39 P0C4B: rts; /* * draw_1_ring() * * This routine will draw one of the 3 rings (castle walls). * * At entry: * 'x' points to (y,x) vector list for this ring. * 'u' points to scale/pattern buffer for this ring. * * Drawing will cease when a pattern > 0 is encountered. */ draw_1_ring: 0C4C 86CE lda #0xCE; 0C4E 970C sta 0x0C; 0C50 E6C0 ldb ,u+; /* Grab the scale factor. */ 0C52 D704 stb 0x04; 0C54 EC84 P0C54: ldd ,x; /* Grab the vector endpoint. */ 0C56 9701 sta 0x01; 0C58 0F00 clr 0x00; 0C5A A6C0 lda ,u+; /* Grab the line pattern to use. */ 0C5C 3002 leax 2,x; 0C5E 0C00 inc 0x00; 0C60 D701 stb 0x01; 0C62 970A sta 0x0A; 0C64 0F05 clr 0x05; 0C66 CC0040 ldd #0x0040; 0C69 D50D P0C69: bitb 0x0D; 0C6B 27FC beq P0C69; 0C6D 12 nop; 0C6E 970A sta 0x0A; 0C70 A6C4 lda ,u; /* Stop, when end of pattern list is */ 0C72 2FE0 ble P0C54; /* reached (pattern > 0). */ 0C74 7EF34F jmp $check0ref; /* * update_players_score() * * This routine takes a value, and adds it to the * appropriate user's score string. * * At entry: * 'd' contains the BCD value to be added to a score. * 'u' points to bullet entry which scored a hit. * * The address of the bullet entry is used to determine * whether to add the BCD value to player 1 or 2's score. */ update_players_score: 0C77 8EC8AC ldx #0xC8AC; 0C7A 1183C9F4 cmpu #0xC9F4; /* Determine which player to credit */ 0C7E 2503 blo P0C83; /* with the hit. */ 0C80 8EC8CC ldx #0xC8CC; 0C83 3004 P0C83: leax 4,x; /* Get addr of player's score string. */ 0C85 7EF87C jmp $add_d_to_x_in_bcd; /* * make_game_sounds() * * This routine is responsible for making all of the * sound associated with the game. It uses a bit mask * in C890 to decide which sounds to make at any given * moment. */ make_game_sounds: 0C88 BDF533 jsr $init_music_buf; 0C8B 0F45 clr 0x45; 0C8D 108ECAA3 ldy #0xCAA3; 0C91 CE0CE0 ldu #0x0CE0; 0C94 CC0380 ldd #0x0380; 0C97 DD96 std 0x96; 0C99 86B1 lda #0xB1; 0C9B 9499 anda 0x99; 0C9D 9799 sta 0x99; 0C9F 968D lda 0x8D; 0CA1 9798 sta 0x98; 0CA3 2634 bne P0CD9; 0CA5 9690 lda 0x90; 0CA7 9A99 ora 0x99; 0CA9 979A sta 0x9A; 0CAB 9697 P0CAB: lda 0x97; 0CAD 949A anda 0x9A; 0CAF 2720 beq P0CD1; 0CB1 1F89 tfr a,b; 0CB3 9A98 ora 0x98; 0CB5 9798 sta 0x98; 0CB7 D590 bitb 0x90; 0CB9 2604 bne P0CBF; 0CBB D499 andb 0x99; 0CBD 2608 bne P0CC7; 0CBF EC42 P0CBF: ldd 2,u; 0CC1 EDA4 std ,y; 0CC3 EC44 ldd 4,u; 0CC5 ED22 std 2,y; 0CC7 ADD4 P0CC7: jsr [,u];/* (UNKNOWN JUMP) */ 0CC9 9696 lda 0x96; 0CCB 270C beq P0CD9; 0CCD 8608 lda #0x08; 0CCF 9746 sta 0x46; 0CD1 3347 P0CD1: leau 7,u; 0CD3 3124 leay 4,y; 0CD5 0497 lsr 0x97; 0CD7 26D2 bne P0CAB; 0CD9 9698 P0CD9: lda 0x98; 0CDB 9799 sta 0x99; 0CDD 0F90 clr 0x90; 0CDF 39 rts; /* * Table of sound routine addresses, and data * * 2 byte subroutine address. * 5 bytes of data. */ 0CE0 0D S0CE0: .word 0x0DBF; 0CE2 00 .byte 0x00,0x00,0x00,x000,0xFF; 0CE7 0D .word 0x0D93; 0CE9 0A .byte 0x0A,0x00,0x0E,0x08,0xFF; 0CEE 0D .word 0x0D6C; 0CF0 02 .byte 0x02,0x80,0x0C,0x0B,0x00; 0CF5 0D .word 0x0D85; 0CF7 00 .byte 0x00,0x90,0x0E,0x08,0xFF; 0CFC 0D .word 0x0D60; 0CFE 00 .byte 0x00,0x90,0x09,0x00,0x00; 0D03 0D .word 0x0D93; 0D05 00 .byte 0x00,0x00,0x09,0x00,0x03; 0D0A 0D .word 0x0D54; 0D0C 00 .byte 0x00,0x90,0x0C,0x08,0x00; 0D11 0D .word 0x0D18; 0D13 08 .byte 0x08,0x80,0x0D,0x60,0x00; 0D18 9E92 P0D18: ldx 0x92; 0D1A AFA4 stx ,y; 0D1C 3440 pshs u; 0D1E 9691 lda 0x91; 0D20 4A deca; 0D21 8406 anda #0x06; 0D23 CE0DEE ldu #0x0DEE; 0D26 ECC6 ldd a,u; 0D28 10A3A4 cmpd ,y; 0D2B 2206 bhi P0D33; 0D2D 0F94 clr 0x94; 0D2F 301C leax -4,x; 0D31 2019 bra P0D4C; 0D33 830080 P0D33: subd #0x0080; 0D36 10A3A4 cmpd ,y; 0D39 220B bhi P0D46; 0D3B 8604 lda #0x04; 0D3D D694 ldb 0x94; 0D3F 2B01 bmi P0D42; 0D41 40 nega; 0D42 3086 P0D42: leax a,x; 0D44 2006 bra P0D4C; 0D46 4F P0D46: clra; 0D47 43 coma; 0D48 9794 sta 0x94; 0D4A 3004 leax 4,x; 0D4C AFA4 P0D4C: stx ,y; 0D4E 9F92 stx 0x92; 0D50 3540 puls u; 0D52 203F bra P0D93; 0D54 4F P0D54: clra; 0D55 D695 ldb 0x95; 0D57 8E0090 ldx #0x0090; 0D5A 308B leax d,x; 0D5C AFA4 stx ,y; 0D5E 2033 bra P0D93; 0D60 9626 P0D60: lda 0x26; 0D62 841E anda #0x1E; 0D64 8A14 ora #0x14; 0D66 48 asla; 0D67 48 asla; 0D68 A721 sta 1,y; 0D6A 2027 bra P0D93; 0D6C AEA4 P0D6C: ldx ,y; 0D6E 6A23 dec 3,y; 0D70 2745 beq P0DB7; 0D72 A623 lda 3,y; 0D74 810A cmpa #0x0A; 0D76 2409 bhs P0D81; 0D78 8107 cmpa #0x07; 0D7A 2603 bne P0D7F; 0D7C 8E0080 ldx #0x0080; 0D7F 300A P0D7F: leax 10,x; 0D81 AFA4 P0D81: stx ,y; 0D83 200E bra P0D93; 0D85 AEA4 P0D85: ldx ,y; 0D87 6A23 dec 3,y; 0D89 272C beq P0DB7; 0D8B 4F clra; 0D8C 9746 sta 0x46; 0D8E 308810 leax 0x10,x; 0D91 AFA4 stx ,y; 0D93 8EC842 P0D93: ldx #0xC842; 0D96 0A96 dec 0x96; 0D98 9696 lda 0x96; 0D9A E622 ldb 2,y; 0D9C E786 stb a,x; 0D9E 48 asla; 0D9F 8B05 adda #0x05; 0DA1 3086 leax a,x; 0DA3 ECA4 ldd ,y; 0DA5 ED84 std ,x; 0DA7 8E0DF6 ldx #0x0DF6; 0DAA A646 lda 6,u; 0DAC 2B08 bmi P0DB6; 0DAE 9B96 adda 0x96; 0DB0 A686 lda a,x; 0DB2 9A45 ora 0x45; 0DB4 9745 sta 0x45; 0DB6 39 P0DB6: rts; 0DB7 9697 P0DB7: lda 0x97; 0DB9 43 coma; 0DBA 9498 anda 0x98; 0DBC 9798 sta 0x98; 0DBE 39 rts; 0DBF 9690 P0DBF: lda 0x90; 0DC1 9497 anda 0x97; 0DC3 2702 beq P0DC7; 0DC5 9767 sta 0x67; 0DC7 3440 P0DC7: pshs u; 0DC9 8603 lda #0x03; 0DCB 9746 sta 0x46; 0DCD 969B lda 0x9B; 0DCF CE0DDE ldu #0x0DDE; 0DD2 48 asla; 0DD3 48 asla; 0DD4 33C6 leau a,u; 0DD6 BDF92E jsr $generate_explosion_sound; 0DD9 0F96 clr 0x96; 0DDB 3540 puls u; 0DDD 9677 lda 0x77; 0DDF 27D6 beq P0DB7; 0DE1 39 rts; /* Data describing the explosion sounds */ 0DE2 38 .byte 0x38, 0x3F, 0x00, 0x01; 0DE6 19 .byte 0x19, 0x3F, 0x00, 0x02; 0DEA 38 .byte 0x38, 0x3F, 0x00, 0x10; 0DEE 04 S0DEE: .byte 0x04; 0DEF 00 .byte 0x00; 0DF0 07 .byte 0x07; 0DF1 00 .byte 0x00; 0DF2 09 .byte 0x09; 0DF3 00 .byte 0x00; 0DF4 0A .byte 0x0A; 0DF5 00 .byte 0x00; 0DF6 20 S0DF6: .byte 0x20; 0DF7 10 .byte 0x10; 0DF8 08 .byte 0x08; 0DF9 04 .byte 0x04; 0DFA 02 .byte 0x02; 0DFB 01 .byte 0x01; star_castle_music: 0DFC FE .word 0xFEE8; 0DFE FE .word 0xFEB6; 0E00 90 .byte 0x90; 0E01 18 .byte 0x18; 0E02 12 .byte 0x12; 0E03 18 .byte 0x18; 0E04 06 .byte 0x06; 0E05 93 .byte 0x93; 0E06 18 .byte 0x18; 0E07 06 .byte 0x06; 0E08 90 .byte 0x90; 0E09 18 .byte 0x18; 0E0A 06 .byte 0x06; 0E0B 84 .byte 0x84; 0E0C 87 .byte 0x87; 0E0D 18 .byte 0x18; 0E0E 12 .byte 0x12; 0E0F 80 .byte 0x80; 0E10 90 .byte 0x90; 0E11 13 .byte 0x13; 0E12 12 .byte 0x12; 0E13 87 .byte 0x87; 0E14 17 .byte 0x17; 0E15 0C .byte 0x0C; 0E16 85 .byte 0x85; 0E17 15 .byte 0x15; 0E18 06 .byte 0x06; 0E19 84 .byte 0x84; 0E1A 8C .byte 0x8C; 0E1B 13 .byte 0x13; 0E1C 30 .byte 0x30; 0E1D 07 .byte 0x07; 0E1E 80 .byte 0x80; /* Vector list for player 1's star cruiser */ star_cruiser1: 0E1F 1C .byte 0x1C,0xF8; 0E21 CE .byte 0xCE,0xFC; 0E23 1C .byte 0x1C,0x08; 0E25 DC .byte 0xDC,0xE8; 0E27 14 .byte 0x14,0x1C; 0E29 EC .byte 0xEC,0x1C; 0E2B 24 .byte 0x24,0xE8; 0E2D E4 .byte 0xE4,0x08; 0E2F 32 .byte 0x32,0xFC; /* Vector list for player 2's star cruiser */ star_cruiser2: 0E31 1C .byte 0x1C,0xF8; 0E33 CE .byte 0xCE,0xFC; 0E35 1C .byte 0x1C,0x08; 0E37 EC .byte 0xEC,0xE8; 0E39 F8 .byte 0xF8,0x0C; 0E3B 0C .byte 0x0C,0x10; 0E3D F4 .byte 0xF4,0x10; 0E3F 08 .byte 0x08,0x0C; 0E41 14 .byte 0x14,0xE8; 0E43 E4 .byte 0xE4,0x04; 0E45 32 .byte 0x32,0xFC; /* Vector list for the energy cannon */ energy_cannon: 0E47 04 .byte 0x04,0x18; 0E49 04 .byte 0x04,0xE0; 0E4B 14 .byte 0x14,0xF8; 0E4D FC .byte 0xFC,0x14; 0E4F F4 .byte 0xF4,0x08; 0E51 08 .byte 0x08,0xDC; 0E53 EC .byte 0xEC,0x0C; 0E55 EC .byte 0xEC,0xF4; 0E57 08 .byte 0x08,0x24; 0E59 F4 .byte 0xF4,0xF8; 0E5B FC .byte 0xFC,0xEC; 0E5D 14 .byte 0x14,0x08; 0E5F 04 .byte 0x04,0x20; fireball: 0E61 EC .byte 0xEC,0xEC; 0E63 30 .byte 0x30,0x14; 0E65 D0 .byte 0xD0,0x14; 0E67 14 .byte 0x14,0xD0; 0E69 14 .byte 0x14,0x30; 0E6B D0 .byte 0xD0,0xEC; 0E6D 30 .byte 0x30,0xEC; 0E6F EC .byte 0xEC,0x30; 0E71 EC .byte 0xEC,0xD0; /* * Table of pointers to vector lists, having the * following format: * * line pattern, rel y, rel x, * line pattern, rel y, rel x, * . * . * 0x01 * * These look like they are vector lists for the energy * bombs. By displaying these various patterns, you * get the impression that the bomb is twinkling. */ energy_bomb_VL_table: 0E73 0E .word 0x0E83; 0E75 0E .word 0x0E99; 0E77 0E .word 0x0EAF; 0E79 0E .word 0x0EC5; 0E7B 0E .word 0x0EDB; 0E7D 0E .word 0x0EF1; 0E7F 0F .word 0x0F07; 0E81 0F .word 0x0F1D; 0E83 FF S0E83: .byte 0xFF,0x0A,0xF6; 0E86 00 .byte 0x00,0x00,0x14; 0E89 FF .byte 0xFF,0xEC,0xEC; 0E8C 00 .byte 0x00,0x00,0x14; 0E8F FF .byte 0xFF,0x0A,0xF6; 0E92 00 .byte 0x00,0x0C,0xF4; 0E95 FF .byte 0xFF,0x04,0xFC; 0E98 01 .byte 0x01; 0E99 FF S0E99: .byte 0xFF,0x0A,0xF6; 0E9C 00 .byte 0x00,0x00,0x14; 0E9F FF .byte 0xFF,0xEC,0xEC; 0EA2 00 .byte 0x00,0x00,0x14; 0EA5 FF .byte 0xFF,0x0A,0xF6; 0EA8 00 .byte 0x00,0x0A,0x06; 0EAB FF .byte 0xFF,0x0C,0x08; 0EAE 01 .byte 0x01; 0EAF FF S0EAF: .byte 0xFF,0x0A,0xF6; 0EB2 00 .byte 0x00,0x00,0x14; 0EB5 FF .byte 0xFF,0xEC,0xEC; 0EB8 00 .byte 0x00,0x00,0x14; 0EBB FF .byte 0xFF,0x0A,0xF6; 0EBE 00 .byte 0x00,0xFE,0x06; 0EC1 FF .byte 0xFF,0x04,0x0C; 0EC4 01 .byte 0x01; 0EC5 FF S0EC5: .byte 0xFF,0x0A,0xF6; 0EC8 00 .byte 0x00,0x00,0x14; 0ECB FF .byte 0xFF,0xEC,0xEC; 0ECE 00 .byte 0x00,0x00,0x14; 0ED1 FF .byte 0xFF,0x0A,0xF6; 0ED4 00 .byte 0x00,0xFA,0x08; 0ED7 FF .byte 0xFF,0x04,0x04; 0EDA 01 .byte 0x01; 0EDB FF S0EDB: .byte 0xFF,0x0A,0xF6; 0EDE 00 .byte 0x00,0x00,0x14; 0EE1 FF .byte 0xFF,0xEC,0xEC; 0EE4 00 .byte 0x00,0x00,0x14; 0EE7 FF .byte 0xFF,0x0A,0xF6; 0EEA 00 .byte 0x00,0xF6,0x06; 0EED FF .byte 0xFF,0xF8,0x04; 0EF0 01 .byte 0x01; 0EF1 FF S0EF1: .byte 0xFF,0x0A,0xF6; 0EF4 00 .byte 0x00,0x00,0x14; 0EF7 FF .byte 0xFF,0xEC,0xEC; 0EFA 00 .byte 0x00,0x00,0x14; 0EFD FF .byte 0xFF,0x0A,0xF6; 0F00 00 .byte 0x00,0xF4,0xF8; 0F03 FF .byte 0xFF,0xFC,0x08; 0F06 01 .byte 0x01; 0F07 FF S0F07: .byte 0xFF,0x0A,0xF6; 0F0A 00 .byte 0x00,0x00,0x14; 0F0D FF .byte 0xFF,0xEC,0xEC; 0F10 00 .byte 0x00,0x00,0x14; 0F13 FF .byte 0xFF,0x0A,0xF6; 0F16 00 .byte 0x00,0xF4,0xF4; 0F19 FF .byte 0xFF,0xF8,0xF8; 0F1C 01 .byte 0x01; 0F1D FF S0F1D: .byte 0xFF,0x0A,0xF6; 0F20 00 .byte 0x00,0x00,0x14; 0F23 FF .byte 0xFF,0xEC,0xEC; 0F26 00 .byte 0x00,0x00,0x14; 0F29 FF .byte 0xFF,0x0A,0xF6; 0F2C 00 .byte 0x00,0x06,0xF4; 0F2F FF .byte 0xFF,0xFC,0xFC; 0F32 01 .byte 0x01; /* Vector list for a ring (castle wall) */ ring: 0F33 28 .byte 0x28,0x64; 0F35 3C .byte 0x3C,0xC4; 0F37 00 .byte 0x00,0xB0; 0F39 C4 .byte 0xC4,0xC4; 0F3B B0 .byte 0xB0,0x00; 0F3D C4 .byte 0xC4,0x3C; 0F3F 00 .byte 0x00,0x50; 0F41 3C .byte 0x3C,0x3C; 0F43 50 .byte 0x50,0x00; 0F45 09 S0F45: .byte 0x09; 0F46 02 .byte 0x02; 0F47 02 .byte 0x02; 0F48 03 .byte 0x03; 0F49 03 .byte 0x03; 0F4A 04 .byte 0x04; 0F4B 04 .byte 0x04; 0F4C 05 .byte 0x05; 0F4D 05 .byte 0x05; 0F4E 06 .byte 0x06; 0F4F 06 .byte 0x06; 0F50 07 .byte 0x07; 0F51 07 .byte 0x07; 0F52 08 .byte 0x08; 0F53 08 .byte 0x08; 0F54 09 .byte 0x09; explosion_star: 0F55 FF .byte 0xFF,0x40,0x00; 0F58 00 .byte 0x00,0xC0,0x00; 0F5B FF .byte 0xFF,0x00,0x40; 0F5E 00 .byte 0x00,0x00,0xC0; 0F61 FF .byte 0xFF,0xC0,0x00; 0F64 00 .byte 0x00,0x40,0x00; 0F67 FF .byte 0xFF,0x00,0xC0; 0F6A 00 .byte 0x00,0x00,0x40; 0F6D FF .byte 0xFF,0x40,0x40; 0F70 00 .byte 0x00,0xC0,0xC0; 0F73 FF .byte 0xFF,0xC0,0x40; 0F76 00 .byte 0x00,0x40,0xC0; 0F79 FF .byte 0xFF,0xC0,0xC0; 0F7C 00 .byte 0x00,0x40,0x40; 0F7F FF .byte 0xFF,0x40,0xC0; 0F82 00 .byte 0x00,0xC0,0x40; 0F85 01 .byte 0x01; explosion_dots: 0F86 35 .byte 0x35,0x00; 0F88 F3 .byte 0xF3,0x0D; 0F8A F3 .byte 0xF3,0xFF; 0F8C E1 .byte 0xE1,0x26; 0F8E EC .byte 0xEC,0x03; 0F90 F3 .byte 0xF3,0xE6; 0F92 EB .byte 0xEB,0x00; 0F94 F1 .byte 0xF1,0xEC; 0F96 10 .byte 0x10,0xF1; 0F98 FA .byte 0xFA,0xEE; 0F9A 1D .byte 0x1D,0xF8; 0F9C 0F .byte 0x0F,0xE4; 0F9E 0F .byte 0x0F,0x12; 0FA0 19 .byte 0x19,0xF7; 0FA2 06 .byte 0x06,0x1A; author: 0FA4 20 .byte 0x20; 0FA5 90 .byte 0x90; 0FA6 50 .byte "PROGRAMMED BY",0x80; 0FB4 E0 .byte 0xE0; 0FB5 90 .byte 0x90; 0FB6 57 .byte "WILLIAM HAWKINS",0x80; 0FC6 90 .byte 0x90; 0FC7 C0 .byte 0xC0; 0FC8 47 .byte "GT 1983 ",0x80,0x00; game_over: 0FD4 58 .byte 0x58; 0FD5 D0 .byte 0xD0; game_over2: 0FD6 47 .byte "GAME OVER",0x80; player1: 0FE0 48 .byte 0x48; 0FE1 D0 .byte 0xD0; 0FE2 50 .byte "PLAYER 1",0x80; player2: 0FEB 48 .byte 0x48; 0FEC D0 .byte 0xD0; 0FED 50 .byte "PLAYER 2",0x80; 0FF6 00 .byte 0x00; 0FF7 00 .byte 0x00; 0FF8 00 .byte 0x00; 0FF9 00 .byte 0x00; 0FFA 00 .byte 0x00; 0FFB 00 .byte 0x00; 0FFC 00 .byte 0x00; 0FFD 00 .byte 0x00; 0FFE 00 .byte 0x00; 0FFF 00 .byte 0x00;