saved 3 bytes in Kernal
This commit is contained in:
1 parent
24115bc3ab
commit
4c648a7891
3 files changed
+50
-59
No files matched your search
@@ -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
|
|
||||||
@@ -21,7 +21,7 @@ SETTIM:
|
|||||||
sty TIME + 0
|
sty TIME + 0
|
||||||
stx TIME + 1
|
stx TIME + 1
|
||||||
sta TIME + 2
|
sta TIME + 2
|
||||||
.break
|
|
||||||
// Enable interrupts. More elegant solution would be pha + sei + ... + pla,
|
// Enable interrupts. More elegant solution would be pha + sei + ... + pla,
|
||||||
// but (checked by running a test program) original ROM routine always
|
// but (checked by running a test program) original ROM routine always
|
||||||
// leaves IRQs enabled.
|
// leaves IRQs enabled.
|
||||||
|
|||||||
+49
-4
@@ -29,10 +29,10 @@ udtim_rollover_check:
|
|||||||
|
|
||||||
lda TIME+0
|
lda TIME+0
|
||||||
cmp #$4F
|
cmp #$4F
|
||||||
bcc udtim_time_done
|
bcc udtim_keyboard
|
||||||
lda TIME+1
|
lda TIME+1
|
||||||
cmp #$1A
|
cmp #$1A
|
||||||
bcc udtim_time_done
|
bcc udtim_keyboard
|
||||||
|
|
||||||
// FALLTROUGH
|
// FALLTROUGH
|
||||||
|
|
||||||
@@ -45,6 +45,51 @@ udtim_clock_reset:
|
|||||||
|
|
||||||
// FALLTROUGH
|
// 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
|
||||||
Reference in new issue
Block a user