|
- ; 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
|