Merge JGH's latest VDU driver updates. (Attempt #2)

This commit is contained in:
Bobbi Webber-Manners 2021-09-26 17:52:17 -04:00
parent aa639c8922
commit 9290dd47b8
5 changed files with 547 additions and 431 deletions

Binary file not shown.

View File

@ -2,6 +2,160 @@
* (c) Bobbi 2021 GPLv3 * (c) Bobbi 2021 GPLv3
* *
* Graphics operations * Graphics operations
*
* 26-Sep-2021 All graphics screen code moved to here.
* Write character to HGR screen
PRCHRSOFT CMP #$A0 ; Convert to screen code
BCS :B0
CMP #$80
BCC :B0
EOR #$80
:B0 TAX
AND #$20
BNE :B1
TXA
EOR #$40
TAX
:B1 PHX
JSR HCHARADDR ; Addr in VDUADDR
PHP ; Disable IRQs while
SEI ; toggling memory
STA $C004 ; Write to main
LDA VDUADDR+0
STA HGRADDR+0
LDA VDUADDR+1
STA HGRADDR+1
STA $C005 ; Write to aux
PLP ; Restore IRQs
PLA ; Recover character
>>> XF2MAIN,DRAWCHAR ; Plot char on HGR screen
PUTCHRET >>> ENTAUX
RTS
HSCR1LINE >>> XF2MAIN,HGRSCR1L
HSCR1RET >>> ENTAUX
RTS
HSCRCLREOL LDA VDUTEXTY
ASL
TAX
>>> WRTMAIN
LDA HGRTAB+0,X
STA HGRADDR+0
LDA HGRTAB+1,X
STA HGRADDR+1
>>> WRTAUX
>>> XF2MAIN,HCLRLINE
HSCRCLEAR >>> XF2MAIN,CLRHGR
VDU16RET >>> ENTAUX
STZ XPIXEL+0
STZ XPIXEL+1
LDA #191
STA YPIXEL
RTS
CLRLNRET >>> ENTAUX
RTS
* X=txt colour
HSCRSETTCOL RTS
* X=gfx colour, A=gcol action
* GCOL actions:
* 0 = SET pixel
* 1 = ORA with pixel
* 2 = AND with pixel
* 3 = XOR with pixel
* 4 = NOT pixel
* 5 = NUL no change to pixel
* 6 = CLR clear pixel to background
* 7 = UND undefined
HSCRSETGCOL PHX
LDX #$00 ; Normal drawing mode
CMP #$04 ; k=4 means toggle
BNE :NORM
LDX #$01 ; Change to toggle mode
:NORM >>> WRTMAIN
TXA
STX LINETYPE
STX FDRAWADDR+5
>>> WRTAUX
>>> XF2MAIN,SETLINE
VDU18RET1 >>> ENTAUX
:NORM PLA ; Colour
BPL :FOREGND ; <128 is foreground
>>> WRTMAIN
AND #$7F
STA BGCOLOR ; Stored in main memory
>>> WRTAUX
RTS
:FOREGND >>> WRTMAIN
STA FGCOLOR ; Stored in main memory
>>> WRTAUX
RTS
* Plot actions, PLOT k,x,y
* k is in VDUQ+4
* x is in VDUQ+5,VDUQ+6
* y is in VDUQ+7,VDUQ+8
HGRPLOT JSR CVTCOORD ; Convert coordinate system
HGRPLOT2 LDA VDUQ+4
AND #$04 ; Bit 2 set -> absolute
BNE HGRPLOTABS
JSR RELCOORD ; Add coords to XPIXEL/YPIXEL
HGRPLOTABS LDA VDUQ+4
AND #$03
CMP #$0 ; Bits 0,1 clear -> just move
BNE HGRPLOTACT
HGRPLOTPOS JMP HGRPOS ; Just update pos
HGRPLOTACT LDA VDUQ+4
AND #$C0
CMP #$40 ; Bit 7 clr, bit 6 set -> point
BNE :LINE
>>> WRTMAIN
LDA VDUQ+4
STA PLOTMODE
LDA VDUQ+5
STA FDRAWADDR+6 ; LSB of X1
LDA VDUQ+6
STA FDRAWADDR+7 ; MSB of X1
LDA VDUQ+7
STA FDRAWADDR+8 ; Y1
>>> WRTAUX
>>> XF2MAIN,DRAWPNT
:LINE >>> WRTMAIN
LDA VDUQ+4
STA PLOTMODE
LDA XPIXEL+0
STA FDRAWADDR+6
LDA XPIXEL+1
STA FDRAWADDR+7
LDA YPIXEL
STA FDRAWADDR+8
LDA VDUQ+5
STA FDRAWADDR+9 ; LSB of X1
LDA VDUQ+6
STA FDRAWADDR+10 ; MSB of X1
LDA VDUQ+7
STA FDRAWADDR+11 ; Y1
>>> WRTAUX
>>> XF2MAIN,DRAWLINE
VDU25RET >>> ENTAUX
* Fall through into HGRPOS
* Save pixel X,Y position
HGRPOS LDA VDUQ+5
STA XPIXEL+0
LDA VDUQ+6
STA XPIXEL+1
LDA VDUQ+7
STA YPIXEL
RTS
XPIXEL DW $0000 ; Previous plot x-coord
YPIXEL DW $0000 ; Previous plot y-coord
* Convert high-resolution screen coordinates * Convert high-resolution screen coordinates
* from 1280x1024 to 280x192 * from 1280x1024 to 280x192
@ -59,7 +213,7 @@ CVTCOORD
ROR ZP2+0 ROR ZP2+0
LSR A LSR A
ROR ZP2+0 ROR ZP2+0
LSR A :YCOORD4 LSR A
ROR ZP2+0 ROR ZP2+0
LSR A LSR A
ROR ZP2+0 ROR ZP2+0
@ -92,15 +246,3 @@ RELCOORD CLC
STA VDUQ+7 STA VDUQ+7
RTS RTS

