mirror of
https://github.com/ksherlock/hystricomorph.git
synced 2024-06-02 20:41:29 +00:00
move long m/x settings to the block
This commit is contained in:
parent
d78d9d51dc
commit
d46fae7cf0
43
asm.py
43
asm.py
|
@ -9,6 +9,7 @@ class Block(object):
|
||||||
self.labels = []
|
self.labels = []
|
||||||
self.instr = []
|
self.instr = []
|
||||||
self.rts = False
|
self.rts = False
|
||||||
|
self.mx = 0b11
|
||||||
|
|
||||||
def empty(self):
|
def empty(self):
|
||||||
return len(self.instr) == 0 and self.bne == None
|
return len(self.instr) == 0 and self.bne == None
|
||||||
|
@ -39,7 +40,12 @@ class Assembler(object):
|
||||||
self.new_block()
|
self.new_block()
|
||||||
|
|
||||||
def new_block(self):
|
def new_block(self):
|
||||||
|
mx = 0b11
|
||||||
|
if self.b:
|
||||||
|
mx = self.b.mx
|
||||||
self.b = Block()
|
self.b = Block()
|
||||||
|
self.b.mx = mx
|
||||||
|
|
||||||
self.blocks.append(self.b)
|
self.blocks.append(self.b)
|
||||||
|
|
||||||
def bne(self, l):
|
def bne(self, l):
|
||||||
|
@ -50,6 +56,26 @@ class Assembler(object):
|
||||||
self.b.size = self.b.size + size
|
self.b.size = self.b.size + size
|
||||||
self.b.instr.append("\t" + op)
|
self.b.instr.append("\t" + op)
|
||||||
|
|
||||||
|
def mx_common(self, onoff, mask):
|
||||||
|
mx = oldmx = self.b.mx
|
||||||
|
|
||||||
|
if onoff: mx |= mask
|
||||||
|
else: mx &= ~mask
|
||||||
|
|
||||||
|
if mx == oldmx: return
|
||||||
|
|
||||||
|
if not self.b.empty():
|
||||||
|
self.new_block()
|
||||||
|
|
||||||
|
self.b.mx = mx
|
||||||
|
|
||||||
|
|
||||||
|
def longm(self, onoff):
|
||||||
|
self.mx_common(onoff, 0b10)
|
||||||
|
|
||||||
|
def longx(self, onoff):
|
||||||
|
self.mx_common(onoff, 0b01)
|
||||||
|
|
||||||
def merge_rts(self):
|
def merge_rts(self):
|
||||||
blocks = []
|
blocks = []
|
||||||
prev = None
|
prev = None
|
||||||
|
@ -132,14 +158,31 @@ class Assembler(object):
|
||||||
|
|
||||||
|
|
||||||
def finish(self,io):
|
def finish(self,io):
|
||||||
|
onoff = ("on", "off")
|
||||||
self.b = None
|
self.b = None
|
||||||
self.merge_rts()
|
self.merge_rts()
|
||||||
self.merge_labels()
|
self.merge_labels()
|
||||||
self.reify_branches()
|
self.reify_branches()
|
||||||
|
|
||||||
self.header(io)
|
self.header(io)
|
||||||
|
|
||||||
|
mx = 0b11
|
||||||
|
io.write("\tlongi on\n")
|
||||||
|
io.write("\tlonga on\n")
|
||||||
|
|
||||||
for b in self.blocks:
|
for b in self.blocks:
|
||||||
for l in b.labels: io.write(l + "\tanop\n")
|
for l in b.labels: io.write(l + "\tanop\n")
|
||||||
|
|
||||||
|
# io.write(f"mx: {b.mx}\n")
|
||||||
|
mxdiff = mx ^ b.mx
|
||||||
|
if mxdiff:
|
||||||
|
if mxdiff & 0b01:
|
||||||
|
io.write("\tlongi " + onoff[mx & 0b01] + "\n")
|
||||||
|
if mxdiff & 0b10:
|
||||||
|
io.write("\tlonga " + onoff[(mx & 0b10) >> 1] + "\n")
|
||||||
|
|
||||||
|
mx = b.mx
|
||||||
|
|
||||||
for i in b.instr: io.write(i + "\n")
|
for i in b.instr: io.write(i + "\n")
|
||||||
self.footer(io)
|
self.footer(io)
|
||||||
|
|
||||||
|
|
|
@ -33,10 +33,9 @@ def mask_char(asm, short_m, old, new):
|
||||||
if old & ~new:
|
if old & ~new:
|
||||||
asm.emit("tya", 1)
|
asm.emit("tya", 1)
|
||||||
|
|
||||||
|
asm.longm(not short_m)
|
||||||
if short_m:
|
if short_m:
|
||||||
asm.emit("longa off", 0)
|
|
||||||
asm.emit("ora #${:02x}".format(new), 2)
|
asm.emit("ora #${:02x}".format(new), 2)
|
||||||
asm.emit("longa on", 0)
|
|
||||||
else:
|
else:
|
||||||
asm.emit("ora #${:04x}".format(new), 3)
|
asm.emit("ora #${:04x}".format(new), 3)
|
||||||
return new
|
return new
|
||||||
|
@ -71,7 +70,10 @@ def generate_asm(asm, d, level):
|
||||||
|
|
||||||
if count>0:
|
if count>0:
|
||||||
if short_m:
|
if short_m:
|
||||||
|
asm.longm(False)
|
||||||
asm.emit("sep #$20", 2)
|
asm.emit("sep #$20", 2)
|
||||||
|
else:
|
||||||
|
asm.longm(True)
|
||||||
|
|
||||||
if level==0:
|
if level==0:
|
||||||
asm.emit("lda (cp)", 2)
|
asm.emit("lda (cp)", 2)
|
||||||
|
@ -88,12 +90,14 @@ def generate_asm(asm, d, level):
|
||||||
l = asm.reserve_label()
|
l = asm.reserve_label()
|
||||||
if flag_i: mask = mask_char(asm, short_m, mask, or_mask(k))
|
if flag_i: mask = mask_char(asm, short_m, mask, or_mask(k))
|
||||||
v = str_to_int(k)
|
v = str_to_int(k)
|
||||||
|
asm.longm(True)
|
||||||
asm.emit("cmp #${:04x}\t; '{}'".format(v, encode_string(k)), 3)
|
asm.emit("cmp #${:04x}\t; '{}'".format(v, encode_string(k)), 3)
|
||||||
asm.bne(l)
|
asm.bne(l)
|
||||||
generate_asm(asm, dd, level+1)
|
generate_asm(asm, dd, level+1)
|
||||||
asm.emit_label(l)
|
asm.emit_label(l)
|
||||||
|
|
||||||
if single and double:
|
if single and double:
|
||||||
|
asm.longm(False)
|
||||||
asm.emit("sep #$20", 2)
|
asm.emit("sep #$20", 2)
|
||||||
short_m = True
|
short_m = True
|
||||||
mask = mask & 0xff
|
mask = mask & 0xff
|
||||||
|
@ -103,16 +107,15 @@ def generate_asm(asm, d, level):
|
||||||
l = asm.reserve_label()
|
l = asm.reserve_label()
|
||||||
if flag_i: mask = mask_char(asm, short_m, mask, or_mask(k))
|
if flag_i: mask = mask_char(asm, short_m, mask, or_mask(k))
|
||||||
v = str_to_int(k)
|
v = str_to_int(k)
|
||||||
asm.emit("longa off", 0)
|
asm.longm(False)
|
||||||
asm.emit("cmp #${:02x}\t; '{}'".format(v, encode_string(k)), 2)
|
asm.emit("cmp #${:02x}\t; '{}'".format(v, encode_string(k)), 2)
|
||||||
asm.emit("longa on", 0)
|
|
||||||
|
|
||||||
asm.bne(l)
|
asm.bne(l)
|
||||||
generate_asm(asm, dd, level+1)
|
generate_asm(asm, dd, level+1)
|
||||||
asm.emit_label(l)
|
asm.emit_label(l)
|
||||||
|
|
||||||
# if short_m:
|
# if short_m: asm.longm(True)
|
||||||
# asm.emit("longa on", 0)
|
|
||||||
if "" in d:
|
if "" in d:
|
||||||
d = d[""]
|
d = d[""]
|
||||||
asm.emit("ldx #{}\t; '{}'".format(d["__value__"], d["__key__"]), 3)
|
asm.emit("ldx #{}\t; '{}'".format(d["__value__"], d["__key__"]), 3)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user