DIM code% 256

FOR pass%=0 TO 2
P%=code%
[OPT pass%
; on entry r0 = time to delay
; r1 = number of times to perform
STMFD r13!,{r14}
MOV r4,#0           ; parallel count
MOV r5,r0
SWI "Debug_ShowR0"
MOV r6,r1
SWI "OS_IntOff"
SWI "OS_EnterOS"
LDR r9,hal_counterdelay_ws
LDR r7,parallel

.loop
MOV r0,r5           ; pass delay value in r0
MOV r14,pc
LDR pc,hal_counterdelay ; do the delay
MOV r0,r0
ADD r4,r4,#1        ; increment count
STRB r4,[r7]
SUBS r6,r6,#1
BNE loop

TEQP pc,#0
MOV  r0,r0
SWI "OS_IntOff"
LDMFD r13!,{pc}

.parallel_delay_calibrate     ; measure the I/O delay of the parallel port
MOV r9,r14                    ; by toggling it as fast as possible
LDR r7,parallel
MOV r0,#0
MOV r1,#&400000
SWI "OS_IntOff"
SWI "OS_EnterOS"
.parallel_loop
ADD r0,r0,#1
STRB r0,[r7]
SUBS r1,r1,#1
BNE parallel_loop
TEQP pc,#0
MOV  r0,r0
SWI  "OS_IntOn"
MOV  pc,r9


.parallel
EQUD 0
.hal_counterdelay
EQUD 0
.hal_counterdelay_ws
EQUD 0

]
NEXT pass%
SYS "Parallel_HardwareAddress" TO lpt%
!parallel=lpt%
OS_Hardware = &7A
SYS OS_Hardware,,,,,,,,,1,22 TO !hal_counterdelay,!hal_counterdelay_ws
REPEAT
INPUT "Time in us: "A%
testduration%=10E6:REM us
B%=testduration%/A%
REMA%=50:REM us
REMB%=200000:REM times
CALL code%
UNTIL A%=0

