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 <