more work on MEGA65 keyboard scanner

This commit is contained in:
FeralChild64 committed 2020-11-28 20:47:35 +01:00
1 parent de1e3af061
commit bdbafaa76e
7 files changed
+125 -12

No files matched your search

+3 -3
View File
@@ -53,9 +53,9 @@ There is no official PETSCII code for `TAB` - we can't utilize the ones from C12
`SHFLAG` (`$028D`) variable is extended to support additional bucky keys on C128 and C65 keyboards:
| bits 7-5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 |
| :------: | :---------: | :------: | :------: | :------: | :------: |
| reserved | `CAPS LOCK` | `ALT` | `CTRL` | `VENDOR` | `SHIFT` |
| bits 7-6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 |
| :------: | :-------: | :---------: | :------: | :------: | :------: | :------: |
| reserved | `NO SCRL` | `CAPS LOCK` | `ALT` | `CTRL` | `VENDOR` | `SHIFT` |
Bits 3 and 4 are extension to the original variable, compatible with the C128 ROMs API. There is no official way to retrieve `NO_SCRL` status as of yet. The `40/80` key status cannot be retrieved in C64 mode at all (C128 hardware limitation).
+3 -3
View File
@@ -46,15 +46,15 @@
; --- Keyboard settings
;; #CONFIG# LEGACY_SCNKEY NO
;; #CONFIG# KEYBOARD_C65 NO ; untested
;; #CONFIG# KEYBOARD_C65_CAPS_LOCK NO ; untested
;; #CONFIG# KEYBOARD_C65 NO ; does not work
;; #CONFIG# KEYBOARD_C65_CAPS_LOCK NO ; does not work
;; #CONFIG# KEY_REPEAT_DEFAULT NO
;; #CONFIG# KEY_REPEAT_ALWAYS NO
;; #CONFIG# KEY_FAST_SCAN YES
;; #CONFIG# JOY1_CURSOR NO
;; #CONFIG# JOY2_CURSOR NO
;; #CONFIG# CONFIG_M65_KB_DEV NO ; for development, keep disabled
;; #CONFIG# M65_KB_DEV NO ; for development, keep disabled
;; #CONFIG# PROGRAMMABLE_KEYS YES
+4
View File
@@ -32,6 +32,10 @@
!addr C65_EXTKEYS_PR = $D607
!addr C65_EXTKEYS_DDR = $D608
!addr KBSCN_BUCKY = $D611
!addr KBSCN_PEEK = $D613
!addr KBSCN_SELECT = $D614
; SD card
!addr SD_CTL = $D680
+2 -1
View File
@@ -16,6 +16,7 @@
!ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !set _NEED_CAPS_LOCK = 1 }
!ifdef CONFIG_KEYBOARD_C65 { !set _NEED_EXTENDED = 1 }
!ifdef CONFIG_KEYBOARD_C65_CAPS_LOCK { !set _NEED_CAPS_LOCK = 1 }
!ifdef CONFIG_MB_M65 { !set _NEED_CAPS_LOCK = 1 }
!ifdef CONFIG_MB_M65 { !set _NEED_EXTENDED = 1 }
!ifdef CONFIG_KEYBOARD_C65 { !set _NEED_C65KB = 1 }
!ifdef CONFIG_MB_M65 { !set _NEED_C65KB = 1 }
@@ -34,7 +35,7 @@
!set KEY_FLAG_NO_SCRL = %00100000
}
!ifdef _NEED_CAPS_LOCK {
!set KEY_CAPS_LOCK = %00010000
!set KEY_FLAG_CAPSL = %00010000
}
+4 -1
View File
@@ -53,7 +53,10 @@
!addr M65_TXTWIN_Y1 = $591 ; text window - bottom-right Y coordinate + 1
!addr M65_TXTROW_OFF = $592 ; $592-$593 offset to the current text row from the viewport start
!addr M65_SCRCOLMAX = $594 ; maximum allowed column
; $595-$5EB -- UNUSED --
!addr M65_KB_BUCKY = $595 ; result of bucky keys scan
!addr M65_KB_COLSCAN = $596 ; $596-$59E results of keyboard scan, columns 0-8
; $59F-$5EB -- UNUSED --
!addr M65_DMAGIC_LIST = $5F1 ; $5EF-$5FF reserved for DMAgic list, 15 bytes (modulo bytes are not needed)
!addr M65_RS232_INBUF = $600 ; $600-$6FF -- reserved for RS-232 input buffer --
!addr M65_RS232_OUTBUF = $700 ; $700-$7FF -- reserved for RS-232 output buffer --
+4 -4
View File
@@ -78,7 +78,7 @@ SCNKEY:
and #$40
bne @1 ; branch if no CAPS LOCK
lda #KEY_CAPS_LOCK
lda #KEY_FLAG_CAPSL
sta SHFLAG
@1:
@@ -92,7 +92,7 @@ SCNKEY:
and #$01
bne @2 ; branch if no CAPS LOCK
lda #KEY_CAPS_LOCK
lda #KEY_FLAG_CAPSL
sta SHFLAG
@2:
@@ -374,8 +374,8 @@ scnkey_handle_caps_lock:
}
tax
lda SHFLAG
and #(%00000111 + KEY_CAPS_LOCK)
cmp #KEY_CAPS_LOCK
and #(%00000111 + KEY_FLAG_CAPSL)
cmp #KEY_FLAG_CAPSL
bne @7 ; branch if no special CAPS LOCK handling needed
cpx #$41 ; 'A'
+105
View File
@@ -4,4 +4,109 @@
m65_scnkey:
; First scan the whole keyboard
lda KBSCN_BUCKY
sta M65_KB_BUCKY
ldx #$08
@1:
stx KBSCN_SELECT
lda KBSCN_PEEK
eor #$FF ; let bit 1 mean 'pressed', not the otherwise
sta M65_KB_COLSCAN, x
dex
bpl @1
; Update the SHFLAG
lda SHFLAG
sta LSTSHF ; needed for SHIFT+VENDOR support
ldy #$00 ; the new SHFLAG will be constructed in .Y
ldx M65_KB_BUCKY
beq m65_scnkey_SHFLAG_ready
; FALLTROUGH
m65_scnkey_detect_SHIFT:
txa
and #%00000011
beq m65_scnkey_detect_VENDOR
tya
ora #KEY_FLAG_SHIFT
tay
; FALLTROUGH
m65_scnkey_detect_VENDOR:
txa
and #%00001000
beq m65_scnkey_detect_CTRL
tya
ora #KEY_FLAG_VENDOR
tay
; FALLTROUGH
m65_scnkey_detect_CTRL:
txa
and #%00000100
beq m65_scnkey_detect_ALT
tya
ora #KEY_FLAG_CTRL
tay
; FALLTROUGH
m65_scnkey_detect_ALT:
txa
and #%00010000
beq m65_scnkey_detect_CAPS_LOCK
tya
ora #KEY_FLAG_ALT
tay
; FALLTROUGH
m65_scnkey_detect_CAPS_LOCK:
txa
and #%01000000
beq m65_scnkey_detect_NO_SCRL
tya
ora #KEY_FLAG_NO_SCRL
tay
; FALLTROUGH
m65_scnkey_detect_NO_SCRL:
txa
and #%00100000
beq m65_scnkey_SHFLAG_ready
tya
ora #KEY_FLAG_CAPSL
tay
; FALLTROUGH
m65_scnkey_SHFLAG_ready:
sty SHFLAG
; XXX
rts