From d4b62460bc11dc5e5f2260c5aa152a8fa45c47a5 Mon Sep 17 00:00:00 2001 From: decrazyo Date: Sun, 11 Feb 2024 23:35:00 -0600 Subject: [PATCH] fix keyboard driver to work on real hardware (hopefully) --- kernel/nintendo/keyboard.s | 9 ++++++++ kernel/nintendo/keyboard_init.s | 38 +++++++++++++++++++++++++------- lunix.fds | Bin 23264 -> 23305 bytes 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/kernel/nintendo/keyboard.s b/kernel/nintendo/keyboard.s index 2d5ae1f..5df5a85 100644 --- a/kernel/nintendo/keyboard.s +++ b/kernel/nintendo/keyboard.s @@ -79,6 +79,13 @@ key_delay: .byte $00 ; TODO: check if a keyboard is actually connected. +; burn some cycles to give the keyboard time to settle. +keyb_delay: + ldy #10 + - dey + bne - + rts + ; interrupt routine, that scans for keys keyb_scan: ; our current key table offset encodes where we are in the scanning process. @@ -101,6 +108,7 @@ read_keyboard: ; reset the keyboard to the 0th row, 0th column. lda #$05 sta JOYPAD1 + jsr keyb_delay ; this may not be strictly necessary but it's safer and only wastes a few cycles. ; reset keytab_offset to 0 ldx #0 stx keytab_offset @@ -115,6 +123,7 @@ get_nibble: ; always set the keyboard enable bit. ora #%00000100 sta JOYPAD1 + jsr keyb_delay ; read 4 bits of key data from the keyboard. lda JOYPAD2 diff --git a/kernel/nintendo/keyboard_init.s b/kernel/nintendo/keyboard_init.s index 518c871..7b25dd5 100644 --- a/kernel/nintendo/keyboard_init.s +++ b/kernel/nintendo/keyboard_init.s @@ -16,26 +16,41 @@ ;; initialize and install keyboard scanning routine keyboard_init: ; check that a keyboard is attached. - ; reset the keyboard to the 0th row, 0th column. lda #$05 sta JOYPAD1 - ; toggle the column select bit until we reach the keyless 10th row. + ; give the keyboard some time to reset. + nop + nop + nop + nop + nop + nop + + ; toggle the column select bit until we reach the last column of the 9th row. + ldx #9 + - lda #$04 + sta JOYPAD1 + jsr _delay lda #$06 - ldx #$04 - ldy #18 - - sta JOYPAD1 - stx JOYPAD1 - dey + sta JOYPAD1 + jsr _delay + dex bne - + ; select the keyless 10th row. + lda #$04 + sta JOYPAD1 + jsr _delay + ; check that the keyboard responds correctly to enable/disable signals. lda JOYPAD2 and #$1e eor #$1e bne _printmsg ; branch on error sta JOYPAD1 + jsr _delay lda JOYPAD2 and #$1e bne _printmsg ; branch on error @@ -60,8 +75,15 @@ _printmsg: bne - + rts +; burn some cycles to give the keyboard time to settle. +_delay: + ldy #10 + - dey + bne - + rts + _startmsg: - .text "Family BASIC Keyboard module version 0.3" + .text "Family BASIC Keyboard module version 0.4" .byte $0a _errormsg: .text "No Keyboard" diff --git a/lunix.fds b/lunix.fds index 6ebf1cbedeb7aa901e5fc49614b2e4ca88923642..2033b89dce1495ee5a4ae594466b9a06f57a6049 100644 GIT binary patch delta 5717 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