saved 3 bytes in Kernal

This commit is contained in:
FeralChild64 committed 2020-07-19 17:45:08 +02:00
1 parent 24115bc3ab
commit 4c648a7891
3 files changed
+50 -59

No files matched your search

-54
View File
@@ -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
+1 -1
View File
@@ -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.
+49 -4
View File
@@ -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