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