JGH: Beginnings of copy cursor support.

This commit is contained in:
Bobbi Webber-Manners 2021-08-14 22:34:02 -04:00
parent 1e5b283144
commit 08f006d607
4 changed files with 232 additions and 80 deletions

Binary file not shown.

View File

@ -6,10 +6,10 @@
*****************
* Character read and write
*
* 14-Aug-2021 Flashing cursor and INKEY sync'd to frame
* rate with VBLK. Ensured cursor turned on
* straightaway.
* 14-Aug-2021 Flashing cursor and INKEY sync'd to frame rate
* with VBLK. Ensured cursor turned on straight away.
* 15-Aug-2021 Cursor keys move copy cursor, copy reads char.
* Copy cursor not visible yet.
* TEMP:
FXESCCHAR EQU $240
@ -64,6 +64,7 @@ INKEYGO PHX ; Save registers
;
INKEYLP1 PHX
INKEYLP2 PHY
* TO DO: display copy cursor as well
INKEYLP INC FLASHER ; Increment cursor counter
INC FLASHER
* INC FLASHER ; Fast flash
@ -75,12 +76,12 @@ INKEYLP INC FLASHER ; Increment cursor counter
BIT FLASHER
BMI INKEY2 ; Remove cursor
INKEY1 LDA CURSOR ; Add cursor
INKEY2 JSR PRCHRC ; Toggle cursor
INKEY2 JSR PUTCHRC ; Toggle cursor
INKEY3 LDA ESCFLAG
BMI INKEYOK ; Escape pending, return it
INKEY4 JSR KEYREAD ; Test for input, all can be trashed
BCC INKEYOK ; Char returned, return it
* JSR DELAY ; Wait 1/100sec
* JSR DELAY ; Wait 1/100sec
;
* VBLK pulses at 50Hz, changes at 100Hz
* (60Hz in US, will need tweeking)
@ -109,7 +110,7 @@ INKEYDEC DEX
INKEYOK PHA
LDA OLDCHAR
JSR PRCHRC ; Remove cursor
JSR PUTCHRC ; Remove cursor
PLA
PLY ; <$80=INKEY or $80=RDCH
PLX ; Restore X
@ -161,10 +162,30 @@ KEYREAD
* TO DO: check *EXEC source
* TO DO: expand current soft key
JSR KBDREAD ; Fetch character from KBD "buffer"
BCS KEYREAD0 ; Nothing pending
* TO DO: process cursor keys
BCS KEYREADOK ; Nothing pending
* TO DO: process new soft keys
KEYREAD0 RTS
*
* Process cursor keys
* TO DO: check FX4VAR
CMP #$C9
BEQ KEYCOPY
CMP #$CC
BCC KEYREADOK ; Not cursor key
JSR MOVECOPY ; Move copy cursor
KEYCOPYBAD SEC
KEYREADOK RTS
KEYCOPY AND #$0F ; TAB=$09 if no copy cursor
BIT VDUSTATUS
BVC KEYCOPYOK ; No copy cursor
JSR COPYSWAP ; Swap to copy cursor
JSR GETCHRC ; Get the character
PHA
JSR MOVECOPY3 ; Move copy cursor, swap back
PLA
BEQ KEYCOPYBAD ; Bad character read
KEYCOPYOK CLC
RTS ; Return the character
* KBDREAD
@ -198,8 +219,9 @@ KBDTEST LDA $C000 ; VS here to test for keypress
BCC KBDCURSR
CMP #$15
BEQ KBDCUR15
CMP #27 ; TEMP
* CMP FXESCCHAR ; Current ESCAPE char?
* Test for Escape key
KBDESC CMP #27 ; TEMP
* CMP FXESCCHAR ; Current ESCAPE char?
BNE KBDNOESC ; No
LDX FXESCON ; Is ESCAPE enabled?
BNE KBDNOESC ; No
@ -233,3 +255,5 @@ KBDCURSR CLC
ADC #$C4 ; Cursor keys $CC-$CF
RTS ; CLC=Ok set earlier

View File

@ -8,8 +8,10 @@ ZP2 EQU $92
ZP3 EQU $94
ROW EQU $96 ; Cursor row
COL EQU $97 ; Cursor column
* COL,ROW needs to be in X,Y order
* TO DO: will be moved to VDU space
COL EQU $96 ; Cursor column
ROW EQU $97 ; Cursor row
STRTBCKL EQU $9D
STRTBCKH EQU $9E
@ -135,6 +137,9 @@ MOSINIT LDX #$FF ; Initialize Alt SP to $1FF
LDA #$01 ; $01=Entering application code
JMP AUXADDR ; Start Acorn ROM
* No return
:HELLO ASC 'Applecorn MOS v0.01'
:HELLO DB $07
ASC 'Applecorn MOS v0.01'
DB $0D,$0D,$00

