
#name Code.Code

#type &ffd
#include <Main$Path>Extasm.AsmLib.MYDIV

#set x=1
#include <OddBall$Path>Sources.Structures
#set x=1
#include <OddBall$Path>Sources.Variables
#set x=1
.start
STMFD R13!,{R14}
BL setupvars	;No use of R12 before this!
BL loadfiles
ADRVS R0,loadfailedtext
SWIVS OS_GenerateError
BL setup
BL hackcheck
BL setupplayer
BL setupsounds
BL configupdate
BL modeactive
BL demostart
ADR R0,loadmes
BL message
BL mainloop
LDMFD R13!,{PC}

.loadmes
DCD (160+&180)<<12, 224<<12, -2<<12, 0, &01800001,0
DCB "$ DIGITAL PSYCHOSIS 1995",0
ALIGN

.mainloop
STMFD R13!,{R14}
;BL releasedemo
;MVN R0,#1
;STR R0,[R12,#v.loadedlev]
BL dograbs
BL scangrab
.lifeloop
.reloadloop
BL wipesoundtab
MOV R0,#batstab
SWI Amnesia_CountObjects
CMP R0,#0
BLEQ makebat

LDR R1,[R12,#v.demomode]
CMP R1,#1
MOV R0,#texttab
SWINE Amnesia_WipeTable
.loop
BL setupcanvas
LDR R0,[R12,#v.levelno]
LDR R1,[R12,#v.loadedlev]
CMP R1,R0
BLNE levelswap
MOV R0,#1
STR R0,[R12,#v.masterplot]
BL runclocks
BL plmove
BL redcheck
BL goodycheck
BL movecent
BL processblocks
BL processbat
BL processballs
BL processstars
BL processbullets
BL bateffects
BL processdecor
BL texthandler
BL doreps

BL colchblockball
BL colchbatball
BL colchbatstars
BL colchblocks

.mainloop2
LDR R0,[R12,#v.levelno]
LDR R1,[R12,#v.loadedlev]
CMP R1,R0
BLNE levelswap
MOV R0,#0
STR R0,[R12,#v.masterplot]
BL scanset
BL scanupdate
BL setupcanvas
BL runclocks
BL plmove
BL redcheck
BL goodycheck
BL movecent
BL setplotoffset

BL plotbackdrop
BL processedge
BL processblocks
BL processbat

BL processballs
BL processstars
BL processbullets
BL bateffects
BL processdecor
BL texthandler
BL doreps
;BL showrate
;BL showattn
BL scoreupdate
BL livesupdate
BL ballsupdate
BL goodyupdate
BL setupcanvas
BL scanwrite

BL colchblockball
BL colchbatball
BL colchbatstars
BL colchblocks
BL batsound
BL makesounds
BL deathfade
LDR R0,[R12,#v.pending]
CMP R0,#8
MOV R0,#0
MOVEQ R0,#4
STR R0,[R12,#v.pending]
MOV R0,#0
STR R0,[R12,#v.exit]
LDR R0,[R12,#v.demomode]
CMP R0,#1
BLEQ demomenu
BL writebank
LDR R0,[R12,#v.blocksleft]
CMP R0,#0
BNE nonoblocks
LDR R0,[R12,#v.levelnet]
LDR R0,[R0,#net.backdrop]
TST R0,#1<<30
BNE nonoblocks
BLEQ noblocks
.nonoblocks
LDR R0,[R12,#v.newlevelctr]
CMP R0,#0
BGT newlevel
.newlevelins
BL keyscan
BL escapetest
LDR R0,[R12,#v.exit]
CMP R0,#1
BEQ exit
CMP R0,#3
BEQ reloadloop
LDR R0,[R12,#v.dead]
CMP R0,#200
BGE handledeath
.handledeathins
LDR R0,[R12,#v.frameinc]
CMP R0,#1
BEQ mainloop2
B loop
.handledeath
LDR R0,[R12,#v.demomode]
CMP R0,#1
BNE noskipdeath
LDR R0,[R12,#v.dead]
CMPGE R0,#500
BLT handledeathins
.noskipdeath
MOV R0,#0
STR R0,[R12,#v.dead]
LDR R0,[R12,#v.demomode]
CMP R0,#1
BEQ demolife
LDR R3,[R12,#v.ballxhome]
LDR R4,[R12,#v.ballyhome]
BL makeball
BL homebat
LDR R0,[R12,#v.levelno]
TST R0,#&400
BNE warpdead

LDR R0,[R12,#v.pllives]
SUBS R0,R0,#1
STR R0,[R12,#v.pllives]
BPL lifeloop
BL highscores
BL demostart
B lifeloop
LDMFD R13!,{PC}

.warpdead
B lifeloop

.demolife
MVN R0,#0
STR R0,[R12,#v.levelno]
B lifeloop

.exit
BL emptykeybuf
MOV R0,#4
MOV R1,#0
SWI OS_Byte
MOV R0,#124
SWI OS_Byte
BL defaultmouse
LDMFD R13!,{PC}

.escapetest
STMFD R13!,{R14}
LDR R0,[R12,#v.demomode]
CMP R0,#1
CMPNE R0,#2
BNE normaltest
SWI OS_ReadEscapeState
LDMCCFD R13!,{PC}
MOV R0,#124
SWI OS_Byte
LDR R0,[R12,#v.menuno]
CMP R0,#0
MOV R0,#0
STR R0,[R12,#v.menuno]
LDMNEFD R13!,{PC}
LDR R0,[R12,#v.menucsr]
CMP R0,#6
MOV R0,#6
STR R0,[R12,#v.menucsr]
LDMNEFD R13!,{PC}
MOV R0,#1
STR R0,[R12,#v.exit]
#rept 7
BL menufade
BL menubank
#endr
LDMFD R13!,{PC}

.normaltest
MOV R0,#-1
STR R0,[R12,#v.lastmenu]
MOV R3,#0
SWI OS_ReadEscapeState
BCS escapetrue
BL gamenumberscan
CMP R1,#137
BLEQ emptykeybuf
CMP R1,#137
MOVEQ R3,#0
BEQ escapetrue
MOV R0,#0
STR R0,[R12,#v.lastmenu]

CMP R3,#0
LDMEQFD R13!,{PC}
CMP R3,#6
MOVEQ R3,#0
.escapetrue
STR R3,[R12,#v.menuno]
LDR R0,[R12,#v.lastmenu]
CMP R0,#0
STRGE R3,[R12,#v.lastmenu]
MOV R0,#1
STR R0,[R12,#v.menucsr]
MOV R0,#124
SWI OS_Byte
.escapeloop
LDR R0,[R12,#v.lastmenu]
CMP R0,#0
LDR R0,[R12,#v.menuno]
STRGE R0,[R12,#v.lastmenu]
LDR R0,[R12,#v.menuno]

CMP R0,#2
CMPNE R0,#3
BNE slskip
CMP R0,#2
BLEQ escapesave
CMP R0,#3
BLEQ escapeload
B slins
.slskip
BL menufade

BL demomenu
BL menubank
.slins
LDR R0,[R12,#v.menuno]
LDR R1,[R12,#v.lastmenu]
CMP R0,R1
LDMLTFD R13!,{PC}
LDR R0,[R12,#v.loadedlev]
CMP R0,#-1
LDMEQFD R13!,{PC}
SWI OS_ReadEscapeState
BLCS escapeescape
LDR R0,[R12,#v.exit]
CMP R0,#1
CMPNE R0,#2
CMPNE R0,#3
LDMEQFD R13!,{PC}
B escapeloop

.escapeescape
STMFD R13!,{R14}
MOV R0,#0
STR R0,[R12,#v.menuno]
LDR R0,[R12,#v.menucsr]
CMP R0,#6
MOV R0,#6
STRNE R0,[R12,#v.menucsr]
MOV R0,#1
STREQ R0,[R12,#v.exit]
MOV R0,#124
SWI OS_Byte
LDMFD R13!,{PC}

.escapeload
STMFD R13!,{R14}
MOV R0,#1
STR R0,[R12,#v.pending]
MOV R0,#0
STR R0,[R12,#v.menuno]
LDR R0,[R12,#v.lastmenu]
CMP R0,#0
MOV R0,#3
STRGE R0,[R12,#v.lastmenu]
MOV R0,#3
STR R0,[R12,#v.menucsr]
MOV R0,#0
BL loadmenu
CMP R0,#"L"
LDMNEFD R13!,{PC}
MOV R0,#3
STR R0,[R12,#v.exit]
LDMFD R13!,{PC}

.escapesave
STMFD R13!,{R14}
LDR R0,[R12,#v.savestate]
CMP R0,#1
BEQ stopsave
MOV R0,#3
STR R0,[R12,#v.pending]
LDR R0,[R12,#v.lastmenu]
CMP R0,#0
MOV R0,#2
STRGE R0,[R12,#v.lastmenu]
MOV R0,#0
STR R0,[R12,#v.menuno]
MOV R0,#2
STR R0,[R12,#v.menucsr]
BL savemenu
LDMFD R13!,{PC}

.stopsave
ADR R0,stopsavemes
BL message
BL message
BL message
MOV R0,#2
STR R0,[R12,#v.exit]
LDMFD R13!,{PC}
.stopsavemes
DCD 160<<12,108<<12,0,-1<<12,&00800001,0
DCB "SAVE AVAILABLE",0
ALIGN
DCD 160<<12,128<<12,0,0,&00800001,0
DCB "AT THE END OF",0
ALIGN
DCD 160<<12,148<<12,0,1<<12,&00800001,0
DCB "THE LEVEL ONLY.",0
ALIGN

.noblocks
STMFD R13!,{R14}
LDR R0,[R12,#v.levelno]
TST R0,#&400
LDMNEFD R13!,{PC}
LDR R0,[R12,#v.newlevelctr]
CMP R0,#0
LDMGTFD R13!,{PC}
MOV R0,#1

STR R0,[R12,#v.newlevelctr]
BL newlevelmes
LDMFD R13!,{PC}

.newlevel
LDR R0,[R12,#v.newlevelctr]
LDR R1,[R12,#v.frameinc]
ADD R0,R0,R1
STR R0,[R12,#v.newlevelctr]
LDR R1,[R12,#v.levelno]
TST R1,#&400
MOV R1,#100
MOVNE R1,#300
CMP R0,R1
BLT newlevelins
MOV R0,#0
STR R0,[R12,#v.newlevelctr]
STR R0,[R12,#v.dead]
LDR R0,[R12,#v.warped]
BIC R0,R0,#1<<15
CMP R0,#0
BGT warplevel
.warplevelins
LDR R0,[R12,#v.levelno]
BIC R0,R0,#&400
ADD R0,R0,#1
STR R0,[R12,#v.levelno]
CMP R0,#42
BLT lifeloop
BL highscores
BL demostart
ADR R0,demendmes
BL message
B lifeloop

.warplevel
LDR R0,[R12,#v.levelno]
TST R0,#&400
BNE warplevelins
ORR R0,R0,#&400
STR R0,[R12,#v.levelno]
LDR R0,[R12,#v.warped]
MOV R0,R0,LSR #16
MOV R1,#250
MUL R0,R1,R0
STR R0,[R12,#v.warptime]
B lifeloop

.demendmes
DCD 160+&100<<12, 60<<12, -2<<12, 0, &01000001, 0
DCB "GAME COMPLETED!",0
ALIGN

.levelswap
STMFD R13!,{R14}
MOV R0,#ballstab
SWI Amnesia_WipeTable
MOV R0,#starstab
SWI Amnesia_WipeTable
MOV R0,#decortab
SWI Amnesia_WipeTable
LDR R1,[R12,#v.demomode]
CMP R1,#1
MOV R0,#texttab
SWINE Amnesia_WipeTable


BL loadlevel
MOV R0,#ballstab
SWI Amnesia_CountObjects
CMP R0,#0
BGT nomakeball
LDR R3,[R12,#v.ballxhome]
LDR R4,[R12,#v.ballyhome]
BL makeball
BL homebat
.nomakeball
LDR R1,[R12,#v.demomode]
CMP R1,#1
BLNE levstartmes
LDR R0,[R12,#v.levelno]
CMP R0,#1
LDMEQFD R13!,{PC}
LDR R1,[R12,#v.savestate]
CMP R1,#1
MOVEQ R1,#8
STREQ R1,[R12,#v.pending] 
LDMFD R13!,{PC}

.levstartmes
LDR R0,[R12,#v.levelno]
TST R0,#&400
BNE warpstartmes
STMFD R13!,{R14}
BL intromes
LDR R0,[R12,#v.levelno]
CMP R0,#1
BLEQ gamestartmes
LDR R0,[R12,#v.levelno]
ADR R1,levelnotext
MOV R2,#8
SWI XOS_ConvertCardinal2
LDR R0,[R12,#v.blocksleft]
ADR R1,blocknumtext
MOV R2,#8
SWI XOS_ConvertCardinal2
LDR R0,[R12,#v.blocksleft]
ADR R1,blocknumtext2
MOV R2,#8
SWI XOS_ConvertCardinal2

ADR R0,levstarttext
BL message
ADR R0,levstarttext2
BL message
ADR R0,levstarttext3
BL message
BL writeblocksleft
LDMFD R13!,{PC}

.levstarttext
DCD 160<<12,74<<12,0,0,&800001,0
DCB "LEVEL "
.levelnotext
DBB 8
DCB 0
ALIGN
.levstarttext2
DCD 160<<12,128<<12,0,0,&800001,blocklinktext-levstarttext2
.blocknumtext
DBB 8
DCB 0
ALIGN
.levstarttext3
DCD 160<<12,148<<12,0,0,&800001,0
DCB "BLOCKS TO HIT",0
ALIGN

.blocklinktext
DCD 160<<12,128<<12,-3<<12,13<<10,&1F0001,blockslefttext-blocklinktext
.blocknumtext2
DBB 8
DCB 0
ALIGN

.warpstartmes
STMFD R13!,{R14}
BL intromes
LDR R0,[R12,#v.warptime]
MOV R1,#250
MYDIV R3,R0,R1
MOV R0,R3
ADR R1,warpnumtext
MOV R2,#8
SWI XOS_ConvertCardinal2
MOV R0,R3
ADR R1,warpnumtext2
MOV R2,#8
SWI XOS_ConvertCardinal2
LDR R0,[R12,#v.warptime]
MOV R1,#50
MYDIV R3,R0,R1
MOV R0,R3
ADR R1,warptimetext
MOV R2,#8
SWI XOS_ConvertCardinal2
MOV R0,R3
ADR R1,warptimetext2
MOV R2,#8
SWI XOS_ConvertCardinal2

ADR R0,warpstarttext
BL message
BL message
BL message
ADR R0,warpstarttext3
BL message
BL message

ADR R0,warpstarttext2
BL message
BL writetimeleft
LDMFD R13!,{PC}

.warpstarttext
DCD 160<<12,70<<12,0,0,&400001,0
DCB "BONUS LEVEL",0
ALIGN
DCD 160<<12,90<<12,0,0,&500001,0
DCB "NUMBER OF BALLS",0
ALIGN
DCD 160<<12,130<<12,0,0,&700001,0
DCB "TIME = 5 X "
.warpnumtext2
DBB 8
DCB 0
ALIGN
.warpstarttext3
DCD 160<<12,170<<12,0,0,&900001,0
DCB "SECONDS",0
ALIGN
DCD 160<<12,110<<12,0,0,&600001,0
DCB "WARPED = "
.warpnumtext
DBB 8
DCB 0
ALIGN


.warpstarttext2
DCD 160<<12,150<<12,0,0,&800001,warplinktext-warpstarttext2
.warptimetext
DBB 8
DCB 0
ALIGN

.warplinktext
DCD 160<<12,150<<12,-3<<12,41<<8,&1F0001,timelefttext-warplinktext
.warptimetext2
DBB 8
DCB 0
ALIGN

.intromes
STMFD R13!,{R14}
LDR R11,[R12,#v.levelnet]
ADD R10,R11,#net.text1
ADR R9,introtext1mes
MOV R8,#32
.loop8d
LDR R0,[R10],#4
STR R0,[R9],#4
SUBS R8,R8,#4
BGT loop8d
ADD R10,R11,#net.text2
ADR R9,introtext2mes
MOV R8,#32
.loop8c
LDR R0,[R10],#4
STR R0,[R9],#4
SUBS R8,R8,#4
BGT loop8c
ADR R0,introtext1
BL message
ADR R0,introtext2
BL message
LDMFD R13!,{PC}
.introtext1
DCD 160<<12,20<<12,0,0,&00800001,0
.introtext1mes
DBB 32
DCB 0
ALIGN
.introtext2
DCD 160<<12,40<<12,0,0,&00800001,0
.introtext2mes
DBB 32
DCB 0
ALIGN




.gamestartmes
STMFD R13!,{R14}
LDR R1,[R12,#v.diff]
ADR R0,levbeginner
CMP R1,#2
ADREQ R0,levexpert
CMP R1,#3
ADREQ R0,levpsychic
BL message
LDMFD R13!,{PC}
.levbeginner
DCD 160<<12,200<<12,0,0<<12,&800001,0
DCB "LEVEL : BEGINNER",0
ALIGN
.levexpert
DCD 160<<12,200<<12,0,0<<12,&800001,0
DCB "LEVEL : EXPERT",0
ALIGN
.levpsychic
DCD 160<<12,200<<12,0,0<<12,&800001,levpsychic2 - levpsychic
DCB "LEVEL : PSYCHIC!",0
ALIGN
.levpsychic2
DCD 160<<12,200<<12,0,0<<12,&400001,0
DCB "GOOD LUCK!",0
ALIGN

.newlevelmes
STMFD R13!,{R14}
ADR R0,newleveltext
BL message
LDMFD R13!,{PC}

.newleveltext
DCD 160<<12,128<<12,0,0<<12,&400001,0
DCB "LEVEL COMPLETE",0
ALIGN

.warpendmes
STMFD R13!,{R14}
ADR R0,warpendtext
BL message
BL message
LDMFD R13!,{PC}

.warpendtext
DCD 160<<12,40<<12,0,0<<12,&400001,0
DCB "OUT OF TIME",0
ALIGN
DCD 160<<12,220<<12,0,0<<12,&400001,0
DCB "BONUS LEVEL OVER",0
ALIGN

.warpdiemes
STMFD R13!,{R14}
ADR R0,warpdietext
BL message
LDMFD R13!,{PC}

.warpdietext
DCD 160<<12,220<<12,0,0<<12,&400001,0
DCB "BONUS LEVEL OVER",0
ALIGN

.runclocks
STMFD R13!,{R14}
ADD R1,R12,#v.warptimer
MOV R2,#7
.loop83
LDR R0,[R1]
TST R0,#&100
ADDEQ R0,R0,#16
ADDNE R0,R0,#8
STR R0,[R1],#4
SUBS R2,R2,#1
BGT loop83
LDR R0,[R12,#v.levelno]
TST R0,#&400
LDMEQFD R13!,{PC}
BL writetimeleft
LDR R0,[R12,#v.warptime]
SUB R0,R0,#1
CMP R0,#0
STRGE R0,[R12,#v.warptime]
CMP R0,#1
BLEQ warpendmes
LDR R0,[R12,#v.dead]
CMP R0,#1
BLEQ endwarp
CMP R0,#50
BLEQ warpdiemes
LDR R0,[R12,#v.newlevelctr]
CMP R0,#20
BLGE warpexithandler

LDR R0,[R12,#v.warptime]
CMP R0,#0
BLLE endwarp
LDMFD R13!,{PC}

.endwarp
STMFD R13!,{R0,R14}
LDR R0,[R12,#v.newlevelctr]
CMP R0,#0
LDMNEFD R13!,{R0,PC}
MOV R0,#1
STR R0,[R12,#v.newlevelctr]
LDMFD R13!,{R0,PC}

.warpexithandler

STMFD R13!,{R14}
LDR R0,[R12,#v.warped]
CMP R0,#1<<15
LDMEQFD R13!,{PC}
AND R0,R0,#&FF
MOV R1,#500
MUL R1,R0,R1
MOV R6,R1
LDR R2,[R12,#v.plscore]
ADD R2,R2,R1
STR R2,[R12,#v.plscore]
MOV R0,R1
ADR R1,warphannum2
MOV R2,#8
SWI XOS_ConvertCardinal4
LDR R0,[R12,#v.warped]
AND R0,R0,#&FF
ADR R1,warphannum1
MOV R2,#8
SWI XOS_ConvertCardinal2
ADR R0,warphantext
BL message
BL message
BL message
ADR R0,warphantext2
BL message
LDR R2,[R12,#v.warptime]
MOV R1,#50

MYDIV R3,R2,R1
MOV R1,#50
MUL R1,R3,R1
ADD R6,R6,R1
LDR R2,[R12,#v.plscore]
ADD R2,R2,R1
STR R2,[R12,#v.plscore]
MOV R0,R1
ADR R1,warphantime2
MOV R2,#8
SWI XOS_ConvertCardinal4
MOV R0,R3
ADR R1,warphantime1
MOV R2,#8
SWI XOS_ConvertCardinal2
ADR R0,timebonustext
BL message
BL message
ADR R0,timebonustext2
BL message
LDR R5,[R12,#v.hinames]
ADD R5,R5,#192
LDR R0,[R12,#v.levelno]
BICS R0,R0,#&400
MOVMI R0,#0
CMP R0,#50
MOVGE R0,#0
ADD R5,R5,R0,LSL #2
LDR R7,[R5]
CMP R6,R7
STRGT R6,[R5]
MOV R0,R6
ADR R1,warptotal
MOV R2,#8
SWI XOS_ConvertCardinal4
MOV R0,R7
ADR R1,warprecord
MOV R2,#8
SWI XOS_ConvertCardinal4
ADR R0,warptotaltext
BL message
ADR R0,warprecordtext
BL message
CMP R6,R7
BLGT hisave
MOV R0,#1<<15
STR R0,[R12,#v.warped]
LDMFD R13!,{PC}

.warphantext
DCD 160<<12,80<<12,0,0,&800001,0
DCB "BONUS FOR BALLS",0
ALIGN
DCD 160<<12,100<<12,0,0,&900001,0
DCB "RETURNED",0
ALIGN
DCD 96<<12,120<<12,0,0,&A00001,0
DCB "500 X "
.warphannum1
DBB 8
DCB 0
ALIGN
.warphantext2
DCD 224<<12,120<<12,0,0,&A00001,0
DCB "= "
.warphannum2
DBB 8
DCB 0
ALIGN
.timebonustext
DCD 160<<12,140<<12,0,0,&B00001,0
DCB "TIME BONUS",0
ALIGN
DCD 96<<12,160<<12,0,0,&C00001,0
DCB "50 X "
.warphantime1
DBB 8
DCB 0
ALIGN
.timebonustext2
DCD 224<<12,160<<12,0,0,&C00001,0
DCB "= "
.warphantime2
DBB 8
DCB 0
ALIGN


.warptotaltext
DCD 160<<12,180<<12,0,0,&D00001,0
DCB "TOTAL BONUS ="
.warptotal
DBB 8
DCB 0
ALIGN
.warprecordtext
DCD 160<<12,200<<12,0,0,&E00001,0
DCB "RECORD ="
.warprecord
DBB 8
DCB 0
ALIGN


.plmove
STMFD R13!,{R14}
LDR R0,[R12,#v.buttons]
STR R0,[R12,#v.lastbuttons]
SWI OS_Mouse
LDR R3,[R12,#v.demomode]
CMP R3,#1
BLEQ demoread
LDR R3,[R12,#v.demomode]
CMP R3,#2
BLEQ demowrite

STR R2,[R12,#v.buttons]
STMFD R13!,{R0,R1}
SUB R3,R0,#640
RSB R4,R1,#512
LDR R0,[R12,#v.mousesens]
MOV R3,R3,ASL R0
MOV R4,R4,ASL R0
LDR R1,[R12,#v.xpos]
LDR R2,[R12,#v.ypos]
ADD R5,R1,R3
ADD R6,R2,R4
LDR R7,[R12,#v.xlim]
CMN R1,R7
BLE xlowstop
CMP R1,R7
BGE xhighstop
.xstopins
LDR R7,[R12,#v.ylim]
CMN R2,R7
BLE ylowstop
CMP R2,R7
BGE yhighstop
.ystopins
ADD R1,R1,R3
ADD R2,R2,R4
STR R1,[R12,#v.xpos]
STR R2,[R12,#v.ypos]
MOV R2,#3<<24
STR R2,[R12,#v.osblock0]
LDMFD R13!,{R0,R1}
LDR R2,[R12,#v.mousesens]
MOV R5,R3
CMP R5,#0
RSBLT R5,R5,#0
CMP R5,#1<<8
MOVLE R0,#640
BLE xmoveskip
CMP R3,#0
SUBGT R0,R0,R2,LSR #1
ADDLT R0,R0,R2,LSR #1
.xmoveskip
MOV R5,R4
CMP R5,#0
RSBLT R5,R5,#0
CMP R5,#1<<8
MOVLE R1,#512
BLE ymoveskip
CMP R4,#0
SUBLT R1,R1,R2,LSR #1
ADDGT R1,R1,R2,LSR #1
.ymoveskip
LDR R2,[R12,#v.buttons]
ORR R0,R0,R1,LSL #16
STR R0,[R12,#v.osblock1]
ADD R1,R12,#v.osblock0+3
MOV R0,#21
SWI OS_Word


LDMFD R13!,{PC}

.xlowstop
CMP R3,#0
MOVLT R3,#0
RSBLT R1,R7,#0
B xstopins
.xhighstop
CMP R3,#0
MOVGT R3,#0
MOVGT R1,R7
B xstopins
.ylowstop
CMP R4,#0
MOVLT R4,#0
RSBLT R2,R7,#0
B ystopins
.yhighstop
CMP R4,#0
MOVGT R4,#0
MOVGT R2,R7
B ystopins


.demoread
STMFD R13!,{R14}
LDR R3,[R12,#v.demoadr]
LDR R4,[R12,#v.democtr]
LDR R5,[R3]
CMP R4,R5
BGE demoend
LDR R0,[R3,R4]
AND R1,R0,#&3FFF<<16
MOV R1,R1,LSR #16
AND R2,R0,#3<<30
MOV R2,R2,LSR #29
AND R0,R0,#&3FFF
LDR R3,[R12,#v.democtr]
ADD R3,R3,#4
STR R3,[R12,#v.democtr]
MOV R3,#0
STR R3,[R12,#v.dead]
.demoreadins
LDMFD R13!,{PC}

.demoend
LDR R3,[R12,#v.dead]
ADD R3,R3,#1
STR R3,[R12,#v.dead]

MOV R0,#640
MOV R1,#496
MOV R2,#0
B demoreadins





.demowrite
STMFD R13!,{R0-R2,R14}
LDR R3,[R12,#v.demoadr]
LDR R4,[R12,#v.democtr]
AND R0,R0,#&3FFF
AND R1,R1,#&3FFF
ORR R0,R0,R1,LSL #16
MOV R2,R2,LSR #1
ORR R0,R0,R2,LSL #30
STR R0,[R3,R4]
ADD R4,R4,#4
STR R4,[R12,#v.democtr]
CMP R4,#demolen
LDMLTFD R13!,{R0-R2,PC}
LDR R0,[R12,#v.demoadr]
ADR R1,demosavename
MOV R2,#&FFD
SWI Amnesia_SaveFile
LDR R0,[R12,#v.demoadr]
SWI Amnesia_ReleaseBlock
MOV R0,#0
STR R0,[R12,#v.demoadr]
STR R0,[R12,#v.demomode]
ADR R0,savedmessage
BL message
LDMFD R13!,{R0-R2,PC}

.demosavename
DCB "OddBall:Demo.Demo",0
ALIGN

.savedmessage
DCD 160<<12,128<<12,0,0,&01000001,0
DCB "DEMO SAVED",0
ALIGN





.setplotoffset
STMFD R13!,{R14}
LDR R0,[R12,#v.plxcent]
LDR R1,[R12,#v.plycent]
SUB R0,R0,#plxcent
SUB R1,R1,#plycent
BIC R0,R0,#&FFF
BIC R1,R1,#&FFF
RSB R0,R0,#0
RSB R1,R1,#0
LDR R2,[R12,#v.plxcent]
ADD R0,R0,#((canvaswidth-windwidth)<<11)
STR R0,[R12,#v.xplotofs]
STR R1,[R12,#v.yplotofs]
BIC R0,R0,#&3FFF
SWI Amnesia_SetPlotOffset
LDR R0,[R12,#v.xplotofs]
MOV R0,R0,ASR #12
AND R0,R0,#3
RSB R0,R0,#3
STR R0,[R12,#v.plotnibble]
LDMFD R13!,{PC}

.movecent
STMFD R13!,{R14}
LDR R0,[R12,#v.dead]
CMP R0,#0
BEQ normalcent
LDR R0,[R12,#v.batpresent]
CMP R0,#0
LDMEQFD R13!,{PC}
.deadcent
LDR R1,[R12,#v.ballxpos]
LDR R0,[R12,#v.plxcent]
SUB R2,R0,R1
MOV R2,R2,ASR #3
CMP R2,#0
RSBLT R2,R2,#0
CMP R2,#32<<12
MOVGT R2,#32<<12
CMP R0,R1
SUBGT R0,R0,R2
ADDLT R0,R0,R2
BIC R0,R0,#&FFF
STR R0,[R12,#v.plxcent]

LDR R1,[R12,#v.ballypos]
LDR R0,[R12,#v.plycent]
SUB R2,R0,R1
MOV R2,R2,ASR #3
CMP R2,#0
RSBLT R2,R2,#0
CMP R2,#32<<12
MOVGT R2,#32<<12
CMP R0,R1
SUBGT R0,R0,R2
ADDLT R0,R0,R2
BIC R0,R0,#&FFF
STR R0,[R12,#v.plycent]
LDMFD R13!,{PC}

.normalcent
LDR R2,[R12,#v.xpos]
LDR R3,[R12,#v.ballxpos]
SUB R0,R3,R2
LDR R2,[R12,#v.ypos]
ADD R2,R2,#128<<12; for ball above bat
LDR R3,[R12,#v.ballypos]
SUB R1,R3,R2
MOV R0,R0,ASR #2
MOV R1,R1,ASR #2
MOV R2,#64<<12; max vector length
BL slideback
LDR R2,[R12,#v.xpos]
ADD R2,R2,R0
LDR R3,[R12,#v.plxcent]
SUB R4,R2,R3
LDR R2,[R12,#v.xvec]
SUB R4,R4,R2
CMP R4,#4<<12
MOVGT R4,#4<<12
CMP R4,#-4<<12
MOVLT R4,#-4<<12
ADD R4,R4,R2
ADD R3,R3,R4
STR R3,[R12,#v.plxcent]
LDR R2,[R12,#v.ypos]
ADD R2,R2,R1
LDR R3,[R12,#v.plycent]
SUB R4,R2,R3
LDR R2,[R12,#v.yvec]
SUB R4,R4,R2
CMP R4,#4<<12
MOVGT R4,#4<<12
CMP R4,#-4<<12
MOVLT R4,#-4<<12
ADD R4,R4,R2
ADD R3,R3,R4
STR R3,[R12,#v.plycent]
LDMFD R13!,{PC}

.justmovedbat
STMFD R13!,{R14}
MOV R0,#batstab
MOV R1,#0
MOV R2,#1
SWI Amnesia_SelectTable
.loop19
SWI Amnesia_ProcessTable
STMFD R13!,{R0-R1}
TST R2,#1<<10
BLNE sortbat
CMP R2,#0
LDMFD R13!,{R0-R1}
BNE loop19
LDMFD R13!,{PC}


.processbat
STMFD R13!,{R14}
MOV R0,#0
STR R0,[R12,#v.batpresent]
MOV R0,#batstab
MOV R1,#0
LDR R2,[R12,#v.masterplot]
SWI Amnesia_SelectTable
.loop5
SWI Amnesia_ProcessTable
STMFD R13!,{R0-R2}
TST R2,#1<<10
BLNE movebat
LDMFD R13!,{R0-R2}
CMP R2,#0
BNE loop5
LDR R0,[R12,#v.batpresent]
CMP R0,#0
LDMNEFD R13!,{PC}
LDR R0,[R12,#v.dead]
ADD R0,R0,#1
STR R0,[R12,#v.dead]
LDMFD R13!,{PC}

.movebat
STMFD R13!,{R0-R2,R14}
MOV R3,#1
STR R3,[R12,#v.batpresent]
MOV R3,#&FF
BL scanadd
MOV R2,R1
LDR R0,[R12,#v.xpos]
;ADD R0,R0,#1<<12      ; for hardscrolling only.
;BIC R0,R0,#1<<12      ;
LDR R1,[R2,#8]
SUB R3,R0,R1
STR R0,[R2,#8]
LDR R0,[R12,#v.ypos]
LDR R1,[R2,#12]
SUB R4,R0,R1
STR R0,[R2,#12]
STR R3,[R2,#16]
STR R3,[R12,#v.xvec]
STR R4,[R2,#20]
STR R4,[R12,#v.yvec]
LDMFD R13!,{R0-R2,PC}

.sortbat
STMFD R13!,{R0-R2,R14}
MOV R2,R1
LDR R0,[R12,#v.xpos]
;ADD R0,R0,#1<<12      ; for hardscrolling only.
;BIC R0,R0,#1<<12      ;
STR R0,[R2,#8]
LDR R0,[R12,#v.ypos]
STR R0,[R2,#12]
MOV R3,#0
STR R3,[R2,#16]
STR R3,[R12,#v.xvec]
STR R3,[R2,#20]
STR R3,[R12,#v.yvec]
LDMNEFD R13!,{R0-R2,PC}


.processblocks
STMFD R13!,{R14}
MOV R0,#blockstab
MOV R1,#0
LDR R2,[R12,#v.masterplot]
SWI Amnesia_SelectTable
MOV R3,#0
.loopf
SWI Amnesia_ProcessTable
TST R2,#1<<8
BLNE blocktimer
TST R2,#1<<10
BLNE blockattn
CMP R2,#0
BNE loopf
LDMFD R13!,{PC}

.blockattn
STMFD R13!,{R0-R3,R14}
LDR R3,[R1,#4]
TST R3,#1<<24
BNE vertblock
.horizblock
LDR R3,[R1,#8]
LDR R5,[R1,#32]
CMP R3,R5
BLLE blockrefright
LDR R5,[R1,#36]
CMP R3,R5
BLGE blockrefleft
.blockattnins
LDR R3,[R1,#4]
TST R3,#1<<20
TSTNE R3,#1<<25
BLNE remorph
LDR R3,[R12,#v.scanspeed]
CMP R3,#1
MOV R3,#&8F
BLGT scanadd

LDMFD R13!,{R0-R3,PC}

.vertblock
LDR R3,[R1,#12]
LDR R5,[R1,#32]
CMP R3,R5
BLLE blockrefdown
LDR R5,[R1,#36]
CMP R3,R5
BLGE blockrefup
B blockattnins
.blockrefright
LDR R4,[R1,#16]
RSBS R4,R4,#0
STRGT R4,[R1,#16]
LDRGT R4,[R1,#4]
ORRGT R4,R4,#1<<20
STRGT R4,[R1,#4]
MOV PC,R14
.blockrefleft
LDR R4,[R1,#16]
RSBS R4,R4,#0
STRLT R4,[R1,#16]
LDRLT R4,[R1,#4]
ORRLT R4,R4,#1<<20
STRLT R4,[R1,#4]
MOV PC,R14
.blockrefdown
LDR R4,[R1,#20]
RSBS R4,R4,#0
STRGT R4,[R1,#20]
LDRGT R4,[R1,#4]
ORRGT R4,R4,#1<<20
STRGT R4,[R1,#4]
MOV PC,R14
.blockrefup
LDR R4,[R1,#20]
RSBS R4,R4,#0
STRLT R4,[R1,#20]
LDRLT R4,[R1,#4]
ORRLT R4,R4,#1<<20
STRLT R4,[R1,#4]
MOV PC,R14


.blocktimer
MOV R3,#0
STR R3,[R1,#24]
LDR R3,[R1,#4]
ORR R3,R3,#1<<2
STR R3,[R1,#4]
MOV PC,R14

.remorph
STMFD R13!,{R0-R4,R9,R14}
MOV R9,R1
MOV R0,#&00020001
STR R0,[R9,#24]
MOV R0,#%1000010101
STR R0,[R9,#4]
MOV R0,#0
STR R0,[R9,#16]
STR R0,[R9,#20]
LDR R0,[R9,#8]
LDR R1,[R9,#12]
BL translate
LDMVSFD R13!,{R0-R4,R9,PC}
MOV R0,#&A0
STRB R0,[R4]
LDMFD R13!,{R0-R4,R9,PC}

.processstars
STMFD R13!,{R14}
MOV R0,#starstab
ORR R0,R0,#1<<31
MOV R1,#0
LDR R2,[R12,#v.masterplot]
SWI Amnesia_SelectTable
.loops
SWI Amnesia_ProcessTable
STMFD R13!,{R0-R1}
TST R2,#1<<31
BLNE stareffect
LDMFD R13!,{R0-R1}
CMP R2,#0
BNE loops
LDMFD R13!,{PC}

.stareffect
STMFD R13!,{R0-R2,R14}
MOV R3,#&78
BL scanadd
LDR R3,[R1,#20]
CMP R3,#2<<12
BLT staractive

SUB R3,R3,R3,ASR #4
STR R3,[R1,#20]
LDMFD R13!,{R0-R2,PC}
.staractive
LDR R3,[R1,#4]
ORR R3,R3,#1<<7
STR R3,[R1,#4]
BL starflash
LDMFD R13!,{R0-R2,PC}


.starflash
STMFD R13!,{R0-R2,R14}
LDR R3,[R1,#8]
LDR R4,[R1,#12]
BL random
AND R0,R0,#&3F000
SUB R0,R0,#&1F000
MOV R5,R0,ASR #3
ADD R3,R3,R0
BL random
AND R0,R0,#&3F000
SUB R0,R0,#&1F000
MOV R6,R0,ASR #3
ADD R4,R4,R0
LDR R1,[R1,#32]
AND R1,R1,#&F
BL gdecorate
LDMFD R13!,{R0-R2,PC}

.glintflash
STMFD R13!,{R0-R2,R14}
LDR R3,[R1,#8]
LDR R4,[R1,#12]
BL random
AND R0,R0,#&3F000
SUB R0,R0,#&1F000
ADD R3,R3,R0
BL random
AND R0,R0,#&3F000
SUB R0,R0,#&1F000
ADD R4,R4,R0
MOV R1,#2
BL decorate
LDMFD R13!,{R0-R2,PC}


.processdecor
STMFD R13!,{R14}
MOV R0,#decortab+(&0f<<24)
MOV R1,#0
LDR R2,[R12,#v.masterplot]
SWI Amnesia_SelectTable
.loopr
SWI Amnesia_ProcessTable
TST R2,#1<<8
BLNE turntoglint
TST R2,#1<<24
BLNE decorslow
CMP R2,#0
BNE loopr

LDMFD R13!,{PC}
.turntoglint
MOV R3,#0
STR R3,[R1,#16]
STR R3,[R1,#20]
LDR R3,[R1,#4]
BIC R3,R3,#1<<8
ORR R3,R3,#%1000100000

STR R3,[R1,#4]
MOV R3,#(decortab<<24)+2
STR R3,[R1,#0]
MOV R3,#&03000080
STR R3,[R1,#24]
MOV PC,R14

.decorslow
LDR R3,[R1,#16]
LDR R4,[R1,#32]
ADD R3,R3,R4
STR R3,[R1,#16]
LDR R3,[R1,#20]
LDR R4,[R1,#36]
ADD R3,R3,R4
STR R3,[R1,#20]
MOV PC,R14


.processedge
STMFD R13!,{R14}
BL stretchplotwindow
MOV R0,#edgetab
MOV R1,#0
LDR R2,[R12,#v.masterplot]
SWI Amnesia_SelectTable
.loop34
SWI Amnesia_ProcessTable
CMP R2,#0
BNE loop34
BL resetplotwindow
LDMFD R13!,{PC}

.processbullets
STMFD R13!,{R14}
MOV R0,#bulletstab
MOV R1,#0
LDR R2,[R12,#v.masterplot]
SWI Amnesia_SelectTable
.loop40
SWI Amnesia_ProcessTable
TST R2,#1<<10
BLNE bulletattn
CMP R2,#0
BNE loop40
LDMFD R13!,{PC}

.bulletattn
STMFD R13!,{R0-R2,R14}
MOV R9,R1
LDR R0,[R9,#8]
LDR R1,[R9,#12]
BL translate
BVS bulletattnend
LDR R0,[R4]
AND R0,R0,#&F0
CMP R0,#&90
CMPNE R0,#&A0
BEQ bulletstone
AND R0,R0,#&C0
CMP R0,#&40
BLNE bulletattnend
MOV R0,R4
BL blockdest
.bulletstone
BL bulletexplode
.bulletattnend
LDMFD R13!,{R0-R2,PC}

.bulletexplode
STMFD R13!,{R0-R1,R14}
LDR R0,[R9,#4]
MOV R0,#&05000000
MOV R1,#%1000001000110001
STMIA R9,{R0,R1}
MOV R0,#&07000080
STR R0,[R9,#24]
BL objectrange
BL explosound
LDMFD R13!,{R0-R1,PC}


.processballs
STMFD R13!,{R14}
MOV R0,#&7F000000
STR R0,[R12,#v.balldist]
MOV R0,#0
STR R0,[R12,#v.ballctr]
MOV R0,#ballstab
MOV R1,#0
LDR R2,[R12,#v.masterplot]
SWI Amnesia_SelectTable
.loop8
SWI Amnesia_ProcessTable
STMFD R13!,{R0-R1}
TST R2,#1<<10
BLNE ballattn
TST R2,#1<<8
BLNE balltimer
CMP R2,#0
LDMFD R13!,{R0-R1}
BNE loop8
LDR R0,[R12,#v.ballctr]
CMP R0,#0
BLEQ noballs
LDMFD R13!,{PC}

.ballattn
STMFD R13!,{R0-R2,R14}
MOV R9,R1
ADD R14,R9,#8
LDMIA R14,{R3-R6}
SUB R3,R3,R5    ;get old position
SUB R4,R4,R6
STR R3,[R9,#36]
STR R4,[R9,#40]
LDR R4,[R9,#4]
TST R4,#1<<29
MOV R3,#&7F
MOVNE R3,#&E0
TST R4,#1<<26
MOVNE R3,#&17
TST R4,#1<<30
BNE killballattn

BL scanadd
MOV R3,#0
LDR R4,[R12,#v.demomode]
CMP R4,#1
BEQ demskip2
.demskip2
LDR R4,[R9,#4]
TST R4,#1<<26 
LDREQ R3,[R12,#v.ballctr]
ADDEQ R3,R3,#1
STREQ R3,[R12,#v.ballctr]
BNE notthisball
.balladdskip
LDR R3,[R9,#8]
LDR R5,[R12,#v.xpos]
SUBS R5,R3,R5
RSBMI R5,R5,#0

LDR R4,[R9,#12]
LDR R6,[R12,#v.ypos]
SUBS R7,R4,R6
RSBMI R7,R7,#0

ADD R5,R5,R7
LDR R6,[R12,#v.balldist]
CMP R5,R6
BGT notthisball
STR R3,[R12,#v.ballxpos]
STR R4,[R12,#v.ballypos]
STR R5,[R12,#v.balldist]
.notthisball

LDR R3,[R9,#4]
TST R3,#1<<25
BLNE glintflash


TST R2,#1<<24; ball exploding
LDMNEFD R13!,{R0-R2,PC}

MOV R0,#256
STR R0,[R12,#v.windmax]
LDR R0,[R9,#8]
LDR R1,[R9,#12]
LDR R5,[R9,#28]
AND R6,R5,#&FFFF
MOV R5,R5,LSR #16
ADD R0,R0,R5,ASL #11
ADD R1,R1,R6,ASL #11
MOV R8,#0
BL translate
BVS balloffnet
LDR R4,[R12,#v.scanlock]
CMP R4,#1
BNE nolockcheck
STMFD R13!,{R0-R3}
LDR R1,[R12,#v.levelnet]
LDR R0,[R1,#net.xsize]
LDR R1,[R1,#net.ysize]
ADD R2,R2,R0,ASR #1
ADD R3,R3,R1,ASR #1
CMP R2,#32
CMPLE R3,#32
LDMFD R13!,{R0-R3}
BGT balloffnet
.nolockcheck
STMFD R13!,{R0-R3}
STR R0,[R12,#v.ballxnib]
STR R1,[R12,#v.ballynib]
CMP R0,R5,ASR #1
ADDLT R0,R0,#96
SUBLT R2,R2,#1
CMP R1,R6,ASR #1
ADDLT R1,R1,#96
SUBLT R3,R3,#1
BL ballgetheight
LDMFD R13!,{R0-R3}

STMFD R13!,{R2-R3}
BL ballattncheck
STR R4,[R12,#v.brball]
LDMFD R13,{R2-R3}; no writeback
SUB R2,R2,#1
CMP R0,R5
MOV R4,#256
BLLE ballattncheck
STR R4,[R12,#v.blball]
LDMFD R13,{R2-R3}; no writeback
SUB R3,R3,#1
CMP R1,R6
MOV R4,#256
BLLE ballattncheck
STR R4,[R12,#v.trball]
LDMFD R13!,{R2-R3}
SUB R2,R2,#1
SUB R3,R3,#1
CMP R0,R5
CMPLE R1,R6
MOV R4,#256
BLLE ballattncheck
STR R4,[R12,#v.tlball]

LDR R0,[R12,#v.windmax]
CMP R0,#256
BGE ballattnnocol
ADD R5,R12,#v.windbuf
LDMIA R5,{R0-R3}
ADD R5,R9,#8
STMIA R5,{R0-R3}
.ballattnnocol
.balloffnet
TST R8,#1
BEQ killball
.killballins
MOV R5,#0
LDR R3,[R9,#32]
CMP R3,#0
BEQ steponfloor
TST R8,#4
MOVNE R5,#1
.steponfloor
TST R8,#2
STREQ R5,[R9,#32]
LDR R3,[R9,#32]
LDR R4,[R9,#0]
BIC R4,R4,#&FF<<16
AND R3,R3,#&F
CMP R3,#2
ORREQ R4,R4,#10<<16
ORRNE R4,R4,#9<<16
STR R4,[R9,#0]

;this section alters the ball velocity
;ballnib is the position of the bottom right of the ball's bounding box
;R5 is the ball height
;v.brball is the slab at the bottom right of the ball footprint etc
;These = 256 if no check has been made.  brball is always made.
.edgeeffect

LDR R3,[R9,#16]
LDR R4,[R9,#20]
LDR R5,[R9,#32]

CMP R5,#1
MOVEQ R5,#0
LDR R0,[R12,#v.ballxnib]
LDR R1,[R12,#v.ballynib]

LDR R6,[R9,#28]
AND R6,R6,#&FF
CMP R0,R6,LSR #1
BLLT rollleftcheck
CMP R0,R6,LSR #1
BLE norrcheck
CMP R0,R6
BLLT rollrightcheck
.norrcheck
CMP R1,R6,LSR #1
BLLT rollupcheck
CMP R1,R6,LSR #1
BLE nordcheck
CMP R1,R6
BLLT rolldowncheck
.nordcheck
LDR R0,[R12,#v.xgrav]
ADD R3,R3,R0
LDR R0,[R12,#v.ygrav]
ADD R4,R4,R0


MOV R8,R8,LSR #24
#set slope=1<<10
CMP R8,#&C8
SUBEQ R3,R3,#slope
CMP R8,#&C9
ADDEQ R3,R3,#slope
CMP R8,#&CA
SUBEQ R4,R4,#slope
CMP R8,#&CB
ADDEQ R4,R4,#slope
CMP R8,#&20
BLEQ blowleft
CMP R8,#&21
BLEQ blowright
CMP R8,#&22
BLEQ blowup
CMP R8,#&23
BLEQ blowdown
CMP R8,#&24
BLEQ speedup
CMP R8,#&25
BLEQ slowdown
CMP R8,#&2F
BLEQ hellexpand
CMP R8,#1
BLE notontel
CMP R8,#16
BGE notontel
CMP R8,#2
CMPNE R8,#5
CMPNE R8,#6
BEQ notontel
BL ontelep
B ontelins

.notontel
LDR R0,[R9,#4]
BIC R0,R0,#1<<27
STR R0,[R9,#4]

.ontelins

STR R3,[R9,#16]
STR R4,[R9,#20]

LDR R0,[R12,#v.magnet]
CMP R0,#0
BLGT ballpull
LDR R0,[R12,#v.ballfire]
CMP R0,#0
BLGT doballfire
LDR R0,[R12,#v.blueball]
CMP R0,#0
BLGT doblueball
LDR R0,[R12,#v.ballstops]
CMP R0,#0
BLGT doballstop
LDR R0,[R12,#v.bastard]
CMP R0,#0
BLGT dobastard


LDR R3,[R9,#16]
MOV R3,R3,ASR #10
MOV R5,R3
MUL R3,R5,R3

LDR R4,[R9,#20]
MOV R4,R4,ASR #10
MOV R5,R4
MUL R4,R5,R4

ADD R3,R3,R4
LDR R4,[R12,#v.ballmin]
CMP R3,R4
BLLT ballspeedup
;check ball speed
LDR R3,[R9,#16]
LDR R4,[R9,#20]
BL limitballspeed

STR R3,[R9,#16]
STR R4,[R9,#20]
LDMFD R13!,{R0-R2,PC}
;change killball if you change this stack instruction

.rollleftcheck
STMFD R13!,{R6,R14}
LDR R6,[R12,#v.blball]
CMP R6,#256
LDMGEFD R13!,{R6,PC}
MOV R7,#2
CMP R6,#&20
MOVLT R7,#-1
CMP R6,#&10
MOVLT R7,#0
CMP R7,R5
LDMGEFD R13!,{R6,PC}
LDR R6,[R12,#v.tlball]
CMP R6,#256
BGE rollleft
MOV R7,#2
CMP R6,#&20
MOVLT R7,#-1
CMP R6,#&10
MOVLT R7,#0
CMP R7,R5
LDMGEFD R13!,{R6,PC}
.rollleft
LDR R6,[R9,#28]
AND R6,R6,#&FF
RSB R6,R0,R6,ASR #1
LDR R7,[R12,#v.diff]
ADD R7,R7,#4
SUB R3,R3,R6,LSL R7
LDMFD R13!,{R6,PC}

.rollrightcheck
STMFD R13!,{R6,R14}
LDR R6,[R12,#v.brball]
MOV R7,#2
CMP R6,#&20
MOVLT R7,#-1
CMP R6,#&10
MOVLT R7,#0
CMP R7,R5
LDMGEFD R13!,{R6,PC}
LDR R6,[R12,#v.trball]
CMP R6,#256
BGE rollright
MOV R7,#2
CMP R6,#&20
MOVLT R7,#-1
CMP R6,#&10
MOVLT R7,#0
CMP R7,R5
LDMGEFD R13!,{R6,PC}
.rollright
LDR R6,[R9,#28]
AND R6,R6,#&FF
SUB R6,R0,R6,LSR #1
LDR R7,[R12,#v.diff]
ADD R7,R7,#4
ADD R3,R3,R6,LSL R7
LDMFD R13!,{R6,PC}

.rollupcheck
STMFD R13!,{R6,R14}
LDR R6,[R12,#v.trball]
CMP R6,#256
LDMGEFD R13!,{R6,PC}
MOV R7,#2
CMP R6,#&20
MOVLT R7,#-1
CMP R6,#&10
MOVLT R7,#0
CMP R7,R5
LDMGEFD R13!,{R6,PC}
LDR R6,[R12,#v.tlball]
CMP R6,#256
BGE rollup
MOV R7,#2
CMP R6,#&20
MOVLT R7,#-1
CMP R6,#&10
MOVLT R7,#0
CMP R7,R5
LDMGEFD R13!,{R6,PC}
.rollup
LDR R6,[R9,#28]
AND R6,R6,#&FF
RSB R6,R1,R6,LSR #1
LDR R7,[R12,#v.diff]
ADD R7,R7,#4
SUB R4,R4,R6,LSL R7
LDMFD R13!,{R6,PC}

.rolldowncheck
STMFD R13!,{R6,R14}
LDR R6,[R12,#v.brball]
MOV R7,#2
CMP R6,#&20
MOVLT R7,#-1
CMP R6,#&10
MOVLT R7,#0
CMP R7,R5
LDMGEFD R13!,{R6,PC}
LDR R6,[R12,#v.blball]
CMP R6,#256
BGE rolldown
MOV R7,#2
CMP R6,#&20
MOVLT R7,#-1
CMP R6,#&10
MOVLT R7,#0
CMP R7,R5
LDMGEFD R13!,{R6,PC}
.rolldown
LDR R6,[R9,#28]
AND R6,R6,#&FF
SUB R6,R1,R6,LSR #1
LDR R7,[R12,#v.diff]
ADD R7,R7,#4
ADD R4,R4,R1,LSL R7
LDMFD R13!,{R6,PC}

.limitballspeed
STMFD R13!,{R0,R14}
LDR R0,[R12,#v.ballspeedlim]
CMP R3,R0
MOVGT R3,R0
CMP R4,R0
MOVGT R4,R0
RSB R0,R0,#0
CMP R3,R0
MOVLT R3,R0
CMP R4,R0
MOVLT R4,R0
LDR R0,[R12,#v.demomode]
CMP R0,#1
LDMEQFD R13!,{R0,PC}
#set velmin=1<<4
CMP R3,#velmin
BGT nolimslowx
CMN R3,#velmin
MOVGT R3,#0
.nolimslowx
CMP R4,#velmin
BGT nolimslowy
CMN R4,#velmin
MOVGT R4,#0
.nolimslowy
LDMFD R13!,{R0,PC}

.doballfire
STMFD R13!,{R9-R10,R14}
LDR R0,[R12,#v.ballfire]
TST R0,#7
LDMNEFD R13!,{R9-R10,PC}
MOV R0,R0,ASL #4
AND R0,R0,#&7F8
ADR R10,circletab
ADD R10,R10,R0
MOV R1,#(decortab<<24)+0
MOV R2,#%1000011000111101+(1<<18)
LDR R3,[R9,#8]
LDR R4,[R9,#12]
LDR R5,[R9,#16]
LDR R6,[R9,#20]
LDR R0,[R10]
MOV R0,R0,ASR #16
ADD R5,R5,R0
LDR R0,[R10,#4]
MOV R0,R0,ASR #16
ADD R6,R6,R0
MOV R7,#&10000040
BL random
AND R0,R0,#&01FF0000
ORR R7,R7,R0
MOV R8,#0
MOV R0,#bulletstab
SWI Amnesia_MakeObject
LDR R0,[R12,#v.plxcent]
SUB R0,R3,R0
LDR R1,[R12,#v.plycent]
SUB R1,R4,R1
BL blamsound
LDMFD R13!,{R9-R10,PC}

.doblueball
STMFD R13!,{R9-R10,R14}
LDR R0,[R12,#v.blueball]
TST R0,#31
LDMNEFD R13!,{R9-R10,PC}
LDR R3,[R9,#4]
TST R3,#3<<8
LDMNEFD R13!,{R9-R10,PC}
LDR R3,[R9,#8]
LDR R4,[R9,#12]
BL makeblueball
LDR R0,[R12,#v.plxcent]
SUB R0,R3,R0
LDR R1,[R12,#v.plycent]
SUB R1,R4,R1
;BL blamsound
LDMFD R13!,{R9-R10,PC}

.doballstop
MOV R0,#0
STR R0,[R9,#16]
STR R0,[R9,#20]
MOV PC,R14

.dobastard
LDR R0,[R9,#16]
ADD R0,R0,R0,ASR #6
STR R0,[R9,#16]
LDR R0,[R9,#20]
ADD R0,R0,R0,ASR #6

STR R0,[R9,#20]
MOV PC,R14

.ontelep
STMFD R13!,{R0-R10,R14}
LDR R0,[R12,#v.sparks]
CMP R0,#1
BNE nottelepspark
CMP R8,#12
BLT nottelepspark
BL ballexplode
LDMFD R13!,{R0-R10,PC}
.nottelepspark
LDR R0,[R9,#4]
TST R0,#1<<27
LDMNEFD R13!,{R0-R10,PC}
ORR R0,R0,#1<<27
STR R0,[R9,#4]
LDR R7,[R12,#v.levelnet]
LDR R5,[R12,#v.balladr]
TST R8,#1
EOR R8,R8,#1
BNE telright
ADD R6,R7,#net.data+1
.loop80
LDRB R0,[R5,#-1]!
CMP R0,R8
BEQ telfound
CMP R5,R6
BGT loop80
LDMFD R13!,{R0-R10,PC}
.telright
LDR R0,[R7,#net.xsize]
LDR R1,[R7,#net.ysize]
MUL R6,R1,R0
LDR R0,[R12,#v.scanlock]
CMP R0,#1
MOVEQ R6,#32*32
ADD R7,R7,#net.data
ADD R6,R6,R7
SUB R6,R6,#1
.loop81
LDRB R0,[R5,#1]!
CMP R0,R8
BEQ telfound
CMP R5,R6
BLT loop81
LDMFD R13!,{R0-R10,PC}

.telfound
BL teleff1
MOV R0,R5
BL backtranslate
LDMVSFD R13!,{R0-R10,PC}
STR R0,[R9,#8]
STR R1,[R9,#12]
BL teleff2
LDMFD R13!,{R0-R10,PC}

.teleff1
STMFD R13!,{R0-R9,R14}
LDR R0,[R12,#v.balladr]
BL backtranslate
MOV R3,R0
MOV R4,R1
MOV R0,#decortab
MOV R1,#(decortab<<24)+4
MOV R2,#%1000001001110001
MOV R7,#&03000040
SWI Amnesia_MakeObject
LDR R0,[R9,#4]
TST R0,#1<<29
LDMNEFD R13!,{R0-R9,PC}
LDR R5,[R9,#8]
LDR R6,[R9,#12]
SUB R5,R3,R5
SUB R6,R4,R6
MOV R5,R5,ASR #5
MOV R6,R6,ASR #5
LDR R3,[R9,#8]
LDR R4,[R9,#12]
MOV R0,#decortab
MOV R1,#(ballstab<<24)
MOV R2,#%1000001001110101
MOV R7,#&0A000050

SWI Amnesia_MakeObject
BL telepsound
LDMFD R13!,{R0-R9,PC}

.teleff2
STMFD R13!,{R9,R14}
MOV R0,#decortab
MOV R1,#(decortab<<24)+4
MOV R2,#%1000001001110001
LDR R3,[R9,#8]
LDR R4,[R9,#12]
MOV R7,#&03000040
SWI Amnesia_MakeObject
BL telepsound2
LDMFD R13!,{R9,PC}



.ballpull
STMFD R13!,{R14}
LDR R3,[R9,#4]
TST R3,#15<<20
LDMNEFD R13!,{PC}
LDR R3,[R9,#8]
LDR R4,[R9,#12]
LDR R5,[R12,#v.xpos]
LDR R6,[R12,#v.ypos]
SUB R5,R3,R5
SUB R6,R4,R6
STMFD R13!,{R5,R6}
MOV R5,R5,ASR #12
MOV R1,R5
MUL R1,R5,R1
MOV R6,R6,ASR #12
MOV R2,R6
MUL R2,R6,R2
ADD R0,R1,R2
LDMFD R13!,{R5,R6}
CMP R0,#1<<18
LDMGTFD R13!,{PC}
MOV R0,R0,ASR #5
CMP R0,#8
MOVLT R0,#8
LDR R3,[R12,#v.magpitch]
MOV R4,#&3D55
SUB R4,R4,R0,ASR #2
CMP R4,R3
STRGT R4,[R12,#v.magpitch]

MYDIV R3,R5,R0
MYDIV R4,R6,R0
LDR R0,[R9,#16]
SUB R0,R0,R3
STR R0,[R9,#16]
LDR R0,[R9,#20]
SUB R0,R0,R4
STR R0,[R9,#20]
LDMFD R13!,{PC}



.ballgetheight
STMFD R13!,{R0-R7,R10,R14}
BL transconv
BVS ballnoheight
MOV R10,R4
STR R10,[R12,#v.balladr]
LDRB R7,[R10]
ORR R8,R8,R7,LSL #24
CMP R7,#&C8
BLGE balllift
.ballnoheight
LDMFD R13!,{R0-R7,R10,PC}

.balllift
STMFD R13!,{R0,R14}
CMP R7,#&C8
BEQ leftlift
CMP R7,#&C9
BEQ rightlift
CMP R7,#&CA
BEQ uplift
CMP R7,#&CB
BEQ downlift
LDMFD R13!,{R0,PC}
.downlift
CMP R1,#80
BGT noliftball
B doliftball
.uplift
CMP R1,#16
BLT noliftball
B doliftball
.rightlift
CMP R0,#80
BGT noliftball
B doliftball
.leftlift
CMP R0,#16
BLT noliftball
B doliftball


.doliftball
MOV R0,#2
STR R0,[R9,#32]
LDMFD R13!,{R0,PC}
.noliftball
LDR R0,[R9,#32]
CMP R0,#0
MOVEQ R0,#1
STREQ R0,[R9,#32]
LDMFD R13!,{R0,PC}


.ballattncheck
STMFD R13!,{R0-R3,R5-R7,R10,R14}
BL transconv
BVS ballattnnocheck
MOV R10,R4
LDRB R7,[R10]
BIC R8,R8,#8+32
CMP R7,#&AB
BLT notsecret
CMP R7,#&B0
BGE notsecret
BL dosecret
.notsecret
CMP R7,#hellno+16
BGE skiphell
CMP R7,#hellno
BLT skiphell
CMP R7,#&1C
ORRGE R8,R8,#64
B skiphellins

.skiphell
ORR R8,R8,#1; prevent ball being killed
.skiphellins

CMP R7,#&C8
ORRGE R8,R8,#4
BGE nosupport
CMP R7,#&90
BGE nosupport
CMP R7,#&40
ORRGE R8,R8,#2
.nosupport
CMP R7,#&40
BLT ballattnnocheck
CMP R7,#&C8
ORRGE R8,R8,#8
CMP R7,#&A0
BLT nolightstone
CMP R7,#&BF
BLE lightstone
.nolightstone
LDR R6,[R9,#32]
CMP R6,#2
BGE ballover
.lightstone
BL stoneballcol
BCS ballattnnocheck
LDR R5,[R12,#v.windmax]
CMP R4,R5

BGE ballattnnocheck
STR R4,[R12,#v.windmax]
ADD R5,R12,#v.windbuf
STMIA R5,{R0-R3}
.ballover
LDR R0,[R9,#4]
TST R0,#1<<26
BNE ballattnnocheck
LDRB R0,[R10]
CMP R0,#&80
MOV R0,R10
BGE stonedest
BL blockdest
.ballattnnocheck
MOV R4,R7
LDMFD R13!,{R0-R3,R5-R7,R10,PC}
.stonedest
TST R8,#32
BEQ ballattnnocheck
LDRB R0,[R10]
AND R0,R0,#&F0
CMP R0,#&B0
BLEQ handlemorph
STMFD R13!,{R0-R2}
LDR R0,[R9,#8]
LDR R2,[R12,#v.plxcent]
SUB R0,R0,R2
LDR R1,[R9,#12]
LDR R2,[R12,#v.plycent]
SUB R1,R1,R2
BL chinksound
LDMFD R13!,{R0-R2}
MOV R7,#0
B ballattnnocheck


#set blow=1<<10
#set suck=1<<12
.blowleft
CMP R3,#0
SUBLE R3,R3,#blow
SUBGT R3,R3,#suck
SUB R4,R4,R4,ASR #4
MOV PC,R14
.blowright
CMP R3,#0
ADDGE R3,R3,#blow
ADDLT R3,R3,#suck
SUB R4,R4,R4,ASR #4
MOV PC,R14
.blowup
CMP R4,#0
SUBLE R4,R4,#blow
SUBGT R4,R4,#suck
SUB R3,R3,R3,ASR #4
MOV PC,R14
.blowdown
CMP R4,#0
ADDGE R4,R4,#blow
ADDLT R4,R4,#suck
SUB R3,R3,R3,ASR #4
MOV PC,R14

.slowdown
ADDS R0,R3,R4
RSBMI R0,R0,#0
CMP R0,#1<<8
MOVLT PC,R14
SUB R3,R3,R3,ASR #4
SUB R4,R4,R4,ASR #4
MOV PC,R14

.speedup
ADD R3,R3,R3,ASR #4
ADD R4,R4,R4,ASR #4
MOV PC,R14

.killballattn
LDR R4,[R12,#v.framectr]
TST R4,#1<<3
BLNE scanadd
LDR R3,[R9,#16]
SUB R3,R3,R3,ASR #4
CMP R3,#1<<8
MOVGT R3,#1<<8
CMN R3,#1<<8
MOVLT R3,#-1<<8 
STR R3,[R9,#16]
LDR R3,[R9,#20]
SUB R3,R3,R3,ASR #4
CMP R3,#1<<8
MOVGT R3,#1<<8
CMN R3,#1<<8
MOVLT R3,#-1<<8 
STR R3,[R9,#20]
LDMFD R13!,{R0-R2,PC}

.killball
LDR R3,[R9,#4]
TST R3,#1<<25
BNE killballins
TST R3,#3<<28
BNE notwarped

TST R8,#64
BEQ notwarped
LDR R3,[R12,#v.sparks]
CMP R3,#1
BEQ killblueball
STMFD R13!,{R14}
BL warpball
LDMFD R13!,{R14}
.notwarped
LDR R3,[R9,#0]
BIC R3,R3,#&FF<<16
STR R3,[R9,#0]
LDR R3,[R9,#4]
TST R3,#1<<28
BNE killblueball
BIC R3,R3,#%00010000000
ORR R3,R3,#%01000100000+(1<<30)
STR R3,[R9,#4]
LDR R3,[R9,#16]
MOV R3,R3,ASR #2
STR R3,[R9,#16]
LDR R3,[R9,#20]
MOV R3,R3,ASR #2
STR R3,[R9,#20]
MOV R3,#&09F00018
STR R3,[R9,#24]
BL fallsound
LDMFD R13!,{R0-R2,R14}
ORR R2,R2,#1<<5
BIC R2,R2,#1<<7
MOV PC,R14

.killblueball
BL ballexplode
LDMFD R13!,{R0-R2,PC}

.ballexplode
STMFD R13!,{R0-R2,R14}
LDR R2,[R9,#4]
TST R2,#1<<24
LDMNEFD R13!,{R0-R2,PC}
MOV R0,#&05000000
MOV R1,#%01000110001+(1<<24)
TST R2,#1<<29
ORRNE R1,R1,#1<<29
TST R2,#1<<26
ORRNE R1,R1,#1<<26
STMIA R9,{R0,R1}
MOV R0,#&07000080
STR R0,[R9,#24]
BL objectrange
BL explosound
LDMFD R13!,{R0-R2,PC}

.ballspeedup
LDR R3,[R9,#16]
ADD R3,R3,R3,ASR #4
STR R3,[R9,#16]
LDR R4,[R9,#20]
ADD R4,R4,R4,ASR #4
STR R4,[R9,#20]
MOV PC,R14

.noballs
STMFD R13!,{R14}
LDR R0,[R12,#v.newlevelctr]
CMP R0,#1
LDMGTFD R13!,{PC}
LDR R0,[R12,#v.dead]
ADD R0,R0,#1
STR R0,[R12,#v.dead]
LDR R1,[R12,#v.pllives]
CMP R1,#0
CMPEQ R0,#10
BLEQ gameovermes
LDR R0,[R12,#v.dead]
CMP R0,#1
LDMGTFD R13!,{PC}
LDR R0,[R12,#v.demomode]
CMP R0,#1
LDMEQFD R13!,{PC}
BL deathsound
LDMFD R13!,{PC}

.gameovermes
STMFD R13!,{R14}
ADR R0,gameovertext
BL message
LDMFD R13!,{PC}
.gameovertext
DCD 160<<12,128<<12,0,0,&01000001,0
DCB "GAME OVER",0
ALIGN



.balltimer
STMFD R13!,{R0-R2,R14}
MOV R9,R1
TST R2,#1<<24
LDMNEFD R13!,{R0-R2,PC}
LDR R0,[R9,#4]
TST R0,#1<<28
BNE expblueball
TST R0,#1<<29
MOV R3,#%1000010011011101+(1<<18)
MOVNE R3,#%1000010111011101+(3<<28)+(1<<18)
TST R0,#1<<26
ORRNE R3,R3,#1<<26
STR R3,[R9,#4]
TST R0,#1<<29
MOVNE R3,#&01000001
STRNE R3,[R9,#24]
BL makeballdecor
LDMFD R13!,{R0-R2,PC}
.expblueball
BL ballexplode
LDMFD R13!,{R0-R2,PC}

.blockdest
STMFD R13!,{R8,R14}

LDRB R1,[R0]
TST R1,#hitbit
LDMEQFD R13!,{R8,PC}
CMP R1,#hit1
CMPNE R1,#hit2
BLEQ blocksub
AND R5,R1,#&F0
CMP R5,#&50
CMPNE R5,#&70
BEQ starblockdest
CMP R1,#&4F
MOVEQ R5,#0
STREQ R5,[R12,#v.sparks]
CMP R1,#&4E
MOVEQ R5,#1
STREQ R5,[R12,#v.sparks]
CMP R1,#&4D
MOVEQ R5,#0
STREQ R5,[R12,#v.redball]
CMP R1,#&4C
MOVEQ R5,#1
STREQ R5,[R12,#v.redball]
MOV R1,#0
STRB R1,[R0]

STMFD R13!,{R0-R2}
BL backtranslate
MOV R3,R0
MOV R4,R1
BL addglint
BL addglint
LDR R2,[R12,#v.plxcent]
SUB R0,R0,R2
LDR R2,[R12,#v.plycent]
SUB R1,R1,R2
BL weirdsound
LDMFD R13!,{R0-R2}
LDR R1,[R12,#v.plscore]
ADD R1,R1,#10
STR R1,[R12,#v.plscore]
LDMFD R13!,{R8,PC}

.starblockdest
LDRB R5,[R0]
MOV R1,#0
STRB R1,[R0]
BL backtranslate
MOV R3,R0
MOV R4,R1
BL starmake
LDR R0,[R12,#v.plxcent]
SUB R0,R3,R0
LDR R1,[R12,#v.plycent]
SUB R1,R4,R1
BL bonussound
LDR R1,[R12,#v.plscore]
ADD R1,R1,#100
STR R1,[R12,#v.plscore]
LDMFD R13!,{R8,PC}

.blocksub
STMFD R13!,{R0,R14}
LDR R0,[R12,#v.blocksleft]
SUB R0,R0,#1
STR R0,[R12,#v.blocksleft]
BL writeblocksleft
LDMFD R13!,{R0,PC}

.dosecret
STMFD R13!,{R0-R11,R14}
MOV R0,#&A0

CMP R7,#&AF
MOVEQ R0,#0
CMP R7,#&AB
MOVEQ R0,#3
STRB R0,[R10]
CMP R7,#&AB
MOVEQ R0,#0
STREQ R0,[R12,#v.scanlock]
BL secretsound
LDR R9,[R12,#v.levelnet]
LDR R0,[R9,#net.xsize]
LDR R1,[R9,#net.ysize]
MUL R0,R1,R0
ADD R9,R9,#net.data
ADD R8,R9,R0
.loop86
LDRB R0,[R9]
CMP R0,#&11
CMPNE R0,#&12
CMPNE R0,#&13
CMPEQ R7,#&AC
BLEQ secretAC
CMP R0,#&A1
BLT notsec
CMP R0,#&B0
BGE notsec
CMP R7,#&AB
BLEQ secretAB
CMP R7,#&AC
BLEQ secretAC
CMP R7,#&AD
BLEQ secretAD
CMP R7,#&AE
BLEQ secretAE
.notsec

ADD R9,R9,#1
CMP R9,R8
BLT loop86
MOV R0,R10
BL backtranslate
MOV R3,R0
MOV R4,R1
MOV R9,#10
.loop87
BL addglint
SUBS R9,R9,#1
BGT loop87
LDMFD R13!,{R0-R11,PC}

.secretAB
CMP R0,#&AB
MOVEQ R1,#3
STREQB R1,[R9]
MOV PC,R14

.secretAC
CMP R0,#&AC
MOVEQ R1,#&A0
STREQB R1,[R9]
CMP R0,#&11
MOVEQ R1,#0
STREQB R1,[R9]
CMP R0,#&12
MOVEQ R1,#&80
STREQB R1,[R9]
CMP R0,#&13
MOVEQ R1,#&A0
STREQB R1,[R9]
CMP R0,#&A1
MOVEQ R1,#hellno
STREQB R1,[R9]
CMP R0,#&A2
MOVEQ R1,#0
STREQB R1,[R9]
CMP R0,#&A3
MOVEQ R1,#&80
STREQB R1,[R9]
B secretexit
.secretAD
CMP R0,#&AD
MOVEQ R1,#&A0
STREQB R1,[R9]
CMP R0,#&A4
MOVEQ R1,#4
STREQB R1,[R9]
CMP R0,#&A5
MOVEQ R1,#7
STREQB R1,[R9]
CMP R0,#&A6
MOVEQ R1,#&4F
STREQB R1,[R9]
CMP R0,#&A7
MOVEQ R1,#&71
STREQB R1,[R9]
B secretexit
.secretAE
CMP R0,#&AE
MOVEQ R1,#&A0
STREQB R1,[R9]
CMP R0,#&A8
MOVEQ R1,#&1C
STREQB R1,[R9]
CMP R0,#&A9
MOVEQ R1,#&1E
STREQB R1,[R9]
CMP R0,#&AA
MOVEQ R1,#&1F
STREQB R1,[R9]
B secretexit
.secretexit
MOV PC,R14

.nukeballs
STMFD R13!,{R0-R11,R14}
MOV R0,#ballstab
MOV R1,#2
MOV R2,#0
MOV R3,#0
MOV R4,#0
SWI Amnesia_SelectTable
.loop7a
SWI Amnesia_ProcessTable
CMP R2,#0
BEQ nukeballsend
STMFD R13!,{R0-R4}
MOV R9,R1
BL ballexplode
LDMFD R13!,{R0-R4}
B loop7a

.nukeballsend
LDMFD R13!,{R0-R11,PC}

.batexplode
STMFD R13!,{R0-R1,R14}
MOV R3,#20
.batexloop
STMFD R13!,{R3}
LDR R3,[R12,#v.xpos]
LDR R4,[R12,#v.ypos]
BL random
AND R0,R0,#&7FFFF
SUB R0,R0,#&3FFFF
ADD R3,R3,R0
BL random
AND R0,R0,#&1FFFF
SUB R0,R0,#&FFFF
ADD R4,R4,R0
MOV R7,#&07000020
BL random
AND R0,R0,#&3F
ADD R7,R7,R0
MOV R0,#decortab
MOV R1,#&05000000
MOV R2,#%11000110001+(1<<24)
SWI Amnesia_MakeObject
LDMFD R13!,{R3}
SUBS R3,R3,#1
BPL batexloop

LDMFD R13!,{R0-R1,PC}

.hellexpand
STMFD R13!,{R0-R11,R14}
LDR R11,[R12,#v.levelnet]
LDR R3,[R11,#net.xsize]
LDR R4,[R11,#net.ysize]
LDR R5,[R11,#net.xsize]
ADD R10,R11,#net.data
ADD R10,R10,R3
SUB R4,R4,#2
.heloop1
ADD R10,R10,#1
LDR R3,[R11,#net.xsize]
SUB R3,R3,#2
.heloop2
LDRB R0,[R10]
CMP R0,#&10
BNE nothe
LDRB R0,[R10,-R5]
CMP R0,#&2F
BEQ hefound
LDRB R0,[R10,#-1]
CMP R0,#&2F
BEQ hefound
LDRB R0,[R10,#1]
CMP R0,#&2F
BEQ hefound
LDRB R0,[R10,R5]
CMP R0,#&2F
BEQ hefound
.nothe
ADD R10,R10,#1
SUBS R3,R3,#1
BGT heloop2
ADD R10,R10,#1
SUBS R4,R4,#1
BGT heloop1
LDMFD R13!,{R0-R11,PC}
.hefound
MOV R0,#&2F
STRB R0,[R10]
B nothe


.writeblocksleft
STMFD R13!,{R0-R2,R14}
LDR R0,[R12,#v.blocksleft]
CMP R0,#0
MOVLT R0,#0
ADR R1,blocksleftinj
MOV R2,#8
SWI XOS_ConvertCardinal2
LDMFD R13!,{R0-R2,PC}

.blockslefttext
DCD 64<<12,232<<12,0,0,&400000,0
.blocksleftinj
DBB 8
DCB 0
ALIGN

.writetimeleft
STMFD R13!,{R0-R2,R14}
LDR R1,[R12,#v.warptime]
MOV R2,#50
MYDIV R0,R1,R2
CMP R0,#0
MOVLT R0,#0
ADR R1,timeleftinj
MOV R2,#8
SWI XOS_ConvertCardinal2
LDMFD R13!,{R0-R2,PC}

.timelefttext
DCD 64<<12,232<<12,0,0,&400000,0
.timeleftinj
DBB 8
DCB 0
ALIGN



.handlemorph
STMFD R13!,{R0-R10,R14}
MOV R3,#0
MOV R4,#0
LDRB R7,[R10]
AND R0,R7,#&3
CMP R0,#0
MOVEQ R3,#-1
CMP R0,#1
MOVEQ R3,#1
CMP R0,#2
MOVEQ R4,#-1
CMP R0,#3
MOVEQ R4,#1
MOV R0,R10
BL backtranslate
STMFD R13!,{R0-R1,R3-R4}

.findlimits
MOV R2,#&40
CMP R7,#&BC
MOVGE R2,#&90
CMP R3,#0
BEQ findvertlimits
.findhorizlimits
MOV R5,R0
MOV R6,R0
MOV R4,#256
MOV R1,R10
.loop58
LDRB R0,[R1,#-1]!
CMP R0,R2
BGE foundhoriz1
SUB R5,R5,#96<<12
SUBS R4,R4,#1
BGT loop58 
.foundhoriz1
MOV R4,#256
MOV R1,R10
.loop59
LDRB R0,[R1,#1]!
CMP R0,R2
BGE foundhoriz2
ADD R6,R6,#96<<12
SUBS R4,R4,#1
BGT loop59 
.foundhoriz2
B findlimitsend

.findvertlimits
MOV R5,R1
MOV R6,R1
LDR R3,[R12,#v.levelnet]
LDR R3,[R3,#net.xsize]
MOV R4,#256
MOV R1,R10
.loop5a
LDRB R0,[R1,-R3]!
CMP R0,R2
BGE foundvert1
SUB R5,R5,#96<<12
SUBS R4,R4,#1
BGT loop5a 
.foundvert1
MOV R4,#256
MOV R1,R10
.loop5b
LDRB R0,[R1,R3]!
CMP R0,R2
BGE foundvert2
ADD R6,R6,#96<<12
SUBS R4,R4,#1
BGT loop5b 
.foundvert2
.findlimitsend

LDMFD R13!,{R0-R3}
STMFD R13!,{R5-R6}
MOV R6,R3
MOV R5,R2
MOV R4,R1
MOV R3,R0

MOV R0,#blockstab
MOV R1,#(blockstab<<24)+0
MOV R2,#%1001000010110010101
CMP R5,#0
ORREQ R2,R2,#1<<24
LDRB R7,[R10]
CMP R7,#&B4
ORRGE R2,R2,#1<<25
MOV R5,R5,ASL #13
MOV R6,R6,ASL #13
MOV R7,#0
MOV R8,#&005E005E
SWI Amnesia_MakeObject
LDMFD R13!,{R5-R6}
CMP R1,#0
BEQ morphfailed
STR R5,[R1,#32]
STR R6,[R1,#36]
LDRB R1,[R10]
MOV R0,#&10
CMP R1,#&B0
CMPNE R1,#&B2
MOVEQ R0,#0
CMP R1,#&B1
CMPNE R1,#&B3
MOVEQ R0,#&80
CMP R1,#&B8
MOVGE R0,#&0
CMP R1,#&BC
MOVGE R0,#&80
STRB R0,[R10]
.morphfailed
LDMFD R13!,{R0-R10,PC}


.warpball
STMFD R13!,{R0-R5,R14}
LDR R3,[R12,#v.warped]
MOV R5,R3
LDR R4,[R12,#v.balladr]
LDRB R4,[R4]
CMP R4,#&1C
MOVEQ R4,#1
CMP R4,#&1D
MOVEQ R4,#2
CMP R4,#&1E
MOVEQ R4,#4
CMP R4,#&1F
MOVEQ R4,#8
CMP R4,#8
MOVGT R4,#1
CMP R4,#0
MOVLE R4,#1
ADD R3,R3,R4,LSL #16

ADD R3,R3,#1
STR R3,[R12,#v.warped]
LDR R3,[R12,#v.levelno]
TST R3,#&400
BLNE warpexitmes
LDR R3,[R12,#v.levelno]
TST R3,#&400
BLEQ warpedmes
LDR R0,[R12,#v.levelnet]
LDR R0,[R0,#net.backdrop]
TST R0,#1<<30
LDMEQFD R13!,{R0-R5,PC}
LDR R0,[R12,#v.warped]
AND R0,R0,#&FF
CMP R0,#20
BLGE noblocks
LDMFD R13!,{R0-R5,PC}
.warpedmes
STMFD R13!,{R3,R14}
AND R0,R4,#&FF
ADR R1,warpballadr2       
MOV R2,#8
SWI XOS_ConvertCardinal2
LDR R3,[R12,#v.warped]
AND R0,R3,#&FF
ADR R1,warpballadr1       
MOV R2,#8
SWI XOS_ConvertCardinal2

ADR R0,warpballmes
BL message
ADR R0,warpballmes2
BL message
LDMFD R13!,{R3,PC}

.warpexitmes
STMFD R13!,{R3,R14}
LDR R3,[R12,#v.warped]
AND R3,R3,#&FF
MOV R0,R3
ADR R1,warpballadr       
MOV R2,#8
SWI XOS_ConvertCardinal2
CMP R5,#0
ADR R0,warpexittext2
ADREQ R0,warpexittext
BL message
CMP R5,#0
BLEQ message
ADR R0,warpballnum
BL message
LDMFD R13!,{R3,PC}

.warpballmes
DCD 160<<12,20<<12,0,0,&600001,0
DCB "BALLS WARPED ="
.warpballadr1
DBB 8
DCB 0
ALIGN
.warpballmes2
DCD 160<<12,40<<12,0,0,&600001,0
DCB "MULTIPLIER = "
.warpballadr2
DBB 8
DCB 0
ALIGN

.warpexittext
DCD 160<<12,20<<12,0,0,&600001,0
DCB "BALLS RETURNED",0
ALIGN
DCD 160<<12,40<<12,0,0,&600001,0
DCB "TO LEVEL",0
ALIGN
.warpexittext2
DCD 160<<12,40<<12,0,0,&600001,0
DCB "TOTAL RETURNED",0
ALIGN
.warpballnum
DCD 160<<12,60<<12,0,0,&600001,0
.warpballadr
DBB 8
DCB 0
ALIGN


.colchblocks
STMFD R13!,{R14}
MOV R0,#blockstab
MOV R1,#blockstab
.loop54
SWI Amnesia_CollisionCheck
CMP R0,#0
LDMEQFD R13!,{PC}
LDR R4,[R0,#4]
LDR R5,[R1,#4]
TST R4,#1<<20
TSTEQ R5,#1<<20
BNE loop54
LDR R4,[R0,#16]
RSB R4,R4,#0
STR R4,[R0,#16]
LDR R4,[R1,#16]
RSB R4,R4,#0
STR R4,[R1,#16]
LDR R4,[R0,#20]
RSB R4,R4,#0
STR R4,[R0,#20]
LDR R4,[R1,#20]
RSB R4,R4,#0
STR R4,[R1,#20]
B loop54

.colchblockball
STMFD R13!,{R14}

MOV R0,#blockstab
MOV R1,#ballstab
.loopo
SWI Amnesia_CollisionCheck
CMP R0,#0
LDMEQFD R13!,{PC}
STMFD R13!,{R0-R3}
MOV R8,R0
MOV R9,R1
BL blockballcol
BCS ballblocknohit
LDR R0,[R8,#8]
LDR R2,[R12,#v.plxcent]
SUB R0,R0,R2
LDR R1,[R8,#12]
LDR R2,[R12,#v.plycent]
SUB R1,R1,R2
BL chinksound
.ballblocknohit
LDMFD R13!,{R0-R3}
B loopo


.stoneballcol
STMFD R13!,{R14}
MOV R5,#96<<12
MUL R4,R2,R5
MUL R5,R3,R5
MOV R6,#0
MOV R7,#0
STMFD R13!,{R4-R7}

ADD R14,R9,#8
LDMIA R14,{R0-R3}
SUB R0,R0,R4
SUB R1,R1,R5
SUB R2,R2,R6
SUB R3,R3,R7

MOV R4,#96
MOV R5,#96
LDR R6,[R9,#28]
MOV R6,R6,LSR #16
STMFD R13!,{R4-R6}
BL blockwindback
STR R4,[R12,#v.temp1]
CMP R4,#&1FC
LDMFD R13!,{R4-R6}
BGT stoneblockmiss
STMFD R13!,{R0-R1}
MOV R6,#0
MOV R7,#0
CMP R0,R4,ASL #11
SUBGE R6,R0,R4,ASL #11
CMN R0,R4,ASL #11
ADDLT R6,R0,R4,ASL #11
CMP R1,R5,ASL #11
SUBGE R7,R1,R5,ASL #11
CMN R1,R5,ASL #11
ADDLT R7,R1,R5,ASL #11
TST R8,#8
BLNE hitsteps
TST R8,#8
LDMNEFD R13!,{R0-R1}
BNE stoneblockmiss
MOV R0,R6
MOV R1,R7
CMP R0,#0
CMPEQ R1,#0
LDMEQFD R13!,{R0-R1}
BEQ whackprocess
LDR R2,[R9,#16]
LDR R3,[R9,#20]
BL vecreflect
LDMFD R13!,{R0-R1}
BCS stoneblockmiss
.whackins
ORR R8,R8,#32
STMFD R13!,{R4,R5}
LDR R4,[R9,#16]
LDR R5,[R9,#20]
SUBS R4,R4,R2
RSBMI R4,R4,#0
SUBS R5,R5,R3
RSBMI R5,R5,#0
ADD R4,R4,R5
MOV R4,R4,LSR #6
STR R4,[R12,#v.colpitch]
LDMFD R13!,{R4,R5}

LDR R5,[R9,#4]; set the collided flags
CMP R2,#0
ORRGT R5,R5,#1<<20
ORRLT R5,R5,#1<<21
CMP R3,#0
ORRGT R5,R5,#1<<22
ORRLT R5,R5,#1<<23
STR R5,[R9,#4]
LDMFD R13!,{R4-R7}
ADD R0,R0,R4
ADD R1,R1,R5
ADD R2,R2,R6
ADD R3,R3,R7
LDR R4,[R12,#v.temp1]
LDMFD R13!,{R14}
BIC R14,R14,#1<<29
MOVS PC,R14
.stoneblockmiss
LDMFD R13!,{R4-R7}
LDMFD R13!,{R14}
ORR R14,R14,#1<<29
MOVS PC,R14

.whackprocess
BL ballexplode
B whackins

.hitsteps
STMFD R13!,{R0,R14}
LDR R0,[R9,#32]
CMP R0,#0
LDMGTFD R13!,{R0,PC}
LDRB R0,[R10]
CMP R0,#&C8
BEQ stepsleft
CMP R0,#&C9
BEQ stepsright
CMP R0,#&CA
BEQ stepsup
CMP R0,#&CB
BEQ stepsdown
B stepsbounce
.stepsdown
CMP R7,#0
BLE stepsbounce
B stepmount
.stepsup
CMP R7,#0
BGE stepsbounce
B stepmount
.stepsright
CMP R6,#0
BLE stepsbounce
B stepmount
.stepsleft
CMP R6,#0
BGE stepsbounce
B stepmount
.stepsbounce
CMP R6,#0
CMPEQ R7,#0
BICNE R8,R8,#8
LDMFD R13!,{R0,PC}
.stepmount
LDMFD R13!,{R0,PC}


.blockballcol
STMFD R13!,{R14}

ADD R14,R8,#8
LDMIA R14,{R4-R7}
LDR R0,[R8,#4]
TST R0,#4

LDR R0,[R9,#8]
LDR R1,[R9,#12]
LDR R2,[R9,#36]
LDR R3,[R9,#40]
SUB R2,R0,R2 ;get historical velocity
SUB R3,R1,R3
SUB R0,R0,R4
SUB R1,R1,R5
SUBNE R2,R2,R6
SUBNE R3,R3,R7

LDR R4,[R8,#28];block size
AND R5,R4,#&FFFF;block y size
MOV R4,R4,LSR #16;block x size
LDR R6,[R9,#28]
MOV R6,R6,LSR #16
STMFD R13!,{R4-R6}
BL blockwindback
STR R4,[R12,#v.temp2]
CMP R4,#&1FC
LDMFD R13!,{R4-R6}
BGT ballblockmiss
STMFD R13!,{R0-R1}
MOV R6,#0
MOV R7,#0
CMP R0,R4,ASL #11
SUBGE R6,R0,R4,ASL #11
CMN R0,R4,ASL #11
ADDLT R6,R0,R4,ASL #11
CMP R1,R5,ASL #11
SUBGE R7,R1,R5,ASL #11
CMN R1,R5,ASL #11
ADDLT R7,R1,R5,ASL #11
MOV R0,R6
MOV R1,R7
CMP R0,#0
CMPEQ R1,#0
LDMEQFD R13!,{R0-R1}
BEQ blockwhack
LDR R2,[R8,#4]
TST R2,#4
LDR R2,[R9,#16]
LDR R14,[R8,#16]
SUBNE R2,R2,R14
LDR R3,[R9,#20]
LDR R14,[R8,#20]
SUBNE R3,R3,R14
BL vecreflect
LDMFD R13!,{R0-R1}
BCS ballblockmiss
.blockwhackins
STMFD R13!,{R4,R5}
LDR R4,[R9,#16]
LDR R5,[R9,#20]
SUBS R4,R4,R2
RSBMI R4,R4,#0
SUBS R5,R5,R3
RSBMI R5,R5,#0
ADD R4,R4,R5
MOV R4,R4,LSR #6
STR R4,[R12,#v.colpitch]
LDMFD R13!,{R4,R5}
LDR R5,[R9,#4]; set the collided flags
CMP R2,#0
ORRGT R5,R5,#1<<20
ORRLT R5,R5,#1<<21
CMP R3,#0
ORRGT R5,R5,#1<<22
ORRLT R5,R5,#1<<23
STR R5,[R9,#4]
ADD R14,R8,#8
LDMIA R14,{R4-R7}
LDR R14,[R8,#4]
TST R14,#4
ADD R0,R0,R4
ADD R1,R1,R5
ADDNE R2,R2,R6
ADDNE R3,R3,R7
BL limitballspeed
ADD R14,R9,#8
STMIA R14,{R0-R3}
LDR R4,[R8,#4]
ORR R4,R4,#4
STR R4,[R8,#4]
LDR R4,[R12,#v.temp2]
LDMFD R13!,{R14}
BIC R14,R14,#1<<29
MOVS PC,R14
.ballblockmiss
LDMFD R13!,{R14}
ORR R14,R14,#1<<29
MOVS PC,R14

.blockwhack
BL ballexplode
B blockwhackins


.blocktostar
STMFD R13!,{R0-R8,R14}
LDR R3,[R8,#8]
LDR R4,[R8,#12]
BL starmake
LDMFD R13!,{R0-R8,PC}

.colchbatball
STMFD R13!,{R14}

MOV R0,#batstab
MOV R1,#ballstab
.loopl
SWI Amnesia_CollisionCheck
CMP R0,#0
LDMEQFD R13!,{PC}
STMFD R13!,{R0-R3}
MOV R8,R0
MOV R9,R1
BL batballcol
CMP R4,#255
BGE nobatballcol
LDR R0,[R9,#4]
TST R0,#1<<26
BLNE destroybat
STMFD R13!,{R0-R1}
BL objectrange
BL cracksound
LDMFD R13!,{R0-R1}
.nobatballcol
LDMFD R13!,{R0-R3}
B loopl

.destroybat
STMFD R13!,{R9,R14}
MOV R0,#0
STR R0,[R8,#0]
BL batexplode

BL deathsound
LDR R0,[R12,#v.pllives]
CMP R0,#0
BLEQ gameovermes
LDMFD R13!,{R9,PC}


.batballcol
STMFD R13!,{R0-R3,R14}
LDR R0,[R9,#8]
LDR R1,[R9,#12]
LDR R2,[R9,#16]
LDR R3,[R9,#20]
LDR R4,[R12,#v.xpos]
LDR R5,[R12,#v.ypos]
LDR R6,[R12,#v.xvec]
LDR R7,[R12,#v.yvec]
SUB R0,R0,R4
SUB R1,R1,R5
SUB R2,R2,R6
SUB R3,R3,R7
STMFD R13!,{R4-R7}
MOV R4,#batwidth
MOV R5,#batheight
MOV R6,#ballsize
STMFD R13!,{R2-R3}
BL windback
LDMFD R13!,{R2-R3}
MOV R10,R4
CMP R10,#255
BEQ batballmiss

STMFD R13!,{R0-R1}
MOV R4,#(batwidth-batheight)<<11
MOV R5,#0
CMP R0,R4
SUBGE R5,R0,R4
CMN R0,R4
ADDLT R5,R0,R4
MOV R0,R5

; Solving x=x-2(xu+yv)u/(u^2+v^2)
;
;R0=u
;R1=v
;R2=x
;R3=y

BL vecreflect
LDMFD R13!,{R0-R1}
MOVCS R10,#255
BCS batballmiss
STMFD R13!,{R4,R5}
LDR R4,[R9,#16]
SUBS R4,R4,R2
RSBMI R4,R4,#0
LDR R5,[R9,#20]
SUBS R5,R5,R3
RSBMI R5,R5,#0
ADD R4,R4,R5
MOV R4,R4,LSR #9
RSBS R4,R4,#&6F
MOVMI R4,#0
STR R4,[R12,#v.colpitch]
LDMFD R13!,{R4,R5}


.batballmiss

LDMFD R13!,{R4-R7}
CMP R10,#255
BEQ batballmiss2

ADD R0,R0,R4
ADD R1,R1,R5
ADD R2,R2,R6
ADD R3,R3,R7
; double collision checks
LDR R5,[R12,#v.magnet]
CMP R5,#0
BNE skipprobs
LDR R5,[R12,#v.bastmode]
CMP R5,#0
BNE skipprobs
LDR R5,[R9,#4]
TST R5,#1<<20; left bit
BEQ noleftprobs
CMP R2,#0
LDRLT R0,[R9,#8]
MOVLT R2,#0
.noleftprobs
TST R5,#1<<21; right bit
BEQ norightprobs
CMP R2,#0
LDRGT R0,[R9,#8]
MOVGT R2,#0
.norightprobs
TST R5,#1<<22; up bit
BEQ noupprobs
CMP R3,#0
LDRLT R1,[R9,#12]
MOVLT R3,#0
.noupprobs
TST R5,#1<<23; down bit
BEQ nodownprobs
CMP R3,#0
LDRGT R1,[R9,#12]
MOVGT R3,#0
.skipprobs
.nodownprobs

;STR R0,[R9,#8]
;STR R1,[R9,#12]
STR R2,[R9,#16]
STR R3,[R9,#20]
.batballmiss2

MOV R4,R10
LDMFD R13!,{R0-R3,PC}

.vecreflect
STMFD R13!,{R4-R7}
MOV R0,R0,ASR #4
MOV R1,R1,ASR #4
;MOV R2,R2,ASR #4
;MOV R3,R3,ASR #4

;R0=u bp 8
;R1=v bp 8
;R2=x bp 8
;R3=y bp 8
MUL R4,R0,R2
MUL R5,R1,R3
ADDS R5,R4,R5
BPL vecrefmiss
;R5=(xu+yv) bin pt 20
MOV R7,R0
MUL R7,R0,R7
MOV R6,R1
MUL R6,R1,R6
ADD R6,R6,R7; R6 = (u^2+v^2) bin pt 16
MOVS R6,R6,ASR #8; bin pt 8
BEQ vecrefdiv0
MYDIV R4,R5,R6
CMP R4,#&70000000
MOVGT PC,#0
CMN R4,#&70000000
MOVLT PC,#0
;R4=(xu+yv)/(u^2+v^2) bin pt 12
;Now do -2(R4)u
MUL R5,R4,R0; bin pt 20
SUB R2,R2,R5,ASR #7; 2*R2 bin pt 12
MUL R5,R4,R1
SUB R3,R3,R5,ASR #7
BIC R14,R14,#1<<29; clear carry
.vecrefins
MOV R0,R0,ASL #4
MOV R1,R1,ASL #4
;MOV R2,R2,ASL #4
;MOV R3,R3,ASL #4
LDMFD R13!,{R4-R7}
MOVS PC,R14
.vecrefmiss
.vecrefdiv0
ORR R14,R14,#1<<29
B vecrefins


.colchbatstars
STMFD R13!,{R14}

MOV R0,#batstab
MOV R1,#starstab
.loopu
SWI Amnesia_CollisionCheck
CMP R0,#0
LDMEQFD R13!,{PC}
BL goodyget
B loopu

.goodyget
STMFD R13!,{R0-R3,R14}
MOV R8,R0
MOV R9,R1

LDR R7,[R9,#32]
AND R0,R7,#&F0
CMP R0,#&50
BEQ goodystore
MOV R0,#0
STR R0,[R9,#0]

LDR R0,[R9,#32]
AND R0,R0,#&F
MOV R1,R9
BL goodyuse
BL goodyuseeffect
.goodygetend
ADD R6,R12,#v.goodytab
#rept 4
LDR R0,[R6],#4
CMP R0,#11
BEQ radarok
#endr
MOV R0,#0
STR R0,[R12,#v.lineradar]
.radarok
BL objectrange
BL goodysound
LDMFD R13!,{R0-R3,PC}

.goodystore
ADD R6,R12,#v.goodytab
LDR R0,[R6]
CMP R0,#0
BEQ thisgoody
ADD R6,R6,#4
LDR R0,[R6]
CMP R0,#0
BEQ thisgoody
ADD R6,R6,#4
LDR R0,[R6]
CMP R0,#0
BEQ thisgoody
ADD R6,R6,#4
LDR R0,[R6]
CMP R0,#0
BEQ thisgoody
ADD R6,R12,#v.goodytab
LDR R0,[R12,#v.goodycsr]
AND R0,R0,#3
ADD R6,R6,R0,LSL #2
.thisgoody
MOV R1,R6
LDR R0,[R9,#32]
AND R0,R0,#&F
STR R0,[R6]
CMP R0,#11
MOVEQ R0,#1
STREQ R0,[R12,#v.lineradar]
MOV R0,#0
STR R0,[R9,#0]
BL goodystoreeffect
B goodygetend


.makebat
STMFD R13!,{R14}
MOV R0,#batstab
SWI Amnesia_WipeTable
MOV R0,#batstab
MOV R1,#&01000000
MOV R2,#%10011010001+(1<<18)
MOV R3,#128<<12
MOV R4,#128<<12
MOV R5,#0
MOV R6,#0
MOV R7,#0
MOV R8,#0
SWI Amnesia_MakeObject
BL homebat
LDMFD R13!,{PC}

.decormake
STMFD R13!,{R14}
BL random
AND R1,R0,#3
BL random
AND R0,R0,#&7FF000
SUB R0,R0,#&400000
MOV R3,R0
BL random
AND R0,R0,#&7FF000
SUB R0,R0,#&400000
MOV R4,R0
BL decorate
LDMFD R13!,{PC}

.balldecor
STMFD R13!,{R1-R8,R14}
LDR R3,[R9,#8]
LDR R4,[R9,#12]
LDR R5,[R9,#28]
AND R6,R5,#&FFFF
MOV R5,R5,LSR #16
TST R0,#2
SUBNE R3,R3,R5,LSL #11
TST R0,#1
ADDNE R3,R3,R5,LSL #11
TST R0,#8
SUBNE R4,R4,R6,LSL #11
TST R0,#4
ADDNE R4,R4,R6,LSL #11
MOV R1,#2
BL decorate
LDMFD R13!,{R1-R8,PC}


.decorate               ;R1 decor type
			;R3,R4 coords
STMFD R13!,{R5-R8,R14}
MOV R2,#%1000001001110001
MOV R5,#0
MOV R6,#0
MOV R7,#&10000080
CMP R1,#2
MOV R7,#&03000080
MOV R8,#0
MOV R0,#decortab
ADD R1,R1,#(decortab)<<24
SWI Amnesia_MakeObject
LDMFD R13!,{R5-R8,PC}

.vdecorate               ;R1 decor type
			;R3,R4 coords
STMFD R13!,{R5-R8,R14}
MOV R2,#%1000000100110101
MOV R7,#&10000080
CMP R1,#2
MOVEQ R7,#&03000080
MOV R8,#0
MOV R0,#decortab
ADD R1,R1,#(decortab)<<24
SWI Amnesia_MakeObject
LDMFD R13!,{R5-R8,PC}

.gdecorate               ;R1 decor type
			;R3,R4 coords
STMFD R13!,{R5-R8,R14}
MOV R2,#%1000000100010101
MOV R7,#&10000080
MOV R8,#0
MOV R0,#decortab
ORR R1,R1,#(goodytab)<<24
SWI Amnesia_MakeObject
LDMFD R13!,{R5-R8,PC}



.bateffects
STMFD R13!,{R14}
LDR R0,[R12,#v.ballfire]
SUBS R0,R0,#1
STRPL R0,[R12,#v.ballfire]
LDR R0,[R12,#v.blueball]
SUBS R0,R0,#1
STRPL R0,[R12,#v.blueball]
LDR R0,[R12,#v.bastard]
SUBS R0,R0,#1
STRPL R0,[R12,#v.bastard]
CMP R0,#0
LDR R1,[R12,#v.ballspeed]
MOVGT R1,R1,ASL #1
CMP R1,#31<<12
MOVGT R1,#31<<12
STR R1,[R12,#v.ballspeedlim]
CMP R0,#0
LDR R1,[R12,#v.mousespeed]
ADDGT R1,R1,#1
STR R1,[R12,#v.mousesens]


LDR R0,[R12,#v.lineradar]
CMP R0,#1
BLGE lineradardecor
LDR R0,[R12,#v.framectr]
LDR R1,[R12,#v.bateffect]
SUBS R1,R0,R1
BMI dobateffect
CMP R1,#4
LDMLTFD R13!,{PC}
.dobateffect
STR R0,[R12,#v.bateffect]
LDR R3,[R12,#v.xpos]
LDR R4,[R12,#v.ypos]
LDR R0,[R12,#v.magnet]
CMP R0,#0
MOV R1,#2+(goodytab<<24)
BLGT batmagnetdecor
LDMFD R13!,{PC}

.batmagnetdecor
STMFD R13!,{R3-R4,R14}
BL random
AND R0,R0,#&7FF0
SUB R0,R0,#&4000
MOV R5,R0
BL random
AND R0,R0,#&7FF0
SUB R0,R0,#&4000
MOV R6,R0
STMFD R13!,{R5,R6}
LDR R0,[R12,#v.xvec]
ADD R5,R5,R0
LDR R0,[R12,#v.yvec]
ADD R6,R6,R0
MOV R2,#%1000000100010101+(1<<24)
MOV R7,#&03000010
MOV R8,#0
MOV R0,#decortab

SWI Amnesia_MakeObject
LDMFD R13!,{R5,R6}
RSB R5,R5,#0
RSB R6,R6,#0
MOV R5,R5,ASR #4
MOV R6,R6,ASR #4
STR R5,[R1,#32]
STR R6,[R1,#36]
LDMFD R13!,{R3-R4,PC}

.lineradardecor
STMFD R13!,{R14}
LDR R9,[R12,#v.framectr]
MOV R9,R9,ASR #2
LDR R3,[R12,#v.xpos]
LDR R4,[R12,#v.ypos]
LDR R5,[R12,#v.ballxpos]
LDR R6,[R12,#v.ballypos]
SUB R5,R5,R3
SUB R6,R6,R4
MOVS R0,R5
RSBMI R0,R5,#0
MOVS R1,R6
RSBMI R1,R6,#0
ADD R0,R0,R1
CMP R0,#128<<12
BLT lineradardecorend
MOV R5,R5,ASR #6
MOV R6,R6,ASR #6
#rept 8
ADD R3,R3,R5
ADD R4,R4,R6
BL radarobject
#endr
.lineradardecorend
LDMFD R13!,{PC}

.radarobject
STMFD R13!,{R3-R6,R14}
MOV R0,#decortab
MOV R1,#(decortab<<24)+1
AND R9,R9,#&F
ADD R1,R1,R9,LSL #16
ADD R9,R9,#1
MOV R2,#%1000001000010101
MOV R5,#0
MOV R6,#0
MOV R7,#&00010001
MOV R8,#0
SWI Amnesia_MakeObject
LDMFD R13!,{R3-R6,PC}



.makeball
STMFD R13!,{R14}
MOV R0,#0
STR R0,[R12,#v.dead]
MOV R1,#&03000000
MOV R2,#%10100000000+(1<<25)+(1<<18)
BL random
AND R5,R0,#&FFFF
SUB R5,R5,#&7FFF
BL random
AND R6,R0,#&7FFF
SUB R6,R6,#&9FFF
LDR R7,[R12,#v.demomode]
CMP R7,#1
CMPNE R7,#2
MOVEQ R5,#2<<12
MOVEQ R6,#2<<12
MOV R7,#&01000010
MOV R8,#&00200020
MOV R0,#ballstab
SWI Amnesia_MakeObject
MOV R0,#2
STR R0,[R1,#32]
LDMFD R13!,{PC}

.makeblueball
STMFD R13!,{R14}
MOV R1,#&03000001
MOV R2,#%10100000000+(1<<25)+(1<<29)+(1<<18)
BL random
AND R5,R0,#&3FFFF
SUB R5,R5,#&20000
BL random
AND R6,R0,#&3FFFF
SUB R6,R6,#&20000
MOV R7,#&01000010
MOV R8,#&00200020
MOV R0,#ballstab
SWI Amnesia_MakeObject
MOV R0,#2
STR R0,[R1,#32]
LDMFD R13!,{PC}

.makeredball
STMFD R13!,{R14}
MOV R1,#&03000002
MOV R2,#%10100000000+(1<<25)+(1<<26)+(1<<29)+(1<<18)
BL random
AND R5,R0,#&3FFFF
SUB R5,R5,#&20000
BL random
AND R6,R0,#&3FFFF
SUB R6,R6,#&20000
MOV R7,#&01000010
MOV R8,#&00200020
MOV R0,#ballstab
SWI Amnesia_MakeObject
MOV R0,#2
STR R0,[R1,#32]
LDMFD R13!,{PC}

.makeballdecor
STMFD R13!,{R14}
LDR R3,[R1,#8]
LDR R4,[R1,#12]
MOV R1,#1
MOV R2,#16
ADR R11,circletab
.loopt
STMFD R13!,{R1-R4,R11}
LDMIA R11,{R5,R6}
MOV R5,R5,ASR #16
MOV R6,R6,ASR #16
BL vdecorate
LDMFD R13!,{R1-R4,R11}
ADD R11,R11,#128
SUBS R2,R2,#1
BGT loopt
LDMFD R13!,{PC}

.makeblock
STMFD R13!,{R14}
MOV R1,#(blockstab<<24)+0
MOV R2,#%1000010111010101+(1<<18)
MOV R3,#0
MOV R4,#-256<<12
MOV R5,#0
MOV R6,#1<<12
MOV R7,#0
MOV R8,#0
MOV R0,#blockstab
SWI Amnesia_MakeObject
MVN R3,#96<<16
STR R3,[R1,#32]
MOV R3,#96<<16
STR R3,[R1,#36]
LDMFD R13!,{PC}

.starmake
STMFD R13!,{R14}
STMFD R13!,{R5}
MOV R0,#starstab
MOV R1,#&09000000
MOV R2,#%1000001000110101+(1<<31)+(1<<18)
MOV R5,#0
MOV R6,#32<<12
MOV R7,#&0000FFC0
MOV R8,#&00300030
SWI Amnesia_MakeObject
LDMFD R13!,{R5}
STR R5,[R1,#32]
LDMFD R13!,{PC}


.writebank
STMFD R13!,{R14}
.writebankloop
SWI Blitz_Time
MOV R3,R0
MOV R0,R0,LSR #1
CMP R0,#1
BGE goforwrites
SWI OS_ReadEscapeState
BCC writebankloop
.goforwrites
STR R0,[R12,#v.realrate]
CMP R0,#1
MOVNE R0,#2

STR R0,[R12,#v.frameinc]
LDR R1,[R12,#v.framectr]
ADD R1,R1,R0
STR R1,[R12,#v.framectr]
SUB R0,R3,R0,LSL #1
CMP R0,#2
MOVGT R0,#2
CMP R0,#0
MOVLT R0,#0
SWI Blitz_SetTime
BL softshift
LDMFD R13!,{PC}


#set demolen = &8000
.demomake
STMFD R13!,{R14}
LDR R0,[R12,#v.demomode]
CMP R0,#0
LDMNEFD R13!,{PC}
BL releasedemo
ADD R0,R12,#v.demoadr
MOV R1,#demolen
ADR R2,demoname
MOV R3,#0
SWI Amnesia_ClaimBlock
MOV R0,#demolen
LDR R1,[R12,#v.demoadr]
STR R0,[R1]
MOV R0,#4
STR R0,[R12,#v.democtr]
MOV R0,#2
STR R0,[R12,#v.demomode]
MOV R0,#0
STR R0,[R12,#v.rnseed]
BL savegame

ADR R0,demomakemes
BL message
LDMFD R13!,{PC}
.demomakemes
DCD 160<<12,128<<12,0,0,&00500001,0
DCB "DEMO RECORDING",0
ALIGN

.demoname
DCB "Demo",0
ALIGN

.demostart
STMFD R13!,{R14}
BL releasedemo
MOV R0,#texttab
SWI Amnesia_WipeTable
MOV R0,#1
STR R0,[R12,#v.demomode]
MVN R0,#0
STR R0,[R12,#v.loadedlev]
MOV R0,#0
STR R0,[R12,#v.menuno]
MOV R0,#1
STR R0,[R12,#v.menucsr]
MOV R0,#0
STR R0,[R12,#v.rnseed]
BL emptykeybuf
MOV R0,#0
STR R0,[R12,#v.bastmode]
LDMFD R13!,{PC}

.gamestart
STMFD R13!,{R14}
BL releasedemo
LDR R0,[R12,#v.singlesave]
STR R0,[R12,#v.savestate]
MOV R0,#0
STR R0,[R12,#v.demomode]
MVN R0,#0
STR R0,[R12,#v.loadedlev]
MOV R0,#0
STR R0,[R12,#v.menuno]
STR R0,[R12,#v.newlevelctr]
BL setupplayer
.gamehack
MOV R0,#0
STR R0,[R12,#v.bastmode]
LDMFD R13!,{PC}

.keyscan
STMFD R13!,{R14}
LDR R0,[R12,#v.demomode]
CMP R0,#1
CMPNE R0,#2
BEQ keyscanins
MOV R0,#129
MOV R1,#81 EOR &FF
MOV R2,#&FF
SWI OS_Byte
CMP R2,#&FF
LDR R0,[R12,#v.pending]
CMPNE R0,#4
BLEQ savemenu
MOV R0,#129
MOV R1,#50 EOR &FF
MOV R2,#&FF
SWI OS_Byte
CMP R2,#&FF
BLEQ demomake
MOV R0,#129
MOV R1,#51 EOR &FF
MOV R2,#&FF
SWI OS_Byte
CMP R2,#&FF
BLEQ demostart
MOV R0,#129
MOV R1,#98 EOR &FF
MOV R2,#&FF
SWI OS_Byte
CMP R2,#&FF
BLEQ screensave
MOV R0,#129
MOV R1,#86 EOR &FF
MOV R2,#&FF
SWI OS_Byte
CMP R2,#&FF
BEQ keyloadskip
.keyscanins
LDR R0,[R12,#v.pending]
CMP R0,#1
.keyloadskip
MOV R0,#0
BLEQ loadmenu; leave this last - needs R0=0

LDMFD R13!,{PC}

.realkeyscan
STMFD R13!,{R14}
LDR R0,[R12,#v.pending]
CMP R0,#4
BLEQ savemenu
LDR R0,[R12,#v.pending]
CMP R0,#1
MOV R0,#0
BLEQ loadmenu; leave this last - needs R0=0
LDMFD R13!,{PC}

.screensave
STMFD R13!,{R14}
ADR R0,screencom
SWI OS_CLI
LDMFD R13!,{PC}
.screencom
DCB "ScreenSave OddBall:^.Screen",0
ALIGN



.getnumber
STMFD R13!,{R14}
.getnumberloop
BL numberscan
MOV R4,R1
CMP R1,#0
LDMNEFD R13!,{PC}
BL getnumberloop

.numberscan
STMFD R13!,{R14}
BL getkey
MOVNE R1,#0
SUBS R3,R1,#"0"
MOVMI R3,#0
CMP R3,#9
MOVGT R3,#0

CMP R1,#13
CMPNE R1,#137
LDREQ R3,[R12,#v.menucsr]
LDMFD R13!,{PC}

.gamenumberscan
STMFD R13!,{R14}
BL getkey
MOVNE R1,#0
SUBS R3,R1,#"0"
MOVMI R3,#0
CMP R3,#9
MOVGT R3,#0
LDMFD R13!,{PC}

.demomenu
STMFD R13!,{R14}
BL setupcanvas
BL numberscan
MOV R4,R1
MOV R5,R2
LDR R0,[R12,#v.menuno]
STMFD R13!,{R0}
AND R0,R0,#7
ADR R1,menutab
LDR R2,[R1,R0,LSL #2]
MOV R14,PC
ADD PC,R1,R2
LDR R1,[R12,#v.menuno]
LDMFD R13!,{R0}
CMP R0,R1

MOVLT R0,#1
STRNE R0,[R12,#v.menucsr]
LDR R0,[R12,#v.menucsr]
MOV R2,R0,LSL #4
ADD R2,R2,R0,LSL #2
LDR R0,[R12,#v.genctr]
ADD R0,R0,#1<<16
STR R0,[R12,#v.genctr]

LDR R3,[R12,#v.menuno]
CMP R3,#5
CMPNE R3,#2
LDR R3,[R12,#v.demomode]
CMPEQ R3,#1
LDMEQFD R13!,{PC}
AND R0,R0,#&F<<16

ORR R0,R0,#(decortab<<24)+3
LDR R1,[R12,#v.plotnibble]
ADD R1,R1,#43
ADD R2,R2,#60
SWI FastSpr_Plot
LDMFD R13!,{PC}
.menutab
DCD menu0-menutab
DCD menu1-menutab
DCD menu2-menutab
DCD menu3-menutab
DCD menu4-menutab
DCD menu5-menutab
DCD menu6-menutab
DCD menu6-menutab



.menu0
STMFD R13!,{R14}
LDR R0,[R12,#v.demomode]
CMP R0,#1
CMPNE R0,#2
ADR R0,menu0text
ADREQ R0,menu0demotext
#rept 9
BL nibprint
#endr

MOV R0,#6
BL addmenucsr
CMP R4,#136
MOVEQ R0,#2
STREQ R0,[R12,#v.exit]
CMP R3,#0
LDMEQFD R13!,{PC}
LDR R6,[R12,#v.menuno]
CMP R3,#6
MOVLE R6,R3
STR R6,[R12,#v.menuno]
LDMFD R13!,{PC}
.menu0text
DCD 116,32
DCB "ODDBALL",0
ALIGN
DCD 48,80
DCB "1. NEW GAME",0
ALIGN
DCD 48,100
DCB "2. SAVE GAME",0
ALIGN
DCD 48,120
DCB "3. LOAD GAME",0
ALIGN
DCD 48,140
DCB "4. OPTIONS",0
ALIGN
DCD 48,160
DCB "5. KILL ALL BALLS",0
ALIGN
DCD 48,180
DCB "6. EXIT TO DESKTOP",0
ALIGN
DCD 40,200
DCB "USE b c a TO SELECT,",0
ALIGN
DCD 40,220
DCB "` TO RETURN TO GAME",0
ALIGN
.menu0demotext
DCD 116,32
DCB "ODDBALL",0
ALIGN
DCD 48,80
DCB "1. START GAME",0
ALIGN
DCD 48,100
DCB "2. HIGH SCORES",0
ALIGN
DCD 48,120
DCB "3. LOAD GAME",0
ALIGN
DCD 48,140
DCB "4. OPTIONS",0
ALIGN
DCD 48,160
DCB "5. INSTRUCTIONS",0
ALIGN
DCD 48,180
DCB "6. EXIT TO DESKTOP",0
ALIGN
DCD 42,200
DCB "USE b c a TO SELECT",0
ALIGN
DCD 48,220
DCB " ",0
ALIGN

.menu1
STMFD R13!,{R14}
ADR R0,menu1text
#rept 5
BL nibprint
#endr
ADR R0,menusubtext
BL nibprint
BL nibprint

LDR R1,[R12,#v.singlesave]
CMP R1,#1
ADR R0,freesave
ADREQ R0,singlesave
BL nibprint
CMP R4,#136
MOVEQ R0,#0
STREQ R0,[R12,#v.menuno]

MOV R0,#4
BL addmenucsr
CMP R3,#4
BLEQ saveflip
CMP R3,#1
CMPNE R3,#2
CMPNE R3,#3
LDMNEFD R13!,{PC}
STR R3,[R12,#v.diff]
BL gamestart
LDMFD R13!,{PC}
.saveflip
LDR R0,[R12,#v.singlesave]
CMP R0,#0
MOV R0,#0
MOVEQ R0,#1
STR R0,[R12,#v.singlesave]
MOV PC,R14
.menu1text
DCD 56,32
DCB "START A NEW GAME",0
ALIGN
DCD 48,52
DCB "SELECT DIFFICULTY",0
ALIGN
DCD 48,80
DCB "1. BEGINNER",0
ALIGN
DCD 48,100
DCB "2. EXPERT",0
ALIGN
DCD 48,120
DCB "3. PSYCHIC",0
ALIGN
.freesave
DCD 48,140
DCB "4. SAVE AT ANY TIME",0
ALIGN
.singlesave
DCD 48,140
DCB "4. ONE SAVE/LEVEL",0
ALIGN

.menu2
LDR R0,[R12,#v.demomode]
CMP R0,#1
BEQ menu2demo
STMFD R13!,{R14}
LDMFD R13!,{PC}

.menu2demo
STMFD R13!,{R14}
CMP R4,#136
MOV R0,#0
STREQ R0,[R12,#v.menuno]
ADR R0,hitext
BL nibprint
ADR R0,menusubtext2
BL nibprint
BL hiprint
LDMFD R13!,{PC}

.menu3
STMFD R13!,{R14}
MOV R0,#1
STR R0,[R12,#v.pending]
MOV R0,#0
STR R0,[R12,#v.menuno]
MOV R0,#3
STR R0,[R12,#v.menucsr]
LDMFD R13!,{PC}

.menu4
STMFD R13!,{R14}
ADR R0,menu4text
#rept 3
BL nibprint
#endr
MOV R0,#6
BL addmenucsr
LDR R0,[R12,#v.lineskip]
CMP R0,#1
ADR R0,mode13mes
ADREQ R0,mode49mes
BL nibprint
LDR R0,[R12,#v.music]
CMP R0,#1
ADR R0,musicoffmes
ADREQ R0,musiconmes
BL nibprint

ADR R0,soundoffmes
LDR R1,[R12,#v.soundvol]
CMP R1,#1
ADREQ R0,soundquietmes
CMP R1,#2
ADREQ R0,soundmedmes
CMP R1,#3
ADREQ R0,soundloadmes
BL nibprint
MOV R0,#0
SWI Sound_Speaker
CMP R0,#2
ADR R0,speoffmes
ADREQ R0,speonmes
BL nibprint
LDR R1,[R12,#v.quality]
ADR R0,lowqmes
CMP R1,#1
ADREQ R0,medqmes
CMP R1,#2
ADREQ R0,highqmes
BL nibprint
LDR R1,[R12,#v.mousestep]
ADR R0,slowmmes
CMP R1,#1
ADREQ R0,medmmes
CMP R1,#2
ADREQ R0,fastmmes
BL nibprint

CMP R3,#1
BLEQ modeflip
CMP R3,#2
BLEQ musicflip
CMP R3,#3
BLEQ soundflip
CMP R3,#4
BLEQ speakerflip
CMP R3,#5
BLEQ qualityflip
CMP R3,#6
BLEQ mousestepflip

CMP R4,#136
MOVEQ R0,#0
STREQ R0,[R12,#v.menuno]
LDMFD R13!,{PC}

.menu4text
DCD 108,32
DCB "OPTIONS",0
ALIGN
.menusubtext
DCD 72,204
DCB "USE b c a KEYS,",0
ALIGN
.menusubtext2
DCD 66,224
DCB "` FOR MAIN MENU.",0
ALIGN
.mode13mes
DCD 48,80
DCB "1. NORMAL TV SCREEN",0
ALIGN
.mode49mes
DCD 48,80
DCB "1. HIGH-RES MONITOR",0
ALIGN
.musiconmes
DCD 48,100
DCB "2. MUSIC ON",0
ALIGN
.musicoffmes
DCD 48,100
DCB "2. MUSIC OFF",0
ALIGN
.soundquietmes
DCD 48,120
DCB "3. QUIET SOUND",0
ALIGN
.soundmedmes
DCD 48,120
DCB "3. MEDIUM SOUND",0
ALIGN
.soundloadmes
DCD 48,120
DCB "3. LOUD SOUND",0
ALIGN
.soundoffmes
DCD 48,120
DCB "3. NO SOUND",0
ALIGN
.speonmes
DCD 48,140
DCB "4. SPEAKER ON",0
ALIGN
.speoffmes
DCD 48,140
DCB "4. SPEAKER OFF",0
ALIGN
.lowqmes
DCD 48,160
DCB "5. LOW-FI SOUND",0
ALIGN
.medqmes
DCD 48,160
DCB "5. NORMAL SOUND",0
ALIGN
.highqmes
DCD 48,160
DCB "5. HI-FI SOUND",0
ALIGN
.slowmmes
DCD 48,180
DCB "6. SLOW MOUSE",0
ALIGN
.medmmes
DCD 48,180
DCB "6. MEDIUM MOUSE",0
ALIGN
.fastmmes
DCD 48,180
DCB "6. FAST MOUSE",0
ALIGN

.menu5
LDR R0,[R12,#v.demomode]
CMP R0,#1
BEQ menu5demo
STMFD R13!,{R14}
ADR R0,menu5text
#rept 3
BL nibprint
#endr
ADR R0,menusubtext
BL nibprint
BL nibprint


MOV R0,#2
BL addmenucsr
CMP R4,#136
CMPNE R3,#2
MOVEQ R0,#5
STREQ R0,[R12,#v.menucsr]
MOVEQ R0,#0
STREQ R0,[R12,#v.menuno]
CMP R3,#0
LDMEQFD R13!,{PC}
CMP R3,#1
LDMNEFD R13!,{PC}
BL nukeballs
MOV R0,#5
STR R0,[R12,#v.menucsr]
MOV R0,#0
STR R0,[R12,#v.menuno]
LDMFD R13!,{PC}

.menu5demo 
STMFD R13!,{R14}

ADR R0,menu5demotext
#rept 8
BL nibprint
#endr
CMP R4,#136
MOV R0,#0
STREQ R0,[R12,#v.menuno]
CMP R3,#3
BLEQ cheatcheck
CMP R4,#136
MOV R0,#0
STREQ R0,[R12,#v.menuno]
BL cheatcheck2
LDMFD R13!,{PC}

.cheatcheck2
STMFD R13!,{R14}
.cheatmesstart
LDR R0,[R12,#v.menucsr]
CMP R4,#32
BICNE R4,R4,#32
SUBS R4,R4,#20
LDMMIFD R13!,{PC}
MOV R1,R0
CMP R0,#137
BEQ cheatskips
CMP R4,#"S"-20
MOVEQ R0,#129
.cheatskips
CMP R4,#"T"-20
CMPEQ R0,#129
ADDEQ R0,R0,#1
CMP R4,#"U"-20
CMPEQ R0,#130
ADDEQ R0,R0,#1
CMP R4,#"F"-20
CMPEQ R0,#131
ADDEQ R0,R0,#1
BEQ cheatjump
CMP R4,#"F"-20
CMPEQ R0,#132
ADDEQ R0,R0,#1
.cheatjump
CMP R4,#" "-20
CMPEQ R0,#133
ADDEQ R0,R0,#1
CMP R4,#"T"-20
CMPEQ R0,#134
ADDEQ R0,R0,#1
CMP R4,#"H"-20
CMPEQ R0,#135
ADDEQ R0,R0,#1
CMP R4,#"I"-20
CMPEQ R0,#136
ADDEQ R0,R0,#1
CMP R4,#"S"-20
CMPEQ R0,#137
ADDEQ R0,R0,#1
CMP R0,R1
MOVEQ R0,#0
STR R0,[R12,#v.menucsr]
CMP R0,#138
LDMNEFD R13!,{PC}
MOV R0,#5
STR R0,[R12,#v.menucsr]
MOV R0,#texttab
SWI Amnesia_WipeTable
LDR R0,[R12,#v.cheat]
RSB R0,R0,#1
STR R0,[R12,#v.cheat]
CMP R0,#1
ADR R0,fairmes
ADRNE R0,stuffmes
BL message
LDMFD R13!,{PC}


.cheatcheck
STMFD R13!,{R14}

BL getnumber
CMP R3,#2
LDMNEFD R13!,{PC}
BL getnumber
CMP R3,#9
LDMNEFD R13!,{PC}
BL getnumber
CMP R4,#48
LDMNEFD R13!,{PC}
BL getnumber
CMP R3,#7
LDMNEFD R13!,{PC}
BL getnumber
CMP R4,#48
LDMNEFD R13!,{PC}
ADR R0,clickmes
BL message
LDMFD R13!,{PC}
.clickmes
DCD 160<<12,200<<12,0,0,&00600001,0
DCB "SORRY, ENGAGED!",0
ALIGN
.fairmes
DCD 160<<12,200<<12,0,0,&00600001,fairmes2-fairmes
DCB "FAIR MINDED WORDS!",0
ALIGN
.fairmes2
DCD &280<<12,200<<12,-2<<12,0,&02800001,0
DCB "USE THE RIGHT MOUSE BUTTON TO SORT THINGS OUT...",0
ALIGN
.stuffmes
DCD &200<<12,200<<12,-2<<12,0,&02000001,0
DCB "THERE'S NO PLEASING SOME PEOPLE!",0
ALIGN

.cheatmesend
LDMFD R13!,{PC}
.menu5text
DCD 48,32
DCB "BALL DESTRUCTION",0
ALIGN
DCD 48,80
DCB "1. DESTROY BALLS",0
ALIGN
DCD 48,100
DCB "2. CANCEL",0
ALIGN

.menu5demotext
.hm1
DCD 59,40
DCB "USE THE MOUSE TO",0
ALIGN
DCD 57,60
DCB "MOVE THE BAT. HIT",0
ALIGN
DCD 54,80
DCB "THE BALL TOWARDS",0
ALIGN
DCD 40,100
DCB "THE BLOCKS. DESTROY",0
ALIGN
DCD 52,120
DCB "ALL OF THE BLOCKS",0
ALIGN
DCD 41,140
DCB "TO COMPLETE A LEVEL",0
ALIGN
DCD 72,180
DCB "WATCH THE DEMO!",0
DCD 66,220
DCB "` FOR MAIN MENU.",0
ALIGN

.menu6
STMFD R13!,{R14}
#rept 7
BL menufade
BL menubank
#endr
MOV R0,#1
STR R0,[R12,#v.exit]
LDMFD R13!,{PC}

.modeflip
STMFD R13!,{R3-R6,R14}
MOV R0,#49
SWI OS_CheckModeValid
BCS modenotvalid
LDR R0,[R12,#v.lineskip]
CMP R0,#1
MOVEQ R0,#0
MOVNE R0,#1
STR R0,[R12,#v.lineskip]
BL modeactive
.modeflipins
LDMFD R13!,{R3-R6,PC}

.musicflip
STMFD R13!,{R14}
LDR R0,[R12,#v.music]
RSB R0,R0,#1
STR R0,[R12,#v.music]
BL configupdate
LDMFD R13!,{PC}

.soundflip
STMFD R13!,{R14}
LDR R0,[R12,#v.soundvol]
ADD R0,R0,#1
CMP R0,#3
MOVGT R0,#0
STR R0,[R12,#v.soundvol]
BL configupdate
LDMFD R13!,{PC}

.speakerflip
STMFD R13!,{R14}
MOV R0,#0
SWI Sound_Speaker
RSB R0,R0,#3
SWI Sound_Speaker
LDMFD R13!,{PC}

.qualityflip
STMFD R13!,{R14}
LDR R0,[R12,#v.quality]
ADD R0,R0,#1
CMP R0,#2
MOVGT R0,#0
STR R0,[R12,#v.quality]
BL configupdate
LDMFD R13!,{PC}

.mousestepflip
STMFD R13!,{R14}
LDR R0,[R12,#v.mousestep]
ADD R0,R0,#1
CMP R0,#2
MOVGT R0,#0
STR R0,[R12,#v.mousestep]
BL configupdate
LDMFD R13!,{PC}

.configupdate
STMFD R13!,{R14}
LDR R0,[R12,#v.quality]
MOV R2,#64
CMP R0,#1
MOVEQ R2,#48
CMP R0,#2
MOVEQ R2,#24
MOV R0,#4
MOV R1,#0
MOV R3,#0
MOV R4,#0
SWI Sound_Configure
LDR R0,[R12,#v.music]
CMP R0,#1
MOV R0,#4
MOVEQ R0,#8
MOV R1,#0
MOV R2,#0
MOV R3,#0
MOV R4,#0
SWI Sound_Configure
LDR R1,[R12,#v.soundvol]
CMP R1,#0
MOV R0,#2
MOVEQ R0,#1
SWI Sound_Enable
MOV R0,#72
CMP R1,#2
MOVEQ R0,#100
CMP R1,#3
MOVEQ R0,#127
SWI Sound_Volume

LDR R0,[R12,#v.mousestep]
ADR R1,slowmouse
CMP R0,#1
ADREQ R1,medmouse
CMP R0,#2
ADREQ R1,fastmouse
MOV R0,#21
SWI OS_Word
LDMFD R13!,{PC}
.slowmouse
DCB 2,2,2
.medmouse
DCB 2,3,3
.fastmouse
DCB 2,4,4
ALIGN
.defaultmouse
STMFD R13!,{R14}
MOV R0,#161
MOV R1,#194
SWI OS_Byte
ADD R1,R12,#v.temp0
MOV R0,#2
STRB R0,[R1]
STRB R2,[R1,#1]
STRB R2,[R1,#2]
MOV R0,#21
SWI OS_Word
LDMFD R13!,{PC}

.modenotvalid
MOV R0,#texttab
SWI Amnesia_CountObjects
CMP R0,#1
ADR R0,notvalmes
BLLE message
B modeflipins

.notvalmes
DCD (160+&200)<<12,60<<12,-2<<12,0,&02000001,0
DCB "USE NORMAL SCREEN MODE ON THIS MONITOR - MODE 49 NOT AVAILABLE.",0
ALIGN

.modeactive
STMFD R13!,{R14}
MOV R0,#49
SWI OS_CheckModeValid
MOVCS R0,#0
STRCS R0,[R12,#v.lineskip]
LDR R0,[R12,#v.lineskip]
CMP R0,#0
MOVEQ R0,#13
MOVNE R0,#49
SWI 256+22
SWI OS_WriteC
SWI OS_RemoveCursors
SWI 256+28
SWI 256
SWI 256+24
SWI 256+29
SWI 256
BL vduread
LDR R0,[R12,#v.lineskip]
CMP R0,#0
LDR R0,[R12,#v.screenadr]
ADDEQ R0,R0,#320*8
STR R0,[R12,#v.screenuse]
BL loadsidepic
BL showsidepic
MOV R0,#1
STR R0,[R12,#v.scorechange]
STR R0,[R12,#v.ballschange]
STR R0,[R12,#v.liveschange]
STR R0,[R12,#v.goodychange]

LDMFD R13!,{PC}








.addmenucsr
LDR R1,[R12,#v.menucsr]
CMP R4,#139
SUBEQ R1,R1,#1
CMP R4,#138
ADDEQ R1,R1,#1
CMP R1,#1
MOVLT R1,#1
CMP R1,R0
MOVGT R1,R0
STR R1,[R12,#v.menucsr]
MOV PC,R14

.highscores
STMFD R13!,{R14}
MOV R3,#&FF
LDR R2,[R12,#v.plscore]
LDR R1,[R12,#v.hinames]
LDR R0,[R1,#&A0]
CMP R2,R0
MOVGE R3,#&A0
LDR R0,[R1,#&80]
CMP R2,R0
MOVGE R3,#&80
LDR R0,[R1,#&60]
CMP R2,R0
MOVGE R3,#&60
LDR R0,[R1,#&40]
CMP R2,R0
MOVGE R3,#&40
LDR R0,[R1,#&20]
CMP R2,R0
MOVGE R3,#&20
LDR R0,[R1,#&0]
CMP R2,R0
MOVGE R3,#&0
CMP R3,#&FF
LDMGEFD R13!,{PC}
STR R3,[R12,#v.hislot]
ADD R4,R1,R3
ADD R5,R1,#&BC
.loop74
SUB R0,R5,R4
CMP R0,#&20
BLT hishiftskip
MOV R2,#8
.loop75
LDR R0,[R5,#-&20]
STR R0,[R5]
SUB R5,R5,#4
SUBS R2,R2,#1
BGT loop75
B loop74
.hishiftskip
LDR R0,[R12,#v.plscore]
STR R0,[R4],#4
MOV R0,#&0
#rept 7
STR R0,[R4],#4
#endr

BL hiask
LDMFD R13!,{PC} 


.hiask
STMFD R13!,{R14}
BL emptykeybuf
MOV R0,#4
MOV R1,#1
SWI OS_Byte
.loop71
BL menufade
ADR R0,hitext
#rept 3
BL print
#endr
BL listhinames
BL menubank
BL hiedit
CMP R1,#13
;CMPNE R1,#137
BEQ hisave
SWI OS_ReadEscapeState
BCC loop71
MOV R0,#124
SWI OS_Byte
LDMFD R13!,{PC}

.hiprint
STMFD R13!,{R14}
LDR R0,[R12,#v.hinames]
MOV R2,#70
MOV R3,#6
.loop7b
LDR R1,[R12,#v.plotnibble]
ADD R1,R1,#52
STMFD R13!,{R0-R3}
LDR R0,[R0]
BL printnumber
LDMFD R13!,{R0-R3}
ADD R0,R0,#4
LDR R1,[R12,#v.plotnibble]
ADD R1,R1,#136
STMFD R13!,{R0-R3}
MOV R3,#28
BL printstring
LDMFD R13!,{R0-R3}
ADD R2,R2,#20
ADD R0,R0,#32-4
SUBS R3,R3,#1
BGT loop7b
LDMFD R13!,{PC}

.listhinames
STMFD R13!,{R14}
BL seekhiend
LDR R1,[R12,#v.hislot]
AND R1,R1,#&FF
LDR R0,[R12,#v.hinames]
MOV R2,#95
STRB R2,[R0,R1]
MOV R2,#70
MOV R3,#6
.loop70
MOV R1,#52
STMFD R13!,{R0-R3}
LDR R0,[R0]
BL printnumber
LDMFD R13!,{R0-R3}
ADD R0,R0,#4
MOV R1,#136
STMFD R13!,{R0-R3}
MOV R3,#28
BL printstring
LDMFD R13!,{R0-R3}
ADD R2,R2,#20
ADD R0,R0,#32-4
SUBS R3,R3,#1
BGT loop70
LDR R1,[R12,#v.hislot]
AND R1,R1,#&FF
LDR R0,[R12,#v.hinames]
MOV R2,#0
STRB R2,[R0,R1]
AND R1,R1,#&E0
MOV R1,R1,LSR #5
MOV R0,#20
MUL R2,R0,R1
LDR R0,[R12,#v.genctr]
ADD R0,R0,#1<<16
STR R0,[R12,#v.genctr]
AND R0,R0,#&F<<16
ORR R0,R0,#(decortab<<24)+3
MOV R1,#43
ADD R2,R2,#70
SWI FastSpr_Plot
LDMFD R13!,{PC}

.seekhiend
LDR R1,[R12,#v.hinames]
LDR R2,[R12,#v.hislot]
AND R2,R2,#&E0
ORR R2,R2,#4
MOV R3,#31-4
.loop72
LDRB R0,[R1,R2]
CMP R0,#32
BLT foundhiend
ADD R2,R2,#1
SUBS R3,R3,#1
BGT loop72
.foundhiend
STR R2,[R12,#v.hislot]
MOV PC,R14

.hiedit
STMFD R13!,{R14}
BL getkey
MOVNE R1,#0
LDMNEFD R13!,{PC}
CMP R1,#136
CMPNE R1,#137
CMPNE R1,#13
CMPNE R1,#&1B
LDMEQFD R13!,{PC}
CMP R1,#8
CMPNE R1,#127
MOVEQ R1,#136
CMP R1,#136
BGE harrowkey
CMP R1,#64
BICGT R1,R1,#1<<5
CMP R1,#90
LDMGTFD R13!,{PC}
CMP R1,#32
LDMLTFD R13!,{PC}
LDR R2,[R12,#v.hinames]
LDR R0,[R12,#v.hislot]
AND R3,R0,#&1F
CMP R3,#4
BICLT R0,R0,#&1F
ORRLT R0,R0,#4
STRB R1,[R2,R0]
AND R2,R0,#&1F
CMP R2,#&1F
ADDNE R0,R0,#1
AND R0,R0,#&FF

STR R0,[R12,#v.hislot]
LDMFD R13!,{PC}

.hisave
STMFD R13!,{R14}
BL setsavepath
LDR R0,[R12,#v.hinames]
ADR R1,hinamesfullname
MOV R2,#&FFD
SWI XAmnesia_SaveFile
LDMFD R13!,{PC}

.hitext
DCD 88,40
DCB "HIGH SCORES",0
ALIGN
DCD 64,200
DCB "ENTER YOUR NAME",0
ALIGN
DCD 80,220
DCB "AND PRESS d.",0
ALIGN 

.savemenu
STMFD R13!,{R14}
BL setupcanvas
LDR R0,[R12,#v.pending]
CMP R0,#3
MOV R0,#0
STR R0,[R12,#v.pending]
BEQ saveask
.loop4c
BL menufade
ADR R0,savequestion
BL print
BL menubank
MOV R0,#68
BL getkey
CMP R1,#13
BIC R1,R1,#1<<5
CMPNE R1,#"Y"
BEQ saveask
CMP R1,#"N"
LDMEQFD R13!,{PC}
SWI OS_ReadEscapeState
BCC loop4c
MOV R0,#124
SWI OS_Byte
LDMFD R13!,{PC}

.emptykeybuf
STMFD R13!,{R0-R2,R14}
.loop4f
MOV R0,#129
MOV R1,#0
MOV R2,#0
SWI OS_Byte
CMP R2,#0
BEQ loop4f
LDMFD R13!,{R0-R2,PC}

.saveask
MOV R0,#4
MOV R1,#1
SWI OS_Byte
.loop4d
BL menufade
ADR R0,savetext2
#rept 4
BL print
#endr
BL listsavenames
BL menubank
BL namesedit
CMP R1,#136
LDMEQFD R13!,{PC}
CMP R1,#13
;CMPNE R1,#137
BEQ dosave
SWI OS_ReadEscapeState
BCC loop4d
MOV R0,#124
SWI OS_Byte
LDMFD R13!,{PC}

.listsavenames
STMFD R13!,{R14}
BL seeknameend
LDR R1,[R12,#v.saveslot]
AND R1,R1,#&FF
LDR R0,[R12,#v.savenames]
MOV R2,#95
STRB R2,[R0,R1]
MOV R1,#52
MOV R2,#100
MOV R3,#6
.loop4e
STMFD R13!,{R0-R3}
MOV R3,#32
BL printstring
LDMFD R13!,{R0-R3}
ADD R2,R2,#20
ADD R0,R0,#32
SUBS R3,R3,#1
BGT loop4e
LDR R1,[R12,#v.saveslot]
AND R1,R1,#&FF
LDR R0,[R12,#v.savenames]
MOV R2,#0
STRB R2,[R0,R1]
AND R1,R1,#&E0
MOV R1,R1,LSR #5
MOV R0,#20
MUL R2,R0,R1
LDR R0,[R12,#v.genctr]
ADD R0,R0,#1<<16
STR R0,[R12,#v.genctr]
AND R0,R0,#&F<<16
ORR R0,R0,#(decortab<<24)+3
MOV R1,#43
ADD R2,R2,#100
SWI FastSpr_Plot
LDMFD R13!,{PC}

.seeknameend
LDR R1,[R12,#v.savenames]
LDR R2,[R12,#v.saveslot]
AND R2,R2,#&E0
MOV R3,#31
.loop50
LDRB R0,[R1,R2]
CMP R0,#32
BLT foundnameend
ADD R2,R2,#1
SUBS R3,R3,#1
BGT loop50
.foundnameend
STR R2,[R12,#v.saveslot]
MOV PC,R14

.namesedit
STMFD R13!,{R14}
BL getkey
MOVNE R1,#0
LDMNEFD R13!,{PC}
CMP R1,#136
CMPNE R1,#137
CMPNE R1,#13
CMPNE R1,#&1B
LDMEQFD R13!,{PC}
CMP R1,#8
CMPNE R1,#127
MOVEQ R1,#136
CMP R1,#136
BGE arrowkey
CMP R1,#64
BICGT R1,R1,#1<<5
CMP R1,#90
LDMGTFD R13!,{PC}
CMP R1,#32
LDMLTFD R13!,{PC}
LDR R2,[R12,#v.savenames]
LDR R0,[R12,#v.saveslot]
STRB R1,[R2,R0]
AND R2,R0,#&1F
CMP R2,#&1F
ADDNE R0,R0,#1
AND R0,R0,#&FF

STR R0,[R12,#v.saveslot]
LDMFD R13!,{PC}

.arrowkey
LDR R2,[R12,#v.saveslot]
CMP R1,#136
BEQ leftarrow
CMP R1,#138
BEQ downarrow
CMP R1,#139
BEQ uparrow
MOV R1,#0
LDMFD R13!,{PC}

.leftarrow
LDR R0,[R12,#v.saveslot]
TST R0,#&1F
MOV R1,#0
LDMEQFD R13!,{PC}
SUB R0,R0,#1
STR R0,[R12,#v.saveslot]
LDR R1,[R12,#v.savenames]
MOV R2,#0
STRB R2,[R1,R0]
MOV R1,#0
LDMFD R13!,{PC}

.uparrow
LDR R0,[R12,#v.saveslot]
SUBS R0,R0,#32
STRPL R0,[R12,#v.saveslot]
MOV R1,#0
LDMFD R13!,{PC}

.downarrow
LDR R0,[R12,#v.saveslot]
ADD R0,R0,#32
CMP R0,#192
STRLT R0,[R12,#v.saveslot]
MOV R1,#0
LDMFD R13!,{PC}

.harrowkey
LDR R2,[R12,#v.hislot]
CMP R1,#136
MOV R1,#0
LDMNEFD R13!,{PC}
.hleftarrow
LDR R0,[R12,#v.hislot]
AND R2,R0,#&1F
CMP R2,#4
LDMLEFD R13!,{PC}
SUB R0,R0,#1
STR R0,[R12,#v.hislot]
LDR R1,[R12,#v.hinames]
MOV R2,#0
STRB R2,[R1,R0]
LDMFD R13!,{PC}

.getkey
STMFD R13!,{R14}
MOV R0,#4
MOV R1,#1
SWI OS_Byte
MOV R0,#129
MOV R1,#0
MOV R2,#0
SWI OS_Byte
CMP R2,#0
LDMFD R13!,{PC}

.savequestion
DCD 80,128
DCB "SAVE GAME? Y/N",0
ALIGN
.savetext2
DCD 48,20
DCB "SELECT A SLOT TO",0
ALIGN
DCD 48,40
DCB "SAVE THE GAME INTO.",0
ALIGN
DCD 48,70
DCB "USE b c TO SELECT.",0
ALIGN
DCD 48,224
DCB "PRESS d TO SAVE.",0
ALIGN



.menubank
STMFD R13!,{R14}
MOV R0,#1
SWI Blitz_Wait
BL menushift
LDMFD R13!,{PC}

.dosave
BL savegame
LDMFD R13!,{PC}

.svlevelnet
DCB "<OddBall$FilePath>LevelNet",0
.svbatstab
DCB "<OddBall$FilePath>BatsTab",0
.svballstab
DCB "<OddBall$FilePath>BallsTab",0
.svblockstab
DCB "<OddBall$FilePath>BlocksTab",0
.svtexttab
DCB "<OddBall$FilePath>TextTab",0
.svstarstab
DCB "<OddBall$FilePath>StarsTab",0
.svvarsblock
DCB "<OddBall$FilePath>VarsBlock",0
ALIGN

.savegame
STMFD R13!,{R14}
BL setsavepath
LDR R0,[R12,#v.savenames]
ADR R1,savenamesfullname
MOV R2,#&FFF
SWI XAmnesia_SaveFile
BVS savefailed
BL setsavebin
MOV R0,#batstab
ADR R1,svbatstab
SWI XAmnesia_SaveTable
BVS savefailed
MOV R0,#ballstab
ADR R1,svballstab
SWI XAmnesia_SaveTable
BVS savefailed
MOV R0,#blockstab
ADR R1,svblockstab
SWI XAmnesia_SaveTable
BVS savefailed
MOV R0,#texttab
ADR R1,svtexttab
SWI XAmnesia_SaveTable
BVS savefailed
MOV R0,#starstab
ADR R1,svstarstab
SWI XAmnesia_SaveTable
BVS savefailed
LDR R0,[R12,#v.levelnet]
ADR R1,svlevelnet
MOV R2,#&FFD
SWI XAmnesia_SaveFile
BVS savefailed
MOV R0,#10
ADR R1,svvarsblock
MOV R2,#&FFD
ADD R4,R12,#v.savestart
ADD R5,R12,#v.saveend
SWI XOS_File
BVS savefailed
MOV R0,#2
STR R0,[R12,#v.exit]
LDMFD R13!,{PC}

.savefailed
MOV R1,#2
STR R1,[R12,#v.exit]
ADR R1,savefailedmes
BL writeerror
LDMFD R13!,{PC}
.savefailedmes
DCD 160<<12,108<<12,0,0,&01000001,0
DCB "SAVE FAILED:",0
ALIGN

.setsavebin
LDR R0,[R12,#v.demomode]
CMP R0,#0
BNE setdemosavebin
STMFD R13!,{R14}
ADR R0,setsavecom
SWI OS_CLI
LDR R0,[R12,#v.saveslot]
MOV R0,R0,LSR #5
AND R0,R0,#7
ADD R0,R0,#1
STR R0,[R12,#v.temp0]
ADR R0,levelname
ADD R1,R12,#v.temp0
MOV R2,#4
MOV R3,#0
MOV R4,#1
SWI OS_SetVarVal
LDMFD R13!,{PC}

.setsavepath
STMFD R13!,{R14}
ADR R0,setsavecom
SWI OS_CLI
LDMFD R13!,{PC}

.setdemosavebin
STMFD R13!,{R14}
ADR R0,setdemocom
SWI OS_CLI
LDMFD R13!,{PC}

.setsavecom
DCB "SetMacro OddBall$FilePath <OddBall$SavePath>",0
.setdemocom
DCB "SetMacro OddBall$FilePath <OddBall$DemoPath>",0
ALIGN

.doload
MOV R0,#0
STR R0,[R12,#v.demomode]
BL loadgame
LDMFD R13!,{PC}

.loadgame
STMFD R13!,{R14}
BL setsavebin
MOV R0,#batstab
SWI Amnesia_WipeTable
MOV R0,#ballstab
SWI Amnesia_WipeTable
MOV R0,#bulletstab
SWI Amnesia_WipeTable
MOV R0,#blockstab
SWI Amnesia_WipeTable

LDR R0,[R12,#v.demomode]
CMP R0,#1
MOV R0,#texttab
SWINE Amnesia_WipeTable
MOV R0,#starstab
SWI Amnesia_WipeTable
MOV R0,#decortab
SWI Amnesia_WipeTable

MOV R0,#batstab
ADR R1,svbatstab
SWI XAmnesia_LoadTable
BVS loadfailed
MOV R0,#ballstab
ADR R1,svballstab
SWI XAmnesia_LoadTable
BVS loadfailed

MOV R0,#blockstab
ADR R1,svblockstab
SWI XAmnesia_LoadTable
BVS loadfailed
MOV R0,#texttab
ADR R1,svtexttab
SWI XAmnesia_LoadTable
BVS loadfailed
MOV R0,#starstab
ADR R1,svstarstab
SWI XAmnesia_LoadTable
BVS loadfailed
ADD R0,R12,#v.levelnet
LDR R0,[R0]
CMP R0,#0
SWINE Amnesia_ReleaseBlock
ADD R0,R12,#v.levelnet
ADR R1,svlevelnet
MOV R2,#0
SWI XAmnesia_LoadHammered
BVS loadfailed
MOV R0,#255
ADR R1,svvarsblock
ADD R2,R12,#v.savestart
MOV R3,#0
SWI XOS_File
BVS loadfailed
BL backload
BL justmovedbat
BL vetlevel

LDR R0,[R12,#v.levelno]
STR R0,[R12,#v.loadedlev]
LDR R0,[R12,#v.demomode]
CMP R0,#1
BLEQ loaddemoinfo
BVS loadfailed
BL configupdate
MOV R0,#3
STR R0,[R12,#v.exit]
LDMFD R13!,{PC}

.loaddemoinfo
STMFD R13!,{R14}
BL releasedemo
ADD R0,R12,#v.demoadr
ADR R1,demosavename
MOV R2,#0
SWI Amnesia_LoadHammered
MOV R0,#4
STR R0,[R12,#v.democtr]
LDMFD R13!,{PC}

.loadfailed
STMFD R13!,{R0}
LDR R1,[R12,#v.demomode]
CMP R1,#1
BLNE demostart
LDMFD R13!,{R0}
LDR R1,[R0]
CMP R1,#214
ADREQ R0,notfounderr
MOV R1,#2
STR R1,[R12,#v.exit]
ADR R1,loadfailedmes
BL writeerror

LDMFD R13!,{PC}
.loadfailedmes
DCD 160<<12,60<<12,0,0,&01000001,0
DCB "LOAD FAILED:",0
ALIGN
.notfounderr
DCD &0
DCB "FILE NOT FOUND. IS A GAME SAVED IN THAT SLOT?",0
ALIGN


.releasedemo
STMFD R13!,{R14}
LDR R0,[R12,#v.demoadr]
CMP R0,#0
SWINE Amnesia_ReleaseBlock
MOV R0,#0
STR R0,[R12,#v.demoadr]
LDMFD R13!,{PC}

.loadmenu
STMFD R13!,{R14}
BL setupcanvas
LDR R0,[R12,#v.pending]
CMP R0,#1
BEQ loadask
.loop51
BL menufade
ADR R0,loadquestion
BL print
BL menubank
MOV R0,#68
BL getkey
CMP R1,#13
BIC R1,R1,#1<<5
CMPNE R1,#"Y"
BEQ loadask
CMP R1,#"N"
BEQ noload
SWI OS_ReadEscapeState
BCC loop51
.noload
MOV R0,#0
LDMFD R13!,{PC}

.loadask
MOV R0,#0
STR R0,[R12,#v.pending]
MOV R0,#4
MOV R1,#1
SWI OS_Byte
.loop52
BL menufade
ADR R0,loadtext2
#rept 4
BL print
#endr
BL listsavenames
BL menubank
BL namesedit
CMP R1,#136
LDMEQFD R13!,{PC}

;CMP R1,#13
CMPNE R1,#137
BEQ doload
SWI OS_ReadEscapeState
BCC loop52
MOV R0,#124
SWI OS_Byte
MOV R0,#0
LDMFD R13!,{PC}
.loadquestion
DCD 80,128
DCB "LOAD GAME? Y/N",0
ALIGN

.loadtext2
DCD 48,20
DCB "SELECT A SLOT TO",0
ALIGN
DCD 48,40
DCB "LOAD A GAME FROM.",0
ALIGN
DCD 48,70
DCB "USE b c TO SELECT.",0
ALIGN
DCD 48,224
DCB "PRESS a TO LOAD.",0
ALIGN

.deathfade
STMFD R13!,{R14}
LDR R0,[R12,#v.demomode]
CMP R0,#1
MOV R0,#200
MOVEQ R0,#500
LDR R1,[R12,#v.dead]

RSBS R3,R1,R0
MOVMI R3,#0
CMP R3,#61
LDMGEFD R13!,{PC}
LDR R0,[R12,#v.canvasadr]
ADD R0,R0,#40
MOV R1,R0
MOV R2,#240*320
BL fade
LDMFD R13!,{PC}

.menufade
STMFD R13!,{R14}
LDR R0,[R12,#v.canvasadr]
ADD R0,R0,#40
MOV R1,R0
MOV R2,#240*320
MOV R3,#52
BL fade

LDMFD R13!,{PC}

.menushift
STMFD R13!,{R14}
LDR R11,[R12,#v.canvasadr]
LDR R10,[R12,#v.screenuse]
ADD R11,R11,#(canvaswidth-windwidth)/2
MOV R9,#240
LDR R0,[R12,#v.lineskip]
CMP R0,#1
BLEQ shift490
LDR R0,[R12,#v.lineskip]
CMP R0,#1
BLNE shift0
LDMFD R13!,{PC}

.softshift
STMFD R13!,{R14}
LDR R11,[R12,#v.canvasadr]
LDR R10,[R12,#v.screenuse]
ADD R11,R11,#(canvaswidth-windwidth)/2
MOV R9,#240
LDR R1,[R12,#v.xplotofs]
RSB R1,R1,#0
MOV R1,R1,ASR #12
AND R1,R1,#&5FFFFF
AND R0,R1,#3
LDR R1,[R12,#v.lineskip]
CMP R1,#1
BEQ softshift49
CMP R0,#1
BEQ shift0
CMP R0,#2
BEQ shift1
CMP R0,#3
BEQ shift2
CMP R0,#0
BEQ shift3
LDMFD R13!,{PC}

.softshift49
CMP R0,#1
BEQ shift490
CMP R0,#2
BEQ shift491
CMP R0,#3
BEQ shift492
CMP R0,#0
BEQ shift493
LDMFD R13!,{PC}


.shift0
.loopc
STMFD R13!,{R10-R11}
#rept 7
LDMIA R11!,{R0-R7}
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
STMIA R10!,{R0-R7}
#endr
LDMIA R11!,{R0-R3}
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
MOV R0,R0
STMIA R10!,{R0-R3}
LDMFD R13!,{R10-R11}
ADD R10,R10,#canvaswidth
ADD R11,R11,#hbytes
SUBS R9,R9,#1
BGT loopc
LDMFD R13!,{PC}

.shift1
.loopb
STMFD R13!,{R10-R11}

#rept 7
LDMIA R11!,{R0-R8}
SUB R11,R11,#4
MOV R0,R0,LSR #8
ORR R0,R0,R1,LSL #24
MOV R1,R1,LSR #8
ORR R1,R1,R2,LSL #24
MOV R2,R2,LSR #8
ORR R2,R2,R3,LSL #24
MOV R3,R3,LSR #8
ORR R3,R3,R4,LSL #24
MOV R4,R4,LSR #8
ORR R4,R4,R5,LSL #24
MOV R5,R5,LSR #8
ORR R5,R5,R6,LSL #24
MOV R6,R6,LSR #8
ORR R6,R6,R7,LSL #24
MOV R7,R7,LSR #8
ORR R7,R7,R8,LSL #24
STMIA R10!,{R0-R7}
#endr

LDMIA R11!,{R0-R4}
SUB R11,R11,#4
MOV R0,R0,LSR #8
ORR R0,R0,R1,LSL #24
MOV R1,R1,LSR #8
ORR R1,R1,R2,LSL #24
MOV R2,R2,LSR #8
ORR R2,R2,R3,LSL #24
MOV R3,R3,LSR #8
ORR R3,R3,R4,LSL #24
STMIA R10!,{R0-R3}
LDMFD R13!,{R10-R11}
ADD R10,R10,#canvaswidth
ADD R11,R11,#hbytes
SUBS R9,R9,#1
BGT loopb
LDMFD R13!,{PC}

.shift2
.loopd
STMFD R13!,{R10-R11}

#rept 7
LDMIA R11!,{R0-R8}
SUB R11,R11,#4
MOV R0,R0,LSR #16
ORR R0,R0,R1,LSL #16
MOV R1,R1,LSR #16
ORR R1,R1,R2,LSL #16
MOV R2,R2,LSR #16
ORR R2,R2,R3,LSL #16
MOV R3,R3,LSR #16
ORR R3,R3,R4,LSL #16
MOV R4,R4,LSR #16
ORR R4,R4,R5,LSL #16
MOV R5,R5,LSR #16
ORR R5,R5,R6,LSL #16
MOV R6,R6,LSR #16
ORR R6,R6,R7,LSL #16
MOV R7,R7,LSR #16
ORR R7,R7,R8,LSL #16
STMIA R10!,{R0-R7}
#endr

LDMIA R11!,{R0-R4}
SUB R11,R11,#4
MOV R0,R0,LSR #16
ORR R0,R0,R1,LSL #16
MOV R1,R1,LSR #16
ORR R1,R1,R2,LSL #16
MOV R2,R2,LSR #16
ORR R2,R2,R3,LSL #16
MOV R3,R3,LSR #16
ORR R3,R3,R4,LSL #16
STMIA R10!,{R0-R3}
LDMFD R13!,{R10-R11}
ADD R10,R10,#canvaswidth
ADD R11,R11,#hbytes
SUBS R9,R9,#1
BGT loopd
LDMFD R13!,{PC}

.shift3
.loope
STMFD R13!,{R10-R11}

#rept 7
LDMIA R11!,{R0-R8}
SUB R11,R11,#4
MOV R0,R0,LSR #24
ORR R0,R0,R1,LSL #8
MOV R1,R1,LSR #24
ORR R1,R1,R2,LSL #8
MOV R2,R2,LSR #24
ORR R2,R2,R3,LSL #8
MOV R3,R3,LSR #24
ORR R3,R3,R4,LSL #8
MOV R4,R4,LSR #24
ORR R4,R4,R5,LSL #8
MOV R5,R5,LSR #24
ORR R5,R5,R6,LSL #8
MOV R6,R6,LSR #24
ORR R6,R6,R7,LSL #8
MOV R7,R7,LSR #24
ORR R7,R7,R8,LSL #8
STMIA R10!,{R0-R7}
#endr

LDMIA R11!,{R0-R4}
SUB R11,R11,#4
MOV R0,R0,LSR #24
ORR R0,R0,R1,LSL #8
MOV R1,R1,LSR #24
ORR R1,R1,R2,LSL #8
MOV R2,R2,LSR #24
ORR R2,R2,R3,LSL #8
MOV R3,R3,LSR #24
ORR R3,R3,R4,LSL #8
STMIA R10!,{R0-R3}
LDMFD R13!,{R10-R11}
ADD R10,R10,#canvaswidth
ADD R11,R11,#hbytes
SUBS R9,R9,#1
BGT loope
LDMFD R13!,{PC}

.shift490
.loop49c
STMFD R13!,{R9-R11}
ADD R9,R10,#320
#rept 7
LDMIA R11!,{R0-R7}
STMIA R10!,{R0-R7}
STMIA R9!,{R0-R7}
#endr
LDMIA R11!,{R0-R3}
STMIA R10!,{R0-R3}
STMIA R9!,{R0-R3}
LDMFD R13!,{R9-R11}
ADD R10,R10,#canvaswidth*2
ADD R11,R11,#hbytes
SUBS R9,R9,#1
BGT loop49c
LDMFD R13!,{PC}

.shift491
.loop49b
STMFD R13!,{R9-R11}
ADD R9,R10,#320
#rept 7
LDMIA R11!,{R0-R8}
SUB R11,R11,#4
MOV R0,R0,LSR #8
ORR R0,R0,R1,LSL #24
MOV R1,R1,LSR #8
ORR R1,R1,R2,LSL #24
MOV R2,R2,LSR #8
ORR R2,R2,R3,LSL #24
MOV R3,R3,LSR #8
ORR R3,R3,R4,LSL #24
MOV R4,R4,LSR #8
ORR R4,R4,R5,LSL #24
MOV R5,R5,LSR #8
ORR R5,R5,R6,LSL #24
MOV R6,R6,LSR #8
ORR R6,R6,R7,LSL #24
MOV R7,R7,LSR #8
ORR R7,R7,R8,LSL #24
STMIA R10!,{R0-R7}
STMIA R9!,{R0-R7}
#endr

LDMIA R11!,{R0-R4}
SUB R11,R11,#4
MOV R0,R0,LSR #8
ORR R0,R0,R1,LSL #24
MOV R1,R1,LSR #8
ORR R1,R1,R2,LSL #24
MOV R2,R2,LSR #8
ORR R2,R2,R3,LSL #24
MOV R3,R3,LSR #8
ORR R3,R3,R4,LSL #24
STMIA R10!,{R0-R3}
STMIA R9!,{R0-R3}
LDMFD R13!,{R9-R11}
ADD R10,R10,#canvaswidth*2
ADD R11,R11,#hbytes
SUBS R9,R9,#1
BGT loop49b
LDMFD R13!,{PC}

.shift492
.loop49d
STMFD R13!,{R9-R11}
ADD R9,R10,#320

#rept 7
LDMIA R11!,{R0-R8}
SUB R11,R11,#4
MOV R0,R0,LSR #16
ORR R0,R0,R1,LSL #16
MOV R1,R1,LSR #16
ORR R1,R1,R2,LSL #16
MOV R2,R2,LSR #16
ORR R2,R2,R3,LSL #16
MOV R3,R3,LSR #16
ORR R3,R3,R4,LSL #16
MOV R4,R4,LSR #16
ORR R4,R4,R5,LSL #16
MOV R5,R5,LSR #16
ORR R5,R5,R6,LSL #16
MOV R6,R6,LSR #16
ORR R6,R6,R7,LSL #16
MOV R7,R7,LSR #16
ORR R7,R7,R8,LSL #16
STMIA R10!,{R0-R7}
STMIA R9!,{R0-R7}
#endr

LDMIA R11!,{R0-R4}
SUB R11,R11,#4
MOV R0,R0,LSR #16
ORR R0,R0,R1,LSL #16
MOV R1,R1,LSR #16
ORR R1,R1,R2,LSL #16
MOV R2,R2,LSR #16
ORR R2,R2,R3,LSL #16
MOV R3,R3,LSR #16
ORR R3,R3,R4,LSL #16
STMIA R10!,{R0-R3}
STMIA R9!,{R0-R3}
LDMFD R13!,{R9-R11}
ADD R10,R10,#canvaswidth*2
ADD R11,R11,#hbytes
SUBS R9,R9,#1
BGT loop49d
LDMFD R13!,{PC}

.shift493
.loop49e
STMFD R13!,{R9-R11}
ADD R9,R10,#320

#rept 7
LDMIA R11!,{R0-R8}
SUB R11,R11,#4
MOV R0,R0,LSR #24
ORR R0,R0,R1,LSL #8
MOV R1,R1,LSR #24
ORR R1,R1,R2,LSL #8
MOV R2,R2,LSR #24
ORR R2,R2,R3,LSL #8
MOV R3,R3,LSR #24
ORR R3,R3,R4,LSL #8
MOV R4,R4,LSR #24
ORR R4,R4,R5,LSL #8
MOV R5,R5,LSR #24
ORR R5,R5,R6,LSL #8
MOV R6,R6,LSR #24
ORR R6,R6,R7,LSL #8
MOV R7,R7,LSR #24
ORR R7,R7,R8,LSL #8
STMIA R10!,{R0-R7}
STMIA R9!,{R0-R7}
#endr

LDMIA R11!,{R0-R4}
SUB R11,R11,#4
MOV R0,R0,LSR #24
ORR R0,R0,R1,LSL #8
MOV R1,R1,LSR #24
ORR R1,R1,R2,LSL #8
MOV R2,R2,LSR #24
ORR R2,R2,R3,LSL #8
MOV R3,R3,LSR #24
ORR R3,R3,R4,LSL #8
STMIA R10!,{R0-R3}
STMIA R9!,{R0-R3}
LDMFD R13!,{R9-R11}
ADD R10,R10,#canvaswidth*2
ADD R11,R11,#hbytes
SUBS R9,R9,#1
BGT loop49e
LDMFD R13!,{PC}

.plotbackdrop
STMFD R13!,{R14}
MOV R0,#edgetab
SWI Amnesia_WipeTable
BL updatescrollinc
LDR R0,[R12,#v.backdrop]
SUB R0,R0,#4
LDR R5,[R0,#4]
LDR R1,[R0,#8]
ADD R0,R0,R1;indirect to first sprite
ADD R9,R12,#v.backbuf2
MOV R6,#16
.loop21
LDR R1,[R0,#32]
ADD R11,R0,R1
STR R11,[R9],#4
CMP R5,#1
LDRGT R1,[R0]
ADDGT R0,R0,R1;indirect to next sprite
SUB R5,R5,#1
SUBS R6,R6,#1
BGT loop21

LDR R10,[R12,#v.canvasadr]
ADD R10,R10,#(canvaswidth-windwidth)/2

ADD R0,R10,#canvaswidth*canvasheight
STR R0,[R12,#v.canvasend]
LDR R9,[R12,#v.levelnet]

LDR R1,[R12,#v.xplotofs]
SUB R1,R1,#88<<12
RSB R1,R1,#0
MOV R1,R1,ASR #12
;AND R1,R1,#&5FFFFF
ADD R1,R1,#3
MOV R2,#bkwidth
MYDIV R0,R1,R2
CMP R1,#0
ADDLT R1,R1,#96
SUBLT R0,R0,#1
LDR R5,[R9,#net.xsize]
ADD R0,R0,R5,LSR #1
STR R0,[R12,#v.netxpos]
MOV R3,R1  ;R3 is xplotofs MOD 96 in pixels
LDR R1,[R12,#v.yplotofs]
SUB R1,R1,#48<<12
RSB R1,R1,#0
MOV R1,R1,ASR #12
;AND R1,R1,#&5FFFFF
MOV R2,#bkheight
MYDIV R0,R1,R2
CMP R1,#0
ADDLT R1,R1,#96
SUBLT R0,R0,#1
LDR R5,[R9,#net.ysize]
ADD R0,R0,R5,LSR #1
STR R0,[R12,#v.netypos]
MOV R4,R1  ;likewise R4 for yplotofs
CMP R3,#96
BGE diverror
CMP R3,#0
BLT diverror
BIC R0,R3,#3
ADR R1,linewrites
LDR R2,[R1,R0]
ADD R7,R2,R1
MOV R1,#bkwidth
MUL R8,R4,R1
ADD R9,R11,#bkwidth*bkheight
LDR R6,[R12,#v.canvasend]
BL backreload
.loopa
STMFD R13!,{R6-R12}
ADD R9,R12,#v.backbuf
LDR R11,[R9],#4
MOV R0,R8
LDR R1,[R12,#v.helltype]
CMP R1,#&1E
LDREQ R1,[R12,#v.vwarpinc]
LDRNE R1,[R12,#v.vscrollinc]
ADD R12,R0,R1
CMP R12,#bkwidth*bkheight
SUBGE R12,R12,#bkwidth*bkheight
TST R11,#1<<31
BIC R11,R11,#1<<31
ADDEQ R11,R11,R8
ADDNE R11,R11,R12
MOV R14,PC
MOV PC,R7
LDMFD R13!,{R6-R12}
ADD R8,R8,#bkwidth
CMP R8,#bkwidth*bkheight
BLGE backreloadinc
ADD R10,R10,#hbytes
CMP R10,R6
BLT loopa
LDMFD R13!,{PC}



.makehell
LDR R0,[R12,#v.helltype]
CMP R0,#&1E
BEQ makewarp
STMFD R13!,{R7-R11,R14}
LDR R6,[R12,#v.helltimer]
MOV R6,R6,ASL #4
ADR R1,circletab
LDR R11,[R12,#v.hellcont]
BIC R11,R11,#1<<31
LDR R10,[R12,#v.helladr]
MOV R8,#96
.loop24
ADD R6,R6,#21
AND R0,R6,#&7F8
ADR R1,circletab
LDR R1,[R1,R0]
LDR R9,[R12,#v.hscrollinc]
ADDS R9,R9,R1,ASR #28
ADDMI R9,R9,#96
CMP R9,#96
SUBGE R9,R9,#96
AND R0,R9,#3
BIC R9,R9,#3
ADR R1,hellshift
LDR R0,[R1,R0,LSL #2]
ADD R1,R1,R0
STMFD R13!,{R6-R8,R11}
MOV R14,PC
MOV PC,R1
LDMFD R13!,{R6-R8,R11}

ADD R11,R11,#96
SUBS R8,R8,#1
BGT loop24
LDMFD R13!,{R7-R11,PC}

.makewarp
STMFD R13!,{R7-R11,R14}
LDR R6,[R12,#v.helltimer]
MOV R6,R6,ASL #4
ADR R1,circletab
ADD R11,R12,#v.backbuf2
LDR R11,[R11,#12]
ADD R5,R11,#96*96
LDR R1,[R12,#v.vwarpinc]
RSB R1,R1,#96*96
LDR R0,[R12,#v.vscrollinc]
ADD R0,R0,R1
ADD R11,R11,R0
MOV R0,R0,LSL #12
DIV96 R0,R1
MOV R2,#21
MUL R0,R1,R2
ADD R6,R6,R0
LDR R10,[R12,#v.helladr]
ADD R10,R10,#96*96
MOV R8,#32
.loop78
CMP R11,R5
SUBGE R11,R11,#96*96
ADD R6,R6,#21
AND R0,R6,#&7F8
ADR R1,circletab
LDR R1,[R1,R0]
LDR R9,[R12,#v.hwarpinc]
RSB R9,R9,#95
LDR R2,[R12,#v.hscrollinc]
ADD R9,R9,R2
ADDS R9,R9,R1,ASR #28
ADDMI R9,R9,#96
CMP R9,#96
SUBGE R9,R9,#96
CMP R9,#0
ADDLT R9,R9,#96
CMP R9,#96
SUBGE R9,R9,#96

AND R0,R9,#3
BIC R9,R9,#3
ADR R1,hellshift
LDR R0,[R1,R0,LSL #2]
ADD R1,R1,R0
STMFD R13!,{R5-R8,R11}
MOV R14,PC
MOV PC,R1
LDMFD R13!,{R5-R8,R11}

ADD R11,R11,#96
SUBS R8,R8,#1
BGT loop78
LDR R10,[R12,#v.hellcont]
BIC R10,R10,#1<<31
LDR R11,[R12,#v.helladr]
ADD R11,R11,#96*96
MOV R9,#16
.loop76
ADD R10,R10,#16
ADD R11,R11,#16
LDMIA R11,{R0-R3}
STMIA R10,{R0-R3}
ADD R10,R10,#16*2
ADD R11,R11,#16*2
LDMIA R11,{R0-R7}
STMIA R10,{R0-R7}
ADD R10,R10,#16*3
ADD R11,R11,#16*3
SUBS R9,R9,#1
BGT loop76

MOV R9,#16
.loop77
ADD R10,R10,#16*3
ADD R11,R11,#16*3
LDMIA R11,{R0-R3}
STMIA R10,{R0-R3}
ADD R10,R10,#16*3
ADD R11,R11,#16*3
SUBS R9,R9,#1
BGT loop77

;stage 2

LDR R11,[R12,#v.hellcont]
BIC R11,R11,#1<<31
LDR R10,[R12,#v.helladr]
MOV R8,#96
.loop79
LDR R9,[R12,#v.hwarpinc]
AND R0,R9,#3
BIC R9,R9,#3
ADR R1,hellshift
LDR R0,[R1,R0,LSL #2]
ADD R1,R1,R0
STMFD R13!,{R6-R8,R11}
MOV R14,PC
MOV PC,R1
LDMFD R13!,{R6-R8,R11}

ADD R11,R11,#96
SUBS R8,R8,#1
BGT loop79
LDMFD R13!,{R7-R11,PC}


.backreloadinc
LDR R0,[R12,#v.netypos]
ADD R0,R0,#1
STR R0,[R12,#v.netypos]
MOV R8,#0

.backreload
STMFD R13!,{R6-R10,R14}
MOV R0,#0
STR R0,[R12,#v.helltemp]
LDR R0,[R12,#v.levelnet]
LDR R1,[R12,#v.netxpos]
LDR R2,[R12,#v.netypos]
LDR R3,[R0,#net.xsize];x size
LDR R4,[R0,#net.ysize];y size
ADD R0,R0,#net.data
ADD R9,R12,#v.backbuf
ADD R8,R12,#v.backbuf2
CMN R2,#1
CMPGT R4,R2

MULGT R5,R3,R2
ADDGT R0,R0,R5
MOVLE R0,#0
LDR R5,[R12,#v.scanlock]
CMP R5,#1
BNE backlockskip
CMP R2,#32
MOVGE R0,#0
.backlockskip
MOV R5,#4

.loop20
STMFD R13!,{R0}
LDR R0,[R12,#v.scanlock]
CMP R0,#1
LDMFD R13!,{R0}
BNE backlockskip2
CMP R1,#32
MOVGE R0,#0
.backlockskip2
CMN R1,#1
CMPGT R3,R1
CMPGT R0,#0
MOV R7,#hellno
BLE backreloffnet
LDRB R7,[R0,R1]

CMP R7,#hellno
BLT noaddwarp
CMP R7,#hellno+16
BGE noaddwarp
BL edgehell
CMP R7,#&1C

BLGE addwarp

.noaddwarp
CMP R7,#&4F
BLEQ addsparkoff
CMP R7,#&4E
BLEQ addsparkon
CMP R7,#&4D
BLEQ addredoff
CMP R7,#&4C
BLEQ addredon

CMP R7,#12
BLLT noaddtelep
CMP R7,#16
BLLT addtelep
.noaddtelep
CMP R7,#&AB
BLT noaddsecret
CMP R7,#&B0
BGE noaddsecret
BL addsecret
.noaddsecret

CMP R7,#&20
BLT backreloffnet
CMP R7,#&2F
BLLT addarrow
.backreloffnet

ADR R6,stonetab
LDRB R7,[R6,R7]
CMP R7,#1
BLEQ phasetelep
AND R6,R7,#&0F

CMP R6,#16
MOVGT R6,#0
LDR R6,[R8,R6,LSL #2]
CMP R7,#&13
CMPNE R7,#&1E
STREQ R7,[R12,#v.helltype]
STREQ R6,[R12,#v.helltemp]
LDREQ R6,[R12,#v.helladr]
ORREQ R6,R6,#1<<31
STR R6,[R9],#4
ADD R1,R1,#1
SUBS R5,R5,#1
BGT loop20
LDR R0,[R12,#v.helltemp]
LDR R1,[R12,#v.hellcont]
CMP R0,#0
CMPNE R0,R1; maybe
LDMEQFD R13!,{R6-R10,PC}
STR R0,[R12,#v.hellcont]
BL makehell
LDMFD R13!,{R6-R10,PC}

.addarrow
STMFD R13!,{R0-R11,R14}
SUB R3,R1,R3,LSR #1
SUB R4,R2,R4,LSR #1
SUB R1,R7,#&20
MOV R7,#96<<12
MUL R3,R7,R3
MUL R4,R7,R4
BL arrowmake
LDMFD R13!,{R0-R11,PC}

.addsparkoff

STMFD R13!,{R0-R11,R14}
SUB R3,R1,R3,LSR #1
SUB R4,R2,R4,LSR #1
SUB R1,R7,#&20
MOV R7,#96<<12
MUL R3,R7,R3
MUL R4,R7,R4

MOV R0,#edgetab
MOV R1,#(decortab<<24)+4
MOV R2,#%1000000001010001
SWI Amnesia_MakeObject

MOV R0,#edgetab
MOV R1,#(texttab<<24)+"O"
MOV R2,#%1000000001010001
SUB R3,R3,#13<<12
SWI Amnesia_MakeObject

MOV R0,#edgetab
MOV R1,#(texttab<<24)+"F"
MOV R2,#%1000000001010001
ADD R3,R3,#13<<12
SWI Amnesia_MakeObject
MOV R0,#edgetab
MOV R1,#(texttab<<24)+"F"
MOV R2,#%1000000001010001
ADD R3,R3,#13<<12
SWI Amnesia_MakeObject

LDMFD R13!,{R0-R11,PC}

.addsparkon

STMFD R13!,{R0-R11,R14}
SUB R3,R1,R3,LSR #1
SUB R4,R2,R4,LSR #1
SUB R1,R7,#&20
MOV R7,#96<<12
MUL R3,R7,R3
MUL R4,R7,R4

MOV R0,#edgetab
MOV R1,#(decortab<<24)+4
MOV R2,#%1000000001010001
SWI Amnesia_MakeObject

MOV R0,#edgetab
MOV R1,#(texttab<<24)+"O"
MOV R2,#%1000000001010001
SUB R3,R3,#7<<12
SWI Amnesia_MakeObject

MOV R0,#edgetab
MOV R1,#(texttab<<24)+"N"
MOV R2,#%1000000001010001
ADD R3,R3,#13<<12
SWI Amnesia_MakeObject

LDMFD R13!,{R0-R11,PC}

.addredoff

STMFD R13!,{R0-R11,R14}
SUB R3,R1,R3,LSR #1
SUB R4,R2,R4,LSR #1
SUB R1,R7,#&20
MOV R7,#96<<12
MUL R3,R7,R3
MUL R4,R7,R4
SUB R4,R4,#16<<12
MOV R0,#edgetab
MOV R1,#(ballstab<<24)+2
MOV R2,#%1000000001010001
SWI Amnesia_MakeObject
ADD R4,R4,#40<<12
MOV R0,#edgetab
MOV R1,#(texttab<<24)+"O"
MOV R2,#%1000000001010001
SUB R3,R3,#13<<12
SWI Amnesia_MakeObject

MOV R0,#edgetab
MOV R1,#(texttab<<24)+"F"
MOV R2,#%1000000001010001
ADD R3,R3,#13<<12
SWI Amnesia_MakeObject
MOV R0,#edgetab
MOV R1,#(texttab<<24)+"F"
MOV R2,#%1000000001010001
ADD R3,R3,#13<<12
SWI Amnesia_MakeObject

LDMFD R13!,{R0-R11,PC}

.addredon

STMFD R13!,{R0-R11,R14}
SUB R3,R1,R3,LSR #1
SUB R4,R2,R4,LSR #1
SUB R1,R7,#&20
MOV R7,#96<<12
MUL R3,R7,R3
MUL R4,R7,R4
SUB R4,R4,#16<<12
MOV R0,#edgetab
MOV R1,#(ballstab<<24)+2
MOV R2,#%1000000001010001
SWI Amnesia_MakeObject
ADD R4,R4,#40<<12
MOV R0,#edgetab
MOV R1,#(texttab<<24)+"O"
MOV R2,#%1000000001010001
SUB R3,R3,#7<<12
SWI Amnesia_MakeObject

MOV R0,#edgetab
MOV R1,#(texttab<<24)+"N"
MOV R2,#%1000000001010001
ADD R3,R3,#13<<12
SWI Amnesia_MakeObject

LDMFD R13!,{R0-R11,PC}


.addtelep
STMFD R13!,{R0-R11,R14}
LDR R0,[R12,#v.sparks]
CMP R0,#1
LDMNEFD R13!,{R0-R11,PC}
SUB R3,R1,R3,LSR #1
SUB R4,R2,R4,LSR #1
MOV R7,#96<<12
MUL R3,R7,R3
MUL R4,R7,R4
BL random
AND R1,R0,#3<<16
ADD R1,R1,#(decortab<<24)+4
MOV R2,#%1000000001010001
MOV R0,#edgetab
SWI Amnesia_MakeObject
LDMFD R13!,{R0-R11,PC}

.addsecret
STMFD R13!,{R0-R11,R14}
SUB R3,R1,R3,LSR #1
SUB R4,R2,R4,LSR #1
MOV R7,#96<<12
MUL R3,R7,R3
MUL R4,R7,R4
LDR R1,[R12,#v.frameinc]
CMP R1,#1
MOV R1,#&1F
MOVLE R1,#&3F
BL random
TST R0,R1
BLEQ addglint

LDR R0,[R12,#v.scanspeed]
CMP R0,#5
LDMLTFD R13!,{R0-R11,PC}
LDR R0,[R12,#v.framectr]
TST R0,#&1C
LDMNEFD R13!,{R0-R11,PC}
MOV R0,R3
MOV R1,R4
MOV R3,#&FF
BL scanblockadd
LDMFD R13!,{R0-R11,PC}

.addwarp
STMFD R13!,{R0-R11,R14}
SUB R3,R1,R3,LSR #1
SUB R4,R2,R4,LSR #1
MOV R7,#96<<12
MUL R3,R7,R3
MUL R4,R7,R4
STMFD R13!,{R3,R4}
LDR R5,[R12,#v.levelno]
TST R5,#&400
BNE addbonuswarp
MOV R5,R3
MOV R6,R4
LDR R0,[R12,#v.hwarpinc]
SUB R3,R3,R0,ASL #12
LDR R0,[R12,#v.vwarpinc]
MOV R0,R0,ASL #12
DIV96 R0,R1
SUB R4,R4,R1,ASL #12
ADD R7,R12,#v.warptimer
LDR R8,[R12,#v.warped]
AND R8,R8,#&FF
CMP R8,#7
MOVGT R8,#7
.loop84
SUBS R8,R8,#1
BMI addwarpend
LDR R1,[R7],#4
STMFD R13!,{R3-R8}
ADD R1,R1,#&80
AND R1,R1,#&7F8
ADR R2,circletab

LDR R0,[R2,R1]!
MOV R0,R0,ASR #14
ADD R0,R0,R0,ASR #1
ADD R0,R0,R0,ASR #3
ADD R3,R3,R0

LDR R0,[R2,#4]
MOV R0,R0,ASR #14
ADD R0,R0,R0,ASR #1
ADD R0,R0,R0,ASR #3
ADD R4,R4,R0

ADD R4,R4,#40<<12
SUB R3,R3,#8<<12

SUB R0,R3,R5
CMP R0,#48<<12
SUBGE R3,R3,#96<<12
CMP R0,#-48<<12
ADDLE R3,R3,#96<<12
SUB R0,R3,R5
CMP R0,#-48<<12
ADDLE R3,R3,#96<<12
SUB R0,R4,R6
CMP R0,#48<<12
SUBGE R4,R4,#96<<12
CMP R0,#-48<<12
ADDLE R4,R4,#96<<12
MOV R1,#(ballstab<<24)+(1<<16)
MOV R2,#%10001
MOV R0,#edgetab
SWI Amnesia_MakeObject
LDMFD R13!,{R3-R8}
B loop84

.addwarpend

LDMFD R13!,{R3,R4}

LDR R0,[R12,#v.sparks]
CMP R0,#1
LDMNEFD R13!,{R0-R11,PC}

BL addglint
BL random
AND R1,R0,#3<<16
ADD R1,R1,#(decortab<<24)+4
MOV R2,#%1000000001010001
MOV R0,#edgetab
SWI Amnesia_MakeObject

LDMFD R13!,{R0-R11,PC}

.addbonuswarp

LDR R0,[R12,#v.sparks]
CMP R0,#1
BEQ addwarpend
LDR R0,[R12,#v.newlevelctr]
CMP R0,#0
BNE addwarpend
LDR R0,[R12,#v.framectr]
AND R0,R0,#&7F
CMP R0,#&40
RSBGT R0,R0,#&80
SUB R0,R0,#&20
ADD R4,R4,R0,ASL #12
SUB R3,R3,#18<<12
MOV R0,#edgetab
MOV R1,#(texttab<<24)+"E"
MOV R2,#%10001
SWI Amnesia_MakeObject
ADD R3,R3,#12<<12
MOV R0,#edgetab
MOV R1,#(texttab<<24)+"X"
MOV R2,#%10001
SWI Amnesia_MakeObject
ADD R3,R3,#12<<12
MOV R0,#edgetab
MOV R1,#(texttab<<24)+"I"
MOV R2,#%10001
SWI Amnesia_MakeObject
ADD R3,R3,#12<<12
MOV R0,#edgetab
MOV R1,#(texttab<<24)+"T"
MOV R2,#%10001
SWI Amnesia_MakeObject
ADD R3,R3,#12<<12
B addwarpend

.addglint
STMFD R13!,{R0-R4,R14}
BL random
AND R0,R0,#&3FFFF
ADD R0,R0,R0,LSR #1
SUB R0,R0,#48<<12
ADD R3,R3,R0
BL random
AND R0,R0,#&3FFFF
ADD R0,R0,R0,LSR #1
SUB R0,R0,#48<<12
ADD R4,R4,R0
MOV R1,#2
BL decorate
LDMFD R13!,{R0-R4,PC}




.phasetelep
LDR R7,[R12,#v.framectr]
MOV R7,R7,LSR #3
AND R7,R7,#3
CMP R7,#3
MOVEQ R7,#1
MOV PC,R14

.edgehell
STMFD R13!,{R0-R11,R14}
LDR R5,[R12,#v.scanlock]
CMP R5,#1
MOV R5,R3
MOV R6,R4
MOV R8,R3
MOVEQ R5,#32
MOVEQ R6,#32
SUB R3,R1,R3,LSR #1
SUB R4,R2,R4,LSR #1
MOV R7,#96<<12
MUL R3,R7,R3
MUL R4,R7,R4
ADD R0,R0,R1

SUB R6,R6,#1  ;do down first so we can lose R6
CMP R2,R6



LDRLTB R7,[R0,R8]
MOVGE R7,#256
CMP R7,#&2F
MOVEQ R7,#256
CMP R7,#hellno
BLT edins1
CMP R7,#hellno+16
MOVLT R7,#256
.edins1
CMP R7,#&80
BLLT edgedown

CMP R1,#0
LDRGTB R7,[R0,#-1]
MOVLE R7,#256
CMP R7,#&2F
MOVEQ R7,#256
CMP R7,#hellno
BLT edins2
CMP R7,#hellno+16
MOVLT R7,#256
.edins2
CMP R7,#&80
BLLT edgeleft

ADD R1,R1,#1
CMP R1,R5
LDRLTB R7,[R0,#1]
MOVGE R7,#256
CMP R7,#&2F
MOVEQ R7,#256
CMP R7,#hellno
BLT edins3
CMP R7,#hellno+16
MOVLT R7,#256
.edins3
CMP R7,#&80
BLLT edgeright

CMP R2,#0
LDRGTB R7,[R0,-R8]
MOVLE R7,#256
CMP R7,#&2F
MOVEQ R7,#256
CMP R7,#hellno
BLT edins4
CMP R7,#hellno+16
MOVLT R7,#256
.edins4
CMP R7,#&80
BLLT edgeup

LDMFD R13!,{R0-R11,PC}

.edgeleft
STMFD R13!,{R0-R8,R14}
MOV R0,#edgetab
MOV R1,#(edgetab<<24)+1
MOV R2,#%1000000001010001
SUB R3,R3,#40<<12
SWI Amnesia_MakeObject
LDMFD R13!,{R0-R8,PC}
.edgeright
STMFD R13!,{R0-R8,R14}
MOV R0,#edgetab
MOV R1,#(edgetab<<24)
MOV R2,#%1000000001010001
ADD R3,R3,#40<<12
SWI Amnesia_MakeObject
LDMFD R13!,{R0-R8,PC}
.edgeup
STMFD R13!,{R0-R8,R14}
MOV R0,#edgetab
MOV R1,#(edgetab<<24)+3
MOV R2,#%1000000001010001
SUB R4,R4,#40<<12
SWI Amnesia_MakeObject
LDMFD R13!,{R0-R8,PC}
.edgedown
STMFD R13!,{R0-R8,R14}
MOV R0,#edgetab
MOV R1,#(edgetab<<24)+2
MOV R2,#%1000000001010001
ADD R4,R4,#40<<12
SWI Amnesia_MakeObject
LDMFD R13!,{R0-R8,PC}

.arrowmake
STMFD R13!,{R14}
MOV R0,#edgetab
AND R1,R1,#&F
CMP R1,#8
BEQ redsourcemake
CMP R1,#5
MOVGT R1,#5
ADD R1,R1,#(arrowtab<<24)
MOV R2,#%1000000001010001
SWI Amnesia_MakeObject
LDMFD R13!,{PC}

.redsourcemake
LDR R0,[R12,#v.redball]
CMP R0,#1
LDMNEFD R13!,{PC}
BL random
AND R0,R0,#&3FFFF
SUB R0,R0,#&1FFFF
ADD R3,R3,R0
BL random
AND R0,R0,#&3FFFF
SUB R0,R0,#&1FFFF
ADD R4,R4,R0
MOV R0,#edgetab
MOV R1,#(decortab<<24)+(1<<16)+2
MOV R2,#%1000000001010001
SWI Amnesia_MakeObject
LDMFD R13!,{PC}


.updatescrollinc
LDR R0,[R12,#v.helltimer]
ADD R0,R0,#1
STR R0,[R12,#v.helltimer]
MOV R0,#0
STR R0,[R12,#v.hellcont]
MOV R3,#0
LDR R1,[R12,#v.xplotofs]
SUB R1,R1,R1,ASR #3
MOV R1,R1,ASR #12
CMP R1,#0
RSBLT R1,R1,#0
MOVLT R3,#1
MOV R2,#96
MYDIV R0,R1,R2
CMP R3,#1
RSBEQ R1,R1,#95
STR R1,[R12,#v.hscrollinc]
MOV R3,#0
LDR R1,[R12,#v.yplotofs]
SUB R1,R1,R1,ASR #3
MOV R1,R1,ASR #12
CMP R1,#0
RSBLT R1,R1,#0
MOVLT R3,#1
MOV R2,#96
MYDIV R0,R1,R2
CMP R3,#1
RSBEQ R1,R1,#95
MOV R2,#bkwidth
MUL R0,R2,R1
STR R0,[R12,#v.vscrollinc]


MOV R3,#0
LDR R1,[R12,#v.xplotofs]
SUB R1,R1,R1,ASR #5
MOV R1,R1,ASR #12
CMP R1,#0
RSBLT R1,R1,#0
MOVLT R3,#1
MOV R2,#96
MYDIV R0,R1,R2
CMP R3,#1
RSBEQ R1,R1,#95
STR R1,[R12,#v.hwarpinc]
MOV R3,#0
LDR R1,[R12,#v.yplotofs]
SUB R1,R1,R1,ASR #5
MOV R1,R1,ASR #12
CMP R1,#0
RSBLT R1,R1,#0
MOVLT R3,#1
MOV R2,#96
MYDIV R0,R1,R2
CMP R3,#1
RSBEQ R1,R1,#95
MOV R2,#bkwidth
MUL R0,R2,R1
STR R0,[R12,#v.vwarpinc]
MOV PC,R14



.showrate
STMFD R13!,{R14}
LDR R0,[R12,#v.realrate]
CMP R0,#9
MOVGT R0,#10
ADD R0,R0,#"0"
ADD R0,R0,#texttab<<24
MOV R1,#52
MOV R2,#12
SWI FastSpr_Plot
LDMFD R13!,{PC}

.showattn
STMFD R13!,{R14}
LDR R0,[R12,#v.attnctr]
CMP R0,#9
MOVGT R0,#10
ADD R0,R0,#"0"
ADD R0,R0,#texttab<<24
MOV R1,#52
MOV R2,#28
SWI FastSpr_Plot
LDMFD R13!,{PC}

.showsidepic
STMFD R13!,{R14}
BL loadsidepic
LDR R0,[R12,#v.canvasadr]
LDR R1,[R0,#4]
ADD R0,R0,R1;indirect to first sprite
LDR R1,[R0,#32]
ADD R1,R0,R1;indirect to sprite data
SUB R1,R1,#4
LDR R0,[R12,#v.screenuse]
ADD R0,R0,#240
MOV R2,#80
MOV R3,#240
MOV R4,#320
BL transfer
LDMFD R13!,{PC}

.scanblockadd
STMFD R13!,{R0-R2,R4-R8,R14}
MOV R8,R3
MOV R3,R0
MOV R4,R1
B scanaddins

.scanadd
STMFD R13!,{R0-R2,R4-R8,R14}
MOV R8,R3
LDR R3,[R1,#8]
LDR R4,[R1,#12]
.scanaddins
LDR R0,[R12,#v.scanspeed]
CMP R0,#0
LDMLEFD R13!,{R0-R2,R4-R8,PC}
MOV R7,R3,ASL #1
DIV96 R7,R3
MOV R7,R4,ASL #1
DIV96 R7,R4
LDR R6,[R12,#v.levelnet]
LDR R0,[R6,#net.xsize]
ADD R3,R3,R0
LDR R0,[R6,#net.ysize]
ADD R4,R4,R0

LDR R7,[R12,#v.scanxofs]
SUB R3,R3,R7,ASL #1
LDR R7,[R12,#v.scanyofs]
SUB R4,R4,R7,ASL #1

LDR R6,[R6,#net.xsize]
CMP R3,#0
CMPGE R4,#0
BLT scanmiss
CMP R3,#63
CMPLT R4,#63
BGE scanmiss

LDR R5,[R12,#v.scanadr]
ADD R5,R5,R4,LSL #6
STRB R8,[R5,R3]
ADD R3,R3,#1
STRB R8,[R5,R3]
ADD R3,R3,#64
STRB R8,[R5,R3]
SUB R3,R3,#1
STRB R8,[R5,R3]

.scanmiss
LDMFD R13!,{R0-R2,R4-R8,PC}


.scanupdate
STMFD R13!,{R14}
LDR R0,[R12,#v.scanspeed]
CMP R0,#2
BLT poorscan
LDR R11,[R12,#v.levelnet]
LDR R6,[R11,#net.xsize]
LDR R7,[R11,#net.ysize]
LDR R0,[R12,#v.scanxofs]
LDR R1,[R12,#v.scanyofs]
SUB R2,R6,R0
CMP R2,#32
MOVLT PC,#0
SUB R2,R7,R1
CMP R2,#32
MOVLT PC,#0
LDR R7,[R12,#v.scanadr]
LDR R0,[R11,#net.xsize]
SUB R0,R0,#32
STR R0,[R12,#v.scanxadd]
LDR R0,[R12,#v.scanctr]
LDR R1,[R12,#v.frameinc]
ADD R0,R0,R1
STR R0,[R12,#v.scanctr]
MOV R0,R0,LSR #1
AND R0,R0,#&3F
ADD R9,R7,#64*64
ADD R1,R9,#64*64
STR R1,[R12,#v.scanend]
ADD R9,R9,R0,LSL #6

LDR R0,[R12,#v.scanyofs]
LDR R1,[R11,#net.xsize]
MUL R0,R1,R0
ADD R11,R11,R0
LDR R0,[R12,#v.scanxofs]
ADR R3,scanwtab
AND R4,R0,#3
LDR R4,[R3,R4,LSL #2]
ADD R4,R3,R4
BIC R0,R0,#3
ADD R11,R11,R0
ADD R11,R11,#net.data
MOV R5,#32
LDR R0,[R12,#v.scanspeed]
MOV R14,#0
CMP R0,#2
ORRGE R14,R14,#&C0
CMP R0,#3
ORRGE R14,R14,#&10
CMP R0,#4
ORRGE R14,R14,#&20


ORR R14,R14,R14,LSL #8
ORR R14,R14,R14,LSL #16

ADD R10,R9,#64
ADD R8,R7,#64

.loop43
MOV R6,#64
LDR R1,[R12,#v.scanend]
CMP R9,R1
SUBGE R9,R9,#64*64
CMP R10,R1
SUBGE R10,R10,#64*64
STMFD R13!,{R4,R5}
MOV PC,R4
.scanins
LDMFD R13!,{R4,R5}
ADD R7,R7,#64
ADD R8,R8,#64
ADD R9,R9,#64
ADD R10,R10,#64
LDR R1,[R12,#v.scanxadd]
ADD R11,R11,R1
SUBS R5,R5,#1
BGT loop43
LDMFD R13!,{PC}

.scanwtab
DCD scanw0-scanwtab
DCD scanw1-scanwtab
DCD scanw2-scanwtab
DCD scanw3-scanwtab


.scanw0
.loop44
LDR R0,[R11],#4
ANDS R0,R0,R14
BEQ scan00zero
AND R4,R0,#&FF<<16
ORR R4,R4,R0,LSR #24
ORR R4,R4,R4,LSL #8
AND R5,R0,#&FF<<8
ORR R5,R5,R0,LSL #24
ORR R5,R5,R5,LSR #8

LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
ORR R0,R0,R5,ROR #16
ORR R1,R1,R4,ROR #16
ORR R2,R2,R5,ROR #16
ORR R3,R3,R4,ROR #16

STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
.scan00ins
LDR R0,[R11],#4
ANDS R0,R0,R14
BEQ scan01zero
AND R4,R0,#&FF<<16
ORR R4,R4,R0,LSR #24
ORR R4,R4,R4,LSL #8
AND R5,R0,#&FF<<8
ORR R5,R5,R0,LSL #24
ORR R5,R5,R5,LSR #8

LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
ORR R0,R0,R5,ROR #16
ORR R1,R1,R4,ROR #16
ORR R2,R2,R5,ROR #16
ORR R3,R3,R4,ROR #16

STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
.scan01ins
SUBS R6,R6,#16
BGT loop44
B scanins

.scan00zero
LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
B scan00ins
.scan01zero
LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
B scan01ins

.scanw1
.loop45
LDR R0,[R11]
LDR R1,[R11,#4]!
MOV R0,R0,LSR #8
ORR R0,R0,R1,LSL #24
ANDS R0,R0,R14
BEQ scan10zero
AND R4,R0,#&FF<<16
ORR R4,R4,R0,LSR #24
ORR R4,R4,R4,LSL #8
AND R5,R0,#&FF<<8
ORR R5,R5,R0,LSL #24
ORR R5,R5,R5,LSR #8

LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
ORR R0,R0,R5,ROR #16
ORR R1,R1,R4,ROR #16
ORR R2,R2,R5,ROR #16
ORR R3,R3,R4,ROR #16

STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
.scan10ins
LDR R0,[R11]
LDR R1,[R11,#4]!
MOV R0,R0,LSR #8
ORR R0,R0,R1,LSL #24
ANDS R0,R0,R14
BEQ scan11zero
AND R4,R0,#&FF<<16
ORR R4,R4,R0,LSR #24
ORR R4,R4,R4,LSL #8
AND R5,R0,#&FF<<8
ORR R5,R5,R0,LSL #24
ORR R5,R5,R5,LSR #8

LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
ORR R0,R0,R5,ROR #16
ORR R1,R1,R4,ROR #16
ORR R2,R2,R5,ROR #16
ORR R3,R3,R4,ROR #16

STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
.scan11ins
SUBS R6,R6,#16
BGT loop45
B scanins

.scan10zero
LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
B scan10ins
.scan11zero
LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
B scan11ins

.scanw2
.loop46
LDR R0,[R11]
LDR R1,[R11,#4]!
MOV R0,R0,LSR #16
ORR R0,R0,R1,LSL #16
ANDS R0,R0,R14
BEQ scan20zero
AND R4,R0,#&FF<<16
ORR R4,R4,R0,LSR #24
ORR R4,R4,R4,LSL #8
AND R5,R0,#&FF<<8
ORR R5,R5,R0,LSL #24
ORR R5,R5,R5,LSR #8

LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
ORR R0,R0,R5,ROR #16
ORR R1,R1,R4,ROR #16
ORR R2,R2,R5,ROR #16
ORR R3,R3,R4,ROR #16

STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
.scan20ins
LDR R0,[R11]
LDR R1,[R11,#4]!
MOV R0,R0,LSR #16
ORR R0,R0,R1,LSL #16
ANDS R0,R0,R14
BEQ scan21zero
AND R4,R0,#&FF<<16
ORR R4,R4,R0,LSR #24
ORR R4,R4,R4,LSL #8
AND R5,R0,#&FF<<8
ORR R5,R5,R0,LSL #24
ORR R5,R5,R5,LSR #8

LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
ORR R0,R0,R5,ROR #16
ORR R1,R1,R4,ROR #16
ORR R2,R2,R5,ROR #16
ORR R3,R3,R4,ROR #16

STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
.scan21ins
SUBS R6,R6,#16
BGT loop46
B scanins

.scan20zero
LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
B scan20ins
.scan21zero
LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
B scan21ins

.scanw3
.loop47
LDR R0,[R11]
LDR R1,[R11,#4]!
MOV R0,R0,LSR #24
ORR R0,R0,R1,LSL #8
ANDS R0,R0,R14
BEQ scan30zero
AND R4,R0,#&FF<<16
ORR R4,R4,R0,LSR #24
ORR R4,R4,R4,LSL #8
AND R5,R0,#&FF<<8
ORR R5,R5,R0,LSL #24
ORR R5,R5,R5,LSR #8

LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
ORR R0,R0,R5,ROR #16
ORR R1,R1,R4,ROR #16
ORR R2,R2,R5,ROR #16
ORR R3,R3,R4,ROR #16

STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
.scan30ins
LDR R0,[R11]
LDR R1,[R11,#4]!
MOV R0,R0,LSR #24
ORR R0,R0,R1,LSL #8
ANDS R0,R0,R14
BEQ scan31zero
AND R4,R0,#&FF<<16
ORR R4,R4,R0,LSR #24
ORR R4,R4,R4,LSL #8
AND R5,R0,#&FF<<8
ORR R5,R5,R0,LSL #24
ORR R5,R5,R5,LSR #8

LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
ORR R0,R0,R5,ROR #16
ORR R1,R1,R4,ROR #16
ORR R2,R2,R5,ROR #16
ORR R3,R3,R4,ROR #16

STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
.scan31ins
SUBS R6,R6,#16
BGT loop47
B scanins

.scan30zero
LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
B scan30ins
.scan31zero
LDMIA R9!,{R0-R1}
LDMIA R10!,{R2-R3}
STMIA R7!,{R0-R1}
STMIA R8!,{R2-R3}
B scan31ins

.scanset
STMFD R13!,{R14}
LDR R0,[R12,#v.xpos]
LDR R1,[R12,#v.ypos]
LDR R11,[R12,#v.levelnet]
BIC R0,R0,#&FFF
BIC R1,R1,#&FFF

DIV96 R0,R4
DIV96 R1,R5
LDR R2,[R11,#net.xsize]
LDR R3,[R11,#net.ysize]
SUB R0,R2,#32
SUB R1,R3,#32
ADD R4,R4,R0,LSR #1
ADD R5,R5,R1,LSR #1

CMP R4,#0
MOVLT R4,#0
SUB R2,R2,#32
CMP R4,R2
MOVGT R4,R2
CMP R5,#0
MOVLT R5,#0
SUB R3,R3,#32
CMP R5,R3
MOVGT R5,R3

LDR R2,[R12,#v.scanlock]
CMP R2,#1
MOVEQ R4,#0
MOVEQ R5,#0
STR R4,[R12,#v.scanxofs]
STR R5,[R12,#v.scanyofs]
LDMFD R13!,{PC}

.poorscan
LDR R11,[R12,#v.scanadr]
ADD R10,R11,#64*64
MOV R9,#64*64
.loop48
#rept 4
LDMIA R10!,{R0-R7}
STMIA R11!,{R0-R7}
#endr
SUBS R9,R9,#128
BGT loop48
LDMFD R13!,{PC}



.scanwrite
STMFD R13!,{R14}
LDR R7,[R12,#v.lineskip]
CMP R7,#1
LDR R11,[R12,#v.scanadr]
LDR R0,[R12,#v.scanspeed]
CMP R0,#0
ADDEQ R11,R11,#64*64
LDR R10,[R12,#v.screenuse]
ADD R10,R10,#320*21+248
CMP R7,#1
ADDEQ R10,R10,#320*21
MOV R9,#64
LDR R8,[R12,#v.hbytes]
SUB R8,R8,#64
ADDEQ R8,R8,#320
BEQ scanwrite49
.loop1d
LDMIA R11!,{R0-R7}
STMIA R10!,{R0-R7}
LDMIA R11!,{R0-R7}
STMIA R10!,{R0-R7}
ADD R10,R10,R8
SUBS R9,R9,#1
BGT loop1d
LDMFD R13!,{PC}
.scanwrite49
.loop491d
ADD R14,R10,#320
LDMIA R11!,{R0-R7}
STMIA R10!,{R0-R7}
STMIA R14!,{R0-R7}
LDMIA R11!,{R0-R7}
STMIA R10!,{R0-R7}
STMIA R14!,{R0-R7}
ADD R10,R10,R8
SUBS R9,R9,#1
BGT loop491d
LDMFD R13!,{PC}


.scangrab
STMFD R13!,{R14}
LDR R7,[R12,#v.lineskip]
CMP R7,#1
LDR R11,[R12,#v.screenuse]
ADD R11,R11,#320*21+248
ADDEQ R11,R11,#320*21
LDR R10,[R12,#v.scanadr]
ADD R10,R10,#64*64
MOV R9,#64
LDR R8,[R12,#v.hbytes]
SUB R8,R8,#64
ADDEQ R8,R8,#320
.loop1f
LDMIA R11!,{R0-R7}
STMIA R10!,{R0-R7}
LDMIA R11!,{R0-R7}
STMIA R10!,{R0-R7}
ADD R11,R11,R8
SUBS R9,R9,#1
BGT loop1f
LDMFD R13!,{PC}

.redcheck
STMFD R13!,{R14}
LDR R0,[R12,#v.redball]
CMP R0,#1
LDMNEFD R13!,{PC}
MOV R0,#ballstab
SWI Amnesia_CountObjects
CMP R0,#36
LDMGTFD R13!,{PC}
LDR R3,[R12,#v.diff]
.redcheckloop
STMFD R13!,{R3}
LDR R9,[R12,#v.levelnet]
LDR R5,[R9,#net.xsize]
LDR R6,[R9,#net.ysize]
MUL R4,R5,R6
BL random
AND R0,R0,#&FFF
CMP R0,R4
BGE redcheckfail
ADD R9,R9,#net.data
ADD R9,R9,R0
LDRB R0,[R9]
CMP R0,#&28
BNE redcheckfail
MOV R0,R9
BL backtranslate
MOV R3,R0
MOV R4,R1
BLVC makeredball
.redcheckfail
LDMFD R13!,{R3}
SUBS R3,R3,#1
BPL redcheckloop
LDMFD R13!,{PC}

.bastardmes
.bm1
DCD 160<<12,120<<12,0,0,&00200001,bm2-bm1
DCB "SUICIDE MODE",0
ALIGN
.bm2
DCD 160<<12,120<<12,0,0,&00200001,bm3-bm2
DCB 0
ALIGN
.bm3
DCD 160<<12,120<<12,0,0,&00200001,bm4-bm3
DCB "SUICIDE MODE",0
ALIGN
.bm4
DCD 160<<12,120<<12,0,0,&00200001,bm5-bm4
DCB 0
ALIGN
.bm5
DCD 160<<12,120<<12,0,0,&00200001,0
DCB "SUICIDE MODE",0
ALIGN



.bastardmode
STMFD R13!,{R14}
LDR R0,[R12,#v.bastard]
CMP R0,#0
LDMNEFD R13!,{PC}
ADR R0,bastardmes
BL message
MOV R0,#500
STR R0,[R12,#v.bastard]
BL bastardsound
LDMFD R13!,{PC}

.goodycheck
STMFD R13!,{R14}
MOV R0,#0
STR R0,[R12,#v.magnet]
STR R0,[R12,#v.ballstops]
LDR R0,[R12,#v.buttons]
TST R0,#4
BLNE selectdown
LDR R0,[R12,#v.buttons]
TST R0,#1
BLNE adjustdown

LDR R0,[R12,#v.buttons]
TST R0,#2
BNE menudown
LDR R0,[R12,#v.goodycsr]
BIC R0,R0,#1<<31
STR R0,[R12,#v.goodycsr]
LDMFD R13!,{PC}
.menudown 
LDR R0,[R12,#v.goodycsr]
TST R0,#1<<31
LDMNEFD R13!,{PC}
ADD R0,R0,#1
AND R0,R0,#3
ORR R0,R0,#1<<31
STR R0,[R12,#v.goodycsr]
MOV R0,#1
STR R0,[R12,#v.goodychange]
LDMFD R13!,{PC}

.bastarddown
STMFD R13!,{R14}
BL bastardmode
LDMFD R13!,{PC}

.adjustdown
STMFD R13!,{R14}
.adjuststart
LDR R0,[R12,#v.lastbuttons]
TST R0,#1
LDMNEFD R13!,{PC}
LDR R0,[R12,#v.cheat]
CMP R0,#1
LDMNEFD R13!,{PC}
LDR R0,[R12,#v.goodycsr]
ADD R11,R12,#v.goodytab
AND R0,R0,#3
ADD R11,R11,R0,LSL #2
LDR R0,[R11]
ADD R0,R0,#1
AND R0,R0,#15
CMP R0,#14
MOVGE R0,#0
STR R0,[R11]
.adjustend
LDMFD R13!,{PC}

.selectdown
STMFD R13!,{R14}
LDR R0,[R12,#v.goodycsr]
ADD R11,R12,#v.goodytab
AND R0,R0,#3
ADD R11,R11,R0,LSL #2
MOV R1,R11
LDR R0,[R1]
BL goodyuse
LDMFD R13!,{PC}

.goodyuse
STMFD R13!,{R0-R11,R14}
MOV R11,R1
AND R0,R0,#15
CMP R0,#0
BLE goodyend
ADR R1,gjtab
LDR R2,[R1,R0,LSL #2]
ADD PC,R1,R2
.gjtab
DCD goodyend-gjtab
DCD goody1-gjtab
DCD goody2-gjtab
DCD goody3-gjtab
DCD goody4-gjtab
DCD goody5-gjtab
DCD goody6-gjtab
DCD goody7-gjtab
DCD goody8-gjtab
DCD goody9-gjtab
DCD goody10-gjtab
DCD goody11-gjtab
DCD goody12-gjtab
DCD goody13-gjtab
DCD goodyend-gjtab
DCD goodyend-gjtab
.goody1
MOV R0,#0
STR R0,[R11]
LDR R3,[R12,#v.xpos]
LDR R4,[R12.#v.ypos]
BL makeball
MOV R0,#1
BL goodyeffect
B goodyend

.goody2
MOV R0,#1
STR R0,[R12,#v.magnet]
BL magnetsound
MOV R0,#&3555
STR R0,[R12,#v.magpitch]
B goodyend
.goody3
MOV R0,#0
STR R0,[R11]
LDR R0,[R12,#v.scanspeed]
ADD R0,R0,#1
STR R0,[R12,#v.scanspeed]
;add scan
B goodyend
.goody4
MOV R0,#0
STR R0,[R11]
;set ball fire on
MOV R0,#500
STR R0,[R12,#v.ballfire]
MOV R0,#4
BL goodyeffect
B goodyend
.goody5
MOV R0,#0
STR R0,[R11]
MOV R0,#1
STR R0,[R12,#v.ballstops]
;stop balls
MOV R0,#5
BL goodyeffect
B goodyend
.goody6
LDR R0,[R12,#v.xgrav]
LDR R1,[R12,#v.ygrav]
CMP R0,#0
CMPEQ R1,#0
BEQ goodyend
MOV R0,#0
STR R0,[R11]
MOV R0,#0
STR R0,[R12,#v.xgrav]
STR R0,[R12,#v.ygrav]
MOV R0,#6
BL goodyeffect
B goodyend
.goody7
;extra life
MOV R0,#0
STR R0,[R11]
LDR R0,[R12,#v.pllives]
ADD R0,R0,#1
STR R0,[R12,#v.pllives]
ADR R0,exlifemes
BL message

B goodyend
.goody8
LDR R0,[R12,#v.levelno]
TST R0,#&400
BLEQ badgoody8
MOV R0,#0
STR R0,[R11]
LDR R0,[R12,#v.warptime]
ADD R0,R0,#60*50
STR R0,[R12,#v.warptime]
B goodyend
.goody9
;bastard mode
MOV R0,#9
BL goodyeffect
BL bastardmode
B goodyend
.goody10
MOV R0,#0
STR R0,[R11]
MOV R0,#500
STR R0,[R12,#v.blueball]
;blue ball
MOV R0,#10
BL goodyeffect
B goodyend
.goody11
;line radar
LDR R0,[R12,#v.lastbuttons]
TST R0,#4
BNE goodyend
LDR R0,[R12,#v.lineradar]
RSB R0,R0,#1
STR R0,[R12,#v.lineradar]
BL lineradarstate
B goodyend

.goody12
MOV R0,#0
STR R0,[R11]
LDR R9,[R12,#v.levelnet]
LDR R0,[R9,#net.xsize]
LDR R1,[R9,#net.ysize]
MUL R0,R1,R0
ADD R9,R9,#net.data
ADD R8,R9,R0
.loop8a
LDRB R0,[R9]
CMP R0,#hit1
CMPNE R0,#hit2
BNE skip8a
MOV R0,#0
STMFD R13!,{R8-R9}
MOV R0,R9
BL blockdest
LDMFD R13!,{R8-R9}
.skip8a
ADD R9,R9,#1
CMP R9,R8
BLT loop8a
MOV R0,#0
STR R0,[R12,#v.blocksleft]
MOV R0,#12
BL goodyeffect
B goodyend

.goody13
LDR R0,[R12,#v.xpos]
LDR R1,[R12,#v.ypos]
BL translate
BVS nogoody13
LDR R9,[R12,#v.levelnet]
LDR R5,[R9,#net.xsize]
LDR R6,[R9,#net.ysize]
CMN R2,R5,LSR #1
BLE nogoody13
ADD R2,R2,#1
CMP R2,R5,LSR #1

BGE nogoody13
CMN R3,R6,LSR #1
BLE nogoody13
ADD R3,R3,#1
CMP R3,R6,LSR #1
BGE nogoody13
LDRB R0,[R4]
CMP R0,#0
MOV R0,#0
STRNEB R0,[R11]
MOV R0,R4
STMFD R13!,{R4,R11}
BL blockdest
LDMFD R13!,{R4,R11}
MOV R0,#0
STRB R0,[R4]
.nogoody13
B goodyend

.goodyend
LDMFD R13!,{R0-R11,PC}

.exlifemes
DCD 160<<12,80<<12,0,0,&00500001,exlifemes2-exlifemes
DCB "EXTRA LIFE",0
ALIGN           
.exlifemes2
DCD 160<<12,80<<12,0,-1<<12,&00500001,0
DCB "EXTRA LIFE",0
ALIGN           

.badgoody8
LDR R0,[R12,#v.lastbuttons]
TST R0,#4
BNE goodyend
ADR R0,badgoody8mes
BL message
BL message
B goodyend
.badgoody8mes
DCD 160<<12,80<<12,0,0,&00500001,0
DCB "USE EXTRA TIME ON",0
ALIGN           
DCD 160<<12,100<<12,0,0,&00500001,0
DCB "BONUS LEVELS ONLY",0
ALIGN

.lineradarstate
STMFD R13!,{R14}
LDR R1,[R12,#v.lineradar]
ADR R0,lineradaroff
CMP R1,#1
ADREQ R0,lineradaron
BL message
LDMFD R13!,{PC}

.lineradaroff
DCD 160<<12,140<<12,0,0,&00200001,0
DCB "LINE RADAR OFF",0
ALIGN    
.lineradaron       
DCD 160<<12,140<<12,0,0,&00200001,0
DCB "LINE RADAR ON",0
ALIGN
          


.goodyeffect
STMFD R13!,{R14}
LDR R3,[R12,#v.xpos]
LDR R4,[R12,#v.ypos]
MOV R1,R0
MOV R2,#8
ADR R11,circletab
.loop41
STMFD R13!,{R1-R4,R11}
LDMIA R11,{R5,R6}
MOV R5,R5,ASR #16
MOV R6,R6,ASR #16
ADD R3,R3,R5,ASL #2
ADD R4,R4,R6,ASL #2
LDR R0,[R12,#v.xvec]
ADD R5,R5,R0
LDR R0,[R12,#v.yvec]
ADD R6,R6,R0
BL goodymakedecor
LDMFD R13!,{R1-R4,R11}
ADD R11,R11,#256
SUBS R2,R2,#1
BGT loop41
LDMFD R13!,{PC}

.goodymakedecor         ;R1 decor type
			;R3,R4 coords
STMFD R13!,{R5-R8,R14}
MOV R2,#%1000000100010101
MOV R7,#&08000080
MOV R8,#0
MOV R0,#decortab
ORR R1,R1,#(goodytab)<<24
SWI Amnesia_MakeObject
LDMFD R13!,{R5-R8,PC}

.goodystoreeffect
STMFD R13!,{R8-R9,R14}
MOV R0,#decortab
MOV R1,#1
MOV R2,#0
LDR R3,[R9,#32]
AND R3,R3,#&F
ADD R3,R3,#(goodytab<<24)
MOV R4,#0
SWI Amnesia_SelectTable
.loop4a
SWI Amnesia_ProcessTable
CMP R2,#0
BEQ storeeffectend
STMFD R13!,{R0-R4}
LDR R3,[R12,#v.xpos]
LDR R4,[R1,#8]
SUB R3,R3,R4
MOV R3,R3,ASR #4
LDR R4,[R12,#v.xvec]
ADD R3,R3,R4
STR R3,[R1,#16]

LDR R3,[R12,#v.ypos]
LDR R4,[R1,#12]
SUB R3,R3,R4
MOV R3,R3,ASR #4
LDR R4,[R12,#v.yvec]
ADD R3,R3,R4
STR R3,[R1,#20]
MOV R0,#&08000080
STR R0,[R1,#24]

LDMFD R13!,{R0-R4}
B loop4a

.storeeffectend
LDMFD R13!,{R8-R9,PC}

.goodyuseeffect
STMFD R13!,{R8-R9,R14}
MOV R0,#decortab
MOV R1,#1
MOV R2,#0
LDR R3,[R9,#32]
AND R3,R3,#&F
ADD R3,R3,#(goodytab<<24)
MOV R4,#0
SWI Amnesia_SelectTable
.loop4b
SWI Amnesia_ProcessTable
CMP R2,#0
BEQ storeeffectend
STMFD R13!,{R0-R4}
LDR R3,[R1,#16]
LDR R4,[R1,#20]
RSB R4,R4,#0
MOV R3,R3,ASL #1
MOV R4,R4,ASL #1

STR R4,[R1,#16]
STR R3,[R1,#20]
MOV R0,#&08000080
STR R0,[R1,#24]

LDMFD R13!,{R0-R4}
B loop4b

.useeffectend
LDMFD R13!,{R8-R9,PC}

.scoreupdate
LDR R0,[R12,#v.plscore]
LDR R1,[R12,#v.lastscore]
CMP R0,R1
MOVEQ PC,R14

STR R0,[R12,#v.lastscore]
STMFD R13!,{R14}
;BL scorecheck
LDR R0,[R12,#v.scoreofs]
BL paperwipe
LDR R0,[R12,#v.scoreofs]
BL setuppaper
LDR R0,[R12,#v.plscore]
ADD R1,R12,#v.buffer
MOV R2,#16
SWI OS_ConvertCardinal4
SUB R0,R1,R0
MOV R1,#11
MUL R0,R1,R0
MOV R0,R0,ASR #1
RSB R1,R0,#38
ADD R3,R12,#v.buffer
.loop16
LDRB R0,[R3],#1
CMP R0,#32
BLT scoreupend
ADD R0,R0,#(texttab<<24)
MOV R2,#7
SWI FastSpr_Plot
ADD R1,R1,#11
B loop16
.scoreupend
MOV R0,#1
STR R0,[R12,#v.scorechange]
LDMFD R13!,{PC}


.livesupdate
LDR R0,[R12,#v.pllives]
LDR R1,[R12,#v.lastlives]
CMP R0,R1
MOVEQ PC,R14
STR R0,[R12,#v.lastlives]
STMFD R13!,{R14}
LDR R0,[R12,#v.livesofs]
BL paperwipe
LDR R0,[R12,#v.livesofs]
BL setuppaper
LDR R3,[R12,#v.pllives]
MOV R0,#(decortab<<24)+1
MOV R1,#32
MOV R2,#7
BL writenumber
MOV R0,#1
STR R0,[R12,#v.liveschange]
LDMFD R13!,{PC}

.ballsupdate
LDR R0,[R12,#v.ballctr]
LDR R1,[R12,#v.lastballs]
CMP R0,R1
MOVEQ PC,R14
STR R0,[R12,#v.lastballs]
STMFD R13!,{R14}
LDR R0,[R12,#v.ballsofs]
BL paperwipe
LDR R0,[R12,#v.ballsofs]
BL setuppaper
LDR R3,[R12,#v.ballctr]
MOV R0,#(decortab<<24)+(2<<16)+1
MOV R1,#32
MOV R2,#7
BL writenumber
MOV R0,#1
STR R0,[R12,#v.ballschange]
LDMFD R13!,{PC}

.goodyupdate
STMFD R13!,{R14}
ADD R9,R12,#v.goodytab
ADD R10,R12,#v.lastgoodytab
LDMIA R9,{R0-R3}
LDMIA R10,{R4-R7}
CMP R0,R4
CMPEQ R1,R5
CMPEQ R2,R6
CMPEQ R3,R7
BNE dogoodyupdate
LDR R0,[R12,#v.goodycsr]
LDR R1,[R12,#v.lastgoodycsr]
CMP R0,R1
BNE dogoodyupdate
LDMFD R13!,{PC}

.dogoodyupdate
LDMIA R9,{R0-R3}
STMIA R10,{R0-R3}
LDR R0,[R12,#v.goodycsr]
STR R0,[R12,#v.lastgoodycsr]
LDR R0,[R12,#v.goodyofs]
BL paperwipe
LDR R0,[R12,#v.goodyofs]
BL setuppaper
LDR R0,[R12,#v.goodycsr]
AND R0,R0,#3
MOV R1,R0,LSL #4
ADD R1,R1,R0,LSL #2
ADD R1,R1,#10
MOV R0,#(goodytab<<24)
MOV R2,#8
SWI FastSpr_Plot
MOV R3,#4
ADD R11,R12,#v.goodytab
MOV R4,#10
.goodloop
LDR R0,[R11],#4
AND R0,R0,#&FF
CMP R0,#maxgoody
MOVGT R0,#0
MOV R1,R4
MOV R2,#8
CMP R0,#0
ORR R0,R0,#(goodytab<<24)
SWINE FastSpr_Plot
ADD R4,R4,#20
SUBS R3,R3,#1
BGT goodloop
MOV R0,#1
STR R0,[R12,#v.goodychange]
LDMFD R13!,{PC}

.writenumber
STMFD R13!,{R14}
CMP R3,#0
LDMLEFD R13!,{PC}
CMP R3,#5
BGT shortnumber
STMFD R13!,{R0-R2}
SWI FastSpr_ReadSize
ADD R4,R0,#1
LDMFD R13!,{R0-R2}
MUL R5,R4,R3
SUB R5,R5,R4

SUB R1,R1,R5,ASR #1
.loop1a
STMFD R13!,{R0-R2}
SWI FastSpr_Plot
LDMFD R13!,{R0-R2}
ADD R1,R1,R4
SUBS R3,R3,#1
BGT loop1a
LDMFD R13!,{PC}

.shortnumber
STMFD R13!,{R0-R2}
MOV R0,R3
ADD R1,R12,#v.buffer
MOV R2,#16
SWI OS_ConvertCardinal4
SUB R0,R1,R0
ADD R0,R0,#1
MOV R1,#11
MUL R0,R1,R0
MOV R5,R0,ASR #1
LDMFD R13!,{R0-R2}
SUB R1,R1,R5
SWI FastSpr_Plot
ADD R1,R1,#11
MOV R0,#(texttab<<24)+"X"
SWI FastSpr_Plot
ADD R1,R1,#11
ADD R3,R12,#v.buffer

.loop1b
LDRB R0,[R3],#1
CMP R0,#32
BLT numberend
ADD R0,R0,#(texttab<<24)
MOV R2,#7
SWI FastSpr_Plot
ADD R1,R1,#11
B loop1b
.numberend
LDMFD R13!,{PC}

.doreps
STMFD R13!,{R14}
ADD R0,R12,#v.ballsofs
ADD R1,R12,#v.ballschange
BL repifnes
ADD R0,R12,#v.scoreofs
ADD R1,R12,#v.scorechange
BL repifnes
ADD R0,R12,#v.livesofs
ADD R1,R12,#v.liveschange
BL repifnes
ADD R0,R12,#v.goodyofs
ADD R1,R12,#v.goodychange
BL repifnes
LDMFD R13!,{PC}

.repifnes
STMFD R13!,{R14}
LDR R3,[R12,#v.paperadr]
LDR R2,[R1]
CMP R2,#0
MOV R2,#0
STR R2,[R1]
LDR R0,[R0]
ADD R0,R3,R0
BLNE replace
LDMFD R13!,{PC}

.dograbs
STMFD R13!,{R14}
MOV R0,#248
MOV R1,#108
MOV R2,#64
MOV R3,#14
LDR R4,[R12,#v.storesadr]
MOV R5,R4
SUB R6,R4,R5
STR R6,[R12,#v.ballsofs]
BL grab2
MOV R1,#145
SUB R6,R4,R5
STR R6,[R12,#v.scoreofs]
BL grab2
MOV R1,#183
SUB R6,R4,R5
STR R6,[R12,#v.livesofs]
BL grab2
MOV R0,#240
MOV R1,#221
MOV R2,#80
MOV R3,#16
SUB R6,R4,R5
STR R6,[R12,#v.goodyofs]
BL grab2
LDMFD R13!,{PC}

.grab2
STMFD R13!,{R14}
STMFD R13!,{R6}
BL grab
LDMFD R13!,{R6}
STMFD R13!,{R4}
LDR R4,[R12,#v.paperadr]
ADD R4,R4,R6
BL grab
LDMFD R13!,{R4}
LDMFD R13!,{PC}

.transfer
STMFD R13!,{R5-R6,R14}
LDR R5,[R12,#v.lineskip]
CMP R5,#1
BEQ transfer49
.loopv
STMFD R13!,{R0,R2}

.loopw
LDR R6,[R1],#4
STR R6,[R0],#4
SUBS R2,R2,#4
BGT loopw
LDMFD R13!,{R0,R2}
ADD R0,R0,R4
SUBS R3,R3,#1
BGT loopv
LDMFD R13!,{R5-R6,PC}

.transfer49
ADD R4,R4,#320
.loopv49
STMFD R13!,{R0,R2}
.loopw49
LDR R6,[R1],#4
STR R6,[R0,#320]
STR R6,[R0],#4
SUBS R2,R2,#4
BGT loopw49
LDMFD R13!,{R0,R2}
ADD R0,R0,R4
SUBS R3,R3,#1
BGT loopv49
LDMFD R13!,{R5-R6,PC}


.grab
STMFD R13!,{R0-R3,R14}
; On entry, (R0,R1) are coord to grab from, (R2,R3) are width,height
;R4 is address to write to.
MOV R10,R4
MOV R9,R2;for the return of R4
LDR R11,[R12,#v.screenuse]
LDR R6,[R12,#v.hbytes]
MUL R1,R6,R1
ADD R4,R6,R6,LSL #1
STR R1,[R10,R4]
MOV R4,R1
ADD R1,R1,R0
STR R1,[R10]
STR R2,[R10,R6]
STR R3,[R10,R6,LSL #1]
LDR R0,[R12,#v.lineskip]
CMP R0,#1
ADDEQ R11,R11,R4

ADD R10,R10,#4
ADD R9,R9,R10
ADD R11,R11,R1
.loop11
STMFD R13!,{R2,R10,R11}
.loop10
LDR R0,[R11],#4
STR R0,[R10],#4
SUBS R2,R2,#4
BGT loop10
LDMFD R13!,{R2,R10,R11}
LDR R0,[R12,#v.lineskip]
CMP R0,#1
ADDEQ R11,R11,R6
ADD R11,R11,R6
ADD R10,R10,R6
SUBS R3,R3,#1
BGT loop11
MOV R4,R9
LDMFD R13!,{R0-R3,PC}

.replace
STMFD R13!,{R0-R3,R14}
LDR R7,[R12,#v.lineskip]
CMP R7,#1
BEQ replace49
MOV R11,R0
LDR R10,[R12,#v.screenuse]
LDR R6,[R12,#v.hbytes]
LDR R1,[R11]
ADD R10,R10,R1
LDR R2,[R11,R6]
LDR R3,[R11,R6,LSL #1]
ADD R11,R11,#4
.loop13
STMFD R13!,{R2,R10-R11}
.loop12
LDR R0,[R11],#4
STR R0,[R10],#4
SUBS R2,R2,#4
BGT loop12
LDMFD R13!,{R2,R10-R11}
ADD R10,R10,R6
ADD R11,R11,R6
SUBS R3,R3,#1
BGT loop13
LDMFD R13!,{R0-R3,PC}

.replace49
MOV R11,R0
LDR R10,[R12,#v.screenuse]
LDR R6,[R12,#v.hbytes]
ADD R1,R6,R6,LSL #1
LDR R1,[R11,R1]
LDR R0,[R11]
ADD R1,R0,R1
ADD R10,R10,R1
LDR R2,[R11,R6]
LDR R3,[R11,R6,LSL #1]
ADD R11,R11,#4
.loop4913
STMFD R13!,{R2,R10-R11}
.loop4912
LDR R0,[R11],#4
STR R0,[R10,#320]
STR R0,[R10],#4
SUBS R2,R2,#4
BGT loop4912
LDMFD R13!,{R2,R10-R11}
ADD R10,R10,R6,LSL #1
ADD R11,R11,R6
SUBS R3,R3,#1
BGT loop4913
LDMFD R13!,{R0-R3,PC}

.sload1
MOV R0,#14
ADR R1,sidepicname
LDR R2,[R12,#v.canvasadr]
MOV R3,#0
ADR R4,pathname
SWI OS_File
B sload1ins

.sload2
MOV R0,#14
ADR R1,topdataname
LDR R2,[R12,#v.screenadr]
MOV R3,#0
ADR R4,pathname
SWI OS_File
B sload2ins

.loadsidepic
STMFD R13!,{R14}
MOV R0,#0
ADR R1,sidepicname
ADR R2,pathname
SWI Blitz_HammerOp
CMP R3,#0
BEQ sload1
MOV R0,#1
LDR R3,[R12,#v.canvasadr]
SWI Blitz_HammerOp
.sload1ins
LDR R0,[R12,#v.lineskip]
CMP R0,#0
LDMNEFD R13!,{PC}
MOV R0,#0
ADR R1,topdataname
ADR R2,pathname
SWI Blitz_HammerOp
CMP R3,#0
BEQ sload2
MOV R0,#1
LDR R3,[R12,#v.screenadr]
SWI Blitz_HammerOp
.sload2ins
LDR R0,[R12,#v.screenadr]
ADD R1,R0,#320*248
ADD R0,R0,#320*7
MOV R2,#&A00
.loadpicloop
#rept 10
LDMIA R0!,{R3-R10}
STMIA R1!,{R3-R10}
#endr
SUBS R2,R2,#320
SUB R0,R0,#640
BGT loadpicloop
LDMFD R13!,{PC}
LDMFD R13!,{PC}

.hackcheck
STMFD R13!,{R14}
.hackcheckstart
MOV R0,#0
STR R0,[R12,#v.bastmode]
ADR R0,deskhack
ADD R1,R12,#v.buffer
LDMIA R0,{R2-R5}
MVN R2,R2
MVN R3,R3
MVN R4,R4
MVN R5,R5
STMIA R1,{R2-R5}
MOV R0,#18
SWI XOS_Module
LDMVSFD R13!,{PC}
MOV R0,#1
STR R0,[R12,#v.bastmode]
MOV R0,#&E3A00001
STR R0,gamehack
ADR R1,cheatmesstart
ADD R2,R1,#cheatmesend-cheatmesstart
MOV R0,#&0
BL wipem
ADR R1,adjuststart
ADD R2,R1,#adjustend-adjuststart
MOV R0,#&0
BL wipem
ADR R1,hackcheckstart
ADD R2,R1,#hackcheckend-hackcheckstart
MOV R0,#&0
BL wipem


LDMFD R13!,{PC}
.deskhack
DCD &6B736544 EOR &FFFFFFFF
DCD &48706F74 EOR &FFFFFFFF
DCD &656B6361 EOR &FFFFFFFF
DCD &00000072 EOR &FFFFFFFF
ALIGN
.hackcheckend
LDMFD R13!,{PC}

.cracksound
STMFD R13!,{R0-R7,R14}
BL rangetovolume
LDR R3,[R12,#v.colpitch]
SUBS R2,R2,R3
LDMLTFD R13!,{R0-R7,PC}
CMP R2,#&5F
MOVGT R2,#&5F
MOV R0,#2
MOV R1,#6
MOV R3,#&3555
MOV R4,#0
MOV R5,#0
MOV R7,#10
BL bidforsound
LDMFD R13!,{R0-R7,PC}

.explosound
STMFD R13!,{R0-R3,R14}
BL rangetovolume
MOV R0,#4
MOV R1,#7
MOV R3,#&3555
MOV R4,#0
MOV R5,#0
MOV R7,#10
BL bidforsound
LDMFD R13!,{R0-R3,PC}

.bastardsound
STMFD R13!,{R0-R7,R14}
MOV R0,#4
MOV R1,#11
MOV R2,#&7F
MOV R3,#&2555
MOV R4,#&00000400
MOV R5,#&65550300
MOV R6,#127
MOV R7,#100
BL bidforsound
MOV R0,#3
MOV R1,#11
MOV R2,#&7F
MOV R3,#&2400
MOV R4,#&00000400
MOV R5,#&65550300
MOV R6,#-127
MOV R7,#100
BL bidforsound

LDMFD R13!,{R0-R7,PC}


.weirdsound
STMFD R13!,{R0-R7,R14}
BL rangetovolume
MOV R0,#2
MOV R1,#10
MOV R3,#&4555
MOV R4,#0
MOV R5,#0
MOV R7,#5
BL bidforsound
LDMFD R13!,{R0-R7,PC}

.secretsound
STMFD R13!,{R0-R7,R14}
BL objectrange
BL rangetovolume
MOV R0,#3
MOV R1,#3
MOV R3,#&3555
MOV R4,#0
MOV R5,#0
MOV R7,#5
BL bidforsound
LDMFD R13!,{R0-R7,PC}

.telepsound
STMFD R13!,{R0-R7,R14}
BL objectrange
BL rangetovolume
MOV R0,#3
MOV R1,#12
MOV R3,#&6555
MOV R4,#&00000180
MOV R5,#&15550100
MOV R7,#&20
BL bidforsound
LDMFD R13!,{R0-R7,PC}

.telepsound2
STMFD R13!,{R0-R7,R14}
BL objectrange
BL rangetovolume
MOV R0,#4
MOV R1,#12
MOV R3,#&1555
MOV R4,#&00000180
MOV R5,#&65550100
MOV R7,#&20
BL bidforsound
LDMFD R13!,{R0-R7,PC}

.goodysound
STMFD R13!,{R0-R7,R14}
BL rangetovolume
MOV R0,#4
MOV R1,#9
MOV R3,#&3555
MOV R4,#0
MOV R5,#0
MOV R7,#10
BL bidforsound
LDMFD R13!,{R0-R7,PC}

.blamsound
STMFD R13!,{R0-R7,R14}
BL rangetovolume
SUBS R2,R2,#&10
MOVMI R2,#0
MOV R0,#3
MOV R1,#2
MOV R3,#&3555
MOV R4,#0
MOV R5,#0
MOV R7,#3
BL bidforsound
LDMFD R13!,{R0-R7,PC}

.bonussound
STMFD R13!,{R0-R7,R14}
BL rangetovolume
MOV R0,#2
MOV R1,#4
MOV R3,#&3555
MOV R4,#0
MOV R5,#0
MOV R7,#10
BL bidforsound
LDMFD R13!,{R0-R7,PC}

.chinksound
STMFD R13!,{R0-R7,R14}
BL rangetovolume
MOV R0,#2
MOV R1,#5
LDR R3,[R12,#v.colpitch]
ADD R3,R3,#&6555
MOV R4,#0
MOV R5,#0
MOV R7,#10
BL bidforsound
LDMFD R13!,{R0-R7,PC}

.fallsound
STMFD R13!,{R0-R7,R14}
BL objectrange
BL rangetovolume
MOV R0,#4
MOV R1,#8
MOV R3,#&5555
MOV R4,#&00000180
MOV R5,#&35550100
MOV R7,#&20
BL bidforsound
LDMFD R13!,{R0-R7,PC}

.deathsound
STMFD R13!,{R0-R3,R14}
MOV R5,#1
.sinloop
MOV R0,R5
MOV R1,#8
MOV R2,#&7F
MOV R3,#&5555
ADD R3,R3,R5,LSL #8
MOV R4,#0
SWI Stasis_Sound
MOV R0,R5
MOV R1,#1
MOV R2,#&3555
MOV R3,#300
SWI Stasis_Slide
MOV R0,R5
MOV R1,#0
MOV R2,#0
MOV R3,#400
SWI Stasis_Slide
MOV R0,R5
MOV R1,#-64
CMP R5,#2
MOVEQ R1,#-32
CMP R5,#3
MOVEQ R1,#32
CMP R5,#4
MOVEQ R1,#64
SWI Sound_Stereo
ADD R5,R5,#1
CMP R5,#5
BLT sinloop

LDMFD R13!,{R0-R3,PC}

.objectrange
STMFD R13!,{R2,R14}
LDR R0,[R9,#8]
LDR R2,[R12,#v.plxcent]
SUB R0,R0,R2
LDR R1,[R9,#12]
LDR R2,[R12,#v.plycent]
SUB R1,R1,R2
LDMFD R13!,{R2,PC}

.rangetovolume
STMFD R13!,{R0-R1,R3,R14}
CMP R1,#0
RSBLT R1,R1,#0
MOV R3,R1
CMP R3,#128<<12
MOVLT R3,#128<<12
MOV R2,R0,ASL #6
MYDIV R6,R2,R3
CMP R6,#127
MOVGT R6,#127
CMP R6,#-127
MOVLT R6,#-127

CMP R0,#0
RSBLT R0,R0,#0


ADD R2,R0,R1
MOV R2,R2,LSR #17
RSB R2,R2,#&7F
CMP R2,#0
MOVLT R2,#0
CMP R2,#&7F
MOVGT R2,#&7F
LDMFD R13!,{R0-R1,R3,PC}

.bidforsound
STMFD R13!,{R0-R10,R14}
ADD R10,R12,#v.soundtab
SUB R0,R0,#1
AND R0,R0,#7
ADD R10,R10,R0,LSL #soundtabshift
LDR R0,[R10,#snd.ctr]
CMP R0,#0
BEQ soundclaim
LDR R0,[R10,#snd.vol]
CMP R0,R2
BLE soundclaim
LDMFD R13!,{R0-R10,PC}
.soundclaim
STR R1,[R10,#snd.sample]
STR R2,[R10,#snd.vol]
STR R3,[R10,#snd.pitch]
STR R4,[R10,#snd.volslide]
STR R5,[R10,#snd.pitchslide]
CMP R6,#127
MOVGT R6,#127
CMP R6,#-127
MOVLT R6,#-127
STR R6,[R10,#snd.stereo]
ORR R7,R7,#1<<31
STR R7,[R10,#snd.ctr]
LDMFD R13!,{R0-R10,PC}

.makesounds
STMFD R13!,{R14}
ADD R11,R12,#v.soundtab
ADD R11,R11,#snd.sizeof
MOV R6,#7
.makesoundloop
LDR R8,[R11,#snd.vol]
CMP R8,#0
BEQ soundskip
LDR R0,[R11,#snd.ctr]
TST R0,#1<<31
BEQ soundmade
BIC R0,R0,#1<<31
STR R0,[R11,#snd.ctr]
RSB R0,R6,#9
LDR R1,[R11,#snd.sample]
LDR R2,[R11,#snd.vol]
LDR R3,[R11,#snd.pitch]
MOV R4,#0
SWI Stasis_Sound
RSB R0,R6,#9
LDR R1,[R11,#snd.stereo]
SWI Sound_Stereo
LDR R0,[R11,#snd.volslide]
CMP R0,#0
BLNE setvolslide
LDR R0,[R11,#snd.pitchslide]
CMP R0,#0
BLNE setpitchslide
.soundmade
LDR R0,[R11,#snd.ctr]
LDR R1,[R12,#v.frameinc]
SUBS R0,R0,R1
MOVMI R0,#0
STR R0,[R11,#snd.ctr]
.soundskip
ADD R11,R11,#snd.sizeof
SUBS R6,R6,#1
BGT makesoundloop
LDMFD R13!,{PC}

.setvolslide
STMFD R13!,{R14}
RSB R0,R6,#9
MOV R1,#0
LDR R3,[R11,#snd.volslide]
MOV R2,R3,LSR #16
AND R3,R3,#&FFFF
SWI Stasis_Slide
LDMFD R13!,{PC}

.setpitchslide
STMFD R13!,{R14}
RSB R0,R6,#9
MOV R1,#1
LDR R3,[R11,#snd.pitchslide]
MOV R2,R3,LSR #16
AND R3,R3,#&FFFF
SWI Stasis_Slide
LDMFD R13!,{PC}

.wipesoundtab
STMFD R13!,{R14}
ADD R10,R12,#v.soundtab
MOV R3,#8
MOV R0,#0
.wipesoundtabloop
STR R0,[R10,#snd.vol]
STR R0,[R10,#snd.ctr]
ADD R10,R10,#snd.sizeof
SUBS R3,R3,#1
BGT wipesoundtabloop
LDMFD R13!,{PC}

.batsound
STMFD R13!,{R14}
LDR R0,[R12,#v.magnet]
CMP R0,#0
BGT batsoundend
.batsilence
MOV R0,#0
SWI Stasis_GetControlAddress
LDR R1,[R0,#28]
ORR R1,R1,#1
STR R1,[R0,#28]
.batsoundend
LDMFD R13!,{PC}

.magnetsound
STMFD R13!,{R14}
MOV R0,#0
SWI Stasis_GetControlAddress
LDR R0,[R0,#28]
TST R0,#1
BEQ notrigmag
LDR R2,[R12,#v.plxcent]
LDR R0,[R12,#v.xpos]
SUB R0,R0,R2
LDR R2,[R12,#v.plycent]
LDR R1,[R12,#v.ypos]
SUB R1,R1,R2
BL rangetovolume
MOV R5,R2
SUBS R2,R2,#&18
MOVLE R2,#1
MOV R0,#1
MOV R1,#11
MOV R3,#&3555
MOV R4,#0
SWI Stasis_Sound
MOV R0,#1
MOV R1,#0
MOV R2,R5
MOV R3,#300
SWI Stasis_Slide


.notrigmag
MOV R0,#1
MOV R1,#0
MOV R2,#0
LDR R3,[R12,#v.magpitch]
MOV R4,#%1011
SWI Stasis_Sound

LDMFD R13!,{PC}

.resetplotwindow
STMFD R13!,{R14}
MOV R0,#1
MOV R1,#((canvaswidth-windwidth)/2+4)<<12
MOV R2,#0
MOV R3,#(243+(canvaswidth-windwidth)/2)<<12
MOV R4,#240<<12
SWI Amnesia_SetWindow   ;setup the plot window
LDMFD R13!,{PC}

.stretchplotwindow
STMFD R13!,{R14}
MOV R0,#1
MOV R1,#((canvaswidth-windwidth)/2-4)<<12
MOV R2,#-8<<12
MOV R3,#(251+(canvaswidth-windwidth)/2)<<12
MOV R4,#248<<12
SWI Amnesia_SetWindow   ;setup the plot window
LDMFD R13!,{PC}

.setup
STMFD R13!,{R14}
ADD R0,R12,#v.helladr
MOV R1,#128*96
ADR R2,hellname
MOV R3,#0
SWI XAmnesia_ClaimBlock
BVS setupfailed
ADD R0,R12,#v.scanadr
MOV R1,#2*64*64
ADR R2,scanname
MOV R3,#0
SWI XAmnesia_ClaimBlock
BVS setupfailed
ADD R0,R12,#v.storesadr
MOV R1,#5120
ADR R2,storesname
MOV R3,#0
SWI XAmnesia_ClaimBlock
BVS setupfailed
ADD R0,R12,#v.paperadr
MOV R1,#5120
ADR R2,papername
MOV R3,#0
SWI XAmnesia_ClaimBlock
BVS setupfailed
ADD R0,R12,#v.canvasadr
MOV R1,#canvaswidth*canvasheight
ADR R2,canvasname
MOV R3,#0
SWI XAmnesia_ClaimBlock
BVS setupfailed
MOV R0,#batstab
MOV R1,#1
ADR R2,battablename
MOV R3,#8
MOV R4,#40
SWI XAmnesia_ClaimTable
BVS setupfailed
MOV R0,#blockstab
MOV R1,#1
ADR R2,blockstablename
MOV R3,#256
MOV R4,#40
SWI XAmnesia_ClaimTable
BVS setupfailed
MOV R0,#ballstab
MOV R1,#1
ADR R2,ballstablename
MOV R3,#48
MOV R4,#44
SWI XAmnesia_ClaimTable
BVS setupfailed
MOV R0,#bulletstab
MOV R1,#0
ADR R2,bulletstablename
MOV R3,#32
MOV R4,#32
SWI XAmnesia_ClaimTable
BVS setupfailed
MOV R0,#starstab
MOV R1,#1
ADR R2,starstablename
MOV R3,#8
MOV R4,#36
SWI XAmnesia_ClaimTable
BVS setupfailed
MOV R0,#edgetab
MOV R1,#0
ADR R2,edgetablename
MOV R3,#128
MOV R4,#36
SWI XAmnesia_ClaimTable
BVS setupfailed
MOV R0,#decortab
MOV R1,#0
ADR R2,decortablename
MOV R3,#128
MOV R4,#40
SWI XAmnesia_ClaimTable
BVS setupfailed
BL textsetup
BVS setupfailed
MOV R0,#0
MOV R1,#-1024<<12
MOV R2,#-1024<<12
MOV R3,#1024<<12
MOV R4,#1024<<12
SWI Amnesia_SetWindow   ;setup the game window

BL resetplotwindow
MOV R0,#0
STR R0,[R12,#v.exit]
STR R0,[R12,#v.framectr]
STR R0,[R12,#v.bateffect]
STR R0,[R12,#v.saveslot]
STR R0,[R12,#v.loadslot]
STR R0,[R12,#v.newlevelctr]
MOV R0,#-1
STR R0,[R12,#v.loadeddrop]
ADD R1,R12,#v.warptimer
MOV R2,#0
MOV R3,#7
.loop85
MOV R0,R2,ASR #8
STR R0,[R1],#4
ADD R2,R2,#3*&80000/7
SUBS R3,R3,#1
BGT loop85

MOV R0,#1
STR R0,[R12,#v.music]
STR R0,[R12,#v.quality]
STR R0,[R12,#v.mousestep]
MOV R0,#1
STR R0,[R12,#v.lineskip]
MOV R0,#0
SWI Sound_Volume
MOV R1,#0
CMP R0,#64
MOVGT R1,#1
CMP R0,#96
MOVGT R1,#2
CMP R0,#112
MOVGT R1,#3
MOV R0,#0
SWI Sound_Enable
CMP R0,#1
MOVEQ R1,#0
STR R1,[R12,#v.soundvol]
LDMFD R13!,{PC}
.setupfailed
ADR R0,setupfailedtext
SWI OS_GenerateError

.setupsounds
STMFD R13!,{R14}
MOV R0,#4
MOV R1,#0
MOV R2,#48
MOV R3,#0
MOV R4,#0
SWI Sound_Configure
MOV R0,#8
MOV R1,#0
MOV R2,#0
MOV R3,#0
MOV R4,#0
SWI Sound_Configure
ADR R0,soundcom1
SWI XOS_CLI
LDMFD R13!,{PC}
.soundcom1
DCB "PlayVoices 8",0
ALIGN

.setupcanvas
STMFD R13!,{R14}
LDR R0,[R12,#v.canvasadr]
SWI FastSpr_ScreenBank
MOV R0,#0
MOV R1,#0
MOV R2,#320
MOV R3,#240
SWI FastSpr_SetClipWindow
LDMFD R13!,{PC}

.setuppaper
STMFD R13!,{R14}
LDR R1,[R12,#v.paperadr]
ADD R0,R0,R1
STMFD R13!,{R0}
ADD R0,R0,#4
SWI FastSpr_ScreenBank
LDMFD R13!,{R4}
LDR R0,[R12,#v.hbytes]
LDR R2,[R4,R0]
LDR R3,[R4,R0,LSL #1]
MOV R0,#0
MOV R1,#0

SWI FastSpr_SetClipWindow
LDMFD R13!,{PC}

.setupvars
STMFD R13!,{R14}
MOV R0,#0
MOV R1,#v.sizeof
ADR R2,varsname
MOV R3,#1; static
SWI XAmnesia_ClaimBlock
BVS nomemory
MOV R12,R0
MOV R0,#1
STR R0,[R12,#v.bank]
MOV R0,#7
STR R0,[R12,#v.mousesens]
MOV R0,#0
STR R0,[R12,#v.backdrop]
STR R0,[R12,#v.levelnet]
SWI OS_ReadMonotonicTime
STR R0,[R12,#v.rnseed]
LDMFD R13!,{PC}

.bindmouse
STMFD R13!,{R14}
MOV R0,#21
ADR R1,bindblock
SWI OS_Word
LDMFD R13!,{PC}
.bindblock
DCB 1,0,0,0,0,0,5,0,4
ALIGN

.homebat
STMFD R13!,{R14}
LDR R0,[R12,#v.ballxhome]
STR R0,[R12,#v.xpos]
STR R0,[R12,#v.plxcent]
LDR R1,[R12,#v.ballyhome]
ADD R1,R1,#128<<12
STR R1,[R12,#v.ypos]
STR R1,[R12,#v.plycent]
MOV R0,#0
STR R0,[R12,#v.xvec]
STR R0,[R12,#v.yvec]
STR R0,[R12,#v.ballxpos]
STR R0,[R12,#v.ballypos]
BL justmovedbat
MOV R0,#21
ADR R1,mouseblock
SWI OS_Word
LDMFD R13!,{PC}
.mouseblock
DCB 3
DCB 128
DCB 2
DCB 0
DCB 2
ALIGN
.levelcheat
DCB "OddBallCheat",0
ALIGN

.setupplayer
STMFD R13!,{R14}
MOV R0,#ballstab
SWI Amnesia_WipeTable
MOV R3,#0
MOV R4,#0
BL makeball
BL homebat
LDR R3,[R12,#v.diff]
MOV R0,#16<<12
CMP R3,#1
MOVEQ R0,#4<<12
CMP R3,#2
MOVEQ R0,#8<<12
STR R0,[R12,#v.ballspeedlim]
STR R0,[R12,#v.ballspeed]
MOV R0,#0
CMP R3,#3
MOVEQ R0,#1<<5
CMP R3,#2
MOVEQ R0,#1<<2
STR R0,[R12,#v.ballmin]
MOV R0,#0
STR R0,[R12,#v.dead]
STR R0,[R12,#v.plscore]
STR R0,[R12,#v.helltimer]
MOV R0,#2
STR R0,[R12,#v.pllives]
MOV R0,#1
STR R0,[R12,#v.scorechange]
STR R0,[R12,#v.liveschange]
STR R0,[R12,#v.ballschange]
STR R0,[R12,#v.goodychange]
MOV R0,#-1
STR R0,[R12,#v.lastballs]
STR R0,[R12,#v.lastlives]
STR R0,[R12,#v.lastscore]
ADR R0,levelcheat
ADD R1,R12,#v.levelno
MOV R2,#4
MOV R3,#0
MOV R4,#1
SWI XOS_ReadVarVal

MOVVS R0,#1
STRVS R0,[R12,#v.levelno]
CMP R4,#1
MOVNE R0,#0
STRNE R0,[R12,#v.levelno]
LDR R0,[R12,#v.levelno]
CMP R0,#0
MOVEQ R0,#1
STREQ R0,[R12,#v.levelno]
MOV R0,#7
STR R0,[R12,#v.mousespeed]
MOV R0,#0
STR R0,[R12,#v.magnet]
STR R0,[R12,#v.blueball]
STR R0,[R12,#v.ballstops]
STR R0,[R12,#v.goodycsr]
LDR R0,[R12,#v.diff]
RSB R0,R0,#3
STR R0,[R12,#v.scanspeed]
LDR R0,[R12,#v.diff]
CMP R0,#3
MOV R0,#1
MOVGE R0,#0
STR R0,[R12,#v.lineradar]
LDR R0,[R12,#v.diff]
CMP R0,#2
MOV R0,#0
MOVLE R0,#11
STR R0,[R12,#v.good0]
LDR R0,[R12,#v.diff]
CMP R0,#1
MOV R0,#0
MOVLE R0,#5
STR R0,[R12,#v.good1]
MOV R0,#0
STR R0,[R12,#v.good2]
STR R0,[R12,#v.good3]
MOV R0,#&3555
STR R0,[R12,#v.magpitch]
LDMFD R13!,{PC}

.paperwipe
STMFD R13!,{R14}
LDR R10,[R12,#v.paperadr]
LDR R11,[R12,#v.storesadr]
ADD R11,R11,R0
ADD R10,R10,R0
LDR R14,[R12,#v.hbytes]
LDR R0,[R11,R14]
LDR R1,[R11,R14,LSL #1]
ADD R11,R11,#4
ADD R10,R10,#4
CMP R0,#80
BEQ wipe80
CMP R0,#64
BNE badwipe
.loop14
STMFD R13!,{R1,R10,R11}
LDMIA R11!,{R0-R7}
STMIA R10!,{R0-R7}
LDMIA R11!,{R0-R7}
STMIA R10!,{R0-R7}
LDMFD R13!,{R1,R10,R11}
ADD R10,R10,R14
ADD R11,R11,R14
SUBS R1,R1,#1
BGT loop14
LDMFD R13!,{PC}
.wipe80
.loop15
STMFD R13!,{R1,R10,R11}
LDMIA R11!,{R0-R9}
STMIA R10!,{R0-R9}
LDMIA R11!,{R0-R9}
STMIA R10!,{R0-R9}
LDMFD R13!,{R1,R10,R11}
ADD R10,R10,R14
ADD R11,R11,R14
SUBS R1,R1,#1
BGT loop15
LDMFD R13!,{PC}

.badwipe
SWI OS_WriteS
DCB "Non standard paperwipe",10,13,0
ALIGN
LDMFD R13!,{PC}

.setupscreen
STMFD R13!,{R14}
MOV R0,#0
SWI FastSpr_ScreenBank
MOV R0,#0
MOV R1,#0
MOV R2,#320
MOV R3,#256
SWI FastSpr_SetClipWindow
LDMFD R13!,{PC}

.vduread
STMFD R13!,{R14}
MOV R0,#113
MOV R1,#1
SWI OS_Byte
ADR R0,vdublock
ADD R1,R12,#v.screenadr
SWI OS_ReadVduVariables
LDR R0,[R12,#v.screenadr]
STR R0,[R12,#v.screenuse]
BL bindmouse
LDMFD R13!,{PC}
.vdublock
DCD 149;disp.hardware scr start
DCD 150;mode size
DCD 6
DCD -1


.backtranslate
STMFD R13!,{R4-R6,R14}
LDR R6,[R12,#v.levelnet]
LDR R4,[R6,#net.xsize]
LDR R5,[R6,#net.ysize]
SUB R0,R0,R6
SUB R0,R0,#net.data
MYDIV R1,R0,R4
CMP R0,R4
BGE backoffnet
CMP R1,R5
BGE backoffnet
SUB R0,R0,R4,ASR #1
SUB R1,R1,R5,ASR #1
MOV R0,R0,ASL #12
MOV R1,R1,ASL #12
MOV R4,#96
MUL R0,R4,R0
MUL R1,R4,R1
LDMFD R13!,{R4-R6,PC}
.backoffnet
MOV PC,#0; for the moment.


.translate
DIV96 R0,R2
DIV96 R1,R3
.transconv
STMFD R13!,{R2-R3,R5-R6}
LDR R6,[R12,#v.levelnet]
LDR R4,[R6,#net.xsize]
LDR R5,[R6,#net.ysize]
ADDS R2,R2,R4,ASR #1
BMI transout
CMP R2,R4
BGE transout
ADDS R3,R3,R5,ASR #1
BMI transout
CMP R3,R5
BGE transout
MUL R4,R3,R4; y coord
ADD R4,R4,R2
ADD R4,R4,R6
ADD R4,R4,#net.data
LDMFD R13!,{R2-R3,R5-R6}
BIC R14,R14,#1<<28
MOVS PC,R14
.transout
ADD R4,R6,#net.data
LDMFD R13!,{R2-R3,R5-R6}
MOV R2,#0
MOV R3,#0
ORR R14,R14,#1<<28
MOVS PC,R14


macro DIV96 m0,m1
{
MOV m0,m0,ASR #12
BIC R13,R13,#1
CMP m0,#0
RSBLT m0,m0,#0
ORRLT R13,R13,#1
ADD m0,m0,#48
MOV m1,#0
CMP m0,#3<<12
SUBGE m0,m0,#3<<12
ORRGE m1,m1,#1<<7
CMP m0,#3<<11
SUBGE m0,m0,#3<<11
ORRGE m1,m1,#1<<6
CMP m0,#3<<10
SUBGE m0,m0,#3<<10
ORRGE m1,m1,#1<<5
CMP m0,#3<<9
SUBGE m0,m0,#3<<9
ORRGE m1,m1,#1<<4
CMP m0,#3<<8
SUBGE m0,m0,#3<<8
ORRGE m1,m1,#1<<3
CMP m0,#3<<7
SUBGE m0,m0,#3<<7
ORRGE m1,m1,#1<<2
CMP m0,#3<<6
SUBGE m0,m0,#3<<6
ORRGE m1,m1,#1<<1
CMP m0,#3<<5
SUBGE m0,m0,#3<<5
ORRGE m1,m1,#1
TST R13,#1
RSBNE m1,m1,#0
RSBNE m0,m0,#95
BIC R13,R13,#3
}



.pathname
DCB "OddBall$Path",0
.levelpathname
DCB "OddBall$LevelPath",0
.savenamesfullname
DCB "<OddBall$FilePath>^.SaveNames",0
.savenamesname
DCB "SaveNames",0
.hinamesfullname
DCB "<OddBall$FilePath>^.HiScores",0
.hinamesname
DCB "HiScores",0
.hellname
DCB "Hell",0
.scanname
DCB "Scanner",0
.canvasname
DCB "Canvas",0
.storesname
DCB "Stores",0
.papername
DCB "Paper",0
.battablename
DCB "Bat",0
.ballstablename
DCB "Balls",0
.bulletstablename
DCB "Bullets",0
.blockstablename
DCB "Blocks",0
.starstablename
DCB "Stars",0
.decortablename
DCB "Decor",0
.edgetablename
DCB "Edges",0

.batname
DCB "Graphics.FSPbat",0
.ballsname
DCB "Graphics.FSPBalls",0
.blocksname
DCB "Graphics.FSPBlock<Oddball$BackNo>",0
.charsname
DCB "Graphics.FSPChars",0
.backdropname
DCB "Graphics.BackDrop<Oddball$BackNo>",0
.levelnetname
DCB "Levels<OddBall$Maze>",0
.starsname
DCB "Graphics.FSPStars",0
.decorname
DCB "Graphics.FSPDecor",0
.exploname
DCB "Graphics.FSPExplo",0
.edgename
DCB "Graphics.FSPEdge<OddBall$BackNo>",0
.goodiesname
DCB "Graphics.FSPGoodies",0
.arrowname
DCB "Graphics.FSPArrow",0
.sidepicname
DCB "Graphics.SideSpr",0
.topdataname
DCB "Graphics.TopData",0
ALIGN

.levelcount
STMFD R13!,{R14}
LDR R11,[R12,#v.levelnet]
LDR R0,[R11,#net.xsize]
LDR R1,[R11,#net.ysize]
MUL R9,R0,R1
CMP R9,#&100000
MOVGT R9,#0
ADD R10,R11,#net.data
MOV R8,#0
.levelcountloop
LDRB R0,[R10],#1
CMP R0,#&AB
MOVEQ R1,#1
STREQ R1,[R12,#v.scanlock]
CMP R0,#hit1
CMPNE R0,#hit2
ADDEQ R8,R8,#1

SUBS R9,R9,#1
BGT levelcountloop
STR R8,[R12,#v.blocknum]
STR R8,[R12,#v.blocksleft]
LDMFD R13!,{PC}

.startfind
STMFD R13!,{R14}
MOV R0,#0
STR R0,[R12,#v.ballxhome]
STR R0,[R12,#v.ballyhome]
LDR R11,[R12,#v.levelnet]
LDR R0,[R11,#net.xsize]
LDR R1,[R11,#net.ysize]
MUL R9,R0,R1
CMP R9,#&100000
MOVGT R9,#0
ADD R10,R11,#net.data
MOV R8,#0
.startfindloop
LDRB R0,[R10],#1
CMP R0,#&FF
BLEQ setballhome
SUBS R9,R9,#1
BGT startfindloop
LDMFD R13!,{PC}

.setballhome
STMFD R13!,{R14}
SUB R0,R10,#1
MOV R1,#0
STRB R1,[R0]
BL backtranslate
STR R0,[R12,#v.ballxhome]
STR R1,[R12,#v.ballyhome]
LDMFD R13!,{PC}




.levelname
DCB "OddBall$No",0
ALIGN


.vetlevel
STMFD R13!,{R14}
BL scanset
MOV R0,#0
STR R0,[R12,#v.scanlock]

LDR R0,[R12,#v.levelnet]
LDR R1,[R0,#net.xsize]
MOV R2,#96<<12
MUL R1,R2,R1
STR R1,[R12,#v.xlim]
LDR R1,[R0,#net.ysize]
MUL R1,R2,R1
STR R1,[R12,#v.ylim]
MOV R0,#0
MOV R1,#0
BL levelcount
BL backload
LDMFD R13!,{PC}

.loadlevel
LDR R0,[R12,#v.demomode]
CMP R0,#1
BEQ loadgame
STMFD R13!,{R14}
LDR R0,[R12,#v.levelno]
STR R0,[R12,#v.loadedlev]
MOV R0,#blockstab
SWI Amnesia_WipeTable

ADD R0,R12,#v.levelnet
LDR R0,[R0]
CMP R0,#0
SWINE Amnesia_ReleaseBlock
.badloadloop
MOV R0,#6
ADR R1,levelnetname
ADR R2,levelpathname
LDR R4,[R12,#v.levelno]
SUB R4,R4,#1
TST R4,#&400
AND R4,R4,#&FF
ADDNE R4,R4,#64
MOV R4,R4,LSL #3
SWI Blitz_HammerOp
CMP R4,#0
BNE dolevload 
LDR R1,[R12,#v.levelno]
ADD R1,R1,#1
STR R1,[R12,#v.levelno]
AND R1,R1,#&FF
CMP R1,#41
BLT badloadloop
B nolevelerr
.dolevload
MOV R0,#2
SWI Blitz_HammerOp
STMFD R13!,{R0-R4}
ADD R0,R12,#v.levelnet
MOV R1,R3
ADR R2,levelnetname
MOV R3,#0
SWI Amnesia_ClaimBlock
LDMFD R13!,{R0-R4}
LDR R3,[R12,#v.levelnet]
MOV R0,#3
SWI Blitz_HammerOp
.loadblockstab
MOV R0,#6
ADR R1,levelnetname
ADR R2,levelpathname
LDR R4,[R12,#v.levelno]
SUB R4,R4,#1
TST R4,#&400
AND R4,R4,#&FF
ADDNE R4,R4,#64
MOV R4,R4,LSL #3
ADD R4,R4,#4
SWI Blitz_HammerOp
CMP R4,#0
BEQ noblocktab 
MOV R0,#blockstab
SWI Amnesia_GetTableAddress
ADD R3,R0,#16
MOV R0,#3
SWI Blitz_HammerOp
.noblocktab
;MOV R0,#blockstab
;ADR R1,blockstabname
;ADR R2,levelpathname
;SWI XAmnesia_LoadTable
BL vetlevel
BL startfind
MOV R0,#1
STR R0,[R12,#v.sparks]
STR R0,[R12,#v.redball]
MOV R0,#0
STR R0,[R12,#v.warped]
LDR R1,[R12,#v.levelnet]
LDR R0,[R1,#net.xgrav]
STR R0,[R12,#v.xgrav]
LDR R0,[R1,#net.ygrav]
STR R0,[R12,#v.ygrav]
LDR R0,[R1.#net.backdrop]
TST R0,#1<<31
BLNE goodykill
LDMFD R13!,{PC}

.goodykill
MOV R0,#0
STR R0,[R12,#v.good0]
STR R0,[R12,#v.good1]
STR R0,[R12,#v.good2]
STR R0,[R12,#v.good3]
STR R0,[R12,#v.scanspeed]
STR R0,[R12,#v.lineradar]
MOV R0,#1
STR R0,[R12,#v.goodychange]
MOV PC,R14

.backload
STMFD R13!,{R14}
LDR R0,[R12,#v.loadeddrop]
LDR R1,[R12,#v.levelnet]
LDR R1,[R1,#net.backdrop]
AND R1,R1,#&FF
CMP R0,R1
LDMEQFD R13!,{PC}
.backabortins
BL setbackvar
ADD R0,R12,#v.backdrop
LDR R0,[R0]
CMP R0,#0
SWINE Amnesia_ReleaseBlock
ADD R0,R12,#v.backdrop
ADR R1,backdropname
ADR R2,pathname
SWI XAmnesia_LoadHammered
BVS backabort
MOV R0,#edgetab
SWI FastSpr_GetPointer
LDR R0,[R0]
CMP R0,#0
SWINE Amnesia_ReleaseBlock
MOV R0,#edgetab
SWI FastSpr_GetPointer
ADR R1,edgename
ADR R2,pathname
SWI XAmnesia_LoadHammered

MOV R0,#blockstab
SWI FastSpr_GetPointer
LDR R0,[R0]
CMP R0,#0
SWINE Amnesia_ReleaseBlock
MOV R0,#blockstab
SWI FastSpr_GetPointer
ADR R1,blocksname
ADR R2,pathname
SWI XAmnesia_LoadHammered

LDR R0,[R12,#v.levelnet]
LDR R0,[R0,#net.backdrop]
AND R0,R0,#&FF
STR R0,[R12,#v.loadeddrop]
LDMFD R13!,{PC}

.backabort
LDR R1,[R12,#v.levelnet]
ADD R1,R1,#net.backdrop
LDR R0,[R1]
MOV R2,R0
CMP R0,#0
MOVLE R0,#1
SUBGT R0,R0,#1
AND R0,R0,#&FF
BIC R2,R2,#&FF
ORR R0,R2,R0
STR R0,[R1]
B backabortins

.setbackvar
STMFD R13!,{R14}
LDR R0,[R12,#v.levelnet]
LDR R0,[R0,#net.backdrop]
AND R0,R0,#&FF
STR R0,[R12,#v.temp0]
ADR R0,backname
ADD R1,R12,#v.temp0
MOV R2,#4
MOV R3,#0
MOV R4,#1
SWI OS_SetVarVal
LDMFD R13!,{PC}

.backname
DCB "Oddball$BackNo",0
ALIGN


.loadfiles
STMFD R13!,{R14}
MOV R0,#edgetab
SWI FastSpr_GetPointer
MOV R1,#0
STR R1,[R0]
MOV R0,#blockstab
SWI FastSpr_GetPointer
MOV R1,#0
STR R1,[R0]

MOV R0,#batstab
SWI FastSpr_GetPointer
ADR R1,batname
ADR R2,pathname
SWI Amnesia_LoadHammered
MOV R0,#ballstab
SWI FastSpr_GetPointer
ADR R1,ballsname
ADR R2,pathname
SWI Amnesia_LoadHammered
MOV R0,#texttab
SWI FastSpr_GetPointer
ADR R1,charsname
ADR R2,pathname
SWI Amnesia_LoadHammered
MOV R0,#starstab
SWI FastSpr_GetPointer
ADR R1,starsname
ADR R2,pathname
SWI Amnesia_LoadHammered
MOV R0,#decortab
SWI FastSpr_GetPointer
ADR R1,decorname
ADR R2,pathname
SWI Amnesia_LoadHammered
MOV R0,#explotab
SWI FastSpr_GetPointer
ADR R1,exploname
ADR R2,pathname
SWI Amnesia_LoadHammered
MOV R0,#goodytab
SWI FastSpr_GetPointer
ADR R1,goodiesname
ADR R2,pathname
SWI Amnesia_LoadHammered
MOV R0,#arrowtab
SWI FastSpr_GetPointer
ADR R1,arrowname
ADR R2,pathname
SWI Amnesia_LoadHammered
BL setsavepath
;load the savenames file
ADD R0,R12,#v.savenames
ADR R1,savenamesfullname
MOV R2,#0

SWI XAmnesia_LoadFile

ADD R0,R12,#v.savenames
LDR R1,[R0]
CMP R1,#0
MOV R1,#256
ADR R2,savenamesname
MOV R3,#0
SWIEQ Amnesia_ClaimBlock

ADD R0,R12,#v.hinames
ADR R1,hinamesfullname
MOV R2,#0

SWI XAmnesia_LoadFile

ADD R0,R12,#v.hinames
LDR R1,[R0]
CMP R1,#0
MOV R1,#392
ADR R2,hinamesname
MOV R3,#0
SWIEQ Amnesia_ClaimBlock
LDMFD R13!,{PC}

.wipem
.loop8b
STR R0,[R1],#4
CMP R1,R2
BLT loop8b
MOV PC,R14

.random
LDR R0,[R12,#v.rnseed]
ADD R0,R0,#137
EOR R0,R0,R0,ROR #13
STR R0,[R12,#v.rnseed]
MOV PC,R14

.writeerror
STMFD R13!,{R14}
ADD R5,R0,#4
MOV R0,R1
BL message
MOV R3,#255
ADR R4,errortext
.weloop
LDRB R0,[R5],#1
CMP R0,#32
BLT weskip
CMP R0,#123
MOVGE R0,#32
CMP R0,#96
BICGE R0,R0,#32
STRB R0,[R4],#1
SUBS R3,R3,#1
BGT weloop
.weskip
RSB R3,R3,#255
MOV R3,R3,LSL #15
ADD R3,R3,#160<<12
STR R3,errormes
MOV R0,#0
STRB R0,[R4]
ADR R0,errormes
BL message
LDMFD R13!,{PC}
.errormes
DCD 160<<12,220<<12,-2<<12,0,&02000001,0
.errortext
DBB 256
ALIGN

.stonetab
INCBIN <OddBall$Path>Object.StoneTab

; ***** TEXT ENTRIES *****

.varsname
DCB "Vars",0

ALIGN
.diverror
ADR R0,diverrortext
SWI OS_GenerateError
.diverrortext
DCD &666
DCB "Division error",0
ALIGN
.nomemory
ADR R0,nomemerrtext
SWI OS_GenerateError
.nomemerrtext
DCD &666
DCB "Not enough memory to begin application",0
ALIGN
.loadfailedtext
DCD &666
DCB "Failed to load sprite file",0
ALIGN
.setupfailedtext
DCD &666
DCB "Failed to set up tables",0
ALIGN
.nolevelerr
ADR R0,noleveltext
SWI OS_GenerateError
.noleveltext
DCD &666
DCB "Cannot find level file",0


ALIGN
.hellshift
INCBIN <OddBall$Path>Object.HellShift
.linewrites
INCBIN <OddBall$Path>Object.LineWrites
ALIGN
.windback
INCBIN <OddBall$Path>Object.WindBack
.blockwindback
INCBIN <OddBall$Path>Object.BlockWind
.fade
INCBIN <OddBall$Path>Object.Fade
.nibprint
LDR R8,[R12,#v.plotnibble]
B printins
.print
MOV R8,#0
.printins
INCBIN <OddBall$Path>Object.Printer
.printnumber
INCBIN <OddBall$Path>Object.Number
.printstring
INCBIN <OddBall$Path>Object.String
.slideback
INCBIN <OddBall$Path>Object.SlideBack
.texthandler
LDR R8,[R12,#v.plotnibble]
INCBIN <OddBall$Path>Object.TextHandle
.message                           ;Do not separate these two INCBINs
INCBIN <OddBall$Path>Object.Message
.textsetup
INCBIN <OddBall$Path>Object.TextSetup
.circletab
INCBIN <OddBall$Path>Object.CircleTab
.progend
