diff --git a/quicksprite.py b/quicksprite.py index 27af870..a5c707c 100755 --- a/quicksprite.py +++ b/quicksprite.py @@ -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: