Home » Archimedes archive » Archimedes World » AW-1991-02.adf » !AWFeb91/Goodies/StarFight/!StarFight/GAMECODE
!AWFeb91/Goodies/StarFight/!StarFight/GAMECODE
This website contains an archive of files for the Acorn Electron, BBC Micro, Acorn Archimedes, Commodore 16 and Commodore 64 computers, which Dominic Ford has rescued from his private collection of floppy disks and cassettes.
Some of these files were originally commercial releases in the 1980s and 1990s, but they are now widely available online. I assume that copyright over them is no longer being asserted. If you own the copyright and would like files to be removed, please contact me.
Tape/disk: | Home » Archimedes archive » Archimedes World » AW-1991-02.adf |
Filename: | !AWFeb91/Goodies/StarFight/!StarFight/GAMECODE |
Read OK: | ✔ |
File size: | 1B4DD bytes |
Load address: | FFFFFB41 |
Exec address: | 9AECCF55 |
File contents
10 REM >GAMECODE 20 REM (C) Copyright 30 REM N.WESTLEY & C.WESTLEY 40 REM Warning ! STARFIGHT must be RUN first 50 60 PROCassemble 70 CALL gamecode 80 90 END 100 110 REM **************************************************************** 120 130 DEF PROCassemble 140 DIM CODE% &24000 150 FOR PASS=0 TO 2 STEP 2 160 P%=CODE% 170 [ OPT PASS 180 .gamecode 190 STMFD R13!,{R14} ; Save Return address to BASIC 200 MOV R0,#200 : MOV R1,#3 ; ESCAPE disabled / BREAK clears memory 210 SWI "OS_Byte" 220 MOV R0,#9 ; MODE 230 SWI &100+22 240 SWI "OS_WriteC" 250 SWI "OS_RemoveCursors" ; OFF 260 SWI &100+5 ; VDU 5 270 SWI &100+18 280 MOV R0,#3 290 SWI "OS_WriteC" 300 MOV R0,#3 310 SWI "OS_WriteC" 320 BL change_palette ; initialise palette 330 B name_entered 340 350 .game_start 360 BL print_wave 370 BL reset_var_addr ; address of start of variables 380 BL init_wave_vars ; resets all variables to current wave 390 BL load_newaddr : BL usership 400 BL prepare_wave ; delay before start 410 BL reset_var_addr 420 MOV R0,#1 ; R0=1 THEN see program_variables routine 430 BL init_wave_vars 440 B display ; PLAY GAME 450 460 ; ********************************************************************** 470 480 490 .getloc 500 STMFD R13!,{R14} : BL directive_byte : LDMFD R13!,{R14} 510 ADD R10,R9,#9 520 LDRB R1,[R2,R10] ; check if sprite is onscreen 530 CMP R1,#0 : BNE onscreen 540 MOV R1,#1 : STRB R1,[R2,R10] ; is now on screen 550 .onscreen 560 ADD R10,R9,#8 570 LDRB R1,[R2,R10] ; pattern pointer 580 STMFD R13!,{R14} : BL directive_pattern : LDMFD R13!,{R14} 590 LDRB R4,[R3,R1] ; pattern data byte 600 CMP R4,#32 : BNE this_number 610 ; offscreen - end of pattern for this sprite ELSE branch 620 .offscreen 630 ADD R10,R9,#9 640 MOV R11,#2 ; dead 650 STRB R11,[R2,R10] 660 STMFD R13!,{R14} : BL load_last_sprite : ADD R11,R11,#1 : BL store_last_sprite : LDMFD R13!,{R14} ; Check for end of pattern - for last sprite 670 .this_number 680 ANDS R4,R4,#4 ; across, check sign of X co-ordinate 690 BEQ xplus ; BIT 3 set if minus so no branch 700 710 .xminus 720 LDRB R4,[R3,R1] 730 AND R4,R4,#3 740 ADD R4,R4,R4 750 ADD R10,R9,#0 760 LDR R0,[R2,R10] 770 SUB R0,R0,R4 780 B yvalue 790 .xplus 800 LDRB R4,[R3,R1] 810 AND R4,R4,#3 820 ADD R4,R4,R4 ; multiply by 2 830 ADD R10,R9,#0 840 LDR R0,[R2,R10] 850 ADD R0,R0,R4 860 .yvalue 870 LDRB R5,[R3,R1] ; down 880 ANDS R5,R5,#32 890 BEQ yplus 900 .yminus 910 LDRB R5,[R3,R1] 920 AND R5,R5,#24 930 MOV R5,R5,LSR #2 940 MOV R6,#160 : MUL R7,R5,R6 950 SUB R0,R0,R7 960 ADD R10,R9,#0 970 STR R0,[R2,R10] ; location of screen address 980 B bomb_drop_check 990 .yplus 1000 LDRB R5,[R3,R1] 1010 AND R5,R5,#24 1020 MOV R5,R5,LSR #2 ; divide by 4 1030 MOV R6,#160 : MUL R7,R5,R6 1040 ADD R0,R0,R7 1050 ADD R10,R9,#0 1060 STR R0,[R2,R10] ; location of screen address 1070 1080 .bomb_drop_check 1090 STMFD R13!,{R14,R1-R7} : BL random_generator : LDMFD R13!,{R14,R1-R7} 1100 ADR R5,random_numbers 1110 LDRB R6,bomb_drop_pos ; count for pattern positions to release bombs 1120 .b 1130 LDRB R4,[R5],#1 1140 CMP R4,#0 : BEQ zero_pos ; start of pattern 1150 CMP R1,R4 1160 BEQ new_bomb 1170 .zero_pos 1180 SUBS R6,R6,#1 1190 BNE b 1200 B no_bomb 1210 .new_bomb 1220 LDRB R4,no_alien_bombs 1230 MOV R5,R4,LSL#3 ; 8 bytes for each bomb dropped 1240 ADD R4,R4,#1 ; increment the no. of alien bombs on screen 1250 STRB R4,no_alien_bombs 1260 STMFD R13!,{R14} : BL directive_ab : LDMFD R13!,{R14} 1270 ADD R4,R4,R5 1280 .cyan 1290 LDRB R5,cyan_counter : CMP R5,#0 : BEQ red ; no cyan bomb 1300 SUBS R5,R5,#1 : STRB R5,cyan_counter 1310 BNE red 1320 LDRB R5,Ccyan_counter : STRB R5,cyan_counter 1330 MOV R5,#12 : STRB R5,[R4,#4] 1340 B got_colour 1350 .red 1360 LDRB R5,red_counter : CMP R5,#0 : BEQ yellow ; no red bomb 1370 SUBS R5,R5,#1 : STRB R5,red_counter 1380 BNE yellow 1390 LDRB R5,Cred_counter : STRB R5,red_counter 1400 MOV R5,#24 : STRB R5,[R4,#4] 1410 B got_colour 1420 .yellow MOV R5,#0 : STRB R5,[R4,#4] 1430 .got_colour 1440 LDRB R5,bombs_speed : SUBS R5,R5,#1 : STRB R5,bombs_speed 1450 BNE slow_bomb 1460 LDRB R5,Cbombs_speed : STRB R5,bombs_speed 1470 MOV R5,#2 : STRB R5,[R4,#5] 1480 B fast_bomb 1490 .slow_bomb 1500 MOV R5,#1 : STRB R5,[R4,#5] 1510 .fast_bomb 1520 1530 STMFD R13!,{R14,R0-R2} 1540 MOV R1,R0 : ADD R1,R1,#1920 : ADD R1,R1,#3 ; place bombs below centre of alien sprite 1550 STR R1,[R4] ; stores address alien reached when dropping 1560 BL print_bomb : LDMFD R13!,{R15,R0-R2} 1570 .no_bomb 1580 MOV R15,R14 1590 .no_alien_bombs EQUB 0 1600 .cyan_counter EQUB 4 ; cyan bomb dropped every so many 1610 .Ccyan_counter EQUB 4 1620 .red_counter EQUB 8 ; red bomb dropped every so many 1630 .Cred_counter EQUB 8 1640 .bombs_speed EQUB 10 ; 160= 1 line, 320= 2 lines on every 10'th bomb 1650 .Cbombs_speed EQUB 10 1660 .bomb_drop_pos EQUB 2 ; positions in which to drop bombs, set to two 1670 ALIGN 1680 1690 .directive_alien_bombs 1700 LDRB R1,no_alien_bombs 1710 MOV R15,R14 1720 1730 .random_generator ; generate random numbers in pattern loop each time character is moved, these are the positions the bombs are dropped. 1740 LDRB R5,no_random_numbers ; number of random numbers to generate 1750 LDRB R7,no_range 1760 ADR R6,random_numbers ; store for random numbers 1770 .rgloop 1780 MOV R1,#8 ; initialise bit count 1790 MOV R3,#&80000000 ; msb set to 1 for TST 1800 .begin 1810 LDR R2,shiftreg 1820 TST R2,R3 1830 BEQ zerobit ; IF msb =0 Branch to zerobit 1840 LDR R4,constant 1850 EORS R2,R2,R4 ; EOR bottom 3 bits of shiftreg with constant 1860 .zerobit 1870 MOVS R2,R2,LSL #1 ; Rotate shiftreg 1 bit left 1880 STR R2,shiftreg ; store random number 1890 SUBS R1,R1,#1 ; continue for 8 bits 1900 BNE begin 1910 MOV R2,R2,LSR #24 ; Shift HI BYTE to LOW BYTE 1920 .check_range 1930 CMP R2,R7 ; check random number range 1940 BLE within_range 1950 SUB R2,R2,R7 ; random no. = random no. - 94 1960 B check_range 1970 .within_range 1980 STRB R2,[R6,R5] ; store random no. 1990 SUBS R5,R5,#1 ; NEXT number 2000 BNE rgloop 2010 MOV R15,R14 2020 2030 .shiftreg EQUD RND 2040 .constant EQUD &0076B553 2050 .random_numbers EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 2060 .no_random_numbers EQUB 2 2070 .no_range EQUB 94 2080 ALIGN 2090 2100 .display 2110 ADD R8,R8,#1 2120 STMFD R13!,{R14}:BL load_no_of_sprites:LDMFD R13!,{R14} 2130 CMP R8,R10 : SUBEQ R8,R8,#1 2140 MOV R9,#1 : STREQB R9,section_flag 2150 MOV R12,#1 : MOV R9,#0 2160 .loop 2170 STMFD R13!,{R14,R0-R7} : BL change_palette : LDMFD R13!,{R14,R0-R7} 2180 2190 STMFD R13!,{R9,R8}: BL explosion_check : BL bomb_explo_check : BL cluster_check : LDMFD R13!,{R9,R8} 2200 LDRB R10,section_flag : CMP R10,#1 : BEQ blackout ; first set in pattern 2210 CMP R8,R12 : BNE blackout 2220 LDRB R10,delay : CMP R10,#0 : BEQ over2 2230 SUB R10,R10,#1 : STRB R10,delay 2240 MOV R12,#1 : MOV R9,#0 2250 CMP R8,R12 : BEQ print 2260 B blackout 2270 .over2 2280 LDRB R10,space : STRB R10,delay 2290 CMP R8,R12 : BEQ print ; check if last one in loop 2300 2310 .blackout 2320 STMFD R13!,{R14} : BL directive_byte : LDMFD R13!,{R14} 2330 ADD R10,R9,#9 : LDRB R11,[R2,R10] : CMP R11,#4 : BEQ over ; explosion 2340 CMP R11,#2 : BEQ over ; dead / offscreen 2350 ADD R10,R9,#0 : LDR R1,[R2,R10] 2360 ADD R10,R9,#4 2370 BL draw 2380 2390 .print BL getloc ; before calculating new address the sprite is removed from screen in routine blackout 2400 ADD R10,R9,#9 : LDRB R11,[R2,R10] : CMP R11,#4 : BEQ over ; explosion 2410 CMP R11,#2 : BEQ over ; dead / offscreen 2420 ADD R10,R9,#8 : ADD R1,R1,#1 : STRB R1,[R2,R10] ; increment pattern pointer 2430 ADD R10,R9,#0 : LDR R1,[R2,R10] ; location of screen address 2440 ADD R10,R9,#4 2450 STMFD R13!,{R14,R0-R8} : BL move_stars : LDMFD R13!,{R14,R0-R8} 2460 BL draw 2470 STMFD R13!,{R14} : BL load_dead : LDMFD R13!,{R14} : CMP R1,#1 : BLEQ usership_explosion 2480 STMFD R13!,{R14} : BL load_dead : LDMFD R13!,{R14} : CMP R1,#1 : BEQ usership_DEAD 2490 STMFD R13!,{R8,R9}: BL test_keypress : LDMFD R13!,{R8,R9} 2500 MOV R0,#129 : LDR R1,escape : MOV R2,#255 : SWI "OS_Byte" ; ESCAPE 2510 CMP R1,#255 : BLEQ self_destruct 2520 BL usership_collision 2530 .usership_DEAD 2540 BL load_no_of_bullets : CMP R2,#0 : STMFD R13!,{R8,R9} : BLNE inner : LDMFD R13!,{R8,R9} 2550 BL drop_bombs ; alien bombs are moved futher down the screen 2560 BL slow 2570 .over 2580 STMFD R13!,{R14} : BL load_no_of_sprites : LDMFD R13!,{R14} 2590 SUB R10,R10,#1 2600 STMFD R13!,{R14} : BL load_last_sprite : LDMFD R13!,{R14} 2610 CMP R10,R11 : BEQ continue_play 2620 CMP R8,R12 : BEQ display ; no more sprites in this section 2630 ADD R12,R12,#1 : ADD R9,R9,#12 : B loop ; next sprite 2640 .space EQUB 7 2650 .delay EQUB 7 2660 .section_flag EQUB 0 2670 ALIGN 2680 2690 .test_keypress 2700 STMFD R13!,{R14} 2710 SWI "OS_Mouse" 2720 CMP R2,#3 : BNE tkover 2730 BL fire : BL right 2740 .tkover 2750 CMP R2,#6 : BNE tkover2 2760 BL fire : BL left 2770 .tkover2 2780 CMP R2,#1 : BLEQ right 2790 CMP R2,#4 : BLEQ left 2800 CMP R2,#2 : BLEQ fire 2810 MOV R0,#129 : LDR R1,upkey : MOV R2,#255 : SWI "OS_Byte" 2820 CMP R1,#255 : BLEQ up 2830 MOV R0,#129 : LDR R1,downkey : MOV R2,#255 : SWI "OS_Byte" 2840 CMP R1,#255 : BLEQ down 2850 MOV R0,#129 : LDR R1,pausekey : MOV R2,#255 : SWI "OS_Byte" 2860 CMP R1,#255 : STMFD R13!,{R14} : BLEQ pause : LDMFD R13!,{R14} 2870 STMFD R13!,{R14,R0-R12} : BLEQ pause : LDMFD R13!,{R14,R0-R12} 2880 MOV R0,#15 : MOV R1,#0 : SWI "OS_Byte" 2890 LDMFD R13!,{R15} 2900 .upkey EQUD &FFFFFFBE ; A - INKEY value (-66) 2910 .downkey EQUD &FFFFFF9E ; Z - INKEY value (-98) 2920 .pausekey EQUD &FFFFFFC8 ; P - INKEY value (-56) 2930 .escape EQUD &FFFFFF8F ; ESC - INKEY value (-113) 2940 2950 .draw 2960 STMFD R13!,{R14} : BL directive_sprites_data : LDMFD R13!,{R14} 2970 MOV R3,#12 2980 .eight 2990 MOV R4,#8 3000 .twelve 3010 LDRB R5,[R2],#1 3020 LDRB R6,[R1,#1] 3030 EOR R5,R5,R6 3040 STRB R5,[R1,#1]! 3050 SUBS R4,R4,#1 3060 BNE twelve 3070 ADD R1,R1,#152 ; 160 pixels across 3080 SUBS R3,R3,#1 3090 BNE eight 3100 MOV R15,R14 3110 3120 .slow 3130 MOV R5,#255 3140 .slow1 3150 MOV R6,#100 3160 .slow2 3170 SUBS R6,R6,#5 : BNE slow2 3180 SUBS R5,R5,#1 : BNE slow1 3190 MOV R15,R14 3200 3210 .initial_stars 3220 ADR R1,stars_address 3230 ADR R2,stars_speed 3240 MOV R3,#43 3250 .next_star 3260 LDR R5,[R1],#4 3270 LDRB R6,[R5] 3280 LDR R7,[R2],#4 : CMP R7,#160 3290 MOVGT R4,#&77 : MOVLE R4,#7 3300 EOR R6,R6,R4 3310 STRB R6,[R5] 3320 SUBS R3,R3,#1 3330 BNE next_star 3340 MOV R15,R14 3350 3360 .move_stars 3370 LDR R1,stars_delay : SUBS R1,R1,#1 : STR R1,stars_delay 3380 MOVNE R15,R14 : MOV R1,#2 : STR R1,stars_delay 3390 ADR R1,stars_address 3400 ADR R2,stars_speed 3410 MOV R3,#43 3420 .next_move 3430 LDR R5,[R1] 3440 LDRB R6,[R5] 3450 LDR R7,[R2],#4 : CMP R7,#160 3460 MOVGT R4,#&77 : MOVLE R4,#7 3470 EOR R6,R6,R4 3480 STRB R6,[R5] 3490 ADD R5,R5,R7 3500 LDR R8,first_addr 3510 CMP R5,R8 3520 LDRGE R8,stars_down 3530 SUBGE R5,R5,R8 3540 STR R5,[R1],#4 3550 LDRB R6,[R5] 3560 EOR R6,R6,R4 3570 STRB R6,[R5] 3580 SUBS R3,R3,#1 3590 BNE next_move 3600 MOV R15,R14 3610 3620 .first_addr EQUD &1FE1FFF 3630 .stars_down EQUD 40020 3640 .stars_delay EQUD 2 3650 .stars_address 3660 EQUD &1FDBDFE: EQUD &1FDFEB0: EQUD &1FDFF50: EQUD &1FDC829: EQUD &1FDAD3B: EQUD &1FDB121: EQUD &1FDB1C1 3670 EQUD &1FDCE6E: EQUD &1FDB932: EQUD &1FDB9D2: EQUD &1FE12D1: EQUD &1FE00A3: EQUD &1FE0143: EQUD &1FDCAC8 3680 EQUD &1FDBE60: EQUD &1FDBF00: EQUD &1FDE20E: EQUD &1FDDF76: EQUD &1FDE016: EQUD &1FDEAA1: EQUD &1FDEB41: EQUD &1FE1DAD 3690 EQUD &1FE075C: EQUD &1FE07FC: EQUD &1FE1A2F: EQUD &1FE1ACF: EQUD &1FE138E: EQUD &1FDE9C5: EQUD &1FDC313 3700 EQUD &1FDB3D5: EQUD &1FDB475: EQUD &1FDEE16: EQUD &1FDEEB6: EQUD &1FDA94C: EQUD &1FE0552: EQUD &1FDD78C 3710 EQUD &1FE00DE: EQUD &1FE0CC8: EQUD &1FE0D68: EQUD &1FE1008: EQUD &1FDDB7E: EQUD &1FDD5C6: EQUD &1FDD666 3720 3730 .stars_speed 3740 EQUD 160: EQUD 320: EQUD 320:EQUD 160: EQUD 160: EQUD 320: EQUD 320: EQUD 160: EQUD 480: EQUD 480: EQUD 160: EQUD 320: EQUD 320: EQUD 160 3750 EQUD 480: EQUD 480: EQUD 160: EQUD 320: EQUD 320: EQUD 320: EQUD 320: EQUD 160: EQUD 480: EQUD 480: EQUD 320: EQUD 320: EQUD 160: EQUD 160: EQUD 160 3760 EQUD 320: EQUD 320: EQUD 320: EQUD 320:EQUD 160: EQUD 160: EQUD 160: EQUD 160: EQUD 480: EQUD 480:EQUD 160: EQUD 160: EQUD 320: EQUD 320 3770 3780 3790 .drop_bombs 3800 STMFD R13!,{R14} : BL directive_ab : LDMFD R13!,{R14} 3810 LDRB R5,no_alien_bombs 3820 CMP R5,#0 : MOVEQ R15,R14 3830 MOV R2,#1 3840 LDR R6,screen_bottom 3850 LDR R10,leftside : ADD R10,R10,#1600 ; move check point (leftside) to bottom level of usership 3860 LDR R11,rightside : ADD R11,R11,#1760 ; move check point (rightside) to bottom level of usership plus 160 for a two line gap, as bombs drop by two pixels max. 3870 .next_bomb 3880 LDR R1,[R4] 3890 STMFD R13!,{R14,R1-R6} : BL print_bomb : LDMFD R13!,{R14,R1-R6} 3900 LDRB R7,[R4,#5] ; bomb speed 3910 CMP R7,#1 : ADDEQ R1,R1,#160 ; 1 line - slow 3920 CMP R7,#2 : ADDEQ R1,R1,#320 ; 2 lines - fast 3930 CMP R10,R1 : BGT check_screenbottom 3940 CMP R11,R1 : BGT on_level 3950 .check_screenbottom ; below or on level with ship 3960 CMP R6,R1 3970 BLE on_level 3980 3990 .check_for_red 4000 STMFD R13!,{R1-R6,R10,R11} 4010 LDRB R2,[R4,#4] : CMP R2,#24 : BNE not_red 4020 SUB R10,R10,#8000 ; correct height for cluster explosion 4030 SUB R11,R11,#8000 4040 CMP R10,R1 : BGT wrong_height 4050 CMP R11,R1 : BLT wrong_height 4060 4070 LDRB R5,cluster_bombs : CMP R5,#2 : BEQ not_red ; enough red bombs 4080 ADD R5,R5,#1 : STRB R5,cluster_bombs 4090 STMFD R13!,{R14} : BL initialise_cluster : LDMFD R13!,{R14} 4100 LDMFD R13!,{R1-R6,R10,R11} 4110 B one_less_bomb 4120 4130 4140 .wrong_height 4150 .not_red 4160 LDMFD R13!,{R1-R6,R10,R11} 4170 4180 B mbover 4190 .on_level 4200 STMFD R13!,{R14,R1-R6} : LDRB R2,[R4,#4] : CMP R2,#12 : BLEQ bomb_explosion : LDMFD R13!,{R14,R1-R6} 4210 .one_less_bomb 4220 STMFD R13!,{R14,R1-R6} : BL memmove_bombs : LDMFD R13!,{R14,R1-R6} 4230 SUB R2,R2,#1:SUB R5,R5,#1 4240 B mbover2 4250 .mbover 4260 STMFD R13!,{R14,R1-R6} : BL print_bomb : LDMFD R13!,{R14,R1-R6} 4270 STR R1,[R4],#8 4280 .mbover2 4290 ADD R2,R2,#1 : CMP R2,R5 : BLE next_bomb 4300 MOV R15,R14 4310 .screen_bottom EQUD &1FE1AFF 4320 4330 .print_bomb 4340 LDRB R2,[R4,#4] 4350 ADR R3,yellowbomb 4360 ADD R3,R3,R2 4370 MOV R0,#0 4380 MOV R2,#6 4390 .pbloop 4400 MOV R5,#2 4410 .pbloop2 4420 LDRB R4,[R3],#1 4430 LDRB R6,[R1,#1] 4440 CMP R6,#0 : BEQ Bskip 4450 EORS R4,R4,R6 4460 MOVNE R0,#1 4470 .Bskip 4480 STRB R4,[R1,#1]! 4490 SUBS R5,R5,#1 4500 BNE pbloop2 4510 ADD R1,R1,#158 4520 SUBS R2,R2,#1 4530 BNE pbloop 4540 CMP R0,#0 : BEQ bomb_clear 4550 STMFD R13!,{R14,R1} : BL load_dead : MOV R2,R1 : LDMFD R13!,{R14,R1} 4560 CMP R2,#1 : BEQ bomb_clear 4570 STMFD R13!,{R14,R1-R6} : BL bomb_hit : LDMFD R13!,{R14,R1-R6} 4580 .bomb_clear 4590 MOV R15,R14 4600 .yellowbomb EQUD &03300330 : EQUD &03300330 : EQUD &03300330 4610 .cyanbomb EQUD &06600660 : EQUD &06600660 : EQUD &06600660 4620 .redbomb EQUD &01100110 : EQUD &01100110 : EQUD &01100110 4630 4640 .bomb_hit 4650 STMFD R13!,{R14}:BL bomb_hit_coordinates : LDMFD R13!,{R14} 4660 .BX_check 4670 LDR R1,X_bullet 4680 LDR R2,X_usership 4690 LDRB R3,bullet_width 4700 LDRB R4,usership_width 4710 CMP R1,R2 4720 BGT usership_left 4730 ADD R1,R1,R3 4740 CMP R1,R2 4750 BLT no_collision 4760 B BY_check 4770 4780 .usership_left 4790 ADD R2,R2,R4 4800 CMP R1,R2 4810 BGT no_collision 4820 4830 .BY_check 4840 LDR R1,Y_bullet 4850 LDR R2,Y_usership 4860 LDRB R3,bullet_height 4870 LDRB R4,usership_height 4880 CMP R1,R2 4890 BLT usership_higher 4900 SUB R1,R1,R3 4910 CMP R1,R2 4920 BGT no_collision 4930 B B_clear 4940 4950 .usership_higher 4960 SUB R2,R2,R4 4970 CMP R1,R2 4980 BLT no_collision 4990 .B_clear 5000 5010 MOV R0,#1 : STRB R0,dead 5020 MOV R0,#4:MOV R1,#15:RSB R1,R1,#0:MOV R2,#1:MOV R3,#25:SWI "Sound_Control" ; usership sound 5030 STMFD R13!,{R1-R8,R14} : BL initialise_particles : BL particle_spread : LDMFD R13!,{R1-R8,R14} 5040 5050 .no_collision 5060 5070 MOV R15,R14 5080 5090 .memmove_bombs 5100 LDRB R1,no_alien_bombs 5110 CMP R2,R1 : BEQ last_bomb 5120 ADD R2,R2,#1 5130 .mbloop 5140 LDR R3,[R4,#8]! ; 4 Byte Bombs Address 5150 STR R3,[R4,#-8] 5160 LDR R3,[R4,#4] ; 4 Byte Bomb Info - colour,timer,frame pointer 5170 STR R3,[R4,#-4] 5180 ADD R2,R2,#1 5190 CMP R2,R1 5200 BLE mbloop 5210 .last_bomb 5220 SUB R1,R1,#1 5230 STRB R1,no_alien_bombs 5240 MOV R15,R14 5250 5260 .bomb_explosion 5270 SUB R1,R1,#964 ; on level with top of bullet 5280 LDRB R2,no_bombs_explo 5290 ADR R3,bombs_exploaddr : ADD R3,R3,R2,LSL #3 : STR R1,[R3] 5300 MOV R5,#25 : STRB R5,[R3,#4] ; bombs explosion timer 5310 MOV R5,#0 : STRB R5,[R3,#5] ; bombs frame pointer 5320 ADD R2,R2,#1 :STRB R2,no_bombs_explo 5330 5340 STMFD R13!,{R14} : BL explosion_bomb : LDMFD R13!,{R14} 5350 MOV R0,#3:MOV R1,#7:RSB R1,R1,#0:MOV R2,#1:MOV R3,#14:SWI "Sound_Control" ; white explosion sound 5360 MOV R15,R14 5370 5380 .program_variables 5390 ; all program variables are initialised here except byte and seperate alien_bomb_variables 5400 5410 ; constant variables are set first 5420 CMP R0,#1 5430 MOV R1,#0 5440 STRB R1,no_alien_bombs 5450 STRB R1,section_flag 5460 STRB R1,no_bombs_explo 5470 STRB R1,cluster_bombs 5480 STRNEB R1,no_of_bullets 5490 STRNEB R1,gap 5500 STRB R1,bullet_on_screen 5510 STRB R1,memory_move 5520 STRB R1,hit 5530 STRB R1,last_sprite 5540 STRB R1,dead 5550 5560 ; variables set by user 5570 STRB R2,cyan_counter 5580 STRB R2,Ccyan_counter 5590 STRB R3,red_counter 5600 STRB R3,Cred_counter 5610 STRB R4,bombs_speed 5620 STRB R4,Cbombs_speed 5630 STRB R5,bomb_drop_pos 5640 STRB R6,no_random_numbers 5650 STRB R7,no_range 5660 STRB R8,space 5670 STRB R9,delay 5680 STRB R10,no_of_sprites 5690 5700 .renew_vars 5710 LDRNE R1,Cleftside : STRNE R1,leftside 5720 LDRNE R1,Crightside : STRNE R1,rightside 5730 LDRNE R1,Cnewaddr : STRNE R1,newaddr : STRNE R1,oldaddr 5740 LDRB R1,Cusership_frames : STRB R1,usership_frames 5750 LDRB R1,Cusership_timer : STRB R1,usership_timer 5760 5770 MOV R15,R14 5780 5790 .leftside EQUD &1FE1427 5800 .rightside EQUD &1FE14AF 5810 .Cleftside EQUD &1FE1427 5820 .Crightside EQUD &1FE14AF 5830 .Cnewaddr EQUD &1FE146B 5840 .Cusership_frames EQUB 10 5850 .Cusership_timer EQUB 6 5860 ALIGN 5870 5880 .bomb_explo_check 5890 LDRB R7,no_bombs_explo : CMP R7,#0 : BEQ no_explosion 5900 STMFD R13!,{R14} : BL directive_explosion : MOV R8,R2 : LDMFD R13!,{R14} 5910 ADR R3,bombs_exploaddr 5920 MOV R4,#0 5930 .bec_loop 5940 MOV R5,#0 : ADD R5,R3,R4,LSL #3 5950 LDRB R6,[R5,#4] : SUBS R6,R6,#1 : STRB R6,[R5,#4] : BNE next_check 5960 MOV R6,#25 : STRB R6,[R5,#4] ; reset bomb timer for next frame 5970 5980 LDRB R6,[R5,#5] ; frame pointer 5990 MOV R2,#140 ; data in each frame 6000 MLA R2,R6,R2,R8 : LDR R1,[R5] 6010 STMFD R13!,{R14,R0-R6} : BL eb_frame : LDMFD R13!,{R14,R0-R6} 6020 CMP R6,#3 : BNE next_explo 6030 STMFD R13!,{R14,R1-R4} : BL memmove_bombsexplo : LDMFD R13!,{R14,R1-R4} 6040 SUB R4,R4,#1 6050 B next_check 6060 .next_explo 6070 ADD R6,R6,#1 : STRB R6,[R5,#5] ; next frame 6080 MOV R2,#140 6090 MLA R2,R6,R2,R8 : LDR R1,[R5] 6100 STMFD R13!,{R14,R0-R6} : BL eb_frame : LDMFD R13!,{R14,R0-R6} 6110 6120 .next_check 6130 ADD R4,R4,#1 : CMP R4,R7 : BNE bec_loop 6140 .no_explosion 6150 MOV R15,R14 6160 6170 .no_bombs_explo EQUB 0 6180 ALIGN 6190 .bombs_exploaddr 6200 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 6210 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 6220 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 6230 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 6240 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 6250 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 6260 6270 .memmove_bombsexplo 6280 ; R7 = no_bombs_explo 6290 MOV R2,#1 6300 CMP R2,R7 : BEQ last_explo 6310 .mbeloop 6320 LDR R4,[R3,#8]! ; 4 Byte Bombs Address 6330 STR R4,[R3,#-8] 6340 LDR R4,[R3,#4] ; 4 Byte Bomb Info - colour,timer,frame pointer 6350 STR R4,[R3,#-4] 6360 ADD R2,R2,#1 6370 CMP R2,R7 6380 BLE mbeloop 6390 .last_explo 6400 SUB R7,R7,#1 6410 STRB R7,no_bombs_explo 6420 MOV R15,R14 6430 6440 .explosion_bomb 6450 ; R1 - address of explosion 6460 STMFD R13!,{R14} : BL directive_explosion : LDMFD R13!,{R14} 6470 .eb_frame 6480 STMFD R13!,{R1} ; store explosion address 6490 MOV R0,#0 6500 MOV R3,#14 6510 .eb_eight 6520 MOV R4,#10 6530 .eb_twelve 6540 LDRB R5,[R2],#1 6550 CMP R5,#&03 : MOVEQ R5,#&07 6560 CMP R5,#&33 : MOVEQ R5,#&77 6570 LDRB R6,[R1,#1] 6580 CMP R5,#0 : EOREQ R5,R5,R6 : BEQ eb_byte_ok 6590 CMP R6,#0 : BEQ eb_byte_ok 6600 EORS R5,R5,R6 6610 MOVNE R0,#1 6620 .eb_byte_ok 6630 STRB R5,[R1,#1]! 6640 SUBS R4,R4,#1 6650 BNE eb_twelve 6660 ADD R1,R1,#150 ; 160 pixels across 6670 SUBS R3,R3,#1 6680 BNE eb_eight 6690 LDMFD R13!,{R1} ; restore explosion address 6700 CMP R0,#1 : BNE explo_clear 6710 LDRB R2,dead : CMP R2,#1 : BEQ explo_clear 6720 STMFD R13!,{R14,R1-R6} : BL explo_hit : LDMFD R13!,{R14,R1-R6} 6730 .explo_clear 6740 MOV R15,R14 6750 6760 .explo_hit 6770 ; R1 - bomb address, reloaded from stack in previous routine 6780 STMFD R13!,{R14}:BL explo_hit_coordinates : LDMFD R13!,{R14} 6790 6800 .EX_check 6810 LDR R1,X_explosion 6820 LDR R2,X_usership 6830 LDRB R3,explosion_width 6840 LDRB R4,usership_width 6850 CMP R1,R2 6860 BGT explosion_left 6870 ADD R1,R1,R3 6880 CMP R1,R2 6890 BLT no_explo 6900 B EY_check 6910 6920 .explosion_left 6930 ADD R2,R2,R4 6940 CMP R1,R2 6950 BGT no_explo 6960 6970 .EY_check 6980 LDR R1,Y_explosion 6990 LDR R2,Y_usership 7000 LDRB R3,explosion_height 7010 LDRB R4,usership_height 7020 CMP R1,R2 7030 BLT explosion_higher 7040 SUB R1,R1,R3 7050 CMP R1,R2 7060 BGT no_explo 7070 B E_clear 7080 7090 .explosion_higher 7100 SUB R2,R2,R4 7110 CMP R1,R2 7120 BLT no_explo 7130 .E_clear 7140 7150 MOV R0,#1 : STRB R0,dead 7160 MOV R0,#4:MOV R1,#15:RSB R1,R1,#0:MOV R2,#1:MOV R3,#25:SWI "Sound_Control" ; usership sound 7170 STMFD R13!,{R1-R8,R14} : BL initialise_particles : BL particle_spread : LDMFD R13!,{R1-R8,R14} 7180 7190 .no_explo 7200 7210 7220 MOV R15,R14 7230 7240 .initialise_cluster 7250 ; R1 - start address of cluster bomb 7260 STMFD R13!,{R14,R1-R6} : BL print_bomb : LDMFD R13!,{R14,R1-R6} 7270 ADD R1,R1,#1 7280 ADR R2,cluster_addr 7290 LDRB R3,cluster_bombs : SUB R3,R3,#1 7300 MOV R5,#48 : MLA R2,R3,R5,R2 7310 MOV R3,#6 7320 MOV R5,#1 7330 .icloop 7340 MOV R4,#2 7350 .icloop2 7360 STR R1,[R2],#4 7370 ADD R1,R1,#1 7380 SUBS R4,R4,#1 7390 BNE icloop2 7400 ADD R1,R1,#158 7410 SUBS R3,R3,#1 7420 BNE icloop 7430 ADR R2,cluster_frames 7440 LDRB R3,cluster_bombs : SUB R3,R3,#1 7450 MOV R5,#4 : MLA R2,R3,R5,R2 7460 MOV R5,#&0A00 : STR R5,[R2] ; reset delay and frames 7470 MOV R15,R14 7480 7490 .cluster_spread 7500 ; R1 cluster addresses 7510 ; R2 cluster paths 7520 BNV end 7530 ADR R3,redbomb 7540 MOV R4,#12 ; no of pixels in cluster 7550 .csloop 7560 LDR R8,[R2],#4 ; data for a single pixel path 7570 CMP R8,#&B : BNE check_cluster_end 7580 STMFD R13!,{R14,R1-R8} : BL cluster_blast : LDMFD R13!,{R14,R1-R8} 7590 ADD R3,R3,#1 : ADD R1,R1,#4 7600 B last_cframe 7610 .check_cluster_end 7620 CMP R8,#&E : ADDEQ R3,R3,#1 :ADDEQ R1,R1,#4 : BEQ last_cframe 7630 LDRB R5,[R3],#1 ; colour = red 7640 LDR R6,[R1] ; address held in R1 7650 LDRB R7,[R6] ; contents of screen in R7 7660 EOR R7,R7,R5 ; colour pixel black 7670 STRB R7,[R6] ; blank out pixel on screen 7680 ADD R6,R6,R8 ; add offset path to current address 7690 STR R6,[R1],#4 ; store new address 7700 CMP R8,#0 : BEQ last_cframe 7710 LDRB R7,[R6] ; contents of screen in R7 7720 EOR R7,R7,R5 ; obtain correct colour 7730 STRB R7,[R6] ; store colour byte to screen 7740 .last_cframe 7750 SUBS R4,R4,#1 ; NEXT pixel 7760 BNE csloop 7770 MOV R15,R14 7780 7790 .cluster_check 7800 LDRB R4,cluster_bombs : CMP R4,#0 : BEQ no_clusters 7810 MOV R7,#0 7820 .next_cluster 7830 ADR R3,cluster_frames 7840 MOV R5,#4 : MLA R3,R7,R5,R3 7850 LDRB R5,[R3,#1] : SUBS R5,R5,#1 : STRB R5,[R3,#1] : BNE next2_cluster 7860 MOV R5,#10 : STRB R5,[R3,#1] ; delay 7870 STMFD R13!,{R14} : BL directive_clpaths :LDMFD R13!,{R14} 7880 ADR R1,cluster_addr 7890 MOV R5,#48 : MLA R1,R7,R5,R1 ; 48 bytes each set of 12 cluster addresses 7900 LDRB R5,[R3] : MOV R6,#48 : MLA R2,R5,R6,R2 ; 48 bytes each frame 7910 CMP R5,#26 : BEQ End_cluster 7920 ADD R5,R5,#1 : STRB R5,[R3] 7930 7940 STMFD R13!,{R14,R1-R8} : BL cluster_spread : LDMFD R13!,{R14,R1-R8} 7950 B next2_cluster 7960 .End_cluster 7970 MOV R5,#0 : STRB R5,[R3] 7980 LDRB R5,cluster_bombs : SUBS R5,R5,#1 : STRB R5,cluster_bombs 7990 BEQ no_clusters 8000 SUB R4,R4,#1:SUB R7,R7,#1 8010 STMFD R13!,{R14,R1-R8} : BL cluster_memmove : LDMFD R13!,{R14,R1-R8} 8020 .next2_cluster 8030 ADD R7,R7,#1 : CMP R7,R4 : BNE next_cluster 8040 .no_clusters 8050 MOV R15,R14 8060 8070 .cluster_memmove 8080 ADR R1,cluster_frames 8090 LDR R2,[R1,#4] : STR R2,[R1] 8100 ADR R1,cluster_addr : ADD R1,R1,#48 8110 MOV R2,#12 8120 .cmloop 8130 LDR R3,[R1],#4 8140 STR R3,[R1,#-52] 8150 SUBS R2,R2,#1 8160 BNE cmloop 8170 8180 MOV R15,R14 8190 8200 .cluster_bombs EQUB 0 8210 ALIGN 8220 .cluster_frames EQUD &00000A00 8230 EQUD &00000A00 8240 .cluster_addr 8250 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 8260 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 8270 8280 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 8290 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 8300 8310 .cluster_blast 8320 MOV R0,#0 8330 ; R1 - holds address where cluster data addresses are held 8340 LDR R2,[R1] ; address of seperate pixel in cluster 8350 ADR R3,data_blast 8360 MOV R4,#5 8370 .dbloop 8380 MOV R5,#4 8390 .dbloop2 8400 LDRB R6,[R2] ; contents of screen 8410 LDRB R7,[R3],#1 ; colour 8420 CMP R7,#0 : EOREQ R7,R6,R7 : BEQ cb_skip 8430 CMP R6,#0 : BEQ cb_skip 8440 EORS R7,R6,R7 8450 MOVNE R0,#1 8460 .cb_skip 8470 STRB R7,[R2],#1 8480 SUBS R5,R5,#1 8490 BNE dbloop2 8500 ADD R2,R2,#156 8510 SUBS R4,R4,#1 8520 BNE dbloop 8530 CMP R0,#0 : BEQ cluster_clear 8540 LDRB R2,dead : CMP R2,#1 : BEQ cluster_clear 8550 STMFD R13!,{R14,R1-R6} : LDR R1,[R1] : BL cluster_hit : LDMFD R13!,{R14,R1-R6} 8560 .cluster_clear 8570 MOV R0,#2 :MOV R1,#10:RSB R1,R1,#0:MOV R2,#10:MOV R3,#10:SWI "Sound_Control" ; cluster sound 8580 MOV R15,R14 8590 8600 .data_blast 8610 EQUD &00113110 8620 EQUD &11377331 8630 EQUD &13773311 8640 EQUD &01333110 8650 EQUD &00111100 8660 8670 .cluster_hit 8680 ; R1 - a seperate blast address 8690 STMFD R13!,{R14}:BL cluster_hit_coordinates : LDMFD R13!,{R14} 8700 8710 .CLX_check 8720 LDR R1,X_blast 8730 LDR R2,X_usership 8740 LDRB R3,blast_width 8750 LDRB R4,usership_width 8760 CMP R1,R2 8770 BGT blast_left 8780 ADD R1,R1,R3 8790 CMP R1,R2 8800 BLT no_blast 8810 B CLY_check 8820 8830 .blast_left 8840 ADD R2,R2,R4 8850 CMP R1,R2 8860 BGT no_blast 8870 8880 .CLY_check 8890 LDR R1,Y_blast 8900 LDR R2,Y_usership 8910 LDRB R3,blast_height 8920 LDRB R4,usership_height 8930 CMP R1,R2 8940 BLT blast_higher 8950 SUB R1,R1,R3 8960 CMP R1,R2 8970 BGT no_blast 8980 B CL_clear 8990 9000 .blast_higher 9010 SUB R2,R2,R4 9020 CMP R1,R2 9030 BLT no_blast 9040 .CL_clear 9050 9060 MOV R0,#1 : STRB R0,dead 9070 MOV R0,#4:MOV R1,#15:RSB R1,R1,#0:MOV R2,#1:MOV R3,#25:SWI "Sound_Control" ; usership sound 9080 STMFD R13!,{R1-R8,R14} : BL initialise_particles : BL particle_spread : LDMFD R13!,{R1-R8,R14} 9090 9100 .no_blast 9110 9120 9130 MOV R15,R14 9140 9150 9160 .explosion_check 9170 LDRB R1,no_of_sprites 9180 STMFD R13!,{R14} : BL directive_byte : LDMFD R13!,{R14} 9190 .ecloop 9200 LDRB R3,[R2,#9] ; explosion flag 9210 CMP R3,#4 : BNE ecover ; no explosion 9220 LDRB R3,[R2,#10] ; explosion timer 9230 SUB R3,R3,#1 9240 STRB R3,[R2,#10] 9250 CMP R3,#0 : BNE ecover ; explosion still onscreen so branch 9260 .explosion_finishes 9270 9280 LDRB R3,[R2,#11] ; frame pointer 9290 STMFD R13!,{R14,R2} : BL directive_explosion : MOV R4,R2 :LDMFD R13!,{R14,R2} ; start of explosion data 9300 STMFD R13!,{R1-R7,R14} : LDR R1,[R2] : MOV R2,#140 : MLA R2,R3,R2,R4 : BL frame : LDMFD R13!,{R1-R7,R14} 9310 9320 CMP R3,#5 : BEQ frame_finish ; end of explosion 9330 MOV R11,#15: STRB R11,[R2,#10] ; explosion time 9340 ADD R3,R3,#1 :STRB R3,[R2,#11] ; frame pointer 9350 STMFD R13!,{R1-R7,R14} : LDR R1,[R2] : MOV R2,#140 : MLA R2,R3,R2,R4 : BL frame : LDMFD R13!,{R1-R7,R14} 9360 B ecover 9370 .frame_finish ; explosion animation ends 9380 MOV R3,#2 : STRB R3,[R2,#9] ; dead 9390 .ecover 9400 ADD R2,R2,#12 9410 SUB R1,R1,#1 9420 CMP R1,#1:BNE ecloop 9430 MOV R15,R14 9440 9450 .fire 9460 LDRB R1,gap : CMP R1,#0: BNE floop ; check spacing 9470 MOV R1,#41 : STRB R1,gap 9480 MOV R0,#1 :MOV R1,#7:RSB R1,R1,#0:MOV R2,#1:MOV R3,#7 :SWI "Sound_Control" ; bullet sound 9490 LDRB R1,no_of_bullets : ADD R1,R1,#1 :STRB R1,no_of_bullets 9500 STRB R1,bullet_on_screen 9510 SUB R1,R1,#1 : MOV R2,R1, LSL #2 : ADR R3,bullet_address : ADD R3,R3,R2 9520 BNV end:BNV end 9530 LDR R1,newaddr:SUB R1,R1,#800 : ADD R1,R1,#3 ; calculate address 9540 STR R1,[R3] 9550 .inner 9560 LDRB R1,gap : CMP R1,#0 : BEQ fover 9570 .floop 9580 LDRB R1,gap : SUB R1,R1,#1 : STRB R1,gap 9590 .fover 9600 LDRB R8,no_of_bullets 9610 CMP R8,#0 : BEQ nothing_to_print ; no_bullets, safety for gap at start of fire routine, incase of a brach to floop when gap>0 AND bullets=0 9620 MOV R9,#0 9630 .floop2 9640 MOV R4,R9, LSL#2 9650 ADR R5,bullet_address 9660 ADD R10,R5,R4 9670 LDR R7,[R10] 9680 STMFD R13!,{R14} 9690 LDRB R1,bullet_on_screen 9700 SUB R5,R8,#1 : CMP R5,R9 : BNE new_bullet2 9710 SUBS R1,R1,R8 : BEQ new_bullet 9720 BL print_bullet 9730 .new_bullet 9740 MOV R1,#0 : STRB R1,bullet_on_screen 9750 B new_bullet3 9760 .new_bullet2 9770 BL print_bullet 9780 .new_bullet3 9790 SUB R7,R7,#160 : STR R7,[R10] 9800 LDR R1,top_of_screen : CMP R7,R1: BLPL print_bullet 9810 BPL top 9820 MOV R1,#1 : STRB R1,memory_move 9830 .top 9840 LDRB R1,memory_move : CMP R1,#1 : MOVEQ R1,#0 : STREQB R1,hit ; prevents memory_move repeat as top_of_screen is set and also hit. 9850 LDRB R1,hit : CMP R1,#1 : BLEQ explode 9860 LDMFD R13!,{R14} 9870 ADD R9,R9,#1 : CMP R9,R8 : BNE floop2 9880 LDRB R1,memory_move : CMP R1,#1 : STMFD R13!,{R14} : BLEQ move_memory : LDMFD R13!,{R14} 9890 .nothing_to_print 9900 MOV R15,R14 9910 9920 .print_bullet 9930 ; plots to opposite side of each byte to centre bullet above ship .... as centre of ship splits two bytes 9940 MOV R0,#1 ; a hit 9950 MOV R1,R7 9960 MOV R3,#6 9970 ADR R6,bulletdata 9980 .bloop 9990 MOV R4,#2 10000 .bloop2 10010 LDRB R2,[R6],#1 10020 LDRB R5,[R1,#1] 10030 CMP R5,#0 : BEQ skip 10040 EOR R2,R2,R5 10050 CMP R5,#&07 : BEQ skip 10060 CMP R5,#&70 : BEQ skip 10070 CMP R5,#&77 : BEQ skip 10080 CMP R2,#0 10090 STRNEB R0,hit 10100 .skip 10110 STRB R2,[R1,#1]! 10120 SUBS R4,R4,#1 10130 BNE bloop2 10140 ADD R1,R1,#158 10150 SUBS R3,R3,#1 10160 BNE bloop 10170 MOV R15,R14 10180 10190 .move_memory 10200 LDRB R1,no_of_bullets 10210 CMP R1,#1 : BEQ no_more 10220 MOV R2,R1 10230 ADR R3,bullet_address 10240 .mmloop 10250 LDR R4,[R3,#4]! 10260 STR R4,[R3,#-4] 10270 SUB R2,R2,#1 10280 CMP R2,#1 10290 BNE mmloop 10300 .no_more 10310 SUB R1,R1,#1 10320 STRB R1,no_of_bullets 10330 MOV R1,#0 10340 STRB R1,memory_move 10350 MOV R15,R14 10360 10370 .explode 10380 LDRB R1,no_of_bullets : CMP R1,#0 : BEQ eloop 10390 ; don't reprint bullet as reached top of screen so address is out of bounds 10400 STMFD R13!,{R14} : BL print_bullet 10410 MOV R1,#0 : STRB R1,hit ; first before print_bullet due to hitflag 10420 SUB R1,R8,#1 : STRB R1,no_of_bullets 10430 CMP R1,#0 : STREQB R1,gap 10440 CMP R1,R9 : BEQ eloop ; checks for last bullet in round fired, so when returning from routine R9 is added to equal R8. 10450 MOV R8,R1 10460 10470 ADD R2,R1,#1 10480 ADD R1,R9,#1 10490 ADR R3,bullet_address 10500 MOV R4,R9, LSL #2 10510 ADD R3,R3,R4 ; bullet numbers address to start 10520 .eeloop 10530 LDR R4,[R3,#4]! 10540 STR R4,[R3,#-4] 10550 SUB R2,R2,#1 10560 CMP R2,R1 10570 BNE eeloop 10580 10590 .eloop 10600 LDRB R1,bullet_on_screen : CMP R1,#0 : SUBNE R1,R1,#1 10610 STRB R1,bullet_on_screen ; a new on screen at same time as collision of other bullets 10620 10630 .remove_sprite 10640 ; get X and Y co-ordinates of bullet 10650 MOV R1,R7 ; bullet address 10660 ADR R2,X_bullet 10670 ADR R3,Y_bullet 10680 BL get_coordinates 10690 10700 SUB R7,R7,#160 ; subtract 160 from bullet_addres ..... may have reached top of screen - therefore out of bounds area 10710 LDRB R1,no_of_sprites 10720 STMFD R13!,{R14} : BL directive_byte : LDMFD R13!,{R14} 10730 MOV R3,#1 10740 .rloop 10750 LDRB R4,[R2,#9] 10760 CMP R4,#1 : BNE rover ; 0 value - offscreen / 2 value - dead 10770 10780 STMFD R13!,{R1-R4} 10790 MOV R0,#1 ; A Survivor, for now! 10800 LDR R1,[R2,#0] ; current sprites address 10810 ADR R2,X_sprite 10820 ADR R3,Y_sprite 10830 BL get_coordinates 10840 .X_check 10850 LDR R1,X_bullet 10860 LDR R2,X_sprite 10870 LDRB R3,bullet_width 10880 LDRB R4,sprite_width 10890 CMP R1,R2 10900 BGT sprite_left 10910 ADD R1,R1,R3 10920 CMP R1,R2 10930 BLT not_this_sprite 10940 B Y_check 10950 10960 .sprite_left 10970 ADD R2,R2,R4 10980 CMP R1,R2 10990 BGT not_this_sprite 11000 11010 .Y_check 11020 LDR R1,Y_bullet 11030 LDR R2,Y_sprite 11040 LDRB R3,bullet_height 11050 LDRB R4,sprite_height 11060 CMP R1,R2 11070 BLT sprite_higher 11080 SUB R1,R1,R3 11090 CMP R1,R2 11100 BGT not_this_sprite 11110 B clear 11120 11130 .sprite_higher 11140 SUB R2,R2,R4 11150 CMP R1,R2 11160 BLT not_this_sprite 11170 .clear 11180 11190 MOV R0,#0 11200 11210 .not_this_sprite 11220 LDMFD R13!,{R1-R4} 11230 CMP R0,#0 : BNE rover 11240 STMFD R13!,{R1-R4} : MOV R10,#4 : LDR R1,[R2] : BL draw : LDMFD R13!,{R1-R4} 11250 MOV R11,#4 : STRB R11,[R2,#9] ; explosion 11260 MOV R11,#15: STRB R11,[R2,#10] ; explosion time 11270 MOV R11,#0 : STRB R11,[R2,#11] ; frame pointer ( 48 bytes each frame) 11280 LDRB R11,last_sprite : ADD R11,R11,#1 : STRB R11,last_sprite ; Check for end of pattern - for last sprite 11290 STMFD R13!,{R0-R7} : LDR R1,[R2] : BL explosion : BL increase_score : LDMFD R13!,{R0-R7} 11300 MOV R0,#3:MOV R1,#10:RSB R1,R1,#0:MOV R2,#1:MOV R3,#10:SWI "Sound_Control" ; yellow explosion sound 11310 LDMFD R13!,{R15} ; one hit one alien ship 11320 .rover 11330 ADD R2,R2,#12:ADD R3,R3,#1 11340 CMP R3,R1 : BNE rloop 11350 LDMFD R13!,{R15} 11360 11370 .cluster_hit_coordinates 11380 ADR R2,X_blast 11390 ADR R3,Y_blast 11400 STMFD R13!,{R14}:BL get_coordinates:LDMFD R13!,{R14} 11410 LDR R1,newaddr 11420 ADR R2,X_usership 11430 ADR R3,Y_usership 11440 STMFD R13!,{R14}:BL get_coordinates:LDMFD R13!,{R14} 11450 MOV R15,R14 11460 11470 .explo_hit_coordinates 11480 ADR R2,X_explosion 11490 ADR R3,Y_explosion 11500 STMFD R13!,{R14}:BL get_coordinates:LDMFD R13!,{R14} 11510 LDR R1,newaddr 11520 ADR R2,X_usership 11530 ADR R3,Y_usership 11540 STMFD R13!,{R14}:BL get_coordinates:LDMFD R13!,{R14} 11550 MOV R15,R14 11560 11570 .bomb_hit_coordinates 11580 ADR R2,X_bullet 11590 ADR R3,Y_bullet 11600 STMFD R13!,{R14}:BL get_coordinates:LDMFD R13!,{R14} 11610 LDR R1,newaddr 11620 ADR R2,X_usership 11630 ADR R3,Y_usership 11640 STMFD R13!,{R14}:BL get_coordinates:LDMFD R13!,{R14} 11650 MOV R15,R14 11660 11670 .get_coordinates 11680 ; R1 - address on screen R2 - X offset addr R3 - Y offset addr 11690 LDR R4,address 11700 SUB R4,R1,R4 ; screen address - start of screen 11710 MOV R5,#160 ; divisor 11720 MOV R6,#1<<31 ; counter for each bit 11730 MOV R10,#0 ; remainder 11740 MOV R11,#0 ; quotient 11750 .division_loop 11760 MOVS R4,R4,ASL#1 11770 ADC R10,R10,R10 11780 CMP R10,R5 11790 SUBGE R10,R10,R5 ; remainder 11800 ORRGE R11,R11,R6 ; quotient 11810 MOVS R6,R6,LSR#1 11820 BNE division_loop 11830 MOV R10,R10,LSL#3 : STR R10,[R2] 11840 STR R10,[R2,#0] 11850 RSB R11,R11,#255 11860 MOV R11,R11,LSL#2 : STR R11,[R3] 11870 MOV R15,R14 11880 11890 .store_no_of_bullets 11900 MOV R2,#0 11910 STRB R2,no_of_bullets 11920 MOV R15,R14 11930 11940 .load_no_of_bullets 11950 LDRB R2,no_of_bullets 11960 MOV R15,R14 11970 11980 .load_dead 11990 LDRB R1,dead 12000 MOV R15,R14 12010 12020 .bulletdata EQUD &07700770 : EQUD &07700770 : EQUD &07700770 12030 .top_of_screen EQUD &1FDA800 12040 .bullet_address EQUD 0 12050 EQUD 0 12060 EQUD 0 12070 EQUD 0 12080 EQUD 0 12090 .no_of_bullets EQUB 0 12100 .gap EQUB 0 12110 .bullet_on_screen EQUB 0 12120 .memory_move EQUB 0 12130 .hit EQUB 0 12140 .dead EQUB 0 12150 ALIGN 12160 12170 ; memory locations for sprite collision identification 12180 .address EQUD &1FD8000 12190 .X_bullet EQUD 0 12200 .Y_bullet EQUD 0 12210 .X_sprite EQUD 0 12220 .Y_sprite EQUD 0 12230 .X_usership EQUD 0 12240 .Y_usership EQUD 0 12250 .X_explosion EQUD 0 12260 .Y_explosion EQUD 0 12270 .X_blast EQUD 0 12280 .Y_blast EQUD 0 12290 .bullet_width EQUB 16 ; constant values 12300 .bullet_height EQUB 24 12310 .sprite_width EQUB 64 12320 .sprite_height EQUB 48 12330 .usership_width EQUB 64 12340 .usership_height EQUB 64 12350 .explosion_width EQUB 80 12360 .explosion_height EQUB 56 12370 .blast_width EQUB 32 12380 .blast_height EQUB 16 12390 ALIGN 12400 12410 .left 12420 LDR R1,leftside : LDR R2,oldaddr : CMP R1,R2 : MOVEQ R15,R14 12430 STMFD R13!,{R14} : LDR R1,oldaddr : BL usership 12440 LDR R1,newaddr : SUB R1,R1,#1 : STR R1,newaddr : STR R1,oldaddr : BL usership : LDMFD R13!,{R15} 12450 12460 .right 12470 LDR R1,rightside : LDR R2,oldaddr : CMP R1,R2 : MOVEQ R15,R14 12480 STMFD R13!,{R14} : LDR R1,oldaddr : BL usership 12490 LDR R1,newaddr : ADD R1,R1,#1 : STR R1,newaddr : STR R1,oldaddr : BL usership : LDMFD R13!,{R15} 12500 12510 .up 12520 LDR R1,top_of_screen : ADD R1,R1,#160 : LDR R2,oldaddr : CMP R1,R2 : MOVGT R15,R14 12530 LDR R1,rightside : SUB R1,R1,#160 : STR R1,rightside 12540 LDR R1,leftside : SUB R1,R1,#160 : STR R1,leftside 12550 STMFD R13!,{R14} : LDR R1,oldaddr : BL usership 12560 LDR R1,newaddr : SUB R1,R1,#160 : STR R1,newaddr : STR R1,oldaddr : BL usership : LDMFD R13!,{R15} 12570 12580 .down 12590 LDR R1,screen_bottom : SUB R1,R1,#1760 : LDR R2,oldaddr : CMP R1,R2 : MOVLT R15,R14 12600 LDR R1,rightside : ADD R1,R1,#160 : STR R1,rightside 12610 LDR R1,leftside : ADD R1,R1,#160 : STR R1,leftside 12620 STMFD R13!,{R14} : LDR R1,oldaddr : BL usership 12630 LDR R1,newaddr : ADD R1,R1,#160 : STR R1,newaddr : STR R1,oldaddr : BL usership : LDMFD R13!,{R15} 12640 12650 .usership 12660 ADR R2,shipsdata 12670 MOV R3,#16 ; height 12680 .ueight 12690 MOV R4,#8 12700 .utwelve 12710 LDRB R5,[R2],#1 12720 LDRB R6,[R1,#1] 12730 EOR R5,R5,R6 12740 STRB R5,[R1,#1]! 12750 SUBS R4,R4,#1 12760 BNE utwelve 12770 ADD R1,R1,#152 ; 160 pixels across 12780 SUBS R3,R3,#1 12790 BNE ueight 12800 MOV R15,R14 12810 12820 .usership_collision 12830 LDRB R1,dead : CMP R1,#1 : MOVEQ R15,R14 12840 LDR R1,newaddr 12850 ADR R2,shipsdata 12860 MOV R3,#16 12870 .uceight 12880 MOV R4,#8 12890 .uctwelve 12900 LDRB R5,[R2],#1 12910 LDRB R6,[R1,#1]! 12920 CMP R5,#0 : BEQ UCskip ; no collision on black around ship 12930 EORS R5,R5,R6 12940 BNE collision 12950 .UCskip 12960 SUBS R4,R4,#1 12970 BNE uctwelve 12980 ADD R1,R1,#152 12990 SUBS R3,R3,#1 13000 BNE uceight 13010 B check_ok 13020 .collision 13030 STMFD R13!,{R14} : BL check_collision : LDMFD R13!,{R14} 13040 .check_ok 13050 MOV R15,R14 13060 13070 .check_collision 13080 13090 LDR R1,newaddr 13100 ADR R2,X_usership 13110 ADR R3,Y_usership 13120 STMFD R13!,{R14}:BL get_coordinates:LDMFD R13!,{R14} 13130 13140 LDRB R1,no_of_sprites 13150 STMFD R13!,{R14} : BL directive_byte : LDMFD R13!,{R14} 13160 MOV R3,#1 13170 .ccloop 13180 LDRB R4,[R2,#9] 13190 CMP R4,#1 : BNE ccover ; 0 value - offscreen / 2 value - dead 13200 13210 STMFD R13!,{R1-R4,R14} 13220 MOV R0,#1 13230 LDR R1,[R2,#0] 13240 ADR R2,X_sprite 13250 ADR R3,Y_sprite 13260 BL get_coordinates 13270 .X_col_check 13280 LDR R1,X_usership 13290 LDR R2,X_sprite 13300 LDRB R3,usership_width 13310 LDRB R4,sprite_width 13320 CMP R1,R2 13330 BGT usership_right 13340 ADD R1,R1,R3 13350 CMP R1,R2 13360 BLT no_col 13370 B Y_col_check 13380 13390 .usership_right 13400 ADD R2,R2,R4 13410 CMP R1,R2 13420 BGT no_col 13430 13440 .Y_col_check 13450 LDR R1,Y_usership 13460 LDR R2,Y_sprite 13470 LDRB R3,usership_height 13480 LDRB R4,sprite_height 13490 CMP R1,R2 13500 BLT usership_lower 13510 SUB R1,R1,R3 13520 CMP R1,R2 13530 BGT no_col 13540 B uc_clear 13550 13560 .usership_lower 13570 SUB R2,R2,R4 13580 CMP R1,R2 13590 BLT no_col 13600 .uc_clear 13610 13620 MOV R0,#0 13630 13640 .no_col 13650 LDMFD R13!,{R1-R4,R14} 13660 CMP R0,#0 : BNE ccover 13670 13680 STMFD R13!,{R1-R4,R14} : MOV R10,#4 : LDR R1,[R2] : BL draw : LDMFD R13!,{R1-R4,R14} 13690 MOV R11,#4 : STRB R11,[R2,#9] ; explosion 13700 MOV R11,#15: STRB R11,[R2,#10] ; explosion time 13710 MOV R11,#0 : STRB R11,[R2,#11] ; frame pointer ( 48 bytes each frame) 13720 LDRB R11,last_sprite : ADD R11,R11,#1 : STRB R11,last_sprite ; Check for end of pattern - for last sprite 13730 STMFD R13!,{R0-R8,R14} : LDR R1,[R2] : BL explosion : BL increase_score : BL initialise_particles : BL particle_spread : LDMFD R13!,{R0-R8,R14} 13740 MOV R0,#1 : STRB R0,dead 13750 MOV R0,#4:MOV R1,#15:RSB R1,R1,#0:MOV R2,#1:MOV R3,#25:SWI "Sound_Control" ; usership sound 13760 MOV R15,R14 ; usership is dead so additional collisions impossible 13770 .ccover 13780 ADD R2,R2,#12:ADD R3,R3,#1 13790 CMP R3,R1 : BNE ccloop 13800 13810 MOV R15,R14 13820 13830 .load_last_sprite 13840 LDRB R11,last_sprite 13850 MOV R15,R14 13860 13870 .store_last_sprite 13880 STRB R11,last_sprite 13890 MOV R15,R14 13900 13910 .load_no_of_sprites 13920 LDRB R10,no_of_sprites 13930 MOV R15,R14 13940 13950 13960 .no_of_sprites EQUB 50 ; total sprites in pattern = no_of_sprites - 1 13970 .last_sprite EQUB 0 13980 .usership_frames EQUB 10 ; no of frames in explosion 13990 .usership_timer EQUB 6 ; time between each frame 14000 ALIGN 14010 14020 .newaddr EQUD &1FE146B 14030 .oldaddr EQUD &1FE146B 14040 14050 .load_newaddr 14060 LDR R1,newaddr 14070 MOV R15,R14 14080 14090 .directive_shipsdata 14100 ADR R3,shipsdata 14110 MOV R15,R14 14120 14130 ; Ships Data 14140 .shipsdata 14150 EQUD &00030000:EQUD &00003000 14160 EQUD &00030000:EQUD &00003000 14170 EQUD &00030000:EQUD &00003000 14180 EQUD &00033000:EQUD &00033000 14190 EQUD &00033000:EQUD &00033000 14200 EQUD &00033300:EQUD &00333000 14210 EQUD &00034300:EQUD &00343000 14220 EQUD &00034330:EQUD &03343000 14230 EQUD &30034430:EQUD &03443003 14240 EQUD &30034433:EQUD &33443003 14250 EQUD &30034443:EQUD &34443003 14260 EQUD &33334443:EQUD &34443333 14270 EQUD &33344443:EQUD &34444333 14280 EQUD &00334433:EQUD &33443300 14290 EQUD &00033330:EQUD &03333000 14300 EQUD &00003300:EQUD &00330000 14310 14320 .self_destruct 14330 MOV R0,#1:STRB R0,dead 14340 STMFD R13!,{R1-R8,R14} 14350 BL initialise_particles 14360 BL particle_spread 14370 MOV R0,#1 : STRB R0,lives 14380 MOV R0,#32 : STRB R0,Clives 14390 MOV R0,#49 : STRB R0,Clives+1 14400 MOV R0,#4:MOV R1,#15:RSB R1,R1,#0:MOV R2,#1:MOV R3,#25:SWI "Sound_Control" ; usership sound 14410 LDMFD R13!,{R1-R8,R15} 14420 14430 .usership_explosion 14440 LDRB R1,usership_frames 14450 CMP R1,#0 : BEQ no_more_frames 14460 LDRB R2,usership_timer 14470 CMP R2,#0 : BNE decrement_timer 14480 MOV R2,#6 : STRB R2,usership_timer 14490 SUBS R1,R1,#1 : STRB R1,usership_frames 14500 14510 STMFD R13!,{R8,R14} : BL particle_spread : LDMFD R13!,{R8,R14} 14520 14530 B next_frame 14540 .decrement_timer 14550 SUB R2,R2,#1 : STRB R2,usership_timer 14560 B next_frame 14570 .no_more_frames 14580 STMFD R13!,{R14} : BL load_wave_finished : LDMFD R13!,{R14} : CMP R1,#1 : BEQ continue_play 14590 CMP R8,#0 : BEQ next_frame 14600 ADD R1,R8,#1 : STRB R1,no_of_sprites 14610 B next_frame 14620 .continue_play 14630 LDRB R1,dead : CMP R1,#0 : BEQ next_wave 14640 BL lives_minus 14650 CMP R1,#0 : BEQ game_over 14660 BL plot_border 14670 BL print_lives 14680 BL print_score 14690 BL plot_wave 14700 BL initial_stars 14710 MOV R0,#0 : BL repeat_wave 14720 LDR R1,newaddr 14730 BL usership 14740 MOV R1,#0 : STRB R1,dead 14750 MOV R1,#300 14760 .wait 14770 STMFD R13!,{R1,R14} 14780 BL move_stars 14790 BL change_palette 14800 BL load_no_of_bullets : CMP R2,#0 : BLNE inner 14810 MOV R5,#400 : BL slow1 : BL test_keypress 14820 LDMFD R13!,{R1,R14} 14830 SUBS R1,R1,#1 : BNE wait 14840 MOV R0,#1 : BL repeat_wave 14850 B display 14860 .next_frame 14870 MOV R15,R14 14880 14890 .lives_plus 14900 LDRB R0,Clives+1 : ADD R0,R0,#1 : STRB R0,Clives+1 14910 CMP R0,#58 : BNE plus_done 14920 MOV R0,#48 : STRB R0,Clives+1 14930 LDRB R0,Clives : CMP R0,#32 14940 MOVEQ R0,#49 : STREQB R0,Clives 14950 ADDNE R0,R0,#1 : STRNEB R0,Clives 14960 14970 .plus_done 14980 LDRB R1,lives : ADD R1,R1,#1 : STRB R1,lives 14990 MOV R15,R14 15000 15010 .lives_minus 15020 LDRB R0,Clives+1 : SUB R0,R0,#1 : STRB R0,Clives+1 15030 CMP R0,#47 : BNE minus_done 15040 MOV R0,#57 : STRB R0,Clives+1 15050 LDRB R0,Clives : CMP R0,#49 15060 MOVEQ R0,#32 : STREQB R0,Clives 15070 SUBNE R0,R0,#1 : STRNEB R0,Clives 15080 15090 .minus_done 15100 LDRB R1,lives : SUB R1,R1,#1 : STRB R1,lives 15110 MOV R15,R14 15120 15130 .print_lives 15140 SWI &100+18 15150 MOV R0,#3 15160 SWI "OS_WriteC" 15170 MOV R0,#136 15180 SWI "OS_WriteC" 15190 SWI &100+18 15200 MOV R0,#0 15210 SWI "OS_WriteC" 15220 MOV R0,#3 15230 SWI "OS_WriteC" 15240 MOV R0,#4 15250 MOV R1,#172 15260 MOV R2,#880 15270 SWI "OS_Plot" 15280 ADR R0,Blives 15290 SWI "OS_Write0" 15300 MOV R15,R14 15310 15320 .lives EQUB 3 15330 .Blives EQUB 127 :EQUB 127 15340 .Clives EQUS " 3" :EQUB 0 15350 ALIGN 15360 15370 .reset_lives 15380 MOV R1,#3 : STRB R1,lives 15390 MOV R1,#51 : STRB R1,Clives+1 15400 MOV R1,#32 : STRB R1,Clives 15410 MOV R15,R14 15420 15430 .initialise_particles 15440 LDR R1,newaddr : ADD R1,R1,#1 15450 ADR R2,particles_addresses 15460 BNV end 15470 MOV R3,#16 15480 .iploop 15490 MOV R4,#8 15500 .iploop2 15510 STR R1,[R2],#4 15520 ADD R1,R1,#1 15530 SUBS R4,R4,#1 15540 BNE iploop2 15550 ADD R1,R1,#152 15560 SUBS R3,R3,#1 15570 BNE iploop 15580 MOV R15,R14 15590 15600 .particle_spread 15610 ADR R1,particles_addresses 15620 BNV end 15630 ADR R2,particles_paths 15640 ADR R3,shipsdata 15650 MOV R4,#128 15660 .psloop 15670 LDRB R5,[R3],#1 15680 LDR R6,[R1] 15690 LDRB R7,[R6] 15700 EOR R7,R7,R5 15710 STRB R7,[R6] 15720 LDR R8,[R2],#4 15730 ADD R6,R6,R8 15740 STR R6,[R1],#4 15750 LDRB R7,usership_frames : CMP R7,#0 : BEQ last_frame 15760 LDRB R7,[R6] 15770 EOR R7,R7,R5 15780 STRB R7,[R6] 15790 .last_frame 15800 SUBS R4,R4,#1 15810 BNE psloop 15820 MOV R15,R14 15830 15840 .explosion 15850 ; R1 - address of explosion 15860 ADR R2,explosion_data 15870 .frame 15880 MOV R3,#14 15890 .x_eight 15900 MOV R4,#10 15910 .x_twelve 15920 LDRB R5,[R2],#1 15930 LDRB R7,[R1,#1] : EOR R5,R5,R7 15940 STRB R5,[R1,#1]! 15950 SUBS R4,R4,#1 15960 BNE x_twelve 15970 ADD R1,R1,#150 ; 160 pixels across 15980 SUBS R3,R3,#1 15990 BNE x_eight 16000 MOV R15,R14 16010 16020 .directive_explosion 16030 ADR R2,explosion_data 16040 MOV R15,R14 16050 16060 ; Data for exposion frames 16070 .explosion_data 16080 16090 ; Frame One ************************************************ 16100 EQUD &00000000:EQUD &00000000:EQUW &0000 16110 EQUD &00000000:EQUD &00000000:EQUW &0000 16120 EQUD &00000000:EQUD &00000000:EQUW &0000 16130 EQUD &00000000:EQUD &00001313:EQUW &0000 16140 EQUD &11000000:EQUD &00013133:EQUW &0000 16150 EQUD &31100000:EQUD &01333333:EQUW &0000 16160 EQUD &33100000:EQUD &13333333:EQUW &0001 16170 EQUD &33000000:EQUD &13333133:EQUW &0000 16180 EQUD &31000000:EQUD &01333333:EQUW &0000 16190 EQUD &10000000:EQUD &00113333:EQUW &0000 16200 EQUD &00000000:EQUD &00001330:EQUW &0000 16210 EQUD &00000000:EQUD &00000000:EQUW &0000 16220 EQUD &00000000:EQUD &00000000:EQUW &0000 16230 EQUD &00000000:EQUD &00000000:EQUW &0000 16240 16250 ; Frame Two *********************************************** 16260 EQUD &00000000:EQUD &00000000:EQUW &0000 16270 EQUD &00000000:EQUD &00000000:EQUW &0000 16280 EQUD &00000000:EQUD &00000000:EQUW &0000 16290 EQUD &00000000:EQUD &00013311:EQUW &0000 16300 EQUD &10000000:EQUD &00113333:EQUW &0000 16310 EQUD &31100000:EQUD &01333333:EQUW &0000 16320 EQUD &33100000:EQUD &11333333:EQUW &0000 16330 EQUD &33310000:EQUD &11333333:EQUW &0000 16340 EQUD &31100000:EQUD &01133133:EQUW &0000 16350 EQUD &31000000:EQUD &00133333:EQUW &0000 16360 EQUD &10000000:EQUD &00111333:EQUW &0000 16370 EQUD &00000000:EQUD &00001110:EQUW &0000 16380 EQUD &00000000:EQUD &00000000:EQUW &0000 16390 EQUD &00000000:EQUD &00000000:EQUW &0000 16400 16410 ; Frame Three *********************************************** 16420 EQUD &00000000:EQUD &00000000:EQUW &0000 16430 EQUD &00000000:EQUD &00000000:EQUW &0000 16440 EQUD &00000000:EQUD &00000110:EQUW &0000 16450 EQUD &00000000:EQUD &00001111:EQUW &0000 16460 EQUD &11100000:EQUD &00113333:EQUW &0000 16470 EQUD &33110000:EQUD &01131333:EQUW &0000 16480 EQUD &31100000:EQUD &13333113:EQUW &0000 16490 EQUD &33110000:EQUD &11133333:EQUW &0000 16500 EQUD &13310000:EQUD &00313333:EQUW &0000 16510 EQUD &33100000:EQUD &00133331:EQUW &0000 16520 EQUD &11000000:EQUD &00011133:EQUW &0000 16530 EQUD &00000000:EQUD &00000111:EQUW &0000 16540 EQUD &00000000:EQUD &00000000:EQUW &0000 16550 EQUD &00000000:EQUD &00000000:EQUW &0000 16560 16570 ; Frame Four *********************************************** 16580 EQUD &00000000:EQUD &00000000:EQUW &0000 16590 EQUD &00000000:EQUD &00011133:EQUW &0000 16600 EQUD &01000000:EQUD &11133333:EQUW &0000 16610 EQUD &31100000:EQUD &13333333:EQUW &0000 16620 EQUD &31100000:EQUD &33131333:EQUW &0001 16630 EQUD &13333000:EQUD &33313333:EQUW &0011 16640 EQUD &31333100:EQUD &33333333:EQUW &0033 16650 EQUD &33333300:EQUD &33333331:EQUW &0001 16660 EQUD &13333100:EQUD &13333113:EQUW &0003 16670 EQUD &31331000:EQUD &13333333:EQUW &0001 16680 EQUD &33311000:EQUD &11333333:EQUW &0000 16690 EQUD &31100000:EQUD &03131333:EQUW &0000 16700 EQUD &10000000:EQUD &00013331:EQUW &0000 16710 EQUD &00000000:EQUD &00000000:EQUW &0000 16720 16730 ; Frame Five *********************************************** 16740 EQUD &00000000:EQUD &00000000:EQUW &0000 16750 EQUD &31000000:EQUD &00011133:EQUW &0000 16760 EQUD &11100000:EQUD &11133333:EQUW &0000 16770 EQUD &33311000:EQUD &13333333:EQUW &0011 16780 EQUD &33333100:EQUD &33131333:EQUW &0131 16790 EQUD &13333310:EQUD &33313333:EQUW &1311 16800 EQUD &31333130:EQUD &33333333:EQUW &1333 16810 EQUD &33333331:EQUD &33333331:EQUW &0131 16820 EQUD &13333130:EQUD &33333313:EQUW &0113 16830 EQUD &31331300:EQUD &33333333:EQUW &0131 16840 EQUD &33333300:EQUD &33333333:EQUW &0311 16850 EQUD &33310300:EQUD &33333331:EQUW &0013 16860 EQUD &33330000:EQUD &03331331:EQUW &0001 16870 EQUD &10000000:EQUD &00011100:EQUW &0000 16880 16890 ; Frame Six *********************************************** 16900 EQUD &33000000:EQUD &00110313:EQUW &0000 16910 EQUD &31311100:EQUD &01111133:EQUW &0033 16920 EQUD &33133310:EQUD &11133333:EQUW &0311 16930 EQUD &33331310:EQUD &13333333:EQUW &3331 16940 EQUD &33333330:EQUD &33131333:EQUW &3333 16950 EQUD &13333310:EQUD &33313333:EQUW &1311 16960 EQUD &31333333:EQUD &33333333:EQUW &1333 16970 EQUD &33333331:EQUD &33333331:EQUW &1333 16980 EQUD &13333133:EQUD &33333313:EQUW &0133 16990 EQUD &31331330:EQUD &33333333:EQUW &0133 17000 EQUD &33333330:EQUD &33333333:EQUW &3311 17010 EQUD &33313300:EQUD &33333331:EQUW &3113 17020 EQUD &33333000:EQUD &13331331:EQUW &0311 17030 EQUD &13000000:EQUD &03131100:EQUW &0003 17040 17050 .directive_particles 17060 ADR R1,particles_addresses 17070 ADR R2,particles_paths 17080 MOV R15,R14 17090 17100 ; Usership explosion data 17110 .particles_paths 17120 EQUD 0:EQUD 0:EQUD 161:EQUD 0:EQUD 0:EQUD -1:EQUD 0:EQUD 0 17130 EQUD 0:EQUD 0:EQUD -322:EQUD 0:EQUD 0:EQUD -159:EQUD 0:EQUD 0 17140 EQUD 0:EQUD 0:EQUD -322:EQUD 0:EQUD 0:EQUD -159:EQUD 0:EQUD 0 17150 EQUD 0:EQUD -1:EQUD -159:EQUD 0:EQUD 0:EQUD -160:EQUD -161:EQUD 0 17160 EQUD 0:EQUD 159:EQUD -1:EQUD 0:EQUD 0:EQUD -160:EQUD 1:EQUD 0 17170 EQUD 0:EQUD -320:EQUD 1:EQUD 0:EQUD 0:EQUD 160:EQUD 161:EQUD 0 17180 EQUD 0:EQUD -161:EQUD -320:EQUD 0:EQUD 0:EQUD -1:EQUD 1:EQUD 0 17190 EQUD -1:EQUD 480:EQUD -161:EQUD 0:EQUD 0:EQUD 161:EQUD 1:EQUD -159 17200 EQUD 160:EQUD 159:EQUD -2:EQUD 161:EQUD 320:EQUD 318:EQUD 2:EQUD 161 17210 EQUD -160:EQUD -318:EQUD 1:EQUD -480:EQUD 160:EQUD 159:EQUD -1:EQUD -161 17220 EQUD -161:EQUD -1:EQUD 477:EQUD 160:EQUD 161:EQUD 1:EQUD -159:EQUD -160 17230 EQUD 1:EQUD -1:EQUD 160:EQUD -477:EQUD 159:EQUD 1:EQUD 2:EQUD 160 17240 EQUD -160:EQUD -159:EQUD -161:EQUD 161:EQUD -1:EQUD 322:EQUD 160:EQUD 161 17250 EQUD 159:EQUD -159:EQUD -2:EQUD 0:EQUD 0:EQUD 160:EQUD 1:EQUD 159 17260 EQUD -1:EQUD -160:EQUD 161:EQUD 0:EQUD 0:EQUD 318:EQUD 2:EQUD -1 17270 EQUD 0:EQUD 318:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD -161:EQUD 0 17280 17290 ; Usership particle addresses on screen 17300 .particles_addresses 17310 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17320 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17330 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17340 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17350 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17360 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17370 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17380 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17390 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17400 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17410 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17420 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17430 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17440 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17450 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17460 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 17470 17480 .directive_clpaths 17490 ADR R2,cluster_paths 17500 MOV R15,R14 17510 17520 .cluster_paths 17530 ; cluster data paths 17540 EQUD 1:EQUD 160:EQUD 159:EQUD 161:EQUD 2:EQUD 161:EQUD 160:EQUD 159:EQUD 159:EQUD 161:EQUD 161:EQUD 160 17550 EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640 17560 EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640 17570 EQUD 1:EQUD 160:EQUD 159:EQUD 161:EQUD 2:EQUD 161:EQUD 160:EQUD 159:EQUD 159:EQUD 161:EQUD 161:EQUD 160 17580 EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640 17590 EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640 17600 EQUD 1:EQUD 160:EQUD 159:EQUD 161:EQUD 2:EQUD 161:EQUD 160:EQUD 159:EQUD 159:EQUD 161:EQUD 161:EQUD 160 17610 EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640 17620 EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640 17630 EQUD 1:EQUD 160:EQUD -2:EQUD 161:EQUD 2:EQUD -2:EQUD 3:EQUD 159:EQUD 159:EQUD 161:EQUD 3:EQUD 160 17640 EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640 17650 EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640 17660 EQUD 1:EQUD 160:EQUD 159:EQUD 161:EQUD 2:EQUD 161:EQUD 160:EQUD 159:EQUD 159:EQUD 161:EQUD 161:EQUD 160 17670 EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640 17680 EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640:EQUD 640 17690 EQUD 1:EQUD 160:EQUD 159:EQUD 161:EQUD 2:EQUD 161:EQUD 160:EQUD 159:EQUD 159:EQUD 161:EQUD 161:EQUD 160 17700 EQUD 320:EQUD 160:EQUD 160:EQUD 160:EQUD 320:EQUD 160:EQUD 160:EQUD 160:EQUD 160:EQUD 160:EQUD 160:EQUD 0 17710 EQUD 640:EQUD 160:EQUD 320:EQUD 160:EQUD 320:EQUD 160:EQUD 160:EQUD 160:EQUD 0:EQUD 0:EQUD 0:EQUD &B 17720 EQUD 480:EQUD 160:EQUD 160:EQUD 160:EQUD 320:EQUD 320:EQUD 160:EQUD 0:EQUD &B:EQUD &B:EQUD &B:EQUD &B 17730 EQUD 320:EQUD 160:EQUD 160:EQUD 160:EQUD 320:EQUD 0:EQUD 0:EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &B 17740 EQUD 0:EQUD 160:EQUD 0:EQUD 0:EQUD 160:EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &B 17750 EQUD &B:EQUD 0:EQUD &B:EQUD &B:EQUD 0:EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &E 17760 EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &E:EQUD &E:EQUD &E:EQUD &E 17770 EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &E:EQUD &E:EQUD &E:EQUD &E:EQUD &E 17780 EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &B:EQUD &E:EQUD &E:EQUD &E:EQUD &E:EQUD &E:EQUD &E:EQUD &E 17790 EQUD &E:EQUD &B:EQUD &E:EQUD &E:EQUD &B:EQUD &E:EQUD &E:EQUD &E:EQUD &E:EQUD &E:EQUD &E:EQUD &E 17800 17810 17820 .directive_ab 17830 ADR R4,alien_bombs 17840 MOV R15,R14 17850 17860 ; Alien bullets are stored here ................. 17870 .alien_bombs 17880 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 17890 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 17900 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 17910 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 17920 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 17930 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 17940 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 17950 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 17960 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 17970 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 17980 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 17990 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 18000 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 18010 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 18020 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 18030 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 18040 18050 .directive_byte 18060 ADR R2,byte 18070 MOV R15,R14 18080 18090 ; ALIEN SHIPS ADDRESSES stored here as well as info on these ships 18100 .byte 18110 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18120 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18130 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18140 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18150 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18160 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18170 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18180 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18190 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18200 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18210 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18220 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18230 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18240 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18250 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18260 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18410 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18411 EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 18412 18420 .change_palette 18430 LDR R1,palette_delay 18440 SUBS R1,R1,#1 : STR R1,palette_delay 18450 MOVNE R15,R14 18460 MOV R1,#100 : STR R1,palette_delay 18470 18480 STMFD R13!,{R14} 18490 LDRB R1,inc_or_dec 18500 CMP R1,#1 : BLEQ increment 18510 LDRB R1,inc_or_dec 18520 CMP R1,#2 : BLEQ decrement 18530 18540 LDRB R5,pal_red 18550 LDRB R6,pal_green 18560 LDRB R7,pal_blue 18570 BL eight_to_fifteen 18580 LDMFD R13!,{R15} 18590 18600 .palette_delay EQUD 1 18610 18620 .increment 18630 LDRB R2,colour 18640 LDRB R1,rgb 18650 ADD R1,R1,#1 : STRB R1,rgb 18660 CMP R2,#1 : MOVEQ R5,R1 : STREQB R5,pal_red 18670 CMP R2,#2 : MOVEQ R6,R1 : STREQB R6,pal_green 18680 CMP R2,#3 : MOVEQ R7,R1 : STREQB R7,pal_blue 18690 CMP R1,#16 : BNE pal_inc 18700 18710 ADR R3,pal_data : LDRB R4,pal_pointer : ADD R3,R3,R4 18720 LDRB R5,[R3,#0] : STRB R5,colour 18730 LDRB R5,[R3,#1] : STRB R5,inc_or_dec 18740 CMP R5,#1 : MOVEQ R5,#0 : MOVNE R5,#16 18750 STRB R5,rgb 18760 ADD R4,R4,#2 18770 CMP R4,#16 : MOVEQ R4,#0 : STRB R4,pal_pointer 18780 .pal_inc 18790 MOV R15,R14 18800 18810 .decrement 18820 LDRB R2,colour 18830 LDRB R1,rgb 18840 SUB R1,R1,#1 : STRB R1,rgb 18850 CMP R2,#1 : MOVEQ R5,R1 : STREQB R5,pal_red 18860 CMP R2,#2 : MOVEQ R6,R1 : STREQB R6,pal_green 18870 CMP R2,#3 : MOVEQ R7,R1 : STREQB R7,pal_blue 18880 CMP R1,#0 : BNE pal_dec 18890 18900 ADR R3,pal_data : LDRB R4,pal_pointer : ADD R3,R3,R4 18910 LDRB R5,[R3,#0] : STRB R5,colour 18920 LDRB R5,[R3,#1] : STRB R5,inc_or_dec 18930 CMP R5,#1 : MOVEQ R5,#0 : MOVNE R5,#16 18940 STRB R5,rgb 18950 ADD R4,R4,#2 18960 CMP R4,#16 : MOVEQ R4,#0 : STRB R4,pal_pointer 18970 .pal_dec 18980 MOV R15,R14 18990 19000 .pal_red EQUB 16 19010 .pal_green EQUB 0 19020 .pal_blue EQUB 0 19030 .rgb EQUB 0 ; range 0 to 16 19040 .colour EQUB 2 ; chosen colour red,green or blue 19050 .inc_or_dec EQUB 1 ; increment or decrement chosen colour 19060 .pal_pointer EQUB 2 ; pointer to pal_data 19070 .pal_data EQUB 2:EQUB 1:EQUB 3:EQUB 1:EQUB 1:EQUB 2:EQUB 3:EQUB 2:EQUB 3:EQUB 1:EQUB 1:EQUB 1:EQUB 2:EQUB 2:EQUB 3:EQUB 2 19080 ALIGN 19090 19100 .eight_to_fifteen 19110 MOV R1,#8 19120 .next_colour 19130 MUL R2,R5,R1 ; red = colour * red 19140 MUL R3,R6,R1 ; green = colour * green 19150 MUL R4,R7,R1 ; blue = colour * blue 19160 19170 .write_palette 19180 SWI &100+19 19190 MOV R0,R1 ; colour 19200 SWI "OS_WriteC" 19210 SWI &100+16 19220 MOV R0,R2 ; red 19230 SWI "OS_WriteC" 19240 MOV R0,R3 ; green 19250 SWI "OS_WriteC" 19260 MOV R0,R4 ; blue 19270 SWI "OS_WriteC" 19280 19290 ADD R1,R1,#1 19300 CMP R1,#16 19310 BNE next_colour 19320 MOV R15,R14 19330 19340 19350 .reset_lws 19360 ; reset lives=3, score=0, wave=1 for start of game 19370 MOV R1,#1 : STRB R1,wave 19380 MOV R1,#49 : STRB R1,Cwave+1 19390 MOV R1,#32 : STRB R1,Cwave 19400 STRB R1,players_score : STRB R1,players_score+1 19410 STRB R1,players_score+2 : STRB R1,players_score+3 19420 STRB R1,players_score+4 19430 MOV R1,#0 : STR R1,score : STR R1,extra_ship 19440 MOV R1,#48 : STRB R1,players_score+5 19450 B reset_lives 19460 19470 .pause 19480 SWI &100+18 19490 MOV R0,#0 19500 SWI "OS_WriteC" 19510 MOV R0,#128 19520 SWI "OS_WriteC" 19530 .key 19540 MOV R0,#129 : LDR R1,hiscorekey : MOV R2,#255 : SWI "OS_Byte" 19550 CMP R1,#255 : BNE next_key 19560 MOV R0,#15:MOV R1,#0:SWI "OS_Byte" 19570 STMFD R13!,{R14} 19580 LDR R1,screen_start 19590 LDR R2,memory2_start 19600 LDR R3,screen_end 19610 BL store_screen 19620 BL screen_wither 19630 MOV R1,#0 : STRB R1,BHflag 19640 BL wither_on_screen 19650 .pc2 19660 MOV R0,#15:MOV R1,#0:SWI "OS_Byte" 19670 BL change_palette 19680 MOV R0,#129:MOV R1,#1:MOV R2,#0:SWI "OS_Byte" 19690 CMP R2,#0 : BNE pc2 19700 BL screen_wither 19710 MOV R3,#8 19720 .next_bit3 19730 LDR R1,memory2_start 19740 LDR R2,memory2_end 19750 LDR R7,screen_start 19760 BL wither_memory ; wither memory contents &1E000 to &28000 19770 SUBS R3,R3,#1 19780 BNE next_bit3 19790 LDR R1,memory2_start 19800 LDR R2,screen_start 19810 LDR R3,memory2_end 19820 BL write_screen 19830 19840 LDMFD R13!,{R14} 19850 .next_key 19860 MOV R0,#129 : LDR R1,spacekey : MOV R2,#255 : SWI "OS_Byte" 19870 CMP R1,#255 : BNE key 19880 MOV R15,R14 19890 .spacekey EQUD &FFFFFF9D ; SPACE BAR - Inkey Value (-99) 19900 .hiscorekey EQUD &FFFFFFAB ; H - Inkey Value (-85) 19910 19920 .game_over 19930 BL print_lives 19940 MOV R0,#15:MOV R1,#0:SWI "OS_Byte" 19950 SWI "OS_RemoveCursors" 19960 SWI &100+18 19970 MOV R0,#0 19980 SWI "OS_WriteC" 19990 MOV R0,#128 20000 SWI "OS_WriteC" 20010 20020 SWI &100+31 20030 MOV R0,#16 20040 SWI "OS_WriteC" 20050 MOV R0,#14 20060 SWI "OS_WriteC" 20070 SWI "OS_WriteS" 20080 EQUS ("GAME OVER") : EQUB 0 20090 20100 ; check if score is to be inserted into hiscore table 20110 ADR R1,scores 20120 BL directive_players_score 20130 MOV R8,#0 20140 .check_score 20150 MOV R5,#6 ; 6 characters in score 20160 MOV R3,R1 20170 MOV R4,R2 20180 .next_char 20190 LDRB R6,[R3],#1 20200 LDRB R7,[R4],#1 20210 CMP R6,R7 20220 BGT next_score 20230 BLT score_in 20240 SUBEQS R5,R5,#1 20250 BNE next_char 20260 B score_in ; insert score in hiscore table 20270 .next_score 20280 ADD R8,R8,#1 ; flag for names 20290 CMP R8,#10 : BEQ score_out 20300 ADD R1,R1,#8 20310 B check_score 20320 .score_in 20330 20340 BL enter_name 20350 20360 CMP R8,#9 : BEQ store_name ; bottom of hiscore table 20370 .move_table ; move scores < players score down one 20380 MOV R6,#8 20390 .move_names 20400 ADR R1,names : MOV R9,#16 : MLA R1,R9,R6,R1 20410 MOV R5,#15 20420 .next_nchar 20430 LDRB R4,[R1],#1 20440 STRB R4,[R1,#15] 20450 SUBS R5,R5,#1 20460 BNE next_nchar 20470 SUB R6,R6,#1 : CMP R6,R8 20480 BGE move_names 20490 20500 MOV R6,#8 20510 .move_scores 20520 ADR R1,scores : MOV R9,#8 : MLA R1,R9,R6,R1 20530 MOV R5,#6 20540 .next_schar 20550 LDRB R4,[R1],#1 20560 STRB R4,[R1,#7] 20570 SUBS R5,R5,#1 20580 BNE next_schar 20590 SUB R6,R6,#1 : CMP R6,R8 20600 BGE move_scores 20610 20620 .store_name ; store players name 20630 ADR R1,names : MOV R9,#16 : MLA R1,R9,R8,R1 20640 ADR R2,players_name 20650 MOV R3,#15 20660 .next_char 20670 LDRB R4,[R2],#1 20680 CMP R4,#&D ; string entered is terminated by RETURN char. 20690 BEQ spaces 20700 STRB R4,[R1],#1 20710 SUBS R3,R3,#1 20720 BNE next_char 20730 B store_score 20740 .spaces ; blanks out rest of previous name 20750 MOV R4,#32 20760 STRB R4,[R1],#1 20770 SUBS R3,R3,#1 20780 BNE spaces 20790 20800 .store_score ; store players score 20810 ADR R1,scores : MOV R9,#8 : MLA R1,R9,R8,R1 20820 BL directive_players_score 20830 MOV R3,#6 20840 .next_byte 20850 LDRB R4,[R2],#1 20860 STRB R4,[R1],#1 20870 SUBS R3,R3,#1 20880 BNE next_byte 20890 B name_entered 20900 20910 .score_out ; score not inserted in hiscore table 20920 SWI &100+31 20930 MOV R0,#7 20940 SWI "OS_WriteC" 20950 MOV R0,#27 20960 SWI "OS_WriteC" 20970 SWI "OS_WriteS" 20980 EQUS ("<Press any key to continue>") : EQUB 0 20990 MOV R0,#15:MOV R1,#0:SWI "OS_Byte" : SWI 4 21000 21010 .name_entered 21020 BL screen_wither 21030 MOV R1,#0 : STRB R1,BHflag 21040 BL wither_on_screen 21050 .pc 21060 MOV R0,#15:MOV R1,#0:SWI "OS_Byte" 21070 BL change_palette 21080 MOV R0,#129:MOV R1,#1:MOV R2,#0:SWI "OS_Byte" 21090 CMP R2,#0 : BNE pc 21100 BL screen_wither 21110 MOV R1,#1 : STRB R1,BHflag 21120 BL wither_on_screen 21130 21140 B game_start 21150 21160 .enter_name 21170 SWI &100+31 21180 MOV R0,#5 21190 SWI "OS_WriteC" 21200 MOV R0,#24 21210 SWI "OS_WriteC" 21220 SWI "OS_WriteS" 21230 EQUS ("Enter your name: ") : EQUB 0 21240 21250 ADR R0,players_name 21260 MOV R1,#15 21270 MOV R2,#32 21280 MOV R3,#126 21290 SWI "OS_ReadLine" 21300 MOV R15,R14 21310 .players_name EQUS "----- NICK -----" 21320 .BHflag EQUB 0 : ALIGN ; IF =0 print hiscores ELSE IF =1 plot border 21330 21340 .wither_on_screen 21350 ; set up bank 2 for display to allow bank 1 to be accessed 21360 MOV R0,#112 ; write bank 2 21370 MOV R1,#2 21380 SWI "OS_Byte" 21390 21400 SWI &100+12 ; CLS 21410 21420 MOV R0,#113 ; display bank 2 21430 MOV R1,#2 21440 SWI "OS_Byte" 21450 21460 ; bank 1 is SCREEN SHADOW MODE starting at &1FD8000 21470 MOV R0,#112 ; write bank 1 21480 MOV R1,#1 21490 SWI "OS_Byte" 21500 STMFD R13!,{R14} 21510 LDRB R1,BHflag : CMP R1,#1 21520 BEQ wither_on_border 21530 BL plot_screen ; plot hiscore graphics screen 21540 BL hiscore_table ; print hiscore table off screen 21550 B wither_on_hiscores 21560 .wither_on_border 21570 BL plot_border ; plot border off screen 21580 BL reset_lws ; resets lives=3, score=0, wave=1 21590 BL print_lives 21600 BL print_score 21610 BL plot_wave 21620 BL initial_stars 21630 .wither_on_hiscores 21640 LDR R1,screen_start 21650 LDR R2,memory_start 21660 LDR R3,screen_end 21670 BL store_screen ; store away screen to be withered 21680 LDMFD R13!,{R14} 21690 21700 SWI &100+18 ; reset background colour 21710 MOV R0,#0 21720 SWI "OS_WriteC" 21730 MOV R0,#128 21740 SWI "OS_WriteC" 21750 SWI &100+12 ; CLS - clear bank 1 21760 MOV R0,#113 ; display bank 1 21770 MOV R1,#1 21780 SWI "OS_Byte" 21790 21800 STMFD R13!,{R14} 21810 MOV R3,#8 21820 .next_bit 21830 LDR R1,memory_start 21840 LDR R2,memory_end 21850 LDR R7,screen_start 21860 BL wither_memory ; wither memory contents &14000 to &1E000 21870 SUBS R3,R3,#1 21880 BNE next_bit 21890 LDR R1,memory_start 21900 LDR R2,screen_start 21910 LDR R3,memory_end 21920 BL write_screen 21930 LDMFD R13!,{R14} 21940 MOV R15,R14 21950 21960 .hiscore_table 21970 MOV R0,#4 21980 MOV R1,#320 21990 MOV R2,#872 22000 SWI "OS_Plot" 22010 SWI "OS_WriteS" 22020 EQUS ("Top scores so far:") : EQUB 0 22030 22040 MOV R5,#10 ; top ten scores 22050 MOV R6,#11 ; X TAB 22060 ADR R1,scores ; pointer to scores 22070 ADR R2,names ; pointer to names 22080 .hsloop 22090 22100 SWI &100+31 22110 MOV R0,#9 22120 SWI "OS_WriteC" 22130 MOV R0,R6 22140 SWI "OS_WriteC" 22150 22160 MOV R0,R1 22170 SWI "OS_Write0" 22180 MOV R1,R0 22190 MOV R0,R2 22200 SWI "OS_Write0" 22210 MOV R2,R0 22220 ADD R6,R6,#1 22230 22240 SUBS R5,R5,#1 22250 BNE hsloop 22260 22270 MOV R0,#4 22280 MOV R1,#208 22290 MOV R2,#104 22300 SWI "OS_Plot" 22310 SWI "OS_WriteS" 22320 EQUS ("<Press any key to continue>") : EQUB 0 22330 22340 MOV R15,R14 22350 22360 .scores 22370 EQUS " 30000" : EQUB 32 : EQUB 0 22380 EQUS " 20000" : EQUB 32 : EQUB 0 22390 EQUS " 10000" : EQUB 32 : EQUB 0 22400 EQUS " 7000" : EQUB 32 : EQUB 0 22410 EQUS " 6000" : EQUB 32 : EQUB 0 22420 EQUS " 5000" : EQUB 32 : EQUB 0 22430 EQUS " 4000" : EQUB 32 : EQUB 0 22440 EQUS " 3000" : EQUB 32 : EQUB 0 22450 EQUS " 2000" : EQUB 32 : EQUB 0 22460 EQUS " 1000" : EQUB 32 : EQUB 0 22470 ALIGN 22480 22490 .names 22500 EQUS "--ACCEPTABLE " : EQUB 0 22510 EQUS "--AVERAGE " : EQUB 0 22520 EQUS "--MEDICORE " : EQUB 0 22530 EQUS "--NOT QUITE " : EQUB 0 22540 EQUS "--TRY HARDER " : EQUB 0 22550 EQUS "--POOR " : EQUB 0 22560 EQUS "--SLOPPY " : EQUB 0 22570 EQUS "--MISERABLE " : EQUB 0 22580 EQUS "--TERRIBLE " : EQUB 0 22590 EQUS "--PATHETIC " : EQUB 0 22600 ALIGN 22610 22620 .screen_wither 22630 MOV R3,#8 22640 LDR R2,screen_end 22650 .scr_shift 22660 LDR R1,screen_start 22670 .scr_shift2 22680 LDR R4,[R1],#4 22690 LDRB R5,count : CMP R5,#2 : BEQ scr_right 22700 MOV R4,R4,LSL #4 22710 STR R4,[R1,#-4] 22720 LDRB R7,count2 : SUBS R7,R7,#1 : STRB R7,count2 : BNE scr_left 22730 MOV R7,#40 : STRB R7,count2 22740 ADD R5,R5,#1 : STRB R5,count 22750 B scr_left 22760 .scr_right 22770 MOV R4,R4,LSR #4 22780 STR R4,[R1,#-4] 22790 LDRB R7,count2 : SUBS R7,R7,#1 : STRB R7,count2 : BNE scr_left 22800 MOV R7,#40 : STRB R7,count2 22810 SUB R5,R5,#1 : STRB R5,count 22820 .scr_left 22830 CMP R1,R2 22840 BNE scr_shift2 22850 SUBS R3,R3,#1 22860 BNE scr_shift 22870 MOV R15,R14 22880 22890 .wither_memory 22900 .mem_shift 22910 LDR R4,[R1],#4 22920 LDRB R5,count : CMP R5,#2 : BEQ mem_right 22930 MOV R8,R3 22940 .mem_left2 22950 MOV R4,R4,LSL #4 22960 SUBS R8,R8,#1 : BNE mem_left2 22970 STR R4,[R7],#4 22980 LDRB R6,count2 : SUBS R6,R6,#1 : STRB R6,count2 : BNE mem_left 22990 MOV R6,#40 : STRB R6,count2 23000 ADD R5,R5,#1 : STRB R5,count 23010 B mem_left 23020 .mem_right 23030 MOV R8,R3 23040 .mem_right2 23050 MOV R4,R4,LSR #4 23060 SUBS R8,R8,#1 : BNE mem_right2 23070 STR R4,[R7],#4 23080 LDRB R6,count2 : SUBS R6,R6,#1 : STRB R6,count2 : BNE mem_left 23090 MOV R6,#40 : STRB R6,count2 23100 SUB R5,R5,#1 : STRB R5,count 23110 .mem_left 23120 CMP R1,R2 23130 BNE mem_shift 23140 MOV R15,R14 23150 23160 .count EQUB 1 ; 1 = leftshift , 2 = rightshift 23170 .count2 EQUB 40 ; 40 = 1 line,40 words per line 23180 ALIGN 23190 23200 .store_screen 23210 LDR R4,[R1],#4 23220 STR R4,[R2],#4 23230 CMP R1,R3 23240 BLT store_screen 23250 MOV R15,R14 23260 23270 .write_screen 23280 LDR R4,[R1],#4 23290 STR R4,[R2],#4 23300 CMP R1,R3 23310 BLT write_screen 23320 MOV R15,R14 23330 23340 .screen_start EQUD &1FD8000 23350 .memory_start EQUD memory 23360 .memory2_start EQUD memory+&A000 23370 .screen_end EQUD &1FE2000 23380 .memory2_end EQUD memory+&14000 23390 .memory_end EQUD memory+&A000 23400 23410 .plot_border 23420 MOV R0,#34 23430 ADR R2,sprite 23440 LDR R3,X_Coordinate 23450 LDR R4,Y_Coordinate 23460 MOV R5,#0 ; GCOL action 23470 SWI "OS_SpriteOp" 23480 MOV R15,R14 23490 .sprite EQUS "GAMESCR" : EQUB 32 : ALIGN 23500 .X_Coordinate EQUD 0 23510 .Y_Coordinate EQUD 0 23520 23530 .plot_screen 23540 MOV R0,#34 23550 ADR R2,sprite2 23560 LDR R3,X_Coordinate 23570 LDR R4,Y_Coordinate 23580 MOV R5,#0 ; GCOL action 23590 SWI "OS_SpriteOp" 23600 MOV R15,R14 23610 .sprite2 EQUS "HISCR" : EQUB 32 : ALIGN 23620 23630 .increase_score 23640 LDR R1,score : LDRB R2,score_increment 23650 MOV R3,#10 : MUL R3,R2,R3 23660 ADD R1,R1,R3 : STR R1,score 23670 LDR R4,extra_ship 23680 ADD R4,R4,R3 : STR R4,extra_ship 23690 CMP R4,#4000 : BLT no_extra_ship 23700 MOV R4,#0 : STR R4,extra_ship 23710 STMFD R13!,{R14,R1-R3} 23720 BL lives_plus 23730 BL print_lives 23740 LDMFD R13!,{R14,R1-R3} 23750 23760 ; score range = 999990, steps of 10,20......90 23770 23780 .no_extra_ship 23790 ADR R1,players_score+4 23800 .next_num 23810 LDRB R3,[R1] 23820 CMP R3,#32 : BNE no_space 23830 ADD R3,R2,#48 : STRB R3,[R1] 23840 B print_score 23850 .no_space 23860 ADD R3,R3,#1 23870 CMP R3,#58 : BNE next_inc 23880 MOV R3,#48 23890 LDRB R4,[R1,#-1] : CMP R4,#32 23900 MOVEQ R4,#49 : ADDNE R4,R4,#1 : STRB R4,[R1,#-1] 23910 .next_inc 23920 STRB R3,[R1] 23930 SUBS R2,R2,#1 : BNE no_space 23940 .check_nine 23950 LDRB R4,[R1,#-1]! 23960 CMP R4,#58 : BLT print_score 23970 MOV R3,#48 : STRB R3,[R1] 23980 LDRB R4,[R1,#-1] : CMP R4,#32 23990 MOVEQ R4,#49 : ADDNE R4,R4,#1 : STRB R4,[R1,#-1] 24000 B check_nine 24010 .print_score 24020 SWI &100+18 24030 MOV R0,#3 24040 SWI "OS_WriteC" 24050 MOV R0,#136 24060 SWI "OS_WriteC" 24070 SWI &100+18 24080 MOV R0,#0 24090 SWI "OS_WriteC" 24100 MOV R0,#3 24110 SWI "OS_WriteC" 24120 24130 MOV R0,#4 24140 MOV R1,#832 24150 MOV R2,#908 24160 SWI "OS_Plot" 24170 24180 ADR R0,blank_score 24190 SWI "OS_Write0" 24200 MOV R15,R14 24210 .score EQUD 0 24220 .extra_ship EQUD 0 24230 .blank_score EQUB 127:EQUB 127:EQUB 127:EQUB 127:EQUB 127:EQUB 127 24240 .players_score EQUS " 0" : EQUB 0 24250 .score_increment EQUB 1 ; value >1 OR <9 24260 ALIGN 24270 24280 .directive_players_score 24290 ADR R2,players_score 24300 MOV R15,R14 24310 24320 .directive_pattern 24330 ADR R3,pattern 24340 MOV R15,R14 24350 24360 .pattern 24370 EQUB 0 ; initial position 24380 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24390 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24400 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24410 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24420 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24430 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24440 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24450 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24460 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24470 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24480 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24490 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24500 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24510 EQUB 32 ; end of pattern marker 24520 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24530 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24540 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24550 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24560 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24570 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24580 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24590 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24600 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24610 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24620 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24630 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24640 EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0:EQUB 0 24650 EQUB 32 ; end of pattern marker 24660 ALIGN 24670 24680 24690 ; ***************************************************************** 24700 .next_wave 24710 MOV R1,#1 : STRB R1,wave_finished ; set 24720 BL clear_screen 24730 SWI &100+18 24740 MOV R0,#3 24750 SWI "OS_WriteC" 24760 MOV R0,#3 24770 SWI "OS_WriteC" 24780 BL wave_counter 24790 LDRB R1,wave : CMP R1,#22 ; waves end sequence 24800 MOVEQ R1,#1 : STREQB R1,wave : BLEQ reset_var_addr ; repeats waves, resets wave to 1 so end of sequence can be found to reset waves 24810 BL print_wave 24820 BL plot_wave 24830 BL prepare_wave 24840 MOV R0,#1 ; Flag to prevent changes to bullets and usership 24850 BL init_wave_vars 24860 MOV R1,#0 : STRB R1,wave_finished ; cancel 24870 B display 24880 .wave_finished EQUB 0 24890 ALIGN 24900 24910 .load_wave_finished 24920 LDRB R1,wave_finished 24930 MOV R15,R14 24940 ; ***************************************************************** 24950 24960 .end 24970 LDMFD R13!,{R15} 24980 24990 25000 ; clear existing bombs yet, are still lethal although alien ship have vanished 25010 25020 .clear_screen 25030 STMFD R13!,{R14} 25040 .next_moves 25050 BL move_stars 25060 BL drop_bombs 25070 BL explosion_check 25080 BL bomb_explo_check 25090 BL cluster_check 25100 BL inner 25110 BL load_dead : CMP R1,#1 : BLEQ usership_explosion 25120 BL load_dead : CMP R1,#1 : BEQ no_keys 25130 BL test_keypress 25140 .no_keys 25150 MOV R5,#280 : BL slow1 25160 BL directive_alien_bombs 25170 CMP R1,#0 :BNE next_moves 25180 25190 ; A loop of 260 as cluster explosion has 26 frames & a delay of 20 25200 ; So a saftey loop to make sure everything is counted for especially the alien explosions as there is no counter for them to see if there is any left 25210 25220 MOV R1,#260 : STR R1,final_loop 25230 .final_screen_clear 25240 BL move_stars 25250 BL drop_bombs 25260 BL explosion_check 25270 BL bomb_explo_check 25280 BL cluster_check 25290 BL inner 25300 BL load_dead : CMP R1,#1 : BLEQ usership_explosion 25310 BL load_dead : CMP R1,#1 : BEQ no_keys2 25320 BL test_keypress 25330 .no_keys2 25340 MOV R5,#380 : BL slow1 25350 LDR R1,final_loop 25360 SUBS R1,R1,#1 25370 STR R1,final_loop 25380 BNE final_screen_clear 25390 LDMFD R13!,{R15} 25400 .final_loop EQUD 260 25410 25420 .prepare_wave 25430 LDR R1,time_out 25440 .wave_delay 25450 STMFD R13!,{R1,R14} 25460 BL move_stars 25470 BL change_palette 25480 BL load_no_of_bullets : CMP R2,#0 : BLNE inner 25490 MOV R5,#400 : BL slow1 : BL test_keypress 25500 LDMFD R13!,{R1,R14} 25510 SUBS R1,R1,#1 : BNE wave_delay 25520 SWI &100+18 25530 MOV R0,#3 25540 SWI "OS_WriteC" 25550 MOV R0,#3 25560 SWI "OS_WriteC" 25570 STMFD R13!,{R14} : BL print_wave 25580 LDMFD R13!,{R15} 25590 .time_out EQUD 700 25600 25610 .wave_counter 25620 LDRB R0,Cwave+1 : ADD R0,R0,#1 : STRB R0,Cwave+1 25630 CMP R0,#58 : BNE count_done 25640 MOV R0,#48 : STRB R0,Cwave+1 25650 LDRB R0,Cwave : CMP R0,#32 25660 MOVEQ R0,#49 : STREQB R0,Cwave 25670 ADDNE R0,R0,#1 : STRNEB R0,Cwave 25680 .count_done 25690 LDRB R0,wave : ADD R0,R0,#1 : STRB R0,wave 25700 MOV R15,R14 25710 25720 .print_wave 25730 SWI &100+31 25740 MOV R0,#10 25750 SWI "OS_WriteC" 25760 MOV R0,#15 25770 SWI "OS_WriteC" 25780 SWI "OS_WriteS" 25790 EQUS ("PREPARE FOR WAVE ") : EQUB 0 25800 25810 LDRB R0,Cwave 25820 SWI "OS_WriteC" 25830 LDRB R0,Cwave+1 25840 SWI "OS_WriteC" 25850 MOV R15,R14 25860 25870 .plot_wave 25880 SWI &100+18 25890 MOV R0,#3 25900 SWI "OS_WriteC" 25910 MOV R0,#136 25920 SWI "OS_WriteC" 25930 SWI &100+18 25940 MOV R0,#0 25950 SWI "OS_WriteC" 25960 MOV R0,#3 25970 SWI "OS_WriteC" 25980 MOV R0,#4 25990 MOV R1,#1000 : ADD R1,R1,#160 26000 MOV R2,#880 26010 SWI "OS_Plot" 26020 ADR R0,Bwave 26030 SWI "OS_Write0" 26040 MOV R15,R14 26050 26060 .wave EQUB 1 26070 .Bwave EQUB 127:EQUB 127 26080 .Cwave EQUS " 1" : EQUB 0 26090 ALIGN 26100 26110 .init_wave_vars 26120 LDR R1,var_addr 26130 STR R1,var_addr2 26140 B new_wave 26150 .repeat_wave 26160 LDR R1,var_addr2 26170 .new_wave 26180 LDRB R2,[R1],#1 : STRB R2,score_increment 26190 LDRB R2,[R1],#1 26200 LDRB R3,[R1],#1 26210 LDRB R4,[R1],#1 26220 LDRB R5,[R1],#1 26230 LDRB R6,[R1],#1 26240 LDRB R7,[R1],#1 26250 LDRB R8,[R1],#1 26260 LDRB R9,[R1],#1 26270 LDRB R10,[R1],#1 26280 STMFD R13!,{R14,R1} : BL program_variables : LDMFD R13!,{R14,R1} 26290 26300 ; initialise byte, 12 bytes for each sprite 26310 SUB R10,R10,#2 26320 MOV R8,#12 : MUL R11,R8,R10 26330 LDRB R8,[R1],#1 ; how many different sprites onscreen 26340 MOV R7,R1 : ADD R1,R1,#9 ; each sprite has a number 26350 LDR R3,[R1],#4 ; if different then sprites are split 26360 LDR R4,[R1],#4 26370 LDR R5,[R1],#4 26380 LDR R6,[R1],#4 26390 STR R1,var_addr ; stores current position in variables 26400 MVN R9,#0 26410 MOV R1,#0 26420 STMFD R13!,{R14} : BL directive_byte : LDMFD R13!,{R14} 26430 .loop 26440 ; first sprite 26450 ADD R9,R9,#1 26460 LDRB R10,[R7,R9] 26470 CMP R9,R8 : MVNEQ R9,#0 26480 STR R3,[R2,#0] 26490 STR R10,[R2,#4] 26500 STR R5,[R2,#8] 26510 ; second sprite 26520 ADD R9,R9,#1 26530 LDRB R10,[R7,R9] 26540 CMP R9,R8 : MVNEQ R9,#0 26550 STR R4,[R2,#12] 26560 STR R10,[R2,#16] 26570 STR R6,[R2,#20] 26580 26590 ADD R2,R2,#24:ADD R1,R1,#24 : CMP R1,R11 26600 BLS loop 26610 .mainloop 26620 MOV R8,#0 ; sprite_no 26630 MOV R9,#0 :MOV R10,#0 ; pattern bytes pointer, R9 - set to current sprite added to offset to give final result in R10 26640 26650 LDR R1,var_addr 26660 LDRB R2,[R1],#1 26670 BNV end:BNV end 26680 ADR R3,pattern 26690 .pattern_write 26700 LDRB R4,[R1],#1 26710 STRB R4,[R3],#1 26720 SUBS R2,R2,#1 26730 BNE pattern_write 26740 STR R1,var_addr 26750 MOV R15,R14 26760 26770 .reset_var_addr 26780 ADR R1,variables 26790 STR R1,var_addr 26800 STR R1,var_addr2 26810 MOV R15,R14 26820 26830 .var_addr EQUD variables 26840 .var_addr2 EQUD variables 26850 26860 .variables 26870 26880 ; ********** WAVE 1 26890 EQUB 1 26900 EQUB 0 : EQUB 0 : EQUB 20 : EQUB 3 : EQUB 1 : EQUB 94 : EQUB 7 : EQUB 7 :EQUB 35 26910 EQUB 0 26920 EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 26930 EQUD &1FD8000 : EQUD &1FD8000 : EQUD 0 : EQUD 0 26940 ; pattern 26950 EQUB 95 26960 EQUB 0 26970 EQUB 27:EQUB 27:EQUB 27:EQUB 27:EQUB 27:EQUB 27:EQUB 27:EQUB 27:EQUB 27 26980 EQUB 27:EQUB 27:EQUB 27:EQUB 27:EQUB 27:EQUB 26:EQUB 26:EQUB 26:EQUB 26 26990 EQUB 17:EQUB 17:EQUB 17:EQUB 17:EQUB 17:EQUB 17:EQUB 17:EQUB 17:EQUB 17 27000 EQUB 16:EQUB 16:EQUB 16:EQUB 16:EQUB 8:EQUB 8:EQUB 8:EQUB 8:EQUB 8:EQUB 8:EQUB 8 27010 EQUB 5:EQUB 5:EQUB 5:EQUB 5:EQUB 6:EQUB 6:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 27020 EQUB 6:EQUB 6:EQUB 6:EQUB 5:EQUB 5:EQUB 5:EQUB 40:EQUB 40:EQUB 40:EQUB 40:EQUB 40 27030 EQUB 40:EQUB 40:EQUB 48:EQUB 48:EQUB 48:EQUB 48:EQUB 49:EQUB 49:EQUB 49 27040 EQUB 49:EQUB 49:EQUB 49:EQUB 49:EQUB 49:EQUB 49:EQUB 58:EQUB 58:EQUB 58 27050 EQUB 58:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59 27060 EQUB 59:EQUB 59:EQUB 59:EQUB 59 27070 EQUB 32 27080 27090 27100 ; ********** WAVE 2 27110 EQUB 1 27120 EQUB 0 : EQUB 0 : EQUB 25 : EQUB 2 : EQUB 2 : EQUB 101 : EQUB 3 : EQUB 3 : EQUB 36 27130 EQUB 1 27140 EQUB 1 : EQUB 2 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 27150 EQUD &1FDE188 : EQUD &1FDCD76 : EQUD 0 : EQUD 52 27160 EQUB 103 27170 EQUB 0 27180 EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57 27190 EQUB 50:EQUB 50:EQUB 2:EQUB 18:EQUB 18 27200 EQUB 17:EQUB 17:EQUB 17:EQUB 17:EQUB 17:EQUB 17:EQUB 17:EQUB 17:EQUB 17 27210 EQUB 17:EQUB 17:EQUB 17:EQUB 17:EQUB 17:EQUB 17:EQUB 17 27220 EQUB 18:EQUB 18:EQUB 18:EQUB 18:EQUB 3:EQUB 3:EQUB 3 27230 EQUB 50:EQUB 50:EQUB 50:EQUB 50 27240 EQUB 49:EQUB 49:EQUB 49:EQUB 49:EQUB 49:EQUB 49:EQUB 49:EQUB 49 27250 EQUB 50:EQUB 50:EQUB 2:EQUB 18 27260 EQUB 32 27270 EQUB 0 27280 EQUB 54:EQUB 4:EQUB 22:EQUB 22 27290 EQUB 21:EQUB 21:EQUB 21:EQUB 21:EQUB 21:EQUB 21:EQUB 21:EQUB 21 27300 EQUB 54:EQUB 54:EQUB 54:EQUB 54 27310 EQUB 7:EQUB 7:EQUB 7:EQUB 54:EQUB 54:EQUB 54:EQUB 54 27320 EQUB 53:EQUB 53:EQUB 53:EQUB 53:EQUB 53:EQUB 53:EQUB 53 27330 EQUB 53:EQUB 53:EQUB 53:EQUB 53:EQUB 53:EQUB 53:EQUB 53:EQUB 53:EQUB 53 27340 EQUB 54:EQUB 54:EQUB 6:EQUB 22:EQUB 22 27350 EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29 27360 EQUB 32:EQUB 0 27370 27380 27390 ; ********** WAVE 3 27400 EQUB 1 27410 EQUB 0 : EQUB 0 : EQUB 25 : EQUB 3 : EQUB 2 : EQUB 125 : EQUB 6 : EQUB 7: EQUB 36 27420 EQUB 0 27430 EQUB 8 : EQUB 0 : EQUB 1 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 27440 EQUD &1FE12E7 : EQUD &1FE136F : EQUD 0 : EQUD 67 27450 EQUB 127 27460 EQUB 0 27470 EQUB 40:EQUB 56:EQUB 56:EQUB 40:EQUB 56:EQUB 56:EQUB 40:EQUB 56 27480 EQUB 56:EQUB 40:EQUB 56:EQUB 56:EQUB 40:EQUB 56 27490 27500 EQUB 56:EQUB 40:EQUB 56:EQUB 56:EQUB 40:EQUB 56:EQUB 56:EQUB 40 27510 EQUB 56:EQUB 40:EQUB 57:EQUB 57 27520 EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 58:EQUB 58:EQUB 58 27530 EQUB 3:EQUB 3 27540 EQUB 26:EQUB 26:EQUB 26:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25 27550 EQUB 25:EQUB 25:EQUB 24:EQUB 24 27560 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 27570 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 27580 EQUB 32 27590 EQUB 0 27600 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 27610 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 27620 EQUB 56:EQUB 56:EQUB 61:EQUB 61 27630 EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 62:EQUB 62:EQUB 62 27640 EQUB 7:EQUB 7 27650 EQUB 30:EQUB 30:EQUB 30:EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29 27660 EQUB 29:EQUB 29:EQUB 24:EQUB 24 27670 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 27680 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 27690 EQUB 32:EQUB 0 27700 27710 27720 ; ********** WAVE 4 27730 EQUB 1 27740 EQUB 0 : EQUB 0 : EQUB 25 : EQUB 3 : EQUB 2 : EQUB 61 : EQUB 1 : EQUB 1: EQUB 35 27750 EQUB 1 27760 EQUB 3 : EQUB 4 : EQUB 1 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 27770 EQUD &1FDBB68 : EQUD &1FDD950 : EQUD 0 : EQUD 32 27780 EQUB 63 27790 EQUB 0 27800 EQUB 18:EQUB 18:EQUB 18:EQUB 18:EQUB 18:EQUB 18:EQUB 3:EQUB 3:EQUB 3 27810 EQUB 50:EQUB 50:EQUB 50:EQUB 50:EQUB 50:EQUB 50:EQUB 3:EQUB 3:EQUB 3 27820 EQUB 18:EQUB 18:EQUB 18:EQUB 18:EQUB 18:EQUB 18:EQUB 3:EQUB 3:EQUB 3 27830 EQUB 50:EQUB 50 27840 EQUB 32 27850 EQUB 0 27860 EQUB 22:EQUB 22 27870 EQUB 7:EQUB 7:EQUB 7:EQUB 54:EQUB 54:EQUB 54:EQUB 54:EQUB 54:EQUB 54 27880 EQUB 7:EQUB 7:EQUB 7:EQUB 22:EQUB 22:EQUB 22:EQUB 22:EQUB 22:EQUB 22 27890 EQUB 7:EQUB 7:EQUB 7:EQUB 54:EQUB 54:EQUB 54:EQUB 54:EQUB 54:EQUB 54 27900 EQUB 32:EQUB 0 27910 27920 27930 ; ********** WAVE 5 27940 EQUB 1 27950 EQUB 0 : EQUB 0 : EQUB 25 : EQUB 3 : EQUB 3 : EQUB 107 : EQUB 8 : EQUB 8 :EQUB 35 27960 EQUB 0 27970 EQUB 9 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 27980 EQUD &1FE0209 : EQUD &1FE0209 : EQUD 0 : EQUD 0 27990 EQUB 111 28000 EQUB 0 28010 EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 51:EQUB 51:EQUB 51:EQUB 43:EQUB 43:EQUB 43 28020 EQUB 3:EQUB 3 28030 EQUB 11:EQUB 11:EQUB 11:EQUB 19:EQUB 19:EQUB 19:EQUB 27:EQUB 27:EQUB 27:EQUB 27 28040 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 28050 EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 55:EQUB 55:EQUB 55:EQUB 47:EQUB 47:EQUB 47 28060 EQUB 7:EQUB 7 28070 EQUB 15:EQUB 15:EQUB 15:EQUB 23:EQUB 23:EQUB 23:EQUB 31:EQUB 31:EQUB 31:EQUB 31 28080 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 28090 EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 51:EQUB 51:EQUB 51:EQUB 43:EQUB 43:EQUB 43 28100 EQUB 3:EQUB 3 28110 EQUB 11:EQUB 11:EQUB 11:EQUB 19:EQUB 19:EQUB 19:EQUB 27:EQUB 27:EQUB 27:EQUB 27 28120 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 28130 EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 55:EQUB 55:EQUB 55:EQUB 47:EQUB 47:EQUB 47 28140 EQUB 7:EQUB 7 28150 EQUB 15:EQUB 15:EQUB 15:EQUB 23:EQUB 23:EQUB 23:EQUB 31:EQUB 31:EQUB 31:EQUB 31 28160 EQUB 32:EQUB 0:EQUB 0:EQUB 0 28170 28180 28190 ; ********** WAVE 6 28200 EQUB 2 28210 EQUB 4 : EQUB 0 : EQUB 10 : EQUB 3 : EQUB 3 : EQUB 103 : EQUB 6 : EQUB 6: EQUB 40 28220 EQUB 1 28230 EQUB 3 : EQUB 4 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 28240 EQUD &1FE12E7 : EQUD &1FE12E7 : EQUD 0 : EQUD 0 28250 EQUB 107 28260 EQUB 0 28270 EQUB 3:EQUB 3:EQUB 42:EQUB 42:EQUB 42:EQUB 42:EQUB 42:EQUB 42 28280 EQUB 42:EQUB 42:EQUB 42 28290 EQUB 57:EQUB 57:EQUB 57:EQUB 57 28300 EQUB 56:EQUB 56:EQUB 56 28310 EQUB 61:EQUB 61:EQUB 61:EQUB 61 28320 EQUB 46:EQUB 46:EQUB 46:EQUB 46 28330 EQUB 54:EQUB 54:EQUB 54:EQUB 54 28340 EQUB 49:EQUB 49:EQUB 49:EQUB 49 28350 EQUB 56:EQUB 56:EQUB 56 28360 EQUB 53:EQUB 53:EQUB 53:EQUB 53 28370 EQUB 50:EQUB 50:EQUB 50:EQUB 50 28380 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 28390 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 28400 EQUB 18:EQUB 18:EQUB 18:EQUB 18 28410 EQUB 21:EQUB 21:EQUB 21:EQUB 21 28420 EQUB 24:EQUB 24:EQUB 24:EQUB 24 28430 EQUB 17:EQUB 17:EQUB 17:EQUB 17 28440 EQUB 22:EQUB 22:EQUB 22:EQUB 22 28450 EQUB 14:EQUB 14:EQUB 14:EQUB 14 28460 EQUB 23:EQUB 23:EQUB 23:EQUB 23 28470 EQUB 24:EQUB 24:EQUB 24 28480 EQUB 25:EQUB 25:EQUB 25:EQUB 25 28490 EQUB 10:EQUB 10:EQUB 10 28500 EQUB 10:EQUB 10:EQUB 10:EQUB 10:EQUB 10:EQUB 10 28510 EQUB 3:EQUB 3:EQUB 3:EQUB 3 28520 EQUB 32 28530 28540 28550 ; ********** WAVE 7 28560 EQUB 2 28570 EQUB 4 : EQUB 0 : EQUB 10 : EQUB 3 : EQUB 3 : EQUB 124 : EQUB 6 : EQUB 6 : EQUB 40 28580 EQUB 1 28590 EQUB 7 : EQUB 9 : EQUB 1 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 28600 EQUD &1FD8000 : EQUD &1FD8000 : EQUD 0 : EQUD 0 28610 EQUB 127 28620 EQUB 0 28630 EQUB 26:EQUB 26:EQUB 26:EQUB 26:EQUB 26:EQUB 26:EQUB 26:EQUB 26 28640 EQUB 26:EQUB 26:EQUB 26:EQUB 26:EQUB 26:EQUB 26 28650 EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25 28660 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 28670 EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29 28680 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 5 28690 EQUB 13:EQUB 13:EQUB 13:EQUB 13:EQUB 8:EQUB 8:EQUB 8:EQUB 8:EQUB 9:EQUB 9:EQUB 9:EQUB 9 28700 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 28710 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 28720 EQUB 41:EQUB 41:EQUB 41:EQUB 41:EQUB 40:EQUB 40:EQUB 40:EQUB 40:EQUB 45:EQUB 45:EQUB 45:EQUB 45 28730 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 28740 EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61 28750 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 28760 EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57 28770 EQUB 58:EQUB 58:EQUB 58:EQUB 58:EQUB 58:EQUB 58 28780 EQUB 58:EQUB 58:EQUB 58:EQUB 58:EQUB 58:EQUB 58:EQUB 58 28790 EQUB 32:EQUB 0:EQUB 0 28800 28810 28820 ; ********** WAVE 8 28830 EQUB 2 28840 EQUB 4 : EQUB 0 : EQUB 10 : EQUB 3 : EQUB 3 : EQUB 82 : EQUB 7 : EQUB 7 :EQUB 40 28850 EQUB 1 28860 EQUB 4 : EQUB 9 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 28870 EQUD &1FDD507 : EQUD &1FDD507 : EQUD 0 : EQUD 0 28880 EQUB 83 28890 EQUB 0 28900 EQUB 3:EQUB 3:EQUB 3:EQUB 3 28910 EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57 28920 EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57 28930 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 28940 EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25 28950 EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25 28960 EQUB 3:EQUB 3:EQUB 3 28970 EQUB 24:EQUB 24:EQUB 16 28980 EQUB 7:EQUB 7:EQUB 7 28990 EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29 29000 EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29 29010 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 29020 EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61 29030 EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61 29040 EQUB 7:EQUB 7:EQUB 7:EQUB 7 29050 EQUB 32 29060 29070 29080 ; ********** WAVE 9 29090 EQUB 2 29100 EQUB 4 : EQUB 0 : EQUB 10 : EQUB 3 : EQUB 3 : EQUB 66 : EQUB 3 : EQUB 3 : EQUB 40 29110 EQUB 1 29120 EQUB 7 : EQUB 9 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 29130 EQUD &1FE14C8 : EQUD &1FE154C : EQUD 0 : EQUD 39 29140 EQUB 67 29150 EQUB 0 29160 EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59 29170 EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59 29180 EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63 29190 EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63 29200 EQUB 32 29210 EQUB 0 29220 EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63 29230 EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63 29240 EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59 29250 EQUB 32 29260 29270 29280 ; ********** WAVE 10 29290 EQUB 3 29300 EQUB 4 : EQUB 0 : EQUB 10 : EQUB 3 : EQUB 3 : EQUB 91 : EQUB 8 : EQUB 8 : EQUB 50 29310 EQUB 1 29320 EQUB 5 : EQUB 6 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 29330 EQUD &1FD8046 : EQUD &1FD8046 : EQUD 0 : EQUD 47 29340 EQUB 95 29350 EQUB 0 29360 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 29370 EQUB 30:EQUB 30:EQUB 29:EQUB 26:EQUB 26:EQUB 26 29380 EQUB 30:EQUB 31:EQUB 31:EQUB 30:EQUB 30:EQUB 27:EQUB 27 29390 EQUB 7 29400 EQUB 31:EQUB 31:EQUB 31:EQUB 30:EQUB 30:EQUB 27:EQUB 27:EQUB 27 29410 EQUB 7 29420 EQUB 31:EQUB 31:EQUB 31:EQUB 31:EQUB 30:EQUB 30:EQUB 27:EQUB 27:EQUB 27 29430 EQUB 7 29440 EQUB 31:EQUB 31 29450 EQUB 32 29460 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 29470 EQUB 26:EQUB 26:EQUB 25:EQUB 30:EQUB 30:EQUB 30 29480 EQUB 3 29490 EQUB 26:EQUB 27:EQUB 27:EQUB 26:EQUB 26:EQUB 30:EQUB 30 29500 EQUB 3 29510 EQUB 27:EQUB 27:EQUB 27:EQUB 26:EQUB 26:EQUB 31:EQUB 31:EQUB 31 29520 EQUB 3 29530 EQUB 27:EQUB 27:EQUB 27:EQUB 27:EQUB 26:EQUB 26:EQUB 31:EQUB 31:EQUB 31 29540 EQUB 3 29550 EQUB 27:EQUB 27 29560 EQUB 32:EQUB 0:EQUB 0:EQUB 0 29570 29580 29590 ; ********** WAVE 11 29600 EQUB 3 29610 EQUB 4 : EQUB 8 : EQUB 10 : EQUB 3 : EQUB 3 : EQUB 122 : EQUB 7 : EQUB 7 :EQUB 50 29620 EQUB 1 29630 EQUB 8 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 29640 EQUD &1FE1428 : EQUD &1FE1428 : EQUD 0 : EQUD 0 29650 EQUB 123 29660 EQUB 0 29670 EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57 29680 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 29690 EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61 29700 EQUB 56:EQUB 56:EQUB 59:EQUB 59:EQUB 58 29710 EQUB 3:EQUB 3:EQUB 3:EQUB 27:EQUB 27 29720 EQUB 24:EQUB 24:EQUB 24 29730 EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29 29740 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 29750 EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25 29760 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 29770 EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57 29780 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 29790 EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61 29800 EQUB 56:EQUB 56:EQUB 56 29810 EQUB 59:EQUB 59:EQUB 3:EQUB 3:EQUB 3 29820 EQUB 26:EQUB 27:EQUB 27:EQUB 24:EQUB 24 29830 EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29:EQUB 29 29840 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 29850 EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25 29860 EQUB 32 29870 29880 29890 ; ********** WAVE 12 29900 EQUB 3 29910 EQUB 4 : EQUB 8 : EQUB 10 : EQUB 3 : EQUB 3 : EQUB 97 : EQUB 6 : EQUB 6 : EQUB 50 29920 EQUB 2 29930 EQUB 4 : EQUB 5 : EQUB 6 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 29940 EQUD &1FDF088 : EQUD &1FDF10B : EQUD 0 : EQUD 50 29950 EQUB 99 29960 EQUB 0 29970 EQUB 1:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 29980 EQUB 43:EQUB 43:EQUB 51:EQUB 51:EQUB 56:EQUB 54:EQUB 54:EQUB 53:EQUB 53 29990 EQUB 7:EQUB 7:EQUB 7:EQUB 7 30000 EQUB 51:EQUB 51:EQUB 51:EQUB 43:EQUB 43:EQUB 43 30010 EQUB 56:EQUB 56:EQUB 56 30020 EQUB 47:EQUB 47:EQUB 47:EQUB 55:EQUB 55:EQUB 55 30030 EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59 30040 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 30050 EQUB 32 30060 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 30070 EQUB 47:EQUB 47:EQUB 55:EQUB 55:EQUB 56:EQUB 50:EQUB 50:EQUB 49:EQUB 49 30080 EQUB 3:EQUB 3:EQUB 3:EQUB 3 30090 EQUB 55:EQUB 55:EQUB 55:EQUB 47:EQUB 47:EQUB 47 30100 EQUB 56:EQUB 56:EQUB 56 30110 EQUB 43:EQUB 43:EQUB 43:EQUB 51:EQUB 51:EQUB 51 30120 EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63 30130 EQUB 61:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 30140 EQUB 32:EQUB 0 30150 30160 30170 ; ********** WAVE 13 30180 EQUB 3 30190 EQUB 4 : EQUB 8 : EQUB 10 : EQUB 3 : EQUB 3 : EQUB 63 : EQUB 8 : EQUB 8 : EQUB 50 30200 EQUB 2 30210 EQUB 6 : EQUB 7 : EQUB 8 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 30220 EQUD &1FE0D48 : EQUD &1FE0D48 : EQUD 0 : EQUD 0 30230 EQUB 67 30240 EQUB 0 30250 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 30260 EQUB 43:EQUB 43:EQUB 43:EQUB 43 30270 EQUB 50:EQUB 50:EQUB 50:EQUB 50 30280 EQUB 56:EQUB 56:EQUB 56:EQUB 56 30290 EQUB 54:EQUB 54:EQUB 54:EQUB 54 30300 EQUB 47:EQUB 47:EQUB 47:EQUB 47 30310 EQUB 46:EQUB 46:EQUB 46:EQUB 46 30320 EQUB 53:EQUB 53:EQUB 53:EQUB 53 30330 EQUB 56:EQUB 56:EQUB 56:EQUB 56 30340 EQUB 49:EQUB 49:EQUB 49:EQUB 49 30350 EQUB 42:EQUB 42:EQUB 42:EQUB 42 30360 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 30370 EQUB 3:EQUB 3:EQUB 3:EQUB 3 30380 EQUB 32:EQUB 0:EQUB 0:EQUB 0 30390 30400 30410 ; ********** WAVE 14 30420 EQUB 3 30430 EQUB 4 : EQUB 8 : EQUB 10 : EQUB 3 : EQUB 3 : EQUB 166 : EQUB 5 : EQUB 1 : EQUB 50 30440 EQUB 3 30450 EQUB 0 : EQUB 1 : EQUB 9 : EQUB 7 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 30460 EQUD &1FD8045 : EQUD &1FD8045 : EQUD 0 : EQUD 86 30470 EQUB 167 30480 EQUB 0 30490 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 30500 EQUB 18:EQUB 17:EQUB 18:EQUB 5:EQUB 5:EQUB 5 30510 EQUB 22:EQUB 22:EQUB 21:EQUB 8:EQUB 17:EQUB 18:EQUB 18 30520 EQUB 3:EQUB 3 30530 EQUB 10:EQUB 10:EQUB 10:EQUB 9:EQUB 9:EQUB 9 30540 EQUB 16:EQUB 16 30550 EQUB 13:EQUB 13:EQUB 13:EQUB 14:EQUB 14:EQUB 14 30560 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 30570 EQUB 22:EQUB 22:EQUB 22:EQUB 21:EQUB 21:EQUB 21 30580 EQUB 24:EQUB 24:EQUB 24 30590 EQUB 17:EQUB 17:EQUB 17:EQUB 18:EQUB 18:EQUB 18 30600 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 30610 EQUB 3:EQUB 3:EQUB 3:EQUB 3 30620 EQUB 18:EQUB 18:EQUB 17:EQUB 17:EQUB 18:EQUB 24:EQUB 24:EQUB 24 30630 EQUB 16:EQUB 16:EQUB 16:EQUB 16:EQUB 16:EQUB 16 30640 EQUB 32 30650 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 30660 EQUB 22:EQUB 21:EQUB 22:EQUB 1:EQUB 1:EQUB 1 30670 EQUB 18::EQUB 18:EQUB 17:EQUB 8:EQUB 21:EQUB 22:EQUB 22 30680 EQUB 7:EQUB 7 30690 EQUB 14:EQUB 14:EQUB 14:EQUB 13:EQUB 13:EQUB 13 30700 EQUB 16:EQUB 16 30710 EQUB 9:EQUB 9:EQUB 9:EQUB 10:EQUB 10:EQUB 10 30720 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 30730 EQUB 18:EQUB 18:EQUB 18:EQUB 17:EQUB 17:EQUB 17 30740 EQUB 24:EQUB 24:EQUB 24 30750 EQUB 21:EQUB 21:EQUB 21:EQUB 22:EQUB 22:EQUB 22 30760 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 30770 EQUB 7:EQUB 7 30780 EQUB 22:EQUB 22:EQUB 21:EQUB 21:EQUB 22:EQUB 24:EQUB 24:EQUB 24 30790 EQUB 16:EQUB 16:EQUB 16:EQUB 16:EQUB 16:EQUB 16 30800 EQUB 32 30810 30820 30830 ; ********** WAVE 15 30840 EQUB 3 30850 EQUB 4 : EQUB 8 : EQUB 10 : EQUB 4 : EQUB 3 : EQUB 95 : EQUB 8 : EQUB 8 :EQUB 50 30860 EQUB 0 30870 EQUB 7 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 30880 EQUD &1FE15AB : EQUD &1FE15AB : EQUD 0 : EQUD 0 30890 EQUB 99 30900 EQUB 0 30910 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 30920 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 30930 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 30940 EQUB 58:EQUB 58:EQUB 57:EQUB 57:EQUB 58:EQUB 58 30950 EQUB 2:EQUB 2 30960 EQUB 26:EQUB 26:EQUB 25:EQUB 25:EQUB 26:EQUB 26 30970 EQUB 16:EQUB 16 30980 EQUB 30:EQUB 30:EQUB 29:EQUB 30:EQUB 30 30990 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 31000 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 5 31010 EQUB 22:EQUB 22:EQUB 22:EQUB 14:EQUB 14:EQUB 14 31020 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 31030 EQUB 18:EQUB 18:EQUB 18:EQUB 10:EQUB 10:EQUB 10 31040 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 31050 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 31060 EQUB 32:EQUB 0:EQUB 0:EQUB 0 31070 31080 31090 ; ********** WAVE 16 31100 EQUB 3 31110 EQUB 4 : EQUB 8 : EQUB 10 : EQUB 4 : EQUB 3 : EQUB 114 : EQUB 9 : EQUB 9 : EQUB 50 31120 EQUB 1 31130 EQUB 2 : EQUB 6 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 31140 EQUD &1FE1388 : EQUD &1FE1388 : EQUD 0 : EQUD 0 31150 EQUB 115 31160 EQUB 0 31170 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 31180 EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25 31190 EQUB 25 31200 EQUB 59:EQUB 59:EQUB 59 31210 EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61 31220 EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61 31230 31240 EQUB 59:EQUB 59:EQUB 59 31250 EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25 31260 EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25 31270 EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25 31280 EQUB 59:EQUB 59:EQUB 59:EQUB 59 31290 EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61 31300 EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61 31310 EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61:EQUB 61 31320 EQUB 59:EQUB 59:EQUB 59:EQUB 59 31330 EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25 31340 EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25 31350 EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25 31360 EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25 31370 EQUB 3:EQUB 3:EQUB 3 31380 EQUB 32 31390 31400 31410 ; ********** WAVE 17 31420 EQUB 4 31430 EQUB 4 : EQUB 8 : EQUB 10 : EQUB 3 : EQUB 3 : EQUB 122 : EQUB 8 : EQUB 8 : EQUB 50 31440 EQUB 1 31450 EQUB 3 : EQUB 4 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 31460 EQUD &1FDA8A8 : EQUD &1FDA8A8 : EQUD 0 : EQUD 0 31470 EQUB 123 31480 EQUB 0 31490 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 31500 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 31510 EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25:EQUB 25 31520 EQUB 25:EQUB 25 31530 EQUB 3:EQUB 3:EQUB 3:EQUB 3 31540 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 31550 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 31560 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 31570 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 31580 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 31590 EQUB 3:EQUB 3:EQUB 3:EQUB 3 31600 EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57:EQUB 57 31610 EQUB 57:EQUB 57 31620 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 31630 EQUB 56:EQUB 56:EQUB 56:EQUB 56 31640 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 31650 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 31660 EQUB 56:EQUB 56:EQUB 56:EQUB 56 31670 EQUB 32 31680 31690 31700 ; ********** WAVE 18 31710 EQUB 4 31720 EQUB 4 : EQUB 8 : EQUB 6 : EQUB 5 : EQUB 4 : EQUB 209 : EQUB 9 : EQUB 9 :EQUB 50 31730 EQUB 3 31740 EQUB 4 : EQUB 6 : EQUB 7 : EQUB 8 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 31750 EQUD &1FE14C8 : EQUD &1FE14C8 : EQUD 0 : EQUD 0 31760 EQUB 211 31770 EQUB 0 31780 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 31790 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 31800 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 31810 EQUB 56:EQUB 56 31820 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 31830 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 31840 EQUB 3:EQUB 3 31850 EQUB 24:EQUB 24:EQUB 24:EQUB 24 31860 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 31870 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 31880 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 31890 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 31900 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 31910 EQUB 3:EQUB 3:EQUB 3 31920 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 31930 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 31940 EQUB 56 31950 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 31960 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 31970 EQUB 24:EQUB 24:EQUB 24:EQUB 24 31980 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 31990 EQUB 7:EQUB 7:EQUB 7 32000 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32010 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32020 EQUB 3:EQUB 3:EQUB 3 32030 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 32040 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 32050 EQUB 24:EQUB 24:EQUB 24:EQUB 24 32060 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 32070 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32080 EQUB 32:EQUB 0 32090 32100 32110 ; ********** WAVE 19 32120 EQUB 4 32130 EQUB 4 : EQUB 8 : EQUB 6 : EQUB 4 : EQUB 4 : EQUB 125 : EQUB 4 : EQUB 4 : EQUB 50 32140 EQUB 3 32150 EQUB 0 : EQUB 0 : EQUB 2 : EQUB 3 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 32160 EQUD &1FE1451 : EQUD &1FE1485 : EQUD 0 : EQUD 64 32170 EQUB 127 32180 EQUB 0 32190 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 32200 EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63 32210 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 32220 EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59 32230 EQUB 3:EQUB 3:EQUB 3:EQUB 3 32240 EQUB 31:EQUB 31:EQUB 31:EQUB 31:EQUB 31:EQUB 31:EQUB 31 32250 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32260 EQUB 27:EQUB 27:EQUB 27:EQUB 27:EQUB 27:EQUB 27 32270 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32280 EQUB 32 32290 EQUB 0 32300 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 32310 EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59 32320 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 32330 EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63:EQUB 63 32340 EQUB 7:EQUB 7:EQUB 7:EQUB 7 32350 EQUB 27:EQUB 27:EQUB 27:EQUB 27:EQUB 27:EQUB 27:EQUB 27 32360 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32370 EQUB 31:EQUB 31:EQUB 31:EQUB 31:EQUB 31:EQUB 31 32380 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32390 EQUB 32:EQUB 0 32400 32410 32420 ; ********** WAVE 20 32430 EQUB 5 32440 EQUB 4 : EQUB 6 : EQUB 6 : EQUB 5 : EQUB 4 : EQUB 129 : EQUB 8 : EQUB 8 :EQUB 50 32450 EQUB 3 32460 EQUB 5 : EQUB 1 : EQUB 6 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 : EQUB 0 32470 EQUD &1FD8008 : EQUD &1FD8008 : EQUD 0 : EQUD 0 32480 EQUB 131 32490 EQUB 0 32500 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32510 EQUB 27:EQUB 27:EQUB 26 32520 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 32530 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 32540 EQUB 26:EQUB 27:EQUB 27:EQUB 24:EQUB 31:EQUB 31:EQUB 30 32550 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 32560 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 32570 EQUB 30:EQUB 31:EQUB 31:EQUB 24:EQUB 27:EQUB 27:EQUB 26 32580 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 32590 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 32600 EQUB 26:EQUB 27:EQUB 27:EQUB 24:EQUB 31:EQUB 31:EQUB 30 32610 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 32620 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 32630 EQUB 30:EQUB 31:EQUB 31:EQUB 24:EQUB 27:EQUB 27:EQUB 26 32640 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 32650 EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3:EQUB 3 32660 EQUB 32:EQUB 0 32670 32680 32690 ; ********** WAVE 21 32700 EQUB 6 32710 EQUB 4 : EQUB 12 : EQUB 6 : EQUB 6 : EQUB 5 : EQUB 157 : EQUB 9 : EQUB 9 : EQUB 50 32720 EQUB 8 32730 EQUB 0 : EQUB 2 : EQUB 3 : EQUB 4 : EQUB 5 : EQUB 6 : EQUB 7 : EQUB 8 : EQUB 9 32740 EQUD &1FE14C7 : EQUD &1FE14C7 : EQUD 0 : EQUD 0 32750 EQUB 159 32760 EQUB 0 32770 EQUB 56:EQUB 56 32780 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 32790 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 32800 EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59 32810 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32820 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32830 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32840 EQUB 2:EQUB 3:EQUB 3:EQUB 3 32850 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 32860 EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59 32870 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32880 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32890 EQUB 3:EQUB 3:EQUB 3:EQUB 3 32900 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 32910 EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56:EQUB 56 32920 EQUB 59:EQUB 59:EQUB 59:EQUB 59:EQUB 59 32930 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32940 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32950 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32960 EQUB 24:EQUB 24:EQUB 24:EQUB 24:EQUB 24 32970 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 32980 EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7:EQUB 7 32990 EQUB 7:EQUB 7 33000 EQUB 32:EQUB 0 33010 33020 ALIGN 33030 33040 33050 33060 .directive_sprites_data 33070 LDRB R3,[R2,R10] ; sprites number 33080 MOV R4,#96 ; offset for each sprite 33090 MUL R3,R4,R3 33100 ADR R2,sprites_data 33110 ADD R2,R2,R3 33120 MOV R15,R14 33130 33140 ; DATA stored here for PATTERNS and SHIPS 33150 33160 ; Srite Data 33170 .sprites_data 33180 EQUD &33333000:EQUD &00033333 33190 EQUD &20003330:EQUD &03330002 33200 EQUD &06660233:EQUD &33206660 33210 EQUD &06600233:EQUD &33200660 33220 EQUD &00002333:EQUD &33320000 33230 EQUD &32233330:EQUD &03333223 33240 EQUD &33223000:EQUD &00032233 33250 EQUD &33322300:EQUD &00322330 33260 EQUD &00332230:EQUD &03223300 33270 EQUD &00003223:EQUD &32230000 33280 EQUD &00003223:EQUD &32230000 33290 EQUD &00033330:EQUD &03333000 33300 33310 EQUD &00555000:EQUD &00055500 33320 EQUD &05515500:EQUD &00551550 33330 EQUD &55111550:EQUD &05511155 33340 EQUD &11333155:EQUD &55133311 33350 EQUD &33311550:EQUD &05511333 33360 EQUD &31115500:EQUD &00551113 33370 EQUD &55115500:EQUD &00551155 33380 EQUD &00551550:EQUD &05515500 33390 EQUD &00051155:EQUD &55115000 33400 EQUD &00051550:EQUD &05515000 33410 EQUD &00055500:EQUD &00555000 33420 EQUD &00005000:EQUD &00050000 33430 33440 EQUD &00444000:EQUD &00044400 33450 EQUD &04666440:EQUD &04466640 33460 EQUD &04677664:EQUD &46677640 33470 EQUD &46777664:EQUD &46677764 33480 EQUD &46666440:EQUD &04466664 33490 EQUD &22264000:EQUD &00046222 33500 EQUD &22264000:EQUD &00046222 33510 EQUD &46226440:EQUD &04462264 33520 EQUD &46222664:EQUD &46622264 33530 EQUD &04622664:EQUD &46622640 33540 EQUD &04666440:EQUD &04466640 33550 EQUD &00444000:EQUD &00044400 33560 33570 EQUD &00555555:EQUD &55555500 33580 EQUD &55111550:EQUD &05511155 33590 EQUD &17715000:EQUD &00051771 33600 EQUD &11150050:EQUD &05005111 33610 EQUD &55501500:EQUD &00510555 33620 EQUD &00051550:EQUD &05515000 33630 EQUD &00511115:EQUD &51111500 33640 EQUD &00555550:EQUD &05555500 33650 EQUD &00000015:EQUD &51000000 33660 EQUD &00000155:EQUD &55100000 33670 EQUD &00111550:EQUD &05511100 33680 EQUD &00555500:EQUD &00555500 33690 33700 EQUD &00000220:EQUD &02200000 33710 EQUD &02200032:EQUD &23000220 33720 EQUD &00222232:EQUD &23222200 33730 EQUD &00021120:EQUD &02112000 33740 EQUD &00021120:EQUD &02112000 33750 EQUD &02222200:EQUD &00222220 33760 EQUD &20000000:EQUD &00000002 33770 EQUD &00222000:EQUD &00022200 33780 EQUD &33333220:EQUD &02233333 33790 EQUD &22222222:EQUD &22222222 33800 EQUD &00000022:EQUD &22000000 33810 EQUD &00022220:EQUD &02222000 33820 33830 EQUD &06000600:EQUD &00600060 33840 EQUD &66606260:EQUD &06260666 33850 EQUD &66662226:EQUD &62226666 33860 EQUD &63662226:EQUD &62226636 33870 EQUD &33362664:EQUD &46626333 33880 EQUD &33666644:EQUD &44666633 33890 EQUD &66660046:EQUD &64006666 33900 EQUD &66000046:EQUD &64000066 33910 EQUD &00000460:EQUD &06400000 33920 EQUD &06644660:EQUD &06644660 33930 EQUD &06666600:EQUD &00666660 33940 EQUD &00660000:EQUD &00006600 33950 33960 EQUD &00111011:EQUD &11011100 33970 EQUD &01010100:EQUD &00101010 33980 EQUD &10101111:EQUD &11110101 33990 EQUD &11066661:EQUD &16666011 34000 EQUD &11666110:EQUD &01166611 34010 EQUD &00111011:EQUD &11011100 34020 EQUD &00050110:EQUD &01105000 34030 EQUD &05501101:EQUD &10110550 34040 EQUD &00111001:EQUD &10011100 34050 EQUD &00000110:EQUD &01100000 34060 EQUD &05111100:EQUD &00111150 34070 EQUD &00011000:EQUD &00011000 34080 34090 EQUD &00000020:EQUD &02000000 34100 EQUD &00002212:EQUD &21220000 34110 EQUD &00022112:EQUD &21122000 34120 EQUD &00221112:EQUD &21112200 34130 EQUD &00221120:EQUD &02112200 34140 EQUD &02221200:EQUD &00212220 34150 EQUD &22332220:EQUD &02223322 34160 EQUD &33333322:EQUD &22333333 34170 EQUD &22222220:EQUD &02222222 34180 EQUD &00002220:EQUD &02220000 34190 EQUD &00000220:EQUD &02200000 34200 EQUD &00022200:EQUD &00222000 34210 34220 EQUD &77716600:EQUD &00661777 34230 EQUD &77111660:EQUD &06611177 34240 EQUD &71111166:EQUD &66111117 34250 EQUD &77111046:EQUD &64011177 34260 EQUD &77100466:EQUD &66400177 34270 EQUD &00004666:EQUD &66640000 34280 EQUD &00446660:EQUD &06664400 34290 EQUD &00466600:EQUD &00666400 34300 EQUD &00446600:EQUD &00664400 34310 EQUD &00046600:EQUD &00664000 34320 EQUD &00046600:EQUD &00664000 34330 EQUD &00666000:EQUD &00066600 34340 34350 EQUD &00055550:EQUD &05555000 34360 EQUD &05511115:EQUD &51111550 34370 EQUD &51177715:EQUD &51777115 34380 EQUD &51777715:EQUD &51777715 34390 EQUD &51171115:EQUD &51117115 34400 EQUD &05111550:EQUD &05511150 34410 EQUD &00555005:EQUD &50055500 34420 EQUD &00000555:EQUD &55500000 34430 EQUD &00550515:EQUD &51505500 34440 EQUD &05115115:EQUD &51151150 34450 EQUD &00551550:EQUD &05115500 34460 EQUD &00005500:EQUD &00550000 34470 34480 34490 34500 34510 ; screen memory is saved here so they can be withered on & off 34520 34530 .memory 34540 34550 34560 ] 34570 34580 REM Two screens each &A000 (40K) are set aside 34590 P%=P%+&14000 34600 NEXT 34610 ENDPROC
� >GAMECODE � (C) Copyright � N.WESTLEY & C.WESTLEY (/ � Warning ! STARFIGHT must be RUN first 2 < �assemble F � gamecode P Z � d nH � **************************************************************** x � � �assemble � � CODE% &24000 � � PASS=0 � 2 � 2 � P%=CODE% � [ OPT PASS � .gamecode �? STMFD R13!,{R14} ; Save Return address to BASIC �H MOV R0,#200 : MOV R1,#3 ; ESCAPE disabled / BREAK clears memory � SWI "OS_Byte" �$ MOV R0,#9 ; � � SWI &100+22 � SWI "OS_WriteC" �$ SWI "OS_RemoveCursors" ; � & SWI &100+5 ; � 5 SWI &100+18 MOV R0,#3 " SWI "OS_WriteC" , MOV R0,#3 6 SWI "OS_WriteC" @5 BL change_palette ; initialise palette J B name_entered T ^ .game_start h BL print_wave r@ BL reset_var_addr ; address of start of variables |G BL init_wave_vars ; resets all variables to current wave �" BL load_newaddr : BL usership �5 BL prepare_wave ; delay before start � BL reset_var_addr �G MOV R0,#1 ; R0=1 � see program_variables routine � BL init_wave_vars �, B display ; PLAY GAME � �M ; ********************************************************************** � � � .getloc �< STMFD R13!,{R14} : BL directive_byte : LDMFD R13!,{R14} � ADD R10,R9,#9 > LDRB R1,[R2,R10] ; check if sprite is onscreen CMP R1,#0 : BNE onscreen ; MOV R1,#1 : STRB R1,[R2,R10] ; is now on screen & .onscreen 0 ADD R10,R9,#8 :2 LDRB R1,[R2,R10] ; pattern pointer D? STMFD R13!,{R14} : BL directive_pattern : LDMFD R13!,{R14} N4 LDRB R4,[R3,R1] ; pattern data byte X! CMP R4,#32 : BNE this_number b= ; offscreen - end of pattern for this sprite � branch l .offscreen v ADD R10,R9,#9 �' MOV R11,#2 ; dead � STRB R11,[R2,R10] �� STMFD R13!,{R14} : BL load_last_sprite : ADD R11,R11,#1 : BL store_last_sprite : LDMFD R13!,{R14} ; Check for end of pattern - for last sprite � .this_number �C �S R4,R4,#4 ; across, check sign of X co-ordinate �A BEQ xplus ; BIT 3 set if minus so no branch � � .xminus � LDRB R4,[R3,R1] � � R4,R4,#3 � ADD R4,R4,R4 � ADD R10,R9,#0 � LDR R0,[R2,R10] SUB R0,R0,R4 B yvalue .xplus LDRB R4,[R3,R1] * � R4,R4,#3 40 ADD R4,R4,R4 ; multiply by 2 > ADD R10,R9,#0 H LDR R0,[R2,R10] R ADD R0,R0,R4 \ .yvalue f' LDRB R5,[R3,R1] ; down p �S R5,R5,#32 z BEQ yplus � .yminus � LDRB R5,[R3,R1] � � R5,R5,#24 � MOV R5,R5,LSR #2 � MOV R6,#160 : MUL R7,R5,R6 � SUB R0,R0,R7 � ADD R10,R9,#0 �> STR R0,[R2,R10] ; location of screen address � B bomb_drop_check � .yplus � LDRB R5,[R3,R1] � � R5,R5,#24 �/ MOV R5,R5,LSR #2 ; divide by 4 MOV R6,#160 : MUL R7,R5,R6 ADD R0,R0,R7 ADD R10,R9,#0 $> STR R0,[R2,R10] ; location of screen address . 8 .bomb_drop_check BJ STMFD R13!,{R14,R1-R7} : BL random_generator : LDMFD R13!,{R14,R1-R7} L ADR R5,random_numbers VZ LDRB R6,bomb_drop_pos ; count for pattern positions to release bombs ` .b j LDRB R4,[R5],#1 t3 CMP R4,#0 : BEQ zero_pos ; start of pattern ~ CMP R1,R4 � BEQ new_bomb � .zero_pos � SUBS R6,R6,#1 � BNE b � B no_bomb � .new_bomb � LDRB R4,no_alien_bombs �A MOV R5,R4,LSL#3 ; 8 bytes for each bomb dropped �N ADD R4,R4,#1 ; increment the no. of alien bombs on screen � STRB R4,no_alien_bombs �: STMFD R13!,{R14} : BL directive_ab : LDMFD R13!,{R14} � ADD R4,R4,R5 .cyan A LDRB R5,cyan_counter : CMP R5,#0 : BEQ red ; no cyan bomb ) SUBS R5,R5,#1 : STRB R5,cyan_counter BNE red (1 LDRB R5,Ccyan_counter : STRB R5,cyan_counter 2! MOV R5,#12 : STRB R5,[R4,#4] < B got_colour F .red PC LDRB R5,red_counter : CMP R5,#0 : BEQ yellow ; no red bomb Z( SUBS R5,R5,#1 : STRB R5,red_counter d BNE yellow n/ LDRB R5,Cred_counter : STRB R5,red_counter x! MOV R5,#24 : STRB R5,[R4,#4] � B got_colour �( .yellow MOV R5,#0 : STRB R5,[R4,#4] � .got_colour �> LDRB R5,bombs_speed : SUBS R5,R5,#1 : STRB R5,bombs_speed � BNE slow_bomb �/ LDRB R5,Cbombs_speed : STRB R5,bombs_speed �! MOV R5,#2 : STRB R5,[R4,#5] � B fast_bomb � .slow_bomb �! MOV R5,#1 : STRB R5,[R4,#5] � .fast_bomb � � STMFD R13!,{R14,R0-R2} _ MOV R1,R0 : ADD R1,R1,#1920 : ADD R1,R1,#3 ; place bombs below centre of alien sprite K STR R1,[R4] ; stores address alien reached when dropping + BL print_bomb : LDMFD R13!,{R15,R0-R2} " .no_bomb , MOV R15,R14 6 .no_alien_bombs EQUB 0 @E .cyan_counter EQUB 4 ; cyan bomb dropped every so many J .Ccyan_counter EQUB 4 TD .red_counter EQUB 8 ; red bomb dropped every so many ^ .Cred_counter EQUB 8 hS .bombs_speed EQUB 10 ; 160= 1 line, 320= 2 lines on every 10'th bomb r .Cbombs_speed EQUB 10 |R .bomb_drop_pos EQUB 2 ; positions in which to drop bombs, set to two � ALIGN � � .directive_alien_bombs � LDRB R1,no_alien_bombs � MOV R15,R14 � – .random_generator ; generate random numbers in pattern loop each time character is moved, these are the positions the bombs are dropped. �M LDRB R5,no_random_numbers ; number of random numbers to generate � LDRB R7,no_range �7 ADR R6,random_numbers ; store for random numbers � .rgloop �3 MOV R1,#8 ; initialise bit count �3 MOV R3,#&80000000 ; msb set to 1 for TST .begin LDR R2,shiftreg TST R2,R3 &9 BEQ zerobit ; � msb =0 Branch to zerobit 0 LDR R4,constant :F �S R2,R2,R4 ; � bottom 3 bits of shiftreg with constant D .zerobit N9 MOVS R2,R2,LSL #1 ; Rotate shiftreg 1 bit left X2 STR R2,shiftreg ; store random number b2 SUBS R1,R1,#1 ; continue for 8 bits l BNE begin v8 MOV R2,R2,LSR #24 ; Shift HI BYTE to LOW BYTE � .check_range �8 CMP R2,R7 ; check random number range � BLE within_range �; SUB R2,R2,R7 ; random no. = random no. - 94 � B check_range � .within_range �/ STRB R2,[R6,R5] ; store random no. �' SUBS R5,R5,#1 ; � number � BNE rgloop � MOV R15,R14 � � .shiftreg EQUD � � .constant EQUD &0076B553 7 .random_numbers EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 .no_random_numbers EQUB 2 .no_range EQUB 94 ALIGN * 4 .display > ADD R8,R8,#1 H< STMFD R13!,{R14}:BL load_no_of_sprites:LDMFD R13!,{R14} R CMP R8,R10 : SUBEQ R8,R8,#1 \' MOV R9,#1 : STREQB R9,section_flag f MOV R12,#1 : MOV R9,#0 p .loop zH STMFD R13!,{R14,R0-R7} : BL change_palette : LDMFD R13!,{R14,R0-R7} � �i STMFD R13!,{R9,R8}: BL explosion_check : BL bomb_explo_check : BL cluster_check : LDMFD R13!,{R9,R8} �o LDRB R10,section_flag : CMP R10,#1 : BEQ blackout ; first set in pattern � CMP R8,R12 : BNE blackout �, LDRB R10,delay : CMP R10,#0 : BEQ over2 �$ SUB R10,R10,#1 : STRB R10,delay � MOV R12,#1 : MOV R9,#0 � CMP R8,R12 : BEQ print � B blackout � .over2 �$ LDRB R10,space : STRB R10,delay �D CMP R8,R12 : BEQ print ; check if last one in loop � .blackout < STMFD R13!,{R14} : BL directive_byte : LDMFD R13!,{R14} M ADD R10,R9,#9 : LDRB R11,[R2,R10] : CMP R11,#4 : BEQ over ; explosion $3 CMP R11,#2 : BEQ over ; dead / offscreen .$ ADD R10,R9,#0 : LDR R1,[R2,R10] 8 ADD R10,R9,#4 B BL draw L V� .print BL getloc ; before calculating new address the sprite is removed from screen in routine blackout `M ADD R10,R9,#9 : LDRB R11,[R2,R10] : CMP R11,#4 : BEQ over ; explosion j3 CMP R11,#2 : BEQ over ; dead / offscreen tT ADD R10,R9,#8 : ADD R1,R1,#1 : STRB R1,[R2,R10] ; increment pattern pointer ~E ADD R10,R9,#0 : LDR R1,[R2,R10] ; location of screen address � ADD R10,R9,#4 �D STMFD R13!,{R14,R0-R8} : BL move_stars : LDMFD R13!,{R14,R0-R8} � BL draw �] STMFD R13!,{R14} : BL load_dead : LDMFD R13!,{R14} : CMP R1,#1 : BLEQ usership_explosion �W STMFD R13!,{R14} : BL load_dead : LDMFD R13!,{R14} : CMP R1,#1 : BEQ usership_DEAD �> STMFD R13!,{R8,R9}: BL test_keypress : LDMFD R13!,{R8,R9} �H MOV R0,#129 : LDR R1,escape : MOV R2,#255 : SWI "OS_Byte" ; ESCAPE �% CMP R1,#255 : BLEQ self_destruct � BL usership_collision � .usership_DEAD �] BL load_no_of_bullets : CMP R2,#0 : STMFD R13!,{R8,R9} : BLNE inner : LDMFD R13!,{R8,R9} �N BL drop_bombs ; alien bombs are moved futher down the screen BL slow .over @ STMFD R13!,{R14} : BL load_no_of_sprites : LDMFD R13!,{R14} SUB R10,R10,#1 (> STMFD R13!,{R14} : BL load_last_sprite : LDMFD R13!,{R14} 2$ CMP R10,R11 : BEQ continue_play <B CMP R8,R12 : BEQ display ; no more sprites in this section F@ ADD R12,R12,#1 : ADD R9,R9,#12 : B loop ; next sprite P .space EQUB 7 Z .delay EQUB 7 d .section_flag EQUB 0 n ALIGN x � .test_keypress � STMFD R13!,{R14} � SWI "OS_Mouse" � CMP R2,#3 : BNE tkover � BL fire : BL right � .tkover � CMP R2,#6 : BNE tkover2 � BL fire : BL left � .tkover2 � CMP R2,#1 : BLEQ right � CMP R2,#4 : BLEQ left � CMP R2,#2 : BLEQ fire �= MOV R0,#129 : LDR R1,upkey : MOV R2,#255 : SWI "OS_Byte" CMP R1,#255 : BLEQ up ? MOV R0,#129 : LDR R1,downkey : MOV R2,#255 : SWI "OS_Byte" CMP R1,#255 : BLEQ down "@ MOV R0,#129 : LDR R1,pausekey : MOV R2,#255 : SWI "OS_Byte" ,C CMP R1,#255 : STMFD R13!,{R14} : BLEQ pause : LDMFD R13!,{R14} 6C STMFD R13!,{R14,R0-R12} : BLEQ pause : LDMFD R13!,{R14,R0-R12} @+ MOV R0,#15 : MOV R1,#0 : SWI "OS_Byte" J LDMFD R13!,{R15} T< .upkey EQUD &FFFFFFBE ; A - � value (-66) ^< .downkey EQUD &FFFFFF9E ; Z - � value (-98) h< .pausekey EQUD &FFFFFFC8 ; P - � value (-56) r? .escape EQUD &FFFFFF8F ; ESC - � value (-113) | � .draw �D STMFD R13!,{R14} : BL directive_sprites_data : LDMFD R13!,{R14} � MOV R3,#12 � .eight � MOV R4,#8 � .twelve � LDRB R5,[R2],#1 � LDRB R6,[R1,#1] � � R5,R5,R6 � STRB R5,[R1,#1]! � SUBS R4,R4,#1 � BNE twelve �3 ADD R1,R1,#152 ; 160 pixels across SUBS R3,R3,#1 BNE eight MOV R15,R14 & 0 .slow : MOV R5,#255 D .slow1 N MOV R6,#100 X .slow2 b SUBS R6,R6,#5 : BNE slow2 l SUBS R5,R5,#1 : BNE slow1 v MOV R15,R14 � � .initial_stars � ADR R1,stars_address � ADR R2,stars_speed � MOV R3,#43 � .next_star � LDR R5,[R1],#4 � LDRB R6,[R5] �! LDR R7,[R2],#4 : CMP R7,#160 � MOVGT R4,#&77 : MOVLE R4,#7 � � R6,R6,R4 � STRB R6,[R5] � SUBS R3,R3,#1 BNE next_star MOV R15,R14 .move_stars *< LDR R1,stars_delay : SUBS R1,R1,#1 : STR R1,stars_delay 43 MOVNE R15,R14 : MOV R1,#2 : STR R1,stars_delay > ADR R1,stars_address H ADR R2,stars_speed R MOV R3,#43 \ .next_move f LDR R5,[R1] p LDRB R6,[R5] z! LDR R7,[R2],#4 : CMP R7,#160 � MOVGT R4,#&77 : MOVLE R4,#7 � � R6,R6,R4 � STRB R6,[R5] � ADD R5,R5,R7 � LDR R8,first_addr � CMP R5,R8 � LDRGE R8,stars_down � SUBGE R5,R5,R8 � STR R5,[R1],#4 � LDRB R6,[R5] � � R6,R6,R4 � STRB R6,[R5] � SUBS R3,R3,#1 BNE next_move MOV R15,R14 $ .first_addr EQUD &1FE1FFF . .stars_down EQUD 40020 8 .stars_delay EQUD 2 B .stars_address Ll EQUD &1FDBDFE: EQUD &1FDFEB0: EQUD &1FDFF50: EQUD &1FDC829: EQUD &1FDAD3B: EQUD &1FDB121: EQUD &1FDB1C1 Vl EQUD &1FDCE6E: EQUD &1FDB932: EQUD &1FDB9D2: EQUD &1FE12D1: EQUD &1FE00A3: EQUD &1FE0143: EQUD &1FDCAC8 `{ EQUD &1FDBE60: EQUD &1FDBF00: EQUD &1FDE20E: EQUD &1FDDF76: EQUD &1FDE016: EQUD &1FDEAA1: EQUD &1FDEB41: EQUD &1FE1DAD jl EQUD &1FE075C: EQUD &1FE07FC: EQUD &1FE1A2F: EQUD &1FE1ACF: EQUD &1FE138E: EQUD &1FDE9C5: EQUD &1FDC313 tl EQUD &1FDB3D5: EQUD &1FDB475: EQUD &1FDEE16: EQUD &1FDEEB6: EQUD &1FDA94C: EQUD &1FE0552: EQUD &1FDD78C ~l EQUD &1FE00DE: EQUD &1FE0CC8: EQUD &1FE0D68: EQUD &1FE1008: EQUD &1FDDB7E: EQUD &1FDD5C6: EQUD &1FDD666 � � .stars_speed �� EQUD 160: EQUD 320: EQUD 320:EQUD 160: EQUD 160: EQUD 320: EQUD 320: EQUD 160: EQUD 480: EQUD 480: EQUD 160: EQUD 320: EQUD 320: EQUD 160 �� EQUD 480: EQUD 480: EQUD 160: EQUD 320: EQUD 320: EQUD 320: EQUD 320: EQUD 160: EQUD 480: EQUD 480: EQUD 320: EQUD 320: EQUD 160: EQUD 160: EQUD 160 �� EQUD 320: EQUD 320: EQUD 320: EQUD 320:EQUD 160: EQUD 160: EQUD 160: EQUD 160: EQUD 480: EQUD 480:EQUD 160: EQUD 160: EQUD 320: EQUD 320 � � � .drop_bombs �: STMFD R13!,{R14} : BL directive_ab : LDMFD R13!,{R14} � LDRB R5,no_alien_bombs � CMP R5,#0 : �Q R15,R14 � MOV R2,#1 LDR R6,screen_bottom q LDR R10,leftside : ADD R10,R10,#1600 ; move check point (leftside) to bottom level of usership � LDR R11,rightside : ADD R11,R11,#1760 ; move check point (rightside) to bottom level of usership plus 160 for a two line gap, as bombs drop by two pixels max. .next_bomb ( LDR R1,[R4] 2D STMFD R13!,{R14,R1-R6} : BL print_bomb : LDMFD R13!,{R14,R1-R6} <% LDRB R7,[R4,#5] ; bomb speed F5 CMP R7,#1 : ADDEQ R1,R1,#160 ; 1 line - slow P5 CMP R7,#2 : ADDEQ R1,R1,#320 ; 2 lines - fast Z( CMP R10,R1 : BGT check_screenbottom d CMP R11,R1 : BGT on_level n< .check_screenbottom ; below or on level with ship x CMP R6,R1 � BLE on_level � � .check_for_red � STMFD R13!,{R1-R6,R10,R11} �/ LDRB R2,[R4,#4] : CMP R2,#24 : BNE not_red �A SUB R10,R10,#8000 ; correct height for cluster explosion � SUB R11,R11,#8000 �" CMP R10,R1 : BGT wrong_height �" CMP R11,R1 : BLT wrong_height � �J LDRB R5,cluster_bombs : CMP R5,#2 : BEQ not_red ; enough red bombs �) ADD R5,R5,#1 : STRB R5,cluster_bombs �@ STMFD R13!,{R14} : BL initialise_cluster : LDMFD R13!,{R14} LDMFD R13!,{R1-R6,R10,R11} B one_less_bomb " , .wrong_height 6 .not_red @ LDMFD R13!,{R1-R6,R10,R11} J T B mbover ^ .on_level hi STMFD R13!,{R14,R1-R6} : LDRB R2,[R4,#4] : CMP R2,#12 : BLEQ bomb_explosion : LDMFD R13!,{R14,R1-R6} r .one_less_bomb |G STMFD R13!,{R14,R1-R6} : BL memmove_bombs : LDMFD R13!,{R14,R1-R6} � SUB R2,R2,#1:SUB R5,R5,#1 � B mbover2 � .mbover �D STMFD R13!,{R14,R1-R6} : BL print_bomb : LDMFD R13!,{R14,R1-R6} � STR R1,[R4],#8 � .mbover2 �- ADD R2,R2,#1 : CMP R2,R5 : BLE next_bomb � MOV R15,R14 �! .screen_bottom EQUD &1FE1AFF � � .print_bomb � LDRB R2,[R4,#4] � ADR R3,yellowbomb ADD R3,R3,R2 MOV R0,#0 MOV R2,#6 & .pbloop 0 MOV R5,#2 : .pbloop2 D LDRB R4,[R3],#1 N LDRB R6,[R1,#1] X CMP R6,#0 : BEQ Bskip b �S R4,R4,R6 l MOVNE R0,#1 v .Bskip � STRB R4,[R1,#1]! � SUBS R5,R5,#1 � BNE pbloop2 � ADD R1,R1,#158 � SUBS R2,R2,#1 � BNE pbloop � CMP R0,#0 : BEQ bomb_clear �I STMFD R13!,{R14,R1} : BL load_dead : MOV R2,R1 : LDMFD R13!,{R14,R1} � CMP R2,#1 : BEQ bomb_clear �B STMFD R13!,{R14,R1-R6} : BL bomb_hit : LDMFD R13!,{R14,R1-R6} � .bomb_clear � MOV R15,R14 �A .yellowbomb EQUD &03300330 : EQUD &03300330 : EQUD &03300330 A .cyanbomb EQUD &06600660 : EQUD &06600660 : EQUD &06600660 A .redbomb EQUD &01100110 : EQUD &01100110 : EQUD &01100110 .bomb_hit *@ STMFD R13!,{R14}:BL bomb_hit_coordinates : LDMFD R13!,{R14} 4 .BX_check > LDR R1,X_bullet H LDR R2,X_usership R LDRB R3,bullet_width \ LDRB R4,usership_width f CMP R1,R2 p BGT usership_left z ADD R1,R1,R3 � CMP R1,R2 � BLT no_collision � B BY_check � � .usership_left � ADD R2,R2,R4 � CMP R1,R2 � BGT no_collision � � .BY_check � LDR R1,Y_bullet � LDR R2,Y_usership � LDRB R3,bullet_height LDRB R4,usership_height CMP R1,R2 BLT usership_higher $ SUB R1,R1,R3 . CMP R1,R2 8 BGT no_collision B B B_clear L V .usership_higher ` SUB R2,R2,R4 j CMP R1,R2 t BLT no_collision ~ .B_clear � � MOV R0,#1 : STRB R0,dead �f MOV R0,#4:MOV R1,#15:RSB R1,R1,#0:MOV R2,#1:MOV R3,#25:SWI "Sound_Control" ; usership sound �c STMFD R13!,{R1-R8,R14} : BL initialise_particles : BL particle_spread : LDMFD R13!,{R1-R8,R14} � � .no_collision � � MOV R15,R14 � � .memmove_bombs � LDRB R1,no_alien_bombs � CMP R2,R1 : BEQ last_bomb ADD R2,R2,#1 .mbloop 5 LDR R3,[R4,#8]! ; 4 Byte Bombs Address STR R3,[R4,#-8] (N LDR R3,[R4,#4] ; 4 Byte Bomb Info - colour,timer,frame pointer 2 STR R3,[R4,#-4] < ADD R2,R2,#1 F CMP R2,R1 P BLE mbloop Z .last_bomb d SUB R1,R1,#1 n STRB R1,no_alien_bombs x MOV R15,R14 � � .bomb_explosion �6 SUB R1,R1,#964 ; on level with top of bullet � LDRB R2,no_bombs_explo �? ADR R3,bombs_exploaddr : ADD R3,R3,R2,LSL #3 : STR R1,[R3] �B MOV R5,#25 : STRB R5,[R3,#4] ; bombs explosion timer �@ MOV R5,#0 : STRB R5,[R3,#5] ; bombs frame pointer �) ADD R2,R2,#1 :STRB R2,no_bombs_explo � �< STMFD R13!,{R14} : BL explosion_bomb : LDMFD R13!,{R14} �l MOV R0,#3:MOV R1,#7:RSB R1,R1,#0:MOV R2,#1:MOV R3,#14:SWI "Sound_Control" ; white explosion sound � MOV R15,R14 � .program_variables _ ; all program variables are initialised here except byte and seperate alien_bomb_variables "( ; constant variables are set first , CMP R0,#1 6 MOV R1,#0 @ STRB R1,no_alien_bombs J STRB R1,section_flag T STRB R1,no_bombs_explo ^ STRB R1,cluster_bombs h STRNEB R1,no_of_bullets r STRNEB R1,gap | STRB R1,bullet_on_screen � STRB R1,memory_move � STRB R1,hit � STRB R1,last_sprite � STRB R1,dead � � ; variables set by user � STRB R2,cyan_counter � STRB R2,Ccyan_counter � STRB R3,red_counter � STRB R3,Cred_counter � STRB R4,bombs_speed � STRB R4,Cbombs_speed � STRB R5,bomb_drop_pos STRB R6,no_random_numbers STRB R7,no_range STRB R8,space & STRB R9,delay 0 STRB R10,no_of_sprites : D .renew_vars N+ LDRNE R1,Cleftside : STRNE R1,leftside X- LDRNE R1,Crightside : STRNE R1,rightside b< LDRNE R1,Cnewaddr : STRNE R1,newaddr : STRNE R1,oldaddr l7 LDRB R1,Cusership_frames : STRB R1,usership_frames v5 LDRB R1,Cusership_timer : STRB R1,usership_timer � � MOV R15,R14 � � .leftside EQUD &1FE1427 � .rightside EQUD &1FE14AF � .Cleftside EQUD &1FE1427 � .Crightside EQUD &1FE14AF � .Cnewaddr EQUD &1FE146B � .Cusership_frames EQUB 10 � .Cusership_timer EQUB 6 � ALIGN � � .bomb_explo_check : LDRB R7,no_bombs_explo : CMP R7,#0 : BEQ no_explosion M STMFD R13!,{R14} : BL directive_explosion : MOV R8,R2 : LDMFD R13!,{R14} ADR R3,bombs_exploaddr MOV R4,#0 * .bec_loop 4$ MOV R5,#0 : ADD R5,R3,R4,LSL #3 >G LDRB R6,[R5,#4] : SUBS R6,R6,#1 : STRB R6,[R5,#4] : BNE next_check HI MOV R6,#25 : STRB R6,[R5,#4] ; reset bomb timer for next frame R \/ LDRB R6,[R5,#5] ; frame pointer f4 MOV R2,#140 ; data in each frame p" MLA R2,R6,R2,R8 : LDR R1,[R5] zB STMFD R13!,{R14,R0-R6} : BL eb_frame : LDMFD R13!,{R14,R0-R6} � CMP R6,#3 : BNE next_explo �L STMFD R13!,{R14,R1-R4} : BL memmove_bombsexplo : LDMFD R13!,{R14,R1-R4} � SUB R4,R4,#1 � B next_check � .next_explo �3 ADD R6,R6,#1 : STRB R6,[R5,#5] ; next frame � MOV R2,#140 �" MLA R2,R6,R2,R8 : LDR R1,[R5] �B STMFD R13!,{R14,R0-R6} : BL eb_frame : LDMFD R13!,{R14,R0-R6} � � .next_check �, ADD R4,R4,#1 : CMP R4,R7 : BNE bec_loop � .no_explosion MOV R15,R14 .no_bombs_explo EQUB 0 $ ALIGN . .bombs_exploaddr 8J EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 BJ EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 LJ EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 VJ EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 `J EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 jJ EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 t ~ .memmove_bombsexplo � ; R7 = no_bombs_explo � MOV R2,#1 � CMP R2,R7 : BEQ last_explo � .mbeloop �5 LDR R4,[R3,#8]! ; 4 Byte Bombs Address � STR R4,[R3,#-8] �N LDR R4,[R3,#4] ; 4 Byte Bomb Info - colour,timer,frame pointer � STR R4,[R3,#-4] � ADD R2,R2,#1 � CMP R2,R7 � BLE mbeloop � .last_explo SUB R7,R7,#1 STRB R7,no_bombs_explo MOV R15,R14 ( .explosion_bomb 2" ; R1 - address of explosion <A STMFD R13!,{R14} : BL directive_explosion : LDMFD R13!,{R14} F .eb_frame P6 STMFD R13!,{R1} ; store explosion address Z MOV R0,#0 d MOV R3,#14 n .eb_eight x MOV R4,#10 � .eb_twelve � LDRB R5,[R2],#1 � CMP R5,#&03 : �Q R5,#&07 � CMP R5,#&33 : �Q R5,#&77 � LDRB R6,[R1,#1] �. CMP R5,#0 : �EQ R5,R5,R6 : BEQ eb_byte_ok � CMP R6,#0 : BEQ eb_byte_ok � �S R5,R5,R6 � MOVNE R0,#1 � .eb_byte_ok � STRB R5,[R1,#1]! � SUBS R4,R4,#1 � BNE eb_twelve 3 ADD R1,R1,#150 ; 160 pixels across SUBS R3,R3,#1 BNE eb_eight ": LDMFD R13!,{R1} ; restore explosion address , CMP R0,#1 : BNE explo_clear 6/ LDRB R2,dead : CMP R2,#1 : BEQ explo_clear @C STMFD R13!,{R14,R1-R6} : BL explo_hit : LDMFD R13!,{R14,R1-R6} J .explo_clear T MOV R15,R14 ^ h .explo_hit rG ; R1 - bomb address, reloaded from stack in previous routine |A STMFD R13!,{R14}:BL explo_hit_coordinates : LDMFD R13!,{R14} � � .EX_check � LDR R1,X_explosion � LDR R2,X_usership � LDRB R3,explosion_width � LDRB R4,usership_width � CMP R1,R2 � BGT explosion_left � ADD R1,R1,R3 � CMP R1,R2 � BLT no_explo � B EY_check � .explosion_left ADD R2,R2,R4 CMP R1,R2 & BGT no_explo 0 : .EY_check D LDR R1,Y_explosion N LDR R2,Y_usership X LDRB R3,explosion_height b LDRB R4,usership_height l CMP R1,R2 v BLT explosion_higher � SUB R1,R1,R3 � CMP R1,R2 � BGT no_explo � B E_clear � � .explosion_higher � SUB R2,R2,R4 � CMP R1,R2 � BLT no_explo � .E_clear � � MOV R0,#1 : STRB R0,dead �f MOV R0,#4:MOV R1,#15:RSB R1,R1,#0:MOV R2,#1:MOV R3,#25:SWI "Sound_Control" ; usership sound c STMFD R13!,{R1-R8,R14} : BL initialise_particles : BL particle_spread : LDMFD R13!,{R1-R8,R14} .no_explo * 4 MOV R15,R14 > H .initialise_cluster R) ; R1 - start address of cluster bomb \D STMFD R13!,{R14,R1-R6} : BL print_bomb : LDMFD R13!,{R14,R1-R6} f ADD R1,R1,#1 p ADR R2,cluster_addr z) LDRB R3,cluster_bombs : SUB R3,R3,#1 �! MOV R5,#48 : MLA R2,R3,R5,R2 � MOV R3,#6 � MOV R5,#1 � .icloop � MOV R4,#2 � .icloop2 � STR R1,[R2],#4 � ADD R1,R1,#1 � SUBS R4,R4,#1 � BNE icloop2 � ADD R1,R1,#158 � SUBS R3,R3,#1 � BNE icloop ADR R2,cluster_frames ) LDRB R3,cluster_bombs : SUB R3,R3,#1 MOV R5,#4 : MLA R2,R3,R5,R2 $: MOV R5,#&0A00 : STR R5,[R2] ; reset delay and frames . MOV R15,R14 8 B .cluster_spread L ; R1 cluster addresses V ; R2 cluster paths ` BNV end j ADR R3,redbomb t/ MOV R4,#12 ; no of pixels in cluster ~ .csloop �9 LDR R8,[R2],#4 ; data for a single pixel path �' CMP R8,#&B : BNE check_cluster_end �G STMFD R13!,{R14,R1-R8} : BL cluster_blast : LDMFD R13!,{R14,R1-R8} � ADD R3,R3,#1 : ADD R1,R1,#4 � B last_cframe � .check_cluster_end �C CMP R8,#&E : ADDEQ R3,R3,#1 :ADDEQ R1,R1,#4 : BEQ last_cframe �) LDRB R5,[R3],#1 ; colour = red �/ LDR R6,[R1] ; address held in R1 �5 LDRB R7,[R6] ; contents of screen in R7 �- � R7,R7,R5 ; colour pixel black �6 STRB R7,[R6] ; blank out pixel on screen ? ADD R6,R6,R8 ; add offset path to current address . STR R6,[R1],#4 ; store new address CMP R8,#0 : BEQ last_cframe 5 LDRB R7,[R6] ; contents of screen in R7 (0 � R7,R7,R5 ; obtain correct colour 28 STRB R7,[R6] ; store colour byte to screen < .last_cframe F$ SUBS R4,R4,#1 ; � pixel P BNE csloop Z MOV R15,R14 d n .cluster_check x8 LDRB R4,cluster_bombs : CMP R4,#0 : BEQ no_clusters � MOV R7,#0 � .next_cluster � ADR R3,cluster_frames � MOV R5,#4 : MLA R3,R7,R5,R3 �J LDRB R5,[R3,#1] : SUBS R5,R5,#1 : STRB R5,[R3,#1] : BNE next2_cluster �0 MOV R5,#10 : STRB R5,[R3,#1] ; delay �> STMFD R13!,{R14} : BL directive_clpaths :LDMFD R13!,{R14} � ADR R1,cluster_addr �P MOV R5,#48 : MLA R1,R7,R5,R1 ; 48 bytes each set of 12 cluster addresses �G LDRB R5,[R3] : MOV R6,#48 : MLA R2,R5,R6,R2 ; 48 bytes each frame �! CMP R5,#26 : BEQ End_cluster � ADD R5,R5,#1 : STRB R5,[R3] � H STMFD R13!,{R14,R1-R8} : BL cluster_spread : LDMFD R13!,{R14,R1-R8} B next2_cluster .End_cluster " MOV R5,#0 : STRB R5,[R3] ,B LDRB R5,cluster_bombs : SUBS R5,R5,#1 : STRB R5,cluster_bombs 6 BEQ no_clusters @ SUB R4,R4,#1:SUB R7,R7,#1 JI STMFD R13!,{R14,R1-R8} : BL cluster_memmove : LDMFD R13!,{R14,R1-R8} T .next2_cluster ^0 ADD R7,R7,#1 : CMP R7,R4 : BNE next_cluster h .no_clusters r MOV R15,R14 | � .cluster_memmove � ADR R1,cluster_frames �! LDR R2,[R1,#4] : STR R2,[R1] �( ADR R1,cluster_addr : ADD R1,R1,#48 � MOV R2,#12 � .cmloop � LDR R3,[R1],#4 � STR R3,[R1,#-52] � SUBS R2,R2,#1 � BNE cmloop � � MOV R15,R14 � .cluster_bombs EQUB 0 ALIGN # .cluster_frames EQUD &00000A00 &# EQUD &00000A00 0 .cluster_addr :0 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 D0 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 N X0 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 b0 EQUD 0:EQUD 0 :EQUD 0:EQUD 0 :EQUD 0:EQUD 0 l v .cluster_blast � MOV R0,#0 �@ ; R1 - holds address where cluster data addresses are held �; LDR R2,[R1] ; address of seperate pixel in cluster � ADR R3,data_blast � MOV R4,#5 � .dbloop � MOV R5,#4 � .dbloop2 �1 LDRB R6,[R2] ; contents of screen �% LDRB R7,[R3],#1 ; colour �+ CMP R7,#0 : �EQ R7,R6,R7 : BEQ cb_skip � CMP R6,#0 : BEQ cb_skip � �S R7,R6,R7 ! MOVNE R0,#1 ! .cb_skip ! STRB R7,[R2],#1 ! SUBS R5,R5,#1 !* BNE dbloop2 !4 ADD R2,R2,#156 !> SUBS R4,R4,#1 !H BNE dbloop !R" CMP R0,#0 : BEQ cluster_clear !\1 LDRB R2,dead : CMP R2,#1 : BEQ cluster_clear !fS STMFD R13!,{R14,R1-R6} : LDR R1,[R1] : BL cluster_hit : LDMFD R13!,{R14,R1-R6} !p .cluster_clear !zf MOV R0,#2 :MOV R1,#10:RSB R1,R1,#0:MOV R2,#10:MOV R3,#10:SWI "Sound_Control" ; cluster sound !� MOV R15,R14 !� !� .data_blast !� EQUD &00113110 !� EQUD &11377331 !� EQUD &13773311 !� EQUD &01333110 !� EQUD &00111100 !� !� .cluster_hit !�( ; R1 - a seperate blast address !�C STMFD R13!,{R14}:BL cluster_hit_coordinates : LDMFD R13!,{R14} !� " .CLX_check " LDR R1,X_blast " LDR R2,X_usership "$ LDRB R3,blast_width ". LDRB R4,usership_width "8 CMP R1,R2 "B BGT blast_left "L ADD R1,R1,R3 "V CMP R1,R2 "` BLT no_blast "j B CLY_check "t "~ .blast_left "� ADD R2,R2,R4 "� CMP R1,R2 "� BGT no_blast "� "� .CLY_check "� LDR R1,Y_blast "� LDR R2,Y_usership "� LDRB R3,blast_height "� LDRB R4,usership_height "� CMP R1,R2 "� BLT blast_higher "� SUB R1,R1,R3 # CMP R1,R2 # BGT no_blast # B CL_clear # #( .blast_higher #2 SUB R2,R2,R4 #< CMP R1,R2 #F BLT no_blast #P .CL_clear #Z #d MOV R0,#1 : STRB R0,dead #nf MOV R0,#4:MOV R1,#15:RSB R1,R1,#0:MOV R2,#1:MOV R3,#25:SWI "Sound_Control" ; usership sound #xc STMFD R13!,{R1-R8,R14} : BL initialise_particles : BL particle_spread : LDMFD R13!,{R1-R8,R14} #� #� .no_blast #� #� #� MOV R15,R14 #� #� #� .explosion_check #� LDRB R1,no_of_sprites #�< STMFD R13!,{R14} : BL directive_byte : LDMFD R13!,{R14} #� .ecloop #�7 LDRB R3,[R2,#9] ; explosion flag #�5 CMP R3,#4 : BNE ecover ; no explosion $8 LDRB R3,[R2,#10] ; explosion timer $ SUB R3,R3,#1 $ STRB R3,[R2,#10] $"K CMP R3,#0 : BNE ecover ; explosion still onscreen so branch $, .explosion_finishes $6 $@* LDRB R3,[R2,#11] ; frame pointer $Jq STMFD R13!,{R14,R2} : BL directive_explosion : MOV R4,R2 :LDMFD R13!,{R14,R2} ; start of explosion data $Tm STMFD R13!,{R1-R7,R14} : LDR R1,[R2] : MOV R2,#140 : MLA R2,R3,R2,R4 : BL frame : LDMFD R13!,{R1-R7,R14} $^ $h: CMP R3,#5 : BEQ frame_finish ; end of explosion $r8 MOV R11,#15: STRB R11,[R2,#10] ; explosion time $|7 ADD R3,R3,#1 :STRB R3,[R2,#11] ; frame pointer $�m STMFD R13!,{R1-R7,R14} : LDR R1,[R2] : MOV R2,#140 : MLA R2,R3,R2,R4 : BL frame : LDMFD R13!,{R1-R7,R14} $� B ecover $�B .frame_finish ; explosion animation ends $�. MOV R3,#2 : STRB R3,[R2,#9] ; dead $� .ecover $� ADD R2,R2,#12 $� SUB R1,R1,#1 $� CMP R1,#1:BNE ecloop $� MOV R15,R14 $� $� .fire $�A LDRB R1,gap : CMP R1,#0: BNE floop ; check spacing $� MOV R1,#41 : STRB R1,gap %e MOV R0,#1 :MOV R1,#7:RSB R1,R1,#0:MOV R2,#1:MOV R3,#7 :SWI "Sound_Control" ; bullet sound %@ LDRB R1,no_of_bullets : ADD R1,R1,#1 :STRB R1,no_of_bullets % STRB R1,bullet_on_screen %&L SUB R1,R1,#1 : MOV R2,R1, LSL #2 : ADR R3,bullet_address : ADD R3,R3,R2 %0 BNV end:BNV end %:I LDR R1,newaddr:SUB R1,R1,#800 : ADD R1,R1,#3 ; calculate address %D STR R1,[R3] %N .inner %X( LDRB R1,gap : CMP R1,#0 : BEQ fover %b .floop %l- LDRB R1,gap : SUB R1,R1,#1 : STRB R1,gap %v .fover %� LDRB R8,no_of_bullets %�� CMP R8,#0 : BEQ nothing_to_print ; no_bullets, safety for gap at start of fire routine, incase of a brach to floop when gap>0 � bullets=0 %� MOV R9,#0 %� .floop2 %� MOV R4,R9, LSL#2 %� ADR R5,bullet_address %� ADD R10,R5,R4 %� LDR R7,[R10] %� STMFD R13!,{R14} %� LDRB R1,bullet_on_screen %�/ SUB R5,R8,#1 : CMP R5,R9 : BNE new_bullet2 %�# SUBS R1,R1,R8 : BEQ new_bullet %� BL print_bullet & .new_bullet &) MOV R1,#0 : STRB R1,bullet_on_screen & B new_bullet3 & .new_bullet2 &* BL print_bullet &4 .new_bullet3 &>" SUB R7,R7,#160 : STR R7,[R10] &H8 LDR R1,top_of_screen : CMP R7,R1: BLPL print_bullet &R BPL top &\$ MOV R1,#1 : STRB R1,memory_move &f .top &p� LDRB R1,memory_move : CMP R1,#1 : �Q R1,#0 : STREQB R1,hit ; prevents memory_move repeat as top_of_screen is set and also hit. &z+ LDRB R1,hit : CMP R1,#1 : BLEQ explode &� LDMFD R13!,{R14} &�* ADD R9,R9,#1 : CMP R9,R8 : BNE floop2 &�] LDRB R1,memory_move : CMP R1,#1 : STMFD R13!,{R14} : BLEQ move_memory : LDMFD R13!,{R14} &� .nothing_to_print &� MOV R15,R14 &� &� .print_bullet &ʚ ; plots to opposite side of each byte to centre bullet above ship .... as centre of ship splits two bytes &� MOV R0,#1 ; a hit &� MOV R1,R7 &� MOV R3,#6 &� ADR R6,bulletdata &� .bloop ' MOV R4,#2 ' .bloop2 ' LDRB R2,[R6],#1 '$ LDRB R5,[R1,#1] '. CMP R5,#0 : BEQ skip '8 � R2,R2,R5 'B CMP R5,#&07 : BEQ skip 'L CMP R5,#&70 : BEQ skip 'V CMP R5,#&77 : BEQ skip '` CMP R2,#0 'j STRNEB R0,hit 't .skip '~ STRB R2,[R1,#1]! '� SUBS R4,R4,#1 '� BNE bloop2 '� ADD R1,R1,#158 '� SUBS R3,R3,#1 '� BNE bloop '� MOV R15,R14 '� '� .move_memory '� LDRB R1,no_of_bullets '� CMP R1,#1 : BEQ no_more '� MOV R2,R1 '� ADR R3,bullet_address ( .mmloop ( LDR R4,[R3,#4]! ( STR R4,[R3,#-4] ( SUB R2,R2,#1 (( CMP R2,#1 (2 BNE mmloop (< .no_more (F SUB R1,R1,#1 (P STRB R1,no_of_bullets (Z MOV R1,#0 (d STRB R1,memory_move (n MOV R15,R14 (x (� .explode (�2 LDRB R1,no_of_bullets : CMP R1,#0 : BEQ eloop (�b ; don't reprint bullet as reached top of screen so address is out of bounds (�' STMFD R13!,{R14} : BL print_bullet (�S MOV R1,#0 : STRB R1,hit ; first before print_bullet due to hitflag (�) SUB R1,R8,#1 : STRB R1,no_of_bullets (� CMP R1,#0 : STREQB R1,gap (ȃ CMP R1,R9 : BEQ eloop ; checks for last bullet in round fired, so when returning from routine R9 is added to equal R8. (� MOV R8,R1 (� (� ADD R2,R1,#1 (� ADD R1,R9,#1 (� ADR R3,bullet_address ) MOV R4,R9, LSL #2 )D ADD R3,R3,R4 ; bullet numbers address to start ) .eeloop )" LDR R4,[R3,#4]! ), STR R4,[R3,#-4] )6 SUB R2,R2,#1 )@ CMP R2,R1 )J BNE eeloop )T )^ .eloop )h: LDRB R1,bullet_on_screen : CMP R1,#0 : SUBNE R1,R1,#1 )r\ STRB R1,bullet_on_screen ; a new on screen at same time as collision of other bullets )| )� .remove_sprite )�+ ; get X and Y co-ordinates of bullet )�) MOV R1,R7 ; bullet address )� ADR R2,X_bullet )� ADR R3,Y_bullet )� BL get_coordinates )� )� SUB R7,R7,#160 ; subtract 160 from bullet_addres ..... may have reached top of screen - therefore out of bounds area )� LDRB R1,no_of_sprites )�< STMFD R13!,{R14} : BL directive_byte : LDMFD R13!,{R14} )� MOV R3,#1 )� .rloop )� LDRB R4,[R2,#9] *G CMP R4,#1 : BNE rover ; 0 value - offscreen / 2 value - dead * * STMFD R13!,{R1-R4} *&5 MOV R0,#1 ; A Survivor, for now! *08 LDR R1,[R2,#0] ; current sprites address *: ADR R2,X_sprite *D ADR R3,Y_sprite *N BL get_coordinates *X .X_check *b LDR R1,X_bullet *l LDR R2,X_sprite *v LDRB R3,bullet_width *� LDRB R4,sprite_width *� CMP R1,R2 *� BGT sprite_left *� ADD R1,R1,R3 *� CMP R1,R2 *� BLT not_this_sprite *� B Y_check *� *� .sprite_left *� ADD R2,R2,R4 *� CMP R1,R2 *� BGT not_this_sprite *� + .Y_check + LDR R1,Y_bullet + LDR R2,Y_sprite + LDRB R3,bullet_height +* LDRB R4,sprite_height +4 CMP R1,R2 +> BLT sprite_higher +H SUB R1,R1,R3 +R CMP R1,R2 +\ BGT not_this_sprite +f B clear +p +z .sprite_higher +� SUB R2,R2,R4 +� CMP R1,R2 +� BLT not_this_sprite +� .clear +� +� MOV R0,#0 +� +� .not_this_sprite +� LDMFD R13!,{R1-R4} +� CMP R0,#0 : BNE rover +�Q STMFD R13!,{R1-R4} : MOV R10,#4 : LDR R1,[R2] : BL draw : LDMFD R13!,{R1-R4} +�3 MOV R11,#4 : STRB R11,[R2,#9] ; explosion +�8 MOV R11,#15: STRB R11,[R2,#10] ; explosion time ,N MOV R11,#0 : STRB R11,[R2,#11] ; frame pointer ( 48 bytes each frame) , LDRB R11,last_sprite : ADD R11,R11,#1 : STRB R11,last_sprite ; Check for end of pattern - for last sprite ,^ STMFD R13!,{R0-R7} : LDR R1,[R2] : BL explosion : BL increase_score : LDMFD R13!,{R0-R7} ,$n MOV R0,#3:MOV R1,#10:RSB R1,R1,#0:MOV R2,#1:MOV R3,#10:SWI "Sound_Control" ; yellow explosion sound ,.1 LDMFD R13!,{R15} ; one hit one alien ship ,8 .rover ,B ADD R2,R2,#12:ADD R3,R3,#1 ,L CMP R3,R1 : BNE rloop ,V LDMFD R13!,{R15} ,` ,j .cluster_hit_coordinates ,t ADR R2,X_blast ,~ ADR R3,Y_blast ,�9 STMFD R13!,{R14}:BL get_coordinates:LDMFD R13!,{R14} ,� LDR R1,newaddr ,� ADR R2,X_usership ,� ADR R3,Y_usership ,�9 STMFD R13!,{R14}:BL get_coordinates:LDMFD R13!,{R14} ,� MOV R15,R14 ,� ,� .explo_hit_coordinates ,� ADR R2,X_explosion ,� ADR R3,Y_explosion ,�9 STMFD R13!,{R14}:BL get_coordinates:LDMFD R13!,{R14} ,� LDR R1,newaddr - ADR R2,X_usership - ADR R3,Y_usership -9 STMFD R13!,{R14}:BL get_coordinates:LDMFD R13!,{R14} - MOV R15,R14 -( -2 .bomb_hit_coordinates -< ADR R2,X_bullet -F ADR R3,Y_bullet -P9 STMFD R13!,{R14}:BL get_coordinates:LDMFD R13!,{R14} -Z LDR R1,newaddr -d ADR R2,X_usership -n ADR R3,Y_usership -x9 STMFD R13!,{R14}:BL get_coordinates:LDMFD R13!,{R14} -� MOV R15,R14 -� -� .get_coordinates -�G ; R1 - address on screen R2 - X offset addr R3 - Y offset addr -� LDR R4,address -�A SUB R4,R1,R4 ; screen address - start of screen -�( MOV R5,#160 ; divisor -�5 MOV R6,#1<<31 ; counter for each bit -�* MOV R10,#0 ; remainder -�) MOV R11,#0 ; quotient -� .division_loop -� MOVS R4,R4,ASL#1 -� ADC R10,R10,R10 . CMP R10,R5 .* SUBGE R10,R10,R5 ; remainder .( �RGE R11,R11,R6 ; quotient ." MOVS R6,R6,LSR#1 ., BNE division_loop .6% MOV R10,R10,LSL#3 : STR R10,[R2] .@ STR R10,[R2,#0] .J RSB R11,R11,#255 .T% MOV R11,R11,LSL#2 : STR R11,[R3] .^ MOV R15,R14 .h .r .store_no_of_bullets .| MOV R2,#0 .� STRB R2,no_of_bullets .� MOV R15,R14 .� .� .load_no_of_bullets .� LDRB R2,no_of_bullets .� MOV R15,R14 .� .� .load_dead .� LDRB R1,dead .� MOV R15,R14 .� .�A .bulletdata EQUD &07700770 : EQUD &07700770 : EQUD &07700770 .�! .top_of_screen EQUD &1FDA800 / .bullet_address EQUD 0 / EQUD 0 / EQUD 0 /& EQUD 0 /0 EQUD 0 /: .no_of_bullets EQUB 0 /D .gap EQUB 0 /N .bullet_on_screen EQUB 0 /X .memory_move EQUB 0 /b .hit EQUB 0 /l .dead EQUB 0 /v ALIGN /� /�= ; memory locations for sprite collision identification /� .address EQUD &1FD8000 /� .X_bullet EQUD 0 /� .Y_bullet EQUD 0 /� .X_sprite EQUD 0 /� .Y_sprite EQUD 0 /� .X_usership EQUD 0 /� .Y_usership EQUD 0 /� .X_explosion EQUD 0 /� .Y_explosion EQUD 0 /� .X_blast EQUD 0 /� .Y_blast EQUD 0 09 .bullet_width EQUB 16 ; constant values 0 .bullet_height EQUB 24 0 .sprite_width EQUB 64 0 .sprite_height EQUB 48 0* .usership_width EQUB 64 04 .usership_height EQUB 64 0> .explosion_width EQUB 80 0H .explosion_height EQUB 56 0R .blast_width EQUB 32 0\ .blast_height EQUB 16 0f ALIGN 0p 0z .left 0�> LDR R1,leftside : LDR R2,oldaddr : CMP R1,R2 : �Q R15,R14 0�4 STMFD R13!,{R14} : LDR R1,oldaddr : BL usership 0�e LDR R1,newaddr : SUB R1,R1,#1 : STR R1,newaddr : STR R1,oldaddr : BL usership : LDMFD R13!,{R15} 0� 0� .right 0�? LDR R1,rightside : LDR R2,oldaddr : CMP R1,R2 : �Q R15,R14 0�4 STMFD R13!,{R14} : LDR R1,oldaddr : BL usership 0�e LDR R1,newaddr : ADD R1,R1,#1 : STR R1,newaddr : STR R1,oldaddr : BL usership : LDMFD R13!,{R15} 0� 0� .up 0�W LDR R1,top_of_screen : ADD R1,R1,#160 : LDR R2,oldaddr : CMP R1,R2 : MOVGT R15,R14 0�9 LDR R1,rightside : SUB R1,R1,#160 : STR R1,rightside 0�8 LDR R1,leftside : SUB R1,R1,#160 : STR R1,leftside 14 STMFD R13!,{R14} : LDR R1,oldaddr : BL usership 1g LDR R1,newaddr : SUB R1,R1,#160 : STR R1,newaddr : STR R1,oldaddr : BL usership : LDMFD R13!,{R15} 1 1$ .down 1.X LDR R1,screen_bottom : SUB R1,R1,#1760 : LDR R2,oldaddr : CMP R1,R2 : MOVLT R15,R14 189 LDR R1,rightside : ADD R1,R1,#160 : STR R1,rightside 1B8 LDR R1,leftside : ADD R1,R1,#160 : STR R1,leftside 1L4 STMFD R13!,{R14} : LDR R1,oldaddr : BL usership 1Vg LDR R1,newaddr : ADD R1,R1,#160 : STR R1,newaddr : STR R1,oldaddr : BL usership : LDMFD R13!,{R15} 1` 1j .usership 1t ADR R2,shipsdata 1~( MOV R3,#16 ; height 1� .ueight 1� MOV R4,#8 1� .utwelve 1� LDRB R5,[R2],#1 1� LDRB R6,[R1,#1] 1� � R5,R5,R6 1� STRB R5,[R1,#1]! 1� SUBS R4,R4,#1 1� BNE utwelve 1�3 ADD R1,R1,#152 ; 160 pixels across 1� SUBS R3,R3,#1 1� BNE ueight 2 MOV R15,R14 2 2 .usership_collision 2* LDRB R1,dead : CMP R1,#1 : �Q R15,R14 2( LDR R1,newaddr 22 ADR R2,shipsdata 2< MOV R3,#16 2F .uceight 2P MOV R4,#8 2Z .uctwelve 2d LDRB R5,[R2],#1 2n LDRB R6,[R1,#1]! 2xL CMP R5,#0 : BEQ UCskip ; no collision on black around ship 2� �S R5,R5,R6 2� BNE collision 2� .UCskip 2� SUBS R4,R4,#1 2� BNE uctwelve 2� ADD R1,R1,#152 2� SUBS R3,R3,#1 2� BNE uceight 2� B check_ok 2� .collision 2�= STMFD R13!,{R14} : BL check_collision : LDMFD R13!,{R14} 2� .check_ok 2� MOV R15,R14 3 3 .check_collision 3 3" LDR R1,newaddr 3, ADR R2,X_usership 36 ADR R3,Y_usership 3@9 STMFD R13!,{R14}:BL get_coordinates:LDMFD R13!,{R14} 3J 3T LDRB R1,no_of_sprites 3^< STMFD R13!,{R14} : BL directive_byte : LDMFD R13!,{R14} 3h MOV R3,#1 3r .ccloop 3| LDRB R4,[R2,#9] 3�H CMP R4,#1 : BNE ccover ; 0 value - offscreen / 2 value - dead 3� 3� STMFD R13!,{R1-R4,R14} 3� MOV R0,#1 3� LDR R1,[R2,#0] 3� ADR R2,X_sprite 3� ADR R3,Y_sprite 3� BL get_coordinates 3� .X_col_check 3� LDR R1,X_usership 3� LDR R2,X_sprite 3� LDRB R3,usership_width 3� LDRB R4,sprite_width 4 CMP R1,R2 4 BGT usership_right 4 ADD R1,R1,R3 4& CMP R1,R2 40 BLT no_col 4: B Y_col_check 4D 4N .usership_right 4X ADD R2,R2,R4 4b CMP R1,R2 4l BGT no_col 4v 4� .Y_col_check 4� LDR R1,Y_usership 4� LDR R2,Y_sprite 4� LDRB R3,usership_height 4� LDRB R4,sprite_height 4� CMP R1,R2 4� BLT usership_lower 4� SUB R1,R1,R3 4� CMP R1,R2 4� BGT no_col 4� B uc_clear 4� 4� .usership_lower 5 SUB R2,R2,R4 5 CMP R1,R2 5 BLT no_col 5 .uc_clear 5* 54 MOV R0,#0 5> 5H .no_col 5R LDMFD R13!,{R1-R4,R14} 5\ CMP R0,#0 : BNE ccover 5f 5pY STMFD R13!,{R1-R4,R14} : MOV R10,#4 : LDR R1,[R2] : BL draw : LDMFD R13!,{R1-R4,R14} 5z3 MOV R11,#4 : STRB R11,[R2,#9] ; explosion 5�8 MOV R11,#15: STRB R11,[R2,#10] ; explosion time 5�N MOV R11,#0 : STRB R11,[R2,#11] ; frame pointer ( 48 bytes each frame) 5� LDRB R11,last_sprite : ADD R11,R11,#1 : STRB R11,last_sprite ; Check for end of pattern - for last sprite 5�� STMFD R13!,{R0-R8,R14} : LDR R1,[R2] : BL explosion : BL increase_score : BL initialise_particles : BL particle_spread : LDMFD R13!,{R0-R8,R14} 5� MOV R0,#1 : STRB R0,dead 5�f MOV R0,#4:MOV R1,#15:RSB R1,R1,#0:MOV R2,#1:MOV R3,#25:SWI "Sound_Control" ; usership sound 5�M MOV R15,R14 ; usership is dead so additional collisions impossible 5� .ccover 5� ADD R2,R2,#12:ADD R3,R3,#1 5� CMP R3,R1 : BNE ccloop 5� 5� MOV R15,R14 5� 6 .load_last_sprite 6 LDRB R11,last_sprite 6 MOV R15,R14 6$ 6. .store_last_sprite 68 STRB R11,last_sprite 6B MOV R15,R14 6L 6V .load_no_of_sprites 6` LDRB R10,no_of_sprites 6j MOV R15,R14 6t 6~ 6�M .no_of_sprites EQUB 50 ; total sprites in pattern = no_of_sprites - 1 6� .last_sprite EQUB 0 6�C .usership_frames EQUB 10 ; no of frames in explosion 6�B .usership_timer EQUB 6 ; time between each frame 6� ALIGN 6� 6� .newaddr EQUD &1FE146B 6� .oldaddr EQUD &1FE146B 6� 6� .load_newaddr 6� LDR R1,newaddr 6� MOV R15,R14 7 7 .directive_shipsdata 7 ADR R3,shipsdata 7 MOV R15,R14 7( 72 ; Ships Data 7< .shipsdata 7F" EQUD &00030000:EQUD &00003000 7P" EQUD &00030000:EQUD &00003000 7Z" EQUD &00030000:EQUD &00003000 7d" EQUD &00033000:EQUD &00033000 7n" EQUD &00033000:EQUD &00033000 7x" EQUD &00033300:EQUD &00333000 7�" EQUD &00034300:EQUD &00343000 7�" EQUD &00034330:EQUD &03343000 7�" EQUD &30034430:EQUD &03443003 7�" EQUD &30034433:EQUD &33443003 7�" EQUD &30034443:EQUD &34443003 7�" EQUD &33334443:EQUD &34443333 7�" EQUD &33344443:EQUD &34444333 7�" EQUD &00334433:EQUD &33443300 7�" EQUD &00033330:EQUD &03333000 7�" EQUD &00003300:EQUD &00330000 7� 7� .self_destruct 7� MOV R0,#1:STRB R0,dead 8 STMFD R13!,{R1-R8,R14} 8 BL initialise_particles 8 BL particle_spread 8" MOV R0,#1 : STRB R0,lives 8, MOV R0,#32 : STRB R0,Clives 86" MOV R0,#49 : STRB R0,Clives+1 8@f MOV R0,#4:MOV R1,#15:RSB R1,R1,#0:MOV R2,#1:MOV R3,#25:SWI "Sound_Control" ; usership sound 8J LDMFD R13!,{R1-R8,R15} 8T 8^ .usership_explosion 8h LDRB R1,usership_frames 8r' CMP R1,#0 : BEQ no_more_frames 8| LDRB R2,usership_timer 8�( CMP R2,#0 : BNE decrement_timer 8�+ MOV R2,#6 : STRB R2,usership_timer 8�, SUBS R1,R1,#1 : STRB R1,usership_frames 8� 8�C STMFD R13!,{R8,R14} : BL particle_spread : LDMFD R13!,{R8,R14} 8� 8� B next_frame 8� .decrement_timer 8�* SUB R2,R2,#1 : STRB R2,usership_timer 8� B next_frame 8� .no_more_frames 8�` STMFD R13!,{R14} : BL load_wave_finished : LDMFD R13!,{R14} : CMP R1,#1 : BEQ continue_play 8� CMP R8,#0 : BEQ next_frame 9) ADD R1,R8,#1 : STRB R1,no_of_sprites 9 B next_frame 9 .continue_play 9&- LDRB R1,dead : CMP R1,#0 : BEQ next_wave 90 BL lives_minus 9: CMP R1,#0 : BEQ game_over 9D BL plot_border 9N BL print_lives 9X BL print_score 9b BL plot_wave 9l BL initial_stars 9v MOV R0,#0 : BL repeat_wave 9� LDR R1,newaddr 9� BL usership 9� MOV R1,#0 : STRB R1,dead 9� MOV R1,#300 9� .wait 9� STMFD R13!,{R1,R14} 9� BL move_stars 9� BL change_palette 9�3 BL load_no_of_bullets : CMP R2,#0 : BLNE inner 9�. MOV R5,#400 : BL slow1 : BL test_keypress 9� LDMFD R13!,{R1,R14} 9� SUBS R1,R1,#1 : BNE wait 9� MOV R0,#1 : BL repeat_wave : B display : .next_frame : MOV R15,R14 : :* .lives_plus :47 LDRB R0,Clives+1 : ADD R0,R0,#1 : STRB R0,Clives+1 :> CMP R0,#58 : BNE plus_done :H" MOV R0,#48 : STRB R0,Clives+1 :R LDRB R0,Clives : CMP R0,#32 :\! �Q R0,#49 : STREQB R0,Clives :f& ADDNE R0,R0,#1 : STRNEB R0,Clives :p :z .plus_done :�1 LDRB R1,lives : ADD R1,R1,#1 : STRB R1,lives :� MOV R15,R14 :� :� .lives_minus :�7 LDRB R0,Clives+1 : SUB R0,R0,#1 : STRB R0,Clives+1 :� CMP R0,#47 : BNE minus_done :�" MOV R0,#57 : STRB R0,Clives+1 :� LDRB R0,Clives : CMP R0,#49 :�! �Q R0,#32 : STREQB R0,Clives :�& SUBNE R0,R0,#1 : STRNEB R0,Clives :� :� .minus_done :�1 LDRB R1,lives : SUB R1,R1,#1 : STRB R1,lives ; MOV R15,R14 ; ; .print_lives ;$ SWI &100+18 ;. MOV R0,#3 ;8 SWI "OS_WriteC" ;B MOV R0,#136 ;L SWI "OS_WriteC" ;V SWI &100+18 ;` MOV R0,#0 ;j SWI "OS_WriteC" ;t MOV R0,#3 ;~ SWI "OS_WriteC" ;� MOV R0,#4 ;� MOV R1,#172 ;� MOV R2,#880 ;� SWI "OS_Plot" ;� ADR R0,Blives ;� SWI "OS_Write0" ;� MOV R15,R14 ;� ;� .lives EQUB 3 ;� .Blives EQUB 127 :EQUB 127 ;� .Clives EQUS " 3" :EQUB 0 ;� ALIGN <