Home » Archimedes archive » Archimedes World » AW-1993-04.adf » AWApril93 » !AWApril93/Goodies/Xacretan/!Xacretan/!RunImage
!AWApril93/Goodies/Xacretan/!Xacretan/!RunImage
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 » Archimedes World » AW-1993-04.adf » AWApril93 |
Filename: | !AWApril93/Goodies/Xacretan/!Xacretan/!RunImage |
Read OK: | ✔ |
File size: | 9C97 bytes |
Load address: | 0000 |
Exec address: | 0000 |
File contents
10REM>!RunImage 20PROCarm3detect 30PROCwrite_detect 40ON ERROR PROCerror 50IF arm3%=TRUE THEN VOICES 4 ELSE VOICES 1 60IF arm3%=TRUE THEN voice%=4 ELSE voice%=1 70REM 80REM vvvv If the game crashed remove this line vvvv 90IF arm3%=FALSE THEN SYS "OS_UpdateMEMC",64,64 100REM ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 110REM 120IF arm3%=TRUE THEN dots%=80 ELSE dots%=25 130PROCMusAsm 140playing=TRUE:?Volume=0:CALL v_on 150firsttime=TRUE 160PROCsetup 170PROCassemfade 180PROCpink 190PROCtitle 200PROCgame 210END 220DEFPROCsetup 230mul$=CHR$ 32+CHR$ 215+CHR$ 32 240DIM DSX%(dots%),DSY%(dots%) 250DIM DX%(dots%),DY%(dots%) 260DIM left%(10),right%(10) 270DIM scblock 8 280lives=4 290IF arm3%=TRUE THEN E%=8 ELSE E%=2 300NA%=10 310NB%=5 320level=1 330speed=2 340bspeed=4 350DIM block 8:!block=148:block!4=-1 360A%=8:B%=39 370DIM explodata 2048 380OSCLI("PackLoad <Xacretan$Dir>.Explosions "+STR$~explodata) 390DIM explostats 8*E% 400FOR X%=0 TO (8*E%)-1 STEP 8 410explostats!X%=0 420explostats!(X%+4)=0 430NEXT 440DIM playerdata 320 450DIM bulletdata 32 460DIM scoredata 4096 470DIM topdata 10*1024 480P%=topdata 490FOR Q%=0 TO 31 500READ by% 510FOR X%=0 TO 319 520?P%=by% 530P%+=1 540NEXT, 550DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 560DATA 0,1,2,3,44,45,46,47,208,209,210,211,252,253,254,255 570OSCLI("PackLoad <Xacretan$Dir>.NoData "+STR$~scoredata) 580OSCLI("Load <Xacretan$Dir>.Player "+STR$~playerdata) 590OSCLI("Load <Xacretan$Dir>.Bullet "+STR$~bulletdata) 600DIM blocks 32*32*(B%+1) 610DIM aliens 16*16*12 620DIM alienstats 4*4*(NA%+1) 630DIM alienposes NA%*4 640DIM alienpathdata 12*512 650FOR X%=0 TO 11 660OSCLI("Load <Xacretan$Dir>.Paths."+STR$(X%+1)+" "+STR$~(X%*512+alienpathdata)) 670NEXT 680FOR X%=0 TO NA%-1 690alienposes!(X%*4)=(X%+X%+0.5)*16 700NEXT 710R%=RND(A%) 720FOR X%=alienstats TO alienstats+4*4*NA% STEP 4*4 730X%!0=0 740X%!4=0 750X%!8=0 760X%!12=0 770NEXT 780DIM scores 4*B%+1 790FOR X%=0 TO B%*4 STEP 4 800READ Y% 810scores!X%=Y% 820NEXT 830 F%=OPENIN("<Xacretan$Dir>.HighScores") 840DIM highscores(10) 850DIM highname$(10) 860FOR X%=1 TO 10 870INPUT#F%,highname$(X%),highscores(X%) 880 NEXT 890 CLOSE#F% 900OSCLI("PackLoad <Xacretan$Dir>.Blocks "+STR$~blocks) 910OSCLI("PackLoad <Xacretan$Dir>.Aliens "+STR$~aliens) 920DIM map 1024*3 930FOR X%=map TO map+(3*1024-1):?X%=0 940NEXT 950DIM code 1024*5 960DIM titlebit 16*1024 970OSCLI("PackLoad <Xacretan$Dir>.TitBit "+STR$~titlebit) 980MODE 15:SYS"OS_ReadVduVariables",block,block 990screen1start=!block 1000screen2start=screen1start+80*1024 1010V%=RND(-TIME) 1020FOR X%=0 TO 10 1030left%(X%)=RND(12)-1 1040right%(X%)=RND(12)-1 1050NEXT 1060ENDPROC 1070DEFPROCassemble 1080FOR pass=0 TO 2 STEP 2 1090P%=code 1100[OPT pass 1110.go 1120STMFD R13!,{R0-R12,R14} 1130LDR R11,screenstart 1140ADD R12,R11,#80*1024 1150.mainloop 1160STR R11,screenstart 1170MOV R0,#19 1180SWI "OS_Byte" 1190MOV R0,#113 1200MOV R1,#2 1210SWI "OS_Byte" 1220BL groundhitcheck 1230BL checkhit 1240BL ckdie 1250BL movealiens 1260BL scroll 1270BL bullets 1280BL alplot 1290BL player 1300BL expplot 1310BL dotop 1320BL doscore 1330STR R12,screenstart 1340MOV R0,#19 1350SWI "OS_Byte" 1360MOV R0,#113 1370MOV R1,#1 1380SWI "OS_Byte" 1390BL groundhitcheck 1400BL checkhit 1410BL ckdie 1420BL movealiens 1430BL scroll 1440BL bullets 1450BL alplot 1460BL player 1470BL expplot 1480BL dotop 1490BL doscore 1500LDR R5,mappos 1510CMP R5,#10 1520MOVLT R5,#1 1530STRLT R5,endreason 1540LDR R5,endreason 1550CMP R5,#2 1560BEQ dieroutine 1570CMP R5,#0 1580BNE end 1590SWI "OS_ReadEscapeState" 1600BCC mainloop 1610.end 1620LDMFD R13!,{R0-R12,PC} 1630.damp:EQUD &FFF1 1640.dpit:EQUD &1280 1650.dieroutine 1660MOV R0,#2 1670LDR R1,damp 1680LDR R2,dpit 1690MOV R3,#&FE 1700SWI "Sound_Control" 1710MOV R10,#0 1720LDR R9,playerx 1730LDR R8,playery 1740MOV R7,#320 1750MUL R8,R7,R8 1760ADD R0,R8,R9 1770BL expinit 1780ADD R0,R0,#16 1790BL expinit 1800ADD R0,R0,#17*320 1810BL expinit 1820SUB R0,R0,#16 1830BL expinit 1840SUB R0,R0,#8*320 1850ADD R0,R0,#8 1860MOV R6,R0 1870.dieloop 1880STR R11,screenstart 1890MOV R0,#19 1900SWI "OS_Byte" 1910MOV R0,#113 1920MOV R1,#2 1930SWI "OS_Byte" 1940BL groundhitcheck 1950BL checkhit 1960BL movealiens 1970BL scroll 1980BL bullets 1990BL alplot 2000BL expplot 2010BL dotop 2020BL doscore 2030STR R12,screenstart 2040MOV R0,#19 2050SWI "OS_Byte" 2060MOV R0,#113 2070MOV R1,#1 2080SWI "OS_Byte" 2090BL groundhitcheck 2100BL checkhit 2110BL movealiens 2120BL scroll 2130BL bullets 2140BL alplot 2150BL expplot 2160BL dotop 2170BL doscore 2180ADD R10,R10,#1 2190CMP R10,#8 2200MOVEQ R0,R6:BLEQ expinit 2210CMP R10,#64 2220BLT dieloop 2230LDMFD R13!,{R0-R12,PC} 2240.endreason:EQUD 0 2250.topstart:EQUD topdata 2260.dotop 2270STMFD R13!,{R0-R12,R14} 2280LDR R12,screenstart 2290] 2300IF arm3%=TRUE THEN 2310[OPT pass 2320LDR R11,topstart 2330MOV R10,#0 2340.toploop 2350]:FOR Q%=0 TO 31:[OPT pass 2360LDMIA R11!,{R0-R9}:STMIA R12!,{R0-R9} 2370]:NEXT 2380ELSE 2390[OPT pass 2400ADR R11,blankdata 2410LDMIA R11!,{R0-R9} 2420MOV R10,#0 2430.toploop 2440]:FOR Q%=0 TO 31:[OPT pass 2450STMIA R12!,{R0-R9} 2460]:NEXT 2470ENDIF 2480[OPT pass 2490ADD R10,R10,#32 2500CMP R10,#256 2510BLT toploop 2520LDMFD R13!,{R0-R12,PC} 2530.screenstart:EQUD screen1start 2540.blankdata:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 2550.mapstart:EQUD map 2560.blockstart:EQUD blocks 2570.mappos:EQUD (3*1024)-80 2580.offset:EQUD 0 2590.scroll 2600STMFD R13!,{R0-R12,R14} 2610LDR R11,mapstart 2620LDR R10,mappos 2630ADD R11,R11,R10 2640MOV R8,#0 2650MOV R9,#0 2660LDR R12,screenstart 2670LDR R0,offset 2680ADD R12,R12,R0 2690.plotloop 2700LDRB R10,[R11] 2710MOV R5,#1024 2720MUL R10,R5,R10 2730LDR R5,blockstart 2740ADD R10,R10,R5 2750]:FOR Q%=1 TO 32:[OPT pass 2760LDMIA R10!,{R0-R7} 2770STMIA R12,{R0-R7} 2780ADD R12,R12,#320 2790]:NEXT:[OPT pass 2800SUB R12,R12,#320*32 2810ADD R12,R12,#32 2820ADD R11,R11,#1 2830ADD R9,R9,#1 2840CMP R9,#10 2850BLT plotloop 2860MOV R9,#0 2870ADD R12,R12,#320*31 2880ADD R8,R8,#1 2890CMP R8,#7 2900BLT plotloop 2910LDR R8,off2 2920MOV R4,#0:STR R4,botcount 2930.botbit 2940MOV R9,#0 2950LDRB R10,[R11] 2960MOV R5,#1024 2970MUL R10,R5,R10 2980LDR R5,blockstart 2990ADD R10,R10,R5 3000STMFD R13!,{R12} 3010.botloop 3020LDMIA R10!,{R0-R7} 3030STMIA R12,{R0-R7} 3040ADD R12,R12,#320 3050ADD R9,R9,#1 3060CMP R9,R8 3070BLT botloop 3080LDMFD R13!,{R12} 3090ADD R12,R12,#32 3100ADD R11,R11,#1 3110LDR R0,botcount 3120ADD R0,R0,#1 3130STR R0,botcount 3140CMP R0,#10 3150BNE botbit 3160LDR R0,offset 3170LDR R1,mappos 3180LDR R2,off2 3190ADD R0,R0,#320 3200SUB R2,R2,#1 3210CMP R0,#10240 3220MOVEQ R0,#0 3230MOVEQ R2,#32 3240SUBEQ R1,R1,#10 3250STR R1,mappos 3260STR R0,offset 3270STR R2,off2 3280LDMFD R13!,{R0-R12,PC} 3290.off2:EQUD 32 3300.botcount:EQUD 0 3310.doscore 3320STMFD R13!,{R0-R12,R14} 3330LDR R12,screenstart:ADD R12,R12,#160-(6*10) 3340]:IF arm3%=FALSE THEN [OPT pass:ADD R12,R12,#8*320:] 3350[OPT pass 3360LDR R0,dispscore:LDR R3,score 3370CMP R0,R3:ADDLT R0,R0,#2 3380CMP R0,R3 3390STR R3,dispscore 3400STRLT R0,dispscore 3410ADR R1,scorestring 3420MOV R2,#8 3430SWI "OS_ConvertCardinal3" 3440CMP R2,#0 3450BEQ over1 3460MOV R3,#0 3470MOV R0,#0 3480ADR R1,printstring 3490.scoreloop1 3500STRB R0,[R1,R3] 3510ADD R3,R3,#1 3520CMP R3,R2 3530BLT scoreloop1 3540.over1 3550MOV R4,#0 3560ADR R2,scorestring 3570.scoreloop2 3580LDRB R0,[R2,R4] 3590SUB R0,R0,#48 3600STRB R0,[R1,R3] 3610ADD R4,R4,#1 3620ADD R3,R3,#1 3630CMP R3,#8 3640BLT scoreloop2 3650ADR R10,printstring 3660MOV R9,#2 3670.scoreloop3 3680MOV R11,R12 3690LDRB R8,[R10,R9] 3700LDR R7,scoredatastart 3710MOV R0,#20*20 3720MUL R0,R8,R0 3730ADD R7,R7,R0 3740]:FOR X=0 TO 19:[OPT pass 3750LDMIA R7!,{R0-R4} 3760STMIA R11,{R0-R4} 3770ADD R11,R11,#320 3780]:NEXT:[OPT pass 3790ADD R12,R12,#20 3800ADD R9,R9,#1 3810CMP R9,#8 3820BNE scoreloop3 3830LDMFD R13!,{R0-R12,PC} 3840.scorestring 3850EQUD 0:EQUD 0:EQUD 0 3860.printstring 3870EQUD 0:EQUD 0:EQUD 0 3880.dispscore:EQUD 0 3890.score:EQUD 0 3900.scoredatastart 3910EQUD scoredata 3920.scraddr:EQUD screenstart 3930.bulletstart:EQUD bulletdata 3940.bulletstatsstart:EQUD bulletstats 3950.bullets 3960STMFD R13!,{R0-R12,R14} 3970LDR R12,scraddr 3980LDR R12,[R12] 3990LDR R11,bulletstart 4000LDR R10,bulletstatsstart 4010MOV R9,#0 4020.bloop 4030LDR R0,[R10] 4040CMP R0,#0 4050BEQ nobullet 4060LDR R1,[R10,#4] 4070MOV R2,#320 4080MUL R2,R1,R2 4090ADD R2,R2,R0 4100ADD R2,R2,R12 4110LDRB R3,[R11,#0]:STRB R3,[R2] 4120LDRB R3,[R11,#1]:STRB R3,[R2,#1]:ADD R2,R2,#320 4130LDRB R3,[R11,#2]:STRB R3,[R2] 4140LDRB R3,[R11,#3]:STRB R3,[R2,#1]:ADD R2,R2,#320 4150LDRB R3,[R11,#4]:STRB R3,[R2] 4160LDRB R3,[R11,#5]:STRB R3,[R2,#1]:ADD R2,R2,#320 4170LDRB R3,[R11,#6]:STRB R3,[R2] 4180LDRB R3,[R11,#7]:STRB R3,[R2,#1]:ADD R2,R2,#320 4190LDRB R3,[R11,#8]:STRB R3,[R2] 4200LDRB R3,[R11,#9]:STRB R3,[R2,#1]:ADD R2,R2,#320 4210LDRB R3,[R11,#10]:STRB R3,[R2] 4220LDRB R3,[R11,#11]:STRB R3,[R2,#1]:ADD R2,R2,#320 4230LDRB R3,[R11,#12]:STRB R3,[R2] 4240LDRB R3,[R11,#13]:STRB R3,[R2,#1]:ADD R2,R2,#320 4250LDRB R3,[R11,#14]:STRB R3,[R2] 4260LDRB R3,[R11,#15]:STRB R3,[R2,#1]:ADD R2,R2,#320 4270LDRB R3,[R11,#16]:STRB R3,[R2] 4280LDRB R3,[R11,#17]:STRB R3,[R2,#1] 4290SUB R1,R1,#bspeed:STR R1,[R10,#4] 4300CMP R1,#24 4310MOVLT R0,#0 4320STR R0,[R10] 4330.nobullet 4340ADD R10,R10,#8 4350ADD R9,R9,#1 4360CMP R9,#NB% 4370BLT bloop 4380LDMFD R13!,{R0-R12,PC} 4390.bulletstats 4400EQUD 0:EQUD 0: 4410EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0: 4420.playerdatastart:EQUD playerdata 4430.player 4440STMFD R13!,{R0-R12,R14} 4450LDR R12,scraddr 4460LDR R12,[R12] 4470LDR R11,playerdatastart 4480LDR R0,playerx 4490LDR R1,playery 4500MOV R2,#320 4510MUL R2,R1,R2 4520ADD R2,R2,R0 4530ADD R2,R2,R12 4540MOV R10,#0 4550MOV R9,#0 4560.pplotloop 4570LDRB R3,[R11,R10] 4580CMP R3,#0 4590STRNEB R3,[R2,R9] 4600ADD R10,R10,#1 4610ADD R9,R9,#1 4620CMP R9,#16 4630BLT pplotloop 4640MOV R9,#0 4650ADD R2,R2,#320 4660CMP R10,#16*17 4670BLT pplotloop 4680LDR R12,playerx 4690LDR R11,playery 4700MOV R0,#121 4710CMP R12,#8 4720BLE noleft 4730MOV R1,#97 EOR &80 4740SWI "OS_Byte" 4750CMP R1,#&FF 4760SUBEQ R12,R12,#speed 4770.noleft 4780CMP R12,#296 4790BGE noright 4800MOV R1,#66 EOR &80:SWI "OS_Byte" 4810CMP R1,#&FF 4820ADDEQ R12,R12,#speed 4830.noright 4840STR R12,playerx 4850CMP R11,#222 4860BGE nodown 4870MOV R1,#104 EOR &80:SWI "OS_Byte" 4880CMP R1,#&FF 4890ADDEQ R11,R11,#speed 4900.nodown 4910CMP R11,#80 4920BLE noup 4930MOV R1,#79 EOR &80:SWI "OS_Byte" 4940CMP R1,#&FF 4950SUBEQ R11,R11,#speed 4960.noup 4970STR R11,playery 4980MOV R1,#73 EOR &80:SWI "OS_Byte" 4990LDR R5,return 5000CMP R5,R1 5010BEQ nofire 5020STR R1,return 5030CMP R1,#&FF 5040BNE nofire 5050ADR R10,bulletstats 5060MOV R9,#0 5070.findloop 5080LDR R0,[R10,R9] 5090CMP R0,#0 5100BEQ foundfire 5110ADD R9,R9,#8 5120CMP R9,#8*5 5130BLT findloop 5140B nofire 5150.foundfire 5160ADD R12,R12,#7 5170STR R12,[R10,R9] 5180ADD R9,R9,#4 5190STR R11,[R10,R9] 5200MOV R0,#1 5210]:IF arm3%=FALSE THEN 5220[OPT pass 5230ADR R1,bstring 5240SWI "Sound_AttachNamedVoice" 5250] 5260ENDIF 5270[OPT pass 5280LDR R1,bamp 5290LDR R2,bpit 5300MOV R3,#&FE 5310SWI "Sound_Control" 5320.nofire 5330LDMFD R13!,{R0-R12,PC} 5340.playerx:EQUD (320/2)-8 5350.playery:EQUD 200 5360.bamp:EQUD &FFF1 5370.bpit:EQUD &1128 5380.bstring:EQUS "ZapMod"+CHR$ 0:ALIGN 5390.return:EQUD 0 5400.offpos:EQUD off2 5410.gmapdata:EQUD map 5420.gmappos:EQUD mappos 5430.gscorestats:EQUD scores 5440.gscorepos:EQUD score 5450.groundhitcheck 5460STMFD R13!,{R0-R12,R14} 5470ADR R11,bulletstats 5480LDR R12,scraddr 5490LDR R12,[R12] 5500MOV R10,#0 5510LDR R9,offpos 5520LDR R9,[R9] 5530MOV R8,#32 5540SUB R9,R8,R9 5550LDR R8,gmappos:LDR R8,[R8] 5560LDR R7,gmapdata 5570LDR R6,gscorestats 5580LDR R5,gscorepos 5590.bcheckgroundloop 5600LDR R0,[R11] 5610CMP R0,#0 5620BEQ gc_nobullet 5630MOV R0,R0,LSR #5 5640LDR R2,[R11,#4] 5650ADD R2,R2,R9 5660MOV R1,R2,LSR #5 5670MOV R2,#10:MUL R2,R1,R2 5680ADD R2,R2,R0 5690ADD R2,R2,R7 5700ADD R2,R2,R8 5710LDRB R0,[R2] 5720LDR R1,[R6,R0,LSL #2] 5730CMP R1,#0 5740BEQ gc_nobullet 5750LDR R4,[R5] 5760LDR R3,anddata 5770AND R3,R3,R1 5780ADD R4,R4,R3 5790STR R4,[R5] 5800MOV R1,R1,LSR #31 5810ADD R1,R1,#1 5820STRB R1,[R2] 5830MOV R0,#0 5840STR R0,[R11] 5850STMFD R13!,{R0-R3} 5860]:IF arm3%=FALSE THEN 5870[OPT pass 5880MOV R0,#1 5890ADR R1,gstring 5900SWI "Sound_AttachNamedVoice" 5910] 5920ELSE 5930[OPT pass 5940MOV R0,#2 5950] 5960ENDIF 5970[OPT pass 5980LDR R1,gamp 5990LDR R2,gpit 6000MOV R3,#&FE 6010SWI "Sound_Control" 6020LDMFD R13!,{R0-R3} 6030.gc_nobullet 6040ADD R10,R10,#1 6050ADD R11,R11,#8 6060CMP R10,#NB% 6070BLT bcheckgroundloop 6080LDMFD R13!,{R0-R12,PC} 6090.dotdata:EQUD -1 6100.gamp:EQUD &FFF1 6110.gpit:EQUD &1380 6120.gstring:EQUS "Explo1":EQUD 0:ALIGN 6130.anddata:EQUD &FFFF 6140.expdatastart:EQUD explodata 6150.expstatsstart:EQUD explostats 6160.expno:EQUD 0 6170.expinit 6180STMFD R13!,{R0-R12,R14} 6190LDR R12,expno 6200MOV R11,R12,LSL #3 6210LDR R10,expstatsstart 6220STR R0,[R10,R11] 6230MOV R1,#0 6240ADD R11,R11,#4 6250STR R1,[R10,R11] 6260ADD R12,R12,#1 6270CMP R12,#E% 6280MOVEQ R12,#0 6290STR R12,expno 6300]:IF arm3%=FALSE THEN 6310[OPT pass 6320MOV R0,#1 6330ADR R1,estring 6340SWI "Sound_AttachNamedVoice" 6350] 6360ELSE 6370[OPT pass 6380MOV R0,#3 6390] 6400ENDIF 6410[OPT pass 6420LDR R1,examp 6430LDR R2,expit 6440MOV R3,#&FE 6450SWI "Sound_Control" 6460LDMFD R13!,{R0-R12,PC} 6470.expcount 6480EQUD 0 6490.expit:EQUD &1200 6500.examp:EQUD &FFF1 6510.estring:EQUS "Explo2":EQUD 0:ALIGN 6520.exscraddr:EQUD screenstart 6530.expplot 6540STMFD R13!,{R0-R12,R14} 6550LDR R12,expstatsstart 6560LDR R7,exscraddr:LDR R7,[R7] 6570MOV R11,#0 6580LDR R8,expdatastart 6590LDR R10,expcount 6600ADD R10,R10,#1 6610AND R10,R10,#3 6620STR R10,expcount 6630.exploop 6640LDR R0,[R12,R11] 6650ADD R11,R11,#4 6660LDR R1,[R12,R11] 6670CMP R10,#0:ADDEQ R1,R1,#1:STR R1,[R12,R11] 6680CMP R1,#7 6690BGT noexplo 6700ADD R0,R0,R7 6710MOV R9,#16*16 6720MUL R9,R1,R9 6730ADD R9,R9,R8 6740MOV R5,#0 6750.eploop 6760]:FOR W%=0 TO 15:[OPT pass 6770LDRB R2,[R9,#W%]:CMP R2,#0:STRNEB R2,[R0,#W%] 6780]:NEXT:[OPT pass 6790ADD R9,R9,#16 6800ADD R0,R0,#320 6810ADD R5,R5,#1 6820CMP R5,#16 6830BLT eploop 6840.noexplo 6850ADD R11,R11,#4 6860CMP R11,#E%*8 6870BLT exploop 6880LDMFD R13!,{R0-R12,PC} 6890.alpscstart 6900EQUD screenstart 6910.aldatastart 6920EQUD aliens 6930.alstats:EQUD alienstats 6940.alplot 6950STMFD R13!,{R0-R12,R14} 6960LDR R12,alpscstart 6970LDR R12,[R12] 6980LDR R11,aldatastart 6990LDR R10,alstats 7000MOV R9,#0 7010MOV R8,#320 7020MOV R7,#16*16 7030.alplotloop 7040LDMIA R10!,{R0-R3} 7050CMP R3,#0:BEQ noalien 7060CMP R0,#0:BLT noalien 7070CMP R0,#320-16:BGE noalien 7080CMP R1,#0:BLT noalien 7090CMP R1,#256-16:BGE noalien 7100SUB R3,R3,#1 7110MUL R3,R7,R3:ADD R3,R3,R11 7120MUL R1,R8,R1 7130ADD R0,R0,R1 7140ADD R0,R0,R12 7150MOV R6,#0 7160.alloop 7170]:FOR W%=0 TO 15:[OPT pass 7180LDRB R1,[R3,#W%]:CMP R1,#0:STRNEB R1,[R0,#W%] 7190]:NEXT:[OPT pass 7200ADD R0,R0,#320 7210ADD R3,R3,#16 7220]:FOR W%=0 TO 15:[OPT pass 7230LDRB R1,[R3,#W%]:CMP R1,#0:STRNEB R1,[R0,#W%] 7240]:NEXT:[OPT pass 7250ADD R0,R0,#320 7260ADD R3,R3,#16 7270ADD R6,R6,#2 7280CMP R6,#16 7290BLT alloop 7300.noalien 7310ADD R9,R9,#1 7320CMP R9,#NA% 7330BLT alplotloop 7340LDMFD R13!,{R0-R12,PC} 7350.ckbulletstatstart:EQUD bulletstats 7360.ckalstats:EQUD alienstats 7370.ckscorepos:EQUD score 7380.checkhit 7390STMFD R13!,{R0-R12,R14} 7400LDR R12,ckbulletstatstart 7410LDR R8,ckscorepos 7420MOV R10,#0 7430.ckloop1 7440LDMIA R12!,{R0,R1} 7450CMP R0,#0 7460BEQ cknobullet 7470LDR R11,ckalstats 7480ADD R0,R0,#1 7490MOV R9,#0 7500.ckloop2 7510LDMIA R11!,{R2-R5} 7520CMP R5,#0 7530BEQ nohit 7540CMP R0,R2:BLT nohit 7550CMP R1,R3:BLT nohit 7560ADD R2,R2,#16 7570CMP R0,R2:BGT nohit 7580ADD R3,R3,#16 7590CMP R1,R3:BGT nohit 7600SUB R2,R2,#16 7610SUB R3,R3,#16 7620LDR R7,[R8] 7630BL rand 7640LDR R4,value 7650AND R4,R4,#%111111 7660ADD R7,R7,R4 7670STR R7,[R8] 7680SUB R11,R11,#4 7690SUB R12,R12,#8 7700MOV R5,#0 7710STMIA R11!,{R5} 7720STMIA R12!,{R5,R6} 7730MOV R4,#320 7740MUL R4,R3,R4 7750ADD R4,R4,R2 7760MOV R3,R0 7770MOV R0,R4 7780BL expinit 7790MOV R0,R3 7800.nohit 7810ADD R9,R9,#1 7820CMP R9,#NA% 7830BLT ckloop2 7840.cknobullet 7850ADD R10,R10,#1 7860CMP R10,#NB% 7870BLT ckloop1 7880LDMFD R13!,{R0-R12,PC} 7890.rand 7900STMFD R13!,{R0-R12,R14} 7910LDR R0,rdata 7920LDR R1,eor 7930LDR R2,and 7940]:FOR Q%=0 TO 7:[OPT pass 7950ANDS R4,R0,R2 7960EORNE R0,R0,R1 7970ADD R0,R5,R0,ROR #31 7980]:NEXT:[OPT pass 7990STR R0,rdata 8000MOV R5,R0,LSR #24 8010STR R5,value 8020LDMFD R13!,{R0-R12,PC} 8030ALIGN 8040.rdata 8050EQUD TIME 8060.eor 8070EQUB 0 8080EQUB &76 8090EQUB &B5 8100EQUB &53 8110.and 8120EQUB %10000000 8130EQUB 0 8140EQUB 0 8150EQUB 0 8160.value 8170EQUD 0 8180ALIGN 8190.malienstats:EQUD alienstats 8200.malienposes:EQUD alienposes 8210.malienpathdata:EQUD alienpathdata 8220.mcounter:EQUD 400 8230.movealiens 8240STMFD R13!,{R0-R12,R14} 8250LDR R0,mcounter 8260ADD R0,R0,#1 8270CMP R0,#512 8280MOVEQ R0,#0 8290STR R0,mcounter 8300BEQ newset 8310LDR R12,malienstats 8320MOV R11,#0 8330LDR R10,malienpathdata 8340MOV R6,#1 8350.domove 8360LDMIA R12,{R0-R3} 8370ADD R2,R2,#1 8380CMP R2,#512 8390MOVEQ R3,#0 8400CMP R3,#0 8410BEQ mnoalien 8420SUB R4,R3,#1 8430MOV R9,#512 8440MUL R4,R9,R4 8450ADD R7,R4,R10 8460LDRB R8,[R7] 8470LDRB R9,[R7,R2] 8480CMP R9,#1:SUBEQ R0,R0,R6,LSL R8:ADDEQ R1,R1,R6,LSL R8 8490CMP R9,#2:ADDEQ R1,R1,R6,LSL R8 8500CMP R9,#3:ADDEQ R0,R0,R6,LSL R8:ADDEQ R1,R1,R6,LSL R8 8510CMP R9,#4:SUBEQ R0,R0,R6,LSL R8 8520CMP R9,#6:ADDEQ R0,R0,R6,LSL R8 8530CMP R9,#7:SUBEQ R0,R0,R6,LSL R8:SUBEQ R1,R1,R6,LSL R8 8540CMP R9,#8:SUBEQ R1,R1,R6,LSL R8 8550CMP R9,#9:ADDEQ R0,R0,R6,LSL R8:SUBEQ R1,R1,R6,LSL R8 8560.mnoalien 8570STMIA R12!,{R0-R3} 8580ADD R11,R11,#1 8590CMP R11,#NA% 8600BLT domove 8610LDMIA R13!,{R0-R12,PC} 8620.mmappos:EQUD mappos 8630.newset 8640LDR R12,mmappos:LDR R12,[R12] 8650CMP R12,#200 8660LDMLTFD R13!,{R0-R12,PC} 8670LDR R12,malienstats 8680LDR R11,malienposes 8690LDR R8,malienpathdata 8700MOV R1,#0 8710MOV R9,#0 8720.again 8730BL rand 8740LDR R3,value 8750AND R3,R3,#%1111 8760CMP R3,#A% 8770BGT again 8780CMP R3,#0 8790BEQ again 8800MOV R4,#512 8810SUB R5,R3,#1 8820MUL R4,R5,R4 8830LDRB R2,[R8,R4] 8840MOV R10,#32 8850MOV R10,R10,LSR R2 8860MOV R2,#0 8870.newloop 8880LDR R0,[R11,R9,LSL #2] 8890STMIA R12!,{R0-R3} 8900ADD R2,R2,R10 8910ADD R9,R9,#1 8920CMP R9,#NA% 8930BLT newloop 8940LDMFD R13!,{R0-R12,PC} 8950.ckplayerx:EQUD playerx 8960.ckplayery:EQUD playery 8970.ckendreason:EQUD endreason 8980.ckdie 8990STMFD R13!,{R0-R12,R14} 9000LDR R12,malienstats 9010LDR R11,ckplayerx:LDR R11,[R11] 9020LDR R10,ckplayery:LDR R10,[R10] 9030LDR R7,ckendreason 9040ADD R10,R10,#16:ADD R11,R11,#1 9050MOV R8,#2 9060MOV R9,#0 9070.pckloop1 9080LDMIA R12!,{R0-R3} 9090CMP R3,#0:BEQ nodie1 9100CMP R11,R0:BLT nodie1 9110CMP R10,R1:BLT nodie1 9120ADD R1,R1,#16:CMP R10,R1:BGT nodie1 9130ADD R0,R0,#16:CMP R11,R0:BGT nodie1 9140STR R8,[R7] 9150LDMFD R13!,{R0-R12,PC} 9160.nodie1 9170ADD R9,R9,#1:CMP R9,#NA% 9180BLT pckloop1 9190LDR R12,malienstats:MOV R9,#0 9200ADD R11,R11,#14 9210.pckloop2 9220LDMIA R12!,{R0-R3}:CMP R3,#0:BEQ nodie2 9230CMP R11,R0:BLT nodie2:CMP R10,R1:BLT nodie2 9240ADD R1,R1,#16:CMP R10,R1:BGT nodie2 9250ADD R0,R0,#16:CMP R11,R0:BGT nodie2 9260STR R8,[R7] 9270LDMFD R13!,{R0-R12,PC} 9280.nodie2 9290ADD R9,R9,#1:CMP R9,#NA%:BLT pckloop2 9300LDR R12,malienstats:MOV R9,#0 9310LDR R11,ckplayerx:LDR R11,[R11]:ADD R11,R11,#8 9320LDR R10,ckplayery:LDR R10,[R10]:ADD R10,R10,#1 9330.pckloop3 9340LDMIA R12!,{R0-R3}:CMP R3,#0:BEQ nodie3 9350CMP R11,R0:BLT nodie3:CMP R10,R1:BLT nodie3 9360ADD R1,R1,#16:CMP R10,R1:BGT nodie3 9370ADD R0,R0,#16:CMP R11,R0:BGT nodie3 9380STR R8,[R7] 9390LDMFD R13!,{R0-R12,PC} 9400.nodie3 9410ADD R9,R9,#1:CMP R9,#NA%:BLT pckloop3 9420LDMFD R13!,{R0-R12,PC} 9430]:NEXT 9440ENDPROC 9450DEFPROCgame 9460REPEAT 9470PROChighscores 9480lives=4:level=1:NB%=5:A%=8 9490IF pink%=TRUE THEN OSCLI("PackLoad <Xacretan$Dir>.Blocks "+STR$~blocks):pink%=FALSE 9500PROCassemble 9510OSCLI("Load <Xacretan$Dir>.Maps.1 "+STR$~map) 9520OFF 9530REPEAT 9540FOR X%=0 TO 319 STEP 4 9550FOR Y%=0 TO 16*320 STEP 320 9560N%=X%+Y% 9570topdata!N%=0 9580NEXT, 9590FOR X%=0 TO lives-1 9600N%=0 9610P%=X%*20 9620FOR Q%=0 TO 16 9630FOR B%=0 TO 15 STEP 4 9640topdata!P%=playerdata!N% 9650N%+=4 9660P%+=4 9670NEXT 9680P%+=(320-16) 9690NEXT 9700NEXT 9710FOR X%=0 TO NB%-1 9720P%=640*3+X%*7+256 9730FOR Q%=0 TO 7*2 STEP 2 9740topdata!P%=(bulletdata!Q%) AND &FFFF0000 9750P%+=320 9760NEXT, 9770*FX 112,1 9780PROCstopmusic 9790CLS 9800*FX 113,1 9810COLOUR 60 9820PRINTTAB(15,10)"Zone ";level 9830COLOUR 3 TINT 255 9840PRINTTAB(11,17)" ";lives;" Ship";:IF lives<>1 THEN PRINT"s"; 9850PRINT" left." 9860COLOUR 43 9870PRINTTAB(7,25)"Press any key to play." 9880OFF 9890N=GET 9900!playerx=(320/2)-8 9910!playery=200 9920!screenstart=screen2start 9930CALL scroll:CALL player:CALL dotop:CALL doscore 9940FOR X%=0 TO 80*1024 STEP 640 9950?scblock=%10 9960scblock!1=X% 9970WAIT:SYS "OS_Word",22,scblock 9980NEXT 9990?scblock=%10 10000!screenstart=screen1start 10010CALL scroll:CALL player:CALL dotop:CALL doscore 10020?scblock=%10 10030scblock!1=0 10040SYS "OS_Word",22,scblock 10050CALL go 10060*FX 15,0 10070IF !endreason=1 THEN PROCnewlevel:GOTO 10150 10080T=TIME:REPEATUNTILTIME>T+100 10090!endreason=0 10100lives-=1 10110!mappos=!mappos+60 10120FOR X%=alienstats TO alienstats+4*4*NA% STEP 4 10130!X%=0 10140NEXT 10150*FX 112,2 10160CLS 10170*FX 112,1 10180FOR X%=0 TO 80*1024 STEP 640 10190?scblock=%10 10200scblock!1=X% 10210WAIT:SYS "OS_Word",22,scblock 10220NEXT 10230UNTIL lives=0 OR level=6 10240CLS 10250*FX 113,1 10260COLOUR 3 TINT 255 10270PRINTTAB(13,10)"Game Over." 10280COLOUR 30 10290PRINTTAB(10,12)"You scored ";!score 10300IF !score>highscores(10) THEN GOTO 10330 10310V=INKEY(10000) 10320UNTIL FALSE 10330X%=0:e%=FALSE 10340REPEAT 10350X%+=1 10360IF !score>highscores(X%) THEN e%=TRUE 10370UNTIL e%=TRUE 10380COLOUR 28 TINT 255 10390PRINTTAB(12,16)"Well done." 10400COLOUR 27 TINT 255 10410PRINTTAB(5,18)"Your score is ranked no. ";X% 10420COLOUR 47 10430INPUTTAB(0,22)"Please enter your name ";N$ 10440IF LEN(N$)<1 THEN UNTIL FALSE 10450IF X%<10 THEN 10460FOR Y%=9 TO X% STEP -1 10470highname$(Y%+1)=highname$(Y%) 10480highscores(Y%+1)=highscores(Y%) 10490NEXT 10500ENDIF 10510highscores(X%)=!score 10520highname$(X%)=LEFT$(N$,14) 10530IF write%=FALSE THEN UNTILFALSE 10540 F%=OPENOUT("<Xacretan$Dir>.HighScores") 10550 IF F%<>0 THEN 10560 FOR X%=1 TO 10 10570 PRINT#F%,highname$(X%),highscores(X%) 10580 NEXT 10590 CLOSE#F% 10600 ENDIF 10610UNTIL FALSE 10620END 10630DEFPROCerror 10640*FX 15,1 10650*ALPHABET LATIN1 10660PROCstopmusic 10670VOICES 1 10680VOICE 1,"WaveSynth-Beep" 10690MODE 0 10700*RMKILL ZapMod 10710*RMKILL Explo1 10720*RMKILL Explo2 10730*RMKILL Wow 10740*RMKILL PackIt 10750IF ERR<>17 THEN 10760REPORT:PRINT" at line ";ERL:PRINT "Error number ";ERR 10770ENDIF 10780END 10790DATA 0 10800DATA 0 10810DATA 0 10820DATA 0 10830DATA 0 10840DATA 0 10850DATA 0 10860DATA 0 10870DATA 0 10880DATA 0 10890DATA 0 10900DATA 0 10910DATA 3 10920DATA 25 10930DATA 0 10940DATA &80000021 10950DATA &8000000A 10960DATA 7 10970DATA &80000032 10980DATA &8000004B 10990DATA &80000046 11000DATA 0 11010DATA 27 11020DATA 100 11030DATA 19 11040DATA 40 11050DATA 0 11060DATA 0 11070DATA 0 11080DATA 0 11090DATA 0 11100DATA 0 11110DATA 20 11120DATA 13 11130DATA 17 11140DATA 11 11150DATA 15 11160DATA&80000018 11170DATA&80000019 11180DATA&80000025 11190DEFPROCassemfade 11200X=RND(256)-1 11210Y=RND(256)-1 11220DIM fade 1024 11230FOR pass=0 TO 2 STEP 2 11240P%=fade 11250[OPT pass 11260STMFD R13!,{R14} 11270MOV R8,#1024 11280SUB R8,R8,#1 11290MOV R0,#1024 11300MOV R9,#5 11310MOV R10,#Y 11320MOV R11,#X 11330.fadeloop 11340MOV R1,#256 11350ADD R10,R10,#1 11360AND R10,R10,R8 11370.fadeloop2 11380MUL R12,R10,R9 11390ADD R10,R12,#1 11400AND R10,R10,R8 11410MUL R12,R11,R9 11420ADD R11,R12,#1 11430AND R11,R11,#255 11440LDR R2,get 11450ADD R2,R2,R10,LSL #8 11460ADD R2,R2,R11 11470LDR R3,put 11480ADD R3,R3,R10,LSL #8 11490ADD R3,R3,R11 11500LDR R12,length 11510CMP R10,R12 11520BGE fadeover 11530LDRB R12,[R2] 11540STRB R12,[R3] 11550.fadeover 11560SUB R1,R1,#1 11570TEQ R1,#0 11580BGT fadeloop2 11590SUB R0,R0,#1 11600TEQ R0,#0 11610BGT fadeloop 11620LDMFD R13!,{PC} 11630.get 11640EQUD screen2start 11650.put 11660EQUD screen1start 11670.length 11680EQUD 320 11690] 11700NEXT 11710ENDPROC 11720DEFPROCtitle 11730MODE 13 11740OFF 11750*FX 112,2 11760V=INKEY(100) 11770CLS 11780COLOUR 30 11790PRINTTAB(10,5)"BradSoft Software" 11800 COLOUR 27 11810PRINTTAB(1,7)"In association with Archimedes World" 11820COLOUR 7 11830PRINTTAB(14,10)"Presents" 11840CALL fade 11850V=INKEY(200) 11860COLOUR 15 11870PRINTTAB(11,15)"A game by Chris" 11880CALL fade 11890TIME=0 11900P1%=screen2start+160*320 11910P2%=titlebit 11920FOR X%=0 TO (320*51)-4 STEP 4 11930P1%!X%=P2%!X% 11940NEXT 11950V=INKEY(300-TIME) 11960CALL fade 11970V=INKEY(200) 11980*FX 112,1 11990GCOL 0 TINT 0 12000FOR X%=1024-(160*4+51*4) TO 1024-208 STEP 4 12010WAIT 12020RECTANGLE 0,X%,1280,204 TO 0,X%+4 12030LINE 0,X%,1280,X% 12040NEXT 12050ENDPROC 12060DEFPROChighscores 12070*FX 112,2 12080count%=0 12090IF firsttime=FALSE THEN CALL v_on:?Volume=0:playing=TRUE 12100REPEAT 12110CLS 12120P1%=screen2start 12130P2%=titlebit 12140FOR X%=0 TO (320*51)-1 STEP 4 12150P1%!X%=P2%!X% 12160NEXT 12170IF count%>0 THEN PROCcredits:GOTO 12110 12180COLOUR 43 TINT 255 12190PRINTTAB(8,8)"Best scores so far..." 12200IF firsttime=TRUE THEN CALL fade 12210FOR X%=1 TO 10 12220COLOUR 12 TINT(20*(10-X%)) 12230PRINTTAB(8+((10-LEN(STR$(highscores(X%))))/2),X%+12);" ";highscores(X%) 12240COLOUR 48 TINT(20*(10-X%)) 12250PRINTTAB(7+(X%=10),X%+12);" ";X%;")" 12260COLOUR 31 TINT(20*(10-X%)) 12270PRINTTAB(17,X%+12);highname$(X%) 12280NEXT 12290X%=7*8*4 12300XS%=8*4*31-X% 12310Y%=1024-24*8*4 12320YS%=1024-12*8*4-Y% 12330FOR C%=3 TO 1 STEP -1 12340FOR T%=64*3 TO 0 STEP -64 12350GCOL C% TINT T% 12360RECTANGLE X%,Y%,XS%,YS% 12370X%-=4:Y%-=4 12380XS%+=8:YS%+=8 12390NEXT, 12400IF firsttime=TRUE THEN CALL fade 12410firsttime=FALSE 12420COLOUR 27 TINT 255 12430PRINTTAB(8,27)"Press any key to play." 12440CALL fade 12450*FX 15,1 12460REPEAT 12470count%+=1 12480FOR X%=0 TO 7 12490P%=aliens+16*16*left%(X%) 12500P2%=screen1start+8+320*(64+X%*24) 12510FOR V%=0 TO 15 12520FOR H%=0 TO 15 STEP 4 12530P2%!(H%+V%*320)=!P% 12540P%+=4 12550NEXT, 12560P%=aliens+16*16*right%(X%) 12570P2%=screen1start+(320-32)+320*(64+X%*24) 12580FOR V%=0 TO 15:FOR H%=0 TO 15 STEP 4 12590P2%!(H%+V%*320)=!P% 12600P%+=4 12610NEXT,, 12620V=INKEY(50) 12630IF V=ASC("Q") THEN V=0:*AUDIO OFF 12640IF V=ASC("S") THEN V=0:*AUDIO ON 12650FOR X%=7 TO 1 STEP -1 12660left%(X%)=left%(X%-1) 12670right%(X%)=right%(X%-1) 12680NEXT 12690left%(0)=RND(12)-1 12700right%(0)=RND(12)-1 12710UNTIL V>0 OR count%>20 12720UNTIL V>0 12730ENDPROC 12740DEFPROCnewlevel 12750S%=!score 12760NB%=NB%-1 12770IF level<3 THEN A%+=2 12780PROCassemble 12790!score=S% 12800!dispscore=S% 12810IF NB%<1 THEN NB%=1 12820COLOUR 3 TINT 255 12830PRINTTAB(15,12)"Well done." 12840COLOUR 63 TINT 255 12850PRINTTAB(13,15)"Zone Complete." 12860COLOUR 48 TINT 255 12870PRINTTAB(11,20)"Bonus = ";level;mul$;lives;mul$;"50" 12880VOICE voice%,"Wow" 12890SOUND voice%,-15,&1D00,0 12900!score=!score+level*lives*50 12910IF level=3 AND lives<4 THEN lives+=1 12920IF level=4 THEN CALL pinkcode:pink%=TRUE 12930REPEAT 12940WAIT:CALL doscore 12950UNTIL !dispscore=!score 12960level+=1 12970IF level>5 THEN GOTO 12990 12980OSCLI("Load <Xacretan$Dir>.Maps."+STR$(level)+" "+STR$~map) 12990*FX 15,1 13000V=INKEY(200) 13010IF level=6 THEN PROCendgame 13020ENDPROC 13030DEFPROCarm3detect 13040LOCAL ERROR:ON ERROR LOCAL arm3%=FALSE:ENDPROC 13050arm3%=TRUE:*CACHE ON 13060ENDPROC 13070DEFPROCwrite_detect 13080LOCAL ERROR:ON ERROR LOCAL write%=FALSE:ENDPROC 13090write%=TRUE 13100*SAVE "<Xacretan$Dir>.writetest" 8000 +1 13110*DEL. <Xacretan$Dir>.writetest 13120ENDPROC 13130DEFPROCcredits 13140COLOUR 15 TINT 255 13150PRINTTAB(6,8)"Coded by ";:COLOUR 3 13160PRINT"Chris Bradburne." 13170COLOUR 58:PRINTTAB(2,11)"Graphics by" 13180COLOUR 14 13190PRINTTAB(4,13)"Dave Wilkinson" 13200PRINTTAB(16,14)"and" 13210PRINTTAB(18,15)"Chris Bradburne" 13220COLOUR 54 13230PRINTTAB(4,17)"Featuring flowers by Andy." 13240COLOUR 44 13250PRINTTAB(6,20)"� 1992 Archimedes World." 13260COLOUR 23 13270PRINTTAB(2,23)"All sounds sampled with Armadeus." 13280COLOUR 11 13290PRINTTAB(4,27)"Music played with Coconizer." 13300CALL fade 13310K=INKEY(750) 13320count%=0 13330ENDPROC 13340DEFPROCendgame 13350!endreason=0 13360*FX 112,2 13370CLS 13380CALL fade 13390*FX 112,1 13400RESTORE 13910 13410FOR R%=1 TO 18 13420CLS 13430FOR D%=1 TO 3 13440READ pos%,p$ 13450COLOUR RND(63) TINT 255 13460PRINTTAB(20-(LEN(p$)/2),pos%)p$ 13470NEXT 13480FOR AB%=1 TO 5 13490C%=RND(63) 13500GCOL 3,C% TINT 255 13510X%=RND(300)-150+640:Y%=-5 13520OX1%=X% 13530OY1%=Y% 13540YS%=RND(15)+30 13550XS%=RND(10)-5 13560REPEAT 13570OX2%=OX1%:OY2%=OY1% 13580OX1%=X%:OY1%=Y% 13590X%+=XS% 13600Y%+=YS% 13610MOVE X%,Y% 13620DRAW OX1%,OY1% 13630DRAW OX2%,OY2% 13640YS%-=1 13650WAIT 13660UNTIL YS%<-10 13670MOVE OX1%,OY1% 13680DRAW X%,Y% 13690VOICE voice%,"Explo2" 13700SOUND voice%,-15,&2000,0 13710FOR Q%=0 TO dots% 13720DSX%(Q%)=RND(26)-13 13730DSY%(Q%)=RND(25)-5 13740DX%(Q%)=X% 13750DY%(Q%)=Y% 13760POINT DX%(Q%),DY%(Q%) 13770NEXT 13780FOR T%=255 TO 0 STEP -8 13790GCOL 3,C% TINT T% 13800WAIT 13810FOR Q%=0 TO dots% 13820POINT DX%(Q%),DY%(Q%) 13830DX%(Q%)+=DSX%(Q%) 13840DY%(Q%)+=DSY%(Q%) 13850DSY%(Q%)-=1 13860POINT DX%(Q%),DY%(Q%) 13870NEXT, 13880FOR Q%=0 TO dots%:POINT DX%(Q%),DY%(Q%):NEXT 13890NEXT, 13900lives=0:ENDPROC 13910DATA 0,"" 13920DATA 0,"" 13930DATA 0,"" 13940DATA 0,"" 13950DATA 15,"Well Done." 13960DATA 0,"" 13970DATA 10,"You have finished" 13980DATA 15,"Xacretan." 13990DATA 0,"" 14000DATA 10,"You are one of the few," 14010DATA 15,"The elite, the dedicated," 14020DATA 20,"the unbeatable." 14030DATA 15,"But you have suffered." 14040DATA 0,"" 14050DATA 0,"" 14060DATA 13,"Suffered for the cause" 14070DATA 17,"you thought worthy." 14080DATA 0,"" 14090DATA 10,"And was it all worth it?" 14100DATA 0,"" 14110DATA 0,"" 14120DATA 15,"Probably not!" 14130DATA 0,"" 14140DATA 0,"" 14150DATA 0,"" 14160DATA 0,"" 14170DATA 0,"" 14180DATA 10,"And now a word from" 14190DATA 15,"the programmer himself," 14200DATA 20,"Chris Bradburne," 14210DATA 10,"I'd just like to thank" 14220DATA 15,"all those who made this" 14230DATA 20,"game possible." 14240DATA 15,"And Archimedes World" 14250DATA 18,"for publishing it." 14260DATA 0,"" 14270DATA 13,"And I would like to" 14280DATA 17,"thank YOU for playing it." 14290DATA 0,"" 14300DATA 0,"" 14310DATA 0,"" 14320DATA 0,"" 14330DATA 15,"You have now finally reached" 14340DATA 0,"" 14350DATA 0,"" 14360DATA 15,"THE END." 14370DATA 0,"" 14380DATA 0,"" 14390DATA 15,"THE END." 14400DATA 0,"" 14410DATA 0,"" 14420DATA 0,"" 14430DATA 0,"" 14440DATA 0,"" 14450DEFPROCMusAsm 14460DIM mcode 128000,L%-1 14470FOR p=%1000 TO %1010 STEP 2 14480P%=mcode 14490PROC_Music 14500NEXT p 14510end%=Track+pointer 14520ENDPROC 14530DEF PROC_Music 14540IF p=%1000 THEN 14550maxinst=32 14560DIM nam$(2002),byt%(2002),loc$(2002),sort%(maxinst),sort$(maxinst) 14570sort$(2)="�" 14580top%=0 14590f%=OPENIN "<Xacretan$Dir>.location" 14600WHILE NOT EOF#f% 14610top%+=1:nam$(top%)=GET$#f%:INPUT#f%,byt%(top%):loc$(top%)=GET$#f% 14620ENDWHILE 14630CLOSE#f% 14640a$="<Xacretan$Dir>.XacTune" 14650f%=OPENIN a$ 14660b1=BGET#f%:b2=BGET#f%:b3=BGET#f%:b4=BGET#f%:b5=BGET#f%:b6=BGET#f% 14670CLOSE#f% 14680IF b4=0 AND b5>0 THEN Vocs=b6 ELSE Vocs=b1 : 14690PROC_MusicASM 14700A%=mcode:B%=Track-1:CALL Track : 14710A%=ufin:B%=L%-1 :CALL Track : 14720ENDPROC 14730ELSE 14740PROC_MusicASM 14750ENDIF 14760OSCLI "PackLoad "+a$+" "+STR$~Track 14770FOR i%=0 TO 9*12-1 : 14780n%=i% +4*12 : 14790f%=440*(2^((n%-46)/12)) : 14800Ftable!(i%*4)=(f%/(1000000/us))*65536 : 14810NEXT i% 14820pointer=Track!32 : 14830FOR i%=1 TO Track?21 14840Track!(i%*32+ 0)=pointer 14850len=Track!(i%*32+ 4) 14860vol=Track!(i%*32+ 8) 14870rat=Track!(i%*32+12) 14880ren=Track!(i%*32+16) 14890na$=$(Track+i%*32+20) 14900FOR j%=1 TO top%:IF na$<>nam$(j%) THEN NEXT:INPUT'" -> "na$:$(Track+i%*32+20)=na$:PRINT STRING$(30,CHR$8);:GOTO 14900 14910IF len>byt%(j%) THEN len=byt%(j%):Track!(i%*32+4)=len 14920sort$(i%)=loc$(j%):sort%(i%)=i% 14930pointer+=len+gap 14940IF Track+pointer>=L% ERROR ERL,"More than "+STR$pointer+" bytes sample data: Assembler limit reached" 14950NEXT i% 14960REPEAT 14970flag%=0 14980FOR i%=1 TO Track?21-1 14990IF sort$(i%)>sort$(i%+1) THEN SWAP sort$(i%),sort$(i%+1):SWAP sort%(i%),sort%(i%+1):flag%=1 15000NEXT i% 15010UNTIL flag%=0 15020FOR i%=1 TO Track?21 15030s=sort%(i%) 15040na$=$(Track+s*32+20):adr=Track+Track!(s*32):len=Track!(s*32+4) 15050fu$="<Xacretan$Dir>.Inst"+sort$(i%)+"."+na$ 15060f=OPENIN fu$ 15070IF f THEN 15080$(adr+len)=STRING$(gap-1,CHR$0) 15090SYS "OS_GBPB",4,f,adr,len:CLOSE#f 15100ELSE 15110disc=(ASCsort$(i%)-65) DIV 2 +1 15120GOTO 15060 15130ENDIF 15140NEXT i% 15150ENDPROC 15160DEF PROC_MusicASM 15170gap=16 15180us =48 15190[OPT p 15200.v_on 15210mov r12,r14 15220mov r0,#2 15230mov r1,#208 15240mov r2,#us 15250mov r3,#0 15260mov r4,#0 15270swi "Sound_Configure" 15280mov r0,#Vocs 15290mov r1,#0 15300mov r2,#0 15310mov r3,#0 15320mov r4,#0 15330swi "Sound_Configure" 15340adr r0,VoiceBase 15350mov r1,#0 15360swi "Sound_InstallVoice" 15370str r1,Vslot 15380adr r2,Vstereos-4*4*(Vocs=8) 15390mov r0,#1 15400.vimage 15410ldr r1,[r2],#4 15420swi "Sound_Stereo" 15430add r0,r0,#1 15440cmp r0,#Vocs 15450bLs vimage 15460mov r0,#Vocs 15470.vset 15480adr r1,Vname 15490swi "Sound_AttachNamedVoice" 15500mov r1,#&170 15510mov r2,#50 15520mov r3,#255 15530swi "Sound_Control" 15540subS r0,r0,#1 15550bNe vset 15560bl vabsolut 15570bl v_reset 15580mov r0,#16 15590FNadr (1,vinter) 15600adr r2,Head 15610swi "OS_Claim" 15620mov r0,#14 15630mov r1,#4 15640swi "OS_Byte" 15650mov r0,#Vocs 15660mov r1,#0 15670mov r2,#0 15680mov r3,#0 15690mov r4,#0 15700swi "Sound_Configure" 15710mov r0,#0 15720swi "Sound_Volume" 15730mov r0,r0,lsl#1 15740rsb r0,r0,#254 15750str r0,Volume 15760mov pc,r12 15770.vabsolut 15780FNadr (10,Track) 15790ldr r1,[r10,#24] 15800add r1,r10,r1 15810str r1,[r10,#24] 15820ldr r2,[r10,#28] 15830add r2,r10,r2 15840str r2,[r10,#28] 15850ldrB r1,[r10,#21] 15860.vall 15870ldr r2,[r10,r1,lsl#5] 15880add r2,r10,r2 15890str r2,[r10,r1,lsl#5] 15900subS r1,r1,#1 15910bNe vall 15920ldr r0,[pc] 15930str r0,vabsolut 15940mov pc,r14 15950.v_reset 15960FNadr (10,Track) 15970mov r1,#64 15980str r1,Registers+0 15990ldr r2,[r10,#24] 16000str r2,Registers+8 16010ldrB r2,[r2] 16020ldr r3,[r10,#28] 16030add r3,r3,r2,lsl#10-(Vocs=8) 16040str r3,Registers+4 16050adr r11,Head 16060mov r1,#0:mov r2,#0:mov r3,#0:mov r4,#0 16070mov r5,#0:mov r6,#0:mov r7,#0:mov r8,#0 16080mov r0,#Vocs 16090.vall 16100stmia r11!,{r1-r8} 16110subS r0,r0,#1 16120bNe vall 16130mov pc,r14 16140.v_off 16150mov r0,#13 16160mov r1,#4 16170swi "OS_Byte" 16180mov r0,#16 16190adr r1,vinter 16200adr r2,Head 16210swi "OS_Release" 16220ldr r1,Vslot 16230swi "Sound_RemoveVoice" 16240mov r0,#1 16250mov r1,#1 16260swi "Sound_AttachVoice" 16270mov pc,r14 16280.Vstereos 16290dcd -50 16300dcd -20 16310dcd 20 16320dcd 50 16330dcd-126 16340dcd -90 16350dcd -54 16360dcd -18 16370dcd 18 16380dcd 54 16390dcd 90 16400dcd 126 16410.Vslot dcd 0 16420.VoiceBase 16430b vfill 16440b vfill 16450b vfill 16460ldmfd r13!,{pc} 16470ldmfd r13!,{pc} 16480ldmfd r13!,{pc} 16490ldmfd r13!,{pc} 16500dcd Vname-VoiceBase 16510.Vname dcb "Cocoplex"+CHR$0 16520align 16530.vfill 16540teqP pc,#(1<<27) OR %10 16550adr r8,Head 16560add r8,r8,r7,lsl#5 16570ldmIa r8,{r1-r6} 16580ldr r0,Volume 16590add r5,r5,r0 16600.vfilloop 16610]:FOR n=1 TO gap:[OPT p 16620ldrB r0,[r3,r1,lsr#16] 16630subS r0,r0,r5 16640movMi r0,#0 16650strB r0,[r12],r11 16660add r1,r1,r2 16670]:NEXT:[OPT p 16680cmp r4,r1,lsr#16 16690movLs r1,r6 16700cmp r1,#0 16710movEq r2,#0 16720cmp r12,r10 16730bLo vfilloop 16740stmIa r8,{r1-r2} 16750mov r0,#%00001000 16760teqP pc,#(0<<27) OR %10 16770ldmfd r13!,{pc} 16780.Head 16790dcd 0 16800dcd 0 16810dcd 0 16820dcd 0 16830dcd 0 16840dcd 0 16850dcd 0 16860dcd 0 16870dcb STRING$(3*32-4*32*(Vocs=8),CHR$0) 16880.Volume dcd 0 16890.veffects 16900ldr r4,[r12,#4] 16910cmp r4,#0 16920movEq pc,r14 16930ldr r3,[r12,#24] 16940mov r10,r14 16950andS r2,r3,#&ff 16960blNe v_volup 16970andS r2,r3,#&ff <<8 16980movNe r2,r2,lsr#8 16990blNe v_voldown 17000andS r2,r3,#&ff <<16 17010movNe r2,r2,lsr#16 17020blNe v_arcup 17030andS r2,r3,#&ff <<24 17040movNe r2,r2,lsr#24 17050blNe v_arcdown 17060mov r14,r10 17070ldr r1,[r12,#28] 17080andS r2,r1,#&ff 17090movEq pc,r14 17100and r3,r1,#&ff00 17110ldr r3,[pc,r3,lsr#6] 17120add pc,pc,r3 17130dcd v_arpeggio-vof1 17140.vof1 17150dcd v_slideup-vof1 17160dcd v_slidedown-vof1 17170dcd v_volup-vof1 17180dcd v_voldown-vof1 17190dcd v_arcup-vof1 17200dcd v_arcdown-vof1 17210.v_arpeggio 17220mov r1,r1,lsr#24 17230cmp r0,#1 17240cmpNe r0,#4 17250addEq r1,r1,r2,lsr#4 17260cmp r0,#2 17270cmpNe r0,#5 17280andEq r2,r2,#&0f 17290addEq r1,r1,r2 17300ldr r1,[r11,r1,lsl#2] 17310str r1,[r12,#4] 17320mov pc,r14 17330.v_slideup 17340add r1,r4,r2,lsl#6 17350cmp r1,#&18800 17360strLt r1,[r12,#4] 17370mov pc,r14 17380.v_slidedown 17390sub r1,r4,r2,lsl#6 17400cmp r1,#&3340 17410strGt r1,[r12,#4] 17420mov pc,r14 17430.v_volup 17440cmp r0,#1 17450movNe pc,r14 17460ldr r1,[r12,#16] 17470subS r1,r1,r2 17480strPl r1,[r12,#16] 17490mov pc,r14 17500.v_voldown 17510cmp r0,#1 17520movNe pc,r14 17530ldr r1,[r12,#16] 17540add r1,r1,r2 17550cmp r1,#255 17560strLs r1,[r12,#16] 17570mov pc,r14 17580.v_arcup 17590addS r1,r4,r2,lsl#4 17600strPl r1,[r12,#4] 17610mov pc,r14 17620.v_arcdown 17630subS r1,r4,r2,lsl#4 17640strPl r1,[r12,#4] 17650mov pc,r14 17660.fx1 17670adr r12,Head+0*32 17680b fx4+4 17690.fx2 17700adr r12,Head+1*32 17710b fx4+4 17720.fx3 17730adr r12,Head+2*32 17740b fx4+4 17750.fx4 17760adr r12,Head+3*32 17770mov r0,#1 17780strB r0,[r12,#30] 17790adr r10,Track 17800adr r11,Ftable 17810b vrule 17820.vinter 17830stmfd r13!,{r1-r11} 17840adr r11,Ftable 17850ldmDb r11,{r0,r1} 17860add r0,r0,#1 17870cmp r0,r1 17880movHs r0,#0 17890str r0,[r11,#-8] 17900bHs vplay 17910bl veffects 17920add r12,r12,#32 17930bl veffects 17940add r12,r12,#32 17950bl veffects 17960add r12,r12,#32 17970bl veffects 17980] 17990IF Vocs=8 THEN 18000[OPT p 18010add r12,r12,#32 18020bl veffects 18030add r12,r12,#32 18040bl veffects 18050add r12,r12,#32 18060bl veffects 18070add r12,r12,#32 18080bl veffects 18090] 18100ENDIF 18110[OPT p 18120ldmfd r13!,{r1-r11,pc} 18130.vplay 18140adr r6,Registers 18150ldmIa r6,{r7-r9} 18160adr r10,Track 18170bl vchannel 18180add r12,r12,#32 18190bl vchannel 18200add r12,r12,#32 18210bl vchannel 18220add r12,r12,#32 18230bl vchannel 18240] 18250IF Vocs=8 THEN 18260[OPT p 18270add r12,r12,#32 18280bl vchannel 18290add r12,r12,#32 18300bl vchannel 18310add r12,r12,#32 18320bl vchannel 18330add r12,r12,#32 18340bl vchannel 18350] 18360ENDIF 18370[OPT p 18380subS r7,r7,#1 18390stmNeIa r6,{r7-r8} 18400ldmNeFd r13!,{r1-r11,pc} 18410mov r7,#64 18420ldrB r0,[r9,#1]! 18430cmp r0,#&ff 18440ldrEq r9,[r10,#24] 18450ldrEqB 0,[r9] 18460ldr r8,[r10,#28] 18470add r8,r8,r0,lsl#10-(Vocs=8) 18480stmIa r6,{r7-r9} 18490ldmfd r13!,{r1-r11,pc} 18500.vchannel 18510ldr r1,[r8],#4 18520ldrB r2,[r12,#30] 18530cmp r2,#0 18540bEq vrule 18550ldr r2,[r12,#4] 18560cmp r2,#0 18570strEqB 2,[r12,#30] 18580mov pc,r14 18590.vrule 18600movS r0,r1,lsr#24 18610bEq vcomms 18620strB r0,[r12,#31] 18630ldr r0,[r11,r0,lsl#2] 18640str r0,[r12,#4] 18650andS r0,r1,#&ff <<16 18660ldrEq r0,[r12,#20] 18670strEq r0,[r12,#00] 18680bEq vcomms 18690add r2,r10,r0,lsr#11 18700ldmIa r2,{r0,r2-r5} 18710str r0,[r12,# 8] 18720str r3,[r12,#16] 18730movS r0,r4,lsl#16 18740addNe r2,r4,r5 18750movNe r4,r0 18760str r0,[r12,# 0] 18770str r2,[r12,#12] 18780str r4,[r12,#20] 18790.vcomms 18800and r0,r1,#&0f <<8 18810and r2,r1,#&ff 18820ldr r3,[pc,r0,lsr#6] 18830add pc,pc,r3 18840dcd vef-vof2 18850.vof2 18860dcd vef-vof2 18870dcd vef-vof2 18880dcd vef-vof2 18890dcd vef-vof2 18900dcd vef-vof2 18910dcd vef-vof2 18920dcd vstereopos-vof2 18930dcd vautovolup-vof2 18940dcd vautovoldown-vof2 18950dcd vautoarcup-vof2 18960dcd vautoarcdown-vof2 18970dcd vsetvol-vof2 18980dcd vpattbreak-vof2 18990dcd vnop-vof2 19000dcd vsetspeed-vof2 19010.vef 19020strB r2,[r12,#28] 19030mov r0,r0,lsr#8 19040strB r0,[r12,#29] 19050.vnop 19060mov pc,r14 19070.vstereopos 19080adr r0,Head 19090sub r0,r12,r0 19100mov r0,r0,lsr#3 19110cmp r0,#7*4 19120movEq r1, #&60 19130addNe r1,r0,#&64 19140mov r1,r1,lsl#24 19150orr r1,r1,r2 19160mov r2,#&3400000 19170str r1,[r2] 19180] 19190IF Vocs=4 THEN 19200[OPT p 19210cmp r0,#3*4 19220subEq r1,r1,#&10<<24 19230addNe r1,r1,#&10<<24 19240str r1,[r2] 19250] 19260ENDIF 19270[OPT p 19280mov pc,r14 19290.vautovolup 19300strB r2,[r12,#24] 19310mov pc,r14 19320.vautovoldown 19330strB r2,[r12,#25] 19340mov pc,r14 19350.vautoarcup 19360strB r2,[r12,#26] 19370mov pc,r14 19380.vautoarcdown 19390strB r2,[r12,#27] 19400mov pc,r14 19410.vsetvol 19420str r2,[r12,#16] 19430mov pc,r14 19440.vpattbreak 19450mov r7,#1 19460mov pc,r14 19470.vsetspeed 19480str r2,Vspeed 19490mov pc,r14 19500.Registers dcd 64 19510dcd 00 19520dcd 00 19530.Vcount dcd 0 19540.Vspeed dcd 6 19550.Ftable ]:P%+=9*12*4:[OPT p 19560.Track 19570mov r2,#0 19580.uall 19590str r2,[r0],#4 19600cmp r0,r1 19610bLo uall 19620mov pc,r14 19630.ufin 19640]:ENDPROC 196502er ADR (only forwards) 19660DEF FNadr(r%,dest%) 19670dis%=dest%-P%-8 19680IF p=%1000 THEN 19690d0%=0 :d1%=0 19700ELSE 19710IF dis% AND &f THEN 19720d0%=dis% AND &000FF 19730d1%=dis% AND &FFF00 19740ELSE 19750d0%=dis% AND &00FFF 19760d1%=dis% AND &FF000 19770ENDIF 19780ENDIF 19790[OPT p 19800add r%,pc,#d1% 19810add r%,r%,#d0% 19820]="" 19830DEFPROCstopmusic 19840IF playing<>TRUE THEN ENDPROC 19850FOR X=0 TO 255 STEP 2 19860?Volume=X 19870WAIT 19880NEXT 19890CALL v_off 19900playing=FALSE 19910IF arm3%=TRUE THEN 19920VOICES 4 19930VOICE 1,"ZapMod" 19940VOICE 2,"Explo1" 19950VOICE 3,"Explo2" 19960ELSE 19970VOICES 1 19980ENDIF 19990ENDPROC 20000DEFPROCpink 20010 pink%=FALSE 20020 DIM pinkcode 512 20030FOR pass=0 TO 2 STEP 2 20040 P%=pinkcode 20050 [OPT pass 20060 LDR R10,pinkblockstart 20070 MOV R11,#0 20080 .pinkloop 20090 LDRB R0,[R10] 20100 CMP R0,#67 20110 BLE pinkover 20120 CMP R0,#72 20130 BGE pinkover 20140 ADD R0,R0,#188-68 20150 STRB R0,[R10] 20160 .pinkover 20170 ADD R10,R10,#1 20180 ADD R11,R11,#1 20190 CMP R11,#40*32*32 20200 BNE pinkloop 20210 MOV PC,R14 20220 .pinkblockstart:EQUD blocks 20230 ]:NEXT 20240 ENDPROC
�>!RunImage �arm3detect �write_detect (� � �error 2� arm3%=� � Ƞ 4 � Ƞ 1 <#� arm3%=� � voice%=4 � voice%=1 F� P4� vvvv If the game crashed remove this line vvvv Z(� arm3%=� � ș "OS_UpdateMEMC",64,64 d0� ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ n� x#� arm3%=� � dots%=80 � dots%=25 ��MusAsm �playing=�:?Volume=0:� v_on �firsttime=� � �setup ��assemfade � �pink � �title � �game �� ���setup �mul$=� 32+� 215+� 32 �� DSX%(dots%),DSY%(dots%) �� DX%(dots%),DY%(dots%) � left%(10),right%(10) � scblock 8 lives=4 "� arm3%=� � E%=8 � E%=2 , NA%=10 6 NB%=5 @level=1 Jspeed=2 Tbspeed=4 ^#� block 8:!block=148:block!4=-1 hA%=8:B%=39 r� explodata 2048 |8�("PackLoad <Xacretan$Dir>.Explosions "+�~explodata) �� explostats 8*E% �� X%=0 � (8*E%)-1 � 8 �explostats!X%=0 �explostats!(X%+4)=0 �� �� playerdata 320 �� bulletdata 32 �� scoredata 4096 �� topdata 10*1024 �P%=topdata �� Q%=0 � 31 � � by% �� X%=0 � 319 ?P%=by% P%+=1 �, &%� 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 09� 0,1,2,3,44,45,46,47,208,209,210,211,252,253,254,255 :4�("PackLoad <Xacretan$Dir>.NoData "+�~scoredata) D1�("Load <Xacretan$Dir>.Player "+�~playerdata) N1�("Load <Xacretan$Dir>.Bullet "+�~bulletdata) X� blocks 32*32*(B%+1) b� aliens 16*16*12 l� alienstats 4*4*(NA%+1) v� alienposes NA%*4 �� alienpathdata 12*512 �� X%=0 � 11 �H�("Load <Xacretan$Dir>.Paths."+�(X%+1)+" "+�~(X%*512+alienpathdata)) �� �� X%=0 � NA%-1 �$alienposes!(X%*4)=(X%+X%+0.5)*16 �� �R%=�(A%) �.� X%=alienstats � alienstats+4*4*NA% � 4*4 � X%!0=0 � X%!4=0 � X%!8=0 �X%!12=0 � � scores 4*B%+1 � X%=0 � B%*4 � 4 � Y% *scores!X%=Y% 4� >& F%=�("<Xacretan$Dir>.HighScores") H� highscores(10) R� highname$(10) \� X%=1 � 10 f%�#F%,highname$(X%),highscores(X%) p � z �#F% �1�("PackLoad <Xacretan$Dir>.Blocks "+�~blocks) �1�("PackLoad <Xacretan$Dir>.Aliens "+�~aliens) �� map 1024*3 �#� X%=map � map+(3*1024-1):?X%=0 �� �� code 1024*5 �� titlebit 16*1024 �3�("PackLoad <Xacretan$Dir>.TitBit "+�~titlebit) �,� 15:ș"OS_ReadVduVariables",block,block �screen1start=!block �%screen2start=screen1start+80*1024 �V%=�(-�) �� X%=0 � 10 left%(X%)=�(12)-1 right%(X%)=�(12)-1 � $� .��assemble 8� pass=0 � 2 � 2 BP%=code L [OPT pass V.go `STMFD R13!,{R0-R12,R14} jLDR R11,screenstart tADD R12,R11,#80*1024 ~ .mainloop �STR R11,screenstart �MOV R0,#19 �SWI "OS_Byte" �MOV R0,#113 � MOV R1,#2 �SWI "OS_Byte" �BL groundhitcheck �BL checkhit �BL ckdie �BL movealiens � BL scroll �BL bullets BL alplot BL player BL expplot BL dotop (BL doscore 2STR R12,screenstart <MOV R0,#19 FSWI "OS_Byte" PMOV R0,#113 Z MOV R1,#1 dSWI "OS_Byte" nBL groundhitcheck xBL checkhit �BL ckdie �BL movealiens � BL scroll �BL bullets � BL alplot � BL player �BL expplot �BL dotop �BL doscore �LDR R5,mappos �CMP R5,#10 �MOVLT R5,#1 �STRLT R5,endreason LDR R5,endreason CMP R5,#2 BEQ dieroutine " CMP R5,#0 ,BNE end 6SWI "OS_ReadEscapeState" @BCC mainloop J.end TLDMFD R13!,{R0-R12,PC} ^.damp:EQUD &FFF1 h.dpit:EQUD &1280 r.dieroutine | MOV R0,#2 �LDR R1,damp �LDR R2,dpit �MOV R3,#&FE �SWI "Sound_Control" �MOV R10,#0 �LDR R9,playerx �LDR R8,playery �MOV R7,#320 �MUL R8,R7,R8 �ADD R0,R8,R9 �BL expinit �ADD R0,R0,#16 �BL expinit ADD R0,R0,#17*320 BL expinit SUB R0,R0,#16 &BL expinit 0SUB R0,R0,#8*320 :ADD R0,R0,#8 D MOV R6,R0 N.dieloop XSTR R11,screenstart bMOV R0,#19 lSWI "OS_Byte" vMOV R0,#113 � MOV R1,#2 �SWI "OS_Byte" �BL groundhitcheck �BL checkhit �BL movealiens � BL scroll �BL bullets � BL alplot �BL expplot �BL dotop �BL doscore �STR R12,screenstart �MOV R0,#19 SWI "OS_Byte" MOV R0,#113 MOV R1,#1 SWI "OS_Byte" *BL groundhitcheck 4BL checkhit >BL movealiens H BL scroll RBL bullets \ BL alplot fBL expplot pBL dotop zBL doscore �ADD R10,R10,#1 �CMP R10,#8 ��Q R0,R6:BLEQ expinit �CMP R10,#64 �BLT dieloop �LDMFD R13!,{R0-R12,PC} �.endreason:EQUD 0 �.topstart:EQUD topdata � .dotop �STMFD R13!,{R0-R12,R14} �LDR R12,screenstart �] �� arm3%=� � [OPT pass LDR R11,topstart MOV R10,#0 $.toploop .]:� Q%=0 � 31:[OPT pass 8)LDMIA R11!,{R0-R9}:STMIA R12!,{R0-R9} B]:� L� V [OPT pass `ADR R11,blankdata jLDMIA R11!,{R0-R9} tMOV R10,#0 ~.toploop �]:� Q%=0 � 31:[OPT pass �STMIA R12!,{R0-R9} �]:� �� � [OPT pass �ADD R10,R10,#32 �CMP R10,#256 �BLT toploop �LDMFD R13!,{R0-R12,PC} �".screenstart:EQUD screen1start �T.blankdata:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0 �.mapstart:EQUD map .blockstart:EQUD blocks .mappos:EQUD (3*1024)-80 .offset:EQUD 0 .scroll (STMFD R13!,{R0-R12,R14} 2LDR R11,mapstart <LDR R10,mappos FADD R11,R11,R10 P MOV R8,#0 Z MOV R9,#0 dLDR R12,screenstart nLDR R0,offset xADD R12,R12,R0 � .plotloop �LDRB R10,[R11] �MOV R5,#1024 �MUL R10,R5,R10 �LDR R5,blockstart �ADD R10,R10,R5 �]:� Q%=1 � 32:[OPT pass �LDMIA R10!,{R0-R7} �STMIA R12,{R0-R7} �ADD R12,R12,#320 �]:�:[OPT pass �SUB R12,R12,#320*32 �ADD R12,R12,#32 ADD R11,R11,#1 ADD R9,R9,#1 CMP R9,#10 "BLT plotloop , MOV R9,#0 6ADD R12,R12,#320*31 @ADD R8,R8,#1 J CMP R8,#7 TBLT plotloop ^LDR R8,off2 hMOV R4,#0:STR R4,botcount r.botbit | MOV R9,#0 �LDRB R10,[R11] �MOV R5,#1024 �MUL R10,R5,R10 �LDR R5,blockstart �ADD R10,R10,R5 �STMFD R13!,{R12} �.botloop �LDMIA R10!,{R0-R7} �STMIA R12,{R0-R7} �ADD R12,R12,#320 �ADD R9,R9,#1 � CMP R9,R8 �BLT botloop LDMFD R13!,{R12} ADD R12,R12,#32 ADD R11,R11,#1 &LDR R0,botcount 0ADD R0,R0,#1 :STR R0,botcount DCMP R0,#10 NBNE botbit XLDR R0,offset bLDR R1,mappos lLDR R2,off2 vADD R0,R0,#320 �SUB R2,R2,#1 �CMP R0,#10240 ��Q R0,#0 � �Q R2,#32 �SUBEQ R1,R1,#10 �STR R1,mappos �STR R0,offset �STR R2,off2 �LDMFD R13!,{R0-R12,PC} �.off2:EQUD 32 �.botcount:EQUD 0 �.doscore �STMFD R13!,{R0-R12,R14} /LDR R12,screenstart:ADD R12,R12,#160-(6*10) 0]:� arm3%=� � [OPT pass:ADD R12,R12,#8*320:] [OPT pass !LDR R0,dispscore:LDR R3,score *CMP R0,R3:ADDLT R0,R0,#2 4 CMP R0,R3 >STR R3,dispscore HSTRLT R0,dispscore RADR R1,scorestring \ MOV R2,#8 fSWI "OS_ConvertCardinal3" p CMP R2,#0 z BEQ over1 � MOV R3,#0 � MOV R0,#0 �ADR R1,printstring �.scoreloop1 �STRB R0,[R1,R3] �ADD R3,R3,#1 � CMP R3,R2 �BLT scoreloop1 � .over1 � MOV R4,#0 �ADR R2,scorestring �.scoreloop2 �LDRB R0,[R2,R4] SUB R0,R0,#48 STRB R0,[R1,R3] ADD R4,R4,#1 $ADD R3,R3,#1 . CMP R3,#8 8BLT scoreloop2 BADR R10,printstring L MOV R9,#2 V.scoreloop3 `MOV R11,R12 jLDRB R8,[R10,R9] tLDR R7,scoredatastart ~MOV R0,#20*20 �MUL R0,R8,R0 �ADD R7,R7,R0 �]:� X=0 � 19:[OPT pass �LDMIA R7!,{R0-R4} �STMIA R11,{R0-R4} �ADD R11,R11,#320 �]:�:[OPT pass �ADD R12,R12,#20 �ADD R9,R9,#1 � CMP R9,#8 �BNE scoreloop3 �LDMFD R13!,{R0-R12,PC} .scorestring EQUD 0:EQUD 0:EQUD 0 .printstring EQUD 0:EQUD 0:EQUD 0 (.dispscore:EQUD 0 2.score:EQUD 0 <.scoredatastart FEQUD scoredata P.scraddr:EQUD screenstart Z .bulletstart:EQUD bulletdata d&.bulletstatsstart:EQUD bulletstats n.bullets xSTMFD R13!,{R0-R12,R14} �LDR R12,scraddr �LDR R12,[R12] �LDR R11,bulletstart �LDR R10,bulletstatsstart � MOV R9,#0 � .bloop �LDR R0,[R10] � CMP R0,#0 �BEQ nobullet �LDR R1,[R10,#4] �MOV R2,#320 �MUL R2,R1,R2 �ADD R2,R2,R0 ADD R2,R2,R12 !LDRB R3,[R11,#0]:STRB R3,[R2] 3LDRB R3,[R11,#1]:STRB R3,[R2,#1]:ADD R2,R2,#320 "!LDRB R3,[R11,#2]:STRB R3,[R2] ,3LDRB R3,[R11,#3]:STRB R3,[R2,#1]:ADD R2,R2,#320 6!LDRB R3,[R11,#4]:STRB R3,[R2] @3LDRB R3,[R11,#5]:STRB R3,[R2,#1]:ADD R2,R2,#320 J!LDRB R3,[R11,#6]:STRB R3,[R2] T3LDRB R3,[R11,#7]:STRB R3,[R2,#1]:ADD R2,R2,#320 ^!LDRB R3,[R11,#8]:STRB R3,[R2] h3LDRB R3,[R11,#9]:STRB R3,[R2,#1]:ADD R2,R2,#320 r"LDRB R3,[R11,#10]:STRB R3,[R2] |4LDRB R3,[R11,#11]:STRB R3,[R2,#1]:ADD R2,R2,#320 �"LDRB R3,[R11,#12]:STRB R3,[R2] �4LDRB R3,[R11,#13]:STRB R3,[R2,#1]:ADD R2,R2,#320 �"LDRB R3,[R11,#14]:STRB R3,[R2] �4LDRB R3,[R11,#15]:STRB R3,[R2,#1]:ADD R2,R2,#320 �"LDRB R3,[R11,#16]:STRB R3,[R2] �%LDRB R3,[R11,#17]:STRB R3,[R2,#1] �%SUB R1,R1,#bspeed:STR R1,[R10,#4] �CMP R1,#24 �MOVLT R0,#0 �STR R0,[R10] � .nobullet �ADD R10,R10,#8 �ADD R9,R9,#1 CMP R9,#NB% BLT bloop LDMFD R13!,{R0-R12,PC} &.bulletstats 0EQUD 0:EQUD 0: :<EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0:EQUD 0: D$.playerdatastart:EQUD playerdata N.player XSTMFD R13!,{R0-R12,R14} bLDR R12,scraddr lLDR R12,[R12] vLDR R11,playerdatastart �LDR R0,playerx �LDR R1,playery �MOV R2,#320 �MUL R2,R1,R2 �ADD R2,R2,R0 �ADD R2,R2,R12 �MOV R10,#0 � MOV R9,#0 �.pplotloop �LDRB R3,[R11,R10] � CMP R3,#0 �STRNEB R3,[R2,R9] �ADD R10,R10,#1 ADD R9,R9,#1 CMP R9,#16 BLT pplotloop MOV R9,#0 *ADD R2,R2,#320 4CMP R10,#16*17 >BLT pplotloop HLDR R12,playerx RLDR R11,playery \MOV R0,#121 fCMP R12,#8 pBLE noleft zMOV R1,#97 � &80 �SWI "OS_Byte" �CMP R1,#&FF �SUBEQ R12,R12,#speed �.noleft �CMP R12,#296 �BGE noright �"MOV R1,#66 � &80:SWI "OS_Byte" �CMP R1,#&FF �ADDEQ R12,R12,#speed �.noright �STR R12,playerx �CMP R11,#222 �BGE nodown #MOV R1,#104 � &80:SWI "OS_Byte" CMP R1,#&FF ADDEQ R11,R11,#speed $.nodown .CMP R11,#80 8BLE noup B"MOV R1,#79 � &80:SWI "OS_Byte" LCMP R1,#&FF VSUBEQ R11,R11,#speed ` .noup jSTR R11,playery t"MOV R1,#73 � &80:SWI "OS_Byte" ~LDR R5,return � CMP R5,R1 �BEQ nofire �STR R1,return �CMP R1,#&FF �BNE nofire �ADR R10,bulletstats � MOV R9,#0 � .findloop �LDR R0,[R10,R9] � CMP R0,#0 �BEQ foundfire �ADD R9,R9,#8 CMP R9,#8*5 BLT findloop B nofire .foundfire (ADD R12,R12,#7 2STR R12,[R10,R9] <ADD R9,R9,#4 FSTR R11,[R10,R9] P MOV R0,#1 Z]:� arm3%=� � d [OPT pass nADR R1,bstring x SWI "Sound_AttachNamedVoice" �] �� � [OPT pass �LDR R1,bamp �LDR R2,bpit �MOV R3,#&FE �SWI "Sound_Control" �.nofire �LDMFD R13!,{R0-R12,PC} �.playerx:EQUD (320/2)-8 �.playery:EQUD 200 �.bamp:EQUD &FFF1 �.bpit:EQUD &1128 $.bstring:EQUS "ZapMod"+� 0:ALIGN .return:EQUD 0 .offpos:EQUD off2 ".gmapdata:EQUD map ,.gmappos:EQUD mappos 6.gscorestats:EQUD scores @.gscorepos:EQUD score J.groundhitcheck TSTMFD R13!,{R0-R12,R14} ^ADR R11,bulletstats hLDR R12,scraddr rLDR R12,[R12] |MOV R10,#0 �LDR R9,offpos �LDR R9,[R9] �MOV R8,#32 �SUB R9,R8,R9 �LDR R8,gmappos:LDR R8,[R8] �LDR R7,gmapdata �LDR R6,gscorestats �LDR R5,gscorepos �.bcheckgroundloop �LDR R0,[R11] � CMP R0,#0 �BEQ gc_nobullet �MOV R0,R0,LSR #5 LDR R2,[R11,#4] ADD R2,R2,R9 MOV R1,R2,LSR #5 &MOV R2,#10:MUL R2,R1,R2 0ADD R2,R2,R0 :ADD R2,R2,R7 DADD R2,R2,R8 NLDRB R0,[R2] XLDR R1,[R6,R0,LSL #2] b CMP R1,#0 lBEQ gc_nobullet vLDR R4,[R5] �LDR R3,anddata �� R3,R3,R1 �ADD R4,R4,R3 �STR R4,[R5] �MOV R1,R1,LSR #31 �ADD R1,R1,#1 �STRB R1,[R2] � MOV R0,#0 �STR R0,[R11] �STMFD R13!,{R0-R3} �]:� arm3%=� � � [OPT pass � MOV R0,#1 ADR R1,gstring SWI "Sound_AttachNamedVoice" ] � * [OPT pass 4 MOV R0,#2 >] H� R [OPT pass \LDR R1,gamp fLDR R2,gpit pMOV R3,#&FE zSWI "Sound_Control" �LDMFD R13!,{R0-R3} �.gc_nobullet �ADD R10,R10,#1 �ADD R11,R11,#8 �CMP R10,#NB% �BLT bcheckgroundloop �LDMFD R13!,{R0-R12,PC} �.dotdata:EQUD -1 �.gamp:EQUD &FFF1 �.gpit:EQUD &1380 �'.gstring:EQUS "Explo1":EQUD 0:ALIGN �.anddata:EQUD &FFFF � .expdatastart:EQUD explodata ".expstatsstart:EQUD explostats .expno:EQUD 0 .expinit $STMFD R13!,{R0-R12,R14} .LDR R12,expno 8MOV R11,R12,LSL #3 BLDR R10,expstatsstart LSTR R0,[R10,R11] V MOV R1,#0 `ADD R11,R11,#4 jSTR R1,[R10,R11] tADD R12,R12,#1 ~CMP R12,#E% � �Q R12,#0 �STR R12,expno �]:� arm3%=� � � [OPT pass � MOV R0,#1 �ADR R1,estring � SWI "Sound_AttachNamedVoice" �] �� � [OPT pass � MOV R0,#3 �] � [OPT pass LDR R1,examp LDR R2,expit (MOV R3,#&FE 2SWI "Sound_Control" <LDMFD R13!,{R0-R12,PC} F .expcount P EQUD 0 Z.expit:EQUD &1200 d.examp:EQUD &FFF1 n'.estring:EQUS "Explo2":EQUD 0:ALIGN x.exscraddr:EQUD screenstart �.expplot �STMFD R13!,{R0-R12,R14} �LDR R12,expstatsstart � LDR R7,exscraddr:LDR R7,[R7] �MOV R11,#0 �LDR R8,expdatastart �LDR R10,expcount �ADD R10,R10,#1 �� R10,R10,#3 �STR R10,expcount �.exploop �LDR R0,[R12,R11] �ADD R11,R11,#4 LDR R1,[R12,R11] .CMP R10,#0:ADDEQ R1,R1,#1:STR R1,[R12,R11] CMP R1,#7 "BGT noexplo ,ADD R0,R0,R7 6MOV R9,#16*16 @MUL R9,R1,R9 JADD R9,R9,R8 T MOV R5,#0 ^.eploop h]:� W%=0 � 15:[OPT pass r1LDRB R2,[R9,#W%]:CMP R2,#0:STRNEB R2,[R0,#W%] |]:�:[OPT pass �ADD R9,R9,#16 �ADD R0,R0,#320 �ADD R5,R5,#1 �CMP R5,#16 �BLT eploop �.noexplo �ADD R11,R11,#4 �CMP R11,#E%*8 �BLT exploop �LDMFD R13!,{R0-R12,PC} �.alpscstart �EQUD screenstart �.aldatastart EQUD aliens .alstats:EQUD alienstats .alplot &STMFD R13!,{R0-R12,R14} 0LDR R12,alpscstart :LDR R12,[R12] DLDR R11,aldatastart NLDR R10,alstats X MOV R9,#0 bMOV R8,#320 lMOV R7,#16*16 v.alplotloop �LDMIA R10!,{R0-R3} �CMP R3,#0:BEQ noalien �CMP R0,#0:BLT noalien �CMP R0,#320-16:BGE noalien �CMP R1,#0:BLT noalien �CMP R1,#256-16:BGE noalien �SUB R3,R3,#1 �MUL R3,R7,R3:ADD R3,R3,R11 �MUL R1,R8,R1 �ADD R0,R0,R1 �ADD R0,R0,R12 � MOV R6,#0 �.alloop ]:� W%=0 � 15:[OPT pass 1LDRB R1,[R3,#W%]:CMP R1,#0:STRNEB R1,[R0,#W%] ]:�:[OPT pass ADD R0,R0,#320 *ADD R3,R3,#16 4]:� W%=0 � 15:[OPT pass >1LDRB R1,[R3,#W%]:CMP R1,#0:STRNEB R1,[R0,#W%] H]:�:[OPT pass RADD R0,R0,#320 \ADD R3,R3,#16 fADD R6,R6,#2 pCMP R6,#16 zBLT alloop �.noalien �ADD R9,R9,#1 �CMP R9,#NA% �BLT alplotloop �LDMFD R13!,{R0-R12,PC} �'.ckbulletstatstart:EQUD bulletstats �.ckalstats:EQUD alienstats �.ckscorepos:EQUD score � .checkhit �STMFD R13!,{R0-R12,R14} �LDR R12,ckbulletstatstart �LDR R8,ckscorepos �MOV R10,#0 .ckloop1 LDMIA R12!,{R0,R1} CMP R0,#0 $BEQ cknobullet .LDR R11,ckalstats 8ADD R0,R0,#1 B MOV R9,#0 L.ckloop2 VLDMIA R11!,{R2-R5} ` CMP R5,#0 j BEQ nohit tCMP R0,R2:BLT nohit ~CMP R1,R3:BLT nohit �ADD R2,R2,#16 �CMP R0,R2:BGT nohit �ADD R3,R3,#16 �CMP R1,R3:BGT nohit �SUB R2,R2,#16 �SUB R3,R3,#16 �LDR R7,[R8] �BL rand �LDR R4,value �� R4,R4,#%111111 �ADD R7,R7,R4 �STR R7,[R8] SUB R11,R11,#4 SUB R12,R12,#8 MOV R5,#0 STMIA R11!,{R5} (STMIA R12!,{R5,R6} 2MOV R4,#320 <MUL R4,R3,R4 FADD R4,R4,R2 P MOV R3,R0 Z MOV R0,R4 dBL expinit n MOV R0,R3 x .nohit �ADD R9,R9,#1 �CMP R9,#NA% �BLT ckloop2 �.cknobullet �ADD R10,R10,#1 �CMP R10,#NB% �BLT ckloop1 �LDMFD R13!,{R0-R12,PC} � .rand �STMFD R13!,{R0-R12,R14} �LDR R0,rdata �LDR R1,eor �LDR R2,and ]:� Q%=0 � 7:[OPT pass �S R4,R0,R2 �NE R0,R0,R1 "ADD R0,R5,R0,ROR #31 ,]:�:[OPT pass 6STR R0,rdata @MOV R5,R0,LSR #24 JSTR R5,value TLDMFD R13!,{R0-R12,PC} ^ ALIGN h .rdata r EQUD � |.eor � EQUB 0 �EQUB &76 �EQUB &B5 �EQUB &53 �.and �EQUB %10000000 � EQUB 0 � EQUB 0 � EQUB 0 � .value � EQUD 0 � ALIGN � .malienstats:EQUD alienstats .malienposes:EQUD alienposes &.malienpathdata:EQUD alienpathdata .mcounter:EQUD 400 &.movealiens 0STMFD R13!,{R0-R12,R14} :LDR R0,mcounter DADD R0,R0,#1 NCMP R0,#512 X�Q R0,#0 bSTR R0,mcounter lBEQ newset vLDR R12,malienstats �MOV R11,#0 �LDR R10,malienpathdata � MOV R6,#1 �.domove �LDMIA R12,{R0-R3} �ADD R2,R2,#1 �CMP R2,#512 ��Q R3,#0 � CMP R3,#0 �BEQ mnoalien �SUB R4,R3,#1 �MOV R9,#512 �MUL R4,R9,R4 !ADD R7,R4,R10 !LDRB R8,[R7] !LDRB R9,[R7,R2] ! 9CMP R9,#1:SUBEQ R0,R0,R6,LSL R8:ADDEQ R1,R1,R6,LSL R8 !*#CMP R9,#2:ADDEQ R1,R1,R6,LSL R8 !49CMP R9,#3:ADDEQ R0,R0,R6,LSL R8:ADDEQ R1,R1,R6,LSL R8 !>#CMP R9,#4:SUBEQ R0,R0,R6,LSL R8 !H#CMP R9,#6:ADDEQ R0,R0,R6,LSL R8 !R9CMP R9,#7:SUBEQ R0,R0,R6,LSL R8:SUBEQ R1,R1,R6,LSL R8 !\#CMP R9,#8:SUBEQ R1,R1,R6,LSL R8 !f9CMP R9,#9:ADDEQ R0,R0,R6,LSL R8:SUBEQ R1,R1,R6,LSL R8 !p .mnoalien !zSTMIA R12!,{R0-R3} !�ADD R11,R11,#1 !�CMP R11,#NA% !�BLT domove !�LDMIA R13!,{R0-R12,PC} !�.mmappos:EQUD mappos !�.newset !�!LDR R12,mmappos:LDR R12,[R12] !�CMP R12,#200 !�LDMLTFD R13!,{R0-R12,PC} !�LDR R12,malienstats !�LDR R11,malienposes !�LDR R8,malienpathdata !� MOV R1,#0 " MOV R9,#0 " .again "BL rand "$LDR R3,value ".� R3,R3,#%1111 "8CMP R3,#A% "B BGT again "L CMP R3,#0 "V BEQ again "`MOV R4,#512 "jSUB R5,R3,#1 "tMUL R4,R5,R4 "~LDRB R2,[R8,R4] "�MOV R10,#32 "�MOV R10,R10,LSR R2 "� MOV R2,#0 "�.newloop "�LDR R0,[R11,R9,LSL #2] "�STMIA R12!,{R0-R3} "�ADD R2,R2,R10 "�ADD R9,R9,#1 "�CMP R9,#NA% "�BLT newloop "�LDMFD R13!,{R0-R12,PC} "�.ckplayerx:EQUD playerx # .ckplayery:EQUD playery # .ckendreason:EQUD endreason # .ckdie #STMFD R13!,{R0-R12,R14} #(LDR R12,malienstats #2#LDR R11,ckplayerx:LDR R11,[R11] #<#LDR R10,ckplayery:LDR R10,[R10] #FLDR R7,ckendreason #P"ADD R10,R10,#16:ADD R11,R11,#1 #Z MOV R8,#2 #d MOV R9,#0 #n .pckloop1 #xLDMIA R12!,{R0-R3} #�CMP R3,#0:BEQ nodie1 #�CMP R11,R0:BLT nodie1 #�CMP R10,R1:BLT nodie1 #�'ADD R1,R1,#16:CMP R10,R1:BGT nodie1 #�'ADD R0,R0,#16:CMP R11,R0:BGT nodie1 #�STR R8,[R7] #�LDMFD R13!,{R0-R12,PC} #�.nodie1 #�ADD R9,R9,#1:CMP R9,#NA% #�BLT pckloop1 #�!LDR R12,malienstats:MOV R9,#0 #�ADD R11,R11,#14 #� .pckloop2 $+LDMIA R12!,{R0-R3}:CMP R3,#0:BEQ nodie2 $/CMP R11,R0:BLT nodie2:CMP R10,R1:BLT nodie2 $'ADD R1,R1,#16:CMP R10,R1:BGT nodie2 $"'ADD R0,R0,#16:CMP R11,R0:BGT nodie2 $,STR R8,[R7] $6LDMFD R13!,{R0-R12,PC} $@.nodie2 $J)ADD R9,R9,#1:CMP R9,#NA%:BLT pckloop2 $T!LDR R12,malienstats:MOV R9,#0 $^2LDR R11,ckplayerx:LDR R11,[R11]:ADD R11,R11,#8 $h2LDR R10,ckplayery:LDR R10,[R10]:ADD R10,R10,#1 $r .pckloop3 $|+LDMIA R12!,{R0-R3}:CMP R3,#0:BEQ nodie3 $�/CMP R11,R0:BLT nodie3:CMP R10,R1:BLT nodie3 $�'ADD R1,R1,#16:CMP R10,R1:BGT nodie3 $�'ADD R0,R0,#16:CMP R11,R0:BGT nodie3 $�STR R8,[R7] $�LDMFD R13!,{R0-R12,PC} $�.nodie3 $�)ADD R9,R9,#1:CMP R9,#NA%:BLT pckloop3 $�LDMFD R13!,{R0-R12,PC} $�]:� $�� $� ��game $�� $��highscores %lives=4:level=1:NB%=5:A%=8 %E� pink%=� � �("PackLoad <Xacretan$Dir>.Blocks "+�~blocks):pink%=� % �assemble %&*�("Load <Xacretan$Dir>.Maps.1 "+�~map) %0� %:� %D� X%=0 � 319 � 4 %N� Y%=0 � 16*320 � 320 %XN%=X%+Y% %btopdata!N%=0 %l�, %v� X%=0 � lives-1 %�N%=0 %�P%=X%*20 %�� Q%=0 � 16 %�� B%=0 � 15 � 4 %�topdata!P%=playerdata!N% %� N%+=4 %� P%+=4 %�� %�P%+=(320-16) %�� %�� %�� X%=0 � NB%-1 %�P%=640*3+X%*7+256 &� Q%=0 � 7*2 � 2 &*topdata!P%=(bulletdata!Q%) � &FFFF0000 &P%+=320 & �, &* *FX 112,1 &4�stopmusic &>� &H *FX 113,1 &R� 60 &\�15,10)"Zone ";level &f� 3 Ȝ 255 &p1�11,17)" ";lives;" Ship";:� lives<>1 � �"s"; &z �" left." &�� 43 &�#�7,25)"Press any key to play." &�� &�N=� &�!playerx=(320/2)-8 &�!playery=200 &�!screenstart=screen2start &�'� scroll:� player:� dotop:� doscore &�� X%=0 � 80*1024 � 640 &�?scblock=%10 &�scblock!1=X% &�Ȗ:ș "OS_Word",22,scblock &�� '?scblock=%10 '!screenstart=screen1start ''� scroll:� player:� dotop:� doscore '$?scblock=%10 '.scblock!1=0 '8ș "OS_Word",22,scblock 'B� go 'L*FX 15,0 'V%� !endreason=1 � �newlevel:� �tfg '`T=�:���>T+100 'j!endreason=0 'tlives-=1 '~!mappos=!mappos+60 '�,� X%=alienstats � alienstats+4*4*NA% � 4 '� !X%=0 '�� '� *FX 112,2 '�� '� *FX 112,1 '�� X%=0 � 80*1024 � 640 '�?scblock=%10 '�scblock!1=X% '�Ȗ:ș "OS_Word",22,scblock '�� '�� lives=0 � level=6 ( � ( *FX 113,1 (� 3 Ȝ 255 (�13,10)"Game Over." ((� 30 (2 �10,12)"You scored ";!score (<$� !score>highscores(10) � � �DZh (FV=�(10000) (P� � (Z X%=0:e%=� (d� (n X%+=1 (x"� !score>highscores(X%) � e%=� (� � e%=� (�� 28 Ȝ 255 (��12,16)"Well done." (�� 27 Ȝ 255 (�)�5,18)"Your score is ranked no. ";X% (�� 47 (�'�0,22)"Please enter your name ";N$ (�� �(N$)<1 � � � (� � X%<10 � (�� Y%=9 � X% � -1 (�!highname$(Y%+1)=highname$(Y%) (�#highscores(Y%+1)=highscores(Y%) (�� )� )highscores(X%)=!score )highname$(X%)=�N$,14) )"� write%=� � �� ),& F%=�("<Xacretan$Dir>.HighScores") )6 � F%<>0 � )@ � X%=1 � 10 )J& �#F%,highname$(X%),highscores(X%) )T � )^ �#F% )h � )r� � )|� )���error )�*FX 15,1 )�*ALPHABET LATIN1 )��stopmusic )�Ƞ 1 )�ȡ 1,"WaveSynth-Beep" )�� 0 )�*RMKILL ZapMod )�*RMKILL Explo1 )�*RMKILL Explo2 )�*RMKILL Wow )�*RMKILL PackIt )� � �<>17 � *(�:�" at line ";�:� "Error number ";� *� *� *&� 0 *0� 0 *:� 0 *D� 0 *N� 0 *X� 0 *b� 0 *l� 0 *v� 0 *�� 0 *�� 0 *�� 0 *�� 3 *�� 25 *�� 0 *�� &80000021 *�� &8000000A *�� 7 *�� &80000032 *�� &8000004B *�� &80000046 *�� 0 +� 27 + � 100 +� 19 + � 40 +*� 0 +4� 0 +>� 0 +H� 0 +R� 0 +\� 0 +f� 20 +p� 13 +z� 17 +�� 11 +�� 15 +��&80000018 +��&80000019 +��&80000025 +���assemfade +�X=�(256)-1 +�Y=�(256)-1 +�� fade 1024 +�� pass=0 � 2 � 2 +�P%=fade +� [OPT pass +�STMFD R13!,{R14} ,MOV R8,#1024 ,SUB R8,R8,#1 ,MOV R0,#1024 ,$ MOV R9,#5 ,.MOV R10,#Y ,8MOV R11,#X ,B .fadeloop ,LMOV R1,#256 ,VADD R10,R10,#1 ,`� R10,R10,R8 ,j.fadeloop2 ,tMUL R12,R10,R9 ,~ADD R10,R12,#1 ,�� R10,R10,R8 ,�MUL R12,R11,R9 ,�ADD R11,R12,#1 ,�� R11,R11,#255 ,�LDR R2,get ,�ADD R2,R2,R10,LSL #8 ,�ADD R2,R2,R11 ,�LDR R3,put ,�ADD R3,R3,R10,LSL #8 ,�ADD R3,R3,R11 ,�LDR R12,length ,�CMP R10,R12 - BGE fadeover - LDRB R12,[R2] -STRB R12,[R3] - .fadeover -(SUB R1,R1,#1 -2 TEQ R1,#0 -<BGT fadeloop2 -FSUB R0,R0,#1 -P TEQ R0,#0 -ZBGT fadeloop -dLDMFD R13!,{PC} -n.get -xEQUD screen2start -�.put -�EQUD screen1start -�.length -�EQUD 320 -�] -�� -�� -���title -�� 13 -�� -� *FX 112,2 -�V=�(100) -�� .� 30 .�10,5)"BradSoft Software" . � 27 ."0�1,7)"In association with Archimedes World" .,� 7 .6�14,10)"Presents" .@ � fade .JV=�(200) .T� 15 .^�11,15)"A game by Chris" .h � fade .r�=0 .|P1%=screen2start+160*320 .�P2%=titlebit .�� X%=0 � (320*51)-4 � 4 .�P1%!X%=P2%!X% .�� .�V=�(300-�) .� � fade .�V=�(200) .� *FX 112,1 .�� 0 Ȝ 0 .�)� X%=1024-(160*4+51*4) � 1024-208 � 4 .�Ȗ .�ȓ 0,X%,1280,204 � 0,X%+4 .�� 0,X%,1280,X% /� /� /��highscores /& *FX 112,2 /0count%=0 /:.� firsttime=� � � v_on:?Volume=0:playing=� /D� /N� /XP1%=screen2start /bP2%=titlebit /l� X%=0 � (320*51)-1 � 4 /vP1%!X%=P2%!X% /�� /� � count%>0 � �credits:� �DNo /�� 43 Ȝ 255 /�!�8,8)"Best scores so far..." /�� firsttime=� � � fade /�� X%=1 � 10 /�� 12 Ȝ(20*(10-X%)) /�?�8+((10-�(�(highscores(X%))))/2),X%+12);" ";highscores(X%) /�� 48 Ȝ(20*(10-X%)) /�!�7+(X%=10),X%+12);" ";X%;")" /�� 31 Ȝ(20*(10-X%)) /��17,X%+12);highname$(X%) /�� 0X%=7*8*4 0XS%=8*4*31-X% 0Y%=1024-24*8*4 0 YS%=1024-12*8*4-Y% 0*� C%=3 � 1 � -1 04� T%=64*3 � 0 � -64 0>� C% Ȝ T% 0Hȓ X%,Y%,XS%,YS% 0RX%-=4:Y%-=4 0\XS%+=8:YS%+=8 0f�, 0p� firsttime=� � � fade 0zfirsttime=� 0�� 27 Ȝ 255 0�#�8,27)"Press any key to play." 0� � fade 0�*FX 15,1 0�� 0� count%+=1 0�� X%=0 � 7 0�P%=aliens+16*16*left%(X%) 0�%P2%=screen1start+8+320*(64+X%*24) 0�� V%=0 � 15 0�� H%=0 � 15 � 4 0�P2%!(H%+V%*320)=!P% 0� P%+=4 1�, 1P%=aliens+16*16*right%(X%) 1,P2%=screen1start+(320-32)+320*(64+X%*24) 1$� V%=0 � 15:� H%=0 � 15 � 4 1.P2%!(H%+V%*320)=!P% 18 P%+=4 1B�,, 1LV=�(50) 1V� V=�("Q") � V=0:*AUDIO OFF 1`� V=�("S") � V=0:*AUDIO ON 1j� X%=7 � 1 � -1 1tleft%(X%)=left%(X%-1) 1~right%(X%)=right%(X%-1) 1�� 1�left%(0)=�(12)-1 1�right%(0)=�(12)-1 1�� V>0 � count%>20 1� � V>0 1�� 1���newlevel 1� S%=!score 1� NB%=NB%-1 1�� level<3 � A%+=2 1� �assemble 1� !score=S% 2 !dispscore=S% 2 � NB%<1 � NB%=1 2� 3 Ȝ 255 2�15,12)"Well done." 2(� 63 Ȝ 255 22�13,15)"Zone Complete." 2<� 48 Ȝ 255 2F1�11,20)"Bonus = ";level;mul$;lives;mul$;"50" 2Pȡ voice%,"Wow" 2Z� voice%,-15,&1D00,0 2d !score=!score+level*lives*50 2n"� level=3 � lives<4 � lives+=1 2x"� level=4 � � pinkcode:pink%=� 2�� 2�Ȗ:� doscore 2�� !dispscore=!score 2�level+=1 2�� level>5 � � �t~r 2�5�("Load <Xacretan$Dir>.Maps."+�(level)+" "+�~map) 2�*FX 15,1 2�V=�(200) 2�� level=6 � �endgame 2�� 2���arm3detect 2�� �:� � � arm3%=�:� 2�arm3%=�:*CACHE ON 3� 3��write_detect 3� �:� � � write%=�:� 3"write%=� 3,,*SAVE "<Xacretan$Dir>.writetest" 8000 +1 36"*DEL. <Xacretan$Dir>.writetest 3@� 3J ��credits 3T� 15 Ȝ 255 3^�6,8)"Coded by ";:� 3 3h�"Chris Bradburne." 3r� 58:�2,11)"Graphics by" 3|� 14 3��4,13)"Dave Wilkinson" 3��16,14)"and" 3��18,15)"Chris Bradburne" 3�� 54 3�'�4,17)"Featuring flowers by Andy." 3�� 44 3�%�6,20)"� 1992 Archimedes World." 3�� 23 3�.�2,23)"All sounds sampled with Armadeus." 3�� 11 3�)�4,27)"Music played with Coconizer." 3� � fade 3�K=�(750) 4count%=0 4� 4 ��endgame 4&!endreason=0 40 *FX 112,2 4:� 4D � fade 4N *FX 112,1 4X � �DVv 4b� R%=1 � 18 4l� 4v� D%=1 � 3 4� � pos%,p$ 4�� �(63) Ȝ 255 4��20-(�(p$)/2),pos%)p$ 4�� 4�� AB%=1 � 5 4�C%=�(63) 4�� 3,C% Ȝ 255 4�X%=�(300)-150+640:Y%=-5 4�OX1%=X% 4�OY1%=Y% 4�YS%=�(15)+30 4�XS%=�(10)-5 4�� 5OX2%=OX1%:OY2%=OY1% 5OX1%=X%:OY1%=Y% 5X%+=XS% 5 Y%+=YS% 5*� X%,Y% 54� OX1%,OY1% 5>� OX2%,OY2% 5H YS%-=1 5RȖ 5\ � YS%<-10 5f� OX1%,OY1% 5p� X%,Y% 5zȡ voice%,"Explo2" 5�� voice%,-15,&2000,0 5�� Q%=0 � dots% 5�DSX%(Q%)=�(26)-13 5�DSY%(Q%)=�(25)-5 5�DX%(Q%)=X% 5�DY%(Q%)=Y% 5�Ȓ DX%(Q%),DY%(Q%) 5�� 5�� T%=255 � 0 � -8 5�� 3,C% Ȝ T% 5�Ȗ 5�� Q%=0 � dots% 5�Ȓ DX%(Q%),DY%(Q%) 6DX%(Q%)+=DSX%(Q%) 6DY%(Q%)+=DSY%(Q%) 6DSY%(Q%)-=1 6$Ȓ DX%(Q%),DY%(Q%) 6.�, 68'� Q%=0 � dots%:Ȓ DX%(Q%),DY%(Q%):� 6B�, 6L lives=0:� 6V � 0,"" 6` � 0,"" 6j � 0,"" 6t � 0,"" 6~� 15,"Well Done." 6� � 0,"" 6�� 10,"You have finished" 6�� 15,"Xacretan." 6� � 0,"" 6�"� 10,"You are one of the few," 6�$� 15,"The elite, the dedicated," 6�� 20,"the unbeatable." 6�!� 15,"But you have suffered." 6� � 0,"" 6� � 0,"" 6�!� 13,"Suffered for the cause" 6�� 17,"you thought worthy." 7 � 0,"" 7 #� 10,"And was it all worth it?" 7 � 0,"" 7 � 0,"" 7(� 15,"Probably not!" 72 � 0,"" 7< � 0,"" 7F � 0,"" 7P � 0,"" 7Z � 0,"" 7d� 10,"And now a word from" 7n"� 15,"the programmer himself," 7x� 20,"Chris Bradburne," 7�!� 10,"I'd just like to thank" 7�"� 15,"all those who made this" 7�� 20,"game possible." 7�� 15,"And Archimedes World" 7�� 18,"for publishing it." 7� � 0,"" 7�� 13,"And I would like to" 7�$� 17,"thank YOU for playing it." 7� � 0,"" 7� � 0,"" 7� � 0,"" 7� � 0,"" 7�'� 15,"You have now finally reached" 8 � 0,"" 8 � 0,"" 8� 15,"THE END." 8" � 0,"" 8, � 0,"" 86� 15,"THE END." 8@ � 0,"" 8J � 0,"" 8T � 0,"" 8^ � 0,"" 8h � 0,"" 8r��MusAsm 8|� mcode 128000,L%-1 8�� p=%1000 � %1010 � 2 8�P%=mcode 8��_Music 8�� p 8�end%=Track+pointer 8�� 8� � �_Music 8�� p=%1000 � 8�maxinst=32 8�D� nam$(2002),byt%(2002),loc$(2002),sort%(maxinst),sort$(maxinst) 8�sort$(2)="�" 8� top%=0 8�"f%=� "<Xacretan$Dir>.location" 9 ȕ � �#f% 9;top%+=1:nam$(top%)=�#f%:�#f%,byt%(top%):loc$(top%)=�#f% 9� 9&�#f% 90a$="<Xacretan$Dir>.XacTune" 9:f%=� a$ 9D3b1=�#f%:b2=�#f%:b3=�#f%:b4=�#f%:b5=�#f%:b6=�#f% 9N�#f% 9X+� b4=0 � b5>0 � Vocs=b6 � Vocs=b1 : 9b�_MusicASM 9l2A%=mcode:B%=Track-1:� Track : 9v1A%=ufin:B%=L%-1 :� Track : 9�� 9�� 9��_MusicASM 9�� 9� � "PackLoad "+a$+" "+�~Track 9�� i%=0 � 9*12-1 : 9�!n%=i% +4*12 : 9�!f%=440*(2^((n%-46)/12)) : 9�+Ftable!(i%*4)=(f%/(1000000/us))*65536 : 9�� i% 9�6pointer=Track!32 : 9�� i%=1 � Track?21 9�Track!(i%*32+ 0)=pointer :len=Track!(i%*32+ 4) :vol=Track!(i%*32+ 8) :rat=Track!(i%*32+12) : ren=Track!(i%*32+16) :*na$=$(Track+i%*32+20) :4Y� j%=1 � top%:� na$<>nam$(j%) � �:�'" -> "na$:$(Track+i%*32+20)=na$:� �30,�8);:� �Ttz :>5� len>byt%(j%) � len=byt%(j%):Track!(i%*32+4)=len :H#sort$(i%)=loc$(j%):sort%(i%)=i% :Rpointer+=len+gap :\_� Track+pointer>=L% � �,"More than "+�pointer+" bytes sample data: Assembler limit reached" :f� i% :p� :zflag%=0 :�� i%=1 � Track?21-1 :�W� sort$(i%)>sort$(i%+1) � Ȕ sort$(i%),sort$(i%+1):Ȕ sort%(i%),sort%(i%+1):flag%=1 :�� i% :� � flag%=0 :�� i%=1 � Track?21 :�s=sort%(i%) :�Bna$=$(Track+s*32+20):adr=Track+Track!(s*32):len=Track!(s*32+4) :�/fu$="<Xacretan$Dir>.Inst"+sort$(i%)+"."+na$ :�f=� fu$ :� � f � :�$(adr+len)=�gap-1,�0) :� ș "OS_GBPB",4,f,adr,len:�#f :�� ;disc=(�sort$(i%)-65) � 2 +1 ; � �dTz ;� ;$� i% ;.� ;8� �_MusicASM ;B gap=16 ;L us =48 ;V [OPT p ;` .v_on ;jmov r12,r14 ;tmov r0,#2 ;~mov r1,#208 ;�mov r2,#us ;�mov r3,#0 ;�mov r4,#0 ;�swi "Sound_Configure" ;�mov r0,#Vocs ;�mov r1,#0 ;�mov r2,#0 ;�mov r3,#0 ;�mov r4,#0 ;�swi "Sound_Configure" ;�adr r0,VoiceBase ;�$mov r1,#0 <