623 lines
11 KiB
Plaintext
623 lines
11 KiB
Plaintext
NLS
|
|
TTL "S:FDRAW"
|
|
ORG = $8A00
|
|
;
|
|
; Routine to draw string
|
|
; of chars using pixel data table
|
|
;
|
|
; New fast version
|
|
; by Roland Gustafsson
|
|
;
|
|
SP = $E000
|
|
;
|
|
GETINIT = SP+105
|
|
GETBYTE = SP+108
|
|
;
|
|
FONTADDR = $8500
|
|
WTABLE = FONTADDR
|
|
HTABLE = FONTADDR+$3B
|
|
PIXADLO = FONTADDR+$76
|
|
PIXADHI = FONTADDR+$B1
|
|
;
|
|
KTABLE = $0300
|
|
;
|
|
TABHI = $9100
|
|
TABLO = $91C0
|
|
XBYTE2 = $9398
|
|
XBIT2 = $94B0
|
|
;-----------
|
|
;
|
|
; CSIZE, PIXAD & XCUR are to be used
|
|
; by external LINEDRAW routines.
|
|
;
|
|
DAT EPZ $50
|
|
;
|
|
PIXAD EPZ DAT
|
|
XCUR EPZ DAT+2
|
|
WCOUNT EPZ DAT+4
|
|
BUFFER1 EPZ DAT+5
|
|
BUFFER2 EPZ DAT+7
|
|
XBYTE EPZ DAT+9
|
|
DATABYTE EPZ DAT+10
|
|
BCOUNT EPZ DAT+11
|
|
BLDBYTE EPZ DAT+12
|
|
;
|
|
SLENGTH EPZ DAT+13
|
|
TEMP EPZ DAT+15
|
|
YCUR EPZ DAT+16
|
|
HCOUNT EPZ DAT+17
|
|
WIDTH EPZ DAT+18
|
|
STRPTR EPZ DAT+19
|
|
;-----------
|
|
ORG ORG
|
|
OBJ $0800
|
|
;-----------
|
|
START JMP STRING0
|
|
;-----------
|
|
OPTION HEX 02
|
|
XOPTION HEX 02
|
|
XPOS HEX 0000
|
|
YPOS HEX 0000
|
|
PIECE HEX 00
|
|
CSPACE HEX 01
|
|
CSIZE HEX 00
|
|
STRADDR HEX 0000
|
|
KERN? HEX 00
|
|
;-----------
|
|
; Kern mode $00:no kern
|
|
; $01:kern
|
|
; $80:use same kern table
|
|
;-----------
|
|
JMP INSTALL
|
|
JMP SCREEN
|
|
JMP FINSTALL
|
|
;-----------
|
|
;
|
|
STRING0 JSR OPTIONMD
|
|
;
|
|
LDA STRADDR
|
|
STA GETSTRX+1
|
|
LDA STRADDR+1
|
|
STA GETSTRX+2
|
|
;
|
|
BIT KERN?
|
|
BMI >0
|
|
JSR KERN
|
|
;
|
|
; If left justify, then skip
|
|
; length-computation routine
|
|
;
|
|
^0 LDA XOPTION
|
|
BEQ STRING1
|
|
;
|
|
; Compute length of string
|
|
;
|
|
LDX #0
|
|
STX SLENGTH
|
|
STX SLENGTH+1
|
|
;
|
|
^0 JSR GETSTRX
|
|
BEQ >2
|
|
SEC
|
|
SBC #$20
|
|
TAY
|
|
LDA WTABLE,Y
|
|
FONTMOD0 = *-1
|
|
SEC
|
|
SBC KTABLE,X
|
|
CLC
|
|
ADC CSPACE
|
|
ADC SLENGTH
|
|
STA SLENGTH
|
|
BCC >1
|
|
INC SLENGTH+1
|
|
^1 INX
|
|
BNE <0
|
|
;
|
|
^2 CPX #0
|
|
BEQ >4
|
|
LDA SLENGTH
|
|
SEC
|
|
SBC CSPACE
|
|
STA SLENGTH
|
|
BCS *+4
|
|
DEC SLENGTH+1
|
|
LDX CSIZE
|
|
BEQ >4
|
|
^3 ASL SLENGTH
|
|
ROL SLENGTH+1
|
|
DEX
|
|
BNE <3
|
|
;
|
|
^4 LDX XOPTION
|
|
CPX #3
|
|
BEQ STRLENGT
|
|
DEX
|
|
BEQ >5
|
|
LSR SLENGTH+1
|
|
ROR SLENGTH
|
|
^5 LDA XPOS
|
|
SEC
|
|
SBC SLENGTH
|
|
STA XPOS
|
|
LDA XPOS+1
|
|
SBC SLENGTH+1
|
|
STA XPOS+1
|
|
;
|
|
; Draw the string to buffer
|
|
;
|
|
STRING1 LDX #0
|
|
^0 STX STRPTR
|
|
JSR GETSTRX
|
|
BEQ STRING8
|
|
JSR CHAR
|
|
LDX STRPTR
|
|
JSR GETSTRX
|
|
SEC
|
|
SBC #$20
|
|
TAY
|
|
LDA CSPACE
|
|
CLC
|
|
ADC WTABLE,Y
|
|
FONTMOD1 = *-1
|
|
INX
|
|
SEC
|
|
SBC KTABLE,X
|
|
LDY #0
|
|
STY TEMP
|
|
LDY CSIZE
|
|
BEQ >2
|
|
^1 ASL
|
|
ROL TEMP
|
|
DEY
|
|
BNE <1
|
|
^2 CLC
|
|
ADC XPOS
|
|
STA XPOS
|
|
LDA TEMP
|
|
ADC XPOS+1
|
|
STA XPOS+1
|
|
BCC <0
|
|
;
|
|
STRLENGT LDY SLENGTH
|
|
LDA SLENGTH+1
|
|
STRING8 LDX #1
|
|
RTS
|
|
;-----------
|
|
; Routine for LDA STRING,X
|
|
;
|
|
GETSTRX LDA STRADDR,X
|
|
RTS
|
|
;-----------
|
|
;
|
|
; Draw character on screen
|
|
; Upper left corner in XPOS,YPOS
|
|
;
|
|
CHAR SEC
|
|
SBC #$20
|
|
BEQ CDONE
|
|
TAX
|
|
LDA HTABLE,X
|
|
FONTMOD2 = *-1
|
|
STA HCOUNT
|
|
LDA WTABLE,X
|
|
FONTMOD3 = *-1
|
|
STA WIDTH
|
|
LDA PIXADLO,X
|
|
FONTMOD4 = *-1
|
|
STA PIXAD
|
|
LDA PIXADHI,X
|
|
FONTMOD5 = *-1
|
|
STA PIXAD+1
|
|
LDA CSIZE
|
|
ASL
|
|
BNE CHAR1
|
|
LDA #1
|
|
CHAR1 STA TEMP
|
|
LDA YPOS
|
|
STA YCUR
|
|
CHAR2 LDA XPOS
|
|
STA XCUR
|
|
LDA XPOS+1
|
|
STA XCUR+1
|
|
LDA WIDTH
|
|
STA WCOUNT
|
|
LDY YCUR
|
|
LINEMOD JSR LINEDRAW
|
|
;
|
|
LDA YCUR
|
|
CLC
|
|
ADC TEMP
|
|
STA YCUR
|
|
DEC HCOUNT
|
|
BNE CHAR2
|
|
CDONE RTS
|
|
;-----------
|
|
; KERN SECTION
|
|
;
|
|
LADDR EPZ DAT
|
|
RADDR EPZ DAT+2
|
|
LBWIDTH EPZ DAT+4
|
|
RBWIDTH EPZ DAT+5
|
|
LCHAR EPZ DAT+6
|
|
RCHAR EPZ DAT+7
|
|
KCOUNT EPZ DAT+9
|
|
LREM EPZ DAT+10
|
|
MINWIDTH EPZ DAT+11
|
|
;
|
|
KERN LDX #0
|
|
STX KTABLE
|
|
KERN0 STX STRPTR
|
|
JSR GETSTRX
|
|
BEQ KDONE
|
|
;
|
|
LDY KERN?
|
|
BEQ KERN2
|
|
;
|
|
CMP #'A'
|
|
BCC KERN2
|
|
STA LCHAR
|
|
INX
|
|
JSR GETSTRX
|
|
BEQ KDONE
|
|
CMP #'A'
|
|
BCC KERN2
|
|
STA RCHAR
|
|
JSR KSETUP
|
|
LDA KCOUNT
|
|
CMP #100
|
|
BCC KERN1
|
|
KERN2 LDA #0
|
|
KERN1 LDX STRPTR
|
|
INX
|
|
STA KTABLE,X
|
|
JMP KERN0
|
|
KDONE LDA #0
|
|
STA KTABLE,X
|
|
RTS
|
|
;
|
|
KSETUP SEC
|
|
ROR MINWIDTH
|
|
LDA LCHAR
|
|
JSR BWCOMP
|
|
STA LBWIDTH
|
|
STY LREM
|
|
LDA PIXADLO,X
|
|
FONTMOD6 = *-1
|
|
STA LADDR
|
|
LDA PIXADHI,X
|
|
FONTMOD7 = *-1
|
|
STA LADDR+1
|
|
LDA HTABLE,X
|
|
FONTMOD8 = *-1
|
|
STA HCOUNT
|
|
LDA RCHAR
|
|
JSR BWCOMP
|
|
STA RBWIDTH
|
|
LDA PIXADLO,X
|
|
FONTMOD9 = *-1
|
|
STA RADDR
|
|
LDA PIXADHI,X
|
|
FONTMODA = *-1
|
|
STA RADDR+1
|
|
LDA HTABLE,X
|
|
FONTMODB = *-1
|
|
CMP HCOUNT
|
|
BGE KERN4
|
|
STA HCOUNT
|
|
KERN4 LDA MINWIDTH
|
|
CLC
|
|
ADC CSPACE
|
|
STA KCOUNT
|
|
KERN5 JSR LCOMP
|
|
STA TEMP
|
|
JSR RCOMP
|
|
CLC
|
|
ADC TEMP
|
|
CMP KCOUNT
|
|
BGE KERN6
|
|
STA KCOUNT
|
|
KERN6 LDA LADDR
|
|
CLC
|
|
ADC LBWIDTH
|
|
STA LADDR
|
|
BCC KERN7
|
|
INC LADDR+1
|
|
KERN7 LDA RADDR
|
|
CLC
|
|
ADC RBWIDTH
|
|
STA RADDR
|
|
BCC KERN8
|
|
INC RADDR+1
|
|
KERN8 DEC HCOUNT
|
|
BNE KERN5
|
|
RTS
|
|
;
|
|
BWCOMP SEC
|
|
SBC #$20
|
|
TAX
|
|
LDA WTABLE,X
|
|
FONTMODC = *-1
|
|
CMP MINWIDTH
|
|
BGE >0
|
|
STA MINWIDTH
|
|
^0 SEC
|
|
SBC #1
|
|
PHA
|
|
AND #$07
|
|
EOR #$07
|
|
TAY
|
|
PLA
|
|
LSR
|
|
LSR
|
|
LSR
|
|
CLC
|
|
ADC #1
|
|
RTS
|
|
;
|
|
LCOMP LDX #0
|
|
LDY LBWIDTH
|
|
DEY
|
|
LCOMP2 LDA (LADDR),Y
|
|
BNE LCOMP3
|
|
TXA
|
|
CLC
|
|
ADC #8
|
|
TAX
|
|
DEY
|
|
BPL LCOMP2
|
|
LDA #100
|
|
RTS
|
|
LCOMP3 INX
|
|
LSR
|
|
BCC LCOMP3
|
|
DEX
|
|
TXA
|
|
SEC
|
|
SBC LREM
|
|
RTS
|
|
;
|
|
RCOMP LDX #0
|
|
LDY #0
|
|
RCOMP2 LDA (RADDR),Y
|
|
BNE RCOMP3
|
|
TXA
|
|
CLC
|
|
ADC #$08
|
|
TAX
|
|
INY
|
|
CPY RBWIDTH
|
|
BNE RCOMP2
|
|
LDA #100
|
|
RTS
|
|
RCOMP3 INX
|
|
ASL
|
|
BCC RCOMP3
|
|
DEX
|
|
TXA
|
|
RTS
|
|
;-----------
|
|
;
|
|
; Draw line of font data
|
|
;
|
|
; given Y=ycoor
|
|
;
|
|
LINEDRAW LDA TABLO,Y
|
|
STA BUFFER1
|
|
LDA TABHI,Y
|
|
STA BUFFER1+1
|
|
LDA TABLO+1,Y
|
|
STA BUFFER2
|
|
LDA TABHI+1,Y
|
|
STA BUFFER2+1
|
|
;
|
|
LDX XCUR
|
|
LDA XCUR+1
|
|
BEQ >0
|
|
LDA XBIT2+256,X
|
|
LDY XBYTE2+256,X
|
|
BNE >1
|
|
^0 LDA XBIT2,X
|
|
LDY XBYTE2,X
|
|
^1 STY XBYTE
|
|
;
|
|
; Compensate for bits not to be
|
|
; affected to the left.
|
|
;
|
|
LDY #8
|
|
^2 DEY
|
|
SD1MOD0 SEC
|
|
ROR BLDBYTE
|
|
LSR
|
|
BCC <2
|
|
;
|
|
LDX #0
|
|
LDA CSIZE
|
|
BNE LINEDUBL
|
|
;
|
|
; Do a line of normal size
|
|
;
|
|
LINENORM LDA (PIXAD,X)
|
|
EOR #$FF
|
|
SD2MOD0 = *-1
|
|
STA DATABYTE
|
|
INC PIXAD
|
|
BNE *+4
|
|
INC PIXAD+1
|
|
LDX #8
|
|
^0 ASL DATABYTE
|
|
ROR BLDBYTE
|
|
DEY
|
|
BNE >1
|
|
;
|
|
LDY XBYTE
|
|
INC XBYTE
|
|
LDA BLDBYTE
|
|
LSR
|
|
SD0MOD0 AND (BUFFER1),Y
|
|
STA (BUFFER1),Y
|
|
LDY #7
|
|
;
|
|
^1 DEC WCOUNT
|
|
BEQ >2
|
|
DEX
|
|
BNE <0
|
|
BEQ LINENORM
|
|
;
|
|
^2 CPY #7
|
|
BEQ >3
|
|
LDA BLDBYTE
|
|
SD1MOD1 SEC
|
|
ROR
|
|
DEY
|
|
BNE SD1MOD1
|
|
LSR
|
|
LDY XBYTE
|
|
SD0MOD1 AND (BUFFER1),Y
|
|
STA (BUFFER1),Y
|
|
^3 RTS
|
|
;
|
|
; Do a line of double size
|
|
;
|
|
LINEDUBL LDA (PIXAD,X)
|
|
EOR #$FF
|
|
SD2MOD1 = *-1
|
|
STA DATABYTE
|
|
INC PIXAD
|
|
BNE *+4
|
|
INC PIXAD+1
|
|
LDX #8
|
|
^0 STX BCOUNT
|
|
ASL DATABYTE
|
|
LDX #2
|
|
^1 PHP
|
|
ROR BLDBYTE
|
|
DEY
|
|
BNE >2
|
|
;
|
|
LDY XBYTE
|
|
INC XBYTE
|
|
LDA BLDBYTE
|
|
LSR
|
|
STA BLDBYTE
|
|
SD0MOD2 AND (BUFFER1),Y
|
|
STA (BUFFER1),Y
|
|
LDA BLDBYTE
|
|
SD0MOD3 AND (BUFFER2),Y
|
|
STA (BUFFER2),Y
|
|
LDY #7
|
|
;
|
|
^2 PLP
|
|
DEX
|
|
BNE <1
|
|
;
|
|
DEC WCOUNT
|
|
BEQ >3
|
|
LDX BCOUNT
|
|
DEX
|
|
BNE <0
|
|
BEQ LINEDUBL
|
|
;
|
|
^3 CPY #7
|
|
BEQ >4
|
|
LDA BLDBYTE
|
|
SD1MOD2 SEC
|
|
ROR
|
|
DEY
|
|
BNE SD1MOD2
|
|
LSR
|
|
STA BLDBYTE
|
|
LDY XBYTE
|
|
SD0MOD4 AND (BUFFER1),Y
|
|
STA (BUFFER1),Y
|
|
LDA BLDBYTE
|
|
SD0MOD5 AND (BUFFER2),Y
|
|
STA (BUFFER2),Y
|
|
^4 RTS
|
|
;-----------
|
|
; #2 #3 #4
|
|
; ORA/AND/EOR how to put on screen
|
|
; CLC/SEC/CLC what to fill excess with
|
|
; $00/$FF/$00 eor after getting data
|
|
;
|
|
MODS0 HEX 113151
|
|
MODS1 HEX 183818
|
|
MODS2 HEX 00FF00
|
|
;
|
|
; Option mod routine.
|
|
;
|
|
OPTIONMD LDY OPTION
|
|
LDA MODS0-2,Y
|
|
PHA
|
|
LDX MODS1-2,Y
|
|
LDA MODS2-2,Y
|
|
TAY
|
|
PLA
|
|
OPTNMOD JMP SCRNOPTN
|
|
;
|
|
; OPTION mods for internal screen
|
|
; routines
|
|
;
|
|
SCRNOPTN STA SD0MOD0
|
|
STA SD0MOD1
|
|
STA SD0MOD2
|
|
STA SD0MOD3
|
|
STA SD0MOD4
|
|
STA SD0MOD5
|
|
;
|
|
STX SD1MOD0
|
|
STX SD1MOD1
|
|
STX SD1MOD2
|
|
;
|
|
STY SD2MOD0
|
|
STY SD2MOD1
|
|
RTS
|
|
;-----------
|
|
;
|
|
; Reset STROUT for screen draw
|
|
;
|
|
SCREEN JSR INSTALL
|
|
ADR SCRNOPTN
|
|
ADR LINEDRAW
|
|
HBY FONTADDR
|
|
RTS
|
|
;-----------
|
|
;
|
|
; JSR INSTALL
|
|
; ADR OPTIONMD ; option mods
|
|
; ADR LINEDRAW ; line draw routine
|
|
; HBY FONTADDR ; hi byte of font data
|
|
;
|
|
INSTALL JSR GETINIT
|
|
;
|
|
JSR GETBYTE
|
|
STA OPTNMOD+1
|
|
JSR GETBYTE
|
|
STA OPTNMOD+2
|
|
;
|
|
JSR GETBYTE
|
|
STA LINEMOD+1
|
|
JSR GETBYTE
|
|
STA LINEMOD+2
|
|
;
|
|
JSR GETBYTE
|
|
FINSTALL STA FONTMOD0
|
|
STA FONTMOD1
|
|
STA FONTMOD2
|
|
STA FONTMOD3
|
|
STA FONTMOD4
|
|
STA FONTMOD5
|
|
STA FONTMOD6
|
|
STA FONTMOD7
|
|
STA FONTMOD8
|
|
STA FONTMOD9
|
|
STA FONTMODA
|
|
STA FONTMODB
|
|
STA FONTMODC
|
|
RTS
|
|
;
|
|
;
|
|
;
|
|
USR "O:FDRAW",ORG
|
|
END
|