🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by Kent D. Meyers Sun, 09 Nov 1986 04:53
80 column screen driver for CoCo3 Level I OS9 version 2.00.
#824
Author: Kent D. Meyers
Date: Sun, 09 Nov 1986 04:53
479 lines
8784 bytes
* COCO3 80 Column Screen Driver for OS9.
* Full Emulation of the Version 2.00.00
* OS9 CO80 80 column video card driver.
* November 2, 1986.
* Kent D. Meyers.

* Special Credit to Kevin Darling for his CO80 disassembly.

* If assembled correctly, the ident is:
*
*    Header for:  CO80 
*    Module size: $029D    #669
*    Module CRC:  8634A3 (Good) 
*    Hdr parity:  $64 
*    Edition:     $07      #7
*    Ty/La At/Rv: $C1 $81 
*    System mod, 6809 obj, re-en 

* This Version has the Color Set Selection Optimized
* For Display on a Monochrome Monitor. Output is set
* to Monochrome to further enhance the display.

 NAM CO80 for COCO3 Level I OS9.

 IFP1
 USE DEFSFILE
 ENDC

 TTL CO80 Emulator for HiRes Text Screen.

 MOD LEN,NAME,SYSTM+OBJCT,REENT+1,ENTRY,0

* Special Definitions.

BACKGND EQU $0000 default background palette
BLACK EQU $0000 color number
FOREGND EQU $0000 default foreground palette
BACKINVS EQU $0001 inverse background palette
FOREINVS EQU $0001 inverse foreground palette
MONO EQU $0010 $10 for mono $00 for color
BUFF EQU $003F color number

* Cursor Type Attributes.

UNDERLIN EQU $0040
FLASH EQU $0080

* Customizable Setup Options.

BORDER EQU BUFF default border color
CURSOR EQU UNDERLIN default cursor type
CRSRATTR EQU FLASH+UNDERLIN cursor attributes
DEFAULT EQU BUFF*256+BLACK default color set
FOREBACK EQU FOREGND*8+BACKGND default character color attributes
INVERSE EQU FOREINVS*8+BACKINVS default inverse color attributes

* General Constants

ROWS EQU 24
SPACE EQU $20
COLUMNS EQU 80

* Offsets into CCIO's Static Memory Area

PARMCNT EQU $0025
PARMVEC EQU $0026
PARM0 EQU $0028
PARM EQU $0029

CURSRPOS EQU $0054 current absolute cursor position
COLMPTR EQU $0056 current column (0-79)
ROWPTR EQU $0057 current row (0-23)
ATTRIBS EQU $0058 default color attributes
CURSRTYP EQU $0059 current cursor type
VIDEO EQU $005A inverse/normal switch

COMODTYP EQU $0070 term type for CCIO

DSPLYMEM EQU $E000
DSPLYEND EQU DSPLYMEM+(ROWS*COLUMNS*2)

 NAM CO80

 FCB 6
NAME FCS "CO80"
 FCB 7 version

ENTRY
 LBRA INIT
 LBRA WRITE
 LBRA GETSTT
 LBRA SETSTT
 LBRA TERM

* ------------------------------------------------
* Do Special Codes:

CODE LEAX HRESEXIT,PCR
 PSHS X
 LEAX >CODES,PCR point to cmd table
 ASLA index
 LDD A,X get offset
 LEAX D,X plus table begin
 PSHS X make return address
 LDX CURSRPOS,U
 RTS do special code

* ------------------------------------------------
* Code Table:

CODES FDB CODE00-CODES null
 FDB CODE01-CODES home alpha cursor
 FDB CODE02-CODES goto x,y
 FDB CODE03-CODES erase line
 FDB CODE04-CODES erase to end of line
 FDB CODE05-CODES cursor change
 FDB CODE06-CODES right
 FDB CODE07-CODES null
 FDB CODE08-CODES left
 FDB CODE09-CODES up
 FDB CODE0A-CODES down
 FDB CODE0B-CODES erase to end of scrn
 FDB CODE0C-CODES cls
 FDB CODE0D-CODES <cr>

* ------------------------------------------------
* INITIALIZE

INIT BSR SETMAP
 LDD #FOREBACK*256+CURSOR
 STD ATTRIBS,U
 
 BSR WIPETEXT
 LEAX TXT80X24,PCR
 LDA #$E0
 STA $FF90
 LDA #8
 STA $FF92
 SYNC
 LDA ,X+
 STA $FF90
 LDY #$FF98

