mirror of
https://github.com/robmcmullen/asmgen.git
synced 2024-12-22 14:29:18 +00:00
Added option to clobber registers in sprite code
* caller has to save what they need, but saves 26 cycles
This commit is contained in:
parent
6dfab0efb5
commit
18101794b9
38
HiSprite.py
38
HiSprite.py
@ -203,7 +203,7 @@ class Listing(object):
|
|||||||
class Sprite(Listing):
|
class Sprite(Listing):
|
||||||
backing_store_sizes = set()
|
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)
|
Listing.__init__(self, assembler)
|
||||||
self.screen = screen
|
self.screen = screen
|
||||||
|
|
||||||
@ -213,6 +213,7 @@ class Sprite(Listing):
|
|||||||
self.xdraw = xdraw
|
self.xdraw = xdraw
|
||||||
self.use_mask = use_mask
|
self.use_mask = use_mask
|
||||||
self.backing_store = backing_store
|
self.backing_store = backing_store
|
||||||
|
self.clobber = clobber
|
||||||
self.processor = processor
|
self.processor = processor
|
||||||
if not name:
|
if not name:
|
||||||
name = os.path.splitext(pngfile)[0]
|
name = os.path.splitext(pngfile)[0]
|
||||||
@ -267,7 +268,8 @@ class Sprite(Listing):
|
|||||||
self.asm("pla")
|
self.asm("pla")
|
||||||
|
|
||||||
def jump65C02(self):
|
def jump65C02(self):
|
||||||
self.save_axy_65C02()
|
if not self.clobber:
|
||||||
|
self.save_axy_65C02()
|
||||||
self.asm("ldy PARAM0")
|
self.asm("ldy PARAM0")
|
||||||
self.asm("ldx MOD%d_%d,y" % (self.screen.numShifts, self.screen.bitsPerPixel))
|
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))
|
self.addr("%s_SHIFT%d" % (self.slug, shift))
|
||||||
|
|
||||||
def jump6502(self):
|
def jump6502(self):
|
||||||
self.save_axy_6502()
|
if not self.clobber:
|
||||||
|
self.save_axy_6502()
|
||||||
self.asm("ldy PARAM0")
|
self.asm("ldy PARAM0")
|
||||||
self.asm("ldx MOD%d_%d,y" % (self.screen.numShifts, self.screen.bitsPerPixel))
|
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)
|
cycleCount, optimizationCount = self.generateBlitter(colorStreams, maskStreams, cycleCount)
|
||||||
|
|
||||||
if self.processor == "any":
|
if not self.clobber:
|
||||||
self.out(".ifpC02")
|
if self.processor == "any":
|
||||||
self.restore_axy_65C02()
|
self.out(".ifpC02")
|
||||||
self.out(".else")
|
self.restore_axy_65C02()
|
||||||
self.restore_axy_6502()
|
self.out(".else")
|
||||||
self.out(".endif")
|
self.restore_axy_6502()
|
||||||
elif self.processor == "65C02":
|
self.out(".endif")
|
||||||
self.restore_axy_65C02()
|
elif self.processor == "65C02":
|
||||||
elif self.processor == "6502":
|
self.restore_axy_65C02()
|
||||||
self.restore_axy_6502()
|
elif self.processor == "6502":
|
||||||
else:
|
self.restore_axy_6502()
|
||||||
raise RuntimeError("Processor %s not supported" % self.processor)
|
else:
|
||||||
|
raise RuntimeError("Processor %s not supported" % self.processor)
|
||||||
|
self.out()
|
||||||
self.asm("rts")
|
self.asm("rts")
|
||||||
self.comment("Cycle count: %d, Optimized %d rows." % (cycleCount,optimizationCount))
|
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("-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("-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("-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("-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!")
|
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()
|
options, extra_args = parser.parse_known_args()
|
||||||
@ -725,7 +731,7 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
for pngfile in options.files:
|
for pngfile in options.files:
|
||||||
try:
|
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:
|
except RuntimeError, e:
|
||||||
print "%s: %s" % (pngfile, e)
|
print "%s: %s" % (pngfile, e)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
@ -29,7 +29,7 @@ colortest.dsk: HiSprite.py colortest.s bwsprite.s
|
|||||||
atrcopy colortest.dsk boot -b colortest.xex --brun 6000 -f
|
atrcopy colortest.dsk boot -b colortest.xex --brun 6000 -f
|
||||||
|
|
||||||
multitest-sprite-driver.s: HiSprite.py $(BWSPRITE)
|
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
|
multitest.dsk: HiSprite.py multitest.s multitest-sprite-driver.s
|
||||||
atasm -omultitest.xex multitest.s -Lmultitest.var -gmultitest.lst
|
atasm -omultitest.xex multitest.s -Lmultitest.var -gmultitest.lst
|
||||||
|
BIN
multitest.dsk
BIN
multitest.dsk
Binary file not shown.
@ -57,8 +57,10 @@ initsprites
|
|||||||
; Draw sprites by looping through the list of sprites
|
; Draw sprites by looping through the list of sprites
|
||||||
renderstart
|
renderstart
|
||||||
ldy #0
|
ldy #0
|
||||||
|
sty PARAM3
|
||||||
|
|
||||||
renderloop
|
renderloop
|
||||||
|
ldy PARAM3
|
||||||
lda sprite_active,y
|
lda sprite_active,y
|
||||||
bmi renderend ; end of list if negative
|
bmi renderend ; end of list if negative
|
||||||
beq renderskip ; skip if zero
|
beq renderskip ; skip if zero
|
||||||
@ -74,7 +76,7 @@ renderloop
|
|||||||
jsrsprite
|
jsrsprite
|
||||||
jsr $ffff ; wish you could JSR ($nnnn)
|
jsr $ffff ; wish you could JSR ($nnnn)
|
||||||
renderskip
|
renderskip
|
||||||
iny
|
inc PARAM3
|
||||||
bne renderloop ; branch always because always positive; otherwise limited to 255 sprites (haha)
|
bne renderloop ; branch always because always positive; otherwise limited to 255 sprites (haha)
|
||||||
|
|
||||||
renderend
|
renderend
|
||||||
|
Loading…
Reference in New Issue
Block a user