diff --git a/src/kernal/keyboard/udtim_keyboard.s b/src/kernal/keyboard/udtim_keyboard.s deleted file mode 100644 index d1c8c74e..00000000 --- a/src/kernal/keyboard/udtim_keyboard.s +++ /dev/null @@ -1,54 +0,0 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE - -// -// 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 diff --git a/src/kernal/time/settim.s b/src/kernal/time/settim.s index c42b8627..7c07eb5c 100644 --- a/src/kernal/time/settim.s +++ b/src/kernal/time/settim.s @@ -21,7 +21,7 @@ SETTIM: sty TIME + 0 stx TIME + 1 sta TIME + 2 -.break + // Enable interrupts. More elegant solution would be pha + sei + ... + pla, // but (checked by running a test program) original ROM routine always // leaves IRQs enabled. diff --git a/src/kernal/time/udtim.s b/src/kernal/time/udtim.s index 1e52cae2..94b3fff4 100644 --- a/src/kernal/time/udtim.s +++ b/src/kernal/time/udtim.s @@ -29,10 +29,10 @@ udtim_rollover_check: lda TIME+0 cmp #$4F - bcc udtim_time_done + bcc udtim_keyboard lda TIME+1 cmp #$1A - bcc udtim_time_done + bcc udtim_keyboard // FALLTROUGH @@ -45,6 +45,51 @@ udtim_clock_reset: // FALLTROUGH -udtim_time_done: +// +// Keyboard part of the UDTIM routine, has to preserve .Y +// - jmp udtim_keyboard +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