Merged JGH 'More preparation for VDU update' PR

This commit is contained in:
Bobbi Webber-Manners 2021-09-05 06:50:04 -04:00
parent 7ce731f614
commit acba233489
6 changed files with 199 additions and 177 deletions

Binary file not shown.

View File

@ -4,6 +4,8 @@
* Applecorn OSBYTE and OSWORD handlers
*
* 15-Aug-2021 Added 'set variable' OSBYTEs 1-6
* 02-Sep-2021 OSWORD 5 can read from Main Memory ROM
* 04-Sep-2021 Extended VDU table to add $75 and $A0 for VDU driver
XC ; 65c02
@ -14,17 +16,30 @@
BYTEVARBASE EQU $190 ; Base of OSBYTE variables
BYTWRDADDR DW BYTE00 ; OSBYTE 0 - Machine host
BYTWRDADDR DW BYTE00XX ; OSBYTE 0 - Machine host
DW BYTE01 ; OSBYTE 1 - User flag
DW BYTE02 ; OSBYTE 2 - OSRDCH source
DW BYTE03 ; OSBYTE 3 - OSWRCH dest
DW BYTE04 ; OSBYTE 4 - Cursor keys
DW BYTE05 ; OSBYTE 5 - Printer destination
DW BYTE06 ; OSBYTE 6 - Printer ignore
DW BYTENULL ; OSBYTE 7 - Serial Rx Speed
DW BYTENULL ; OSBYTE 8 - Serial Tx Speed
DW BYTENULL ; OSBYTE 9 - Flash period space
DW BYTENULL ; OSBYTE 10 - Flash period mark
DW BYTENULL ; OSBYTE 11 - Autorepeat delay
DW BYTENULL ; OSBYTE 12 - Autorepeat repeat
BYTWRDLOW
BYTESZLO EQU BYTWRDLOW-BYTWRDADDR
BYTELOW EQU BYTESZLO/2-1 ; Maximum low OSBYTE
BYTEHIGH EQU $7C ; First high OSBYTE
BYTEHIGH EQU $75 ; First high OSBYTE
DW BYTE75 ; OSBYTE 117 - Read VDU status
DW BYTE76 ; OSBYTE 118 - Update keyboard LEDs
DW BYTENULL ; OSBYTE 119
DW BYTENULL ; OSBYTE 120
DW BYTENULL ; OSBYTE 121
DW BYTENULL ; OSBYTE 122
DW BYTENULL ; OSBYTE 123
DW BYTE7C ; OSBYTE 124 - Clear Escape
DW BYTE7D ; OSBYTE 125 - Set Escape
DW BYTE7E ; OSBYTE 126 - Ack. Escape
@ -38,13 +53,30 @@ BYTEHIGH EQU $7C ; First high OSBYTE
DW BYTE86 ; OSBYTE 134 - POS, VPOS - VDU.s
DW BYTE87 ; OSBYTE 135 - Character, MODE - VDU.s
DW BYTE88 ; OSBYTE 136 - *CODE
DW BYTE89 ; OSBYTE 137 - *MOTOR
DW BYTE8A ; OSBYTE 138 - Buffer insert
DW BYTENULL ; OSBYTE 137 - *MOTOR
DW BYTENULL ; OSBYTE 138 - Buffer insert
DW BYTE8B ; OSBYTE 139 - *OPT
DW BYTE8C ; OSBYTE 140 - *TAPE
DW BYTE8D ; OSBYTE 141 - *ROM
DW BYTENULL ; OSBYTE 140 - *TAPE
DW BYTENULL ; OSBYTE 141 - *ROM
DW BYTE8E ; OSBYTE 142 - Enter language - INIT.s
DW BYTE8F ; OSBYTE 143 - Service call - INIT.s
DW BYTENULL ; OSBYTE 144
DW BYTENULL ; OSBYTE 145
DW BYTENULL ; OSBYTE 146
DW BYTENULL ; OSBYTE 147
DW BYTENULL ; OSBYTE 148
DW BYTENULL ; OSBYTE 149
DW BYTENULL ; OSBYTE 150
DW BYTENULL ; OSBYTE 151
DW BYTENULL ; OSBYTE 152
DW BYTENULL ; OSBYTE 153
DW BYTENULL ; OSBYTE 154
DW BYTENULL ; OSBYTE 155
DW BYTENULL ; OSBYTE 156
DW BYTENULL ; OSBYTE 157
DW BYTENULL ; OSBYTE 158
DW BYTENULL ; OSBYTE 159
DW BYTEA0 ; OSBYTE 160 - Read VDU variable
BYTWRDTOP
DW BYTEVAR ; OSBYTE 166+ - Read/Write OSBYTE variable
* Maximum high OSBYTE
@ -172,28 +204,29 @@ BYTWRDEXIT ROR A ; Move Carry to A
ROL A ; Move Carry back to flags
PLA ; Restore A
CLV ; Clear V = Actioned
RTS
BYTENULL RTS
BYTWRDFAIL
* TEST code for VIEW
CPX #$07
BNE BYTFAIL0
CMP #$76
BEQ BYTE76
CMP #$A0
BNE BYTFAIL0
LDY #79 ; Read VDU variable $09,$0A
LDX #23
BRA BYTWRDEXIT
BYTE76
LDX $00
BRA BYTWRDEXIT
** TEST code for VIEW
* CPX #$07
* BNE BYTFAIL0
* CMP #$76
* BEQ BYTE76
* CMP #$A0
* BNE BYTFAIL0
* LDY #79 ; Read VDU variable $09,$0A
* LDX #23
* BRA BYTWRDEXIT
*BYTE76
* LDX $00
* BRA BYTWRDEXIT
* TEST
BYTFAIL0
* JSR SERVICE ; Offer to sideways ROMs
* LDX OSXREG ; Get returned X
* CMP #$00
* BEQ BYTWRDEXIT ; Claimed, return
BYTFAIL0 PHX ; *DEBUG*
JSR SERVICEX ; Offer to sideways ROMs as service X
LDX OSXREG ; Get returned X, returned Y is in Y
CMP #$01
PLA ; *DEBUG*
BCC BYTWRDEXIT ; Claimed, return
JSR UNSUPBYTWRD ; *DEBUG*
LDX #$FF ; X=&FF if unclaimed
PLP ; Restore original flags and IRQs
@ -315,6 +348,19 @@ WORD02 RTS ; Dummy, do nothing
*
WORD05 JSR GETADDR ; Point to address, set Y=>data
BNE WORD05A
JSR WORD05IO
LDY #$04
STA (OSCTRL),Y ; Store it
WORD05RET RTS
WORD05IO LDA OSINTWS+0 ; X CORRUPTED BY XF2MAIN
LDY OSINTWS+1
WORD05IO1 >>> XF2MAIN,MAINRDMEM
* <8000xxxx language memory
* ????xxxx main memory RAM paged in via STA $C002
* ????xxxx main memory ROM paged in via XFER
STA $C002 ; Switch to main memory
WORD05A LDA (OSINTWS) ; Get byte
STA $C003 ; Back to aux memory
@ -345,9 +391,9 @@ GETADDR STA OSINTWS+0 ; (OSINTWS)=>byte to read/write
* OSBYTE routines
*****************
* TO DO: move to init.s
BYTE00 LDX #$0A ; $00 = identify Host
RTS ; %000x1xxx host type, 'A'pple
** TO DO: move to init.s
*BYTE00 LDX #$0A ; $00 = identify Host
* RTS ; %000x1xxx host type, 'A'pple
BYTE88 LDA #$01 ; $88 = *CODE
WORDE0 JMP (USERV) ; OSWORD &E0+
@ -441,7 +487,8 @@ BYTE8E PHP ; Save CLC=RESET, SEC=Not RESET
* OSBYTE $8F - Issue service call
* X=service call, Y=parameter
*
BYTE8F TXA
BYTE8F
SERVICEX TXA
SERVICE LDX #$0F
BIT $8006
BPL :SERVSKIP ; No service entry
@ -453,7 +500,7 @@ SERVICE LDX #$0F
* Test/Debug code
UNSUPBYTWRD
UNSUPBYTWRD TAX
LDA #<OSBYTEM
LDY #>OSBYTEM
CPX #7

