654 lines
11 KiB
Plaintext
654 lines
11 KiB
Plaintext
;
|
|
; S:FOEDIT3
|
|
;
|
|
; Low level stuff
|
|
; ---------------
|
|
;
|
|
; MOVEFONT: given Y=size 0,1 or 2,
|
|
; move font loaded at BUF2
|
|
; into BUF1 with sizing.
|
|
;
|
|
; MOVUFONT: move user font to BUF2
|
|
;
|
|
; LOADCHAR: given OLDCHAR=character
|
|
; move data into EDITBUFF
|
|
;
|
|
; SAVECHAR: given NEWCHAR=char to be
|
|
; replaced, remove that
|
|
; character from buffer.
|
|
; If not enough room then
|
|
; SEC is returned.
|
|
;
|
|
; SHOWDONE: show which characters have
|
|
; been altered.
|
|
;
|
|
;--------------
|
|
MFZ EPZ $80
|
|
;
|
|
MFSIZE EPZ MFZ
|
|
MFSIZEX2 EPZ MFZ+1
|
|
MFSIZET EPZ MFZ+2
|
|
MFCHAR EPZ MFZ+3
|
|
MFDESTL EPZ MFZ+4
|
|
MFDESTH EPZ MFZ+5
|
|
MFSOURL EPZ MFZ+6
|
|
MFSOURH EPZ MFZ+7
|
|
MFHEIGHT EPZ MFZ+8
|
|
MFWIDTH EPZ MFZ+9
|
|
MFTMPW EPZ MFZ+10
|
|
MFFDATA EPZ MFZ+11
|
|
MFBUILD EPZ MFZ+12
|
|
;
|
|
; Given Y=0,1 or 2 for small, medium
|
|
; or large sizing, move font in
|
|
; FONT2BUF down to official font
|
|
; buffer. This routine also removes
|
|
; and extraneous lint bits.
|
|
;
|
|
^0 BYT 1,2,4
|
|
;
|
|
MOVEFONT STY MFSIZE
|
|
LDA <0+0,Y
|
|
STA MFSIZEX2
|
|
;
|
|
; Initialize destination pointer
|
|
;
|
|
LDY #FONT1BEG
|
|
LDA /FONT1BEG
|
|
STY MFDESTL
|
|
STA MFDESTH
|
|
;
|
|
; Scan through the entire font,
|
|
; skipping: " " and "@"
|
|
;
|
|
LDX #1
|
|
MFNXCHAR STX MFCHAR
|
|
CPX #'@'-$20
|
|
BEQ MFSKIP
|
|
;
|
|
; Point to font data
|
|
;
|
|
LDA FONT2AL,X
|
|
STA MFSOURL
|
|
LDA FONT2AH,X
|
|
CLC
|
|
ADC /FONT2BUF-FONT1BUF
|
|
STA MFSOURH
|
|
;
|
|
LDA FONT2W,X
|
|
AND #$7F
|
|
STA MFWIDTH
|
|
STA FONT1W,X
|
|
;
|
|
LDA FONT2H,X
|
|
STA MFHEIGHT
|
|
STA FONT1H,X
|
|
;
|
|
; Compute new size
|
|
;
|
|
LDY MFSIZE
|
|
^0 DEY
|
|
BMI >1
|
|
ASL FONT1W,X
|
|
ASL FONT1H,X
|
|
JMP <0
|
|
;
|
|
; Add "done bit" back in
|
|
;
|
|
^1 LDA FONT2W,X
|
|
AND #$80
|
|
ORA FONT1W,X
|
|
STA FONT1W,X
|
|
;
|
|
; Update data pointer
|
|
;
|
|
LDA MFDESTL
|
|
STA FONT1AL,X
|
|
LDA MFDESTH
|
|
STA FONT1AH,X
|
|
;
|
|
JSR MFDOCHAR
|
|
;
|
|
MFSKIP LDX MFCHAR
|
|
INX
|
|
CPX #'Z'-$1F
|
|
BCC MFNXCHAR
|
|
LDA MFDESTL
|
|
SBC #FONTBUFF
|
|
STA LENLO
|
|
LDA MFDESTH
|
|
SBC /FONTBUFF
|
|
STA LENHI
|
|
RTS
|
|
;---
|
|
;
|
|
; Move character to FONT1BUF
|
|
;
|
|
MFDOCHAR LDY MFSOURL
|
|
LDA MFSOURH
|
|
STY >1+1
|
|
STA >2+1
|
|
LDA MFSIZEX2
|
|
^0 PHA
|
|
^1 LDY #00
|
|
^2 LDA #00
|
|
STY MFSOURL
|
|
STA MFSOURH
|
|
JSR MFDOLINE
|
|
PLA
|
|
SEC
|
|
SBC #1
|
|
BNE <0
|
|
DEC MFHEIGHT
|
|
BNE MFDOCHAR
|
|
RTS
|
|
;---
|
|
;
|
|
; Move one line of font data
|
|
;
|
|
MFDOLINE LDA MFWIDTH
|
|
STA MFTMPW
|
|
LDX #8
|
|
^0 LDY #0
|
|
LDA (MFSOURL),Y
|
|
STA MFFDATA
|
|
INC MFSOURL
|
|
BNE *+4
|
|
INC MFSOURH
|
|
LDY #8
|
|
;
|
|
^1 LDA MFSIZEX2
|
|
STA MFSIZET
|
|
ASL MFFDATA
|
|
^2 PHP
|
|
ROL MFBUILD
|
|
DEX
|
|
BNE >3
|
|
JSR MFSTORE
|
|
LDX #8
|
|
^3 PLP
|
|
DEC MFSIZET
|
|
BNE <2
|
|
;
|
|
DEC MFTMPW
|
|
BEQ >4
|
|
DEY
|
|
BNE <1
|
|
BEQ <0
|
|
;
|
|
^4 CPX #8
|
|
BEQ MFSRTS
|
|
;
|
|
; Compensate for straggling bits
|
|
;
|
|
^5 ASL MFBUILD
|
|
DEX
|
|
BNE <5
|
|
;
|
|
; Fall into STORE
|
|
;
|
|
; Store a byte into FONT1BUF
|
|
;
|
|
MFSTORE LDA MFBUILD
|
|
STY >0+1
|
|
LDY #0
|
|
STA (MFDESTL),Y
|
|
INC MFDESTL
|
|
BNE >0
|
|
INC MFDESTH
|
|
^0 LDY #00
|
|
MFSRTS RTS
|
|
;-----------
|
|
;
|
|
; Move user font into BUF2
|
|
; and make it look like a normal
|
|
; font that is loaded at $6000
|
|
;
|
|
MOVUFONT LDY #0
|
|
^0 LDA UFONTBUF,Y
|
|
STA FONT2BUF,Y
|
|
LDA UFONTBUF+$100,Y
|
|
STA FONT2BUF+$100,Y
|
|
LDA UFONTBUF+$200,Y
|
|
STA FONT2BUF+$200,Y
|
|
LDA UFONTBUF+$300,Y
|
|
STA FONT2BUF+$300,Y
|
|
INY
|
|
BNE <0
|
|
;
|
|
; Adjust data pointers
|
|
;
|
|
LDY #'Z'-$20
|
|
^1 LDA FONT2AH,Y
|
|
SEC
|
|
SBC /UFONTBUF-FONT1BUF
|
|
STA FONT2AH,Y
|
|
DEY
|
|
BPL <1
|
|
RTS
|
|
;-----------
|
|
;
|
|
; Load char into edit buffer
|
|
;
|
|
LOADCHAR JSR CLRBUFF
|
|
;
|
|
; Compare character with edit
|
|
; buffer BEQ if the same, BNE
|
|
; if different.
|
|
;
|
|
CMPCHAR LDY OLDCHAR
|
|
LDA FONT1AL,Y
|
|
STA >1+1
|
|
LDA FONT1AH,Y
|
|
STA >1+2
|
|
JSR GETXYLEN
|
|
STX NEWWITH
|
|
STY NEWHITE
|
|
JSR PNTEDIT
|
|
^0 LDY #0
|
|
^1 LDA $FFFF,X
|
|
INX
|
|
EOR (TMP0),Y
|
|
STA (TMP0),Y
|
|
INY
|
|
CPY NEWWITH
|
|
BLT <1
|
|
JSR INCEDIT
|
|
DEC NEWHITE
|
|
BNE <0
|
|
JMP CHKBUFF
|
|
;-----------
|
|
;
|
|
; Save the character
|
|
;
|
|
; First check to see if there is
|
|
; enough room for the edited char.
|
|
;
|
|
; This is done by subracting out the
|
|
; length of the character that is to
|
|
; be replaced and adding in the new
|
|
; length of the edited character. If
|
|
; this value is greater than or equal
|
|
; to $17F4, then MEMORY FULL!!!
|
|
;
|
|
SAVECHAR JSR FINDDIM
|
|
LDY NEWCHAR
|
|
LDA FONT1AL,Y
|
|
STA TMP0
|
|
LDA FONT1AH,Y
|
|
STA TMP1
|
|
JSR GETXYLEN
|
|
STA OLDLEN
|
|
;
|
|
; Subtract out old char length
|
|
;
|
|
LDA LENLO
|
|
LDY LENHI
|
|
SEC
|
|
SBC OLDLEN
|
|
BCS >0
|
|
DEY
|
|
;
|
|
; Add in new char length
|
|
;
|
|
^0 CLC
|
|
ADC NEWLEN
|
|
BCC >1
|
|
INY
|
|
;
|
|
; Is it too big?
|
|
;
|
|
^1 CPY /MAXLEN+1
|
|
BNE >2
|
|
CMP #MAXLEN+1
|
|
^2 BCC >3
|
|
RTS
|
|
;
|
|
; Enough room, so:
|
|
;
|
|
; Remove character given in NEWCHAR
|
|
;
|
|
; TMP0.1 points to data for char
|
|
; to be removed
|
|
;
|
|
; TMP2.3 points to data just above
|
|
; char to be removed
|
|
;
|
|
^3 LDA OLDLEN
|
|
CLC
|
|
ADC TMP0
|
|
STA TMP2
|
|
LDA TMP1
|
|
ADC #0
|
|
STA TMP3
|
|
;
|
|
; Scan through FONT DATA and fix
|
|
; all pointers that point to data
|
|
; above this character
|
|
;
|
|
LDX #$3A
|
|
^0 CPX #'@'-$20
|
|
BEQ >2
|
|
;
|
|
LDA FONT1AH,X
|
|
CMP TMP1
|
|
BNE >1
|
|
LDA FONT1AL,X
|
|
CMP TMP0
|
|
^1 BLT >2
|
|
;
|
|
LDA FONT1AL,X
|
|
SEC
|
|
SBC OLDLEN
|
|
STA FONT1AL,X
|
|
BCS >2
|
|
DEC FONT1AH,X
|
|
;
|
|
^2 DEX
|
|
BPL <0
|
|
;
|
|
; Calculate new length by
|
|
; subtracting length of removed char
|
|
;
|
|
LDA LENLO
|
|
LDY LENHI
|
|
SEC
|
|
SBC OLDLEN
|
|
BCS >3
|
|
DEY
|
|
^3 STA LENLO
|
|
STY LENHI
|
|
;
|
|
; Set TMP4.5 to first available byte
|
|
;
|
|
CLC
|
|
ADC #FONTBUFF
|
|
STA TMP4
|
|
TYA
|
|
ADC /FONTBUFF
|
|
STA TMP5
|
|
;
|
|
; Move data down
|
|
;
|
|
LDY #0
|
|
^0 LDA TMP1
|
|
CMP TMP5
|
|
BNE >1
|
|
LDA TMP0
|
|
CMP TMP4
|
|
BEQ >2
|
|
^1 LDA (TMP2),Y
|
|
STA (TMP0),Y
|
|
INC TMP0
|
|
BNE *+4
|
|
INC TMP1
|
|
INC TMP2
|
|
BNE *+4
|
|
INC TMP3
|
|
JMP <0
|
|
;
|
|
; Move edited character to its home
|
|
;
|
|
; Given TMP4.5 points to end of file
|
|
; NEWWITH, NEWHITE and NEWCHAR.
|
|
;
|
|
^2 LDY NEWCHAR
|
|
LDA NEWWITH
|
|
;
|
|
; Set "done bit"
|
|
;
|
|
ORA #$80
|
|
STA FONT1W,Y
|
|
;
|
|
LDA NEWHITE
|
|
STA FONT1H,Y
|
|
LDA TMP4
|
|
STA >2+1
|
|
STA FONT1AL,Y
|
|
LDA TMP5
|
|
STA >2+2
|
|
STA FONT1AH,Y
|
|
;
|
|
; Calc width in bytes
|
|
;
|
|
LDX NEWWITH
|
|
JSR GETLENTH
|
|
STX NEWWITH
|
|
;
|
|
JSR PNTEDIT
|
|
;
|
|
; Move EDITBUFF data to end of
|
|
; FONT data file
|
|
;
|
|
^0 LDY #0
|
|
^1 LDA (TMP0),Y
|
|
^2 STA $FFFF,X
|
|
INX
|
|
INY
|
|
CPY NEWWITH
|
|
BLT <1
|
|
JSR INCEDIT
|
|
DEC NEWHITE
|
|
BNE <0
|
|
;
|
|
TXA
|
|
CLC
|
|
ADC LENLO
|
|
STA LENLO
|
|
BCC >3
|
|
INC LENHI
|
|
^3 CLC
|
|
RTS
|
|
;-----------
|
|
;
|
|
; Given Y=character
|
|
; return: X=width in bytes
|
|
; Y=height in bytes
|
|
; A=length in bytes
|
|
;
|
|
GETXYLEN LDA FONT1W,Y
|
|
AND #$7F
|
|
TAX
|
|
LDA FONT1H,Y
|
|
TAY
|
|
;
|
|
; Calculate length given
|
|
; X=width, Y=height
|
|
; See above for returned values
|
|
;
|
|
GETLENTH STY >1+1
|
|
DEX
|
|
TXA
|
|
LSR
|
|
LSR
|
|
LSR
|
|
TAX
|
|
INX
|
|
LDA #0
|
|
CLC
|
|
STX >0+1
|
|
^0 ADC #00
|
|
DEY
|
|
BNE <0
|
|
^1 LDY #00
|
|
RTS
|
|
;---
|
|
;
|
|
; Point to EDITBUFF
|
|
;
|
|
PNTEDIT LDY #EDITBUFF
|
|
LDA /EDITBUFF
|
|
STY TMP0
|
|
STA TMP1
|
|
LDX #0
|
|
RTS
|
|
;---
|
|
;
|
|
; INC EDITBUFF pointer by 11
|
|
;
|
|
INCEDIT LDA TMP0
|
|
CLC
|
|
ADC #11
|
|
STA TMP0
|
|
BCC >0
|
|
INC TMP1
|
|
^0 RTS
|
|
;-----------
|
|
;
|
|
; Find dimensions of character
|
|
; in the edit buffer.
|
|
;
|
|
FINDDIM LDA XCOOR
|
|
PHA
|
|
LDA YCOOR
|
|
PHA
|
|
;
|
|
LDA #0
|
|
STA NEWWITH
|
|
STA NEWHITE
|
|
STA XCOOR
|
|
STA YCOOR
|
|
;
|
|
^0 JSR BASECALC
|
|
AND (BUFLO),Y
|
|
BEQ >2
|
|
;
|
|
LDA XCOOR
|
|
CMP NEWWITH
|
|
BLT >1
|
|
STA NEWWITH
|
|
;
|
|
^1 LDA YCOOR
|
|
CMP NEWHITE
|
|
BLT >2
|
|
STA NEWHITE
|
|
;
|
|
^2 INC XCOOR
|
|
LDA XCOOR
|
|
EOR #FONTW
|
|
BNE <0
|
|
STA XCOOR
|
|
INC YCOOR
|
|
LDA YCOOR
|
|
EOR #FONTH
|
|
BNE <0
|
|
;
|
|
INC NEWWITH
|
|
INC NEWHITE
|
|
;
|
|
LDX NEWWITH
|
|
LDY NEWHITE
|
|
JSR GETLENTH
|
|
STA NEWLEN
|
|
PLA
|
|
STA YCOOR
|
|
PLA
|
|
STA XCOOR
|
|
RTS
|
|
;-----------
|
|
;
|
|
; Display all the letters in font
|
|
; and inverse those that have been
|
|
; altered.
|
|
;
|
|
SDCENTER BYT 2,0,4,3,4,5
|
|
BYT 1,4,4,6,6,4
|
|
SDCRCHR BYT '!&,16;AFKOSW',0
|
|
;
|
|
SHOWDONE LDY #0
|
|
STY SDYLOC
|
|
LDY #SDY-SDH
|
|
STY SHOWDY
|
|
LDA #'!'
|
|
SDLOOP PHA
|
|
STA SDBOXMD3
|
|
TAX
|
|
CMP #'@'
|
|
BEQ SDSKIP
|
|
;
|
|
LDY #$FF
|
|
^0 INY
|
|
LDA SDCRCHR,Y
|
|
BEQ >1
|
|
PLA
|
|
PHA
|
|
CMP SDCRCHR,Y
|
|
BEQ >0
|
|
BNE <0
|
|
;
|
|
; Start new line
|
|
;
|
|
^0 LDY #00
|
|
SDYLOC = *-1
|
|
INC SDYLOC
|
|
LDA SDCENTER,Y
|
|
CLC
|
|
ADC #SDX
|
|
STA SHOWDX
|
|
LDA SHOWDY
|
|
ADC #SDH
|
|
STA SHOWDY
|
|
STA SDBOXMD1+3
|
|
;
|
|
; Update X
|
|
;
|
|
^1 LDA #00
|
|
SHOWDX = *-1
|
|
STA SDBOXMD0+2
|
|
CLC
|
|
ADC #SDW/2
|
|
STA SDBOXMD1+1
|
|
;
|
|
; Get char width
|
|
;
|
|
LDA UFONTW-$20,X
|
|
CLC
|
|
ADC #SDW
|
|
STA SDBOXMD0+4
|
|
ADC SHOWDX
|
|
STA SHOWDX
|
|
;
|
|
; Has char been altered?
|
|
;
|
|
LDA FONT1W-$20,X
|
|
BPL >3
|
|
;
|
|
; Draw white box where letter is to
|
|
; be drawn.
|
|
;
|
|
LDY #00
|
|
SHOWDY = *-1
|
|
DEY
|
|
STY SDBOXMD0+3
|
|
LDA #9
|
|
^2 PHA
|
|
JSR LINES
|
|
SDBOXMD0 BYT 'H',WITE,0,0,0,1
|
|
INC SDBOXMD0+3
|
|
PLA
|
|
SEC
|
|
SBC #1
|
|
BNE <2
|
|
LDA #PRINVR
|
|
HEX 2C
|
|
;
|
|
^3 LDA #PRNORM
|
|
STA SDBOXMD2
|
|
JSR PRINT
|
|
SDBOXMD1 .DA #PRLOC,0,#0
|
|
SDBOXMD2 BYT PRINVR
|
|
SDBOXMD3 BYT ' ',NOCR,0
|
|
;
|
|
SDSKIP PLA
|
|
CLC
|
|
ADC #1
|
|
CMP #'Z'+1
|
|
BEQ >4
|
|
JMP SDLOOP
|
|
^4 RTS
|
|
;-----------
|
|
;
|
|
;
|
|
;
|
|
ICL "S:FOEDIT4"
|