From 148f9ae072c67024ce3d541f177e62f62e1965c9 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Mon, 13 Nov 2017 23:41:23 +0100 Subject: [PATCH] Implemented somewhat Better ASM static value analysis. Also recognizes ZP sta zp5, ldx zp5. --- .../camelot64/kickc/asm/AsmInstruction.java | 4 + .../asm/AsmProgramStaticRegisterValues.java | 72 +- .../kickc/passes/Pass5AsmOptimization.java | 9 + .../Pass5UnnecesaryLoadElimination.java | 92 +- .../kickc/test/ref/bitmap-bresenham.asm | 4 - .../kickc/test/ref/bitmap-bresenham.log | 24 +- .../dk/camelot64/kickc/test/ref/voronoi.asm | 9 +- .../dk/camelot64/kickc/test/ref/voronoi.log | 830 +++++++++++++++++- 8 files changed, 942 insertions(+), 102 deletions(-) diff --git a/src/main/java/dk/camelot64/kickc/asm/AsmInstruction.java b/src/main/java/dk/camelot64/kickc/asm/AsmInstruction.java index f50f8d19a..341f34024 100644 --- a/src/main/java/dk/camelot64/kickc/asm/AsmInstruction.java +++ b/src/main/java/dk/camelot64/kickc/asm/AsmInstruction.java @@ -55,4 +55,8 @@ public class AsmInstruction implements AsmLine { public void setParameter(String parameter) { this.parameter = parameter; } + + public void setType(AsmInstructionType type) { + this.type = type; + } } diff --git a/src/main/java/dk/camelot64/kickc/asm/AsmProgramStaticRegisterValues.java b/src/main/java/dk/camelot64/kickc/asm/AsmProgramStaticRegisterValues.java index 779127c31..c00928166 100644 --- a/src/main/java/dk/camelot64/kickc/asm/AsmProgramStaticRegisterValues.java +++ b/src/main/java/dk/camelot64/kickc/asm/AsmProgramStaticRegisterValues.java @@ -46,12 +46,15 @@ public class AsmProgramStaticRegisterValues { AsmClobber clobber = instructionType.getClobber(); if (clobber.isClobberA()) { current.setA(null); + current.setaMem(null); } if (clobber.isClobberX()) { current.setX(null); + current.setxMem(null); } if (clobber.isClobberY()) { current.setY(null); + current.setyMem(null); } if (clobber.isClobberC()) { current.setC(null); @@ -66,35 +69,44 @@ public class AsmProgramStaticRegisterValues { current.setZ(null); } if (instructionType.getMnemnonic().equals("lda") && instructionType.getAddressingMode().equals(AsmAddressingMode.IMM)) { + current.setA(instruction.getParameter()); try { int immValue = Integer.parseInt(instruction.getParameter()); current.setZ(immValue == 0); current.setN(immValue > 127); - current.setA(immValue); } catch (NumberFormatException e) { // ignore } } + if (instructionType.getMnemnonic().equals("sta") && (instructionType.getAddressingMode().equals(AsmAddressingMode.ZP)||instructionType.getAddressingMode().equals(AsmAddressingMode.ABS))) { + current.setaMem(instruction.getParameter()); + } if (instructionType.getMnemnonic().equals("ldx") && instructionType.getAddressingMode().equals(AsmAddressingMode.IMM)) { + current.setX(instruction.getParameter()); try { int immValue = Integer.parseInt(instruction.getParameter()); current.setZ(immValue == 0); current.setN(immValue > 127); - current.setX(immValue); } catch (NumberFormatException e) { // ignore } } + if (instructionType.getMnemnonic().equals("stx") && (instructionType.getAddressingMode().equals(AsmAddressingMode.ZP)||instructionType.getAddressingMode().equals(AsmAddressingMode.ABS))) { + current.setxMem(instruction.getParameter()); + } if (instructionType.getMnemnonic().equals("ldy") && instructionType.getAddressingMode().equals(AsmAddressingMode.IMM)) { + current.setY(instruction.getParameter()); try { int immValue = Integer.parseInt(instruction.getParameter()); current.setZ(immValue == 0); current.setN(immValue > 127); - current.setY(immValue); } catch (NumberFormatException e) { // ignore } } + if (instructionType.getMnemnonic().equals("sty") && (instructionType.getAddressingMode().equals(AsmAddressingMode.ZP)||instructionType.getAddressingMode().equals(AsmAddressingMode.ABS))) { + current.setyMem(instruction.getParameter()); + } if (instructionType.getMnemnonic().equals("sec")) { current.setC(Boolean.TRUE); } @@ -109,13 +121,16 @@ public class AsmProgramStaticRegisterValues { * Known values of registers/flags at an instruction. null where value is unknown. */ public static class AsmRegisterValues { - private Integer a; - private Integer x; - private Integer y; + private String a; + private String x; + private String y; private Boolean c; private Boolean v; private Boolean n; private Boolean z; + private String aMem; + private String xMem; + private String yMem; public AsmRegisterValues() { } @@ -128,17 +143,24 @@ public class AsmProgramStaticRegisterValues { this.v = original.getV(); this.n = original.getN(); this.z = original.getZ(); + this.aMem = original.getaMem(); + this.xMem = original.getxMem(); + this.yMem = original.getyMem(); } - public Integer getA() { + public String getA() { return a; } - public Integer getX() { + public String getaMem() { + return aMem; + } + + public String getX() { return x; } - public Integer getY() { + public String getY() { return y; } @@ -158,18 +180,38 @@ public class AsmProgramStaticRegisterValues { return z; } - public void setA(Integer a) { - this.a = a; - } - - public void setX(Integer x) { + public void setX(String x) { this.x = x; } - public void setY(Integer y) { + public void setY(String y) { this.y = y; } + public void setA(String a) { + this.a = a; + } + + public void setaMem(String aMem) { + this.aMem = aMem; + } + + public String getxMem() { + return xMem; + } + + public void setxMem(String xMem) { + this.xMem = xMem; + } + + public String getyMem() { + return yMem; + } + + public void setyMem(String yMem) { + this.yMem = yMem; + } + public void setC(Boolean c) { this.c = c; } diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass5AsmOptimization.java b/src/main/java/dk/camelot64/kickc/passes/Pass5AsmOptimization.java index 02de84751..4e5c62196 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass5AsmOptimization.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass5AsmOptimization.java @@ -9,6 +9,7 @@ import dk.camelot64.kickc.model.Program; import java.util.Collection; import java.util.Iterator; import java.util.List; +import java.util.ListIterator; /** * Optimization performed on Assembler Code (Asm Code). @@ -49,4 +50,12 @@ public abstract class Pass5AsmOptimization { } } } + + public boolean remove(ListIterator lineIt) { + getLog().append("Removing instruction " + lineIt.previous()); + lineIt.remove(); + return true; + } + + } diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass5UnnecesaryLoadElimination.java b/src/main/java/dk/camelot64/kickc/passes/Pass5UnnecesaryLoadElimination.java index 470fda268..567907b7d 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass5UnnecesaryLoadElimination.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass5UnnecesaryLoadElimination.java @@ -5,6 +5,7 @@ import dk.camelot64.kickc.model.Program; import java.util.ArrayList; import java.util.List; +import java.util.ListIterator; /** * Maps out register values entering all instructions. Removes unnecessary loads / clears / sets @@ -18,63 +19,92 @@ public class Pass5UnnecesaryLoadElimination extends Pass5AsmOptimization { @Override public boolean optimize() { AsmProgramStaticRegisterValues staticValues = new AsmProgramStaticRegisterValues(getAsmProgram()); - List removes = new ArrayList<>(); + //List removes = new ArrayList<>(); + boolean modified = false; for (AsmSegment segment : getAsmProgram().getSegments()) { - for (AsmLine line : segment.getLines()) { + List lines = segment.getLines(); + ListIterator lineIt = lines.listIterator(); + while (lineIt.hasNext()) { + AsmLine line = lineIt.next(); if (line instanceof AsmInstruction) { AsmInstruction instruction = (AsmInstruction) line; AsmInstructionType instructionType = instruction.getType(); + if (instructionType.getMnemnonic().equals("lda") && instructionType.getAddressingMode().equals(AsmAddressingMode.IMM)) { - try { - int immValue = Integer.parseInt(instruction.getParameter()); - AsmProgramStaticRegisterValues.AsmRegisterValues instructionValues = staticValues.getValues(instruction); - if (instructionValues.getA() != null && instructionValues.getA().equals(immValue)) { - removes.add(instruction); - } - } catch (NumberFormatException e) { - // ignore + String immValue = instruction.getParameter(); + AsmProgramStaticRegisterValues.AsmRegisterValues instructionValues = staticValues.getValues(instruction); + if (instructionValues.getA() != null && instructionValues.getA().equals(immValue)) { + modified = remove(lineIt); + } + } + if (instructionType.getMnemnonic().equals("lda") && (instructionType.getAddressingMode().equals(AsmAddressingMode.ZP)||instructionType.getAddressingMode().equals(AsmAddressingMode.ABS))) { + String memValue = instruction.getParameter(); + AsmProgramStaticRegisterValues.AsmRegisterValues instructionValues = staticValues.getValues(instruction); + if (instructionValues.getaMem() != null && instructionValues.getaMem().equals(memValue)) { + modified = remove(lineIt); + } else if (instructionValues.getxMem() != null && instructionValues.getxMem().equals(memValue)) { + getLog().append("Replacing instruction "+instruction+" with TXA"); + instruction.setType(AsmInstructionSet.getInstructionType("txa", AsmAddressingMode.NON, null, false)); + instruction.setParameter(null); + } else if (instructionValues.getyMem() != null && instructionValues.getyMem().equals(memValue)) { + getLog().append("Replacing instruction "+instruction+" with TYA"); + instruction.setType(AsmInstructionSet.getInstructionType("tya", AsmAddressingMode.NON, null, false)); + instruction.setParameter(null); } } if (instructionType.getMnemnonic().equals("ldx") && instructionType.getAddressingMode().equals(AsmAddressingMode.IMM)) { - try { - int immValue = Integer.parseInt(instruction.getParameter()); - AsmProgramStaticRegisterValues.AsmRegisterValues instructionValues = staticValues.getValues(instruction); - if (instructionValues.getX() != null && instructionValues.getX().equals(immValue)) { - removes.add(instruction); - } - } catch (NumberFormatException e) { - // ignore + String immValue = instruction.getParameter(); + AsmProgramStaticRegisterValues.AsmRegisterValues instructionValues = staticValues.getValues(instruction); + if (instructionValues.getX() != null && instructionValues.getX().equals(immValue)) { + modified = remove(lineIt); + } + } + if (instructionType.getMnemnonic().equals("ldx") && (instructionType.getAddressingMode().equals(AsmAddressingMode.ZP)||instructionType.getAddressingMode().equals(AsmAddressingMode.ABS))) { + String memValue = instruction.getParameter(); + AsmProgramStaticRegisterValues.AsmRegisterValues instructionValues = staticValues.getValues(instruction); + if (instructionValues.getxMem() != null && instructionValues.getxMem().equals(memValue)) { + modified = remove(lineIt); + } else if (instructionValues.getaMem() != null && instructionValues.getaMem().equals(memValue)) { + getLog().append("Replacing instruction "+instruction+" with TAX"); + instruction.setType(AsmInstructionSet.getInstructionType("tax", AsmAddressingMode.NON, null, false)); + instruction.setParameter(null); } - } if (instructionType.getMnemnonic().equals("ldy") && instructionType.getAddressingMode().equals(AsmAddressingMode.IMM)) { - try { - int immValue = Integer.parseInt(instruction.getParameter()); - AsmProgramStaticRegisterValues.AsmRegisterValues instructionValues = staticValues.getValues(instruction); - if (instructionValues.getY() != null && instructionValues.getY().equals(immValue)) { - removes.add(instruction); - } - } catch (NumberFormatException e) { - // ignore + String immValue = instruction.getParameter(); + AsmProgramStaticRegisterValues.AsmRegisterValues instructionValues = staticValues.getValues(instruction); + if (instructionValues.getY() != null && instructionValues.getY().equals(immValue)) { + modified = remove(lineIt); + } + } + if (instructionType.getMnemnonic().equals("ldy") && (instructionType.getAddressingMode().equals(AsmAddressingMode.ZP)||instructionType.getAddressingMode().equals(AsmAddressingMode.ABS))) { + String memValue = instruction.getParameter(); + AsmProgramStaticRegisterValues.AsmRegisterValues instructionValues = staticValues.getValues(instruction); + if (instructionValues.getyMem() != null && instructionValues.getyMem().equals(memValue)) { + modified = remove(lineIt); + } else if (instructionValues.getaMem() != null && instructionValues.getaMem().equals(memValue)) { + getLog().append("Replacing instruction "+instruction+" with TAY"); + instruction.setType(AsmInstructionSet.getInstructionType("tay", AsmAddressingMode.NON, null, false)); + instruction.setParameter(null); } } if (instructionType.getMnemnonic().equals("clc")) { AsmProgramStaticRegisterValues.AsmRegisterValues instructionValues = staticValues.getValues(instruction); if (Boolean.FALSE.equals(instructionValues.getC())) { - removes.add(instruction); + modified = remove(lineIt); } } if (instructionType.getMnemnonic().equals("sec")) { AsmProgramStaticRegisterValues.AsmRegisterValues instructionValues = staticValues.getValues(instruction); if (Boolean.TRUE.equals(instructionValues.getC())) { - removes.add(instruction); + modified = remove(lineIt); } } } } } - remove(removes); - return removes.size() > 0; + return modified; } + } diff --git a/src/main/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.asm b/src/main/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.asm index 35f8e1d2d..6a29d5566 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.asm @@ -90,7 +90,6 @@ line: { sec sbc $ff sta yd - lda yd cmp xd bcs b3 ldx x0 @@ -120,7 +119,6 @@ line: { sec sbc y1 sta yd - lda yd cmp xd bcs b6 ldx x0 @@ -156,7 +154,6 @@ line: { sec sbc $ff sta yd - lda yd cmp xd bcs b10 ldx x1 @@ -184,7 +181,6 @@ line: { sec sbc y1 sta yd - lda yd cmp xd bcs b13 ldx x1 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log b/src/main/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log index ecbcc8e86..9a1535c29 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log @@ -18340,6 +18340,10 @@ init_screen: { } Removing instruction lda #0 +Removing instruction lda yd +Removing instruction lda yd +Removing instruction lda yd +Removing instruction lda yd Removing instruction ldy #0 Removing instruction lda #0 Succesful ASM optimization Pass5UnnecesaryLoadElimination @@ -18504,7 +18508,6 @@ line: { sbc $ff sta yd //SEG50 [28] if((byte) line::yd#1>=(byte) line::xd#1) goto line::@3 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#1 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#1 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b3 //SEG51 line::@17 @@ -18568,7 +18571,6 @@ line: { sbc y1 sta yd //SEG81 [43] if((byte) line::yd#0>=(byte) line::xd#1) goto line::@6 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#0 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#0 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b6 //SEG82 line::@20 @@ -18640,7 +18642,6 @@ line: { sbc $ff sta yd //SEG113 [59] if((byte) line::yd#3>=(byte) line::xd#0) goto line::@10 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#3 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#3 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b10 //SEG114 line::@24 @@ -18701,7 +18702,6 @@ line: { sbc y1 sta yd //SEG142 [73] if((byte) line::yd#10>=(byte) line::xd#0) goto line::@13 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#10 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#10 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b13 //SEG143 line::@27 @@ -19467,7 +19467,6 @@ line: { sbc $ff sta yd //SEG50 [28] if((byte) line::yd#1>=(byte) line::xd#1) goto line::@3 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#1 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#1 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b3 //SEG51 line::@17 @@ -19531,7 +19530,6 @@ line: { sbc y1 sta yd //SEG81 [43] if((byte) line::yd#0>=(byte) line::xd#1) goto line::@6 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#0 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#0 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b6 //SEG82 line::@20 @@ -19603,7 +19601,6 @@ line: { sbc $ff sta yd //SEG113 [59] if((byte) line::yd#3>=(byte) line::xd#0) goto line::@10 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#3 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#3 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b10 //SEG114 line::@24 @@ -19664,7 +19661,6 @@ line: { sbc y1 sta yd //SEG142 [73] if((byte) line::yd#10>=(byte) line::xd#0) goto line::@13 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#10 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#10 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b13 //SEG143 line::@27 @@ -20402,7 +20398,6 @@ line: { sbc $ff sta yd //SEG50 [28] if((byte) line::yd#1>=(byte) line::xd#1) goto line::@3 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#1 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#1 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b3 //SEG51 line::@17 @@ -20463,7 +20458,6 @@ line: { sbc y1 sta yd //SEG81 [43] if((byte) line::yd#0>=(byte) line::xd#1) goto line::@6 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#0 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#0 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b6 //SEG82 line::@20 @@ -20531,7 +20525,6 @@ line: { sbc $ff sta yd //SEG113 [59] if((byte) line::yd#3>=(byte) line::xd#0) goto line::@10 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#3 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#3 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b10 //SEG114 line::@24 @@ -20589,7 +20582,6 @@ line: { sbc y1 sta yd //SEG142 [73] if((byte) line::yd#10>=(byte) line::xd#0) goto line::@13 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#10 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#10 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b13 //SEG143 line::@27 @@ -21254,7 +21246,6 @@ line: { sbc $ff sta yd //SEG50 [28] if((byte) line::yd#1>=(byte) line::xd#1) goto line::@3 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#1 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#1 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b3 //SEG51 line::@17 @@ -21315,7 +21306,6 @@ line: { sbc y1 sta yd //SEG81 [43] if((byte) line::yd#0>=(byte) line::xd#1) goto line::@6 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#0 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#0 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b6 //SEG82 line::@20 @@ -21383,7 +21373,6 @@ line: { sbc $ff sta yd //SEG113 [59] if((byte) line::yd#3>=(byte) line::xd#0) goto line::@10 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#3 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#3 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b10 //SEG114 line::@24 @@ -21441,7 +21430,6 @@ line: { sbc y1 sta yd //SEG142 [73] if((byte) line::yd#10>=(byte) line::xd#0) goto line::@13 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#10 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#10 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b13 //SEG143 line::@27 @@ -22450,7 +22438,6 @@ line: { sbc $ff sta yd //SEG50 [28] if((byte) line::yd#1>=(byte) line::xd#1) goto line::@3 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#1 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#1 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b3 //SEG51 line::@17 @@ -22511,7 +22498,6 @@ line: { sbc y1 sta yd //SEG81 [43] if((byte) line::yd#0>=(byte) line::xd#1) goto line::@6 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#0 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#1 line::yd#0 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b6 //SEG82 line::@20 @@ -22579,7 +22565,6 @@ line: { sbc $ff sta yd //SEG113 [59] if((byte) line::yd#3>=(byte) line::xd#0) goto line::@10 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#3 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#3 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b10 //SEG114 line::@24 @@ -22637,7 +22622,6 @@ line: { sbc y1 sta yd //SEG142 [73] if((byte) line::yd#10>=(byte) line::xd#0) goto line::@13 [ line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#10 ] ( main:0::lines:7::line:20 [ lines::l#2 line::x0#0 line::x1#0 line::y0#0 line::y1#0 line::xd#0 line::yd#10 ] ) -- zpby1_ge_zpby2_then_la1 - lda yd cmp xd bcs b13 //SEG143 line::@27 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/voronoi.asm b/src/main/java/dk/camelot64/kickc/test/ref/voronoi.asm index 7cd03afeb..af9d650e1 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/voronoi.asm +++ b/src/main/java/dk/camelot64/kickc/test/ref/voronoi.asm @@ -22,7 +22,6 @@ animate: { clc adc #1 sta XPOS+0 - lda XPOS+0 cmp #$28 bne b1 lda #0 @@ -32,7 +31,6 @@ animate: { clc adc #1 sta YPOS+0 - lda YPOS+0 cmp #$19 bne b2 lda #0 @@ -41,7 +39,7 @@ animate: { ldx XPOS+1 dex stx XPOS+1 - lda XPOS+1 + txa cmp #$ff bne b3 lda #$28 @@ -51,7 +49,6 @@ animate: { clc adc #1 sta YPOS+2 - lda YPOS+2 cmp #$19 bne b4 lda #0 @@ -60,7 +57,7 @@ animate: { ldx YPOS+3 dex stx YPOS+3 - lda YPOS+3 + txa cmp #$ff bne breturn lda #$19 @@ -69,10 +66,8 @@ animate: { clc adc #7 sta XPOS+3 - lda XPOS+3 cmp #$28 bcc breturn - lda XPOS+3 sec sbc #$28 sta XPOS+3 diff --git a/src/main/java/dk/camelot64/kickc/test/ref/voronoi.log b/src/main/java/dk/camelot64/kickc/test/ref/voronoi.log index b5dc72edd..99ba12a5d 100644 --- a/src/main/java/dk/camelot64/kickc/test/ref/voronoi.log +++ b/src/main/java/dk/camelot64/kickc/test/ref/voronoi.log @@ -8395,6 +8395,429 @@ initscreen: { rts } +Removing instruction lda XPOS+0 +Removing instruction lda YPOS+0 +Replacing instruction lda XPOS+1 with TXA +Removing instruction lda YPOS+2 +Replacing instruction lda YPOS+3 with TXA +Removing instruction lda XPOS+3 +Succesful ASM optimization Pass5UnnecesaryLoadElimination +ASSEMBLER +//SEG0 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" +//SEG1 Global Constants & labels + .const SCREEN = $400 + .const COLORS = $d800 + .const FILL = $e6 + .const numpoints = 6 + XPOS: .byte 5, $f, 6, $22, $15, $1f + YPOS: .byte 5, 8, $e, 2, $11, $16 + COLS: .byte 1, 2, 3, 4, 5, 7 +//SEG2 @begin +bbegin: +//SEG3 @5 +b5: +//SEG4 [0] call main param-assignment [ ] ( ) +//SEG5 [1] phi from @5 to main [phi:@5->main] +main_from_b5: + jsr main +//SEG6 @end +bend: +//SEG7 main +main: { + //SEG8 [2] call initscreen param-assignment [ ] ( main:0 [ ] ) + //SEG9 [85] phi from main to initscreen [phi:main->initscreen] + initscreen_from_main: + jsr initscreen + //SEG10 main::@1 + b1: + //SEG11 [3] call render param-assignment [ ] ( main:0 [ ] ) + //SEG12 [46] phi from main::@1 to render [phi:main::@1->render] + render_from_b1: + jsr render + //SEG13 main::@4 + b4: + //SEG14 [4] call animate param-assignment [ ] ( main:0 [ ] ) + jsr animate + //SEG15 main::@5 + b5: + //SEG16 [5] if(true) goto main::@1 [ ] ( main:0 [ ] ) -- true_then_la1 + jmp b1 + //SEG17 main::@return + breturn: + //SEG18 [6] return [ ] ( main:0 [ ] ) + rts +} +//SEG19 animate +animate: { + //SEG20 [7] (byte~) animate::$0 ← * (const byte[]) XPOS#0+(byte) 0 [ animate::$0 ] ( main:0::animate:4 [ animate::$0 ] ) -- aby=_deref_cowo1 + lda XPOS+0 + //SEG21 [8] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ] ( main:0::animate:4 [ animate::$1 ] ) -- aby=aby_plus_1 + clc + adc #1 + //SEG22 [9] *((const byte[]) XPOS#0+(byte) 0) ← (byte~) animate::$1 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=aby + sta XPOS+0 + //SEG23 [10] (byte~) animate::$2 ← * (const byte[]) XPOS#0+(byte) 0 [ animate::$2 ] ( main:0::animate:4 [ animate::$2 ] ) -- aby=_deref_cowo1 + //SEG24 [11] if((byte~) animate::$2!=(byte) 40) goto animate::@1 [ ] ( main:0::animate:4 [ ] ) -- aby_neq_coby1_then_la1 + cmp #$28 + bne b1 + //SEG25 animate::@7 + b7: + //SEG26 [12] *((const byte[]) XPOS#0+(byte) 0) ← (byte) 0 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=coby2 + lda #0 + sta XPOS+0 + //SEG27 animate::@1 + b1: + //SEG28 [13] (byte~) animate::$5 ← * (const byte[]) YPOS#0+(byte) 0 [ animate::$5 ] ( main:0::animate:4 [ animate::$5 ] ) -- aby=_deref_cowo1 + lda YPOS+0 + //SEG29 [14] (byte~) animate::$6 ← (byte~) animate::$5 + (byte) 1 [ animate::$6 ] ( main:0::animate:4 [ animate::$6 ] ) -- aby=aby_plus_1 + clc + adc #1 + //SEG30 [15] *((const byte[]) YPOS#0+(byte) 0) ← (byte~) animate::$6 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=aby + sta YPOS+0 + //SEG31 [16] (byte~) animate::$7 ← * (const byte[]) YPOS#0+(byte) 0 [ animate::$7 ] ( main:0::animate:4 [ animate::$7 ] ) -- aby=_deref_cowo1 + //SEG32 [17] if((byte~) animate::$7!=(byte) 25) goto animate::@2 [ ] ( main:0::animate:4 [ ] ) -- aby_neq_coby1_then_la1 + cmp #$19 + bne b2 + //SEG33 animate::@8 + b8: + //SEG34 [18] *((const byte[]) YPOS#0+(byte) 0) ← (byte) 0 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=coby2 + lda #0 + sta YPOS+0 + //SEG35 animate::@2 + b2: + //SEG36 [19] (byte~) animate::$10 ← * (const byte[]) XPOS#0+(byte) 1 [ animate::$10 ] ( main:0::animate:4 [ animate::$10 ] ) -- xby=_deref_cowo1 + ldx XPOS+1 + //SEG37 [20] (byte~) animate::$11 ← (byte~) animate::$10 - (byte) 1 [ animate::$11 ] ( main:0::animate:4 [ animate::$11 ] ) -- xby=xby_minus_1 + dex + //SEG38 [21] *((const byte[]) XPOS#0+(byte) 1) ← (byte~) animate::$11 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=xby + stx XPOS+1 + //SEG39 [22] (byte~) animate::$12 ← * (const byte[]) XPOS#0+(byte) 1 [ animate::$12 ] ( main:0::animate:4 [ animate::$12 ] ) -- aby=_deref_cowo1 + txa + //SEG40 [23] if((byte~) animate::$12!=(byte) 255) goto animate::@3 [ ] ( main:0::animate:4 [ ] ) -- aby_neq_coby1_then_la1 + cmp #$ff + bne b3 + //SEG41 animate::@9 + b9: + //SEG42 [24] *((const byte[]) XPOS#0+(byte) 1) ← (byte) 40 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=coby2 + lda #$28 + sta XPOS+1 + //SEG43 animate::@3 + b3: + //SEG44 [25] (byte~) animate::$15 ← * (const byte[]) YPOS#0+(byte) 2 [ animate::$15 ] ( main:0::animate:4 [ animate::$15 ] ) -- aby=_deref_cowo1 + lda YPOS+2 + //SEG45 [26] (byte~) animate::$16 ← (byte~) animate::$15 + (byte) 1 [ animate::$16 ] ( main:0::animate:4 [ animate::$16 ] ) -- aby=aby_plus_1 + clc + adc #1 + //SEG46 [27] *((const byte[]) YPOS#0+(byte) 2) ← (byte~) animate::$16 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=aby + sta YPOS+2 + //SEG47 [28] (byte~) animate::$17 ← * (const byte[]) YPOS#0+(byte) 2 [ animate::$17 ] ( main:0::animate:4 [ animate::$17 ] ) -- aby=_deref_cowo1 + //SEG48 [29] if((byte~) animate::$17!=(byte) 25) goto animate::@4 [ ] ( main:0::animate:4 [ ] ) -- aby_neq_coby1_then_la1 + cmp #$19 + bne b4 + //SEG49 animate::@10 + b10: + //SEG50 [30] *((const byte[]) YPOS#0+(byte) 2) ← (byte) 0 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=coby2 + lda #0 + sta YPOS+2 + //SEG51 animate::@4 + b4: + //SEG52 [31] (byte~) animate::$20 ← * (const byte[]) YPOS#0+(byte) 3 [ animate::$20 ] ( main:0::animate:4 [ animate::$20 ] ) -- xby=_deref_cowo1 + ldx YPOS+3 + //SEG53 [32] (byte~) animate::$21 ← (byte~) animate::$20 - (byte) 1 [ animate::$21 ] ( main:0::animate:4 [ animate::$21 ] ) -- xby=xby_minus_1 + dex + //SEG54 [33] *((const byte[]) YPOS#0+(byte) 3) ← (byte~) animate::$21 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=xby + stx YPOS+3 + //SEG55 [34] (byte~) animate::$22 ← * (const byte[]) YPOS#0+(byte) 3 [ animate::$22 ] ( main:0::animate:4 [ animate::$22 ] ) -- aby=_deref_cowo1 + txa + //SEG56 [35] if((byte~) animate::$22!=(byte) 255) goto animate::@return [ ] ( main:0::animate:4 [ ] ) -- aby_neq_coby1_then_la1 + cmp #$ff + bne breturn + //SEG57 animate::@11 + b11: + //SEG58 [36] *((const byte[]) YPOS#0+(byte) 3) ← (byte) 25 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=coby2 + lda #$19 + sta YPOS+3 + //SEG59 [37] (byte~) animate::$25 ← * (const byte[]) XPOS#0+(byte) 3 [ animate::$25 ] ( main:0::animate:4 [ animate::$25 ] ) -- aby=_deref_cowo1 + lda XPOS+3 + //SEG60 [38] (byte~) animate::$26 ← (byte~) animate::$25 + (byte) 7 [ animate::$26 ] ( main:0::animate:4 [ animate::$26 ] ) -- aby=aby_plus_coby1 + clc + adc #7 + //SEG61 [39] *((const byte[]) XPOS#0+(byte) 3) ← (byte~) animate::$26 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=aby + sta XPOS+3 + //SEG62 [40] (byte~) animate::$27 ← * (const byte[]) XPOS#0+(byte) 3 [ animate::$27 ] ( main:0::animate:4 [ animate::$27 ] ) -- aby=_deref_cowo1 + //SEG63 [41] if((byte~) animate::$27<(byte) 40) goto animate::@return [ ] ( main:0::animate:4 [ ] ) -- aby_lt_coby1_then_la1 + cmp #$28 + bcc breturn + //SEG64 animate::@12 + b12: + //SEG65 [42] (byte~) animate::$30 ← * (const byte[]) XPOS#0+(byte) 3 [ animate::$30 ] ( main:0::animate:4 [ animate::$30 ] ) -- aby=_deref_cowo1 + lda XPOS+3 + //SEG66 [43] (byte~) animate::$31 ← (byte~) animate::$30 - (byte) 40 [ animate::$31 ] ( main:0::animate:4 [ animate::$31 ] ) -- aby=aby_minus_coby1 + sec + sbc #$28 + //SEG67 [44] *((const byte[]) XPOS#0+(byte) 3) ← (byte~) animate::$31 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=aby + sta XPOS+3 + //SEG68 animate::@return + breturn: + //SEG69 [45] return [ ] ( main:0::animate:4 [ ] ) + rts +} +//SEG70 render +render: { + .label x = 5 + .label colline = 3 + .label y = 2 + //SEG71 [47] phi from render to render::@1 [phi:render->render::@1] + b1_from_render: + //SEG72 [47] phi (byte*) render::colline#5 = (const byte*) COLORS#0 [phi:render->render::@1#0] -- zpptrby1=cowo1 + lda #COLORS + sta colline+1 + //SEG73 [47] phi (byte) render::y#4 = (byte) 0 [phi:render->render::@1#1] -- zpby1=coby1 + lda #0 + sta y + jmp b1 + //SEG74 [47] phi from render::@3 to render::@1 [phi:render::@3->render::@1] + b1_from_b3: + //SEG75 [47] phi (byte*) render::colline#5 = (byte*) render::colline#1 [phi:render::@3->render::@1#0] -- register_copy + //SEG76 [47] phi (byte) render::y#4 = (byte) render::y#1 [phi:render::@3->render::@1#1] -- register_copy + //SEG77 render::@1 + b1: + //SEG78 [48] phi from render::@1 to render::@2 [phi:render::@1->render::@2] + b2_from_b1: + //SEG79 [48] phi (byte) render::x#2 = (byte) 0 [phi:render::@1->render::@2#0] -- zpby1=coby1 + lda #0 + sta x + jmp b2 + //SEG80 [48] phi from render::@5 to render::@2 [phi:render::@5->render::@2] + b2_from_b5: + //SEG81 [48] phi (byte) render::x#2 = (byte) render::x#1 [phi:render::@5->render::@2#0] -- register_copy + //SEG82 render::@2 + b2: + //SEG83 [49] (byte) findcol::x#0 ← (byte) render::x#2 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 ] ( main:0::render:3 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 ] ) + // (byte) findcol::x#0 = (byte) render::x#2 // register copy zp ZP_BYTE:5 + //SEG84 [50] (byte) findcol::y#0 ← (byte) render::y#4 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 ] ( main:0::render:3 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 ] ) + // (byte) findcol::y#0 = (byte) render::y#4 // register copy zp ZP_BYTE:2 + //SEG85 [51] call findcol param-assignment [ render::y#4 render::colline#5 render::x#2 findcol::return#0 ] ( main:0::render:3 [ render::y#4 render::colline#5 render::x#2 findcol::return#0 ] ) + //SEG86 [60] phi from render::@2 to findcol [phi:render::@2->findcol] + findcol_from_b2: + jsr findcol + //SEG87 render::@5 + b5: + //SEG88 [52] (byte) render::col#0 ← (byte) findcol::return#0 [ render::y#4 render::colline#5 render::x#2 render::col#0 ] ( main:0::render:3 [ render::y#4 render::colline#5 render::x#2 render::col#0 ] ) -- aby=yby + tya + //SEG89 [53] *((byte*) render::colline#5 + (byte) render::x#2) ← (byte) render::col#0 [ render::y#4 render::colline#5 render::x#2 ] ( main:0::render:3 [ render::y#4 render::colline#5 render::x#2 ] ) -- zpptrby1_derefidx_zpby1=aby + ldy x + sta (colline),y + //SEG90 [54] (byte) render::x#1 ← ++ (byte) render::x#2 [ render::y#4 render::colline#5 render::x#1 ] ( main:0::render:3 [ render::y#4 render::colline#5 render::x#1 ] ) -- zpby1=_inc_zpby1 + inc x + //SEG91 [55] if((byte) render::x#1!=(byte) 40) goto render::@2 [ render::y#4 render::colline#5 render::x#1 ] ( main:0::render:3 [ render::y#4 render::colline#5 render::x#1 ] ) -- zpby1_neq_coby1_then_la1 + lda x + cmp #$28 + bne b2_from_b5 + //SEG92 render::@3 + b3: + //SEG93 [56] (byte*) render::colline#1 ← (byte*) render::colline#5 + (byte) 40 [ render::y#4 render::colline#1 ] ( main:0::render:3 [ render::y#4 render::colline#1 ] ) -- zpptrby1=zpptrby1_plus_coby1 + lda colline + clc + adc #$28 + sta colline + bcc !+ + inc colline+1 + !: + //SEG94 [57] (byte) render::y#1 ← ++ (byte) render::y#4 [ render::y#1 render::colline#1 ] ( main:0::render:3 [ render::y#1 render::colline#1 ] ) -- zpby1=_inc_zpby1 + inc y + //SEG95 [58] if((byte) render::y#1!=(byte) 25) goto render::@1 [ render::y#1 render::colline#1 ] ( main:0::render:3 [ render::y#1 render::colline#1 ] ) -- zpby1_neq_coby1_then_la1 + lda y + cmp #$19 + bne b1_from_b3 + //SEG96 render::@return + breturn: + //SEG97 [59] return [ ] ( main:0::render:3 [ ] ) + rts +} +//SEG98 findcol +findcol: { + .label x = 5 + .label y = 2 + .label xp = 7 + .label yp = 8 + .label diff = 7 + .label mindiff = 6 + //SEG99 [61] phi from findcol to findcol::@1 [phi:findcol->findcol::@1] + b1_from_findcol: + //SEG100 [61] phi (byte) findcol::mincol#10 = (byte) 0 [phi:findcol->findcol::@1#0] -- yby=coby1 + ldy #0 + //SEG101 [61] phi (byte) findcol::mindiff#10 = (byte) 255 [phi:findcol->findcol::@1#1] -- zpby1=coby1 + lda #$ff + sta mindiff + //SEG102 [61] phi (byte) findcol::i#10 = (byte) 0 [phi:findcol->findcol::@1#2] -- xby=coby1 + ldx #0 + //SEG103 findcol::@1 + b1: + //SEG104 [62] (byte) findcol::xp#0 ← (const byte[]) XPOS#0 *idx (byte) findcol::i#10 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 ] ) -- zpby1=cowo1_derefidx_xby + lda XPOS,x + sta xp + //SEG105 [63] (byte) findcol::yp#0 ← (const byte[]) YPOS#0 *idx (byte) findcol::i#10 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ) -- zpby1=cowo1_derefidx_xby + lda YPOS,x + sta yp + //SEG106 [64] if((byte) findcol::x#0!=(byte) findcol::xp#0) goto findcol::@2 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ) -- zpby1_neq_zpby2_then_la1 + lda x + cmp xp + bne b2 + //SEG107 findcol::@9 + b9: + //SEG108 [65] if((byte) findcol::y#0!=(byte) findcol::yp#0) goto findcol::@2 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ) -- zpby1_neq_zpby2_then_la1 + lda y + cmp yp + bne b2 + //SEG109 [66] phi from findcol::@9 to findcol::@return [phi:findcol::@9->findcol::@return] + breturn_from_b9: + //SEG110 [66] phi (byte) findcol::return#0 = (byte) 0 [phi:findcol::@9->findcol::@return#0] -- yby=coby1 + ldy #0 + //SEG111 findcol::@return + breturn: + //SEG112 [67] return [ findcol::return#0 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::return#0 ] ) + rts + //SEG113 findcol::@2 + b2: + //SEG114 [68] if((byte) findcol::x#0>=(byte) findcol::xp#0) goto findcol::@4 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ) -- zpby1_ge_zpby2_then_la1 + lda x + cmp xp + bcs b4 + //SEG115 findcol::@12 + b12: + //SEG116 [69] (byte) findcol::diff#1 ← (byte) findcol::xp#0 - (byte) findcol::x#0 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::yp#0 findcol::diff#1 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::yp#0 findcol::diff#1 ] ) -- zpby1=zpby1_minus_zpby2 + lda diff + sec + sbc x + sta diff + //SEG117 [70] phi from findcol::@12 findcol::@4 to findcol::@5 [phi:findcol::@12/findcol::@4->findcol::@5] + b5_from_b12: + b5_from_b4: + //SEG118 [70] phi (byte) findcol::diff#4 = (byte) findcol::diff#1 [phi:findcol::@12/findcol::@4->findcol::@5#0] -- register_copy + //SEG119 findcol::@5 + b5: + //SEG120 [71] if((byte) findcol::y#0>=(byte) findcol::yp#0) goto findcol::@6 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::yp#0 findcol::diff#4 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::yp#0 findcol::diff#4 ] ) -- zpby1_ge_zpby2_then_la1 + lda y + cmp yp + bcs b6 + //SEG121 findcol::@14 + b14: + //SEG122 [72] (byte~) findcol::$12 ← (byte) findcol::yp#0 - (byte) findcol::y#0 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#4 findcol::$12 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#4 findcol::$12 ] ) -- aby=zpby1_minus_zpby2 + lda yp + sec + sbc y + //SEG123 [73] (byte) findcol::diff#3 ← (byte) findcol::diff#4 + (byte~) findcol::$12 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#3 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#3 ] ) -- aby=zpby1_plus_aby + clc + adc diff + //SEG124 [74] phi from findcol::@14 findcol::@6 to findcol::@7 [phi:findcol::@14/findcol::@6->findcol::@7] + b7_from_b14: + b7_from_b6: + //SEG125 [74] phi (byte) findcol::diff#6 = (byte) findcol::diff#3 [phi:findcol::@14/findcol::@6->findcol::@7#0] -- register_copy + //SEG126 findcol::@7 + b7: + //SEG127 [75] if((byte) findcol::diff#6>=(byte) findcol::mindiff#10) goto findcol::@21 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#6 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#6 ] ) -- aby_ge_zpby1_then_la1 + cmp mindiff + bcs b21 + //SEG128 findcol::@16 + b16: + //SEG129 [76] (byte) findcol::mincol#1 ← (const byte[]) COLS#0 *idx (byte) findcol::i#10 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::diff#6 findcol::mincol#1 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::diff#6 findcol::mincol#1 ] ) -- yby=cowo1_derefidx_xby + ldy COLS,x + //SEG130 [77] phi from findcol::@16 findcol::@21 to findcol::@8 [phi:findcol::@16/findcol::@21->findcol::@8] + b8_from_b16: + b8_from_b21: + //SEG131 [77] phi (byte) findcol::mindiff#11 = (byte) findcol::diff#6 [phi:findcol::@16/findcol::@21->findcol::@8#0] -- register_copy + //SEG132 [77] phi (byte) findcol::mincol#2 = (byte) findcol::mincol#1 [phi:findcol::@16/findcol::@21->findcol::@8#1] -- register_copy + //SEG133 findcol::@8 + b8: + //SEG134 [78] (byte) findcol::i#1 ← ++ (byte) findcol::i#10 [ findcol::x#0 findcol::y#0 findcol::i#1 findcol::mincol#2 findcol::mindiff#11 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#1 findcol::mincol#2 findcol::mindiff#11 ] ) -- xby=_inc_xby + inx + //SEG135 [79] if((byte) findcol::i#1<(const byte) numpoints#0) goto findcol::@19 [ findcol::x#0 findcol::y#0 findcol::i#1 findcol::mincol#2 findcol::mindiff#11 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#1 findcol::mincol#2 findcol::mindiff#11 ] ) -- xby_lt_coby1_then_la1 + cpx #numpoints + bcc b19 + //SEG136 [66] phi from findcol::@8 to findcol::@return [phi:findcol::@8->findcol::@return] + breturn_from_b8: + //SEG137 [66] phi (byte) findcol::return#0 = (byte) findcol::mincol#2 [phi:findcol::@8->findcol::@return#0] -- register_copy + jmp breturn + //SEG138 findcol::@19 + b19: + //SEG139 [80] (byte~) findcol::mindiff#13 ← (byte) findcol::mindiff#11 [ findcol::x#0 findcol::y#0 findcol::i#1 findcol::mindiff#13 findcol::mincol#2 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#1 findcol::mindiff#13 findcol::mincol#2 ] ) -- zpby1=aby + sta mindiff + //SEG140 [61] phi from findcol::@19 to findcol::@1 [phi:findcol::@19->findcol::@1] + b1_from_b19: + //SEG141 [61] phi (byte) findcol::mincol#10 = (byte) findcol::mincol#2 [phi:findcol::@19->findcol::@1#0] -- register_copy + //SEG142 [61] phi (byte) findcol::mindiff#10 = (byte~) findcol::mindiff#13 [phi:findcol::@19->findcol::@1#1] -- register_copy + //SEG143 [61] phi (byte) findcol::i#10 = (byte) findcol::i#1 [phi:findcol::@19->findcol::@1#2] -- register_copy + jmp b1 + //SEG144 findcol::@21 + b21: + //SEG145 [81] (byte~) findcol::mindiff#14 ← (byte) findcol::mindiff#10 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mincol#10 findcol::mindiff#14 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mincol#10 findcol::mindiff#14 ] ) -- aby=zpby1 + lda mindiff + jmp b8_from_b21 + //SEG146 findcol::@6 + b6: + //SEG147 [82] (byte~) findcol::$14 ← (byte) findcol::y#0 - (byte) findcol::yp#0 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#4 findcol::$14 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#4 findcol::$14 ] ) -- aby=zpby1_minus_zpby2 + lda y + sec + sbc yp + //SEG148 [83] (byte) findcol::diff#2 ← (byte) findcol::diff#4 + (byte~) findcol::$14 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#2 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#2 ] ) -- aby=zpby1_plus_aby + clc + adc diff + jmp b7_from_b6 + //SEG149 findcol::@4 + b4: + //SEG150 [84] (byte) findcol::diff#0 ← (byte) findcol::x#0 - (byte) findcol::xp#0 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::yp#0 findcol::diff#0 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::yp#0 findcol::diff#0 ] ) -- zpby1=zpby2_minus_zpby1 + lda x + sec + sbc diff + sta diff + jmp b5_from_b4 +} +//SEG151 initscreen +initscreen: { + .label screen = 3 + //SEG152 [86] phi from initscreen to initscreen::@1 [phi:initscreen->initscreen::@1] + b1_from_initscreen: + //SEG153 [86] phi (byte*) initscreen::screen#2 = (const byte*) SCREEN#0 [phi:initscreen->initscreen::@1#0] -- zpptrby1=cowo1 + lda #SCREEN + sta screen+1 + jmp b1 + //SEG154 [86] phi from initscreen::@1 to initscreen::@1 [phi:initscreen::@1->initscreen::@1] + b1_from_b1: + //SEG155 [86] phi (byte*) initscreen::screen#2 = (byte*) initscreen::screen#1 [phi:initscreen::@1->initscreen::@1#0] -- register_copy + //SEG156 initscreen::@1 + b1: + //SEG157 [87] *((byte*) initscreen::screen#2) ← (const byte) FILL#0 [ initscreen::screen#2 ] ( main:0::initscreen:2 [ initscreen::screen#2 ] ) -- _deref_zpptrby1=coby1 + ldy #0 + lda #FILL + sta (screen),y + //SEG158 [88] (byte*) initscreen::screen#1 ← ++ (byte*) initscreen::screen#2 [ initscreen::screen#1 ] ( main:0::initscreen:2 [ initscreen::screen#1 ] ) -- zpptrby1=_inc_zpptrby1 + inc screen + bne !+ + inc screen+1 + !: + //SEG159 [89] if((byte*) initscreen::screen#1<(const byte*) SCREEN#0+(word) 1000) goto initscreen::@1 [ initscreen::screen#1 ] ( main:0::initscreen:2 [ initscreen::screen#1 ] ) -- zpptrby1_lt_cowo1_then_la1 + lda screen+1 + cmp #>SCREEN+$3e8 + bcc b1_from_b1 + bne !+ + lda screen + cmp #main] + jsr main +//SEG6 @end +//SEG7 main +main: { + //SEG8 [2] call initscreen param-assignment [ ] ( main:0 [ ] ) + //SEG9 [85] phi from main to initscreen [phi:main->initscreen] + jsr initscreen + //SEG10 main::@1 + b1: + //SEG11 [3] call render param-assignment [ ] ( main:0 [ ] ) + //SEG12 [46] phi from main::@1 to render [phi:main::@1->render] + jsr render + //SEG13 main::@4 + //SEG14 [4] call animate param-assignment [ ] ( main:0 [ ] ) + jsr animate + //SEG15 main::@5 + //SEG16 [5] if(true) goto main::@1 [ ] ( main:0 [ ] ) -- true_then_la1 + jmp b1 + //SEG17 main::@return + //SEG18 [6] return [ ] ( main:0 [ ] ) + rts +} +//SEG19 animate +animate: { + //SEG20 [7] (byte~) animate::$0 ← * (const byte[]) XPOS#0+(byte) 0 [ animate::$0 ] ( main:0::animate:4 [ animate::$0 ] ) -- aby=_deref_cowo1 + lda XPOS+0 + //SEG21 [8] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ] ( main:0::animate:4 [ animate::$1 ] ) -- aby=aby_plus_1 + clc + adc #1 + //SEG22 [9] *((const byte[]) XPOS#0+(byte) 0) ← (byte~) animate::$1 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=aby + sta XPOS+0 + //SEG23 [10] (byte~) animate::$2 ← * (const byte[]) XPOS#0+(byte) 0 [ animate::$2 ] ( main:0::animate:4 [ animate::$2 ] ) -- aby=_deref_cowo1 + //SEG24 [11] if((byte~) animate::$2!=(byte) 40) goto animate::@1 [ ] ( main:0::animate:4 [ ] ) -- aby_neq_coby1_then_la1 + cmp #$28 + bne b1 + //SEG25 animate::@7 + //SEG26 [12] *((const byte[]) XPOS#0+(byte) 0) ← (byte) 0 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=coby2 + lda #0 + sta XPOS+0 + //SEG27 animate::@1 + b1: + //SEG28 [13] (byte~) animate::$5 ← * (const byte[]) YPOS#0+(byte) 0 [ animate::$5 ] ( main:0::animate:4 [ animate::$5 ] ) -- aby=_deref_cowo1 + lda YPOS+0 + //SEG29 [14] (byte~) animate::$6 ← (byte~) animate::$5 + (byte) 1 [ animate::$6 ] ( main:0::animate:4 [ animate::$6 ] ) -- aby=aby_plus_1 + clc + adc #1 + //SEG30 [15] *((const byte[]) YPOS#0+(byte) 0) ← (byte~) animate::$6 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=aby + sta YPOS+0 + //SEG31 [16] (byte~) animate::$7 ← * (const byte[]) YPOS#0+(byte) 0 [ animate::$7 ] ( main:0::animate:4 [ animate::$7 ] ) -- aby=_deref_cowo1 + //SEG32 [17] if((byte~) animate::$7!=(byte) 25) goto animate::@2 [ ] ( main:0::animate:4 [ ] ) -- aby_neq_coby1_then_la1 + cmp #$19 + bne b2 + //SEG33 animate::@8 + //SEG34 [18] *((const byte[]) YPOS#0+(byte) 0) ← (byte) 0 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=coby2 + lda #0 + sta YPOS+0 + //SEG35 animate::@2 + b2: + //SEG36 [19] (byte~) animate::$10 ← * (const byte[]) XPOS#0+(byte) 1 [ animate::$10 ] ( main:0::animate:4 [ animate::$10 ] ) -- xby=_deref_cowo1 + ldx XPOS+1 + //SEG37 [20] (byte~) animate::$11 ← (byte~) animate::$10 - (byte) 1 [ animate::$11 ] ( main:0::animate:4 [ animate::$11 ] ) -- xby=xby_minus_1 + dex + //SEG38 [21] *((const byte[]) XPOS#0+(byte) 1) ← (byte~) animate::$11 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=xby + stx XPOS+1 + //SEG39 [22] (byte~) animate::$12 ← * (const byte[]) XPOS#0+(byte) 1 [ animate::$12 ] ( main:0::animate:4 [ animate::$12 ] ) -- aby=_deref_cowo1 + txa + //SEG40 [23] if((byte~) animate::$12!=(byte) 255) goto animate::@3 [ ] ( main:0::animate:4 [ ] ) -- aby_neq_coby1_then_la1 + cmp #$ff + bne b3 + //SEG41 animate::@9 + //SEG42 [24] *((const byte[]) XPOS#0+(byte) 1) ← (byte) 40 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=coby2 + lda #$28 + sta XPOS+1 + //SEG43 animate::@3 + b3: + //SEG44 [25] (byte~) animate::$15 ← * (const byte[]) YPOS#0+(byte) 2 [ animate::$15 ] ( main:0::animate:4 [ animate::$15 ] ) -- aby=_deref_cowo1 + lda YPOS+2 + //SEG45 [26] (byte~) animate::$16 ← (byte~) animate::$15 + (byte) 1 [ animate::$16 ] ( main:0::animate:4 [ animate::$16 ] ) -- aby=aby_plus_1 + clc + adc #1 + //SEG46 [27] *((const byte[]) YPOS#0+(byte) 2) ← (byte~) animate::$16 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=aby + sta YPOS+2 + //SEG47 [28] (byte~) animate::$17 ← * (const byte[]) YPOS#0+(byte) 2 [ animate::$17 ] ( main:0::animate:4 [ animate::$17 ] ) -- aby=_deref_cowo1 + //SEG48 [29] if((byte~) animate::$17!=(byte) 25) goto animate::@4 [ ] ( main:0::animate:4 [ ] ) -- aby_neq_coby1_then_la1 + cmp #$19 + bne b4 + //SEG49 animate::@10 + //SEG50 [30] *((const byte[]) YPOS#0+(byte) 2) ← (byte) 0 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=coby2 + lda #0 + sta YPOS+2 + //SEG51 animate::@4 + b4: + //SEG52 [31] (byte~) animate::$20 ← * (const byte[]) YPOS#0+(byte) 3 [ animate::$20 ] ( main:0::animate:4 [ animate::$20 ] ) -- xby=_deref_cowo1 + ldx YPOS+3 + //SEG53 [32] (byte~) animate::$21 ← (byte~) animate::$20 - (byte) 1 [ animate::$21 ] ( main:0::animate:4 [ animate::$21 ] ) -- xby=xby_minus_1 + dex + //SEG54 [33] *((const byte[]) YPOS#0+(byte) 3) ← (byte~) animate::$21 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=xby + stx YPOS+3 + //SEG55 [34] (byte~) animate::$22 ← * (const byte[]) YPOS#0+(byte) 3 [ animate::$22 ] ( main:0::animate:4 [ animate::$22 ] ) -- aby=_deref_cowo1 + txa + //SEG56 [35] if((byte~) animate::$22!=(byte) 255) goto animate::@return [ ] ( main:0::animate:4 [ ] ) -- aby_neq_coby1_then_la1 + cmp #$ff + bne breturn + //SEG57 animate::@11 + //SEG58 [36] *((const byte[]) YPOS#0+(byte) 3) ← (byte) 25 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=coby2 + lda #$19 + sta YPOS+3 + //SEG59 [37] (byte~) animate::$25 ← * (const byte[]) XPOS#0+(byte) 3 [ animate::$25 ] ( main:0::animate:4 [ animate::$25 ] ) -- aby=_deref_cowo1 + lda XPOS+3 + //SEG60 [38] (byte~) animate::$26 ← (byte~) animate::$25 + (byte) 7 [ animate::$26 ] ( main:0::animate:4 [ animate::$26 ] ) -- aby=aby_plus_coby1 + clc + adc #7 + //SEG61 [39] *((const byte[]) XPOS#0+(byte) 3) ← (byte~) animate::$26 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=aby + sta XPOS+3 + //SEG62 [40] (byte~) animate::$27 ← * (const byte[]) XPOS#0+(byte) 3 [ animate::$27 ] ( main:0::animate:4 [ animate::$27 ] ) -- aby=_deref_cowo1 + //SEG63 [41] if((byte~) animate::$27<(byte) 40) goto animate::@return [ ] ( main:0::animate:4 [ ] ) -- aby_lt_coby1_then_la1 + cmp #$28 + bcc breturn + //SEG64 animate::@12 + //SEG65 [42] (byte~) animate::$30 ← * (const byte[]) XPOS#0+(byte) 3 [ animate::$30 ] ( main:0::animate:4 [ animate::$30 ] ) -- aby=_deref_cowo1 + //SEG66 [43] (byte~) animate::$31 ← (byte~) animate::$30 - (byte) 40 [ animate::$31 ] ( main:0::animate:4 [ animate::$31 ] ) -- aby=aby_minus_coby1 + sec + sbc #$28 + //SEG67 [44] *((const byte[]) XPOS#0+(byte) 3) ← (byte~) animate::$31 [ ] ( main:0::animate:4 [ ] ) -- _deref_cowo1=aby + sta XPOS+3 + //SEG68 animate::@return + breturn: + //SEG69 [45] return [ ] ( main:0::animate:4 [ ] ) + rts +} +//SEG70 render +render: { + .label x = 5 + .label colline = 3 + .label y = 2 + //SEG71 [47] phi from render to render::@1 [phi:render->render::@1] + //SEG72 [47] phi (byte*) render::colline#5 = (const byte*) COLORS#0 [phi:render->render::@1#0] -- zpptrby1=cowo1 + lda #COLORS + sta colline+1 + //SEG73 [47] phi (byte) render::y#4 = (byte) 0 [phi:render->render::@1#1] -- zpby1=coby1 + lda #0 + sta y + //SEG74 [47] phi from render::@3 to render::@1 [phi:render::@3->render::@1] + //SEG75 [47] phi (byte*) render::colline#5 = (byte*) render::colline#1 [phi:render::@3->render::@1#0] -- register_copy + //SEG76 [47] phi (byte) render::y#4 = (byte) render::y#1 [phi:render::@3->render::@1#1] -- register_copy + //SEG77 render::@1 + b1: + //SEG78 [48] phi from render::@1 to render::@2 [phi:render::@1->render::@2] + //SEG79 [48] phi (byte) render::x#2 = (byte) 0 [phi:render::@1->render::@2#0] -- zpby1=coby1 + lda #0 + sta x + //SEG80 [48] phi from render::@5 to render::@2 [phi:render::@5->render::@2] + //SEG81 [48] phi (byte) render::x#2 = (byte) render::x#1 [phi:render::@5->render::@2#0] -- register_copy + //SEG82 render::@2 + b2: + //SEG83 [49] (byte) findcol::x#0 ← (byte) render::x#2 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 ] ( main:0::render:3 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 ] ) + // (byte) findcol::x#0 = (byte) render::x#2 // register copy zp ZP_BYTE:5 + //SEG84 [50] (byte) findcol::y#0 ← (byte) render::y#4 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 ] ( main:0::render:3 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 ] ) + // (byte) findcol::y#0 = (byte) render::y#4 // register copy zp ZP_BYTE:2 + //SEG85 [51] call findcol param-assignment [ render::y#4 render::colline#5 render::x#2 findcol::return#0 ] ( main:0::render:3 [ render::y#4 render::colline#5 render::x#2 findcol::return#0 ] ) + //SEG86 [60] phi from render::@2 to findcol [phi:render::@2->findcol] + jsr findcol + //SEG87 render::@5 + //SEG88 [52] (byte) render::col#0 ← (byte) findcol::return#0 [ render::y#4 render::colline#5 render::x#2 render::col#0 ] ( main:0::render:3 [ render::y#4 render::colline#5 render::x#2 render::col#0 ] ) -- aby=yby + tya + //SEG89 [53] *((byte*) render::colline#5 + (byte) render::x#2) ← (byte) render::col#0 [ render::y#4 render::colline#5 render::x#2 ] ( main:0::render:3 [ render::y#4 render::colline#5 render::x#2 ] ) -- zpptrby1_derefidx_zpby1=aby + ldy x + sta (colline),y + //SEG90 [54] (byte) render::x#1 ← ++ (byte) render::x#2 [ render::y#4 render::colline#5 render::x#1 ] ( main:0::render:3 [ render::y#4 render::colline#5 render::x#1 ] ) -- zpby1=_inc_zpby1 + inc x + //SEG91 [55] if((byte) render::x#1!=(byte) 40) goto render::@2 [ render::y#4 render::colline#5 render::x#1 ] ( main:0::render:3 [ render::y#4 render::colline#5 render::x#1 ] ) -- zpby1_neq_coby1_then_la1 + lda x + cmp #$28 + bne b2 + //SEG92 render::@3 + //SEG93 [56] (byte*) render::colline#1 ← (byte*) render::colline#5 + (byte) 40 [ render::y#4 render::colline#1 ] ( main:0::render:3 [ render::y#4 render::colline#1 ] ) -- zpptrby1=zpptrby1_plus_coby1 + lda colline + clc + adc #$28 + sta colline + bcc !+ + inc colline+1 + !: + //SEG94 [57] (byte) render::y#1 ← ++ (byte) render::y#4 [ render::y#1 render::colline#1 ] ( main:0::render:3 [ render::y#1 render::colline#1 ] ) -- zpby1=_inc_zpby1 + inc y + //SEG95 [58] if((byte) render::y#1!=(byte) 25) goto render::@1 [ render::y#1 render::colline#1 ] ( main:0::render:3 [ render::y#1 render::colline#1 ] ) -- zpby1_neq_coby1_then_la1 + lda y + cmp #$19 + bne b1 + //SEG96 render::@return + //SEG97 [59] return [ ] ( main:0::render:3 [ ] ) + rts +} +//SEG98 findcol +findcol: { + .label x = 5 + .label y = 2 + .label xp = 7 + .label yp = 8 + .label diff = 7 + .label mindiff = 6 + //SEG99 [61] phi from findcol to findcol::@1 [phi:findcol->findcol::@1] + //SEG100 [61] phi (byte) findcol::mincol#10 = (byte) 0 [phi:findcol->findcol::@1#0] -- yby=coby1 + ldy #0 + //SEG101 [61] phi (byte) findcol::mindiff#10 = (byte) 255 [phi:findcol->findcol::@1#1] -- zpby1=coby1 + lda #$ff + sta mindiff + //SEG102 [61] phi (byte) findcol::i#10 = (byte) 0 [phi:findcol->findcol::@1#2] -- xby=coby1 + ldx #0 + //SEG103 findcol::@1 + b1: + //SEG104 [62] (byte) findcol::xp#0 ← (const byte[]) XPOS#0 *idx (byte) findcol::i#10 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 ] ) -- zpby1=cowo1_derefidx_xby + lda XPOS,x + sta xp + //SEG105 [63] (byte) findcol::yp#0 ← (const byte[]) YPOS#0 *idx (byte) findcol::i#10 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ) -- zpby1=cowo1_derefidx_xby + lda YPOS,x + sta yp + //SEG106 [64] if((byte) findcol::x#0!=(byte) findcol::xp#0) goto findcol::@2 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ) -- zpby1_neq_zpby2_then_la1 + lda x + cmp xp + bne b2 + //SEG107 findcol::@9 + //SEG108 [65] if((byte) findcol::y#0!=(byte) findcol::yp#0) goto findcol::@2 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ) -- zpby1_neq_zpby2_then_la1 + lda y + cmp yp + bne b2 + //SEG109 [66] phi from findcol::@9 to findcol::@return [phi:findcol::@9->findcol::@return] + //SEG110 [66] phi (byte) findcol::return#0 = (byte) 0 [phi:findcol::@9->findcol::@return#0] -- yby=coby1 + ldy #0 + //SEG111 findcol::@return + breturn: + //SEG112 [67] return [ findcol::return#0 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::return#0 ] ) + rts + //SEG113 findcol::@2 + b2: + //SEG114 [68] if((byte) findcol::x#0>=(byte) findcol::xp#0) goto findcol::@4 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::xp#0 findcol::yp#0 ] ) -- zpby1_ge_zpby2_then_la1 + lda x + cmp xp + bcs b4 + //SEG115 findcol::@12 + //SEG116 [69] (byte) findcol::diff#1 ← (byte) findcol::xp#0 - (byte) findcol::x#0 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::yp#0 findcol::diff#1 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::yp#0 findcol::diff#1 ] ) -- zpby1=zpby1_minus_zpby2 + lda diff + sec + sbc x + sta diff + //SEG117 [70] phi from findcol::@12 findcol::@4 to findcol::@5 [phi:findcol::@12/findcol::@4->findcol::@5] + //SEG118 [70] phi (byte) findcol::diff#4 = (byte) findcol::diff#1 [phi:findcol::@12/findcol::@4->findcol::@5#0] -- register_copy + //SEG119 findcol::@5 + b5: + //SEG120 [71] if((byte) findcol::y#0>=(byte) findcol::yp#0) goto findcol::@6 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::yp#0 findcol::diff#4 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::yp#0 findcol::diff#4 ] ) -- zpby1_ge_zpby2_then_la1 + lda y + cmp yp + bcs b6 + //SEG121 findcol::@14 + //SEG122 [72] (byte~) findcol::$12 ← (byte) findcol::yp#0 - (byte) findcol::y#0 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#4 findcol::$12 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#4 findcol::$12 ] ) -- aby=zpby1_minus_zpby2 + lda yp + sec + sbc y + //SEG123 [73] (byte) findcol::diff#3 ← (byte) findcol::diff#4 + (byte~) findcol::$12 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#3 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#3 ] ) -- aby=zpby1_plus_aby + clc + adc diff + //SEG124 [74] phi from findcol::@14 findcol::@6 to findcol::@7 [phi:findcol::@14/findcol::@6->findcol::@7] + //SEG125 [74] phi (byte) findcol::diff#6 = (byte) findcol::diff#3 [phi:findcol::@14/findcol::@6->findcol::@7#0] -- register_copy + //SEG126 findcol::@7 + b7: + //SEG127 [75] if((byte) findcol::diff#6>=(byte) findcol::mindiff#10) goto findcol::@21 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#6 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#6 ] ) -- aby_ge_zpby1_then_la1 + cmp mindiff + bcs b21 + //SEG128 findcol::@16 + //SEG129 [76] (byte) findcol::mincol#1 ← (const byte[]) COLS#0 *idx (byte) findcol::i#10 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::diff#6 findcol::mincol#1 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::diff#6 findcol::mincol#1 ] ) -- yby=cowo1_derefidx_xby + ldy COLS,x + //SEG130 [77] phi from findcol::@16 findcol::@21 to findcol::@8 [phi:findcol::@16/findcol::@21->findcol::@8] + //SEG131 [77] phi (byte) findcol::mindiff#11 = (byte) findcol::diff#6 [phi:findcol::@16/findcol::@21->findcol::@8#0] -- register_copy + //SEG132 [77] phi (byte) findcol::mincol#2 = (byte) findcol::mincol#1 [phi:findcol::@16/findcol::@21->findcol::@8#1] -- register_copy + //SEG133 findcol::@8 + b8: + //SEG134 [78] (byte) findcol::i#1 ← ++ (byte) findcol::i#10 [ findcol::x#0 findcol::y#0 findcol::i#1 findcol::mincol#2 findcol::mindiff#11 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#1 findcol::mincol#2 findcol::mindiff#11 ] ) -- xby=_inc_xby + inx + //SEG135 [79] if((byte) findcol::i#1<(const byte) numpoints#0) goto findcol::@19 [ findcol::x#0 findcol::y#0 findcol::i#1 findcol::mincol#2 findcol::mindiff#11 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#1 findcol::mincol#2 findcol::mindiff#11 ] ) -- xby_lt_coby1_then_la1 + cpx #numpoints + bcc b19 + //SEG136 [66] phi from findcol::@8 to findcol::@return [phi:findcol::@8->findcol::@return] + //SEG137 [66] phi (byte) findcol::return#0 = (byte) findcol::mincol#2 [phi:findcol::@8->findcol::@return#0] -- register_copy + jmp breturn + //SEG138 findcol::@19 + b19: + //SEG139 [80] (byte~) findcol::mindiff#13 ← (byte) findcol::mindiff#11 [ findcol::x#0 findcol::y#0 findcol::i#1 findcol::mindiff#13 findcol::mincol#2 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#1 findcol::mindiff#13 findcol::mincol#2 ] ) -- zpby1=aby + sta mindiff + //SEG140 [61] phi from findcol::@19 to findcol::@1 [phi:findcol::@19->findcol::@1] + //SEG141 [61] phi (byte) findcol::mincol#10 = (byte) findcol::mincol#2 [phi:findcol::@19->findcol::@1#0] -- register_copy + //SEG142 [61] phi (byte) findcol::mindiff#10 = (byte~) findcol::mindiff#13 [phi:findcol::@19->findcol::@1#1] -- register_copy + //SEG143 [61] phi (byte) findcol::i#10 = (byte) findcol::i#1 [phi:findcol::@19->findcol::@1#2] -- register_copy + jmp b1 + //SEG144 findcol::@21 + b21: + //SEG145 [81] (byte~) findcol::mindiff#14 ← (byte) findcol::mindiff#10 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mincol#10 findcol::mindiff#14 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mincol#10 findcol::mindiff#14 ] ) -- aby=zpby1 + lda mindiff + jmp b8 + //SEG146 findcol::@6 + b6: + //SEG147 [82] (byte~) findcol::$14 ← (byte) findcol::y#0 - (byte) findcol::yp#0 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#4 findcol::$14 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#4 findcol::$14 ] ) -- aby=zpby1_minus_zpby2 + lda y + sec + sbc yp + //SEG148 [83] (byte) findcol::diff#2 ← (byte) findcol::diff#4 + (byte~) findcol::$14 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#2 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::diff#2 ] ) -- aby=zpby1_plus_aby + clc + adc diff + jmp b7 + //SEG149 findcol::@4 + b4: + //SEG150 [84] (byte) findcol::diff#0 ← (byte) findcol::x#0 - (byte) findcol::xp#0 [ findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::yp#0 findcol::diff#0 ] ( main:0::render:3::findcol:51 [ render::y#4 render::colline#5 render::x#2 findcol::x#0 findcol::y#0 findcol::i#10 findcol::mindiff#10 findcol::mincol#10 findcol::yp#0 findcol::diff#0 ] ) -- zpby1=zpby2_minus_zpby1 + lda x + sec + sbc diff + sta diff + jmp b5 +} +//SEG151 initscreen +initscreen: { + .label screen = 3 + //SEG152 [86] phi from initscreen to initscreen::@1 [phi:initscreen->initscreen::@1] + //SEG153 [86] phi (byte*) initscreen::screen#2 = (const byte*) SCREEN#0 [phi:initscreen->initscreen::@1#0] -- zpptrby1=cowo1 + lda #SCREEN + sta screen+1 + //SEG154 [86] phi from initscreen::@1 to initscreen::@1 [phi:initscreen::@1->initscreen::@1] + //SEG155 [86] phi (byte*) initscreen::screen#2 = (byte*) initscreen::screen#1 [phi:initscreen::@1->initscreen::@1#0] -- register_copy + //SEG156 initscreen::@1 + b1: + //SEG157 [87] *((byte*) initscreen::screen#2) ← (const byte) FILL#0 [ initscreen::screen#2 ] ( main:0::initscreen:2 [ initscreen::screen#2 ] ) -- _deref_zpptrby1=coby1 + ldy #0 + lda #FILL + sta (screen),y + //SEG158 [88] (byte*) initscreen::screen#1 ← ++ (byte*) initscreen::screen#2 [ initscreen::screen#1 ] ( main:0::initscreen:2 [ initscreen::screen#1 ] ) -- zpptrby1=_inc_zpptrby1 + inc screen + bne !+ + inc screen+1 + !: + //SEG159 [89] if((byte*) initscreen::screen#1<(const byte*) SCREEN#0+(word) 1000) goto initscreen::@1 [ initscreen::screen#1 ] ( main:0::initscreen:2 [ initscreen::screen#1 ] ) -- zpptrby1_lt_cowo1_then_la1 + lda screen+1 + cmp #>SCREEN+$3e8 + bcc b1 + bne !+ + lda screen + cmp #