legacy keyboard code removed
This commit is contained in:
1 parent
295bed09c7
commit
64c2def140
29 files changed
+16
-694
No files matched your search
@@ -197,12 +197,6 @@ Each of them needs a couple of bytes in KERNAL segment - but they can share some
|
|||||||
|
|
||||||
Original keyboard support routine is just horrible. It does nothing to prevent ghosting - press A+S+D at the same time - it prints F. Try to use joystick connected to control port 1 - it outputs phantom characters. The Open ROMs provides much more sophisticated routines to prevent such problems.
|
Original keyboard support routine is just horrible. It does nothing to prevent ghosting - press A+S+D at the same time - it prints F. Try to use joystick connected to control port 1 - it outputs phantom characters. The Open ROMs provides much more sophisticated routines to prevent such problems.
|
||||||
|
|
||||||
### `LEGACY_SCNKEY`
|
|
||||||
|
|
||||||
Uses old Open ROMs keyboard scanning routine, which is basically the example routine by TWW/CTR, hacked to work within Kernal. It's greatest advantage is multi-key rollover, it's disadvantages - it's much less compatible (uses several bytes of memory which are normally free for user software - thus, it is considered legacy for now), does not support all the system variables (`RPTFLG` and `KEYLOG` are unsupported), and ignores the configuration options - this can be changed, but it requires some effort.
|
|
||||||
|
|
||||||
Needs 30-250 more space in KERNAL segment (depending on the features enabled for current default routine). If unsure - disable.
|
|
||||||
|
|
||||||
### `KEYBOARD_C128`
|
### `KEYBOARD_C128`
|
||||||
|
|
||||||
Allows to use additional keys found on the C128 keyboard.
|
Allows to use additional keys found on the C128 keyboard.
|
||||||
@@ -235,7 +229,7 @@ Needs 13 bytes more space in KERNAL segment. Only disable if you are running out
|
|||||||
|
|
||||||
### `JOY1_CURSOR` and `JOY2_CURSOR`
|
### `JOY1_CURSOR` and `JOY2_CURSOR`
|
||||||
|
|
||||||
Joystick movement also moves the cursor.
|
Use joystick to move the cursor. On MEGA65 applies to legacy mode only (on native mode there is BASIC command available to set this option in runtime).
|
||||||
|
|
||||||
Needs about 65 bytes of ROM space in KERNAL segment to handle both joysticks.
|
Needs about 65 bytes of ROM space in KERNAL segment to handle both joysticks.
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
Here are the features of the Open ROMs not found in the original ROMs from the 80s (many of them are [configurable](CONFIG.md) during compilation):
|
Here are the features of the Open ROMs not found in the original ROMs from the 80s (many of them are [configurable](CONFIG.md) during compilation):
|
||||||
|
|
||||||
|
|
||||||
* improved keyboard scanning, resistant to ghosting and joystick interference (one variant even supports multi-key rollover), supports additional C128 keys
|
* improved keyboard scanning, resistant to ghosting and joystick interference, supports additional C128 keys
|
||||||
* joystick can be used to move text cursor
|
* joystick can be used to move text cursor
|
||||||
* pre-defined function keys
|
* pre-defined function keys
|
||||||
|
|
||||||
|
|||||||
@@ -76,7 +76,6 @@
|
|||||||
|
|
||||||
; --- Keyboard settings
|
; --- Keyboard settings
|
||||||
|
|
||||||
;; #CONFIG# LEGACY_SCNKEY NO
|
|
||||||
;; #CONFIG# KEYBOARD_C128 NO
|
;; #CONFIG# KEYBOARD_C128 NO
|
||||||
;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO
|
;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO
|
||||||
;; #CONFIG# KEY_REPEAT_DEFAULT NO
|
;; #CONFIG# KEY_REPEAT_DEFAULT NO
|
||||||
|
|||||||
@@ -65,7 +65,6 @@
|
|||||||
|
|
||||||
; --- Keyboard settings
|
; --- Keyboard settings
|
||||||
|
|
||||||
;; #CONFIG# LEGACY_SCNKEY NO
|
|
||||||
;; #CONFIG# KEYBOARD_C128 NO
|
;; #CONFIG# KEYBOARD_C128 NO
|
||||||
;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO
|
;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO
|
||||||
;; #CONFIG# KEY_REPEAT_DEFAULT NO
|
;; #CONFIG# KEY_REPEAT_DEFAULT NO
|
||||||
|
|||||||
@@ -67,7 +67,6 @@
|
|||||||
|
|
||||||
; --- Keyboard settings
|
; --- Keyboard settings
|
||||||
|
|
||||||
;; #CONFIG# LEGACY_SCNKEY NO
|
|
||||||
;; #CONFIG# KEYBOARD_C128 NO
|
;; #CONFIG# KEYBOARD_C128 NO
|
||||||
;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO
|
;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO
|
||||||
;; #CONFIG# KEY_REPEAT_DEFAULT NO
|
;; #CONFIG# KEY_REPEAT_DEFAULT NO
|
||||||
|
|||||||
@@ -45,7 +45,6 @@
|
|||||||
|
|
||||||
; --- Keyboard settings
|
; --- Keyboard settings
|
||||||
|
|
||||||
;; #CONFIG# LEGACY_SCNKEY NO
|
|
||||||
;; #CONFIG# KEY_REPEAT_DEFAULT NO
|
;; #CONFIG# KEY_REPEAT_DEFAULT NO
|
||||||
;; #CONFIG# KEY_REPEAT_ALWAYS NO
|
;; #CONFIG# KEY_REPEAT_ALWAYS NO
|
||||||
;; #CONFIG# KEY_FAST_SCAN YES
|
;; #CONFIG# KEY_FAST_SCAN YES
|
||||||
|
|||||||
@@ -65,7 +65,6 @@
|
|||||||
|
|
||||||
; --- Keyboard settings
|
; --- Keyboard settings
|
||||||
|
|
||||||
;; #CONFIG# LEGACY_SCNKEY YES
|
|
||||||
;; #CONFIG# KEYBOARD_C128 NO
|
;; #CONFIG# KEYBOARD_C128 NO
|
||||||
;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO
|
;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO
|
||||||
;; #CONFIG# KEY_REPEAT_DEFAULT NO
|
;; #CONFIG# KEY_REPEAT_DEFAULT NO
|
||||||
|
|||||||
@@ -55,7 +55,6 @@
|
|||||||
|
|
||||||
; --- Keyboard settings
|
; --- Keyboard settings
|
||||||
|
|
||||||
;; #CONFIG# LEGACY_SCNKEY NO
|
|
||||||
;; #CONFIG# KEYBOARD_C128 NO
|
;; #CONFIG# KEYBOARD_C128 NO
|
||||||
;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO
|
;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO
|
||||||
;; #CONFIG# KEY_REPEAT_DEFAULT NO
|
;; #CONFIG# KEY_REPEAT_DEFAULT NO
|
||||||
|
|||||||
@@ -57,7 +57,6 @@
|
|||||||
|
|
||||||
; --- Keyboard settings
|
; --- Keyboard settings
|
||||||
|
|
||||||
;; #CONFIG# LEGACY_SCNKEY NO
|
|
||||||
;; #CONFIG# KEYBOARD_C128 NO
|
;; #CONFIG# KEYBOARD_C128 NO
|
||||||
;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO
|
;; #CONFIG# KEYBOARD_C128_CAPS_LOCK NO
|
||||||
;; #CONFIG# KEY_REPEAT_DEFAULT NO
|
;; #CONFIG# KEY_REPEAT_DEFAULT NO
|
||||||
|
|||||||
@@ -227,17 +227,9 @@
|
|||||||
|
|
||||||
; Check that keyboard settings are correct
|
; Check that keyboard settings are correct
|
||||||
|
|
||||||
!ifdef CONFIG_LEGACY_SCNKEY {
|
|
||||||
!ifdef CONFIG_RS232_UP2400 { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_RS232_UP2400" }
|
|
||||||
!ifdef CONFIG_RS232_UP9600 { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_RS232_UP9600" }
|
|
||||||
!ifdef CONFIG_TAPE_NORMAL { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_TAPE_NORMAL" }
|
|
||||||
!ifdef CONFIG_KEYBOARD_C128 { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_KEYBOARD_C128" }
|
|
||||||
!ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !error "CONFIG_LEGACY_SCNKEY is not compatible with CONFIG_KEYBOARD_C128_CAPS_LOCK" }
|
|
||||||
}
|
|
||||||
!ifdef CONFIG_MB_M65 {
|
!ifdef CONFIG_MB_M65 {
|
||||||
!ifdef CONFIG_KEYBOARD_C128 { !error "MEGA65 motherboard is not compatible with CONFIG_KEYBOARD_C128" }
|
!ifdef CONFIG_KEYBOARD_C128 { !error "MEGA65 motherboard is not compatible with CONFIG_KEYBOARD_C128" }
|
||||||
!ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !error "MEGA65 motherboard is not compatible with CONFIG_KEYBOARD_C128_CAPS_LOCK" }
|
!ifdef CONFIG_KEYBOARD_C128_CAPS_LOCK { !error "MEGA65 motherboard is not compatible with CONFIG_KEYBOARD_C128_CAPS_LOCK" }
|
||||||
!ifdef CONFIG_LEGACY_SCNKEY { !error "MEGA65 motherboard is not compatible with CONFIG_LEGACY_SCNKEY" }
|
|
||||||
}
|
}
|
||||||
!ifdef CONFIG_MB_U64 {
|
!ifdef CONFIG_MB_U64 {
|
||||||
!ifdef CONFIG_KEYBOARD_C128 { !error "Ultimate 64 motherboard is not compatible with CONFIG_KEYBOARD_C128" }
|
!ifdef CONFIG_KEYBOARD_C128 { !error "Ultimate 64 motherboard is not compatible with CONFIG_KEYBOARD_C128" }
|
||||||
|
|||||||
@@ -108,23 +108,17 @@
|
|||||||
!addr CNTDN = $A5 ; -- NOT IMPLEMENTED --
|
!addr CNTDN = $A5 ; -- NOT IMPLEMENTED --
|
||||||
!addr BUFPNT = $A6 ; -- NOT IMPLEMENTED --
|
!addr BUFPNT = $A6 ; -- NOT IMPLEMENTED --
|
||||||
!addr INBIT = $A7 ; temporary storage for tape / RS-232 received bits
|
!addr INBIT = $A7 ; temporary storage for tape / RS-232 received bits
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY {
|
|
||||||
!addr BITCI = $A8 ; -- NOT IMPLEMENTED --
|
!addr BITCI = $A8 ; -- NOT IMPLEMENTED --
|
||||||
!addr RINONE = $A9 ; -- WIP -- (UP9600 only) RS-232 check for start bit flag
|
!addr RINONE = $A9 ; -- WIP -- (UP9600 only) RS-232 check for start bit flag
|
||||||
!addr RIDDATA = $AA ; -- NOT IMPLEMENTED --
|
!addr RIDDATA = $AA ; -- NOT IMPLEMENTED --
|
||||||
!addr RIPRTY = $AB ; -- WIP -- checksum while reading tape
|
!addr RIPRTY = $AB ; -- WIP -- checksum while reading tape
|
||||||
}
|
|
||||||
!addr SAL = $AC ; $AC-$AD -- XXX: describe -- (implemented screen part)
|
!addr SAL = $AC ; $AC-$AD -- XXX: describe -- (implemented screen part)
|
||||||
!addr EAL = $AE ; $AE-$AF -- XXX: describe -- [!] used also by screen editor, for temporary color storage when scrolling
|
!addr EAL = $AE ; $AE-$AF -- XXX: describe -- [!] used also by screen editor, for temporary color storage when scrolling
|
||||||
!addr CMP0 = $B0 ; $B0-$B1 temporary tape storage, [!] here used for BRK instruction address
|
!addr CMP0 = $B0 ; $B0-$B1 temporary tape storage, [!] here used for BRK instruction address
|
||||||
!addr TAPE1 = $B2 ; $B2-$B3 tape buffer pointer
|
!addr TAPE1 = $B2 ; $B2-$B3 tape buffer pointer
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY {
|
|
||||||
!addr BITTS = $B4 ; -- NOT IMPLEMENTED --
|
!addr BITTS = $B4 ; -- NOT IMPLEMENTED --
|
||||||
}
|
|
||||||
!addr NXTBIT = $B5 ; -- NOT IMPLEMENTED -- [!] also used by tape routine to store CPU turbo settings
|
!addr NXTBIT = $B5 ; -- NOT IMPLEMENTED -- [!] also used by tape routine to store CPU turbo settings
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY {
|
|
||||||
!addr RODATA = $B6 ; -- NOT IMPLEMENTED --
|
!addr RODATA = $B6 ; -- NOT IMPLEMENTED --
|
||||||
}
|
|
||||||
!addr FNLEN = $B7 ; current file name length
|
!addr FNLEN = $B7 ; current file name length
|
||||||
!addr LA = $B8 ; current logical_file number
|
!addr LA = $B8 ; current logical_file number
|
||||||
!addr SA = $B9 ; current secondary address
|
!addr SA = $B9 ; current secondary address
|
||||||
@@ -175,7 +169,6 @@
|
|||||||
!addr BUF = $200 ; $200-$250, BASIC line editor input buffer (81 bytes)
|
!addr BUF = $200 ; $200-$250, BASIC line editor input buffer (81 bytes)
|
||||||
|
|
||||||
; $250-$258 is the 81st - 88th characters in BASIC input, a carry over from VIC-20
|
; $250-$258 is the 81st - 88th characters in BASIC input, a carry over from VIC-20
|
||||||
; and not used on C64 - they are used if CONFIG_LEGACY_SCNKEY is enabled.
|
|
||||||
|
|
||||||
; [!] XXX document $251-$258 usage
|
; [!] XXX document $251-$258 usage
|
||||||
!addr LAT = $259 ; $259-$262, logical file numbers (table, 10 bytes)
|
!addr LAT = $259 ; $259-$262, logical file numbers (table, 10 bytes)
|
||||||
@@ -197,14 +190,12 @@
|
|||||||
!addr KEYLOG = $28F ; $28F-$290 routine to setup keyboard decoding
|
!addr KEYLOG = $28F ; $28F-$290 routine to setup keyboard decoding
|
||||||
!addr MODE = $291 ; flag, is case switch allowed
|
!addr MODE = $291 ; flag, is case switch allowed
|
||||||
!addr AUTODN = $292 ; -- NOT IMPLEMENTED -- screen scroll disable
|
!addr AUTODN = $292 ; -- NOT IMPLEMENTED -- screen scroll disable
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY {
|
|
||||||
!addr M51CRT = $293 ; -- NOT IMPLEMENTED -- mock 6551
|
!addr M51CRT = $293 ; -- NOT IMPLEMENTED -- mock 6551
|
||||||
!addr M51CDR = $294 ; -- NOT IMPLEMENTED -- mock 6551
|
!addr M51CDR = $294 ; -- NOT IMPLEMENTED -- mock 6551
|
||||||
!addr M51AJB = $295 ; $295-$296 -- NOT IMPLEMENTED -- mock 6551
|
!addr M51AJB = $295 ; $295-$296 -- NOT IMPLEMENTED -- mock 6551
|
||||||
!addr RSSTAT = $297 ; -- WIP -- (UP9600 only) mock 6551, RS-232 status
|
!addr RSSTAT = $297 ; -- WIP -- (UP9600 only) mock 6551, RS-232 status
|
||||||
!addr BITNUM = $298 ; -- NOT IMPLEMENTED --
|
!addr BITNUM = $298 ; -- NOT IMPLEMENTED --
|
||||||
!addr BAUDOF = $299 ; $299-$29A -- NOT IMPLEMENTED --
|
!addr BAUDOF = $299 ; $299-$29A -- NOT IMPLEMENTED --
|
||||||
}
|
|
||||||
!addr RIDBE = $29B ; -- WIP -- write pointer into RS-232 receive buffer
|
!addr RIDBE = $29B ; -- WIP -- write pointer into RS-232 receive buffer
|
||||||
!addr RIDBS = $29C ; -- WIP -- read pointer into RS-232 receive buffer
|
!addr RIDBS = $29C ; -- WIP -- read pointer into RS-232 receive buffer
|
||||||
!addr RODBS = $29D ; -- WIP -- read pointer into RS-232 send buffer
|
!addr RODBS = $29D ; -- WIP -- read pointer into RS-232 send buffer
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
|
|
||||||
;
|
|
||||||
; Aliases for legacy keyboard scan routine
|
|
||||||
;
|
|
||||||
|
|
||||||
!ifdef CONFIG_LEGACY_SCNKEY {
|
|
||||||
|
|
||||||
; Low memory variables
|
|
||||||
|
|
||||||
; Reuse RS232 variables, since they should not be used by other things.
|
|
||||||
; Carefully avoid $A7 which is used by 64NET
|
|
||||||
!addr KeyQuantity = $A8 ; 1 byte
|
|
||||||
!addr BufferNew = $A9 ; 3 bytes
|
|
||||||
!addr TempZP = $B6 ; 1 byte
|
|
||||||
; These should be initialized in CINT to $FF
|
|
||||||
!addr BufferQuantity = $B4 ; 1 byte
|
|
||||||
!addr BufferOld = $293 ; 3 bytes
|
|
||||||
!addr Buffer = $297 ; 4 bytes
|
|
||||||
|
|
||||||
; $250-$258 is the 81st - 88th characters in BASIC input, a carry over from VIC-20
|
|
||||||
; and not used on C64, so safe for us to use, probably.
|
|
||||||
!addr ScanResult = $250 ; 8 bytes
|
|
||||||
}
|
|
||||||
@@ -23,8 +23,6 @@ programmable_keys_codes:
|
|||||||
!ifdef CONFIG_KEYCMD_F7 { !byte KEY_F7 }
|
!ifdef CONFIG_KEYCMD_F7 { !byte KEY_F7 }
|
||||||
!ifdef CONFIG_KEYCMD_F8 { !byte KEY_F8 }
|
!ifdef CONFIG_KEYCMD_F8 { !byte KEY_F8 }
|
||||||
|
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY {
|
|
||||||
|
|
||||||
!ifdef CONFIG_KEYBOARD_C128 {
|
!ifdef CONFIG_KEYBOARD_C128 {
|
||||||
|
|
||||||
!ifdef CONFIG_KEYCMD_HELP { !byte KEY_HELP }
|
!ifdef CONFIG_KEYCMD_HELP { !byte KEY_HELP }
|
||||||
@@ -39,9 +37,7 @@ programmable_keys_codes:
|
|||||||
!ifdef CONFIG_KEYCMD_F12 { !byte KEY_F12 }
|
!ifdef CONFIG_KEYCMD_F12 { !byte KEY_F12 }
|
||||||
!ifdef CONFIG_KEYCMD_F13 { !byte KEY_F13 }
|
!ifdef CONFIG_KEYCMD_F13 { !byte KEY_F13 }
|
||||||
!ifdef CONFIG_KEYCMD_F14 { !byte KEY_F14 }
|
!ifdef CONFIG_KEYCMD_F14 { !byte KEY_F14 }
|
||||||
|
}
|
||||||
|
|
||||||
} }
|
|
||||||
|
|
||||||
|
|
||||||
__programmable_keys_codes_end:
|
__programmable_keys_codes_end:
|
||||||
@@ -69,8 +65,6 @@ __str_offset_F7: !ifdef CONFIG_KEYCMD_F7 { +CONFIG_KEYCMD_F7
|
|||||||
__str_offset_F8: !ifdef CONFIG_KEYCMD_F8 { +CONFIG_KEYCMD_F8
|
__str_offset_F8: !ifdef CONFIG_KEYCMD_F8 { +CONFIG_KEYCMD_F8
|
||||||
!byte $00 }
|
!byte $00 }
|
||||||
|
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY {
|
|
||||||
|
|
||||||
!ifdef CONFIG_KEYBOARD_C128 {
|
!ifdef CONFIG_KEYBOARD_C128 {
|
||||||
|
|
||||||
__str_offset_HELP: !ifdef CONFIG_KEYCMD_HELP { +CONFIG_KEYCMD_HELP
|
__str_offset_HELP: !ifdef CONFIG_KEYCMD_HELP { +CONFIG_KEYCMD_HELP
|
||||||
@@ -94,7 +88,7 @@ __str_offset_F13: !ifdef CONFIG_KEYCMD_F13 { +CONFIG_KEYCMD_F13
|
|||||||
__str_offset_F14: !ifdef CONFIG_KEYCMD_F14 { +CONFIG_KEYCMD_F14
|
__str_offset_F14: !ifdef CONFIG_KEYCMD_F14 { +CONFIG_KEYCMD_F14
|
||||||
!byte $00 }
|
!byte $00 }
|
||||||
|
|
||||||
} }
|
}
|
||||||
|
|
||||||
|
|
||||||
__programmable_keys_strings_end:
|
__programmable_keys_strings_end:
|
||||||
@@ -117,8 +111,6 @@ programmable_keys_offsets:
|
|||||||
!ifdef CONFIG_KEYCMD_F7 { !byte __str_offset_F7 - programmable_keys_strings }
|
!ifdef CONFIG_KEYCMD_F7 { !byte __str_offset_F7 - programmable_keys_strings }
|
||||||
!ifdef CONFIG_KEYCMD_F8 { !byte __str_offset_F8 - programmable_keys_strings }
|
!ifdef CONFIG_KEYCMD_F8 { !byte __str_offset_F8 - programmable_keys_strings }
|
||||||
|
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY {
|
|
||||||
|
|
||||||
!ifdef CONFIG_KEYBOARD_C128 {
|
!ifdef CONFIG_KEYBOARD_C128 {
|
||||||
|
|
||||||
!ifdef CONFIG_KEYCMD_HELP { !byte __str_offset_HELP - programmable_keys_strings }
|
!ifdef CONFIG_KEYCMD_HELP { !byte __str_offset_HELP - programmable_keys_strings }
|
||||||
@@ -135,5 +127,3 @@ programmable_keys_offsets:
|
|||||||
!ifdef CONFIG_KEYCMD_F14 { !byte __str_offset_F14 - programmable_keys_strings }
|
!ifdef CONFIG_KEYCMD_F14 { !byte __str_offset_F14 - programmable_keys_strings }
|
||||||
|
|
||||||
} }
|
} }
|
||||||
|
|
||||||
}
|
|
||||||
@@ -34,30 +34,6 @@ cint_screen_keyboard:
|
|||||||
sta RPTFLG
|
sta RPTFLG
|
||||||
} }
|
} }
|
||||||
|
|
||||||
; Set keyboard decode vector (Computes Mapping the 64 p215)
|
|
||||||
|
|
||||||
!ifdef CONFIG_LEGACY_SCNKEY {
|
|
||||||
|
|
||||||
; Set initial variables for our improved keyboard scan routine
|
|
||||||
lda #$FF
|
|
||||||
ldx #6
|
|
||||||
@1:
|
|
||||||
sta BufferOld,x
|
|
||||||
dex
|
|
||||||
bpl @1
|
|
||||||
sta BufferQuantity
|
|
||||||
|
|
||||||
; Set key repeat delay (Computes Mapping the 64 p215)
|
|
||||||
; Making some numbers up here: Repeat every ~1/10th sec
|
|
||||||
; But require key to be held for ~1/3sec before
|
|
||||||
; repeating (Computes Mapping the 64 p58)
|
|
||||||
|
|
||||||
; Not needed for default keyboard scanning code
|
|
||||||
|
|
||||||
ldx #22-2 ; Fudge factor to match speed
|
|
||||||
stx DELAY
|
|
||||||
}
|
|
||||||
|
|
||||||
; Set current colour for text (Computes Mapping the 64 p215)
|
; Set current colour for text (Computes Mapping the 64 p215)
|
||||||
ldx #CONFIG_COLOR_TXT
|
ldx #CONFIG_COLOR_TXT
|
||||||
stx COLOR
|
stx COLOR
|
||||||
|
|||||||
@@ -13,13 +13,6 @@
|
|||||||
scnkey_set_keytab:
|
scnkey_set_keytab:
|
||||||
|
|
||||||
|
|
||||||
!ifdef CONFIG_LEGACY_SCNKEY { ; routine not compatible with legacy SCNKEY
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
|
|
||||||
; Set initial KEYTAB value
|
; Set initial KEYTAB value
|
||||||
lda #<kb_matrix
|
lda #<kb_matrix
|
||||||
sta KEYTAB+0
|
sta KEYTAB+0
|
||||||
@@ -59,8 +52,6 @@ scnkey_valid_offset_cont:
|
|||||||
|
|
||||||
; FALLTROUGH
|
; FALLTROUGH
|
||||||
|
|
||||||
} ; no CONFIG_LEGACY_SCNKEY
|
|
||||||
|
|
||||||
scnkey_toggle_if_needed: ; entry for SCNKEY (TWW/CTR version)
|
scnkey_toggle_if_needed: ; entry for SCNKEY (TWW/CTR version)
|
||||||
|
|
||||||
; Check if we should toggle the character set
|
; Check if we should toggle the character set
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
!ifdef CONFIG_KEYBOARD_C128 { !ifndef CONFIG_LEGACY_SCNKEY {
|
!ifdef CONFIG_KEYBOARD_C128 {
|
||||||
|
|
||||||
|
|
||||||
kb_matrix_128:
|
kb_matrix_128:
|
||||||
@@ -28,6 +28,4 @@ kb_matrix_128_bucky_filter:
|
|||||||
!byte %00000000
|
!byte %00000000
|
||||||
!byte %00000000
|
!byte %00000000
|
||||||
!byte %10000001 ; ALT, NO_SCRL
|
!byte %10000001 ; ALT, NO_SCRL
|
||||||
|
}
|
||||||
|
|
||||||
} } ; CONFIG_KEYBOARD_C128 and no CONFIG_LEGACY_SCNKEY
|
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY { !ifndef CONFIG_KEY_REPEAT_ALWAYS {
|
!ifndef CONFIG_KEY_REPEAT_ALWAYS {
|
||||||
|
|
||||||
|
|
||||||
kb_matrix_alwaysrepeat:
|
kb_matrix_alwaysrepeat:
|
||||||
@@ -24,4 +24,4 @@ kb_matrix_alwaysrepeat:
|
|||||||
__kb_matrix_alwaysrepeat_end:
|
__kb_matrix_alwaysrepeat_end:
|
||||||
|
|
||||||
|
|
||||||
} } ; no CONFIG_LEGACY_SCNKEY and no CONFIG_KEY_REPEAT_ALWAYS
|
}
|
||||||
@@ -12,8 +12,6 @@
|
|||||||
; - https://github.com/MEGA65/c65-specifications/blob/master/c65manualupdated.txt
|
; - https://github.com/MEGA65/c65-specifications/blob/master/c65manualupdated.txt
|
||||||
;
|
;
|
||||||
|
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY {
|
|
||||||
|
|
||||||
|
|
||||||
kb_matrix_bucky_confmask: ; values to be written to CIA1_PRA
|
kb_matrix_bucky_confmask: ; values to be written to CIA1_PRA
|
||||||
|
|
||||||
@@ -65,7 +63,3 @@ kb_matrix_bucky_shflag: ; mask to be ORed to SHFLAG to mark key status
|
|||||||
!byte KEY_FLAG_ALT
|
!byte KEY_FLAG_ALT
|
||||||
!byte KEY_FLAG_NO_SCRL
|
!byte KEY_FLAG_NO_SCRL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} ; no CONFIG_LEGACY_SCNKEY
|
|
||||||
@@ -11,9 +11,6 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY {
|
|
||||||
|
|
||||||
|
|
||||||
kb_matrix_bucky_filter:
|
kb_matrix_bucky_filter:
|
||||||
|
|
||||||
; values for OR with CIA1_PRB content to filter out bucky keys
|
; values for OR with CIA1_PRB content to filter out bucky keys
|
||||||
@@ -26,4 +23,3 @@ kb_matrix_bucky_filter:
|
|||||||
!byte %00000000
|
!byte %00000000
|
||||||
!byte %00010000 ; SHIFT (right)
|
!byte %00010000 ; SHIFT (right)
|
||||||
!byte %00100100 ; VENDOR + CONTROL
|
!byte %00100100 ; VENDOR + CONTROL
|
||||||
}
|
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY { !ifdef CONFIG_JOY1_OR_JOY2_CURSOR {
|
!ifdef CONFIG_JOY1_OR_JOY2_CURSOR {
|
||||||
|
|
||||||
|
|
||||||
kb_matrix_joy_status:
|
kb_matrix_joy_status:
|
||||||
@@ -39,4 +39,4 @@ kb_matrix_joy_keytab_hi:
|
|||||||
!byte >__kb_matrix_shift ; left
|
!byte >__kb_matrix_shift ; left
|
||||||
!byte >__kb_matrix_normal ; right
|
!byte >__kb_matrix_normal ; right
|
||||||
|
|
||||||
} }
|
}
|
||||||
@@ -12,8 +12,6 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY {
|
|
||||||
|
|
||||||
kb_matrix_lookup:
|
kb_matrix_lookup:
|
||||||
|
|
||||||
!ifndef SEGMENT_KERNAL_C {
|
!ifndef SEGMENT_KERNAL_C {
|
||||||
@@ -51,5 +49,3 @@ kb_matrix_lookup:
|
|||||||
!word $0000 ; %1.110 VENDOR+CTRL
|
!word $0000 ; %1.110 VENDOR+CTRL
|
||||||
!word $0000 ; %1.111 SHIFT+VENDOR+CTRL
|
!word $0000 ; %1.111 SHIFT+VENDOR+CTRL
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
;; #LAYOUT# STD * #TAKE
|
|
||||||
;; #LAYOUT# X16 * #IGNORE
|
|
||||||
;; #LAYOUT# * KERNAL_0 #TAKE
|
|
||||||
;; #LAYOUT# * * #IGNORE
|
|
||||||
|
|
||||||
;
|
|
||||||
; Work out if normal, shifted, control or Vendor modified keyboard.
|
|
||||||
; Table contains the offsets into keyboard_matrixes that should be used
|
|
||||||
; for different values of the bottom 3 bits of key_bucky_state XXX
|
|
||||||
; Interaction is simple to work out when playing with a C64:
|
|
||||||
; CTRL trumps SHIFT or VENDOR
|
|
||||||
; VENDOR + SHIFT = DOES NOTHING
|
|
||||||
; All 3 does CONTROL
|
|
||||||
;
|
|
||||||
|
|
||||||
; This lookup table is used by TWW/CTR keyboard routine only!
|
|
||||||
|
|
||||||
|
|
||||||
!ifdef CONFIG_LEGACY_SCNKEY {
|
|
||||||
|
|
||||||
kb_matrix_lookup:
|
|
||||||
|
|
||||||
!byte $00 ; Normal
|
|
||||||
!byte $40 ; Shifted
|
|
||||||
!byte $80 ; Control
|
|
||||||
!byte $80 ; Control + SHIFT
|
|
||||||
!byte $C0 ; Vendor
|
|
||||||
!byte $C0 ; Vendor + SHIFT
|
|
||||||
!byte $80 ; Vendor + CTRL
|
|
||||||
!byte $80 ; Vendor + CTRL + SHIFT
|
|
||||||
}
|
|
||||||
@@ -11,9 +11,6 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY {
|
|
||||||
|
|
||||||
|
|
||||||
kb_matrix_row_keys:
|
kb_matrix_row_keys:
|
||||||
|
|
||||||
; - values for CIA1_PRA to connect only the given row
|
; - values for CIA1_PRA to connect only the given row
|
||||||
@@ -28,5 +25,3 @@ kb_matrix_row_keys:
|
|||||||
!byte %11011111
|
!byte %11011111
|
||||||
!byte %10111111
|
!byte %10111111
|
||||||
!byte %01111111
|
!byte %01111111
|
||||||
|
|
||||||
} ; no CONFIG_LEGACY_SCNKEY
|
|
||||||
@@ -8,9 +8,6 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY {
|
|
||||||
|
|
||||||
|
|
||||||
kb_matrix_row_offsets:
|
kb_matrix_row_offsets:
|
||||||
|
|
||||||
; - offsets (in bytes) to the first bytes of keyboard matrix rows
|
; - offsets (in bytes) to the first bytes of keyboard matrix rows
|
||||||
@@ -23,4 +20,3 @@ kb_matrix_row_offsets:
|
|||||||
!byte 5*8
|
!byte 5*8
|
||||||
!byte 6*8
|
!byte 6*8
|
||||||
!byte 7*8
|
!byte 7*8
|
||||||
}
|
|
||||||
@@ -9,9 +9,6 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY {
|
|
||||||
|
|
||||||
|
|
||||||
keyboard_disconnect:
|
keyboard_disconnect:
|
||||||
|
|
||||||
ldx #$FF
|
ldx #$FF
|
||||||
@@ -21,4 +18,3 @@ keyboard_disconnect:
|
|||||||
}
|
}
|
||||||
|
|
||||||
rts
|
rts
|
||||||
}
|
|
||||||
@@ -25,9 +25,6 @@
|
|||||||
; - RPTFLG - whether key repeat is allowed
|
; - RPTFLG - whether key repeat is allowed
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
!ifndef CONFIG_LEGACY_SCNKEY {
|
|
||||||
|
|
||||||
; Routine takes some ideas from TWW/CTR proposal, see here:
|
; Routine takes some ideas from TWW/CTR proposal, see here:
|
||||||
; - http://codebase64.org/doku.php?id=base:scanning_the_keyboard_the_correct_and_non_kernal_way
|
; - http://codebase64.org/doku.php?id=base:scanning_the_keyboard_the_correct_and_non_kernal_way
|
||||||
|
|
||||||
@@ -434,5 +431,3 @@ scnkey_buffer_full:
|
|||||||
sta KOUNT
|
sta KOUNT
|
||||||
|
|
||||||
rts
|
rts
|
||||||
|
|
||||||
} ; no CONFIG_LEGACY_SCNKEY
|
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
!ifdef CONFIG_KEYBOARD_C128 { !ifndef CONFIG_LEGACY_SCNKEY {
|
!ifdef CONFIG_KEYBOARD_C128 {
|
||||||
|
|
||||||
|
|
||||||
; Inlining this within SCNKEY would both overcomplicate the implementation
|
; Inlining this within SCNKEY would both overcomplicate the implementation
|
||||||
@@ -66,6 +66,4 @@ scnkey_128_no_keys:
|
|||||||
pla
|
pla
|
||||||
|
|
||||||
jmp scnkey_no_keys ; pass controll to original routine
|
jmp scnkey_no_keys ; pass controll to original routine
|
||||||
|
}
|
||||||
|
|
||||||
} } ; CONFIG_KEYBOARD_C128 and no CONFIG_LEGACY_SCNKEY
|
|
||||||
@@ -1,519 +0,0 @@
|
|||||||
;; #LAYOUT# STD * #TAKE
|
|
||||||
;; #LAYOUT# X16 * #IGNORE
|
|
||||||
;; #LAYOUT# * KERNAL_0 #TAKE
|
|
||||||
;; #LAYOUT# * * #IGNORE
|
|
||||||
|
|
||||||
;
|
|
||||||
; Official Kernal routine, described in:
|
|
||||||
;
|
|
||||||
; - [RG64] C64 Programmers Reference Guide - page 295
|
|
||||||
; - [CM64] Computes Mapping the Commodore 64 - page 220
|
|
||||||
;
|
|
||||||
; CPU registers that has to be preserved (see [RG64]): none
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
; NOTE: The code here is described as legacy, because the algorithm (although working very well)
|
|
||||||
; requires much more RAM than the original Kernal routine uses; without any form of extended
|
|
||||||
; RAM available to Open ROMs it will always be a serious compatibility risk.
|
|
||||||
|
|
||||||
|
|
||||||
!ifdef CONFIG_LEGACY_SCNKEY {
|
|
||||||
|
|
||||||
|
|
||||||
; Scan the keyboard..
|
|
||||||
; Here we don't use the horrible buggy original routine,
|
|
||||||
; not just because of copyright. Instead, we use the
|
|
||||||
; nice one with joystick interference removal and
|
|
||||||
; key roll-over support from
|
|
||||||
; http://codebase64.org/doku.php?id=base:scanning_the_keyboard_the_correct_and_non_kernal_way
|
|
||||||
|
|
||||||
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
; Keyboard IO Routine
|
|
||||||
; ~~~~~~~~~~~~~~~~~~~
|
|
||||||
; By: TWW/CTR
|
|
||||||
|
|
||||||
|
|
||||||
; Information
|
|
||||||
; ~~~~~~~~~~~
|
|
||||||
; The routine uses "2 Key rollower" or up to 3 if the key-combination doesen't induce shadowing.
|
|
||||||
; If 2 or 3 keys are pressed simultaneously (within 1 scan) a "No Activity" state has to occur before new valid keys are returned.
|
|
||||||
; RESTORE is not detectable and must be handled by NMI IRQ.
|
|
||||||
; SHIFT LOCK is not detected due to unreliability.
|
|
||||||
|
|
||||||
|
|
||||||
; History:
|
|
||||||
; ~~~~~~~~
|
|
||||||
; V3.0 - Hacked to pieces by PGS to work as KERNAL keyboard scan routine
|
|
||||||
; V2.5 - New test tool.
|
|
||||||
; Added return of error codes.
|
|
||||||
; Fixed a bug causing Buffer Overflow.
|
|
||||||
; Fixed a bug in Non Alphanumerical Flags from 2.0.
|
|
||||||
; V2.1 - Shortened the source by adding .for loops & Updated the header and some comments.
|
|
||||||
; Added "simultaneous keypress" check.
|
|
||||||
; V2.0 - Added return of non-Alphanumeric keys into X & Y-Registers.
|
|
||||||
; Small optimizations here and there.
|
|
||||||
; V1.1 - Unrolled code to make it faster and optimized other parts of it.
|
|
||||||
; Removed SHIFT LOCK scanning.
|
|
||||||
; V1.0 - First Working Version along with test tool.
|
|
||||||
|
|
||||||
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; Operational Variables
|
|
||||||
!set MaxKeyRollover = 3
|
|
||||||
|
|
||||||
SCNKEY:
|
|
||||||
|
|
||||||
lda #$00
|
|
||||||
sta BufferQuantity
|
|
||||||
|
|
||||||
; Decrement key repeat timeout if non-zero
|
|
||||||
ldx KOUNT
|
|
||||||
beq sk_start
|
|
||||||
dec KOUNT
|
|
||||||
|
|
||||||
sk_start:
|
|
||||||
; Call main keyboard scanning routine
|
|
||||||
jsr Main
|
|
||||||
|
|
||||||
lda BufferQuantity
|
|
||||||
beq no_keys_waiting
|
|
||||||
|
|
||||||
; Stuff each key pressed into the keyboard buffer
|
|
||||||
|
|
||||||
ldy #$00
|
|
||||||
@1:
|
|
||||||
lda Buffer,y
|
|
||||||
jsr accept_key
|
|
||||||
iny
|
|
||||||
cpy BufferQuantity
|
|
||||||
bne @1
|
|
||||||
no_keys_waiting:
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
accept_key:
|
|
||||||
; Work out what is new and needs to be added
|
|
||||||
; to the input buffer.
|
|
||||||
; Also update the bucky key status flags etc
|
|
||||||
cmp #$ff
|
|
||||||
beq sk_nokey
|
|
||||||
; Got a key, turn it from matrix position to key value,
|
|
||||||
; and stuff it in the keyboard buffer
|
|
||||||
|
|
||||||
; Convert matrix position to key code
|
|
||||||
; XXX - Add offset of $40, $80 or $C0 if shift, CONTROL or C= are held down
|
|
||||||
pha
|
|
||||||
lda SHFLAG
|
|
||||||
and #$7
|
|
||||||
tax
|
|
||||||
pla
|
|
||||||
and #$3f
|
|
||||||
ora kb_matrix_lookup,x
|
|
||||||
tax
|
|
||||||
lda kb_matrix,x
|
|
||||||
; But don't insert $00 characters
|
|
||||||
beq sk_nokey
|
|
||||||
|
|
||||||
; Stash key into keyboard buffer
|
|
||||||
ldx NDX
|
|
||||||
cpx XMAX
|
|
||||||
beq sk_nokey
|
|
||||||
sta KEYD,x
|
|
||||||
inc NDX
|
|
||||||
|
|
||||||
sk_nokey:
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
; ; Routine for Scanning a Matrix Row
|
|
||||||
|
|
||||||
KeyInRow:
|
|
||||||
ldy #7
|
|
||||||
NextKeyInRow:
|
|
||||||
ror
|
|
||||||
bcs nokey
|
|
||||||
jsr KeyFound
|
|
||||||
nokey:
|
|
||||||
inx
|
|
||||||
dey
|
|
||||||
bpl NextKeyInRow
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
; ; Routine for handling: Key Found
|
|
||||||
|
|
||||||
KeyFound:
|
|
||||||
stx TempZP
|
|
||||||
dec KeyQuantity
|
|
||||||
bmi OverFlow
|
|
||||||
|
|
||||||
; Originally, we resolved the keys.
|
|
||||||
; Now we just return the matrix position, so that
|
|
||||||
; we can do C64-style bucky modifications as normal
|
|
||||||
; was: ldy KeyTable,x
|
|
||||||
pha
|
|
||||||
txa
|
|
||||||
|
|
||||||
ldx KeyQuantity
|
|
||||||
sta BufferNew,x
|
|
||||||
pla
|
|
||||||
ldx TempZP
|
|
||||||
rts
|
|
||||||
|
|
||||||
; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
; ; Routine for handling: Overflow
|
|
||||||
|
|
||||||
OverFlow:
|
|
||||||
pla ; Dirty hack to handle 2 layers of JSR
|
|
||||||
pla
|
|
||||||
pla
|
|
||||||
pla
|
|
||||||
; Don't manipulate last legal buffer as the routine will fix itself once it gets valid input again.
|
|
||||||
|
|
||||||
ReturnNoKeys:
|
|
||||||
sec
|
|
||||||
lda #$00
|
|
||||||
sta BufferQuantity
|
|
||||||
lda #$FF
|
|
||||||
sta LSTX
|
|
||||||
ldx #MaxKeyRollover-1
|
|
||||||
@2:
|
|
||||||
sta Buffer,x
|
|
||||||
sta BufferOld,x
|
|
||||||
dex
|
|
||||||
bpl @2
|
|
||||||
|
|
||||||
rts
|
|
||||||
|
|
||||||
|
|
||||||
; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
; ; Exit Routine for: No Activity
|
|
||||||
|
|
||||||
NoActivityDetected:
|
|
||||||
|
|
||||||
; So cancel all bucky keys
|
|
||||||
lda SHFLAG
|
|
||||||
sta LSTSHF
|
|
||||||
lda #$00
|
|
||||||
sta SHFLAG
|
|
||||||
|
|
||||||
jmp ReturnNoKeys
|
|
||||||
|
|
||||||
; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
; ; Configure Data Direction Registers
|
|
||||||
Main:
|
|
||||||
; Begin with no key events
|
|
||||||
lda #$ff
|
|
||||||
sta BufferNew+0
|
|
||||||
sta BufferNew+1
|
|
||||||
sta BufferNew+2
|
|
||||||
|
|
||||||
; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
; ; Check for Port Activity
|
|
||||||
|
|
||||||
ldx #$FF
|
|
||||||
ldy #$00
|
|
||||||
|
|
||||||
sty CIA1_PRA ; Connect all Keyboard Rows
|
|
||||||
cpx CIA1_PRB
|
|
||||||
bne skip0
|
|
||||||
|
|
||||||
jmp NoActivityDetected
|
|
||||||
|
|
||||||
JoystickActivity:
|
|
||||||
|
|
||||||
; Clear bucky key status
|
|
||||||
lda #$00
|
|
||||||
sta SHFLAG
|
|
||||||
|
|
||||||
lda CIA1_PRB
|
|
||||||
and #$03
|
|
||||||
cmp #$01
|
|
||||||
bne @3
|
|
||||||
; down
|
|
||||||
ldx #$07 ; UP/DOWN
|
|
||||||
jsr KeyFound
|
|
||||||
@3:
|
|
||||||
cmp #$02
|
|
||||||
bne @4
|
|
||||||
; Up
|
|
||||||
; Mark shift as pressed
|
|
||||||
ldx #$01
|
|
||||||
stx SHFLAG
|
|
||||||
ldx #$07 ; UP/DOWN
|
|
||||||
jsr KeyFound
|
|
||||||
@4:
|
|
||||||
; Only allow up/down OR left/right, since
|
|
||||||
; else we have confusing situation with SHIFT required
|
|
||||||
; for one, but not the other.
|
|
||||||
; XXX - We could fix this by making the joystick activity
|
|
||||||
; feed the key input at a higher level, rather than
|
|
||||||
; simulating directly pressing the cursor keys.
|
|
||||||
cmp #$03
|
|
||||||
beq @5
|
|
||||||
jmp skdone
|
|
||||||
@5:
|
|
||||||
lda CIA1_PRB
|
|
||||||
and #$0c
|
|
||||||
cmp #$04
|
|
||||||
bne @6
|
|
||||||
ldx #$02
|
|
||||||
jsr KeyFound ; LEFT/RIGHT
|
|
||||||
@6:
|
|
||||||
cmp #$08
|
|
||||||
bne @7
|
|
||||||
ldx #$01
|
|
||||||
stx SHFLAG
|
|
||||||
ldx #$02
|
|
||||||
jsr KeyFound ; LEFT/RIGHT
|
|
||||||
@7:
|
|
||||||
jmp skdone
|
|
||||||
|
|
||||||
|
|
||||||
skip0:
|
|
||||||
|
|
||||||
; ; Set max keys allowed before ignoring result
|
|
||||||
lda #MaxKeyRollover
|
|
||||||
sta KeyQuantity
|
|
||||||
|
|
||||||
; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
; ; Check for Control Port #1 Activity
|
|
||||||
|
|
||||||
stx CIA1_PRA ; Disconnect all Keyboard Rows
|
|
||||||
cpx CIA1_PRB ; Only Control Port activity will be detected
|
|
||||||
bne JoystickActivity
|
|
||||||
|
|
||||||
; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
; ; Scan Keyboard Matrix
|
|
||||||
|
|
||||||
ldx #7
|
|
||||||
lda #%11111110
|
|
||||||
next_row:
|
|
||||||
sta CIA1_PRA
|
|
||||||
pha
|
|
||||||
lda CIA1_PRB
|
|
||||||
sta ScanResult,x
|
|
||||||
pla
|
|
||||||
sec
|
|
||||||
rol
|
|
||||||
dex
|
|
||||||
bpl next_row
|
|
||||||
|
|
||||||
; X gets back to $FF here, which is assumed below
|
|
||||||
|
|
||||||
; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
; ; Check for Control Port #1 Activity (again)
|
|
||||||
|
|
||||||
stx CIA1_PRA ; Disconnect all Keyboard Rows
|
|
||||||
cpx CIA1_PRB ; Only Control Port activity will be detected
|
|
||||||
beq @8
|
|
||||||
jmp ReturnNoKeys
|
|
||||||
@8:
|
|
||||||
; Make X = $00, assumed below
|
|
||||||
inx
|
|
||||||
|
|
||||||
; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
; ; Check and flag Non Alphanumeric Keys
|
|
||||||
|
|
||||||
; Store de-bounce data for bucky keys
|
|
||||||
; (Compute's Mapping the 64, p58-59)
|
|
||||||
lda SHFLAG
|
|
||||||
sta LSTSHF
|
|
||||||
|
|
||||||
; Build bucky state
|
|
||||||
lda #$00
|
|
||||||
sta SHFLAG
|
|
||||||
lda ScanResult+6
|
|
||||||
eor #%10000000
|
|
||||||
and #%10000000 ; Left shift
|
|
||||||
rol
|
|
||||||
rol
|
|
||||||
and #$01
|
|
||||||
ora SHFLAG
|
|
||||||
sta SHFLAG
|
|
||||||
|
|
||||||
; Right shift
|
|
||||||
lda ScanResult+1
|
|
||||||
eor #$10
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
and #$01
|
|
||||||
ora SHFLAG
|
|
||||||
sta SHFLAG
|
|
||||||
|
|
||||||
; Control
|
|
||||||
lda ScanResult+0
|
|
||||||
eor #$04
|
|
||||||
and #$04
|
|
||||||
ora SHFLAG
|
|
||||||
sta SHFLAG
|
|
||||||
|
|
||||||
; Vendor key
|
|
||||||
lda ScanResult+0
|
|
||||||
eor #$ff
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
lsr
|
|
||||||
and #$02
|
|
||||||
ora SHFLAG
|
|
||||||
sta SHFLAG
|
|
||||||
|
|
||||||
; Handle SHIFT + VENDOR
|
|
||||||
jsr scnkey_toggle_if_needed
|
|
||||||
|
|
||||||
no_case_toggle:
|
|
||||||
|
|
||||||
; ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
; ; Check for pressed key(s)
|
|
||||||
|
|
||||||
lda ScanResult+7
|
|
||||||
cmp #$ff
|
|
||||||
beq sk6
|
|
||||||
jsr KeyInRow
|
|
||||||
sk6:
|
|
||||||
ldx #8
|
|
||||||
lda ScanResult+6
|
|
||||||
beq sk5
|
|
||||||
jsr KeyInRow
|
|
||||||
sk5:
|
|
||||||
ldx #16
|
|
||||||
lda ScanResult+5
|
|
||||||
beq sk4
|
|
||||||
jsr KeyInRow
|
|
||||||
sk4:
|
|
||||||
ldx #24
|
|
||||||
lda ScanResult+4
|
|
||||||
beq sk3
|
|
||||||
jsr KeyInRow
|
|
||||||
sk3:
|
|
||||||
ldx #32
|
|
||||||
lda ScanResult+3
|
|
||||||
beq sk2
|
|
||||||
jsr KeyInRow
|
|
||||||
sk2:
|
|
||||||
ldx #40
|
|
||||||
lda ScanResult+2
|
|
||||||
beq sk1
|
|
||||||
jsr KeyInRow
|
|
||||||
sk1:
|
|
||||||
ldx #48
|
|
||||||
lda ScanResult+1
|
|
||||||
beq sk0
|
|
||||||
jsr KeyInRow
|
|
||||||
sk0:
|
|
||||||
ldx #56
|
|
||||||
lda ScanResult+0
|
|
||||||
beq skdone
|
|
||||||
jsr KeyInRow
|
|
||||||
skdone:
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
; Key Scan Completed
|
|
||||||
|
|
||||||
; Put any new key (not in old scan) into buffer
|
|
||||||
ldx #MaxKeyRollover-1
|
|
||||||
|
|
||||||
ProcessPressedKeys:
|
|
||||||
|
|
||||||
; Check if the currently pressed key is continuing to be held down
|
|
||||||
lda BufferNew,x
|
|
||||||
cmp #$ff
|
|
||||||
beq ConsiderNextKey
|
|
||||||
cmp BufferOld
|
|
||||||
beq KeyHeld
|
|
||||||
cmp BufferOld+1
|
|
||||||
beq KeyHeld
|
|
||||||
cmp BufferOld+2
|
|
||||||
beq KeyHeld
|
|
||||||
|
|
||||||
RecordKeypress:
|
|
||||||
|
|
||||||
; New Key Detected
|
|
||||||
ldy BufferQuantity
|
|
||||||
cpy #MaxKeyRollover
|
|
||||||
bcc @9
|
|
||||||
jmp ReturnNoKeys ; too many new keys
|
|
||||||
@9:
|
|
||||||
AcceptKeyEvent:
|
|
||||||
sta Buffer,y
|
|
||||||
iny
|
|
||||||
sty BufferQuantity
|
|
||||||
|
|
||||||
ConsiderNextKey:
|
|
||||||
dex
|
|
||||||
bpl ProcessPressedKeys
|
|
||||||
|
|
||||||
; Copy new presses to old list
|
|
||||||
ldx #MaxKeyRollover-1
|
|
||||||
@10:
|
|
||||||
lda BufferNew,x
|
|
||||||
sta BufferOld,x
|
|
||||||
dex
|
|
||||||
bpl @10
|
|
||||||
|
|
||||||
; Return success and set of pressed keys
|
|
||||||
clc
|
|
||||||
rts
|
|
||||||
|
|
||||||
KeyHeld:
|
|
||||||
; The key in A is still held down.
|
|
||||||
; compare with key in LSTX
|
|
||||||
; (Compute's Mapping the 64 p36-37)
|
|
||||||
; if different, reset repeat count down.
|
|
||||||
|
|
||||||
; Ignore bucky keys, so that repeat can work when a
|
|
||||||
; bucky is held down.
|
|
||||||
cmp #15
|
|
||||||
beq BuckyHeld
|
|
||||||
cmp #52
|
|
||||||
beq BuckyHeld
|
|
||||||
cmp #58
|
|
||||||
beq BuckyHeld
|
|
||||||
cmp #61
|
|
||||||
beq BuckyHeld
|
|
||||||
|
|
||||||
cmp LSTX
|
|
||||||
beq SameKeyHeld
|
|
||||||
|
|
||||||
; Different key held
|
|
||||||
sta LSTX
|
|
||||||
pha
|
|
||||||
lda DELAY
|
|
||||||
sta KOUNT
|
|
||||||
pla
|
|
||||||
BuckyHeld:
|
|
||||||
jmp ConsiderNextKey
|
|
||||||
|
|
||||||
SameKeyHeld:
|
|
||||||
pha
|
|
||||||
lda KOUNT
|
|
||||||
bmi KeyCanRepeat
|
|
||||||
bne KeyRepeatWait
|
|
||||||
; Count down ended, so repeat key now
|
|
||||||
KeyCanRepeat:
|
|
||||||
|
|
||||||
; (Compute's Mapping the 64 p58)
|
|
||||||
pha
|
|
||||||
lda #6-2 ; Fudge factor to match speed
|
|
||||||
sta KOUNT
|
|
||||||
pla
|
|
||||||
pla
|
|
||||||
|
|
||||||
jmp RecordKeypress
|
|
||||||
KeyRepeatWait:
|
|
||||||
pla
|
|
||||||
jmp ConsiderNextKey
|
|
||||||
|
|
||||||
|
|
||||||
} ; CONFIG_LEGACY_SCNKEY
|
|
||||||
@@ -2,6 +2,10 @@
|
|||||||
;; #LAYOUT# * * #IGNORE
|
;; #LAYOUT# * * #IGNORE
|
||||||
|
|
||||||
|
|
||||||
|
; Routine takes many ideas from TWW/CTR proposal, see here:
|
||||||
|
; - http://codebase64.org/doku.php?id=base:scanning_the_keyboard_the_correct_and_non_kernal_way
|
||||||
|
|
||||||
|
|
||||||
m65_scnkey:
|
m65_scnkey:
|
||||||
|
|
||||||
; Initialize work variables for scanning the keyboard
|
; Initialize work variables for scanning the keyboard
|
||||||
|
|||||||
Reference in new issue
Block a user