diff --git a/applecorn.po b/applecorn.po index 27bc420..17d687e 100644 Binary files a/applecorn.po and b/applecorn.po differ diff --git a/auxmem.gfx.s b/auxmem.gfx.s index f3915c2..010d48c 100644 --- a/auxmem.gfx.s +++ b/auxmem.gfx.s @@ -2,6 +2,160 @@ * (c) Bobbi 2021 GPLv3 * * 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 * 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