A2osX/BIN/FNT2FON.S.txt
2023-07-14 12:24:49 +02:00

846 lines
14 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF bin/fnt2fon
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/gfx.i
.INB inc/libgui.i
.INB inc/fnt.i
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPPtr1 .BS 2
ZPInputBufPtr .BS 2
ZPInputTblPtr .BS 2
ZPInputBMPtr .BS 2
ZPCharBufPtr .BS 2
ZPOutPutTblPtr .BS 2
ZPOutPutCharOfs .BS 2
ZPOutPutBufPtr .BS 2
TmpWord .BS 2
ZS.END .ED
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA #0 S.PS.F.EVENT
.DA #0
.DA CS.END-CS.START Code Size (without Constants)
.DA DS.END-DS.START Data Size
.DA #64 Stack Size
.DA #ZS.END-ZS.START Zero Page Size
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.MSG.USAGE .DA MSG.USAGE
L.MSG.FILE.OK .DA MSG.FILE.OK
L.MSG.HEADER.OK .DA MSG.HEADER.OK
L.MSG.HEADER.KO .DA MSG.HEADER.KO
L.MSG.RANGE .DA MSG.RANGE
L.MSG.DUMP .DA MSG.DUMP
L.MSG.DONE .DA MSG.DONE
.DA 0
*--------------------------------------
CS.INIT
.1 >INC.G Count
>SYSCALL ArgV
bcs .7
>STYA ZPPtr1
lda (ZPPtr1)
cmp #'-'
bne .4
ldy #1
lda (ZPPtr1),y
ldx OptionList
.2 cmp OptionList,x
beq .3
dex
bne .2
.99 >LDYA L.MSG.USAGE
>SYSCALL PutS
lda #E.SYN
sec
rts
.3 ldy OptionVars-1,x
lda #$80
sta (pData),y
bra .1
.4 >LDA.G hInputBuf
bne .5
jsr CS.INIT.OPENINPUT
bcc .1 scan for any other args
rts
.5 >LDA.G hOutputFile
bne .99
jsr CS.INIT.CREATEOUTPUT
bcc .1 scan for any other args
rts
.7 >LDA.G hOutputFile
beq .99
>LDYAI 8192 max 256x256 pixels
>SYSCALL GetMem
bcs CS.INIT.RTS
>STYA ZPCharBufPtr
txa
>STA.G hCharBuf
.8 clc
CS.INIT.RTS rts
*--------------------------------------
CS.INIT.OPENINPUT
>PUSHW ZPPtr1
>PUSHBI O.RDONLY
>PUSHBI 0 Type
>PUSHWZ Aux type
>SYSCALL LoadFile
bcs CS.INIT.RTS
>STYA TmpWord
txa
>STA.G hInputBuf
>SYSCALL GetMemPtr
>STYA ZPInputBufPtr
>PUSHW L.MSG.FILE.OK
>PUSHW TmpWord
>PUSHBI 2
>SYSCALL Printf
ldy #S.FNT.dfVersion
lda (ZPInputBufPtr),y
bne .99
iny
lda (ZPInputBufPtr),y
cmp #2
beq .1
cmp #3
bne .99
*--------------------------------------
.1 asl *2 = Entry Len in Tbl
>STA.G FNT.Version
pha
>PUSHW L.MSG.HEADER.OK
pla
>PUSHA
ldy #S.FNT.dfPixWidth
lda (ZPInputBufPtr),y
>STA.G FON.Header+S.FON.PixW
>PUSHA
ldy #S.FNT.dfPixHeight
lda (ZPInputBufPtr),y
>STA.G FON.Header+S.FON.PixH
>PUSHA
ldy #S.FNT.dfAscent
lda (ZPInputBufPtr),y
>STA.G FON.Header+S.FON.Ascent
>PUSHA
>PUSHBI 4
>SYSCALL PrintF
clc
rts
.99 >LDYA L.MSG.HEADER.KO
>SYSCALL PutS
lda #E.IBIN
sec
rts
*--------------------------------------
CS.INIT.CREATEOUTPUT
>PUSHW ZPPtr1
>PUSHBI O.WRONLY+O.CREATE
>PUSHBI $CC FON Type
>PUSHWZ Aux type
>SYSCALL FOpen
bcs .9
>STA.G hOutputFile
>LDYAI 256
>SYSCALL GetMem
bcs .9
>STYA ZPOutPutBufPtr
txa
>STA.G hOutPutBuf
.9 rts
*--------------------------------------
CS.RUN >PUSHW L.MSG.RANGE
ldy #S.FNT.dfFirstChar
lda (ZPInputBufPtr),y
>STA.G FON.Header+S.FON.First
>STA.G CharIndex
>PUSHA
ldy #S.FNT.dfLastChar
lda (ZPInputBufPtr),y
>STA.G FON.Header+S.FON.Last
>PUSHA
ldy #S.FNT.dfDefaultChar
lda (ZPInputBufPtr),y
>STA.G FON.Header+S.FON.Default
>PUSHA
ldy #S.FNT.dfBreakChar
lda (ZPInputBufPtr),y
>STA.G FON.Header+S.FON.Break
>PUSHA
>PUSHBI 4
>SYSCALL PrintF
>LDA.G FON.Header+S.FON.Last
sec
>SBC.G FON.Header+S.FON.First
inc
>STA.G CharCount
asl
pha
>STA.G FileOffset
lda #0
rol
iny
sta (pData),y
ply
>SYSCALL GetMem
bcs .9
>STYA ZPOutPutTblPtr
txa
>STA.G hTblBuf
lda #S.FON
clc
>ADC.G FileOffset
sta (pData),y
sta ZPOutPutCharOfs
iny
lda /S.FON
adc (pData),y
sta (pData),y
sta ZPOutPutCharOfs+1
>PUSHB.G hOutputFile
>PUSHL.G FileOffset
>PUSHBI SEEK.SET
>SYSCALL FSeek
bcc .1
.9 rts
.1 >LDA.G FNT.Version
ldx #S.FNT.dfCharTable2
cmp #4
beq .2
ldx #S.FNT.dfCharTable3
.2 txa
clc
adc ZPInputBufPtr
sta ZPInputTblPtr
lda #0
adc ZPInputBufPtr+1
sta ZPInputTblPtr+1
*--------------------------------------
CS.RUN.LOOP >SLEEP
>SYSCALL GetChar
bcs .3
cmp #$03 Ctrl-C
beq .9 Abort....
cmp #$13 Ctrl-S
bne .3
>LDA.G bPause
eor #$FF
sta (pData),y
.3 >LDA.G bPause
bmi CS.RUN.LOOP
ldy #2
lda (ZPInputTblPtr),y Get Char BitMap Offset
clc
adc ZPInputBufPtr
sta ZPInputBMPtr
iny
lda (ZPInputTblPtr),y
adc ZPInputBufPtr+1
sta ZPInputBMPtr+1
jsr CS.RUN.GetChar
jsr CS.RUN.ShiftLChar
jsr CS.RUN.CutRChar
jsr CS.RUN.DumpChar
jsr CS.RUN.StoreChar
bcs .9
>INC.G CharIndex
>DEC.G CharCount
beq .8
lda ZPInputTblPtr
clc
>ADC.G FNT.Version
sta ZPInputTblPtr
bcc CS.RUN.LOOP
inc ZPInputTblPtr+1
bra CS.RUN.LOOP
.8 jsr CS.RUN.FlushOutPutBuf
bcs .9
jsr CS.RUN.WriteBMAndTbl
bcs .9
>LDYA L.MSG.DONE
>SYSCALL PutS
lda #0
sec
.9 rts
*--------------------------------------
* ZPInputBMPtr->DATA
*--------------------------------------
CS.RUN.GetChar lda (ZPInputTblPtr) Get Char PixW
>STA.G CharPixW
>STA.G CharOutPixW
pha
lsr
lsr
lsr
tax
pla
and #7
beq .1
inx
.1 txa
>STA.G CharByteW
>STA.G CharOutByteW
lda #0 0 -> A -> CharByteW
.2 pha
clc
adc ZPCharBufPtr
sta ZPPtr1
lda #0
adc ZPCharBufPtr+1
sta ZPPtr1+1
>LDA.G FON.Header+S.FON.PixH
tax
.3 lda (ZPInputBMPtr) Get one source byte
inc ZPInputBMPtr
bne .4
inc ZPInputBMPtr+1
.4 tay
lda TWIST,y
sta (ZPPtr1)
lda ZPPtr1
clc
>ADC.G CharByteW
sta ZPPtr1
bcc .5
inc ZPPtr1+1
.5 dex
bne .3
pla
inc
>CMP.G CharByteW
bne .2
clc
rts
*--------------------------------------
* Dump ZPCharBufPtr : CharByteW x FON.Header+S.FON.PixH
*--------------------------------------
CS.RUN.DumpChar >PUSHW L.MSG.DUMP
>PUSHB.G CharIndex
>PUSHB.G CharOutPixW
>PUSHB.G CharOutByteW
>PUSHBI 3
>SYSCALL PrintF
lda ZPCharBufPtr
sta ZPPtr1
lda ZPCharBufPtr+1
sta ZPPtr1+1
>LDA.G FON.Header+S.FON.PixH
.1 pha
lda #'|'
>SYSCALL PutChar
>LDA.G CharOutPixW
>STA.G Count
ldy #0
.2 lda (ZPPtr1),y
phy
ldx #8
.4 lsr
pha
lda #' '
bcc .5
lda #'O'
.5 phx
>SYSCALL PutChar
plx
>DEC.G Count
beq .6
pla Get back BYTE
dex
bne .4
ply
iny
bra .2
.6 pla
pla
lda #'|'
>SYSCALL PutChar
lda #13
>SYSCALL PutChar
lda #10
>SYSCALL PutChar
lda ZPPtr1
clc
>ADC.G CharByteW
sta ZPPtr1
bcc .7
inc ZPPtr1+1
.7 pla
dec
bne .1
rts
*--------------------------------------
CS.RUN.ShiftLChar
>LDA.G bNoShrink
bmi .9
.1 lda ZPCharBufPtr
sta ZPPtr1
lda ZPCharBufPtr+1
sta ZPPtr1+1
>LDA.G FON.Header+S.FON.PixH
tax
lda #0
pha
.2 pla
ora (ZPPtr1)
pha
lda ZPPtr1
clc
>ADC.G CharByteW
sta ZPPtr1
bcc .3
inc ZPPtr1+1
.3 dex
bne .2
pla
beq .9 No pixel in first COL, must be SPACE or BREAK
lsr
bcs .9
lda ZPCharBufPtr
sta ZPPtr1
lda ZPCharBufPtr+1
sta ZPPtr1+1
>LDA.G FON.Header+S.FON.PixH
tax
.4 >LDA.G CharByteW
tay
clc
.5 dey
lda (ZPPtr1),y
ror
sta (ZPPtr1),y
tya
bne .5
lda ZPPtr1
clc
>ADC.G CharByteW
sta ZPPtr1
bcc .6
inc ZPPtr1+1
.6 dex
bne .4
>DEC.G CharOutPixW
and #7
bne .1
>DEC.G CharOutByteW
bra .1
.9 rts
*--------------------------------------
CS.RUN.CutRChar >LDA.G bNoShrink
bmi .9
.1 lda ZPCharBufPtr
sta ZPPtr1
lda ZPCharBufPtr+1
sta ZPPtr1+1
>LDA.G FON.Header+S.FON.PixH
tax
>LDA.G CharOutByteW
tay
dey
lda #0
pha
.2 pla
ora (ZPPtr1),y
pha
phy
lda ZPPtr1
clc
>ADC.G CharByteW
sta ZPPtr1
bcc .3
inc ZPPtr1+1
.3 ply
dex
bne .2
pla
bmi .9 Bit 7 is colored....exit
bne .4
tya No bits in this COL
beq .9 was COL 0.....SPACE or BREAK
>DEC.G CharOutByteW Remove the whole column
asl
asl
asl
>STA.G CharOutPixW
bra .1
.4 pha
>LDA.G CharOutByteW
asl
asl
asl
tax
pla
.5 dex
asl
bpl .5
txa
>STA.G CharOutPixW
pha
lsr
lsr
lsr
tax
pla
and #7
beq .7
inx
.7 txa
>STA.G CharOutByteW
.9 rts
*--------------------------------------
CS.RUN.StoreChar
lda ZPOutPutCharOfs
sta (ZPOutPutTblPtr)
lda ZPOutPutCharOfs+1
ldy #1
sta (ZPOutPutTblPtr),y
lda ZPOutPutTblPtr
clc
adc #2
sta ZPOutPutTblPtr
bcc .1
inc ZPOutPutTblPtr+1
.1 >LDA.G CharOutPixW
jsr CS.RUN.WriteByte
bcs .99
>LDA.G CharOutByteW
jsr CS.RUN.WriteByte
bcs .99
lda ZPCharBufPtr
sta ZPPtr1
lda ZPCharBufPtr+1
sta ZPPtr1+1
>LDA.G FON.Header+S.FON.PixH
pha
.2 >LDA.G CharOutByteW
tax
ldy #0
.3 lda (ZPPtr1),y
jsr CS.RUN.WriteByte
bcs .9
iny
dex
bne .3
pla
dec
beq .8
pha
lda ZPPtr1
clc
>ADC.G CharByteW
sta ZPPtr1
bcc .2
inc ZPPtr1+1
bra .2
.8 clc
rts
.9 plx
.99 rts
*--------------------------------------
CS.RUN.WriteByte
phy
phx
pha
>LDA.G OutPutPtr
tay
pla
sta (ZPOutPutBufPtr),y
tya
inc
>STA.G OutPutPtr
tay
clc
bne .8
>PUSHB.G hOutputFile
>PUSHW ZPOutPutBufPtr
>PUSHWI 256
>SYSCALL FWrite
bcs .9
.8 inc ZPOutPutCharOfs
bne .9
inc ZPOutPutCharOfs+1
.9 plx
ply
rts
*--------------------------------------
CS.RUN.FlushOutPutBuf
clc
>LDA.G OutPutPtr
beq .8
>PUSHB.G hOutputFile
>PUSHW ZPOutPutBufPtr
>PUSHBI 0
>PUSHB.G OutPutPtr
>SYSCALL FWrite
.8 rts
*--------------------------------------
CS.RUN.WriteBMAndTbl
ldy #FileOffset
ldx #4
lda #0
.1 sta (pData),y
iny
dex
bne .1
>PUSHB.G hOutputFile
>PUSHL.G FileOffset
>PUSHBI SEEK.SET
>SYSCALL FSeek
bcs .9
>PUSHB.G hOutputFile
>PUSHEA.G FON.Header
>PUSHWI S.FON
>SYSCALL FWrite
bcs .9
>PUSHB.G hOutputFile
>LDA.G hTblBuf
>SYSCALL GetMemPtr
>PUSHYA
>LDA.G FON.Header+S.FON.Last
sec
>SBC.G FON.Header+S.FON.First
inc
asl
pha
lda #0
rol
ply
>PUSHYA
>SYSCALL FWrite
clc
.9 rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
CS.QUIT >LDA.G hOutPutBuf
beq .1
>SYSCALL FreeMem
.1 >LDA.G hOutputFile
beq .2
>SYSCALL FClose
.2 >LDA.G hInputBuf
beq .3
>SYSCALL FreeMem
.3 >LDA.G hCharBuf
beq .4
>SYSCALL FreeMem
.4 >LDA.G hTblBuf
beq .8
>SYSCALL FreeMem
.8 clc
rts
*--------------------------------------
CS.END
*--------------------------------------
.INB usr/src/shared/x.twist.g
*--------------------------------------
OptionList .PS "NnVv"
OptionVars .DA #bNoShrink,#bNoShrink,#bVerbose,#bVerbose
*--------------------------------------
MSG.USAGE .CS "Usage : FNT2FON FNT-File \r\n"
.CS " -V : Verbose Mode\r\n"
.CZ -N : No shrink\r\n"
MSG.FILE.OK .CZ "FNT File Loaded, %D Bytes Read\r\n"
MSG.HEADER.OK .CZ "FNT File Version : %d, Size : %d x %d pixels, Ascent : %d\r\n"
MSG.HEADER.KO .CZ "Invalid Input File Format\r\n"
MSG.RANGE .CZ "First/Last Char : %d/%d, Default : %d, Break : %d\r\n"
MSG.DUMP .CZ "Caracter ID : %d (0x0%2h), Width(P) : %d, Width(B) : %d\r\n"
MSG.DONE .CZ "All Done!!!\r\n"
*--------------------------------------
.DUMMY
.OR 0
DS.START
FNT.Version .BS 1
FON.Header .BS S.FON
Count .BS 1
hInputBuf .BS 1
hOutputFile .BS 1
bPause .BS 1
bVerbose .BS 1
bNoShrink .BS 1
hCharBuf .BS 1
hTblBuf .BS 1
CharIndex .BS 1
CharCount .BS 1
CharPixW .BS 1
CharByteW .BS 1
CharOutPixW .BS 1
CharOutByteW .BS 1
hOutPutBuf .BS 1
OutPutPtr .BS 1
FileOffset .BS 4
DS.END .ED
*--------------------------------------
MAN
SAVE usr/src/bin/fnt2fon.s
ASM