
        GET     h.RegNames


        AREA    |C$$Code|, CODE, READONLY


        EXPORT  _100Hz_install
        EXPORT  _100Hz_remove


XOS_Claim	  * &2001f
XOS_Release	  * &20020
XOS_IntOn         * &20013
XOS_IntOff        * &20014

Synth_Ticker	  * &54f03

; ---------------------------------------------------------------
_100Hz_install
; on exit	r0 = 0 (OK) or 1 (failed)
	STMFD	r13!,{r1-r12,r14}
	MOV     r0, #&1c
	ADR	r1, _100Hz_vector
	MOV	r2, #0
	SWI     XOS_Claim
	MOVVS	r0, #1
	MOVVC	r0, #0
	LDMFD	r13!,{r1-r12,pc}^

_100Hz_remove
; on exit	r0 = 0 (OK) or 1 (failed)
	STMFD	r13!,{r1-r12,r14}
	MOV     r0, #&1c
	ADR	r1, _100Hz_vector
	MOV	r2, #0
	SWI     XOS_Release
	LDMFD	r13!,{r1-r12,pc}^


_100Hz_vector
	STMFD  	r13!,{r0-r12,r14}
	LDR	r9, semaphore
	CMP	r9, #0
	LDMNEFD r13!,{r0-r12,pc}^
	MOV	r9, #1
	STR	r9, semaphore

	MOV 	r9, pc
	ORR	r8, r9, #3
	TEQP	r8, #0
	MOV	r0, r0

	STMFD   r13!, {r14}

	MOV     r0, #6
	LDR	r1, missed
	ADD	r1, r1, #1
	MOV	r2, #100
	SWI	Synth_Ticker		; increment by 1/100 sec

	LDMFD	r13!, {r14}
	TEQP	r9, #0

	CMP     r0, #1                  ; r0=1 -> failed to increment
	LDREQ   r0, missed
	ADDEQ   r0, r0, #1
	MOVNE	r0, #0
	STR     r0, missed

	MOV	r9, #0
	STR	r9, semaphore

	LDMFD  	r13!,{r0-r12,pc}^


missed		DCD 0
semaphore       DCD 0

        END
