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