Home » Archimedes archive » Acorn User » Acorn User - PD Pack 1.adf » 2Play » !Play/!RunImage4
!Play/!RunImage4
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/!RunImage4 |
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 Boom 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%=16384 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, #32 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] 23280 CMP R0, #2 23290 BEQ p2_fire_pistol 23300 CMP R0, #3 23310 BEQ p2_fire_gun 23320 CMP R0, #4 23330 BEQ p2_fire_mortar 23340 CMP R0, #5 23350 BEQ p2_fire_homing 23360 CMP R0, #6 23370 BEQ p2_fire_seeking 23380 CMP R0, #7 23390 BEQ p2_fire_vertical 23400 CMP R0, #8 23410 BEQ p2_fire_flame 23420 CMP R0, #9 23430 BEQ p2_fire_bomb 23440 CMP R0, #10 23450 BEQ p2_fire_cluster 23460 : 23470 .p2_fire_pistol 23480 LDR R0, p2_fire 23490 CMP R0, #0 23500 BEQ p2_pistol_shot 23510 MOV R0, #129 23520 MOV R1, #0 23530 SUB R1,R1, #59 23540 MOV R2, #255 23550 SWI "OS_Byte" 23560 CMP R1, #255 23570 MOVNE R0, #0 23580 STRNE R0, p2_fire 23590 B p2_not_fire_pistol 23600 .p2_pistol_shot 23610 MOV R0, #129 23620 MOV R1, #0 23630 SUB R1,R1, #59 23640 MOV R2, #255 23650 SWI "OS_Byte" 23660 CMP R1, #255 23670 BNE p2_not_fire_pistol 23680 MOV R0, #2 23690 MOV R1,R6, LSR #2 23700 MOV R2,R7, LSR #2 23710 ADD R1,R1, #xext% 23720 ADD R2,R2, #yext%/4*2 23730 RSB R2,R2, #256 23740 MOV R3, #80 23750 MOV R4, #0 23760 MOV R5, #0 23770 TST R8, #1 23780 RSBNE R3,R3, #0 23790 SUBNE R1,R1, #xext% 23800 BL add_cell 23810 MOV R5, #2 23820 MOV R0, #1 23830 STR R0, p2_fire 23840 MOV R0, #7 23850 MVN R1, #14 23860 MOV R2, #12800 23870 MOV R3, #0 23880 SWI "Sound_Control" 23890 .p2_not_fire_pistol 23900 B p2_end_fire 23910 : 23920 .p2_fire_gun 23930 MOV R0, #129 23940 MOV R1, #0 23950 SUB R1,R1, #59 23960 MOV R2, #255 23970 SWI "OS_Byte" 23980 CMP R1, #255 23990 BNE p2_not_fire_gun 24000 LDR R0, p2_fire 24010 ADD R0,R0, #1 24020 AND R0,R0, #%11 24030 STR R0, p2_fire 24040 TST R0, #%11 24050 BNE p2_not_fire_gun 24060 MOV R0, #3 24070 MOV R1,R6, LSR #2 24080 MOV R2,R7, LSR #2 24090 ADD R1,R1, #xext% 24100 ADD R2,R2, #yext%/4*2 24110 RSB R2,R2, #256 24120 MOV R3, #80 24130 LDR R5, adr_rnd 24140 LDR R5,[R5] 24150 AND R4,R5, #%1111 24160 SUB R4,R4, #%0111 24170 AND R5,R5, #%110000 24180 MOV R5,R5, LSR #4 24190 ADD R1,R1,R5 24200 MOV R5, #0 24210 TST R8, #1 24220 RSBNE R3,R3, #0 24230 SUBNE R1,R1, #xext%+2 24240 BL add_cell 24250 MOV R5, #2 24260 MOV R0, #gun_sound% 24270 MVN R1, #10 24280 MOV R2, #gun_rate% 24290 MOV R3, #0 24300 SWI "Sound_Control" 24310 .p2_not_fire_gun 24320 B p2_end_fire 24330 : 24340 .p2_fire_mortar 24350;LDR R0, p2_fire 24360;CMP R0, #0 24370;BEQ p2_mortar_shot 24380;MOV R0, #129 24390;MOV R1, #0 24400;SUB R1,R1, #59 24410;MOV R2, #255 24420;SWI "OS_Byte" 24430;CMP R1, #255 24440;MOVNE R0, #0 24450;STRNE R0, p2_fire 24460;B p2_not_fire_mortar 24470;.p2_mortar_shot 24480 MOV R0, #129 24490 MOV R1, #0 24500 SUB R1,R1, #59 24510 MOV R2, #255 24520 SWI "OS_Byte" 24530 CMP R1, #255 24540 BNE p2_not_fire_mortar 24550 LDR R0, p2_fire 24560 ADD R0,R0, #1 24570 AND R0,R0, #%11111 24580 STR R0, p2_fire 24590 TST R0, #%11111 24600 BNE p2_not_fire_mortar 24610 MOV R0, #4 24620 MOV R1,R6, LSR #2 24630 MOV R2,R7, LSR #2 24640 ADD R1,R1, #xext% 24650 ADD R2,R2, #yext%/4*2 24660 RSB R2,R2, #256 24670 MOV R3, #30 24680 MOV R4, #40 24690 MOV R5, #0 24700 TST R8, #1 24710 RSBNE R3,R3, #0 24720 SUBNE R1,R1, #xext% 24730 BL add_cell 24740 MOV R5, #2 24750 MOV R0, #1 24760 STR R0, p2_fire 24770 .p2_not_fire_mortar 24780 B p2_end_fire 24790 : 24800 .p2_fire_homing 24810 .p2_homing_shot 24820 MOV R0, #129 24830 MOV R1, #0 24840 SUB R1,R1, #59 24850 MOV R2, #255 24860 SWI "OS_Byte" 24870 CMP R1, #255 24880 BNE p2_not_fire_homing 24890 LDR R0, p2_fire 24900 ADD R0,R0, #1 24910 AND R0,R0, #%1111 24920 STR R0, p2_fire 24930 TST R0, #%1111 24940 BNE p2_not_fire_homing 24950 MOV R0, #5 24960 MOV R1,R6, LSR #2 24970 MOV R2,R7, LSR #2 24980 ADD R1,R1, #xext% 24990 ADD R2,R2, #yext%/4*2 25000 RSB R2,R2, #256 25010 MOV R3, #64 25020 LDR R4, adr_rnd 25030 LDR R4,[R4] 25040 AND R4,R4, #15 25050 SUB R4,R4, #7 25060 MOV R5, #224<<8 ; Homing in on player 1 25070 TST R8, #1 25080 RSBNE R3,R3, #0 25090 SUBNE R1,R1, #xext% 25100 BL add_cell 25110 MOV R5, #7 25120 MOV R0, #homing_sound% 25130 MVN R1, #8 25140 MOV R2, #homing_rate% 25150 MOV R3, #0 25160 SWI "Sound_Control" 25170 .p2_not_fire_homing 25180 B p2_end_fire 25190 : 25200 .p2_fire_seeking 25210 .p2_seeking_shot 25220 MOV R0, #129 25230 MOV R1, #0 25240 SUB R1,R1, #59 25250 MOV R2, #255 25260 SWI "OS_Byte" 25270 CMP R1, #255 25280 BNE p2_not_fire_seeking 25290 MOV R0, #6 25300 MOV R1,R6, LSR #2 25310 MOV R2,R7, LSR #2 25320 ADD R1,R1, #xext%*3/2 25330 ADD R2,R2, #yext%/4*2 25340 RSB R2,R2, #256 25350 MOV R3, #32 25360 MOV R4, #0 25370 MOV R5, #0 ; Homing in on player 1 25380 TST R8, #1 25390 RSBNE R3,R3, #0 25400 SUBNE R1,R1, #xext%*2 25410 BL add_cell 25420 MOV R5, #2 25430 MOV R9, #2 25440 LDR R10, adr_p2_weapon 25450 STR R9,[R10] 25460 MOV R0, #seeking_sound% 25470 MVN R1, #14 25480 MOV R2, #seeking_rate% 25490 MOV R3, #0 25500 SWI "Sound_Control" 25510 MOV R0, #1 25520 STR R0, p2_fire 25530 .p2_not_fire_seeking 25540 B p2_end_fire 25550 : 25560 .p2_fire_vertical 25570 LDR R0, p2_fire 25580 CMP R0, #0 25590 BEQ p2_vertical_shot 25600 MOV R0, #129 25610 MOV R1, #0 25620 SUB R1,R1, #59 25630 MOV R2, #255 25640 SWI "OS_Byte" 25650 CMP R1, #255 25660 MOVNE R0, #0 25670 STRNE R0, p2_fire 25680 B p2_not_fire_vertical 25690 .p2_vertical_shot 25700 MOV R0, #129 25710 MOV R1, #0 25720 SUB R1,R1, #59 25730 MOV R2, #255 25740 SWI "OS_Byte" 25750 CMP R1, #255 25760 BNE p2_not_fire_vertical 25770 MOV R0, #7 25780 MOV R1,R6, LSR #2 25790 MOV R2,R7, LSR #2 25800 ADD R1,R1, #xext% 25810 ADD R2,R2, #yext%/4*2 25820 RSB R2,R2, #256 25830 MOV R3, #0 25840 MOV R4, #64 25850 MOV R5, #0 25860 TST R8, #1 25870 RSBNE R3,R3, #0 25880 SUBNE R1,R1, #xext% 25890 BL add_cell 25900 MOV R5, #2 25910 MOV R0, #1 25920 STR R0, p2_fire 25930 MOV R0, #7 25940 MVN R1, #14 25950 MOV R2, #10240 25960 MOV R3, #0 25970 SWI "Sound_Control" 25980 .p2_not_fire_vertical 25990 B p2_end_fire 26000 : 26010 .p2_fire_flame 26020 MOV R0, #129 26030 MOV R1, #0 26040 SUB R1,R1, #59 26050 MOV R2, #255 26060 SWI "OS_Byte" 26070 CMP R1, #255 26080 BNE p2_not_fire_flame 26090 MOV R0, #10 26100 MOV R1,R6, LSR #2 26110 MOV R2,R7, LSR #2 26120 ADD R1,R1, #xext% 26130 ADD R2,R2, #yext%/4*2 26140 RSB R2,R2, #256 26150 MOV R3, #72 26160 LDR R4, adr_rnd 26170 LDR R4,[R4] 26180 AND R4,R4, #7 26190 SUB R4,R4, #1 26200 MOV R5,R5, LSR #4 26210 ADD R1,R1,R5 26220 MOV R5, #0 26230 TST R8, #1 26240 RSBNE R3,R3, #0 26250 SUBNE R1,R1, #xext% 26260 BL add_cell 26270 .p2_not_fire_flame 26280 B p2_end_fire 26290 : 26300 .p2_fire_bomb 26310 MOV R0, #129 26320 MOV R1, #0 26330 SUB R1,R1, #59 26340 MOV R2, #255 26350 SWI "OS_Byte" 26360 CMP R1, #255 26370 BNE p2_not_fire_bomb 26380 LDR R0, p2_fire 26390 ADD R0,R0, #1 26400 CMP R0, #10 26410 MOVGT R0, #0 26420 STR R0, p2_fire 26430 CMP R0, #0 26440 BNE p2_not_fire_bomb 26450 MOV R0, #12 26460 MOV R1,R6, LSR #2 26470 MOV R2,R7, LSR #2 26480 ADD R1,R1, #xext%+1 26490 ADD R2,R2, #yext%/4*2 26500 RSB R2,R2, #256 26510 MOV R3, #40 26520 MOV R4, #40 26530 MOV R5, #bomb_pause% 26540 TST R8, #1 26550 RSBNE R3,R3, #0 26560 SUBNE R1,R1, #xext%+2 26570 BL add_cell 26580 MOV R5, #2 26590 MOV R0, #1 26600 STR R0, p2_fire 26610 .p2_not_fire_bomb 26620 B p2_end_fire 26630 : 26640 .p2_fire_cluster 26650 MOV R0, #129 26660 MOV R1, #0 26670 SUB R1,R1, #59 26680 MOV R2, #255 26690 SWI "OS_Byte" 26700 CMP R1, #255 26710 BNE p2_not_fire_cluster 26720 MOV R0, #13 26730 MOV R1,R6, LSR #2 26740 MOV R2,R7, LSR #2 26750 ADD R1,R1, #xext%+1 26760 ADD R2,R2, #yext%/4*2 26770 RSB R2,R2, #256 26780 MOV R3, #512 26790 MOV R4, #128 26800 MOV R5, #bomb_pause%*.25 26810 TST R8, #1 26820 RSBNE R3,R3, #0 26830 SUBNE R1,R1, #xext%+2 26840 BL add_cell 26850 ADD R3,R3, #64 26860 ADD R4,R4, #64 26870 ADD R5,R5, #32 26880 BL add_cell 26890 ADD R3,R3, #64 26900 ADD R4,R4, #64 26910 ADD R5,R5, #32 26920 BL add_cell 26930 MOV R9, #2 26940 LDR R10, adr_p2_weapon 26950 STR R9,[R10] 26960 MOV R5, #2 26970 MOV R0, #1 26980 STR R0, p2_fire 26990 .p2_not_fire_cluster 27000 B p2_end_fire 27010 : 27020 .p2_end_fire 27030 : 27040 MOV R0, #1 27050 MOV R1,R6, LSR #2 27060 MOV R2,R7, LSR #2 27070 TST R8, #1 27080 ADDNE R1,R1, #xext% 27090 ADD R2,R2, #yext%/4 27100 RSB R2,R2, #256 27110 LDR R3, adr_rnd 27120 LDR R3,[R3] 27130 TST R3, #%10000 27140 SUBEQ R2,R2, #1 27150 AND R3,R3, #15 27160 SUB R3,R3, #7 27170 MOV R4, #0 27180 SUB R4,R4, #40 27190 MOV R5, #32 27200 BL add_cell 27210 MOV R5, #2 27220 : 27230 AND R0,R8, #1 27240 ADD R0,R0, #2 27250 MOV R1,R6, LSR #2 27260 MOV R2,R7, LSR #2 27270 LDR R3, adr_p2_x 27280 STR R1,[R3] 27290 LDR R3, adr_p2_y 27300 STR R2,[R3] 27310 BL plot_sprite_1616 27320 : 27330 LDMFD R13!,{R9,PC} 27340 : 27350 .adr_p2_x 27360 EQUD p2_x 27370 .adr_p2_y 27380 EQUD p2_y 27390 .adr_p2_weapon 27400 EQUD p2_weapon 27410 .adr_p1_weapon 27420 EQUD p1_weapon 27430 .p1_fire 27440 EQUD 0 27450 .explode_1 27460 EQUD 0 27470 : 27480 .player1 27490 STMFD R13!,{R9,R14} 27500 : 27510 CMP R6, #32 27520 MOVLT R6, #32 27530 CMP R7, #32 27540 MOVLT R7, #32 27550 CMP R6, #1280-64 27560 MOVGT R6, #1280-64 27570 CMP R7, #1024-64 27580 MOVGT R7, #1024-64 27590 : 27600 LDR R0, player1_alive 27610 CMP R0, #0 27620 BEQ play_player1 27630 BNE explode_player1 27640 : 27650 .explode_player1 27660 LDR R0, explode_1 27670 ADD R0,R0, #1 27680 STR R0, explode_1 27690 CMP R0, #7<<3 27700 STRGT R0, end_game 27710 LDMGTFD R13!,{R9,PC} 27720 CMP R0, #7<<1 27730 LDMGTFD R13!,{R9,PC} 27740 MOV R0,R0, ASR #1 27750 MOV R1,R6, ASR #2 27760 MOV R2,R7, ASR #2 27770 SUB R1,R1, #4 27780 BL plot_sprite_2016 27790 : 27800 LDMFD R13!,{R9,PC} 27810 : 27820 .play_player1 27830 : 27840 MOV R1,R6, LSR #2 27850 MOV R2,R7, LSR #2 27860 ADD R1,R1, #xext%/2 27870 BL read_point 27880 CMP R0, #0 27890 SUBEQ R7,R7, #4 27900 : 27910 MOV R1,R6, LSR #2 27920 MOV R2,R7, LSR #2 27930 ADD R1,R1, #xext%/3 27940 BL read_point 27950 CMP R0, #0 27960 ADDNE R7,R7, #4 27970 : 27980 MOV R1,R6, LSR #2 27990 MOV R2,R7, LSR #2 28000 ADD R1,R1, #xext%/3*2 28010 BL read_point 28020 CMP R0, #0 28030 ADDNE R7,R7, #4 28040 : 28050 AND R10,R8, #255<<8 28060 MOV R10,R10, LSR #8 28070 : 28080 MOV R1,R6, LSR #2 28090 MOV R2,R7, LSR #2 28100 ADD R1,R1, #xext%-1 28110 ADD R2,R2, #8 28120 BL read_point 28130 CMP R0, #0 28140 BNE p1_not_right 28150 MOV R1,R6, LSR #2 28160 MOV R2,R7, LSR #2 28170 ADD R1,R1, #xext% 28180 ADD R2,R2, #yext%-2 28190 BL read_point 28200 CMP R0, #0 28210 BNE p1_not_right 28220 MOV R0, #129 28230 MOV R1, #0 28240 SUB R1,R1, #67 28250 MOV R2, #255 28260 SWI "OS_Byte" 28270 CMP R1, #255 28280 BNE p1_not_right 28290 ADD R10,R10, #4 28300 BIC R8,R8, #1 28310 .p1_not_right 28320 : 28330 MOV R1,R6, LSR #2 28340 MOV R2,R7, LSR #2 28350 SUB R1,R1, #1 28360 ADD R2,R2, #8 28370 BL read_point 28380 CMP R0, #0 28390 BNE p1_not_left 28400 MOV R1,R6, LSR #2 28410 MOV R2,R7, LSR #2 28420 SUB R1,R1, #1 28430 ADD R2,R2, #yext%-2 28440 BL read_point 28450 CMP R0, #0 28460 BNE p1_not_left 28470 MOV R0, #129 28480 MOV R1, #0 28490 SUB R1,R1, #98 28500 MOV R2, #255 28510 SWI "OS_Byte" 28520 CMP R1, #255 28530 BNE p1_not_left 28540 SUB R10,R10, #4 28550 ORR R8,R8, #1 28560 .p1_not_left 28570 : 28580 CMP R10, #128 28590 BEQ p1_sideways 28600 BGT p1_right 28610 MOV R1,R6, LSR #2 28620 MOV R2,R7, LSR #2 28630 SUB R1,R1, #1 28640 ADD R2,R2, #8 28650 BL read_point 28660 CMP R0, #0 28670 MOVNE R10, #128 28680 MOV R1,R6, LSR #2 28690 MOV R2,R7, LSR #2 28700 SUB R1,R1, #1 28710 ADD R2,R2, #yext%-2 28720 BL read_point 28730 CMP R0, #0 28740 MOVNE R10, #128 28750 B p1_sideways 28760 .p1_right 28770 MOV R1,R6, LSR #2 28780 MOV R2,R7, LSR #2 28790 ADD R1,R1, #xext% 28800 ADD R2,R2, #8 28810 BL read_point 28820 CMP R0, #0 28830 MOVNE R10, #128 28840 MOV R1,R6, LSR #2 28850 MOV R2,R7, LSR #2 28860 ADD R1,R1, #xext% 28870 ADD R2,R2, #yext%-2 28880 BL read_point 28890 CMP R0, #0 28900 MOVNE R10, #128 28910 B p1_sideways 28920 .p1_sideways 28930 CMP R10, #128+25*2 28940 MOVGT R10, #128+25*2 28950 CMP R10, #128-25*2 28960 MOVLT R10, #128-25*2 28970 CMP R10, #128 28980 ADDLT R10,R10, #1 28990 SUBGT R10,R10, #1 29000 BIC R8,R8, #255<<8 29010 ORR R8,R8,R10, LSL #8 29020 SUB R10,R10, #128 29030 ADD R6,R6,R10, ASR #3 29040 : 29050 AND R10,R8, #255<<16 29060 MOV R10,R10, LSR #16 29070 : 29080 MOV R1,R6, LSR #2 29090 MOV R2,R7, LSR #2 29100 ADD R1,R1, #xext%/2+1 29110 ADD R2,R2, #yext% 29120 BL read_point 29130 CMP R0, #0 29140 BNE p1_not_up 29150 MOV R1,R6, LSR #2 29160 MOV R2,R7, LSR #2 29170 ADD R1,R1, #xext%/2-1 29180 ADD R2,R2, #yext% 29190 BL read_point 29200 CMP R0, #0 29210 BNE p1_not_up 29220 MOV R0, #129 29230 MOV R1, #0 29240 SUB R1,R1, #68 29250 MOV R2, #255 29260 SWI "OS_Byte" 29270 CMP R1, #255 29280 ADDEQ R10,R10, #4 29290 .p1_not_up 29300 : 29310 MOV R1,R6, LSR #2 29320 MOV R2,R7, LSR #2 29330 ADD R1,R1, #xext%-2 29340 BL read_point 29350 CMP R0, #0 29360 BNE p1_not_down 29370 MOV R1,R6, LSR #2 29380 MOV R2,R7, LSR #2 29390 ADD R1,R1, #2 29400 BL read_point 29410 CMP R0, #0 29420 BNE p1_not_down 29430 MOV R0, #129 29440 MOV R1, #0 29450 SUB R1,R1, #83 29460 MOV R2, #255 29470 SWI "OS_Byte" 29480 CMP R1, #255 29490 SUBEQ R10,R10, #2 29500 .p1_not_down 29510 : 29520 SUB R10,R10, #1 29530 : 29540 CMP R10, #128 29550 BEQ p1_ud 29560 BGT p1_up 29570 MOV R1,R6, LSR #2 29580 MOV R2,R7, LSR #2 29590 ADD R1,R1, #xext%/2 29600 SUB R2,R2, #1 29610 BL read_point 29620 CMP R0, #0 29630 MOVNE R10, #128 29640 B p1_ud 29650 .p1_up 29660 MOV R1,R6, LSR #2 29670 MOV R2,R7, LSR #2 29680 ADD R1,R1, #xext%/2+2 29690 ADD R2,R2, #yext% 29700 BL read_point 29710 CMP R0, #0 29720 MOVNE R10, #128 29730 MOV R1,R6, LSR #2 29740 MOV R2,R7, LSR #2 29750 ADD R1,R1, #xext%/2-2 29760 ADD R2,R2, #yext% 29770 BL read_point 29780 CMP R0, #0 29790 MOVNE R10, #128 29800 B p1_ud 29810 .p1_ud 29820 CMP R10, #128+10*4 29830 MOVGT R10, #128+10*4 29840 CMP R10, #128-8*4 29850 MOVLT R10, #128-8*4 29860 CMP R10, #128 29870 BIC R8,R8, #255<<16 29880 ORR R8,R8,R10, LSL #16 29890 SUB R10,R10, #128 29900 ADD R7,R7,R10, ASR #2 29910 : 29920 LDR R0, adr_p1_weapon 29930 LDR R0,[R0] 29940 CMP R0, #2 29950 BEQ p1_fire_pistol 29960 CMP R0, #3 29970 BEQ p1_fire_gun 29980 CMP R0, #4 29990 BEQ p1_fire_mortar 30000 CMP R0, #5 30010 BEQ p1_fire_homing 30020 CMP R0, #6 30030 BEQ p1_fire_seeking 30040 CMP R0, #7 30050 BEQ p1_fire_vertical 30060 CMP R0, #8 30070 BEQ p1_fire_flame 30080 CMP R0, #9 30090 BEQ p1_fire_bomb 30100 CMP R0, #10 30110 BEQ p1_fire_cluster 30120 : 30130 .p1_fire_pistol 30140 LDR R0, p1_fire 30150 CMP R0, #0 30160 BEQ p1_pistol_shot 30170 MOV R0, #129 30180 MOV R1, #0 30190 SUB R1,R1, #84 30200 MOV R2, #255 30210 SWI "OS_Byte" 30220 CMP R1, #255 30230 MOVNE R0, #0 30240 STRNE R0, p1_fire 30250 B p1_not_fire_pistol 30260 .p1_pistol_shot 30270 MOV R0, #129 30280 MOV R1, #0 30290 SUB R1,R1, #84 30300 MOV R2, #255 30310 SWI "OS_Byte" 30320 CMP R1, #255 30330 BNE p1_not_fire_pistol 30340 MOV R0, #2 30350 MOV R1,R6, LSR #2 30360 MOV R2,R7, LSR #2 30370 ADD R1,R1, #xext% 30380 ADD R2,R2, #yext%/4*2 30390 RSB R2,R2, #256 30400 MOV R3, #80 30410 MOV R4, #0 30420 MOV R5, #1 30430 TST R8, #1 30440 RSBNE R3,R3, #0 30450 SUBNE R1,R1, #xext% 30460 BL add_cell 30470 MOV R5, #1 30480 MOV R0, #1 30490 STR R0, p1_fire 30500 MOV R0, #7 30510 MVN R1, #14 30520 MOV R2, #12800 30530 MOV R3, #0 30540 SWI "Sound_Control" 30550 .p1_not_fire_pistol 30560 B p1_end_fire 30570 : 30580 .p1_fire_gun 30590 MOV R0, #129 30600 MOV R1, #0 30610 SUB R1,R1, #84 30620 MOV R2, #255 30630 SWI "OS_Byte" 30640 CMP R1, #255 30650 BNE p1_not_fire_gun 30660 LDR R0, p1_fire 30670 ADD R0,R0, #1 30680 AND R0,R0, #%11 30690 STR R0, p1_fire 30700 TST R0, #%11 30710 BNE p1_not_fire_gun 30720 MOV R0, #3 30730 MOV R1,R6, LSR #2 30740 MOV R2,R7, LSR #2 30750 ADD R1,R1, #xext% 30760 ADD R2,R2, #yext%/4*2 30770 RSB R2,R2, #256 30780 MOV R3, #80 30790 LDR R5, adr_rnd 30800 LDR R5,[R5] 30810 AND R4,R5, #15 30820 SUB R4,R4, #7 30830 AND R5,R5, #%110000 30840 MOV R5,R5, LSR #4 30850 ADD R1,R1,R5 30860 MOV R5, #1 30870 TST R8, #1 30880 RSBNE R3,R3, #0 30890 SUBNE R1,R1, #xext%+2 30900 BL add_cell 30910 MOV R5, #1 30920 MOV R0, #gun_sound% 30930 MVN R1, #10 30940 MOV R2, #gun_rate% 30950 MOV R3, #0 30960 SWI "Sound_Control" 30970 .p1_not_fire_gun 30980 B p1_end_fire 30990 : 31000 .p1_fire_mortar 31010 MOV R0, #129 31020 MOV R1, #0 31030 SUB R1,R1, #84 31040 MOV R2, #255 31050 SWI "OS_Byte" 31060 CMP R1, #255 31070 BNE p1_not_fire_mortar 31080 LDR R0, p1_fire 31090 ADD R0,R0, #1 31100 AND R0,R0, #%11111 31110 STR R0, p1_fire 31120 TST R0, #%11111 31130 BNE p1_not_fire_gun 31140 MOV R0, #4 31150 MOV R1,R6, LSR #2 31160 MOV R2,R7, LSR #2 31170 ADD R1,R1, #xext% 31180 ADD R2,R2, #yext%/4*2 31190 RSB R2,R2, #256 31200 MOV R3, #30 31210 MOV R4, #40 31220 MOV R5, #1 31230 TST R8, #1 31240 RSBNE R3,R3, #0 31250 SUBNE R1,R1, #xext% 31260 BL add_cell 31270 MOV R5, #1 31280 MOV R0, #1 31290 STR R0, p1_fire 31300 .p1_not_fire_mortar 31310 B p1_end_fire 31320 : 31330 .p1_fire_homing 31340 .p1_homing_shot 31350 MOV R0, #129 31360 MOV R1, #0 31370 SUB R1,R1, #84 31380 MOV R2, #255 31390 SWI "OS_Byte" 31400 CMP R1, #255 31410 BNE p1_not_fire_homing 31420 LDR R0, p1_fire 31430 ADD R0,R0, #1 31440 AND R0,R0, #%1111 31450 STR R0, p1_fire 31460 TST R0, #%1111 31470 BNE p1_not_fire_homing 31480 MOV R0, #5 31490 MOV R1,R6, LSR #2 31500 MOV R2,R7, LSR #2 31510 ADD R1,R1, #xext% 31520 ADD R2,R2, #yext%/2 31530 RSB R2,R2, #256 31540 MOV R3, #64 31550 LDR R4, adr_rnd 31560 LDR R4,[R4] 31570 AND R4,R4, #15 31580 SUB R4,R4, #7 31590 MOV R5, #224<<8 ; Homing in on player 2 31600 ORR R5,R5, #1 31610 TST R8, #1 31620 RSBNE R3,R3, #0 31630 SUBNE R1,R1, #xext% 31640 BL add_cell 31650 MOV R5, #1 31660 MOV R0, #homing_sound% 31670 MVN R1, #10 31680 MOV R2, #homing_rate% 31690 MOV R3, #0 31700 SWI "Sound_Control" 31710 .p1_not_fire_homing 31720 B p1_end_fire 31730 : 31740 .p1_fire_seeking 31750 .p1_seeking_shot 31760 MOV R0, #129 31770 MOV R1, #0 31780 SUB R1,R1, #84 31790 MOV R2, #255 31800 SWI "OS_Byte" 31810 CMP R1, #255 31820 BNE p1_not_fire_seeking 31830 MOV R0, #6 31840 MOV R1,R6, LSR #2 31850 MOV R2,R7, LSR #2 31860 ADD R1,R1, #xext%*3/2 31870 ADD R2,R2, #yext%/4*2 31880 RSB R2,R2, #256 31890 MOV R3, #32 31900 MOV R4, #0 31910 MOV R5, #1 ; Homing in on player 2 31920 TST R8, #1 31930 RSBNE R3,R3, #0 31940 SUBNE R1,R1, #xext%*2 31950 BL add_cell 31960 MOV R5, #1 31970 MOV R9, #2 31980 LDR R10, adr_p1_weapon 31990 STR R9,[R10] 32000 MOV R0, #seeking_sound% 32010 MVN R1, #14 32020 MOV R2, #seeking_rate% 32030 MOV R3, #0 32040 SWI "Sound_Control" 32050 MOV R0, #1 32060 STR R0, p1_fire 32070 .p1_not_fire_seeking 32080 B p1_end_fire 32090 : 32100 .p1_fire_vertical 32110 LDR R0, p1_fire 32120 CMP R0, #0 32130 BEQ p1_vertical_shot 32140 MOV R0, #129 32150 MOV R1, #0 32160 SUB R1,R1, #84 32170 MOV R2, #255 32180 SWI "OS_Byte" 32190 CMP R1, #255 32200 MOVNE R0, #0 32210 STRNE R0, p1_fire 32220 B p1_not_fire_vertical 32230 .p1_vertical_shot 32240 MOV R0, #129 32250 MOV R1, #0 32260 SUB R1,R1, #84 32270 MOV R2, #255 32280 SWI "OS_Byte" 32290 CMP R1, #255 32300 BNE p1_not_fire_vertical 32310 MOV R0, #7 32320 MOV R1,R6, LSR #2 32330 MOV R2,R7, LSR #2 32340 ADD R1,R1, #xext% 32350 ADD R2,R2, #yext%/4*2 32360 RSB R2,R2, #256 32370 MOV R3, #0 32380 MOV R4, #64 32390 MOV R5, #1 32400 TST R8, #1 32410 RSBNE R3,R3, #0 32420 SUBNE R1,R1, #xext% 32430 BL add_cell 32440 MOV R5, #2 32450 MOV R0, #1 32460 STR R0, p1_fire 32470 MOV R0, #7 32480 MVN R1, #14 32490 MOV R2, #10240 32500 MOV R3, #0 32510 SWI "Sound_Control" 32520 .p1_not_fire_vertical 32530 B p1_end_fire 32540 : 32550 .p1_fire_flame 32560 .p1_flame_shot 32570 MOV R0, #129 32580 MOV R1, #0 32590 SUB R1,R1, #84 32600 MOV R2, #255 32610 SWI "OS_Byte" 32620 CMP R1, #255 32630 BNE p1_not_fire_flame 32640 MOV R0, #10 32650 MOV R1,R6, LSR #2 32660 MOV R2,R7, LSR #2 32670 ADD R1,R1, #xext% 32680 ADD R2,R2, #yext%/4*2 32690 RSB R2,R2, #256 32700 MOV R3, #64 32710 LDR R4, adr_rnd 32720 LDR R4,[R4] 32730 AND R4,R4, #7 32740 SUB R4,R4, #1 32750 MOV R5, #1 32760 TST R8, #1 32770 RSBNE R3,R3, #0 32780 SUBNE R1,R1, #xext% 32790 BL add_cell 32800 .p1_not_fire_flame 32810 B p1_end_fire 32820 : 32830 .p1_fire_cluster 32840 MOV R0, #129 32850 MOV R1, #0 32860 SUB R1,R1, #84 32870 MOV R2, #255 32880 SWI "OS_Byte" 32890 CMP R1, #255 32900 BNE p1_not_fire_cluster 32910; LDR R0, p1_fire 32920; ADD R0,R0, #1 32930; CMP R0, #25 32940; MOVGT R0, #0 32950; STR R0, p1_fire 32960; CMP R0, #0 32970; BNE p1_not_fire_cluster 32980 MOV R0, #13 32990 MOV R1,R6, LSR #2 33000 MOV R2,R7, LSR #2 33010 ADD R1,R1, #xext%+1 33020 ADD R2,R2, #yext%/4*2 33030 RSB R2,R2, #256 33040 MOV R3, #768 33050 MOV R4, #128 33060 MOV R5, #bomb_pause%*.25 33070 TST R8, #1 33080 RSBNE R3,R3, #0 33090 SUBNE R1,R1, #xext%+2 33100 BL add_cell 33110 SUB R3,R3, #128 33120 ADD R4,R4, #128 33130 ADD R5,R5, #32 33140 BL add_cell 33150 SUB R3,R3, #128 33160 ADD R4,R4, #128 33170 ADD R5,R5, #32 33180 BL add_cell 33190 MOV R9, #2 33200 LDR R10, adr_p1_weapon 33210 STR R9,[R10] 33220 MOV R5, #1 33230 MOV R0, #1 33240 STR R0, p1_fire 33250 .p1_not_fire_cluster 33260 B p1_end_fire 33270 : 33280 .p1_fire_bomb 33290 MOV R0, #129 33300 MOV R1, #0 33310 SUB R1,R1, #84 33320 MOV R2, #255 33330 SWI "OS_Byte" 33340 CMP R1, #255 33350 BNE p1_not_fire_bomb 33360 LDR R0, p1_fire 33370 ADD R0,R0, #1 33380 CMP R0, #10 33390 MOVGT R0, #0 33400 STR R0, p1_fire 33410 CMP R0, #0 33420 BNE p1_not_fire_bomb 33430 MOV R0, #12 33440 MOV R1,R6, LSR #2 33450 MOV R2,R7, LSR #2 33460 ADD R1,R1, #xext%+1 33470 ADD R2,R2, #yext%/4*2 33480 RSB R2,R2, #256 33490 MOV R3, #40 33500 MOV R4, #40 33510 MOV R5, #bomb_pause% 33520 TST R8, #1 33530 RSBNE R3,R3, #0 33540 SUBNE R1,R1, #xext%+2 33550 BL add_cell 33560 MOV R5, #1 33570 MOV R0, #1 33580 STR R0, p1_fire 33590 .p1_not_fire_bomb 33600 B p1_end_fire 33610 : 33620 .p1_end_fire 33630 : 33640 MOV R0, #1 33650 MOV R1,R6, LSR #2 33660 MOV R2,R7, LSR #2 33670 TST R8, #1 33680 ADDEQ R1,R1, #1 33690 ADDNE R1,R1, #xext%-1 33700 ADD R2,R2, #yext%/4 33710 RSB R2,R2, #256 33720 LDR R3, adr_rnd 33730 LDR R3,[R3] 33740 TST R3, #%10000 33750 SUBEQ R2,R2, #1 33760 AND R3,R3, #15 33770 SUB R3,R3, #7 33780 MOV R4, #0 33790 SUB R4,R4, #40 33800 MOV R5, #32 33810 BL add_cell 33820 MOV R5, #1 33830 : 33840 AND R0,R8, #1 33850 MOV R1,R6, LSR #2 33860 MOV R2,R7, LSR #2 33870 LDR R9, adr_p1_x 33880 STR R1,[R9] 33890 LDR R9, adr_p1_y 33900 STR R2,[R9] 33910 BL plot_sprite_1616 33920 : 33930 LDMFD R13!,{R9,PC} 33940 : 33950 .adr_rnd 33960 EQUD rnd 33970 .adr_p1_weapon 33980 EQUD p1_weapon 33990 .adr_p1_x 34000 EQUD p1_x 34010 .adr_p1_y 34020 EQUD p1_y 34030 : 34040 ] 34050 P%=clg_routine% 34060 L%=clg_routine%+1020 34070 [OPT pass% 34080 : 34090 .clg_adr_screenstore 34100 EQUD screenstore 34110 .clg_screendata 34120 EQUD screendata% 34130 : 34140 .clg 34150 STMFD R13!,{R0-R12,R14} 34160 ADR R0, clg_temp_reg_store 34170 STMIA R0, {R13,R14} 34180 LDR R13, clg_adr_screenstore 34190 LDR R13, [R13] 34200 LDR R14, clg_screendata 34210 MOV R12, #0 34220 .clg_loop1 34230 ] 34240 FOR a%=1 TO 26 34250 [OPT pass% 34260 LDMIA R14!,{R0-R11} 34270 STMIA R13!,{R0-R11} 34280 ] 34290 NEXT 34300 [OPT pass% 34310 ADD R12,R12, #1 34320 CMP R12, #65 34330 BLT clg_loop1 34340 ] 34350 FOR a%=1 TO 20 34360 [OPT pass% 34370 LDMIA R14!,{R0-R9} 34380 STMIA R13!,{R0-R9} 34390 ] 34400 NEXT 34410 [OPT pass% 34420 ADR R0, clg_temp_reg_store 34430 LDMIA R0, {R13,R14} 34440 LDMFD R13!,{R0-R12,PC} 34450 : 34460 .clg_temp_reg_store 34470 EQUD 0 34480 EQUD 0 34490 : 34500 ] 34510 P%=split_routine% 34520 L%=split_routine%+1020 34530 [OPT pass% 34540 : 34550 : 34560 .split_screenstore 34570 EQUD screenstore% 34580 .split_adr_screen 34590 EQUD screen 34600 .split_adr_p1_y 34610 EQUD p1_y 34620 .split_adr_p2_y 34630 EQUD p2_y 34640 .split_p1_y1 34650 EQUD 0 34660 .split_p2_y1 34670 EQUD 0 34680 .split_p1_y2 34690 EQUD 0 34700 .split_p2_y2 34710 EQUD 0 34720 .split_p1_y3 34730 EQUD 0 34740 .split_p2_y3 34750 EQUD 0 34760 : 34770 .split_screen 34780 STMFD R13!,{R0-R12,R14} 34790 ADR R0, split_temp_reg_store 34800 STMIA R0, {R13,R14} 34810 LDR R13, split_adr_screen 34820 LDR R13, [R13] 34830 MOV R12, #0 34840 LDR R0, split_adr_p1_y 34850 LDR R0,[R0] 34860 LDR R1, split_p1_y1 34870 LDR R2, split_p1_y2 34880 LDR R3, split_p1_y3 34890 STR R0, split_p1_y1 34900 STR R1, split_p1_y2 34910 STR R2, split_p1_y3 34920 ADD R0,R0,R1 34930 ADD R0,R0,R2 34940 ADD R0,R0,R3 34950 ADD R0,R0, #2 34960 MOV R0,R0, ASR #2 34970 RSB R0,R0, #256 34980 SUB R0,R0, #64 34990 CMP R0, #148 35000 MOVGT R0, #148 35010 CMP R0, #0 35020 MOVLT R0, #0 35030 LDR R14, split_screenstore 35040 MOV R1, #y_shift 35050 MLA R14,R1,R0,R14 35060 .split_loop1 35070 ] 35080 FOR a%=1 TO 10 35090 [OPT pass% 35100 LDMIA R14!,{R0-R11} 35110 STMIA R13!,{R0-R11} 35120 ] 35130 NEXT 35140 [OPT pass% 35150 ADD R12,R12, #1 35160 CMP R12, #72 35170 BLT split_loop1 35180 ] 35190 FOR a%=0 TO 11 35200 [OPT pass% 35210 MOV a%, #127 35220 ORR a%,a%,a%, LSL #8 35230 ORR a%,a%,a%, LSL #16 35240 ] 35250 NEXT 35260 [OPT pass% 35270 MOV R12, #0 35280 .split_loop3 35290 STMIA R13!,{R0-R11} 35300 ADD R12,R12, #1 35310 CMP R12, #280 35320 BLT split_loop3 35330 : 35340 LDR R13, split_adr_screen 35350 LDR R13, [R13] 35360 ADD R13,R13, #&B900 35370 MOV R12, #0 35380 LDR R0, split_adr_p2_y 35390 LDR R0,[R0] 35400 LDR R1, split_p2_y1 35410 LDR R2, split_p2_y2 35420 LDR R3, split_p2_y3 35430 STR R0, split_p2_y1 35440 STR R1, split_p2_y2 35450 STR R2, split_p2_y3 35460 ADD R0,R0,R1 35470 ADD R0,R0,R2 35480 ADD R0,R0,R3 35490 ADD R0,R0, #2 35500 MOV R0,R0, ASR #2 35510 RSB R0,R0, #256 35520 SUB R0,R0, #64 35530 CMP R0, #148 35540 MOVGT R0, #148 35550 CMP R0, #0 35560 MOVLT R0, #0 35570 LDR R14, split_screenstore 35580 MOV R1, #y_shift 35590 MLA R14,R1,R0,R14 35600 .split_loop2 35610 ] 35620 FOR a%=1 TO 10 35630 [OPT pass% 35640 LDMIA R14!,{R0-R11} 35650 STMIA R13!,{R0-R11} 35660 ] 35670 NEXT 35680 [OPT pass% 35690 ADD R12,R12, #1 35700 CMP R12, #72 35710 BLT split_loop2 35720 ADR R0, split_temp_reg_store 35730 LDMIA R0, {R13,R14} 35740 LDMFD R13!,{R0-R12,PC} 35750 : 35760 .split_temp_reg_store 35770 EQUD 0 35780 EQUD 0 35790 : 35800 : 35810 ] 35820 P%=sprite_routines% 35830 L%=sprite_routines%+8191 35840 [OPT pass% 35850 : 35860 : 35870 : 35880 .plot_sprite_1212 35890 : 35900 STMFD R13!,{R0-R12,R14} 35910 : 35920 : ; R0 sprite no. 35930 : ; R1 x-coord 35940 : ; R2 y-coord 35950 : 35960 RSB R2,R2, #256 35970 : 35980 CMP R1, #0 35990 BLE psm_no_plot1212 36000 CMP R2, #12 36010 BLE psm_no_plot1212 36020 CMP R1, #320-8 36030 BGE psm_no_plot1212 36040 CMP R2, #256 36050 BGE psm_no_plot1212 36060 B psm_plot1212 36070 .psm_no_plot1212 36080 LDMFD R13!,{R0-R12,PC} 36090 .psm_plot1212 36100 : 36110 AND R3,R1, #%11 ; calculate x offset 36120 MOV R0,R0, LSL #2 ; realise sprite 36130 ADD R0,R0, R3 ; add offset 36140 BIC R1,R1, #%11 ; make x div by 4 36150 : 36160 MOV R7, #x_shift ; get screen shifts 36170 MOV R8, #y_shift 36180 LDR R9, sprite_adr_screenstore; get screenstore address 36190 LDR R9,[R9] 36200 : 36210 MLA R3,R7,R1,R9 36220 MLA R2,R8,R2,R3 36230 : 36240 LDR R7, adr_sprites1 ; get start address of data 36250 LDR R8, spr_size1 ; get length of data for 1 sprite 36260 MLA R0,R8,R0,R7 ; calculate position of data 36270 ADD R1,R0,R8, LSR #1 ; calculate position of mask 36280 : 36290 MOV R3, #1 36300 STR R3, s1212_counter 36310 : 36320 .s1212_sprite_loop 36330 : 36340 ] 36350 FOR a%=1 TO 12 36360 [OPT pass% 36370 : 36380 LDMIA R2,{R3-R5} ; get some background 36390 LDMIA R1!,{R8-R10} ; get some mask 36400 AND R3,R3,R8 ; mask off background 36410 AND R4,R4,R9 36420 AND R5,R5,R10 36430 LDMIA R0!,{R8-R10} ; get some sprite 36440 ORR R3,R3,R8 ; merge sprite with background 36450 ORR R4,R4,R9 36460 ORR R5,R5,R10 36470 STMIA R2,{R3-R5} ; store masked sprite 36480 : 36490 SUB R2,R2, #y_shift 36500 : 36510 ] 36520 NEXT 36530 [OPT pass% 36540 : 36550 LDR R3, s1212_counter 36560 ADD R3,R3, #1 36570 STR R3, s1212_counter 36580 CMP R3, #1 36590 BLE s1212_sprite_loop 36600 : 36610 LDMFD R13!,{R0-R12,PC} 36620 : 36630 .s1212_counter 36640 EQUD 0 36650 : 36660 .adr_sprites1 36670 EQUD sprites1% ; address of sprites1 36680 .spr_size1 36690 EQUD 8/8*12*12*2 ; length of one sprite1 + mask1 36700 : 36710 : 36720 : 36730 .plot_sprite_1264 36740 : 36750 STMFD R13!,{R0-R12,R14} 36760 : 36770 : ; R0 sprite no. 36780 : ; R1 x-coord 36790 : ; R2 y-coord 36800 : 36810 RSB R2,R2, #256 36820 : 36830 CMP R1, #0 36840 BLE psm_no_plot1264 36850 CMP R2, #32 36860 BLE psm_no_plot1264 36870 CMP R1, #320-8 36880 BGE psm_no_plot1264 36890 CMP R2, #256 36900 BGE psm_no_plot1264 36910 B psm_plot1264 36920 .psm_no_plot1264 36930 LDMFD R13!,{R0-R12,PC} 36940 .psm_plot1264 36950 : 36960 AND R3,R1, #%11 ; calculate x offset 36970 MOV R0,R0, LSL #2 ; realise sprite 36980 ADD R0,R0, R3 ; add offset 36990 BIC R1,R1, #%11 ; make x div by 4 37000 : 37010 MOV R7, #x_shift ; get screen shifts 37020 MOV R8, #y_shift 37030 LDR R9, sprite_adr_screenstore; get screenstore address 37040 LDR R9,[R9] 37050 : 37060 MLA R3,R7,R1,R9 37070 MLA R2,R8,R2,R3 37080 : 37090 LDR R7, adr_sprites3 ; get start address of data 37100 LDR R8, spr_size3 ; get length of data for 1 sprite 37110 MLA R0,R8,R0,R7 ; calculate position of data 37120 ADD R1,R0,R8, LSR #1 ; calculate position of mask 37130 : 37140 MOV R3, #1 37150 STR R3, s1264_counter 37160 : 37170 .s1264_sprite_loop 37180 : 37190 ] 37200 FOR a%=1 TO 8 37210 [OPT pass% 37220 : 37230 LDMIA R2,{R3-R5} ; get some background 37240 LDMIA R1!,{R8-R10} ; get some mask 37250 AND R3,R3,R8 ; mask off background 37260 AND R4,R4,R9 37270 AND R5,R5,R10 37280 LDMIA R0!,{R8-R10} ; get some sprite 37290 ORR R3,R3,R8 ; merge sprite with background 37300 ORR R4,R4,R9 37310 ORR R5,R5,R10 37320 STMIA R2,{R3-R5} ; store masked sprite 37330 : 37340 SUB R2,R2, #y_shift 37350 : 37360 ] 37370 NEXT 37380 [OPT pass% 37390 : 37400 LDR R3, s1264_counter 37410 ADD R3,R3, #1 37420 STR R3, s1264_counter 37430 CMP R3, #8 37440 BLE s1264_sprite_loop 37450 : 37460 LDMFD R13!,{R0-R12,PC} 37470 : 37480 .s1264_counter 37490 EQUD 0 37500 : 37510 .adr_sprites3 37520 EQUD sprites3% ; address of sprites1 37530 .spr_size3 37540 EQUD 8/8*12*64*2 ; length of one sprite1 + mask1 37550 .sprite_adr_screenstore 37560 EQUD screenstore 37570 : 37580 : 37590 : 37600 .plot_sprite_2016 37610 : 37620 STMFD R13!,{R0-R12,R14} 37630 : 37640 : ; R0 sprite no. 37650 : ; R1 x-coord 37660 : ; R2 y-coord 37670 : 37680 RSB R2,R2, #256 37690 : 37700 CMP R1, #0 37710 BLE psm_no_plot2016 37720 CMP R2, #16 37730 BLE psm_no_plot2016 37740 CMP R1, #320-16 37750 BGE psm_no_plot2016 37760 CMP R2, #256 37770 BGE psm_no_plot2016 37780 B psm_plot2016 37790 .psm_no_plot2016 37800 LDMFD R13!,{R0-R12,PC} 37810 .psm_plot2016 37820 : 37830 AND R3,R1, #%11 ; calculate x offset 37840 MOV R0,R0, LSL #2 ; realise sprite 37850 ADD R0,R0, R3 ; add offset 37860 BIC R1,R1, #%11 ; make x div by 4 37870 : 37880 MOV R7, #x_shift ; get screen shifts 37890 MOV R8, #y_shift 37900 LDR R9, sprite_adr_screenstore; get screenstore address 37910 LDR R9,[R9] 37920 : 37930 MLA R3,R7,R1,R9 37940 MLA R2,R8,R2,R3 37950 : 37960 LDR R7, adr_sprites2 ; get start address of data 37970 LDR R8, spr_size2 ; get length of data for 1 sprite 37980 MLA R0,R8,R0,R7 ; calculate position of data 37990 ADD R1,R0,R8, LSR #1 ; calculate position of mask 38000 : 38010 MOV R3, #1 38020 STR R3, s2016_counter 38030 : 38040 .s2016_sprite_loop 38050 : 38060 ] 38070 FOR a%=1 TO 4 38080 [OPT pass% 38090 : 38100 LDMIA R2,{R3-R7} ; get some background 38110 LDMIA R1!,{R8-R12} ; get some mask 38120 AND R3,R3,R8 ; mask off background 38130 AND R4,R4,R9 38140 AND R5,R5,R10 38150 AND R6,R6,R11 38160 AND R7,R7,R12 38170 LDMIA R0!,{R8-R12} ; get some sprite 38180 ORR R3,R3,R8 ; merge sprite with background 38190 ORR R4,R4,R9 38200 ORR R5,R5,R10 38210 ORR R6,R6,R11 38220 ORR R7,R7,R12 38230 STMIA R2,{R3-R7} ; store masked sprite 38240 : 38250 SUB R2,R2, #y_shift 38260 : 38270 ] 38280 NEXT 38290 [OPT pass% 38300 : 38310 LDR R3, s2016_counter 38320 ADD R3,R3, #1 38330 STR R3, s2016_counter 38340 CMP R3, #4 38350 BLE s2016_sprite_loop 38360 : 38370 LDMFD R13!,{R0-R12,PC} 38380 : 38390 .s2016_counter 38400 EQUD 0 38410 : 38420 .adr_sprites2 38430 EQUD sprites2% ; address of sprites2 38440 .spr_size2 38450 EQUD 8/8*16*20*2 ; length of one sprite2 + mask2 38460 : 38470 : 38480 : 38490 .plot_sprite_0804 38500 : 38510 STMFD R13!,{R0-R12,R14} 38520 : 38530 : ; R0 sprite no. 38540 : ; R1 x-coord 38550 : ; R2 y-coord 38560 : 38570 RSB R2,R2, #256 38580 : 38590 CMP R1, #0 38600 BLE psm_no_plot0804 38610 CMP R2, #4 38620 BLE psm_no_plot0804 38630 CMP R1, #320-4 38640 BGE psm_no_plot0804 38650 CMP R2, #256 38660 BGE psm_no_plot0804 38670 B psm_plot0804 38680 .psm_no_plot0804 38690 LDMFD R13!,{R0-R12,PC} 38700 .psm_plot0804 38710 : 38720 AND R3,R1, #%11 ; calculate x offset 38730 MOV R0,R0, LSL #2 ; realise sprite 38740 ADD R0,R0, R3 ; add offset 38750 BIC R1,R1, #%11 ; make x div by 4 38760 : 38770 MOV R7, #x_shift ; get screen shifts 38780 MOV R8, #y_shift 38790 LDR R9, sprite_adr_screenstore; get screenstore address 38800 LDR R9,[R9] 38810 : 38820 MLA R3,R7,R1,R9 38830 MLA R2,R8,R2,R3 38840 : 38850 LDR R7, adr_sprites4 ; get start address of data 38860 LDR R8, spr_size4 ; get length of data for 1 sprite 38870 MLA R0,R8,R0,R7 ; calculate position of data 38880 ADD R1,R0,R8, LSR #1 ; calculate position of mask 38890 : 38900;MOV R3, #1 38910;STR R3, s0804_counter 38920 : 38930 .s0804_sprite_loop 38940 : 38950 ] 38960 FOR a%=1 TO 4 38970 [OPT pass% 38980 : 38990 LDMIA R2,{R3,R4} ; get some background 39000 LDMIA R1!,{R8,R9} ; get some mask 39010 AND R3,R3,R8 ; mask off background 39020 AND R4,R4,R9 39030 LDMIA R0!,{R8,R9} ; get some sprite 39040 ORR R3,R3,R8 ; merge sprite with background 39050 ORR R4,R4,R9 39060 STMIA R2,{R3,R4} ; store masked sprite 39070 : 39080 SUB R2,R2, #y_shift 39090 : 39100 ] 39110 NEXT 39120 [OPT pass% 39130 : 39140;LDR R3, s0804_counter 39150;ADD R3,R3, #1 39160;STR R3, s0804_counter 39170;CMP R3, #1 39180;BLE s0804_sprite_loop 39190 : 39200 LDMFD R13!,{R0-R12,PC} 39210 : 39220 .s0804_counter 39230 EQUD 0 39240 : 39250 .adr_sprites4 39260 EQUD sprites4% ; address of sprites4 39270 .spr_size4 39280 EQUD 8/8*8*4*2 ; length of one sprite4 + mask4 39290 : 39300 : 39310 : 39320 .plot_sprite_1208 39330 : 39340 STMFD R13!,{R0-R12,R14} 39350 : 39360 : ; R0 sprite no. 39370 : ; R1 x-coord 39380 : ; R2 y-coord 39390 : 39400 RSB R2,R2, #256 39410 : 39420 CMP R1, #0 39430 BLE psm_no_plot1208 39440 CMP R2, #8 39450 BLE psm_no_plot1208 39460 CMP R1, #320-8 39470 BGE psm_no_plot1208 39480 CMP R2, #256 39490 BGE psm_no_plot1208 39500 B psm_plot1208 39510 .psm_no_plot1208 39520 LDMFD R13!,{R0-R12,PC} 39530 .psm_plot1208 39540 : 39550 AND R3,R1, #%11 ; calculate x offset 39560 MOV R0,R0, LSL #2 ; realise sprite 39570 ADD R0,R0, R3 ; add offset 39580 BIC R1,R1, #%11 ; make x div by 4 39590 : 39600 MOV R7, #x_shift ; get screen shifts 39610 MOV R8, #y_shift 39620 LDR R9, sprite_adr_screenstore; get screenstore address 39630 LDR R9,[R9] 39640 : 39650 MLA R3,R7,R1,R9 39660 MLA R2,R8,R2,R3 39670 : 39680 LDR R7, adr_sprites5 ; get start address of data 39690 LDR R8, spr_size5 ; get length of data for 1 sprite 39700 MLA R0,R8,R0,R7 ; calculate position of data 39710 ADD R1,R0,R8, LSR #1 ; calculate position of mask 39720 : 39730;MOV R3, #1 39740;STR R3, s1208_counter 39750 : 39760 .s1208_sprite_loop 39770 : 39780 ] 39790 FOR a%=1 TO 8 39800 [OPT pass% 39810 : 39820 LDMIA R2,{R3,R4,R5} ; get some background 39830 LDMIA R1!,{R8,R9,R10} ; get some mask 39840 AND R3,R3,R8 ; mask off background 39850 AND R4,R4,R9 39860 AND R5,R5,R10 39870 LDMIA R0!,{R8,R9,R10} ; get some sprite 39880 ORR R3,R3,R8 ; merge sprite with background 39890 ORR R4,R4,R9 39900 ORR R5,R5,R10 39910 STMIA R2,{R3,R4,R5} ; store masked sprite 39920 : 39930 SUB R2,R2, #y_shift 39940 : 39950 ] 39960 NEXT 39970 [OPT pass% 39980 : 39990;LDR R3, s1208_counter 40000;ADD R3,R3, #1 40010;STR R3, s1208_counter 40020;CMP R3, #1 40030;BLE s1208_sprite_loop 40040 : 40050 LDMFD R13!,{R0-R12,PC} 40060 : 40070 .s1208_counter 40080 EQUD 0 40090 : 40100 .adr_sprites5 40110 EQUD sprites5% ; address of sprites5 40120 .spr_size5 40130 EQUD 8/8*12*8*2 ; length of one sprite5 + mask5 40140 : 40150 : 40160 : 40170 .plot_sprite_1616 40180 : 40190 STMFD R13!,{R0-R12,R14} 40200 : 40210 : ; R0 sprite no. 40220 : ; R1 x-coord 40230 : ; R2 y-coord 40240 : 40250 RSB R2,R2, #256 40260 : 40270 CMP R1, #0 40280 BLE psm_no_plot1616 40290 CMP R2, #16 40300 BLE psm_no_plot1616 40310 CMP R1, #320-16 40320 BGE psm_no_plot1616 40330 CMP R2, #256 40340 BGE psm_no_plot1616 40350 B psm_plot1616 40360 .psm_no_plot1616 40370 LDMFD R13!,{R0-R12,PC} 40380 .psm_plot1616 40390 : 40400 AND R3,R1, #%11 ; calculate x offset 40410 MOV R0,R0, LSL #2 ; realise sprite 40420 ADD R0,R0, R3 ; add offset 40430 BIC R1,R1, #%11 ; make x div by 4 40440 : 40450 MOV R7, #x_shift ; get screen shifts 40460 MOV R8, #y_shift 40470 LDR R9, sprite_adr_screenstore; get screenstore address 40480 LDR R9,[R9] 40490 : 40500 MLA R3,R7,R1,R9 40510 MLA R2,R8,R2,R3 40520 : 40530 LDR R7, adr_sprites6 ; get start address of data 40540 LDR R8, spr_size6 ; get length of data for 1 sprite 40550 MLA R0,R8,R0,R7 ; calculate position of data 40560 ADD R1,R0,R8, LSR #1 ; calculate position of mask 40570 : 40580 MOV R3, #1 40590 STR R3, s1616_counter 40600 : 40610 .s1616_sprite_loop 40620 : 40630 ] 40640 FOR a%=1 TO 4 40650 [OPT pass% 40660 : 40670 LDMIA R2,{R3-R6} ; get some background 40680 LDMIA R1!,{R8-R11} ; get some mask 40690 AND R3,R3,R8 ; mask off background 40700 AND R4,R4,R9 40710 AND R5,R5,R10 40720 AND R5,R5,R11 40730 LDMIA R0!,{R8-R11} ; get some sprite 40740 ORR R3,R3,R8 ; merge sprite with background 40750 ORR R4,R4,R9 40760 ORR R5,R5,R10 40770 ORR R6,R6,R11 40780 STMIA R2,{R3-R6} ; store masked sprite 40790 : 40800 SUB R2,R2, #y_shift 40810 : 40820 ] 40830 NEXT 40840 [OPT pass% 40850 : 40860 LDR R3, s1616_counter 40870 ADD R3,R3, #1 40880 STR R3, s1616_counter 40890 CMP R3, #4 40900 BLE s1616_sprite_loop 40910 : 40920 LDMFD R13!,{R0-R12,PC} 40930 : 40940 .s1616_counter 40950 EQUD 0 40960 : 40970 .adr_sprites6 40980 EQUD sprites6% ; address of sprites6 40990 .spr_size6 41000 EQUD 8/8*16*16*2 ; length of one sprite6 + mask6 41010 : 41020 : 41030 ] 41040 P%=fill_routines% 41050 L%=fill_routines%+8191 41060 [OPT pass% 41070 : 41080 : 41090 : 41100 .fill_fill_1212 41110 : 41120 STMFD R13!,{R0-R12,R14} 41130 : 41140 : ; R0 fill no. 41150 : ; R1 x-coord 41160 : ; R2 y-coord 41170 : 41180 RSB R2,R2, #256 41190 : 41200 CMP R1, #0 41210 BLE psm_no_fill1212 41220 CMP R2, #12 41230 BLE psm_no_fill1212 41240 CMP R1, #320-8 41250 BGE psm_no_fill1212 41260 CMP R2, #256 41270 BGE psm_no_fill1212 41280 B psm_fill1212 41290 .psm_no_fill1212 41300 LDMFD R13!,{R0-R12,PC} 41310 .psm_fill1212 41320 : 41330 MOV R7, #x_shift ; get screen shifts 41340 MOV R8, #y_shift 41350 : 41360 LDR R9, fill_adr_screenstore; get screenstore address 41370 LDR R9,[R9] 41380 MLA R3,R7,R1,R9 41390 MLA R0,R8,R2,R3 41400 : 41410 LDR R9, fill_screendata ; get screen address 41420 MLA R3,R7,R1,R9 41430 MLA R1,R8,R2,R3 41440 : 41450 MOV R3, #1 41460 STR R3, f1212_counter 41470 : 41480 .f1212_fill_loop 41490 : 41500 ] 41510 FOR a%=1 TO 12 41520 [OPT pass% 41530 : 41540 LDMIA R1,{R3-R5} ; get some background 41550 STMIA R0,{R3-R5} ; store masked fill 41560 : 41570 SUB R0,R0, #y_shift 41580 SUB R1,R1, #y_shift 41590 : 41600 ] 41610 NEXT 41620 [OPT pass% 41630 : 41640 LDR R3, f1212_counter 41650 ADD R3,R3, #1 41660 STR R3, f1212_counter 41670 CMP R3, #1 41680 BLE f1212_fill_loop 41690 : 41700 LDMFD R13!,{R0-R12,PC} 41710 : 41720 .f1212_counter 41730 EQUD 0 41740 : 41750 : 41760 : 41770 .fill_fill_1264 41780 : 41790 STMFD R13!,{R0-R12,R14} 41800 : 41810 : ; R0 fill no. 41820 : ; R1 x-coord 41830 : ; R2 y-coord 41840 : 41850 RSB R2,R2, #256 41860 : 41870 CMP R1, #0 41880 BLE psm_no_fill1264 41890 CMP R2, #32 41900 BLE psm_no_fill1264 41910 CMP R1, #320-8 41920 BGE psm_no_fill1264 41930 CMP R2, #256 41940 BGE psm_no_fill1264 41950 B psm_fill1264 41960 .psm_no_fill1264 41970 LDMFD R13!,{R0-R12,PC} 41980 .psm_fill1264 41990 : 42000 MOV R7, #x_shift ; get screen shifts 42010 MOV R8, #y_shift 42020 : 42030 LDR R9, fill_adr_screenstore; get screenstore address 42040 LDR R9,[R9] 42050 MLA R3,R7,R1,R9 42060 MLA R0,R8,R2,R3 42070 : 42080 LDR R9, fill_screendata ; get screen address 42090 MLA R3,R7,R1,R9 42100 MLA R1,R8,R2,R3 42110 : 42120 MOV R3, #1 42130 STR R3, f1264_counter 42140 : 42150 .f1264_fill_loop 42160 : 42170 ] 42180 FOR a%=1 TO 8 42190 [OPT pass% 42200 : 42210 LDMIA R1,{R3-R5} ; get some background 42220 STMIA R0,{R3-R5} ; store masked fill 42230 : 42240 SUB R0,R0, #y_shift 42250 SUB R1,R1, #y_shift 42260 : 42270 ] 42280 NEXT 42290 [OPT pass% 42300 : 42310 LDR R3, f1264_counter 42320 ADD R3,R3, #1 42330 STR R3, f1264_counter 42340 CMP R3, #8 42350 BLE f1264_fill_loop 42360 : 42370 LDMFD R13!,{R0-R12,PC} 42380 : 42390 .f1264_counter 42400 EQUD 0 42410 : 42420 .fill_screendata 42430 EQUD screendata% 42440 .fill_adr_screenstore 42450 EQUD screenstore 42460 : 42470 : 42480 : 42490 .fill_fill_2016 42500 : 42510 STMFD R13!,{R0-R12,R14} 42520 : 42530 : ; R0 fill no. 42540 : ; R1 x-coord 42550 : ; R2 y-coord 42560 : 42570 RSB R2,R2, #256 42580 : 42590 CMP R1, #0 42600 BLE psm_no_fill2016 42610 CMP R2, #16 42620 BLE psm_no_fill2016 42630 CMP R1, #320-16 42640 BGE psm_no_fill2016 42650 CMP R2, #256 42660 BGE psm_no_fill2016 42670 B psm_fill2016 42680 .psm_no_fill2016 42690 LDMFD R13!,{R0-R12,PC} 42700 .psm_fill2016 42710 : 42720 MOV R7, #x_shift ; get screen shifts 42730 MOV R8, #y_shift 42740 : 42750 LDR R9, fill_adr_screenstore; get screenstore address 42760 LDR R9,[R9] 42770 MLA R3,R7,R1,R9 42780 MLA R0,R8,R2,R3 42790 : 42800 LDR R9, fill_screendata ; get screen address 42810 MLA R3,R7,R1,R9 42820 MLA R1,R8,R2,R3 42830 : 42840 MOV R3, #1 42850 STR R3, f2016_counter 42860 : 42870 .f2016_fill_loop 42880 : 42890 ] 42900 FOR a%=1 TO 4 42910 [OPT pass% 42920 : 42930 LDMIA R1,{R3-R7} ; get some background 42940 STMIA R0,{R3-R7} ; store masked fill 42950 : 42960 SUB R0,R0, #y_shift 42970 SUB R1,R1, #y_shift 42980 : 42990 ] 43000 NEXT 43010 [OPT pass% 43020 : 43030 LDR R3, f2016_counter 43040 ADD R3,R3, #1 43050 STR R3, f2016_counter 43060 CMP R3, #4 43070 BLE f2016_fill_loop 43080 : 43090 LDMFD R13!,{R0-R12,PC} 43100 : 43110 .f2016_counter 43120 EQUD 0 43130 : 43140 : 43150 : 43160 .fill_fill_0804 43170 : 43180 STMFD R13!,{R0-R12,R14} 43190 : 43200 : ; R0 fill no. 43210 : ; R1 x-coord 43220 : ; R2 y-coord 43230 : 43240 RSB R2,R2, #256 43250 : 43260 CMP R1, #0 43270 BLE psm_no_fill0804 43280 CMP R2, #4 43290 BLE psm_no_fill0804 43300 CMP R1, #320-4 43310 BGE psm_no_fill0804 43320 CMP R2, #256 43330 BGE psm_no_fill0804 43340 B psm_fill0804 43350 .psm_no_fill0804 43360 LDMFD R13!,{R0-R12,PC} 43370 .psm_fill0804 43380 : 43390 MOV R7, #x_shift ; get screen shifts 43400 MOV R8, #y_shift 43410 : 43420 LDR R9, fill_adr_screenstore; get screenstore address 43430 LDR R9,[R9] 43440 MLA R3,R7,R1,R9 43450 MLA R0,R8,R2,R3 43460 : 43470 LDR R9, fill_screendata ; get screen address 43480 MLA R3,R7,R1,R9 43490 MLA R1,R8,R2,R3 43500 : 43510 .f0804_fill_loop 43520 : 43530 ] 43540 FOR a%=1 TO 4 43550 [OPT pass% 43560 : 43570 LDMIA R1,{R3-R4} ; get some background 43580 STMIA R0,{R3-R4} ; store masked fill 43590 : 43600 SUB R0,R0, #y_shift 43610 SUB R1,R1, #y_shift 43620 : 43630 ] 43640 NEXT 43650 [OPT pass% 43660 : 43670 LDMFD R13!,{R0-R12,PC} 43680 : 43690 : 43700 : 43710 .fill_fill_1208 43720 : 43730 STMFD R13!,{R0-R12,R14} 43740 : 43750 : ; R0 fill no. 43760 : ; R1 x-coord 43770 : ; R2 y-coord 43780 : 43790 RSB R2,R2, #256 43800 : 43810 CMP R1, #0 43820 BLE psm_no_fill1208 43830 CMP R2, #8 43840 BLE psm_no_fill1208 43850 CMP R1, #320-8 43860 BGE psm_no_fill1208 43870 CMP R2, #256 43880 BGE psm_no_fill1208 43890 B psm_fill1208 43900 .psm_no_fill1208 43910 LDMFD R13!,{R0-R12,PC} 43920 .psm_fill1208 43930 : 43940 MOV R7, #x_shift ; get screen shifts 43950 MOV R8, #y_shift 43960 : 43970 LDR R9, fill_adr_screenstore; get screenstore address 43980 LDR R9,[R9] 43990 MLA R3,R7,R1,R9 44000 MLA R0,R8,R2,R3 44010 : 44020 LDR R9, fill_screendata ; get screen address 44030 MLA R3,R7,R1,R9 44040 MLA R1,R8,R2,R3 44050 : 44060 ] 44070 FOR a%=1 TO 8 44080 [OPT pass% 44090 : 44100 LDMIA R1,{R3-R5} ; get some background 44110 STMIA R0,{R3-R5} ; store masked fill 44120 : 44130 SUB R0,R0, #y_shift 44140 SUB R1,R1, #y_shift 44150 : 44160 ] 44170 NEXT 44180 [OPT pass% 44190 : 44200 LDMFD R13!,{R0-R12,PC} 44210 : 44220 : 44230 : 44240 .fill_fill_1616 44250 : 44260 STMFD R13!,{R0-R12,R14} 44270 : 44280 RSB R2,R2, #256 44290 : 44300 CMP R1, #0 44310 BLE psm_no_fill1616 44320 CMP R2, #16 44330 BLE psm_no_fill1616 44340 CMP R1, #320-16 44350 BGE psm_no_fill1616 44360 CMP R2, #256 44370 BGE psm_no_fill1616 44380 B psm_fill1616 44390 .psm_no_fill1616 44400 LDMFD R13!,{R0-R12,PC} 44410 .psm_fill1616 44420 : 44430 MOV R7, #x_shift ; get screen shifts 44440 MOV R8, #y_shift 44450 : 44460 LDR R9, fill_adr_screenstore; get screenstore address 44470 LDR R9,[R9] 44480 MLA R3,R7,R1,R9 44490 MLA R0,R8,R2,R3 44500 : 44510 LDR R9, fill_screendata ; get screen address 44520 MLA R3,R7,R1,R9 44530 MLA R1,R8,R2,R3 44540 : 44550 MOV R3, #1 44560 STR R3, f1616_counter 44570 : 44580 .f1616_fill_loop 44590 : 44600 ] 44610 FOR a%=1 TO 4 44620 [OPT pass% 44630 : 44640 LDMIA R1,{R2-R5} 44650 STMIA R0,{R2-R5} 44660 : 44670 SUB R0,R0, #y_shift 44680 SUB R1,R1, #y_shift 44690 : 44700 ] 44710 NEXT 44720 [OPT pass% 44730 : 44740 LDR R3, f1616_counter 44750 ADD R3,R3, #1 44760 STR R3, f1616_counter 44770 CMP R3, #4 44780 BLE f1616_fill_loop 44790 : 44800 LDMFD R13!,{R0-R12,PC} 44810 : 44820 .f1616_counter 44830 EQUD 0 44840 : 44850 : 44860 : 44870 .fill_fill_0101 44880 : 44890 STMFD R13!,{R0-R12,R14} 44900 : 44910 RSB R2,R2, #256 44920 : 44930 CMP R1, #0 44940 BLE psm_no_fill0101 44950 CMP R2, #0 44960 BLE psm_no_fill0101 44970 CMP R1, #320 44980 BGE psm_no_fill0101 44990 CMP R2, #256 45000 BGE psm_no_fill0101 45010 B psm_fill0101 45020 .psm_no_fill0101 45030 LDMFD R13!,{R0-R12,PC} 45040 .psm_fill0101 45050 : 45060 MOV R7, #x_shift ; get screen shifts 45070 MOV R8, #y_shift 45080 : 45090 LDR R9, fill_adr_screenstore; get screenstore address 45100 LDR R9,[R9] 45110 MLA R3,R7,R1,R9 45120 MLA R0,R8,R2,R3 45130 : 45140 LDR R9, fill_screendata ; get screen address 45150 MLA R3,R7,R1,R9 45160 MLA R1,R8,R2,R3 45170 : 45180 LDRB R2,[R1] 45190 STRB R2,[R0] 45200 : 45210 LDMFD R13!,{R0-R12,PC} 45220 : 45230 ] 45240NEXT 45250: 45260!cl_adr_screen=screen 45270FOR a%=0 TO 255 45280 r%=SQRSQR(a%*256^3) 45290 g%=SQR(a%*256) 45300 b%=a% 45310 SYS "ColourTrans_ReturnColourNumber",(r%<<8)+(g%<<16)+(b%<<24) TO colour% 45320 !(flame_fade%+a%)=colour% 45330NEXT 45340: 45350FOR a%=0 TO 255 45360 r%=64+a%/2 45370 g%=128+a%/2 45380 b%=128+a%/2 45390 SYS "ColourTrans_ReturnColourNumber",(r%<<8)+(g%<<16)+(b%<<24) TO colour% 45400 !(gun_fade%+a%)=colour% 45410NEXT 45420: 45430c%=OPENIN("<This$Dir>.Levels.Level"+STR$(scrn%)+".Posn"+STR$(scrn%)) 45440FOR a%=0 TO 7 45450 INPUT#c%,x% 45460 INPUT#c%,y% 45470 !(a%*8+positions)=x% 45480 !(a%*8+4+positions)=y% 45490NEXT 45500CLOSE#c% 45510: 45520p%=clist% 45530FOR a%=1 TO clist_size%/32-1 45540 PROCadd_cell(0) 45550NEXT 45560PROCadd_cell(-1) 45570: 45580p%=slist% 45590FOR a%=1 TO slist_size%/16-1 45600 PROCadd_sprite(0,0,0,0) 45610NEXT 45620PROCadd_sprite(0,0,-1,0) 45630p%=slist% 45640FOR a%=1 TO 16 45650 PROCadd_sprite(0,0,0,0) 45660NEXT 45670c%=OPENIN("<This$Dir>.Levels.Level"+STR$(scrn%)+".Doors"+STR$(scrn%)) 45680FOR a%=1 TO 4 45690 INPUT#c%,x% 45700 INPUT#c%,y% 45710 INPUT#c%,t% 45720 INPUT#c%,i% 45730 PROCadd_sprite(x%,y%,13,i%) 45740NEXT 45750CLOSE#c% 45760c%=OPENIN("<This$Dir>.Levels.Level"+STR$(scrn%)+".GSwitches") 45770FOR a%=1 TO 4 45780 INPUT#c%,x% 45790 INPUT#c%,y% 45800 INPUT#c%,t% 45810 INPUT#c%,i% 45820 PROCadd_sprite(x%,y%,14,a%) 45830NEXT 45840CLOSE#c% 45850c%=OPENIN("<This$Dir>.Levels.Level"+STR$(scrn%)+".Guns"+STR$(scrn%)) 45860FOR a%=1 TO 4 45870 INPUT#c%,x% 45880 INPUT#c%,y% 45890 INPUT#c%,t% 45900 INPUT#c%,i% 45910 PROCadd_sprite(x%,y%,15,a%) 45920NEXT 45930CLOSE#c% 45940PROCadd_sprite(1116,32,2,(128<<8)+(128<<16)) 45950PROCadd_sprite(84,896,1,(128<<8)+(128<<16)) 45960c%=OPENIN("<This$Dir>.Levels.Level"+STR$(scrn%)+".Flames"+STR$(scrn%)) 45970FOR a%=1 TO 16 45980 INPUT#c%,x% 45990 INPUT#c%,y% 46000 INPUT#c%,t% 46010 INPUT#c%,i% 46020 PROCadd_sprite(x%,y%,3,i%) 46030NEXT 46040CLOSE#c% 46050CALL start 46060CALL clear_screen 46070ENDPROC 46080: 46090: 46100: 46110DEF PROCerror 46120ON ERROR OFF 46130*FX 200,1 46140SYS "Hourglass_Smash" 46150MOUSE OFF 46160IF ERR=17 THEN 46170 SYS "OS_Byte",112,1 46180 CLS 46190 SYS "OS_Byte",113,1 46200ELSE 46210 SYS "OS_Byte",112,1 46220 CLS 46230 SYS "OS_Byte",113,1 46240 PRINT REPORT$;" at line ";ERL 46250ENDIF 46260*RmKill EXPLO 46270*RmKill TOKENRM 46280*RmKill ARG 46290*RmKill RARG 46300*RmKill LaughRM 46310*RmKill Revolver 46320*RmKill Gener 46330*FX 200,0 46340ENDPROC 46350: 46360: 46370: 46380DEF FNbordercol(r%,g%,b%) 46390 [OPT pass% 46400;SWI 256+19 46410;SWI 256+0 46420;SWI 256+24 46430;SWI 256+r% 46440;SWI 256+g% 46450;SWI 256+b% 46460 ] 46470=0 46480: 46490: 46500: 46510DEF PROCadd_sprite(x%,y%,t%,i%) 46520!(p%+00)=t% 46530!(p%+04)=x% 46540!(p%+08)=y% 46550!(p%+12)=i% 46560p%+=16 46570ENDPROC 46580: 46590: 46600: 46610DEF PROCadd_cell(t%) 46620p%!00=t% 46630p%+=32 46640ENDPROC 46650: 46660: 46670: 46680DEF PROCassm_decomp 46690FOR pass%=%0000 TO %1010 STEP %1010 46700 P%=decomp_code% 46710 L%=decomp_code%+1020 46720 [OPT pass% 46730 : 46740 .dc_unused 46750 EQUD 0 46760 .dc_cmpp 46770 EQUD 0 46780 .dc_address 46790 EQUD 0 46800 .dc_value 46810 EQUD 0 46820 .dc_repetitions 46830 EQUD 0 46840 : 46850 .dc_start 46860 LDR R0, dc_cmpp 46870 LDR R1,[R0] 46880 STR R1, dc_unused 46890 ADD R0,R0, #4 46900 STR R0, dc_cmpp 46910 .dc_repeat_loop1 46920 LDR R0, dc_cmpp 46930 LDR R0,[R0] 46940 LDR R1, dc_unused 46950 CMP R0,R1 46960 BEQ dc_decompress 46970 .dc_copy 46980 LDR R0, dc_cmpp 46990 LDR R1,[R0] 47000 LDR R2, dc_address 47010 STR R1,[R2] 47020 LDR R0, dc_cmpp 47030 ADD R0,R0, #4 47040 LDR R2, dc_address 47050 ADD R2,R2, #4 47060 STR R0, dc_cmpp 47070 STR R2, dc_address 47080 B dc_until1 47090 .dc_decompress 47100 LDR R0, dc_cmpp 47110 LDR R7,[R0, #4] 47120 STR R7, dc_value 47130 LDR R0,[R0, #8] 47140 STR R0, dc_repetitions 47150 CMP R0, #0 47160 BEQ dc_until1 47170 LDR R7, dc_value 47180 LDR R8, dc_address 47190 MOV R9, #1 47200 .dc_repeat_loop2 47210 STMIA R8!,{R7} 47220 ADD R9,R9, #1 47230 LDR R0, dc_repetitions 47240 CMP R9,R0 47250 BLE dc_repeat_loop2 47260 STR R8, dc_address 47270 LDR R0, dc_cmpp 47280 ADD R0,R0, #12 47290 STR R0, dc_cmpp 47300 .dc_until1 47310 LDR R0, dc_cmpp 47320 LDR R1,[R0] 47330 LDR R2, dc_unused 47340 CMP R1,R2 47350 BNE dc_repeat_loop1 47360 LDR R3,[R0, #8] 47370 CMP R3, #0 47380 BNE dc_repeat_loop1 47390 MOV PC,R14 47400 : 47410 ] 47420NEXT 47430ENDPROC 47440: 47450: 47460: 47470DEF PROCdecompress(from$,to%) 47480SYS "OS_File",255,from$,cmpdata%,0 47490!dc_address=to% 47500!dc_cmpp=cmpdata% 47510CALL dc_start 47520ENDPROC 47530: 47540: 47550: 47560DEF PROCassemble_clear_screen 47570FOR pass%=%0000 TO %1010 STEP %1010 47580 P%=cl_code% 47590 L%=cl_code%+2044 47600 [OPT pass% 47610 : 47620 .setup_cs 47630 STMFD R13!,{R0-R12,R14} 47640 LDR R0, cl_adr_vdu_vars 47650 LDR R1, cl_adr_screen 47660 SWI "OS_ReadVduVariables" ; set up vdu variables 47670 LDMFD R13!,{R0-R12,PC} 47680 : 47690 .clear_screen 47700 STMFD R13!,{R0-R12,R14} 47710 : 47720 LDR R11, adr_clscolours ; get the address of colour data 47730 MOV R9, #0 ; y co-ord 47740 : 47750 .cl_loop1 47760 : 47770 LDR R10, cl_adr_screen 47780 LDR R10,[R10] ; get screen address 47790 ADD R7,R10, #&14000 ; get screen end 47800 : 47810 .cl_loop3 47820 ] 47830 FOR a%=0 TO 15 47840 FOR b%=0 TO fader% STEP 4 47850 [OPT pass% 47860 : 47870 ADD R10,R10, #b% 47880 BL cl_cls ; dim screen 47890 SUB R10,R10, #b% 47900 : 47910 MOV R0, #19 47920 SWI "OS_Byte" 47930 : 47940 ] 47950 NEXT 47960 NEXT 47970 [OPT pass% 47980 : 47990 .cl_end_routines 48000 : 48010 .cl_end 48020 LDMFD R13!,{R0-R12,PC} 48030 : 48040 .cl_cls 48050 MOV R6,R10 48060 MOV R4, #&FF 48070 .cl_loop2 48080 LDR R0,[R6] 48090 : 48100 MOV R3,R0, ROR #8 48110 CMP R3,R0 48120 BNE cl_not_same 48130 AND R1,R4,R0 48140 LDRB R1,[R11,R1] 48150 ORR R3,R1,R1, LSL #8 48160 ORR R3,R3,R3, LSL #16 48170 : 48180 B cl_done_pixels 48190 : 48200 .cl_not_same 48210 AND R1,R4,R0 48220 LDRB R1,[R11,R1] 48230 MOV R3,R1 48240 : 48250 AND R1,R4,R0, LSR #8 48260 LDRB R1,[R11,R1] 48270 ORR R3,R3,R1, LSL #8 48280 : 48290 AND R1,R4,R0, LSR #16 48300 LDRB R1,[R11,R1] 48310 ORR R3,R3,R1, LSL #16 48320 : 48330 AND R1,R4,R0, LSR #24 48340 LDRB R1,[R11,R1] 48350 ORR R3,R3,R1, LSL #24 48360 : 48370 .cl_done_pixels 48380 STR R3,[R6], #fader%+4 48390 : 48400 CMP R6,R7 48410 BLT cl_loop2 48420 : 48430 .cl_end 48440 MOV PC,R14 48450 : 48460 .adr_clscolours 48470 EQUD cl_colours% 48480 .cl_adr_vdu_vars 48490 EQUD vdu_vars 48500 .cl_adr_screen 48510 EQUD screen 48520 .screen 48530 EQUD 0 48540 .vdu_vars 48550 EQUD 149 ; vdu data 48560 EQUD -1 48570 .screen_size 48580 EQUD &14000 48590 : 48600 ] 48610NEXT 48620CALL setup_cs 48630ENDPROC 48640: 48650: 48660: 48670DEF PROCprint(a$) 48680IF a$="" THEN PRINT:ENDPROC 48690LOCAL letter%,width%,c% 48700ORIGIN 0,0 48710x%=POS*64 48720y%=1024-VPOS*64-64 48730FOR letter%=1 TO LEN(a$) 48740 IF x%>1024 THEN x%=0:y%-=64:PRINT' 48750 asc%=ASC(MID$(a$,letter%,1)) 48760 IF asc%>31 THEN 48770 SYS "OS_SpriteOp",&128,font%,STR$asc% TO ,,,width% 48780 SYS "OS_SpriteOp",&122,font%,STR$asc%,x%,y%,0 48790 ELSE 48800 IF asc%=9 THEN x%=(INT(x%/256)+1)*256 48810 ENDIF 48820 x%+=width%*4 48830NEXT 48840PRINT 48850ENDPROC 48860: 48870: 48880DEF PROCtint 48890FOR p%=0 TO &13FFF STEP 1 48900 IF screendata%?p%<>0 THEN screendata%?p%=(screendata%?p% OR %11) EOR (RND(3)-1) 48910NEXT 48920ENDPROC
� > !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 Boom 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%=16384 �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 <