Files
open-roms/c64/kernal/keyboard/udtim_keyboard.s
T

51 lines
1.6 KiB
ArmAsm

//
// Keyboard part of the UDTIM routine, has to preserve .Y
//
udtim_keyboard:
// According to [CM64], page 27, the action we have to perform is to copy
// the last row of keyboard to RAM, so that various routines can detect the STOP
// key press. But something as simple as this would have created warm restart
// with M+N+SPACE+RESTORE due to ghosting - so the original ROM has to provide
// some protection here. I do not know what the mechanism there exactly does,
// but I hope the mechanism below will be compatible enough.
lda #$80
sta CIA1_PRA // select all the rows except the last one
#if CONFIG_KEYBOARD_C128
ldx #$00
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
lda CIA1_PRB // read the keys
eor #$FF
sta STKEY // store reversed state - to filter out anything vulnerable to ghosting
#if CONFIG_KEYBOARD_C128
dex // puts $FF
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
lda #$7F
sta CIA1_PRA // select the last row (bit to 0)
lda CIA1_PRB // read the row
ora STKEY // filter out what might be the reason of ghosting
sta STKEY
// Leave the CIA configured this way. It would be far better to disconnect
// the keyboard at this point, but certain software (mainly intros) is
// unable to, for example, read the space bar status.
rts