From d25edf3f0f3d1551bee1d2ad57f0292f36a4723c Mon Sep 17 00:00:00 2001 From: jgharston Date: Mon, 26 Dec 2022 22:43:20 +0000 Subject: [PATCH 1/3] Added updated KBDTest program --- tests/KBDTest | Bin 0 -> 3038 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/KBDTest diff --git a/tests/KBDTest b/tests/KBDTest new file mode 100644 index 0000000000000000000000000000000000000000..0c8a25c037de8e9e42d12d579d8351d286300ddb GIT binary patch literal 3038 zcmaJ@U2Gd!6&_nuAf%~SC`+Ns>T)+uJ@vTu9gqJeo@mE^+BTciiX9Oasgh%l6D!V) zv7K%zRVY;asD%d}5Dz>c9tr{;ctAX?P>VJNAs%=@Jn(>svw#b%><%T;PF>zHSRpmnF2`hJp{a*7n+jejF2kvml zT7KIdvZmK&?q1(*jodcLHvHy5{!x{e&snMxwVjBawALfGu>4`fjz)hzU#(V6Z694S zseQ>vXRM>>Qe;0ajGR_j#MfGawvkg6O}6E+7*$BQB>C7q?(a7Nw^fT zu2k1e-B6WU0hAFx+Z%1_j#%^uaWJw!UoL9)d^!~f;(~ph9Wn4%$OSV(Ro*a<`O+jA zU9Z18O0>3`gC;UDVE*n16KsSW^2@(UWpp0rnyR!D$GkT1HwVofHrVyNuD8j2kMV^E z!{~!8e>jT5hNdm>tC&+2Zw?MEMc6*en3@H1d;yLe^OfePd&_0pq_fA5xqEwD3 zU#5z(bC%6Zqd_nJ8Y?=brFzXNRZxQeyeOsliS!z4I7Q6=`z1LqQWL>4Tdg$KR#&(h z`amEvvJ=_o8FqqG177I-r)B-7#6-qpk5G0oq)H84ydXhS283e=Li{6gfskkb&|eG; z%W=8#dZj_InfMW-#1&*UI>gs}HHl)(CxO+W;+B)3Sq;6)XOt28e2$c4@UOd_5#X-B z@_#i}yPI32(rC@71mJ;10z2TZ`8#d}r%Y{gtzX+Ld)K@nE4w{L23CPk_TTi@`iw0P z%ii*Etx~kfB+$MYol(R&B=X1=nL9)A zcgF0DArAOwyIy(i}`(AOd&8Vj~;pK#{vPYbq=IInWF(KJ`a5X3lc!2#r$!OO>O?a>Wlx9mI*L<=1{5#>5_F0NAJCzOo@_o3JrDG1QfF16 zGgdX|lfuZPKWY5Qpk>i=dNr?CMG{S*8G1*g&`h*6xBje#{LLTH>tB%8@XCO-N{^QMUa?qW zMd-^uhGPx)BQErDUunRrKJIw7dX1h$b(qANvboV-^SXOvCX-9%>A%zO_gq|@WHg73 zo`b=S&yhh}&~-w3Mc3Wn@@aut!=$6TmRO$7m~|dos$eS$uM;(f( K=ir~{KK(EJ{Zz03 literal 0 HcmV?d00001 From b38ab9569172f339365f3da81089fef1bf7772b1 Mon Sep 17 00:00:00 2001 From: jgharston Date: Mon, 26 Dec 2022 22:43:35 +0000 Subject: [PATCH 2/3] Delete KBDTEST#060e00 --- tests/KBDTEST#060e00 | Bin 6063 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/KBDTEST#060e00 diff --git a/tests/KBDTEST#060e00 b/tests/KBDTEST#060e00 deleted file mode 100644 index 8799bb9867be3cb08fe27cfe9a1ce9fbadc99312..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6063 zcmb7I4QyN06^;`-V~E>PXlW_XT`sZXS3f83JwN}w#1@Vn(~|x~P09*FfMdTjSrgmX zPHCnJg^K-jL)$b>-84-bLRr|*G_4bw7$T@;-GruTn$R>&8=csX$b`m^QHlmy$G&r) z?Kn-TL=?Yw-?``So^$Rw=U&!v?Uq%ZE&aU!YvA_%VY>DTma+O@ZW>9#Yi+VrndLPItnyjNn6-07piEc6r(kouizVoyX&rUYe#nW`rZwihsnr5Y&yBGML2E8UeNuV;zG@ zyP7{x>`92>u{1xhUs&`#IoSkcv%-3df1Wq7+U5o8$PPpF3)Y8?X^HtoYlWx0gUJ^p zC*s^rW4*2Gs;*o0QxR=oSq}}cj?wTxK#EaO%4~l`ss(*2+RIT}8WJMVeeSoo! z<2@@Jw&e>vVk#EIi2?olVLjczhj~wvWh1&ZguHxIDWL zTnvlv**`LTuOFeSw9z}m=ts^DwaO7|*hkK$H_m|N%ROLeT0E7x zC$-m){Qz&Md}3~L61%rz=L*1iWePZ9i_1*lAWE#^1KB$?XAN=8mW~{mfww0L*t=!! z7X#;-5kQ9L2gZboD0xhe8_KR|Kv$yyd=AnlB1wUqSGQ8wQJm(;6P66F*VT(wZN6;x zBwmEagTbcX}`Jr=Ly}iBGdrqi-KcPph_pxWd_s)-%3Xsf@3S4*J zxx%p}lO{~`w7|OCmwnaLVhExi_sUeF$JIs#F~TNgoe{50ET(D*=6Ya9%LHL;U&IJy zYBJ8$HYXFsWhQE5Pv)vb>Rb$0^8x≪FqOLG<>DgLZAMQf%9SygF5yn}Q^~SCi0t_T|klH&;+A&wx zFw;%UHF52j|NC@{C+dpB6TW}2Qb0tr&TDS1^TjF6PZMfL={--DSC`|;0PDPAM=SP1 zh)h&C!@?uPI&W1{J&7m%BD+6N#Z8tuKaGgZf)Ng*>?tTkoxU6EJk_&~t9H$sV8uGE z+w1(isV?ifGH^aDMOxDB^azAmXJ#06iONV)Lv8XCI7y#D6V=3jW-tusnWUyD3clrR zRI}>KG3?ARo5cA>d-Sm&3w+NH^6_K-tJ{3cQjjmcEMx&wgkZ7tU-O)NPC@Q1*n zF=2g;uzt4HK91maGLakt_yX|)n6REAtY2R(`E>q1TkjR)$hJI(t^mCmmMyzHl{*c@ z*zP^qaoWq1b}c`pa?wj0JO={69-f=72`u){*leBu9K_~t6^n!zAQetivA602Deu5p zLCu^{sZY{S0JuF{uFZ>qQzq+t>i{JVsxCz5SOc3Gz`0^|u3RovYIZ?j(>oSwV@Ujn zSsA$oU5mr+KOs<#jvs8Yb4+*zcJ%>Ra^O^mb#)TS@Zs?$iDS$<6jIu>+)t$*thMN2bgkWIU|=WncQ7h8466BHQr%sewbkKbK^;AEsEkLZsO~9N)r>u( z0s{yDaLnwhVz94zs4Q65?y0M?kAr6R<1-!vD8y}+r#4x{xZV_lE$*~nF@p~pnit8EU4N2S*} zJk8;17^7i}uTpG%n_}y!O&6S2UIx~Wk4XVWRHo^{P{>N06Y0|IY^hMH*y!u~(Ho8L z;pyB=9-VTnR6*aDnyuCL}A)KYv)-8D}9#8=fK3QgLV~&4++5-vQ3|p=P5OZM=uap;Z}&OWtTIA+my< zK2bPSoIXxsA~7va<5anfc9ct@F|?a82t0c)38Zc-Aqa2CwkK$3N~nQFi}Yy!z81tJ z$iZ=4?>{(p7{Bqc)>OF30*ge%{AN=Ex#?)J^hgn3e;@<@^$r+VLupg@dzHjX0*yNT zp~yYzz*yJ6`Y+%_mFiKfm9wcHRaX*%3+p0E<2iidly}Ji4<-R;UGD}~URsYv(?3e} zP*T0*Of^vd`-w!Vhq=3lPnGHCfpI`_efiL>GanL81p0!wx_OeL_4TJ7$OLXh4NL}%H6 zt~8j-U=t5q&P$TTNI#>c-(~Xq$QucXIHUqGbQS(>xO>Sc_iSF}Lu;oT=6>k<3yY1m z<}gyN`?K3x9X!ew795n|+OCU~w0v=yyPR7Fq;N>aa(w8*=ubh*>3;Nhd9uj1TEt#B)pQEfS$P7%+{{ay1yv-7mxfHkd)WYV^Fj#@s5rUHsg ziW?B-UJ5ugPQN!U-Ad;IcngF^qnQMpxqm9aZOQN8!1capmKKI}JTBM4+|TQ4hYHMS zG<{Wq^9VX9@w*#IiFLyMM8X!=`b#Mlij%<{&HuiA1=d>drH4_?(k21X(=zwJw>98d zf=47g%G~eW)DDhW37M}$<6S5rBtm3Th~;TwL1gnUWIuKxQrHw!$P~u*4Dkz zWu8G;YYl;1qAR`-VWiU<+%8S{)@*K`N-+_zmOFkdQ#ZH%@6z9LU}3JrKBBjI`z zUcA}CkEbO(q%|jw%ZZJ#;5qp*W5M&pr<~wH}R0kRu3pmzuYn4-NW1eSB*hL1342F#KZ&a3+4G$2ZFfz}xNry&y)(P;F@b3nE zPGV4kgDAfJ`MFB9Q~~vi>m?3JiN+O(0RlbRE#`T7q@iU-hVn4cG**ShH2;8|L9ysR zROYCqV^hclX`Zw>wv<)=EXz?FNJH zP0cvBYa8NRM(D;k@80fh#CbD>tv65x$8g0r?j3~lm&U!UTbLBo<6dhFmok?J0xdhV zVB*GO1*wDXYACe2)vfqU;KXXJU>;GFGFf+Iiv*@{>nnkTc&CGy!ci2g8`O6_ zfFh$T;D)oivR$ea#~uZy4pBZmqqFW44&&HmjK2`1^RZ6^&WTujC>4pOGs9UkO!XCa R*tls?l)#u5lF}Oc@c*>rxI+K{ From d8c99f3ef7f1dbd7c180de8aa3f05cfffdd84dbc Mon Sep 17 00:00:00 2001 From: jgharston Date: Mon, 26 Dec 2022 22:51:32 +0000 Subject: [PATCH 3/3] Fully integrated ADB keyboard support That was satisfying, watching three films while working out the code on paper. :) Really like writing keyboard drivers. ADB extensions fully integrated into KBDREAD code. Keypad defaults to function keys. Also lets Shift/Ctrl-Cursors to be detected on GS. --- auxmem.chario.s | 201 +++++++++++++++++++++++++----------------------- 1 file changed, 104 insertions(+), 97 deletions(-) diff --git a/auxmem.chario.s b/auxmem.chario.s index 76755e8..262fa3a 100644 --- a/auxmem.chario.s +++ b/auxmem.chario.s @@ -35,6 +35,7 @@ * 06-Dec-2022 Moved *KEY into here. * 12-Dec-2022 Test code to write *KEY data to mainmem. * 24-Dec-2022 Minor bit of tidying. +* 26-Dec-2022 Integrated ADB extended keyboard keys. * Hardware locations @@ -42,23 +43,27 @@ KBDDATA EQU $C000 ; Read Keyboard data KBDACK EQU $C010 ; Acknowledge keyboard data KBDAPPLFT EQU $C061 ; Left Apple key KBDAPPRGT EQU $C062 ; Right Apple key +KBDMOD EQU $C025 ; AppleIIgs modifier keys IOVBLNK EQU $C019 ; VBLNK pulse FLASHER EQU BYTEVARBASE+176 ; VSync counter for flashing cursor FXEXEC EQU BYTEVARBASE+198 ; *EXEC handle FXSPOOL EQU BYTEVARBASE+199 ; *SPOOL handle +FXKBDSTATE EQU BYTEVARBASE+202 ; Keyboard modifier state FXTABCHAR EQU BYTEVARBASE+219 ; Char for TAB key to return FXESCCHAR EQU BYTEVARBASE+220 ; Char to match as Escape key FXKEYBASE EQU BYTEVARBASE+221 ; Base of char &80+ translations +FXKEYPADBASE EQU BYTEVARBASE+238 ; Base of keypad keys FXESCON EQU BYTEVARBASE+229 ; Escape key is ASC or ESC FXESCEFFECT EQU BYTEVARBASE+230 ; Actions when Escape acknowledged FX200VAR EQU BYTEVARBASE+200 ; Completely ignore CHR$(escape) +FX254VAR EQU BYTEVARBASE+254 ; Keyboard map + FXSOFTLEN EQU BYTEVARBASE+216 ; Length of current soft key FXSOFTOFF EQU BYTEVARBASE+233 ; Offset to current soft key FXSOFTOK EQU BYTEVARBASE+244 ; Soft keys not unstable -FX254VAR EQU BYTEVARBASE+254 ; Keyboard map FX2VAR EQU BYTEVARBASE+$B1 ; Input stream FX3VAR EQU BYTEVARBASE+$EC ; Output streams FX4VAR EQU BYTEVARBASE+$ED ; Cursor key state @@ -112,12 +117,14 @@ KBDINIT LDX #DEFBYTEEND-DEFBYTE-1 STA BYTEVARBASE+DEFBYTELOW,X DEX BPL :KBDINITLP + LDA #$80 ; Keypad keys are function keys + STA FXKEYPADBASE JSR SOFTKEYCHK ; Clear soft keys - LDX #$C3 + LDX #$C3 ; Default KBD=Native, MODE=3 STX FX254VAR ; b7-b4=default KBD map, b3-b0=default MODE BIT SETV ; Set V JSR KBDTEST ; Test if key being pressed - BCS :KBDINITOK ; Return default MODE=3 + BCS :KBDINITOK ; Return default MODE STA KBDACK ; Ack. keypress TAX ; Use keypress as default MODE :KBDINITOK TXA @@ -463,50 +470,6 @@ BYTE12 BYTE12OK RTS -* Handle function keys on ADB Extended Keyboard & BMOW Wombat -* For Apple IIGS only -EXTENDKBD BIT VDUBANK ; Use VDUBANK to see if ... - BMI :GS ; ... this is a GS - RTS ; If not, bail -:GS PHA ; Preserve character typed - LDA KEYMOD ; GS-specific register - AND #$10 ; Bit 4 is the 'keypad bit' - BEQ :NOTKEYPAD ; Not an extended key - PLA - LDX #$00 -:LOOP CMP :TABLE,X ; Lookup keycode in table - BEQ :FOUND - INX - INX - CPX #20 ; 10 rows of two bytes each - BNE :LOOP - RTS ; Not found, return unchanged -:FOUND LDA KEYMOD ; Look at the modifiers - AND #$C3 ; Mask only the modifier bits - CMP #$01 ; Only shift pressed - BNE :S1 - LDA #$10 ; Offset for shift+f-key - BRA :S2 -:S1 CMP #$02 ; Only ctrl pressed - BNE :S2 - LDA #$20 ; Offset for ctrl+f-key -:S2 CLC - ADC :TABLE+1,X ; Lookup translation + add - RTS -:NOTKEYPAD PLA ; Get original key back - RTS -:TABLE DB $7A, $81 ; Extended keyboard F1 code -> f1 - DB $78, $82 ; Extended keyboard F2 code -> f2 - DB $63, $83 ; Extended keyboard F3 code -> f3 - DB $76, $84 ; Extended keyboard F4 code -> f4 - DB $60, $85 ; Extended keyboard F5 code -> f5 - DB $61, $86 ; Extended keyboard F6 code -> f6 - DB $62, $87 ; Extended keyboard F7 code -> f7 - DB $64, $88 ; Extended keyboard F8 code -> f8 - DB $65, $89 ; Extended keyboard F9 code -> f9 - DB $6D, $80 ; Extended keyboard F10 code -> f0 - - * KEYREAD ************************ * Test for and read from input, @@ -522,19 +485,18 @@ KEYREAD LDY FXEXEC ; See if EXEC file is open LDA #$00 ; EOF, close EXEC file STA FXEXEC ; Clear EXEC handle JSR OSFIND ; And close it -KEYREAD1 LDA FXSOFTLEN - BEQ KEYREAD2 - LDX FXSOFTOFF ; SOFTKEYOFF +KEYREAD1 LDA FXSOFTLEN ; Soft key active? + BEQ KEYREAD2 ; No, skip past + LDX FXSOFTOFF ; Get offset to current character >>> RDMAIN - LDA FKEYBUF,X + LDA FKEYBUF,X ; Get it from mainmem >>> RDAUX - INC FXSOFTOFF ; SOFTKEYOFF - DEC FXSOFTLEN + INC FXSOFTOFF ; Inc. offset + DEC FXSOFTLEN ; Dec. counter CLC RTS KEYREAD2 JSR KBDREAD ; Fetch character from KBD "buffer" BCS KEYREADOK ; Nothing pending - JSR EXTENDKBD ; Handle ADB Extended Keyboard f-keys TAY ; Y=unmodified character BPL KEYREADOK ; Not top-bit key AND #$CF ; Drop Shift/Ctrl bits @@ -576,11 +538,10 @@ KEYSOFTY TYA ; Get key including Shift/Ctrl CLC RTS - * Expand soft key -* On entry: Y key code ($8n where n is F-key num) +* On entry: Y=key code ($Xn where n is soft key number) KEYEXPAND TYA - AND #$0F ; Obtain F-key number + AND #$0F ; Obtain soft key number TAX PHX JSR KEYSUMLENS ; Obtain starting offset @@ -591,8 +552,6 @@ KEYEXPAND TYA >>> RDAUX STA FXSOFTLEN RTS -* SOFTKEYOFF DB $00 - * Process cursor keys KEYCURSOR CMP #$C9 @@ -624,14 +583,18 @@ KEYCOPYTAB LDA FXTABCHAR ; Prepare TAB if no copy cursor * KBDREAD ************************ * Test for and fetch key from keyboard +* Updated for ADB keyboards * * On exit, CS=no keypress * CC=keypress * A =keycode, X=corrupted -* Apple+Letter -> Ctrl+Letter -* Apple+Digits -> 80+x, 90+x, A0+x -* TAB -> $C9 -* Cursors -> $CC-$CF +* Apple+Letter -> Ctrl+Letter +* AppleL+digit -> 80+x +* AppleR+digit -> 90+x +* AppleLR+digit -> A0+x +* TAB -> $C9 +* Cursors -> $CC-$CF +* Keypad -> PADBASE+key * KBDREAD CLV ; VC=return keypress KBDTEST LDA KBDDATA ; VS here to test for keypress @@ -640,46 +603,72 @@ KBDTEST LDA KBDDATA ; VS here to test for keypress BCS KBDDONE ; No key pressed BVS KBDDONE ; VS=test for keypress STA KBDACK ; Ack. keypress -KBDREAD2 BIT KBDAPPLFT - BMI KBDLALT ; Left Apple pressed - BIT KBDAPPRGT - BMI KBDRALT ; Right Apple pressed - CMP #$09 - BEQ KBDTAB ; TAB is dual action TAB/COPY - CMP #$08 - BCC KBDCHKESC ; <$08 not cursor key - CMP #$0C - BCC KBDCURSR ; $08-$0B are cursor keys - CMP #$15 - BNE KBDCHKESC ; $15 is cursor key +KBDREAD2 TAX ; X=raw keypress * -KBDCUR15 LDA #$0D ; Convert RGT to $09 -KBDTAB SBC #$04 ; Convert TAB to &C9 -KBDCURSR CLC - ADC #$C4 ; Cursor keys $C0+x - BRA KBDCHKESC +* Set FXKBDSTATE to %x0CS0000 from Alt or Shift keys + LDA KBDAPPRGT ; Right Apple/Alt pressed + ASL A + LDA KBDAPPLFT ; Left Apple/Alt pressed + ROR A ; b7=Right, b6=Left + AND #$C0 + LSR A + LSR A + PHP ; Save EQ=no ALTs pressed + BEQ KBDREAD2A + ADC #$F0 ; Convert into fkey modifer +KBDREAD2A STA FXKBDSTATE + BIT VDUBANK + BPL KBDREAD5 ; Not IIgs + LDA KBDMOD ; Get extended KBD state + PLP + PHP + BNE KBDREAD2B ; ALTs pressed, skip + PHA ; Save b4=Keypad + ASL A + ASL A + ASL A + ASL A ; b5=Ctrl, b4=Shift + AND #$30 + STA FXKBDSTATE + PLA +* +KBDREAD2B AND #$10 + BEQ KBDREAD5 ; Not keypad + PLP ; Drop NoALT + TXA ; A=raw keypress + LDX FXKEYPADBASE + BEQ KBDCHKESC ; $00=use unchanged + BPL KBDREAD4 ; Keypad not function keys + CMP #$20 + BCC KBDCHKESC ; Don't translate control chars + CMP #$3D + BNE KBDREAD3 ; Special case for KP'=' + DEC A +KBDREAD3 ORA #$30 ; Ensure $30-$3F +KBDREAD4 SEC + SBC #$30 ; Convert to offset from $30 + CLC + ADC FXKEYPADBASE ; Add to keypad base + BRA KBDREAD6 -KBDRALT ; Right Apple key pressed -KBDLALT CMP #$40 ; Left Apple key pressed - BCS KBDCTRL +KBDREAD5 TXA ; A=raw keypress + PLP + BEQ KBDNOALT ; No ALTs pressed +* +KBDALT CMP #$40 + BCS KBDCTRL ; 'A'+ Alt+letter ->Control code CMP #$30 - BCC KBDCHKESC ; <'0' + BCC KBDCHKESC ; <'0' Alt+nondigit -> keep CMP #$3A - BCS KBDCHKESC ; >'9' -KBDFUNC AND #$0F ; Convert Apple-Num to function key - ORA #$80 -KBDFUNC2 BIT KBDAPPRGT - BPL KBDCHKESC ; Left+Digit -> $8x - ORA #$90 ; Right+Digit -> $9x - BIT KBDAPPLFT - BPL KBDCHKESC - EOR #$30 ; Left+Right+Digit -> $Ax - BRA KBDCHKESC - -KBDCTRL AND #$1F ; Apple-Letter -> Ctrl-Letter + BCS KBDCHKESC ; >'9' Alt+nondigit -> keep + ORA #$80 ; Alt+digit -> function key +* +KBDREAD6 BPL KBDCHKESC ; Not a top-bit key +KBDFUNC AND #$CF ; Clear Ctrl+Shift bits + ORA FXKBDSTATE ; Add in Ctrl+Shift * * Test for Escape character -KBDCHKESC TAX ; X=keycode +KBDCHKESC TAX ; X=processed keycode EOR FXESCCHAR ; Current ESCAPE char? ORA FXESCON ; Is ESCAPE an ASCII char? BNE KBDNOESC ; Not ESCAPE or ESCAPE=ASCII @@ -692,6 +681,24 @@ KBDNOESC TXA ; A=keycode CLC ; CLC=Ok KBDDONE RTS +* Moved here to reduce BRx ranges +KBDCTRL AND #$1F ; Apple-Letter -> Ctrl-Letter + BRA KBDCHKESC + +KBDNOALT CMP #$09 + BEQ KBDTAB ; TAB is dual action TAB/COPY + CMP #$08 + BCC KBDCHKESC ; <$08 not cursor key + CMP #$0C + BCC KBDCURSR ; $08-$0B are cursor keys + CMP #$15 + BNE KBDCHKESC ; $15 is cursor key +KBDCUR15 LDA #$0D ; Convert RGT to $09 +KBDTAB SBC #$04 ; Convert TAB to &C9 +KBDCURSR CLC + ADC #$C4 ; Cursor keys $C0+x + BRA KBDFUNC + * Poll the keyboard to update Escape state * On exit, MI=Escape state pending