From 9290dd47b8b824d970b0080fc07811682ff9a539 Mon Sep 17 00:00:00 2001 From: Bobbi Webber-Manners Date: Sun, 26 Sep 2021 17:52:17 -0400 Subject: [PATCH] Merge JGH's latest VDU driver updates. (Attempt #2) --- applecorn.po | Bin 819200 -> 819200 bytes auxmem.gfx.s | 168 ++++++++++- auxmem.init.s | 2 +- auxmem.vdu.s | 803 ++++++++++++++++++++++++-------------------------- mainmem.gfx.s | 5 +- 5 files changed, 547 insertions(+), 431 deletions(-) diff --git a/applecorn.po b/applecorn.po index 27bc4208e2dddb8fc35b2b2df9e7f49a994a1daf..17d687e834c6e7a407b82e734ab42486ece121bb 100644 GIT binary patch delta 9775 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 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 * from 1280x1024 to 280x192 @@ -59,7 +213,7 @@ CVTCOORD ROR ZP2+0 LSR A ROR ZP2+0 - LSR A +:YCOORD4 LSR A ROR ZP2+0 LSR A ROR ZP2+0 @@ -92,15 +246,3 @@ RELCOORD CLC STA VDUQ+7 RTS - - - - - - - - - - - - diff --git a/auxmem.init.s b/auxmem.init.s index c69e2c5..dd75c88 100644 --- a/auxmem.init.s +++ b/auxmem.init.s @@ -177,7 +177,7 @@ BYTE00XX BEQ BYTE00A ; OSBYTE 0,0 - generate error RTS ; %000x1xxx host type, 'A'pple BYTE00A BRK DB $F7 -HELLO ASC 'Applecorn MOS 2021-09-24' +HELLO ASC 'Applecorn MOS 2021-09-26' DB $00 ; Unify MOS messages diff --git a/auxmem.vdu.s b/auxmem.vdu.s index 4857e57..f87b6c6 100644 --- a/auxmem.vdu.s +++ b/auxmem.vdu.s @@ -13,6 +13,9 @@ * 09-Sep-2021 New dispatch routine. * 22-Sep-2021 More VDU workspace, started MODE definitions. * 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,82 +36,92 @@ VDUSTATUS EQU $D0 ; $D0 # VDU status * bit 1 = Don't scroll (COPY cursor or VDU 5 mode) * bit 0 = VDU 2 printer echo active * -VDUCHAR EQU VDUSTATUS+1 ; $D1 -VDUADDR EQU VDUSTATUS+4 ; $D4 address of current char cell -OLDCHAR EQU OSKBD1 ; *TEMP* character under cursor -COPYCHAR EQU OSKBD2 ; *TEMP* character under copy cursor +VDUCHAR EQU VDUSTATUS+1 ; $D1 current control character +VDUTEMP EQU VDUCHAR ; &D1 +VDUADDR EQU VDUSTATUS+2 ; $D2 address of current char cell +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 *************************** -FXLINES EQU BYTEVARBASE+217 ; Paged scrolling line counter -FXVDUQLEN EQU BYTEVARBASE+218 ; Length of pending VDU queue +FXLINES EQU BYTEVARBASE+217 ; Paged scrolling line counter +FXVDUQLEN EQU BYTEVARBASE+218 ; Length of pending VDU queue VDUVARS EQU $290 VDUVAREND EQU $2ED -GFXWINLFT EQU VDUVARS+$00 ; # graphics window left -GFXWINBOT EQU VDUVARS+$02 ; # graphics window bottom \ window -GFXWINRGT EQU VDUVARS+$04 ; # graphics window right / size -GFXWINTOP EQU VDUVARS+$06 ; # graphics window top -TXTWINLFT EQU VDUVARS+$08 ; # text window left -TXTWINBOT EQU VDUVARS+$09 ; # text window bottom \ window -TXTWINRGT EQU VDUVARS+$0A ; # text window right / size -TXTWINTOP EQU VDUVARS+$0B ; # text window top -GFXORIGX EQU VDUVARS+$0C ; graphics X origin -GFXORIGY EQU VDUVARS+$0E ; graphics Y origin +GFXWINLFT EQU VDUVARS+$00 ; # graphics window left +GFXWINBOT EQU VDUVARS+$02 ; # graphics window bottom \ window +GFXWINRGT EQU VDUVARS+$04 ; # graphics window right / size +GFXWINTOP EQU VDUVARS+$06 ; # graphics window top +TXTWINLFT EQU VDUVARS+$08 ; # text window left +TXTWINBOT EQU VDUVARS+$09 ; # text window bottom \ window +TXTWINRGT EQU VDUVARS+$0A ; # text window right / size +TXTWINTOP EQU VDUVARS+$0B ; # text window top +GFXORIGX EQU VDUVARS+$0C ; graphics X origin +GFXORIGY EQU VDUVARS+$0E ; graphics Y origin * -GFXPOSNX EQU VDUVARS+$10 ; current graphics X posn -GFXPOSNY EQU VDUVARS+$12 ; current graphics Y posn -GFXLASTX EQU VDUVARS+$14 ; last graphics X posn -GFXLASTY EQU VDUVARS+$16 ; last graphics Y posn -VDUTEXTX EQU VDUVARS+$18 ; # absolute text X posn = POS+WINLFT -VDUTEXTY EQU VDUVARS+$19 ; # absolute text Y posn = VPOS+WINTOP -VDUCOPYX EQU VDUVARS+$1A ; absolute COPY text X posn -VDUCOPYY EQU VDUVARS+$1B ; absolute COPY text Y posn +GFXPOSNX EQU VDUVARS+$10 ; current graphics X posn +GFXPOSNY EQU VDUVARS+$12 ; current graphics Y posn +GFXLASTX EQU VDUVARS+$14 ; last graphics X posn +GFXLASTY EQU VDUVARS+$16 ; last graphics Y posn +VDUTEXTX EQU VDUVARS+$18 ; # absolute text X posn = POS+WINLFT +VDUTEXTY EQU VDUVARS+$19 ; # absolute text Y posn = VPOS+WINTOP +VDUCOPYX EQU VDUVARS+$1A ; absolute COPY text X posn +VDUCOPYY EQU VDUVARS+$1B ; absolute COPY text Y posn * -PIXELPLOTX EQU VDUVARS+$1C ; PLOT graphics X in pixels -PIXELPLOTY EQU VDUVARS+$1E ; PLOT graphics Y in pixels -PIXELPOSNX EQU VDUVARS+$20 ; current graphics X in pixels -PIXELPOSNY EQU VDUVARS+$22 ; current graphics Y in pixels -PIXELLASTX EQU VDUVARS+$24 ; last graphics X in pixels -PIXELLASTY EQU VDUVARS+$26 ; last graphics Y in pixels +PIXELPLOTX EQU VDUVARS+$1C ; PLOT graphics X in pixels +PIXELPLOTY EQU VDUVARS+$1E ; PLOT graphics Y in pixels +PIXELPOSNX EQU VDUVARS+$20 ; current graphics X in pixels +PIXELPOSNY EQU VDUVARS+$22 ; current graphics Y in pixels +PIXELLASTX EQU VDUVARS+$24 ; last graphics X 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 -CURSORED EQU VDUVARS+$29 ; character used for edit cursor -CURSORCP EQU VDUVARS+$2A ; character used for copy cursor +CURSOR EQU VDUVARS+$28 ; character used for cursor +CURSORCP EQU VDUVARS+$29 ; character used for copy cursor +CURSORED EQU VDUVARS+$2A ; character used for edit cursor * -VDUQ EQU VDUVARS+$2B ; $2B..$33 -VDUQLAST EQU VDUQ+1 ; Neatly becomes VDUVARS+$2C -VDUQPLOT EQU VDUQ+5 ; Neatly becomes VDUVARS+$30 +VDUQ EQU VDUVARS+$2B ; $2B..$33 +VDUQLAST EQU VDUQ+1 ; Neatly becomes VDUVARS+$2C +VDUQPLOT EQU VDUQ+5 ; Neatly becomes VDUVARS+$30 * -VDUBORDER EQU VDUVARS+$34 ; Border colour -VDUMODE EQU VDUVARS+$35 ; # current MODE -VDUSCREEN EQU VDUVARS+$36 ; # MODE type -TXTFGD EQU VDUVARS+$37 ; # Text foreground -TXTBGD EQU VDUVARS+$38 ; # Text background -GFXFGD EQU VDUVARS+$39 ; # Graphics foreground -GFXBGD EQU VDUVARS+$3A ; # Graphics background -GFXPLOTFGD EQU VDUVARS+$3B ; # Foreground GCOL action -GFXPLOTBGD EQU VDUVARS+$3C ; # Background GCOL action +VDUBORDER EQU VDUVARS+$34 ; Border colour +VDUMODE EQU VDUVARS+$35 ; # current MODE +VDUSCREEN EQU VDUVARS+$36 ; # MODE type +TXTFGD EQU VDUVARS+$37 ; # Text foreground +TXTBGD EQU VDUVARS+$38 ; # Text background +GFXFGD EQU VDUVARS+$39 ; # Graphics foreground +GFXBGD EQU VDUVARS+$3A ; # Graphics background +GFXPLOTFGD EQU VDUVARS+$3B ; # Foreground GCOL action +GFXPLOTBGD EQU VDUVARS+$3C ; # Background GCOL action VDUVAR3D EQU VDUVARS+$3D VDUVAR3E EQU VDUVARS+$3E -VDUBYTES EQU VDUVARS+$3F ; # bytes per char, 1=text only -VDUCOLOURS EQU VDUVARS+$40 ; # colours-1 -VDUPIXELS EQU VDUVARS+$41 ; # pixels per byte -VDUWORKSP EQU VDUVARS+$42 ; 28 bytes of general workspace +VDUBYTES EQU VDUVARS+$3F ; bytes per char, 1=text only +VDUCOLOURS EQU VDUVARS+$40 ; # colours-1 +VDUPIXELS EQU VDUVARS+$41 ; # pixels per byte +VDUWORKSP EQU VDUVARS+$42 ; 28 bytes of general workspace VDUWORKSZ EQU VDUVAREND-VDUWORKSP+1 * * Screen definitions -* 0 1 2 3 4 5 6 7 -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 -SCNBYTES DB 1,1,8,1,1,1,1,1 -SCNCOLOURS DB 1,1,8,1,1,1,1,1 -SCNTYPE DB 1,0,128,1,0,0,0,0 +* 1 3 6 7 +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 +SCNBYTES DB 1, 8, 1, 1, 1, 1, 1, 1 ; Bytes per character +SCNCOLOURS DB 15,15,15,15,15,15,15,15 ; Colours-1 +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 * b6=Teletext * 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) @@ -180,7 +193,7 @@ CTRLCHARGO2 PHP ; Save CS=(ctrl>=8 && ctrl<=13) RTS ; Return, CC=Don't echo to printer OUTCHARGO ASL A ; Entry point to move COPY cursor - TAY ; (TEMP and scroll screen) + TAY CTRLCHARJMP CPY #6*2 BEQ CTRLCHAR6 ; Always allow VDU 6 through BIT VDUSTATUS @@ -320,52 +333,43 @@ PRCHRC PHA ; Save character :RESUME PLA * Put character to screen -PUTCHRC EOR #$80 ; Convert character - TAY +* Puts character to text screen buffer, then in graphics mode, +* writes bitmap to graphics screen +PUTCHRC PHA + EOR #$80 ; Convert character to screen code + TAX AND #$A0 BNE PRCHR4 - CPY #$20 - BCS PRCHR3 ; Not $80-$9F + CPX #$20 + BCS PRCHR3 ; Not $80-$9F BIT VDUSCREEN - BVC PRCHR3 ; Not teletext - LDY #$E0 ; Convert $80-$9F to space -PRCHR3 TYA + BVC PRCHR3 ; Not teletext + LDX #$E0 ; Convert $80-$9F to space +PRCHR3 TXA EOR #$40 - TAY -PRCHR4 PHY - JSR CHARADDR ; Find character address - PLA ; Get character back - PHA ; Stash it again - PHP ; Disable IRQs while - SEI ; toggling memory - BCC PRCHR6 ; Aux memory - STA $C004 ; Switch to main memory -PRCHR6 STA (VDUADDR),Y ; Store it - STA $C005 ; Back to aux memory - PLP ; Restore IRQs - LDY VDUBYTES - DEY ; If VDUBYTE=1, text mode - BEQ :DONE - 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 -:DONE PLA ; Discard character - RTS - -PUTCHRET >>> ENTAUX - RTS + TAX +PRCHR4 JSR CHARADDR ; Find character address + TXA ; Get character back + BIT VDUBANK +* BPL PRCHR5 ; Not AppleGS, use short write +* DB $97,VDUADDR ; STA [VDUADDR],Y +* BRA PRCHR8 +PRCHR5 PHP ; Disable IRQs while + SEI ; toggling memory + BCC PRCHR6 ; Aux memory + STA $C004 ; Switch to main memory +PRCHR6 STA (VDUADDR),Y ; Store it +PRCHR7 STA $C005 ; Back to aux memory + PLP ; Restore IRQs +PRCHR8 PLA + BIT VDUSCREEN + BPL GETCHROK + JMP PRCHRSOFT ; Write character to graphics +* OSBYTE &87 - Read character at cursor +*************************************** * 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 GETCHRC JSR CHARADDR ; Find character address PHP ; Disable IRQs while @@ -387,45 +391,53 @@ GETCHR7 TYA TAX ; X=char GETCHROK RTS -* Get text cursor position -BYTE86 LDY VDUTEXTY ; ROW ; $86 = read cursor pos - LDX VDUTEXTX ; COL + +* OSBYTE &86 - Get text cursor position +*************************************** +BYTE86 LDY VDUTEXTY + LDX VDUTEXTX RTS * Calculate character address +* NB: VDUBANK at VDUADDR+2 is set by VDU22 CHARADDR LDA VDUTEXTY - ASL - TAX - LDA SCNTAB+0,X ; LSB of row address +CHARADDRY ASL + TAY + LDA SCNTAB+0,Y ; LSB of row address STA VDUADDR+0 - LDA SCNTAB+1,X ; MSB of row address + LDA SCNTAB+1,Y ; MSB of row address STA VDUADDR+1 LDA VDUTEXTX BIT $C01F SEC - BPL CHARADDR40 ; 40-col + BPL CHARADDR40 ; 40-col 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 * (VDUADDR),Y=>character address -* CC=auxmem -* CS=mainmem +* VDUBANK = AppleGS screen bank +* 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 * Add $0400 for each subsequent row of the char HCHARADDR LDA VDUTEXTY ASL - TAX + TAY CLC - LDA HGRTAB+0,X ; LSB of row address + LDA HGRTAB+0,Y ; LSB of row address ADC VDUTEXTX STA VDUADDR+0 - LDA HGRTAB+1,X ; MSB of row address + LDA HGRTAB+1,Y ; MSB of row address ADC #$00 STA VDUADDR+1 RTS -* (VDUADDR)=>character address +* (VDUADDR)=>character address, X=preserved * Move cursor left VDU08 LDA VDUTEXTX ; COL @@ -504,307 +516,28 @@ VDU31 LDY VDUQ+8 * VDU 26 - Reset to default windows -VDU26 LDX VDUMODE -VDU26A LDA SCNTXTMAXX,X - STA TXTWINRGT - LDA SCNTXTMAXY,X - STA TXTWINBOT +VDU26 LDA #$F7 + JSR CLRSTATUS ; Clear 'soft window' +VDU26A LDX #VDUWINEND-VDUVARS + LDA #$00 +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 - - -* Initialise VDU driver -*********************** -* On entry, A=MODE to start in -* -VDUINIT STA VDUQ+8 - -* VDU 22 - MODE n -***************** -* At the moment only MODEs available: -* MODE 3 - 80x24 text -* MODE 6 - 40x24 text -* MODE 7 - 40x24 with $80-$9F converted to spaces -* MODE 2 - 280x192 HGR graphics, 40 cols bitmap text -* MODE 0 defaults to MODE 3 -* All others default to MODE 6 -* -VDU22 LDA VDUQ+8 - AND #$07 - STA VDUMODE - TAX ; Set up MODE - LDA #'_' ; Set up default cursors - STA CURSOR ; Normal cursor - STA CURSORCP ; Copy cursor when editing - LDA #$A0 - STA CURSORED ; Edit cursor when editing - LDA #$01 - JSR CLRSTATUS ; Clear everything except PrinterEcho - JSR VDU26A -* - LDA SCNBYTES,X - STA VDUBYTES - LDA SCNCOLOURS,X - STA VDUCOLOURS - LDA SCNTYPE,X - STA VDUSCREEN - BMI VDU22G ; b7=1, graphics mode -* TEMP - CPX #2 - BEQ VDU22G ; Jump out for MODE 1 -* TEMP -* - AND #$01 ; 40col/80col bit - TAX - STA $C00C,X ; Select 40col/80col - STA $C051 ; Enable Text - STA $C055 ; PAGE2 - STA $C052 ; Clear MIXED - STA $C00F ; Enable alt charset - BRA VDU22CLR - - -VDU22G STA $C050 ; Enable Graphics - STA $C057 ; Hi-Res - 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 - CMP #23 - BEQ :S3 - INC VDUTEXTY ; ROW - BRA :L1 -:S3 STZ VDUTEXTY ; ROW - STZ VDUTEXTX ; COL - RTS -VDU12SOFT JMP VDU16 ; *TEMP* - - -* Clear screen line -CLRLINE LDA VDUTEXTY ; ROW - ASL - TAX - LDA SCNTAB,X ; LSB of row - STA ZP1 - LDA SCNTAB+1,X ; MSB of row - STA ZP1+1 - LDA VDUTEXTX ; COL - PHA - STZ VDUTEXTX ; COL -:L1 LDA VDUTEXTX ; COL - LSR - TAY - BCC :S1 - >>> WRTMAIN -:S1 LDA #" " - STA (ZP1),Y - >>> WRTAUX - LDA VDUTEXTX ; COL - CMP #79 - BEQ :S2 - INC VDUTEXTX ; COL - BRA :L1 -:S2 PLA - STA VDUTEXTX ; COL - LDY VDUBYTES - DEY ; If VDUBYTE=1, text mode - BEQ :DONE - LDA VDUTEXTY - ASL - TAX - >>> WRTMAIN - LDA HGRTAB+0,X - STA HGRADDR+0 - LDA HGRTAB+1,X - STA HGRADDR+1 - >>> WRTAUX - >>> XF2MAIN,HCLRLINE -:DONE RTS - -CLRLNRET >>> ENTAUX - RTS - -* Scroll whole screen one line -SCROLLER LDA #$00 -:L1 PHA - JSR SCR1LINE ; Scroll text screen 1 line - PLA - LDY VDUBYTES - 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 - BNE :L1 - 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 - TAX - LDA SCNTAB,X - STA ZP1 - LDA SCNTAB+1,X - STA ZP1+1 - INX ; Source addr->ZP2 - INX - LDA SCNTAB,X - STA ZP2 - LDA SCNTAB+1,X - STA ZP2+1 - LDY #$00 -:L1 LDA (ZP2),Y - STA (ZP1),Y - STA $C002 ; Read main mem - >>> WRTMAIN - LDA (ZP2),Y - STA (ZP1),Y - STA $C003 ; Read aux mem - >>> WRTAUX - INY - CPY #40 - BNE :L1 - RTS - -* Copy text line A+1 to line A for HGR bitmap gfx mode -HSCR1LINE >>> XF2MAIN,HGRSCR1L -HSCR1RET >>> ENTAUX - RTS - -* VDU 1 - Send one character to printer -VDU01 RTS - -* VDU 16 - CLG, clear graphics window -VDU16 >>> XF2MAIN,CLRHGR -VDU16RET >>> ENTAUX - STZ XPIXEL+0 - STZ XPIXEL+1 - LDA #191 - STA YPIXEL - RTS - -* VDU 17 - COLOUR n - select text or border colour -VDU17 RTS - -* VDU 18 - GCOL k,a - select graphics colour and plot action -VDU18 LDA VDUQ+7 ; Argument 'k' - CMP #$04 ; k=4 means XOR - LDA #$00 ; Normal drawing mode - BNE :NORM - 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 - -* VDU 19 - Select palette colours -VDU19 RTS - -* VDU 20 - Reset to default colours -VDU20 RTS - -* VDU 23 - Program video system and define characters -VDU23 RTS - * VDU 24,left;bottom;right;top; - define graphics window 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 -VDU25 JSR CVTCOORD ; Convert coordinate system - LDA VDUQ+4 - AND #$04 ; Bit 2 set -> absolute - BNE :ABS - JSR RELCOORD ; Add coords to XPIXEL/YPIXEL -:ABS LDA VDUQ+4 - AND #$03 - CMP #$0 ; Bits 0,1 clear -> just move - BNE :NOTMOVE - 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 @@ -812,6 +545,248 @@ VDU28 RTS VDU29 RTS +* Initialise VDU driver +*********************** +* On entry, A=MODE to start in +* +VDUINIT STA VDUQ+8 +* JSR FONTIMPLODE ; Reset VDU 23 font + +* VDU 22 - MODE n +***************** +* At the moment only MODEs available: +* MODE 1 - 280x192 HGR graphics, 40 cols bitmap text +* MODE 3 - 80x24 text +* MODE 6 - 40x24 text +* MODE 7 - 40x24 with $80-$9F converted to spaces +* MODE 0 defaults to MODE 3 +* All others default to MODE 6 +* +* Wait for VSync? +VDU22 LDA VDUQ+8 + AND #$07 + 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 + STA CURSOR ; Normal cursor + STA CURSORCP ; Copy cursor when editing + LDA #$A0 + STA CURSORED ; Edit cursor when editing + JSR VDU20 ; Default colours + JSR VDU26 ; Default windows + STA $C052 ; Clear MIXED + LDA VDUSCREEN + BMI VDU22G ; b7=1, graphics mode + AND #$01 ; 40col/80col bit + TAX + STA $C00C,X ; Select 40col/80col + STA $C051 ; Enable Text + STA $C055 ; PAGE2 + STA $C00F ; Enable alt charset +* Fall through into CLS + +VDU12 STZ FXLINES + STZ VDUTEXTX + STZ VDUTEXTY + +* Clear the text screen buffer +:L1 JSR CLREOL +:S2 LDA VDUTEXTY ; ROW + CMP #23 + BEQ :S3 + INC VDUTEXTY ; ROW + BRA :L1 +:S3 STZ VDUTEXTY ; ROW + STZ VDUTEXTX ; COL + BIT VDUSCREEN + BMI VDU12SOFT ; Graphics mode + RTS +* Clear the graphics screen buffer +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 to EOL +CLRLINE +CLREOL JSR CHARADDR ; Set VDUADDR=>start of line +* BIT VDUBANK +* BMI CLREOLGS ; AppleGS + LDY #39 + LDA #$A0 +:L1 STA (VDUADDR),Y + PHP + SEI + STA $C004 + STA (VDUADDR),Y + STA $C005 + PLP + DEY + BPL :L1 + BIT VDUSCREEN + BPL CLREOLOK + JMP HSCRCLREOL ; Clear an HGR line +CLREOLOK RTS +CLREOLGS LDX #1 +:L2 LDY #39 + LDA #$A0 +:L3 DB $97,VDUADDR ; STA [VDUADDR],Y + DEY + BPL :L3 + LDA VDUBANK + EOR #$01 + STA VDUBANK + DEX + BPL :L2 + RTS + +* Scroll whole screen one line +SCROLLER LDA #$00 +:L1 PHA + JSR SCR1LINE + PLA + INC + CMP #23 + BNE :L1 + 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 PHA + JSR CHARADDRY ; VDUADDR=>line A + LDX #2 +:L1 LDA VDUADDR,X ; Copy to VDUADDR2 + STA VDUADDR2,X + DEX + BPL :L1 + PLA + PHA + INC A + JSR CHARADDRY ; VDUADDR=>line A+1 +* BIT VDUBANK +* BMI SCROLLGS + LDY #39 +:L2 LDA (VDUADDR),Y + STA (VDUADDR2),Y + PHP + SEI + STA $C002 ; Read main mem + STA $C004 ; Write main mem + LDA (VDUADDR),Y + STA (VDUADDR2),Y + STA $C003 ; Read aux mem + STA $C005 ; Write aux mem + PLP + DEY + 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 + +* Copy text line A+1 to line A for HGR bitmap gfx mode +SCR1SOFT JMP HSCR1LINE + +* VDU 16 - CLG, clear graphics window +VDU16 JMP HSCRCLEAR + +* VDU 20 - Reset to default colours +VDU20 LDA #$00 ; *TEMP* + STA $C034 + LDA #$F0 + STA $C022 + LDA #$00 + LDX #$07 + JSR HSCRSETGCOL + LDA #$00 + LDX #$80 + JSR HSCRSETGCOL + RTS + +* VDU 17 - COLOUR n - select text or border colour +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 +VDU18 LDA VDUQ+7 ; GCOL action + LDX VDUQ+8 ; GCOL colour +* TO DO: set local VDU variables + JSR HSCRSETGCOL + RTS + +* VDU 19 - Select palette colours +VDU19 RTS + +* VDU 23 - Program video system and define characters +VDU23 RTS + +* VDU 25,k,x;y; - PLOT k,x,y - PLOT point, line, etc. +* k is in VDUQ+4 +* x is in VDUQ+5,VDUQ+6 +* y is in VDUQ+7,VDUQ+8 +VDU25 JMP HGRPLOT +* TO DO: +* coord=coord+origin +* scale coord +* call HGRPLOT +* copy this->last, coord->this +* check for Escape + * OSBYTE &A0 - Read VDU variable @@ -827,10 +802,8 @@ BYTEA02 LDY VDUVARS+1,X RTS - - - - - - +* PRINTER DRIVER +**************** +* VDU 1 - Send one character to printer +VDU01 RTS diff --git a/mainmem.gfx.s b/mainmem.gfx.s index a88b5f4..a7fe740 100644 --- a/mainmem.gfx.s +++ b/mainmem.gfx.s @@ -78,7 +78,7 @@ GFXINIT JSR FDRAWADDR+0 ; Initialize FDRAW library * Plot bitmap character on the HGR screen * On entry: char is in A DRAWCHAR >>> ENTMAIN - AND #$7F +* AND #$7F ; Don't! STA A1L ; A*8 -> A1L,A1H STZ A1H ASL A1L @@ -155,7 +155,8 @@ HCLRLINE >>> ENTMAIN :L1 LDY #$00 :L2 STA (A4L),Y INY - CPY #$39 +* CPY #$39 + CPY #40 BNE :L2 INC A4H INC A4H