NEXTVREG LDA ,X+
 STA ,Y+
 CMPY #$FFA0
 BLO NEXTVREG
 LEAY 16,Y
 LDD #DEFAULT
 STD ,Y
 EXG A,B
 STD 8,Y
 LDB COMODTYP,U make term type
 ORB #$04 = 80-column
 BSR SETYPE for CCIO.
 LBRA HRESEXIT

* ------------------------------------------------
* TERMINATE

TERM
 LDB COMODTYP,U get 32/80 flag
 ANDB #$FB make it 32
SETYPE STB COMODTYP,U save
 CLRB and
 RTS good-bye.

* ------------------------------------------------

TXT80X24 FCB $4C,MONO+3,$15,BORDER,$00,$00,$6E*2,$00
 FCB $00

SETMAP ORCC #INTMASKS
 STB $FFD9
 LDB #$37
 STB $FFA7
 RTS

WIPETEXT LDX #DSPLYMEM
 STX CURSRPOS,U
 LDA #SPACE
 LDB ATTRIBS,U

WIPENEXT STD ,X++
 CMPX #DSPLYEND
 BLO WIPENEXT
CLERPTRS CLR COLMPTR,U
 CLR ROWPTR,U
 RTS

* ------------------------------------------------
* GETSTAT

GETSTT CMPA #SS.CURSR cursor info?
 BNE SETSTT ..no, can't do
 LDX PD.RGS,Y else X=user stack
 LDD COLMPTR,U
 ADDD #SPACE*256+SPACE
 PSHS A
 CLRA msb=00
 STD R$Y,X return it.
 PULS B
 STD R$X,X return it.
 BSR SETMAP
 LDX CURSRPOS,U
 LDA ,X get char
 LDX PD.RGS,Y
 STA R$A,X return char under cursor
 BRA HRESEXIT

* ------------------------------------------------
* SETSTAT


SETSTT LDB #E$UNKSVC 'Unknown Service Call'
 COMA

CODE00
CODE07
 RTS

* ------------------------------------------------
* WRITE CHAR

WRITE BSR SETMAP
 LDX CURSRPOS,U
 CMPA #$0E control code?
 LBLO CODE ..yes, go do
 CMPA #$1E
 BLO HRESEXIT
 CMPA #SPACE
 LBLO CHANGVID
 CMPA #$9F normal ASCII?
 BLS PRINTCHR
 LDA #$9F

PRINTCHR LDB ATTRIBS,U
 TST VIDEO,U
 BEQ NOINVERT
 LDB VIDEO,U

NOINVERT STD ,X
 BSR MVCURSOR

 CMPX #DSPLYEND
 BLO HRESEXIT
 BSR SCROLLUP

HRESEXIT LDA #$3F
 STA $FFA7
 STA $FFD8
 ANDCC #^INTMASKS-CARRY
RTSEXIT RTS

* Cursor Left. (Backspace)

CODE08 CMPX #DSPLYMEM
 BEQ RTSEXIT
 LBSR BLOTCRSR
 LEAX -2,X
 BSR MAKECRSR
 DEC COLMPTR,U
 BPL BAKSEXIT
 DEC ROWPTR,U
 LDA #COLUMNS-1
 STA COLMPTR,U
BAKSEXIT RTS

MVCURSOR BSR BLOTCRSR
 LEAX 2,X
 BSR MAKECRSR
 LDA COLMPTR,U
 INCA
 CMPA #COLUMNS
 BLO MOVEXIT
 INC ROWPTR,U
 CLRA

MOVEXIT STA COLMPTR,U
 RTS

* Carriage Return.

CODE0D LDA COLMPTR,U
 BEQ RTSEXIT
 CLR COLMPTR,U
 BSR BLOTCRSR
 NEGA
 LEAX A,X
 LEAX A,X
 BRA MAKECRSR

* Cursor Down. (Line Feed)

CODE0A BSR BLOTCRSR
 LEAX COLUMNS*2,X
 CMPX #DSPLYEND
 BHS SCROLLF
 INC ROWPTR,U
 BRA MAKECRSR

SCROLLF LDX CURSRPOS,U
 PSHS X
 BSR SCROLL2
 BSR BLOTCRSR
 PULS X
 BRA MAKECRSR

