JOYMEGA MODE
During the execution of the JOYLIB.GTJOYMEG6 from HIDLIB, the Z80 calls a function to read the Joystick right after it flips the state of the Pulse pin ..
...
call BASELIB.FLIPPORTOUT ;
call BASELIB.RDJOYPORT;
..
Tracing the assembly instructions the time it takes from the pin change (OUT instruction) to the reading (IN) is 100 cycles (see below) or ~28us.
In terms of AVR cycles it means 100 * (8MHz/3.58MHz) or 223 cycles to spend with latency. After discounting 11 cycles for the latency of a pin change interrupt theres is still more than enough processing time for not to worry with the compiler overhead.
call BASELIB.FLIPPORTOUT
BASELIB.FLIPPORTOUT:
ld a,e
xor d ; flip Output
ld e,a
ld a,15
jp WRTPSG
WRTPSG:
DI
OUT (PSG.LW),A ;LATCH ADDRESS
PUSH AF
LD A,E
OUT (PSG.DW),A ;OUTPUT DATA ; 12
EI ; 5
POP AF ; 11
RET ; 11
call BASELIB.RDJOYPORT ; 18
BASELIB.RDJOYPORT:
ld a,14 ; 8
di ; 5
call RDPSG ; 18
RDPSG:
OUT (PSG.LW),A ; 12
IN A,(PSG.DR)
RET
ei
ret
; 12+5+11+11+18+8+5+18+12 = 100
BASIC MODE
The timing on Basic mode is a bit shorter, 60 cycles from the instruction that rise the level of the Pulse pin until the first reading on the joystick port.
It is still enough time to deal with the code produced by the compiler as it represents ~17us or 134 AVR cycles (at 8MHz).
GTPDL:
INC A ;Force parameter 2 based
AND A
RRA
PUSH AF ;Save port # (carry reset if port 1)
LD B,A
XOR A
SCF
PDL1:
RLA ;Form mask pattern
DJNZ PDL1
LD B,A ;Set mask pattern
POP AF
LD C,10H ;Assume port 1
LD DE,03AFH
JR NC,PDLP1 ;Good assumption
LD C,' '
LD DE,4C9FH
PDLP1:
LD A,PSG.PB
DI
CALL RDPSG ;Get current port B content
AND E
OR D
OR C
OUT (PSG.DW),A ;Set trigger high ; 12
XOR C ; 8
OUT (PSG.DW),A ;Set trigger low again ; 12
LD A,0EH ; 8
OUT (PSG.LW),A ; 12
LD C,0 ;Initialize counter ; 8
PDL2: ; total: 12+8+12+8+12+8 = 60
IN A,(PSG.DR) ; 16.76us / 134 AVR cycles @ 8.0 MHz
AND B ;End of pulse?
JR Z,PDL3 ;Yes
INC C ;Bump counter
JP NZ,PDL2 ;No overflow yet
DEC C ;Make it 255
PDL3:
EI
LD A,C ;Return counted value
RET
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.