mirror of
https://github.com/hsoft/collapseos.git
synced 2024-11-01 19:20:56 +11:00
103 lines
1.7 KiB
NASM
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
|
||
|
|