View File

@ -177,7 +177,7 @@ BYTE00XX BEQ BYTE00A ; OSBYTE 0,0 - generate error
RTS ; %000x1xxx host type, 'A'pple RTS ; %000x1xxx host type, 'A'pple
BYTE00A BRK BYTE00A BRK
DB $F7 DB $F7
HELLO ASC 'Applecorn MOS 2021-09-24' HELLO ASC 'Applecorn MOS 2021-09-26'
DB $00 ; Unify MOS messages DB $00 ; Unify MOS messages

View File

@ -13,6 +13,9 @@
* 09-Sep-2021 New dispatch routine. * 09-Sep-2021 New dispatch routine.
* 22-Sep-2021 More VDU workspace, started MODE definitions. * 22-Sep-2021 More VDU workspace, started MODE definitions.
* 23-Sep-2021 More or less sorted VDU workspace. * 23-Sep-2021 More or less sorted VDU workspace.
* 26-Sep-2021 Merged together JGH VDU updates and Bobbi GFX updates.
* Moved all graphics screen access code to gfx.s
* All 65816-specific code disabled.
********************************** **********************************
@ -33,10 +36,15 @@ VDUSTATUS EQU $D0 ; $D0 # VDU status
* bit 1 = Don't scroll (COPY cursor or VDU 5 mode) * bit 1 = Don't scroll (COPY cursor or VDU 5 mode)
* bit 0 = VDU 2 printer echo active * bit 0 = VDU 2 printer echo active
* *
VDUCHAR EQU VDUSTATUS+1 ; $D1 VDUCHAR EQU VDUSTATUS+1 ; $D1 current control character
VDUADDR EQU VDUSTATUS+4 ; $D4 address of current char cell VDUTEMP EQU VDUCHAR ; &D1
OLDCHAR EQU OSKBD1 ; *TEMP* character under cursor VDUADDR EQU VDUSTATUS+2 ; $D2 address of current char cell
COPYCHAR EQU OSKBD2 ; *TEMP* character under copy cursor VDUBANK EQU VDUADDR+2 ; $D4 screen bank
VDUADDR2 EQU VDUADDR+3 ; $D5 address being scrolled
VDUBANK2 EQU VDUBANK+3 ; $D7 screen bank being scrolled
*
OLDCHAR EQU OSKBD1 ; &EC character under cursor
COPYCHAR EQU OSKBD2 ; &ED character under copy cursor
* VDU DRIVER MAIN WORKSPACE * VDU DRIVER MAIN WORKSPACE
*************************** ***************************
@ -71,10 +79,11 @@ PIXELPOSNX EQU VDUVARS+$20 ; current graphics X in pixels
PIXELPOSNY EQU VDUVARS+$22 ; current graphics Y in pixels PIXELPOSNY EQU VDUVARS+$22 ; current graphics Y in pixels
PIXELLASTX EQU VDUVARS+$24 ; last graphics X in pixels PIXELLASTX EQU VDUVARS+$24 ; last graphics X in pixels
PIXELLASTY EQU VDUVARS+$26 ; last graphics Y in pixels PIXELLASTY EQU VDUVARS+$26 ; last graphics Y in pixels
VDUWINEND EQU VDUVARS+$27 ; VDU 26 clears up to here
* *
CURSOR EQU VDUVARS+$28 ; character used for cursor CURSOR EQU VDUVARS+$28 ; character used for cursor
CURSORED EQU VDUVARS+$29 ; character used for edit cursor CURSORCP EQU VDUVARS+$29 ; character used for copy cursor
CURSORCP EQU VDUVARS+$2A ; character used for copy cursor CURSORED EQU VDUVARS+$2A ; character used for edit cursor
* *
VDUQ EQU VDUVARS+$2B ; $2B..$33 VDUQ EQU VDUVARS+$2B ; $2B..$33
VDUQLAST EQU VDUQ+1 ; Neatly becomes VDUVARS+$2C VDUQLAST EQU VDUQ+1 ; Neatly becomes VDUVARS+$2C
@ -91,7 +100,7 @@ GFXPLOTFGD EQU VDUVARS+$3B ; # Foreground GCOL action
GFXPLOTBGD EQU VDUVARS+$3C ; # Background GCOL action GFXPLOTBGD EQU VDUVARS+$3C ; # Background GCOL action
VDUVAR3D EQU VDUVARS+$3D VDUVAR3D EQU VDUVARS+$3D
VDUVAR3E EQU VDUVARS+$3E VDUVAR3E EQU VDUVARS+$3E
VDUBYTES EQU VDUVARS+$3F ; # bytes per char, 1=text only VDUBYTES EQU VDUVARS+$3F ; bytes per char, 1=text only
VDUCOLOURS EQU VDUVARS+$40 ; # colours-1 VDUCOLOURS EQU VDUVARS+$40 ; # colours-1
VDUPIXELS EQU VDUVARS+$41 ; # pixels per byte VDUPIXELS EQU VDUVARS+$41 ; # pixels per byte
VDUWORKSP EQU VDUVARS+$42 ; 28 bytes of general workspace VDUWORKSP EQU VDUVARS+$42 ; 28 bytes of general workspace
@ -99,16 +108,20 @@ VDUWORKSZ EQU VDUVAREND-VDUWORKSP+1
* *
* Screen definitions * Screen definitions
* 0 1 2 3 4 5 6 7 * 1 3 6 7
SCNTXTMAXX DB 79,39,19,79,39,19,39,39 ; Max text column SCNTXTMAXX DB 79,39,19,79,39,19,39,39 ; Max text column
SCNTXTMAXY DB 23,23,23,23,23,23,23,23 ; Max text row SCNTXTMAXY DB 23,23,23,23,23,23,23,23 ; Max text row
SCNBYTES DB 1,1,8,1,1,1,1,1 SCNBYTES DB 1, 8, 1, 1, 1, 1, 1, 1 ; Bytes per character
SCNCOLOURS DB 1,1,8,1,1,1,1,1 SCNCOLOURS DB 15,15,15,15,15,15,15,15 ; Colours-1
SCNTYPE DB 1,0,128,1,0,0,0,0 SCNPIXELS DB 0, 7, 0, 0, 0, 0, 0, 0 ; Pixels per byte
SCNTYPE DB 1,128,0, 1, 0, 0, 0,64 ; Screen type
* b7=FastDraw * b7=FastDraw
* b6=Teletext * b6=Teletext
* b0=40COL/80COL * b0=40COL/80COL
* =
* Colour table
CLRTRANS DB 00,01,04,09,02,03,07,10
DB 05,08,12,13,06,14,11,15
******************************************************************** ********************************************************************
* Note that we use PAGE2 80 column mode ($800-$BFF in main and aux) * Note that we use PAGE2 80 column mode ($800-$BFF in main and aux)
@ -180,7 +193,7 @@ CTRLCHARGO2 PHP ; Save CS=(ctrl>=8 && ctrl<=13)
RTS ; Return, CC=Don't echo to printer RTS ; Return, CC=Don't echo to printer
OUTCHARGO ASL A ; Entry point to move COPY cursor OUTCHARGO ASL A ; Entry point to move COPY cursor
TAY ; (TEMP and scroll screen) TAY
CTRLCHARJMP CPY #6*2 CTRLCHARJMP CPY #6*2
BEQ CTRLCHAR6 ; Always allow VDU 6 through BEQ CTRLCHAR6 ; Always allow VDU 6 through
BIT VDUSTATUS BIT VDUSTATUS
@ -320,52 +333,43 @@ PRCHRC PHA ; Save character
:RESUME PLA :RESUME PLA
* Put character to screen * Put character to screen
PUTCHRC EOR #$80 ; Convert character * Puts character to text screen buffer, then in graphics mode,
TAY * writes bitmap to graphics screen
PUTCHRC PHA
EOR #$80 ; Convert character to screen code
TAX
AND #$A0 AND #$A0
BNE PRCHR4 BNE PRCHR4
CPY #$20 CPX #$20
BCS PRCHR3 ; Not $80-$9F BCS PRCHR3 ; Not $80-$9F
BIT VDUSCREEN BIT VDUSCREEN
BVC PRCHR3 ; Not teletext BVC PRCHR3 ; Not teletext
LDY #$E0 ; Convert $80-$9F to space LDX #$E0 ; Convert $80-$9F to space
PRCHR3 TYA PRCHR3 TXA
EOR #$40 EOR #$40
TAY TAX
PRCHR4 PHY PRCHR4 JSR CHARADDR ; Find character address
JSR CHARADDR ; Find character address TXA ; Get character back
PLA ; Get character back BIT VDUBANK
PHA ; Stash it again * BPL PRCHR5 ; Not AppleGS, use short write
PHP ; Disable IRQs while * DB $97,VDUADDR ; STA [VDUADDR],Y
* BRA PRCHR8
PRCHR5 PHP ; Disable IRQs while
SEI ; toggling memory SEI ; toggling memory
BCC PRCHR6 ; Aux memory BCC PRCHR6 ; Aux memory
STA $C004 ; Switch to main memory STA $C004 ; Switch to main memory
PRCHR6 STA (VDUADDR),Y ; Store it PRCHR6 STA (VDUADDR),Y ; Store it
STA $C005 ; Back to aux memory PRCHR7 STA $C005 ; Back to aux memory
PLP ; Restore IRQs PLP ; Restore IRQs
LDY VDUBYTES PRCHR8 PLA
DEY ; If VDUBYTE=1, text mode BIT VDUSCREEN
BEQ :DONE BPL GETCHROK
JSR HCHARADDR ; Addr in VDUADDR JMP PRCHRSOFT ; Write character to graphics
PHP ; Disable IRQs while
SEI ; toggling memory
STA $C004 ; Write to main
LDA VDUADDR+0
STA HGRADDR+0
LDA VDUADDR+1
STA HGRADDR+1
STA $C005 ; Write to aux
PLP ; Restore IRQs
PLA ; Recover character
>>> XF2MAIN,DRAWCHAR ; Plot char on HGR screen
:DONE PLA ; Discard character
RTS
PUTCHRET >>> ENTAUX
RTS
* OSBYTE &87 - Read character at cursor
***************************************
* Fetch character from screen at (TEXTX,TEXTY) and return MODE in Y * Fetch character from screen at (TEXTX,TEXTY) and return MODE in Y
* Always uses text screen (which we maintain even in graphics mode) * Always read from text screen (which we maintain even in graphics mode)
BYTE87 BYTE87
GETCHRC JSR CHARADDR ; Find character address GETCHRC JSR CHARADDR ; Find character address
PHP ; Disable IRQs while PHP ; Disable IRQs while
@ -387,18 +391,21 @@ GETCHR7 TYA
TAX ; X=char TAX ; X=char
GETCHROK RTS GETCHROK RTS
* Get text cursor position
BYTE86 LDY VDUTEXTY ; ROW ; $86 = read cursor pos * OSBYTE &86 - Get text cursor position
LDX VDUTEXTX ; COL ***************************************
BYTE86 LDY VDUTEXTY
LDX VDUTEXTX
RTS RTS
* Calculate character address * Calculate character address
* NB: VDUBANK at VDUADDR+2 is set by VDU22
CHARADDR LDA VDUTEXTY CHARADDR LDA VDUTEXTY
ASL CHARADDRY ASL
TAX TAY
LDA SCNTAB+0,X ; LSB of row address LDA SCNTAB+0,Y ; LSB of row address
STA VDUADDR+0 STA VDUADDR+0
LDA SCNTAB+1,X ; MSB of row address LDA SCNTAB+1,Y ; MSB of row address
STA VDUADDR+1 STA VDUADDR+1
LDA VDUTEXTX LDA VDUTEXTX
BIT $C01F BIT $C01F
@ -406,26 +413,31 @@ CHARADDR LDA VDUTEXTY
BPL CHARADDR40 ; 40-col BPL CHARADDR40 ; 40-col
LSR A LSR A
CHARADDR40 TAY ; Y=offset into this row CHARADDR40 TAY ; Y=offset into this row
LDA VDUBANK
AND #$FE
BCS CHARADDROK
ORA #$01
CHARADDROK STA VDUBANK
RTS RTS
* (VDUADDR),Y=>character address * (VDUADDR),Y=>character address
* CC=auxmem * VDUBANK = AppleGS screen bank
* CS=mainmem * CC=auxmem, CS=mainmem, X=preserved
* Calculate character address in HGR mode * Calculate character address in HGR screen memory
* This is the address of the first pixel row of the char * This is the address of the first pixel row of the char
* Add $0400 for each subsequent row of the char * Add $0400 for each subsequent row of the char
HCHARADDR LDA VDUTEXTY HCHARADDR LDA VDUTEXTY
ASL ASL
TAX TAY
CLC CLC
LDA HGRTAB+0,X ; LSB of row address LDA HGRTAB+0,Y ; LSB of row address
ADC VDUTEXTX ADC VDUTEXTX
STA VDUADDR+0 STA VDUADDR+0
LDA HGRTAB+1,X ; MSB of row address LDA HGRTAB+1,Y ; MSB of row address
ADC #$00 ADC #$00
STA VDUADDR+1 STA VDUADDR+1
RTS RTS
* (VDUADDR)=>character address * (VDUADDR)=>character address, X=preserved
* Move cursor left * Move cursor left
VDU08 LDA VDUTEXTX ; COL VDU08 LDA VDUTEXTX ; COL
@ -504,13 +516,33 @@ VDU31 LDY VDUQ+8
* VDU 26 - Reset to default windows * VDU 26 - Reset to default windows
VDU26 LDX VDUMODE VDU26 LDA #$F7
VDU26A LDA SCNTXTMAXX,X JSR CLRSTATUS ; Clear 'soft window'
STA TXTWINRGT VDU26A LDX #VDUWINEND-VDUVARS
LDA SCNTXTMAXY,X LDA #$00
STA TXTWINBOT VDU26LP STA VDUVARS,X ; Clear all windows
DEX ; and all coords
BPL VDU26LP ; and origin, etc.
LDY VDUMODE
LDA SCNTXTMAXY,Y
STA TXTWINBOT ; Text window height
STA GFXWINTOP ; Graphics height
LDX #GFXWINTOP-VDUVARS
LDA SCNTXTMAXX,Y
STA TXTWINRGT ; Text window width
STA GFXWINRGT ; Graphics width
LDX #GFXWINRGT-VDUVARS
* TO DO *
RTS RTS
* VDU 24,left;bottom;right;top; - define graphics window
VDU24 RTS
* VDU 28,left,bottom,right,top - define text window
VDU28 RTS
* VDU 29,x;y; - define graphics origin
VDU29 RTS
* Initialise VDU driver * Initialise VDU driver
@ -518,75 +550,62 @@ VDU26A LDA SCNTXTMAXX,X
* On entry, A=MODE to start in * On entry, A=MODE to start in
* *
VDUINIT STA VDUQ+8 VDUINIT STA VDUQ+8
* JSR FONTIMPLODE ; Reset VDU 23 font
* VDU 22 - MODE n * VDU 22 - MODE n
***************** *****************
* At the moment only MODEs available: * At the moment only MODEs available:
* MODE 1 - 280x192 HGR graphics, 40 cols bitmap text
* MODE 3 - 80x24 text * MODE 3 - 80x24 text
* MODE 6 - 40x24 text * MODE 6 - 40x24 text
* MODE 7 - 40x24 with $80-$9F converted to spaces * MODE 7 - 40x24 with $80-$9F converted to spaces
* MODE 2 - 280x192 HGR graphics, 40 cols bitmap text
* MODE 0 defaults to MODE 3 * MODE 0 defaults to MODE 3
* All others default to MODE 6 * All others default to MODE 6
* *
* Wait for VSync?
VDU22 LDA VDUQ+8 VDU22 LDA VDUQ+8
AND #$07 AND #$07
STA VDUMODE
TAX ; Set up MODE TAX ; Set up MODE
STX VDUMODE ; Screen MODE
LDA SCNCOLOURS,X
STA VDUCOLOURS ; Colours-1
LDA SCNBYTES,X
STA VDUBYTES ; Bytes per char
LDA SCNPIXELS,X
STA VDUPIXELS ; Pixels per byte
LDA SCNTYPE,X
STA VDUSCREEN ; Screen type
JSR NEGCALL ; Find machine type
AND #$0F
BEQ :MODEGS ; MCHID=$x0 -> Not AppleGS, bank=0
LDA #$E0 ; Not $x0 -> AppleGS, point to screen bank
:MODEGS STA VDUBANK
LDA #$01
JSR CLRSTATUS ; Clear everything except PrinterEcho
LDA #'_' ; Set up default cursors LDA #'_' ; Set up default cursors
STA CURSOR ; Normal cursor STA CURSOR ; Normal cursor
STA CURSORCP ; Copy cursor when editing STA CURSORCP ; Copy cursor when editing
LDA #$A0 LDA #$A0
STA CURSORED ; Edit cursor when editing STA CURSORED ; Edit cursor when editing
LDA #$01 JSR VDU20 ; Default colours
JSR CLRSTATUS ; Clear everything except PrinterEcho JSR VDU26 ; Default windows
JSR VDU26A STA $C052 ; Clear MIXED
* LDA VDUSCREEN
LDA SCNBYTES,X
STA VDUBYTES
LDA SCNCOLOURS,X
STA VDUCOLOURS
LDA SCNTYPE,X
STA VDUSCREEN
BMI VDU22G ; b7=1, graphics mode BMI VDU22G ; b7=1, graphics mode
* TEMP
CPX #2
BEQ VDU22G ; Jump out for MODE 1
* TEMP
*
AND #$01 ; 40col/80col bit AND #$01 ; 40col/80col bit
TAX TAX
STA $C00C,X ; Select 40col/80col STA $C00C,X ; Select 40col/80col
STA $C051 ; Enable Text STA $C051 ; Enable Text
STA $C055 ; PAGE2 STA $C055 ; PAGE2
STA $C052 ; Clear MIXED
STA $C00F ; Enable alt charset STA $C00F ; Enable alt charset
BRA VDU22CLR * Fall through into CLS
VDU12 STZ FXLINES
STZ VDUTEXTX
STZ VDUTEXTY
VDU22G STA $C050 ; Enable Graphics * Clear the text screen buffer
STA $C057 ; Hi-Res :L1 JSR CLREOL
STA $C054 ; PAGE1
STA $C052 ; Clear MIXED
STA $C00C ; Select 40col text
JMP VDU16 ; Clear HGR screen
VDU22CLR
* JSR VDU15 ; Turn off paged scrolling
* JSR VDU20 ; Reset colours
* JSR VDU26 ; Reset windows
* ; Drop through into VDU12, clear screen
VDU12 LDY VDUBYTES
DEY ; If VDUBYTE=1, text mode
BNE VDU12SOFT ; Graphics mode
JMP CLEAR
* Clear the screen
CLEAR STZ VDUTEXTY ; ROW
STZ VDUTEXTX ; COL
:L1 JSR CLRLINE
:S2 LDA VDUTEXTY ; ROW :S2 LDA VDUTEXTY ; ROW
CMP #23 CMP #23
BEQ :S3 BEQ :S3
@ -594,66 +613,57 @@ CLEAR STZ VDUTEXTY ; ROW
BRA :L1 BRA :L1
:S3 STZ VDUTEXTY ; ROW :S3 STZ VDUTEXTY ; ROW
STZ VDUTEXTX ; COL STZ VDUTEXTX ; COL
BIT VDUSCREEN
BMI VDU12SOFT ; Graphics mode
RTS RTS
* Clear the graphics screen buffer
VDU12SOFT JMP VDU16 ; *TEMP* VDU12SOFT JMP VDU16 ; *TEMP*
VDU22G STA $C050 ; Enable Graphics
STA $C057 ; Hi-Res
STA $C054 ; PAGE1
STA $C00C ; Select 40col text
JMP VDU12 ; Clear text and HGR screen
* Clear screen line * Clear to EOL
CLRLINE LDA VDUTEXTY ; ROW CLRLINE
ASL CLREOL JSR CHARADDR ; Set VDUADDR=>start of line
TAX * BIT VDUBANK
LDA SCNTAB,X ; LSB of row * BMI CLREOLGS ; AppleGS
STA ZP1 LDY #39
LDA SCNTAB+1,X ; MSB of row LDA #$A0
STA ZP1+1 :L1 STA (VDUADDR),Y
LDA VDUTEXTX ; COL PHP
PHA SEI
STZ VDUTEXTX ; COL STA $C004
:L1 LDA VDUTEXTX ; COL STA (VDUADDR),Y
LSR STA $C005
TAY PLP
BCC :S1 DEY
>>> WRTMAIN BPL :L1
:S1 LDA #" " BIT VDUSCREEN
STA (ZP1),Y BPL CLREOLOK
>>> WRTAUX JMP HSCRCLREOL ; Clear an HGR line
LDA VDUTEXTX ; COL CLREOLOK RTS
CMP #79 CLREOLGS LDX #1
BEQ :S2 :L2 LDY #39
INC VDUTEXTX ; COL LDA #$A0
BRA :L1 :L3 DB $97,VDUADDR ; STA [VDUADDR],Y
:S2 PLA DEY
STA VDUTEXTX ; COL BPL :L3
LDY VDUBYTES LDA VDUBANK
DEY ; If VDUBYTE=1, text mode EOR #$01
BEQ :DONE STA VDUBANK
LDA VDUTEXTY DEX
ASL BPL :L2
TAX
>>> WRTMAIN
LDA HGRTAB+0,X
STA HGRADDR+0
LDA HGRTAB+1,X
STA HGRADDR+1
>>> WRTAUX
>>> XF2MAIN,HCLRLINE
:DONE RTS
CLRLNRET >>> ENTAUX
RTS RTS
* Scroll whole screen one line * Scroll whole screen one line
SCROLLER LDA #$00 SCROLLER LDA #$00
:L1 PHA :L1 PHA
JSR SCR1LINE ; Scroll text screen 1 line JSR SCR1LINE
PLA PLA
LDY VDUBYTES INC
DEY ; If VDUBYTE=1, text mode
BEQ :TEXTONLY ; Text mode, skip HGR scroll
PHA
JSR HSCR1LINE ; Scroll HGR screen 1 text line
PLA
:TEXTONLY INC
CMP #23 CMP #23
BNE :L1 BNE :L1
BIT VDUSTATUS BIT VDUSTATUS
@ -665,152 +675,117 @@ SCROLLER LDA #$00
:L2 RTS :L2 RTS
* Copy line A+1 to line A * Copy line A+1 to line A
SCR1LINE ASL ; Dest addr->ZP1 SCR1LINE PHA
TAX JSR CHARADDRY ; VDUADDR=>line A
LDA SCNTAB,X LDX #2
STA ZP1 :L1 LDA VDUADDR,X ; Copy to VDUADDR2
LDA SCNTAB+1,X STA VDUADDR2,X
STA ZP1+1 DEX
INX ; Source addr->ZP2 BPL :L1
INX PLA
LDA SCNTAB,X PHA
STA ZP2 INC A
LDA SCNTAB+1,X JSR CHARADDRY ; VDUADDR=>line A+1
STA ZP2+1 * BIT VDUBANK
LDY #$00 * BMI SCROLLGS
:L1 LDA (ZP2),Y LDY #39
STA (ZP1),Y :L2 LDA (VDUADDR),Y
STA (VDUADDR2),Y
PHP
SEI
STA $C002 ; Read main mem STA $C002 ; Read main mem
>>> WRTMAIN STA $C004 ; Write main mem
LDA (ZP2),Y LDA (VDUADDR),Y
STA (ZP1),Y STA (VDUADDR2),Y
STA $C003 ; Read aux mem STA $C003 ; Read aux mem
>>> WRTAUX STA $C005 ; Write aux mem
INY PLP
CPY #40 DEY
BNE :L1 BPL :L2
PLA
BIT VDUSCREEN ; Also screen graphics screen
BMI SCR1SOFT
RTS
SCROLLGS LDX #1
:L4 LDY #39
:L5 DB $B7,VDUADDR ; LDA [VDUADDR],Y
DB $97,VDUADDR2 ; STA [VDUADDR2],Y
DEY
BPL :L5
LDA VDUBANK
EOR #$01
STA VDUBANK
STA VDUBANK2
DEX
BPL :L4
PLA
BIT VDUSCREEN ; Also screen graphics screen
BMI SCR1SOFT
RTS RTS
* Copy text line A+1 to line A for HGR bitmap gfx mode * Copy text line A+1 to line A for HGR bitmap gfx mode
HSCR1LINE >>> XF2MAIN,HGRSCR1L SCR1SOFT JMP HSCR1LINE
HSCR1RET >>> ENTAUX
RTS
* VDU 1 - Send one character to printer
VDU01 RTS
* VDU 16 - CLG, clear graphics window * VDU 16 - CLG, clear graphics window
VDU16 >>> XF2MAIN,CLRHGR VDU16 JMP HSCRCLEAR
VDU16RET >>> ENTAUX
STZ XPIXEL+0 * VDU 20 - Reset to default colours
STZ XPIXEL+1 VDU20 LDA #$00 ; *TEMP*
LDA #191 STA $C034
STA YPIXEL LDA #$F0
STA $C022
LDA #$00
LDX #$07
JSR HSCRSETGCOL
LDA #$00
LDX #$80
JSR HSCRSETGCOL
RTS RTS
* VDU 17 - COLOUR n - select text or border colour * VDU 17 - COLOUR n - select text or border colour
VDU17 RTS VDU17 LDA VDUQ+8 ; *TEMP*
JSR HSCRSETTCOL
* TO DO: set local VDU variables
AND #15
TAY
LDX CLRTRANS,Y
BIT VDUQ+8
BPL VDU17FGD
BVC VDU17BGD
STX $C034
RTS
VDU17BGD LDA $C022
AND #$F0
STA $C022
TXA
ORA $C022
STA $C022
VDU17FGD RTS
* VDU 18 - GCOL k,a - select graphics colour and plot action * VDU 18 - GCOL k,a - select graphics colour and plot action
VDU18 LDA VDUQ+7 ; Argument 'k' VDU18 LDA VDUQ+7 ; GCOL action
CMP #$04 ; k=4 means XOR LDX VDUQ+8 ; GCOL colour
LDA #$00 ; Normal drawing mode * TO DO: set local VDU variables
BNE :NORM JSR HSCRSETGCOL
LDA #$01 ; XOR mode
:NORM >>> WRTMAIN
STA LINETYPE
STA FDRAWADDR+5
>>> WRTAUX
>>> XF2MAIN,SETLINE
VDU18RET1 >>> ENTAUX
:NORM LDA VDUQ+8 ; Argument 'a'
BPL :FOREGND ; <128 is foreground
>>> WRTMAIN
STA BGCOLOR ; Stored in main memory
>>> WRTAUX
RTS
:FOREGND >>> WRTMAIN
STA FGCOLOR ; Stored in main memory
>>> WRTAUX
RTS RTS
* VDU 19 - Select palette colours * VDU 19 - Select palette colours
VDU19 RTS VDU19 RTS
* VDU 20 - Reset to default colours
VDU20 RTS
* VDU 23 - Program video system and define characters * VDU 23 - Program video system and define characters
VDU23 RTS VDU23 RTS
* VDU 24,left;bottom;right;top; - define graphics window * VDU 25,k,x;y; - PLOT k,x,y - PLOT point, line, etc.
VDU24 RTS
* VDU 25,k,x;y; - PLOT k,x;y; - PLOT point, line, etc.
* x is in VDUQ+7,VDUQ+8
* y is in VDUQ+5,VDUQ+6
* k is in VDUQ+4 * k is in VDUQ+4
VDU25 JSR CVTCOORD ; Convert coordinate system * x is in VDUQ+5,VDUQ+6
LDA VDUQ+4 * y is in VDUQ+7,VDUQ+8
AND #$04 ; Bit 2 set -> absolute VDU25 JMP HGRPLOT
BNE :ABS * TO DO:
JSR RELCOORD ; Add coords to XPIXEL/YPIXEL * coord=coord+origin
:ABS LDA VDUQ+4 * scale coord
AND #$03 * call HGRPLOT
CMP #$0 ; Bits 0,1 clear -> just move * copy this->last, coord->this
BNE :NOTMOVE * check for Escape
JMP HGRPOS ; Just update pos
:NOTMOVE LDA VDUQ+4
AND #$C0
CMP #$40 ; Bit 7 clr, bit 6 set -> point
BNE :LINE
>>> WRTMAIN
LDA VDUQ+4
STA PLOTMODE
LDA VDUQ+5
STA FDRAWADDR+6 ; LSB of X1
LDA VDUQ+6
STA FDRAWADDR+7 ; MSB of X1
LDA VDUQ+7
STA FDRAWADDR+8 ; Y1
>>> WRTAUX
>>> XF2MAIN,DRAWPNT
:LINE >>> WRTMAIN
LDA VDUQ+4
STA PLOTMODE
LDA XPIXEL+0
STA FDRAWADDR+6
LDA XPIXEL+1
STA FDRAWADDR+7
LDA YPIXEL
STA FDRAWADDR+8
LDA VDUQ+5
STA FDRAWADDR+9 ; LSB of X1
LDA VDUQ+6
STA FDRAWADDR+10 ; MSB of X1
LDA VDUQ+7
STA FDRAWADDR+11 ; Y1
>>> WRTAUX
>>> XF2MAIN,DRAWLINE
VDU25RET >>> ENTAUX
* Fall through into HGRPOS
* Save pixel X,Y position
HGRPOS LDA VDUQ+5
STA XPIXEL+0
LDA VDUQ+6
STA XPIXEL+1
LDA VDUQ+7
STA YPIXEL
RTS
XPIXEL DW $0000 ; Previous plot x-coord
YPIXEL DB $00 ; Previous plot y-coord
* VDU 28,left,bottom,right,top - define text window
VDU28 RTS
* VDU 29,x;y; - define graphics origin
VDU29 RTS
@ -827,10 +802,8 @@ BYTEA02 LDY VDUVARS+1,X
RTS RTS
* PRINTER DRIVER
****************
* VDU 1 - Send one character to printer
VDU01 RTS

View File

@ -78,7 +78,7 @@ GFXINIT JSR FDRAWADDR+0 ; Initialize FDRAW library
* Plot bitmap character on the HGR screen * Plot bitmap character on the HGR screen
* On entry: char is in A * On entry: char is in A
DRAWCHAR >>> ENTMAIN DRAWCHAR >>> ENTMAIN
AND #$7F * AND #$7F ; Don't!
STA A1L ; A*8 -> A1L,A1H STA A1L ; A*8 -> A1L,A1H
STZ A1H STZ A1H
ASL A1L ASL A1L
@ -155,7 +155,8 @@ HCLRLINE >>> ENTMAIN
:L1 LDY #$00 :L1 LDY #$00
:L2 STA (A4L),Y :L2 STA (A4L),Y
INY INY
CPY #$39 * CPY #$39
CPY #40
BNE :L2 BNE :L2
INC A4H INC A4H
INC A4H INC A4H