From 3fd0d0678d1bd7ed06e8c051144d1e840d6ffc76 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Mon, 26 Dec 2022 22:47:47 -0500 Subject: [PATCH] Merged JGH's keyboard handler cleanup. --- applecorn.po | Bin 819200 -> 819200 bytes applecorn.s | 1 - auxmem.chario.s | 201 +++++++++++++++++++++++++----------------------- 3 files changed, 104 insertions(+), 98 deletions(-) diff --git a/applecorn.po b/applecorn.po index e373c9b2a9e318b47427bd74773c1d2b7986cfb1..6424e2c278fa6e175e3c4a17ae39fbbfeefdb425 100644 GIT binary patch delta 73 zcmZo@FluNp+K|J-r7y 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