From 69790423f281506e9848bac505e6713998a7517a Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sat, 21 Aug 2021 17:53:18 -0400 Subject: [PATCH] JGH VDU driver fixes. Fixes ticket #38. --- applecorn.po | Bin 819200 -> 819200 bytes auxmem.chario.s | 206 +++++++++++++++++++++++++----------------------- auxmem.vdu.s | 119 +++++++++++++++++----------- 3 files changed, 181 insertions(+), 144 deletions(-) diff --git a/applecorn.po b/applecorn.po index c18c80f7deeaf2ae39182368abd84fd41301caae..2e305337311b45b467d2556841b3ab6f73c7179c 100644 GIT binary patch delta 10787 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 PID&-#Z;_BukbnL={c1S> delta 9062 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 diff --git a/auxmem.chario.s b/auxmem.chario.s index 343548d..c9f444d 100644 --- a/auxmem.chario.s +++ b/auxmem.chario.s @@ -1,8 +1,10 @@ * AUXMEM.CHARIO.S * (c) Bobbi 2021 GPLv3 * -* Applecorn kernel / Character I/O +* AppleMOS Character I/O +* KERNEL/CHARIO.S +***************** * Character read and write * * 14-Aug-2021 Flashing cursor and INKEY sync'd to frame rate @@ -12,14 +14,19 @@ * 16-Aug-2021 Copy cursor and Edit cursor visible. * 17-Aug-2021 OSBYTE 4 for cursors, OSBYTE 221-228 for topbit * keys. -* *BUGS* INKEY doesn't restore cursor on timeout. -* KBDREAD has several paths that don't test ESCCHAR. -* If screen scrolls, copy cursor on wrong line +* 21-Aug-2021 FIXED: If screen scrolls, copy cursor ends on +* wrong line. +* FIXED: KBDREAD has several paths that don't +* test ESCHAR. +* FIXED: INKEY doesn't restore cursor on timeout. +* The three separate cursors can be set seperately. -* TEMP: + +* TEMP, move to VDU.S FLASHER EQU $290 CURSOR EQU $291 CURSORED EQU $292 +CURSORCP EQU $293 OLDCHAR EQU $294 COPYCHAR EQU $295 @@ -28,25 +35,12 @@ FXESCCHAR EQU BYTEVARBASE+220 FXKEYBASE EQU BYTEVARBASE+221 FXESCON EQU BYTEVARBASE+229 FXESCEFFECT EQU BYTEVARBASE+230 +FX200VAR EQU BYTEVARBASE+200 FX254VAR EQU BYTEVARBASE+254 FX2VAR EQU BYTEVARBASE+$B1 FX3VAR EQU BYTEVARBASE+$EC FX4VAR EQU BYTEVARBASE+$ED -* TEMP as no *KEY -* Default keyboard OSBYTE variables -DEFBYTELOW EQU 219 ; First default OSBYTE value -DEFBYTE DB $09,$1B ; Default key codes - DB $C0,$D0,$E0,$F0 ; Default key expansion - DB $80,$90,$A0,$B0 ; Default key expansion -DEFBYTEEND - -KBDINIT LDX #DEFBYTEEND-DEFBYTE-1 -:INITPG3 LDA DEFBYTE,X ; Initialize OSBYTE vars - STA BYTEVARBASE+DEFBYTELOW,X - DEX - BPL :INITPG3 - RTS * OSWRCH handler **************** @@ -65,6 +59,33 @@ WRCHHND PHA PLA RTS + +* Character Input +***************** +* Default keyboard OSBYTE variables +*DEFBYTELOW EQU 219 ; First default OSBYTE value +*DEFBYTE DB $09,$1B ; Default key codes +* DB $01,$D0,$E0,$F0 ; Default key expansion +* DB $01,$80,$90,$00 ; Default key expansion +*DEFBYTEEND + +* TEMP as no *KEY +* Default keyboard OSBYTE variables +DEFBYTELOW EQU 219 ; First default OSBYTE value +DEFBYTE DB $09,$1B ; Default key codes + DB $C0,$D0,$E0,$F0 ; Default key expansion + DB $80,$90,$A0,$B0 ; Default key expansion +DEFBYTEEND + +KBDINIT LDX #DEFBYTEEND-DEFBYTE-1 +:KBDINITLP LDA DEFBYTE,X ; Initialise KBD OSBYTE variables + STA BYTEVARBASE+DEFBYTELOW,X + DEX + BPL :KBDINITLP + LDA #$C0 + STA FX254VAR ; Also returns default MODE=0 + RTS + * OSRDCH/INKEY handler ********************** * Read a character from current input @@ -74,17 +95,6 @@ WRCHHND PHA RDCHHND LDA #$80 ; flag=wait forever PHY TAY -* TEST - LDA FXESCCHAR - BNE INKEYGO -* LDA #'_' -* STA CURSOR -* LDA #$A0 -* STA CURSORED -* ^ moved to VDU.S - LDA #$1B - STA FXESCCHAR -* TEST BRA INKEYGO ; Wait forever for input ; XY<$8000 - wait for a keypress @@ -92,7 +102,7 @@ INKEY PHY ; Dummy PHY to balance RDCH INKEYGO PHX ; Save registers PHY ; - BIT VDUSTATUS + BIT VDUSTATUS ; Enable editing cursor BVC INKEYGO2 ; No editing cursor JSR GETCHRC ; Get character under cursor STA COPYCHAR ; Save char under edit cursor @@ -102,20 +112,6 @@ INKEYGO PHX ; Save registers INKEYGO2 JSR GETCHRC ; Get character under cursor STA OLDCHAR ; - -;* This can be optimised -; JSR GETCHRC ; Get character under cursor -; STA OLDCHAR -; BIT VDUSTATUS -; BVC INKEYGO2 ; No editing cursor -; STA COPYCHAR ; Save char under edit cursor -; LDA CURSORED -; JSR PUTCHRC ; Display edit cursor -; JSR COPYSWAP1 ; Swap to copy cursor -; JSR GETCHRC ; Get character under copy cursor -; STA OLDCHAR -;* -;INKEYGO2 CLI BRA INKEY1 ; Turn cursor on ; @@ -134,6 +130,9 @@ INKEY0 ADC FLASHER BIT FLASHER BMI INKEY2 ; Remove cursor INKEY1 LDA CURSOR ; Add cursor + BIT VDUSTATUS + BVC INKEY2 + LDA CURSORCP INKEY2 JSR PUTCHRC ; Toggle cursor INKEY3 LDA ESCFLAG BMI INKEYOK ; Escape pending, return it @@ -159,36 +158,31 @@ INKEYDEC DEX BNE INKEYLP1 ; Not 0, loop back TYA BNE INKEYLP1 ; Not 0, loop back +; + PHY + JSR INKEYOFF ; Restore cursors + PLY +; DEY ; Y=$FF TYA ; A=$FF PLX ; Drop dummy PHY - RTS ; CS from above + SEC + RTS ; Timeout: CS, AY=$FFFF, becomes XY=$FFFF INKEYOK PHA ; - LDA OLDCHAR - JSR PUTCHRC ; Remove cursor - BIT VDUSTATUS - BVC INKEYOK2 ; No editing cursor - JSR COPYSWAP1 ; Swap cursor back - LDA COPYCHAR - JSR PUTCHRC ; Remove edit cursor -INKEYOK2 + JSR INKEYOFF ; Restore cursors ; -;* This can be optimised -; BIT VDUSTATUS -; BVC INKEYOK2 ; No editing cursor -; LDA OLDCHAR -; JSR PUTCHRC ; Remove copy cursor -; JSR COPYSWAP1 ; Swap cursor back -; LDA COPYCHAR -; BRA INKEYOK3 ; Restore char under edit cursor -;* -;INKEYOK2 LDA OLDCHAR ; and swap cursor back -;INKEYOK3 JSR PUTCHRC ; Remove edit cursor +* LDA OLDCHAR ; Remove editing cursor +* JSR PUTCHRC ; Remove cursor +* BIT VDUSTATUS +* BVC INKEYOK2 ; No editing cursor +* JSR COPYSWAP1 ; Swap cursor back +* LDA COPYCHAR +* JSR PUTCHRC ; Remove edit cursor ; - PLA +INKEYOK2 PLA PLY ; <$80=INKEY or $80=RDCH PLX ; Restore X PLY ; <$80=INKEY or restore=RDCH @@ -197,9 +191,16 @@ INKEYOK2 ASL A ; Cy=Escape flag PLA ; Get char back RTS -; Character read: CC, A=char, X=???, Y<$80 -; Escape: CS, A=?? , X=???, Y<$80 +* Character read: CC, A=char, X=???, Y<$80 +* Escape: CS, A=?? , X=???, Y<$80 +INKEYOFF LDA OLDCHAR ; Remove editing cursor + BIT VDUSTATUS + BVC INKEYOFF2 ; No editing cursor + JSR PUTCHRC ; Remove cursor + JSR COPYSWAP1 ; Swap cursor back + LDA COPYCHAR ; Remove edit cursor +INKEYOFF2 JMP PUTCHRC BYTE81 TYA BMI NEGINKEY ; XY<0, scan for keypress @@ -218,9 +219,12 @@ BYTE81DONE RTS * Y=$1B, X=???, CS - escape * Y=$00, X=char, CC - keypress -NEGINKEY LDX #$00 ; Unimplemented +NEGINKEY CPX #$01 + LDX #$00 ; Unimplemented LDY #$00 - CLC + BCS NEGINKEY0 + LDX #$20 ; INKEY-256 +NEGINKEY0 CLC RTS @@ -228,7 +232,7 @@ NEGINKEY LDX #$00 ; Unimplemented ******************* * KEYREAD -************************* +************************ * Test for and read from input, * expanding keyboard special keys * @@ -308,8 +312,6 @@ KEYSOFT TYA * Process cursor keys KEYCURSOR CMP #$C9 BEQ KEYCOPY -; CMP #$CC -; BCC KEYREADOK ; Not cursor key PHA LDA OLDCHAR JSR PUTCHRC ; Remove cursor @@ -335,7 +337,7 @@ KEYCOPY LDA FXTABCHAR ; Prepare TAB if no copy cursor * KBDREAD -************************* +************************ * Test for and fetch key from keyboard * * On exit, CS=no keypress @@ -358,46 +360,50 @@ KBDTEST LDA $C000 ; VS here to test for keypress BIT $C062 BMI KBDRALT ; Right Apple pressed CMP #$09 - BEQ KBDTAB ; + BEQ KBDTAB ; TAB is dual action TAB/COPY CMP #$08 - BCC KBDESC ; <$08 not cursor key + BCC KBDCHKESC ; <$08 not cursor key CMP #$0C - BCC KBDCURSR + BCC KBDCURSR ; $08-$0B are cursor keys CMP #$15 - BEQ KBDCUR15 -* Test for Escape key -KBDESC CMP FXESCCHAR ; Current ESCAPE char? -* CMP #27 ; TEMP - BNE KBDNOESC ; No - LDX FXESCON ; Is ESCAPE enabled? - BNE KBDNOESC ; No - ROR ESCFLAG ; Set Escape flag -KBDNOESC CLC ; CLC=Ok -KBDDONE RTS + 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 KBDCHKESC KBDRALT ; Right Apple key pressed KBDLALT CMP #$40 ; Left Apple key pressed BCS KBDCTRL CMP #$30 - BCC KBDFUNOK ; <'0' + BCC KBDCHKESC ; <'0' CMP #$3A - BCS KBDOK ; >'9' + BCS KBDCHKESC ; >'9' KBDFUNC AND #$0F ; Convert Apple-Num to function key ORA #$80 BIT $C062 - BPL KBDFUNOK ; Left+Digit -> $8x + BPL KBDCHKESC ; Left+Digit -> $8x ORA #$90 ; Right+Digit -> $9x BIT $C061 - BPL KBDFUNOK + BPL KBDCHKESC EOR #$30 ; Left+Right+Digit -> $Ax -KBDFUNOK RTS + BRA KBDCHKESC + KBDCTRL AND #$1F ; Apple-Letter -> Ctrl-Letter -KBDOK CLC - RTS - -KBDTAB LDA #$11 ; Convert TAB to $C9, expanded later -KBDCUR15 SBC #$0C ; Convert RGT to $09 -KBDCURSR CLC - ADC #$C4 ; Cursor keys $CC-$CF - RTS ; CLC=Ok set earlier +; +* Test for Escape key +KBDCHKESC TAX ; X=keycode + EOR FXESCCHAR ; Current ESCAPE char? + ORA FXESCON ; Is ESCAPE an ASCII char? + BNE KBDNOESC ; Not ESCAPE or ESCAPE=ASCII + LDA FX200VAR ; Is ESCAPE ignored? + LSR A ; Check bit 0 + BCS KBDDONE ; ESCAPE completely ignored + SEC + ROR ESCFLAG ; Set Escape flag +KBDNOESC TXA ; A=keycode + CLC ; CLC=Ok +KBDDONE RTS diff --git a/auxmem.vdu.s b/auxmem.vdu.s index 2bbb3ce..93a2d96 100644 --- a/auxmem.vdu.s +++ b/auxmem.vdu.s @@ -1,12 +1,15 @@ * VDU.S -**************************************************** +* (c) Bobbi 2021 GPLv3 +* * Apple //e VDU Driver for 40/80 column mode (PAGE2) -**************************************************** + * * 15-Aug-2021 Optimised address calculations and PRCHRC. * Entry point to move copy cursor. * Start to consolidate VDU workspace. * 16-Aug-2021 Added COPY cursor handling. +* 21-Aug-2021 CHR$(&80+n) is inverse of CHR$(&00+n) +* 21-Aug-2021 If screen scrolls, copy cursor adjusted. ********************************** @@ -18,25 +21,25 @@ VDUSTATUS EQU $D0 ; $D0 VDU status VDUZP1 EQU VDUSTATUS+1 ; $D1 * VDUTEXTX EQU VDUSTATUS+2 ; $D2 text column * VDUTEXTY EQU VDUSTATUS+3 ; $D3 text row -VDUADDR EQU VDUSTATUS+4 ; $D4 address of current char cell +VDUADDR EQU VDUSTATUS+4 ; $D4 addr of current char cell FXVDUQLEN EQU $D1 ; TEMP HACK VDUCHAR EQU $D6 ; TEMP HACK VDUQ EQU $D7 ; TEMP HACK * VDUVARS -* VDUTEXTX EQU $250+0 ; text X coord -* VDUTEXTY EQU $250+1 ; text Y coord +* VDUTEXTX EQU $2A0+0 ; text X coord +* VDUTEXTY EQU $2A0+1 ; text Y coord VDUTEXTX EQU COL VDUTEXTY EQU ROW -VDUCOPYX EQU $250+2 ; copy cursor X coord -VDUCOPYY EQU $250+3 ; copy cursor Y coord -* VDUCOPYCHR EQU $260+0 ; char underneath cursor when copying +VDUCOPYX EQU $2A0+2 ; copy cursor X coord +VDUCOPYY EQU $2A0+3 ; copy cursor Y coord +* VDUCOPYCHR EQU $2A0+0 ; char underneath cursor when copying -* VDUCURSOR EQU $250+4 ; cursor character -* VDUMODE EQU $250+5 ; current MODE -* VDUCHAR EQU $250+6 ; VDU command, 1 byte -* VDUQ EQU $250+7 ; VDU sequence, 9 bytes +* VDUCURSOR EQU $2A0+4 ; cursor character +VDUMODE EQU $2A0+5 ; current MODE +* VDUCHAR EQU $2A0+6 ; VDU command, 1 byte +* VDUQ EQU $2A0+7 ; VDU sequence, 9 bytes * KBD or VDU? * FLASHER ; flash counter for cursor @@ -65,19 +68,19 @@ COPYMOVE2 PLA ORA #8 COPYMOVE3 JMP OUTCHARGO ; Move edit cursor -;* Turn editing cursor on/off -;COPYCURSOR BIT VDUSTATUS -; BVC COPYSWAP4 ; Copy cursor not active -; PHP ; Save CS=Turn On, CC=Turn Off -; JSR COPYSWAP1 ; Swap to edit cursor -; LDA COPYCHAR ; Prepare to turn edit cursor off -; PLP -; BCC COPYCURS2 ; Restore character -;COPYCURS1 JSR GETCHRC ; Get character under edit cursor -; STA COPYCHAR -; LDA #$A0 ; Output edit cursor -;COPYCURS2 JSR PUTCHRC -;* ; Drop through to swap back +* Turn editing cursor on/off +*COPYCURSOR BIT VDUSTATUS +* BVC COPYSWAP4 ; Copy cursor not active +* PHP ; Save CS=Turn On, CC=Turn Off +* JSR COPYSWAP1 ; Swap to edit cursor +* LDA COPYCHAR ; Prepare to turn edit cursor off +* PLP +* BCC COPYCURS2 ; Restore character +*COPYCURS1 JSR GETCHRC ; Get character under edit cursor +* STA COPYCHAR +* LDA #$A0 ; Output edit cursor +*COPYCURS2 JSR PUTCHRC +* ; Drop through to swap back * Swap between edit and copy cursors ;COPYSWAP BIT VDUSTATUS @@ -126,9 +129,10 @@ CLREOL LDA ROW * Clear the screen VDUINIT STA $C00F LDA #'_' - STA CURSOR + STA CURSOR ; Normal cursor + STA CURSORCP ; Copy cursor when editing LDA #$A0 - STA CURSORED + STA CURSORED ; Edit cursor when editing CLEAR STZ ROW STZ COL :L1 JSR CLREOL @@ -166,7 +170,7 @@ PRCHRC PHA ; Save character LDA $C000 BPL :RESUME ; No key pressed EOR #$80 -:PAUSE1 JSR KBDESC ; Ask KBD to test if Escape +:PAUSE1 JSR KBDCHKESC ; Ask KBD to test if Escape BIT ESCFLAG BMI :RESUMEACK ; Escape, skip pausing CMP #$13 @@ -177,35 +181,41 @@ PRCHRC PHA ; Save character EOR #$80 CMP #$11 ; Ctrl-Q BEQ :RESUMEACK ; Stop pausing - JSR KBDESC ; Ask KBD to test if Escape + JSR KBDCHKESC ; Ask KBD to test if Escape BIT ESCFLAG BPL :PAUSE2 ; No Escape, keep pausing :RESUMEACK STA $C010 ; Ack. keypress :RESUME PLA * Put character to screen -PUTCHRC PHA -PRCHR5 JSR CHARADDR ; Find character address +PUTCHRC EOR #$80 ; Convert character + TAY + AND #$A0 + BNE PRCHR4 + TYA + EOR #$40 + TAY +PRCHR4 PHY + JSR CHARADDR ; Find character address PLA ; Get character back PHP ; Disable IRQs while SEI ; toggling memory BCC PRCHR6 ; Aux memory STA $C004 ; Switch to main memory -PRCHR6 EOR #$80 ; Convert character - STA (VDUADDR),Y ; Store it +PRCHR6 STA (VDUADDR),Y ; Store it STA $C005 ; Back to aux memory PLP ; Restore IRQs RTS * PHA -* LDA $C000 ; Kbd data/strobe +* LDA $C000 ; Kbd data/strobe * BMI :KEYHIT * :RESUME LDA ROW * ASL * TAX -* LDA SCNTAB,X ; LSB of row address +* LDA SCNTAB,X ; LSB of row address * STA ZP1 -* LDA SCNTAB+1,X ; MSB of row address +* LDA SCNTAB+1,X ; MSB of row address * STA ZP1+1 * LDA COL * BIT $C01F @@ -248,7 +258,14 @@ GETCHRC JSR CHARADDR ; Find character address GETCHR6 LDA (VDUADDR),Y ; Get character STA $C003 ; Back to aux memory PLP ; Restore IRQs - EOR #$80 ; Convert character + TAY ; Convert character + AND #$A0 + BNE GETCHR7 + TYA + EOR #$40 + TAY +GETCHR7 TYA + EOR #$80 TAX ; X=char for OSBYTE LDY #$00 BIT $C01F @@ -268,11 +285,11 @@ GETCHROK RTS * BPL :S1A ; 40-col * LSR * BCC :S1 -*:S1A STA $C002 ; Read main memory +*:S1A STA $C002 ; Read main memory *:S1 TAY * LDA (ZP1),Y * EOR #$80 -* STA $C003 ; Read aux mem again +* STA $C003 ; Read aux mem again * TAX * LDY #$00 * BIT $C01F @@ -375,7 +392,6 @@ OUTCHARGO CMP #$00 ; NULL BNE :T5 LDA ROW CMP #23 -* BEQ SCROLL ; BOBBI BEQ :TOSCROLL ; JGH INC ROW :IDONE RTS @@ -401,18 +417,19 @@ OUTCHARGO CMP #$00 ; NULL CMP #$16 ; MODE BNE :T8 LDA VDUQ+8 + STA VDUMODE EOR #$07 AND #$01 TAX STA $C00C,X :T7A JSR CLEAR -; BRA :IDONE +* BRA :IDONE RTS :T8 CMP #$1E ; Home BNE :T9 STZ ROW STZ COL -; BRA :IDONE +* BRA :IDONE RTS :T9 CMP #$1F ; TAB @@ -437,7 +454,15 @@ OUTCHARGO CMP #$00 ; NULL RTS :T10 CMP #$20 BCC :IDONE - JSR PRCHRC ; Store char, checking keypress + CMP #$80 + BCC :T10A + CMP #$A0 + BCS :T10A + LDX VDUMODE + CPX #$07 + BNE :T10A + LDA #$20 +:T10A JSR PRCHRC ; Store char, checking keypress * Perform cursor right operation VDU09 LDA COL @@ -470,7 +495,13 @@ SCROLLER LDA #$00 INC CMP #23 BNE :L1 - RTS + BIT VDUSTATUS + BVC :L2 ; Copy cursor not active + JSR COPYSWAP1 + LDA #11 + JSR OUTCHARGO + JSR COPYSWAP1 +:L2 RTS * Copy line A+1 to line A SCR1LINE ASL ; Dest addr->ZP1