mirror of
https://github.com/bobbimanners/Applecorn.git
synced 2024-09-28 07:55:27 +00:00
Merged JGH's keyboard handler cleanup.
This commit is contained in:
parent
19a8842b5f
commit
3fd0d0678d
BIN
applecorn.po
BIN
applecorn.po
Binary file not shown.
@ -94,7 +94,6 @@ RDVBL EQU $C019
|
|||||||
RD80VID EQU $C01F
|
RD80VID EQU $C01F
|
||||||
|
|
||||||
TBCOLOR EQU $C022 ; GS-specific, used but commented out
|
TBCOLOR EQU $C022 ; GS-specific, used but commented out
|
||||||
KEYMOD EQU $C025 ; GS-specific
|
|
||||||
NEWVIDEO EQU $C029 ; GS-specific, new video register
|
NEWVIDEO EQU $C029 ; GS-specific, new video register
|
||||||
|
|
||||||
SPKR EQU $C030
|
SPKR EQU $C030
|
||||||
|
201
auxmem.chario.s
201
auxmem.chario.s
@ -35,6 +35,7 @@
|
|||||||
* 06-Dec-2022 Moved *KEY into here.
|
* 06-Dec-2022 Moved *KEY into here.
|
||||||
* 12-Dec-2022 Test code to write *KEY data to mainmem.
|
* 12-Dec-2022 Test code to write *KEY data to mainmem.
|
||||||
* 24-Dec-2022 Minor bit of tidying.
|
* 24-Dec-2022 Minor bit of tidying.
|
||||||
|
* 26-Dec-2022 Integrated ADB extended keyboard keys.
|
||||||
|
|
||||||
|
|
||||||
* Hardware locations
|
* Hardware locations
|
||||||
@ -42,23 +43,27 @@ KBDDATA EQU $C000 ; Read Keyboard data
|
|||||||
KBDACK EQU $C010 ; Acknowledge keyboard data
|
KBDACK EQU $C010 ; Acknowledge keyboard data
|
||||||
KBDAPPLFT EQU $C061 ; Left Apple key
|
KBDAPPLFT EQU $C061 ; Left Apple key
|
||||||
KBDAPPRGT EQU $C062 ; Right Apple key
|
KBDAPPRGT EQU $C062 ; Right Apple key
|
||||||
|
KBDMOD EQU $C025 ; AppleIIgs modifier keys
|
||||||
IOVBLNK EQU $C019 ; VBLNK pulse
|
IOVBLNK EQU $C019 ; VBLNK pulse
|
||||||
|
|
||||||
FLASHER EQU BYTEVARBASE+176 ; VSync counter for flashing cursor
|
FLASHER EQU BYTEVARBASE+176 ; VSync counter for flashing cursor
|
||||||
FXEXEC EQU BYTEVARBASE+198 ; *EXEC handle
|
FXEXEC EQU BYTEVARBASE+198 ; *EXEC handle
|
||||||
FXSPOOL EQU BYTEVARBASE+199 ; *SPOOL handle
|
FXSPOOL EQU BYTEVARBASE+199 ; *SPOOL handle
|
||||||
|
|
||||||
|
FXKBDSTATE EQU BYTEVARBASE+202 ; Keyboard modifier state
|
||||||
FXTABCHAR EQU BYTEVARBASE+219 ; Char for TAB key to return
|
FXTABCHAR EQU BYTEVARBASE+219 ; Char for TAB key to return
|
||||||
FXESCCHAR EQU BYTEVARBASE+220 ; Char to match as Escape key
|
FXESCCHAR EQU BYTEVARBASE+220 ; Char to match as Escape key
|
||||||
FXKEYBASE EQU BYTEVARBASE+221 ; Base of char &80+ translations
|
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
|
FXESCON EQU BYTEVARBASE+229 ; Escape key is ASC or ESC
|
||||||
FXESCEFFECT EQU BYTEVARBASE+230 ; Actions when Escape acknowledged
|
FXESCEFFECT EQU BYTEVARBASE+230 ; Actions when Escape acknowledged
|
||||||
FX200VAR EQU BYTEVARBASE+200 ; Completely ignore CHR$(escape)
|
FX200VAR EQU BYTEVARBASE+200 ; Completely ignore CHR$(escape)
|
||||||
|
FX254VAR EQU BYTEVARBASE+254 ; Keyboard map
|
||||||
|
|
||||||
FXSOFTLEN EQU BYTEVARBASE+216 ; Length of current soft key
|
FXSOFTLEN EQU BYTEVARBASE+216 ; Length of current soft key
|
||||||
FXSOFTOFF EQU BYTEVARBASE+233 ; Offset to current soft key
|
FXSOFTOFF EQU BYTEVARBASE+233 ; Offset to current soft key
|
||||||
FXSOFTOK EQU BYTEVARBASE+244 ; Soft keys not unstable
|
FXSOFTOK EQU BYTEVARBASE+244 ; Soft keys not unstable
|
||||||
|
|
||||||
FX254VAR EQU BYTEVARBASE+254 ; Keyboard map
|
|
||||||
FX2VAR EQU BYTEVARBASE+$B1 ; Input stream
|
FX2VAR EQU BYTEVARBASE+$B1 ; Input stream
|
||||||
FX3VAR EQU BYTEVARBASE+$EC ; Output streams
|
FX3VAR EQU BYTEVARBASE+$EC ; Output streams
|
||||||
FX4VAR EQU BYTEVARBASE+$ED ; Cursor key state
|
FX4VAR EQU BYTEVARBASE+$ED ; Cursor key state
|
||||||
@ -112,12 +117,14 @@ KBDINIT LDX #DEFBYTEEND-DEFBYTE-1
|
|||||||
STA BYTEVARBASE+DEFBYTELOW,X
|
STA BYTEVARBASE+DEFBYTELOW,X
|
||||||
DEX
|
DEX
|
||||||
BPL :KBDINITLP
|
BPL :KBDINITLP
|
||||||
|
LDA #$80 ; Keypad keys are function keys
|
||||||
|
STA FXKEYPADBASE
|
||||||
JSR SOFTKEYCHK ; Clear soft keys
|
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
|
STX FX254VAR ; b7-b4=default KBD map, b3-b0=default MODE
|
||||||
BIT SETV ; Set V
|
BIT SETV ; Set V
|
||||||
JSR KBDTEST ; Test if key being pressed
|
JSR KBDTEST ; Test if key being pressed
|
||||||
BCS :KBDINITOK ; Return default MODE=3
|
BCS :KBDINITOK ; Return default MODE
|
||||||
STA KBDACK ; Ack. keypress
|
STA KBDACK ; Ack. keypress
|
||||||
TAX ; Use keypress as default MODE
|
TAX ; Use keypress as default MODE
|
||||||
:KBDINITOK TXA
|
:KBDINITOK TXA
|
||||||
@ -463,50 +470,6 @@ BYTE12
|
|||||||
BYTE12OK RTS
|
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
|
* KEYREAD
|
||||||
************************
|
************************
|
||||||
* Test for and read from input,
|
* 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
|
LDA #$00 ; EOF, close EXEC file
|
||||||
STA FXEXEC ; Clear EXEC handle
|
STA FXEXEC ; Clear EXEC handle
|
||||||
JSR OSFIND ; And close it
|
JSR OSFIND ; And close it
|
||||||
KEYREAD1 LDA FXSOFTLEN
|
KEYREAD1 LDA FXSOFTLEN ; Soft key active?
|
||||||
BEQ KEYREAD2
|
BEQ KEYREAD2 ; No, skip past
|
||||||
LDX FXSOFTOFF ; SOFTKEYOFF
|
LDX FXSOFTOFF ; Get offset to current character
|
||||||
>>> RDMAIN
|
>>> RDMAIN
|
||||||
LDA FKEYBUF,X
|
LDA FKEYBUF,X ; Get it from mainmem
|
||||||
>>> RDAUX
|
>>> RDAUX
|
||||||
INC FXSOFTOFF ; SOFTKEYOFF
|
INC FXSOFTOFF ; Inc. offset
|
||||||
DEC FXSOFTLEN
|
DEC FXSOFTLEN ; Dec. counter
|
||||||
CLC
|
CLC
|
||||||
RTS
|
RTS
|
||||||
KEYREAD2 JSR KBDREAD ; Fetch character from KBD "buffer"
|
KEYREAD2 JSR KBDREAD ; Fetch character from KBD "buffer"
|
||||||
BCS KEYREADOK ; Nothing pending
|
BCS KEYREADOK ; Nothing pending
|
||||||
JSR EXTENDKBD ; Handle ADB Extended Keyboard f-keys
|
|
||||||
TAY ; Y=unmodified character
|
TAY ; Y=unmodified character
|
||||||
BPL KEYREADOK ; Not top-bit key
|
BPL KEYREADOK ; Not top-bit key
|
||||||
AND #$CF ; Drop Shift/Ctrl bits
|
AND #$CF ; Drop Shift/Ctrl bits
|
||||||
@ -576,11 +538,10 @@ KEYSOFTY TYA ; Get key including Shift/Ctrl
|
|||||||
CLC
|
CLC
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
|
|
||||||
* Expand soft key
|
* 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
|
KEYEXPAND TYA
|
||||||
AND #$0F ; Obtain F-key number
|
AND #$0F ; Obtain soft key number
|
||||||
TAX
|
TAX
|
||||||
PHX
|
PHX
|
||||||
JSR KEYSUMLENS ; Obtain starting offset
|
JSR KEYSUMLENS ; Obtain starting offset
|
||||||
@ -591,8 +552,6 @@ KEYEXPAND TYA
|
|||||||
>>> RDAUX
|
>>> RDAUX
|
||||||
STA FXSOFTLEN
|
STA FXSOFTLEN
|
||||||
RTS
|
RTS
|
||||||
* SOFTKEYOFF DB $00
|
|
||||||
|
|
||||||
|
|
||||||
* Process cursor keys
|
* Process cursor keys
|
||||||
KEYCURSOR CMP #$C9
|
KEYCURSOR CMP #$C9
|
||||||
@ -624,14 +583,18 @@ KEYCOPYTAB LDA FXTABCHAR ; Prepare TAB if no copy cursor
|
|||||||
* KBDREAD
|
* KBDREAD
|
||||||
************************
|
************************
|
||||||
* Test for and fetch key from keyboard
|
* Test for and fetch key from keyboard
|
||||||
|
* Updated for ADB keyboards
|
||||||
*
|
*
|
||||||
* On exit, CS=no keypress
|
* On exit, CS=no keypress
|
||||||
* CC=keypress
|
* CC=keypress
|
||||||
* A =keycode, X=corrupted
|
* A =keycode, X=corrupted
|
||||||
* Apple+Letter -> Ctrl+Letter
|
* Apple+Letter -> Ctrl+Letter
|
||||||
* Apple+Digits -> 80+x, 90+x, A0+x
|
* AppleL+digit -> 80+x
|
||||||
* TAB -> $C9
|
* AppleR+digit -> 90+x
|
||||||
* Cursors -> $CC-$CF
|
* AppleLR+digit -> A0+x
|
||||||
|
* TAB -> $C9
|
||||||
|
* Cursors -> $CC-$CF
|
||||||
|
* Keypad -> PADBASE+key
|
||||||
*
|
*
|
||||||
KBDREAD CLV ; VC=return keypress
|
KBDREAD CLV ; VC=return keypress
|
||||||
KBDTEST LDA KBDDATA ; VS here to test for 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
|
BCS KBDDONE ; No key pressed
|
||||||
BVS KBDDONE ; VS=test for keypress
|
BVS KBDDONE ; VS=test for keypress
|
||||||
STA KBDACK ; Ack. keypress
|
STA KBDACK ; Ack. keypress
|
||||||
KBDREAD2 BIT KBDAPPLFT
|
KBDREAD2 TAX ; X=raw keypress
|
||||||
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
|
|
||||||
*
|
*
|
||||||
KBDCUR15 LDA #$0D ; Convert RGT to $09
|
* Set FXKBDSTATE to %x0CS0000 from Alt or Shift keys
|
||||||
KBDTAB SBC #$04 ; Convert TAB to &C9
|
LDA KBDAPPRGT ; Right Apple/Alt pressed
|
||||||
KBDCURSR CLC
|
ASL A
|
||||||
ADC #$C4 ; Cursor keys $C0+x
|
LDA KBDAPPLFT ; Left Apple/Alt pressed
|
||||||
BRA KBDCHKESC
|
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
|
KBDREAD5 TXA ; A=raw keypress
|
||||||
KBDLALT CMP #$40 ; Left Apple key pressed
|
PLP
|
||||||
BCS KBDCTRL
|
BEQ KBDNOALT ; No ALTs pressed
|
||||||
|
*
|
||||||
|
KBDALT CMP #$40
|
||||||
|
BCS KBDCTRL ; 'A'+ Alt+letter ->Control code
|
||||||
CMP #$30
|
CMP #$30
|
||||||
BCC KBDCHKESC ; <'0'
|
BCC KBDCHKESC ; <'0' Alt+nondigit -> keep
|
||||||
CMP #$3A
|
CMP #$3A
|
||||||
BCS KBDCHKESC ; >'9'
|
BCS KBDCHKESC ; >'9' Alt+nondigit -> keep
|
||||||
KBDFUNC AND #$0F ; Convert Apple-Num to function key
|
ORA #$80 ; Alt+digit -> function key
|
||||||
ORA #$80
|
*
|
||||||
KBDFUNC2 BIT KBDAPPRGT
|
KBDREAD6 BPL KBDCHKESC ; Not a top-bit key
|
||||||
BPL KBDCHKESC ; Left+Digit -> $8x
|
KBDFUNC AND #$CF ; Clear Ctrl+Shift bits
|
||||||
ORA #$90 ; Right+Digit -> $9x
|
ORA FXKBDSTATE ; Add in Ctrl+Shift
|
||||||
BIT KBDAPPLFT
|
|
||||||
BPL KBDCHKESC
|
|
||||||
EOR #$30 ; Left+Right+Digit -> $Ax
|
|
||||||
BRA KBDCHKESC
|
|
||||||
|
|
||||||
KBDCTRL AND #$1F ; Apple-Letter -> Ctrl-Letter
|
|
||||||
*
|
*
|
||||||
* Test for Escape character
|
* Test for Escape character
|
||||||
KBDCHKESC TAX ; X=keycode
|
KBDCHKESC TAX ; X=processed keycode
|
||||||
EOR FXESCCHAR ; Current ESCAPE char?
|
EOR FXESCCHAR ; Current ESCAPE char?
|
||||||
ORA FXESCON ; Is ESCAPE an ASCII char?
|
ORA FXESCON ; Is ESCAPE an ASCII char?
|
||||||
BNE KBDNOESC ; Not ESCAPE or ESCAPE=ASCII
|
BNE KBDNOESC ; Not ESCAPE or ESCAPE=ASCII
|
||||||
@ -692,6 +681,24 @@ KBDNOESC TXA ; A=keycode
|
|||||||
CLC ; CLC=Ok
|
CLC ; CLC=Ok
|
||||||
KBDDONE RTS
|
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
|
* Poll the keyboard to update Escape state
|
||||||
* On exit, MI=Escape state pending
|
* On exit, MI=Escape state pending
|
||||||
|
Loading…
Reference in New Issue
Block a user