Ported Dagen’s font engine

This commit is contained in:
blondie7575 2017-08-13 14:54:18 -07:00
parent c412d4a021
commit 8db85143a0
5 changed files with 707 additions and 1 deletions

View File

@ -8,6 +8,7 @@
/* Begin PBXFileReference section */
700C39C51F2E5CA800C24F9C /* tables.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = tables.s; sourceTree = "<group>"; };
700FFAFB1F40F3BF00A442DE /* font.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = font.s; sourceTree = "<group>"; };
7059502B1F37A0BE00BBE90F /* GenerateVRAMTable.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = GenerateVRAMTable.py; sourceTree = "<group>"; };
706DF1641F2D39F700AA6680 /* loader.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = loader.s; sourceTree = "<group>"; };
706DF1651F2D4A8100AA6680 /* terrain.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = terrain.s; sourceTree = "<group>"; };
@ -28,6 +29,7 @@
70E9D8601F2BD95400555C19 /* graphics.s */,
70E9D8621F2BD95400555C19 /* macros.s */,
706DF1641F2D39F700AA6680 /* loader.s */,
700FFAFB1F40F3BF00A442DE /* font.s */,
706DF1651F2D4A8100AA6680 /* terrain.s */,
7088096C1F2EA4B200D4C950 /* spanRender.s */,
700C39C51F2E5CA800C24F9C /* tables.s */,

687
font.s Normal file
View File