View File

@ -20,6 +20,8 @@
* test ESCHAR.
* FIXED: INKEY doesn't restore cursor on timeout.
* The three separate cursors can be set seperately.
* 02-Sep-2021 INKEY-256 tests Apple IIe vs IIc.
* 05-Sep-2021 KBDINIT returns startup value to pass to VDUINT.
* TEMP, move to VDU.S
@ -82,8 +84,14 @@ KBDINIT LDX #DEFBYTEEND-DEFBYTE-1
STA BYTEVARBASE+DEFBYTELOW,X
DEX
BPL :KBDINITLP
LDA #$C0
STA FX254VAR ; Also returns default MODE=0
LDX #$C0
STX FX254VAR ; b7-b4=default KBD map, b3-b0=default MODE
BIT SETV
JSR KBDTEST
BCS :KBDINITOK ; Return default MODE=0
STA $C010 ; Ack. keypress
TAX ; Use keypress as default MODE
:KBDINITOK TXA
RTS
* OSRDCH/INKEY handler
@ -101,7 +109,6 @@ RDCHHND LDA #$80 ; flag=wait forever
INKEY PHY ; Dummy PHY to balance RDCH
INKEYGO PHX ; Save registers
PHY
*
BIT VDUSTATUS ; Enable editing cursor
BVC INKEYGO2 ; No editing cursor
JSR GETCHRC ; Get character under cursor
@ -111,7 +118,6 @@ INKEYGO PHX ; Save registers
JSR COPYSWAP1 ; Swap to copy cursor
INKEYGO2 JSR GETCHRC ; Get character under cursor
STA OLDCHAR
*
CLI
BRA INKEY1 ; Turn cursor on
*
@ -158,11 +164,9 @@ 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
@ -171,17 +175,7 @@ INKEYDEC DEX
* Timeout: CS, AY=$FFFF, becomes XY=$FFFF
INKEYOK PHA
*
JSR INKEYOFF ; Restore cursors
*
* 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
*
INKEYOK2 PLA
PLY ; <$80=INKEY or $80=RDCH
PLX ; Restore X
@ -219,12 +213,27 @@ BYTE81DONE RTS
* Y=$1B, X=???, CS - escape
* Y=$00, X=char, CC - keypress
NEGINKEY CPX #$01
LDX #$00 ; Unimplemented
LDY #$00
BCS NEGINKEY0
LDX #$2A
; 6502 A 65C02 A 65816 B A
LDA #$00 ; 00 00 zz 00
DB #$EB ; SBC NOP 00 XBA 00 zz
DB #$3A ; #$3A C5 DEC A FF DEC A 00 yy
DB #$EB ; SBC NOP FF XBA yy 00
DB #$EA ; #$EA DA NOP FF NOP yy 00
BEQ NEGINKEY0 ; INKEY-256 = $2A - AppleIIgs
LDA #$C0
LDY #$FB
JSR WORD05IO1 ; Read from $FBC0 in main ROM
LDX #$2C
TAY
BEQ NEGINKEY0 ; INKEY-256 = $2C = Apple IIc
LDX #$2E ; INKEY-256 = $2E = Apple IIe
NEGINKEY0 CLC
NEGINKEY0 LDY #$00
CLC
RTS
@ -409,5 +418,3 @@ KBDDONE RTS

