collapseos/kernel/sms/kbd.asm

103 lines
1.7 KiB
NASM

; kbd - implement FetchKC for SMS PS/2 adapter
;
; Implements KBD_FETCHKC for the adapter described in recipe sms/kbd. It does
; so for both Port A and Port B (you hook whichever you prefer).
; FetchKC on Port A
smskbdFetchKCA:
; Before reading a character, we must first verify that there is
; something to read. When the adapter is finished filling its '164 up,
; it resets the latch, which output's is connected to TL. When the '164
; is full, TL is low.
; Port A TL is bit 4
in a, (0xdc)
and 0b00010000
jr nz, .nothing
push bc
in a, (0x3f)
; Port A TH output, low
ld a, 0b11011101
out (0x3f), a
nop
nop
in a, (0xdc)
; bit 3:0 are our dest bits 3:0. handy...
and 0b00001111
ld b, a
; Port A TH output, high
ld a, 0b11111101
out (0x3f), a
nop
nop
in a, (0xdc)
; bit 3:0 are our dest bits 7:4
rlca \ rlca \ rlca \ rlca
and 0b11110000
or b
ex af, af'
; Port A/B reset
ld a, 0xff
out (0x3f), a
ex af, af'
pop bc
ret
.nothing:
xor a
ret
; FetchKC on Port B
smskbdFetchKCB:
; Port B TL is bit 2
in a, (0xdd)
and 0b00000100
jr nz, .nothing
push bc
in a, (0x3f)
; Port B TH output, low
ld a, 0b01110111
out (0x3f), a
nop
nop
in a, (0xdc)
; bit 7:6 are our dest bits 1:0
rlca \ rlca
and 0b00000011
ld b, a
in a, (0xdd)
; bit 1:0 are our dest bits 3:2
rlca \ rlca
and 0b00001100
or b
ld b, a
; Port B TH output, high
ld a, 0b11110111
out (0x3f), a
nop
nop
in a, (0xdc)
; bit 7:6 are our dest bits 5:4
rrca \ rrca
and 0b00110000
or b
ld b, a
in a, (0xdd)
; bit 1:0 are our dest bits 7:6
rrca \ rrca
and 0b11000000
or b
ex af, af'
; Port A/B reset
ld a, 0xff
out (0x3f), a
ex af, af'
pop bc
ret
.nothing:
xor a
ret