From d46fae7cf00129a13afb9e877c51f12263eec2b1 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Sun, 11 Aug 2019 00:12:10 -0400 Subject: [PATCH] move long m/x settings to the block --- asm.py | 43 +++++++++++++++++++++++++++++++++++++++++++ string_compiler.py | 15 +++++++++------ 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/asm.py b/asm.py index 4d96053..4e7d07d 100644 --- a/asm.py +++ b/asm.py @@ -9,6 +9,7 @@ class Block(object): self.labels = [] self.instr = [] self.rts = False + self.mx = 0b11 def empty(self): return len(self.instr) == 0 and self.bne == None @@ -39,7 +40,12 @@ class Assembler(object): self.new_block() def new_block(self): + mx = 0b11 + if self.b: + mx = self.b.mx self.b = Block() + self.b.mx = mx + self.blocks.append(self.b) def bne(self, l): @@ -50,6 +56,26 @@ class Assembler(object): self.b.size = self.b.size + size 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): blocks = [] prev = None @@ -132,14 +158,31 @@ class Assembler(object): def finish(self,io): + onoff = ("on", "off") self.b = None self.merge_rts() self.merge_labels() self.reify_branches() self.header(io) + + mx = 0b11 + io.write("\tlongi on\n") + io.write("\tlonga on\n") + for b in self.blocks: 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") self.footer(io) diff --git a/string_compiler.py b/string_compiler.py index a0395ef..ab165b3 100644 --- a/string_compiler.py +++ b/string_compiler.py @@ -33,10 +33,9 @@ def mask_char(asm, short_m, old, new): if old & ~new: asm.emit("tya", 1) + asm.longm(not short_m) if short_m: - asm.emit("longa off", 0) asm.emit("ora #${:02x}".format(new), 2) - asm.emit("longa on", 0) else: asm.emit("ora #${:04x}".format(new), 3) return new @@ -71,7 +70,10 @@ def generate_asm(asm, d, level): if count>0: if short_m: + asm.longm(False) asm.emit("sep #$20", 2) + else: + asm.longm(True) if level==0: asm.emit("lda (cp)", 2) @@ -88,12 +90,14 @@ def generate_asm(asm, d, level): l = asm.reserve_label() if flag_i: mask = mask_char(asm, short_m, mask, or_mask(k)) v = str_to_int(k) + asm.longm(True) asm.emit("cmp #${:04x}\t; '{}'".format(v, encode_string(k)), 3) asm.bne(l) generate_asm(asm, dd, level+1) asm.emit_label(l) if single and double: + asm.longm(False) asm.emit("sep #$20", 2) short_m = True mask = mask & 0xff @@ -103,16 +107,15 @@ def generate_asm(asm, d, level): l = asm.reserve_label() if flag_i: mask = mask_char(asm, short_m, mask, or_mask(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("longa on", 0) asm.bne(l) generate_asm(asm, dd, level+1) asm.emit_label(l) - # if short_m: - # asm.emit("longa on", 0) + # if short_m: asm.longm(True) + if "" in d: d = d[""] asm.emit("ldx #{}\t; '{}'".format(d["__value__"], d["__key__"]), 3)