mirror of
https://github.com/ksherlock/hystricomorph.git
synced 2025-02-17 04:30:58 +00:00
longm/longx properties
This commit is contained in:
parent
9b1084f9a3
commit
3eff95d766
31
asm.py
31
asm.py
@ -33,9 +33,11 @@ class Assembler(object):
|
|||||||
|
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
self.mx = 0b11
|
||||||
self.blocks = []
|
self.blocks = []
|
||||||
self.b = None
|
self.b = None
|
||||||
self.label = 0
|
self.label = 0
|
||||||
|
|
||||||
self.new_block()
|
self.new_block()
|
||||||
|
|
||||||
|
|
||||||
@ -56,11 +58,8 @@ 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.b.mx = self.mx
|
||||||
|
|
||||||
self.blocks.append(self.b)
|
self.blocks.append(self.b)
|
||||||
|
|
||||||
@ -75,24 +74,35 @@ class Assembler(object):
|
|||||||
self.b.instr.append("\t" + op)
|
self.b.instr.append("\t" + op)
|
||||||
|
|
||||||
def mx_common(self, onoff, mask):
|
def mx_common(self, onoff, mask):
|
||||||
mx = oldmx = self.b.mx
|
|
||||||
|
mx = self.mx
|
||||||
|
|
||||||
if onoff: mx |= mask
|
if onoff: mx |= mask
|
||||||
else: mx &= ~mask
|
else: mx &= ~mask
|
||||||
|
|
||||||
if mx == oldmx: return
|
if mx == self.mx: return
|
||||||
|
|
||||||
if not self.b.empty():
|
if not self.b.empty():
|
||||||
self.new_block()
|
self.new_block()
|
||||||
|
|
||||||
self.b.mx = mx
|
self.b.mx = mx
|
||||||
|
self.mx = mx
|
||||||
|
|
||||||
|
@property
|
||||||
|
def longm(self):
|
||||||
|
return bool(self.mx & 0b10)
|
||||||
|
|
||||||
def longm(self, onoff):
|
@longm.setter
|
||||||
self.mx_common(onoff, 0b10)
|
def longm(self, value):
|
||||||
|
self.mx_common(value, 0b10)
|
||||||
|
|
||||||
def longx(self, onoff):
|
@property
|
||||||
self.mx_common(onoff, 0b01)
|
def longx(self):
|
||||||
|
return bool(self.mx & 0b01)
|
||||||
|
|
||||||
|
@longx.setter
|
||||||
|
def longx(self, value):
|
||||||
|
self.mx_common(value, 0b01)
|
||||||
|
|
||||||
def merge_rts(self):
|
def merge_rts(self):
|
||||||
blocks = []
|
blocks = []
|
||||||
@ -214,6 +224,7 @@ class Assembler(object):
|
|||||||
self.footer(io)
|
self.footer(io)
|
||||||
|
|
||||||
self.blocks = []
|
self.blocks = []
|
||||||
|
self.mx = 0b11
|
||||||
self.new_block()
|
self.new_block()
|
||||||
|
|
||||||
def header(self, io):
|
def header(self, io):
|
||||||
|
@ -33,7 +33,7 @@ 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)
|
asm.longm = not short_m
|
||||||
if short_m:
|
if short_m:
|
||||||
asm.emit("ora #${:02x}".format(new), 2)
|
asm.emit("ora #${:02x}".format(new), 2)
|
||||||
else:
|
else:
|
||||||
@ -70,10 +70,10 @@ def generate_asm(asm, d, level):
|
|||||||
|
|
||||||
if count>0:
|
if count>0:
|
||||||
if short_m:
|
if short_m:
|
||||||
asm.longm(False)
|
asm.longm = False
|
||||||
asm.emit("sep #$20", 2)
|
asm.emit("sep #$20", 2)
|
||||||
else:
|
else:
|
||||||
asm.longm(True)
|
asm.longm = True
|
||||||
|
|
||||||
if level==0:
|
if level==0:
|
||||||
asm.emit("lda (cp)", 2)
|
asm.emit("lda (cp)", 2)
|
||||||
@ -90,14 +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.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.longm = False
|
||||||
asm.emit("sep #$20", 2)
|
asm.emit("sep #$20", 2)
|
||||||
short_m = True
|
short_m = True
|
||||||
mask = mask & 0xff
|
mask = mask & 0xff
|
||||||
@ -107,15 +107,13 @@ 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(False)
|
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.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: asm.longm(True)
|
|
||||||
|
|
||||||
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…
x
Reference in New Issue
Block a user