View File

@ -2,6 +2,11 @@
****************************************************
* 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.
**********************************
* VDU DRIVER WORKSPACE LOCATIONS *
@ -10,14 +15,61 @@
VDUSTATUS EQU $D0 ; $D0 VDU status
VDUZP1 EQU VDUSTATUS+1 ; $D1
VDUCOL EQU VDUSTATUS+2 ; $D2 text column
VDUROW EQU VDUSTATUS+3 ; $D3 text row
* VDUTEXTX EQU VDUSTATUS+2 ; $D2 text column
* VDUTEXTY EQU VDUSTATUS+3 ; $D3 text row
VDUADDR EQU VDUSTATUS+4 ; $D4 address 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 COL
VDUTEXTY EQU ROW
VDUCOPYX EQU $250+2 ; copy cursor X coord
VDUCOPYY EQU $250+3 ; copy cursor Y coord
* 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
* KBD or VDU?
* FLASHER ; flash counter for cursor
* OLDCHAR ; character under cursor
* CURSOR ; character used for cursor
* Move editing cursor
* A=cursor key
MOVECOPY PHA
BIT VDUSTATUS
BVS MOVECOPY2 ; Edit cursor already on
LDX #1
MOVECOPY1 LDA VDUTEXTX,X ; Initialise copy cursor
STA VDUCOPYX,X
DEX
BPL MOVECOPY1
LDA #$40
ORA VDUSTATUS
STA VDUSTATUS ; Turn edit cursor on
MOVECOPY2 JSR COPYSWAP ; Use edit cursor
PLA
AND #3
ORA #8
MOVECOPY3 JSR OUTCHARGO ; Move edit cursor
* JSR CHARADDR ; Get character address
* ; Swap cursors back
COPYSWAP LDX #1
COPYSWAPLP LDY VDUCOPYX,X
LDA VDUTEXTX,X
STA VDUCOPYX,X
TYA
STA VDUTEXTX,X
DEX
BPL COPYSWAPLP
RTS
* Clear to EOL
CLREOL LDA ROW
@ -60,73 +112,144 @@ CLEAR STZ ROW
STZ COL
RTS
* Print char in A at ROW,COL
PRCHRC PHA
LDA $C000 ; Kbd data/strobe
BMI :KEYHIT
:RESUME LDA ROW
* Calculate character address
CHARADDR LDA VDUTEXTY
ASL
TAX
LDA SCNTAB,X ; LSB of row address
STA ZP1
LDA SCNTAB+0,X ; LSB of row address
STA VDUADDR+0
LDA SCNTAB+1,X ; MSB of row address
STA ZP1+1
LDA COL
STA VDUADDR+1
LDA VDUTEXTX
BIT $C01F
BPL :S1A ; 40-col
LSR
BCC :S1
:S1A >>> WRTMAIN
:S1 TAY
PLA
EOR #$80
STA (ZP1),Y ; Screen address
>>> WRTAUX
SEC
BPL CHARADDR40 ; 40-col
LSR A
CHARADDR40 TAY ; Y=offset into this row
RTS
:KEYHIT STA $C010 ; Clear strobe
AND #$7F
CMP #$13 ; Ctrl-S
BEQ :PAUSE
CMP #$1B ; Esc
BNE :RESUME
:ESC SEC
ROR ESCFLAG ; Set ESCFLAG
BRA :RESUME
:PAUSE STA $C010 ; Clear strobe
:L1 LDA $C000 ; Kbd data/strobe
BPL :L1
AND #$7F
* (VDUADDR),Y=>character address
* CC=auxmem
* CS=mainmem
* Print char in A at ROW,COL
PRCHRC PHA ; Save character
LDA $C000
BPL :RESUME ; No key pressed
EOR #$80
:PAUSE1 JSR KBDESC ; Ask KBD to test if Escape
BIT ESCFLAG
BMI :RESUMEACK ; Escape, skip pausing
CMP #$13
BNE :RESUME ; Not Ctrl-S
STA $C010 ; Ack. keypress
:PAUSE2 LDA $C000
BPL :PAUSE2 ; Loop until keypress
EOR #$80
CMP #$11 ; Ctrl-Q
BEQ :RESUME
CMP #$1B ; Esc
BEQ :ESC
BRA :PAUSE
BEQ :RESUMEACK ; Stop pausing
JSR KBDESC ; 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
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
STA $C005 ; Back to aux memory
PLP ; Restore IRQs
RTS
* PHA
* LDA $C000 ; Kbd data/strobe
* BMI :KEYHIT
* :RESUME LDA ROW
* ASL
* TAX
* LDA SCNTAB,X ; LSB of row address
* STA ZP1
* LDA SCNTAB+1,X ; MSB of row address
* STA ZP1+1
* LDA COL
* BIT $C01F
* BPL :S1A ; 40-col
* LSR
* BCC :S1
*:S1A >>> WRTMAIN
*:S1 TAY
* PLA
* EOR #$80
* STA (ZP1),Y ; Screen address
* >>> WRTAUX
* RTS
*:KEYHIT STA $C010 ; Clear strobe
* AND #$7F
* CMP #$13 ; Ctrl-S
* BEQ :PAUSE
* CMP #$1B ; Esc
* BNE :RESUME
*:ESC SEC
* ROR ESCFLAG ; Set ESCFLAG
* BRA :RESUME
*:PAUSE STA $C010 ; Clear strobe
*:L1 LDA $C000 ; Kbd data/strobe
* BPL :L1
* AND #$7F
* CMP #$11 ; Ctrl-Q
* BEQ :RESUME
* CMP #$1B ; Esc
* BEQ :ESC
* BRA :PAUSE
* Return char at ROW,COL in A and X, MODE in Y
BYTE87
GETCHRC LDA ROW
ASL
TAX
LDA SCNTAB,X
STA ZP1
LDA SCNTAB+1,X
STA ZP1+1
LDA COL
BIT $C01F
BPL :S1A ; 40-col
LSR
BCC :S1
:S1A STA $C002 ; Read main memory
:S1 TAY
LDA (ZP1),Y
EOR #$80
STA $C003 ; Read aux mem again
TAX
GETCHRC JSR CHARADDR ; Find character address
PHP ; Disable IRQs while
SEI ; toggling memory
BCC GETCHR6 ; Aux memory
STA $C002 ; Switch to main memory
GETCHR6 LDA (VDUADDR),Y ; Get character
STA $C003 ; Back to aux memory
PLP ; Restore IRQs
EOR #$80 ; Convert character
TAX ; X=char for OSBYTE
LDY #$00
BIT $C01F
BMI :GETCHOK
INY
:GETCHOK RTS
BMI GETCHROK
INY ; Y=MODE
GETCHROK RTS
*GETCHRC LDA ROW
* ASL
* TAX
* LDA SCNTAB,X
* STA ZP1
* LDA SCNTAB+1,X
* STA ZP1+1
* LDA COL
* BIT $C01F
* BPL :S1A ; 40-col
* LSR
* BCC :S1
*:S1A STA $C002 ; Read main memory
*:S1 TAY
* LDA (ZP1),Y
* EOR #$80
* STA $C003 ; Read aux mem again
* TAX
* LDY #$00
* BIT $C01F
* BMI :GETCHOK
* INY
*:GETCHOK RTS
BYTE86 LDY ROW ; $86 = read cursor pos
LDX COL
@ -144,8 +267,8 @@ DELETE JSR BACKSPC
* LDA #79
* STA COL
:S2 LDA #' '
JSR PRCHRC
:S3 RTS
JMP PUTCHRC
*:S3 RTS
* Perform backspace/cursor left operation
BACKSPC LDA COL
@ -235,12 +358,14 @@ OUTCHARGO CMP #$00 ; NULL
BRA :IDONE
:T6 CMP #$0D ; Carriage return
BNE :T7
* JSR CLREOL
LDA #$BF
AND VDUSTATUS
STA VDUSTATUS ; Turn copy cursor off
STZ COL
BRA :IDONE
:T7 CMP #$0C ; Ctrl-L
BEQ :T7A
CMP #$16
CMP #$16 ; MODE
BNE :T8
LDA VDUQ+8
EOR #$07
@ -260,7 +385,7 @@ OUTCHARGO CMP #$00 ; NULL
BRA :IDONE
:T10 CMP #$20
BCC :IDONE
JSR PRCHRC
JSR PRCHRC ; Store char, checking keypress
* Perform cursor right operation
VDU09 LDA COL
@ -327,5 +452,3 @@ SCNTAB DW $800,$880,$900,$980,$A00,$A80,$B00,$B80
DW $828,$8A8,$928,$9A8,$A28,$AA8,$B28,$BA8
DW $850,$8D0,$950,$9D0,$A50,$AD0,$B50,$BD0