From 7a975fa182134b7f1c1bb026cae4900e458bce8a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Stephan=20M=C3=BChlstrasser?= Date: Sat, 21 Feb 2015 22:52:01 +0100 Subject: [PATCH] Mask control keys from first keyboard scan row. --- libsrc/osic1p/kbhit.s | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/libsrc/osic1p/kbhit.s b/libsrc/osic1p/kbhit.s index 67f3c86ed..b616b4a3f 100644 --- a/libsrc/osic1p/kbhit.s +++ b/libsrc/osic1p/kbhit.s @@ -1,19 +1,35 @@ ; ; unsigned char kbhit (void); +; +; The method to detect a pressed key is based on the documentation in +; "Section 3 Programmed Key Functions" in "The Challenger Character Graphics +; Reference Manual" +; We only want to return true for characters that can be returned by cgetc(), +; but not for keys like or . Therefore a special handling is +; needed for the first row. This is implemented by a bit mask that is stored +; in tmp1 and that is set to zero after the first round. ; .export _kbhit .include "osic1p.inc" + .include "extzp.inc" + .include "zeropage.inc" _kbhit: - lda #%11111110 ; Select first keyboard row + lda #%11011111 ; Mask for only checking the column for the + sta tmp1 ; ESC key in the first keyboard row. + + lda #%11111110 ; Mask for first keyboard row scan: sta KBD ; Select keyboard row tax ; Save A lda KBD ; Read keyboard columns - ora #$01 ; Mask out lsb (Shift Lock), since we ignore it + ora tmp1 ; Mask out uninteresting keys (only relevant in + ; first row) cmp #$FF ; No keys pressed? bne keypressed + lda #$00 ; For remaining rows no keys masked + sta tmp1 txa ; Restore A sec ; Want to shift in ones rol a ; Rotate row select to next bit position -- 2.39.5