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