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