mirror of
https://github.com/bobbimanners/Applecorn.git
synced 2024-06-02 11:41:30 +00:00
JGH: Beginnings of copy cursor support.
This commit is contained in:
parent
1e5b283144
commit
08f006d607
BIN
applecorn.po
BIN
applecorn.po
Binary file not shown.
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
253
auxmem.vdu.s
253
auxmem.vdu.s
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user