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
|
||||
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
@@ -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
|
||||
Reference in new issue
Block a user