C128 keyboard fixes, initial C65 keyboard support
This commit is contained in:
1 parent
28d0fa5ecf
commit
15c71dcdeb
17 files changed
+252
-53
No files matched your search
@@ -125,7 +125,7 @@ Needs 30-250 more space in KERNAL segment (depending on the features enabled for
|
|||||||
|
|
||||||
### `CONFIG_KEYBOARD_C128`
|
### `CONFIG_KEYBOARD_C128`
|
||||||
|
|
||||||
Allows to use additional keys found on the C128 keyboard. NOTE: might be buggy, on VICE emulator I can't get all the keys working.
|
Allows to use additional keys found on the C128 keyboard.
|
||||||
|
|
||||||
Needs about 130 bytes more space in KERNAL segment. If unsure - disable.
|
Needs about 130 bytes more space in KERNAL segment. If unsure - disable.
|
||||||
|
|
||||||
@@ -135,6 +135,10 @@ Allows to use CAPS LOCK key on the C128 keyboard, this is independent from `CONF
|
|||||||
|
|
||||||
Needs about 50 bytes more space in KERNAL segment. If unsure - disable.
|
Needs about 50 bytes more space in KERNAL segment. If unsure - disable.
|
||||||
|
|
||||||
|
### `CONFIG_KEYBOARD_C65`, `CONFIG_KEYBOARD_C65_CAPS_LOCK`
|
||||||
|
|
||||||
|
Similar, but for C65 keyboard. Please note - the C65 keyboard support is (as of yet) completely untested!
|
||||||
|
|
||||||
### `CONFIG_KEY_REPEAT_DEFAULT`
|
### `CONFIG_KEY_REPEAT_DEFAULT`
|
||||||
|
|
||||||
Enables key repetition by default during the startup (sets `RPTFLG`).
|
Enables key repetition by default during the startup (sets `RPTFLG`).
|
||||||
|
|||||||
@@ -3,7 +3,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)):
|
Here are the features of the Open ROMs not found in the original ROMs from the 80s (many of them are [configurable](CONFIG.md)):
|
||||||
|
|
||||||
* improved keyboard scanning, supports anti-ghosting and is resistant to joystick interference (one variant even supports multi-keyy rollover)
|
* improved keyboard scanning, resistant to ghosting and joystick interference (one variant even supports multi-keyy rollover), supports additional C128 keys
|
||||||
* joystick can be used to move text cursor
|
* joystick can be used to move text cursor
|
||||||
* uses RAM under ROM and I/O: 61438 bytes free
|
* uses RAM under ROM and I/O: 61438 bytes free
|
||||||
* cold/warm start silences multiple SID chips - all $D4xx and $D5xx addresses
|
* cold/warm start silences multiple SID chips - all $D4xx and $D5xx addresses
|
||||||
|
|||||||
@@ -52,8 +52,10 @@
|
|||||||
// Keyboard settings
|
// Keyboard settings
|
||||||
|
|
||||||
// #define CONFIG_LEGACY_SCNKEY
|
// #define CONFIG_LEGACY_SCNKEY
|
||||||
#define CONFIG_KEYBOARD_C128 // incomplete
|
#define CONFIG_KEYBOARD_C128
|
||||||
#define CONFIG_KEYBOARD_C128_CAPS_LOCK
|
#define CONFIG_KEYBOARD_C128_CAPS_LOCK
|
||||||
|
// #define CONFIG_KEYBOARD_C65 // untested
|
||||||
|
// #define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested
|
||||||
// #define CONFIG_KEY_REPEAT_DEFAULT
|
// #define CONFIG_KEY_REPEAT_DEFAULT
|
||||||
// #define CONFIG_KEY_REPEAT_ALWAYS
|
// #define CONFIG_KEY_REPEAT_ALWAYS
|
||||||
#define CONFIG_KEY_FAST_SCAN
|
#define CONFIG_KEY_FAST_SCAN
|
||||||
|
|||||||
@@ -42,10 +42,10 @@
|
|||||||
// Multiple SID support
|
// Multiple SID support
|
||||||
|
|
||||||
#define CONFIG_SID_2ND
|
#define CONFIG_SID_2ND
|
||||||
.const CONFIG_SID_2ND_ADDRESS = $D420
|
.const CONFIG_SID_2ND_ADDRESS = $D440
|
||||||
|
|
||||||
// #define CONFIG_SID_3RD
|
// #define CONFIG_SID_3RD
|
||||||
.const CONFIG_SID_3RD_ADDRESS = $D440
|
.const CONFIG_SID_3RD_ADDRESS = $D420
|
||||||
|
|
||||||
// #define CONFIG_SID_D4XX
|
// #define CONFIG_SID_D4XX
|
||||||
// #define CONFIG_SID_D5XX
|
// #define CONFIG_SID_D5XX
|
||||||
@@ -54,8 +54,10 @@
|
|||||||
// Keyboard settings
|
// Keyboard settings
|
||||||
|
|
||||||
// #define CONFIG_LEGACY_SCNKEY
|
// #define CONFIG_LEGACY_SCNKEY
|
||||||
// #define CONFIG_KEYBOARD_C128 // incomplete
|
// #define CONFIG_KEYBOARD_C128
|
||||||
// #define CONFIG_KEYBOARD_C128_CAPS_LOCK
|
// #define CONFIG_KEYBOARD_C128_CAPS_LOCK
|
||||||
|
#define CONFIG_KEYBOARD_C65 // untested
|
||||||
|
#define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested
|
||||||
// #define CONFIG_KEY_REPEAT_DEFAULT
|
// #define CONFIG_KEY_REPEAT_DEFAULT
|
||||||
// #define CONFIG_KEY_REPEAT_ALWAYS
|
// #define CONFIG_KEY_REPEAT_ALWAYS
|
||||||
#define CONFIG_KEY_FAST_SCAN
|
#define CONFIG_KEY_FAST_SCAN
|
||||||
|
|||||||
@@ -53,8 +53,10 @@
|
|||||||
// Keyboard settings
|
// Keyboard settings
|
||||||
|
|
||||||
#define CONFIG_LEGACY_SCNKEY
|
#define CONFIG_LEGACY_SCNKEY
|
||||||
// #define CONFIG_KEYBOARD_C128 // incomplete
|
// #define CONFIG_KEYBOARD_C128
|
||||||
// #define CONFIG_KEYBOARD_C128_CAPS_LOCK
|
// #define CONFIG_KEYBOARD_C128_CAPS_LOCK
|
||||||
|
// #define CONFIG_KEYBOARD_C65 // untested
|
||||||
|
// #define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested
|
||||||
// #define CONFIG_KEY_REPEAT_DEFAULT
|
// #define CONFIG_KEY_REPEAT_DEFAULT
|
||||||
// #define CONFIG_KEY_REPEAT_ALWAYS
|
// #define CONFIG_KEY_REPEAT_ALWAYS
|
||||||
#define CONFIG_KEY_FAST_SCAN
|
#define CONFIG_KEY_FAST_SCAN
|
||||||
|
|||||||
@@ -52,8 +52,10 @@
|
|||||||
// Keyboard settings
|
// Keyboard settings
|
||||||
|
|
||||||
// #define CONFIG_LEGACY_SCNKEY
|
// #define CONFIG_LEGACY_SCNKEY
|
||||||
// #define CONFIG_KEYBOARD_C128 // incomplete
|
// #define CONFIG_KEYBOARD_C128
|
||||||
// #define CONFIG_KEYBOARD_C128_CAPS_LOCK
|
// #define CONFIG_KEYBOARD_C128_CAPS_LOCK
|
||||||
|
// #define CONFIG_KEYBOARD_C65 // untested
|
||||||
|
// #define CONFIG_KEYBOARD_C65_CAPS_LOCK // untested
|
||||||
// #define CONFIG_KEY_REPEAT_DEFAULT
|
// #define CONFIG_KEY_REPEAT_DEFAULT
|
||||||
// #define CONFIG_KEY_REPEAT_ALWAYS
|
// #define CONFIG_KEY_REPEAT_ALWAYS
|
||||||
#define CONFIG_KEY_FAST_SCAN
|
#define CONFIG_KEY_FAST_SCAN
|
||||||
|
|||||||
@@ -145,13 +145,16 @@
|
|||||||
// Check if keyboard options are correct
|
// Check if keyboard options are correct
|
||||||
|
|
||||||
{
|
{
|
||||||
#if CONFIG_LEGACY_SCNKEY && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C128_CAPS_LOCK)
|
#if CONFIG_LEGACY_SCNKEY && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C128_CAPS_LOCK || CONFIG_KEYBOARD_C65 || CONFIG_KEYBOARD_C65_CAPS_LOCK)
|
||||||
.error "CONFIG_LEGACY_SCNKEY and CONFIG_KEYBOARD_C128* are mutually exclusive"
|
.error "CONFIG_LEGACY_SCNKEY and CONFIG_KEYBOARD_C128* / CONFIG_KEYBOARD_C65* are mutually exclusive"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (CONFIG_MB_MEGA_65 || CONFIG_MB_ULTIMATE_64) && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C128_CAPS_LOCK)
|
#if (CONFIG_MB_MEGA_65 || CONFIG_MB_ULTIMATE_64) && (CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C128_CAPS_LOCK)
|
||||||
.error "Selected CONFIG_MB_* is not compatible with CONFIG_KEYBOARD_C128*"
|
.error "Selected CONFIG_MB_* is not compatible with CONFIG_KEYBOARD_C128*"
|
||||||
#endif
|
#endif
|
||||||
|
#if CONFIG_MB_ULTIMATE_64 && (CONFIG_KEYBOARD_C65 || CONFIG_KEYBOARD_C65_CAPS_LOCK)
|
||||||
|
.error "Selected CONFIG_MB_* is not compatible with CONFIG_KEYBOARD_C65*"
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,17 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Trick to skip a 2-byte instruction
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
.pseudocommand skip_2_bytes_trash_nvz
|
||||||
|
{
|
||||||
|
.byte $2C
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Stack manipulation - some CPUs will leave .A unchanged, some will use it as temporary storage, so consider .A trashed
|
// Stack manipulation - some CPUs will leave .A unchanged, some will use it as temporary storage, so consider .A trashed
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -16,10 +16,14 @@
|
|||||||
.const KEY_FLAG_SHIFT = %00000001
|
.const KEY_FLAG_SHIFT = %00000001
|
||||||
.const KEY_FLAG_VENDOR = %00000010
|
.const KEY_FLAG_VENDOR = %00000010
|
||||||
.const KEY_FLAG_CTRL = %00000100
|
.const KEY_FLAG_CTRL = %00000100
|
||||||
.const KEY_FLAG_ALT = %00001000 // C65 / C128
|
|
||||||
.const KEY_CAPS_LOCK = %00010000 // C65 / C128
|
|
||||||
.const KEY_FLAG_NO_SCRL = %00100000 // C65 / C128, Open ROMs unofficial
|
|
||||||
|
|
||||||
|
#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65
|
||||||
|
.const KEY_FLAG_ALT = %00001000
|
||||||
|
#if CONFIG_KEYBOARD_C128_CAPS_LOCK || CONFIG_KEYBOARD_C65_CAPS_LOCK
|
||||||
|
.const KEY_CAPS_LOCK = %00010000
|
||||||
|
#endif
|
||||||
|
.const KEY_FLAG_NO_SCRL = %00100000 // Open ROMs unofficial
|
||||||
|
#endif
|
||||||
|
|
||||||
// Note - the following PETSCII codes are currently unassigned, can be used for further extensions:
|
// Note - the following PETSCII codes are currently unassigned, can be used for further extensions:
|
||||||
//
|
//
|
||||||
@@ -38,8 +42,10 @@
|
|||||||
|
|
||||||
// PETSCII codes for certain C128 and C65 functionalities XXX implement these
|
// PETSCII codes for certain C128 and C65 functionalities XXX implement these
|
||||||
|
|
||||||
.const KEY_BELL = $07 // C65 / C128, no key
|
#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65
|
||||||
.const KEY_ESC = $1B // C65 / C128
|
.const KEY_BELL = $07 // no key, originally CTRL+G
|
||||||
|
.const KEY_ESC = $1B
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// PETSCII codes for programmable keys
|
// PETSCII codes for programmable keys
|
||||||
@@ -56,14 +62,18 @@
|
|||||||
.const KEY_F7 = $8B
|
.const KEY_F7 = $8B
|
||||||
.const KEY_F8 = $8C
|
.const KEY_F8 = $8C
|
||||||
|
|
||||||
.const KEY_F9 = $10 // C65
|
#if CONFIG_KEYBOARD_C65
|
||||||
.const KEY_F10 = $15 // C65
|
.const KEY_F9 = $10
|
||||||
.const KEY_F11 = $16 // C65
|
.const KEY_F10 = $15
|
||||||
.const KEY_F12 = $17 // C65
|
.const KEY_F11 = $16
|
||||||
.const KEY_F13 = $19 // C65
|
.const KEY_F12 = $17
|
||||||
.const KEY_F14 = $1A // C65
|
.const KEY_F13 = $19
|
||||||
|
.const KEY_F14 = $1A
|
||||||
|
#endif
|
||||||
|
|
||||||
.const KEY_HELP = $84 // C65, also used for our C128 support
|
#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65
|
||||||
|
.const KEY_HELP = $84 // normally C65 only, also used for our C128 support
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// PETSCII codes for cursor keys
|
// PETSCII codes for cursor keys
|
||||||
@@ -151,4 +161,5 @@
|
|||||||
.const KEY_GT = $3E
|
.const KEY_GT = $3E
|
||||||
.const KEY_QUESTION = $3F
|
.const KEY_QUESTION = $3F
|
||||||
|
|
||||||
|
|
||||||
// XXX finish this: $4x, $5x, $6x, $7x, $Ax, $Bx, $Cx, $Dx, $Ex, $Fx
|
// XXX finish this: $4x, $5x, $6x, $7x, $Ax, $Bx, $Cx, $Dx, $Ex, $Fx
|
||||||
@@ -96,6 +96,13 @@ IOINIT:
|
|||||||
// Value checked on original ROM
|
// Value checked on original ROM
|
||||||
stx CIA2_DDRA
|
stx CIA2_DDRA
|
||||||
|
|
||||||
|
#if CONFIG_KEYBOARD_C65 || CONFIG_KEYBOARD_C65_CAPS_LOCK
|
||||||
|
|
||||||
|
lda #$02
|
||||||
|
sta C65_EXTKEYS_DDR // output for most keys, input for CAPS LOCK bit
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
// Set DDR on CIA2 for IEC bus, VIC-II banking
|
// Set DDR on CIA2 for IEC bus, VIC-II banking
|
||||||
lda #$3F
|
lda #$3F
|
||||||
sta CIA2_DDRA
|
sta CIA2_DDRA
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ UDTIM:
|
|||||||
// after this time we have to reset the clock.
|
// after this time we have to reset the clock.
|
||||||
|
|
||||||
inc TIME+0
|
inc TIME+0
|
||||||
bne udtim_update_stkey // done with clock
|
bne udtim_update_stkey // done with clock
|
||||||
inc TIME+1
|
inc TIME+1
|
||||||
bne udtim_clock_rollover
|
bne udtim_clock_rollover
|
||||||
inc TIME+2
|
inc TIME+2
|
||||||
@@ -31,25 +31,33 @@ udtim_update_stkey: // entry to be used when interrupts are disabled
|
|||||||
// but I hope the mechanism below will be compatible enough.
|
// but I hope the mechanism below will be compatible enough.
|
||||||
|
|
||||||
lda #$80
|
lda #$80
|
||||||
sta CIA1_PRA // select all the rows except the last one
|
sta CIA1_PRA // select all the rows except the last one
|
||||||
#if CONFIG_KEYBOARD_C128
|
#if CONFIG_KEYBOARD_C128
|
||||||
ldx #$00
|
ldx #$00
|
||||||
stx VIC_XSCAN // connect all the extra C128 keys
|
stx VIC_XSCAN // connect all the extra C128 keys
|
||||||
|
#endif
|
||||||
|
#if CONFIG_KEYBOARD_C65
|
||||||
|
ldx #$00
|
||||||
|
stx C65_EXTKEYS_PR // connect all the extra C65 keys
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
lda CIA1_PRB // read the keys
|
lda CIA1_PRB // read the keys
|
||||||
eor #$FF
|
eor #$FF
|
||||||
sta STKEY // store reversed state - to filter out anything vulnerable to ghosting
|
sta STKEY // store reversed state - to filter out anything vulnerable to ghosting
|
||||||
|
|
||||||
#if CONFIG_KEYBOARD_C128
|
#if CONFIG_KEYBOARD_C128
|
||||||
dex // puts $FF
|
dex // puts $FF
|
||||||
stx VIC_XSCAN // disconnect the extra C128 keys
|
stx VIC_XSCAN // disconnect the extra C128 keys
|
||||||
|
#endif
|
||||||
|
#if CONFIG_KEYBOARD_C65
|
||||||
|
dex // puts $FF
|
||||||
|
stx C65_EXTKEYS_PR // disconnect the extra C65 keys
|
||||||
#endif
|
#endif
|
||||||
lda #$7F
|
lda #$7F
|
||||||
sta CIA1_PRA // select the last row (bit to 0)
|
sta CIA1_PRA // select the last row (bit to 0)
|
||||||
|
|
||||||
lda CIA1_PRB // read the row
|
lda CIA1_PRB // read the row
|
||||||
ora STKEY // filter out what might be the reason of ghosting
|
ora STKEY // filter out what might be the reason of ghosting
|
||||||
sta STKEY
|
sta STKEY
|
||||||
|
|
||||||
// Leave the CIA configured this way. It would be far better to disconnect
|
// Leave the CIA configured this way. It would be far better to disconnect
|
||||||
@@ -63,11 +71,11 @@ udtim_clock_rollover:
|
|||||||
// At this point TIME+0 contains 0
|
// At this point TIME+0 contains 0
|
||||||
lda TIME+1
|
lda TIME+1
|
||||||
cmp #$1A
|
cmp #$1A
|
||||||
bne udtim_update_stkey // done with clock
|
bne udtim_update_stkey // done with clock
|
||||||
lda TIME+2
|
lda TIME+2
|
||||||
cmp #$4F
|
cmp #$4F
|
||||||
bne udtim_update_stkey // done with clock
|
bne udtim_update_stkey // done with clock
|
||||||
lda #$00
|
lda #$00
|
||||||
sta TIME+2
|
sta TIME+2
|
||||||
sta TIME+1
|
sta TIME+1
|
||||||
beq udtim_update_stkey // done with clock - will always jump
|
beq udtim_update_stkey // done with clock - will always jump
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
kb_matrix_128:
|
kb_matrix_128:
|
||||||
|
|
||||||
.byte KEY_HELP,$38,$38,KEY_TAB_FW,$32,$34,$37,$31
|
.byte KEY_HELP,$38,$35,KEY_TAB_FW,$32,$34,$37,$31
|
||||||
.byte KEY_ESC,$2B,$2D,$8D,$0D,$36,$39,$33
|
.byte KEY_ESC,$2B,$2D,$8D,$0D,$36,$39,$33
|
||||||
.byte $00,$30,$2E,$91,$11,$9D,$1D,$00
|
.byte $00,$30,$2E,$91,$11,$9D,$1D,$00
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
|
||||||
|
//
|
||||||
|
// Extended keyboard matrix for Commodore 65 keyboards, based on
|
||||||
|
//
|
||||||
|
// - https://github.com/MEGA65/c65-specifications/blob/master/c65manualupdated.txt
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#if CONFIG_KEYBOARD_C65 && !CONFIG_LEGACY_SCNKEY
|
||||||
|
|
||||||
|
|
||||||
|
kb_matrix_65:
|
||||||
|
|
||||||
|
.byte $00, KEY_TAB_FW, $00, KEY_HELP, KEY_F9, KEY_F11, KEY_F13, KEY_ESC
|
||||||
|
|
||||||
|
kb_matrix_65_shifted:
|
||||||
|
|
||||||
|
.byte $00, KEY_TAB_BW, $00, KEY_HELP, KEY_F10, KEY_F12, KEY_F14, KEY_ESC
|
||||||
|
|
||||||
|
|
||||||
|
#endif // CONFIG_KEYBOARD_C65 and no CONFIG_LEGACY_SCNKEY
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
// Values based on:
|
// Values based on:
|
||||||
// - [CM64] Compute's Mapping the Commodore 64 - pages 58 (SHFLAG), 173 (matrix)
|
// - [CM64] Compute's Mapping the Commodore 64 - pages 58 (SHFLAG), 173 (matrix)
|
||||||
// - [CM128] Compute's Mapping the Commodore 128 - pages 212 (SHFLAG), 290 (matrix)
|
// - [CM128] Compute's Mapping the Commodore 128 - pages 212 (SHFLAG), 290 (matrix)
|
||||||
|
// - https://github.com/MEGA65/c65-specifications/blob/master/c65manualupdated.txt
|
||||||
//
|
//
|
||||||
|
|
||||||
#if !CONFIG_LEGACY_SCNKEY
|
#if !CONFIG_LEGACY_SCNKEY
|
||||||
@@ -16,12 +17,11 @@ kb_matrix_bucky_confmask: // values to be written to CIA1_PRA
|
|||||||
.byte %10111111 // SHIFT (right)
|
.byte %10111111 // SHIFT (right)
|
||||||
.byte %01111111 // VENDOR
|
.byte %01111111 // VENDOR
|
||||||
.byte %01111111 // CTRL
|
.byte %01111111 // CTRL
|
||||||
#if CONFIG_KEYBOARD_C128
|
#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65
|
||||||
.byte %11111111 // C128 extra keys
|
.byte %11111111 // C128 / C65 extra keys
|
||||||
.byte %11111111
|
.byte %11111111
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
__kb_matrix_bucky_confmask_end:
|
__kb_matrix_bucky_confmask_end:
|
||||||
|
|
||||||
|
|
||||||
@@ -39,6 +39,20 @@ kb_matrix_bucky_confmask_c128: // values to be written to VIC_XSCAN
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_KEYBOARD_C65
|
||||||
|
|
||||||
|
kb_matrix_bucky_confmask_c65: // values to be written to C65_EXTKEYS_PR
|
||||||
|
|
||||||
|
.byte %11111111
|
||||||
|
.byte %11111111
|
||||||
|
.byte %11111111
|
||||||
|
.byte %11111111
|
||||||
|
|
||||||
|
.byte %11111101 // ALT
|
||||||
|
.byte %11111101 // NO_SCRL
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
kb_matrix_bucky_testmask: // for AND with CIA1_PRB value
|
kb_matrix_bucky_testmask: // for AND with CIA1_PRB value
|
||||||
|
|
||||||
@@ -50,6 +64,10 @@ kb_matrix_bucky_testmask: // for AND with CIA1_PRB value
|
|||||||
.byte %10000000 // ALT
|
.byte %10000000 // ALT
|
||||||
.byte %00000001 // NO_SCRL
|
.byte %00000001 // NO_SCRL
|
||||||
#endif
|
#endif
|
||||||
|
#if CONFIG_KEYBOARD_C65
|
||||||
|
.byte %00000100 // ALT
|
||||||
|
.byte %00000001 // NO_SCRL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
kb_matrix_bucky_shflag: // mask to be ORed to SHFLAG to mark key status
|
kb_matrix_bucky_shflag: // mask to be ORed to SHFLAG to mark key status
|
||||||
@@ -58,7 +76,7 @@ kb_matrix_bucky_shflag: // mask to be ORed to SHFLAG to mark key status
|
|||||||
.byte KEY_FLAG_SHIFT
|
.byte KEY_FLAG_SHIFT
|
||||||
.byte KEY_FLAG_VENDOR
|
.byte KEY_FLAG_VENDOR
|
||||||
.byte KEY_FLAG_CTRL
|
.byte KEY_FLAG_CTRL
|
||||||
#if CONFIG_KEYBOARD_C128
|
#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65
|
||||||
.byte KEY_FLAG_ALT
|
.byte KEY_FLAG_ALT
|
||||||
.byte KEY_FLAG_NO_SCRL
|
.byte KEY_FLAG_NO_SCRL
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -76,6 +76,23 @@ SCNKEY:
|
|||||||
stx VIC_XSCAN // disconnect C128 keys if no C128 keyboard is supported
|
stx VIC_XSCAN // disconnect C128 keys if no C128 keyboard is supported
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_KEYBOARD_C65_CAPS_LOCK
|
||||||
|
|
||||||
|
lda C65_EXTKEYS_PR
|
||||||
|
and #$01
|
||||||
|
bne !+ // branch if no CAPS LOCK
|
||||||
|
|
||||||
|
lda #KEY_CAPS_LOCK
|
||||||
|
sta SHFLAG
|
||||||
|
!:
|
||||||
|
|
||||||
|
#if !CONFIG_KEYBOARD_C65
|
||||||
|
ldx #$FF
|
||||||
|
stx C65_EXTKEYS_PR // disconnect C128 keys if no C128 keyboard is supported
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ldy #(__kb_matrix_bucky_confmask_end - kb_matrix_bucky_confmask - 1)
|
ldy #(__kb_matrix_bucky_confmask_end - kb_matrix_bucky_confmask - 1)
|
||||||
@@ -85,6 +102,10 @@ scnkey_bucky_loop:
|
|||||||
#if CONFIG_KEYBOARD_C128
|
#if CONFIG_KEYBOARD_C128
|
||||||
lda kb_matrix_bucky_confmask_c128, y
|
lda kb_matrix_bucky_confmask_c128, y
|
||||||
sta VIC_XSCAN
|
sta VIC_XSCAN
|
||||||
|
#endif
|
||||||
|
#if CONFIG_KEYBOARD_C65
|
||||||
|
lda kb_matrix_bucky_confmask_c65, y
|
||||||
|
sta C65_EXTKEYS_PR
|
||||||
#endif
|
#endif
|
||||||
lda kb_matrix_bucky_testmask, y
|
lda kb_matrix_bucky_testmask, y
|
||||||
and CIA1_PRB
|
and CIA1_PRB
|
||||||
@@ -123,6 +144,9 @@ scnkey_bucky_loop:
|
|||||||
stx CIA1_PRA // connect all the rows
|
stx CIA1_PRA // connect all the rows
|
||||||
#if CONFIG_KEYBOARD_C128
|
#if CONFIG_KEYBOARD_C128
|
||||||
stx VIC_XSCAN
|
stx VIC_XSCAN
|
||||||
|
#endif
|
||||||
|
#if CONFIG_KEYBOARD_C65
|
||||||
|
stx C65_EXTKEYS_PR
|
||||||
#endif
|
#endif
|
||||||
dex // puts $FF
|
dex // puts $FF
|
||||||
cpx CIA1_PRB
|
cpx CIA1_PRB
|
||||||
@@ -153,6 +177,9 @@ scnkey_bucky_loop:
|
|||||||
ldy #$FF // offset in key matrix table, $FF for not found yet
|
ldy #$FF // offset in key matrix table, $FF for not found yet
|
||||||
#if CONFIG_KEYBOARD_C128
|
#if CONFIG_KEYBOARD_C128
|
||||||
jsr scnkey_128
|
jsr scnkey_128
|
||||||
|
#endif
|
||||||
|
#if CONFIG_KEYBOARD_C65
|
||||||
|
jsr scnkey_65
|
||||||
#endif
|
#endif
|
||||||
ldx #$07
|
ldx #$07
|
||||||
scnkey_matrix_loop:
|
scnkey_matrix_loop:
|
||||||
@@ -280,17 +307,37 @@ scnkey_output_key:
|
|||||||
|
|
||||||
// Retrieve the PETSCII code
|
// Retrieve the PETSCII code
|
||||||
|
|
||||||
#if CONFIG_KEYBOARD_C128
|
#if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65
|
||||||
|
|
||||||
cpy #$40
|
cpy #$40
|
||||||
bcc !+
|
bcc !+
|
||||||
|
|
||||||
|
#if CONFIG_KEYBOARD_C128
|
||||||
lda kb_matrix_128 - $41, y // retrieve key code from C128 extended matrix
|
lda kb_matrix_128 - $41, y // retrieve key code from C128 extended matrix
|
||||||
|
#elif CONFIG_KEYBOARD_C65
|
||||||
|
|
||||||
|
// Select key matrix (normal or shifted) for extended C65 keys
|
||||||
|
|
||||||
|
lda SHFLAG
|
||||||
|
and #%00000111 // KEY_FLAG_SHIFT + KEY_FLAG_VENDOR + KEY_FLAG_CTRL
|
||||||
|
beq scnkey_output_65_no_shift
|
||||||
|
cmp #KEY_FLAG_SHIFT
|
||||||
|
// XXX how to behave on VENDOR/CTRL key? Harmonize this with claasic keys behavior
|
||||||
|
bne scnkey_no_keys // no scanning for this bucky key combination
|
||||||
|
|
||||||
|
lda kb_matrix_65_shifted - $41, y
|
||||||
|
jmp scnkey_got_petscii
|
||||||
|
|
||||||
|
scnkey_output_65_no_shift:
|
||||||
|
|
||||||
|
lda kb_matrix_65 - $41, y
|
||||||
|
|
||||||
|
#endif
|
||||||
jmp scnkey_got_petscii
|
jmp scnkey_got_petscii
|
||||||
!:
|
!:
|
||||||
lda (KEYTAB), y // retrieve key code from standard matrix
|
lda (KEYTAB), y // retrieve key code from standard matrix
|
||||||
|
|
||||||
// XXX this will be needed for extended screen editor
|
// XXX this will be needed for extended screen editor and C128 keyboard
|
||||||
|
|
||||||
// cmp KEY_TAB_FW // special handling for SHIFT+TAB
|
// cmp KEY_TAB_FW // special handling for SHIFT+TAB
|
||||||
// bne scnkey_got_petscii // XXX or to scnkey_handle_caps_lock
|
// bne scnkey_got_petscii // XXX or to scnkey_handle_caps_lock
|
||||||
@@ -302,16 +349,16 @@ scnkey_output_key:
|
|||||||
// !:
|
// !:
|
||||||
// lda KEY_TAB_BW // bne scnkey_got_petscii if CAPS LOCK is handled
|
// lda KEY_TAB_BW // bne scnkey_got_petscii if CAPS LOCK is handled
|
||||||
|
|
||||||
#endif // CONFIG_KEYBOARD_C128_CAPS_LOCK
|
#endif // CONFIG_KEYBOARD_C128 or CONFIG_KEYBOARD_C65
|
||||||
|
|
||||||
#if CONFIG_KEYBOARD_C128_CAPS_LOCK
|
#if CONFIG_KEYBOARD_C128_CAPS_LOCK || CONFIG_KEYBOARD_C65_CAPS_LOCK
|
||||||
|
|
||||||
// Check if we need special handling for a CAPS LOCK key
|
// Check if we need special handling for a CAPS LOCK key
|
||||||
// This is shorter than a separate set of tables
|
// This is shorter than a separate set of tables
|
||||||
|
|
||||||
scnkey_handle_caps_lock:
|
scnkey_handle_caps_lock:
|
||||||
|
|
||||||
#if !CONFIG_KEYBOARD_C128
|
#if !CONFIG_KEYBOARD_C128 && !CONFIG_KEYBOARD_C65
|
||||||
lda (KEYTAB), y
|
lda (KEYTAB), y
|
||||||
#endif
|
#endif
|
||||||
tax
|
tax
|
||||||
@@ -332,9 +379,9 @@ scnkey_handle_caps_lock:
|
|||||||
!:
|
!:
|
||||||
txa
|
txa
|
||||||
|
|
||||||
#endif // CONFIG_KEYBOARD_C128_CAPS_LOCK
|
#endif // CONFIG_KEYBOARD_C128_CAPS_LOCK or CONFIG_KEYBOARD_C65_CAPS_LOCK
|
||||||
|
|
||||||
#if !CONFIG_KEYBOARD_C128 && !CONFIG_KEYBOARD_C128_CAPS_LOCK
|
#if !CONFIG_KEYBOARD_C128 && !CONFIG_KEYBOARD_C128_CAPS_LOCK && !CONFIG_KEYBOARD_C65 && !CONFIG_KEYBOARD_C65_CAPS_LOCK
|
||||||
|
|
||||||
lda (KEYTAB), y
|
lda (KEYTAB), y
|
||||||
|
|
||||||
|
|||||||
@@ -48,15 +48,11 @@ scnkey_matrix_128_loop_next:
|
|||||||
dex
|
dex
|
||||||
bpl scnkey_matrix_128_loop
|
bpl scnkey_matrix_128_loop
|
||||||
|
|
||||||
// Scanning the C128 keyboard part complete - check if we got a key
|
// Scanning the C128 keyboard part complete
|
||||||
|
|
||||||
cpy #$FF
|
|
||||||
beq scnkey_128_done
|
|
||||||
|
|
||||||
// Continue with C64 keyboard scanning
|
|
||||||
|
|
||||||
scnkey_128_done:
|
scnkey_128_done:
|
||||||
|
|
||||||
|
stx VIC_XSCAN // $FF, disconnects C128 keys
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
|
||||||
|
//
|
||||||
|
// Keyboard scanning routine extension for C65 keyboards
|
||||||
|
//
|
||||||
|
// - [CM128] Compute's Mapping the Commodore 128 - pages 212 (SHFLAG)
|
||||||
|
// - https://github.com/MEGA65/c65-specifications/blob/master/c65manualupdated.txt (matrix)
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#if CONFIG_KEYBOARD_C65 && !CONFIG_LEGACY_SCNKEY
|
||||||
|
|
||||||
|
|
||||||
|
// Inlining this within SCNKEY would both overcomplicate the implementation
|
||||||
|
// and disrupt a lot of branches (they would cross the 127 bytes distance limit)
|
||||||
|
|
||||||
|
// .Y is now $FF - try to put there a key code from extended keyboard
|
||||||
|
|
||||||
|
scnkey_65:
|
||||||
|
|
||||||
|
sty CIA1_PRA // disconnect classic keys
|
||||||
|
|
||||||
|
lda #$00
|
||||||
|
sta C65_EXTKEYS_PR // connect C65 keys
|
||||||
|
|
||||||
|
lda #%00000101 // filter out bucky keys: ALT, NO_SCRL
|
||||||
|
ora CIA1_PRB
|
||||||
|
|
||||||
|
cmp #$FF
|
||||||
|
beq scnkey_65_done // skip if no key pressed from this row
|
||||||
|
|
||||||
|
// At least one key is pressed - decode it
|
||||||
|
ldy #$07
|
||||||
|
scnkey_matrix_65_loop:
|
||||||
|
cmp kb_matrix_row_keys, y
|
||||||
|
bne !+ // not this particular key
|
||||||
|
tya // now .A contains key offset within a row
|
||||||
|
clc
|
||||||
|
adc kb_matrix_row_offsets, x // now .A contains key offset from the matrix start
|
||||||
|
adc #$41 // now .A contains offset after the standard matrix
|
||||||
|
tay
|
||||||
|
jmp scnkey_65_done
|
||||||
|
!:
|
||||||
|
dey
|
||||||
|
bpl scnkey_matrix_65_loop
|
||||||
|
|
||||||
|
// FALLTROUGH, multiple keys must have been pressed
|
||||||
|
|
||||||
|
scnkey_65_no_keys:
|
||||||
|
|
||||||
|
pla // get rid of return address from the stack
|
||||||
|
pla
|
||||||
|
|
||||||
|
jmp scnkey_no_keys // pass controll to original routine
|
||||||
|
|
||||||
|
|
||||||
|
scnkey_65_done:
|
||||||
|
|
||||||
|
ldx #$FF
|
||||||
|
stx C65_EXTKEYS_PR // connect C65 keys
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif // CONFIG_KEYBOARD_C65 and no CONFIG_LEGACY_SCNKEY
|
||||||
Reference in new issue
Block a user