PrintShopCompanion-Apple-II/PSC Source Disk 1 - System .../S_FDRAW.txt

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