
 ;-----------------------------------------------------------------------
 ;Memory setup

.memory_init

 ;Claim screen memory
 mov r0,#2
 swi OS_ReadDynamicArea
 mov r0,#2
 rsbs r2,r1,#xscreen*yscreen*4*3
 mov r1,r2
 swigt XOS_ChangeDynamicArea

 ;Claim wimpslot
 mov r0,#2100*1024
 mvn r1,#0
 swi Wimp_SlotSize

 mov pc,r14

 ;-----------------------------------------------------------------------
 ;Video setup

.video_init

 ;Set mode
 mov r0,#0
 adr r1,mode
 swi OS_ScreenMode
 swi OS_RemoveCursors

 ;Get video ram base
 mov r0,#2
 swi OS_ReadDynamicArea
 str r0,video

 mov pc,r14

 ;-----------------------------------------------------------------------
 ;Triple bufferer
.vbl
 cmp r0,#4
 movnes pc,r14
 stmfd r13!,{r0-r12,r14}
 adr r12,work
 ldmia r12,{r0-r1}
 subs r1,r1,#1
 moveq r1,#3
 ;has the work finished?
 cmp r0,r1
 ldmeqfd r13!,{r0-r12,pc}^
 ;if so then we can jump down to show one not being worked on
 str r1,[r12,#4]
 ;now we must set the banks
 ;switch to supervisor mode
 mov r12,pc
 orr r0,r12,#3
 teqp r0,#0
 mov r0,r0
 stmfd r13!,{r14}
 mov r0,#113
 swi OS_Byte
 ldmfd r13!,{r14}
 teqp r12,#0
 mov r0,r0

 ;done
 ldmfd r13!,{r0-r12,pc}^

.wait_vsync
 ;Check to see if the write to bank is set to the one still shown
 ldr r0,work
.wait_v_loop
 ldr r1,show
 cmp r0,r1
 beq wait_v_loop
 mov pc,r14

 ;-----------------------------------------------------------------------
 ;Quiter
.exit
 ;Quit all our interrupts...
 ;Ticker
 mov r0,#&1C
 adr r1,ticker
 mov r2,#007
 swi OS_Release
 ;Vbl
 mov r0,#&10
 adr r1,vbl
 mov r2,#&D09E
 swi OS_Release
 ;Switch off event
 mov r0,#&d
 mov r1,#4
 swi OS_Byte
 ;Flush buffer
 mov r0,#15
 mov r1,#0
 swi OS_Byte
 mvn r0,#0
 swi Wimp_CommandWindow

 swi OS_Exit

 ;-----------------------------------------------------------------------
 ;Interrupts
.interrupt_init

 ;Ticker
 mov r0,#&1C
 adr r1,ticker
 mov r2,#007
 swi OS_Claim

 ;Start up the triple buffering
 mov r0,#&10
 adr r1,vbl
 mov r2,#&D09E
 swi OS_Claim
 ;ensure event is enabled
 mov r0,#&e
 mov r1,#4
 swi OS_Byte

 mov pc,r14

 ;-----------------------------------------------------------------------
 ;Ticker routine
.ticker
 stmfd r13!,{r0-r12,r14}
 ;syncronises effects to 100hz ticker
 ldr r0,counter
 add r0,r0,#1
 str r0,counter
 ldmfd r13!,{r0-r12,pc}^

.counter
 dcd 0
