From 18101794b93c664b31b98a1b15b42ee10fb0e5a5 Mon Sep 17 00:00:00 2001 From: Rob McMullen Date: Fri, 30 Jun 2017 12:52:15 -0700 Subject: [PATCH] Added option to clobber registers in sprite code * caller has to save what they need, but saves 26 cycles --- HiSprite.py | 38 ++++++++++++++++++++++---------------- Makefile.rob | 2 +- multitest.dsk | Bin 143360 -> 143360 bytes multitest.s | 4 +++- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/HiSprite.py b/HiSprite.py index c86fc06..08e5d7b 100755 --- a/HiSprite.py +++ b/HiSprite.py @@ -203,7 +203,7 @@ class Listing(object): class Sprite(Listing): backing_store_sizes = set() - def __init__(self, pngfile, assembler, screen, xdraw=False, use_mask=False, backing_store=False, processor="any", name=""): + def __init__(self, pngfile, assembler, screen, xdraw=False, use_mask=False, backing_store=False, clobber=False, processor="any", name=""): Listing.__init__(self, assembler) self.screen = screen @@ -213,6 +213,7 @@ class Sprite(Listing): self.xdraw = xdraw self.use_mask = use_mask self.backing_store = backing_store + self.clobber = clobber self.processor = processor if not name: name = os.path.splitext(pngfile)[0] @@ -267,7 +268,8 @@ class Sprite(Listing): self.asm("pla") def jump65C02(self): - self.save_axy_65C02() + if not self.clobber: + self.save_axy_65C02() self.asm("ldy PARAM0") self.asm("ldx MOD%d_%d,y" % (self.screen.numShifts, self.screen.bitsPerPixel)) @@ -280,7 +282,8 @@ class Sprite(Listing): self.addr("%s_SHIFT%d" % (self.slug, shift)) def jump6502(self): - self.save_axy_6502() + if not self.clobber: + self.save_axy_6502() self.asm("ldy PARAM0") self.asm("ldx MOD%d_%d,y" % (self.screen.numShifts, self.screen.bitsPerPixel)) @@ -320,18 +323,20 @@ class Sprite(Listing): cycleCount, optimizationCount = self.generateBlitter(colorStreams, maskStreams, cycleCount) - if self.processor == "any": - self.out(".ifpC02") - self.restore_axy_65C02() - self.out(".else") - self.restore_axy_6502() - self.out(".endif") - elif self.processor == "65C02": - self.restore_axy_65C02() - elif self.processor == "6502": - self.restore_axy_6502() - else: - raise RuntimeError("Processor %s not supported" % self.processor) + if not self.clobber: + if self.processor == "any": + self.out(".ifpC02") + self.restore_axy_65C02() + self.out(".else") + self.restore_axy_6502() + self.out(".endif") + elif self.processor == "65C02": + self.restore_axy_65C02() + elif self.processor == "6502": + self.restore_axy_6502() + else: + raise RuntimeError("Processor %s not supported" % self.processor) + self.out() self.asm("rts") self.comment("Cycle count: %d, Optimized %d rows." % (cycleCount,optimizationCount)) @@ -698,6 +703,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("-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") 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() @@ -725,7 +731,7 @@ if __name__ == "__main__": for pngfile in options.files: try: - listings.append(Sprite(pngfile, assembler, screen, options.xdraw, options.mask, options.backing_store, options.processor, options.name)) + listings.append(Sprite(pngfile, assembler, screen, options.xdraw, options.mask, options.backing_store, options.clobber, options.processor, options.name)) except RuntimeError, e: print "%s: %s" % (pngfile, e) sys.exit(1) diff --git a/Makefile.rob b/Makefile.rob index a1d3d72..1abb932 100644 --- a/Makefile.rob +++ b/Makefile.rob @@ -29,7 +29,7 @@ colortest.dsk: HiSprite.py colortest.s bwsprite.s atrcopy colortest.dsk boot -b colortest.xex --brun 6000 -f multitest-sprite-driver.s: HiSprite.py $(BWSPRITE) - python HiSprite.py -a mac65 -p 6502 -s hgrbw -m -b -o multitest $(BWSPRITE) $(COLORSPRITE) + python HiSprite.py -a mac65 -p 6502 -s hgrbw -m -b -k -o multitest $(BWSPRITE) $(COLORSPRITE) multitest.dsk: HiSprite.py multitest.s multitest-sprite-driver.s atasm -omultitest.xex multitest.s -Lmultitest.var -gmultitest.lst diff --git a/multitest.dsk b/multitest.dsk index 4f025cf2a1bc4131e6cf22cbad268bf6ef27b038..7d5a8f324b6d7da5d8ffb0255ebfa9ada173cd9d 100644 GIT binary patch literal 143360 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