* 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