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
