Home » Archimedes archive » Acorn User » Acorn User - PD Pack 1.adf » 2Play » !Play/!RunImage
!Play/!RunImage
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 » Acorn User » Acorn User - PD Pack 1.adf » 2Play |
| Filename: | !Play/!RunImage |
| Read OK: | ✔ |
| File size: | 19857 bytes |
| Load address: | 0000 |
| Exec address: | 0000 |
File contents
10REM > !RunImage
20REM
30REM LEN J.D.Harrop
40REM
50:
60ON ERROR PROCerror:END
70:
80MODE 15
90MODE 13
100OFF
110:
120DIM screen% 8
130screen%!0=149
140screen%!4=-1
150SYS "OS_ReadVduVariables",screen%,screen%
160screen%=screen%!0
170:
180xext%=12
190yext%=16
200:
210*RmEnsure EXPLO RMLoad <This$Dir>.SFX.Explo
220*RmEnsure TOKENRM RMLoad <This$Dir>.SFX.TokenRM
230*RmEnsure ARG RMLoad <This$Dir>.SFX.Arg
240*RmEnsure RARG RMLoad <This$Dir>.SFX.RArg
250*RmEnsure LaughRM RMLoad <This$Dir>.SFX.Laugh
260*RmEnsure Revolver RMLoad <This$Dir>.SFX.Revolver
270*RmEnsure Gener RMLoad <This$Dir>.SFX.Gener
280*RmEnsure Gener RMLoad <This$Dir>.SFX.boom
290VOICES 7
300VOICE 1,"boom"
310VOICE 2,"TOKENRM"
320VOICE 3,"ARG"
330VOICE 4,"RARG"
340VOICE 5,"LaughRM"
350VOICE 6,"Revolver"
360VOICE 7,"Gener"
370VOICE 8,"EXPLO"
380SYS "Sound_Volume",127
390scream%=8192
400ping%=14336
410boom%=6400
420explosion%=3200
430fader%=8
440bomb_pause%=63
450seeking_sound%=7
460seeking_rate%=512
470gun_sound%=6
480gun_rate%=16384
490homing_sound%=7
500homing_rate%=16384
510clist_size%=640*32
520slist_size%=1024
530SYS "OS_File",17,"<This$Dir>.Graphics.SData1212" TO type%,,,,spritelen1%
540SYS "OS_File",17,"<This$Dir>.Graphics.SData2016" TO type%,,,,spritelen2%
550SYS "OS_File",17,"<This$Dir>.Graphics.SData1264" TO type%,,,,spritelen3%
560SYS "OS_File",17,"<This$Dir>.Graphics.SData0804" TO type%,,,,spritelen4%
570SYS "OS_File",17,"<This$Dir>.Graphics.SData1208" TO type%,,,,spritelen5%
580SYS "OS_File",17,"<This$Dir>.Graphics.SData1616" TO type%,,,,spritelen6%
590SYS "OS_File",17,"<This$Dir>.Graphics.Font" TO type%,,,,fontlen%
600DIM code% 12*1024,sprite_routines% 8192,fill_routines% 8192,clg_routine% 1024,split_routine% 1024,decomp_code% 1024
610DIM sprites1% spritelen1%+4,sprites2% spritelen2%+4,sprites3% spritelen3%+4,sprites4% spritelen4%+4,sprites5% spritelen5%+4,sprites6% spritelen6%+4
620DIM screendata% 81924
630DIM screenstore% 81924
640DIM clist% clist_size%,slist% slist_size%
650DIM cmpdata% 81924
660DIM flame_fade% 256
670DIM gun_fade% 256
680DIM cl_code% 2048, cl_colours% 320
690DIM font% fontlen%+4
700PROCassm_decomp
710PROCdecompress("<This$Dir>.Graphics.CMLData",screen%)
720!font%=22*1024
730SYS "OS_SpriteOp",&10A,font%,"<This$Dir>.Graphics.Font"
740t%=TIME
750P%=cl_colours%
760L%=cl_colours%+256
770chan%=OPENIN("<This$Dir>.FadeCols")
780FOR c%=0 TO 255
790 ?P%=BGET#chan%
800 P%+=1
810NEXT
820CLOSE#chan%
830REPEAT
840UNTIL TIME>t%+200
850PROCassemble_clear_screen
860:
870scrn%=20
880REPEAT
890 player1_lives%=3
900 player2_lives%=3
910 REPEAT
920 scrn%+=1
930 IF scrn%>23 THEN scrn%=1
940 PROCdecompress("<This$Dir>.Levels.Level"+STR$(scrn%)+".CmpData"+STR$(scrn%),screendata%)
950 PROCtint
960 CALL clear_screen
970 PROCplay
980 !screen=!screen1
990 CLS
1000 OFF
1010 SYS "OS_Byte",112,2
1020 CLS
1030 SYS "OS_Byte",113,2
1040 SYS "OS_Byte",112,1
1050 CLS
1060 PROCdecompress("<This$Dir>.Graphics.CLogoData",screen%)
1070 WAIT
1080 SYS "OS_Byte",113,1
1090 SYS "OS_Byte",112,1
1100 IF !player1_alive<>0 THEN player1_lives%-=1
1110 IF !player2_alive<>0 THEN player2_lives%-=1
1120 IF player1_lives%=0 AND player2_lives%=0 THEN player1_lives%+=1:player2_lives%+=1
1130 COLOUR 128+42 TINT 0
1140 COLOUR 0 TINT 0
1150 PRINT TAB(0,0);
1160 PROCprint("Player 1 : "+STR$player1_lives%)
1170 PROCprint("Player 2 : "+STR$player2_lives%)
1180 COLOUR 128 TINT 0
1190 COLOUR 63 TINT 255
1200 UNTIL player1_lives%=0 OR player2_lives%=0
1210 t%=TIME
1220 REPEAT
1230 UNTIL TIME>t%+50
1240 CALL clear_screen
1250 CLS
1260 OFF
1270 SYS "OS_Byte",112,2
1280 CLS
1290 SYS "OS_Byte",113,2
1300 SYS "OS_Byte",112,1
1310 CLS
1320 t%=TIME
1330 IF player1_lives%=0 THEN PROCdecompress("<This$Dir>.Graphics.C�P2Wins",screen%)
1340 IF player2_lives%=0 THEN PROCdecompress("<This$Dir>.Graphics.C�P1Wins",screen%)
1350 SYS "Sound_Control",5,-15,128,0
1360 WAIT
1370 SYS "OS_Byte",113,1
1380 SYS "OS_Byte",112,1
1390 REPEAT
1400 UNTIL TIME>t%+500
1410 CALL clear_screen
1420UNTIL FALSE
1430END
1440:
1450:
1460:
1470DEF PROCplay
1480spray_col%=63
1490max_homing_speed%=16
1500SYS "OS_File",255,"<This$Dir>.Graphics.SData1212",sprites1%,0
1510SYS "OS_File",255,"<This$Dir>.Graphics.SData2016",sprites2%,0
1520SYS "OS_File",255,"<This$Dir>.Graphics.SData1264",sprites3%,0
1530SYS "OS_File",255,"<This$Dir>.Graphics.SData0804",sprites4%,0
1540SYS "OS_File",255,"<This$Dir>.Graphics.SData1208",sprites5%,0
1550SYS "OS_File",255,"<This$Dir>.Graphics.SData1616",sprites6%,0
1560number = 0
1570divisor = 1
1580remain = 3
1590quotient = 2
1600place = 4
1610dsign = 5
1620msign = 6
1630x_shift=1
1640y_shift=320
1650FOR pass%=%0000 TO %1010 STEP %1010
1660 P%=code%
1670 L%=code%+12*1024
1680 [OPT pass%
1690 :
1700 :
1710 :
1720 .point
1730 STMFD R13!,{R1-R12,R14}
1740 :
1750 RSB R2,R2, #256
1760 :
1770; MOV R7, #x_shift ; get screen shifts
1780; MOV R8, #y_shift
1790 LDR R9, screenstore ; get screen address
1800 :
1810ADD r9,r9,r1
1820ADD r9,r9,r2, ASL #8
1830ADD r9,r9,r2, ASL #6
1840; MLA R9,R7,R1,R9
1850; MLA R1,R8,R2,R9
1860 :
1870 STRB R0,[R1]
1880 :
1890 LDMFD R13!,{R1-R12,PC}
1900 :
1910 .vsync_counter
1920 CMP R0, #4
1930 MOVNES PC,R14
1940 LDR R0, vsyncs
1950 ADD R0,R0, #1
1960 STR R0, vsyncs
1970 MOVS PC,R14
1980 :
1990 .vsyncs
2000 EQUD 0
2010 :
2020 .start
2030 STMFD R13!,{R0-R12,R14}
2040 :
2050 ADR R0, vdu_vars
2060 ADR R1, screen
2070 SWI "OS_ReadVduVariables" ; set up vdu variables
2080 LDR R0, screen
2090 STR R0, screen1
2100 LDR R1, screen_size
2110 ADD R0,R0,R1
2120 STR R0, screen2
2130 SWI 256+19
2140 SWI 256+0
2150 SWI 256+24
2160 SWI 256+240
2170 SWI 256+240
2180 SWI 256+112
2190 BL clg
2200 :
2210 MOV R0, #16
2220 ADR R1, vsync_counter
2230 MOV R2, #1
2240 SWI "OS_Claim"
2250 :
2260 MOV R0, #14
2270 MOV R1, #4
2280 SWI "OS_Byte"
2290 :
2300 .total_loop
2310 :
2320FNbordercol(0,0,0)
2330 .vsync_loop
2340 LDR R0, vsyncs
2350 CMP R0, #1
2360 BLT vsync_loop
2370 MOV R0, #0
2380 STR R0, vsyncs
2390 :
2400 LDR R3, screen_bank
2410 EOR R3,R3, #1
2420 STR R3, screen_bank
2430 CMP R3, #0
2440 RSB R1,R3, #2
2450 LDREQ R3, screen1
2460 LDRNE R3, screen2
2470 STR R3, screen
2480 :
2490 MOV R0, #113
2500 SWI "OS_Byte"
2510 :
2520FNbordercol(255,0,0)
2530 BL wipe_all
2540 :
2550 SWI "OS_ReadMonotonicTime"
2560 MOV r2,r0
2570 LDR r0, adr_explosion_spray2
2580 MOV r1, #16
2590 .explo_loop1
2600 ADD r2,r2,r2, ROR #1
2610 LDR r3,[r0]
2620 EOR r3,r3,r2
2630 STR r3,[r0], #4
2640 SUBS r1,r1, #1
2650 BPL explo_loop1
2660 :
2670FNbordercol(0,255,0)
2680 :
2690 LDR R0, rnd
2700 TST R0, #255<<8
2710 BLEQ add_goodie
2720 TST R0, #255<<4
2730 BLEQ add_goodie
2740 :
2750 BL update_sprites
2760 :
2770FNbordercol(0,0,255)
2780 BL update_cells
2790 :
2800FNbordercol(0,255,255)
2810 BL split_screen
2820 :
2830FNbordercol(255,255,255)
2840 SWI "OS_ReadEscapeState"
2850 BCS end
2860 :
2870 LDR R0, adr_end_game
2880 LDR R0,[R0]
2890 CMP R0, #0
2900 BNE end
2910 :
2920 LDR R0, rnd
2930 ADD R0,R0,R0, ROR #1
2940 AND R1,R0, #255<<8
2950 LDR R1,[R1]
2960 EOR R0,R0,R1
2970 STR R0, rnd
2980 :
2990 B total_loop
3000 :
3010 .end
3020 :
3030FNbordercol(0,0,0)
3040 LDR R3, screen_bank
3050 EOR R3,R3, #1
3060 STR R3, screen_bank
3070 RSB R1,R3, #2
3080 CMP R3, #0
3090 LDREQ R3, screen1
3100 LDRNE R3, screen2
3110 STR R3, screen
3120 BL clear_screen
3130 :
3140 MOV R0, #16
3150 ADR R1, vsync_counter
3160 MOV R2, #1
3170 SWI "OS_Release"
3180 :
3190 MOV R0, #13
3200 MOV R1, #4
3210 SWI "OS_Byte"
3220 :
3230 LDMFD R13!,{R0-R12,PC}
3240 :
3250 .adr_end_game
3260 EQUD end_game
3270 :
3280 .screen
3290 EQUD 0
3300 .screenstore
3310 EQUD screenstore%
3320 .screenbank
3330 EQUD 0
3340 .screen1
3350 EQUD 0
3360 .screen2
3370 EQUD 0
3380 .vdu_vars
3390 EQUD 149 ; vdu data
3400 EQUD -1
3410 .screen_size
3420 EQUD &14000
3430 .screen_bank
3440 EQUD 1
3450 :
3460 .adr_explosion_spray2
3470 EQUD explosion_spray
3480 :
3490 .wipe_all
3500 STMFD R13!,{R0-R12,R14}
3510 :
3520 LDR R9, adr_slist
3530 .wsloop1
3540 LDMIA R9,{R5-R8}
3550 :
3560 MOV R1,R6, LSR #2
3570 MOV R2,R7, LSR #2
3580 :
3590 CMP R5, #1
3600 SUBEQ R1,R1, #4
3610 BLEQ fill_fill_2016
3620 BEQ wipe_end_sprite_loop
3630 :
3640 CMP R5, #2
3650 SUBEQ R1,R1, #4
3660 BLEQ fill_fill_2016
3670 BEQ wipe_end_sprite_loop
3680 :
3690 CMP R5, #3
3700 BLT not_a_1212
3710 CMP R5, #12
3720 BGT not_a_1212
3730 BL fill_fill_1212
3740 B wipe_end_sprite_loop
3750 .not_a_1212
3760 :
3770 CMP R5, #13
3780 BLEQ fill_fill_1264
3790 :
3800 CMP R5, #14
3810 BLEQ fill_fill_1208
3820 CMP R5, #15
3830 BLEQ fill_fill_1208
3840 :
3850 .wipe_end_sprite_loop
3860 ADD R9,R9, #16
3870 CMP R5, #0
3880 BGE wsloop1
3890 :
3900 LDR R9, adr_clist
3910 .wcloop1
3920 LDMIA R9,{R0-R7}
3930 MOV R1,R1, ASR #4
3940 MOV R2,R2, ASR #4
3950 CMP R0, #0
3960 BEQ wcell_skip
3970 CMP R0, #1
3980 BLEQ fill_fill_0101
3990 BEQ wcell_skip
4000 CMP R0, #2
4010 SUBEQ R1,R1, #2
4020 SUBEQ R2,R2, #2
4030 BLEQ fill_fill_0804
4040 BEQ wcell_skip
4050 CMP R0, #3
4060 SUBEQ R1,R1, #2
4070 SUBEQ R2,R2, #2
4080 BLEQ fill_fill_0804
4090 BEQ wcell_skip
4100 CMP R0, #4
4110 SUBEQ R1,R1, #2
4120 SUBEQ R2,R2, #2
4130 BLEQ fill_fill_0804
4140 BEQ wcell_skip
4150 CMP R0, #5
4160 SUBEQ R1,R1, #2
4170 SUBEQ R2,R2, #2
4180 BLEQ fill_fill_0804
4190 BEQ wcell_skip
4200 CMP R0, #6
4210 SUBEQ R1,R1, #4
4220 SUBEQ R2,R2, #4
4230 BLEQ fill_fill_1208
4240 BEQ wcell_skip
4250 CMP R0, #7
4260 SUBEQ R1,R1, #2
4270 SUBEQ R2,R2, #2
4280 BLEQ fill_fill_0804
4290 BEQ wcell_skip
4300 CMP R0, #8
4310 SUBEQ R1,R1, #2
4320 SUBEQ R2,R2, #2
4330 BLEQ fill_fill_0804
4340 BEQ wcell_skip
4350 CMP R0, #9
4360 SUBEQ R1,R1, #2
4370 SUBEQ R2,R2, #2
4380 BLEQ fill_fill_0804
4390 BEQ wcell_skip
4400 CMP R0, #10
4410 SUBEQ R1,R1, #4
4420 SUBEQ R2,R2, #4
4430 BLEQ fill_fill_1208
4440 BEQ wcell_skip
4450 CMP R0, #11
4460 SUBEQ R1,R1, #8
4470 SUBEQ R2,R2, #8
4480 BLEQ fill_fill_2016
4490 CMP R0, #12
4500 SUBEQ R1,R1, #2
4510 SUBEQ R2,R2, #2
4520 BLEQ fill_fill_0804
4530 CMP R0, #13
4540 SUBEQ R1,R1, #4
4550 SUBEQ R2,R2, #4
4560 BLEQ fill_fill_1208
4570 .wcell_skip
4580 ADD R9,R9, #32
4590 CMP R0, #0
4600 BGE wcloop1
4610 :
4620 LDMFD R13!,{R0-R12,PC}
4630 :
4640 .update_sprites
4650 STMFD R13!,{R0-R12,R14}
4660 :
4670 LDR R9, adr_slist
4680 .sloop1
4690 LDMIA R9,{R5-R8}
4700 CMP R5, #1
4710 BLEQ player1
4720 BEQ end_sprite_loop
4730 CMP R5, #2
4740 BLEQ player2
4750 BEQ end_sprite_loop
4760 CMP R5, #3
4770 BLEQ flame
4780 BEQ end_sprite_loop
4790 CMP R5, #4
4800 BLEQ weapon_pistol
4810 BEQ end_sprite_loop
4820 CMP R5, #5
4830 BLEQ weapon_gun
4840 BEQ end_sprite_loop
4850 CMP R5, #6
4860 BLEQ weapon_mortar
4870 BEQ end_sprite_loop
4880 CMP R5, #7
4890 BLEQ weapon_homing
4900 BEQ end_sprite_loop
4910 CMP R5, #8
4920 BLEQ weapon_seeking
4930 BEQ end_sprite_loop
4940 CMP R5, #9
4950 BLEQ weapon_vertical
4960 BEQ end_sprite_loop
4970 CMP R5, #10
4980 BLEQ weapon_thrower
4990 BEQ end_sprite_loop
5000 CMP R5, #11
5010 BLEQ weapon_bomb
5020 BEQ end_sprite_loop
5030 CMP R5, #12
5040 BLEQ weapon_cluster
5050 BEQ end_sprite_loop
5060 CMP R5, #13
5070 BLEQ door
5080 BEQ end_sprite_loop
5090 CMP R5, #14
5100 BLEQ switch
5110 BEQ end_sprite_loop
5120 CMP R5, #15
5130 BLEQ gun_gun
5140 .end_sprite_loop
5150 STMIA R9!,{R5-R8}
5160 CMP R5, #0
5170 BGE sloop1
5180 :
5190 LDMFD R13!,{R0-R12,PC}
5200 :
5210 .p1_weapon
5220 EQUD 2
5230 .p2_weapon
5240 EQUD 2
5250 :
5260 .read_point
5270 STMFD R13!,{R1-R12,R14}
5280 :
5290 RSB R2,R2, #256
5300 :
5310 MOV R7, #x_shift ; get screen shifts
5320 MOV R8, #y_shift
5330 LDR R9, screenstore ; get screen address
5340 :
5350 MLA R9,R7,R1,R9
5360 MLA R1,R8,R2,R9
5370 :
5380 LDRB R0,[R1]
5390 :
5400 LDMFD R13!,{R1-R12,PC}
5410 :
5420 .adr_clist
5430 EQUD clist%
5440 .adr_slist
5450 EQUD slist%
5460 :
5470 .flame
5480 STMFD R13!,{R9,R14}
5490 :
5500 LDR R10, p1_x
5510 LDR R11, p1_y
5520 MOV R9,R6, ASR #2
5530 ADD R9,R9, #8
5540 SUB R10,R9,R10
5550 CMP R10, #0
5560 BLT not_touched11
5570 CMP R10, #xext%+8
5580 BGT not_touched11
5590 MOV R9,R7, ASR #2
5600 ADD R9,R9, #10
5610 SUB R11,R9,R11
5620 CMP R11, #0
5630 BLT not_touched11
5640 CMP R11, #yext%+8
5650 BGT not_touched11
5660 LDR R1, adr_player1_alive
5670 LDR R0,[R1]
5680 CMP R0, #1
5690 BEQ not_touched11
5700 MOV R0, #1
5710 STR R0,[R1]
5720 MOV R0, #3
5730 MVN R1, #14
5740 MOV R2, #scream%
5750 MOV R3, #0
5760 SWI "Sound_Control"
5770 .not_touched11
5780 LDR R10, p2_x
5790 LDR R11, p2_y
5800 MOV R9,R6, ASR #2
5810 ADD R9,R9, #8
5820 SUB R10,R9,R10
5830 CMP R10, #0
5840 BLT not_touched21
5850 CMP R10, #xext%+8
5860 BGT not_touched21
5870 MOV R9,R7, ASR #2
5880 ADD R9,R9, #10
5890 SUB R11,R9,R11
5900 CMP R11, #0
5910 BLT not_touched21
5920 CMP R11, #yext%+8
5930 BGT not_touched21
5940 LDR R1, adr_player2_alive
5950 LDR R0,[R1]
5960 CMP R0, #1
5970 BEQ not_touched21
5980 MOV R0, #1
5990 STR R0,[R1]
6000 MOV R0, #3
6010 MVN R1, #14
6020 MOV R2, #scream%
6030 MOV R3, #0
6040 SWI "Sound_Control"
6050 .not_touched21
6060 :
6070 ADD R8,R8, #1
6080 CMP R8, #15
6090 MOVGT R8, #0
6100 MOV R0, #2
6110 ADD R0,R0,R8, LSR #2
6120 MOV R1,R6, LSR #2
6130 MOV R2,R7, LSR #2
6140 BL plot_sprite_1212
6150 :
6160 LDMFD R13!,{R9,PC}
6170 :
6180 .adr_player1_alive
6190 EQUD player1_alive
6200 .adr_player2_alive
6210 EQUD player2_alive
6220 :
6230 .door
6240 STMFD R13!,{R9,R14}
6250 :
6260 TST R8, #256
6270 BNE door_closing
6280 AND R0,R8, #31
6290 CMP R0, #30
6300 ADDLT R0,R0, #1
6310 BIC R8,R8, #31
6320 ORR R8,R8,R0
6330 B do_door
6340 .door_closing
6350 AND R0,R8, #31
6360 CMP R0, #0
6370 SUBGT R0,R0, #1
6380 BIC R8,R8, #31
6390 ORR R8,R8,R0
6400 .do_door
6410 ORR R8,R8, #256
6420 LDR R0, p1_x
6430 LDR R1, p1_y
6440 SUB R0,R6,R0, ASL #2
6450 SUB R1,R7,R1, ASL #2
6460 CMP R0, #0
6470 RSBLT R0,R0, #0
6480 CMP R1, #0
6490 RSBLT R1,R1, #0
6500 ADD R0,R0,R1
6510 CMP R0, #128
6520 BICLT R8,R8, #256
6530 LDR R0, p2_x
6540 LDR R1, p2_y
6550 SUB R0,R6,R0, ASL #2
6560 SUB R1,R7,R1, ASL #2
6570 CMP R0, #0
6580 RSBLT R0,R0, #0
6590 CMP R1, #0
6600 RSBLT R1,R1, #0
6610 ADD R0,R0,R1
6620 CMP R0, #128
6630 BICLT R8,R8, #256
6640 .plot_door
6650 :
6660 AND R0,R8, #31
6670 MOV R1,R6, LSR #2
6680 MOV R2,R7, LSR #2
6690 BL plot_sprite_1264
6700 :
6710 LDMFD R13!,{R9,PC}
6720 :
6730 .switch
6740 STMFD R13!,{R9,R14}
6750 :
6760 MOV R0, #0
6770 :
6780 LDR R1, p1_x
6790 LDR R2, p1_y
6800 MOV R3,R6, ASR #2
6810 MOV R4,R7, ASR #2
6820 ADD R4,R4, #8
6830 CMP R2,R4
6840 BNE not_p1_on
6850 SUB R3,R3, #6
6860 CMP R1,R3
6870 BLT not_p1_on
6880 ADD R3,R3, #10
6890 CMP R1,R3
6900 BGT not_p1_on
6910 MOV R0, #2
6920 .not_p1_on
6930 LDR R1, p2_x
6940 LDR R2, p2_y
6950 MOV R3,R6, ASR #2
6960 MOV R4,R7, ASR #2
6970 ADD R4,R4, #8
6980 CMP R2,R4
6990 BNE not_p2_on
7000 SUB R3,R3, #6
7010 CMP R1,R3
7020 BLT not_p2_on
7030 ADD R3,R3, #10
7040 CMP R1,R3
7050 BGT not_p2_on
7060 MOV R0, #1
7070 .not_p2_on
7080 :
7090 ADR R1, guns
7100 AND R2,R8, #3
7110 STR R0,[R1,R2, LSL #3]
7120 :
7130 MOV R0, #16
7140 MOV R1,R6, LSR #2
7150 MOV R2,R7, LSR #2
7160 BL plot_sprite_1208
7170 :
7180 LDMFD R13!,{R9,PC}
7190 :
7200 .guns
7210 EQUD 0
7220 EQUD 0
7230 EQUD 0
7240 EQUD 0
7250 EQUD 0
7260 EQUD 0
7270 EQUD 0
7280 EQUD 0
7290 :
7300 .gun_gun
7310 STMFD R13!,{R9,R14}
7320 :
7330 ADR R0, guns
7340 AND R2,R8, #3
7350 LDR R3,[R0,R2, LSL #3]
7360 ADD R0,R0, #4
7370 LDR R4,[R0,R2, LSL #3]
7380 :
7390 CMP R3, #0
7400 BEQ no_gun_gun
7410 ADD R4,R4, #1
7420 AND R4,R4, #%111
7430 STR R4,[R0,R2, LSL #3]
7440 TST R4, #%111
7450 BNE no_gun_gun
7460 SUB R5,R3, #1
7470 MOV R0, #4
7480 MOV R1,R6, ASR #2
7490 MOV R2,R7, ASR #2
7500 ADD R1,R1, #8
7510 ADD R2,R2, #5
7520 RSB R2,R2, #256
7530 MOV R3, #72
7540 LDR R4, rnd
7550 AND R4,R4, #15
7560 ADD R4,R4, #7
7570 BL add_cell
7580 MOV R0, #8
7590 MVN R1, #4
7600 MOV R2, #12800
7610 MOV R3, #1
7620 SWI "Sound_Control"
7630 MOV R5, #15
7640 .no_gun_gun
7650 :
7660 MOV R0, #17
7670 MOV R1,R6, LSR #2
7680 MOV R2,R7, LSR #2
7690 BL plot_sprite_1208
7700 :
7710 LDMFD R13!,{R9,PC}
7720 :
7730 .weapon_pistol
7740 STMFD R13!,{R9,R14}
7750 :
7760 MOV R4, #2
7770 BL pick_up
7780 :
7790 SUB R8,R8, #1
7800 CMP R8, #0
7810 MOVLE R5, #0
7820 :
7830 CMP R5, #0
7840 :
7850 MOVGT R0, #12
7860 MOVGT R1,R6, LSR #2
7870 MOVGT R2,R7, LSR #2
7880 BLGT plot_sprite_1212
7890 :
7900 LDMFD R13!,{R9,PC}
7910 :
7920 .weapon_gun
7930 STMFD R13!,{R9,R14}
7940 :
7950 MOV R4, #3
7960 BL pick_up
7970 :
7980 SUB R8,R8, #1
7990 CMP R8, #0
8000 MOVLE R5, #0
8010 :
8020 CMP R5, #0
8030 :
8040 MOVGT R0, #13
8050 MOVGT R1,R6, LSR #2
8060 MOVGT R2,R7, LSR #2
8070 BLGT plot_sprite_1212
8080 :
8090 LDMFD R13!,{R9,PC}
8100 :
8110 .weapon_mortar
8120 STMFD R13!,{R9,R14}
8130 :
8140 MOV R4, #4
8150 BL pick_up
8160 :
8170 SUB R8,R8, #1
8180 CMP R8, #0
8190 MOVLE R5, #0
8200 :
8210 CMP R5, #0
8220 :
8230 MOVGT R0, #14
8240 MOVGT R1,R6, LSR #2
8250 MOVGT R2,R7, LSR #2
8260 BLGT plot_sprite_1212
8270 :
8280 LDMFD R13!,{R9,PC}
8290 :
8300 .weapon_homing
8310 STMFD R13!,{R9,R14}
8320 :
8330 MOV R4, #5
8340 BL pick_up
8350 :
8360 SUB R8,R8, #1
8370 CMP R8, #0
8380 MOVLE R5, #0
8390 :
8400 CMP R5, #0
8410 :
8420 MOVGT R0, #15
8430 MOVGT R1,R6, LSR #2
8440 MOVGT R2,R7, LSR #2
8450 BLGT plot_sprite_1212
8460 :
8470 LDMFD R13!,{R9,PC}
8480 :
8490 .weapon_seeking
8500 STMFD R13!,{R9,R14}
8510 :
8520 MOV R4, #6
8530 BL pick_up
8540 :
8550 SUB R8,R8, #1
8560 CMP R8, #0
8570 MOVLE R5, #0
8580 :
8590 CMP R5, #0
8600 :
8610 MOVGT R0, #16
8620 MOVGT R1,R6, LSR #2
8630 MOVGT R2,R7, LSR #2
8640 BLGT plot_sprite_1212
8650 :
8660 LDMFD R13!,{R9,PC}
8670 :
8680 .weapon_vertical
8690 STMFD R13!,{R9,R14}
8700 :
8710 MOV R4, #7
8720 BL pick_up
8730 :
8740 SUB R8,R8, #1
8750 CMP R8, #0
8760 MOVLE R5, #0
8770 :
8780 CMP R5, #0
8790 :
8800 MOVGT R0, #17
8810 MOVGT R1,R6, LSR #2
8820 MOVGT R2,R7, LSR #2
8830 BLGT plot_sprite_1212
8840 :
8850 LDMFD R13!,{R9,PC}
8860 :
8870 .weapon_thrower
8880 STMFD R13!,{R9,R14}
8890 :
8900 MOV R4, #8
8910 BL pick_up
8920 :
8930 SUB R8,R8, #1
8940 CMP R8, #0
8950 MOVLE R5, #0
8960 :
8970 CMP R5, #0
8980 :
8990 MOVGT R0, #18
9000 MOVGT R1,R6, LSR #2
9010 MOVGT R2,R7, LSR #2
9020 BLGT plot_sprite_1212
9030 :
9040 LDMFD R13!,{R9,PC}
9050 :
9060 .weapon_bomb
9070 STMFD R13!,{R9,R14}
9080 :
9090 MOV R4, #9
9100 BL pick_up
9110 :
9120 SUB R8,R8, #1
9130 CMP R8, #0
9140 MOVLE R5, #0
9150 :
9160 CMP R5, #0
9170 :
9180 MOVGT R0, #19
9190 MOVGT R1,R6, LSR #2
9200 MOVGT R2,R7, LSR #2
9210 BLGT plot_sprite_1212
9220 :
9230 LDMFD R13!,{R9,PC}
9240 :
9250 .weapon_cluster
9260 STMFD R13!,{R9,R14}
9270 :
9280 MOV R4, #10
9290 BL pick_up
9300 :
9310 SUB R8,R8, #1
9320 CMP R8, #0
9330 MOVLE R5, #0
9340 :
9350 CMP R5, #0
9360 :
9370 MOVGT R0, #20
9380 MOVGT R1,R6, LSR #2
9390 MOVGT R2,R7, LSR #2
9400 BLGT plot_sprite_1212
9410 :
9420 LDMFD R13!,{R9,PC}
9430 :
9440 :
9450 .pick_up
9460 LDR R10, p1_x
9470 LDR R11, p1_y
9480 MOV R9,R6, ASR #2
9490 ADD R9,R9, #8
9500 SUB R10,R9,R10
9510 ADD R10,R10, #2
9520 CMP R10, #0
9530 BLT not_picked_up1
9540 CMP R10, #xext%+10
9550 BGT not_picked_up1
9560 MOV R9,R7, ASR #2
9570 ADD R9,R9, #12
9580 SUB R11,R9,R11
9590 ADD R11,R11, #2
9600 CMP R11, #0
9610 BLT not_picked_up1
9620 CMP R11, #yext%+14
9630 BGT not_picked_up1
9640 MOV R5, #0
9650 STR R4, p1_weapon
9660 MOV R0, #2
9670 MVN R1, #14
9680 MOV R2, #ping%
9690 MOV R3, #0
9700 SWI "Sound_Control"
9710 .not_picked_up1
9720 LDR R10, p2_x
9730 LDR R11, p2_y
9740 MOV R9,R6, ASR #2
9750 ADD R9,R9, #8
9760 SUB R10,R9,R10
9770 ADD R10,R10, #2
9780 CMP R10, #0
9790 BLT not_picked_up2
9800 CMP R10, #xext%+10
9810 BGT not_picked_up2
9820 MOV R9,R7, ASR #2
9830 ADD R9,R9, #12
9840 SUB R11,R9,R11
9850 ADD R11,R11, #2
9860 CMP R11, #0
9870 BLT not_picked_up2
9880 CMP R11, #yext%+16
9890 BGT not_picked_up2
9900 MOV R5, #0
9910 STR R4, p2_weapon
9920 MOV R0, #2
9930 MVN R1, #14
9940 MOV R2, #ping%
9950 MOV R3, #0
9960 SWI "Sound_Control"
9970 .not_picked_up2
9980 MOV PC,R14
9990 :
10000 :
10010 .p1_x
10020 EQUD 0
10030 .p1_y
10040 EQUD 0
10050 .p2_x
10060 EQUD 0
10070 .p2_y
10080 EQUD 0
10090 :
10100 .rnd
10110 EQUD ABSRND-TIME
10120 :
10130 :
10140 .update_cells
10150 STMFD R13!,{R0-R12,R14}
10160 :
10170 LDR R9, adr_clist
10180 .cloop1
10190 LDMIA R9,{R1-R8}
10200 CMP R1, #1
10210 BLEQ spray
10220 BEQ cell_skip
10230 CMP R1, #8
10240 BLEQ spray2
10250 BEQ cell_skip
10260 CMP R1, #9
10270 BLEQ spray3
10280 BEQ cell_skip
10290 CMP R1, #2
10300 BLEQ pistol
10310 BEQ cell_skip
10320 CMP R1, #3
10330 BLEQ gun
10340 BEQ cell_skip
10350 CMP R1, #4
10360 BLEQ mortar
10370 BEQ cell_skip
10380 CMP R1, #5
10390 BLEQ homing
10400 BEQ cell_skip
10410 CMP R1, #6
10420 BLEQ seeking
10430 BEQ cell_skip
10440 CMP R1, #7
10450 BLEQ vertical
10460 BEQ cell_skip
10470 CMP R1, #10
10480 BLEQ thrower
10490 BEQ cell_skip
10500 CMP R1, #11
10510 BLEQ explode
10520 BEQ cell_skip
10530 CMP R1, #12
10540 BLEQ bomb
10550 BEQ cell_skip
10560 CMP R1, #13
10570 BLEQ cluster
10580 .cell_skip
10590 STMIA R9!,{R1-R8}
10600 CMP R1, #0
10610 BGT cloop1
10620 BNE not_null
10630 LDR R1, adr_bclist
10640 SUB R2,R9, #32
10650 CMP R2,R1
10660 MOVLT R1,R2
10670 STR R1, adr_bclist
10680 B cloop1
10690 .not_null
10700 :
10710 LDMFD R13!,{R0-R12,PC}
10720 :
10730 .adr_bclist
10740 EQUD clist%
10750 :
10760 .spray
10770 STMFD R13!,{R9,R14}
10780 :
10790 SUB R5,R5, #1
10800 ADD R2,R2,R4
10810 ADD R3,R3,R5
10820 SUB R6,R6, #1
10830 CMP R6, #0
10840 MOVLE R1, #0
10850 LDMLEFD R13!,{R9,PC}
10860 :
10870 STMFD R13!,{R1-R6}
10880 :
10890 MOV R2,R2, ASR #4
10900 MOV R3,R3, ASR #4
10910 CMP R2, #0
10920 BLT no_spray
10930 CMP R3, #0
10940 BLT no_spray
10950 CMP R2, #320
10960 BGE no_spray
10970 CMP R3, #256
10980 BGE no_spray
10990 RSB R3,R3, #256
11000 LDR R4, screenstore
11010 MOV R5, #y_shift
11020 ADD R4,R4,R2
11030 MLA R4,R5,R3,R4
11040 LDRB R0,[R4]
11050 CMP R0, #0
11060 MOVEQ R10, #1
11070 MOVNE R10, #0
11080 BNE no_spray
11090 LDR R0, adr_flame_fade
11100 MOV R9,R6, ASL #3
11110 CMP R9, #255
11120 MOVGT R9, #255
11130 LDRB R0,[R0,R9]
11140 STRB R0,[R4]
11150 .no_spray
11160 :
11170 LDMFD R13!,{R1-R6}
11180 CMP R10, #0
11190 RSBEQ R5,R5, #0
11200 MOVEQ R5,R5, ASR #1
11210 LDMFD R13!,{R9,PC}
11220 :
11230 .spray2
11240 STMFD R13!,{R9,R14}
11250 :
11260 SUB R5,R5, #1
11270 ADD R2,R2,R4
11280 ADD R3,R3,R5
11290 SUB R6,R6, #1
11300 CMP R6, #0
11310 MOVLE R1, #0
11320 LDMLEFD R13!,{R9,PC}
11330 :
11340 STMFD R13!,{R1-R6}
11350 STMFD R13!,{R6}
11360 :
11370 MOV R6, #0
11380 BL check_death
11390 MOV R6, #1
11400 BL check_death
11410 LDMFD R13!,{R6}
11420 :
11430 MOV R2,R2, ASR #4
11440 MOV R3,R3, ASR #4
11450 CMP R2, #0
11460 BLT no_spray2
11470 CMP R3, #0
11480 BLT no_spray2
11490 CMP R2, #320
11500 BGE no_spray2
11510 CMP R3, #256
11520 BGE no_spray2
11530 RSB R3,R3, #256
11540 SUB R2,R2, #1
11550 SUB R3,R3, #1
11560 LDR R4, screenstore
11570 MOV R5, #y_shift
11580 ADD R4,R4,R2
11590; MLA R4,R5,R3,R4
11600ADD R4,R4,R3, ASL #8
11610ADD R4,R4,R3, ASL #6
11620 LDRB R0,[R4]
11630 CMP R0, #0
11640 MOVEQ R10, #1
11650 MOVNE R10, #0
11660 BNE no_spray2
11670 LDR R0, adr_flame_fade
11680 MOV R9,R6, ASL #3
11690 CMP R9, #255
11700 MOVGT R9, #255
11710 LDRB R0,[R0,R9]
11720 STRB R0,[R4, #1]
11730 ADD R4,R4, #y_shift
11740 STRB R0,[R4]
11750 STRB R0,[R4, #1]
11760 STRB R0,[R4, #2]
11770 ADD R4,R4, #y_shift
11780 STRB R0,[R4, #1]
11790 .no_spray2
11800 :
11810 LDMFD R13!,{R1-R6}
11820 CMP R10, #0
11830 RSBEQ R5,R5, #0
11840 RSBEQ R4,R4, #0
11850 LDMFD R13!,{R9,PC}
11860 :
11870 .spray3
11880 STMFD R13!,{R9,R14}
11890 :
11900 SUB R5,R5, #1
11910 ADD R2,R2,R4
11920 ADD R3,R3,R5
11930 AND R0,R6, #255<<8
11940 SUB R0,R0, #1
11950 CMP R0, #0
11960 MOVLE R1, #0
11970 LDMLEFD R13!,{R9,PC}
11980 BIC R6,R6, #255<<8
11990 ORR R6,R6,R0
12000 :
12010 STMFD R13!,{R1-R6}
12020 :
12030 MOV R6, #0
12040 BL check_death
12050 MOV R6, #1
12060 BL check_death
12070 :
12080 MOV R2,R2, ASR #4
12090 MOV R3,R3, ASR #4
12100 CMP R2, #0
12110 BLT no_spray3
12120 CMP R3, #0
12130 BLT no_spray3
12140 CMP R2, #320
12150 BGE no_spray3
12160 CMP R3, #256
12170 BGE no_spray3
12180 RSB R3,R3, #256
12190 SUB R2,R2, #1
12200 SUB R3,R3, #1
12210 LDR R4, screenstore
12220 MOV R5, #y_shift
12230 ADD R4,R4,R2
12240; MLA R4,R5,R3,R4
12250ADD R4,R4,R3, ASL #8
12260ADD R4,R4,R3, ASL #6
12270 LDRB R0,[R4]
12280 CMP R0, #0
12290 MOVEQ R10, #1
12300 MOVNE R10, #0
12310 BNE no_spray3
12320 MOV R0, #255
12330 STRB R0,[R4, #1]
12340 ADD R4,R4, #y_shift
12350 STRB R0,[R4]
12360 STRB R0,[R4, #1]
12370 STRB R0,[R4, #2]
12380 ADD R4,R4, #y_shift
12390 STRB R0,[R4, #1]
12400 .no_spray3
12410 :
12420 LDMFD R13!,{R1-R6}
12430 CMP R10, #0
12440 RSBEQ R5,R5, #0
12450 RSBEQ R4,R4, #0
12460 LDMFD R13!,{R9,PC}
12470 :
12480 .adr_flame_fade
12490 EQUD flame_fade%
12500 :
12510 .adr_gun_fade
12520 EQUD gun_fade%
12530 :
12540 .thrower
12550 STMFD R13!,{R9,R14}
12560 :
12570 ADD R2,R2,R4
12580 ADD R3,R3,R5
12590 AND R7,R6, #255<<8
12600 MOV R7,R7, ASR #8
12610 ADD R7,R7, #1
12620 CMP R7, #15
12630 MOVGE R1, #0
12640 LDMGEFD R13!,{R9,PC}
12650 BIC R6,R6, #255<<8
12660 ORR R6,R6,R7, ASL #8
12670 :
12680 STMFD R13!,{R1-R6}
12690 :
12700 BL check_death
12710 :
12720 MOV R2,R2, ASR #4
12730 MOV R3,R3, ASR #4
12740 RSB R3,R3, #256
12750 LDR R4, screenstore
12760 MOV R5, #y_shift
12770 ADD R4,R4,R2
12780 MLA R4,R5,R3,R4
12790 LDRB R0,[R4, #2]
12800 CMP R0, #0
12810 MOVEQ R10, #1
12820 MOVNE R10, #0
12830 BNE no_thrower
12840 RSB R3,R3, #256
12850 MOV R0,R7
12860 SUB R1,R2, #4
12870 SUB R2,R3, #4
12880 BL plot_sprite_1208
12890 .no_thrower
12900 :
12910 LDMFD R13!,{R1-R6}
12920 CMP R10, #0
12930 MOVEQ R1, #0
12940 LDMFD R13!,{R9,PC}
12950 :
12960 .explode
12970 STMFD R13!,{R9,R14}
12980 :
12990 ADD R2,R2,R4
13000 ADD R3,R3,R5
13010 AND R7,R6, #255<<8
13020 MOV R7,R7, ASR #8
13030 ADD R7,R7, #1
13040 CMP R7, #15
13050 MOVGE R1, #0
13060 LDMGEFD R13!,{R9,PC}
13070 BIC R6,R6, #255<<8
13080 ORR R6,R6,R7, ASL #8
13090 ADD R7,R7, #8
13100 :
13110 STMFD R13!,{R1-R6}
13120 :
13130 BL check_death
13140 :
13150 MOV R2,R2, ASR #4
13160 MOV R3,R3, ASR #4
13170 RSB R3,R3, #256
13180 LDR R4, screenstore
13190 MOV R5, #y_shift
13200 ADD R4,R4,R2
13210 MLA R4,R5,R3,R4
13220 LDRB R0,[R4, #2]
13230 CMP R0, #0
13240 MOVEQ R10, #1
13250 MOVNE R10, #0
13260 BNE no_explode
13270 RSB R3,R3, #256
13280 MOV R0,R7
13290 SUB R1,R2, #8
13300 SUB R2,R3, #8
13310 BL plot_sprite_2016
13320 .no_explode
13330 :
13340 LDMFD R13!,{R1-R6}
13350 CMP R10, #0
13360 LDMFD R13!,{R9,PC}
13370 :
13380 .pistol
13390 STMFD R13!,{R9,R14}
13400 :
13410 ADD R2,R2,R4
13420 ADD R3,R3,R5
13430 CMP R4, #0
13440 MOVLT R7, #1
13450 MOVGT R7, #0
13460 :
13470 STMFD R13!,{R1-R6}
13480 :
13490 BL check_death
13500 :
13510 MOV R2,R2, ASR #4
13520 MOV R3,R3, ASR #4
13530 RSB R3,R3, #256
13540 LDR R4, screenstore
13550 MOV R5, #y_shift
13560 ADD R4,R4,R2
13570 MLA R4,R5,R3,R4
13580 LDRB R0,[R4, #2]
13590 CMP R0, #0
13600 MOVEQ R10, #1
13610 MOVNE R10, #0
13620 BNE no_pistol
13630 RSB R3,R3, #256
13640 MOV R0,R7
13650 SUB R1,R2, #2
13660 SUB R2,R3, #2
13670 BL plot_sprite_0804
13680;LDR R0, adr_gun_fade
13690;MOV R9, #255
13700;LDRB R0,[R0,R9]
13710;STRB R0,[R4]
13720;STRB R0,[R4, #1]
13730 .no_pistol
13740 :
13750 LDMFD R13!,{R1-R6}
13760 CMP R10, #0
13770 MOVEQ R1, #0
13780 LDMFD R13!,{R9,PC}
13790 :
13800 .gun
13810 STMFD R13!,{R9,R14}
13820 :
13830 ADD R2,R2,R4
13840 ADD R3,R3,R5
13850 CMP R4, #0
13860 MOVLT R7, #3
13870 MOVGT R7, #2
13880 :
13890 STMFD R13!,{R1-R6}
13900 :
13910 MOV R6, #0
13920 BL check_death
13930 MOV R6, #1
13940 BL check_death
13950 :
13960 MOV R2,R2, ASR #4
13970 MOV R3,R3, ASR #4
13980 RSB R3,R3, #256
13990 LDR R4, screenstore
14000 MOV R5, #y_shift
14010 ADD R4,R4,R2
14020 MLA R4,R5,R3,R4
14030 LDRB R0,[R4]
14040 CMP R0, #0
14050 MOVEQ R10, #1
14060 MOVNE R10, #0
14070 BNE no_gun
14080 RSB R3,R3, #256
14090 MOV R0,R7
14100 SUB R1,R2, #2
14110 SUB R2,R3, #2
14120 BL plot_sprite_0804
14130;LDR R0, adr_gun_fade
14140;MOV R9, #255
14150;LDRB R0,[R0,R9]
14160;STRB R0,[R4]
14170 .no_gun
14180 :
14190 LDMFD R13!,{R1-R6}
14200 CMP R10, #0
14210 MOVEQ R1, #0
14220 LDMFD R13!,{R9,PC}
14230 :
14240 .mortar
14250 STMFD R13!,{R9,R14}
14260 :
14270 SUB R5,R5, #1
14280 MOV R0, #32
14290 RSB R0,R0, #0
14300 CMP R5,R0
14310 MOVLT R5,R0
14320 ADD R2,R2,R4
14330 ADD R3,R3,R5
14340 :
14350 STMFD R13!,{R1-R6}
14360 :
14370 BL check_death
14380 :
14390 MOV R2,R2, ASR #4
14400 MOV R3,R3, ASR #4
14410 RSB R3,R3, #256
14420 LDR R4, screenstore
14430 MOV R5, #y_shift
14440 ADD R4,R4,R2
14450 MLA R4,R5,R3,R4
14460 LDRB R0,[R4]
14470 CMP R0, #0
14480 MOVEQ R10, #1
14490 MOVNE R10, #0
14500 MOVEQ R0, #255
14510 STREQB R0,[R4]
14520 STREQB R0,[R4, #1]
14530 ADD R2,R4, #y_shift
14540 STREQB R0,[R2]
14550 STREQB R0,[R2, #1]
14560 :
14570 LDMFD R13!,{R1-R6}
14580 CMP R10, #0
14590 BNE end_mortar
14600 SUB R2,R2,R4, ASL #1
14610 SUB R3,R3,R5, ASL #1
14620 MOV R1,R2, ASR #4
14630 MOV R2,R3, ASR #4
14640 RSB R2,R2, #256
14650 MOV R9, #0
14660 LDR R10, adr_explosion_spray
14670 MOV R0, #8
14680 LDR R8, rnd
14690 AND R8,R8, #7
14700 MOV R6, #16<<8
14710 MOV R5, #32
14720 .mortar_loop1
14730 LDRB R3,[R10], #1
14740 LDRB R4,[R10], #1
14750 MOV R3,R3, LSL #24
14760 MOV R4,R4, LSL #24
14770 MOV R3,R3, ASR #24
14780 MOV R4,R4, ASR #24
14790 EOR R3,R3, R8
14800 EOR R4,R4, R8
14810 MOV R3,R3, ASR #1
14820 MOV R4,R4, ASR #1
14830 SUB R3,R3,R3, ASR #2
14840 SUB R4,R4,R4, ASR #2
14850 ADD R6,R6,R3, ASL #8
14860 ADD R6,R6,R4, ASL #8
14870 AND R6,R6, #31<<8
14880 BL add_cell
14890 CMP R9, #8
14900 MOVEQ R0, #9
14910 MOVGE R5,R6
14920 ADD R9,R9, #1
14930 CMP R9, #16
14940 BLE mortar_loop1
14950 MOV R5, #1
14960 MOV R0, #1
14970 MVN R1, #8
14980 MOV R2, #boom%
14990 MOV R3, #0
15000 SWI "Sound_Control"
15010 MOV R1, #0
15020 .end_mortar
15030 :
15040 LDMFD R13!,{R9,PC}
15050 :
15060 .cluster
15070 STMFD R13!,{R9,R14}
15080 :
15090 MVN R0, #256
15100 CMP R5,R0
15110 MOVLT R5,R0
15120 ADD R2,R2,R4, ASR #3
15130 ADD R3,R3,R5, ASR #3
15140 CMP R4, #0
15150 ADDLT R4,R4, #1
15160 SUBGT R4,R4, #1
15170 MOV R10,R6
15180 :
15190 STMFD R13!,{R1-R6}
15200 :
15210 MOV R2,R2, ASR #4
15220 MOV R3,R3, ASR #4
15230 RSB R3,R3, #256
15240 LDR R4, screenstore
15250 MOV R5, #y_shift
15260 ADD R4,R4,R2
15270 MLA R4,R5,R3,R4
15280 LDRB R0,[R4, #4]
15290 CMP R0, #0
15300 SUBNE R10,R10, #1
15310 BNE no_cluster
15320 RSB R3,R3, #256
15330 MOV R0, #18
15340 SUB R1,R2, #4
15350 SUB R2,R3, #4
15360 BL plot_sprite_1208
15370 .no_cluster
15380 :
15390 LDMFD R13!,{R1-R6}
15400 CMP R10, #bomb_pause%-1
15410 ADDEQ R3,R3, #4
15420 CMP R10,R6
15430 SUBLT R2,R2,R4, ASR #2
15440 SUBLT R3,R3,R5, ASR #2
15450 RSBLT R4,R4, #0
15460 RSBLT R5,R5, #0
15470 MOVLT R4,R4, ASR #1
15480 MOVLT R5,R5, ASR #1
15490 SUBEQ R5,R5, #4
15500 MOVGT R5, #0
15510 MOV R6,R10
15520 CMP R6, #0
15530 BNE end_cluster
15540 :
15550 MOV R1,R2, ASR #4
15560 MOV R2,R3, ASR #4
15570 RSB R2,R2, #248
15580 MOV R5, #bomb_pause%
15590 MOV R9, #0
15600 LDR R8, rnd
15610 AND R8,R8, #7
15620 LDR R10, adr_explosion_spray
15630 .cluster_loop1
15640 LDRB R3,[R10], #1
15650 LDRB R4,[R10], #1
15660 MOV R0, #4
15670 TSTEQ R3, #%1
15680 MOVEQ R0, #12
15690 MOV R3,R3, LSL #24
15700 MOV R4,R4, LSL #24
15710 MOV R3,R3, ASR #24
15720 MOV R4,R4, ASR #24
15730 EOR R3,R3, R8
15740 EORS R4,R4, R8
15750 RSBMI R4,R4, #0
15760 SUB R3,R3,R3, ASR #2
15770 BL add_cell
15780 ADD R9,R9, #1
15790 CMP R9, #48
15800 BLE cluster_loop1
15810 MOV R5, #1
15820 MOV R0, #8
15830 MVN R1, #14
15840 MOV R2, #explosion%*0.67
15850 MOV R3, #0
15860 SWI "Sound_Control"
15870 MOV R1, #0
15880 MOV R5, #0
15890 .end_cluster
15900 :
15910 LDMFD R13!,{R9,PC}
15920 :
15930 .adr_explosion_spray
15940 EQUD explosion_spray
15950 :
15960 .bomb
15970 STMFD R13!,{R9,R14}
15980 :
15990 MOV R0, #256
16000 RSB R0,R0, #0
16010 CMP R5,R0
16020 MOVLT R5,R0
16030 ADD R2,R2,R4, ASR #2
16040 ADD R3,R3,R5, ASR #2
16050 MOV R10,R6
16060 :
16070 STMFD R13!,{R1-R6}
16080 :
16090 MOV R2,R2, ASR #4
16100 MOV R3,R3, ASR #4
16110 RSB R3,R3, #256
16120 LDR R4, adr_screenstore
16130 LDR R4,[R4]
16140 MOV R5, #y_shift
16150 ADD R4,R4,R2
16160 MLA R4,R5,R3,R4
16170 ADD R0,R4, #y_shift
16180 LDRB R0,[R0]
16190 CMP R0, #0
16200 SUBNE R10,R10, #1
16210 MOV R0, #%00010111
16220 SUB R4,R4, #y_shift
16230 STRB R0,[R4, #1]
16240 ADD R4,R4, #y_shift
16250 STRB R0,[R4]
16260 STRB R0,[R4, #1]
16270 STRB R0,[R4, #2]
16280 :
16290 LDMFD R13!,{R1-R6}
16300 CMP R10, #bomb_pause%-1
16310 ADDEQ R3,R3, #4
16320 CMP R10,R6
16330 SUBLT R2,R2,R4, ASR #2
16340 SUBLT R3,R3,R5, ASR #2
16350 RSBLT R4,R4, #0
16360 RSBLT R5,R5, #0
16370 MOVLT R4,R4, ASR #1
16380 MOVLT R5,R5, ASR #1
16390 SUBEQ R5,R5, #4
16400 MOVGT R5, #0
16410 MOV R6,R10
16420 CMP R6, #0
16430 BNE end_bomb
16440 MOV R1,R2, ASR #4
16450 MOV R2,R3, ASR #4
16460 ADD R2,R2, #2
16470 RSB R2,R2, #256
16480 MOV R9, #0
16490 MOV R0, #8
16500 LDR R8, rnd
16510 AND R8,R8, #7
16520 MOV R6, #16<<8
16530 MOV R5, #32
16540 ADR R10, explosion_spray
16550 .bomb_loop1
16560 LDRB R3,[R10], #1
16570 LDRB R4,[R10], #1
16580 MOV R3,R3, LSL #24
16590 MOV R4,R4, LSL #24
16600 MOV R3,R3, ASR #24
16610 MOV R4,R4, ASR #24
16620 EOR R3,R3, R8
16630 EOR R4,R4, R8
16640 SUB R3,R3,R3, ASR #1
16650 SUB R4,R4,R4, ASR #1
16660 ADD R6,R6,R3, ASL #8
16670 ADD R6,R6,R4, ASL #8
16680 AND R6,R6, #31<<8
16690 BL add_cell
16700 CMP R9, #24
16710 MOVEQ R0, #9
16720 MOVGE R5,R6
16730 ADD R9,R9, #1
16740 CMP R9, #32
16750 BLE bomb_loop1
16760 MOV R5, #1
16770 MOV R0, #1
16780 MVN R1, #11
16790 MOV R2, #boom%
16800 MOV R3, #0
16810 SWI "Sound_Control"
16820 MOV R1, #0
16830 MOV R5, #0
16840 .end_bomb
16850 :
16860 LDMFD R13!,{R9,PC}
16870 :
16880 .adr_screenstore2
16890 EQUD screenstore
16900 :
16910 .homing
16920 STMFD R13!,{R9,R14}
16930 :
16940;MOV R9,R6, LSR #8
16950;AND R9,R9, #255
16960;SUB R9,R9, #1
16970;BIC R6,R6, #255<<8
16980;ORR R6,R6,R9, LSL #8
16990;CMP R9, #0
17000;MOVEQ R1, #0
17010 :
17020 TST R6, #1
17030 LDREQ R10, p1_x
17040 LDREQ R11, p1_y
17050 LDRNE R10, p2_x
17060 LDRNE R11, p2_y
17070 ADD R10,R10, #xext%/2
17080 ADD R11,R11, #yext%/2
17090 CMP R2,R10, ASL #4
17100 SUBGT R4,R4, #1
17110 ADDLT R4,R4, #1
17120 CMP R3,R11, ASL #4
17130 SUBGT R5,R5, #1
17140 ADDLT R5,R5, #1
17150 MOV R0, #max_homing_speed%
17160 CMP R4,R0
17170 SUBGT R4,R0, #1
17180 RSB R0,R0, #0
17190 CMP R4,R0
17200 ADDLT R4,R0, #1
17210 MOV R0, #max_homing_speed%
17220 CMP R5,R0
17230 SUBGT R5,R0, #1
17240 RSB R0,R0, #0
17250 CMP R5,R0
17260 ADDLT R5,R0, #1
17270 ADD R2,R2,R4
17280 ADD R3,R3,R5
17290 MOV R7, #0
17300 CMN R4, #10
17310 ADDLT R7,R7, #2
17320 CMP R4, #10
17330 ADDGT R7,R7, #4
17340 CMN R5, #10
17350 ADDLT R7,R7, #12
17360 CMP R5, #10
17370 ADDGT R7,R7, #6
17380 :
17390 ADD R7,R7, #3
17400 AND R0,R6, #%110
17410 MOV R0,R0, ASR #1
17420 ADD R0,R0, #1
17430 AND R0,R0, #%11
17440 CMP R0, #%1
17450 ADDGT R7,R7, #1
17460 BIC R6,R6, #%110
17470 ORR R6,R6,R0, ASL #1
17480 CMP R7, #5
17490 MOVLT R7, #21
17500 :
17510 STMFD R13!,{R1-R6}
17520 :
17530 BL check_death
17540 :
17550 MOV R2,R2, ASR #4
17560 MOV R3,R3, ASR #4
17570 RSB R3,R3, #256
17580 LDR R4, adr_screenstore
17590 LDR R4,[R4]
17600 MOV R5, #y_shift
17610 ADD R4,R4,R2
17620 MLA R4,R5,R3,R4
17630 LDRB R0,[R4]
17640 CMP R0, #0
17650 MOVEQ R10, #1
17660 MOVNE R10, #0
17670 BNE no_homing
17680 RSB R3,R3, #256
17690 MOV R0,R7
17700 SUB R1,R2, #2
17710 SUB R2,R3, #2
17720 BL plot_sprite_0804
17730;LDR R0, adr_gun_fade
17740;MOV R9,R6, LSR #8
17750;AND R9,R9, #255
17760;CMP R9, #255
17770;MOVGT R9, #255
17780;LDRB R0,[R0,R9]
17790;STRB R0,[R4]
17800 .no_homing
17810 :
17820 LDMFD R13!,{R1-R6}
17830 CMP R10, #0
17840 BNE end_homing
17850 MOV R0, #11
17860 MOV R1,R2, ASR #4
17870 MOV R2,R3, ASR #4
17880 RSB R2,R2, #256
17890 RSB R3,R4, #0
17900 RSB R4,R5, #0
17910 MOV R3,R3, ASR #2
17920 MOV R4,R4, ASR #2
17930 AND R5,R6, #1
17940 BL add_cell
17950 MOV R5, #1
17960 MOV R0, #1
17970 MVN R1, #4
17980 MOV R2, #explosion%
17990 MOV R3, #0
18000 SWI "Sound_Control"
18010 MOV R1, #0
18020 .end_homing
18030 LDMFD R13!,{R9,PC}
18040 :
18050 .seeking
18060 STMFD R13!,{R9,R14}
18070 :
18080 TST R6, #1
18090 LDREQ R10, p1_x
18100 LDREQ R11, p1_y
18110 LDRNE R10, p2_x
18120 LDRNE R11, p2_y
18130 ADD R10,R10, #xext%/2
18140 ADD R11,R11, #yext%/2
18150 CMP R2,R10, ASL #4
18160 SUBGT R4,R4, #1
18170 ADDLT R4,R4, #1
18180 CMP R3,R11, ASL #4
18190 SUBGT R5,R5, #1
18200 ADDLT R5,R5, #1
18210 MOV R0, #16
18220 CMP R4,R0
18230 SUBGT R4,R4, #1
18240 RSB R0,R0, #0
18250 CMP R4,R0
18260 ADDLT R4,R4, #1
18270 MOV R0, #16
18280 CMP R5,R0
18290 SUBGT R5,R5, #1
18300 RSB R0,R0, #0
18310 CMP R5,R0
18320 ADDLT R5,R5, #1
18330 :
18340 STMFD R13!,{R1-R6}
18350 :
18360 BL check_death
18370 :
18380 MOV R2,R2, ASR #4
18390 MOV R3,R3, ASR #4
18400 RSB R3,R3, #256
18410 LDR R4, adr_screenstore
18420 LDR R4,[R4]
18430 MOV R5, #y_shift
18440 ADD R4,R4,R2
18450 MLA R4,R5,R3,R4
18460 LDRB R0,[R4]
18470 CMP R0, #0
18480 MOVEQ R10, #1
18490 BEQ post_recalc
18500 MOV R10, #0
18510 LDMFD R13,{R1-R6}
18520 SUB R2,R2,R4, ASL #1
18530 SUB R3,R3,R5, ASL #1
18540 MOV R2,R2, ASR #4
18550 MOV R3,R3, ASR #4
18560 RSB R3,R3, #256
18570 LDR R4, adr_screenstore
18580 LDR R4,[R4]
18590 MOV R5, #y_shift
18600 ADD R4,R4,R2
18610 MLA R4,R5,R3,R4
18620 .post_recalc
18630 RSB R3,R3, #256
18640 MOV R0, #4
18650 TST R6, #1
18660 MOVNE R0, #23
18670 SUB R1,R2, #2
18680 SUB R2,R3, #2
18690 BL plot_sprite_0804
18700 .no_seeking
18710 :
18720 LDMFD R13!,{R1-R6}
18730 CMP R10, #0
18740 ADDNE R2,R2,R4
18750 ADDNE R3,R3,R5
18760 SUBEQ R2,R2,R4, ASL #1
18770 SUBEQ R3,R3,R5, ASL #1
18780 MOVEQ R4, #0
18790 MOVEQ R5, #0
18800 LDMFD R13!,{R9,PC}
18810 :
18820 .vertical
18830 STMFD R13!,{R9,R14}
18840 :
18850 ADD R2,R2,R4
18860 ADD R3,R3,R5
18870 :
18880 STMFD R13!,{R1-R6}
18890 :
18900 BL check_death
18910 :
18920 MOV R2,R2, ASR #4
18930 MOV R3,R3, ASR #4
18940 RSB R3,R3, #256
18950 LDR R4, adr_screenstore
18960 LDR R4,[R4]
18970 MOV R5, #y_shift
18980 ADD R4,R4,R2
18990 MLA R4,R5,R3,R4
19000 LDRB R0,[R4]
19010 CMP R0, #0
19020 MOVEQ R10, #1
19030 MOVNE R10, #0
19040 BNE no_vert
19050 RSB R3,R3, #256
19060 MOV R0, #22
19070 SUB R1,R2, #2
19080 SUB R2,R3, #2
19090 BL plot_sprite_0804
19100;LDR R0, adr_gun_fade
19110;MOV R9, #255
19120;LDRB R0,[R0,R9]
19130;STRB R0,[R4]
19140;ADD R4,R4, #320
19150;SUB R4,R4, #1
19160;STRB R0,[R4]
19170;STRB R0,[R4, #2]
19180 .no_vert
19190 :
19200 LDMFD R13!,{R1-R6}
19210 CMP R10, #0
19220 MOVEQ R1, #0
19230 LDMFD R13!,{R9,PC}
19240 :
19250 .check_death
19260 TST R6, #1
19270 LDREQ R10, p1_x
19280 LDREQ R11, p1_y
19290 LDRNE R10, p2_x
19300 LDRNE R11, p2_y
19310 MOV R9,R2, ASR #4
19320 SUB R10,R9,R10
19330 CMN R10, #2
19340 BLT not_dead
19350 CMP R10, #xext%+2
19360 BGT not_dead
19370 MOV R9,R3, ASR #4
19380 SUB R11,R9,R11
19390 CMN R11, #2
19400 BLT not_dead
19410 CMP R11, #yext%+2
19420 BGT not_dead
19430 TST R6, #1
19440 BNE dead_player2
19450 LDR R0, player1_alive
19460 CMP R0, #1
19470 BEQ not_dead
19480 MOV R0, #1
19490 STR R0, player1_alive
19500 MOV R0, #3
19510 MVN R1, #14
19520 MOV R2, #scream%
19530 MOV R3, #0
19540 SWI "Sound_Control"
19550 B not_dead
19560 .dead_player2
19570 LDR R0, player2_alive
19580 CMP R0, #1
19590 BEQ not_dead
19600 MOV R0, #1
19610 STR R0, player2_alive
19620 MOV R0, #3
19630 MVN R1, #14
19640 MOV R2, #scream%
19650 MOV R3, #0
19660 SWI "Sound_Control"
19670 .not_dead
19680 MOV PC,R14
19690 :
19700 .player1_alive
19710 EQUD 0
19720 .player2_alive
19730 EQUD 0
19740 :
19750 .explosion_spray
19760 ]
19770 FOR a%=1 TO 64
19780 r%=RND(20)+28
19790 ang%=RND(360)
19800 x%=COSRAD(ang%)*r%
19810 y%=SINRAD(ang%)*r%
19820 IF x%<0 THEN x%=(x% OR 128) AND 255
19830 IF y%<0 THEN y%=(y% OR 128) AND 255
19840 [OPT pass%
19850 EQUB x%
19860 EQUB y%
19870 ]
19880 NEXT
19890 [OPT pass%
19900 ALIGN
19910 :
19920 .end_game
19930 EQUD 0
19940 .adr_screenstore
19950 EQUD screenstore
19960 .adr_clist2
19970 EQUD clist%
19980 :
19990 :
20000 :
20010 .add_cell
20020 STMFD R13!,{R0-R12,R14}
20030 :
20040 RSB R2,R2, #256
20050 MOV R1,R1, ASL #4
20060 MOV R2,R2, ASL #4
20070 :
20080 LDR R9, adr_bclist
20090 .sloop1
20100 LDR R8,[R9], #32
20110 CMP R8, #0
20120 LDRGT R8,[R9], #32
20130 CMPGT R8, #0
20140 LDRGT R8,[R9], #32
20150 CMPGT R8, #0
20160 LDRGT R8,[R9], #32
20170 CMPGT R8, #0
20180 BGT sloop1
20190 SUBEQ R9,R9, #32
20200 STMEQIA R9,{R0-R5}
20210 STREQ R9, adr_bclist
20220 :
20230 LDMFD R13!,{R0-R12,PC}
20240 :
20250 :
20260 :
20270 .add_goodie
20280 STMFD R13!,{R0-R12,R14}
20290 :
20300 LDR R9, rnd
20310 MOV R9,R9, LSR #24
20320 AND R0,R9, #255
20330 .goodie_loop
20340 CMP R0, #8
20350 SUBGT R0,R0, #8
20360 BGT goodie_loop
20370 ADD R0,R0, #4
20380 AND R1,R9, #%111000
20390 ADR R2, positions
20400 ADD R2,R2,R1
20410 LDR R1,[R2]
20420 LDR R2,[R2, #4]
20430 MOV R3, #320
20440 BL add_sprite
20450 :
20460 LDMFD R13!,{R0-R12,PC}
20470 :
20480 .positions
20490 ]
20500 FOR a%=0 TO 8
20510 [OPTpass%
20520 EQUD 0
20530 EQUD 0
20540 ]
20550 NEXT
20560 [OPT pass%
20570 :
20580 .as_adr_slist
20590 EQUD slist%
20600 :
20610 .add_sprite
20620 STMFD R13!,{R0-R12,R14}
20630 :
20640 LDR R9, as_adr_slist
20650 .sloop1
20660 LDR R8,[R9]
20670 CMP R8, #0
20680 ADDNE R9,R9, #16
20690 BNE sloop1
20700 STMEQIA R9,{R0-R3}
20710 BEQ done_cell
20720 .done_cell
20730 :
20740 LDMFD R13!,{R0-R12,PC}
20750 :
20760 .p2_fire
20770 EQUD 0
20780 .explode_2
20790 EQUD 0
20800 :
20810 .player2
20820 STMFD R13!,{R9,R14}
20830 :
20840 CMP R6, #32
20850 MOVLT R6, #32
20860 CMP R7, #32
20870 MOVLT R7, #32
20880 CMP R6, #1280-80
20890 MOVGT R6, #1280-80
20900 CMP R7, #1024-80
20910 MOVGT R7, #1024-80
20920 :
20930 LDR R0, player2_alive
20940 CMP R0, #0
20950 BEQ play_player2
20960 BNE explode_player2
20970 :
20980 .explode_player2
20990 :
21000 LDR R0, explode_2
21010 ADD R0,R0, #1
21020 STR R0, explode_2
21030 CMP R0, #7<<3
21040 STRGT R0, end_game
21050 LDMGTFD R13!,{R9,PC}
21060 CMP R0, #7<<1
21070 LDMGTFD R13!,{R9,PC}
21080 MOV R0,R0, ASR #1
21090 MOV R1,R6, ASR #2
21100 MOV R2,R7, ASR #2
21110 SUB R1,R1, #4
21120 BL plot_sprite_2016
21130 :
21140 LDMFD R13!,{R9,PC}
21150 :
21160 .play_player2
21170 :
21180 MOV R1,R6, LSR #2
21190 MOV R2,R7, LSR #2
21200 ADD R1,R1, #xext%/2
21210 BL read_point
21220 CMP R0, #0
21230 SUBEQ R7,R7, #4
21240 :
21250 MOV R1,R6, LSR #2
21260 MOV R2,R7, LSR #2
21270 ADD R1,R1, #xext%/3
21280 BL read_point
21290 CMP R0, #0
21300 ADDNE R7,R7, #4
21310 :
21320 MOV R1,R6, LSR #2
21330 MOV R2,R7, LSR #2
21340 ADD R1,R1, #xext%/3*2
21350 BL read_point
21360 CMP R0, #0
21370 ADDNE R7,R7, #4
21380 :
21390 AND R10,R8, #255<<8
21400 MOV R10,R10, LSR #8
21410 :
21420 MOV R1,R6, LSR #2
21430 MOV R2,R7, LSR #2
21440 ADD R1,R1, #xext%+1
21450 ADD R2,R2, #8
21460 BL read_point
21470 CMP R0, #0
21480 BNE p2_not_right
21490 MOV R1,R6, LSR #2
21500 MOV R2,R7, LSR #2
21510 ADD R1,R1, #xext%
21520 ADD R2,R2, #yext%-2
21530 BL read_point
21540 CMP R0, #0
21550 BNE p2_not_right
21560 MOV R0, #129
21570 MOV R1, #0
21580 SUB R1,R1, #124
21590 MOV R2, #255
21600 SWI "OS_Byte"
21610 CMP R1, #255
21620 BNE p2_not_right
21630 ADD R10,R10, #4
21640 BIC R8,R8, #1
21650 .p2_not_right
21660 :
21670 MOV R1,R6, LSR #2
21680 MOV R2,R7, LSR #2
21690 SUB R1,R1, #1
21700 ADD R2,R2, #8
21710 BL read_point
21720 CMP R0, #0
21730 BNE p2_not_left
21740 MOV R1,R6, LSR #2
21750 MOV R2,R7, LSR #2
21760 SUB R1,R1, #1
21770 ADD R2,R2, #yext%-2
21780 BL read_point
21790 CMP R0, #0
21800 BNE p2_not_left
21810 MOV R0, #129
21820 MOV R1, #0
21830 SUB R1,R1, #123
21840 MOV R2, #255
21850 SWI "OS_Byte"
21860 CMP R1, #255
21870 BNE p2_not_left
21880 SUB R10,R10, #4
21890 ORR R8,R8, #1
21900 .p2_not_left
21910 :
21920 CMP R10, #128
21930 BEQ p2_sideways
21940 BGT p2_right
21950 MOV R1,R6, LSR #2
21960 MOV R2,R7, LSR #2
21970 SUB R1,R1, #1
21980 ADD R2,R2, #8
21990 BL read_point
22000 CMP R0, #0
22010 MOVNE R10, #128
22020 MOV R1,R6, LSR #2
22030 MOV R2,R7, LSR #2
22040 SUB R1,R1, #1
22050 ADD R2,R2, #yext%-2
22060 BL read_point
22070 CMP R0, #0
22080 MOVNE R10, #128
22090 B p2_sideways
22100 .p2_right
22110 MOV R1,R6, LSR #2
22120 MOV R2,R7, LSR #2
22130 ADD R1,R1, #xext%
22140 ADD R2,R2, #8
22150 BL read_point
22160 CMP R0, #0
22170 MOVNE R10, #128
22180 MOV R1,R6, LSR #2
22190 MOV R2,R7, LSR #2
22200 ADD R1,R1, #xext%
22210 ADD R2,R2, #yext%-2
22220 BL read_point
22230 CMP R0, #0
22240 MOVNE R10, #128
22250 B p2_sideways
22260 .p2_sideways
22270 CMP R10, #128+25*2
22280 MOVGT R10, #128+25*2
22290 CMP R10, #128-25*2
22300 MOVLT R10, #128-25*2
22310 CMP R10, #128
22320 ADDLT R10,R10, #1
22330 SUBGT R10,R10, #1
22340 BIC R8,R8, #255<<8
22350 ORR R8,R8,R10, LSL #8
22360 SUB R10,R10, #128
22370 ADD R6,R6,R10, ASR #3
22380 :
22390 AND R10,R8, #255<<16
22400 MOV R10,R10, LSR #16
22410 :
22420 MOV R1,R6, LSR #2
22430 MOV R2,R7, LSR #2
22440 ADD R1,R1, #xext%/2
22450 ADD R2,R2, #yext%
22460 BL read_point
22470 CMP R0, #0
22480 BNE p2_not_up
22490;MOV R1,R6, LSR #2
22500;MOV R2,R7, LSR #2
22510;ADD R1,R1, #xext%/2
22520;ADD R2,R2, #yext%
22530;BL read_point
22540;CMP R0, #0
22550;BNE p2_not_up
22560 MOV R0, #129
22570 MOV R1, #0
22580 SUB R1,R1, #27
22590 MOV R2, #255
22600 SWI "OS_Byte"
22610 CMP R1, #255
22620 ADDEQ R10,R10, #4
22630 .p2_not_up
22640 :
22650 MOV R1,R6, LSR #2
22660 MOV R2,R7, LSR #2
22670 ADD R1,R1, #xext%-2
22680 BL read_point
22690 CMP R0, #0
22700 BNE p2_not_down
22710 MOV R1,R6, LSR #2
22720 MOV R2,R7, LSR #2
22730 ADD R1,R1, #2
22740 BL read_point
22750 CMP R0, #0
22760 BNE p2_not_down
22770 MOV R0, #129
22780 MOV R1, #0
22790 SUB R1,R1, #109
22800 MOV R2, #255
22810 SWI "OS_Byte"
22820 CMP R1, #255
22830 SUBEQ R10,R10, #2
22840 .p2_not_down
22850 :
22860 SUB R10,R10, #1
22870 :
22880 CMP R10, #128
22890 BEQ p2_ud
22900 BGT p2_up
22910 MOV R1,R6, LSR #2
22920 MOV R2,R7, LSR #2
22930 ADD R1,R1, #xext%/2
22940 SUB R2,R2, #1
22950 BL read_point
22960 CMP R0, #0
22970 MOVNE R10, #128
22980 B p2_ud
22990 .p2_up
23000 MOV R1,R6, LSR #2
23010 MOV R2,R7, LSR #2
23020 ADD R1,R1, #xext%/2+2
23030 ADD R2,R2, #yext%
23040 BL read_point
23050 CMP R0, #0
23060 MOVNE R10, #128
23070 MOV R1,R6, LSR #2
23080 MOV R2,R7, LSR #2
23090 ADD R1,R1, #xext%/2-2
23100 ADD R2,R2, #yext%
23110 BL read_point
23120 CMP R0, #0
23130 MOVNE R10, #128
23140 B p2_ud
23150 .p2_ud
23160 CMP R10, #128+11*4
23170 MOVGT R10, #128+11*4
23180 CMP R10, #128-8*4
23190 MOVLT R10, #128-8*4
23200 CMP R10, #128
23210 BIC R8,R8, #255<<16
23220 ORR R8,R8,R10, LSL #16
23230 SUB R10,R10, #128
23240 ADD R7,R7,R10, ASR #2
23250 :
23260 LDR R0, adr_p2_weapon
23270 LDR R0,[R0]
23310 CMP R0, #2
23320 BEQ p2_fire_pistol
23330 CMP R0, #3
23340 BEQ p2_fire_gun
23350 CMP R0, #4
23360 BEQ p2_fire_mortar
23370 CMP R0, #5
23380 BEQ p2_fire_homing
23390 CMP R0, #6
23400 BEQ p2_fire_seeking
23410 CMP R0, #7
23420 BEQ p2_fire_vertical
23430 CMP R0, #8
23440 BEQ p2_fire_flame
23450 CMP R0, #9
23460 BEQ p2_fire_bomb
23470 CMP R0, #10
23480 BEQ p2_fire_cluster
23490 :
23500 .p2_fire_pistol
23510 LDR R0, p2_fire
23520 CMP R0, #0
23530 BEQ p2_pistol_shot
23540 MOV R0, #129
23550 MOV R1, #0
23560 SUB R1,R1, #59
23570 MOV R2, #255
23580 SWI "OS_Byte"
23590 CMP R1, #255
23600 MOVNE R0, #0
23610 STRNE R0, p2_fire
23620 B p2_not_fire_pistol
23630 .p2_pistol_shot
23640 MOV R0, #129
23650 MOV R1, #0
23660 SUB R1,R1, #59
23670 MOV R2, #255
23680 SWI "OS_Byte"
23690 CMP R1, #255
23700 BNE p2_not_fire_pistol
23710 MOV R0, #2
23720 MOV R1,R6, LSR #2
23730 MOV R2,R7, LSR #2
23740 ADD R1,R1, #xext%
23750 ADD R2,R2, #yext%/4*2
23760 RSB R2,R2, #256
23770 MOV R3, #80
23780 MOV R4, #0
23790 MOV R5, #0
23800 TST R8, #1
23810 RSBNE R3,R3, #0
23820 SUBNE R1,R1, #xext%
23830 BL add_cell
23840 MOV R5, #2
23850 MOV R0, #1
23860 STR R0, p2_fire
23870 MOV R0, #7
23880 MVN R1, #14
23890 MOV R2, #12800
23900 MOV R3, #0
23910 SWI "Sound_Control"
23920 .p2_not_fire_pistol
23930 B p2_end_fire
23940 :
23950 .p2_fire_gun
23960 MOV R0, #129
23970 MOV R1, #0
23980 SUB R1,R1, #59
23990 MOV R2, #255
24000 SWI "OS_Byte"
24010 CMP R1, #255
24020 BNE p2_not_fire_gun
24030 LDR R0, p2_fire
24040 ADD R0,R0, #1
24050 AND R0,R0, #%11
24060 STR R0, p2_fire
24070 TST R0, #%11
24080 BNE p2_not_fire_gun
24090 MOV R0, #3
24100 MOV R1,R6, LSR #2
24110 MOV R2,R7, LSR #2
24120 ADD R1,R1, #xext%
24130 ADD R2,R2, #yext%/4*2
24140 RSB R2,R2, #256
24150 MOV R3, #80
24160 LDR R5, adr_rnd
24170 LDR R5,[R5]
24180 AND R4,R5, #%1111
24190 SUB R4,R4, #%0111
24200 AND R5,R5, #%110000
24210 MOV R5,R5, LSR #4
24220 ADD R1,R1,R5
24230 MOV R5, #0
24240 TST R8, #1
24250 RSBNE R3,R3, #0
24260 SUBNE R1,R1, #xext%+2
24270 BL add_cell
24280 MOV R5, #2
24290 MOV R0, #gun_sound%
24300 MVN R1, #10
24310 MOV R2, #gun_rate%
24320 MOV R3, #0
24330 SWI "Sound_Control"
24340 .p2_not_fire_gun
24350 B p2_end_fire
24360 :
24370 .p2_fire_mortar
24380;LDR R0, p2_fire
24390;CMP R0, #0
24400;BEQ p2_mortar_shot
24410;MOV R0, #129
24420;MOV R1, #0
24430;SUB R1,R1, #59
24440;MOV R2, #255
24450;SWI "OS_Byte"
24460;CMP R1, #255
24470;MOVNE R0, #0
24480;STRNE R0, p2_fire
24490;B p2_not_fire_mortar
24500;.p2_mortar_shot
24510 MOV R0, #129
24520 MOV R1, #0
24530 SUB R1,R1, #59
24540 MOV R2, #255
24550 SWI "OS_Byte"
24560 CMP R1, #255
24570 BNE p2_not_fire_mortar
24580 LDR R0, p2_fire
24590 ADD R0,R0, #1
24600 AND R0,R0, #%11111
24610 STR R0, p2_fire
24620 TST R0, #%11111
24630 BNE p2_not_fire_mortar
24640 MOV R0, #4
24650 MOV R1,R6, LSR #2
24660 MOV R2,R7, LSR #2
24670 ADD R1,R1, #xext%
24680 ADD R2,R2, #yext%/4*2
24690 RSB R2,R2, #256
24700 MOV R3, #30
24710 MOV R4, #40
24720 MOV R5, #0
24730 TST R8, #1
24740 RSBNE R3,R3, #0
24750 SUBNE R1,R1, #xext%
24760 BL add_cell
24770 MOV R5, #2
24780 MOV R0, #1
24790 STR R0, p2_fire
24800 .p2_not_fire_mortar
24810 B p2_end_fire
24820 :
24830 .p2_fire_homing
24840 .p2_homing_shot
24850 MOV R0, #129
24860 MOV R1, #0
24870 SUB R1,R1, #59
24880 MOV R2, #255
24890 SWI "OS_Byte"
24900 CMP R1, #255
24910 BNE p2_not_fire_homing
24920 LDR R0, p2_fire
24930 ADD R0,R0, #1
24940 AND R0,R0, #%1111
24950 STR R0, p2_fire
24960 TST R0, #%1111
24970 BNE p2_not_fire_homing
24980 MOV R0, #5
24990 MOV R1,R6, LSR #2
25000 MOV R2,R7, LSR #2
25010 ADD R1,R1, #xext%
25020 ADD R2,R2, #yext%/4*2
25030 RSB R2,R2, #256
25040 MOV R3, #64
25050 LDR R4, adr_rnd
25060 LDR R4,[R4]
25070 AND R4,R4, #15
25080 SUB R4,R4, #7
25090 MOV R5, #224<<8 ; Homing in on player 1
25100 TST R8, #1
25110 RSBNE R3,R3, #0
25120 SUBNE R1,R1, #xext%
25130 BL add_cell
25140 MOV R5, #7
25150 MOV R0, #homing_sound%
25160 MVN R1, #8
25170 MOV R2, #homing_rate%
25180 MOV R3, #0
25190 SWI "Sound_Control"
25200 .p2_not_fire_homing
25210 B p2_end_fire
25220 :
25230 .p2_fire_seeking
25240 .p2_seeking_shot
25250 MOV R0, #129
25260 MOV R1, #0
25270 SUB R1,R1, #59
25280 MOV R2, #255
25290 SWI "OS_Byte"
25300 CMP R1, #255
25310 BNE p2_not_fire_seeking
25320 MOV R0, #6
25330 MOV R1,R6, LSR #2
25340 MOV R2,R7, LSR #2
25350 ADD R1,R1, #xext%*3/2
25360 ADD R2,R2, #yext%/4*2
25370 RSB R2,R2, #256
25380 MOV R3, #32
25390 MOV R4, #0
25400 MOV R5, #0 ; Homing in on player 1
25410 TST R8, #1
25420 RSBNE R3,R3, #0
25430 SUBNE R1,R1, #xext%*2
25440 BL add_cell
25450 MOV R5, #2
25460 MOV R9, #2
25470 LDR R10, adr_p2_weapon
25480 STR R9,[R10]
25490 MOV R0, #seeking_sound%
25500 MVN R1, #14
25510 MOV R2, #seeking_rate%
25520 MOV R3, #0
25530 SWI "Sound_Control"
25540 MOV R0, #1
25550 STR R0, p2_fire
25560 .p2_not_fire_seeking
25570 B p2_end_fire
25580 :
25590 .p2_fire_vertical
25600 LDR R0, p2_fire
25610 CMP R0, #0
25620 BEQ p2_vertical_shot
25630 MOV R0, #129
25640 MOV R1, #0
25650 SUB R1,R1, #59
25660 MOV R2, #255
25670 SWI "OS_Byte"
25680 CMP R1, #255
25690 MOVNE R0, #0
25700 STRNE R0, p2_fire
25710 B p2_not_fire_vertical
25720 .p2_vertical_shot
25730 MOV R0, #129
25740 MOV R1, #0
25750 SUB R1,R1, #59
25760 MOV R2, #255
25770 SWI "OS_Byte"
25780 CMP R1, #255
25790 BNE p2_not_fire_vertical
25800 MOV R0, #7
25810 MOV R1,R6, LSR #2
25820 MOV R2,R7, LSR #2
25830 ADD R1,R1, #xext%
25840 ADD R2,R2, #yext%/4*2
25850 RSB R2,R2, #256
25860 MOV R3, #0
25870 MOV R4, #64
25880 MOV R5, #0
25890 TST R8, #1
25900 RSBNE R3,R3, #0
25910 SUBNE R1,R1, #xext%
25920 BL add_cell
25930 MOV R5, #2
25940 MOV R0, #1
25950 STR R0, p2_fire
25960 MOV R0, #7
25970 MVN R1, #14
25980 MOV R2, #10240
25990 MOV R3, #0
26000 SWI "Sound_Control"
26010 .p2_not_fire_vertical
26020 B p2_end_fire
26030 :
26040 .p2_fire_flame
26050 MOV R0, #129
26060 MOV R1, #0
26070 SUB R1,R1, #59
26080 MOV R2, #255
26090 SWI "OS_Byte"
26100 CMP R1, #255
26110 BNE p2_not_fire_flame
26120 MOV R0, #10
26130 MOV R1,R6, LSR #2
26140 MOV R2,R7, LSR #2
26150 ADD R1,R1, #xext%
26160 ADD R2,R2, #yext%/4*2
26170 RSB R2,R2, #256
26180 MOV R3, #72
26190 LDR R4, adr_rnd
26200 LDR R4,[R4]
26210 AND R4,R4, #7
26220 SUB R4,R4, #1
26230 MOV R5,R5, LSR #4
26240 ADD R1,R1,R5
26250 MOV R5, #0
26260 TST R8, #1
26270 RSBNE R3,R3, #0
26280 SUBNE R1,R1, #xext%
26290 BL add_cell
26300 .p2_not_fire_flame
26310 B p2_end_fire
26320 :
26330 .p2_fire_bomb
26340 MOV R0, #129
26350 MOV R1, #0
26360 SUB R1,R1, #59
26370 MOV R2, #255
26380 SWI "OS_Byte"
26390 CMP R1, #255
26400 BNE p2_not_fire_bomb
26410 LDR R0, p2_fire
26420 ADD R0,R0, #1
26430 CMP R0, #10
26440 MOVGT R0, #0
26450 STR R0, p2_fire
26460 CMP R0, #0
26470 BNE p2_not_fire_bomb
26480 MOV R0, #12
26490 MOV R1,R6, LSR #2
26500 MOV R2,R7, LSR #2
26510 ADD R1,R1, #xext%+1
26520 ADD R2,R2, #yext%/4*2
26530 RSB R2,R2, #256
26540 MOV R3, #40
26550 MOV R4, #40
26560 MOV R5, #bomb_pause%
26570 TST R8, #1
26580 RSBNE R3,R3, #0
26590 SUBNE R1,R1, #xext%+2
26600 BL add_cell
26610 MOV R5, #2
26620 MOV R0, #1
26630 STR R0, p2_fire
26640 .p2_not_fire_bomb
26650 B p2_end_fire
26660 :
26670 .p2_fire_cluster
26680 MOV R0, #129
26690 MOV R1, #0
26700 SUB R1,R1, #59
26710 MOV R2, #255
26720 SWI "OS_Byte"
26730 CMP R1, #255
26740 BNE p2_not_fire_cluster
26840 MOV R0, #13
26850 MOV R1,R6, LSR #2
26860 MOV R2,R7, LSR #2
26870 ADD R1,R1, #xext%+1
26880 ADD R2,R2, #yext%/4*2
26890 RSB R2,R2, #256
26900 MOV R3, #512
26910 MOV R4, #128
26920 MOV R5, #bomb_pause%*.25
26930 TST R8, #1
26940 RSBNE R3,R3, #0
26950 SUBNE R1,R1, #xext%+2
26960 BL add_cell
26970 ADD R3,R3, #64
26980 ADD R4,R4, #64
26990 ADD R5,R5, #32
27000 BL add_cell
27010 ADD R3,R3, #64
27020 ADD R4,R4, #64
27030 ADD R5,R5, #32
27040 BL add_cell
27050 MOV R9, #2
27060 LDR R10, adr_p2_weapon
27070 STR R9,[R10]
27080 MOV R5, #2
27090 MOV R0, #1
27100 STR R0, p2_fire
27110 .p2_not_fire_cluster
27120 B p2_end_fire
27130 :
27140 .p2_end_fire
27150 :
27160 MOV R0, #1
27170 MOV R1,R6, LSR #2
27180 MOV R2,R7, LSR #2
27190 TST R8, #1
27200 ADDNE R1,R1, #xext%
27210 ADD R2,R2, #yext%/4
27220 RSB R2,R2, #256
27230 LDR R3, adr_rnd
27240 LDR R3,[R3]
27250 TST R3, #%10000
27260 SUBEQ R2,R2, #1
27270 AND R3,R3, #15
27280 SUB R3,R3, #7
27290 MOV R4, #0
27300 SUB R4,R4, #40
27310 MOV R5, #32
27320 BL add_cell
27330 MOV R5, #2
27340 :
27350 AND R0,R8, #1
27360 ADD R0,R0, #2
27370 MOV R1,R6, LSR #2
27380 MOV R2,R7, LSR #2
27390 LDR R3, adr_p2_x
27400 STR R1,[R3]
27410 LDR R3, adr_p2_y
27420 STR R2,[R3]
27430 BL plot_sprite_1616
27440 :
27450 LDMFD R13!,{R9,PC}
27460 :
27470 .adr_p2_x
27480 EQUD p2_x
27490 .adr_p2_y
27500 EQUD p2_y
27510 .adr_p2_weapon
27520 EQUD p2_weapon
27530 .adr_p1_weapon
27540 EQUD p1_weapon
27550 .p1_fire
27560 EQUD 0
27570 .explode_1
27580 EQUD 0
27590 :
27600 .player1
27610 STMFD R13!,{R9,R14}
27620 :
27630 CMP R6, #32
27640 MOVLT R6, #32
27650 CMP R7, #32
27660 MOVLT R7, #32
27670 CMP R6, #1280-64
27680 MOVGT R6, #1280-64
27690 CMP R7, #1024-64
27700 MOVGT R7, #1024-64
27710 :
27720 LDR R0, player1_alive
27730 CMP R0, #0
27740 BEQ play_player1
27750 BNE explode_player1
27760 :
27770 .explode_player1
27780 LDR R0, explode_1
27790 ADD R0,R0, #1
27800 STR R0, explode_1
27810 CMP R0, #7<<3
27820 STRGT R0, end_game
27830 LDMGTFD R13!,{R9,PC}
27840 CMP R0, #7<<1
27850 LDMGTFD R13!,{R9,PC}
27860 MOV R0,R0, ASR #1
27870 MOV R1,R6, ASR #2
27880 MOV R2,R7, ASR #2
27890 SUB R1,R1, #4
27900 BL plot_sprite_2016
27910 :
27920 LDMFD R13!,{R9,PC}
27930 :
27940 .play_player1
27950 :
27960 MOV R1,R6, LSR #2
27970 MOV R2,R7, LSR #2
27980 ADD R1,R1, #xext%/2
27990 BL read_point
28000 CMP R0, #0
28010 SUBEQ R7,R7, #4
28020 :
28030 MOV R1,R6, LSR #2
28040 MOV R2,R7, LSR #2
28050 ADD R1,R1, #xext%/3
28060 BL read_point
28070 CMP R0, #0
28080 ADDNE R7,R7, #4
28090 :
28100 MOV R1,R6, LSR #2
28110 MOV R2,R7, LSR #2
28120 ADD R1,R1, #xext%/3*2
28130 BL read_point
28140 CMP R0, #0
28150 ADDNE R7,R7, #4
28160 :
28170 AND R10,R8, #255<<8
28180 MOV R10,R10, LSR #8
28190 :
28200 MOV R1,R6, LSR #2
28210 MOV R2,R7, LSR #2
28220 ADD R1,R1, #xext%-1
28230 ADD R2,R2, #8
28240 BL read_point
28250 CMP R0, #0
28260 BNE p1_not_right
28270 MOV R1,R6, LSR #2
28280 MOV R2,R7, LSR #2
28290 ADD R1,R1, #xext%
28300 ADD R2,R2, #yext%-2
28310 BL read_point
28320 CMP R0, #0
28330 BNE p1_not_right
28340 MOV R0, #129
28350 MOV R1, #0
28360 SUB R1,R1, #67
28370 MOV R2, #255
28380 SWI "OS_Byte"
28390 CMP R1, #255
28400 BNE p1_not_right
28410 ADD R10,R10, #4
28420 BIC R8,R8, #1
28430 .p1_not_right
28440 :
28450 MOV R1,R6, LSR #2
28460 MOV R2,R7, LSR #2
28470 SUB R1,R1, #1
28480 ADD R2,R2, #8
28490 BL read_point
28500 CMP R0, #0
28510 BNE p1_not_left
28520 MOV R1,R6, LSR #2
28530 MOV R2,R7, LSR #2
28540 SUB R1,R1, #1
28550 ADD R2,R2, #yext%-2
28560 BL read_point
28570 CMP R0, #0
28580 BNE p1_not_left
28590 MOV R0, #129
28600 MOV R1, #0
28610 SUB R1,R1, #98
28620 MOV R2, #255
28630 SWI "OS_Byte"
28640 CMP R1, #255
28650 BNE p1_not_left
28660 SUB R10,R10, #4
28670 ORR R8,R8, #1
28680 .p1_not_left
28690 :
28700 CMP R10, #128
28710 BEQ p1_sideways
28720 BGT p1_right
28730 MOV R1,R6, LSR #2
28740 MOV R2,R7, LSR #2
28750 SUB R1,R1, #1
28760 ADD R2,R2, #8
28770 BL read_point
28780 CMP R0, #0
28790 MOVNE R10, #128
28800 MOV R1,R6, LSR #2
28810 MOV R2,R7, LSR #2
28820 SUB R1,R1, #1
28830 ADD R2,R2, #yext%-2
28840 BL read_point
28850 CMP R0, #0
28860 MOVNE R10, #128
28870 B p1_sideways
28880 .p1_right
28890 MOV R1,R6, LSR #2
28900 MOV R2,R7, LSR #2
28910 ADD R1,R1, #xext%
28920 ADD R2,R2, #8
28930 BL read_point
28940 CMP R0, #0
28950 MOVNE R10, #128
28960 MOV R1,R6, LSR #2
28970 MOV R2,R7, LSR #2
28980 ADD R1,R1, #xext%
28990 ADD R2,R2, #yext%-2
29000 BL read_point
29010 CMP R0, #0
29020 MOVNE R10, #128
29030 B p1_sideways
29040 .p1_sideways
29050 CMP R10, #128+25*2
29060 MOVGT R10, #128+25*2
29070 CMP R10, #128-25*2
29080 MOVLT R10, #128-25*2
29090 CMP R10, #128
29100 ADDLT R10,R10, #1
29110 SUBGT R10,R10, #1
29120 BIC R8,R8, #255<<8
29130 ORR R8,R8,R10, LSL #8
29140 SUB R10,R10, #128
29150 ADD R6,R6,R10, ASR #3
29160 :
29170 AND R10,R8, #255<<16
29180 MOV R10,R10, LSR #16
29190 :
29200 MOV R1,R6, LSR #2
29210 MOV R2,R7, LSR #2
29220 ADD R1,R1, #xext%/2+1
29230 ADD R2,R2, #yext%
29240 BL read_point
29250 CMP R0, #0
29260 BNE p1_not_up
29270 MOV R1,R6, LSR #2
29280 MOV R2,R7, LSR #2
29290 ADD R1,R1, #xext%/2-1
29300 ADD R2,R2, #yext%
29310 BL read_point
29320 CMP R0, #0
29330 BNE p1_not_up
29340 MOV R0, #129
29350 MOV R1, #0
29360 SUB R1,R1, #68
29370 MOV R2, #255
29380 SWI "OS_Byte"
29390 CMP R1, #255
29400 ADDEQ R10,R10, #4
29410 .p1_not_up
29420 :
29430 MOV R1,R6, LSR #2
29440 MOV R2,R7, LSR #2
29450 ADD R1,R1, #xext%-2
29460 BL read_point
29470 CMP R0, #0
29480 BNE p1_not_down
29490 MOV R1,R6, LSR #2
29500 MOV R2,R7, LSR #2
29510 ADD R1,R1, #2
29520 BL read_point
29530 CMP R0, #0
29540 BNE p1_not_down
29550 MOV R0, #129
29560 MOV R1, #0
29570 SUB R1,R1, #83
29580 MOV R2, #255
29590 SWI "OS_Byte"
29600 CMP R1, #255
29610 SUBEQ R10,R10, #2
29620 .p1_not_down
29630 :
29640 SUB R10,R10, #1
29650 :
29660 CMP R10, #128
29670 BEQ p1_ud
29680 BGT p1_up
29690 MOV R1,R6, LSR #2
29700 MOV R2,R7, LSR #2
29710 ADD R1,R1, #xext%/2
29720 SUB R2,R2, #1
29730 BL read_point
29740 CMP R0, #0
29750 MOVNE R10, #128
29760 B p1_ud
29770 .p1_up
29780 MOV R1,R6, LSR #2
29790 MOV R2,R7, LSR #2
29800 ADD R1,R1, #xext%/2+2
29810 ADD R2,R2, #yext%
29820 BL read_point
29830 CMP R0, #0
29840 MOVNE R10, #128
29850 MOV R1,R6, LSR #2
29860 MOV R2,R7, LSR #2
29870 ADD R1,R1, #xext%/2-2
29880 ADD R2,R2, #yext%
29890 BL read_point
29900 CMP R0, #0
29910 MOVNE R10, #128
29920 B p1_ud
29930 .p1_ud
29940 CMP R10, #128+10*4
29950 MOVGT R10, #128+10*4
29960 CMP R10, #128-8*4
29970 MOVLT R10, #128-8*4
29980 CMP R10, #128
29990 BIC R8,R8, #255<<16
30000 ORR R8,R8,R10, LSL #16
30010 SUB R10,R10, #128
30020 ADD R7,R7,R10, ASR #2
30030 :
30040 LDR R0, adr_p1_weapon
30050 LDR R0,[R0]
30060 CMP R0, #2
30070 BEQ p1_fire_pistol
30080 CMP R0, #3
30090 BEQ p1_fire_gun
30100 CMP R0, #4
30110 BEQ p1_fire_mortar
30120 CMP R0, #5
30130 BEQ p1_fire_homing
30140 CMP R0, #6
30150 BEQ p1_fire_seeking
30160 CMP R0, #7
30170 BEQ p1_fire_vertical
30180 CMP R0, #8
30190 BEQ p1_fire_flame
30200 CMP R0, #9
30210 BEQ p1_fire_bomb
30220 CMP R0, #10
30230 BEQ p1_fire_cluster
30240 :
30250 .p1_fire_pistol
30260 LDR R0, p1_fire
30270 CMP R0, #0
30280 BEQ p1_pistol_shot
30290 MOV R0, #129
30300 MOV R1, #0
30310 SUB R1,R1, #84
30320 MOV R2, #255
30330 SWI "OS_Byte"
30340 CMP R1, #255
30350 MOVNE R0, #0
30360 STRNE R0, p1_fire
30370 B p1_not_fire_pistol
30380 .p1_pistol_shot
30390 MOV R0, #129
30400 MOV R1, #0
30410 SUB R1,R1, #84
30420 MOV R2, #255
30430 SWI "OS_Byte"
30440 CMP R1, #255
30450 BNE p1_not_fire_pistol
30460 MOV R0, #2
30470 MOV R1,R6, LSR #2
30480 MOV R2,R7, LSR #2
30490 ADD R1,R1, #xext%
30500 ADD R2,R2, #yext%/4*2
30510 RSB R2,R2, #256
30520 MOV R3, #80
30530 MOV R4, #0
30540 MOV R5, #1
30550 TST R8, #1
30560 RSBNE R3,R3, #0
30570 SUBNE R1,R1, #xext%
30580 BL add_cell
30590 MOV R5, #1
30600 MOV R0, #1
30610 STR R0, p1_fire
30620 MOV R0, #7
30630 MVN R1, #14
30640 MOV R2, #12800
30650 MOV R3, #0
30660 SWI "Sound_Control"
30670 .p1_not_fire_pistol
30680 B p1_end_fire
30690 :
30700 .p1_fire_gun
30710 MOV R0, #129
30720 MOV R1, #0
30730 SUB R1,R1, #84
30740 MOV R2, #255
30750 SWI "OS_Byte"
30760 CMP R1, #255
30770 BNE p1_not_fire_gun
30780 LDR R0, p1_fire
30790 ADD R0,R0, #1
30800 AND R0,R0, #%11
30810 STR R0, p1_fire
30820 TST R0, #%11
30830 BNE p1_not_fire_gun
30840 MOV R0, #3
30850 MOV R1,R6, LSR #2
30860 MOV R2,R7, LSR #2
30870 ADD R1,R1, #xext%
30880 ADD R2,R2, #yext%/4*2
30890 RSB R2,R2, #256
30900 MOV R3, #80
30910 LDR R5, adr_rnd
30920 LDR R5,[R5]
30930 AND R4,R5, #15
30940 SUB R4,R4, #7
30950 AND R5,R5, #%110000
30960 MOV R5,R5, LSR #4
30970 ADD R1,R1,R5
30980 MOV R5, #1
30990 TST R8, #1
31000 RSBNE R3,R3, #0
31010 SUBNE R1,R1, #xext%+2
31020 BL add_cell
31030 MOV R5, #1
31040 MOV R0, #gun_sound%
31050 MVN R1, #10
31060 MOV R2, #gun_rate%
31070 MOV R3, #0
31080 SWI "Sound_Control"
31090 .p1_not_fire_gun
31100 B p1_end_fire
31110 :
31120 .p1_fire_mortar
31130 MOV R0, #129
31140 MOV R1, #0
31150 SUB R1,R1, #84
31160 MOV R2, #255
31170 SWI "OS_Byte"
31180 CMP R1, #255
31190 BNE p1_not_fire_mortar
31200 LDR R0, p1_fire
31210 ADD R0,R0, #1
31220 AND R0,R0, #%11111
31230 STR R0, p1_fire
31240 TST R0, #%11111
31250 BNE p1_not_fire_gun
31260 MOV R0, #4
31270 MOV R1,R6, LSR #2
31280 MOV R2,R7, LSR #2
31290 ADD R1,R1, #xext%
31300 ADD R2,R2, #yext%/4*2
31310 RSB R2,R2, #256
31320 MOV R3, #30
31330 MOV R4, #40
31340 MOV R5, #1
31350 TST R8, #1
31360 RSBNE R3,R3, #0
31370 SUBNE R1,R1, #xext%
31380 BL add_cell
31390 MOV R5, #1
31400 MOV R0, #1
31410 STR R0, p1_fire
31420 .p1_not_fire_mortar
31430 B p1_end_fire
31440 :
31450 .p1_fire_homing
31460 .p1_homing_shot
31470 MOV R0, #129
31480 MOV R1, #0
31490 SUB R1,R1, #84
31500 MOV R2, #255
31510 SWI "OS_Byte"
31520 CMP R1, #255
31530 BNE p1_not_fire_homing
31540 LDR R0, p1_fire
31550 ADD R0,R0, #1
31560 AND R0,R0, #%1111
31570 STR R0, p1_fire
31580 TST R0, #%1111
31590 BNE p1_not_fire_homing
31600 MOV R0, #5
31610 MOV R1,R6, LSR #2
31620 MOV R2,R7, LSR #2
31630 ADD R1,R1, #xext%
31640 ADD R2,R2, #yext%/2
31650 RSB R2,R2, #256
31660 MOV R3, #64
31670 LDR R4, adr_rnd
31680 LDR R4,[R4]
31690 AND R4,R4, #15
31700 SUB R4,R4, #7
31710 MOV R5, #224<<8 ; Homing in on player 2
31720 ORR R5,R5, #1
31730 TST R8, #1
31740 RSBNE R3,R3, #0
31750 SUBNE R1,R1, #xext%
31760 BL add_cell
31770 MOV R5, #1
31780 MOV R0, #homing_sound%
31790 MVN R1, #10
31800 MOV R2, #homing_rate%
31810 MOV R3, #0
31820 SWI "Sound_Control"
31830 .p1_not_fire_homing
31840 B p1_end_fire
31850 :
31860 .p1_fire_seeking
31870 .p1_seeking_shot
31880 MOV R0, #129
31890 MOV R1, #0
31900 SUB R1,R1, #84
31910 MOV R2, #255
31920 SWI "OS_Byte"
31930 CMP R1, #255
31940 BNE p1_not_fire_seeking
31950 MOV R0, #6
31960 MOV R1,R6, LSR #2
31970 MOV R2,R7, LSR #2
31980 ADD R1,R1, #xext%*3/2
31990 ADD R2,R2, #yext%/4*2
32000 RSB R2,R2, #256
32010 MOV R3, #32
32020 MOV R4, #0
32030 MOV R5, #1 ; Homing in on player 2
32040 TST R8, #1
32050 RSBNE R3,R3, #0
32060 SUBNE R1,R1, #xext%*2
32070 BL add_cell
32080 MOV R5, #1
32090 MOV R9, #2
32100 LDR R10, adr_p1_weapon
32110 STR R9,[R10]
32120 MOV R0, #seeking_sound%
32130 MVN R1, #14
32140 MOV R2, #seeking_rate%
32150 MOV R3, #0
32160 SWI "Sound_Control"
32170 MOV R0, #1
32180 STR R0, p1_fire
32190 .p1_not_fire_seeking
32200 B p1_end_fire
32210 :
32220 .p1_fire_vertical
32230 LDR R0, p1_fire
32240 CMP R0, #0
32250 BEQ p1_vertical_shot
32260 MOV R0, #129
32270 MOV R1, #0
32280 SUB R1,R1, #84
32290 MOV R2, #255
32300 SWI "OS_Byte"
32310 CMP R1, #255
32320 MOVNE R0, #0
32330 STRNE R0, p1_fire
32340 B p1_not_fire_vertical
32350 .p1_vertical_shot
32360 MOV R0, #129
32370 MOV R1, #0
32380 SUB R1,R1, #84
32390 MOV R2, #255
32400 SWI "OS_Byte"
32410 CMP R1, #255
32420 BNE p1_not_fire_vertical
32430 MOV R0, #7
32440 MOV R1,R6, LSR #2
32450 MOV R2,R7, LSR #2
32460 ADD R1,R1, #xext%
32470 ADD R2,R2, #yext%/4*2
32480 RSB R2,R2, #256
32490 MOV R3, #0
32500 MOV R4, #64
32510 MOV R5, #1
32520 TST R8, #1
32530 RSBNE R3,R3, #0
32540 SUBNE R1,R1, #xext%
32550 BL add_cell
32560 MOV R5, #2
32570 MOV R0, #1
32580 STR R0, p1_fire
32590 MOV R0, #7
32600 MVN R1, #14
32610 MOV R2, #10240
32620 MOV R3, #0
32630 SWI "Sound_Control"
32640 .p1_not_fire_vertical
32650 B p1_end_fire
32660 :
32670 .p1_fire_flame
32680 .p1_flame_shot
32690 MOV R0, #129
32700 MOV R1, #0
32710 SUB R1,R1, #84
32720 MOV R2, #255
32730 SWI "OS_Byte"
32740 CMP R1, #255
32750 BNE p1_not_fire_flame
32760 MOV R0, #10
32770 MOV R1,R6, LSR #2
32780 MOV R2,R7, LSR #2
32790 ADD R1,R1, #xext%
32800 ADD R2,R2, #yext%/4*2
32810 RSB R2,R2, #256
32820 MOV R3, #64
32830 LDR R4, adr_rnd
32840 LDR R4,[R4]
32850 AND R4,R4, #7
32860 SUB R4,R4, #1
32870 MOV R5, #1
32880 TST R8, #1
32890 RSBNE R3,R3, #0
32900 SUBNE R1,R1, #xext%
32910 BL add_cell
32920 .p1_not_fire_flame
32930 B p1_end_fire
32940 :
32950 .p1_fire_cluster
32960 MOV R0, #129
32970 MOV R1, #0
32980 SUB R1,R1, #84
32990 MOV R2, #255
33000 SWI "OS_Byte"
33010 CMP R1, #255
33020 BNE p1_not_fire_cluster
33030; LDR R0, p1_fire
33040; ADD R0,R0, #1
33050; CMP R0, #25
33060; MOVGT R0, #0
33070; STR R0, p1_fire
33080; CMP R0, #0
33090; BNE p1_not_fire_cluster
33100 MOV R0, #13
33110 MOV R1,R6, LSR #2
33120 MOV R2,R7, LSR #2
33130 ADD R1,R1, #xext%+1
33140 ADD R2,R2, #yext%/4*2
33150 RSB R2,R2, #256
33160 MOV R3, #768
33170 MOV R4, #128
33180 MOV R5, #bomb_pause%*.25
33190 TST R8, #1
33200 RSBNE R3,R3, #0
33210 SUBNE R1,R1, #xext%+2
33220 BL add_cell
33230 SUB R3,R3, #128
33240 ADD R4,R4, #128
33250 ADD R5,R5, #32
33260 BL add_cell
33270 SUB R3,R3, #128
33280 ADD R4,R4, #128
33290 ADD R5,R5, #32
33300 BL add_cell
33310 MOV R9, #2
33320 LDR R10, adr_p1_weapon
33330 STR R9,[R10]
33340 MOV R5, #1
33350 MOV R0, #1
33360 STR R0, p1_fire
33370 .p1_not_fire_cluster
33380 B p1_end_fire
33390 :
33400 .p1_fire_bomb
33410 MOV R0, #129
33420 MOV R1, #0
33430 SUB R1,R1, #84
33440 MOV R2, #255
33450 SWI "OS_Byte"
33460 CMP R1, #255
33470 BNE p1_not_fire_bomb
33480 LDR R0, p1_fire
33490 ADD R0,R0, #1
33500 CMP R0, #10
33510 MOVGT R0, #0
33520 STR R0, p1_fire
33530 CMP R0, #0
33540 BNE p1_not_fire_bomb
33550 MOV R0, #12
33560 MOV R1,R6, LSR #2
33570 MOV R2,R7, LSR #2
33580 ADD R1,R1, #xext%+1
33590 ADD R2,R2, #yext%/4*2
33600 RSB R2,R2, #256
33610 MOV R3, #40
33620 MOV R4, #40
33630 MOV R5, #bomb_pause%
33640 TST R8, #1
33650 RSBNE R3,R3, #0
33660 SUBNE R1,R1, #xext%+2
33670 BL add_cell
33680 MOV R5, #1
33690 MOV R0, #1
33700 STR R0, p1_fire
33710 .p1_not_fire_bomb
33720 B p1_end_fire
33730 :
33740 .p1_end_fire
33750 :
33760 MOV R0, #1
33770 MOV R1,R6, LSR #2
33780 MOV R2,R7, LSR #2
33790 TST R8, #1
33800 ADDEQ R1,R1, #1
33810 ADDNE R1,R1, #xext%-1
33820 ADD R2,R2, #yext%/4
33830 RSB R2,R2, #256
33840 LDR R3, adr_rnd
33850 LDR R3,[R3]
33860 TST R3, #%10000
33870 SUBEQ R2,R2, #1
33880 AND R3,R3, #15
33890 SUB R3,R3, #7
33900 MOV R4, #0
33910 SUB R4,R4, #40
33920 MOV R5, #32
33930 BL add_cell
33940 MOV R5, #1
33950 :
33960 AND R0,R8, #1
33970 MOV R1,R6, LSR #2
33980 MOV R2,R7, LSR #2
33990 LDR R9, adr_p1_x
34000 STR R1,[R9]
34010 LDR R9, adr_p1_y
34020 STR R2,[R9]
34030 BL plot_sprite_1616
34040 :
34050 LDMFD R13!,{R9,PC}
34060 :
34070 .adr_rnd
34080 EQUD rnd
34090 .adr_p1_weapon
34100 EQUD p1_weapon
34110 .adr_p1_x
34120 EQUD p1_x
34130 .adr_p1_y
34140 EQUD p1_y
34150 :
34160 ]
34170 P%=clg_routine%
34180 L%=clg_routine%+1020
34190 [OPT pass%
34200 :
34210 .clg_adr_screenstore
34220 EQUD screenstore
34230 .clg_screendata
34240 EQUD screendata%
34250 :
34260 .clg
34270 STMFD R13!,{R0-R12,R14}
34280 ADR R0, clg_temp_reg_store
34290 STMIA R0, {R13,R14}
34300 LDR R13, clg_adr_screenstore
34310 LDR R13, [R13]
34320 LDR R14, clg_screendata
34330 MOV R12, #0
34340 .clg_loop1
34350 ]
34360 FOR a%=1 TO 26
34370 [OPT pass%
34380 LDMIA R14!,{R0-R11}
34390 STMIA R13!,{R0-R11}
34400 ]
34410 NEXT
34420 [OPT pass%
34430 ADD R12,R12, #1
34440 CMP R12, #65
34450 BLT clg_loop1
34460 ]
34470 FOR a%=1 TO 20
34480 [OPT pass%
34490 LDMIA R14!,{R0-R9}
34500 STMIA R13!,{R0-R9}
34510 ]
34520 NEXT
34530 [OPT pass%
34540 ADR R0, clg_temp_reg_store
34550 LDMIA R0, {R13,R14}
34560 LDMFD R13!,{R0-R12,PC}
34570 :
34580 .clg_temp_reg_store
34590 EQUD 0
34600 EQUD 0
34610 :
34620 ]
34630 P%=split_routine%
34640 L%=split_routine%+1020
34650 [OPT pass%
34660 :
34670 :
34680 .split_screenstore
34690 EQUD screenstore%
34700 .split_adr_screen
34710 EQUD screen
34720 .split_adr_p1_y
34730 EQUD p1_y
34740 .split_adr_p2_y
34750 EQUD p2_y
34760 .split_p1_y1
34770 EQUD 0
34780 .split_p2_y1
34790 EQUD 0
34800 .split_p1_y2
34810 EQUD 0
34820 .split_p2_y2
34830 EQUD 0
34840 .split_p1_y3
34850 EQUD 0
34860 .split_p2_y3
34870 EQUD 0
34880 :
34890 .split_screen
34900 STMFD R13!,{R0-R12,R14}
34910 ADR R0, split_temp_reg_store
34920 STMIA R0, {R13,R14}
34930 LDR R13, split_adr_screen
34940 LDR R13, [R13]
34950 MOV R12, #0
34960 LDR R0, split_adr_p1_y
34970 LDR R0,[R0]
34980 LDR R1, split_p1_y1
34990 LDR R2, split_p1_y2
35000 LDR R3, split_p1_y3
35010 STR R0, split_p1_y1
35020 STR R1, split_p1_y2
35030 STR R2, split_p1_y3
35040 ADD R0,R0,R1
35050 ADD R0,R0,R2
35060 ADD R0,R0,R3
35070 ADD R0,R0, #2
35080 MOV R0,R0, ASR #2
35090 RSB R0,R0, #256
35100 SUB R0,R0, #64
35110 CMP R0, #148
35120 MOVGT R0, #148
35130 CMP R0, #0
35140 MOVLT R0, #0
35150 LDR R14, split_screenstore
35160 MOV R1, #y_shift
35170 MLA R14,R1,R0,R14
35180 .split_loop1
35190 ]
35200 FOR a%=1 TO 10
35210 [OPT pass%
35220 LDMIA R14!,{R0-R11}
35230 STMIA R13!,{R0-R11}
35240 ]
35250 NEXT
35260 [OPT pass%
35270 ADD R12,R12, #1
35280 CMP R12, #72
35290 BLT split_loop1
35300 ]
35310 FOR a%=0 TO 11
35320 [OPT pass%
35330 MOV a%, #127
35340 ORR a%,a%,a%, LSL #8
35350 ORR a%,a%,a%, LSL #16
35360 ]
35370 NEXT
35380 [OPT pass%
35390 MOV R12, #0
35400 .split_loop3
35410 STMIA R13!,{R0-R11}
35420 ADD R12,R12, #1
35430 CMP R12, #280
35440 BLT split_loop3
35450 :
35460 LDR R13, split_adr_screen
35470 LDR R13, [R13]
35480 ADD R13,R13, #&B900
35490 MOV R12, #0
35500 LDR R0, split_adr_p2_y
35510 LDR R0,[R0]
35520 LDR R1, split_p2_y1
35530 LDR R2, split_p2_y2
35540 LDR R3, split_p2_y3
35550 STR R0, split_p2_y1
35560 STR R1, split_p2_y2
35570 STR R2, split_p2_y3
35580 ADD R0,R0,R1
35590 ADD R0,R0,R2
35600 ADD R0,R0,R3
35610 ADD R0,R0, #2
35620 MOV R0,R0, ASR #2
35630 RSB R0,R0, #256
35640 SUB R0,R0, #64
35650 CMP R0, #148
35660 MOVGT R0, #148
35670 CMP R0, #0
35680 MOVLT R0, #0
35690 LDR R14, split_screenstore
35700 MOV R1, #y_shift
35710 MLA R14,R1,R0,R14
35720 .split_loop2
35730 ]
35740 FOR a%=1 TO 10
35750 [OPT pass%
35760 LDMIA R14!,{R0-R11}
35770 STMIA R13!,{R0-R11}
35780 ]
35790 NEXT
35800 [OPT pass%
35810 ADD R12,R12, #1
35820 CMP R12, #72
35830 BLT split_loop2
35840 ADR R0, split_temp_reg_store
35850 LDMIA R0, {R13,R14}
35860 LDMFD R13!,{R0-R12,PC}
35870 :
35880 .split_temp_reg_store
35890 EQUD 0
35900 EQUD 0
35910 :
35920 :
35930 ]
35940 P%=sprite_routines%
35950 L%=sprite_routines%+8191
35960 [OPT pass%
35970 :
35980 :
35990 :
36000 .plot_sprite_1212
36010 :
36020 STMFD R13!,{R0-R12,R14}
36030 :
36040 : ; R0 sprite no.
36050 : ; R1 x-coord
36060 : ; R2 y-coord
36070 :
36080 RSB R2,R2, #256
36090 :
36100 CMP R1, #0
36110 BLE psm_no_plot1212
36120 CMP R2, #12
36130 BLE psm_no_plot1212
36140 CMP R1, #320-8
36150 BGE psm_no_plot1212
36160 CMP R2, #256
36170 BGE psm_no_plot1212
36180 B psm_plot1212
36190 .psm_no_plot1212
36200 LDMFD R13!,{R0-R12,PC}
36210 .psm_plot1212
36220 :
36230 AND R3,R1, #%11 ; calculate x offset
36240 MOV R0,R0, LSL #2 ; realise sprite
36250 ADD R0,R0, R3 ; add offset
36260 BIC R1,R1, #%11 ; make x div by 4
36270 :
36280 MOV R7, #x_shift ; get screen shifts
36290 MOV R8, #y_shift
36300 LDR R9, sprite_adr_screenstore; get screenstore address
36310 LDR R9,[R9]
36320 :
36330 MLA R3,R7,R1,R9
36340 MLA R2,R8,R2,R3
36350 :
36360 LDR R7, adr_sprites1 ; get start address of data
36370 LDR R8, spr_size1 ; get length of data for 1 sprite
36380 MLA R0,R8,R0,R7 ; calculate position of data
36390 ADD R1,R0,R8, LSR #1 ; calculate position of mask
36400 :
36410 MOV R3, #1
36420 STR R3, s1212_counter
36430 :
36440 .s1212_sprite_loop
36450 :
36460 ]
36470 FOR a%=1 TO 12
36480 [OPT pass%
36490 :
36500 LDMIA R2,{R3-R5} ; get some background
36510 LDMIA R1!,{R8-R10} ; get some mask
36520 AND R3,R3,R8 ; mask off background
36530 AND R4,R4,R9
36540 AND R5,R5,R10
36550 LDMIA R0!,{R8-R10} ; get some sprite
36560 ORR R3,R3,R8 ; merge sprite with background
36570 ORR R4,R4,R9
36580 ORR R5,R5,R10
36590 STMIA R2,{R3-R5} ; store masked sprite
36600 :
36610 SUB R2,R2, #y_shift
36620 :
36630 ]
36640 NEXT
36650 [OPT pass%
36660 :
36670 LDR R3, s1212_counter
36680 ADD R3,R3, #1
36690 STR R3, s1212_counter
36700 CMP R3, #1
36710 BLE s1212_sprite_loop
36720 :
36730 LDMFD R13!,{R0-R12,PC}
36740 :
36750 .s1212_counter
36760 EQUD 0
36770 :
36780 .adr_sprites1
36790 EQUD sprites1% ; address of sprites1
36800 .spr_size1
36810 EQUD 8/8*12*12*2 ; length of one sprite1 + mask1
36820 :
36830 :
36840 :
36850 .plot_sprite_1264
36860 :
36870 STMFD R13!,{R0-R12,R14}
36880 :
36890 : ; R0 sprite no.
36900 : ; R1 x-coord
36910 : ; R2 y-coord
36920 :
36930 RSB R2,R2, #256
36940 :
36950 CMP R1, #0
36960 BLE psm_no_plot1264
36970 CMP R2, #32
36980 BLE psm_no_plot1264
36990 CMP R1, #320-8
37000 BGE psm_no_plot1264
37010 CMP R2, #256
37020 BGE psm_no_plot1264
37030 B psm_plot1264
37040 .psm_no_plot1264
37050 LDMFD R13!,{R0-R12,PC}
37060 .psm_plot1264
37070 :
37080 AND R3,R1, #%11 ; calculate x offset
37090 MOV R0,R0, LSL #2 ; realise sprite
37100 ADD R0,R0, R3 ; add offset
37110 BIC R1,R1, #%11 ; make x div by 4
37120 :
37130 MOV R7, #x_shift ; get screen shifts
37140 MOV R8, #y_shift
37150 LDR R9, sprite_adr_screenstore; get screenstore address
37160 LDR R9,[R9]
37170 :
37180 MLA R3,R7,R1,R9
37190 MLA R2,R8,R2,R3
37200 :
37210 LDR R7, adr_sprites3 ; get start address of data
37220 LDR R8, spr_size3 ; get length of data for 1 sprite
37230 MLA R0,R8,R0,R7 ; calculate position of data
37240 ADD R1,R0,R8, LSR #1 ; calculate position of mask
37250 :
37260 MOV R3, #1
37270 STR R3, s1264_counter
37280 :
37290 .s1264_sprite_loop
37300 :
37310 ]
37320 FOR a%=1 TO 8
37330 [OPT pass%
37340 :
37350 LDMIA R2,{R3-R5} ; get some background
37360 LDMIA R1!,{R8-R10} ; get some mask
37370 AND R3,R3,R8 ; mask off background
37380 AND R4,R4,R9
37390 AND R5,R5,R10
37400 LDMIA R0!,{R8-R10} ; get some sprite
37410 ORR R3,R3,R8 ; merge sprite with background
37420 ORR R4,R4,R9
37430 ORR R5,R5,R10
37440 STMIA R2,{R3-R5} ; store masked sprite
37450 :
37460 SUB R2,R2, #y_shift
37470 :
37480 ]
37490 NEXT
37500 [OPT pass%
37510 :
37520 LDR R3, s1264_counter
37530 ADD R3,R3, #1
37540 STR R3, s1264_counter
37550 CMP R3, #8
37560 BLE s1264_sprite_loop
37570 :
37580 LDMFD R13!,{R0-R12,PC}
37590 :
37600 .s1264_counter
37610 EQUD 0
37620 :
37630 .adr_sprites3
37640 EQUD sprites3% ; address of sprites1
37650 .spr_size3
37660 EQUD 8/8*12*64*2 ; length of one sprite1 + mask1
37670 .sprite_adr_screenstore
37680 EQUD screenstore
37690 :
37700 :
37710 :
37720 .plot_sprite_2016
37730 :
37740 STMFD R13!,{R0-R12,R14}
37750 :
37760 : ; R0 sprite no.
37770 : ; R1 x-coord
37780 : ; R2 y-coord
37790 :
37800 RSB R2,R2, #256
37810 :
37820 CMP R1, #0
37830 BLE psm_no_plot2016
37840 CMP R2, #16
37850 BLE psm_no_plot2016
37860 CMP R1, #320-16
37870 BGE psm_no_plot2016
37880 CMP R2, #256
37890 BGE psm_no_plot2016
37900 B psm_plot2016
37910 .psm_no_plot2016
37920 LDMFD R13!,{R0-R12,PC}
37930 .psm_plot2016
37940 :
37950 AND R3,R1, #%11 ; calculate x offset
37960 MOV R0,R0, LSL #2 ; realise sprite
37970 ADD R0,R0, R3 ; add offset
37980 BIC R1,R1, #%11 ; make x div by 4
37990 :
38000 MOV R7, #x_shift ; get screen shifts
38010 MOV R8, #y_shift
38020 LDR R9, sprite_adr_screenstore; get screenstore address
38030 LDR R9,[R9]
38040 :
38050 MLA R3,R7,R1,R9
38060 MLA R2,R8,R2,R3
38070 :
38080 LDR R7, adr_sprites2 ; get start address of data
38090 LDR R8, spr_size2 ; get length of data for 1 sprite
38100 MLA R0,R8,R0,R7 ; calculate position of data
38110 ADD R1,R0,R8, LSR #1 ; calculate position of mask
38120 :
38130 MOV R3, #1
38140 STR R3, s2016_counter
38150 :
38160 .s2016_sprite_loop
38170 :
38180 ]
38190 FOR a%=1 TO 4
38200 [OPT pass%
38210 :
38220 LDMIA R2,{R3-R7} ; get some background
38230 LDMIA R1!,{R8-R12} ; get some mask
38240 AND R3,R3,R8 ; mask off background
38250 AND R4,R4,R9
38260 AND R5,R5,R10
38270 AND R6,R6,R11
38280 AND R7,R7,R12
38290 LDMIA R0!,{R8-R12} ; get some sprite
38300 ORR R3,R3,R8 ; merge sprite with background
38310 ORR R4,R4,R9
38320 ORR R5,R5,R10
38330 ORR R6,R6,R11
38340 ORR R7,R7,R12
38350 STMIA R2,{R3-R7} ; store masked sprite
38360 :
38370 SUB R2,R2, #y_shift
38380 :
38390 ]
38400 NEXT
38410 [OPT pass%
38420 :
38430 LDR R3, s2016_counter
38440 ADD R3,R3, #1
38450 STR R3, s2016_counter
38460 CMP R3, #4
38470 BLE s2016_sprite_loop
38480 :
38490 LDMFD R13!,{R0-R12,PC}
38500 :
38510 .s2016_counter
38520 EQUD 0
38530 :
38540 .adr_sprites2
38550 EQUD sprites2% ; address of sprites2
38560 .spr_size2
38570 EQUD 8/8*16*20*2 ; length of one sprite2 + mask2
38580 :
38590 :
38600 :
38610 .plot_sprite_0804
38620 :
38630 STMFD R13!,{R0-R12,R14}
38640 :
38650 : ; R0 sprite no.
38660 : ; R1 x-coord
38670 : ; R2 y-coord
38680 :
38690 RSB R2,R2, #256
38700 :
38710 CMP R1, #0
38720 BLE psm_no_plot0804
38730 CMP R2, #4
38740 BLE psm_no_plot0804
38750 CMP R1, #320-4
38760 BGE psm_no_plot0804
38770 CMP R2, #256
38780 BGE psm_no_plot0804
38790 B psm_plot0804
38800 .psm_no_plot0804
38810 LDMFD R13!,{R0-R12,PC}
38820 .psm_plot0804
38830 :
38840 AND R3,R1, #%11 ; calculate x offset
38850 MOV R0,R0, LSL #2 ; realise sprite
38860 ADD R0,R0, R3 ; add offset
38870 BIC R1,R1, #%11 ; make x div by 4
38880 :
38890 MOV R7, #x_shift ; get screen shifts
38900 MOV R8, #y_shift
38910 LDR R9, sprite_adr_screenstore; get screenstore address
38920 LDR R9,[R9]
38930 :
38940 MLA R3,R7,R1,R9
38950 MLA R2,R8,R2,R3
38960 :
38970 LDR R7, adr_sprites4 ; get start address of data
38980 LDR R8, spr_size4 ; get length of data for 1 sprite
38990 MLA R0,R8,R0,R7 ; calculate position of data
39000 ADD R1,R0,R8, LSR #1 ; calculate position of mask
39010 :
39020;MOV R3, #1
39030;STR R3, s0804_counter
39040 :
39050 .s0804_sprite_loop
39060 :
39070 ]
39080 FOR a%=1 TO 4
39090 [OPT pass%
39100 :
39110 LDMIA R2,{R3,R4} ; get some background
39120 LDMIA R1!,{R8,R9} ; get some mask
39130 AND R3,R3,R8 ; mask off background
39140 AND R4,R4,R9
39150 LDMIA R0!,{R8,R9} ; get some sprite
39160 ORR R3,R3,R8 ; merge sprite with background
39170 ORR R4,R4,R9
39180 STMIA R2,{R3,R4} ; store masked sprite
39190 :
39200 SUB R2,R2, #y_shift
39210 :
39220 ]
39230 NEXT
39240 [OPT pass%
39250 :
39260;LDR R3, s0804_counter
39270;ADD R3,R3, #1
39280;STR R3, s0804_counter
39290;CMP R3, #1
39300;BLE s0804_sprite_loop
39310 :
39320 LDMFD R13!,{R0-R12,PC}
39330 :
39340 .s0804_counter
39350 EQUD 0
39360 :
39370 .adr_sprites4
39380 EQUD sprites4% ; address of sprites4
39390 .spr_size4
39400 EQUD 8/8*8*4*2 ; length of one sprite4 + mask4
39410 :
39420 :
39430 :
39440 .plot_sprite_1208
39450 :
39460 STMFD R13!,{R0-R12,R14}
39470 :
39480 : ; R0 sprite no.
39490 : ; R1 x-coord
39500 : ; R2 y-coord
39510 :
39520 RSB R2,R2, #256
39530 :
39540 CMP R1, #0
39550 BLE psm_no_plot1208
39560 CMP R2, #8
39570 BLE psm_no_plot1208
39580 CMP R1, #320-8
39590 BGE psm_no_plot1208
39600 CMP R2, #256
39610 BGE psm_no_plot1208
39620 B psm_plot1208
39630 .psm_no_plot1208
39640 LDMFD R13!,{R0-R12,PC}
39650 .psm_plot1208
39660 :
39670 AND R3,R1, #%11 ; calculate x offset
39680 MOV R0,R0, LSL #2 ; realise sprite
39690 ADD R0,R0, R3 ; add offset
39700 BIC R1,R1, #%11 ; make x div by 4
39710 :
39720 MOV R7, #x_shift ; get screen shifts
39730 MOV R8, #y_shift
39740 LDR R9, sprite_adr_screenstore; get screenstore address
39750 LDR R9,[R9]
39760 :
39770 MLA R3,R7,R1,R9
39780 MLA R2,R8,R2,R3
39790 :
39800 LDR R7, adr_sprites5 ; get start address of data
39810 LDR R8, spr_size5 ; get length of data for 1 sprite
39820 MLA R0,R8,R0,R7 ; calculate position of data
39830 ADD R1,R0,R8, LSR #1 ; calculate position of mask
39840 :
39850;MOV R3, #1
39860;STR R3, s1208_counter
39870 :
39880 .s1208_sprite_loop
39890 :
39900 ]
39910 FOR a%=1 TO 8
39920 [OPT pass%
39930 :
39940 LDMIA R2,{R3,R4,R5} ; get some background
39950 LDMIA R1!,{R8,R9,R10} ; get some mask
39960 AND R3,R3,R8 ; mask off background
39970 AND R4,R4,R9
39980 AND R5,R5,R10
39990 LDMIA R0!,{R8,R9,R10} ; get some sprite
40000 ORR R3,R3,R8 ; merge sprite with background
40010 ORR R4,R4,R9
40020 ORR R5,R5,R10
40030 STMIA R2,{R3,R4,R5} ; store masked sprite
40040 :
40050 SUB R2,R2, #y_shift
40060 :
40070 ]
40080 NEXT
40090 [OPT pass%
40100 :
40110;LDR R3, s1208_counter
40120;ADD R3,R3, #1
40130;STR R3, s1208_counter
40140;CMP R3, #1
40150;BLE s1208_sprite_loop
40160 :
40170 LDMFD R13!,{R0-R12,PC}
40180 :
40190 .s1208_counter
40200 EQUD 0
40210 :
40220 .adr_sprites5
40230 EQUD sprites5% ; address of sprites5
40240 .spr_size5
40250 EQUD 8/8*12*8*2 ; length of one sprite5 + mask5
40260 :
40270 :
40280 :
40290 .plot_sprite_1616
40300 :
40310 STMFD R13!,{R0-R12,R14}
40320 :
40330 : ; R0 sprite no.
40340 : ; R1 x-coord
40350 : ; R2 y-coord
40360 :
40370 RSB R2,R2, #256
40380 :
40390 CMP R1, #0
40400 BLE psm_no_plot1616
40410 CMP R2, #16
40420 BLE psm_no_plot1616
40430 CMP R1, #320-16
40440 BGE psm_no_plot1616
40450 CMP R2, #256
40460 BGE psm_no_plot1616
40470 B psm_plot1616
40480 .psm_no_plot1616
40490 LDMFD R13!,{R0-R12,PC}
40500 .psm_plot1616
40510 :
40520 AND R3,R1, #%11 ; calculate x offset
40530 MOV R0,R0, LSL #2 ; realise sprite
40540 ADD R0,R0, R3 ; add offset
40550 BIC R1,R1, #%11 ; make x div by 4
40560 :
40570 MOV R7, #x_shift ; get screen shifts
40580 MOV R8, #y_shift
40590 LDR R9, sprite_adr_screenstore; get screenstore address
40600 LDR R9,[R9]
40610 :
40620 MLA R3,R7,R1,R9
40630 MLA R2,R8,R2,R3
40640 :
40650 LDR R7, adr_sprites6 ; get start address of data
40660 LDR R8, spr_size6 ; get length of data for 1 sprite
40670 MLA R0,R8,R0,R7 ; calculate position of data
40680 ADD R1,R0,R8, LSR #1 ; calculate position of mask
40690 :
40700 MOV R3, #1
40710 STR R3, s1616_counter
40720 :
40730 .s1616_sprite_loop
40740 :
40750 ]
40760 FOR a%=1 TO 4
40770 [OPT pass%
40780 :
40790 LDMIA R2,{R3-R6} ; get some background
40800 LDMIA R1!,{R8-R11} ; get some mask
40810 AND R3,R3,R8 ; mask off background
40820 AND R4,R4,R9
40830 AND R5,R5,R10
40840 AND R5,R5,R11
40850 LDMIA R0!,{R8-R11} ; get some sprite
40860 ORR R3,R3,R8 ; merge sprite with background
40870 ORR R4,R4,R9
40880 ORR R5,R5,R10
40890 ORR R6,R6,R11
40900 STMIA R2,{R3-R6} ; store masked sprite
40910 :
40920 SUB R2,R2, #y_shift
40930 :
40940 ]
40950 NEXT
40960 [OPT pass%
40970 :
40980 LDR R3, s1616_counter
40990 ADD R3,R3, #1
41000 STR R3, s1616_counter
41010 CMP R3, #4
41020 BLE s1616_sprite_loop
41030 :
41040 LDMFD R13!,{R0-R12,PC}
41050 :
41060 .s1616_counter
41070 EQUD 0
41080 :
41090 .adr_sprites6
41100 EQUD sprites6% ; address of sprites6
41110 .spr_size6
41120 EQUD 8/8*16*16*2 ; length of one sprite6 + mask6
41130 :
41140 :
41150 ]
41160 P%=fill_routines%
41170 L%=fill_routines%+8191
41180 [OPT pass%
41190 :
41200 :
41210 :
41220 .fill_fill_1212
41230 :
41240 STMFD R13!,{R0-R12,R14}
41250 :
41260 : ; R0 fill no.
41270 : ; R1 x-coord
41280 : ; R2 y-coord
41290 :
41300 RSB R2,R2, #256
41310 :
41320 CMP R1, #0
41330 BLE psm_no_fill1212
41340 CMP R2, #12
41350 BLE psm_no_fill1212
41360 CMP R1, #320-8
41370 BGE psm_no_fill1212
41380 CMP R2, #256
41390 BGE psm_no_fill1212
41400 B psm_fill1212
41410 .psm_no_fill1212
41420 LDMFD R13!,{R0-R12,PC}
41430 .psm_fill1212
41440 :
41450 MOV R7, #x_shift ; get screen shifts
41460 MOV R8, #y_shift
41470 :
41480 LDR R9, fill_adr_screenstore; get screenstore address
41490 LDR R9,[R9]
41500 MLA R3,R7,R1,R9
41510 MLA R0,R8,R2,R3
41520 :
41530 LDR R9, fill_screendata ; get screen address
41540 MLA R3,R7,R1,R9
41550 MLA R1,R8,R2,R3
41560 :
41570 MOV R3, #1
41580 STR R3, f1212_counter
41590 :
41600 .f1212_fill_loop
41610 :
41620 ]
41630 FOR a%=1 TO 12
41640 [OPT pass%
41650 :
41660 LDMIA R1,{R3-R5} ; get some background
41670 STMIA R0,{R3-R5} ; store masked fill
41680 :
41690 SUB R0,R0, #y_shift
41700 SUB R1,R1, #y_shift
41710 :
41720 ]
41730 NEXT
41740 [OPT pass%
41750 :
41760 LDR R3, f1212_counter
41770 ADD R3,R3, #1
41780 STR R3, f1212_counter
41790 CMP R3, #1
41800 BLE f1212_fill_loop
41810 :
41820 LDMFD R13!,{R0-R12,PC}
41830 :
41840 .f1212_counter
41850 EQUD 0
41860 :
41870 :
41880 :
41890 .fill_fill_1264
41900 :
41910 STMFD R13!,{R0-R12,R14}
41920 :
41930 : ; R0 fill no.
41940 : ; R1 x-coord
41950 : ; R2 y-coord
41960 :
41970 RSB R2,R2, #256
41980 :
41990 CMP R1, #0
42000 BLE psm_no_fill1264
42010 CMP R2, #32
42020 BLE psm_no_fill1264
42030 CMP R1, #320-8
42040 BGE psm_no_fill1264
42050 CMP R2, #256
42060 BGE psm_no_fill1264
42070 B psm_fill1264
42080 .psm_no_fill1264
42090 LDMFD R13!,{R0-R12,PC}
42100 .psm_fill1264
42110 :
42120 MOV R7, #x_shift ; get screen shifts
42130 MOV R8, #y_shift
42140 :
42150 LDR R9, fill_adr_screenstore; get screenstore address
42160 LDR R9,[R9]
42170 MLA R3,R7,R1,R9
42180 MLA R0,R8,R2,R3
42190 :
42200 LDR R9, fill_screendata ; get screen address
42210 MLA R3,R7,R1,R9
42220 MLA R1,R8,R2,R3
42230 :
42240 MOV R3, #1
42250 STR R3, f1264_counter
42260 :
42270 .f1264_fill_loop
42280 :
42290 ]
42300 FOR a%=1 TO 8
42310 [OPT pass%
42320 :
42330 LDMIA R1,{R3-R5} ; get some background
42340 STMIA R0,{R3-R5} ; store masked fill
42350 :
42360 SUB R0,R0, #y_shift
42370 SUB R1,R1, #y_shift
42380 :
42390 ]
42400 NEXT
42410 [OPT pass%
42420 :
42430 LDR R3, f1264_counter
42440 ADD R3,R3, #1
42450 STR R3, f1264_counter
42460 CMP R3, #8
42470 BLE f1264_fill_loop
42480 :
42490 LDMFD R13!,{R0-R12,PC}
42500 :
42510 .f1264_counter
42520 EQUD 0
42530 :
42540 .fill_screendata
42550 EQUD screendata%
42560 .fill_adr_screenstore
42570 EQUD screenstore
42580 :
42590 :
42600 :
42610 .fill_fill_2016
42620 :
42630 STMFD R13!,{R0-R12,R14}
42640 :
42650 : ; R0 fill no.
42660 : ; R1 x-coord
42670 : ; R2 y-coord
42680 :
42690 RSB R2,R2, #256
42700 :
42710 CMP R1, #0
42720 BLE psm_no_fill2016
42730 CMP R2, #16
42740 BLE psm_no_fill2016
42750 CMP R1, #320-16
42760 BGE psm_no_fill2016
42770 CMP R2, #256
42780 BGE psm_no_fill2016
42790 B psm_fill2016
42800 .psm_no_fill2016
42810 LDMFD R13!,{R0-R12,PC}
42820 .psm_fill2016
42830 :
42840 MOV R7, #x_shift ; get screen shifts
42850 MOV R8, #y_shift
42860 :
42870 LDR R9, fill_adr_screenstore; get screenstore address
42880 LDR R9,[R9]
42890 MLA R3,R7,R1,R9
42900 MLA R0,R8,R2,R3
42910 :
42920 LDR R9, fill_screendata ; get screen address
42930 MLA R3,R7,R1,R9
42940 MLA R1,R8,R2,R3
42950 :
42960 MOV R3, #1
42970 STR R3, f2016_counter
42980 :
42990 .f2016_fill_loop
43000 :
43010 ]
43020 FOR a%=1 TO 4
43030 [OPT pass%
43040 :
43050 LDMIA R1,{R3-R7} ; get some background
43060 STMIA R0,{R3-R7} ; store masked fill
43070 :
43080 SUB R0,R0, #y_shift
43090 SUB R1,R1, #y_shift
43100 :
43110 ]
43120 NEXT
43130 [OPT pass%
43140 :
43150 LDR R3, f2016_counter
43160 ADD R3,R3, #1
43170 STR R3, f2016_counter
43180 CMP R3, #4
43190 BLE f2016_fill_loop
43200 :
43210 LDMFD R13!,{R0-R12,PC}
43220 :
43230 .f2016_counter
43240 EQUD 0
43250 :
43260 :
43270 :
43280 .fill_fill_0804
43290 :
43300 STMFD R13!,{R0-R12,R14}
43310 :
43320 : ; R0 fill no.
43330 : ; R1 x-coord
43340 : ; R2 y-coord
43350 :
43360 RSB R2,R2, #256
43370 :
43380 CMP R1, #0
43390 BLE psm_no_fill0804
43400 CMP R2, #4
43410 BLE psm_no_fill0804
43420 CMP R1, #320-4
43430 BGE psm_no_fill0804
43440 CMP R2, #256
43450 BGE psm_no_fill0804
43460 B psm_fill0804
43470 .psm_no_fill0804
43480 LDMFD R13!,{R0-R12,PC}
43490 .psm_fill0804
43500 :
43510 MOV R7, #x_shift ; get screen shifts
43520 MOV R8, #y_shift
43530 :
43540 LDR R9, fill_adr_screenstore; get screenstore address
43550 LDR R9,[R9]
43560 MLA R3,R7,R1,R9
43570 MLA R0,R8,R2,R3
43580 :
43590 LDR R9, fill_screendata ; get screen address
43600 MLA R3,R7,R1,R9
43610 MLA R1,R8,R2,R3
43620 :
43630 .f0804_fill_loop
43640 :
43650 ]
43660 FOR a%=1 TO 4
43670 [OPT pass%
43680 :
43690 LDMIA R1,{R3-R4} ; get some background
43700 STMIA R0,{R3-R4} ; store masked fill
43710 :
43720 SUB R0,R0, #y_shift
43730 SUB R1,R1, #y_shift
43740 :
43750 ]
43760 NEXT
43770 [OPT pass%
43780 :
43790 LDMFD R13!,{R0-R12,PC}
43800 :
43810 :
43820 :
43830 .fill_fill_1208
43840 :
43850 STMFD R13!,{R0-R12,R14}
43860 :
43870 : ; R0 fill no.
43880 : ; R1 x-coord
43890 : ; R2 y-coord
43900 :
43910 RSB R2,R2, #256
43920 :
43930 CMP R1, #0
43940 BLE psm_no_fill1208
43950 CMP R2, #8
43960 BLE psm_no_fill1208
43970 CMP R1, #320-8
43980 BGE psm_no_fill1208
43990 CMP R2, #256
44000 BGE psm_no_fill1208
44010 B psm_fill1208
44020 .psm_no_fill1208
44030 LDMFD R13!,{R0-R12,PC}
44040 .psm_fill1208
44050 :
44060 MOV R7, #x_shift ; get screen shifts
44070 MOV R8, #y_shift
44080 :
44090 LDR R9, fill_adr_screenstore; get screenstore address
44100 LDR R9,[R9]
44110 MLA R3,R7,R1,R9
44120 MLA R0,R8,R2,R3
44130 :
44140 LDR R9, fill_screendata ; get screen address
44150 MLA R3,R7,R1,R9
44160 MLA R1,R8,R2,R3
44170 :
44180 ]
44190 FOR a%=1 TO 8
44200 [OPT pass%
44210 :
44220 LDMIA R1,{R3-R5} ; get some background
44230 STMIA R0,{R3-R5} ; store masked fill
44240 :
44250 SUB R0,R0, #y_shift
44260 SUB R1,R1, #y_shift
44270 :
44280 ]
44290 NEXT
44300 [OPT pass%
44310 :
44320 LDMFD R13!,{R0-R12,PC}
44330 :
44340 :
44350 :
44360 .fill_fill_1616
44370 :
44380 STMFD R13!,{R0-R12,R14}
44390 :
44400 RSB R2,R2, #256
44410 :
44420 CMP R1, #0
44430 BLE psm_no_fill1616
44440 CMP R2, #16
44450 BLE psm_no_fill1616
44460 CMP R1, #320-16
44470 BGE psm_no_fill1616
44480 CMP R2, #256
44490 BGE psm_no_fill1616
44500 B psm_fill1616
44510 .psm_no_fill1616
44520 LDMFD R13!,{R0-R12,PC}
44530 .psm_fill1616
44540 :
44550 MOV R7, #x_shift ; get screen shifts
44560 MOV R8, #y_shift
44570 :
44580 LDR R9, fill_adr_screenstore; get screenstore address
44590 LDR R9,[R9]
44600 MLA R3,R7,R1,R9
44610 MLA R0,R8,R2,R3
44620 :
44630 LDR R9, fill_screendata ; get screen address
44640 MLA R3,R7,R1,R9
44650 MLA R1,R8,R2,R3
44660 :
44670 MOV R3, #1
44680 STR R3, f1616_counter
44690 :
44700 .f1616_fill_loop
44710 :
44720 ]
44730 FOR a%=1 TO 4
44740 [OPT pass%
44750 :
44760 LDMIA R1,{R2-R5}
44770 STMIA R0,{R2-R5}
44780 :
44790 SUB R0,R0, #y_shift
44800 SUB R1,R1, #y_shift
44810 :
44820 ]
44830 NEXT
44840 [OPT pass%
44850 :
44860 LDR R3, f1616_counter
44870 ADD R3,R3, #1
44880 STR R3, f1616_counter
44890 CMP R3, #4
44900 BLE f1616_fill_loop
44910 :
44920 LDMFD R13!,{R0-R12,PC}
44930 :
44940 .f1616_counter
44950 EQUD 0
44960 :
44970 :
44980 :
44990 .fill_fill_0101
45000 :
45010 STMFD R13!,{R0-R12,R14}
45020 :
45030 RSB R2,R2, #256
45040 :
45050 CMP R1, #0
45060 BLE psm_no_fill0101
45070 CMP R2, #0
45080 BLE psm_no_fill0101
45090 CMP R1, #320
45100 BGE psm_no_fill0101
45110 CMP R2, #256
45120 BGE psm_no_fill0101
45130 B psm_fill0101
45140 .psm_no_fill0101
45150 LDMFD R13!,{R0-R12,PC}
45160 .psm_fill0101
45170 :
45180 MOV R7, #x_shift ; get screen shifts
45190 MOV R8, #y_shift
45200 :
45210 LDR R9, fill_adr_screenstore; get screenstore address
45220 LDR R9,[R9]
45230 MLA R3,R7,R1,R9
45240 MLA R0,R8,R2,R3
45250 :
45260 LDR R9, fill_screendata ; get screen address
45270 MLA R3,R7,R1,R9
45280 MLA R1,R8,R2,R3
45290 :
45300 LDRB R2,[R1]
45310 STRB R2,[R0]
45320 :
45330 LDMFD R13!,{R0-R12,PC}
45340 :
45350 ]
45360NEXT
45370:
45380!cl_adr_screen=screen
45390FOR a%=0 TO 255
45400 r%=SQRSQR(a%*256^3)
45410 g%=SQR(a%*256)
45420 b%=a%
45430 SYS "ColourTrans_ReturnColourNumber",(r%<<8)+(g%<<16)+(b%<<24) TO colour%
45440 !(flame_fade%+a%)=colour%
45450NEXT
45460:
45470FOR a%=0 TO 255
45480 r%=64+a%/2
45490 g%=128+a%/2
45500 b%=128+a%/2
45510 SYS "ColourTrans_ReturnColourNumber",(r%<<8)+(g%<<16)+(b%<<24) TO colour%
45520 !(gun_fade%+a%)=colour%
45530NEXT
45540:
45550c%=OPENIN("<This$Dir>.Levels.Level"+STR$(scrn%)+".Posn"+STR$(scrn%))
45560FOR a%=0 TO 7
45570 INPUT#c%,x%
45580 INPUT#c%,y%
45590 !(a%*8+positions)=x%
45600 !(a%*8+4+positions)=y%
45610NEXT
45620CLOSE#c%
45630:
45640p%=clist%
45650FOR a%=1 TO clist_size%/32-1
45660 PROCadd_cell(0)
45670NEXT
45680PROCadd_cell(-1)
45690:
45700p%=slist%
45710FOR a%=1 TO slist_size%/16-1
45720 PROCadd_sprite(0,0,0,0)
45730NEXT
45740PROCadd_sprite(0,0,-1,0)
45750p%=slist%
45760FOR a%=1 TO 16
45770 PROCadd_sprite(0,0,0,0)
45780NEXT
45790c%=OPENIN("<This$Dir>.Levels.Level"+STR$(scrn%)+".Doors"+STR$(scrn%))
45800FOR a%=1 TO 4
45810 INPUT#c%,x%
45820 INPUT#c%,y%
45830 INPUT#c%,t%
45840 INPUT#c%,i%
45850 PROCadd_sprite(x%,y%,13,i%)
45860NEXT
45870CLOSE#c%
45880c%=OPENIN("<This$Dir>.Levels.Level"+STR$(scrn%)+".GSwitches")
45890FOR a%=1 TO 4
45900 INPUT#c%,x%
45910 INPUT#c%,y%
45920 INPUT#c%,t%
45930 INPUT#c%,i%
45940 PROCadd_sprite(x%,y%,14,a%)
45950NEXT
45960CLOSE#c%
45970c%=OPENIN("<This$Dir>.Levels.Level"+STR$(scrn%)+".Guns"+STR$(scrn%))
45980FOR a%=1 TO 4
45990 INPUT#c%,x%
46000 INPUT#c%,y%
46010 INPUT#c%,t%
46020 INPUT#c%,i%
46030 PROCadd_sprite(x%,y%,15,a%)
46040NEXT
46050CLOSE#c%
46060PROCadd_sprite(1116,32,2,(128<<8)+(128<<16))
46140PROCadd_sprite(84,896,1,(128<<8)+(128<<16))
46300c%=OPENIN("<This$Dir>.Levels.Level"+STR$(scrn%)+".Flames"+STR$(scrn%))
46310FOR a%=1 TO 16
46320 INPUT#c%,x%
46330 INPUT#c%,y%
46340 INPUT#c%,t%
46350 INPUT#c%,i%
46360 PROCadd_sprite(x%,y%,3,i%)
46370NEXT
46380CLOSE#c%
46390CALL start
46400CALL clear_screen
46410ENDPROC
46420:
46430:
46440:
46450DEF PROCerror
46460ON ERROR OFF
46470*FX 200,1
46480SYS "Hourglass_Smash"
46490MOUSE OFF
46500IF ERR=17 THEN
46510 SYS "OS_Byte",112,1
46520 CLS
46530 SYS "OS_Byte",113,1
46540ELSE
46550 SYS "OS_Byte",112,1
46560 CLS
46570 SYS "OS_Byte",113,1
46580 PRINT REPORT$;" at line ";ERL
46590ENDIF
46600*RmKill EXPLO
46610*RmKill TOKENRM
46620*RmKill ARG
46630*RmKill RARG
46640*RmKill LaughRM
46650*RmKill Revolver
46660*RmKill Gener
46670*FX 200,0
46680ENDPROC
46690:
46700:
46710:
46720DEF FNbordercol(r%,g%,b%)
46730 [OPT pass%
46740;SWI 256+19
46750;SWI 256+0
46760;SWI 256+24
46770;SWI 256+r%
46780;SWI 256+g%
46790;SWI 256+b%
46800 ]
46810=0
46820:
46830:
46840:
46850DEF PROCadd_sprite(x%,y%,t%,i%)
46860!(p%+00)=t%
46870!(p%+04)=x%
46880!(p%+08)=y%
46890!(p%+12)=i%
46900p%+=16
46910ENDPROC
46920:
46930:
46940:
46950DEF PROCadd_cell(t%)
46960p%!00=t%
46970p%+=32
46980ENDPROC
46990:
47000:
47010:
47020DEF PROCassm_decomp
47030FOR pass%=%0000 TO %1010 STEP %1010
47040 P%=decomp_code%
47050 L%=decomp_code%+1020
47060 [OPT pass%
47070 :
47080 .dc_unused
47090 EQUD 0
47100 .dc_cmpp
47110 EQUD 0
47120 .dc_address
47130 EQUD 0
47140 .dc_value
47150 EQUD 0
47160 .dc_repetitions
47170 EQUD 0
47180 :
47190 .dc_start
47200 LDR R0, dc_cmpp
47210 LDR R1,[R0]
47220 STR R1, dc_unused
47230 ADD R0,R0, #4
47240 STR R0, dc_cmpp
47250 .dc_repeat_loop1
47260 LDR R0, dc_cmpp
47270 LDR R0,[R0]
47280 LDR R1, dc_unused
47290 CMP R0,R1
47300 BEQ dc_decompress
47310 .dc_copy
47320 LDR R0, dc_cmpp
47330 LDR R1,[R0]
47340 LDR R2, dc_address
47350 STR R1,[R2]
47360 LDR R0, dc_cmpp
47370 ADD R0,R0, #4
47380 LDR R2, dc_address
47390 ADD R2,R2, #4
47400 STR R0, dc_cmpp
47410 STR R2, dc_address
47420 B dc_until1
47430 .dc_decompress
47440 LDR R0, dc_cmpp
47450 LDR R7,[R0, #4]
47460 STR R7, dc_value
47470 LDR R0,[R0, #8]
47480 STR R0, dc_repetitions
47490 CMP R0, #0
47500 BEQ dc_until1
47510 LDR R7, dc_value
47520 LDR R8, dc_address
47530 MOV R9, #1
47540 .dc_repeat_loop2
47550 STMIA R8!,{R7}
47560 ADD R9,R9, #1
47570 LDR R0, dc_repetitions
47580 CMP R9,R0
47590 BLE dc_repeat_loop2
47600 STR R8, dc_address
47610 LDR R0, dc_cmpp
47620 ADD R0,R0, #12
47630 STR R0, dc_cmpp
47640 .dc_until1
47650 LDR R0, dc_cmpp
47660 LDR R1,[R0]
47670 LDR R2, dc_unused
47680 CMP R1,R2
47690 BNE dc_repeat_loop1
47700 LDR R3,[R0, #8]
47710 CMP R3, #0
47720 BNE dc_repeat_loop1
47730 MOV PC,R14
47740 :
47750 ]
47760NEXT
47770ENDPROC
47780:
47790:
47800:
47810DEF PROCdecompress(from$,to%)
47820SYS "OS_File",255,from$,cmpdata%,0
47830!dc_address=to%
47840!dc_cmpp=cmpdata%
47850CALL dc_start
47860ENDPROC
47870:
47880:
47890:
47900DEF PROCassemble_clear_screen
47910FOR pass%=%0000 TO %1010 STEP %1010
47920 P%=cl_code%
47930 L%=cl_code%+2044
47940 [OPT pass%
47950 :
47960 .setup_cs
47970 STMFD R13!,{R0-R12,R14}
47980 LDR R0, cl_adr_vdu_vars
47990 LDR R1, cl_adr_screen
48000 SWI "OS_ReadVduVariables" ; set up vdu variables
48010 LDMFD R13!,{R0-R12,PC}
48020 :
48030 .clear_screen
48040 STMFD R13!,{R0-R12,R14}
48050 :
48060 LDR R11, adr_clscolours ; get the address of colour data
48070 MOV R9, #0 ; y co-ord
48080 :
48090 .cl_loop1
48100 :
48110 LDR R10, cl_adr_screen
48120 LDR R10,[R10] ; get screen address
48130 ADD R7,R10, #&14000 ; get screen end
48140 :
48150 .cl_loop3
48160 ]
48170 FOR a%=0 TO 15
48180 FOR b%=0 TO fader% STEP 4
48190 [OPT pass%
48200 :
48210 ADD R10,R10, #b%
48220 BL cl_cls ; dim screen
48230 SUB R10,R10, #b%
48240 :
48250 MOV R0, #19
48260 SWI "OS_Byte"
48270 :
48280 ]
48290 NEXT
48300 NEXT
48310 [OPT pass%
48320 :
48330 .cl_end_routines
48340 :
48350 .cl_end
48360 LDMFD R13!,{R0-R12,PC}
48370 :
48380 .cl_cls
48390 MOV R6,R10
48400 MOV R4, #&FF
48410 .cl_loop2
48420 LDR R0,[R6]
48430 :
48440 MOV R3,R0, ROR #8
48450 CMP R3,R0
48460 BNE cl_not_same
48470 AND R1,R4,R0
48480 LDRB R1,[R11,R1]
48490 ORR R3,R1,R1, LSL #8
48500 ORR R3,R3,R3, LSL #16
48510 :
48520 B cl_done_pixels
48530 :
48540 .cl_not_same
48550 AND R1,R4,R0
48560 LDRB R1,[R11,R1]
48570 MOV R3,R1
48580 :
48590 AND R1,R4,R0, LSR #8
48600 LDRB R1,[R11,R1]
48610 ORR R3,R3,R1, LSL #8
48620 :
48630 AND R1,R4,R0, LSR #16
48640 LDRB R1,[R11,R1]
48650 ORR R3,R3,R1, LSL #16
48660 :
48670 AND R1,R4,R0, LSR #24
48680 LDRB R1,[R11,R1]
48690 ORR R3,R3,R1, LSL #24
48700 :
48710 .cl_done_pixels
48720 STR R3,[R6], #fader%+4
48730 :
48740 CMP R6,R7
48750 BLT cl_loop2
48760 :
48770 .cl_end
48780 MOV PC,R14
48790 :
48800 .adr_clscolours
48810 EQUD cl_colours%
48820 .cl_adr_vdu_vars
48830 EQUD vdu_vars
48840 .cl_adr_screen
48850 EQUD screen
48860 .screen
48870 EQUD 0
48880 .vdu_vars
48890 EQUD 149 ; vdu data
48900 EQUD -1
48910 .screen_size
48920 EQUD &14000
48930 :
48940 ]
48950NEXT
48960CALL setup_cs
48970ENDPROC
48980:
48990:
49000:
49010DEF PROCprint(a$)
49020IF a$="" THEN PRINT:ENDPROC
49030LOCAL letter%,width%,c%
49040ORIGIN 0,0
49050x%=POS*64
49060y%=1024-VPOS*64-64
49070FOR letter%=1 TO LEN(a$)
49080 IF x%>1024 THEN x%=0:y%-=64:PRINT'
49090 asc%=ASC(MID$(a$,letter%,1))
49100 IF asc%>31 THEN
49110 SYS "OS_SpriteOp",&128,font%,STR$asc% TO ,,,width%
49120 SYS "OS_SpriteOp",&122,font%,STR$asc%,x%,y%,0
49130 ELSE
49140 IF asc%=9 THEN x%=(INT(x%/256)+1)*256
49150 ENDIF
49160 x%+=width%*4
49170NEXT
49180PRINT
49190ENDPROC
49200:
49210:
49220DEF PROCtint
49230FOR p%=0 TO &13FFF STEP 1
49240 IF screendata%?p%<>0 THEN screendata%?p%=(screendata%?p% OR %11) EOR (RND(3)-1)
49250NEXT
49260ENDPROC
� > !RunImage
�
� � J.D.Harrop
(�
2:
<� � �error:�
F:
P� 15
Z� 13
d�
n:
x� screen% 8
�screen%!0=149
�screen%!4=-1
�,ș "OS_ReadVduVariables",screen%,screen%
�screen%=screen%!0
�:
�xext%=12
�yext%=16
�:
�/*RmEnsure EXPLO RMLoad <This$Dir>.SFX.Explo
�3*RmEnsure TOKENRM RMLoad <This$Dir>.SFX.TokenRM
�+*RmEnsure ARG RMLoad <This$Dir>.SFX.Arg
�-*RmEnsure RARG RMLoad <This$Dir>.SFX.RArg
�1*RmEnsure LaughRM RMLoad <This$Dir>.SFX.Laugh
5*RmEnsure Revolver RMLoad <This$Dir>.SFX.Revolver
/*RmEnsure Gener RMLoad <This$Dir>.SFX.Gener
.*RmEnsure Gener RMLoad <This$Dir>.SFX.boom
"Ƞ 7
,ȡ 1,"boom"
6ȡ 2,"TOKENRM"
@ȡ 3,"ARG"
Jȡ 4,"RARG"
Tȡ 5,"LaughRM"
^ȡ 6,"Revolver"
hȡ 7,"Gener"
rȡ 8,"EXPLO"
|ș "Sound_Volume",127
�scream%=8192
�ping%=14336
�boom%=6400
�explosion%=3200
�fader%=8
�bomb_pause%=63
�seeking_sound%=7
�seeking_rate%=512
�gun_sound%=6
�gun_rate%=16384
�homing_sound%=7
�homing_rate%=16384
�clist_size%=640*32
slist_size%=1024
Jș "OS_File",17,"<This$Dir>.Graphics.SData1212" � type%,,,,spritelen1%
Jș "OS_File",17,"<This$Dir>.Graphics.SData2016" � type%,,,,spritelen2%
&Jș "OS_File",17,"<This$Dir>.Graphics.SData1264" � type%,,,,spritelen3%
0Jș "OS_File",17,"<This$Dir>.Graphics.SData0804" � type%,,,,spritelen4%
:Jș "OS_File",17,"<This$Dir>.Graphics.SData1208" � type%,,,,spritelen5%
DJș "OS_File",17,"<This$Dir>.Graphics.SData1616" � type%,,,,spritelen6%
NBș "OS_File",17,"<This$Dir>.Graphics.Font" � type%,,,,fontlen%
Xu� code% 12*1024,sprite_routines% 8192,fill_routines% 8192,clg_routine% 1024,split_routine% 1024,decomp_code% 1024
b�� sprites1% spritelen1%+4,sprites2% spritelen2%+4,sprites3% spritelen3%+4,sprites4% spritelen4%+4,sprites5% spritelen5%+4,sprites6% spritelen6%+4
l� screendata% 81924
v� screenstore% 81924
�+� clist% clist_size%,slist% slist_size%
�� cmpdata% 81924
�� flame_fade% 256
�� gun_fade% 256
�$� cl_code% 2048, cl_colours% 320
�� font% fontlen%+4
��assm_decomp
�6�decompress("<This$Dir>.Graphics.CMLData",screen%)
�!font%=22*1024
�:ș "OS_SpriteOp",&10A,font%,"<This$Dir>.Graphics.Font"
�t%=�
�P%=cl_colours%
�L%=cl_colours%+256
"chan%=�("<This$Dir>.FadeCols")
� c%=0 � 255
?P%=�#chan%
P%+=1
*�
4�#chan%
>�
H� �>t%+200
R�assemble_clear_screen
\:
fscrn%=20
p�
z player1_lives%=3
� player2_lives%=3
� �
� scrn%+=1
� � scrn%>23 � scrn%=1
�U �decompress("<This$Dir>.Levels.Level"+�(scrn%)+".CmpData"+�(scrn%),screendata%)
� �tint
� � clear_screen
� �play
� !screen=!screen1
� �
� �
� ș "OS_Byte",112,2
� �
ș "OS_Byte",113,2
ș "OS_Byte",112,1
�
$: �decompress("<This$Dir>.Graphics.CLogoData",screen%)
. Ȗ
8 ș "OS_Byte",113,1
B ș "OS_Byte",112,1
L- � !player1_alive<>0 � player1_lives%-=1
V- � !player2_alive<>0 � player2_lives%-=1
`Q � player1_lives%=0 � player2_lives%=0 � player1_lives%+=1:player2_lives%+=1
j � 128+42 Ȝ 0
t � 0 Ȝ 0
~ � �0,0);
�, �print("Player 1 : "+�player1_lives%)
�+ �print("Player 2 : "+�player2_lives%)
� � 128 Ȝ 0
� � 63 Ȝ 255
�* � player1_lives%=0 � player2_lives%=0
� t%=�
� �
� � �>t%+50
� � clear_screen
� �
� �
� ș "OS_Byte",112,2
�
ș "OS_Byte",113,2
ș "OS_Byte",112,1
�
( t%=�
2M � player1_lives%=0 � �decompress("<This$Dir>.Graphics.C�P2Wins",screen%)
<M � player2_lives%=0 � �decompress("<This$Dir>.Graphics.C�P1Wins",screen%)
F# ș "Sound_Control",5,-15,128,0
P Ȗ
Z ș "OS_Byte",113,1
d ș "OS_Byte",112,1
n �
x � �>t%+500
� � clear_screen
�� �
��
�:
�:
�:
�� �play
�spray_col%=63
�max_homing_speed%=16
�@ș "OS_File",255,"<This$Dir>.Graphics.SData1212",sprites1%,0
�@ș "OS_File",255,"<This$Dir>.Graphics.SData2016",sprites2%,0
�@ș "OS_File",255,"<This$Dir>.Graphics.SData1264",sprites3%,0
�@ș "OS_File",255,"<This$Dir>.Graphics.SData0804",sprites4%,0
@ș "OS_File",255,"<This$Dir>.Graphics.SData1208",sprites5%,0
@ș "OS_File",255,"<This$Dir>.Graphics.SData1616",sprites6%,0
number = 0
"divisor = 1
,remain = 3
6quotient = 2
@place = 4
Jdsign = 5
Tmsign = 6
^
x_shift=1
hy_shift=320
r!� pass%=%0000 � %1010 � %1010
|
P%=code%
� L%=code%+12*1024
� [OPT pass%
� :
� :
� :
� .point
� STMFD R13!,{R1-R12,R14}
� :
� RSB R2,R2, #256
� :
�6; MOV R7, #x_shift ; get screen shifts
�; MOV R8, #y_shift
�6 LDR R9, screenstore ; get screen address
:
ADD r9,r9,r1
ADD r9,r9,r2, ASL #8
&ADD r9,r9,r2, ASL #6
0; MLA R9,R7,R1,R9
:; MLA R1,R8,R2,R9
D :
N STRB R0,[R1]
X :
b LDMFD R13!,{R1-R12,PC}
l :
v .vsync_counter
� CMP R0, #4
� MOVNES PC,R14
� LDR R0, vsyncs
� ADD R0,R0, #1
� STR R0, vsyncs
� MOVS PC,R14
� :
� .vsyncs
� EQUD 0
� :
� .start
� STMFD R13!,{R0-R12,R14}
� :
ADR R0, vdu_vars
ADR R1, screen
; SWI "OS_ReadVduVariables" ; set up vdu variables
LDR R0, screen
* STR R0, screen1
4 LDR R1, screen_size
> ADD R0,R0,R1
H STR R0, screen2
R SWI 256+19
\ SWI 256+0
f SWI 256+24
p SWI 256+240
z SWI 256+240
� SWI 256+112
� BL clg
� :
� MOV R0, #16
� ADR R1, vsync_counter
� MOV R2, #1
� SWI "OS_Claim"
� :
� MOV R0, #14
� MOV R1, #4
� SWI "OS_Byte"
� :
� .total_loop
:
�bordercol(0,0,0)
.vsync_loop
$ LDR R0, vsyncs
. CMP R0, #1
8 BLT vsync_loop
B MOV R0, #0
L STR R0, vsyncs
V :
` LDR R3, screen_bank
j � R3,R3, #1
t STR R3, screen_bank
~ CMP R3, #0
� RSB R1,R3, #2
� LDREQ R3, screen1
� LDRNE R3, screen2
� STR R3, screen
� :
� MOV R0, #113
� SWI "OS_Byte"
� :
��bordercol(255,0,0)
� BL wipe_all
� :
�# SWI "OS_ReadMonotonicTime"
MOV r2,r0
% LDR r0, adr_explosion_spray2
MOV r1, #16
.explo_loop1
( ADD r2,r2,r2, ROR #1
2 LDR r3,[r0]
< � r3,r3,r2
F STR r3,[r0], #4
P SUBS r1,r1, #1
Z BPL explo_loop1
d :
n�bordercol(0,255,0)
x :
� LDR R0, rnd
� TST R0, #255<<8
� BLEQ add_goodie
� TST R0, #255<<4
� BLEQ add_goodie
� :
� BL update_sprites
� :
��bordercol(0,0,255)
� BL update_cells
� :
��bordercol(0,255,255)
� BL split_screen
:
�bordercol(255,255,255)
! SWI "OS_ReadEscapeState"
" BCS end
, :
6 LDR R0, adr_end_game
@ LDR R0,[R0]
J CMP R0, #0
T BNE end
^ :
h LDR R0, rnd
r ADD R0,R0,R0, ROR #1
| � R1,R0, #255<<8
� LDR R1,[R1]
� � R0,R0,R1
� STR R0, rnd
� :
� B total_loop
� :
� .end
� :
��bordercol(0,0,0)
� LDR R3, screen_bank
� � R3,R3, #1
� STR R3, screen_bank
� RSB R1,R3, #2
CMP R3, #0
LDREQ R3, screen1
LDRNE R3, screen2
& STR R3, screen
0 BL clear_screen
: :
D MOV R0, #16
N ADR R1, vsync_counter
X MOV R2, #1
b SWI "OS_Release"
l :
v MOV R0, #13
� MOV R1, #4
� SWI "OS_Byte"
� :
� LDMFD R13!,{R0-R12,PC}
� :
� .adr_end_game
� EQUD end_game
� :
� .screen
� EQUD 0
� .screenstore
� EQUD screenstore%
� .screenbank
EQUD 0
.screen1
EQUD 0
.screen2
* EQUD 0
4 .vdu_vars
>, EQUD 149 ; vdu data
H EQUD -1
R .screen_size
\ EQUD &14000
f .screen_bank
p EQUD 1
z :
� .adr_explosion_spray2
� EQUD explosion_spray
� :
� .wipe_all
� STMFD R13!,{R0-R12,R14}
� :
� LDR R9, adr_slist
�
.wsloop1
� LDMIA R9,{R5-R8}
� :
� MOV R1,R6, LSR #2
� MOV R2,R7, LSR #2
� :
CMP R5, #1
SUBEQ R1,R1, #4
BLEQ fill_fill_2016
$! BEQ wipe_end_sprite_loop
. :
8 CMP R5, #2
B SUBEQ R1,R1, #4
L BLEQ fill_fill_2016
V! BEQ wipe_end_sprite_loop
` :
j CMP R5, #3
t BLT not_a_1212
~ CMP R5, #12
� BGT not_a_1212
� BL fill_fill_1212
�! B wipe_end_sprite_loop
� .not_a_1212
� :
� CMP R5, #13
� BLEQ fill_fill_1264
� :
� CMP R5, #14
� BLEQ fill_fill_1208
� CMP R5, #15
� BLEQ fill_fill_1208
:
.wipe_end_sprite_loop
ADD R9,R9, #16
CMP R5, #0
( BGE wsloop1
2 :
< LDR R9, adr_clist
F
.wcloop1
P LDMIA R9,{R0-R7}
Z MOV R1,R1, ASR #4
d MOV R2,R2, ASR #4
n CMP R0, #0
x BEQ wcell_skip
� CMP R0, #1
� BLEQ fill_fill_0101
� BEQ wcell_skip
� CMP R0, #2
� SUBEQ R1,R1, #2
� SUBEQ R2,R2, #2
� BLEQ fill_fill_0804
� BEQ wcell_skip
� CMP R0, #3
� SUBEQ R1,R1, #2
� SUBEQ R2,R2, #2
� BLEQ fill_fill_0804
� BEQ wcell_skip
CMP R0, #4
SUBEQ R1,R1, #2
SUBEQ R2,R2, #2
" BLEQ fill_fill_0804
, BEQ wcell_skip
6 CMP R0, #5
@ SUBEQ R1,R1, #2
J SUBEQ R2,R2, #2
T BLEQ fill_fill_0804
^ BEQ wcell_skip
h CMP R0, #6
r SUBEQ R1,R1, #4
| SUBEQ R2,R2, #4
� BLEQ fill_fill_1208
� BEQ wcell_skip
� CMP R0, #7
� SUBEQ R1,R1, #2
� SUBEQ R2,R2, #2
� BLEQ fill_fill_0804
� BEQ wcell_skip
� CMP R0, #8
� SUBEQ R1,R1, #2
� SUBEQ R2,R2, #2
� BLEQ fill_fill_0804
� BEQ wcell_skip
� CMP R0, #9
SUBEQ R1,R1, #2
SUBEQ R2,R2, #2
BLEQ fill_fill_0804
& BEQ wcell_skip
0 CMP R0, #10
: SUBEQ R1,R1, #4
D SUBEQ R2,R2, #4
N BLEQ fill_fill_1208
X BEQ wcell_skip
b CMP R0, #11
l SUBEQ R1,R1, #8
v SUBEQ R2,R2, #8
� BLEQ fill_fill_2016
� CMP R0, #12
� SUBEQ R1,R1, #2
� SUBEQ R2,R2, #2
� BLEQ fill_fill_0804
� CMP R0, #13
� SUBEQ R1,R1, #4
� SUBEQ R2,R2, #4
� BLEQ fill_fill_1208
� .wcell_skip
� ADD R9,R9, #32
� CMP R0, #0
� BGE wcloop1
:
LDMFD R13!,{R0-R12,PC}
:
.update_sprites
* STMFD R13!,{R0-R12,R14}
4 :
> LDR R9, adr_slist
H .sloop1
R LDMIA R9,{R5-R8}
\ CMP R5, #1
f BLEQ player1
p BEQ end_sprite_loop
z CMP R5, #2
� BLEQ player2
� BEQ end_sprite_loop
� CMP R5, #3
� BLEQ flame
� BEQ end_sprite_loop
� CMP R5, #4
� BLEQ weapon_pistol
� BEQ end_sprite_loop
� CMP R5, #5
� BLEQ weapon_gun
� BEQ end_sprite_loop
� CMP R5, #6
� BLEQ weapon_mortar
BEQ end_sprite_loop
CMP R5, #7
BLEQ weapon_homing
$ BEQ end_sprite_loop
. CMP R5, #8
8 BLEQ weapon_seeking
B BEQ end_sprite_loop
L CMP R5, #9
V BLEQ weapon_vertical
` BEQ end_sprite_loop
j CMP R5, #10
t BLEQ weapon_thrower
~ BEQ end_sprite_loop
� CMP R5, #11
� BLEQ weapon_bomb
� BEQ end_sprite_loop
� CMP R5, #12
� BLEQ weapon_cluster
� BEQ end_sprite_loop
� CMP R5, #13
� BLEQ door
� BEQ end_sprite_loop
� CMP R5, #14
� BLEQ switch
� BEQ end_sprite_loop
CMP R5, #15
BLEQ gun_gun
.end_sprite_loop
STMIA R9!,{R5-R8}
( CMP R5, #0
2 BGE sloop1
< :
F LDMFD R13!,{R0-R12,PC}
P :
Z .p1_weapon
d EQUD 2
n .p2_weapon
x EQUD 2
� :
� .read_point
� STMFD R13!,{R1-R12,R14}
� :
� RSB R2,R2, #256
� :
�5 MOV R7, #x_shift ; get screen shifts
� MOV R8, #y_shift
�6 LDR R9, screenstore ; get screen address
� :
� MLA R9,R7,R1,R9
� MLA R1,R8,R2,R9
� :
LDRB R0,[R1]
:
LDMFD R13!,{R1-R12,PC}
" :
, .adr_clist
6 EQUD clist%
@ .adr_slist
J EQUD slist%
T :
^ .flame
h STMFD R13!,{R9,R14}
r :
| LDR R10, p1_x
� LDR R11, p1_y
� MOV R9,R6, ASR #2
� ADD R9,R9, #8
� SUB R10,R9,R10
� CMP R10, #0
� BLT not_touched11
� CMP R10, #xext%+8
� BGT not_touched11
� MOV R9,R7, ASR #2
� ADD R9,R9, #10
� SUB R11,R9,R11
� CMP R11, #0
� BLT not_touched11
CMP R11, #yext%+8
BGT not_touched11
" LDR R1, adr_player1_alive
& LDR R0,[R1]
0 CMP R0, #1
: BEQ not_touched11
D MOV R0, #1
N STR R0,[R1]
X MOV R0, #3
b MVN R1, #14
l MOV R2, #scream%
v MOV R3, #0
� SWI "Sound_Control"
� .not_touched11
� LDR R10, p2_x
� LDR R11, p2_y
� MOV R9,R6, ASR #2
� ADD R9,R9, #8
� SUB R10,R9,R10
� CMP R10, #0
� BLT not_touched21
� CMP R10, #xext%+8
� BGT not_touched21
� MOV R9,R7, ASR #2
� ADD R9,R9, #10
SUB R11,R9,R11
CMP R11, #0
BLT not_touched21
CMP R11, #yext%+8
* BGT not_touched21
4" LDR R1, adr_player2_alive
> LDR R0,[R1]
H CMP R0, #1
R BEQ not_touched21
\ MOV R0, #1
f STR R0,[R1]
p MOV R0, #3
z MVN R1, #14
� MOV R2, #scream%
� MOV R3, #0
� SWI "Sound_Control"
� .not_touched21
� :
� ADD R8,R8, #1
� CMP R8, #15
� MOVGT R8, #0
� MOV R0, #2
� ADD R0,R0,R8, LSR #2
� MOV R1,R6, LSR #2
� MOV R2,R7, LSR #2
� BL plot_sprite_1212
:
LDMFD R13!,{R9,PC}
:
$ .adr_player1_alive
. EQUD player1_alive
8 .adr_player2_alive
B EQUD player2_alive
L :
V
.door
` STMFD R13!,{R9,R14}
j :
t TST R8, #256
~ BNE door_closing
� � R0,R8, #31
� CMP R0, #30
� ADDLT R0,R0, #1
� BIC R8,R8, #31
� �R R8,R8,R0
� B do_door
� .door_closing
� � R0,R8, #31
� CMP R0, #0
� SUBGT R0,R0, #1
� BIC R8,R8, #31
� �R R8,R8,R0
.do_door
�R R8,R8, #256
LDR R0, p1_x
LDR R1, p1_y
( SUB R0,R6,R0, ASL #2
2 SUB R1,R7,R1, ASL #2
< CMP R0, #0
F RSBLT R0,R0, #0
P CMP R1, #0
Z RSBLT R1,R1, #0
d ADD R0,R0,R1
n CMP R0, #128
x BICLT R8,R8, #256
� LDR R0, p2_x
� LDR R1, p2_y
� SUB R0,R6,R0, ASL #2
� SUB R1,R7,R1, ASL #2
� CMP R0, #0
� RSBLT R0,R0, #0
� CMP R1, #0
� RSBLT R1,R1, #0
� ADD R0,R0,R1
� CMP R0, #128
� BICLT R8,R8, #256
� .plot_door
� :
� R0,R8, #31
MOV R1,R6, LSR #2
MOV R2,R7, LSR #2
" BL plot_sprite_1264
, :
6 LDMFD R13!,{R9,PC}
@ :
J .switch
T STMFD R13!,{R9,R14}
^ :
h MOV R0, #0
r :
| LDR R1, p1_x
� LDR R2, p1_y
� MOV R3,R6, ASR #2
� MOV R4,R7, ASR #2
� ADD R4,R4, #8
� CMP R2,R4
� BNE not_p1_on
� SUB R3,R3, #6
� CMP R1,R3
� BLT not_p1_on
� ADD R3,R3, #10
� CMP R1,R3
� BGT not_p1_on
� MOV R0, #2
.not_p1_on
LDR R1, p2_x
LDR R2, p2_y
& MOV R3,R6, ASR #2
0 MOV R4,R7, ASR #2
: ADD R4,R4, #8
D CMP R2,R4
N BNE not_p2_on
X SUB R3,R3, #6
b CMP R1,R3
l BLT not_p2_on
v ADD R3,R3, #10
� CMP R1,R3
� BGT not_p2_on
� MOV R0, #1
� .not_p2_on
� :
� ADR R1, guns
� � R2,R8, #3
� STR R0,[R1,R2, LSL #3]
� :
� MOV R0, #16
� MOV R1,R6, LSR #2
� MOV R2,R7, LSR #2
� BL plot_sprite_1208
:
LDMFD R13!,{R9,PC}
:
.guns
* EQUD 0
4 EQUD 0
> EQUD 0
H EQUD 0
R EQUD 0
\ EQUD 0
f EQUD 0
p EQUD 0
z :
�
.gun_gun
� STMFD R13!,{R9,R14}
� :
� ADR R0, guns
� � R2,R8, #3
� LDR R3,[R0,R2, LSL #3]
� ADD R0,R0, #4
� LDR R4,[R0,R2, LSL #3]
� :
� CMP R3, #0
� BEQ no_gun_gun
� ADD R4,R4, #1
� � R4,R4, #%111
STR R4,[R0,R2, LSL #3]
TST R4, #%111
BNE no_gun_gun
$ SUB R5,R3, #1
. MOV R0, #4
8 MOV R1,R6, ASR #2
B MOV R2,R7, ASR #2
L ADD R1,R1, #8
V ADD R2,R2, #5
` RSB R2,R2, #256
j MOV R3, #72
t LDR R4, rnd
~ � R4,R4, #15
� ADD R4,R4, #7
� BL add_cell
� MOV R0, #8
� MVN R1, #4
� MOV R2, #12800
� MOV R3, #1
� SWI "Sound_Control"
� MOV R5, #15
� .no_gun_gun
� :
� MOV R0, #17
� MOV R1,R6, LSR #2
MOV R2,R7, LSR #2
BL plot_sprite_1208
:
LDMFD R13!,{R9,PC}
( :
2 .weapon_pistol
< STMFD R13!,{R9,R14}
F :
P MOV R4, #2
Z BL pick_up
d :
n SUB R8,R8, #1
x CMP R8, #0
� MOVLE R5, #0
� :
� CMP R5, #0
� :
� MOVGT R0, #12
� MOVGT R1,R6, LSR #2
� MOVGT R2,R7, LSR #2
� BLGT plot_sprite_1212
� :
� LDMFD R13!,{R9,PC}
� :
� .weapon_gun
� STMFD R13!,{R9,R14}
:
MOV R4, #3
BL pick_up
" :
, SUB R8,R8, #1
6 CMP R8, #0
@ MOVLE R5, #0
J :
T CMP R5, #0
^ :
h MOVGT R0, #13
r MOVGT R1,R6, LSR #2
| MOVGT R2,R7, LSR #2
� BLGT plot_sprite_1212
� :
� LDMFD R13!,{R9,PC}
� :
� .weapon_mortar
� STMFD R13!,{R9,R14}
� :
� MOV R4, #4
� BL pick_up
� :
� SUB R8,R8, #1
� CMP R8, #0
� MOVLE R5, #0
:
CMP R5, #0
:
& MOVGT R0, #14
0 MOVGT R1,R6, LSR #2
: MOVGT R2,R7, LSR #2
D BLGT plot_sprite_1212
N :
X LDMFD R13!,{R9,PC}
b :
l .weapon_homing
v STMFD R13!,{R9,R14}
� :
� MOV R4, #5
� BL pick_up
� :
� SUB R8,R8, #1
� CMP R8, #0
� MOVLE R5, #0
� :
� CMP R5, #0
� :
� MOVGT R0, #15
� MOVGT R1,R6, LSR #2
� MOVGT R2,R7, LSR #2
! BLGT plot_sprite_1212
! :
! LDMFD R13!,{R9,PC}
! :
!* .weapon_seeking
!4 STMFD R13!,{R9,R14}
!> :
!H MOV R4, #6
!R BL pick_up
!\ :
!f SUB R8,R8, #1
!p CMP R8, #0
!z MOVLE R5, #0
!� :
!� CMP R5, #0
!� :
!� MOVGT R0, #16
!� MOVGT R1,R6, LSR #2
!� MOVGT R2,R7, LSR #2
!� BLGT plot_sprite_1212
!� :
!� LDMFD R13!,{R9,PC}
!� :
!� .weapon_vertical
!� STMFD R13!,{R9,R14}
!� :
" MOV R4, #7
" BL pick_up
" :
"$ SUB R8,R8, #1
". CMP R8, #0
"8 MOVLE R5, #0
"B :
"L CMP R5, #0
"V :
"` MOVGT R0, #17
"j MOVGT R1,R6, LSR #2
"t MOVGT R2,R7, LSR #2
"~ BLGT plot_sprite_1212
"� :
"� LDMFD R13!,{R9,PC}
"� :
"� .weapon_thrower
"� STMFD R13!,{R9,R14}
"� :
"� MOV R4, #8
"� BL pick_up
"� :
"� SUB R8,R8, #1
"� CMP R8, #0
"� MOVLE R5, #0
# :
#
CMP R5, #0
# :
# MOVGT R0, #18
#( MOVGT R1,R6, LSR #2
#2 MOVGT R2,R7, LSR #2
#< BLGT plot_sprite_1212
#F :
#P LDMFD R13!,{R9,PC}
#Z :
#d .weapon_bomb
#n STMFD R13!,{R9,R14}
#x :
#� MOV R4, #9
#� BL pick_up
#� :
#� SUB R8,R8, #1
#� CMP R8, #0
#� MOVLE R5, #0
#� :
#� CMP R5, #0
#� :
#� MOVGT R0, #19
#� MOVGT R1,R6, LSR #2
#� MOVGT R2,R7, LSR #2
#� BLGT plot_sprite_1212
$ :
$ LDMFD R13!,{R9,PC}
$ :
$" .weapon_cluster
$, STMFD R13!,{R9,R14}
$6 :
$@ MOV R4, #10
$J BL pick_up
$T :
$^ SUB R8,R8, #1
$h CMP R8, #0
$r MOVLE R5, #0
$| :
$� CMP R5, #0
$� :
$� MOVGT R0, #20
$� MOVGT R1,R6, LSR #2
$� MOVGT R2,R7, LSR #2
$� BLGT plot_sprite_1212
$� :
$� LDMFD R13!,{R9,PC}
$� :
$� :
$�
.pick_up
$� LDR R10, p1_x
$� LDR R11, p1_y
% MOV R9,R6, ASR #2
% ADD R9,R9, #8
% SUB R10,R9,R10
%& ADD R10,R10, #2
%0 CMP R10, #0
%: BLT not_picked_up1
%D CMP R10, #xext%+10
%N BGT not_picked_up1
%X MOV R9,R7, ASR #2
%b ADD R9,R9, #12
%l SUB R11,R9,R11
%v ADD R11,R11, #2
%� CMP R11, #0
%� BLT not_picked_up1
%� CMP R11, #yext%+14
%� BGT not_picked_up1
%� MOV R5, #0
%� STR R4, p1_weapon
%� MOV R0, #2
%� MVN R1, #14
%� MOV R2, #ping%
%� MOV R3, #0
%� SWI "Sound_Control"
%� .not_picked_up1
%� LDR R10, p2_x
& LDR R11, p2_y
& MOV R9,R6, ASR #2
& ADD R9,R9, #8
& SUB R10,R9,R10
&* ADD R10,R10, #2
&4 CMP R10, #0
&> BLT not_picked_up2
&H CMP R10, #xext%+10
&R BGT not_picked_up2
&\ MOV R9,R7, ASR #2
&f ADD R9,R9, #12
&p SUB R11,R9,R11
&z ADD R11,R11, #2
&� CMP R11, #0
&� BLT not_picked_up2
&� CMP R11, #yext%+16
&� BGT not_picked_up2
&� MOV R5, #0
&� STR R4, p2_weapon
&� MOV R0, #2
&� MVN R1, #14
&� MOV R2, #ping%
&� MOV R3, #0
&� SWI "Sound_Control"
&� .not_picked_up2
&� MOV PC,R14
' :
' :
'
.p1_x
'$ EQUD 0
'.
.p1_y
'8 EQUD 0
'B
.p2_x
'L EQUD 0
'V
.p2_y
'` EQUD 0
'j :
't .rnd
'~ EQUD ��-�
'� :
'� :
'� .update_cells
'� STMFD R13!,{R0-R12,R14}
'� :
'� LDR R9, adr_clist
'� .cloop1
'� LDMIA R9,{R1-R8}
'� CMP R1, #1
'� BLEQ spray
'� BEQ cell_skip
'� CMP R1, #8
( BLEQ spray2
(
BEQ cell_skip
( CMP R1, #9
( BLEQ spray3
(( BEQ cell_skip
(2 CMP R1, #2
(< BLEQ pistol
(F BEQ cell_skip
(P CMP R1, #3
(Z BLEQ gun
(d BEQ cell_skip
(n CMP R1, #4
(x BLEQ mortar
(� BEQ cell_skip
(� CMP R1, #5
(� BLEQ homing
(� BEQ cell_skip
(� CMP R1, #6
(� BLEQ seeking
(� BEQ cell_skip
(� CMP R1, #7
(� BLEQ vertical
(� BEQ cell_skip
(� CMP R1, #10
(� BLEQ thrower
(� BEQ cell_skip
) CMP R1, #11
) BLEQ explode
) BEQ cell_skip
)" CMP R1, #12
), BLEQ bomb
)6 BEQ cell_skip
)@ CMP R1, #13
)J BLEQ cluster
)T .cell_skip
)^ STMIA R9!,{R1-R8}
)h CMP R1, #0
)r BGT cloop1
)| BNE not_null
)� LDR R1, adr_bclist
)� SUB R2,R9, #32
)� CMP R2,R1
)� MOVLT R1,R2
)� STR R1, adr_bclist
)� B cloop1
)� .not_null
)� :
)� LDMFD R13!,{R0-R12,PC}
)� :
)� .adr_bclist
)� EQUD clist%
)� :
* .spray
* STMFD R13!,{R9,R14}
* :
*& SUB R5,R5, #1
*0 ADD R2,R2,R4
*: ADD R3,R3,R5
*D SUB R6,R6, #1
*N CMP R6, #0
*X MOVLE R1, #0
*b LDMLEFD R13!,{R9,PC}
*l :
*v STMFD R13!,{R1-R6}
*� :
*� MOV R2,R2, ASR #4
*� MOV R3,R3, ASR #4
*� CMP R2, #0
*� BLT no_spray
*� CMP R3, #0
*� BLT no_spray
*� CMP R2, #320
*� BGE no_spray
*� CMP R3, #256
*� BGE no_spray
*� RSB R3,R3, #256
*� LDR R4, screenstore
+ MOV R5, #y_shift
+ ADD R4,R4,R2
+ MLA R4,R5,R3,R4
+ LDRB R0,[R4]
+* CMP R0, #0
+4 �Q R10, #1
+> MOVNE R10, #0
+H BNE no_spray
+R LDR R0, adr_flame_fade
+\ MOV R9,R6, ASL #3
+f CMP R9, #255
+p MOVGT R9, #255
+z LDRB R0,[R0,R9]
+� STRB R0,[R4]
+� .no_spray
+� :
+� LDMFD R13!,{R1-R6}
+� CMP R10, #0
+� RSBEQ R5,R5, #0
+� �Q R5,R5, ASR #1
+� LDMFD R13!,{R9,PC}
+� :
+� .spray2
+� STMFD R13!,{R9,R14}
+� :
+� SUB R5,R5, #1
, ADD R2,R2,R4
, ADD R3,R3,R5
, SUB R6,R6, #1
,$ CMP R6, #0
,. MOVLE R1, #0
,8 LDMLEFD R13!,{R9,PC}
,B :
,L STMFD R13!,{R1-R6}
,V STMFD R13!,{R6}
,` :
,j MOV R6, #0
,t BL check_death
,~ MOV R6, #1
,� BL check_death
,� LDMFD R13!,{R6}
,� :
,� MOV R2,R2, ASR #4
,� MOV R3,R3, ASR #4
,� CMP R2, #0
,� BLT no_spray2
,� CMP R3, #0
,� BLT no_spray2
,� CMP R2, #320
,� BGE no_spray2
,� CMP R3, #256
- BGE no_spray2
-
RSB R3,R3, #256
- SUB R2,R2, #1
- SUB R3,R3, #1
-( LDR R4, screenstore
-2 MOV R5, #y_shift
-< ADD R4,R4,R2
-F; MLA R4,R5,R3,R4
-PADD R4,R4,R3, ASL #8
-ZADD R4,R4,R3, ASL #6
-d LDRB R0,[R4]
-n CMP R0, #0
-x �Q R10, #1
-� MOVNE R10, #0
-� BNE no_spray2
-� LDR R0, adr_flame_fade
-� MOV R9,R6, ASL #3
-� CMP R9, #255
-� MOVGT R9, #255
-� LDRB R0,[R0,R9]
-� STRB R0,[R4, #1]
-� ADD R4,R4, #y_shift
-� STRB R0,[R4]
-� STRB R0,[R4, #1]
-� STRB R0,[R4, #2]
-� ADD R4,R4, #y_shift
. STRB R0,[R4, #1]
. .no_spray2
. :
." LDMFD R13!,{R1-R6}
., CMP R10, #0
.6 RSBEQ R5,R5, #0
.@ RSBEQ R4,R4, #0
.J LDMFD R13!,{R9,PC}
.T :
.^ .spray3
.h STMFD R13!,{R9,R14}
.r :
.| SUB R5,R5, #1
.� ADD R2,R2,R4
.� ADD R3,R3,R5
.� � R0,R6, #255<<8
.� SUB R0,R0, #1
.� CMP R0, #0
.� MOVLE R1, #0
.� LDMLEFD R13!,{R9,PC}
.� BIC R6,R6, #255<<8
.� �R R6,R6,R0
.� :
.� STMFD R13!,{R1-R6}
.� :
.� MOV R6, #0
/ BL check_death
/ MOV R6, #1
/ BL check_death
/& :
/0 MOV R2,R2, ASR #4
/: MOV R3,R3, ASR #4
/D CMP R2, #0
/N BLT no_spray3
/X CMP R3, #0
/b BLT no_spray3
/l CMP R2, #320
/v BGE no_spray3
/� CMP R3, #256
/� BGE no_spray3
/� RSB R3,R3, #256
/� SUB R2,R2, #1
/� SUB R3,R3, #1
/� LDR R4, screenstore
/� MOV R5, #y_shift
/� ADD R4,R4,R2
/�; MLA R4,R5,R3,R4
/�ADD R4,R4,R3, ASL #8
/�ADD R4,R4,R3, ASL #6
/� LDRB R0,[R4]
/� CMP R0, #0
0 �Q R10, #1
0 MOVNE R10, #0
0 BNE no_spray3
0 MOV R0, #255
0* STRB R0,[R4, #1]
04 ADD R4,R4, #y_shift
0> STRB R0,[R4]
0H STRB R0,[R4, #1]
0R STRB R0,[R4, #2]
0\ ADD R4,R4, #y_shift
0f STRB R0,[R4, #1]
0p .no_spray3
0z :
0� LDMFD R13!,{R1-R6}
0� CMP R10, #0
0� RSBEQ R5,R5, #0
0� RSBEQ R4,R4, #0
0� LDMFD R13!,{R9,PC}
0� :
0� .adr_flame_fade
0� EQUD flame_fade%
0� :
0� .adr_gun_fade
0� EQUD gun_fade%
0� :
0�
.thrower
1 STMFD R13!,{R9,R14}
1 :
1 ADD R2,R2,R4
1$ ADD R3,R3,R5
1. � R7,R6, #255<<8
18 MOV R7,R7, ASR #8
1B ADD R7,R7, #1
1L CMP R7, #15
1V MOVGE R1, #0
1` LDMGEFD R13!,{R9,PC}
1j BIC R6,R6, #255<<8
1t �R R6,R6,R7, ASL #8
1~ :
1� STMFD R13!,{R1-R6}
1� :
1� BL check_death
1� :
1� MOV R2,R2, ASR #4
1� MOV R3,R3, ASR #4
1� RSB R3,R3, #256
1� LDR R4, screenstore
1� MOV R5, #y_shift
1� ADD R4,R4,R2
1� MLA R4,R5,R3,R4
1� LDRB R0,[R4, #2]
2 CMP R0, #0
2
�Q R10, #1
2 MOVNE R10, #0
2 BNE no_thrower
2( RSB R3,R3, #256
22 MOV R0,R7
2< SUB R1,R2, #4
2F SUB R2,R3, #4
2P BL plot_sprite_1208
2Z .no_thrower
2d :
2n LDMFD R13!,{R1-R6}
2x CMP R10, #0
2� �Q R1, #0
2� LDMFD R13!,{R9,PC}
2� :
2�
.explode
2� STMFD R13!,{R9,R14}
2� :
2� ADD R2,R2,R4
2� ADD R3,R3,R5
2� � R7,R6, #255<<8
2� MOV R7,R7, ASR #8
2� ADD R7,R7, #1
2� CMP R7, #15
2� MOVGE R1, #0
3 LDMGEFD R13!,{R9,PC}
3 BIC R6,R6, #255<<8
3 �R R6,R6,R7, ASL #8
3" ADD R7,R7, #8
3, :
36 STMFD R13!,{R1-R6}
3@ :
3J BL check_death
3T :
3^ MOV R2,R2, ASR #4
3h MOV R3,R3, ASR #4
3r RSB R3,R3, #256
3| LDR R4, screenstore
3� MOV R5, #y_shift
3� ADD R4,R4,R2
3� MLA R4,R5,R3,R4
3� LDRB R0,[R4, #2]
3� CMP R0, #0
3� �Q R10, #1
3� MOVNE R10, #0
3� BNE no_explode
3� RSB R3,R3, #256
3� MOV R0,R7
3� SUB R1,R2, #8
3� SUB R2,R3, #8
3� BL plot_sprite_2016
4 .no_explode
4 :
4 LDMFD R13!,{R1-R6}
4& CMP R10, #0
40 LDMFD R13!,{R9,PC}
4: :
4D .pistol
4N STMFD R13!,{R9,R14}
4X :
4b ADD R2,R2,R4
4l ADD R3,R3,R5
4v CMP R4, #0
4� MOVLT R7, #1
4� MOVGT R7, #0
4� :
4� STMFD R13!,{R1-R6}
4� :
4� BL check_death
4� :
4� MOV R2,R2, ASR #4
4� MOV R3,R3, ASR #4
4� RSB R3,R3, #256
4� LDR R4, screenstore
4� MOV R5, #y_shift
4� ADD R4,R4,R2
5 MLA R4,R5,R3,R4
5 LDRB R0,[R4, #2]
5 CMP R0, #0
5 �Q R10, #1
5* MOVNE R10, #0
54 BNE no_pistol
5> RSB R3,R3, #256
5H MOV R0,R7
5R SUB R1,R2, #2
5\ SUB R2,R3, #2
5f BL plot_sprite_0804
5p;LDR R0, adr_gun_fade
5z;MOV R9, #255
5�;LDRB R0,[R0,R9]
5�;STRB R0,[R4]
5�;STRB R0,[R4, #1]
5� .no_pistol
5� :
5� LDMFD R13!,{R1-R6}
5� CMP R10, #0
5� �Q R1, #0
5� LDMFD R13!,{R9,PC}
5� :
5� .gun
5� STMFD R13!,{R9,R14}
5� :
6 ADD R2,R2,R4
6 ADD R3,R3,R5
6 CMP R4, #0
6$ MOVLT R7, #3
6. MOVGT R7, #2
68 :
6B STMFD R13!,{R1-R6}
6L :
6V MOV R6, #0
6` BL check_death
6j MOV R6, #1
6t BL check_death
6~ :
6� MOV R2,R2, ASR #4
6� MOV R3,R3, ASR #4
6� RSB R3,R3, #256
6� LDR R4, screenstore
6� MOV R5, #y_shift
6� ADD R4,R4,R2
6� MLA R4,R5,R3,R4
6� LDRB R0,[R4]
6� CMP R0, #0
6� �Q R10, #1
6� MOVNE R10, #0
6� BNE no_gun
7 RSB R3,R3, #256
7
MOV R0,R7
7 SUB R1,R2, #2
7 SUB R2,R3, #2
7( BL plot_sprite_0804
72;LDR R0, adr_gun_fade
7<;MOV R9, #255
7F;LDRB R0,[R0,R9]
7P;STRB R0,[R4]
7Z .no_gun
7d :
7n LDMFD R13!,{R1-R6}
7x CMP R10, #0
7� �Q R1, #0
7� LDMFD R13!,{R9,PC}
7� :
7� .mortar
7� STMFD R13!,{R9,R14}
7� :
7� SUB R5,R5, #1
7� MOV R0, #32
7� RSB R0,R0, #0
7� CMP R5,R0
7� MOVLT R5,R0
7� ADD R2,R2,R4
7� ADD R3,R3,R5
8 :
8 STMFD R13!,{R1-R6}
8 :
8" BL check_death
8, :
86 MOV R2,R2, ASR #4
8@ MOV R3,R3, ASR #4
8J RSB R3,R3, #256
8T LDR R4, screenstore
8^ MOV R5, #y_shift
8h ADD R4,R4,R2
8r MLA R4,R5,R3,R4
8| LDRB R0,[R4]
8� CMP R0, #0
8� �Q R10, #1
8� MOVNE R10, #0
8� �Q R0, #255
8� STREQB R0,[R4]
8� STREQB R0,[R4, #1]
8� ADD R2,R4, #y_shift
8� STREQB R0,[R2]
8� STREQB R0,[R2, #1]
8� :
8� LDMFD R13!,{R1-R6}
8� CMP R10, #0
8� BNE end_mortar
9 SUB R2,R2,R4, ASL #1
9 SUB R3,R3,R5, ASL #1
9 MOV R1,R2, ASR #4
9& MOV R2,R3, ASR #4
90 RSB R2,R2, #256
9: MOV R9, #0
9D% LDR R10, adr_explosion_spray
9N MOV R0, #8
9X LDR R8, rnd
9b � R8,R8, #7
9l MOV R6, #16<<8
9v MOV R5, #32
9� .mortar_loop1
9� LDRB R3,[R10], #1
9� LDRB R4,[R10], #1
9� MOV R3,R3, LSL #24
9� MOV R4,R4, LSL #24
9� MOV R3,R3, ASR #24
9� MOV R4,R4, ASR #24
9� � R3,R3, R8
9� � R4,R4, R8
9� MOV R3,R3, ASR #1
9� MOV R4,R4, ASR #1
9� SUB R3,R3,R3, ASR #2
9� SUB R4,R4,R4, ASR #2
: ADD R6,R6,R3, ASL #8
: ADD R6,R6,R4, ASL #8
: � R6,R6, #31<<8
: BL add_cell
:* CMP R9, #8
:4 �Q R0, #9
:> MOVGE R5,R6
:H ADD R9,R9, #1
:R CMP R9, #16
:\ BLE mortar_loop1
:f MOV R5, #1
:p MOV R0, #1
:z MVN R1, #8
:� MOV R2, #boom%
:� MOV R3, #0
:� SWI "Sound_Control"
:� MOV R1, #0
:� .end_mortar
:� :
:� LDMFD R13!,{R9,PC}
:� :
:�
.cluster
:� STMFD R13!,{R9,R14}
:� :
:� MVN R0, #256
:� CMP R5,R0
; MOVLT R5,R0
; ADD R2,R2,R4, ASR #3
; ADD R3,R3,R5, ASR #3
;$ CMP R4, #0
;. ADDLT R4,R4, #1
;8 SUBGT R4,R4, #1
;B MOV R10,R6
;L :
;V STMFD R13!,{R1-R6}
;` :
;j MOV R2,R2, ASR #4
;t MOV R3,R3, ASR #4
;~ RSB R3,R3, #256
;� LDR R4, screenstore
;� MOV R5, #y_shift
;� ADD R4,R4,R2
;� MLA R4,R5,R3,R4
;� LDRB R0,[R4, #4]
;� CMP R0, #0
;� SUBNE R10,R10, #1
;� BNE no_cluster
;� RSB R3,R3, #256
;� MOV R0, #18
;� SUB R1,R2, #4
;� SUB R2,R3, #4
<