A2osX/FNT2FON.S.txt

850 lines
14 KiB
Plaintext
Raw Normal View History

PR#3
PREFIX /A2OSX.BUILD
LOMEM $900
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF /A2OSX.BUILD/FNT2FON
*--------------------------------------
.INB /A2OSX.BUILD/INC/MACROS.I
.INB /A2OSX.BUILD/INC/A2OSX.I
.INB /A2OSX.BUILD/INC/LIBGUI.I
*--------------------------------------
2017-12-08 16:10:39 +00:00
S.FNT.dfVersion .EQ 0
S.FNT.dfSize .EQ 2
S.FNT.dfCopyright .EQ 6
S.FNT.dfType .EQ 66
S.FNT.dfPoints .EQ 68
S.FNT.dfVertRes .EQ 70
S.FNT.dfHorizRes .EQ 72
S.FNT.dfAscent .EQ 74
S.FNT.dfInternalLeading .EQ 76
S.FNT.dfExternalLeading .EQ 78
S.FNT.dfItalic .EQ 80
S.FNT.dfUnderline .EQ 81
S.FNT.dfStrikeOut .EQ 82
S.FNT.dfWeight .EQ 83
S.FNT.dfCharSet .EQ 85
S.FNT.dfPixWidth .EQ 86
S.FNT.dfPixHeight .EQ 88
S.FNT.dfPitchAndFamily .EQ 90
S.FNT.dfAvgWidth .EQ 91
S.FNT.dfMaxWidth .EQ 93
S.FNT.dfFirstChar .EQ 95
S.FNT.dfLastChar .EQ 96
S.FNT.dfDefaultChar .EQ 97
S.FNT.dfBreakChar .EQ 98
S.FNT.dfWidthBytes .EQ 99
S.FNT.dfDevice .EQ 101
S.FNT.dfFace .EQ 105
S.FNT.dfBitsPointer .EQ 109
S.FNT.dfBitsOffset .EQ 113
S.FNT.dfReserved .EQ 117
S.FNT.dfCharTable2 .EQ 118
*S.FNT.dfFlags3 .EQ 118
*S.FNT.dfAspace3 .EQ 122
*S.FNT.dfBspace3 .EQ 124
*S.FNT.dfCspace3 .EQ 126
*S.FNT.dfColorPointer3 .EQ 128
*S.FNT.dfReserved13 .EQ 132
S.FNT.dfCharTable3 .EQ 148
*--------------------------------------
ZPPTR1 .EQ ZPBIN
ZPInputBufPtr .EQ ZPBIN+2
2017-12-11 16:54:34 +00:00
ZPInputTblPtr .EQ ZPBIN+4
ZPInputBMPtr .EQ ZPBIN+6
ZPCharBufPtr .EQ ZPBIN+8
ZPOutPutTblPtr .EQ ZPBIN+10
2017-12-13 06:38:43 +00:00
ZPOutPutCharOfs .EQ ZPBIN+12
ZPOutPutBufPtr .EQ ZPBIN+14
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA 0
.DA CS.END-CS.START CS
.DA DS.END-DS.START DS
.DA #64 SS
.DA #16 ZP
.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
2017-12-08 16:10:39 +00:00
L.MSG.RANGE .DA MSG.RANGE
2017-12-11 16:54:34 +00:00
L.MSG.DUMP .DA MSG.DUMP
L.MSG.DONE .DA MSG.DONE
.DA 0
*--------------------------------------
CS.INIT
.1 >INC.G Count
>SYSCALL GetArg.A
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 PrintF.YA
lda #K.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
2017-12-08 16:10:39 +00:00
>LDYAI 8192 max 256x256 pixels
>SYSCALL GetMem.YA
bcs CS.INIT.RTS
2017-12-11 16:54:34 +00:00
>STYA ZPCharBufPtr
txa
2017-12-11 16:54:34 +00:00
>STA.G hCharBuf
.8 clc
CS.INIT.RTS rts
*--------------------------------------
CS.INIT.OPENINPUT
>PUSHWI 0 Aux type
>PUSHBI 0 Type
>PUSHBI SYS.FOpen.R
>PUSHW ZPPtr1
>SYSCALL LoadFile
bcs CS.INIT.RTS
>PUSHYA
txa
>STA.G hInputBuf
>SYSCALL GetMemPtr.A
>STYA ZPInputBufPtr
>LDYA L.MSG.FILE.OK
>SYSCALL PrintF.YA
2017-12-08 16:10:39 +00:00
ldy #S.FNT.dfVersion
lda (ZPInputBufPtr),y
bne .99
2017-12-08 16:10:39 +00:00
iny
lda (ZPInputBufPtr),y
2017-12-08 16:10:39 +00:00
cmp #2
beq .1
cmp #3
bne .99
2017-12-08 16:10:39 +00:00
.1 asl *2 = Entry Len in Tbl
>STA.G FNT.Version
pha
2017-12-08 16:10:39 +00:00
ldy #S.FNT.dfAscent
lda (ZPInputBufPtr),y
2017-12-08 16:10:39 +00:00
>STA.G FON.Header+S.FON.Ascent
>PUSHA
2017-12-08 16:10:39 +00:00
ldy #S.FNT.dfPixHeight
lda (ZPInputBufPtr),y
2017-12-08 16:10:39 +00:00
>STA.G FON.Header+S.FON.PixH
>PUSHA
2017-12-08 16:10:39 +00:00
ldy #S.FNT.dfPixWidth
lda (ZPInputBufPtr),y
>STA.G FON.Header+S.FON.PixW
>PUSHA
pla
>PUSHA
>LDYA L.MSG.HEADER.OK
>SYSCALL PrintF.YA
clc
rts
.99 >LDYA L.MSG.HEADER.KO
>SYSCALL PrintF.YA
lda #K.E.IBIN
sec
rts
*--------------------------------------
CS.INIT.CREATEOUTPUT
>PUSHWI 0 Aux type
2017-12-08 16:10:39 +00:00
>PUSHBI $CC FON Type
>PUSHBI SYS.FOpen.W+SYS.FOpen.X
>PUSHW ZPPtr1
>SYSCALL FOpen
bcs .9
>STA.G hOutputFile
2017-12-13 06:38:43 +00:00
>LDYAI 256
>SYSCALL GetMem.YA
bcs .9
>STYA ZPOutPutBufPtr
txa
>STA.G hOutPutBuf
.9 rts
*--------------------------------------
2017-12-08 16:10:39 +00:00
CS.RUN ldy #S.FNT.dfBreakChar
lda (ZPInputBufPtr),y
>STA.G FON.Header+S.FON.Break
>PUSHA
2017-12-08 16:10:39 +00:00
ldy #S.FNT.dfDefaultChar
lda (ZPInputBufPtr),y
>STA.G FON.Header+S.FON.Default
>PUSHA
2017-12-08 16:10:39 +00:00
ldy #S.FNT.dfLastChar
lda (ZPInputBufPtr),y
>STA.G FON.Header+S.FON.Last
>PUSHA
ldy #S.FNT.dfFirstChar
lda (ZPInputBufPtr),y
>STA.G FON.Header+S.FON.First
2017-12-11 16:54:34 +00:00
>STA.G CharIndex
2017-12-08 16:10:39 +00:00
>PUSHA
2017-12-08 16:10:39 +00:00
>LDYA L.MSG.RANGE
>SYSCALL PrintF.YA
2017-12-08 16:10:39 +00:00
>LDA.G FON.Header+S.FON.Last
2017-12-11 16:54:34 +00:00
sec
2017-12-08 16:10:39 +00:00
>SBC.G FON.Header+S.FON.First
>STA.G CharCount
2017-12-11 16:54:34 +00:00
asl
pha
>STA.G BM.Offset
2017-12-11 16:54:34 +00:00
lda #0
rol
iny
sta (pData),y
ply
2017-12-11 16:54:34 +00:00
>SYSCALL GetMem.YA
>STYA ZPOutPutTblPtr
txa
>STA.G hTblBuf
lda #S.FON
clc
>ADC.G BM.Offset
sta ZPOutPutCharOfs
lda #S.FON+1
>ADC.G BM.Offset+1
sta ZPOutPutCharOfs+1
>LEA.G BM.Offset
>PUSHYA
>PUSHBI SYS.FSeek.SET
>LDA.G hOutputFile
>PUSHA
>SYSCALL FSeek
bcc .1
rts
.1 >LDA.G FNT.Version
2017-12-08 16:10:39 +00:00
ldx #S.FNT.dfCharTable2
cmp #4
beq .2
2017-12-08 16:10:39 +00:00
ldx #S.FNT.dfCharTable3
.2 txa
2017-12-08 16:10:39 +00:00
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
2017-12-08 16:10:39 +00:00
lda (ZPInputTblPtr),y Get Char BitMap Offset
clc
adc ZPInputBufPtr
sta ZPInputBMPtr
iny
lda (ZPInputTblPtr),y
adc ZPInputBufPtr+1
sta ZPInputBMPtr+1
2017-12-08 16:10:39 +00:00
jsr CS.RUN.GetChar
2017-12-11 16:54:34 +00:00
jsr CS.RUN.ShiftLChar
jsr CS.RUN.CutRChar
jsr CS.RUN.DumpChar
jsr CS.RUN.StoreChar
bcs .9
2017-12-11 16:54:34 +00:00
>INC.G CharIndex
2017-12-08 16:10:39 +00:00
>DEC.G CharCount
beq .8
2017-12-08 16:10:39 +00:00
lda ZPInputTblPtr
clc
>ADC.G FNT.Version
sta ZPInputTblPtr
bcc CS.RUN.LOOP
2017-12-08 16:10:39 +00:00
inc ZPInputTblPtr+1
bra CS.RUN.LOOP
2017-12-13 06:38:43 +00:00
.8 jsr CS.RUN.FlushOutPutBuf
bcs .9
jsr CS.RUN.WriteBMAndTbl
bcs .9
>LDYA L.MSG.DONE
>SYSCALL PrintF.YA
lda #0
sec
.9 rts
*--------------------------------------
* ZPInputBMPtr->DATA
2017-12-08 16:10:39 +00:00
*--------------------------------------
CS.RUN.GetChar lda (ZPInputTblPtr) Get Char PixW
>STA.G CharPixW
2017-12-11 16:54:34 +00:00
>STA.G CharOutPixW
pha
2017-12-08 16:10:39 +00:00
lsr
lsr
lsr
tax
pla
and #7
beq .1
inx
2017-12-11 16:54:34 +00:00
.1 txa
2017-12-08 16:10:39 +00:00
>STA.G CharByteW
2017-12-11 16:54:34 +00:00
>STA.G CharOutByteW
2017-12-08 16:10:39 +00:00
2017-12-11 16:54:34 +00:00
lda #0 0 -> A -> CharByteW
2017-12-08 16:10:39 +00:00
.2 pha
clc
2017-12-11 16:54:34 +00:00
adc ZPCharBufPtr
2017-12-08 16:10:39 +00:00
sta ZPPTR1
lda #0
2017-12-11 16:54:34 +00:00
adc ZPCharBufPtr+1
2017-12-08 16:10:39 +00:00
sta ZPPTR1+1
2017-12-11 16:54:34 +00:00
>LDA.G FON.Header+S.FON.PixH
tax
.3 lda (ZPInputBMPtr) Get one source byte
2017-12-08 16:10:39 +00:00
inc ZPInputBMPtr
bne .4
inc ZPInputBMPtr+1
2017-12-11 16:54:34 +00:00
.4 tay
lda TWIST,y
sta (ZPPTR1)
2017-12-08 16:10:39 +00:00
lda ZPPTR1
clc
>ADC.G CharByteW
sta ZPPTR1
bcc .5
inc ZPPTR1+1
2017-12-11 16:54:34 +00:00
.5 dex
bne .3
2017-12-08 16:10:39 +00:00
pla
2017-12-11 16:54:34 +00:00
inc
>CMP.G CharByteW
bne .2
2017-12-08 16:10:39 +00:00
clc
rts
*--------------------------------------
2017-12-11 16:54:34 +00:00
* Dump ZPCharBufPtr : CharByteW x FON.Header+S.FON.PixH
*--------------------------------------
CS.RUN.DumpChar >LDA.G CharOutByteW
>PUSHA
>LDA.G CharOutPixW
>PUSHA
>LDA.G CharIndex
>PUSHA
>PUSHA
>LDYA L.MSG.DUMP
>SYSCALL PrintF.YA
lda ZPCharBufPtr
sta ZPPTR1
lda ZPCharBufPtr+1
sta ZPPTR1+1
>LDA.G FON.Header+S.FON.PixH
.1 pha
2017-12-11 16:54:34 +00:00
lda #'|'
>SYSCALL PutChar.A
2017-12-12 07:27:36 +00:00
>LDA.G CharOutPixW
>STA.G Count
ldy #0
2017-12-11 16:54:34 +00:00
.2 lda (ZPPTR1),y
phy
2017-12-11 16:54:34 +00:00
ldx #8
2017-12-11 16:54:34 +00:00
.4 lsr
pha
lda #' '
bcc .5
lda #'O'
.5 phx
>SYSCALL PutChar.A
plx
>DEC.G Count
2017-12-11 16:54:34 +00:00
beq .6
pla Get back BYTE
2017-12-11 16:54:34 +00:00
dex
bne .4
ply
iny
2017-12-11 16:54:34 +00:00
bra .2
.6 pla
pla
lda #'|'
2017-12-11 16:54:34 +00:00
>SYSCALL PutChar.A
lda #13
>SYSCALL PutChar.A
lda #10
>SYSCALL PutChar.A
lda ZPPTR1
clc
>ADC.G CharByteW
sta ZPPTR1
bcc .7
inc ZPPTR1+1
.7 pla
dec
2017-12-11 16:54:34 +00:00
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
2017-12-11 16:54:34 +00:00
sta ZPPTR1
lda ZPCharBufPtr+1
sta ZPPTR1+1
>LDA.G FON.Header+S.FON.PixH
2017-12-11 16:54:34 +00:00
tax
>LDA.G CharOutByteW
2017-12-11 16:54:34 +00:00
tay
dey
lda #0
pha
.2 pla
ora (ZPPTR1),y
pha
2017-12-12 07:27:36 +00:00
phy
2017-12-11 16:54:34 +00:00
lda ZPPTR1
clc
>ADC.G CharByteW
sta ZPPTR1
bcc .3
inc ZPPTR1+1
2017-12-12 07:27:36 +00:00
.3 ply
dex
2017-12-11 16:54:34 +00:00
bne .2
pla
2017-12-12 07:27:36 +00:00
bmi .9 Bit 7 is colored....exit
2017-12-11 16:54:34 +00:00
bne .4
tya No bits in this COL
beq .9 was COL 0.....SPACE or BREAK
2017-12-12 07:27:36 +00:00
>DEC.G CharOutByteW Remove the whole column
asl
asl
asl
>STA.G CharOutPixW
2017-12-11 16:54:34 +00:00
bra .1
2017-12-12 07:27:36 +00:00
.4 pha
>LDA.G CharOutByteW
asl
asl
asl
2017-12-12 07:27:36 +00:00
tax
pla
2017-12-11 16:54:34 +00:00
.5 dex
asl
2017-12-12 07:27:36 +00:00
bpl .5
2017-12-11 16:54:34 +00:00
txa
>STA.G CharOutPixW
2017-12-11 16:54:34 +00:00
2017-12-12 07:27:36 +00:00
pha
lsr
lsr
lsr
tax
pla
and #7
beq .7
inx
.7 txa
>STA.G CharOutByteW
2017-12-11 16:54:34 +00:00
.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
2017-12-13 06:38:43 +00:00
phx
pha
2017-12-13 06:38:43 +00:00
>LDA.G OutPutPtr
tay
2017-12-13 06:38:43 +00:00
pla
2017-12-13 06:38:43 +00:00
sta (ZPOutPutBufPtr),y
tya
inc
>STA.G OutPutPtr
tay
bne .8
2017-12-13 06:38:43 +00:00
>PUSHW ZPOutPutBufPtr
>PUSHWI 256
>LDA.G hOutputFile
>PUSHA
>SYSCALL FWrite
bcs .9
2017-12-13 06:38:43 +00:00
.8 inc ZPOutPutCharOfs
bne .81
inc ZPOutPutCharOfs+1
2017-12-13 06:38:43 +00:00
.81 clc
2017-12-13 06:38:43 +00:00
.9 plx
ply
rts
*--------------------------------------
CS.RUN.FlushOutPutBuf
clc
>LDA.G OutPutPtr
beq .8
pha
>PUSHW ZPOutPutBufPtr
ply
lda #0
>PUSHYA
>LDA.G hOutputFile
>PUSHA
>SYSCALL FWrite
.8 rts
*--------------------------------------
CS.RUN.WriteBMAndTbl
>LDA.G hTblBuf
>SYSCALL GetMemPtr.A
>STYA ZPOutPutTblPtr
clc
rts
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
2017-12-13 06:38:43 +00:00
CS.QUIT >LDA.G hOutPutBuf
beq .1
2017-12-13 06:38:43 +00:00
>SYSCALL FreeMem.A
2017-12-13 06:38:43 +00:00
.1 >LDA.G hOutputFile
beq .2
>SYSCALL FClose.A
2017-12-13 06:38:43 +00:00
.2 >LDA.G hInputBuf
beq .3
2017-12-08 16:10:39 +00:00
>SYSCALL FreeMem.A
2017-12-13 06:38:43 +00:00
.3 >LDA.G hCharBuf
beq .4
2017-12-11 16:54:34 +00:00
>SYSCALL FreeMem.A
2017-12-13 06:38:43 +00:00
.4 >LDA.G hTblBuf
2017-12-11 16:54:34 +00:00
beq .8
2017-12-08 16:10:39 +00:00
>SYSCALL FreeMem.A
.8 clc
rts
*--------------------------------------
CS.END
2017-12-11 16:54:34 +00:00
*--------------------------------------
.INB /A2OSX.BUILD/X.TWIST.G
*--------------------------------------
OptionList >PSTR "NnVv"
OptionVars .DA #bNoShrink,#bNoShrink,#bVerbose,#bVerbose
MSG.USAGE >CSTR "Usage : FNT2FON FNT-File \r\n -V : Verbose Mode\r\n -N : No shrink\r\n"
2017-12-08 16:10:39 +00:00
MSG.FILE.OK >CSTR "FNT File Loaded, %D Bytes Read\r\n"
MSG.HEADER.OK >CSTR "FNT File Version : %d, Size : %d x %d pixels, Ascent : %d\r\n"
MSG.HEADER.KO >CSTR "Invalid Input File Format\r\n"
MSG.RANGE >CSTR "First/Last Char : %d/%d, Default : %d, Break : %d\r\n"
2017-12-11 16:54:34 +00:00
MSG.DUMP >CSTR "Caracter ID : %d (0x0%2h), Width(P) : %d, Width(B) : %d\r\n"
MSG.DONE >CSTR "All Done!!!\r\n"
*--------------------------------------
.DUMMY
.OR 0
DS.START
2017-12-08 16:10:39 +00:00
FNT.Version .BS 1
FON.Header .BS S.FON
Count .BS 1
hInputBuf .BS 1
hOutputFile .BS 1
bPause .BS 1
bVerbose .BS 1
2017-12-11 16:54:34 +00:00
bNoShrink .BS 1
hCharBuf .BS 1
hTblBuf .BS 1
CharIndex .BS 1
2017-12-08 16:10:39 +00:00
CharCount .BS 1
2017-12-11 16:54:34 +00:00
CharPixW .BS 1
2017-12-08 16:10:39 +00:00
CharByteW .BS 1
2017-12-11 16:54:34 +00:00
CharOutPixW .BS 1
CharOutByteW .BS 1
2017-12-13 06:38:43 +00:00
hOutPutBuf .BS 1
OutPutPtr .BS 1
BM.Offset .BS 4
DS.END
.ED
*--------------------------------------
MAN
SAVE /A2OSX.BUILD/FNT2FON.S
ASM