View File

@ -147,6 +147,6 @@ BYTE00XX BEQ BYTE00A ; OSBYTE 0,0 - generate error
RTS ; %000x1xxx host type, 'A'pple
BYTE00A BRK
DB $F7
HELLO ASC 'Applecorn MOS 2021-09-04 snapshot'
HELLO ASC 'Applecorn MOS 2021-09-05 snapshot'
DB $00 ; Unify MOS messages

View File

@ -9,12 +9,15 @@
* 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.
* 05-Sep-2021 Starting to prepare VDU workspace.
**********************************
* VDU DRIVER WORKSPACE LOCATIONS *
**********************************
* $00D0-$00DF VDU driver zero page workspace
* $03ED-$03EE XFER transfer address
VDUSTATUS EQU $D0 ; $D0 VDU status
VDUZP1 EQU VDUSTATUS+1 ; $D1
@ -29,8 +32,8 @@ VDUQ EQU $D7 ; TEMP HACK
* VDUVARS
* VDUTEXTX EQU $2A0+0 ; text X coord
* VDUTEXTY EQU $2A0+1 ; text Y coord
VDUTEXTX EQU COL
VDUTEXTY EQU ROW
VDUTEXTX EQU $96 ;COL TEMP
VDUTEXTY EQU $97 ;ROW TEMP
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
@ -40,10 +43,33 @@ 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
* OLDCHAR ; character under cursor
* CURSOR ; character used for cursor
* TEMP, move to VDU.S
* FLASHER EQU $290 ; flash counter for cursor
* CURSOR EQU $291 ; character under cursor
* CURSORED EQU $292 ; character used for cursor
* CURSORCP EQU $293 ; character used for edit cursor
* OLDCHAR EQU $294 ; character used for copy cursor
* COPYCHAR EQU $295 ;
* Start restructuring VDU variables
***********************************
VDUVARS EQU $290
* VDUTWINL VDUVARS+$08 ; text window left
* VDUTWINB VDUVARS+$09 ; text window bottom \ window
* VDUTWINR VDUVARS+$0A ; text window right / size
* VDUTWINT VDUVARS+$0B ; text window top
*
* VDUTEXTX EQU VDUVARS+$18 ; absolute POS
* VDUTEXTY EQU VDUVARS+$19 ; absolute VPOS
* VDUCOPYX EQU VDUVARS+$1A ;
* VDUCOPYY EQU VDUVARS+$1B ;
* VDUMODE
* CURSOR
* CURSORED
* CURSORCP
* Move editing cursor
@ -98,17 +124,18 @@ COPYSWAP4 RTS
* Clear to EOL
CLREOL LDA ROW
CLREOL LDA VDUTEXTY ; ROW
ASL
TAX
LDA SCNTAB,X ; LSB of row
STA ZP1
LDA SCNTAB+1,X ; MSB of row
STA ZP1+1
LDA COL
LDA VDUTEXTX ; COL
PHA
STZ COL
:L1 LDA COL
STZ VDUTEXTX ; COL
:L1
LDA VDUTEXTX ; COL
LSR
TAY
BCC :S1
@ -116,13 +143,13 @@ CLREOL LDA ROW
:S1 LDA #" "
STA (ZP1),Y
>>> WRTAUX
LDA COL
LDA VDUTEXTX ; COL
CMP #79
BEQ :S2
INC COL
INC VDUTEXTX ; COL
BRA :L1
:S2 PLA
STA COL
STA VDUTEXTX ; COL
RTS
* Clear the screen
@ -132,16 +159,16 @@ VDUINIT STA $C00F
STA CURSORCP ; Copy cursor when editing
LDA #$A0
STA CURSORED ; Edit cursor when editing
CLEAR STZ ROW
STZ COL
CLEAR STZ VDUTEXTY ; ROW
STZ VDUTEXTX ; COL
:L1 JSR CLREOL
:S2 LDA ROW
:S2 LDA VDUTEXTY ; ROW
CMP #23
BEQ :S3
INC ROW
INC VDUTEXTY ; ROW
BRA :L1
:S3 STZ ROW
STZ COL
:S3 STZ VDUTEXTY ; ROW
STZ VDUTEXTX ; COL
RTS
* Calculate character address
@ -206,46 +233,6 @@ PRCHR6 STA (VDUADDR),Y ; Store it
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
@ -272,76 +259,34 @@ GETCHR7 TYA
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
BYTE86 LDY VDUTEXTY ; ROW ; $86 = read cursor pos
LDX VDUTEXTX ; COL
RTS
* Perform backspace & delete operation
DELETE JSR BACKSPC
* LDA COL
* BEQ :S1
* DEC COL
* BRA :S2
*:S1 LDA ROW
* BEQ :S3
* DEC ROW
* LDA #79
* STA COL
:S2 LDA #' '
JMP PUTCHRC
*:S3 RTS
* Perform backspace/cursor left operation
BACKSPC LDA COL
BACKSPC
LDA VDUTEXTX ; COL
BEQ :S1
DEC COL
DEC VDUTEXTX ; COL
BRA :S3
:S1 LDA ROW
:S1 LDA VDUTEXTY ; ROW
BEQ :S3
DEC ROW
DEC VDUTEXTY ; ROW
LDA #39
BIT $C01F
BPL :S2
LDA #79
:S2 STA COL
:S2
STA VDUTEXTX ; COL
:S3 RTS
** Perform cursor right operation
*CURSRT LDA COL
* CMP #78
* BCS :S1
* INC COL
* RTS
*:S1 LDA ROW
* CMP #22
* BCS :S2
* INC ROW
* STZ COL
*:S2 RTS
* Output character to VDU driver
* All registers trashable
@ -389,18 +334,18 @@ OUTCHARGO CMP #$00 ; NULL
BRA :IDONE
:T4 CMP #$0A ; Linefeed
BNE :T5
LDA ROW
LDA VDUTEXTY ; ROW
CMP #23
BEQ :TOSCROLL ; JGH
INC ROW
INC VDUTEXTY ; ROW
:IDONE RTS
* BRA :DONE
:TOSCROLL JMP SCROLL ; JGH
:T5 CMP #$0B ; Cursor up
BNE :T6
LDA ROW
LDA VDUTEXTY ; ROW
BEQ :IDONE
DEC ROW
DEC VDUTEXTY ; ROW
* BRA :IDONE
RTS
:T6 CMP #$0D ; Carriage return
@ -408,7 +353,7 @@ OUTCHARGO CMP #$00 ; NULL
LDA #$BF
AND VDUSTATUS
STA VDUSTATUS ; Turn copy cursor off
STZ COL
STZ VDUTEXTX ; COL
* BRA :IDONE
RTS
:T7 CMP #$0C ; Ctrl-L
@ -426,8 +371,8 @@ OUTCHARGO CMP #$00 ; NULL
RTS
:T8 CMP #$1E ; Home
BNE :T9
STZ ROW
STZ COL
STZ VDUTEXTY ; ROW
STZ VDUTEXTX ; COL
* BRA :IDONE
RTS
:T9
@ -443,8 +388,9 @@ OUTCHARGO CMP #$00 ; NULL
BMI :T9A
CPX #80
BCS :IDONE
:T9A STX COL
STY ROW
:T9A
STX VDUTEXTX ; COL
STY VDUTEXTY ; ROW
RTS
:T9B CMP #$7F ; Delete
BNE :T10
@ -464,24 +410,27 @@ OUTCHARGO CMP #$00 ; NULL
:T10A JSR PRCHRC ; Store char, checking keypress
* Perform cursor right operation
VDU09 LDA COL
VDU09
LDA VDUTEXTX ; COL
CMP #39
BCC :S2
BIT $C01F
BPL :T11
CMP #79
BCC :S2
:T11 STZ COL
LDA ROW
:T11
STZ VDUTEXTX ; COL
LDA VDUTEXTY ; ROW
CMP #23
BEQ SCROLL
INC ROW
INC VDUTEXTY ; ROW
:DONE RTS
* BRA :DONE
:S2 INC COL
:S2
INC VDUTEXTX ; COL
BRA :DONE
SCROLL JSR SCROLLER
* STZ COL
* STZ VDUTEXTX ; COL
JSR CLREOL
*:DONE
RTS
@ -535,6 +484,14 @@ SCNTAB DW $800,$880,$900,$980,$A00,$A80,$B00,$B80
DW $850,$8D0,$950,$9D0,$A50,$AD0,$B50,$BD0
* TEST code for VIEW
BYTE75 LDX VDUSTATUS
RTS
BYTE76 LDX #$00
RTS
BYTEA0 LDY #79 ; Read VDU variable $09,$0A
LDX #23
RTS
* TEST

View File

@ -1273,6 +1273,15 @@ COPYPFXMF
JSR STRCPY
RTS
* Read mainmem from auxmem
MAINRDMEM STA A1L
STY A1H
LDA $C081
LDA $C081
LDA (A1L)
MAINRDEXIT >>> XF2AUX,NULLRTS ; Back to an RTS
******************************************************
* ProDOS Parameter lists for MLI calls
******************************************************
@ -1372,3 +1381,5 @@ QUITPL HEX 04 ; Number of parameters
MFTEMP DS 65 ; Temp copy of MOSFILE
PREFIX DS 65 ; Buffer for ProDOS prefix