82 lines
1.2 KiB
ArmAsm
82 lines
1.2 KiB
ArmAsm
|
|
//
|
|
// Well-known Kernal routine, described in:
|
|
//
|
|
// - [CM64] Compute's Mapping the Commodore 64 - pages 220, 221
|
|
//
|
|
|
|
|
|
scnkey_set_keytab:
|
|
|
|
|
|
#if CONFIG_LEGACY_SCNKEY // routine not compatible with legacy SCNKEY
|
|
|
|
rts
|
|
|
|
#else
|
|
|
|
|
|
// Set initial KEYTAB value
|
|
|
|
lda #<kb_matrix
|
|
sta KEYTAB+0
|
|
lda #>kb_matrix
|
|
sta KEYTAB+1
|
|
|
|
// Calculate table index
|
|
|
|
lda SHFLAG
|
|
and #$07 // we are only interested in SHIFT / CTRL / VENDOR keys
|
|
tax
|
|
|
|
// Retrieve table offset
|
|
lda kb_matrix_lookup, x
|
|
cmp #$FF
|
|
bne scnkey_valid_offset
|
|
|
|
// $FF means we shouldn't decode anything, mark this by setting high byte
|
|
// of KEYTAB to 0 (I don't think anyone would put keyboard decoding table
|
|
// at zeropage)
|
|
lda #$00
|
|
beq !+ // branch always
|
|
|
|
scnkey_valid_offset:
|
|
|
|
// Add offset to the vector
|
|
clc
|
|
adc KEYTAB+0
|
|
sta KEYTAB+0
|
|
lda #$00
|
|
adc KEYTAB+1
|
|
!:
|
|
sta KEYTAB+1
|
|
|
|
// FALLTROUGH
|
|
|
|
|
|
#endif // no CONFIG_LEGACY_SCNKEY
|
|
|
|
|
|
scnkey_toggle_if_needed: // entry for SCNKEY (TWW/CTR version)
|
|
|
|
// Check if we should toggle the character set
|
|
|
|
lda MODE
|
|
bne !+ // not allowed to toggle
|
|
lda SHFLAG
|
|
and #$03
|
|
cmp #$03
|
|
bne !+ // no SHIFT + VENDOR pressed
|
|
lda LSTSHF
|
|
and #$03
|
|
cmp #$03
|
|
beq !+ // alreeady toggled
|
|
|
|
// Toggle char set
|
|
|
|
lda VIC_YMCSB
|
|
eor #$02
|
|
sta VIC_YMCSB
|
|
!:
|
|
rts
|