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
<