Added generator for scrolling wipe

This commit is contained in:
Rob McMullen 2017-07-26 10:40:11 -07:00
parent 5a66fad560
commit 8ab52b1722
1 changed files with 57 additions and 0 deletions

View File

@ -1189,6 +1189,59 @@ class RawHGRImage(object):
print("created HGR screen: %s" % output)
class FastScroll(Listing):
def __init__(self, assembler, screen, lines=1, screen1=0x4000, screen2=0x2000):
Listing.__init__(self, assembler)
self.slug = "fastscroll"
self.generate_table(screen, lines, screen1, screen2)
def generate_table(self, screen, lines, source, dest):
label = "FASTSCROLL_%x_%x" % (source, dest)
end_label = "%s_RTS" % label
outer_label = "%s_OUTER" % label
inner_label = "%s_INNER" % label
cont_label = "%s_NEXT_OUTER" % label
self.label(end_label)
self.asm("rts")
self.label(label)
smc_labels = []
# Have to use self-modifying code because assembler may not allow
# taking the hi/lo bytes of an address - 1
self.comment("A,X,Y clobbered")
self.asm("ldy #0")
self.label(outer_label)
self.asm("cpy #192")
self.asm("bcs %s" % end_label)
for r in range(lines):
smc_labels.append("%s_SMC%d" % (label, r))
self.asm("lda HGRROWS_L,y")
self.asm("sta %s+1" % smc_labels[r])
self.asm("lda HGRROWS_H2,y")
self.asm("sta %s+2" % smc_labels[r])
self.asm("iny")
self.asm("ldx #39")
self.label(inner_label)
s = screen.generate_row_addresses(source)
d = screen.generate_row_addresses(dest)
for r in range(screen.screen_height - lines):
self.asm("lda $%04x,x" % d[r + lines])
self.asm("sta $%04x,x" % d[r])
source = screen.screen_height - lines
for r in range(lines):
self.label(smc_labels[r])
self.asm("lda $ffff,x")
self.asm("sta $%04x,x" % d[r + screen.screen_height - lines])
self.asm("dex")
self.asm("bmi %s\n" % cont_label)
self.asm("jmp %s" % inner_label)
self.label(cont_label)
self.asm("jmp %s" % outer_label)
self.out()
if __name__ == "__main__":
disclaimer = '''; AUTOGENERATED FILE; DO NOT EDIT!
;
@ -1212,6 +1265,7 @@ if __name__ == "__main__":
parser.add_argument("-p", "--processor", default="any", choices=["any","6502", "65C02"], help="Processor type (default: %(default)s)")
parser.add_argument("-s", "--screen", default="hgrcolor", choices=["hgrcolor","hgrbw"], help="Screen format (default: %(default)s)")
parser.add_argument("-i", "--image", default="line", choices=["line", "color","bw"], help="Screen format used for full page image conversion (default: %(default)s)")
parser.add_argument("-l", "--scroll", default=1, type=int, help="Unrolled loop to scroll screen (default: %(default)s)")
parser.add_argument("--merge", type=int, nargs="*", help="Merge two HGR images, switching images at the scan line")
parser.add_argument("-n", "--name", default="", help="Name for generated assembly function (default: based on image filename)")
parser.add_argument("-k", "--clobber", action="store_true", default=False, help="don't save the registers on the stack")
@ -1293,6 +1347,9 @@ if __name__ == "__main__":
if options.font:
listings.append(FastFont(assembler, screen, options.font, options.double_buffer))
if options.scroll:
listings.append(FastScroll(assembler, screen, options.scroll))
if listings:
if options.output_prefix:
if Sprite.backing_store_sizes: