From b3a4a5b5b403fd39327af300b65553fc454f966f Mon Sep 17 00:00:00 2001 From: Rob McMullen Date: Fri, 30 Jun 2017 12:25:49 -0700 Subject: [PATCH] generateBlitter: restructured to use self.asm and optimization to remove trailing iny when at the end of a row --- HiSprite.py | 151 ++++++++++++++++++++++++++++---------------------- multitest.dsk | Bin 143360 -> 143360 bytes 2 files changed, 84 insertions(+), 67 deletions(-) diff --git a/HiSprite.py b/HiSprite.py index 27c73a4..91f059c 100755 --- a/HiSprite.py +++ b/HiSprite.py @@ -54,12 +54,13 @@ def slugify(s): class AssemblerSyntax(object): extension = "s" + comment_char = ";" def asm(self, text): return "\t%s" % text def comment(self, text): - return "\t; %s" % text + return "\t%s %s" % (self.comment_char, text) def label(self, text): return text @@ -132,13 +133,25 @@ class Listing(object): fh.write(str(self)) return filename - def out(self, line): + def out(self, line=""): self.flush_stash() self.lines.append(line) def out_append_last(self, line): self.lines[-1] += line + def pop_asm(self, cmd=""): + self.flush_stash() + if cmd: + search = self.assembler.asm(cmd) + i = -1 + while self.lines[i].strip().startswith(self.assembler.comment_char): + i -= 1 + if self.lines[i] == search: + self.lines.pop(i) + else: + self.lines.pop(-1) + def label(self, text): self.out(self.assembler.label(text)) @@ -303,18 +316,9 @@ class Sprite(Listing): byteWidth = len(colorStreams[0]) self.asm("jsr savebg_%dx%d" % (byteWidth, self.height)) self.backing_store_sizes.add((byteWidth, self.height)) - - self.asm("ldx PARAM1") - cycleCount += 3 - rowStartCode,extraCycles = self.rowStartCalculatorCode(); - self.out(rowStartCode) - cycleCount += extraCycles + cycleCount += 6 - spriteChunks, cycleCount, optimizationCount = self.generateBlitter(colorStreams, maskStreams, cycleCount) - - for row in range(self.height): - for chunkIndex in range(len(spriteChunks)): - self.out(spriteChunks[chunkIndex][row]) + cycleCount, optimizationCount = self.generateBlitter(colorStreams, maskStreams, cycleCount) if self.processor == "any": self.out(".ifpC02") @@ -333,70 +337,83 @@ class Sprite(Listing): def generateBlitter(self, colorStreams, maskStreams, baseCycleCount): byteWidth = len(colorStreams[0]) - spriteChunks = [["" for y in range(self.height)] for x in range(byteWidth)] cycleCount = baseCycleCount optimizationCount = 0 for row in range(self.height): - + cycleCount += self.rowStartCalculatorCode(row) + byteSplits = colorStreams[row] maskSplits = maskStreams[row] - - # Generate blitting code - for chunkIndex in range(len(byteSplits)): - - # Optimization - if maskSplits[chunkIndex] == "01111111" and not self.backing_store: - optimizationCount += 1 - else: - value = self.binary_constant(byteSplits[chunkIndex]) + byteCount = len(byteSplits) - # Store byte into video memory - if self.xdraw: - spriteChunks[chunkIndex][row] = \ - "\tlda (SCRATCH0),y\n" + \ - "\teor %s\n" % value + \ - "\tsta (SCRATCH0),y\n"; - cycleCount += 5 + 2 + 6 - elif self.use_mask: - mask = self.binary_constant(maskSplits[chunkIndex]) - spriteChunks[chunkIndex][row] = \ - "\tlda (SCRATCH0),y\n" + \ - "\tand %s\n" % mask + \ - "\tora %s\n" % value + \ - "\tsta (SCRATCH0),y\n"; - cycleCount += 5 + 2 + 6 - else: - spriteChunks[chunkIndex][row] = \ - "\tlda %s\n" % value + \ - "\tsta (SCRATCH0),y\n"; - cycleCount += 2 + 6 - - # Increment indices - if chunkIndex == len(byteSplits)-1: - spriteChunks[chunkIndex][row] += "\n" - else: - spriteChunks[chunkIndex][row] += "\tiny" + # number of trailing iny to remove due to unchanged bytes at the + # end of the row + skip_iny = 0 + + # Generate blitting code + for index, (value, mask) in enumerate(zip(byteSplits, maskSplits)): + if index > 0: + self.asm("iny") cycleCount += 2 - # Finish the row - if row 0: + self.pop_asm("iny") + skip_iny -= 1 + cycleCount -= 2 + + return cycleCount, optimizationCount + + def rowStartCalculatorCode(self, row): + self.out() + self.comment_line("row %d" % row) + if row == 0: + self.asm("ldx PARAM1") + cycles = 3 + else: + self.asm("inx") + cycles = 2 + self.asm("lda HGRROWS_H1,x") + self.asm("sta SCRATCH1") + self.asm("lda HGRROWS_L,x") + self.asm("sta SCRATCH0") + self.asm("ldy PARAM0") + self.asm("lda DIV%d_%d,y" % (self.screen.numShifts, self.screen.bitsPerPixel)) + self.asm("tay") + return cycles + 4 + 3 + 4 + 3 + 3 + 4 + 2; def shiftStringRight(string, shift, bitsPerPixel, fillerBit): @@ -698,7 +715,7 @@ if __name__ == "__main__": sys.exit(1) listings = [] - luts = {} + luts = {} # dict of lookup tables to prevent duplication in output files for pngfile in options.files: try: diff --git a/multitest.dsk b/multitest.dsk index 211df6040d54204ac43dd6d798eddb571258b8ca..4f025cf2a1bc4131e6cf22cbad268bf6ef27b038 100644 GIT binary patch literal 143360 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