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