Added fast font routine using unrolled loops

This commit is contained in:
Rob McMullen 2017-07-04 13:34:25 -07:00
parent 95cd30c5ac
commit 607c020e7e
1 changed files with 63 additions and 0 deletions

View File

@ -921,6 +921,65 @@ class BackingStoreDriver(Listing):
self.out()
class FastFont(Listing):
def __init__(self, assembler, screen, font, double_buffer):
Listing.__init__(self, assembler)
self.slug = "fastfont"
self.generate_table(screen, "H1", 0x2000)
if double_buffer:
self.generate_table(screen, "H2", 0x4000)
self.generate_transposed_font(screen, font)
def generate_table(self, screen, suffix, hgrbase):
label = "FASTFONT_%s" % suffix
self.label(label)
# Have to use self-modifying code because assembler may not allow
# taking the hi/lo bytes of an address - 1
self.comment("A = character, X = column, Y = row; A is clobbered, X&Y are not")
self.asm("pha")
self.asm("lda %s_JMP_HI,y" % label)
self.asm("sta %s_JMP+2" % label)
self.asm("lda %s_JMP_LO,y" % label)
self.asm("sta %s_JMP+1" % label)
self.asm("sty FASTFONT_SCRATCH0")
self.asm("pla")
self.asm("tay")
self.label("%s_JMP" % label)
self.asm("jmp $ffff\n")
# Bit-shift jump table for generic 6502
self.out()
self.label("%s_JMP_HI" % label)
for r in range(24):
self.asm(".byte >%s_%d" % (label, r))
self.label("%s_JMP_LO" % label)
for r in range(24):
self.asm(".byte <%s_%d" % (label, r))
self.out()
hgr1 = screen.generate_row_addresses(hgrbase)
for r in range(24):
self.label("%s_%d" % (label, r))
for i in range(8):
self.asm("lda TRANSPOSED_FONT_ROW%d,y" % i)
self.asm("sta $%04x,x" % (hgr1[r*8 + i]))
self.asm("ldy FASTFONT_SCRATCH0")
self.asm("rts")
self.out()
def generate_transposed_font(self, screen, font):
with open(font, 'rb') as fh:
data = fh.read()
num_bytes = len(data)
num_chars = num_bytes / 8
for r in range(8):
self.label("TRANSPOSED_FONT_ROW%d" % r)
for i in range(num_chars):
index = i * 8 + r
self.byte("$%02x" % ord(data[index]), 16)
if __name__ == "__main__":
disclaimer = '''
; This file was generated by HiSprite.py, a sprite compiler by Quinn Dunki.
@ -941,6 +1000,7 @@ if __name__ == "__main__":
parser.add_argument("-k", "--clobber", action="store_true", default=False, help="don't save the registers on the stack")
parser.add_argument("-d", "--double-buffer", action="store_true", default=False, help="add code blit to either page (default: page 1 only)")
parser.add_argument("-g", "--damage", action="store_true", default=False, help="add code to report size of sprite upon return. Can be used in a damage list to restore an area from a pristine source.")
parser.add_argument("-f", "--font", action="store", default="", help="generate a fast font blitter for text on the hgr screen using the specified binary font file")
parser.add_argument("-o", "--output-prefix", default="", help="Base name to create a set of output files. If not supplied, all code will be sent to stdout.")
parser.add_argument("files", metavar="IMAGE", nargs="*", help="a PNG image [or a list of them]. PNG files must not have an alpha channel!")
options, extra_args = parser.parse_known_args()
@ -990,6 +1050,9 @@ if __name__ == "__main__":
if options.cols:
listings.append(ColLookup(assembler, screen))
if options.font:
listings.append(FastFont(assembler, screen, options.font, options.double_buffer))
if listings:
if options.output_prefix:
if Sprite.backing_store_sizes: