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
<