
 ;-----------------------------------------------------------------------
 ;Triple bufferer
.vbl
 cmp r0,#4
 movnes pc,r14
 stmfd r13!,{r0-r1,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-r1,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-r1,pc}^

 ;-----------------------------------------------------------------------
 ;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

 ;-----------------------------------------------------------------------
 ;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