@ -0,0 +1,687 @@
;****************************************
;* FONT ENGINE (v3?) *
;* *
;* Dagen Brock <dagenbrock@gmail.com> *
;* 2013-07-20 *
;* Converted to ca65 by Quinn Dunki *
;* 2017-08-13 *
;****************************************
;* A= ptr to string preceded by length *
;* X= screen location *
;* Preserves all registers *
;* Trashes zero page locations 6,7 *
;****************************************
; each char:
; draw char at loc
; update loc
; see if length hit - no? back to draw char
F_Length: .word 0 ;length of string (only one byte currently used)
F_CharIdx: .word 0 ;index of current character
F_CurrentPos: .word 0 ;current top left char position
F_StrPtr = $06 ;pointer to string (including length byte) / DP
DrawString:
pha
phx
phy
sta F_StrPtr ;store at dp 0 ($00) for indirect loads
stx F_CurrentPos
stz F_CharIdx
lda (F_StrPtr)
and #$00ff ;strip off first char (len is only one byte)
sta F_Length ;get our length byte
NextChar: lda F_CharIdx
cmp F_Length
bne notDone
ply
plx
pla
rts ;DONE! Return to caller
notDone: inc F_CharIdx
ldy F_CharIdx
lda (F_StrPtr),y ;get next char!
and #$00FF ;mask high byte
sec
sbc #' ' ;our table starts with space ' '
asl ;*2
tay
ldx F_CurrentPos
jsr drawChar
inc F_CurrentPos ;compare to addition time (?)
inc F_CurrentPos
inc F_CurrentPos
inc F_CurrentPos ;update screen pos (2 words=8 pixels)
bra NextChar
;x = TopLeft screen pos
;y = char table offset
drawChar: lda FontTable,y ;get real address of char data
sec
sbc #FontData ;pivot offset - now a is offset of fontdata
tay ;so we'll index with that
lda FontData,y
sta $E12000,x
lda FontData+2,y
sta $E12000+2,x
lda FontData+4,y
sta $E12000+160,x
lda FontData+6,y
sta $E12000+160+2,x
lda FontData+8,y
sta $E12000+160*2,x
lda FontData+10,y
sta $E12000+160*2+2,x
lda FontData+12,y
sta $E12000+160*3,x
lda FontData+14,y
sta $E12000+160*3+2,x
lda FontData+16,y
sta $E12000+160*4,x
lda FontData+18,y
sta $E12000+160*4+2,x
lda FontData+20,y
sta $E12000+160*5,x
lda FontData+22,y
sta $E12000+160*5+2,x
rts
FontTable:
.addr s_Space
.addr s_Exclaim
.addr s_Quote
.addr s_Number
.addr s_Dollar
.addr s_Percent
.addr s_Amper
.addr s_Single
.addr s_OpenParen
.addr s_CloseParen
.addr s_Asterix
.addr s_Plus
.addr s_Comma
.addr s_Minus
.addr s_Period
.addr s_Slash
.addr s_N0
.addr s_N1
.addr s_N2
.addr s_N3
.addr s_N4
.addr s_N5
.addr s_N6
.addr s_N7
.addr s_N8
.addr s_N9
.addr s_Colon
.addr s_Semi
.addr s_LAngle
.addr s_Equal
.addr s_RAngle
.addr s_Question
.addr s_At
.addr s_A
.addr s_B
.addr s_C
.addr s_D
.addr s_E
.addr s_F
.addr s_G
.addr s_H
.addr s_I
.addr s_J
.addr s_K
.addr s_L
.addr s_M
.addr s_N
.addr s_O
.addr s_P
.addr s_Q
.addr s_R
.addr s_S
.addr s_T
.addr s_U
.addr s_V
.addr s_W
.addr s_X
.addr s_Y
.addr s_Z
.addr s_LBracket
.addr s_BackSlash
.addr s_RBracket
.addr s_Caret
.addr s_UnderLine
FontData:
s_Space:
qbyte $00000000
qbyte $00000000
qbyte $00000000
qbyte $00000000
qbyte $00000000
qbyte $00000000
s_Exclaim:
qbyte $000FF000
qbyte $000FF000
qbyte $000FF000
qbyte $000FF000
qbyte $00000000
qbyte $000FF000
s_Quote:
qbyte $0FF00FF0
qbyte $00F000F0
qbyte $00000000
qbyte $00000000
qbyte $00000000
qbyte $00000000
s_Number:
qbyte $00000000
qbyte $00F00F00
qbyte $0FFFFFF0
qbyte $00F00F00
qbyte $0FFFFFF0
qbyte $00F00F00
s_Dollar:
qbyte $000F0F00
qbyte $00FFFFF0
qbyte $0F0F0F00
qbyte $00FFFF00
qbyte $000F0FF0
qbyte $0FFFFF00
s_Percent:
qbyte $0FF000F0
qbyte $00000F00
qbyte $0000F000
qbyte $000F0000
qbyte $00F00000
qbyte $0F000FF0
s_Amper:
qbyte $000FF000
qbyte $00F00F00
qbyte $0F00F000
qbyte $00F000F0
qbyte $0F0FFF00
qbyte $00F0F000
s_Single:
qbyte $000FF000
qbyte $0000F000
qbyte $00000000
qbyte $00000000
qbyte $00000000
qbyte $00000000
s_OpenParen:
qbyte $000FF000
qbyte $00FF0000
qbyte $0FF00000
qbyte $0FF00000
qbyte $00FF0000
qbyte $000FF000
s_CloseParen:
qbyte $000FF000
qbyte $0000FF00
qbyte $00000FF0
qbyte $00000FF0
qbyte $0000FF00
qbyte $000FF000
s_Asterix:
qbyte $00000000
qbyte $00F0F0F0
qbyte $000FFF00
qbyte $00FFFFF0
qbyte $000FFF00
qbyte $00F0F0F0
s_Plus:
qbyte $000F0000
qbyte $000F0000
qbyte $0FFFFF00
qbyte $000F0000
qbyte $000F0000
qbyte $00000000
s_Comma:
qbyte $00000000
qbyte $00000000
qbyte $00000000
qbyte $00000000
qbyte $0000FF00
qbyte $0000F000
s_Minus:
qbyte $00000000
qbyte $00000000
qbyte $0FFFFF00
qbyte $00000000
qbyte $00000000
qbyte $00000000
s_Period:
qbyte $00000000
qbyte $00000000
qbyte $00000000
qbyte $00000000
qbyte $0000FF00
qbyte $0000FF00
s_Slash:
qbyte $000000F0
qbyte $00000F00
qbyte $0000F000
qbyte $000F0000
qbyte $00F00000
qbyte $0F000000
s_N0:
qbyte $00FFFF00
qbyte $0F000FF0
qbyte $0F00F0F0
qbyte $0F0F00F0
qbyte $0FF000F0
qbyte $00FFFF00
s_N1:
qbyte $000F0000
qbyte $00FF0000
qbyte $000F0000
qbyte $000F0000
qbyte $000F0000
qbyte $00FFF000
s_N2:
qbyte $00FFFF00
qbyte $0F0000F0
qbyte $00000F00
qbyte $000FF000
qbyte $00F00000
qbyte $0FFFFFF0
s_N3:
qbyte $00FFFF00
qbyte $000000F0
qbyte $000FFF00
qbyte $000000F0
qbyte $000000F0
qbyte $00FFFF00
s_N4:
qbyte $0000FF00
qbyte $000F0F00
qbyte $00F00F00
qbyte $0FFFFFF0
qbyte $00000F00
qbyte $00000F00
s_N5:
qbyte $0FFFFFF0
qbyte $0F000000
qbyte $0FFFFF00
qbyte $000000F0
qbyte $0F0000F0
qbyte $00FFFF00
s_N6:
qbyte $000FFF00
qbyte $00F00000
qbyte $0F000000
qbyte $0FFFFF00
qbyte $0F0000F0
qbyte $00FFFFF0
s_N7:
qbyte $0FFFFFF0
qbyte $000000F0
qbyte $00000F00
qbyte $0000F000
qbyte $000F0000
qbyte $000F0000
s_N8:
qbyte $00FFFF00
qbyte $0F0000F0
qbyte $00FFFF00
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $00FFFF00
s_N9:
qbyte $00FFFF00
qbyte $0F0000F0
qbyte $00FFFF00
qbyte $0000F000
qbyte $000F0000
qbyte $00F00000
s_Colon:
qbyte $000FF000
qbyte $000FF000
qbyte $00000000
qbyte $000FF000
qbyte $000FF000
qbyte $00000000
s_Semi:
qbyte $00000000
qbyte $000FF000
qbyte $000FF000
qbyte $00000000
qbyte $000FF000
qbyte $000F0000
s_LAngle:
qbyte $0000F000
qbyte $000F0000
qbyte $00F00000
qbyte $000F0000
qbyte $0000F000
qbyte $00000000
s_Equal:
qbyte $00000000
qbyte $00000000
qbyte $0FFFFF00
qbyte $00000000
qbyte $0FFFFF00
qbyte $00000000
s_RAngle:
qbyte $0000F000
qbyte $00000F00
qbyte $000000F0
qbyte $00000F00
qbyte $0000F000
qbyte $00000000
s_Question:
qbyte $00FFF000
qbyte $0F000F00
qbyte $00000F00
qbyte $000FF000
qbyte $00000000
qbyte $000FF000
s_At:
qbyte $00FFFF00
qbyte $0F0000F0
qbyte $0F00F0F0
qbyte $0FFFF0F0
qbyte $000000F0
qbyte $0FFFFF00
s_A:
qbyte $000FF000
qbyte $00F00F00
qbyte $0F0000F0
qbyte $0FFFFFF0
qbyte $0F0000F0
qbyte $0F0000F0
s_B:
qbyte $0FFFFF00
qbyte $0F0000F0
qbyte $0FFFFF00
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0FFFFF00
s_C:
qbyte $00FFFFF0
qbyte $0F000000
qbyte $0F000000
qbyte $0F000000
qbyte $0F000000
qbyte $00FFFFF0
s_D:
qbyte $0FFFFF00
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0FFFFF00
s_E:
qbyte $0FFFFFF0
qbyte $0F000000
qbyte $0FFFF000
qbyte $0F000000
qbyte $0F000000
qbyte $0FFFFFF0
s_F:
qbyte $0FFFFFF0
qbyte $0F000000
qbyte $0FFFF000
qbyte $0F000000
qbyte $0F000000
qbyte $0F000000
s_G:
qbyte $00FFFFF0
qbyte $0F000000
qbyte $0F000000
qbyte $0F00FFF0
qbyte $0F0000F0
qbyte $00FFFF00
s_H:
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0FFFFFF0
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0F0000F0
s_I:
qbyte $0FFFFF00
qbyte $000F0000
qbyte $000F0000
qbyte $000F0000
qbyte $000F0000
qbyte $0FFFFF00
s_J:
qbyte $000000F0
qbyte $000000F0
qbyte $000000F0
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $00FFFF00
s_K:
qbyte $0F000F00
qbyte $0F00F000
qbyte $0FFF0000
qbyte $0F00F000
qbyte $0F000F00
qbyte $0F000F00
s_L:
qbyte $0F000000
qbyte $0F000000
qbyte $0F000000
qbyte $0F000000
qbyte $0F000000
qbyte $0FFFFFF0
s_M:
qbyte $0F0000F0
qbyte $0FF00FF0
qbyte $0F0FF0F0
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0F0000F0
s_N:
qbyte $0F0000F0
qbyte $0FF000F0
qbyte $0F0F00F0
qbyte $0F00F0F0
qbyte $0F000FF0
qbyte $0F0000F0
s_O:
qbyte $00FFFF00
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $00FFFF00
s_P:
qbyte $0FFFFF00
qbyte $0F0000F0
qbyte $0FFFFF00
qbyte $0F000000
qbyte $0F000000
qbyte $0F000000
s_Q:
qbyte $00FFFF00
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0F00F0F0
qbyte $0F000FF0
qbyte $00FFFFF0
s_R:
qbyte $0FFFFF00
qbyte $0F0000F0
qbyte $0FFFFF00
qbyte $0F000F00
qbyte $0F0000F0
qbyte $0F0000F0
s_S:
qbyte $00FFFFF0
qbyte $0F000000
qbyte $00FFFF00
qbyte $000000F0
qbyte $000000F0
qbyte $0FFFFF00
s_T:
qbyte $0FFFFF00
qbyte $000F0000
qbyte $000F0000
qbyte $000F0000
qbyte $000F0000
qbyte $000F0000
s_U:
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $00FFFF00
s_V:
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $00F00F00
qbyte $000FF000
s_W:
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0F0000F0
qbyte $0F0FF0F0
qbyte $0FF00FF0
qbyte $0F0000F0
s_X:
qbyte $0F0000F0
qbyte $00F00F00
qbyte $000FF000
qbyte $000FF000
qbyte $00F00F00
qbyte $0F0000F0
s_Y:
qbyte $F00000F0
qbyte $0F000F00
qbyte $00F0F000
qbyte $000F0000
qbyte $000F0000
qbyte $000F0000
s_Z:
qbyte $0FFFFFF0
qbyte $00000F00
qbyte $0000F000
qbyte $000F0000
qbyte $00F00000
qbyte $0FFFFFF0
s_LBracket:
qbyte $000FFF00
qbyte $000F0000
qbyte $000F0000
qbyte $000F0000
qbyte $000F0000
qbyte $000FFF00
s_BackSlash:
qbyte $0F000000
qbyte $00F00000
qbyte $000F0000
qbyte $0000F000
qbyte $00000F00
qbyte $000000F0
s_RBracket:
qbyte $00FFF000
qbyte $0000F000
qbyte $0000F000
qbyte $0000F000
qbyte $0000F000
qbyte $00FFF000
s_Caret:
qbyte $0000F000
qbyte $000F0F00
qbyte $00F000F0
qbyte $00000000
qbyte $00000000
qbyte $00000000
s_UnderLine:
qbyte $00000000
qbyte $00000000
qbyte $00000000
qbyte $00000000
qbyte $00000000
qbyte $FFFFFFF0
s_Template:
qbyte $00000000
qbyte $00000000
qbyte $00000000
qbyte $00000000
qbyte $00000000
qbyte $00000000

Binary file not shown.

View File

@ -29,6 +29,10 @@ mainBank2:
ldx #$2222
jsr colorFill
ldx #2560
lda #string
jsr DrawString
jsr generateTerrain
jsr compileTerrain
jsr clipTerrain
@ -148,15 +152,19 @@ kbdScanSpace:
basePalette:
.word $0800,$0080,$0000,$000F,$0FFF,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
.word $0000,$0080,$0000,$000F,$0FFF,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0FFF
mapScrollPos: ; 4-pixel columns distance from right terrain edge
.word 0
quitRequested:
.word $0000
mapScrollRequested:
.word $FFFF
string:
pstring "HELLO WORLD"
.include "graphics.s"
.include "font.s"
.include "terrain.s"
.include "tables.s"
endMainBank2:

View File

@ -118,6 +118,15 @@
.endmacro
.macro pstring Arg
.byte .strlen(Arg), Arg
.endmacro
.macro qbyte Arg
.dbyt Arg>>16,Arg&$0000ffff
.endmacro
;;;;;;;;;;
; Stack Macros