99 lines
1.5 KiB
ArmAsm
99 lines
1.5 KiB
ArmAsm
;; #LAYOUT# STD * #TAKE
|
|
;; #LAYOUT# X16 * #IGNORE
|
|
;; #LAYOUT# * KERNAL_0 #TAKE
|
|
;; #LAYOUT# * * #IGNORE
|
|
|
|
;
|
|
; Well-known Kernal routine, described in:
|
|
;
|
|
; - [CM64] Computes Mapping the Commodore 64 - pages 220, 221
|
|
;
|
|
|
|
|
|
scnkey_set_keytab:
|
|
|
|
|
|
; 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 interested in SHIFT, VENDOR and CTRL keys only
|
|
tax
|
|
|
|
; Retrieve table offset
|
|
lda kb_matrix_lookup, x
|
|
cmp #$FF
|
|
bne scnkey_valid_offset
|
|
|
|
; $FF means we should not decode anything, mark this by setting high byte
|
|
; of KEYTAB to 0 (I do not think anyone would put keyboard decoding table
|
|
; at zeropage)
|
|
lda #$00
|
|
beq scnkey_valid_offset_cont ; branch always
|
|
|
|
scnkey_valid_offset:
|
|
|
|
; Add offset to the vector
|
|
clc
|
|
adc KEYTAB+0
|
|
sta KEYTAB+0
|
|
lda #$00
|
|
adc KEYTAB+1
|
|
|
|
; FALLTROUGH
|
|
|
|
scnkey_valid_offset_cont:
|
|
|
|
sta KEYTAB+1
|
|
|
|
; FALLTROUGH
|
|
|
|
scnkey_toggle_if_needed: ; entry for SCNKEY (TWW/CTR version)
|
|
|
|
; Check if we should toggle the character set
|
|
|
|
lda MODE
|
|
bne @1 ; not allowed to toggle
|
|
lda SHFLAG
|
|
and #$03
|
|
cmp #$03
|
|
bne @1 ; no SHIFT + VENDOR pressed
|
|
lda LSTSHF
|
|
and #$03
|
|
cmp #$03
|
|
beq @1 ; already toggled
|
|
|
|
; Toggle char set
|
|
|
|
!ifdef CONFIG_MB_M65 {
|
|
|
|
jsr M65_MODEGET
|
|
bcc @2
|
|
|
|
; Toggling charsets for C64 mode
|
|
|
|
lda VIC_YMCSB
|
|
eor #$02
|
|
sta VIC_YMCSB
|
|
@1:
|
|
rts
|
|
|
|
; Toggling charsets for M65 mode
|
|
@2:
|
|
lda VIC_CHARPTR+1
|
|
eor #%00001000
|
|
sta VIC_CHARPTR+1
|
|
rts
|
|
|
|
} else {
|
|
|
|
lda VIC_YMCSB
|
|
eor #$02
|
|
sta VIC_YMCSB
|
|
@1:
|
|
rts
|
|
} |