diff --git a/HiSprite.py b/HiSprite.py index 6264576..69449fe 100755 --- a/HiSprite.py +++ b/HiSprite.py @@ -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: