; Input HL=0 joystick port 1, HL<>0 joystick port 2
; Output HL H = 1111 1ZYX, L = ASBC UDLR, bit=0 button is pressed
DI ; F3
PUSH BC ; C5
PUSH DE ; D5
LD A,L ; 7D
OR H ; 0=port 1, other=port 2 ; B4
LD A,0 ; 3E 00
JR Z,ReadPort1 ; 28 02
LD A,5 ; 3E 05
ReadPort1:
LD D,A ; KBin offset ; 57
LD HL,65535 ; 21 FF FF
; two full pulses
LD E,2 ; 1E 02
XOR A ; AF
; set DataOut high (0V) - set SELECT low (0V)
PulseLoop:
INC A ; 3C
OUT (183),A ; D3 B7
LD B,10 ; 06 0A
DJNZ $ ; wait 30 us @ 4 MHz clock ; 10 FE
; set DataOut low (+12V) - set SELECT high (5V)
DEC A ; 3D
OUT (183),A ; D3 B7
LD B,10 ; 06 0A
DJNZ $ ; 10 FE
DEC E ; 1D
JR NZ,PulseLoop ; 20 EF
; at third pulse read high row of buttons
; read btn A & Start
LD A,D ; load offset ; 7A
OUT (181),A ; set KBout ; D3 B5
IN A,(182) ; read KBin ; DB B6
AND 3 ; leave only bit 0 & 1 ; E6 03
RRA ; shift bit 0 to CY ; 1F
RL L ; shift CY to L ; CB 15
RRA ; shift bit 1 to CY ; 1F
RL L ; shift CY to L ; CB 15
; read low row of buttons
LD A,1 ; 3E 01
OUT (183),A ; DataOut=1=0V, SELECT=0= 0V ; D3 B7
LD B,5 ; loop counter ; 06 05
LD E,D ; 5A
; read btn B & C
LD A,E ; load offset ; 7B
OUT (181),A ; set KBout ; D3 B5
IN A,(182) ; read KBin ; DB B6
AND 3 ; leave only bit 0 & 1 ; E6 03
RRA ; shift bit 0 to CY (button B) ; 1F
RL L ; shift CY to L ; CB 15
RRA ; shift bit 1 to CY (button C) ; 1F
RL L ; shift CY to L ; CB 15
INC E ; 1C
DEC B ; 05
; read directions
ReadHighLoop:
LD A,E ; load offset ; 7B
OUT (181),A ; set KBout ; D3 B5
IN A,(182) ; read KBin ; DB B6
AND 1 ; leave only bit 0 ; E6 01
RRA ; shift bit 0 to CY ; 1F
RL L ; shift CY to L ; CB 15
INC E ; 1C
DJNZ ReadHighLoop ; 10 F3
; L = ASBC UDLR
; start fourth pulse, read third row of buttons
XOR A ; AF
OUT (183),A ; DataOut=0=+12V, SELECT=1=+5V ; D3 B7
LD B,3 ; loop counter ; 06 03
LD E,D ; 5A
INC E ; 1C
; read X, Y, Z
ReadLowLoop:
LD A,E ; load offset ; 7B
OUT (181),A ; set KBout ; D3 B5
IN A,(182) ; read KBin ; DB B6
AND 1 ; leave only bit 0 ; E6 01
RRA ; shift bit 0 to CY ; 1F
RL H ; shift CY to H ; CB 14
INC E ; 1C
DJNZ ReadLowLoop ; 10 F3
; H = 1111 1ZYX
; set SELECT low - last pulse reset pad counter
LD A,1 ; 3E 01
OUT (183),A ; D3 B7
LD B,10 ; 06 0A
DJNZ $ ; 10 FE
; set SELECT high
DEC A ; 3D
OUT (183),A ; D3 B7
POP DE ; D1
POP BC ; C1
EI ; FB
RET ; C9