SCROLLUP CLR COLMPTR,U

SCROLL2 LDX #DSPLYMEM

SCROLL80 LDD COLUMNS*2,X
 STD ,X++
 CMPX #DSPLYMEM+((ROWS-1)*(COLUMNS*2))
 BLO SCROLL80

 LDA #ROWS-1
 STA ROWPTR,U

* Erase to End of Screen.

CODE0B LDA #SPACE
 LDB ATTRIBS,U
 PSHS X

CLERNEXT STD ,X++
 CMPX #DSPLYEND
 BNE CLERNEXT
 PULS X

MAKECRSR STX CURSRPOS,U
 LDB CURSRTYP,U
 ORB 1,X
 STB 1,X
 RTS

BLOTCRSR LDB #^CRSRATTR
 ANDB 1,X
 STB 1,X
BLOTEXIT RTS


* Home Cursor.

CODE01 BSR BLOTCRSR
 LDX #DSPLYMEM
 BSR MAKECRSR
 LBRA CLERPTRS

* Erase Line.

CODE03 BSR CODE0D
 PSHS X
 LEAX COLUMNS*2,X
 LDA #SPACE

EOL.HOOK LDB ATTRIBS,U

CLERMORE STD ,--X
 CMPX ,S
 BHI CLERMORE
 STA ,X
 PULS X,PC

* Erase to End of Line.

CODE04 LDA #SPACE 
 STA ,X
 LDB #COLUMNS-1
 CMPB COLMPTR,U
 BEQ BLOTEXIT
 INCB
 PSHS X
 SUBB COLMPTR,U
 LSLB
 ABX
 BRA EOL.HOOK

* Cursor Right.

CODE06 LDA #COLUMNS-1
 CMPA COLMPTR,U
 BEQ BLOTEXIT
 LBRA MVCURSOR

* Cursor Up.

CODE09 TST ROWPTR,U
 BEQ BLOTEXIT
 BSR BLOTCRSR
 LEAX -(COLUMNS*2),X
 DEC ROWPTR,U
 BRA MAKECRSR

* Clear Screen.

CODE0C LBSR WIPETEXT
 LDX #DSPLYMEM
 BRA MAKECRSR

* Cursor X,Y

CODE02 LEAX >MOVEVEC,PCR get return addrss
 LDB #2 need two parms (x,y)

GETPARMS STX PARMVEC,U set return
 STB PARMCNT,U and parm count
 RTS do it:

MOVEVEC LDD PARM0,U
 SUBA #SPACE drop protocol
 BLO BLOTEXIT ..ignore if bad
 CMPA #COLUMNS-1 column too high?
 BHI BLOTEXIT ..ignore
 SUBB #SPACE drop protocol
 BLO BLOTEXIT ..ignore
 CMPB #ROWS-1 row too high?
 BHI BLOTEXIT ..ignore
 STD COLMPTR,U else set new cursor x,y
 LBSR SETMAP
 LDX CURSRPOS,U
 LBSR BLOTCRSR
 LDD COLMPTR,U
 LSLA
 PSHS A
 LDA #COLUMNS*2
 MUL
 ADDB ,S+
 ADCA #$00
 LDX #DSPLYMEM
 LEAX D,X
 LBSR MAKECRSR
EXITHOOK LBRA HRESEXIT

* Normal/Inverse Video Switch

CHANGVID CMPA #$1F is code video type?
 BNE ERR.WRIT ..no, err
 LDA PARM,U yes, get parm
 CLRB
 EORA #SPACE
 BEQ SETVIDEO
 DECA
 BNE ERR.WRIT
 LDB #INVERSE
SETVIDEO STB VIDEO,U
 BRA EXITHOOK

ERR.WRIT LBSR HRESEXIT

ERR.WRI2 COMB
 LDB #E$WRITE 'Write Error'
 RTS

* Change Cursor

CODE05 LEAX >CHANGE,PCR return address
 LDB #1 need one parm
 BRA GETPARMS get it:

CHANGE LDA PARM,U get new cursor type
 CLRB
 SUBA #SPACE none?
 BLO ERR.WRI2 ..err
 BEQ CURSOFF yes, kill
 CMPA #$A too high?
 BHI GOODEXIT ..ignore
 LDB #CURSOR

CURSOFF STB CURSRTYP,U

GOODEXIT CLRB
 RTS

 EMOD
LEN EQU *
 END
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads