From f9e3b57a796a03cd8f53b09cb95a19f671583f6d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 17 Oct 2019 17:41:50 +0200 Subject: [PATCH] small keyboard reading fixes --- STATUS.md | 2 +- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_mega65.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_mega65.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes c64/kernal/f13e.getin.s | 21 ++------------- c64/kernal/interrupts/udtim.s | 12 ++++++--- c64/kernal/keyboard/f142.interop | 4 +++ c64/kernal/keyboard/f142.read_kb_buf.s | 30 ++++++++++++++++++++++ c64/kernal/keyboard/keyboard_disconnect.s | 7 +++++ c64/kernal/keyboard/pop_keyboard_buffer.s | 4 ++- c64/kernal/keyboard/scnkey.s | 3 +-- 14 files changed, 57 insertions(+), 26 deletions(-) create mode 100644 c64/kernal/keyboard/f142.interop create mode 100644 c64/kernal/keyboard/f142.read_kb_buf.s diff --git a/STATUS.md b/STATUS.md index 40464b97..28523aaa 100644 --- a/STATUS.md +++ b/STATUS.md @@ -134,7 +134,7 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FFDB` | | `SETTIM` | DONE | | | `$FFDE` | | `RDTIM` | DONE | | | `$FFE1` | `$F6ED` | `STOP` | DONE | | -| `$FFE4` | `$F13E` | `GETIN` | PARTIAL | only some devices supported | +| `$FFE4` | `$F13E` | `GETIN` | PARTIAL | only keyaboard supported | | `$FFE7` | `$F32F` | `CLALL` | DONE | | | `$FFEA` | | `UDTIM` | DONE | | | `$FFED` | | `SCREEN` | DONE | | diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 40b293f5d165bc4b9809cd782ebedb3a55b640f0..89242f1bdb61bb7ddb0cf07bdcbc760735d8dc70 100644 GIT binary patch delta 26 icmZp0XmHrDij7U{=h6)dTAMepr86?-ZkFJ9Ar1hGUkSPZ delta 26 icmZp0XmHrDij7VA=h6)d%9}T^r86?7ZIdTd}{tSV!V9Y_ZCMMba` zhI`Q`jCPgPQ<#I&^r6pa<_eibx5rtj^UqB8=3$5|ZB7@Se`>>^Mja9~FX>?f&WNnm>c-Xrk+e^^8j z(p((62;Opa1n-fAJfB!dTvzACK}r4G3_ygT5CZpczt9WrFHH(JfLLuYA)070O<|F|WPLXC>VQXYuvwBv{AMn%CWkT;@dy2JmFf`4_&TXm^{X zsw_-EcJ_I8HVe#1mN&b!H_Fo^|7Y{TKAI8P8l1*21-n2Lp9?lsvTJ-WKr?sC0U3W1 zd=>=ocflsmhu4Cq!7T2n?eET!6!+sT({u9~AlDm>Rjd|@N93s#zqP?Y3Ee`~r?O;v9cHIcb;gR|dR@cw!#||(t4piLnKy(5( zh)**Yj*D+O+vx<;H!JqnZP3I5JX%1N1xDDX<)Sj_L)aGI!;H~Fo=2AORc2W+S6RYvwmTSu2n&@@3i z1U(`sw1wvWL{hPxcd*g(lV S^5#>9!bu!AK-d2swf+T=AlLN( delta 1020 zcmXX_Z)jUp6wiHW@|w&nsZGgC+O*e3v5B2+=O1bvT8f>aUfi&tl_GtzFBw#@MX(C{ z^P#Vd*2?CA5yyn|kyo0rO4fpFoRv81F#Yt1V{G*eL6%B&;%j4bU!2+VrU;jNFXwm8 zx%Zs&`WC~KX}LxnNL}w*et=8J><>On3Rky#4agGVMtUy*XwXUU_Ol2V1VyMYs)kIWhCq? z&swxhU3s=c&G^a(kfu5oXE}cmjyNKLFul(VQKh86oG|glvdpiJY%~8=9>5U}@43Qau1AUhx0k!uiQ{;x>FW$@k1_( zgO!*dN-L9@sjo$Nt8NnYgI4#I5HZqynPVL8r|Bjv6f*B|IZ?IaI9z&k3jGXS^>5Vn z)3cl)VkgYhpLq65gY0g{qj-OD8nf7gEH;Pq&K#$=XWp(}5B#6ag?o&&z-)LL4td*A z1de+f_p@hQ*lDD%SAmo8nfEE=gm1l#s0TK@@1QtzHw<*-X~MF0Rd-yuhV$l+WNKGb zzVJMd-3sWO?8A8~x3NvR&PJzvM?!F=q0hNez{3=;6i9Ko(!e3G`^HcnCVU|_&x^i~ z_OT+Yq_pF}pxgx|O_0=YLW?$y<8Yja&H8E>QnV$i4i0 z;4%mATY3JrY+jha=V7Y}*E3EsW+oY-i-wS>$erX(XbSedA{i5mtY__bu)?YpnYsq|gYTmA z@OpEXd&Iym6qyP!FHkTe5}?En z0w_`fRnUd*n44({t(woWGl?-BOrmUyjpk61r6h+-!J&ANS~sNxP=jt+ZZI z4;deu(&&q2oVKDTd9_TdiZ=7QGh0<@8WMaj|2iqm=R3=15`8*2Z~&6WaVJT*Q5~I( zGU7D&pS=aw4!{oLt;N}(NQFB|aiZf*=WBGu`jjivx-4qe26TmfSlu+ehzbkbvf{7o&~=1&q2TKKEBF70480V;lJ+w0&&0<pYdPc}A{gT=$f(p(L#z{SHZIR|rO<0WxLd=G2C%lTwzLsDAOuS9jwp>)ap*eHeF zyCq^68d9gm_0Y#_M(80TRY(2ABt1YO#O z9P+t*_NqAS-iGQvY}kiCkc8$KG;R;A`6+>-Y>BUb*0%lv D7};;G delta 806 zcmYjNTSyd97@nDRNB3fT(aqV#)kENAyMPhF+KWDPS@nd$5*1NSFQE^;SdbZ^4~~SQ zsE4ALL^ns+KoAx&D@Y@iF&_@Dn8uoBx>z;3&jbX;tf*#z)i+SW~w<}7;bvr{EUYw(I6#E z^B`XimcSfz)mBUQqXpX`wq707K?RxZPTGv}?S<*)1nk)k?6gx69-KrM?dO?#6%E<* z^aIplQ35U5hv-anFQc3pSJ3;6*3@xD9D{^k&pbyOuQT06^=gL>c5MMg`Gf0mf=0D} zB*qA1;D7ZJoZSNJh;tN}dyIFjNnUu;G}8PORXFaOJlZY0YFLIjp)U?EO@~olmY2>! zm$Uk{m00eA23NSfB!fEcG^hB=$&rjTMPO#9+GEk!Je=7KM8Kew3B2X?=_D)W-H zgO&IgFSbMj!G<;}GC)U!PUznhdnFhCDh8xV{E-A05PD-vsLJW24d|A$ zfF#!I^gEIP8_8zB)iQ-;P^^M$GAP+b23MJ>`)A+W$O2{6fo^okRp!KT@y%lok982K zEz!|7s}t04-sMzz92Y!c`6;TSWq+jnDqbeGt1O0W^LywrtLiT@-t zC!}_48sM;pY2&aa_uy0_4GjJsuq?ikG27nEkouH$Q!?PRAl25XNhyu+#=krRvw)Vh zDkALo8Z;w+uHSV-g{^B)-GEga@Y^=rlHn;Cp4f(GHqdD90msoev~5D;T2CZE@f77$ JR(?fRe*@gna6141 diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index 5caf1cfbdfb24c0039720f63414d9c1a5735d4b9..a69028efb8ddb5df81d702bc5663be9c9c757955 100644 GIT binary patch delta 932 zcmX9-ZD<@t7~a`!ZgbaZZf(>%6#$@Ku%{hDinRl4y zosZ{ZM*2qj@(YqrshD|C3U{PDLNTJ(^=@3Cpi;O=qnME&>fS=%lV^S75x&HMBd!sg z6@J;NG|XER9$5jK!Uhj9Cp$Mn@=jOlB|y#?F< zhTMWKhwhPGTVJXl zpp&AiL4=HNJsIT(EMf?WOO%eG%~0!>0S}0< z{A~}IBA$ zey;puG?>H@jWCp{5#@t<8@LCzutF|3JueSa2vE!lZc_;P^sA{Gqt}TNeh-z&Xm|%| zB{Si78uwQ;P#1wSlJMGJe!xe`6Y8U!`^#z)-5|HrNb`M`xCFab@RpUFpr7@;;M|9a ztM(t5U`DlOq0B9eVzI(~W=mE^abBiqPy=zpbj=>zYq@*wcsVaP0g|RApQXNVP=^1EdV_de}y_z~u zUWM4Qrlwt^2S>^Fw%CCTJH}Hr>4SIIc?HeOlOdbggL*dadseUb09Q}&8ZSA|uG~tBfhL{#%(_$jd6;70pRc9RXR2L?| z`b}{SAFs=n6Cd+pG)E4%?`rsv!JZYaj^Z5*3uK~wTi`^+yi@l-?YVZsKS_TFY~*o} zI5%^OhwSZ+9bHotPg5*2%qZ@Dh%t@!_5rGmT`pPL53$NrY;UraM=yCI|_3|6lvTf0@0i6aWAK delta 931 zcmX9-ZD?Cn7``XB$?eT_NxEBev#rfrR!25l)~$#iZCNR^1U;r=f7qeORr@1C#IM4J zf2^3>YD;VNOwfufz2uH%GmtLK87HDewxyt4WrN8gimZ(m9k;9PIc28t-1z6bhx5GW zKw$7GC~vrxD zOCj@;Rrg><(6Yx|QD~~fRZagQSs43LBTogAC`L+w&*j4`*H?JK#c%zj;Y0K@Ik@A= z`WT&YsTzdI8}Xt55Fv*0N;ng;8KseU2()!0Q+X=?5))3_as8m^QJ?plgRxxn!vvfRdFj_ATP zSbz8{hKJV`%Z^S&KZ?Rx5^Fx_8)5L!8rR7091NGqbn{N{+neT9_y5$-H52|v`opk| zr$OZ0%vqkXSHpYS2*oEU7WiW*ZvPX{{e!nQaF$^o!+k3_%6W-mr kkK#i#5fKyn#YCHkhc@xERqS0#l?*`>gy-1r|CVn42c}i2mjD0& diff --git a/c64/kernal/f13e.getin.s b/c64/kernal/f13e.getin.s index 5eefc0ac..be8e3faa 100644 --- a/c64/kernal/f13e.getin.s +++ b/c64/kernal/f13e.getin.s @@ -8,26 +8,9 @@ // CPU registers that has to be preserved (see [RG64]): .X, .Y // -// XXX currently does not preserve registers, to be fixed! GETIN: - // Wait for a key - lda NDX - bne !+ + // XXX this should be a dispatcher for several different devices! - // Nothing in keyboard buffer to read - sec - lda #$00 - rts - -!: - lda KEYD - pha - - jsr pop_keyboard_buffer - - pla - clc - - rts + jmp read_kb_buf diff --git a/c64/kernal/interrupts/udtim.s b/c64/kernal/interrupts/udtim.s index 34528613..f9d4fa99 100644 --- a/c64/kernal/interrupts/udtim.s +++ b/c64/kernal/interrupts/udtim.s @@ -26,16 +26,22 @@ udtim_update_stkey: // entry to be used when interrupts are disabled // Another 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 +#if CONFIG_KEYBOARD_C128 + lda #$FF + sta VIC_XSCAN // disconnect the extra C128 keys +#endif + lda #$7F sta CIA1_PRA // select the last row (bit to 0) lda CIA1_PRB // read the row sta STKEY - // Finish by disconnecting the keyboard, this will prevent - // interference when scanning joystick in port 1 + // 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. - jmp keyboard_disconnect + rts udtim_clock_rollover: diff --git a/c64/kernal/keyboard/f142.interop b/c64/kernal/keyboard/f142.interop new file mode 100644 index 00000000..73019c17 --- /dev/null +++ b/c64/kernal/keyboard/f142.interop @@ -0,0 +1,4 @@ +$F142 is a well-known address of keyboard reading routine, described for example here: +- http://sta.c64.org/cbm64kbdfunc.html + +It is used for eexample by a music eeditor here: https://github.com/martinpiper/C64Public/blob/master/MusicEditor/GetKey.a diff --git a/c64/kernal/keyboard/f142.read_kb_buf.s b/c64/kernal/keyboard/f142.read_kb_buf.s new file mode 100644 index 00000000..8b72b9e2 --- /dev/null +++ b/c64/kernal/keyboard/f142.read_kb_buf.s @@ -0,0 +1,30 @@ + +// +// Well-known Kernal routine, described in: +// +// - http://sta.c64.org/cbm64kbdfunc.html +// + + +read_kb_buf: + + // Check for a key + lda NDX + bne !+ + + // Nothing in keyboard buffer to read + sec + rts + +!: + lda KEYD + pha + phy_trash_a + + jsr pop_keyboard_buffer + + ply_trash_a + pla + clc + + rts diff --git a/c64/kernal/keyboard/keyboard_disconnect.s b/c64/kernal/keyboard/keyboard_disconnect.s index 37f4e973..1fdae023 100644 --- a/c64/kernal/keyboard/keyboard_disconnect.s +++ b/c64/kernal/keyboard/keyboard_disconnect.s @@ -2,6 +2,10 @@ // // Helper routine - disconnects the keyboard from CIA1_PRB, // leaves $FF in .X (behavior needed in some places) +// + + +#if !CONFIG_LEGACY_SCNKEY keyboard_disconnect: @@ -13,3 +17,6 @@ keyboard_disconnect: #endif rts + + +#endif diff --git a/c64/kernal/keyboard/pop_keyboard_buffer.s b/c64/kernal/keyboard/pop_keyboard_buffer.s index e540a221..6f3b172b 100644 --- a/c64/kernal/keyboard/pop_keyboard_buffer.s +++ b/c64/kernal/keyboard/pop_keyboard_buffer.s @@ -2,7 +2,9 @@ // Pop key out of keyboard buffer // Disable interrupts while reading from keyboard buffer // so that no race conditions can occur - +// +// CPU registers that has to be preserved: .X +// pop_keyboard_buffer: diff --git a/c64/kernal/keyboard/scnkey.s b/c64/kernal/keyboard/scnkey.s index a3fb99c5..e35baaf2 100644 --- a/c64/kernal/keyboard/scnkey.s +++ b/c64/kernal/keyboard/scnkey.s @@ -53,7 +53,6 @@ SCNKEY: #endif // Retrieve SHIFT / VENDOR / CTRL status - // Use .X to detect 2 or more keys pressed (should be $FF now) ldy #(__kb_matrix_bucky_confmask_end - kb_matrix_bucky_confmask - 1) scnkey_bucky_loop: @@ -154,7 +153,7 @@ scnkey_matrix_loop_inner: !: dey bpl scnkey_matrix_loop_inner - bmi scnkey_no_keys // branch always, multiple keys must have been pressed + bmi scnkey_no_keys // branch always, multiple keys must have been pressed scnkey_matrix_loop_next: dex bpl scnkey_matrix_loop