diff --git a/src/main/fragment/pbuz1_derefidx_vbuyy=_dec_pbuz1_derefidx_vbuyy.asm b/src/main/fragment/pbuz1_derefidx_vbuyy=_dec_pbuz1_derefidx_vbuyy.asm new file mode 100644 index 000000000..9d0fd27b6 --- /dev/null +++ b/src/main/fragment/pbuz1_derefidx_vbuyy=_dec_pbuz1_derefidx_vbuyy.asm @@ -0,0 +1,4 @@ +lda ({z1}),y +sec +sbc #1 +sta ({z1}),y diff --git a/src/main/fragment/pbuz1_derefidx_vbuyy=_inc_pbuz1_derefidx_vbuyy.asm b/src/main/fragment/pbuz1_derefidx_vbuyy=_inc_pbuz1_derefidx_vbuyy.asm new file mode 100644 index 000000000..6d91044c0 --- /dev/null +++ b/src/main/fragment/pbuz1_derefidx_vbuyy=_inc_pbuz1_derefidx_vbuyy.asm @@ -0,0 +1,4 @@ +lda ({z1}),y +clc +adc #1 +sta ({z1}),y diff --git a/src/main/fragment/pwuc1_derefidx_vbuxx_eq_vwuc2_then_la1.asm b/src/main/fragment/pwuc1_derefidx_vbuxx_eq_vwuc2_then_la1.asm new file mode 100644 index 000000000..9a35cd45d --- /dev/null +++ b/src/main/fragment/pwuc1_derefidx_vbuxx_eq_vwuc2_then_la1.asm @@ -0,0 +1,7 @@ +lda {c1},x +cmp #<{c2} +bne !+ +lda {c1}+1,x +cmp #>{c2} +beq {la1} +!: \ No newline at end of file diff --git a/src/main/fragment/pwuc1_derefidx_vbuxx_neq_vwuc2_then_la1.asm b/src/main/fragment/pwuc1_derefidx_vbuxx_neq_vwuc2_then_la1.asm new file mode 100644 index 000000000..2605fc65e --- /dev/null +++ b/src/main/fragment/pwuc1_derefidx_vbuxx_neq_vwuc2_then_la1.asm @@ -0,0 +1,6 @@ +lda {c1}+1,x +cmp #>{c2} +bne {la1} +lda {c1},x +cmp #<{c2} +bne {la1} diff --git a/src/main/fragment/pwuc1_derefidx_vbuyy_eq_vwuc2_then_la1.asm b/src/main/fragment/pwuc1_derefidx_vbuyy_eq_vwuc2_then_la1.asm new file mode 100644 index 000000000..f9c8f70b6 --- /dev/null +++ b/src/main/fragment/pwuc1_derefidx_vbuyy_eq_vwuc2_then_la1.asm @@ -0,0 +1,7 @@ +lda {c1},y +cmp #<{c2} +bne !+ +lda {c1}+1,y +cmp #>{c2} +beq {la1} +!: \ No newline at end of file diff --git a/src/main/fragment/pwuc1_derefidx_vbuyy_neq_vwuc2_then_la1.asm b/src/main/fragment/pwuc1_derefidx_vbuyy_neq_vwuc2_then_la1.asm new file mode 100644 index 000000000..f679fe1ad --- /dev/null +++ b/src/main/fragment/pwuc1_derefidx_vbuyy_neq_vwuc2_then_la1.asm @@ -0,0 +1,6 @@ +lda {c1}+1,y +cmp #>{c2} +bne {la1} +lda {c1},y +cmp #<{c2} +bne {la1} diff --git a/src/main/fragment/vwuz1=pwuc1_derefidx_vbuxx_plus_pwuc1_derefidx_vbuyy.asm b/src/main/fragment/vwuz1=pwuc1_derefidx_vbuxx_plus_pwuc1_derefidx_vbuyy.asm new file mode 100644 index 000000000..a8db2a8a1 --- /dev/null +++ b/src/main/fragment/vwuz1=pwuc1_derefidx_vbuxx_plus_pwuc1_derefidx_vbuyy.asm @@ -0,0 +1,7 @@ +lda {c1},x +clc +adc {c1},y +sta {z1} +lda {c1}+1,x +adc {c1}+1,y +sta {z1}+1 diff --git a/src/main/fragment/vwuz1=pwuc1_derefidx_vbuxx_plus_pwuc2_derefidx_vbuyy.asm b/src/main/fragment/vwuz1=pwuc1_derefidx_vbuxx_plus_pwuc2_derefidx_vbuyy.asm new file mode 100644 index 000000000..cb3655d20 --- /dev/null +++ b/src/main/fragment/vwuz1=pwuc1_derefidx_vbuxx_plus_pwuc2_derefidx_vbuyy.asm @@ -0,0 +1,7 @@ +lda {c1},x +clc +adc {c2},y +sta {z1} +lda {c1}+1,x +adc {c2}+1,y +sta {z1}+1 diff --git a/src/main/fragment/vwuz1=pwuc1_derefidx_vbuyy_plus_pwuc1_derefidx_vbuxx.asm b/src/main/fragment/vwuz1=pwuc1_derefidx_vbuyy_plus_pwuc1_derefidx_vbuxx.asm new file mode 100644 index 000000000..a0d2a3145 --- /dev/null +++ b/src/main/fragment/vwuz1=pwuc1_derefidx_vbuyy_plus_pwuc1_derefidx_vbuxx.asm @@ -0,0 +1,7 @@ +lda {c1},y +clc +adc {c1},x +sta {z1} +lda {c1}+1,y +adc {c1}+1,x +sta {z1}+1 diff --git a/src/main/fragment/vwuz1=pwuc1_derefidx_vbuyy_plus_pwuc2_derefidx_vbuxx.asm b/src/main/fragment/vwuz1=pwuc1_derefidx_vbuyy_plus_pwuc2_derefidx_vbuxx.asm new file mode 100644 index 000000000..16504004f --- /dev/null +++ b/src/main/fragment/vwuz1=pwuc1_derefidx_vbuyy_plus_pwuc2_derefidx_vbuxx.asm @@ -0,0 +1,7 @@ +lda {c1},y +clc +adc {c2},x +sta {z1} +lda {c1}+1,y +adc {c2}+1,x +sta {z1}+1 diff --git a/src/main/java/dk/camelot64/kickc/Compiler.java b/src/main/java/dk/camelot64/kickc/Compiler.java index ad00f831f..d219847c0 100644 --- a/src/main/java/dk/camelot64/kickc/Compiler.java +++ b/src/main/java/dk/camelot64/kickc/Compiler.java @@ -160,6 +160,7 @@ public class Compiler { new Pass1GenerateControlFlowGraph(program).execute(); new Pass1ResolveForwardReferences(program).execute(); + new PassNAssertStructMembers(program).execute(); new Pass1UnwindBlockScopes(program).execute(); new Pass1Procedures(program).execute(); new PassNTypeInference(program).execute(); diff --git a/src/main/java/dk/camelot64/kickc/passes/PassNAssertStructMembers.java b/src/main/java/dk/camelot64/kickc/passes/PassNAssertStructMembers.java new file mode 100644 index 000000000..367ca88ad --- /dev/null +++ b/src/main/java/dk/camelot64/kickc/passes/PassNAssertStructMembers.java @@ -0,0 +1,42 @@ +package dk.camelot64.kickc.passes; + +import dk.camelot64.kickc.model.CompileError; +import dk.camelot64.kickc.model.Program; +import dk.camelot64.kickc.model.iterator.ProgramValueIterator; +import dk.camelot64.kickc.model.symbols.StructDefinition; +import dk.camelot64.kickc.model.symbols.Variable; +import dk.camelot64.kickc.model.types.SymbolType; +import dk.camelot64.kickc.model.types.SymbolTypeInference; +import dk.camelot64.kickc.model.types.SymbolTypeStruct; +import dk.camelot64.kickc.model.values.StructMemberRef; + +/** + * Asserts that all struct references point to members that exist + */ +public class PassNAssertStructMembers extends Pass2SsaOptimization { + + public PassNAssertStructMembers(Program program) { + super(program); + } + + @Override + public boolean step() { + ProgramValueIterator.execute(getGraph(), (programValue, currentStmt, stmtIt, currentBlock) -> { + if(programValue.get() instanceof StructMemberRef) { + StructMemberRef structMemberRef = (StructMemberRef) programValue.get(); + SymbolType type = SymbolTypeInference.inferType(getScope(), structMemberRef.getStruct()); + if(type instanceof SymbolTypeStruct) { + SymbolTypeStruct structType = (SymbolTypeStruct) type; + StructDefinition structDefinition = structType.getStructDefinition(getScope()); + Variable member = structDefinition.getMember(structMemberRef.getMemberName()); + if(member==null) { + throw new CompileError("Unknown struct member "+structMemberRef.getMemberName()+" in struct "+structType.getTypeName(), currentStmt); + } + } + } + }); + return false; + } + + +} diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java index b3b86ab2b..27c6f8504 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java @@ -35,11 +35,30 @@ public class TestPrograms { public TestPrograms() { } + @Test + public void testBlackhole() throws IOException, URISyntaxException { + compileAndCompare("complex/blackhole/blackhole"); + } + + // TODO: Optimize unused IRQ's away (and other unused funtions that reference each other circularly) + @Test + public void testUnusedIrq() throws IOException, URISyntaxException { + compileAndCompare("unused-irq"); + } + + /** TODO: Fix error with number resolving + @Test + public void testNumberTernaryFail() throws IOException, URISyntaxException { + compileAndCompare("number-ternary-fail"); + } + */ + @Test public void testTextbox() throws IOException, URISyntaxException { compileAndCompare("textbox"); } -/* + + /* TODO: Implemente & / address-of for struct values @Test public void testStructPtr12Ref() throws IOException, URISyntaxException { compileAndCompare("struct-ptr-12-ref", log()); @@ -47,7 +66,7 @@ public class TestPrograms { @Test public void testStructPtr12() throws IOException, URISyntaxException { - compileAndCompare("struct-ptr-12"); + compileAndCompare("struct-ptr-12", log().verboseCreateSsa().verboseParse().verboseStatementSequence()); } */ @@ -111,6 +130,16 @@ public class TestPrograms { compileAndCompare("struct-ptr-0"); } + @Test + public void testStructError5() throws IOException, URISyntaxException { + assertError("struct-err-5", "Unknown struct member"); + } + + @Test + public void testStructError4() throws IOException, URISyntaxException { + assertError("struct-err-4", "Unknown struct member"); + } + @Test public void testStructError3() throws IOException, URISyntaxException { assertError("struct-err-3", "Parameters type mismatch in call"); diff --git a/src/test/kc/complex/blackhole/blackhole.kc b/src/test/kc/complex/blackhole/blackhole.kc new file mode 100644 index 000000000..1acf5d4fb --- /dev/null +++ b/src/test/kc/complex/blackhole/blackhole.kc @@ -0,0 +1,190 @@ +// Black Hole at the center of the BASIC screen sucking in any letters + +import "c64" +import "multiply" + +const byte* SCREEN = 0x0400; + +// Copy of the screen used for finding chars to process +byte[1000] SCREEN_COPY; + +// Struct holding char being processed +struct ProcessingChar { + // x-position (0-39) + byte x; + // y-position (0-24) + byte y; + // squared distance to center (0-569) + word dist; +}; + +// Distance value meaning not found +const word NOT_FOUND = 0xffff; + +void main() { + + // Init processing array + for( byte i: 0..7 ) PROCESSING[i] = { 0, 0, NOT_FOUND }; + + // Set-up raster interrupts + setupRasterIrq(RASTER_IRQ_TOP, &irqTop); + + // Fill screen with some chars + for( byte* sc: SCREEN..SCREEN+999) *sc = 'a'+(' ') + (*processing_ptr)--; + else // must be <' ' + (*processing_ptr)++; + } + } +} + +// SQUARES_X[i] = (i-20)*(i-20) +word[40] SQUARES_X; +// SQUARES_Y[i] = (i-12)*(i-12) +word[25] SQUARES_Y; + +// initialize SQUARES table +void initSquareTables() { + for(byte x: 0..39) { + byte x_dist = (x<20)?20-x:x-20; + SQUARES_X[x] = mul8u(x_dist, x_dist); + } + for(byte y: 0..24) { + byte y_dist = (y<12)?12-y:y-12; + SQUARES_Y[y] = mul8u(y_dist, y_dist); + } +} + +// Find the non-space char closest to the center of the screen +// If no non-space char is found the distance will be 0xffff +struct ProcessingChar getCenterChar() { + struct ProcessingChar closest = { 0, 0, NOT_FOUND }; + byte* screen_line = SCREEN_COPY; + for( byte y: 0..24) { + for( byte x: 0..39) { + if(screen_line[x]!=' ') { + word dist = SQUARES_X[x]+SQUARES_Y[y]; + if(distNOT_FOUND + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST+1,y + inx + cpx #8 + bne b1 + jsr setupRasterIrq + lda #SCREEN + sta sc+1 + // Fill screen with some chars + b3: + lda sc + and #$1f + clc + adc #'a' + ldy #0 + sta (sc),y + inc sc + bne !+ + inc sc+1 + !: + lda sc+1 + cmp #>SCREEN+$3e7+1 + bne b3 + lda sc + cmp #SCREEN_COPY + sta dst+1 + lda #SCREEN + sta src+1 + // Copy screen to screen copy + b4: + ldy #0 + lda (src),y + sta (dst),y + inc src + bne !+ + inc src+1 + !: + inc dst + bne !+ + inc dst+1 + !: + lda src+1 + cmp #>SCREEN+$3e7 + bne b4 + lda src + cmp #NOT_FOUND + bne b7 + lda center_dist + cmp #NOT_FOUND + bne b3 + lda PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST,y + cmp #NOT_FOUND + sta closest_dist+1 + lda #0 + sta y + lda #SCREEN_COPY + sta screen_line+1 + b1: + lda #0 + sta x + b2: + ldy x + lda (screen_line),y + cmp #' ' + bne !b11+ + jmp b11 + !b11: + tya + asl + tax + lda y + asl + tay + lda SQUARES_X,x + clc + adc SQUARES_Y,y + sta dist + lda SQUARES_X+1,x + adc SQUARES_Y+1,y + sta dist+1 + lda closest_dist+1 + cmp dist+1 + bne !+ + lda closest_dist + cmp dist + bne !b12+ + jmp b12 + !b12: + !: + bcs !b12+ + jmp b12 + !b12: + lda x + sta return_x + lda y + sta return_y + b3: + inc x + lda #$28 + cmp x + bne b10 + clc + adc screen_line + sta screen_line + bcc !+ + inc screen_line+1 + !: + inc y + lda #$19 + cmp y + bne b9 + lda return_dist + cmp #NOT_FOUND + beq breturn + !: + lda return_y + sta _9 + lda #0 + sta _9+1 + lda _9 + asl + sta _15 + lda _9+1 + rol + sta _15+1 + asl _15 + rol _15+1 + lda _16 + clc + adc _15 + sta _16 + lda _16+1 + adc _15+1 + sta _16+1 + asl _10 + rol _10+1 + asl _10 + rol _10+1 + asl _10 + rol _10+1 + clc + lda _11 + adc #SCREEN_COPY + sta _11+1 + // clear the found char on the screen copy + lda #' ' + ldy return_x + sta (_11),y + breturn: + rts + b9: + lda return_dist + sta closest_dist + lda return_dist+1 + sta closest_dist+1 + jmp b1 + b10: + lda return_dist + sta closest_dist + lda return_dist+1 + sta closest_dist+1 + jmp b2 + b12: + lda closest_dist + sta return_dist + lda closest_dist+1 + sta return_dist+1 + jmp b3 + b11: + lda closest_dist + sta return_dist + lda closest_dist+1 + sta return_dist+1 + jmp b3 +} +// initialize SQUARES table +initSquareTables: { + .label _6 = $15 + .label _14 = $15 + .label x = $13 + .label y = $14 + lda #0 + sta x + b1: + lda x + cmp #$14 + bcc b2 + sec + sbc #$14 + b4: + tax + sta mul8u.mb + lda #0 + sta mul8u.mb+1 + jsr mul8u + lda x + asl + tay + lda _6 + sta SQUARES_X,y + lda _6+1 + sta SQUARES_X+1,y + inc x + lda #$28 + cmp x + bne b1 + lda #0 + sta y + b5: + lda y + cmp #$c + bcc b6 + sec + sbc #$c + b8: + tax + sta mul8u.mb + lda #0 + sta mul8u.mb+1 + jsr mul8u + lda y + asl + tay + lda _14 + sta SQUARES_Y,y + lda _14+1 + sta SQUARES_Y+1,y + inc y + lda #$19 + cmp y + bne b5 + rts + b6: + lda #$c + sec + sbc y + jmp b8 + b2: + lda #$14 + sec + sbc x + jmp b4 +} +// Perform binary multiplication of two unsigned 8-bit bytes into a 16-bit unsigned word +// mul8u(byte register(X) a, byte register(A) b) +mul8u: { + .label mb = $17 + .label res = $15 + .label return = $15 + lda #0 + sta res + sta res+1 + b1: + cpx #0 + bne b2 + rts + b2: + txa + and #1 + cmp #0 + beq b3 + lda res + clc + adc mb + sta res + lda res+1 + adc mb+1 + sta res+1 + b3: + txa + lsr + tax + asl mb + rol mb+1 + jmp b1 +} +// Setup Raster IRQ +setupRasterIrq: { + .label irqRoutine = irqTop + sei + // Disable kernal & basic + lda #PROCPORT_DDR_MEMORY_MASK + sta PROCPORT_DDR + lda #PROCPORT_RAM_IO + sta PROCPORT + // Disable CIA 1 Timer IRQ + lda #CIA_INTERRUPT_CLEAR + sta CIA1_INTERRUPT + lda #$7f + and VIC_CONTROL + sta VIC_CONTROL + lda #RASTER_IRQ_TOP + sta RASTER + // Enable Raster Interrupt + lda #IRQ_RASTER + sta IRQ_ENABLE + // Set the IRQ routine + lda #irqRoutine + sta HARDWARE_IRQ+1 + cli + rts +} +// Raster Interrupt at the middle of the screen +irqBottom: { + sta rega+1 + stx regx+1 + sty regy+1 + ldx #0 + b1: + inx + cpx #5 + bne b1 + lda #WHITE + sta BORDERCOL + sta BGCOL + jsr processChars + lda #LIGHT_BLUE + sta BORDERCOL + lda #BLUE + sta BGCOL + // Trigger IRQ at the top of the screen + lda #RASTER_IRQ_TOP + sta RASTER + lda #irqTop + sta HARDWARE_IRQ+1 + // Acknowledge the IRQ + lda #IRQ_RASTER + sta IRQ_STATUS + rega: + lda #00 + regx: + ldx #00 + regy: + ldy #00 + rti +} +// Process any chars in the PROCESSING array +processChars: { + .label _2 = $21 + .label _3 = $21 + .label _4 = $21 + .label _6 = $25 + .label _7 = $25 + .label _8 = $25 + .label processing_x = $1f + .label processing_y = $20 + .label _21 = $23 + .label _22 = $21 + .label _24 = $27 + .label _25 = $25 + ldx #0 + b1: + txa + asl + asl + tay + lda PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST,y + cmp #NOT_FOUND + bne !b2+ + jmp b2 + !b2: + !: + txa + asl + asl + tay + lda PROCESSING,y + sta processing_x + lda PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_Y,y + sta processing_y + sta _2 + lda #0 + sta _2+1 + lda _2 + asl + sta _21 + lda _2+1 + rol + sta _21+1 + asl _21 + rol _21+1 + lda _22 + clc + adc _21 + sta _22 + lda _22+1 + adc _21+1 + sta _22+1 + asl _3 + rol _3+1 + asl _3 + rol _3+1 + asl _3 + rol _3+1 + clc + lda _4 + adc #COLS + sta _4+1 + lda #WHITE + ldy processing_x + sta (_4),y + lda processing_y + sta _6 + lda #0 + sta _6+1 + lda _6 + asl + sta _24 + lda _6+1 + rol + sta _24+1 + asl _24 + rol _24+1 + lda _25 + clc + adc _24 + sta _25 + lda _25+1 + adc _24+1 + sta _25+1 + asl _7 + rol _7+1 + asl _7 + rol _7+1 + asl _7 + rol _7+1 + clc + lda _8 + adc #SCREEN + sta _8+1 + lda (_8),y + cmp #' ' + beq b3 + lda (_8),y + cmp #' ' + beq !+ + bcs b4 + !: + ldy processing_x + lda (_8),y + clc + adc #1 + sta (_8),y + b2: + inx + cpx #8 + beq !b1+ + jmp b1 + !b1: + rts + b4: + ldy processing_x + lda (_8),y + sec + sbc #1 + sta (_8),y + jmp b2 + b3: + txa + asl + asl + tay + lda #NOT_FOUND + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST+1,y + jmp b2 +} +// Raster Interrupt at the top of the screen +irqTop: { + sta rega+1 + stx regx+1 + sty regy+1 + ldx #0 + b1: + inx + cpx #5 + bne b1 + lda #WHITE + sta BORDERCOL + sta BGCOL + ldx #0 + b3: + inx + cpx #8 + bne b3 + lda #LIGHT_BLUE + sta BORDERCOL + lda #BLUE + sta BGCOL + // Trigger IRQ at the middle of the screen + lda #RASTER_IRQ_MIDDLE + sta RASTER + lda #irqBottom + sta HARDWARE_IRQ+1 + // Acknowledge the IRQ + lda #IRQ_RASTER + sta IRQ_STATUS + rega: + lda #00 + regx: + ldx #00 + regy: + ldy #00 + rti +} + // Copy of the screen used for finding chars to process + SCREEN_COPY: .fill $3e8, 0 + // Chars currently being processed in the interrupt + PROCESSING: .fill 4*8, 0 + // SQUARES_X[i] = (i-20)*(i-20) + SQUARES_X: .fill 2*$28, 0 + // SQUARES_Y[i] = (i-12)*(i-12) + SQUARES_Y: .fill 2*$19, 0 diff --git a/src/test/ref/complex/blackhole/blackhole.cfg b/src/test/ref/complex/blackhole/blackhole.cfg new file mode 100644 index 000000000..6f75d00b9 --- /dev/null +++ b/src/test/ref/complex/blackhole/blackhole.cfg @@ -0,0 +1,359 @@ +@begin: scope:[] from + [0] phi() + to:@1 +@1: scope:[] from @begin + [1] phi() + [2] call main + to:@end +@end: scope:[] from @1 + [3] phi() +main: scope:[main] from @1 + [4] phi() + to:main::@1 +main::@1: scope:[main] from main main::@1 + [5] (byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 ) + [6] (byte~) main::$18 ← (byte) main::i#2 << (byte) 2 + [7] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) main::$18) ← (byte) 0 + [8] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) main::$18) ← (byte) 0 + [9] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) main::$18) ← (const word) NOT_FOUND#0 + [10] (byte) main::i#1 ← ++ (byte) main::i#2 + [11] if((byte) main::i#1!=(byte) 8) goto main::@1 + to:main::@2 +main::@2: scope:[main] from main::@1 + [12] phi() + [13] call setupRasterIrq + to:main::@3 +main::@3: scope:[main] from main::@2 main::@3 + [14] (byte*) main::sc#2 ← phi( main::@2/(const byte*) SCREEN#0 main::@3/(byte*) main::sc#1 ) + [15] (byte~) main::$5 ← < (byte*) main::sc#2 + [16] (byte~) main::$6 ← (byte~) main::$5 & (byte) $1f + [17] (byte~) main::$7 ← (byte) 'a' + (byte~) main::$6 + [18] *((byte*) main::sc#2) ← (byte~) main::$7 + [19] (byte*) main::sc#1 ← ++ (byte*) main::sc#2 + [20] if((byte*) main::sc#1!=(const byte*) SCREEN#0+(word) $3e7+(byte) 1) goto main::@3 + to:main::@4 +main::@4: scope:[main] from main::@3 main::@4 + [21] (byte*) main::dst#2 ← phi( main::@3/(const byte[$3e8]) SCREEN_COPY#0 main::@4/(byte*) main::dst#1 ) + [21] (byte*) main::src#2 ← phi( main::@3/(const byte*) SCREEN#0 main::@4/(byte*) main::src#1 ) + [22] *((byte*) main::dst#2) ← *((byte*) main::src#2) + [23] (byte*) main::src#1 ← ++ (byte*) main::src#2 + [24] (byte*) main::dst#1 ← ++ (byte*) main::dst#2 + [25] if((byte*) main::src#1!=(const byte*) SCREEN#0+(word) $3e7) goto main::@4 + to:main::@5 +main::@5: scope:[main] from main::@4 + [26] phi() + [27] call initSquareTables + to:main::@6 +main::@6: scope:[main] from main::@5 main::@7 + [28] phi() + [29] call getCenterChar + [30] (byte) getCenterChar::return_x#0 ← (byte) getCenterChar::return_x#1 + [31] (byte) getCenterChar::return_y#0 ← (byte) getCenterChar::return_y#1 + [32] (word) getCenterChar::return_dist#0 ← (word) getCenterChar::return_dist#1 + to:main::@9 +main::@9: scope:[main] from main::@6 + [33] (byte) main::center_x#0 ← (byte) getCenterChar::return_x#0 + [34] (byte) main::center_y#0 ← (byte) getCenterChar::return_y#0 + [35] (word) main::center_dist#0 ← (word) getCenterChar::return_dist#0 + [36] if((word) main::center_dist#0!=(const word) NOT_FOUND#0) goto main::@7 + to:main::@8 +main::@8: scope:[main] from main::@8 main::@9 + [37] *((const byte*) SCREEN#0+(word) $3e7) ← ++ *((const byte*) SCREEN#0+(word) $3e7) + to:main::@8 +main::@7: scope:[main] from main::@9 + [38] (byte) startProcessing::center_x#0 ← (byte) main::center_x#0 + [39] (byte) startProcessing::center_y#0 ← (byte) main::center_y#0 + [40] (word) startProcessing::center_dist#0 ← (word) main::center_dist#0 + [41] call startProcessing + to:main::@6 +startProcessing: scope:[startProcessing] from main::@7 + [42] phi() + to:startProcessing::@1 +startProcessing::@1: scope:[startProcessing] from startProcessing startProcessing::@6 + [43] (byte) startProcessing::freeIdx#6 ← phi( startProcessing/(byte) $ff startProcessing::@6/(byte~) startProcessing::freeIdx#7 ) + to:startProcessing::@2 +startProcessing::@2: scope:[startProcessing] from startProcessing::@1 startProcessing::@3 + [44] (byte) startProcessing::i#2 ← phi( startProcessing::@1/(byte) 0 startProcessing::@3/(byte) startProcessing::i#1 ) + [45] (byte~) startProcessing::$4 ← (byte) startProcessing::i#2 << (byte) 2 + [46] if(*((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) startProcessing::$4)!=(const word) NOT_FOUND#0) goto startProcessing::@3 + to:startProcessing::@4 +startProcessing::@4: scope:[startProcessing] from startProcessing::@2 startProcessing::@7 + [47] (byte) startProcessing::freeIdx#2 ← phi( startProcessing::@7/(byte~) startProcessing::freeIdx#8 startProcessing::@2/(byte) startProcessing::i#2 ) + [48] if((byte) startProcessing::freeIdx#2==(byte) $ff) goto startProcessing::@6 + to:startProcessing::@5 +startProcessing::@5: scope:[startProcessing] from startProcessing::@4 + [49] (byte~) startProcessing::$5 ← (byte) startProcessing::freeIdx#2 << (byte) 2 + [50] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) startProcessing::$5) ← (byte) startProcessing::center_x#0 + [51] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) startProcessing::$5) ← (byte) startProcessing::center_y#0 + [52] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) startProcessing::$5) ← (word) startProcessing::center_dist#0 + to:startProcessing::@return +startProcessing::@return: scope:[startProcessing] from startProcessing::@5 + [53] return + to:@return +startProcessing::@6: scope:[startProcessing] from startProcessing::@4 + [54] (byte~) startProcessing::freeIdx#7 ← (byte) startProcessing::freeIdx#2 + to:startProcessing::@1 +startProcessing::@3: scope:[startProcessing] from startProcessing::@2 + [55] (byte) startProcessing::i#1 ← ++ (byte) startProcessing::i#2 + [56] if((byte) startProcessing::i#1!=(byte) 8) goto startProcessing::@2 + to:startProcessing::@7 +startProcessing::@7: scope:[startProcessing] from startProcessing::@3 + [57] (byte~) startProcessing::freeIdx#8 ← (byte) startProcessing::freeIdx#6 + to:startProcessing::@4 +getCenterChar: scope:[getCenterChar] from main::@6 + [58] phi() + to:getCenterChar::@1 +getCenterChar::@1: scope:[getCenterChar] from getCenterChar getCenterChar::@9 + [59] (byte) getCenterChar::closest_y#9 ← phi( getCenterChar/(byte) 0 getCenterChar::@9/(byte) getCenterChar::return_y#1 ) + [59] (byte) getCenterChar::closest_x#9 ← phi( getCenterChar/(byte) 0 getCenterChar::@9/(byte) getCenterChar::return_x#1 ) + [59] (word) getCenterChar::closest_dist#8 ← phi( getCenterChar/(const word) NOT_FOUND#0 getCenterChar::@9/(word~) getCenterChar::closest_dist#10 ) + [59] (byte) getCenterChar::y#7 ← phi( getCenterChar/(byte) 0 getCenterChar::@9/(byte) getCenterChar::y#1 ) + [59] (byte*) getCenterChar::screen_line#4 ← phi( getCenterChar/(const byte[$3e8]) SCREEN_COPY#0 getCenterChar::@9/(byte*) getCenterChar::screen_line#1 ) + to:getCenterChar::@2 +getCenterChar::@2: scope:[getCenterChar] from getCenterChar::@1 getCenterChar::@10 + [60] (byte) getCenterChar::closest_y#7 ← phi( getCenterChar::@1/(byte) getCenterChar::closest_y#9 getCenterChar::@10/(byte) getCenterChar::return_y#1 ) + [60] (byte) getCenterChar::closest_x#7 ← phi( getCenterChar::@1/(byte) getCenterChar::closest_x#9 getCenterChar::@10/(byte) getCenterChar::return_x#1 ) + [60] (word) getCenterChar::closest_dist#2 ← phi( getCenterChar::@1/(word) getCenterChar::closest_dist#8 getCenterChar::@10/(word~) getCenterChar::closest_dist#12 ) + [60] (byte) getCenterChar::x#2 ← phi( getCenterChar::@1/(byte) 0 getCenterChar::@10/(byte) getCenterChar::x#1 ) + [61] if(*((byte*) getCenterChar::screen_line#4 + (byte) getCenterChar::x#2)==(byte) ' ') goto getCenterChar::@11 + to:getCenterChar::@4 +getCenterChar::@4: scope:[getCenterChar] from getCenterChar::@2 + [62] (byte~) getCenterChar::$13 ← (byte) getCenterChar::x#2 << (byte) 1 + [63] (byte~) getCenterChar::$14 ← (byte) getCenterChar::y#7 << (byte) 1 + [64] (word) getCenterChar::dist#0 ← *((const word[$28]) SQUARES_X#0 + (byte~) getCenterChar::$13) + *((const word[$19]) SQUARES_Y#0 + (byte~) getCenterChar::$14) + [65] if((word) getCenterChar::dist#0>=(word) getCenterChar::closest_dist#2) goto getCenterChar::@12 + to:getCenterChar::@5 +getCenterChar::@5: scope:[getCenterChar] from getCenterChar::@4 + [66] (byte~) getCenterChar::return_x#7 ← (byte) getCenterChar::x#2 + [67] (byte~) getCenterChar::return_y#7 ← (byte) getCenterChar::y#7 + to:getCenterChar::@3 +getCenterChar::@3: scope:[getCenterChar] from getCenterChar::@11 getCenterChar::@12 getCenterChar::@5 + [68] (byte) getCenterChar::return_y#1 ← phi( getCenterChar::@11/(byte) getCenterChar::closest_y#7 getCenterChar::@12/(byte) getCenterChar::closest_y#7 getCenterChar::@5/(byte~) getCenterChar::return_y#7 ) + [68] (byte) getCenterChar::return_x#1 ← phi( getCenterChar::@11/(byte) getCenterChar::closest_x#7 getCenterChar::@12/(byte) getCenterChar::closest_x#7 getCenterChar::@5/(byte~) getCenterChar::return_x#7 ) + [68] (word) getCenterChar::return_dist#1 ← phi( getCenterChar::@11/(word~) getCenterChar::return_dist#5 getCenterChar::@12/(word~) getCenterChar::return_dist#6 getCenterChar::@5/(word) getCenterChar::dist#0 ) + [69] (byte) getCenterChar::x#1 ← ++ (byte) getCenterChar::x#2 + [70] if((byte) getCenterChar::x#1!=(byte) $28) goto getCenterChar::@10 + to:getCenterChar::@6 +getCenterChar::@6: scope:[getCenterChar] from getCenterChar::@3 + [71] (byte*) getCenterChar::screen_line#1 ← (byte*) getCenterChar::screen_line#4 + (byte) $28 + [72] (byte) getCenterChar::y#1 ← ++ (byte) getCenterChar::y#7 + [73] if((byte) getCenterChar::y#1!=(byte) $19) goto getCenterChar::@9 + to:getCenterChar::@7 +getCenterChar::@7: scope:[getCenterChar] from getCenterChar::@6 + [74] if((word) getCenterChar::return_dist#1==(const word) NOT_FOUND#0) goto getCenterChar::@return + to:getCenterChar::@8 +getCenterChar::@8: scope:[getCenterChar] from getCenterChar::@7 + [75] (word~) getCenterChar::$9 ← (word)(byte) getCenterChar::return_y#1 + [76] (word) getCenterChar::$15 ← (word~) getCenterChar::$9 << (byte) 2 + [77] (word) getCenterChar::$16 ← (word) getCenterChar::$15 + (word~) getCenterChar::$9 + [78] (word~) getCenterChar::$10 ← (word) getCenterChar::$16 << (byte) 3 + [79] (byte*~) getCenterChar::$11 ← (const byte[$3e8]) SCREEN_COPY#0 + (word~) getCenterChar::$10 + [80] *((byte*~) getCenterChar::$11 + (byte) getCenterChar::return_x#1) ← (byte) ' ' + to:getCenterChar::@return +getCenterChar::@return: scope:[getCenterChar] from getCenterChar::@7 getCenterChar::@8 + [81] return + to:@return +getCenterChar::@9: scope:[getCenterChar] from getCenterChar::@6 + [82] (word~) getCenterChar::closest_dist#10 ← (word) getCenterChar::return_dist#1 + to:getCenterChar::@1 +getCenterChar::@10: scope:[getCenterChar] from getCenterChar::@3 + [83] (word~) getCenterChar::closest_dist#12 ← (word) getCenterChar::return_dist#1 + to:getCenterChar::@2 +getCenterChar::@12: scope:[getCenterChar] from getCenterChar::@4 + [84] (word~) getCenterChar::return_dist#6 ← (word) getCenterChar::closest_dist#2 + to:getCenterChar::@3 +getCenterChar::@11: scope:[getCenterChar] from getCenterChar::@2 + [85] (word~) getCenterChar::return_dist#5 ← (word) getCenterChar::closest_dist#2 + to:getCenterChar::@3 +initSquareTables: scope:[initSquareTables] from main::@5 + [86] phi() + to:initSquareTables::@1 +initSquareTables::@1: scope:[initSquareTables] from initSquareTables initSquareTables::@9 + [87] (byte) initSquareTables::x#2 ← phi( initSquareTables/(byte) 0 initSquareTables::@9/(byte) initSquareTables::x#1 ) + [88] if((byte) initSquareTables::x#2<(byte) $14) goto initSquareTables::@2 + to:initSquareTables::@3 +initSquareTables::@3: scope:[initSquareTables] from initSquareTables::@1 + [89] (byte~) initSquareTables::$2 ← (byte) initSquareTables::x#2 - (byte) $14 + to:initSquareTables::@4 +initSquareTables::@4: scope:[initSquareTables] from initSquareTables::@2 initSquareTables::@3 + [90] (byte) initSquareTables::x_dist#0 ← phi( initSquareTables::@2/(byte~) initSquareTables::$4 initSquareTables::@3/(byte~) initSquareTables::$2 ) + [91] (byte) mul8u::a#1 ← (byte) initSquareTables::x_dist#0 + [92] (byte) mul8u::b#0 ← (byte) initSquareTables::x_dist#0 + [93] call mul8u + [94] (word) mul8u::return#2 ← (word) mul8u::res#2 + to:initSquareTables::@9 +initSquareTables::@9: scope:[initSquareTables] from initSquareTables::@4 + [95] (word~) initSquareTables::$6 ← (word) mul8u::return#2 + [96] (byte~) initSquareTables::$16 ← (byte) initSquareTables::x#2 << (byte) 1 + [97] *((const word[$28]) SQUARES_X#0 + (byte~) initSquareTables::$16) ← (word~) initSquareTables::$6 + [98] (byte) initSquareTables::x#1 ← ++ (byte) initSquareTables::x#2 + [99] if((byte) initSquareTables::x#1!=(byte) $28) goto initSquareTables::@1 + to:initSquareTables::@5 +initSquareTables::@5: scope:[initSquareTables] from initSquareTables::@10 initSquareTables::@9 + [100] (byte) initSquareTables::y#2 ← phi( initSquareTables::@10/(byte) initSquareTables::y#1 initSquareTables::@9/(byte) 0 ) + [101] if((byte) initSquareTables::y#2<(byte) $c) goto initSquareTables::@6 + to:initSquareTables::@7 +initSquareTables::@7: scope:[initSquareTables] from initSquareTables::@5 + [102] (byte~) initSquareTables::$10 ← (byte) initSquareTables::y#2 - (byte) $c + to:initSquareTables::@8 +initSquareTables::@8: scope:[initSquareTables] from initSquareTables::@6 initSquareTables::@7 + [103] (byte) initSquareTables::y_dist#0 ← phi( initSquareTables::@6/(byte~) initSquareTables::$12 initSquareTables::@7/(byte~) initSquareTables::$10 ) + [104] (byte) mul8u::a#2 ← (byte) initSquareTables::y_dist#0 + [105] (byte) mul8u::b#1 ← (byte) initSquareTables::y_dist#0 + [106] call mul8u + [107] (word) mul8u::return#3 ← (word) mul8u::res#2 + to:initSquareTables::@10 +initSquareTables::@10: scope:[initSquareTables] from initSquareTables::@8 + [108] (word~) initSquareTables::$14 ← (word) mul8u::return#3 + [109] (byte~) initSquareTables::$17 ← (byte) initSquareTables::y#2 << (byte) 1 + [110] *((const word[$19]) SQUARES_Y#0 + (byte~) initSquareTables::$17) ← (word~) initSquareTables::$14 + [111] (byte) initSquareTables::y#1 ← ++ (byte) initSquareTables::y#2 + [112] if((byte) initSquareTables::y#1!=(byte) $19) goto initSquareTables::@5 + to:initSquareTables::@return +initSquareTables::@return: scope:[initSquareTables] from initSquareTables::@10 + [113] return + to:@return +initSquareTables::@6: scope:[initSquareTables] from initSquareTables::@5 + [114] (byte~) initSquareTables::$12 ← (byte) $c - (byte) initSquareTables::y#2 + to:initSquareTables::@8 +initSquareTables::@2: scope:[initSquareTables] from initSquareTables::@1 + [115] (byte~) initSquareTables::$4 ← (byte) $14 - (byte) initSquareTables::x#2 + to:initSquareTables::@4 +mul8u: scope:[mul8u] from initSquareTables::@4 initSquareTables::@8 + [116] (byte) mul8u::a#6 ← phi( initSquareTables::@8/(byte) mul8u::a#2 initSquareTables::@4/(byte) mul8u::a#1 ) + [116] (word) mul8u::mb#0 ← phi( initSquareTables::@8/(byte) mul8u::b#1 initSquareTables::@4/(byte) mul8u::b#0 ) + to:mul8u::@1 +mul8u::@1: scope:[mul8u] from mul8u mul8u::@3 + [117] (word) mul8u::mb#2 ← phi( mul8u/(word) mul8u::mb#0 mul8u::@3/(word) mul8u::mb#1 ) + [117] (word) mul8u::res#2 ← phi( mul8u/(byte) 0 mul8u::@3/(word) mul8u::res#6 ) + [117] (byte) mul8u::a#3 ← phi( mul8u/(byte) mul8u::a#6 mul8u::@3/(byte) mul8u::a#0 ) + [118] if((byte) mul8u::a#3!=(byte) 0) goto mul8u::@2 + to:mul8u::@return +mul8u::@return: scope:[mul8u] from mul8u::@1 + [119] return + to:@return +mul8u::@2: scope:[mul8u] from mul8u::@1 + [120] (byte~) mul8u::$1 ← (byte) mul8u::a#3 & (byte) 1 + [121] if((byte~) mul8u::$1==(byte) 0) goto mul8u::@3 + to:mul8u::@4 +mul8u::@4: scope:[mul8u] from mul8u::@2 + [122] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 + to:mul8u::@3 +mul8u::@3: scope:[mul8u] from mul8u::@2 mul8u::@4 + [123] (word) mul8u::res#6 ← phi( mul8u::@2/(word) mul8u::res#2 mul8u::@4/(word) mul8u::res#1 ) + [124] (byte) mul8u::a#0 ← (byte) mul8u::a#3 >> (byte) 1 + [125] (word) mul8u::mb#1 ← (word) mul8u::mb#2 << (byte) 1 + to:mul8u::@1 +setupRasterIrq: scope:[setupRasterIrq] from main::@2 + asm { sei } + [127] *((const byte*) PROCPORT_DDR#0) ← (const byte) PROCPORT_DDR_MEMORY_MASK#0 + [128] *((const byte*) PROCPORT#0) ← (const byte) PROCPORT_RAM_IO#0 + [129] *((const byte*) CIA1_INTERRUPT#0) ← (const byte) CIA_INTERRUPT_CLEAR#0 + to:setupRasterIrq::@1 +setupRasterIrq::@1: scope:[setupRasterIrq] from setupRasterIrq + [130] *((const byte*) VIC_CONTROL#0) ← *((const byte*) VIC_CONTROL#0) & (byte) $7f + to:setupRasterIrq::@2 +setupRasterIrq::@2: scope:[setupRasterIrq] from setupRasterIrq::@1 + [131] *((const byte*) RASTER#0) ← <(const byte) RASTER_IRQ_TOP#0 + [132] *((const byte*) IRQ_ENABLE#0) ← (const byte) IRQ_RASTER#0 + [133] *((const void()**) HARDWARE_IRQ#0) ← (const void()*) setupRasterIrq::irqRoutine#0 + asm { cli } + to:setupRasterIrq::@return +setupRasterIrq::@return: scope:[setupRasterIrq] from setupRasterIrq::@2 + [135] return + to:@return +irqBottom: scope:[irqBottom] from + [136] phi() + to:irqBottom::@1 +irqBottom::@1: scope:[irqBottom] from irqBottom irqBottom::@1 + [137] (byte) irqBottom::i#2 ← phi( irqBottom/(byte) 0 irqBottom::@1/(byte) irqBottom::i#1 ) + [138] (byte) irqBottom::i#1 ← ++ (byte) irqBottom::i#2 + [139] if((byte) irqBottom::i#1!=(byte) 5) goto irqBottom::@1 + to:irqBottom::@2 +irqBottom::@2: scope:[irqBottom] from irqBottom::@1 + [140] *((const byte*) BORDERCOL#0) ← (const byte) WHITE#0 + [141] *((const byte*) BGCOL#0) ← (const byte) WHITE#0 + [142] call processChars + to:irqBottom::@3 +irqBottom::@3: scope:[irqBottom] from irqBottom::@2 + [143] *((const byte*) BORDERCOL#0) ← (const byte) LIGHT_BLUE#0 + [144] *((const byte*) BGCOL#0) ← (const byte) BLUE#0 + [145] *((const byte*) RASTER#0) ← (const byte) RASTER_IRQ_TOP#0 + [146] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(HARDWARE_ALL)(void()) irqTop() + [147] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 + to:irqBottom::@return +irqBottom::@return: scope:[irqBottom] from irqBottom::@3 + [148] return + to:@return +processChars: scope:[processChars] from irqBottom::@2 + [149] phi() + to:processChars::@1 +processChars::@1: scope:[processChars] from processChars processChars::@2 + [150] (byte) processChars::i#2 ← phi( processChars/(byte) 0 processChars::@2/(byte) processChars::i#1 ) + [151] (byte~) processChars::$13 ← (byte) processChars::i#2 << (byte) 2 + [152] if(*((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) processChars::$13)==(const word) NOT_FOUND#0) goto processChars::@2 + to:processChars::@5 +processChars::@5: scope:[processChars] from processChars::@1 + [153] (byte~) processChars::$14 ← (byte) processChars::i#2 << (byte) 2 + [154] (byte) processChars::processing_x#0 ← *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) processChars::$14) + [155] (byte) processChars::processing_y#0 ← *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) processChars::$14) + [156] (word~) processChars::$2 ← (word)(byte) processChars::processing_y#0 + [157] (word) processChars::$21 ← (word~) processChars::$2 << (byte) 2 + [158] (word) processChars::$22 ← (word) processChars::$21 + (word~) processChars::$2 + [159] (word~) processChars::$3 ← (word) processChars::$22 << (byte) 3 + [160] (byte*~) processChars::$4 ← (const byte*) COLS#0 + (word~) processChars::$3 + [161] *((byte*~) processChars::$4 + (byte) processChars::processing_x#0) ← (const byte) WHITE#0 + [162] (word~) processChars::$6 ← (word)(byte) processChars::processing_y#0 + [163] (word) processChars::$24 ← (word~) processChars::$6 << (byte) 2 + [164] (word) processChars::$25 ← (word) processChars::$24 + (word~) processChars::$6 + [165] (word~) processChars::$7 ← (word) processChars::$25 << (byte) 3 + [166] (byte*~) processChars::$8 ← (const byte*) SCREEN#0 + (word~) processChars::$7 + [167] if(*((byte*~) processChars::$8 + (byte) processChars::processing_x#0)==(byte) ' ') goto processChars::@3 + to:processChars::@6 +processChars::@6: scope:[processChars] from processChars::@5 + [168] if(*((byte*~) processChars::$8 + (byte) processChars::processing_x#0)>(byte) ' ') goto processChars::@4 + to:processChars::@7 +processChars::@7: scope:[processChars] from processChars::@6 + [169] *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) ← ++ *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) + to:processChars::@2 +processChars::@2: scope:[processChars] from processChars::@1 processChars::@3 processChars::@4 processChars::@7 + [170] (byte) processChars::i#1 ← ++ (byte) processChars::i#2 + [171] if((byte) processChars::i#1!=(byte) 8) goto processChars::@1 + to:processChars::@return +processChars::@return: scope:[processChars] from processChars::@2 + [172] return + to:@return +processChars::@4: scope:[processChars] from processChars::@6 + [173] *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) ← -- *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) + to:processChars::@2 +processChars::@3: scope:[processChars] from processChars::@5 + [174] (byte~) processChars::$15 ← (byte) processChars::i#2 << (byte) 2 + [175] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) processChars::$15) ← (const word) NOT_FOUND#0 + to:processChars::@2 +irqTop: scope:[irqTop] from + [176] phi() + to:irqTop::@1 +irqTop::@1: scope:[irqTop] from irqTop irqTop::@1 + [177] (byte) irqTop::i#2 ← phi( irqTop/(byte) 0 irqTop::@1/(byte) irqTop::i#1 ) + [178] (byte) irqTop::i#1 ← ++ (byte) irqTop::i#2 + [179] if((byte) irqTop::i#1!=(byte) 5) goto irqTop::@1 + to:irqTop::@2 +irqTop::@2: scope:[irqTop] from irqTop::@1 + [180] *((const byte*) BORDERCOL#0) ← (const byte) WHITE#0 + [181] *((const byte*) BGCOL#0) ← (const byte) WHITE#0 + to:irqTop::@3 +irqTop::@3: scope:[irqTop] from irqTop::@2 irqTop::@3 + [182] (byte) irqTop::i1#2 ← phi( irqTop::@2/(byte) 0 irqTop::@3/(byte) irqTop::i1#1 ) + [183] (byte) irqTop::i1#1 ← ++ (byte) irqTop::i1#2 + [184] if((byte) irqTop::i1#1!=(byte) 8) goto irqTop::@3 + to:irqTop::@4 +irqTop::@4: scope:[irqTop] from irqTop::@3 + [185] *((const byte*) BORDERCOL#0) ← (const byte) LIGHT_BLUE#0 + [186] *((const byte*) BGCOL#0) ← (const byte) BLUE#0 + [187] *((const byte*) RASTER#0) ← (const byte) RASTER_IRQ_MIDDLE#0 + [188] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(HARDWARE_ALL)(void()) irqBottom() + [189] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 + to:irqTop::@return +irqTop::@return: scope:[irqTop] from irqTop::@4 + [190] return + to:@return diff --git a/src/test/ref/complex/blackhole/blackhole.log b/src/test/ref/complex/blackhole/blackhole.log new file mode 100644 index 000000000..c8c258d41 --- /dev/null +++ b/src/test/ref/complex/blackhole/blackhole.log @@ -0,0 +1,7297 @@ +Resolved forward reference PROCESSING to (struct ProcessingChar[8]) PROCESSING +Resolved forward reference irqTop to interrupt(HARDWARE_ALL)(void()) irqTop() +Resolved forward reference RASTER_IRQ_TOP to (byte) RASTER_IRQ_TOP +Resolved forward reference RASTER_IRQ_MIDDLE to (byte) RASTER_IRQ_MIDDLE +Resolved forward reference irqBottom to interrupt(HARDWARE_ALL)(void()) irqBottom() +Fixing pointer array-indexing *((struct ProcessingChar[8]) PROCESSING + (byte) main::i) +Fixing pointer array-indexing *((struct ProcessingChar[8]) PROCESSING + (byte) startProcessing::i) +Fixing pointer array-indexing *((struct ProcessingChar[8]) PROCESSING + (byte) startProcessing::freeIdx) +Fixing pointer array-indexing *((struct ProcessingChar[8]) PROCESSING + (byte) processChars::i) +Fixing pointer array-indexing *((struct ProcessingChar[8]) PROCESSING + (byte) processChars::i) +Fixing pointer array-indexing *((struct ProcessingChar[8]) PROCESSING + (byte) processChars::i) +Fixing pointer array-indexing *((word[$28]) SQUARES_X + (byte) initSquareTables::x) +Fixing pointer array-indexing *((word[$19]) SQUARES_Y + (byte) initSquareTables::y) +Fixing pointer array-indexing *((word[$28]) SQUARES_X + (byte) getCenterChar::x) +Fixing pointer array-indexing *((word[$19]) SQUARES_Y + (byte) getCenterChar::y) +Created struct value member variable (byte) main::center_x +Created struct value member variable (byte) main::center_y +Created struct value member variable (word) main::center_dist +Converted struct value to member variables (struct ProcessingChar) main::center +Created struct value member variable (byte) main::$11_x +Created struct value member variable (byte) main::$11_y +Created struct value member variable (word) main::$11_dist +Converted struct value to member variables (struct ProcessingChar~) main::$11 +Created struct value member variable (byte) startProcessing::center_x +Created struct value member variable (byte) startProcessing::center_y +Created struct value member variable (word) startProcessing::center_dist +Converted struct value to member variables (struct ProcessingChar) startProcessing::center +Created struct value member variable (byte) processChars::processing_x +Created struct value member variable (byte) processChars::processing_y +Created struct value member variable (word) processChars::processing_dist +Converted struct value to member variables (struct ProcessingChar) processChars::processing +Created struct value member variable (byte) getCenterChar::return_x +Created struct value member variable (byte) getCenterChar::return_y +Created struct value member variable (word) getCenterChar::return_dist +Converted struct value to member variables (struct ProcessingChar) getCenterChar::return +Created struct value member variable (byte) getCenterChar::closest_x +Created struct value member variable (byte) getCenterChar::closest_y +Created struct value member variable (word) getCenterChar::closest_dist +Converted struct value to member variables (struct ProcessingChar) getCenterChar::closest +Converted procedure struct value parameter to member variables (void()) startProcessing((byte) startProcessing::center_x , (byte) startProcessing::center_y , (word) startProcessing::center_dist) +Adding struct value list initializer *((byte*) main::$19 + (byte~) main::$18) ← (number) 0 +Adding struct value list initializer *((byte*) main::$20 + (byte~) main::$18) ← (number) 0 +Adding struct value list initializer *((word*) main::$21 + (byte~) main::$18) ← (word) NOT_FOUND +Converted procedure call LValue to member variables { (byte) main::$11_x, (byte) main::$11_y, (word) main::$11_dist } ← call getCenterChar +Adding struct value member variable copy (byte) main::center_x ← (byte) main::$11_x +Adding struct value member variable copy (byte) main::center_y ← (byte) main::$11_y +Adding struct value member variable copy (word) main::center_dist ← (word) main::$11_dist +Converted procedure struct value parameter to member variables in call (void~) main::$14 ← call startProcessing (byte) main::center_x (byte) main::center_y (word) main::center_dist +Adding struct value member variable copy *((byte*) startProcessing::$6 + (byte~) startProcessing::$5) ← (byte) startProcessing::center_x +Adding struct value member variable copy *((byte*) startProcessing::$7 + (byte~) startProcessing::$5) ← (byte) startProcessing::center_y +Adding struct value member variable copy *((word*) startProcessing::$8 + (byte~) startProcessing::$5) ← (word) startProcessing::center_dist +Adding struct value member variable copy (byte) processChars::processing_x ← *((byte*) processChars::$16 + (byte~) processChars::$14) +Adding struct value member variable copy (byte) processChars::processing_y ← *((byte*) processChars::$17 + (byte~) processChars::$14) +Adding struct value member variable copy (word) processChars::processing_dist ← *((word*) processChars::$18 + (byte~) processChars::$14) +Adding struct value list initializer (byte) getCenterChar::closest_x ← (number) 0 +Adding struct value list initializer (byte) getCenterChar::closest_y ← (number) 0 +Adding struct value list initializer (word) getCenterChar::closest_dist ← (word) NOT_FOUND +Adding struct value list initializer (byte) getCenterChar::closest_x ← (byte) getCenterChar::x +Adding struct value list initializer (byte) getCenterChar::closest_y ← (byte) getCenterChar::y +Adding struct value list initializer (word) getCenterChar::closest_dist ← (word) getCenterChar::dist +Adding struct value member variable copy (byte) getCenterChar::return_x ← (byte) getCenterChar::closest_x +Adding struct value member variable copy (byte) getCenterChar::return_y ← (byte) getCenterChar::closest_y +Adding struct value member variable copy (word) getCenterChar::return_dist ← (word) getCenterChar::closest_dist +Adding struct value member variable copy (byte) getCenterChar::return_x ← (byte) getCenterChar::return_x +Adding struct value member variable copy (byte) getCenterChar::return_y ← (byte) getCenterChar::return_y +Adding struct value member variable copy (word) getCenterChar::return_dist ← (word) getCenterChar::return_dist +Converted procedure struct return value to member variables return { (byte) getCenterChar::return_x, (byte) getCenterChar::return_y, (word) getCenterChar::return_dist } +Replacing struct member reference (struct ProcessingChar) main::center.dist with member variable reference (word) main::center_dist +Replacing struct member reference (struct ProcessingChar) processChars::processing.y with member variable reference (byte) processChars::processing_y +Replacing struct member reference (struct ProcessingChar) processChars::processing.x with member variable reference (byte) processChars::processing_x +Replacing struct member reference (struct ProcessingChar) processChars::processing.y with member variable reference (byte) processChars::processing_y +Replacing struct member reference (struct ProcessingChar) processChars::processing.x with member variable reference (byte) processChars::processing_x +Replacing struct member reference (struct ProcessingChar) getCenterChar::closest.dist with member variable reference (word) getCenterChar::closest_dist +Replacing struct member reference (struct ProcessingChar) getCenterChar::closest.dist with member variable reference (word) getCenterChar::closest_dist +Replacing struct member reference (struct ProcessingChar) getCenterChar::closest.y with member variable reference (byte) getCenterChar::closest_y +Replacing struct member reference (struct ProcessingChar) getCenterChar::closest.x with member variable reference (byte) getCenterChar::closest_x +Rewriting struct pointer member access *((struct ProcessingChar[8]) PROCESSING + (byte~) startProcessing::$4).dist +Rewriting struct pointer member access *((struct ProcessingChar[8]) PROCESSING + (byte~) processChars::$13).dist +Rewriting struct pointer member access *((struct ProcessingChar[8]) PROCESSING + (byte~) processChars::$15).dist +Adding pointer type conversion cast (byte*) PROCPORT_DDR in (byte*) PROCPORT_DDR ← (number) 0 +Adding pointer type conversion cast (byte*) PROCPORT in (byte*) PROCPORT ← (number) 1 +Adding pointer type conversion cast (byte*) CHARGEN in (byte*) CHARGEN ← (number) $d000 +Adding pointer type conversion cast (byte*) SPRITES_XPOS in (byte*) SPRITES_XPOS ← (number) $d000 +Adding pointer type conversion cast (byte*) SPRITES_YPOS in (byte*) SPRITES_YPOS ← (number) $d001 +Adding pointer type conversion cast (byte*) SPRITES_XMSB in (byte*) SPRITES_XMSB ← (number) $d010 +Adding pointer type conversion cast (byte*) RASTER in (byte*) RASTER ← (number) $d012 +Adding pointer type conversion cast (byte*) SPRITES_ENABLE in (byte*) SPRITES_ENABLE ← (number) $d015 +Adding pointer type conversion cast (byte*) SPRITES_EXPAND_Y in (byte*) SPRITES_EXPAND_Y ← (number) $d017 +Adding pointer type conversion cast (byte*) SPRITES_PRIORITY in (byte*) SPRITES_PRIORITY ← (number) $d01b +Adding pointer type conversion cast (byte*) SPRITES_MC in (byte*) SPRITES_MC ← (number) $d01c +Adding pointer type conversion cast (byte*) SPRITES_EXPAND_X in (byte*) SPRITES_EXPAND_X ← (number) $d01d +Adding pointer type conversion cast (byte*) BORDERCOL in (byte*) BORDERCOL ← (number) $d020 +Adding pointer type conversion cast (byte*) BGCOL in (byte*) BGCOL ← (number) $d021 +Adding pointer type conversion cast (byte*) BGCOL1 in (byte*) BGCOL1 ← (number) $d021 +Adding pointer type conversion cast (byte*) BGCOL2 in (byte*) BGCOL2 ← (number) $d022 +Adding pointer type conversion cast (byte*) BGCOL3 in (byte*) BGCOL3 ← (number) $d023 +Adding pointer type conversion cast (byte*) BGCOL4 in (byte*) BGCOL4 ← (number) $d024 +Adding pointer type conversion cast (byte*) SPRITES_MC1 in (byte*) SPRITES_MC1 ← (number) $d025 +Adding pointer type conversion cast (byte*) SPRITES_MC2 in (byte*) SPRITES_MC2 ← (number) $d026 +Adding pointer type conversion cast (byte*) SPRITES_COLS in (byte*) SPRITES_COLS ← (number) $d027 +Adding pointer type conversion cast (byte*) VIC_CONTROL in (byte*) VIC_CONTROL ← (number) $d011 +Adding pointer type conversion cast (byte*) D011 in (byte*) D011 ← (number) $d011 +Adding pointer type conversion cast (byte*) VIC_CONTROL2 in (byte*) VIC_CONTROL2 ← (number) $d016 +Adding pointer type conversion cast (byte*) D016 in (byte*) D016 ← (number) $d016 +Adding pointer type conversion cast (byte*) D018 in (byte*) D018 ← (number) $d018 +Adding pointer type conversion cast (byte*) VIC_MEMORY in (byte*) VIC_MEMORY ← (number) $d018 +Adding pointer type conversion cast (byte*) LIGHTPEN_X in (byte*) LIGHTPEN_X ← (number) $d013 +Adding pointer type conversion cast (byte*) LIGHTPEN_Y in (byte*) LIGHTPEN_Y ← (number) $d014 +Adding pointer type conversion cast (byte*) IRQ_STATUS in (byte*) IRQ_STATUS ← (number) $d019 +Adding pointer type conversion cast (byte*) IRQ_ENABLE in (byte*) IRQ_ENABLE ← (number) $d01a +Adding pointer type conversion cast (byte*) COLS in (byte*) COLS ← (number) $d800 +Adding pointer type conversion cast (byte*) CIA1_PORT_A in (byte*) CIA1_PORT_A ← (number) $dc00 +Adding pointer type conversion cast (byte*) CIA1_PORT_B in (byte*) CIA1_PORT_B ← (number) $dc01 +Adding pointer type conversion cast (byte*) CIA1_PORT_A_DDR in (byte*) CIA1_PORT_A_DDR ← (number) $dc02 +Adding pointer type conversion cast (byte*) CIA1_PORT_B_DDR in (byte*) CIA1_PORT_B_DDR ← (number) $dc03 +Adding pointer type conversion cast (byte*) CIA1_INTERRUPT in (byte*) CIA1_INTERRUPT ← (number) $dc0d +Adding pointer type conversion cast (byte*) CIA2_PORT_A in (byte*) CIA2_PORT_A ← (number) $dd00 +Adding pointer type conversion cast (byte*) CIA2_PORT_B in (byte*) CIA2_PORT_B ← (number) $dd01 +Adding pointer type conversion cast (byte*) CIA2_PORT_A_DDR in (byte*) CIA2_PORT_A_DDR ← (number) $dd02 +Adding pointer type conversion cast (byte*) CIA2_PORT_B_DDR in (byte*) CIA2_PORT_B_DDR ← (number) $dd03 +Adding pointer type conversion cast (byte*) CIA2_INTERRUPT in (byte*) CIA2_INTERRUPT ← (number) $dd0d +Adding pointer type conversion cast (void()**) KERNEL_IRQ in (void()**) KERNEL_IRQ ← (number) $314 +Adding pointer type conversion cast (void()**) HARDWARE_IRQ in (void()**) HARDWARE_IRQ ← (number) $fffe +Adding pointer type conversion cast (byte*) SCREEN in (byte*) SCREEN ← (number) $400 +Inlined call [105] (byte~) vicSelectGfxBank::$0 ← call toDd00 (byte*) vicSelectGfxBank::gfx +Culled Empty Block (label) @1 +Culled Empty Block (label) @2 +Culled Empty Block (label) @3 +Culled Empty Block (label) @4 +Culled Empty Block (label) mul8u::@5 +Culled Empty Block (label) mul8u::@6 +Culled Empty Block (label) mul8u::@8 +Culled Empty Block (label) mul8u::@9 +Culled Empty Block (label) @5 +Culled Empty Block (label) @6 +Culled Empty Block (label) @7 +Culled Empty Block (label) @8 +Culled Empty Block (label) main::@10 +Culled Empty Block (label) main::@9 +Culled Empty Block (label) main::@11 +Culled Empty Block (label) main::@12 +Culled Empty Block (label) main::@14 +Culled Empty Block (label) startProcessing::@6 +Culled Empty Block (label) startProcessing::@7 +Culled Empty Block (label) @11 +Culled Empty Block (label) processChars::@5 +Culled Empty Block (label) processChars::@11 +Culled Empty Block (label) processChars::@6 +Culled Empty Block (label) processChars::@7 +Culled Empty Block (label) processChars::@12 +Culled Empty Block (label) initSquareTables::@5 +Culled Empty Block (label) initSquareTables::@6 +Culled Empty Block (label) initSquareTables::@12 +Culled Empty Block (label) initSquareTables::@13 +Culled Empty Block (label) initSquareTables::@14 +Culled Empty Block (label) @13 +Culled Empty Block (label) getCenterChar::@6 +Culled Empty Block (label) getCenterChar::@2 +Culled Empty Block (label) @14 +Culled Empty Block (label) setupRasterIrq::@4 +Unwinding list assignment { (byte) main::$11_x, (byte) main::$11_y, (word) main::$11_dist } ← { (byte) getCenterChar::return_x, (byte) getCenterChar::return_y, (word) getCenterChar::return_dist } +Unwinding list assignment { (byte) getCenterChar::return_x#0, (byte) getCenterChar::return_y#0, (word) getCenterChar::return_dist#0 } ← { (byte) getCenterChar::return_x#2, (byte) getCenterChar::return_y#2, (word) getCenterChar::return_dist#2 } + +CONTROL FLOW GRAPH SSA +@begin: scope:[] from + (byte*) PROCPORT_DDR#0 ← ((byte*)) (number) 0 + (byte) PROCPORT_DDR_MEMORY_MASK#0 ← (number) 7 + (byte*) PROCPORT#0 ← ((byte*)) (number) 1 + (byte) PROCPORT_RAM_IO#0 ← (number) $35 + (byte*) RASTER#0 ← ((byte*)) (number) $d012 + (byte*) BORDERCOL#0 ← ((byte*)) (number) $d020 + (byte*) BGCOL#0 ← ((byte*)) (number) $d021 + (byte*) VIC_CONTROL#0 ← ((byte*)) (number) $d011 + (byte*) IRQ_STATUS#0 ← ((byte*)) (number) $d019 + (byte*) IRQ_ENABLE#0 ← ((byte*)) (number) $d01a + (byte) IRQ_RASTER#0 ← (number) 1 + (byte*) COLS#0 ← ((byte*)) (number) $d800 + (byte*) CIA1_INTERRUPT#0 ← ((byte*)) (number) $dc0d + (byte) CIA_INTERRUPT_CLEAR#0 ← (number) $7f + (void()**) HARDWARE_IRQ#0 ← ((void()**)) (number) $fffe + (byte) WHITE#0 ← (number) 1 + (byte) BLUE#0 ← (number) 6 + (byte) LIGHT_BLUE#0 ← (number) $e + to:@9 +mul8u: scope:[mul8u] from initSquareTables::@11 initSquareTables::@4 + (byte) mul8u::a#6 ← phi( initSquareTables::@11/(byte) mul8u::a#2 initSquareTables::@4/(byte) mul8u::a#1 ) + (byte) mul8u::b#2 ← phi( initSquareTables::@11/(byte) mul8u::b#1 initSquareTables::@4/(byte) mul8u::b#0 ) + (word) mul8u::res#0 ← (number) 0 + (word) mul8u::mb#0 ← (byte) mul8u::b#2 + to:mul8u::@1 +mul8u::@1: scope:[mul8u] from mul8u mul8u::@4 + (word) mul8u::mb#5 ← phi( mul8u/(word) mul8u::mb#0 mul8u::@4/(word) mul8u::mb#1 ) + (word) mul8u::res#4 ← phi( mul8u/(word) mul8u::res#0 mul8u::@4/(word) mul8u::res#6 ) + (byte) mul8u::a#3 ← phi( mul8u/(byte) mul8u::a#6 mul8u::@4/(byte) mul8u::a#0 ) + (bool~) mul8u::$0 ← (byte) mul8u::a#3 != (number) 0 + if((bool~) mul8u::$0) goto mul8u::@2 + to:mul8u::@3 +mul8u::@2: scope:[mul8u] from mul8u::@1 + (word) mul8u::res#5 ← phi( mul8u::@1/(word) mul8u::res#4 ) + (word) mul8u::mb#4 ← phi( mul8u::@1/(word) mul8u::mb#5 ) + (byte) mul8u::a#4 ← phi( mul8u::@1/(byte) mul8u::a#3 ) + (number~) mul8u::$1 ← (byte) mul8u::a#4 & (number) 1 + (bool~) mul8u::$2 ← (number~) mul8u::$1 != (number) 0 + (bool~) mul8u::$3 ← ! (bool~) mul8u::$2 + if((bool~) mul8u::$3) goto mul8u::@4 + to:mul8u::@7 +mul8u::@3: scope:[mul8u] from mul8u::@1 + (word) mul8u::res#2 ← phi( mul8u::@1/(word) mul8u::res#4 ) + (word) mul8u::return#0 ← (word) mul8u::res#2 + to:mul8u::@return +mul8u::@4: scope:[mul8u] from mul8u::@2 mul8u::@7 + (word) mul8u::res#6 ← phi( mul8u::@2/(word) mul8u::res#5 mul8u::@7/(word) mul8u::res#1 ) + (word) mul8u::mb#2 ← phi( mul8u::@2/(word) mul8u::mb#4 mul8u::@7/(word) mul8u::mb#3 ) + (byte) mul8u::a#5 ← phi( mul8u::@2/(byte) mul8u::a#4 mul8u::@7/(byte) mul8u::a#7 ) + (byte~) mul8u::$5 ← (byte) mul8u::a#5 >> (number) 1 + (byte) mul8u::a#0 ← (byte~) mul8u::$5 + (word~) mul8u::$6 ← (word) mul8u::mb#2 << (number) 1 + (word) mul8u::mb#1 ← (word~) mul8u::$6 + to:mul8u::@1 +mul8u::@7: scope:[mul8u] from mul8u::@2 + (byte) mul8u::a#7 ← phi( mul8u::@2/(byte) mul8u::a#4 ) + (word) mul8u::mb#3 ← phi( mul8u::@2/(word) mul8u::mb#4 ) + (word) mul8u::res#3 ← phi( mul8u::@2/(word) mul8u::res#5 ) + (word~) mul8u::$4 ← (word) mul8u::res#3 + (word) mul8u::mb#3 + (word) mul8u::res#1 ← (word~) mul8u::$4 + to:mul8u::@4 +mul8u::@return: scope:[mul8u] from mul8u::@3 + (word) mul8u::return#4 ← phi( mul8u::@3/(word) mul8u::return#0 ) + (word) mul8u::return#1 ← (word) mul8u::return#4 + return + to:@return +@9: scope:[] from @begin + (byte*) SCREEN#0 ← ((byte*)) (number) $400 + (byte[$3e8]) SCREEN_COPY#0 ← { fill( $3e8, 0) } + (word) NOT_FOUND#0 ← (number) $ffff + to:@10 +main: scope:[main] from @17 + (byte) main::i#0 ← (byte) 0 + to:main::@1 +main::@1: scope:[main] from main main::@1 + (byte) main::i#2 ← phi( main/(byte) main::i#0 main::@1/(byte) main::i#1 ) + (byte~) main::$18 ← (byte) main::i#2 * (const byte) SIZEOF_STRUCT_PROCESSINGCHAR + (byte*) main::$19 ← (byte*)(struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_X + *((byte*) main::$19 + (byte~) main::$18) ← (number) 0 + (byte*) main::$20 ← (byte*)(struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + *((byte*) main::$20 + (byte~) main::$18) ← (number) 0 + (word*) main::$21 ← (word*)(struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + *((word*) main::$21 + (byte~) main::$18) ← (word) NOT_FOUND#0 + (byte) main::i#1 ← (byte) main::i#2 + rangenext(0,7) + (bool~) main::$3 ← (byte) main::i#1 != rangelast(0,7) + if((bool~) main::$3) goto main::@1 + to:main::@2 +main::@2: scope:[main] from main::@1 + (void()*~) main::$0 ← & interrupt(HARDWARE_ALL)(void()) irqTop() + (word) setupRasterIrq::raster#0 ← (byte) RASTER_IRQ_TOP#0 + (void()*) setupRasterIrq::irqRoutine#0 ← (void()*~) main::$0 + call setupRasterIrq + to:main::@15 +main::@15: scope:[main] from main::@2 + (byte*~) main::$4 ← (byte*) SCREEN#0 + (number) $3e7 + (byte*) main::sc#0 ← (byte*) SCREEN#0 + to:main::@3 +main::@3: scope:[main] from main::@15 main::@3 + (byte*) main::sc#2 ← phi( main::@15/(byte*) main::sc#0 main::@3/(byte*) main::sc#1 ) + (byte~) main::$5 ← < (byte*) main::sc#2 + (number~) main::$6 ← (byte~) main::$5 & (number) $1f + (number~) main::$7 ← (byte) 'a' + (number~) main::$6 + *((byte*) main::sc#2) ← (number~) main::$7 + (byte*) main::sc#1 ← (byte*) main::sc#2 + rangenext(SCREEN#0,main::$4) + (bool~) main::$8 ← (byte*) main::sc#1 != rangelast(SCREEN#0,main::$4) + if((bool~) main::$8) goto main::@3 + to:main::@4 +main::@4: scope:[main] from main::@3 + (byte*) main::src#0 ← (byte*) SCREEN#0 + (byte*) main::dst#0 ← (byte[$3e8]) SCREEN_COPY#0 + to:main::@5 +main::@5: scope:[main] from main::@4 main::@5 + (byte*) main::dst#2 ← phi( main::@4/(byte*) main::dst#0 main::@5/(byte*) main::dst#1 ) + (byte*) main::src#2 ← phi( main::@4/(byte*) main::src#0 main::@5/(byte*) main::src#1 ) + *((byte*) main::dst#2) ← *((byte*) main::src#2) + (byte*) main::src#1 ← ++ (byte*) main::src#2 + (byte*) main::dst#1 ← ++ (byte*) main::dst#2 + (byte*~) main::$9 ← (byte*) SCREEN#0 + (number) $3e7 + (bool~) main::$10 ← (byte*) main::src#1 != (byte*~) main::$9 + if((bool~) main::$10) goto main::@5 + to:main::@6 +main::@6: scope:[main] from main::@5 + call initSquareTables + to:main::@16 +main::@16: scope:[main] from main::@6 + to:main::@7 +main::@7: scope:[main] from main::@16 main::@18 + call getCenterChar + (byte) getCenterChar::return_x#0 ← (byte) getCenterChar::return_x#2 + (byte) getCenterChar::return_y#0 ← (byte) getCenterChar::return_y#2 + (word) getCenterChar::return_dist#0 ← (word) getCenterChar::return_dist#2 + to:main::@17 +main::@17: scope:[main] from main::@7 + (word) getCenterChar::return_dist#3 ← phi( main::@7/(word) getCenterChar::return_dist#0 ) + (byte) getCenterChar::return_y#3 ← phi( main::@7/(byte) getCenterChar::return_y#0 ) + (byte) getCenterChar::return_x#3 ← phi( main::@7/(byte) getCenterChar::return_x#0 ) + (byte) main::$11_x ← (byte) getCenterChar::return_x#3 + (byte) main::$11_y ← (byte) getCenterChar::return_y#3 + (word) main::$11_dist ← (word) getCenterChar::return_dist#3 + (byte) main::center_x#0 ← (byte) main::$11_x + (byte) main::center_y#0 ← (byte) main::$11_y + (word) main::center_dist#0 ← (word) main::$11_dist + (bool~) main::$12 ← (word) main::center_dist#0 == (word) NOT_FOUND#0 + (bool~) main::$13 ← ! (bool~) main::$12 + if((bool~) main::$13) goto main::@8 + to:main::@13 +main::@8: scope:[main] from main::@17 + (word) main::center_dist#1 ← phi( main::@17/(word) main::center_dist#0 ) + (byte) main::center_y#1 ← phi( main::@17/(byte) main::center_y#0 ) + (byte) main::center_x#1 ← phi( main::@17/(byte) main::center_x#0 ) + (byte) startProcessing::center_x#0 ← (byte) main::center_x#1 + (byte) startProcessing::center_y#0 ← (byte) main::center_y#1 + (word) startProcessing::center_dist#0 ← (word) main::center_dist#1 + call startProcessing + to:main::@18 +main::@18: scope:[main] from main::@8 + if(true) goto main::@7 + to:main::@13 +main::@13: scope:[main] from main::@13 main::@17 main::@18 + (byte*~) main::$17 ← (byte*) SCREEN#0 + (number) $3e7 + *((byte*~) main::$17) ← ++ *((byte*~) main::$17) + if(true) goto main::@13 + to:main::@return +main::@return: scope:[main] from main::@13 + return + to:@return +@10: scope:[] from @9 + (struct ProcessingChar[8]) PROCESSING#0 ← { fill( 8, 0) } + to:@12 +startProcessing: scope:[startProcessing] from main::@8 + (word) startProcessing::center_dist#7 ← phi( main::@8/(word) startProcessing::center_dist#0 ) + (byte) startProcessing::center_y#7 ← phi( main::@8/(byte) startProcessing::center_y#0 ) + (byte) startProcessing::center_x#7 ← phi( main::@8/(byte) startProcessing::center_x#0 ) + (byte) startProcessing::freeIdx#0 ← (number) $ff + to:startProcessing::@1 +startProcessing::@1: scope:[startProcessing] from startProcessing startProcessing::@4 + (word) startProcessing::center_dist#6 ← phi( startProcessing/(word) startProcessing::center_dist#7 startProcessing::@4/(word) startProcessing::center_dist#2 ) + (byte) startProcessing::center_y#6 ← phi( startProcessing/(byte) startProcessing::center_y#7 startProcessing::@4/(byte) startProcessing::center_y#2 ) + (byte) startProcessing::center_x#6 ← phi( startProcessing/(byte) startProcessing::center_x#7 startProcessing::@4/(byte) startProcessing::center_x#2 ) + (byte) startProcessing::freeIdx#6 ← phi( startProcessing/(byte) startProcessing::freeIdx#0 startProcessing::@4/(byte) startProcessing::freeIdx#2 ) + (byte) startProcessing::i#0 ← (byte) 0 + to:startProcessing::@2 +startProcessing::@2: scope:[startProcessing] from startProcessing::@1 startProcessing::@3 + (word) startProcessing::center_dist#5 ← phi( startProcessing::@1/(word) startProcessing::center_dist#6 startProcessing::@3/(word) startProcessing::center_dist#3 ) + (byte) startProcessing::center_y#5 ← phi( startProcessing::@1/(byte) startProcessing::center_y#6 startProcessing::@3/(byte) startProcessing::center_y#3 ) + (byte) startProcessing::center_x#5 ← phi( startProcessing::@1/(byte) startProcessing::center_x#6 startProcessing::@3/(byte) startProcessing::center_x#3 ) + (byte) startProcessing::freeIdx#5 ← phi( startProcessing::@1/(byte) startProcessing::freeIdx#6 startProcessing::@3/(byte) startProcessing::freeIdx#4 ) + (byte) startProcessing::i#2 ← phi( startProcessing::@1/(byte) startProcessing::i#0 startProcessing::@3/(byte) startProcessing::i#1 ) + (byte~) startProcessing::$4 ← (byte) startProcessing::i#2 * (const byte) SIZEOF_STRUCT_PROCESSINGCHAR + (word*) startProcessing::$9 ← (word*)(struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (bool~) startProcessing::$0 ← *((word*) startProcessing::$9 + (byte~) startProcessing::$4) == (word) NOT_FOUND#0 + (bool~) startProcessing::$1 ← ! (bool~) startProcessing::$0 + if((bool~) startProcessing::$1) goto startProcessing::@3 + to:startProcessing::@5 +startProcessing::@3: scope:[startProcessing] from startProcessing::@2 + (word) startProcessing::center_dist#3 ← phi( startProcessing::@2/(word) startProcessing::center_dist#5 ) + (byte) startProcessing::center_y#3 ← phi( startProcessing::@2/(byte) startProcessing::center_y#5 ) + (byte) startProcessing::center_x#3 ← phi( startProcessing::@2/(byte) startProcessing::center_x#5 ) + (byte) startProcessing::freeIdx#4 ← phi( startProcessing::@2/(byte) startProcessing::freeIdx#5 ) + (byte) startProcessing::i#3 ← phi( startProcessing::@2/(byte) startProcessing::i#2 ) + (byte) startProcessing::i#1 ← (byte) startProcessing::i#3 + rangenext(0,7) + (bool~) startProcessing::$2 ← (byte) startProcessing::i#1 != rangelast(0,7) + if((bool~) startProcessing::$2) goto startProcessing::@2 + to:startProcessing::@4 +startProcessing::@5: scope:[startProcessing] from startProcessing::@2 + (word) startProcessing::center_dist#4 ← phi( startProcessing::@2/(word) startProcessing::center_dist#5 ) + (byte) startProcessing::center_y#4 ← phi( startProcessing::@2/(byte) startProcessing::center_y#5 ) + (byte) startProcessing::center_x#4 ← phi( startProcessing::@2/(byte) startProcessing::center_x#5 ) + (byte) startProcessing::i#4 ← phi( startProcessing::@2/(byte) startProcessing::i#2 ) + (byte) startProcessing::freeIdx#1 ← (byte) startProcessing::i#4 + to:startProcessing::@4 +startProcessing::@4: scope:[startProcessing] from startProcessing::@3 startProcessing::@5 + (word) startProcessing::center_dist#2 ← phi( startProcessing::@3/(word) startProcessing::center_dist#3 startProcessing::@5/(word) startProcessing::center_dist#4 ) + (byte) startProcessing::center_y#2 ← phi( startProcessing::@3/(byte) startProcessing::center_y#3 startProcessing::@5/(byte) startProcessing::center_y#4 ) + (byte) startProcessing::center_x#2 ← phi( startProcessing::@3/(byte) startProcessing::center_x#3 startProcessing::@5/(byte) startProcessing::center_x#4 ) + (byte) startProcessing::freeIdx#2 ← phi( startProcessing::@3/(byte) startProcessing::freeIdx#4 startProcessing::@5/(byte) startProcessing::freeIdx#1 ) + (bool~) startProcessing::$3 ← (byte) startProcessing::freeIdx#2 == (number) $ff + if((bool~) startProcessing::$3) goto startProcessing::@1 + to:startProcessing::@8 +startProcessing::@8: scope:[startProcessing] from startProcessing::@4 + (word) startProcessing::center_dist#1 ← phi( startProcessing::@4/(word) startProcessing::center_dist#2 ) + (byte) startProcessing::center_y#1 ← phi( startProcessing::@4/(byte) startProcessing::center_y#2 ) + (byte) startProcessing::center_x#1 ← phi( startProcessing::@4/(byte) startProcessing::center_x#2 ) + (byte) startProcessing::freeIdx#3 ← phi( startProcessing::@4/(byte) startProcessing::freeIdx#2 ) + (byte~) startProcessing::$5 ← (byte) startProcessing::freeIdx#3 * (const byte) SIZEOF_STRUCT_PROCESSINGCHAR + (byte*) startProcessing::$6 ← (byte*)(struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_X + *((byte*) startProcessing::$6 + (byte~) startProcessing::$5) ← (byte) startProcessing::center_x#1 + (byte*) startProcessing::$7 ← (byte*)(struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + *((byte*) startProcessing::$7 + (byte~) startProcessing::$5) ← (byte) startProcessing::center_y#1 + (word*) startProcessing::$8 ← (word*)(struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + *((word*) startProcessing::$8 + (byte~) startProcessing::$5) ← (word) startProcessing::center_dist#1 + to:startProcessing::@return +startProcessing::@return: scope:[startProcessing] from startProcessing::@8 + return + to:@return +processChars: scope:[processChars] from irqBottom::@2 + (byte) processChars::i#0 ← (byte) 0 + to:processChars::@1 +processChars::@1: scope:[processChars] from processChars processChars::@2 + (byte) processChars::i#2 ← phi( processChars/(byte) processChars::i#0 processChars::@2/(byte) processChars::i#1 ) + (byte~) processChars::$13 ← (byte) processChars::i#2 * (const byte) SIZEOF_STRUCT_PROCESSINGCHAR + (word*) processChars::$19 ← (word*)(struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (bool~) processChars::$0 ← *((word*) processChars::$19 + (byte~) processChars::$13) != (word) NOT_FOUND#0 + (bool~) processChars::$1 ← ! (bool~) processChars::$0 + if((bool~) processChars::$1) goto processChars::@2 + to:processChars::@8 +processChars::@2: scope:[processChars] from processChars::@1 processChars::@10 processChars::@3 processChars::@4 + (byte) processChars::i#3 ← phi( processChars::@1/(byte) processChars::i#2 processChars::@10/(byte) processChars::i#6 processChars::@3/(byte) processChars::i#5 processChars::@4/(byte) processChars::i#7 ) + (byte) processChars::i#1 ← (byte) processChars::i#3 + rangenext(0,7) + (bool~) processChars::$12 ← (byte) processChars::i#1 != rangelast(0,7) + if((bool~) processChars::$12) goto processChars::@1 + to:processChars::@return +processChars::@8: scope:[processChars] from processChars::@1 + (byte) processChars::i#4 ← phi( processChars::@1/(byte) processChars::i#2 ) + (byte~) processChars::$14 ← (byte) processChars::i#4 * (const byte) SIZEOF_STRUCT_PROCESSINGCHAR + (byte*) processChars::$16 ← (byte*)(struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_X + (byte) processChars::processing_x#0 ← *((byte*) processChars::$16 + (byte~) processChars::$14) + (byte*) processChars::$17 ← (byte*)(struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte) processChars::processing_y#0 ← *((byte*) processChars::$17 + (byte~) processChars::$14) + (word~) processChars::$2 ← ((word)) (byte) processChars::processing_y#0 + (number~) processChars::$3 ← (word~) processChars::$2 * (number) $28 + (byte*~) processChars::$4 ← (byte*) COLS#0 + (number~) processChars::$3 + (byte*~) processChars::$5 ← (byte*~) processChars::$4 + (byte) processChars::processing_x#0 + *((byte*~) processChars::$5) ← (byte) WHITE#0 + (word~) processChars::$6 ← ((word)) (byte) processChars::processing_y#0 + (number~) processChars::$7 ← (word~) processChars::$6 * (number) $28 + (byte*~) processChars::$8 ← (byte*) SCREEN#0 + (number~) processChars::$7 + (byte*~) processChars::$9 ← (byte*~) processChars::$8 + (byte) processChars::processing_x#0 + (byte*) processChars::processing_ptr#0 ← (byte*~) processChars::$9 + (bool~) processChars::$10 ← *((byte*) processChars::processing_ptr#0) == (byte) ' ' + if((bool~) processChars::$10) goto processChars::@3 + to:processChars::@9 +processChars::@3: scope:[processChars] from processChars::@8 + (byte) processChars::i#5 ← phi( processChars::@8/(byte) processChars::i#4 ) + (byte~) processChars::$15 ← (byte) processChars::i#5 * (const byte) SIZEOF_STRUCT_PROCESSINGCHAR + (word*) processChars::$20 ← (word*)(struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + *((word*) processChars::$20 + (byte~) processChars::$15) ← (word) NOT_FOUND#0 + to:processChars::@2 +processChars::@9: scope:[processChars] from processChars::@8 + (byte) processChars::i#8 ← phi( processChars::@8/(byte) processChars::i#4 ) + (byte*) processChars::processing_ptr#1 ← phi( processChars::@8/(byte*) processChars::processing_ptr#0 ) + (bool~) processChars::$11 ← *((byte*) processChars::processing_ptr#1) > (byte) ' ' + if((bool~) processChars::$11) goto processChars::@4 + to:processChars::@10 +processChars::@4: scope:[processChars] from processChars::@9 + (byte) processChars::i#7 ← phi( processChars::@9/(byte) processChars::i#8 ) + (byte*) processChars::processing_ptr#2 ← phi( processChars::@9/(byte*) processChars::processing_ptr#1 ) + *((byte*) processChars::processing_ptr#2) ← -- *((byte*) processChars::processing_ptr#2) + to:processChars::@2 +processChars::@10: scope:[processChars] from processChars::@9 + (byte) processChars::i#6 ← phi( processChars::@9/(byte) processChars::i#8 ) + (byte*) processChars::processing_ptr#3 ← phi( processChars::@9/(byte*) processChars::processing_ptr#1 ) + *((byte*) processChars::processing_ptr#3) ← ++ *((byte*) processChars::processing_ptr#3) + to:processChars::@2 +processChars::@return: scope:[processChars] from processChars::@2 + return + to:@return +@12: scope:[] from @10 + (word[$28]) SQUARES_X#0 ← { fill( $28, 0) } + (word[$19]) SQUARES_Y#0 ← { fill( $19, 0) } + to:@15 +initSquareTables: scope:[initSquareTables] from main::@6 + (byte) initSquareTables::x#0 ← (byte) 0 + to:initSquareTables::@1 +initSquareTables::@1: scope:[initSquareTables] from initSquareTables initSquareTables::@15 + (byte) initSquareTables::x#2 ← phi( initSquareTables/(byte) initSquareTables::x#0 initSquareTables::@15/(byte) initSquareTables::x#1 ) + (bool~) initSquareTables::$0 ← (byte) initSquareTables::x#2 < (number) $14 + if((bool~) initSquareTables::$0) goto initSquareTables::@2 + to:initSquareTables::@3 +initSquareTables::@2: scope:[initSquareTables] from initSquareTables::@1 + (byte) initSquareTables::x#3 ← phi( initSquareTables::@1/(byte) initSquareTables::x#2 ) + (number~) initSquareTables::$3 ← (number) $14 - (byte) initSquareTables::x#3 + (number~) initSquareTables::$4 ← (number~) initSquareTables::$3 + to:initSquareTables::@4 +initSquareTables::@3: scope:[initSquareTables] from initSquareTables::@1 + (byte) initSquareTables::x#4 ← phi( initSquareTables::@1/(byte) initSquareTables::x#2 ) + (number~) initSquareTables::$1 ← (byte) initSquareTables::x#4 - (number) $14 + (number~) initSquareTables::$2 ← (number~) initSquareTables::$1 + to:initSquareTables::@4 +initSquareTables::@4: scope:[initSquareTables] from initSquareTables::@2 initSquareTables::@3 + (byte) initSquareTables::x#6 ← phi( initSquareTables::@2/(byte) initSquareTables::x#3 initSquareTables::@3/(byte) initSquareTables::x#4 ) + (number~) initSquareTables::$5 ← phi( initSquareTables::@2/(number~) initSquareTables::$4 initSquareTables::@3/(number~) initSquareTables::$2 ) + (byte) initSquareTables::x_dist#0 ← (number~) initSquareTables::$5 + (byte) mul8u::a#1 ← (byte) initSquareTables::x_dist#0 + (byte) mul8u::b#0 ← (byte) initSquareTables::x_dist#0 + call mul8u + (word) mul8u::return#2 ← (word) mul8u::return#1 + to:initSquareTables::@15 +initSquareTables::@15: scope:[initSquareTables] from initSquareTables::@4 + (byte) initSquareTables::x#5 ← phi( initSquareTables::@4/(byte) initSquareTables::x#6 ) + (word) mul8u::return#5 ← phi( initSquareTables::@4/(word) mul8u::return#2 ) + (word~) initSquareTables::$6 ← (word) mul8u::return#5 + (byte~) initSquareTables::$16 ← (byte) initSquareTables::x#5 * (const byte) SIZEOF_WORD + *((word[$28]) SQUARES_X#0 + (byte~) initSquareTables::$16) ← (word~) initSquareTables::$6 + (byte) initSquareTables::x#1 ← (byte) initSquareTables::x#5 + rangenext(0,$27) + (bool~) initSquareTables::$7 ← (byte) initSquareTables::x#1 != rangelast(0,$27) + if((bool~) initSquareTables::$7) goto initSquareTables::@1 + to:initSquareTables::@7 +initSquareTables::@7: scope:[initSquareTables] from initSquareTables::@15 + (byte) initSquareTables::y#0 ← (byte) 0 + to:initSquareTables::@8 +initSquareTables::@8: scope:[initSquareTables] from initSquareTables::@16 initSquareTables::@7 + (byte) initSquareTables::y#2 ← phi( initSquareTables::@16/(byte) initSquareTables::y#1 initSquareTables::@7/(byte) initSquareTables::y#0 ) + (bool~) initSquareTables::$8 ← (byte) initSquareTables::y#2 < (number) $c + if((bool~) initSquareTables::$8) goto initSquareTables::@9 + to:initSquareTables::@10 +initSquareTables::@9: scope:[initSquareTables] from initSquareTables::@8 + (byte) initSquareTables::y#3 ← phi( initSquareTables::@8/(byte) initSquareTables::y#2 ) + (number~) initSquareTables::$11 ← (number) $c - (byte) initSquareTables::y#3 + (number~) initSquareTables::$12 ← (number~) initSquareTables::$11 + to:initSquareTables::@11 +initSquareTables::@10: scope:[initSquareTables] from initSquareTables::@8 + (byte) initSquareTables::y#4 ← phi( initSquareTables::@8/(byte) initSquareTables::y#2 ) + (number~) initSquareTables::$9 ← (byte) initSquareTables::y#4 - (number) $c + (number~) initSquareTables::$10 ← (number~) initSquareTables::$9 + to:initSquareTables::@11 +initSquareTables::@11: scope:[initSquareTables] from initSquareTables::@10 initSquareTables::@9 + (byte) initSquareTables::y#6 ← phi( initSquareTables::@10/(byte) initSquareTables::y#4 initSquareTables::@9/(byte) initSquareTables::y#3 ) + (number~) initSquareTables::$13 ← phi( initSquareTables::@9/(number~) initSquareTables::$12 initSquareTables::@10/(number~) initSquareTables::$10 ) + (byte) initSquareTables::y_dist#0 ← (number~) initSquareTables::$13 + (byte) mul8u::a#2 ← (byte) initSquareTables::y_dist#0 + (byte) mul8u::b#1 ← (byte) initSquareTables::y_dist#0 + call mul8u + (word) mul8u::return#3 ← (word) mul8u::return#1 + to:initSquareTables::@16 +initSquareTables::@16: scope:[initSquareTables] from initSquareTables::@11 + (byte) initSquareTables::y#5 ← phi( initSquareTables::@11/(byte) initSquareTables::y#6 ) + (word) mul8u::return#6 ← phi( initSquareTables::@11/(word) mul8u::return#3 ) + (word~) initSquareTables::$14 ← (word) mul8u::return#6 + (byte~) initSquareTables::$17 ← (byte) initSquareTables::y#5 * (const byte) SIZEOF_WORD + *((word[$19]) SQUARES_Y#0 + (byte~) initSquareTables::$17) ← (word~) initSquareTables::$14 + (byte) initSquareTables::y#1 ← (byte) initSquareTables::y#5 + rangenext(0,$18) + (bool~) initSquareTables::$15 ← (byte) initSquareTables::y#1 != rangelast(0,$18) + if((bool~) initSquareTables::$15) goto initSquareTables::@8 + to:initSquareTables::@return +initSquareTables::@return: scope:[initSquareTables] from initSquareTables::@16 + return + to:@return +getCenterChar: scope:[getCenterChar] from main::@7 + (byte) getCenterChar::closest_x#0 ← (number) 0 + (byte) getCenterChar::closest_y#0 ← (number) 0 + (word) getCenterChar::closest_dist#0 ← (word) NOT_FOUND#0 + (byte*) getCenterChar::screen_line#0 ← (byte[$3e8]) SCREEN_COPY#0 + (byte) getCenterChar::y#0 ← (byte) 0 + to:getCenterChar::@3 +getCenterChar::@3: scope:[getCenterChar] from getCenterChar getCenterChar::@9 + (byte) getCenterChar::closest_y#9 ← phi( getCenterChar/(byte) getCenterChar::closest_y#0 getCenterChar::@9/(byte) getCenterChar::closest_y#5 ) + (byte) getCenterChar::closest_x#9 ← phi( getCenterChar/(byte) getCenterChar::closest_x#0 getCenterChar::@9/(byte) getCenterChar::closest_x#5 ) + (word) getCenterChar::closest_dist#8 ← phi( getCenterChar/(word) getCenterChar::closest_dist#0 getCenterChar::@9/(word) getCenterChar::closest_dist#6 ) + (byte) getCenterChar::y#7 ← phi( getCenterChar/(byte) getCenterChar::y#0 getCenterChar::@9/(byte) getCenterChar::y#1 ) + (byte*) getCenterChar::screen_line#4 ← phi( getCenterChar/(byte*) getCenterChar::screen_line#0 getCenterChar::@9/(byte*) getCenterChar::screen_line#1 ) + (byte) getCenterChar::x#0 ← (byte) 0 + to:getCenterChar::@4 +getCenterChar::@4: scope:[getCenterChar] from getCenterChar::@3 getCenterChar::@5 + (byte) getCenterChar::closest_y#7 ← phi( getCenterChar::@3/(byte) getCenterChar::closest_y#9 getCenterChar::@5/(byte) getCenterChar::closest_y#6 ) + (byte) getCenterChar::closest_x#7 ← phi( getCenterChar::@3/(byte) getCenterChar::closest_x#9 getCenterChar::@5/(byte) getCenterChar::closest_x#6 ) + (word) getCenterChar::closest_dist#5 ← phi( getCenterChar::@3/(word) getCenterChar::closest_dist#8 getCenterChar::@5/(word) getCenterChar::closest_dist#9 ) + (byte) getCenterChar::y#5 ← phi( getCenterChar::@3/(byte) getCenterChar::y#7 getCenterChar::@5/(byte) getCenterChar::y#6 ) + (byte) getCenterChar::x#2 ← phi( getCenterChar::@3/(byte) getCenterChar::x#0 getCenterChar::@5/(byte) getCenterChar::x#1 ) + (byte*) getCenterChar::screen_line#2 ← phi( getCenterChar::@3/(byte*) getCenterChar::screen_line#4 getCenterChar::@5/(byte*) getCenterChar::screen_line#5 ) + (bool~) getCenterChar::$2 ← *((byte*) getCenterChar::screen_line#2 + (byte) getCenterChar::x#2) != (byte) ' ' + (bool~) getCenterChar::$3 ← ! (bool~) getCenterChar::$2 + if((bool~) getCenterChar::$3) goto getCenterChar::@5 + to:getCenterChar::@7 +getCenterChar::@5: scope:[getCenterChar] from getCenterChar::@4 getCenterChar::@7 getCenterChar::@8 + (byte) getCenterChar::closest_y#6 ← phi( getCenterChar::@4/(byte) getCenterChar::closest_y#7 getCenterChar::@7/(byte) getCenterChar::closest_y#8 getCenterChar::@8/(byte) getCenterChar::closest_y#1 ) + (byte) getCenterChar::closest_x#6 ← phi( getCenterChar::@4/(byte) getCenterChar::closest_x#7 getCenterChar::@7/(byte) getCenterChar::closest_x#8 getCenterChar::@8/(byte) getCenterChar::closest_x#1 ) + (word) getCenterChar::closest_dist#9 ← phi( getCenterChar::@4/(word) getCenterChar::closest_dist#5 getCenterChar::@7/(word) getCenterChar::closest_dist#2 getCenterChar::@8/(word) getCenterChar::closest_dist#1 ) + (byte) getCenterChar::y#6 ← phi( getCenterChar::@4/(byte) getCenterChar::y#5 getCenterChar::@7/(byte) getCenterChar::y#2 getCenterChar::@8/(byte) getCenterChar::y#3 ) + (byte*) getCenterChar::screen_line#5 ← phi( getCenterChar::@4/(byte*) getCenterChar::screen_line#2 getCenterChar::@7/(byte*) getCenterChar::screen_line#6 getCenterChar::@8/(byte*) getCenterChar::screen_line#7 ) + (byte) getCenterChar::x#3 ← phi( getCenterChar::@4/(byte) getCenterChar::x#2 getCenterChar::@7/(byte) getCenterChar::x#4 getCenterChar::@8/(byte) getCenterChar::x#5 ) + (byte) getCenterChar::x#1 ← (byte) getCenterChar::x#3 + rangenext(0,$27) + (bool~) getCenterChar::$7 ← (byte) getCenterChar::x#1 != rangelast(0,$27) + if((bool~) getCenterChar::$7) goto getCenterChar::@4 + to:getCenterChar::@9 +getCenterChar::@7: scope:[getCenterChar] from getCenterChar::@4 + (byte) getCenterChar::closest_y#8 ← phi( getCenterChar::@4/(byte) getCenterChar::closest_y#7 ) + (byte) getCenterChar::closest_x#8 ← phi( getCenterChar::@4/(byte) getCenterChar::closest_x#7 ) + (byte*) getCenterChar::screen_line#6 ← phi( getCenterChar::@4/(byte*) getCenterChar::screen_line#2 ) + (word) getCenterChar::closest_dist#2 ← phi( getCenterChar::@4/(word) getCenterChar::closest_dist#5 ) + (byte) getCenterChar::y#2 ← phi( getCenterChar::@4/(byte) getCenterChar::y#5 ) + (byte) getCenterChar::x#4 ← phi( getCenterChar::@4/(byte) getCenterChar::x#2 ) + (byte~) getCenterChar::$13 ← (byte) getCenterChar::x#4 * (const byte) SIZEOF_WORD + (byte~) getCenterChar::$14 ← (byte) getCenterChar::y#2 * (const byte) SIZEOF_WORD + (word~) getCenterChar::$4 ← *((word[$28]) SQUARES_X#0 + (byte~) getCenterChar::$13) + *((word[$19]) SQUARES_Y#0 + (byte~) getCenterChar::$14) + (word) getCenterChar::dist#0 ← (word~) getCenterChar::$4 + (bool~) getCenterChar::$5 ← (word) getCenterChar::dist#0 < (word) getCenterChar::closest_dist#2 + (bool~) getCenterChar::$6 ← ! (bool~) getCenterChar::$5 + if((bool~) getCenterChar::$6) goto getCenterChar::@5 + to:getCenterChar::@8 +getCenterChar::@8: scope:[getCenterChar] from getCenterChar::@7 + (byte*) getCenterChar::screen_line#7 ← phi( getCenterChar::@7/(byte*) getCenterChar::screen_line#6 ) + (word) getCenterChar::dist#1 ← phi( getCenterChar::@7/(word) getCenterChar::dist#0 ) + (byte) getCenterChar::y#3 ← phi( getCenterChar::@7/(byte) getCenterChar::y#2 ) + (byte) getCenterChar::x#5 ← phi( getCenterChar::@7/(byte) getCenterChar::x#4 ) + (byte) getCenterChar::closest_x#1 ← (byte) getCenterChar::x#5 + (byte) getCenterChar::closest_y#1 ← (byte) getCenterChar::y#3 + (word) getCenterChar::closest_dist#1 ← (word) getCenterChar::dist#1 + to:getCenterChar::@5 +getCenterChar::@9: scope:[getCenterChar] from getCenterChar::@5 + (byte) getCenterChar::closest_y#5 ← phi( getCenterChar::@5/(byte) getCenterChar::closest_y#6 ) + (byte) getCenterChar::closest_x#5 ← phi( getCenterChar::@5/(byte) getCenterChar::closest_x#6 ) + (word) getCenterChar::closest_dist#6 ← phi( getCenterChar::@5/(word) getCenterChar::closest_dist#9 ) + (byte) getCenterChar::y#4 ← phi( getCenterChar::@5/(byte) getCenterChar::y#6 ) + (byte*) getCenterChar::screen_line#3 ← phi( getCenterChar::@5/(byte*) getCenterChar::screen_line#5 ) + (byte*) getCenterChar::screen_line#1 ← (byte*) getCenterChar::screen_line#3 + (number) $28 + (byte) getCenterChar::y#1 ← (byte) getCenterChar::y#4 + rangenext(0,$18) + (bool~) getCenterChar::$8 ← (byte) getCenterChar::y#1 != rangelast(0,$18) + if((bool~) getCenterChar::$8) goto getCenterChar::@3 + to:getCenterChar::@10 +getCenterChar::@10: scope:[getCenterChar] from getCenterChar::@9 + (byte) getCenterChar::closest_y#4 ← phi( getCenterChar::@9/(byte) getCenterChar::closest_y#5 ) + (byte) getCenterChar::closest_x#4 ← phi( getCenterChar::@9/(byte) getCenterChar::closest_x#5 ) + (word) getCenterChar::closest_dist#3 ← phi( getCenterChar::@9/(word) getCenterChar::closest_dist#6 ) + (bool~) getCenterChar::$0 ← (word) getCenterChar::closest_dist#3 != (word) NOT_FOUND#0 + (bool~) getCenterChar::$1 ← ! (bool~) getCenterChar::$0 + if((bool~) getCenterChar::$1) goto getCenterChar::@1 + to:getCenterChar::@11 +getCenterChar::@1: scope:[getCenterChar] from getCenterChar::@10 getCenterChar::@11 + (word) getCenterChar::closest_dist#4 ← phi( getCenterChar::@10/(word) getCenterChar::closest_dist#3 getCenterChar::@11/(word) getCenterChar::closest_dist#7 ) + (byte) getCenterChar::closest_y#2 ← phi( getCenterChar::@10/(byte) getCenterChar::closest_y#4 getCenterChar::@11/(byte) getCenterChar::closest_y#3 ) + (byte) getCenterChar::closest_x#2 ← phi( getCenterChar::@10/(byte) getCenterChar::closest_x#4 getCenterChar::@11/(byte) getCenterChar::closest_x#3 ) + (byte) getCenterChar::return_x#1 ← (byte) getCenterChar::closest_x#2 + (byte) getCenterChar::return_y#1 ← (byte) getCenterChar::closest_y#2 + (word) getCenterChar::return_dist#1 ← (word) getCenterChar::closest_dist#4 + to:getCenterChar::@return +getCenterChar::@11: scope:[getCenterChar] from getCenterChar::@10 + (word) getCenterChar::closest_dist#7 ← phi( getCenterChar::@10/(word) getCenterChar::closest_dist#3 ) + (byte) getCenterChar::closest_x#3 ← phi( getCenterChar::@10/(byte) getCenterChar::closest_x#4 ) + (byte) getCenterChar::closest_y#3 ← phi( getCenterChar::@10/(byte) getCenterChar::closest_y#4 ) + (word~) getCenterChar::$9 ← ((word)) (byte) getCenterChar::closest_y#3 + (number~) getCenterChar::$10 ← (word~) getCenterChar::$9 * (number) $28 + (byte*~) getCenterChar::$11 ← (byte[$3e8]) SCREEN_COPY#0 + (number~) getCenterChar::$10 + (byte*~) getCenterChar::$12 ← (byte*~) getCenterChar::$11 + (byte) getCenterChar::closest_x#3 + *((byte*~) getCenterChar::$12) ← (byte) ' ' + to:getCenterChar::@1 +getCenterChar::@return: scope:[getCenterChar] from getCenterChar::@1 + (word) getCenterChar::return_dist#4 ← phi( getCenterChar::@1/(word) getCenterChar::return_dist#1 ) + (byte) getCenterChar::return_y#4 ← phi( getCenterChar::@1/(byte) getCenterChar::return_y#1 ) + (byte) getCenterChar::return_x#4 ← phi( getCenterChar::@1/(byte) getCenterChar::return_x#1 ) + (byte) getCenterChar::return_x#2 ← (byte) getCenterChar::return_x#4 + (byte) getCenterChar::return_y#2 ← (byte) getCenterChar::return_y#4 + (word) getCenterChar::return_dist#2 ← (word) getCenterChar::return_dist#4 + return + to:@return +setupRasterIrq: scope:[setupRasterIrq] from main::@2 + (void()*) setupRasterIrq::irqRoutine#4 ← phi( main::@2/(void()*) setupRasterIrq::irqRoutine#0 ) + (word) setupRasterIrq::raster#1 ← phi( main::@2/(word) setupRasterIrq::raster#0 ) + asm { sei } + *((byte*) PROCPORT_DDR#0) ← (byte) PROCPORT_DDR_MEMORY_MASK#0 + *((byte*) PROCPORT#0) ← (byte) PROCPORT_RAM_IO#0 + *((byte*) CIA1_INTERRUPT#0) ← (byte) CIA_INTERRUPT_CLEAR#0 + (bool~) setupRasterIrq::$0 ← (word) setupRasterIrq::raster#1 < (number) $100 + if((bool~) setupRasterIrq::$0) goto setupRasterIrq::@1 + to:setupRasterIrq::@3 +setupRasterIrq::@1: scope:[setupRasterIrq] from setupRasterIrq + (void()*) setupRasterIrq::irqRoutine#2 ← phi( setupRasterIrq/(void()*) setupRasterIrq::irqRoutine#4 ) + (word) setupRasterIrq::raster#3 ← phi( setupRasterIrq/(word) setupRasterIrq::raster#1 ) + *((byte*) VIC_CONTROL#0) ← *((byte*) VIC_CONTROL#0) & (number) $7f + to:setupRasterIrq::@2 +setupRasterIrq::@3: scope:[setupRasterIrq] from setupRasterIrq + (void()*) setupRasterIrq::irqRoutine#3 ← phi( setupRasterIrq/(void()*) setupRasterIrq::irqRoutine#4 ) + (word) setupRasterIrq::raster#4 ← phi( setupRasterIrq/(word) setupRasterIrq::raster#1 ) + *((byte*) VIC_CONTROL#0) ← *((byte*) VIC_CONTROL#0) | (number) $80 + to:setupRasterIrq::@2 +setupRasterIrq::@2: scope:[setupRasterIrq] from setupRasterIrq::@1 setupRasterIrq::@3 + (void()*) setupRasterIrq::irqRoutine#1 ← phi( setupRasterIrq::@1/(void()*) setupRasterIrq::irqRoutine#2 setupRasterIrq::@3/(void()*) setupRasterIrq::irqRoutine#3 ) + (word) setupRasterIrq::raster#2 ← phi( setupRasterIrq::@1/(word) setupRasterIrq::raster#3 setupRasterIrq::@3/(word) setupRasterIrq::raster#4 ) + (byte~) setupRasterIrq::$1 ← < (word) setupRasterIrq::raster#2 + *((byte*) RASTER#0) ← (byte~) setupRasterIrq::$1 + *((byte*) IRQ_ENABLE#0) ← (byte) IRQ_RASTER#0 + *((void()**) HARDWARE_IRQ#0) ← (void()*) setupRasterIrq::irqRoutine#1 + asm { cli } + to:setupRasterIrq::@return +setupRasterIrq::@return: scope:[setupRasterIrq] from setupRasterIrq::@2 + return + to:@return +@15: scope:[] from @12 + (byte) RASTER_IRQ_TOP#0 ← (number) $30 + to:@16 +irqTop: scope:[irqTop] from + (byte) irqTop::i#0 ← (byte) 0 + to:irqTop::@1 +irqTop::@1: scope:[irqTop] from irqTop irqTop::@1 + (byte) irqTop::i#2 ← phi( irqTop/(byte) irqTop::i#0 irqTop::@1/(byte) irqTop::i#1 ) + (byte) irqTop::i#1 ← (byte) irqTop::i#2 + rangenext(0,4) + (bool~) irqTop::$1 ← (byte) irqTop::i#1 != rangelast(0,4) + if((bool~) irqTop::$1) goto irqTop::@1 + to:irqTop::@2 +irqTop::@2: scope:[irqTop] from irqTop::@1 + *((byte*) BORDERCOL#0) ← (byte) WHITE#0 + *((byte*) BGCOL#0) ← (byte) WHITE#0 + (byte) irqTop::i1#0 ← (byte) 0 + to:irqTop::@3 +irqTop::@3: scope:[irqTop] from irqTop::@2 irqTop::@3 + (byte) irqTop::i1#2 ← phi( irqTop::@2/(byte) irqTop::i1#0 irqTop::@3/(byte) irqTop::i1#1 ) + (byte) irqTop::i1#1 ← (byte) irqTop::i1#2 + rangenext(0,7) + (bool~) irqTop::$2 ← (byte) irqTop::i1#1 != rangelast(0,7) + if((bool~) irqTop::$2) goto irqTop::@3 + to:irqTop::@4 +irqTop::@4: scope:[irqTop] from irqTop::@3 + *((byte*) BORDERCOL#0) ← (byte) LIGHT_BLUE#0 + *((byte*) BGCOL#0) ← (byte) BLUE#0 + *((byte*) RASTER#0) ← (byte) RASTER_IRQ_MIDDLE#0 + (void()*~) irqTop::$0 ← & interrupt(HARDWARE_ALL)(void()) irqBottom() + *((void()**) HARDWARE_IRQ#0) ← (void()*~) irqTop::$0 + *((byte*) IRQ_STATUS#0) ← (byte) IRQ_RASTER#0 + to:irqTop::@return +irqTop::@return: scope:[irqTop] from irqTop::@4 + return + to:@return +@16: scope:[] from @15 + (byte) RASTER_IRQ_MIDDLE#0 ← (number) $ff + to:@17 +irqBottom: scope:[irqBottom] from + (byte) irqBottom::i#0 ← (byte) 0 + to:irqBottom::@1 +irqBottom::@1: scope:[irqBottom] from irqBottom irqBottom::@1 + (byte) irqBottom::i#2 ← phi( irqBottom/(byte) irqBottom::i#0 irqBottom::@1/(byte) irqBottom::i#1 ) + (byte) irqBottom::i#1 ← (byte) irqBottom::i#2 + rangenext(0,4) + (bool~) irqBottom::$2 ← (byte) irqBottom::i#1 != rangelast(0,4) + if((bool~) irqBottom::$2) goto irqBottom::@1 + to:irqBottom::@2 +irqBottom::@2: scope:[irqBottom] from irqBottom::@1 + *((byte*) BORDERCOL#0) ← (byte) WHITE#0 + *((byte*) BGCOL#0) ← (byte) WHITE#0 + call processChars + to:irqBottom::@3 +irqBottom::@3: scope:[irqBottom] from irqBottom::@2 + *((byte*) BORDERCOL#0) ← (byte) LIGHT_BLUE#0 + *((byte*) BGCOL#0) ← (byte) BLUE#0 + *((byte*) RASTER#0) ← (byte) RASTER_IRQ_TOP#0 + (void()*~) irqBottom::$1 ← & interrupt(HARDWARE_ALL)(void()) irqTop() + *((void()**) HARDWARE_IRQ#0) ← (void()*~) irqBottom::$1 + *((byte*) IRQ_STATUS#0) ← (byte) IRQ_RASTER#0 + to:irqBottom::@return +irqBottom::@return: scope:[irqBottom] from irqBottom::@3 + return + to:@return +@17: scope:[] from @16 + call main + to:@18 +@18: scope:[] from @17 + to:@end +@end: scope:[] from @18 + +SYMBOL TABLE SSA +(label) @10 +(label) @12 +(label) @15 +(label) @16 +(label) @17 +(label) @18 +(label) @9 +(label) @begin +(label) @end +(byte*) BGCOL +(byte*) BGCOL#0 +(byte) BLUE +(byte) BLUE#0 +(byte*) BORDERCOL +(byte*) BORDERCOL#0 +(byte*) CIA1_INTERRUPT +(byte*) CIA1_INTERRUPT#0 +(byte) CIA_INTERRUPT_CLEAR +(byte) CIA_INTERRUPT_CLEAR#0 +(byte*) COLS +(byte*) COLS#0 +(void()**) HARDWARE_IRQ +(void()**) HARDWARE_IRQ#0 +(byte*) IRQ_ENABLE +(byte*) IRQ_ENABLE#0 +(byte) IRQ_RASTER +(byte) IRQ_RASTER#0 +(byte*) IRQ_STATUS +(byte*) IRQ_STATUS#0 +(byte) LIGHT_BLUE +(byte) LIGHT_BLUE#0 +(word) NOT_FOUND +(word) NOT_FOUND#0 +(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST = (byte) 2 +(const byte) OFFSET_STRUCT_PROCESSINGCHAR_X = (byte) 0 +(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y = (byte) 1 +(struct ProcessingChar[8]) PROCESSING +(struct ProcessingChar[8]) PROCESSING#0 +(byte*) PROCPORT +(byte*) PROCPORT#0 +(byte*) PROCPORT_DDR +(byte*) PROCPORT_DDR#0 +(byte) PROCPORT_DDR_MEMORY_MASK +(byte) PROCPORT_DDR_MEMORY_MASK#0 +(byte) PROCPORT_RAM_IO +(byte) PROCPORT_RAM_IO#0 +(word) ProcessingChar::dist +(byte) ProcessingChar::x +(byte) ProcessingChar::y +(byte*) RASTER +(byte*) RASTER#0 +(byte) RASTER_IRQ_MIDDLE +(byte) RASTER_IRQ_MIDDLE#0 +(byte) RASTER_IRQ_TOP +(byte) RASTER_IRQ_TOP#0 +(byte*) SCREEN +(byte*) SCREEN#0 +(byte[$3e8]) SCREEN_COPY +(byte[$3e8]) SCREEN_COPY#0 +(const byte) SIZEOF_STRUCT_PROCESSINGCHAR = (byte) 4 +(const byte) SIZEOF_WORD = (byte) 2 +(word[$28]) SQUARES_X +(word[$28]) SQUARES_X#0 +(word[$19]) SQUARES_Y +(word[$19]) SQUARES_Y#0 +(byte*) VIC_CONTROL +(byte*) VIC_CONTROL#0 +(byte) WHITE +(byte) WHITE#0 +(struct ProcessingChar()) getCenterChar() +(bool~) getCenterChar::$0 +(bool~) getCenterChar::$1 +(number~) getCenterChar::$10 +(byte*~) getCenterChar::$11 +(byte*~) getCenterChar::$12 +(byte~) getCenterChar::$13 +(byte~) getCenterChar::$14 +(bool~) getCenterChar::$2 +(bool~) getCenterChar::$3 +(word~) getCenterChar::$4 +(bool~) getCenterChar::$5 +(bool~) getCenterChar::$6 +(bool~) getCenterChar::$7 +(bool~) getCenterChar::$8 +(word~) getCenterChar::$9 +(label) getCenterChar::@1 +(label) getCenterChar::@10 +(label) getCenterChar::@11 +(label) getCenterChar::@3 +(label) getCenterChar::@4 +(label) getCenterChar::@5 +(label) getCenterChar::@7 +(label) getCenterChar::@8 +(label) getCenterChar::@9 +(label) getCenterChar::@return +(struct ProcessingChar) getCenterChar::closest +(word) getCenterChar::closest_dist +(word) getCenterChar::closest_dist#0 +(word) getCenterChar::closest_dist#1 +(word) getCenterChar::closest_dist#2 +(word) getCenterChar::closest_dist#3 +(word) getCenterChar::closest_dist#4 +(word) getCenterChar::closest_dist#5 +(word) getCenterChar::closest_dist#6 +(word) getCenterChar::closest_dist#7 +(word) getCenterChar::closest_dist#8 +(word) getCenterChar::closest_dist#9 +(byte) getCenterChar::closest_x +(byte) getCenterChar::closest_x#0 +(byte) getCenterChar::closest_x#1 +(byte) getCenterChar::closest_x#2 +(byte) getCenterChar::closest_x#3 +(byte) getCenterChar::closest_x#4 +(byte) getCenterChar::closest_x#5 +(byte) getCenterChar::closest_x#6 +(byte) getCenterChar::closest_x#7 +(byte) getCenterChar::closest_x#8 +(byte) getCenterChar::closest_x#9 +(byte) getCenterChar::closest_y +(byte) getCenterChar::closest_y#0 +(byte) getCenterChar::closest_y#1 +(byte) getCenterChar::closest_y#2 +(byte) getCenterChar::closest_y#3 +(byte) getCenterChar::closest_y#4 +(byte) getCenterChar::closest_y#5 +(byte) getCenterChar::closest_y#6 +(byte) getCenterChar::closest_y#7 +(byte) getCenterChar::closest_y#8 +(byte) getCenterChar::closest_y#9 +(word) getCenterChar::dist +(word) getCenterChar::dist#0 +(word) getCenterChar::dist#1 +(struct ProcessingChar) getCenterChar::return +(word) getCenterChar::return_dist +(word) getCenterChar::return_dist#0 +(word) getCenterChar::return_dist#1 +(word) getCenterChar::return_dist#2 +(word) getCenterChar::return_dist#3 +(word) getCenterChar::return_dist#4 +(byte) getCenterChar::return_x +(byte) getCenterChar::return_x#0 +(byte) getCenterChar::return_x#1 +(byte) getCenterChar::return_x#2 +(byte) getCenterChar::return_x#3 +(byte) getCenterChar::return_x#4 +(byte) getCenterChar::return_y +(byte) getCenterChar::return_y#0 +(byte) getCenterChar::return_y#1 +(byte) getCenterChar::return_y#2 +(byte) getCenterChar::return_y#3 +(byte) getCenterChar::return_y#4 +(byte*) getCenterChar::screen_line +(byte*) getCenterChar::screen_line#0 +(byte*) getCenterChar::screen_line#1 +(byte*) getCenterChar::screen_line#2 +(byte*) getCenterChar::screen_line#3 +(byte*) getCenterChar::screen_line#4 +(byte*) getCenterChar::screen_line#5 +(byte*) getCenterChar::screen_line#6 +(byte*) getCenterChar::screen_line#7 +(byte) getCenterChar::x +(byte) getCenterChar::x#0 +(byte) getCenterChar::x#1 +(byte) getCenterChar::x#2 +(byte) getCenterChar::x#3 +(byte) getCenterChar::x#4 +(byte) getCenterChar::x#5 +(byte) getCenterChar::y +(byte) getCenterChar::y#0 +(byte) getCenterChar::y#1 +(byte) getCenterChar::y#2 +(byte) getCenterChar::y#3 +(byte) getCenterChar::y#4 +(byte) getCenterChar::y#5 +(byte) getCenterChar::y#6 +(byte) getCenterChar::y#7 +(void()) initSquareTables() +(bool~) initSquareTables::$0 +(number~) initSquareTables::$1 +(number~) initSquareTables::$10 +(number~) initSquareTables::$11 +(number~) initSquareTables::$12 +(number~) initSquareTables::$13 +(word~) initSquareTables::$14 +(bool~) initSquareTables::$15 +(byte~) initSquareTables::$16 +(byte~) initSquareTables::$17 +(number~) initSquareTables::$2 +(number~) initSquareTables::$3 +(number~) initSquareTables::$4 +(number~) initSquareTables::$5 +(word~) initSquareTables::$6 +(bool~) initSquareTables::$7 +(bool~) initSquareTables::$8 +(number~) initSquareTables::$9 +(label) initSquareTables::@1 +(label) initSquareTables::@10 +(label) initSquareTables::@11 +(label) initSquareTables::@15 +(label) initSquareTables::@16 +(label) initSquareTables::@2 +(label) initSquareTables::@3 +(label) initSquareTables::@4 +(label) initSquareTables::@7 +(label) initSquareTables::@8 +(label) initSquareTables::@9 +(label) initSquareTables::@return +(byte) initSquareTables::x +(byte) initSquareTables::x#0 +(byte) initSquareTables::x#1 +(byte) initSquareTables::x#2 +(byte) initSquareTables::x#3 +(byte) initSquareTables::x#4 +(byte) initSquareTables::x#5 +(byte) initSquareTables::x#6 +(byte) initSquareTables::x_dist +(byte) initSquareTables::x_dist#0 +(byte) initSquareTables::y +(byte) initSquareTables::y#0 +(byte) initSquareTables::y#1 +(byte) initSquareTables::y#2 +(byte) initSquareTables::y#3 +(byte) initSquareTables::y#4 +(byte) initSquareTables::y#5 +(byte) initSquareTables::y#6 +(byte) initSquareTables::y_dist +(byte) initSquareTables::y_dist#0 +interrupt(HARDWARE_ALL)(void()) irqBottom() +(void()*~) irqBottom::$1 +(bool~) irqBottom::$2 +(label) irqBottom::@1 +(label) irqBottom::@2 +(label) irqBottom::@3 +(label) irqBottom::@return +(byte) irqBottom::i +(byte) irqBottom::i#0 +(byte) irqBottom::i#1 +(byte) irqBottom::i#2 +interrupt(HARDWARE_ALL)(void()) irqTop() +(void()*~) irqTop::$0 +(bool~) irqTop::$1 +(bool~) irqTop::$2 +(label) irqTop::@1 +(label) irqTop::@2 +(label) irqTop::@3 +(label) irqTop::@4 +(label) irqTop::@return +(byte) irqTop::i +(byte) irqTop::i#0 +(byte) irqTop::i#1 +(byte) irqTop::i#2 +(byte) irqTop::i1 +(byte) irqTop::i1#0 +(byte) irqTop::i1#1 +(byte) irqTop::i1#2 +(void()) main() +(void()*~) main::$0 +(bool~) main::$10 +(struct ProcessingChar~) main::$11 +(word) main::$11_dist +(byte) main::$11_x +(byte) main::$11_y +(bool~) main::$12 +(bool~) main::$13 +(byte*~) main::$17 +(byte~) main::$18 +(byte*) main::$19 +(byte*) main::$20 +(word*) main::$21 +(bool~) main::$3 +(byte*~) main::$4 +(byte~) main::$5 +(number~) main::$6 +(number~) main::$7 +(bool~) main::$8 +(byte*~) main::$9 +(label) main::@1 +(label) main::@13 +(label) main::@15 +(label) main::@16 +(label) main::@17 +(label) main::@18 +(label) main::@2 +(label) main::@3 +(label) main::@4 +(label) main::@5 +(label) main::@6 +(label) main::@7 +(label) main::@8 +(label) main::@return +(struct ProcessingChar) main::center +(word) main::center_dist +(word) main::center_dist#0 +(word) main::center_dist#1 +(byte) main::center_x +(byte) main::center_x#0 +(byte) main::center_x#1 +(byte) main::center_y +(byte) main::center_y#0 +(byte) main::center_y#1 +(byte*) main::dst +(byte*) main::dst#0 +(byte*) main::dst#1 +(byte*) main::dst#2 +(byte) main::i +(byte) main::i#0 +(byte) main::i#1 +(byte) main::i#2 +(byte*) main::sc +(byte*) main::sc#0 +(byte*) main::sc#1 +(byte*) main::sc#2 +(byte*) main::src +(byte*) main::src#0 +(byte*) main::src#1 +(byte*) main::src#2 +(word()) mul8u((byte) mul8u::a , (byte) mul8u::b) +(bool~) mul8u::$0 +(number~) mul8u::$1 +(bool~) mul8u::$2 +(bool~) mul8u::$3 +(word~) mul8u::$4 +(byte~) mul8u::$5 +(word~) mul8u::$6 +(label) mul8u::@1 +(label) mul8u::@2 +(label) mul8u::@3 +(label) mul8u::@4 +(label) mul8u::@7 +(label) mul8u::@return +(byte) mul8u::a +(byte) mul8u::a#0 +(byte) mul8u::a#1 +(byte) mul8u::a#2 +(byte) mul8u::a#3 +(byte) mul8u::a#4 +(byte) mul8u::a#5 +(byte) mul8u::a#6 +(byte) mul8u::a#7 +(byte) mul8u::b +(byte) mul8u::b#0 +(byte) mul8u::b#1 +(byte) mul8u::b#2 +(word) mul8u::mb +(word) mul8u::mb#0 +(word) mul8u::mb#1 +(word) mul8u::mb#2 +(word) mul8u::mb#3 +(word) mul8u::mb#4 +(word) mul8u::mb#5 +(word) mul8u::res +(word) mul8u::res#0 +(word) mul8u::res#1 +(word) mul8u::res#2 +(word) mul8u::res#3 +(word) mul8u::res#4 +(word) mul8u::res#5 +(word) mul8u::res#6 +(word) mul8u::return +(word) mul8u::return#0 +(word) mul8u::return#1 +(word) mul8u::return#2 +(word) mul8u::return#3 +(word) mul8u::return#4 +(word) mul8u::return#5 +(word) mul8u::return#6 +(void()) processChars() +(bool~) processChars::$0 +(bool~) processChars::$1 +(bool~) processChars::$10 +(bool~) processChars::$11 +(bool~) processChars::$12 +(byte~) processChars::$13 +(byte~) processChars::$14 +(byte~) processChars::$15 +(byte*) processChars::$16 +(byte*) processChars::$17 +(word*) processChars::$19 +(word~) processChars::$2 +(word*) processChars::$20 +(number~) processChars::$3 +(byte*~) processChars::$4 +(byte*~) processChars::$5 +(word~) processChars::$6 +(number~) processChars::$7 +(byte*~) processChars::$8 +(byte*~) processChars::$9 +(label) processChars::@1 +(label) processChars::@10 +(label) processChars::@2 +(label) processChars::@3 +(label) processChars::@4 +(label) processChars::@8 +(label) processChars::@9 +(label) processChars::@return +(byte) processChars::i +(byte) processChars::i#0 +(byte) processChars::i#1 +(byte) processChars::i#2 +(byte) processChars::i#3 +(byte) processChars::i#4 +(byte) processChars::i#5 +(byte) processChars::i#6 +(byte) processChars::i#7 +(byte) processChars::i#8 +(struct ProcessingChar) processChars::processing +(byte*) processChars::processing_ptr +(byte*) processChars::processing_ptr#0 +(byte*) processChars::processing_ptr#1 +(byte*) processChars::processing_ptr#2 +(byte*) processChars::processing_ptr#3 +(byte) processChars::processing_x +(byte) processChars::processing_x#0 +(byte) processChars::processing_y +(byte) processChars::processing_y#0 +(void()) setupRasterIrq((word) setupRasterIrq::raster , (void()*) setupRasterIrq::irqRoutine) +(bool~) setupRasterIrq::$0 +(byte~) setupRasterIrq::$1 +(label) setupRasterIrq::@1 +(label) setupRasterIrq::@2 +(label) setupRasterIrq::@3 +(label) setupRasterIrq::@return +(void()*) setupRasterIrq::irqRoutine +(void()*) setupRasterIrq::irqRoutine#0 +(void()*) setupRasterIrq::irqRoutine#1 +(void()*) setupRasterIrq::irqRoutine#2 +(void()*) setupRasterIrq::irqRoutine#3 +(void()*) setupRasterIrq::irqRoutine#4 +(word) setupRasterIrq::raster +(word) setupRasterIrq::raster#0 +(word) setupRasterIrq::raster#1 +(word) setupRasterIrq::raster#2 +(word) setupRasterIrq::raster#3 +(word) setupRasterIrq::raster#4 +(void()) startProcessing((byte) startProcessing::center_x , (byte) startProcessing::center_y , (word) startProcessing::center_dist) +(bool~) startProcessing::$0 +(bool~) startProcessing::$1 +(bool~) startProcessing::$2 +(bool~) startProcessing::$3 +(byte~) startProcessing::$4 +(byte~) startProcessing::$5 +(byte*) startProcessing::$6 +(byte*) startProcessing::$7 +(word*) startProcessing::$8 +(word*) startProcessing::$9 +(label) startProcessing::@1 +(label) startProcessing::@2 +(label) startProcessing::@3 +(label) startProcessing::@4 +(label) startProcessing::@5 +(label) startProcessing::@8 +(label) startProcessing::@return +(struct ProcessingChar) startProcessing::center +(word) startProcessing::center_dist +(word) startProcessing::center_dist#0 +(word) startProcessing::center_dist#1 +(word) startProcessing::center_dist#2 +(word) startProcessing::center_dist#3 +(word) startProcessing::center_dist#4 +(word) startProcessing::center_dist#5 +(word) startProcessing::center_dist#6 +(word) startProcessing::center_dist#7 +(byte) startProcessing::center_x +(byte) startProcessing::center_x#0 +(byte) startProcessing::center_x#1 +(byte) startProcessing::center_x#2 +(byte) startProcessing::center_x#3 +(byte) startProcessing::center_x#4 +(byte) startProcessing::center_x#5 +(byte) startProcessing::center_x#6 +(byte) startProcessing::center_x#7 +(byte) startProcessing::center_y +(byte) startProcessing::center_y#0 +(byte) startProcessing::center_y#1 +(byte) startProcessing::center_y#2 +(byte) startProcessing::center_y#3 +(byte) startProcessing::center_y#4 +(byte) startProcessing::center_y#5 +(byte) startProcessing::center_y#6 +(byte) startProcessing::center_y#7 +(byte) startProcessing::freeIdx +(byte) startProcessing::freeIdx#0 +(byte) startProcessing::freeIdx#1 +(byte) startProcessing::freeIdx#2 +(byte) startProcessing::freeIdx#3 +(byte) startProcessing::freeIdx#4 +(byte) startProcessing::freeIdx#5 +(byte) startProcessing::freeIdx#6 +(byte) startProcessing::i +(byte) startProcessing::i#0 +(byte) startProcessing::i#1 +(byte) startProcessing::i#2 +(byte) startProcessing::i#3 +(byte) startProcessing::i#4 + +Adding number conversion cast (unumber) 7 in (byte) PROCPORT_DDR_MEMORY_MASK#0 ← (number) 7 +Adding number conversion cast (unumber) $35 in (byte) PROCPORT_RAM_IO#0 ← (number) $35 +Adding number conversion cast (unumber) 1 in (byte) IRQ_RASTER#0 ← (number) 1 +Adding number conversion cast (unumber) $7f in (byte) CIA_INTERRUPT_CLEAR#0 ← (number) $7f +Adding number conversion cast (unumber) 1 in (byte) WHITE#0 ← (number) 1 +Adding number conversion cast (unumber) 6 in (byte) BLUE#0 ← (number) 6 +Adding number conversion cast (unumber) $e in (byte) LIGHT_BLUE#0 ← (number) $e +Adding number conversion cast (unumber) 0 in (word) mul8u::res#0 ← (number) 0 +Adding number conversion cast (unumber) 0 in (bool~) mul8u::$0 ← (byte) mul8u::a#3 != (number) 0 +Adding number conversion cast (unumber) 1 in (number~) mul8u::$1 ← (byte) mul8u::a#4 & (number) 1 +Adding number conversion cast (unumber) mul8u::$1 in (number~) mul8u::$1 ← (byte) mul8u::a#4 & (unumber)(number) 1 +Adding number conversion cast (unumber) 0 in (bool~) mul8u::$2 ← (unumber~) mul8u::$1 != (number) 0 +Adding number conversion cast (unumber) 1 in (byte~) mul8u::$5 ← (byte) mul8u::a#5 >> (number) 1 +Adding number conversion cast (unumber) 1 in (word~) mul8u::$6 ← (word) mul8u::mb#2 << (number) 1 +Adding number conversion cast (unumber) $ffff in (word) NOT_FOUND#0 ← (number) $ffff +Adding number conversion cast (unumber) 0 in *((byte*) main::$19 + (byte~) main::$18) ← (number) 0 +Adding number conversion cast (unumber) 0 in *((byte*) main::$20 + (byte~) main::$18) ← (number) 0 +Adding number conversion cast (unumber) $3e7 in (byte*~) main::$4 ← (byte*) SCREEN#0 + (number) $3e7 +Adding number conversion cast (unumber) $1f in (number~) main::$6 ← (byte~) main::$5 & (number) $1f +Adding number conversion cast (unumber) main::$6 in (number~) main::$6 ← (byte~) main::$5 & (unumber)(number) $1f +Adding number conversion cast (unumber) main::$7 in (number~) main::$7 ← (byte) 'a' + (unumber~) main::$6 +Adding number conversion cast (unumber) $3e7 in (byte*~) main::$9 ← (byte*) SCREEN#0 + (number) $3e7 +Adding number conversion cast (unumber) $3e7 in (byte*~) main::$17 ← (byte*) SCREEN#0 + (number) $3e7 +Adding number conversion cast (unumber) $ff in (byte) startProcessing::freeIdx#0 ← (number) $ff +Adding number conversion cast (unumber) $ff in (bool~) startProcessing::$3 ← (byte) startProcessing::freeIdx#2 == (number) $ff +Adding number conversion cast (unumber) $28 in (number~) processChars::$3 ← (word~) processChars::$2 * (number) $28 +Adding number conversion cast (unumber) processChars::$3 in (number~) processChars::$3 ← (word~) processChars::$2 * (unumber)(number) $28 +Adding number conversion cast (unumber) $28 in (number~) processChars::$7 ← (word~) processChars::$6 * (number) $28 +Adding number conversion cast (unumber) processChars::$7 in (number~) processChars::$7 ← (word~) processChars::$6 * (unumber)(number) $28 +Adding number conversion cast (unumber) $14 in (bool~) initSquareTables::$0 ← (byte) initSquareTables::x#2 < (number) $14 +Adding number conversion cast (unumber) $14 in (number~) initSquareTables::$3 ← (number) $14 - (byte) initSquareTables::x#3 +Adding number conversion cast (unumber) initSquareTables::$3 in (number~) initSquareTables::$3 ← (unumber)(number) $14 - (byte) initSquareTables::x#3 +Adding number conversion cast (unumber) initSquareTables::$4 in (number~) initSquareTables::$4 ← (unumber~) initSquareTables::$3 +Adding number conversion cast (unumber) $14 in (number~) initSquareTables::$1 ← (byte) initSquareTables::x#4 - (number) $14 +Adding number conversion cast (unumber) initSquareTables::$1 in (number~) initSquareTables::$1 ← (byte) initSquareTables::x#4 - (unumber)(number) $14 +Adding number conversion cast (unumber) initSquareTables::$2 in (number~) initSquareTables::$2 ← (unumber~) initSquareTables::$1 +Adding number conversion cast (unumber) initSquareTables::$5 in (byte) initSquareTables::x#6 ← phi( initSquareTables::@2/(byte) initSquareTables::x#3 initSquareTables::@3/(byte) initSquareTables::x#4 ) + (number~) initSquareTables::$5 ← phi( initSquareTables::@2/(unumber~) initSquareTables::$4 initSquareTables::@3/(unumber~) initSquareTables::$2 ) +Adding number conversion cast (unumber) $c in (bool~) initSquareTables::$8 ← (byte) initSquareTables::y#2 < (number) $c +Adding number conversion cast (unumber) $c in (number~) initSquareTables::$11 ← (number) $c - (byte) initSquareTables::y#3 +Adding number conversion cast (unumber) initSquareTables::$11 in (number~) initSquareTables::$11 ← (unumber)(number) $c - (byte) initSquareTables::y#3 +Adding number conversion cast (unumber) initSquareTables::$12 in (number~) initSquareTables::$12 ← (unumber~) initSquareTables::$11 +Adding number conversion cast (unumber) $c in (number~) initSquareTables::$9 ← (byte) initSquareTables::y#4 - (number) $c +Adding number conversion cast (unumber) initSquareTables::$9 in (number~) initSquareTables::$9 ← (byte) initSquareTables::y#4 - (unumber)(number) $c +Adding number conversion cast (unumber) initSquareTables::$10 in (number~) initSquareTables::$10 ← (unumber~) initSquareTables::$9 +Adding number conversion cast (unumber) initSquareTables::$13 in (byte) initSquareTables::y#6 ← phi( initSquareTables::@10/(byte) initSquareTables::y#4 initSquareTables::@9/(byte) initSquareTables::y#3 ) + (number~) initSquareTables::$13 ← phi( initSquareTables::@9/(unumber~) initSquareTables::$12 initSquareTables::@10/(unumber~) initSquareTables::$10 ) +Adding number conversion cast (unumber) 0 in (byte) getCenterChar::closest_x#0 ← (number) 0 +Adding number conversion cast (unumber) 0 in (byte) getCenterChar::closest_y#0 ← (number) 0 +Adding number conversion cast (unumber) $28 in (byte*) getCenterChar::screen_line#1 ← (byte*) getCenterChar::screen_line#3 + (number) $28 +Adding number conversion cast (unumber) $28 in (number~) getCenterChar::$10 ← (word~) getCenterChar::$9 * (number) $28 +Adding number conversion cast (unumber) getCenterChar::$10 in (number~) getCenterChar::$10 ← (word~) getCenterChar::$9 * (unumber)(number) $28 +Adding number conversion cast (unumber) $100 in (bool~) setupRasterIrq::$0 ← (word) setupRasterIrq::raster#1 < (number) $100 +Adding number conversion cast (unumber) $7f in *((byte*) VIC_CONTROL#0) ← *((byte*) VIC_CONTROL#0) & (number) $7f +Adding number conversion cast (unumber) $80 in *((byte*) VIC_CONTROL#0) ← *((byte*) VIC_CONTROL#0) | (number) $80 +Adding number conversion cast (unumber) $30 in (byte) RASTER_IRQ_TOP#0 ← (number) $30 +Adding number conversion cast (unumber) $ff in (byte) RASTER_IRQ_MIDDLE#0 ← (number) $ff +Successful SSA optimization PassNAddNumberTypeConversions +Inlining cast (byte*) PROCPORT_DDR#0 ← (byte*)(number) 0 +Inlining cast (byte) PROCPORT_DDR_MEMORY_MASK#0 ← (unumber)(number) 7 +Inlining cast (byte*) PROCPORT#0 ← (byte*)(number) 1 +Inlining cast (byte) PROCPORT_RAM_IO#0 ← (unumber)(number) $35 +Inlining cast (byte*) RASTER#0 ← (byte*)(number) $d012 +Inlining cast (byte*) BORDERCOL#0 ← (byte*)(number) $d020 +Inlining cast (byte*) BGCOL#0 ← (byte*)(number) $d021 +Inlining cast (byte*) VIC_CONTROL#0 ← (byte*)(number) $d011 +Inlining cast (byte*) IRQ_STATUS#0 ← (byte*)(number) $d019 +Inlining cast (byte*) IRQ_ENABLE#0 ← (byte*)(number) $d01a +Inlining cast (byte) IRQ_RASTER#0 ← (unumber)(number) 1 +Inlining cast (byte*) COLS#0 ← (byte*)(number) $d800 +Inlining cast (byte*) CIA1_INTERRUPT#0 ← (byte*)(number) $dc0d +Inlining cast (byte) CIA_INTERRUPT_CLEAR#0 ← (unumber)(number) $7f +Inlining cast (void()**) HARDWARE_IRQ#0 ← (void()**)(number) $fffe +Inlining cast (byte) WHITE#0 ← (unumber)(number) 1 +Inlining cast (byte) BLUE#0 ← (unumber)(number) 6 +Inlining cast (byte) LIGHT_BLUE#0 ← (unumber)(number) $e +Inlining cast (word) mul8u::res#0 ← (unumber)(number) 0 +Inlining cast (byte*) SCREEN#0 ← (byte*)(number) $400 +Inlining cast (word) NOT_FOUND#0 ← (unumber)(number) $ffff +Inlining cast *((byte*) main::$19 + (byte~) main::$18) ← (unumber)(number) 0 +Inlining cast *((byte*) main::$20 + (byte~) main::$18) ← (unumber)(number) 0 +Inlining cast (byte) startProcessing::freeIdx#0 ← (unumber)(number) $ff +Inlining cast (word~) processChars::$2 ← (word)(byte) processChars::processing_y#0 +Inlining cast (word~) processChars::$6 ← (word)(byte) processChars::processing_y#0 +Inlining cast (byte) getCenterChar::closest_x#0 ← (unumber)(number) 0 +Inlining cast (byte) getCenterChar::closest_y#0 ← (unumber)(number) 0 +Inlining cast (word~) getCenterChar::$9 ← (word)(byte) getCenterChar::closest_y#3 +Inlining cast (byte) RASTER_IRQ_TOP#0 ← (unumber)(number) $30 +Inlining cast (byte) RASTER_IRQ_MIDDLE#0 ← (unumber)(number) $ff +Successful SSA optimization Pass2InlineCast +Simplifying constant pointer cast (byte*) 0 +Simplifying constant integer cast 7 +Simplifying constant pointer cast (byte*) 1 +Simplifying constant integer cast $35 +Simplifying constant pointer cast (byte*) 53266 +Simplifying constant pointer cast (byte*) 53280 +Simplifying constant pointer cast (byte*) 53281 +Simplifying constant pointer cast (byte*) 53265 +Simplifying constant pointer cast (byte*) 53273 +Simplifying constant pointer cast (byte*) 53274 +Simplifying constant integer cast 1 +Simplifying constant pointer cast (byte*) 55296 +Simplifying constant pointer cast (byte*) 56333 +Simplifying constant integer cast $7f +Simplifying constant pointer cast (void()**) 65534 +Simplifying constant integer cast 1 +Simplifying constant integer cast 6 +Simplifying constant integer cast $e +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 1 +Simplifying constant integer cast 0 +Simplifying constant integer cast 1 +Simplifying constant integer cast 1 +Simplifying constant pointer cast (byte*) 1024 +Simplifying constant integer cast $ffff +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast $3e7 +Simplifying constant integer cast $1f +Simplifying constant integer cast $3e7 +Simplifying constant integer cast $3e7 +Simplifying constant integer cast $ff +Simplifying constant integer cast $ff +Simplifying constant integer cast $28 +Simplifying constant integer cast $28 +Simplifying constant integer cast $14 +Simplifying constant integer cast $14 +Simplifying constant integer cast $14 +Simplifying constant integer cast $c +Simplifying constant integer cast $c +Simplifying constant integer cast $c +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast $28 +Simplifying constant integer cast $28 +Simplifying constant integer cast $100 +Simplifying constant integer cast $7f +Simplifying constant integer cast $80 +Simplifying constant integer cast $30 +Simplifying constant integer cast $ff +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type (byte) 7 +Finalized unsigned number type (byte) $35 +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) $7f +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) 6 +Finalized unsigned number type (byte) $e +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (word) $ffff +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (word) $3e7 +Finalized unsigned number type (byte) $1f +Finalized unsigned number type (word) $3e7 +Finalized unsigned number type (word) $3e7 +Finalized unsigned number type (byte) $ff +Finalized unsigned number type (byte) $ff +Finalized unsigned number type (byte) $28 +Finalized unsigned number type (byte) $28 +Finalized unsigned number type (byte) $14 +Finalized unsigned number type (byte) $14 +Finalized unsigned number type (byte) $14 +Finalized unsigned number type (byte) $c +Finalized unsigned number type (byte) $c +Finalized unsigned number type (byte) $c +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) $28 +Finalized unsigned number type (byte) $28 +Finalized unsigned number type (word) $100 +Finalized unsigned number type (byte) $7f +Finalized unsigned number type (byte) $80 +Finalized unsigned number type (byte) $30 +Finalized unsigned number type (byte) $ff +Successful SSA optimization PassNFinalizeNumberTypeConversions +Inferred type updated to byte in (unumber~) mul8u::$1 ← (byte) mul8u::a#4 & (byte) 1 +Inferred type updated to byte in (unumber~) main::$6 ← (byte~) main::$5 & (byte) $1f +Inferred type updated to byte in (unumber~) main::$7 ← (byte) 'a' + (byte~) main::$6 +Inferred type updated to word in (unumber~) processChars::$3 ← (word~) processChars::$2 * (byte) $28 +Inferred type updated to word in (unumber~) processChars::$7 ← (word~) processChars::$6 * (byte) $28 +Inferred type updated to byte in (unumber~) initSquareTables::$3 ← (byte) $14 - (byte) initSquareTables::x#3 +Inferred type updated to byte in (unumber~) initSquareTables::$4 ← (byte~) initSquareTables::$3 +Inferred type updated to byte in (unumber~) initSquareTables::$1 ← (byte) initSquareTables::x#4 - (byte) $14 +Inferred type updated to byte in (unumber~) initSquareTables::$2 ← (byte~) initSquareTables::$1 +Inferred type updated to byte for (unumber~) initSquareTables::$5 +Inferred type updated to byte in (unumber~) initSquareTables::$11 ← (byte) $c - (byte) initSquareTables::y#3 +Inferred type updated to byte in (unumber~) initSquareTables::$12 ← (byte~) initSquareTables::$11 +Inferred type updated to byte in (unumber~) initSquareTables::$9 ← (byte) initSquareTables::y#4 - (byte) $c +Inferred type updated to byte in (unumber~) initSquareTables::$10 ← (byte~) initSquareTables::$9 +Inferred type updated to byte for (unumber~) initSquareTables::$13 +Inferred type updated to word in (unumber~) getCenterChar::$10 ← (word~) getCenterChar::$9 * (byte) $28 +Inversing boolean not [27] (bool~) mul8u::$3 ← (byte~) mul8u::$1 == (byte) 0 from [26] (bool~) mul8u::$2 ← (byte~) mul8u::$1 != (byte) 0 +Inversing boolean not [93] (bool~) main::$13 ← (word) main::center_dist#0 != (word) NOT_FOUND#0 from [92] (bool~) main::$12 ← (word) main::center_dist#0 == (word) NOT_FOUND#0 +Inversing boolean not [114] (bool~) startProcessing::$1 ← *((word*) startProcessing::$9 + (byte~) startProcessing::$4) != (word) NOT_FOUND#0 from [113] (bool~) startProcessing::$0 ← *((word*) startProcessing::$9 + (byte~) startProcessing::$4) == (word) NOT_FOUND#0 +Inversing boolean not [139] (bool~) processChars::$1 ← *((word*) processChars::$19 + (byte~) processChars::$13) == (word) NOT_FOUND#0 from [138] (bool~) processChars::$0 ← *((word*) processChars::$19 + (byte~) processChars::$13) != (word) NOT_FOUND#0 +Inversing boolean not [233] (bool~) getCenterChar::$3 ← *((byte*) getCenterChar::screen_line#2 + (byte) getCenterChar::x#2) == (byte) ' ' from [232] (bool~) getCenterChar::$2 ← *((byte*) getCenterChar::screen_line#2 + (byte) getCenterChar::x#2) != (byte) ' ' +Inversing boolean not [245] (bool~) getCenterChar::$6 ← (word) getCenterChar::dist#0 >= (word) getCenterChar::closest_dist#2 from [244] (bool~) getCenterChar::$5 ← (word) getCenterChar::dist#0 < (word) getCenterChar::closest_dist#2 +Inversing boolean not [258] (bool~) getCenterChar::$1 ← (word) getCenterChar::closest_dist#3 == (word) NOT_FOUND#0 from [257] (bool~) getCenterChar::$0 ← (word) getCenterChar::closest_dist#3 != (word) NOT_FOUND#0 +Successful SSA optimization Pass2UnaryNotSimplification +Alias (word) mul8u::mb#0 = (byte) mul8u::b#2 +Alias (byte) mul8u::a#3 = (byte) mul8u::a#4 (byte) mul8u::a#7 +Alias (word) mul8u::mb#3 = (word) mul8u::mb#4 (word) mul8u::mb#5 +Alias (word) mul8u::res#2 = (word) mul8u::res#5 (word) mul8u::res#4 (word) mul8u::return#0 (word) mul8u::res#3 (word) mul8u::return#4 (word) mul8u::return#1 +Alias (byte) mul8u::a#0 = (byte~) mul8u::$5 +Alias (word) mul8u::mb#1 = (word~) mul8u::$6 +Alias (word) mul8u::res#1 = (word~) mul8u::$4 +Alias (void()*) setupRasterIrq::irqRoutine#0 = (void()*~) main::$0 +Alias (byte) getCenterChar::return_x#0 = (byte) getCenterChar::return_x#3 +Alias (byte) getCenterChar::return_y#0 = (byte) getCenterChar::return_y#3 +Alias (word) getCenterChar::return_dist#0 = (word) getCenterChar::return_dist#3 +Alias (byte) main::center_x#0 = (byte) main::$11_x (byte) main::center_x#1 +Alias (byte) main::center_y#0 = (byte) main::$11_y (byte) main::center_y#1 +Alias (word) main::center_dist#0 = (word) main::$11_dist (word) main::center_dist#1 +Alias (byte) startProcessing::i#2 = (byte) startProcessing::i#3 (byte) startProcessing::i#4 (byte) startProcessing::freeIdx#1 +Alias (byte) startProcessing::freeIdx#4 = (byte) startProcessing::freeIdx#5 +Alias (byte) startProcessing::center_x#3 = (byte) startProcessing::center_x#5 (byte) startProcessing::center_x#4 +Alias (byte) startProcessing::center_y#3 = (byte) startProcessing::center_y#5 (byte) startProcessing::center_y#4 +Alias (word) startProcessing::center_dist#3 = (word) startProcessing::center_dist#5 (word) startProcessing::center_dist#4 +Alias (byte) startProcessing::freeIdx#2 = (byte) startProcessing::freeIdx#3 +Alias (byte) startProcessing::center_x#1 = (byte) startProcessing::center_x#2 +Alias (byte) startProcessing::center_y#1 = (byte) startProcessing::center_y#2 +Alias (word) startProcessing::center_dist#1 = (word) startProcessing::center_dist#2 +Alias (byte) processChars::i#2 = (byte) processChars::i#4 (byte) processChars::i#5 (byte) processChars::i#8 (byte) processChars::i#7 (byte) processChars::i#6 +Alias (byte*) processChars::processing_ptr#0 = (byte*~) processChars::$9 (byte*) processChars::processing_ptr#1 (byte*) processChars::processing_ptr#2 (byte*) processChars::processing_ptr#3 +Alias (byte) initSquareTables::x#2 = (byte) initSquareTables::x#3 (byte) initSquareTables::x#4 +Alias (byte~) initSquareTables::$4 = (byte~) initSquareTables::$3 +Alias (byte~) initSquareTables::$2 = (byte~) initSquareTables::$1 +Alias (byte) initSquareTables::x_dist#0 = (byte~) initSquareTables::$5 +Alias (word) mul8u::return#2 = (word) mul8u::return#5 +Alias (byte) initSquareTables::x#5 = (byte) initSquareTables::x#6 +Alias (byte) initSquareTables::y#2 = (byte) initSquareTables::y#3 (byte) initSquareTables::y#4 +Alias (byte~) initSquareTables::$12 = (byte~) initSquareTables::$11 +Alias (byte~) initSquareTables::$10 = (byte~) initSquareTables::$9 +Alias (byte) initSquareTables::y_dist#0 = (byte~) initSquareTables::$13 +Alias (word) mul8u::return#3 = (word) mul8u::return#6 +Alias (byte) initSquareTables::y#5 = (byte) initSquareTables::y#6 +Alias (byte) getCenterChar::x#2 = (byte) getCenterChar::x#4 (byte) getCenterChar::x#5 (byte) getCenterChar::closest_x#1 +Alias (byte) getCenterChar::y#2 = (byte) getCenterChar::y#5 (byte) getCenterChar::y#3 (byte) getCenterChar::closest_y#1 +Alias (word) getCenterChar::closest_dist#2 = (word) getCenterChar::closest_dist#5 +Alias (byte*) getCenterChar::screen_line#2 = (byte*) getCenterChar::screen_line#6 (byte*) getCenterChar::screen_line#7 +Alias (byte) getCenterChar::closest_x#7 = (byte) getCenterChar::closest_x#8 +Alias (byte) getCenterChar::closest_y#7 = (byte) getCenterChar::closest_y#8 +Alias (word) getCenterChar::dist#0 = (word~) getCenterChar::$4 (word) getCenterChar::dist#1 (word) getCenterChar::closest_dist#1 +Alias (byte*) getCenterChar::screen_line#3 = (byte*) getCenterChar::screen_line#5 +Alias (byte) getCenterChar::y#4 = (byte) getCenterChar::y#6 +Alias (word) getCenterChar::closest_dist#3 = (word) getCenterChar::closest_dist#6 (word) getCenterChar::closest_dist#9 (word) getCenterChar::closest_dist#7 +Alias (byte) getCenterChar::closest_x#3 = (byte) getCenterChar::closest_x#5 (byte) getCenterChar::closest_x#6 (byte) getCenterChar::closest_x#4 +Alias (byte) getCenterChar::closest_y#3 = (byte) getCenterChar::closest_y#5 (byte) getCenterChar::closest_y#6 (byte) getCenterChar::closest_y#4 +Alias (byte) getCenterChar::return_x#1 = (byte) getCenterChar::closest_x#2 (byte) getCenterChar::return_x#4 (byte) getCenterChar::return_x#2 +Alias (byte) getCenterChar::return_y#1 = (byte) getCenterChar::closest_y#2 (byte) getCenterChar::return_y#4 (byte) getCenterChar::return_y#2 +Alias (word) getCenterChar::return_dist#1 = (word) getCenterChar::closest_dist#4 (word) getCenterChar::return_dist#4 (word) getCenterChar::return_dist#2 +Alias (word) setupRasterIrq::raster#1 = (word) setupRasterIrq::raster#3 (word) setupRasterIrq::raster#4 +Alias (void()*) setupRasterIrq::irqRoutine#2 = (void()*) setupRasterIrq::irqRoutine#4 (void()*) setupRasterIrq::irqRoutine#3 +Successful SSA optimization Pass2AliasElimination +Alias candidate removed (phi-usage) (byte) getCenterChar::x#2 +Alias candidate removed (phi-usage) (byte) getCenterChar::y#2 +Alias candidate removed (solo) (byte) getCenterChar::x#3 = +Alias candidate removed (solo) (byte) getCenterChar::y#4 = +Alias (byte) mul8u::a#3 = (byte) mul8u::a#5 +Alias (word) mul8u::mb#2 = (word) mul8u::mb#3 +Alias (byte) startProcessing::center_x#1 = (byte) startProcessing::center_x#3 +Alias (byte) startProcessing::center_y#1 = (byte) startProcessing::center_y#3 +Alias (word) startProcessing::center_dist#1 = (word) startProcessing::center_dist#3 +Alias (byte) processChars::i#2 = (byte) processChars::i#3 +Alias (byte) initSquareTables::x#2 = (byte) initSquareTables::x#5 +Alias (byte) initSquareTables::y#2 = (byte) initSquareTables::y#5 +Alias (byte*) getCenterChar::screen_line#2 = (byte*) getCenterChar::screen_line#3 +Alias (byte) getCenterChar::return_x#1 = (byte) getCenterChar::closest_x#3 +Alias (byte) getCenterChar::return_y#1 = (byte) getCenterChar::closest_y#3 +Alias (word) getCenterChar::return_dist#1 = (word) getCenterChar::closest_dist#3 +Alias (word) setupRasterIrq::raster#1 = (word) setupRasterIrq::raster#2 +Alias (void()*) setupRasterIrq::irqRoutine#1 = (void()*) setupRasterIrq::irqRoutine#2 +Successful SSA optimization Pass2AliasElimination +Alias candidate removed (phi-usage) (byte) getCenterChar::x#2 +Alias candidate removed (phi-usage) (byte) getCenterChar::y#2 +Alias candidate removed (solo) (byte) getCenterChar::x#3 = +Alias candidate removed (solo) (byte) getCenterChar::y#4 = +Self Phi Eliminated (byte) startProcessing::freeIdx#4 +Self Phi Eliminated (byte) startProcessing::center_x#1 +Self Phi Eliminated (byte) startProcessing::center_y#1 +Self Phi Eliminated (word) startProcessing::center_dist#1 +Self Phi Eliminated (byte*) getCenterChar::screen_line#2 +Successful SSA optimization Pass2SelfPhiElimination +Identical Phi Values (byte) startProcessing::center_x#7 (byte) startProcessing::center_x#0 +Identical Phi Values (byte) startProcessing::center_y#7 (byte) startProcessing::center_y#0 +Identical Phi Values (word) startProcessing::center_dist#7 (word) startProcessing::center_dist#0 +Identical Phi Values (byte) startProcessing::freeIdx#4 (byte) startProcessing::freeIdx#6 +Identical Phi Values (byte) startProcessing::center_x#1 (byte) startProcessing::center_x#6 +Identical Phi Values (byte) startProcessing::center_y#1 (byte) startProcessing::center_y#6 +Identical Phi Values (word) startProcessing::center_dist#1 (word) startProcessing::center_dist#6 +Identical Phi Values (byte*) getCenterChar::screen_line#2 (byte*) getCenterChar::screen_line#4 +Identical Phi Values (byte) getCenterChar::x#3 (byte) getCenterChar::x#2 +Identical Phi Values (byte) getCenterChar::y#4 (byte) getCenterChar::y#2 +Identical Phi Values (word) setupRasterIrq::raster#1 (word) setupRasterIrq::raster#0 +Identical Phi Values (void()*) setupRasterIrq::irqRoutine#1 (void()*) setupRasterIrq::irqRoutine#0 +Successful SSA optimization Pass2IdenticalPhiElimination +Simple Condition (bool~) mul8u::$0 [23] if((byte) mul8u::a#3!=(byte) 0) goto mul8u::@2 +Simple Condition (bool~) mul8u::$3 [28] if((byte~) mul8u::$1==(byte) 0) goto mul8u::@4 +Simple Condition (bool~) main::$3 [56] if((byte) main::i#1!=rangelast(0,7)) goto main::@1 +Simple Condition (bool~) main::$8 [70] if((byte*) main::sc#1!=rangelast(SCREEN#0,main::$4)) goto main::@3 +Simple Condition (bool~) main::$10 [79] if((byte*) main::src#1!=(byte*~) main::$9) goto main::@5 +Simple Condition (bool~) main::$13 [94] if((word) main::center_dist#0!=(word) NOT_FOUND#0) goto main::@8 +Simple Condition (bool~) startProcessing::$1 [115] if(*((word*) startProcessing::$9 + (byte~) startProcessing::$4)!=(word) NOT_FOUND#0) goto startProcessing::@3 +Simple Condition (bool~) startProcessing::$2 [119] if((byte) startProcessing::i#1!=rangelast(0,7)) goto startProcessing::@2 +Simple Condition (bool~) startProcessing::$3 [124] if((byte) startProcessing::freeIdx#2==(byte) $ff) goto startProcessing::@1 +Simple Condition (bool~) processChars::$1 [140] if(*((word*) processChars::$19 + (byte~) processChars::$13)==(word) NOT_FOUND#0) goto processChars::@2 +Simple Condition (bool~) processChars::$12 [144] if((byte) processChars::i#1!=rangelast(0,7)) goto processChars::@1 +Simple Condition (bool~) processChars::$10 [162] if(*((byte*) processChars::processing_ptr#0)==(byte) ' ') goto processChars::@3 +Simple Condition (bool~) processChars::$11 [169] if(*((byte*) processChars::processing_ptr#0)>(byte) ' ') goto processChars::@4 +Simple Condition (bool~) initSquareTables::$0 [180] if((byte) initSquareTables::x#2<(byte) $14) goto initSquareTables::@2 +Simple Condition (bool~) initSquareTables::$7 [199] if((byte) initSquareTables::x#1!=rangelast(0,$27)) goto initSquareTables::@1 +Simple Condition (bool~) initSquareTables::$8 [203] if((byte) initSquareTables::y#2<(byte) $c) goto initSquareTables::@9 +Simple Condition (bool~) initSquareTables::$15 [222] if((byte) initSquareTables::y#1!=rangelast(0,$18)) goto initSquareTables::@8 +Simple Condition (bool~) getCenterChar::$3 [234] if(*((byte*) getCenterChar::screen_line#4 + (byte) getCenterChar::x#2)==(byte) ' ') goto getCenterChar::@5 +Simple Condition (bool~) getCenterChar::$7 [238] if((byte) getCenterChar::x#1!=rangelast(0,$27)) goto getCenterChar::@4 +Simple Condition (bool~) getCenterChar::$6 [246] if((word) getCenterChar::dist#0>=(word) getCenterChar::closest_dist#2) goto getCenterChar::@5 +Simple Condition (bool~) getCenterChar::$8 [255] if((byte) getCenterChar::y#1!=rangelast(0,$18)) goto getCenterChar::@3 +Simple Condition (bool~) getCenterChar::$1 [259] if((word) getCenterChar::return_dist#1==(word) NOT_FOUND#0) goto getCenterChar::@1 +Simple Condition (bool~) setupRasterIrq::$0 [281] if((word) setupRasterIrq::raster#0<(word) $100) goto setupRasterIrq::@1 +Simple Condition (bool~) irqTop::$1 [298] if((byte) irqTop::i#1!=rangelast(0,4)) goto irqTop::@1 +Simple Condition (bool~) irqTop::$2 [305] if((byte) irqTop::i1#1!=rangelast(0,7)) goto irqTop::@3 +Simple Condition (bool~) irqBottom::$2 [318] if((byte) irqBottom::i#1!=rangelast(0,4)) goto irqBottom::@1 +Successful SSA optimization Pass2ConditionalJumpSimplification +Constant right-side identified [43] (byte[$3e8]) SCREEN_COPY#0 ← { fill( $3e8, 0) } +Constant right-side identified [57] (void()*) setupRasterIrq::irqRoutine#0 ← & interrupt(HARDWARE_ALL)(void()) irqTop() +Constant right-side identified [105] (struct ProcessingChar[8]) PROCESSING#0 ← { fill( 8, 0) } +Constant right-side identified [175] (word[$28]) SQUARES_X#0 ← { fill( $28, 0) } +Constant right-side identified [176] (word[$19]) SQUARES_Y#0 ← { fill( $19, 0) } +Constant right-side identified [309] (void()*~) irqTop::$0 ← & interrupt(HARDWARE_ALL)(void()) irqBottom() +Constant right-side identified [325] (void()*~) irqBottom::$1 ← & interrupt(HARDWARE_ALL)(void()) irqTop() +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant (const byte*) PROCPORT_DDR#0 = (byte*) 0 +Constant (const byte) PROCPORT_DDR_MEMORY_MASK#0 = 7 +Constant (const byte*) PROCPORT#0 = (byte*) 1 +Constant (const byte) PROCPORT_RAM_IO#0 = $35 +Constant (const byte*) RASTER#0 = (byte*) 53266 +Constant (const byte*) BORDERCOL#0 = (byte*) 53280 +Constant (const byte*) BGCOL#0 = (byte*) 53281 +Constant (const byte*) VIC_CONTROL#0 = (byte*) 53265 +Constant (const byte*) IRQ_STATUS#0 = (byte*) 53273 +Constant (const byte*) IRQ_ENABLE#0 = (byte*) 53274 +Constant (const byte) IRQ_RASTER#0 = 1 +Constant (const byte*) COLS#0 = (byte*) 55296 +Constant (const byte*) CIA1_INTERRUPT#0 = (byte*) 56333 +Constant (const byte) CIA_INTERRUPT_CLEAR#0 = $7f +Constant (const void()**) HARDWARE_IRQ#0 = (void()**) 65534 +Constant (const byte) WHITE#0 = 1 +Constant (const byte) BLUE#0 = 6 +Constant (const byte) LIGHT_BLUE#0 = $e +Constant (const word) mul8u::res#0 = 0 +Constant (const byte*) SCREEN#0 = (byte*) 1024 +Constant (const byte[$3e8]) SCREEN_COPY#0 = { fill( $3e8, 0) } +Constant (const word) NOT_FOUND#0 = $ffff +Constant (const byte) main::i#0 = 0 +Constant (const void()*) setupRasterIrq::irqRoutine#0 = &irqTop +Constant (const struct ProcessingChar[8]) PROCESSING#0 = { fill( 8, 0) } +Constant (const byte) startProcessing::freeIdx#0 = $ff +Constant (const byte) startProcessing::i#0 = 0 +Constant (const byte) processChars::i#0 = 0 +Constant (const word[$28]) SQUARES_X#0 = { fill( $28, 0) } +Constant (const word[$19]) SQUARES_Y#0 = { fill( $19, 0) } +Constant (const byte) initSquareTables::x#0 = 0 +Constant (const byte) initSquareTables::y#0 = 0 +Constant (const byte) getCenterChar::closest_x#0 = 0 +Constant (const byte) getCenterChar::closest_y#0 = 0 +Constant (const byte) getCenterChar::y#0 = 0 +Constant (const byte) getCenterChar::x#0 = 0 +Constant (const byte) RASTER_IRQ_TOP#0 = $30 +Constant (const byte) irqTop::i#0 = 0 +Constant (const byte) irqTop::i1#0 = 0 +Constant (const void()*) irqTop::$0 = &irqBottom +Constant (const byte) RASTER_IRQ_MIDDLE#0 = $ff +Constant (const byte) irqBottom::i#0 = 0 +Constant (const void()*) irqBottom::$1 = &irqTop +Successful SSA optimization Pass2ConstantIdentification +Constant (const word) setupRasterIrq::raster#0 = RASTER_IRQ_TOP#0 +Constant (const byte*) main::sc#0 = SCREEN#0 +Constant (const byte*) main::src#0 = SCREEN#0 +Constant (const byte*) main::dst#0 = SCREEN_COPY#0 +Constant (const word) getCenterChar::closest_dist#0 = NOT_FOUND#0 +Constant (const byte*) getCenterChar::screen_line#0 = SCREEN_COPY#0 +Successful SSA optimization Pass2ConstantIdentification +Constant value identified (byte*)PROCESSING#0 in [48] (byte*) main::$19 ← (byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_X +Constant value identified (byte*)PROCESSING#0 in [50] (byte*) main::$20 ← (byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y +Constant value identified (word*)PROCESSING#0 in [52] (word*) main::$21 ← (word*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST +Constant value identified (word*)PROCESSING#0 in [112] (word*) startProcessing::$9 ← (word*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST +Constant value identified (byte*)PROCESSING#0 in [127] (byte*) startProcessing::$6 ← (byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_X +Constant value identified (byte*)PROCESSING#0 in [129] (byte*) startProcessing::$7 ← (byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y +Constant value identified (word*)PROCESSING#0 in [131] (word*) startProcessing::$8 ← (word*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST +Constant value identified (word*)PROCESSING#0 in [137] (word*) processChars::$19 ← (word*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST +Constant value identified (byte*)PROCESSING#0 in [147] (byte*) processChars::$16 ← (byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_X +Constant value identified (byte*)PROCESSING#0 in [149] (byte*) processChars::$17 ← (byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y +Constant value identified (word*)PROCESSING#0 in [165] (word*) processChars::$20 ← (word*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST +Successful SSA optimization Pass2ConstantValues +if() condition always true - replacing block destination [100] if(true) goto main::@7 +if() condition always true - replacing block destination [103] if(true) goto main::@13 +if() condition always true - replacing block destination [281] if((const word) setupRasterIrq::raster#0<(word) $100) goto setupRasterIrq::@1 +Successful SSA optimization Pass2ConstantIfs +Resolved ranged next value [54] main::i#1 ← ++ main::i#2 to ++ +Resolved ranged comparison value [56] if(main::i#1!=rangelast(0,7)) goto main::@1 to (number) 8 +Resolved ranged next value [117] startProcessing::i#1 ← ++ startProcessing::i#2 to ++ +Resolved ranged comparison value [119] if(startProcessing::i#1!=rangelast(0,7)) goto startProcessing::@2 to (number) 8 +Resolved ranged next value [142] processChars::i#1 ← ++ processChars::i#2 to ++ +Resolved ranged comparison value [144] if(processChars::i#1!=rangelast(0,7)) goto processChars::@1 to (number) 8 +Resolved ranged next value [197] initSquareTables::x#1 ← ++ initSquareTables::x#2 to ++ +Resolved ranged comparison value [199] if(initSquareTables::x#1!=rangelast(0,$27)) goto initSquareTables::@1 to (number) $28 +Resolved ranged next value [220] initSquareTables::y#1 ← ++ initSquareTables::y#2 to ++ +Resolved ranged comparison value [222] if(initSquareTables::y#1!=rangelast(0,$18)) goto initSquareTables::@8 to (number) $19 +Resolved ranged next value [236] getCenterChar::x#1 ← ++ getCenterChar::x#2 to ++ +Resolved ranged comparison value [238] if(getCenterChar::x#1!=rangelast(0,$27)) goto getCenterChar::@4 to (number) $28 +Resolved ranged next value [253] getCenterChar::y#1 ← ++ getCenterChar::y#2 to ++ +Resolved ranged comparison value [255] if(getCenterChar::y#1!=rangelast(0,$18)) goto getCenterChar::@3 to (number) $19 +Resolved ranged next value [296] irqTop::i#1 ← ++ irqTop::i#2 to ++ +Resolved ranged comparison value [298] if(irqTop::i#1!=rangelast(0,4)) goto irqTop::@1 to (number) 5 +Resolved ranged next value [303] irqTop::i1#1 ← ++ irqTop::i1#2 to ++ +Resolved ranged comparison value [305] if(irqTop::i1#1!=rangelast(0,7)) goto irqTop::@3 to (number) 8 +Resolved ranged next value [316] irqBottom::i#1 ← ++ irqBottom::i#2 to ++ +Resolved ranged comparison value [318] if(irqBottom::i#1!=rangelast(0,4)) goto irqBottom::@1 to (number) 5 +Converting *(pointer+n) to pointer[n] [155] *((byte*~) processChars::$5) ← (const byte) WHITE#0 -- *(processChars::$4 + processChars::processing_x#0) +Converting *(pointer+n) to pointer[n] [162] if(*((byte*) processChars::processing_ptr#0)==(byte) ' ') goto processChars::@3 -- *(processChars::$8 + processChars::processing_x#0) +Converting *(pointer+n) to pointer[n] [169] if(*((byte*) processChars::processing_ptr#0)>(byte) ' ') goto processChars::@4 -- *(processChars::$8 + processChars::processing_x#0) +Converting *(pointer+n) to pointer[n] [171] *((byte*) processChars::processing_ptr#0) ← -- *((byte*) processChars::processing_ptr#0) -- *(processChars::$8 + processChars::processing_x#0) +Converting *(pointer+n) to pointer[n] [171] *((byte*) processChars::processing_ptr#0) ← -- *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) -- *(processChars::$8 + processChars::processing_x#0) +Converting *(pointer+n) to pointer[n] [173] *((byte*) processChars::processing_ptr#0) ← ++ *((byte*) processChars::processing_ptr#0) -- *(processChars::$8 + processChars::processing_x#0) +Converting *(pointer+n) to pointer[n] [173] *((byte*) processChars::processing_ptr#0) ← ++ *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) -- *(processChars::$8 + processChars::processing_x#0) +Converting *(pointer+n) to pointer[n] [269] *((byte*~) getCenterChar::$12) ← (byte) ' ' -- *(getCenterChar::$11 + getCenterChar::return_x#1) +Successful SSA optimization Pass2InlineDerefIdx +Simplifying expression containing zero (byte*)PROCESSING#0 in [48] (byte*) main::$19 ← (byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_X +Simplifying expression containing zero (byte*)PROCESSING#0 in [127] (byte*) startProcessing::$6 ← (byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_X +Simplifying expression containing zero (byte*)PROCESSING#0 in [147] (byte*) processChars::$16 ← (byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_X +Successful SSA optimization PassNSimplifyExpressionWithZero +Eliminating unused variable (byte*~) processChars::$5 and assignment [82] (byte*~) processChars::$5 ← (byte*~) processChars::$4 + (byte) processChars::processing_x#0 +Eliminating unused variable (byte*) processChars::processing_ptr#0 and assignment [87] (byte*) processChars::processing_ptr#0 ← (byte*~) processChars::$8 + (byte) processChars::processing_x#0 +Eliminating unused variable (byte*~) getCenterChar::$12 and assignment [142] (byte*~) getCenterChar::$12 ← (byte*~) getCenterChar::$11 + (byte) getCenterChar::return_x#1 +Eliminating unused constant (const byte) OFFSET_STRUCT_PROCESSINGCHAR_X +Successful SSA optimization PassNEliminateUnusedVars +Removing unused block main::@return +Removing unused block setupRasterIrq::@3 +Successful SSA optimization Pass2EliminateUnusedBlocks +Adding number conversion cast (unumber) 8 in if((byte) main::i#1!=(number) 8) goto main::@1 +Adding number conversion cast (unumber) 8 in if((byte) startProcessing::i#1!=(number) 8) goto startProcessing::@2 +Adding number conversion cast (unumber) 8 in if((byte) processChars::i#1!=(number) 8) goto processChars::@1 +Adding number conversion cast (unumber) $28 in if((byte) initSquareTables::x#1!=(number) $28) goto initSquareTables::@1 +Adding number conversion cast (unumber) $19 in if((byte) initSquareTables::y#1!=(number) $19) goto initSquareTables::@8 +Adding number conversion cast (unumber) $28 in if((byte) getCenterChar::x#1!=(number) $28) goto getCenterChar::@4 +Adding number conversion cast (unumber) $19 in if((byte) getCenterChar::y#1!=(number) $19) goto getCenterChar::@3 +Adding number conversion cast (unumber) 5 in if((byte) irqTop::i#1!=(number) 5) goto irqTop::@1 +Adding number conversion cast (unumber) 8 in if((byte) irqTop::i1#1!=(number) 8) goto irqTop::@3 +Adding number conversion cast (unumber) 5 in if((byte) irqBottom::i#1!=(number) 5) goto irqBottom::@1 +Successful SSA optimization PassNAddNumberTypeConversions +Simplifying constant integer cast 8 +Simplifying constant integer cast 8 +Simplifying constant integer cast 8 +Simplifying constant integer cast $28 +Simplifying constant integer cast $19 +Simplifying constant integer cast $28 +Simplifying constant integer cast $19 +Simplifying constant integer cast 5 +Simplifying constant integer cast 8 +Simplifying constant integer cast 5 +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) $28 +Finalized unsigned number type (byte) $19 +Finalized unsigned number type (byte) $28 +Finalized unsigned number type (byte) $19 +Finalized unsigned number type (byte) 5 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) 5 +Successful SSA optimization PassNFinalizeNumberTypeConversions +Self Phi Eliminated (byte) startProcessing::center_x#6 +Self Phi Eliminated (byte) startProcessing::center_y#6 +Self Phi Eliminated (word) startProcessing::center_dist#6 +Self Phi Eliminated (byte) getCenterChar::y#2 +Successful SSA optimization Pass2SelfPhiElimination +Identical Phi Values (byte) startProcessing::center_x#6 (byte) startProcessing::center_x#0 +Identical Phi Values (byte) startProcessing::center_y#6 (byte) startProcessing::center_y#0 +Identical Phi Values (word) startProcessing::center_dist#6 (word) startProcessing::center_dist#0 +Identical Phi Values (byte) getCenterChar::y#2 (byte) getCenterChar::y#7 +Successful SSA optimization Pass2IdenticalPhiElimination +Constant right-side identified [14] (byte*) main::$20 ← (byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y +Constant right-side identified [16] (word*) main::$21 ← (word*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST +Constant right-side identified [21] (byte*~) main::$4 ← (const byte*) SCREEN#0 + (word) $3e7 +Constant right-side identified [33] (byte*~) main::$9 ← (const byte*) SCREEN#0 + (word) $3e7 +Constant right-side identified [48] (byte*~) main::$17 ← (const byte*) SCREEN#0 + (word) $3e7 +Constant right-side identified [53] (word*) startProcessing::$9 ← (word*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST +Constant right-side identified [62] (byte*) startProcessing::$7 ← (byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y +Constant right-side identified [64] (word*) startProcessing::$8 ← (word*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST +Constant right-side identified [69] (word*) processChars::$19 ← (word*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST +Constant right-side identified [76] (byte*) processChars::$17 ← (byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y +Constant right-side identified [87] (word*) processChars::$20 ← (word*)(const struct ProcessingChar[8]) PROCESSING#0 + (const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST +Constant right-side identified [146] (byte~) setupRasterIrq::$1 ← < (const word) setupRasterIrq::raster#0 +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant (const byte*) main::$19 = (byte*)PROCESSING#0 +Constant (const byte*) main::$20 = (byte*)PROCESSING#0+OFFSET_STRUCT_PROCESSINGCHAR_Y +Constant (const word*) main::$21 = (word*)PROCESSING#0+OFFSET_STRUCT_PROCESSINGCHAR_DIST +Constant (const byte*) main::$4 = SCREEN#0+$3e7 +Constant (const byte*) main::$9 = SCREEN#0+$3e7 +Constant (const byte*) main::$17 = SCREEN#0+$3e7 +Constant (const word*) startProcessing::$9 = (word*)PROCESSING#0+OFFSET_STRUCT_PROCESSINGCHAR_DIST +Constant (const byte*) startProcessing::$6 = (byte*)PROCESSING#0 +Constant (const byte*) startProcessing::$7 = (byte*)PROCESSING#0+OFFSET_STRUCT_PROCESSINGCHAR_Y +Constant (const word*) startProcessing::$8 = (word*)PROCESSING#0+OFFSET_STRUCT_PROCESSINGCHAR_DIST +Constant (const word*) processChars::$19 = (word*)PROCESSING#0+OFFSET_STRUCT_PROCESSINGCHAR_DIST +Constant (const byte*) processChars::$16 = (byte*)PROCESSING#0 +Constant (const byte*) processChars::$17 = (byte*)PROCESSING#0+OFFSET_STRUCT_PROCESSINGCHAR_Y +Constant (const word*) processChars::$20 = (word*)PROCESSING#0+OFFSET_STRUCT_PROCESSINGCHAR_DIST +Constant (const byte) setupRasterIrq::$1 = =(word) getCenterChar::closest_dist#2) goto getCenterChar::@12 + to:getCenterChar::@5 +getCenterChar::@5: scope:[getCenterChar] from getCenterChar::@4 + [66] (byte~) getCenterChar::return_x#7 ← (byte) getCenterChar::x#2 + [67] (byte~) getCenterChar::return_y#7 ← (byte) getCenterChar::y#7 + to:getCenterChar::@3 +getCenterChar::@3: scope:[getCenterChar] from getCenterChar::@11 getCenterChar::@12 getCenterChar::@5 + [68] (byte) getCenterChar::return_y#1 ← phi( getCenterChar::@11/(byte) getCenterChar::closest_y#7 getCenterChar::@12/(byte) getCenterChar::closest_y#7 getCenterChar::@5/(byte~) getCenterChar::return_y#7 ) + [68] (byte) getCenterChar::return_x#1 ← phi( getCenterChar::@11/(byte) getCenterChar::closest_x#7 getCenterChar::@12/(byte) getCenterChar::closest_x#7 getCenterChar::@5/(byte~) getCenterChar::return_x#7 ) + [68] (word) getCenterChar::return_dist#1 ← phi( getCenterChar::@11/(word~) getCenterChar::return_dist#5 getCenterChar::@12/(word~) getCenterChar::return_dist#6 getCenterChar::@5/(word) getCenterChar::dist#0 ) + [69] (byte) getCenterChar::x#1 ← ++ (byte) getCenterChar::x#2 + [70] if((byte) getCenterChar::x#1!=(byte) $28) goto getCenterChar::@10 + to:getCenterChar::@6 +getCenterChar::@6: scope:[getCenterChar] from getCenterChar::@3 + [71] (byte*) getCenterChar::screen_line#1 ← (byte*) getCenterChar::screen_line#4 + (byte) $28 + [72] (byte) getCenterChar::y#1 ← ++ (byte) getCenterChar::y#7 + [73] if((byte) getCenterChar::y#1!=(byte) $19) goto getCenterChar::@9 + to:getCenterChar::@7 +getCenterChar::@7: scope:[getCenterChar] from getCenterChar::@6 + [74] if((word) getCenterChar::return_dist#1==(const word) NOT_FOUND#0) goto getCenterChar::@return + to:getCenterChar::@8 +getCenterChar::@8: scope:[getCenterChar] from getCenterChar::@7 + [75] (word~) getCenterChar::$9 ← (word)(byte) getCenterChar::return_y#1 + [76] (word) getCenterChar::$15 ← (word~) getCenterChar::$9 << (byte) 2 + [77] (word) getCenterChar::$16 ← (word) getCenterChar::$15 + (word~) getCenterChar::$9 + [78] (word~) getCenterChar::$10 ← (word) getCenterChar::$16 << (byte) 3 + [79] (byte*~) getCenterChar::$11 ← (const byte[$3e8]) SCREEN_COPY#0 + (word~) getCenterChar::$10 + [80] *((byte*~) getCenterChar::$11 + (byte) getCenterChar::return_x#1) ← (byte) ' ' + to:getCenterChar::@return +getCenterChar::@return: scope:[getCenterChar] from getCenterChar::@7 getCenterChar::@8 + [81] return + to:@return +getCenterChar::@9: scope:[getCenterChar] from getCenterChar::@6 + [82] (word~) getCenterChar::closest_dist#10 ← (word) getCenterChar::return_dist#1 + to:getCenterChar::@1 +getCenterChar::@10: scope:[getCenterChar] from getCenterChar::@3 + [83] (word~) getCenterChar::closest_dist#12 ← (word) getCenterChar::return_dist#1 + to:getCenterChar::@2 +getCenterChar::@12: scope:[getCenterChar] from getCenterChar::@4 + [84] (word~) getCenterChar::return_dist#6 ← (word) getCenterChar::closest_dist#2 + to:getCenterChar::@3 +getCenterChar::@11: scope:[getCenterChar] from getCenterChar::@2 + [85] (word~) getCenterChar::return_dist#5 ← (word) getCenterChar::closest_dist#2 + to:getCenterChar::@3 +initSquareTables: scope:[initSquareTables] from main::@5 + [86] phi() + to:initSquareTables::@1 +initSquareTables::@1: scope:[initSquareTables] from initSquareTables initSquareTables::@9 + [87] (byte) initSquareTables::x#2 ← phi( initSquareTables/(byte) 0 initSquareTables::@9/(byte) initSquareTables::x#1 ) + [88] if((byte) initSquareTables::x#2<(byte) $14) goto initSquareTables::@2 + to:initSquareTables::@3 +initSquareTables::@3: scope:[initSquareTables] from initSquareTables::@1 + [89] (byte~) initSquareTables::$2 ← (byte) initSquareTables::x#2 - (byte) $14 + to:initSquareTables::@4 +initSquareTables::@4: scope:[initSquareTables] from initSquareTables::@2 initSquareTables::@3 + [90] (byte) initSquareTables::x_dist#0 ← phi( initSquareTables::@2/(byte~) initSquareTables::$4 initSquareTables::@3/(byte~) initSquareTables::$2 ) + [91] (byte) mul8u::a#1 ← (byte) initSquareTables::x_dist#0 + [92] (byte) mul8u::b#0 ← (byte) initSquareTables::x_dist#0 + [93] call mul8u + [94] (word) mul8u::return#2 ← (word) mul8u::res#2 + to:initSquareTables::@9 +initSquareTables::@9: scope:[initSquareTables] from initSquareTables::@4 + [95] (word~) initSquareTables::$6 ← (word) mul8u::return#2 + [96] (byte~) initSquareTables::$16 ← (byte) initSquareTables::x#2 << (byte) 1 + [97] *((const word[$28]) SQUARES_X#0 + (byte~) initSquareTables::$16) ← (word~) initSquareTables::$6 + [98] (byte) initSquareTables::x#1 ← ++ (byte) initSquareTables::x#2 + [99] if((byte) initSquareTables::x#1!=(byte) $28) goto initSquareTables::@1 + to:initSquareTables::@5 +initSquareTables::@5: scope:[initSquareTables] from initSquareTables::@10 initSquareTables::@9 + [100] (byte) initSquareTables::y#2 ← phi( initSquareTables::@10/(byte) initSquareTables::y#1 initSquareTables::@9/(byte) 0 ) + [101] if((byte) initSquareTables::y#2<(byte) $c) goto initSquareTables::@6 + to:initSquareTables::@7 +initSquareTables::@7: scope:[initSquareTables] from initSquareTables::@5 + [102] (byte~) initSquareTables::$10 ← (byte) initSquareTables::y#2 - (byte) $c + to:initSquareTables::@8 +initSquareTables::@8: scope:[initSquareTables] from initSquareTables::@6 initSquareTables::@7 + [103] (byte) initSquareTables::y_dist#0 ← phi( initSquareTables::@6/(byte~) initSquareTables::$12 initSquareTables::@7/(byte~) initSquareTables::$10 ) + [104] (byte) mul8u::a#2 ← (byte) initSquareTables::y_dist#0 + [105] (byte) mul8u::b#1 ← (byte) initSquareTables::y_dist#0 + [106] call mul8u + [107] (word) mul8u::return#3 ← (word) mul8u::res#2 + to:initSquareTables::@10 +initSquareTables::@10: scope:[initSquareTables] from initSquareTables::@8 + [108] (word~) initSquareTables::$14 ← (word) mul8u::return#3 + [109] (byte~) initSquareTables::$17 ← (byte) initSquareTables::y#2 << (byte) 1 + [110] *((const word[$19]) SQUARES_Y#0 + (byte~) initSquareTables::$17) ← (word~) initSquareTables::$14 + [111] (byte) initSquareTables::y#1 ← ++ (byte) initSquareTables::y#2 + [112] if((byte) initSquareTables::y#1!=(byte) $19) goto initSquareTables::@5 + to:initSquareTables::@return +initSquareTables::@return: scope:[initSquareTables] from initSquareTables::@10 + [113] return + to:@return +initSquareTables::@6: scope:[initSquareTables] from initSquareTables::@5 + [114] (byte~) initSquareTables::$12 ← (byte) $c - (byte) initSquareTables::y#2 + to:initSquareTables::@8 +initSquareTables::@2: scope:[initSquareTables] from initSquareTables::@1 + [115] (byte~) initSquareTables::$4 ← (byte) $14 - (byte) initSquareTables::x#2 + to:initSquareTables::@4 +mul8u: scope:[mul8u] from initSquareTables::@4 initSquareTables::@8 + [116] (byte) mul8u::a#6 ← phi( initSquareTables::@8/(byte) mul8u::a#2 initSquareTables::@4/(byte) mul8u::a#1 ) + [116] (word) mul8u::mb#0 ← phi( initSquareTables::@8/(byte) mul8u::b#1 initSquareTables::@4/(byte) mul8u::b#0 ) + to:mul8u::@1 +mul8u::@1: scope:[mul8u] from mul8u mul8u::@3 + [117] (word) mul8u::mb#2 ← phi( mul8u/(word) mul8u::mb#0 mul8u::@3/(word) mul8u::mb#1 ) + [117] (word) mul8u::res#2 ← phi( mul8u/(byte) 0 mul8u::@3/(word) mul8u::res#6 ) + [117] (byte) mul8u::a#3 ← phi( mul8u/(byte) mul8u::a#6 mul8u::@3/(byte) mul8u::a#0 ) + [118] if((byte) mul8u::a#3!=(byte) 0) goto mul8u::@2 + to:mul8u::@return +mul8u::@return: scope:[mul8u] from mul8u::@1 + [119] return + to:@return +mul8u::@2: scope:[mul8u] from mul8u::@1 + [120] (byte~) mul8u::$1 ← (byte) mul8u::a#3 & (byte) 1 + [121] if((byte~) mul8u::$1==(byte) 0) goto mul8u::@3 + to:mul8u::@4 +mul8u::@4: scope:[mul8u] from mul8u::@2 + [122] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 + to:mul8u::@3 +mul8u::@3: scope:[mul8u] from mul8u::@2 mul8u::@4 + [123] (word) mul8u::res#6 ← phi( mul8u::@2/(word) mul8u::res#2 mul8u::@4/(word) mul8u::res#1 ) + [124] (byte) mul8u::a#0 ← (byte) mul8u::a#3 >> (byte) 1 + [125] (word) mul8u::mb#1 ← (word) mul8u::mb#2 << (byte) 1 + to:mul8u::@1 +setupRasterIrq: scope:[setupRasterIrq] from main::@2 + asm { sei } + [127] *((const byte*) PROCPORT_DDR#0) ← (const byte) PROCPORT_DDR_MEMORY_MASK#0 + [128] *((const byte*) PROCPORT#0) ← (const byte) PROCPORT_RAM_IO#0 + [129] *((const byte*) CIA1_INTERRUPT#0) ← (const byte) CIA_INTERRUPT_CLEAR#0 + to:setupRasterIrq::@1 +setupRasterIrq::@1: scope:[setupRasterIrq] from setupRasterIrq + [130] *((const byte*) VIC_CONTROL#0) ← *((const byte*) VIC_CONTROL#0) & (byte) $7f + to:setupRasterIrq::@2 +setupRasterIrq::@2: scope:[setupRasterIrq] from setupRasterIrq::@1 + [131] *((const byte*) RASTER#0) ← <(const byte) RASTER_IRQ_TOP#0 + [132] *((const byte*) IRQ_ENABLE#0) ← (const byte) IRQ_RASTER#0 + [133] *((const void()**) HARDWARE_IRQ#0) ← (const void()*) setupRasterIrq::irqRoutine#0 + asm { cli } + to:setupRasterIrq::@return +setupRasterIrq::@return: scope:[setupRasterIrq] from setupRasterIrq::@2 + [135] return + to:@return +irqBottom: scope:[irqBottom] from + [136] phi() + to:irqBottom::@1 +irqBottom::@1: scope:[irqBottom] from irqBottom irqBottom::@1 + [137] (byte) irqBottom::i#2 ← phi( irqBottom/(byte) 0 irqBottom::@1/(byte) irqBottom::i#1 ) + [138] (byte) irqBottom::i#1 ← ++ (byte) irqBottom::i#2 + [139] if((byte) irqBottom::i#1!=(byte) 5) goto irqBottom::@1 + to:irqBottom::@2 +irqBottom::@2: scope:[irqBottom] from irqBottom::@1 + [140] *((const byte*) BORDERCOL#0) ← (const byte) WHITE#0 + [141] *((const byte*) BGCOL#0) ← (const byte) WHITE#0 + [142] call processChars + to:irqBottom::@3 +irqBottom::@3: scope:[irqBottom] from irqBottom::@2 + [143] *((const byte*) BORDERCOL#0) ← (const byte) LIGHT_BLUE#0 + [144] *((const byte*) BGCOL#0) ← (const byte) BLUE#0 + [145] *((const byte*) RASTER#0) ← (const byte) RASTER_IRQ_TOP#0 + [146] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(HARDWARE_ALL)(void()) irqTop() + [147] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 + to:irqBottom::@return +irqBottom::@return: scope:[irqBottom] from irqBottom::@3 + [148] return + to:@return +processChars: scope:[processChars] from irqBottom::@2 + [149] phi() + to:processChars::@1 +processChars::@1: scope:[processChars] from processChars processChars::@2 + [150] (byte) processChars::i#2 ← phi( processChars/(byte) 0 processChars::@2/(byte) processChars::i#1 ) + [151] (byte~) processChars::$13 ← (byte) processChars::i#2 << (byte) 2 + [152] if(*((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) processChars::$13)==(const word) NOT_FOUND#0) goto processChars::@2 + to:processChars::@5 +processChars::@5: scope:[processChars] from processChars::@1 + [153] (byte~) processChars::$14 ← (byte) processChars::i#2 << (byte) 2 + [154] (byte) processChars::processing_x#0 ← *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) processChars::$14) + [155] (byte) processChars::processing_y#0 ← *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) processChars::$14) + [156] (word~) processChars::$2 ← (word)(byte) processChars::processing_y#0 + [157] (word) processChars::$21 ← (word~) processChars::$2 << (byte) 2 + [158] (word) processChars::$22 ← (word) processChars::$21 + (word~) processChars::$2 + [159] (word~) processChars::$3 ← (word) processChars::$22 << (byte) 3 + [160] (byte*~) processChars::$4 ← (const byte*) COLS#0 + (word~) processChars::$3 + [161] *((byte*~) processChars::$4 + (byte) processChars::processing_x#0) ← (const byte) WHITE#0 + [162] (word~) processChars::$6 ← (word)(byte) processChars::processing_y#0 + [163] (word) processChars::$24 ← (word~) processChars::$6 << (byte) 2 + [164] (word) processChars::$25 ← (word) processChars::$24 + (word~) processChars::$6 + [165] (word~) processChars::$7 ← (word) processChars::$25 << (byte) 3 + [166] (byte*~) processChars::$8 ← (const byte*) SCREEN#0 + (word~) processChars::$7 + [167] if(*((byte*~) processChars::$8 + (byte) processChars::processing_x#0)==(byte) ' ') goto processChars::@3 + to:processChars::@6 +processChars::@6: scope:[processChars] from processChars::@5 + [168] if(*((byte*~) processChars::$8 + (byte) processChars::processing_x#0)>(byte) ' ') goto processChars::@4 + to:processChars::@7 +processChars::@7: scope:[processChars] from processChars::@6 + [169] *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) ← ++ *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) + to:processChars::@2 +processChars::@2: scope:[processChars] from processChars::@1 processChars::@3 processChars::@4 processChars::@7 + [170] (byte) processChars::i#1 ← ++ (byte) processChars::i#2 + [171] if((byte) processChars::i#1!=(byte) 8) goto processChars::@1 + to:processChars::@return +processChars::@return: scope:[processChars] from processChars::@2 + [172] return + to:@return +processChars::@4: scope:[processChars] from processChars::@6 + [173] *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) ← -- *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) + to:processChars::@2 +processChars::@3: scope:[processChars] from processChars::@5 + [174] (byte~) processChars::$15 ← (byte) processChars::i#2 << (byte) 2 + [175] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) processChars::$15) ← (const word) NOT_FOUND#0 + to:processChars::@2 +irqTop: scope:[irqTop] from + [176] phi() + to:irqTop::@1 +irqTop::@1: scope:[irqTop] from irqTop irqTop::@1 + [177] (byte) irqTop::i#2 ← phi( irqTop/(byte) 0 irqTop::@1/(byte) irqTop::i#1 ) + [178] (byte) irqTop::i#1 ← ++ (byte) irqTop::i#2 + [179] if((byte) irqTop::i#1!=(byte) 5) goto irqTop::@1 + to:irqTop::@2 +irqTop::@2: scope:[irqTop] from irqTop::@1 + [180] *((const byte*) BORDERCOL#0) ← (const byte) WHITE#0 + [181] *((const byte*) BGCOL#0) ← (const byte) WHITE#0 + to:irqTop::@3 +irqTop::@3: scope:[irqTop] from irqTop::@2 irqTop::@3 + [182] (byte) irqTop::i1#2 ← phi( irqTop::@2/(byte) 0 irqTop::@3/(byte) irqTop::i1#1 ) + [183] (byte) irqTop::i1#1 ← ++ (byte) irqTop::i1#2 + [184] if((byte) irqTop::i1#1!=(byte) 8) goto irqTop::@3 + to:irqTop::@4 +irqTop::@4: scope:[irqTop] from irqTop::@3 + [185] *((const byte*) BORDERCOL#0) ← (const byte) LIGHT_BLUE#0 + [186] *((const byte*) BGCOL#0) ← (const byte) BLUE#0 + [187] *((const byte*) RASTER#0) ← (const byte) RASTER_IRQ_MIDDLE#0 + [188] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(HARDWARE_ALL)(void()) irqBottom() + [189] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 + to:irqTop::@return +irqTop::@return: scope:[irqTop] from irqTop::@4 + [190] return + to:@return + + +VARIABLE REGISTER WEIGHTS +(byte*) BGCOL +(byte) BLUE +(byte*) BORDERCOL +(byte*) CIA1_INTERRUPT +(byte) CIA_INTERRUPT_CLEAR +(byte*) COLS +(void()**) HARDWARE_IRQ +(byte*) IRQ_ENABLE +(byte) IRQ_RASTER +(byte*) IRQ_STATUS +(byte) LIGHT_BLUE +(word) NOT_FOUND +(struct ProcessingChar[8]) PROCESSING +(byte*) PROCPORT +(byte*) PROCPORT_DDR +(byte) PROCPORT_DDR_MEMORY_MASK +(byte) PROCPORT_RAM_IO +(word) ProcessingChar::dist +(byte) ProcessingChar::x +(byte) ProcessingChar::y +(byte*) RASTER +(byte) RASTER_IRQ_MIDDLE +(byte) RASTER_IRQ_TOP +(byte*) SCREEN +(byte[$3e8]) SCREEN_COPY +(word[$28]) SQUARES_X +(word[$19]) SQUARES_Y +(byte*) VIC_CONTROL +(byte) WHITE +(struct ProcessingChar()) getCenterChar() +(word~) getCenterChar::$10 4.0 +(byte*~) getCenterChar::$11 4.0 +(byte~) getCenterChar::$13 1001.0 +(byte~) getCenterChar::$14 2002.0 +(word) getCenterChar::$15 4.0 +(word) getCenterChar::$16 4.0 +(word~) getCenterChar::$9 3.0 +(struct ProcessingChar) getCenterChar::closest +(word) getCenterChar::closest_dist +(word~) getCenterChar::closest_dist#10 202.0 +(word~) getCenterChar::closest_dist#12 2002.0 +(word) getCenterChar::closest_dist#2 684.1666666666667 +(word) getCenterChar::closest_dist#8 202.0 +(byte) getCenterChar::closest_x +(byte) getCenterChar::closest_x#7 388.0 +(byte) getCenterChar::closest_x#9 202.0 +(byte) getCenterChar::closest_y +(byte) getCenterChar::closest_y#7 388.0 +(byte) getCenterChar::closest_y#9 202.0 +(word) getCenterChar::dist +(word) getCenterChar::dist#0 750.75 +(struct ProcessingChar) getCenterChar::return +(word) getCenterChar::return_dist +(word) getCenterChar::return_dist#0 7.333333333333333 +(word) getCenterChar::return_dist#1 242.23529411764704 +(word~) getCenterChar::return_dist#5 2002.0 +(word~) getCenterChar::return_dist#6 2002.0 +(byte) getCenterChar::return_x +(byte) getCenterChar::return_x#0 7.333333333333333 +(byte) getCenterChar::return_x#1 242.23529411764704 +(byte~) getCenterChar::return_x#7 1001.0 +(byte) getCenterChar::return_y +(byte) getCenterChar::return_y#0 7.333333333333333 +(byte) getCenterChar::return_y#1 228.66666666666669 +(byte~) getCenterChar::return_y#7 2002.0 +(byte*) getCenterChar::screen_line +(byte*) getCenterChar::screen_line#1 50.5 +(byte*) getCenterChar::screen_line#4 80.2 +(byte) getCenterChar::x +(byte) getCenterChar::x#1 1001.0 +(byte) getCenterChar::x#2 455.0 +(byte) getCenterChar::y +(byte) getCenterChar::y#1 101.0 +(byte) getCenterChar::y#7 137.75 +(void()) initSquareTables() +(byte~) initSquareTables::$10 22.0 +(byte~) initSquareTables::$12 22.0 +(word~) initSquareTables::$14 11.0 +(byte~) initSquareTables::$16 22.0 +(byte~) initSquareTables::$17 22.0 +(byte~) initSquareTables::$2 22.0 +(byte~) initSquareTables::$4 22.0 +(word~) initSquareTables::$6 11.0 +(byte) initSquareTables::x +(byte) initSquareTables::x#1 16.5 +(byte) initSquareTables::x#2 5.5 +(byte) initSquareTables::x_dist +(byte) initSquareTables::x_dist#0 22.0 +(byte) initSquareTables::y +(byte) initSquareTables::y#1 16.5 +(byte) initSquareTables::y#2 5.5 +(byte) initSquareTables::y_dist +(byte) initSquareTables::y_dist#0 22.0 +interrupt(HARDWARE_ALL)(void()) irqBottom() +(byte) irqBottom::i +(byte) irqBottom::i#1 16.5 +(byte) irqBottom::i#2 22.0 +interrupt(HARDWARE_ALL)(void()) irqTop() +(byte) irqTop::i +(byte) irqTop::i#1 16.5 +(byte) irqTop::i#2 22.0 +(byte) irqTop::i1 +(byte) irqTop::i1#1 16.5 +(byte) irqTop::i1#2 22.0 +(void()) main() +(struct ProcessingChar~) main::$11 +(byte~) main::$18 14.666666666666666 +(byte~) main::$5 22.0 +(byte~) main::$6 22.0 +(byte~) main::$7 22.0 +(struct ProcessingChar) main::center +(word) main::center_dist +(word) main::center_dist#0 8.25 +(byte) main::center_x +(byte) main::center_x#0 5.5 +(byte) main::center_y +(byte) main::center_y#0 5.5 +(byte*) main::dst +(byte*) main::dst#1 11.0 +(byte*) main::dst#2 11.0 +(byte) main::i +(byte) main::i#1 16.5 +(byte) main::i#2 6.6000000000000005 +(byte*) main::sc +(byte*) main::sc#1 16.5 +(byte*) main::sc#2 8.8 +(byte*) main::src +(byte*) main::src#1 11.0 +(byte*) main::src#2 16.5 +(word()) mul8u((byte) mul8u::a , (byte) mul8u::b) +(byte~) mul8u::$1 202.0 +(byte) mul8u::a +(byte) mul8u::a#0 101.0 +(byte) mul8u::a#1 11.0 +(byte) mul8u::a#2 11.0 +(byte) mul8u::a#3 67.66666666666666 +(byte) mul8u::a#6 24.0 +(byte) mul8u::b +(byte) mul8u::b#0 22.0 +(byte) mul8u::b#1 22.0 +(word) mul8u::mb +(word) mul8u::mb#0 24.0 +(word) mul8u::mb#1 202.0 +(word) mul8u::mb#2 43.57142857142858 +(word) mul8u::res +(word) mul8u::res#1 202.0 +(word) mul8u::res#2 46.42857142857143 +(word) mul8u::res#6 101.0 +(word) mul8u::return +(word) mul8u::return#2 22.0 +(word) mul8u::return#3 22.0 +(void()) processChars() +(byte~) processChars::$13 22.0 +(byte~) processChars::$14 16.5 +(byte~) processChars::$15 22.0 +(word~) processChars::$2 16.5 +(word) processChars::$21 22.0 +(word) processChars::$22 22.0 +(word) processChars::$24 22.0 +(word) processChars::$25 22.0 +(word~) processChars::$3 22.0 +(byte*~) processChars::$4 22.0 +(word~) processChars::$6 16.5 +(word~) processChars::$7 22.0 +(byte*~) processChars::$8 25.666666666666668 +(byte) processChars::i +(byte) processChars::i#1 16.5 +(byte) processChars::i#2 2.391304347826087 +(struct ProcessingChar) processChars::processing +(byte*) processChars::processing_ptr +(byte) processChars::processing_x +(byte) processChars::processing_x#0 5.866666666666666 +(byte) processChars::processing_y +(byte) processChars::processing_y#0 1.5714285714285714 +(void()) setupRasterIrq((word) setupRasterIrq::raster , (void()*) setupRasterIrq::irqRoutine) +(void()*) setupRasterIrq::irqRoutine +(word) setupRasterIrq::raster +(void()) startProcessing((byte) startProcessing::center_x , (byte) startProcessing::center_y , (word) startProcessing::center_dist) +(byte~) startProcessing::$4 2002.0 +(byte~) startProcessing::$5 2.6666666666666665 +(struct ProcessingChar) startProcessing::center +(word) startProcessing::center_dist +(word) startProcessing::center_dist#0 0.8666666666666666 +(byte) startProcessing::center_x +(byte) startProcessing::center_x#0 0.8666666666666666 +(byte) startProcessing::center_y +(byte) startProcessing::center_y#0 0.8666666666666666 +(byte) startProcessing::freeIdx +(byte) startProcessing::freeIdx#2 653.0 +(byte) startProcessing::freeIdx#6 33.666666666666664 +(byte~) startProcessing::freeIdx#7 202.0 +(byte~) startProcessing::freeIdx#8 202.0 +(byte) startProcessing::i +(byte) startProcessing::i#1 1501.5 +(byte) startProcessing::i#2 1334.6666666666667 + +Not consolidating phi with different size mul8u::mb#0 mul8u::b#1 +Not consolidating phi with different size mul8u::mb#0 mul8u::b#0 +Initial phi equivalence classes +[ main::i#2 main::i#1 ] +[ main::sc#2 main::sc#1 ] +[ main::src#2 main::src#1 ] +[ main::dst#2 main::dst#1 ] +[ startProcessing::freeIdx#6 startProcessing::freeIdx#7 ] +[ startProcessing::freeIdx#2 startProcessing::freeIdx#8 startProcessing::i#2 startProcessing::i#1 ] +[ getCenterChar::screen_line#4 getCenterChar::screen_line#1 ] +[ getCenterChar::y#7 getCenterChar::y#1 ] +[ getCenterChar::x#2 getCenterChar::x#1 ] +[ getCenterChar::closest_dist#2 getCenterChar::closest_dist#8 getCenterChar::closest_dist#10 getCenterChar::closest_dist#12 ] +[ getCenterChar::closest_x#7 getCenterChar::closest_x#9 getCenterChar::return_x#1 getCenterChar::return_x#7 ] +[ getCenterChar::closest_y#7 getCenterChar::closest_y#9 getCenterChar::return_y#1 getCenterChar::return_y#7 ] +[ getCenterChar::return_dist#1 getCenterChar::return_dist#5 getCenterChar::return_dist#6 getCenterChar::dist#0 ] +[ initSquareTables::x#2 initSquareTables::x#1 ] +[ initSquareTables::x_dist#0 initSquareTables::$4 initSquareTables::$2 ] +[ initSquareTables::y#2 initSquareTables::y#1 ] +[ initSquareTables::y_dist#0 initSquareTables::$12 initSquareTables::$10 ] +[ mul8u::b#1 ] +[ mul8u::b#0 ] +[ mul8u::a#3 mul8u::a#6 mul8u::a#2 mul8u::a#1 mul8u::a#0 ] +[ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] +[ mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 ] +[ irqBottom::i#2 irqBottom::i#1 ] +[ processChars::i#2 processChars::i#1 ] +[ irqTop::i#2 irqTop::i#1 ] +[ irqTop::i1#2 irqTop::i1#1 ] +Added variable main::$18 to zero page equivalence class [ main::$18 ] +Added variable main::$5 to zero page equivalence class [ main::$5 ] +Added variable main::$6 to zero page equivalence class [ main::$6 ] +Added variable main::$7 to zero page equivalence class [ main::$7 ] +Added variable getCenterChar::return_x#0 to zero page equivalence class [ getCenterChar::return_x#0 ] +Added variable getCenterChar::return_y#0 to zero page equivalence class [ getCenterChar::return_y#0 ] +Added variable getCenterChar::return_dist#0 to zero page equivalence class [ getCenterChar::return_dist#0 ] +Added variable main::center_x#0 to zero page equivalence class [ main::center_x#0 ] +Added variable main::center_y#0 to zero page equivalence class [ main::center_y#0 ] +Added variable main::center_dist#0 to zero page equivalence class [ main::center_dist#0 ] +Added variable startProcessing::center_x#0 to zero page equivalence class [ startProcessing::center_x#0 ] +Added variable startProcessing::center_y#0 to zero page equivalence class [ startProcessing::center_y#0 ] +Added variable startProcessing::center_dist#0 to zero page equivalence class [ startProcessing::center_dist#0 ] +Added variable startProcessing::$4 to zero page equivalence class [ startProcessing::$4 ] +Added variable startProcessing::$5 to zero page equivalence class [ startProcessing::$5 ] +Added variable getCenterChar::$13 to zero page equivalence class [ getCenterChar::$13 ] +Added variable getCenterChar::$14 to zero page equivalence class [ getCenterChar::$14 ] +Added variable getCenterChar::$9 to zero page equivalence class [ getCenterChar::$9 ] +Added variable getCenterChar::$15 to zero page equivalence class [ getCenterChar::$15 ] +Added variable getCenterChar::$16 to zero page equivalence class [ getCenterChar::$16 ] +Added variable getCenterChar::$10 to zero page equivalence class [ getCenterChar::$10 ] +Added variable getCenterChar::$11 to zero page equivalence class [ getCenterChar::$11 ] +Added variable mul8u::return#2 to zero page equivalence class [ mul8u::return#2 ] +Added variable initSquareTables::$6 to zero page equivalence class [ initSquareTables::$6 ] +Added variable initSquareTables::$16 to zero page equivalence class [ initSquareTables::$16 ] +Added variable mul8u::return#3 to zero page equivalence class [ mul8u::return#3 ] +Added variable initSquareTables::$14 to zero page equivalence class [ initSquareTables::$14 ] +Added variable initSquareTables::$17 to zero page equivalence class [ initSquareTables::$17 ] +Added variable mul8u::$1 to zero page equivalence class [ mul8u::$1 ] +Added variable processChars::$13 to zero page equivalence class [ processChars::$13 ] +Added variable processChars::$14 to zero page equivalence class [ processChars::$14 ] +Added variable processChars::processing_x#0 to zero page equivalence class [ processChars::processing_x#0 ] +Added variable processChars::processing_y#0 to zero page equivalence class [ processChars::processing_y#0 ] +Added variable processChars::$2 to zero page equivalence class [ processChars::$2 ] +Added variable processChars::$21 to zero page equivalence class [ processChars::$21 ] +Added variable processChars::$22 to zero page equivalence class [ processChars::$22 ] +Added variable processChars::$3 to zero page equivalence class [ processChars::$3 ] +Added variable processChars::$4 to zero page equivalence class [ processChars::$4 ] +Added variable processChars::$6 to zero page equivalence class [ processChars::$6 ] +Added variable processChars::$24 to zero page equivalence class [ processChars::$24 ] +Added variable processChars::$25 to zero page equivalence class [ processChars::$25 ] +Added variable processChars::$7 to zero page equivalence class [ processChars::$7 ] +Added variable processChars::$8 to zero page equivalence class [ processChars::$8 ] +Added variable processChars::$15 to zero page equivalence class [ processChars::$15 ] +Complete equivalence classes +[ main::i#2 main::i#1 ] +[ main::sc#2 main::sc#1 ] +[ main::src#2 main::src#1 ] +[ main::dst#2 main::dst#1 ] +[ startProcessing::freeIdx#6 startProcessing::freeIdx#7 ] +[ startProcessing::freeIdx#2 startProcessing::freeIdx#8 startProcessing::i#2 startProcessing::i#1 ] +[ getCenterChar::screen_line#4 getCenterChar::screen_line#1 ] +[ getCenterChar::y#7 getCenterChar::y#1 ] +[ getCenterChar::x#2 getCenterChar::x#1 ] +[ getCenterChar::closest_dist#2 getCenterChar::closest_dist#8 getCenterChar::closest_dist#10 getCenterChar::closest_dist#12 ] +[ getCenterChar::closest_x#7 getCenterChar::closest_x#9 getCenterChar::return_x#1 getCenterChar::return_x#7 ] +[ getCenterChar::closest_y#7 getCenterChar::closest_y#9 getCenterChar::return_y#1 getCenterChar::return_y#7 ] +[ getCenterChar::return_dist#1 getCenterChar::return_dist#5 getCenterChar::return_dist#6 getCenterChar::dist#0 ] +[ initSquareTables::x#2 initSquareTables::x#1 ] +[ initSquareTables::x_dist#0 initSquareTables::$4 initSquareTables::$2 ] +[ initSquareTables::y#2 initSquareTables::y#1 ] +[ initSquareTables::y_dist#0 initSquareTables::$12 initSquareTables::$10 ] +[ mul8u::b#1 ] +[ mul8u::b#0 ] +[ mul8u::a#3 mul8u::a#6 mul8u::a#2 mul8u::a#1 mul8u::a#0 ] +[ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] +[ mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 ] +[ irqBottom::i#2 irqBottom::i#1 ] +[ processChars::i#2 processChars::i#1 ] +[ irqTop::i#2 irqTop::i#1 ] +[ irqTop::i1#2 irqTop::i1#1 ] +[ main::$18 ] +[ main::$5 ] +[ main::$6 ] +[ main::$7 ] +[ getCenterChar::return_x#0 ] +[ getCenterChar::return_y#0 ] +[ getCenterChar::return_dist#0 ] +[ main::center_x#0 ] +[ main::center_y#0 ] +[ main::center_dist#0 ] +[ startProcessing::center_x#0 ] +[ startProcessing::center_y#0 ] +[ startProcessing::center_dist#0 ] +[ startProcessing::$4 ] +[ startProcessing::$5 ] +[ getCenterChar::$13 ] +[ getCenterChar::$14 ] +[ getCenterChar::$9 ] +[ getCenterChar::$15 ] +[ getCenterChar::$16 ] +[ getCenterChar::$10 ] +[ getCenterChar::$11 ] +[ mul8u::return#2 ] +[ initSquareTables::$6 ] +[ initSquareTables::$16 ] +[ mul8u::return#3 ] +[ initSquareTables::$14 ] +[ initSquareTables::$17 ] +[ mul8u::$1 ] +[ processChars::$13 ] +[ processChars::$14 ] +[ processChars::processing_x#0 ] +[ processChars::processing_y#0 ] +[ processChars::$2 ] +[ processChars::$21 ] +[ processChars::$22 ] +[ processChars::$3 ] +[ processChars::$4 ] +[ processChars::$6 ] +[ processChars::$24 ] +[ processChars::$25 ] +[ processChars::$7 ] +[ processChars::$8 ] +[ processChars::$15 ] +Allocated zp ZP_BYTE:2 [ main::i#2 main::i#1 ] +Allocated zp ZP_WORD:3 [ main::sc#2 main::sc#1 ] +Allocated zp ZP_WORD:5 [ main::src#2 main::src#1 ] +Allocated zp ZP_WORD:7 [ main::dst#2 main::dst#1 ] +Allocated zp ZP_BYTE:9 [ startProcessing::freeIdx#6 startProcessing::freeIdx#7 ] +Allocated zp ZP_BYTE:10 [ startProcessing::freeIdx#2 startProcessing::freeIdx#8 startProcessing::i#2 startProcessing::i#1 ] +Allocated zp ZP_WORD:11 [ getCenterChar::screen_line#4 getCenterChar::screen_line#1 ] +Allocated zp ZP_BYTE:13 [ getCenterChar::y#7 getCenterChar::y#1 ] +Allocated zp ZP_BYTE:14 [ getCenterChar::x#2 getCenterChar::x#1 ] +Allocated zp ZP_WORD:15 [ getCenterChar::closest_dist#2 getCenterChar::closest_dist#8 getCenterChar::closest_dist#10 getCenterChar::closest_dist#12 ] +Allocated zp ZP_BYTE:17 [ getCenterChar::closest_x#7 getCenterChar::closest_x#9 getCenterChar::return_x#1 getCenterChar::return_x#7 ] +Allocated zp ZP_BYTE:18 [ getCenterChar::closest_y#7 getCenterChar::closest_y#9 getCenterChar::return_y#1 getCenterChar::return_y#7 ] +Allocated zp ZP_WORD:19 [ getCenterChar::return_dist#1 getCenterChar::return_dist#5 getCenterChar::return_dist#6 getCenterChar::dist#0 ] +Allocated zp ZP_BYTE:21 [ initSquareTables::x#2 initSquareTables::x#1 ] +Allocated zp ZP_BYTE:22 [ initSquareTables::x_dist#0 initSquareTables::$4 initSquareTables::$2 ] +Allocated zp ZP_BYTE:23 [ initSquareTables::y#2 initSquareTables::y#1 ] +Allocated zp ZP_BYTE:24 [ initSquareTables::y_dist#0 initSquareTables::$12 initSquareTables::$10 ] +Allocated zp ZP_BYTE:25 [ mul8u::b#1 ] +Allocated zp ZP_BYTE:26 [ mul8u::b#0 ] +Allocated zp ZP_BYTE:27 [ mul8u::a#3 mul8u::a#6 mul8u::a#2 mul8u::a#1 mul8u::a#0 ] +Allocated zp ZP_WORD:28 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] +Allocated zp ZP_WORD:30 [ mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 ] +Allocated zp ZP_BYTE:32 [ irqBottom::i#2 irqBottom::i#1 ] +Allocated zp ZP_BYTE:33 [ processChars::i#2 processChars::i#1 ] +Allocated zp ZP_BYTE:34 [ irqTop::i#2 irqTop::i#1 ] +Allocated zp ZP_BYTE:35 [ irqTop::i1#2 irqTop::i1#1 ] +Allocated zp ZP_BYTE:36 [ main::$18 ] +Allocated zp ZP_BYTE:37 [ main::$5 ] +Allocated zp ZP_BYTE:38 [ main::$6 ] +Allocated zp ZP_BYTE:39 [ main::$7 ] +Allocated zp ZP_BYTE:40 [ getCenterChar::return_x#0 ] +Allocated zp ZP_BYTE:41 [ getCenterChar::return_y#0 ] +Allocated zp ZP_WORD:42 [ getCenterChar::return_dist#0 ] +Allocated zp ZP_BYTE:44 [ main::center_x#0 ] +Allocated zp ZP_BYTE:45 [ main::center_y#0 ] +Allocated zp ZP_WORD:46 [ main::center_dist#0 ] +Allocated zp ZP_BYTE:48 [ startProcessing::center_x#0 ] +Allocated zp ZP_BYTE:49 [ startProcessing::center_y#0 ] +Allocated zp ZP_WORD:50 [ startProcessing::center_dist#0 ] +Allocated zp ZP_BYTE:52 [ startProcessing::$4 ] +Allocated zp ZP_BYTE:53 [ startProcessing::$5 ] +Allocated zp ZP_BYTE:54 [ getCenterChar::$13 ] +Allocated zp ZP_BYTE:55 [ getCenterChar::$14 ] +Allocated zp ZP_WORD:56 [ getCenterChar::$9 ] +Allocated zp ZP_WORD:58 [ getCenterChar::$15 ] +Allocated zp ZP_WORD:60 [ getCenterChar::$16 ] +Allocated zp ZP_WORD:62 [ getCenterChar::$10 ] +Allocated zp ZP_WORD:64 [ getCenterChar::$11 ] +Allocated zp ZP_WORD:66 [ mul8u::return#2 ] +Allocated zp ZP_WORD:68 [ initSquareTables::$6 ] +Allocated zp ZP_BYTE:70 [ initSquareTables::$16 ] +Allocated zp ZP_WORD:71 [ mul8u::return#3 ] +Allocated zp ZP_WORD:73 [ initSquareTables::$14 ] +Allocated zp ZP_BYTE:75 [ initSquareTables::$17 ] +Allocated zp ZP_BYTE:76 [ mul8u::$1 ] +Allocated zp ZP_BYTE:77 [ processChars::$13 ] +Allocated zp ZP_BYTE:78 [ processChars::$14 ] +Allocated zp ZP_BYTE:79 [ processChars::processing_x#0 ] +Allocated zp ZP_BYTE:80 [ processChars::processing_y#0 ] +Allocated zp ZP_WORD:81 [ processChars::$2 ] +Allocated zp ZP_WORD:83 [ processChars::$21 ] +Allocated zp ZP_WORD:85 [ processChars::$22 ] +Allocated zp ZP_WORD:87 [ processChars::$3 ] +Allocated zp ZP_WORD:89 [ processChars::$4 ] +Allocated zp ZP_WORD:91 [ processChars::$6 ] +Allocated zp ZP_WORD:93 [ processChars::$24 ] +Allocated zp ZP_WORD:95 [ processChars::$25 ] +Allocated zp ZP_WORD:97 [ processChars::$7 ] +Allocated zp ZP_WORD:99 [ processChars::$8 ] +Allocated zp ZP_BYTE:101 [ processChars::$15 ] + +INITIAL ASM +//SEG0 File Comments +// Black Hole at the center of the BASIC screen sucking in any letters +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(bbegin) +.pc = $80d "Program" +//SEG2 Global Constants & labels + .const OFFSET_STRUCT_PROCESSINGCHAR_Y = 1 + .const OFFSET_STRUCT_PROCESSINGCHAR_DIST = 2 + // Processor port data direction register + .label PROCPORT_DDR = 0 + // Mask for PROCESSOR_PORT_DDR which allows only memory configuration to be written + .const PROCPORT_DDR_MEMORY_MASK = 7 + // Processor Port Register controlling RAM/ROM configuration and the datasette + .label PROCPORT = 1 + // RAM in $A000, $E000 I/O in $D000 + .const PROCPORT_RAM_IO = $35 + .label RASTER = $d012 + .label BORDERCOL = $d020 + .label BGCOL = $d021 + .label VIC_CONTROL = $d011 + // VIC II IRQ Status Register + .label IRQ_STATUS = $d019 + // VIC II IRQ Enable Register + .label IRQ_ENABLE = $d01a + // Bits for the IRQ Status/Enable Registers + .const IRQ_RASTER = 1 + // Color Ram + .label COLS = $d800 + // CIA#1 Interrupt Status & Control Register + .label CIA1_INTERRUPT = $dc0d + // Value that disables all CIA interrupts when stored to the CIA Interrupt registers + .const CIA_INTERRUPT_CLEAR = $7f + // The vector used when the HARDWARE serves IRQ interrupts + .label HARDWARE_IRQ = $fffe + .const WHITE = 1 + .const BLUE = 6 + .const LIGHT_BLUE = $e + .label SCREEN = $400 + // Distance value meaning not found + .const NOT_FOUND = $ffff + .const RASTER_IRQ_TOP = $30 + .const RASTER_IRQ_MIDDLE = $ff +//SEG3 @begin +bbegin: +//SEG4 [1] phi from @begin to @1 [phi:@begin->@1] +b1_from_bbegin: + jmp b1 +//SEG5 @1 +b1: +//SEG6 [2] call main +//SEG7 [4] phi from @1 to main [phi:@1->main] +main_from_b1: + jsr main +//SEG8 [3] phi from @1 to @end [phi:@1->@end] +bend_from_b1: + jmp bend +//SEG9 @end +bend: +//SEG10 main +main: { + .label _5 = $25 + .label _6 = $26 + .label _7 = $27 + .label _18 = $24 + .label i = 2 + .label sc = 3 + .label src = 5 + .label dst = 7 + .label center_x = $2c + .label center_y = $2d + .label center_dist = $2e + //SEG11 [5] phi from main to main::@1 [phi:main->main::@1] + b1_from_main: + //SEG12 [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuz1=vbuc1 + lda #0 + sta i + jmp b1 + // Init processing array + //SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1] + b1_from_b1: + //SEG14 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy + jmp b1 + //SEG15 main::@1 + b1: + //SEG16 [6] (byte~) main::$18 ← (byte) main::i#2 << (byte) 2 -- vbuz1=vbuz2_rol_2 + lda i + asl + asl + sta _18 + //SEG17 [7] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) main::$18) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 + lda #0 + ldy _18 + sta PROCESSING,y + //SEG18 [8] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) main::$18) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 + lda #0 + ldy _18 + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_Y,y + //SEG19 [9] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) main::$18) ← (const word) NOT_FOUND#0 -- pwuc1_derefidx_vbuz1=vwuc2 + ldy _18 + lda #NOT_FOUND + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST+1,y + //SEG20 [10] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1 + inc i + //SEG21 [11] if((byte) main::i#1!=(byte) 8) goto main::@1 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp i + bne b1_from_b1 + //SEG22 [12] phi from main::@1 to main::@2 [phi:main::@1->main::@2] + b2_from_b1: + jmp b2 + //SEG23 main::@2 + b2: + //SEG24 [13] call setupRasterIrq + jsr setupRasterIrq + //SEG25 [14] phi from main::@2 to main::@3 [phi:main::@2->main::@3] + b3_from_b2: + //SEG26 [14] phi (byte*) main::sc#2 = (const byte*) SCREEN#0 [phi:main::@2->main::@3#0] -- pbuz1=pbuc1 + lda #SCREEN + sta sc+1 + jmp b3 + // Fill screen with some chars + //SEG27 [14] phi from main::@3 to main::@3 [phi:main::@3->main::@3] + b3_from_b3: + //SEG28 [14] phi (byte*) main::sc#2 = (byte*) main::sc#1 [phi:main::@3->main::@3#0] -- register_copy + jmp b3 + //SEG29 main::@3 + b3: + //SEG30 [15] (byte~) main::$5 ← < (byte*) main::sc#2 -- vbuz1=_lo_pbuz2 + lda sc + sta _5 + //SEG31 [16] (byte~) main::$6 ← (byte~) main::$5 & (byte) $1f -- vbuz1=vbuz2_band_vbuc1 + lda #$1f + and _5 + sta _6 + //SEG32 [17] (byte~) main::$7 ← (byte) 'a' + (byte~) main::$6 -- vbuz1=vbuc1_plus_vbuz2 + lax _6 + axs #-['a'] + stx _7 + //SEG33 [18] *((byte*) main::sc#2) ← (byte~) main::$7 -- _deref_pbuz1=vbuz2 + lda _7 + ldy #0 + sta (sc),y + //SEG34 [19] (byte*) main::sc#1 ← ++ (byte*) main::sc#2 -- pbuz1=_inc_pbuz1 + inc sc + bne !+ + inc sc+1 + !: + //SEG35 [20] if((byte*) main::sc#1!=(const byte*) SCREEN#0+(word) $3e7+(byte) 1) goto main::@3 -- pbuz1_neq_pbuc1_then_la1 + lda sc+1 + cmp #>SCREEN+$3e7+1 + bne b3_from_b3 + lda sc + cmp #main::@4] + b4_from_b3: + //SEG37 [21] phi (byte*) main::dst#2 = (const byte[$3e8]) SCREEN_COPY#0 [phi:main::@3->main::@4#0] -- pbuz1=pbuc1 + lda #SCREEN_COPY + sta dst+1 + //SEG38 [21] phi (byte*) main::src#2 = (const byte*) SCREEN#0 [phi:main::@3->main::@4#1] -- pbuz1=pbuc1 + lda #SCREEN + sta src+1 + jmp b4 + // Copy screen to screen copy + //SEG39 [21] phi from main::@4 to main::@4 [phi:main::@4->main::@4] + b4_from_b4: + //SEG40 [21] phi (byte*) main::dst#2 = (byte*) main::dst#1 [phi:main::@4->main::@4#0] -- register_copy + //SEG41 [21] phi (byte*) main::src#2 = (byte*) main::src#1 [phi:main::@4->main::@4#1] -- register_copy + jmp b4 + //SEG42 main::@4 + b4: + //SEG43 [22] *((byte*) main::dst#2) ← *((byte*) main::src#2) -- _deref_pbuz1=_deref_pbuz2 + ldy #0 + lda (src),y + ldy #0 + sta (dst),y + //SEG44 [23] (byte*) main::src#1 ← ++ (byte*) main::src#2 -- pbuz1=_inc_pbuz1 + inc src + bne !+ + inc src+1 + !: + //SEG45 [24] (byte*) main::dst#1 ← ++ (byte*) main::dst#2 -- pbuz1=_inc_pbuz1 + inc dst + bne !+ + inc dst+1 + !: + //SEG46 [25] if((byte*) main::src#1!=(const byte*) SCREEN#0+(word) $3e7) goto main::@4 -- pbuz1_neq_pbuc1_then_la1 + lda src+1 + cmp #>SCREEN+$3e7 + bne b4_from_b4 + lda src + cmp #main::@5] + b5_from_b4: + jmp b5 + //SEG48 main::@5 + b5: + //SEG49 [27] call initSquareTables + //SEG50 [86] phi from main::@5 to initSquareTables [phi:main::@5->initSquareTables] + initSquareTables_from_b5: + jsr initSquareTables + //SEG51 [28] phi from main::@5 main::@7 to main::@6 [phi:main::@5/main::@7->main::@6] + b6_from_b5: + b6_from_b7: + jmp b6 + // Main loop + //SEG52 main::@6 + b6: + //SEG53 [29] call getCenterChar + //SEG54 [58] phi from main::@6 to getCenterChar [phi:main::@6->getCenterChar] + getCenterChar_from_b6: + jsr getCenterChar + //SEG55 [30] (byte) getCenterChar::return_x#0 ← (byte) getCenterChar::return_x#1 -- vbuz1=vbuz2 + lda getCenterChar.return_x_1 + sta getCenterChar.return_x + //SEG56 [31] (byte) getCenterChar::return_y#0 ← (byte) getCenterChar::return_y#1 -- vbuz1=vbuz2 + lda getCenterChar.return_y_1 + sta getCenterChar.return_y + //SEG57 [32] (word) getCenterChar::return_dist#0 ← (word) getCenterChar::return_dist#1 -- vwuz1=vwuz2 + lda getCenterChar.return_dist_1 + sta getCenterChar.return_dist + lda getCenterChar.return_dist_1+1 + sta getCenterChar.return_dist+1 + jmp b9 + //SEG58 main::@9 + b9: + //SEG59 [33] (byte) main::center_x#0 ← (byte) getCenterChar::return_x#0 -- vbuz1=vbuz2 + lda getCenterChar.return_x + sta center_x + //SEG60 [34] (byte) main::center_y#0 ← (byte) getCenterChar::return_y#0 -- vbuz1=vbuz2 + lda getCenterChar.return_y + sta center_y + //SEG61 [35] (word) main::center_dist#0 ← (word) getCenterChar::return_dist#0 -- vwuz1=vwuz2 + lda getCenterChar.return_dist + sta center_dist + lda getCenterChar.return_dist+1 + sta center_dist+1 + //SEG62 [36] if((word) main::center_dist#0!=(const word) NOT_FOUND#0) goto main::@7 -- vwuz1_neq_vwuc1_then_la1 + lda center_dist+1 + cmp #>NOT_FOUND + bne b7 + lda center_dist + cmp #startProcessing] + startProcessing_from_b7: + jsr startProcessing + jmp b6_from_b7 +} +//SEG71 startProcessing +// Start processing a char - by inserting it into the PROCESSING array +// startProcessing(byte zeropage($30) center_x, byte zeropage($31) center_y, word zeropage($32) center_dist) +startProcessing: { + .label _4 = $34 + .label _5 = $35 + .label center_x = $30 + .label center_y = $31 + .label center_dist = $32 + .label i = $a + .label freeIdx = $a + .label freeIdx_6 = 9 + .label freeIdx_7 = 9 + //SEG72 [43] phi from startProcessing to startProcessing::@1 [phi:startProcessing->startProcessing::@1] + b1_from_startProcessing: + //SEG73 [43] phi (byte) startProcessing::freeIdx#6 = (byte) $ff [phi:startProcessing->startProcessing::@1#0] -- vbuz1=vbuc1 + lda #$ff + sta freeIdx_6 + jmp b1 + //SEG74 startProcessing::@1 + b1: + //SEG75 [44] phi from startProcessing::@1 to startProcessing::@2 [phi:startProcessing::@1->startProcessing::@2] + b2_from_b1: + //SEG76 [44] phi (byte) startProcessing::i#2 = (byte) 0 [phi:startProcessing::@1->startProcessing::@2#0] -- vbuz1=vbuc1 + lda #0 + sta i + jmp b2 + //SEG77 [44] phi from startProcessing::@3 to startProcessing::@2 [phi:startProcessing::@3->startProcessing::@2] + b2_from_b3: + //SEG78 [44] phi (byte) startProcessing::i#2 = (byte) startProcessing::i#1 [phi:startProcessing::@3->startProcessing::@2#0] -- register_copy + jmp b2 + //SEG79 startProcessing::@2 + b2: + //SEG80 [45] (byte~) startProcessing::$4 ← (byte) startProcessing::i#2 << (byte) 2 -- vbuz1=vbuz2_rol_2 + lda i + asl + asl + sta _4 + //SEG81 [46] if(*((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) startProcessing::$4)!=(const word) NOT_FOUND#0) goto startProcessing::@3 -- pwuc1_derefidx_vbuz1_neq_vwuc2_then_la1 + ldy _4 + lda PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST+1,y + cmp #>NOT_FOUND + bne b3 + lda PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST,y + cmp #startProcessing::@4] + b4_from_b2: + b4_from_b7: + //SEG83 [47] phi (byte) startProcessing::freeIdx#2 = (byte) startProcessing::i#2 [phi:startProcessing::@2/startProcessing::@7->startProcessing::@4#0] -- register_copy + jmp b4 + //SEG84 startProcessing::@4 + b4: + //SEG85 [48] if((byte) startProcessing::freeIdx#2==(byte) $ff) goto startProcessing::@6 -- vbuz1_eq_vbuc1_then_la1 + lda #$ff + cmp freeIdx + beq b6 + jmp b5 + //SEG86 startProcessing::@5 + b5: + //SEG87 [49] (byte~) startProcessing::$5 ← (byte) startProcessing::freeIdx#2 << (byte) 2 -- vbuz1=vbuz2_rol_2 + lda freeIdx + asl + asl + sta _5 + //SEG88 [50] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) startProcessing::$5) ← (byte) startProcessing::center_x#0 -- pbuc1_derefidx_vbuz1=vbuz2 + lda center_x + ldy _5 + sta PROCESSING,y + //SEG89 [51] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) startProcessing::$5) ← (byte) startProcessing::center_y#0 -- pbuc1_derefidx_vbuz1=vbuz2 + lda center_y + ldy _5 + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_Y,y + //SEG90 [52] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) startProcessing::$5) ← (word) startProcessing::center_dist#0 -- pwuc1_derefidx_vbuz1=vwuz2 + ldy _5 + lda center_dist + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST,y + lda center_dist+1 + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST+1,y + jmp breturn + //SEG91 startProcessing::@return + breturn: + //SEG92 [53] return + rts + //SEG93 startProcessing::@6 + b6: + //SEG94 [54] (byte~) startProcessing::freeIdx#7 ← (byte) startProcessing::freeIdx#2 -- vbuz1=vbuz2 + lda freeIdx + sta freeIdx_7 + //SEG95 [43] phi from startProcessing::@6 to startProcessing::@1 [phi:startProcessing::@6->startProcessing::@1] + b1_from_b6: + //SEG96 [43] phi (byte) startProcessing::freeIdx#6 = (byte~) startProcessing::freeIdx#7 [phi:startProcessing::@6->startProcessing::@1#0] -- register_copy + jmp b1 + //SEG97 startProcessing::@3 + b3: + //SEG98 [55] (byte) startProcessing::i#1 ← ++ (byte) startProcessing::i#2 -- vbuz1=_inc_vbuz1 + inc i + //SEG99 [56] if((byte) startProcessing::i#1!=(byte) 8) goto startProcessing::@2 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp i + bne b2_from_b3 + jmp b7 + //SEG100 startProcessing::@7 + b7: + //SEG101 [57] (byte~) startProcessing::freeIdx#8 ← (byte) startProcessing::freeIdx#6 -- vbuz1=vbuz2 + lda freeIdx_6 + sta freeIdx + jmp b4_from_b7 +} +//SEG102 getCenterChar +// Find the non-space char closest to the center of the screen +// If no non-space char is found the distance will be 0xffff +getCenterChar: { + .label _9 = $38 + .label _10 = $3e + .label _11 = $40 + .label _13 = $36 + .label _14 = $37 + .label return_x = $28 + .label return_y = $29 + .label return_dist = $2a + .label x = $e + .label dist = $13 + .label screen_line = $b + .label y = $d + .label return_x_1 = $11 + .label return_y_1 = $12 + .label return_dist_1 = $13 + .label closest_dist = $f + .label closest_x = $11 + .label closest_y = $12 + .label _15 = $3a + .label _16 = $3c + .label return_dist_5 = $13 + .label return_dist_6 = $13 + .label return_x_7 = $11 + .label return_y_7 = $12 + //SEG103 [59] phi from getCenterChar to getCenterChar::@1 [phi:getCenterChar->getCenterChar::@1] + b1_from_getCenterChar: + //SEG104 [59] phi (byte) getCenterChar::closest_y#9 = (byte) 0 [phi:getCenterChar->getCenterChar::@1#0] -- vbuz1=vbuc1 + lda #0 + sta closest_y + //SEG105 [59] phi (byte) getCenterChar::closest_x#9 = (byte) 0 [phi:getCenterChar->getCenterChar::@1#1] -- vbuz1=vbuc1 + lda #0 + sta closest_x + //SEG106 [59] phi (word) getCenterChar::closest_dist#8 = (const word) NOT_FOUND#0 [phi:getCenterChar->getCenterChar::@1#2] -- vwuz1=vwuc1 + lda #NOT_FOUND + sta closest_dist+1 + //SEG107 [59] phi (byte) getCenterChar::y#7 = (byte) 0 [phi:getCenterChar->getCenterChar::@1#3] -- vbuz1=vbuc1 + lda #0 + sta y + //SEG108 [59] phi (byte*) getCenterChar::screen_line#4 = (const byte[$3e8]) SCREEN_COPY#0 [phi:getCenterChar->getCenterChar::@1#4] -- pbuz1=pbuc1 + lda #SCREEN_COPY + sta screen_line+1 + jmp b1 + //SEG109 getCenterChar::@1 + b1: + //SEG110 [60] phi from getCenterChar::@1 to getCenterChar::@2 [phi:getCenterChar::@1->getCenterChar::@2] + b2_from_b1: + //SEG111 [60] phi (byte) getCenterChar::closest_y#7 = (byte) getCenterChar::closest_y#9 [phi:getCenterChar::@1->getCenterChar::@2#0] -- register_copy + //SEG112 [60] phi (byte) getCenterChar::closest_x#7 = (byte) getCenterChar::closest_x#9 [phi:getCenterChar::@1->getCenterChar::@2#1] -- register_copy + //SEG113 [60] phi (word) getCenterChar::closest_dist#2 = (word) getCenterChar::closest_dist#8 [phi:getCenterChar::@1->getCenterChar::@2#2] -- register_copy + //SEG114 [60] phi (byte) getCenterChar::x#2 = (byte) 0 [phi:getCenterChar::@1->getCenterChar::@2#3] -- vbuz1=vbuc1 + lda #0 + sta x + jmp b2 + //SEG115 getCenterChar::@2 + b2: + //SEG116 [61] if(*((byte*) getCenterChar::screen_line#4 + (byte) getCenterChar::x#2)==(byte) ' ') goto getCenterChar::@11 -- pbuz1_derefidx_vbuz2_eq_vbuc1_then_la1 + ldy x + lda (screen_line),y + cmp #' ' + beq b11 + jmp b4 + //SEG117 getCenterChar::@4 + b4: + //SEG118 [62] (byte~) getCenterChar::$13 ← (byte) getCenterChar::x#2 << (byte) 1 -- vbuz1=vbuz2_rol_1 + lda x + asl + sta _13 + //SEG119 [63] (byte~) getCenterChar::$14 ← (byte) getCenterChar::y#7 << (byte) 1 -- vbuz1=vbuz2_rol_1 + lda y + asl + sta _14 + //SEG120 [64] (word) getCenterChar::dist#0 ← *((const word[$28]) SQUARES_X#0 + (byte~) getCenterChar::$13) + *((const word[$19]) SQUARES_Y#0 + (byte~) getCenterChar::$14) -- vwuz1=pwuc1_derefidx_vbuz2_plus_pwuc2_derefidx_vbuz3 + ldx _13 + ldy _14 + lda SQUARES_X,x + clc + adc SQUARES_Y,y + sta dist + lda SQUARES_X+1,x + adc SQUARES_Y+1,y + sta dist+1 + //SEG121 [65] if((word) getCenterChar::dist#0>=(word) getCenterChar::closest_dist#2) goto getCenterChar::@12 -- vwuz1_ge_vwuz2_then_la1 + lda closest_dist+1 + cmp dist+1 + bne !+ + lda closest_dist + cmp dist + beq b12 + !: + bcc b12 + jmp b5 + //SEG122 getCenterChar::@5 + b5: + //SEG123 [66] (byte~) getCenterChar::return_x#7 ← (byte) getCenterChar::x#2 -- vbuz1=vbuz2 + lda x + sta return_x_7 + //SEG124 [67] (byte~) getCenterChar::return_y#7 ← (byte) getCenterChar::y#7 -- vbuz1=vbuz2 + lda y + sta return_y_7 + //SEG125 [68] phi from getCenterChar::@11 getCenterChar::@12 getCenterChar::@5 to getCenterChar::@3 [phi:getCenterChar::@11/getCenterChar::@12/getCenterChar::@5->getCenterChar::@3] + b3_from_b11: + b3_from_b12: + b3_from_b5: + //SEG126 [68] phi (byte) getCenterChar::return_y#1 = (byte) getCenterChar::closest_y#7 [phi:getCenterChar::@11/getCenterChar::@12/getCenterChar::@5->getCenterChar::@3#0] -- register_copy + //SEG127 [68] phi (byte) getCenterChar::return_x#1 = (byte) getCenterChar::closest_x#7 [phi:getCenterChar::@11/getCenterChar::@12/getCenterChar::@5->getCenterChar::@3#1] -- register_copy + //SEG128 [68] phi (word) getCenterChar::return_dist#1 = (word~) getCenterChar::return_dist#5 [phi:getCenterChar::@11/getCenterChar::@12/getCenterChar::@5->getCenterChar::@3#2] -- register_copy + jmp b3 + //SEG129 getCenterChar::@3 + b3: + //SEG130 [69] (byte) getCenterChar::x#1 ← ++ (byte) getCenterChar::x#2 -- vbuz1=_inc_vbuz1 + inc x + //SEG131 [70] if((byte) getCenterChar::x#1!=(byte) $28) goto getCenterChar::@10 -- vbuz1_neq_vbuc1_then_la1 + lda #$28 + cmp x + bne b10 + jmp b6 + //SEG132 getCenterChar::@6 + b6: + //SEG133 [71] (byte*) getCenterChar::screen_line#1 ← (byte*) getCenterChar::screen_line#4 + (byte) $28 -- pbuz1=pbuz1_plus_vbuc1 + lda #$28 + clc + adc screen_line + sta screen_line + bcc !+ + inc screen_line+1 + !: + //SEG134 [72] (byte) getCenterChar::y#1 ← ++ (byte) getCenterChar::y#7 -- vbuz1=_inc_vbuz1 + inc y + //SEG135 [73] if((byte) getCenterChar::y#1!=(byte) $19) goto getCenterChar::@9 -- vbuz1_neq_vbuc1_then_la1 + lda #$19 + cmp y + bne b9 + jmp b7 + //SEG136 getCenterChar::@7 + b7: + //SEG137 [74] if((word) getCenterChar::return_dist#1==(const word) NOT_FOUND#0) goto getCenterChar::@return -- vwuz1_eq_vwuc1_then_la1 + lda return_dist_1 + cmp #NOT_FOUND + beq breturn + !: + jmp b8 + //SEG138 getCenterChar::@8 + b8: + //SEG139 [75] (word~) getCenterChar::$9 ← (word)(byte) getCenterChar::return_y#1 -- vwuz1=_word_vbuz2 + lda return_y_1 + sta _9 + lda #0 + sta _9+1 + //SEG140 [76] (word) getCenterChar::$15 ← (word~) getCenterChar::$9 << (byte) 2 -- vwuz1=vwuz2_rol_2 + lda _9 + asl + sta _15 + lda _9+1 + rol + sta _15+1 + asl _15 + rol _15+1 + //SEG141 [77] (word) getCenterChar::$16 ← (word) getCenterChar::$15 + (word~) getCenterChar::$9 -- vwuz1=vwuz2_plus_vwuz3 + lda _15 + clc + adc _9 + sta _16 + lda _15+1 + adc _9+1 + sta _16+1 + //SEG142 [78] (word~) getCenterChar::$10 ← (word) getCenterChar::$16 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda _16 + asl + sta _10 + lda _16+1 + rol + sta _10+1 + asl _10 + rol _10+1 + asl _10 + rol _10+1 + //SEG143 [79] (byte*~) getCenterChar::$11 ← (const byte[$3e8]) SCREEN_COPY#0 + (word~) getCenterChar::$10 -- pbuz1=pbuc1_plus_vwuz2 + lda _10 + clc + adc #SCREEN_COPY + sta _11+1 + //SEG144 [80] *((byte*~) getCenterChar::$11 + (byte) getCenterChar::return_x#1) ← (byte) ' ' -- pbuz1_derefidx_vbuz2=vbuc1 + // clear the found char on the screen copy + lda #' ' + ldy return_x_1 + sta (_11),y + jmp breturn + //SEG145 getCenterChar::@return + breturn: + //SEG146 [81] return + rts + //SEG147 getCenterChar::@9 + b9: + //SEG148 [82] (word~) getCenterChar::closest_dist#10 ← (word) getCenterChar::return_dist#1 -- vwuz1=vwuz2 + lda return_dist_1 + sta closest_dist + lda return_dist_1+1 + sta closest_dist+1 + //SEG149 [59] phi from getCenterChar::@9 to getCenterChar::@1 [phi:getCenterChar::@9->getCenterChar::@1] + b1_from_b9: + //SEG150 [59] phi (byte) getCenterChar::closest_y#9 = (byte) getCenterChar::return_y#1 [phi:getCenterChar::@9->getCenterChar::@1#0] -- register_copy + //SEG151 [59] phi (byte) getCenterChar::closest_x#9 = (byte) getCenterChar::return_x#1 [phi:getCenterChar::@9->getCenterChar::@1#1] -- register_copy + //SEG152 [59] phi (word) getCenterChar::closest_dist#8 = (word~) getCenterChar::closest_dist#10 [phi:getCenterChar::@9->getCenterChar::@1#2] -- register_copy + //SEG153 [59] phi (byte) getCenterChar::y#7 = (byte) getCenterChar::y#1 [phi:getCenterChar::@9->getCenterChar::@1#3] -- register_copy + //SEG154 [59] phi (byte*) getCenterChar::screen_line#4 = (byte*) getCenterChar::screen_line#1 [phi:getCenterChar::@9->getCenterChar::@1#4] -- register_copy + jmp b1 + //SEG155 getCenterChar::@10 + b10: + //SEG156 [83] (word~) getCenterChar::closest_dist#12 ← (word) getCenterChar::return_dist#1 -- vwuz1=vwuz2 + lda return_dist_1 + sta closest_dist + lda return_dist_1+1 + sta closest_dist+1 + //SEG157 [60] phi from getCenterChar::@10 to getCenterChar::@2 [phi:getCenterChar::@10->getCenterChar::@2] + b2_from_b10: + //SEG158 [60] phi (byte) getCenterChar::closest_y#7 = (byte) getCenterChar::return_y#1 [phi:getCenterChar::@10->getCenterChar::@2#0] -- register_copy + //SEG159 [60] phi (byte) getCenterChar::closest_x#7 = (byte) getCenterChar::return_x#1 [phi:getCenterChar::@10->getCenterChar::@2#1] -- register_copy + //SEG160 [60] phi (word) getCenterChar::closest_dist#2 = (word~) getCenterChar::closest_dist#12 [phi:getCenterChar::@10->getCenterChar::@2#2] -- register_copy + //SEG161 [60] phi (byte) getCenterChar::x#2 = (byte) getCenterChar::x#1 [phi:getCenterChar::@10->getCenterChar::@2#3] -- register_copy + jmp b2 + //SEG162 getCenterChar::@12 + b12: + //SEG163 [84] (word~) getCenterChar::return_dist#6 ← (word) getCenterChar::closest_dist#2 -- vwuz1=vwuz2 + lda closest_dist + sta return_dist_6 + lda closest_dist+1 + sta return_dist_6+1 + jmp b3_from_b12 + //SEG164 getCenterChar::@11 + b11: + //SEG165 [85] (word~) getCenterChar::return_dist#5 ← (word) getCenterChar::closest_dist#2 -- vwuz1=vwuz2 + lda closest_dist + sta return_dist_5 + lda closest_dist+1 + sta return_dist_5+1 + jmp b3_from_b11 +} +//SEG166 initSquareTables +// initialize SQUARES table +initSquareTables: { + .label _2 = $16 + .label _4 = $16 + .label _6 = $44 + .label _10 = $18 + .label _12 = $18 + .label _14 = $49 + .label _16 = $46 + .label _17 = $4b + .label x_dist = $16 + .label x = $15 + .label y_dist = $18 + .label y = $17 + //SEG167 [87] phi from initSquareTables to initSquareTables::@1 [phi:initSquareTables->initSquareTables::@1] + b1_from_initSquareTables: + //SEG168 [87] phi (byte) initSquareTables::x#2 = (byte) 0 [phi:initSquareTables->initSquareTables::@1#0] -- vbuz1=vbuc1 + lda #0 + sta x + jmp b1 + //SEG169 [87] phi from initSquareTables::@9 to initSquareTables::@1 [phi:initSquareTables::@9->initSquareTables::@1] + b1_from_b9: + //SEG170 [87] phi (byte) initSquareTables::x#2 = (byte) initSquareTables::x#1 [phi:initSquareTables::@9->initSquareTables::@1#0] -- register_copy + jmp b1 + //SEG171 initSquareTables::@1 + b1: + //SEG172 [88] if((byte) initSquareTables::x#2<(byte) $14) goto initSquareTables::@2 -- vbuz1_lt_vbuc1_then_la1 + lda x + cmp #$14 + bcc b2 + jmp b3 + //SEG173 initSquareTables::@3 + b3: + //SEG174 [89] (byte~) initSquareTables::$2 ← (byte) initSquareTables::x#2 - (byte) $14 -- vbuz1=vbuz2_minus_vbuc1 + lax x + axs #$14 + stx _2 + //SEG175 [90] phi from initSquareTables::@2 initSquareTables::@3 to initSquareTables::@4 [phi:initSquareTables::@2/initSquareTables::@3->initSquareTables::@4] + b4_from_b2: + b4_from_b3: + //SEG176 [90] phi (byte) initSquareTables::x_dist#0 = (byte~) initSquareTables::$4 [phi:initSquareTables::@2/initSquareTables::@3->initSquareTables::@4#0] -- register_copy + jmp b4 + //SEG177 initSquareTables::@4 + b4: + //SEG178 [91] (byte) mul8u::a#1 ← (byte) initSquareTables::x_dist#0 -- vbuz1=vbuz2 + lda x_dist + sta mul8u.a + //SEG179 [92] (byte) mul8u::b#0 ← (byte) initSquareTables::x_dist#0 -- vbuz1=vbuz2 + lda x_dist + sta mul8u.b + //SEG180 [93] call mul8u + //SEG181 [116] phi from initSquareTables::@4 to mul8u [phi:initSquareTables::@4->mul8u] + mul8u_from_b4: + //SEG182 [116] phi (byte) mul8u::a#6 = (byte) mul8u::a#1 [phi:initSquareTables::@4->mul8u#0] -- register_copy + //SEG183 [116] phi (word) mul8u::mb#0 = (byte) mul8u::b#0 [phi:initSquareTables::@4->mul8u#1] -- vwuz1=vbuz2 + lda mul8u.b + sta mul8u.mb + lda #0 + sta mul8u.mb+1 + jsr mul8u + //SEG184 [94] (word) mul8u::return#2 ← (word) mul8u::res#2 -- vwuz1=vwuz2 + lda mul8u.res + sta mul8u.return + lda mul8u.res+1 + sta mul8u.return+1 + jmp b9 + //SEG185 initSquareTables::@9 + b9: + //SEG186 [95] (word~) initSquareTables::$6 ← (word) mul8u::return#2 -- vwuz1=vwuz2 + lda mul8u.return + sta _6 + lda mul8u.return+1 + sta _6+1 + //SEG187 [96] (byte~) initSquareTables::$16 ← (byte) initSquareTables::x#2 << (byte) 1 -- vbuz1=vbuz2_rol_1 + lda x + asl + sta _16 + //SEG188 [97] *((const word[$28]) SQUARES_X#0 + (byte~) initSquareTables::$16) ← (word~) initSquareTables::$6 -- pwuc1_derefidx_vbuz1=vwuz2 + ldy _16 + lda _6 + sta SQUARES_X,y + lda _6+1 + sta SQUARES_X+1,y + //SEG189 [98] (byte) initSquareTables::x#1 ← ++ (byte) initSquareTables::x#2 -- vbuz1=_inc_vbuz1 + inc x + //SEG190 [99] if((byte) initSquareTables::x#1!=(byte) $28) goto initSquareTables::@1 -- vbuz1_neq_vbuc1_then_la1 + lda #$28 + cmp x + bne b1_from_b9 + //SEG191 [100] phi from initSquareTables::@9 to initSquareTables::@5 [phi:initSquareTables::@9->initSquareTables::@5] + b5_from_b9: + //SEG192 [100] phi (byte) initSquareTables::y#2 = (byte) 0 [phi:initSquareTables::@9->initSquareTables::@5#0] -- vbuz1=vbuc1 + lda #0 + sta y + jmp b5 + //SEG193 [100] phi from initSquareTables::@10 to initSquareTables::@5 [phi:initSquareTables::@10->initSquareTables::@5] + b5_from_b10: + //SEG194 [100] phi (byte) initSquareTables::y#2 = (byte) initSquareTables::y#1 [phi:initSquareTables::@10->initSquareTables::@5#0] -- register_copy + jmp b5 + //SEG195 initSquareTables::@5 + b5: + //SEG196 [101] if((byte) initSquareTables::y#2<(byte) $c) goto initSquareTables::@6 -- vbuz1_lt_vbuc1_then_la1 + lda y + cmp #$c + bcc b6 + jmp b7 + //SEG197 initSquareTables::@7 + b7: + //SEG198 [102] (byte~) initSquareTables::$10 ← (byte) initSquareTables::y#2 - (byte) $c -- vbuz1=vbuz2_minus_vbuc1 + lax y + axs #$c + stx _10 + //SEG199 [103] phi from initSquareTables::@6 initSquareTables::@7 to initSquareTables::@8 [phi:initSquareTables::@6/initSquareTables::@7->initSquareTables::@8] + b8_from_b6: + b8_from_b7: + //SEG200 [103] phi (byte) initSquareTables::y_dist#0 = (byte~) initSquareTables::$12 [phi:initSquareTables::@6/initSquareTables::@7->initSquareTables::@8#0] -- register_copy + jmp b8 + //SEG201 initSquareTables::@8 + b8: + //SEG202 [104] (byte) mul8u::a#2 ← (byte) initSquareTables::y_dist#0 -- vbuz1=vbuz2 + lda y_dist + sta mul8u.a + //SEG203 [105] (byte) mul8u::b#1 ← (byte) initSquareTables::y_dist#0 -- vbuz1=vbuz2 + lda y_dist + sta mul8u.b_1 + //SEG204 [106] call mul8u + //SEG205 [116] phi from initSquareTables::@8 to mul8u [phi:initSquareTables::@8->mul8u] + mul8u_from_b8: + //SEG206 [116] phi (byte) mul8u::a#6 = (byte) mul8u::a#2 [phi:initSquareTables::@8->mul8u#0] -- register_copy + //SEG207 [116] phi (word) mul8u::mb#0 = (byte) mul8u::b#1 [phi:initSquareTables::@8->mul8u#1] -- vwuz1=vbuz2 + lda mul8u.b_1 + sta mul8u.mb + lda #0 + sta mul8u.mb+1 + jsr mul8u + //SEG208 [107] (word) mul8u::return#3 ← (word) mul8u::res#2 -- vwuz1=vwuz2 + lda mul8u.res + sta mul8u.return_3 + lda mul8u.res+1 + sta mul8u.return_3+1 + jmp b10 + //SEG209 initSquareTables::@10 + b10: + //SEG210 [108] (word~) initSquareTables::$14 ← (word) mul8u::return#3 -- vwuz1=vwuz2 + lda mul8u.return_3 + sta _14 + lda mul8u.return_3+1 + sta _14+1 + //SEG211 [109] (byte~) initSquareTables::$17 ← (byte) initSquareTables::y#2 << (byte) 1 -- vbuz1=vbuz2_rol_1 + lda y + asl + sta _17 + //SEG212 [110] *((const word[$19]) SQUARES_Y#0 + (byte~) initSquareTables::$17) ← (word~) initSquareTables::$14 -- pwuc1_derefidx_vbuz1=vwuz2 + ldy _17 + lda _14 + sta SQUARES_Y,y + lda _14+1 + sta SQUARES_Y+1,y + //SEG213 [111] (byte) initSquareTables::y#1 ← ++ (byte) initSquareTables::y#2 -- vbuz1=_inc_vbuz1 + inc y + //SEG214 [112] if((byte) initSquareTables::y#1!=(byte) $19) goto initSquareTables::@5 -- vbuz1_neq_vbuc1_then_la1 + lda #$19 + cmp y + bne b5_from_b10 + jmp breturn + //SEG215 initSquareTables::@return + breturn: + //SEG216 [113] return + rts + //SEG217 initSquareTables::@6 + b6: + //SEG218 [114] (byte~) initSquareTables::$12 ← (byte) $c - (byte) initSquareTables::y#2 -- vbuz1=vbuc1_minus_vbuz2 + lda #$c + sec + sbc y + sta _12 + jmp b8_from_b6 + //SEG219 initSquareTables::@2 + b2: + //SEG220 [115] (byte~) initSquareTables::$4 ← (byte) $14 - (byte) initSquareTables::x#2 -- vbuz1=vbuc1_minus_vbuz2 + lda #$14 + sec + sbc x + sta _4 + jmp b4_from_b2 +} +//SEG221 mul8u +// Perform binary multiplication of two unsigned 8-bit bytes into a 16-bit unsigned word +// mul8u(byte zeropage($1b) a, byte zeropage($1a) b) +mul8u: { + .label _1 = $4c + .label mb = $1e + .label a = $1b + .label res = $1c + .label b = $1a + .label return = $42 + .label b_1 = $19 + .label return_3 = $47 + //SEG222 [117] phi from mul8u to mul8u::@1 [phi:mul8u->mul8u::@1] + b1_from_mul8u: + //SEG223 [117] phi (word) mul8u::mb#2 = (word) mul8u::mb#0 [phi:mul8u->mul8u::@1#0] -- register_copy + //SEG224 [117] phi (word) mul8u::res#2 = (byte) 0 [phi:mul8u->mul8u::@1#1] -- vwuz1=vbuc1 + lda #0 + sta res + lda #0 + sta res+1 + //SEG225 [117] phi (byte) mul8u::a#3 = (byte) mul8u::a#6 [phi:mul8u->mul8u::@1#2] -- register_copy + jmp b1 + //SEG226 mul8u::@1 + b1: + //SEG227 [118] if((byte) mul8u::a#3!=(byte) 0) goto mul8u::@2 -- vbuz1_neq_0_then_la1 + lda a + cmp #0 + bne b2 + jmp breturn + //SEG228 mul8u::@return + breturn: + //SEG229 [119] return + rts + //SEG230 mul8u::@2 + b2: + //SEG231 [120] (byte~) mul8u::$1 ← (byte) mul8u::a#3 & (byte) 1 -- vbuz1=vbuz2_band_vbuc1 + lda #1 + and a + sta _1 + //SEG232 [121] if((byte~) mul8u::$1==(byte) 0) goto mul8u::@3 -- vbuz1_eq_0_then_la1 + lda _1 + cmp #0 + beq b3_from_b2 + jmp b4 + //SEG233 mul8u::@4 + b4: + //SEG234 [122] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 -- vwuz1=vwuz1_plus_vwuz2 + lda res + clc + adc mb + sta res + lda res+1 + adc mb+1 + sta res+1 + //SEG235 [123] phi from mul8u::@2 mul8u::@4 to mul8u::@3 [phi:mul8u::@2/mul8u::@4->mul8u::@3] + b3_from_b2: + b3_from_b4: + //SEG236 [123] phi (word) mul8u::res#6 = (word) mul8u::res#2 [phi:mul8u::@2/mul8u::@4->mul8u::@3#0] -- register_copy + jmp b3 + //SEG237 mul8u::@3 + b3: + //SEG238 [124] (byte) mul8u::a#0 ← (byte) mul8u::a#3 >> (byte) 1 -- vbuz1=vbuz1_ror_1 + lsr a + //SEG239 [125] (word) mul8u::mb#1 ← (word) mul8u::mb#2 << (byte) 1 -- vwuz1=vwuz1_rol_1 + asl mb + rol mb+1 + //SEG240 [117] phi from mul8u::@3 to mul8u::@1 [phi:mul8u::@3->mul8u::@1] + b1_from_b3: + //SEG241 [117] phi (word) mul8u::mb#2 = (word) mul8u::mb#1 [phi:mul8u::@3->mul8u::@1#0] -- register_copy + //SEG242 [117] phi (word) mul8u::res#2 = (word) mul8u::res#6 [phi:mul8u::@3->mul8u::@1#1] -- register_copy + //SEG243 [117] phi (byte) mul8u::a#3 = (byte) mul8u::a#0 [phi:mul8u::@3->mul8u::@1#2] -- register_copy + jmp b1 +} +//SEG244 setupRasterIrq +// Setup Raster IRQ +setupRasterIrq: { + .label irqRoutine = irqTop + //SEG245 asm { sei } + sei + //SEG246 [127] *((const byte*) PROCPORT_DDR#0) ← (const byte) PROCPORT_DDR_MEMORY_MASK#0 -- _deref_pbuc1=vbuc2 + // Disable kernal & basic + lda #PROCPORT_DDR_MEMORY_MASK + sta PROCPORT_DDR + //SEG247 [128] *((const byte*) PROCPORT#0) ← (const byte) PROCPORT_RAM_IO#0 -- _deref_pbuc1=vbuc2 + lda #PROCPORT_RAM_IO + sta PROCPORT + //SEG248 [129] *((const byte*) CIA1_INTERRUPT#0) ← (const byte) CIA_INTERRUPT_CLEAR#0 -- _deref_pbuc1=vbuc2 + // Disable CIA 1 Timer IRQ + lda #CIA_INTERRUPT_CLEAR + sta CIA1_INTERRUPT + jmp b1 + //SEG249 setupRasterIrq::@1 + b1: + //SEG250 [130] *((const byte*) VIC_CONTROL#0) ← *((const byte*) VIC_CONTROL#0) & (byte) $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2 + lda #$7f + and VIC_CONTROL + sta VIC_CONTROL + jmp b2 + //SEG251 setupRasterIrq::@2 + b2: + //SEG252 [131] *((const byte*) RASTER#0) ← <(const byte) RASTER_IRQ_TOP#0 -- _deref_pbuc1=vbuc2 + lda #RASTER_IRQ_TOP + sta RASTER + //SEG253 [132] *((const byte*) IRQ_ENABLE#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2 + // Enable Raster Interrupt + lda #IRQ_RASTER + sta IRQ_ENABLE + //SEG254 [133] *((const void()**) HARDWARE_IRQ#0) ← (const void()*) setupRasterIrq::irqRoutine#0 -- _deref_pptc1=pprc2 + // Set the IRQ routine + lda #irqRoutine + sta HARDWARE_IRQ+1 + //SEG255 asm { cli } + cli + jmp breturn + //SEG256 setupRasterIrq::@return + breturn: + //SEG257 [135] return + rts +} +//SEG258 irqBottom +// Raster Interrupt at the middle of the screen +irqBottom: { + .label i = $20 + //SEG259 entry interrupt(HARDWARE_ALL) + sta rega+1 + stx regx+1 + sty regy+1 + //SEG260 [137] phi from irqBottom to irqBottom::@1 [phi:irqBottom->irqBottom::@1] + b1_from_irqBottom: + //SEG261 [137] phi (byte) irqBottom::i#2 = (byte) 0 [phi:irqBottom->irqBottom::@1#0] -- vbuz1=vbuc1 + lda #0 + sta i + jmp b1 + //SEG262 [137] phi from irqBottom::@1 to irqBottom::@1 [phi:irqBottom::@1->irqBottom::@1] + b1_from_b1: + //SEG263 [137] phi (byte) irqBottom::i#2 = (byte) irqBottom::i#1 [phi:irqBottom::@1->irqBottom::@1#0] -- register_copy + jmp b1 + //SEG264 irqBottom::@1 + b1: + //SEG265 [138] (byte) irqBottom::i#1 ← ++ (byte) irqBottom::i#2 -- vbuz1=_inc_vbuz1 + inc i + //SEG266 [139] if((byte) irqBottom::i#1!=(byte) 5) goto irqBottom::@1 -- vbuz1_neq_vbuc1_then_la1 + lda #5 + cmp i + bne b1_from_b1 + jmp b2 + //SEG267 irqBottom::@2 + b2: + //SEG268 [140] *((const byte*) BORDERCOL#0) ← (const byte) WHITE#0 -- _deref_pbuc1=vbuc2 + lda #WHITE + sta BORDERCOL + //SEG269 [141] *((const byte*) BGCOL#0) ← (const byte) WHITE#0 -- _deref_pbuc1=vbuc2 + lda #WHITE + sta BGCOL + //SEG270 [142] call processChars + //SEG271 [149] phi from irqBottom::@2 to processChars [phi:irqBottom::@2->processChars] + processChars_from_b2: + jsr processChars + jmp b3 + //SEG272 irqBottom::@3 + b3: + //SEG273 [143] *((const byte*) BORDERCOL#0) ← (const byte) LIGHT_BLUE#0 -- _deref_pbuc1=vbuc2 + lda #LIGHT_BLUE + sta BORDERCOL + //SEG274 [144] *((const byte*) BGCOL#0) ← (const byte) BLUE#0 -- _deref_pbuc1=vbuc2 + lda #BLUE + sta BGCOL + //SEG275 [145] *((const byte*) RASTER#0) ← (const byte) RASTER_IRQ_TOP#0 -- _deref_pbuc1=vbuc2 + // Trigger IRQ at the top of the screen + lda #RASTER_IRQ_TOP + sta RASTER + //SEG276 [146] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(HARDWARE_ALL)(void()) irqTop() -- _deref_pptc1=pprc2 + lda #irqTop + sta HARDWARE_IRQ+1 + //SEG277 [147] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2 + // Acknowledge the IRQ + lda #IRQ_RASTER + sta IRQ_STATUS + jmp breturn + //SEG278 irqBottom::@return + breturn: + //SEG279 [148] return - exit interrupt(HARDWARE_ALL) + rega: + lda #00 + regx: + ldx #00 + regy: + ldy #00 + rti +} +//SEG280 processChars +// Process any chars in the PROCESSING array +processChars: { + .label _2 = $51 + .label _3 = $57 + .label _4 = $59 + .label _6 = $5b + .label _7 = $61 + .label _8 = $63 + .label _13 = $4d + .label _14 = $4e + .label _15 = $65 + .label i = $21 + .label processing_x = $4f + .label processing_y = $50 + .label _21 = $53 + .label _22 = $55 + .label _24 = $5d + .label _25 = $5f + //SEG281 [150] phi from processChars to processChars::@1 [phi:processChars->processChars::@1] + b1_from_processChars: + //SEG282 [150] phi (byte) processChars::i#2 = (byte) 0 [phi:processChars->processChars::@1#0] -- vbuz1=vbuc1 + lda #0 + sta i + jmp b1 + //SEG283 [150] phi from processChars::@2 to processChars::@1 [phi:processChars::@2->processChars::@1] + b1_from_b2: + //SEG284 [150] phi (byte) processChars::i#2 = (byte) processChars::i#1 [phi:processChars::@2->processChars::@1#0] -- register_copy + jmp b1 + //SEG285 processChars::@1 + b1: + //SEG286 [151] (byte~) processChars::$13 ← (byte) processChars::i#2 << (byte) 2 -- vbuz1=vbuz2_rol_2 + lda i + asl + asl + sta _13 + //SEG287 [152] if(*((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) processChars::$13)==(const word) NOT_FOUND#0) goto processChars::@2 -- pwuc1_derefidx_vbuz1_eq_vwuc2_then_la1 + ldy _13 + lda PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST,y + cmp #NOT_FOUND + beq b2 + !: + jmp b5 + //SEG288 processChars::@5 + b5: + //SEG289 [153] (byte~) processChars::$14 ← (byte) processChars::i#2 << (byte) 2 -- vbuz1=vbuz2_rol_2 + lda i + asl + asl + sta _14 + //SEG290 [154] (byte) processChars::processing_x#0 ← *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) processChars::$14) -- vbuz1=pbuc1_derefidx_vbuz2 + ldy _14 + lda PROCESSING,y + sta processing_x + //SEG291 [155] (byte) processChars::processing_y#0 ← *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) processChars::$14) -- vbuz1=pbuc1_derefidx_vbuz2 + ldy _14 + lda PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_Y,y + sta processing_y + //SEG292 [156] (word~) processChars::$2 ← (word)(byte) processChars::processing_y#0 -- vwuz1=_word_vbuz2 + lda processing_y + sta _2 + lda #0 + sta _2+1 + //SEG293 [157] (word) processChars::$21 ← (word~) processChars::$2 << (byte) 2 -- vwuz1=vwuz2_rol_2 + lda _2 + asl + sta _21 + lda _2+1 + rol + sta _21+1 + asl _21 + rol _21+1 + //SEG294 [158] (word) processChars::$22 ← (word) processChars::$21 + (word~) processChars::$2 -- vwuz1=vwuz2_plus_vwuz3 + lda _21 + clc + adc _2 + sta _22 + lda _21+1 + adc _2+1 + sta _22+1 + //SEG295 [159] (word~) processChars::$3 ← (word) processChars::$22 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda _22 + asl + sta _3 + lda _22+1 + rol + sta _3+1 + asl _3 + rol _3+1 + asl _3 + rol _3+1 + //SEG296 [160] (byte*~) processChars::$4 ← (const byte*) COLS#0 + (word~) processChars::$3 -- pbuz1=pbuc1_plus_vwuz2 + lda _3 + clc + adc #COLS + sta _4+1 + //SEG297 [161] *((byte*~) processChars::$4 + (byte) processChars::processing_x#0) ← (const byte) WHITE#0 -- pbuz1_derefidx_vbuz2=vbuc1 + lda #WHITE + ldy processing_x + sta (_4),y + //SEG298 [162] (word~) processChars::$6 ← (word)(byte) processChars::processing_y#0 -- vwuz1=_word_vbuz2 + lda processing_y + sta _6 + lda #0 + sta _6+1 + //SEG299 [163] (word) processChars::$24 ← (word~) processChars::$6 << (byte) 2 -- vwuz1=vwuz2_rol_2 + lda _6 + asl + sta _24 + lda _6+1 + rol + sta _24+1 + asl _24 + rol _24+1 + //SEG300 [164] (word) processChars::$25 ← (word) processChars::$24 + (word~) processChars::$6 -- vwuz1=vwuz2_plus_vwuz3 + lda _24 + clc + adc _6 + sta _25 + lda _24+1 + adc _6+1 + sta _25+1 + //SEG301 [165] (word~) processChars::$7 ← (word) processChars::$25 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda _25 + asl + sta _7 + lda _25+1 + rol + sta _7+1 + asl _7 + rol _7+1 + asl _7 + rol _7+1 + //SEG302 [166] (byte*~) processChars::$8 ← (const byte*) SCREEN#0 + (word~) processChars::$7 -- pbuz1=pbuc1_plus_vwuz2 + lda _7 + clc + adc #SCREEN + sta _8+1 + //SEG303 [167] if(*((byte*~) processChars::$8 + (byte) processChars::processing_x#0)==(byte) ' ') goto processChars::@3 -- pbuz1_derefidx_vbuz2_eq_vbuc1_then_la1 + ldy processing_x + lda (_8),y + cmp #' ' + beq b3 + jmp b6 + //SEG304 processChars::@6 + b6: + //SEG305 [168] if(*((byte*~) processChars::$8 + (byte) processChars::processing_x#0)>(byte) ' ') goto processChars::@4 -- pbuz1_derefidx_vbuz2_gt_vbuc1_then_la1 + ldy processing_x + lda (_8),y + cmp #' ' + beq !+ + bcs b4 + !: + jmp b7 + //SEG306 processChars::@7 + b7: + //SEG307 [169] *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) ← ++ *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) -- pbuz1_derefidx_vbuz2=_inc_pbuz1_derefidx_vbuz2 + ldy processing_x + lda (_8),y + clc + adc #1 + sta (_8),y + jmp b2 + //SEG308 processChars::@2 + b2: + //SEG309 [170] (byte) processChars::i#1 ← ++ (byte) processChars::i#2 -- vbuz1=_inc_vbuz1 + inc i + //SEG310 [171] if((byte) processChars::i#1!=(byte) 8) goto processChars::@1 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp i + bne b1_from_b2 + jmp breturn + //SEG311 processChars::@return + breturn: + //SEG312 [172] return + rts + //SEG313 processChars::@4 + b4: + //SEG314 [173] *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) ← -- *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) -- pbuz1_derefidx_vbuz2=_dec_pbuz1_derefidx_vbuz2 + ldy processing_x + lda (_8),y + sec + sbc #1 + sta (_8),y + jmp b2 + //SEG315 processChars::@3 + b3: + //SEG316 [174] (byte~) processChars::$15 ← (byte) processChars::i#2 << (byte) 2 -- vbuz1=vbuz2_rol_2 + lda i + asl + asl + sta _15 + //SEG317 [175] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) processChars::$15) ← (const word) NOT_FOUND#0 -- pwuc1_derefidx_vbuz1=vwuc2 + ldy _15 + lda #NOT_FOUND + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST+1,y + jmp b2 +} +//SEG318 irqTop +// Raster Interrupt at the top of the screen +irqTop: { + .label i = $22 + .label i1 = $23 + //SEG319 entry interrupt(HARDWARE_ALL) + sta rega+1 + stx regx+1 + sty regy+1 + //SEG320 [177] phi from irqTop to irqTop::@1 [phi:irqTop->irqTop::@1] + b1_from_irqTop: + //SEG321 [177] phi (byte) irqTop::i#2 = (byte) 0 [phi:irqTop->irqTop::@1#0] -- vbuz1=vbuc1 + lda #0 + sta i + jmp b1 + //SEG322 [177] phi from irqTop::@1 to irqTop::@1 [phi:irqTop::@1->irqTop::@1] + b1_from_b1: + //SEG323 [177] phi (byte) irqTop::i#2 = (byte) irqTop::i#1 [phi:irqTop::@1->irqTop::@1#0] -- register_copy + jmp b1 + //SEG324 irqTop::@1 + b1: + //SEG325 [178] (byte) irqTop::i#1 ← ++ (byte) irqTop::i#2 -- vbuz1=_inc_vbuz1 + inc i + //SEG326 [179] if((byte) irqTop::i#1!=(byte) 5) goto irqTop::@1 -- vbuz1_neq_vbuc1_then_la1 + lda #5 + cmp i + bne b1_from_b1 + jmp b2 + //SEG327 irqTop::@2 + b2: + //SEG328 [180] *((const byte*) BORDERCOL#0) ← (const byte) WHITE#0 -- _deref_pbuc1=vbuc2 + lda #WHITE + sta BORDERCOL + //SEG329 [181] *((const byte*) BGCOL#0) ← (const byte) WHITE#0 -- _deref_pbuc1=vbuc2 + lda #WHITE + sta BGCOL + //SEG330 [182] phi from irqTop::@2 to irqTop::@3 [phi:irqTop::@2->irqTop::@3] + b3_from_b2: + //SEG331 [182] phi (byte) irqTop::i1#2 = (byte) 0 [phi:irqTop::@2->irqTop::@3#0] -- vbuz1=vbuc1 + lda #0 + sta i1 + jmp b3 + //SEG332 [182] phi from irqTop::@3 to irqTop::@3 [phi:irqTop::@3->irqTop::@3] + b3_from_b3: + //SEG333 [182] phi (byte) irqTop::i1#2 = (byte) irqTop::i1#1 [phi:irqTop::@3->irqTop::@3#0] -- register_copy + jmp b3 + //SEG334 irqTop::@3 + b3: + //SEG335 [183] (byte) irqTop::i1#1 ← ++ (byte) irqTop::i1#2 -- vbuz1=_inc_vbuz1 + inc i1 + //SEG336 [184] if((byte) irqTop::i1#1!=(byte) 8) goto irqTop::@3 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp i1 + bne b3_from_b3 + jmp b4 + //SEG337 irqTop::@4 + b4: + //SEG338 [185] *((const byte*) BORDERCOL#0) ← (const byte) LIGHT_BLUE#0 -- _deref_pbuc1=vbuc2 + lda #LIGHT_BLUE + sta BORDERCOL + //SEG339 [186] *((const byte*) BGCOL#0) ← (const byte) BLUE#0 -- _deref_pbuc1=vbuc2 + lda #BLUE + sta BGCOL + //SEG340 [187] *((const byte*) RASTER#0) ← (const byte) RASTER_IRQ_MIDDLE#0 -- _deref_pbuc1=vbuc2 + // Trigger IRQ at the middle of the screen + lda #RASTER_IRQ_MIDDLE + sta RASTER + //SEG341 [188] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(HARDWARE_ALL)(void()) irqBottom() -- _deref_pptc1=pprc2 + lda #irqBottom + sta HARDWARE_IRQ+1 + //SEG342 [189] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2 + // Acknowledge the IRQ + lda #IRQ_RASTER + sta IRQ_STATUS + jmp breturn + //SEG343 irqTop::@return + breturn: + //SEG344 [190] return - exit interrupt(HARDWARE_ALL) + rega: + lda #00 + regx: + ldx #00 + regy: + ldy #00 + rti +} + // Copy of the screen used for finding chars to process + SCREEN_COPY: .fill $3e8, 0 + // Chars currently being processed in the interrupt + PROCESSING: .fill 4*8, 0 + // SQUARES_X[i] = (i-20)*(i-20) + SQUARES_X: .fill 2*$28, 0 + // SQUARES_Y[i] = (i-12)*(i-12) + SQUARES_Y: .fill 2*$19, 0 + +REGISTER UPLIFT POTENTIAL REGISTERS +Statement [6] (byte~) main::$18 ← (byte) main::i#2 << (byte) 2 [ main::i#2 main::$18 ] ( main:2 [ main::i#2 main::$18 ] ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:2 [ main::i#2 main::i#1 ] +Statement [7] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) main::$18) ← (byte) 0 [ main::i#2 main::$18 ] ( main:2 [ main::i#2 main::$18 ] ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:36 [ main::$18 ] +Statement [8] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) main::$18) ← (byte) 0 [ main::i#2 main::$18 ] ( main:2 [ main::i#2 main::$18 ] ) always clobbers reg byte a +Statement [9] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) main::$18) ← (const word) NOT_FOUND#0 [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a +Statement [18] *((byte*) main::sc#2) ← (byte~) main::$7 [ main::sc#2 ] ( main:2 [ main::sc#2 ] ) always clobbers reg byte y +Statement [20] if((byte*) main::sc#1!=(const byte*) SCREEN#0+(word) $3e7+(byte) 1) goto main::@3 [ main::sc#1 ] ( main:2 [ main::sc#1 ] ) always clobbers reg byte a +Statement [22] *((byte*) main::dst#2) ← *((byte*) main::src#2) [ main::src#2 main::dst#2 ] ( main:2 [ main::src#2 main::dst#2 ] ) always clobbers reg byte a reg byte y +Statement [25] if((byte*) main::src#1!=(const byte*) SCREEN#0+(word) $3e7) goto main::@4 [ main::src#1 main::dst#1 ] ( main:2 [ main::src#1 main::dst#1 ] ) always clobbers reg byte a +Statement [32] (word) getCenterChar::return_dist#0 ← (word) getCenterChar::return_dist#1 [ getCenterChar::return_x#0 getCenterChar::return_y#0 getCenterChar::return_dist#0 ] ( main:2 [ getCenterChar::return_x#0 getCenterChar::return_y#0 getCenterChar::return_dist#0 ] ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:40 [ getCenterChar::return_x#0 ] +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:41 [ getCenterChar::return_y#0 ] +Statement [35] (word) main::center_dist#0 ← (word) getCenterChar::return_dist#0 [ main::center_x#0 main::center_y#0 main::center_dist#0 ] ( main:2 [ main::center_x#0 main::center_y#0 main::center_dist#0 ] ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:44 [ main::center_x#0 ] +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:45 [ main::center_y#0 ] +Statement [36] if((word) main::center_dist#0!=(const word) NOT_FOUND#0) goto main::@7 [ main::center_x#0 main::center_y#0 main::center_dist#0 ] ( main:2 [ main::center_x#0 main::center_y#0 main::center_dist#0 ] ) always clobbers reg byte a +Statement [40] (word) startProcessing::center_dist#0 ← (word) main::center_dist#0 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 ] ( main:2 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 ] ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:48 [ startProcessing::center_x#0 ] +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:49 [ startProcessing::center_y#0 ] +Statement [45] (byte~) startProcessing::$4 ← (byte) startProcessing::i#2 << (byte) 2 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::freeIdx#6 startProcessing::i#2 startProcessing::$4 ] ( main:2::startProcessing:41 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::freeIdx#6 startProcessing::i#2 startProcessing::$4 ] ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:9 [ startProcessing::freeIdx#6 startProcessing::freeIdx#7 ] +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:10 [ startProcessing::freeIdx#2 startProcessing::freeIdx#8 startProcessing::i#2 startProcessing::i#1 ] +Statement [46] if(*((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) startProcessing::$4)!=(const word) NOT_FOUND#0) goto startProcessing::@3 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::freeIdx#6 startProcessing::i#2 ] ( main:2::startProcessing:41 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::freeIdx#6 startProcessing::i#2 ] ) always clobbers reg byte a +Statement [49] (byte~) startProcessing::$5 ← (byte) startProcessing::freeIdx#2 << (byte) 2 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::$5 ] ( main:2::startProcessing:41 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::$5 ] ) always clobbers reg byte a +Statement [50] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) startProcessing::$5) ← (byte) startProcessing::center_x#0 [ startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::$5 ] ( main:2::startProcessing:41 [ startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::$5 ] ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:53 [ startProcessing::$5 ] +Statement [51] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) startProcessing::$5) ← (byte) startProcessing::center_y#0 [ startProcessing::center_dist#0 startProcessing::$5 ] ( main:2::startProcessing:41 [ startProcessing::center_dist#0 startProcessing::$5 ] ) always clobbers reg byte a +Statement [52] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) startProcessing::$5) ← (word) startProcessing::center_dist#0 [ ] ( main:2::startProcessing:41 [ ] ) always clobbers reg byte a +Statement [61] if(*((byte*) getCenterChar::screen_line#4 + (byte) getCenterChar::x#2)==(byte) ' ') goto getCenterChar::@11 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 ] ( main:2::getCenterChar:29 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 ] ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:13 [ getCenterChar::y#7 getCenterChar::y#1 ] +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:14 [ getCenterChar::x#2 getCenterChar::x#1 ] +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:17 [ getCenterChar::closest_x#7 getCenterChar::closest_x#9 getCenterChar::return_x#1 getCenterChar::return_x#7 ] +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:18 [ getCenterChar::closest_y#7 getCenterChar::closest_y#9 getCenterChar::return_y#1 getCenterChar::return_y#7 ] +Statement [62] (byte~) getCenterChar::$13 ← (byte) getCenterChar::x#2 << (byte) 1 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::$13 ] ( main:2::getCenterChar:29 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::$13 ] ) always clobbers reg byte a +Statement [63] (byte~) getCenterChar::$14 ← (byte) getCenterChar::y#7 << (byte) 1 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::$13 getCenterChar::$14 ] ( main:2::getCenterChar:29 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::$13 getCenterChar::$14 ] ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:54 [ getCenterChar::$13 ] +Statement [64] (word) getCenterChar::dist#0 ← *((const word[$28]) SQUARES_X#0 + (byte~) getCenterChar::$13) + *((const word[$19]) SQUARES_Y#0 + (byte~) getCenterChar::$14) [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::dist#0 ] ( main:2::getCenterChar:29 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::dist#0 ] ) always clobbers reg byte a +Statement [65] if((word) getCenterChar::dist#0>=(word) getCenterChar::closest_dist#2) goto getCenterChar::@12 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::dist#0 ] ( main:2::getCenterChar:29 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::dist#0 ] ) always clobbers reg byte a +Statement [71] (byte*) getCenterChar::screen_line#1 ← (byte*) getCenterChar::screen_line#4 + (byte) $28 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::y#7 getCenterChar::screen_line#1 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::y#7 getCenterChar::screen_line#1 ] ) always clobbers reg byte a +Statement [74] if((word) getCenterChar::return_dist#1==(const word) NOT_FOUND#0) goto getCenterChar::@return [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 ] ) always clobbers reg byte a +Statement [75] (word~) getCenterChar::$9 ← (word)(byte) getCenterChar::return_y#1 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$9 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$9 ] ) always clobbers reg byte a +Statement [76] (word) getCenterChar::$15 ← (word~) getCenterChar::$9 << (byte) 2 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$9 getCenterChar::$15 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$9 getCenterChar::$15 ] ) always clobbers reg byte a +Statement [77] (word) getCenterChar::$16 ← (word) getCenterChar::$15 + (word~) getCenterChar::$9 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$16 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$16 ] ) always clobbers reg byte a +Statement [78] (word~) getCenterChar::$10 ← (word) getCenterChar::$16 << (byte) 3 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$10 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$10 ] ) always clobbers reg byte a +Statement [79] (byte*~) getCenterChar::$11 ← (const byte[$3e8]) SCREEN_COPY#0 + (word~) getCenterChar::$10 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$11 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$11 ] ) always clobbers reg byte a +Statement [80] *((byte*~) getCenterChar::$11 + (byte) getCenterChar::return_x#1) ← (byte) ' ' [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 ] ) always clobbers reg byte a +Statement [82] (word~) getCenterChar::closest_dist#10 ← (word) getCenterChar::return_dist#1 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::screen_line#1 getCenterChar::y#1 getCenterChar::closest_dist#10 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::screen_line#1 getCenterChar::y#1 getCenterChar::closest_dist#10 ] ) always clobbers reg byte a +Statement [83] (word~) getCenterChar::closest_dist#12 ← (word) getCenterChar::return_dist#1 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#1 getCenterChar::closest_dist#12 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#1 getCenterChar::closest_dist#12 ] ) always clobbers reg byte a +Statement [84] (word~) getCenterChar::return_dist#6 ← (word) getCenterChar::closest_dist#2 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::return_dist#6 ] ( main:2::getCenterChar:29 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::return_dist#6 ] ) always clobbers reg byte a +Statement [85] (word~) getCenterChar::return_dist#5 ← (word) getCenterChar::closest_dist#2 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::return_dist#5 ] ( main:2::getCenterChar:29 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::return_dist#5 ] ) always clobbers reg byte a +Statement [94] (word) mul8u::return#2 ← (word) mul8u::res#2 [ initSquareTables::x#2 mul8u::return#2 ] ( main:2::initSquareTables:27 [ initSquareTables::x#2 mul8u::return#2 ] ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:21 [ initSquareTables::x#2 initSquareTables::x#1 ] +Statement [95] (word~) initSquareTables::$6 ← (word) mul8u::return#2 [ initSquareTables::x#2 initSquareTables::$6 ] ( main:2::initSquareTables:27 [ initSquareTables::x#2 initSquareTables::$6 ] ) always clobbers reg byte a +Statement [96] (byte~) initSquareTables::$16 ← (byte) initSquareTables::x#2 << (byte) 1 [ initSquareTables::x#2 initSquareTables::$6 initSquareTables::$16 ] ( main:2::initSquareTables:27 [ initSquareTables::x#2 initSquareTables::$6 initSquareTables::$16 ] ) always clobbers reg byte a +Statement [97] *((const word[$28]) SQUARES_X#0 + (byte~) initSquareTables::$16) ← (word~) initSquareTables::$6 [ initSquareTables::x#2 ] ( main:2::initSquareTables:27 [ initSquareTables::x#2 ] ) always clobbers reg byte a +Statement [107] (word) mul8u::return#3 ← (word) mul8u::res#2 [ initSquareTables::y#2 mul8u::return#3 ] ( main:2::initSquareTables:27 [ initSquareTables::y#2 mul8u::return#3 ] ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:23 [ initSquareTables::y#2 initSquareTables::y#1 ] +Statement [108] (word~) initSquareTables::$14 ← (word) mul8u::return#3 [ initSquareTables::y#2 initSquareTables::$14 ] ( main:2::initSquareTables:27 [ initSquareTables::y#2 initSquareTables::$14 ] ) always clobbers reg byte a +Statement [109] (byte~) initSquareTables::$17 ← (byte) initSquareTables::y#2 << (byte) 1 [ initSquareTables::y#2 initSquareTables::$14 initSquareTables::$17 ] ( main:2::initSquareTables:27 [ initSquareTables::y#2 initSquareTables::$14 initSquareTables::$17 ] ) always clobbers reg byte a +Statement [110] *((const word[$19]) SQUARES_Y#0 + (byte~) initSquareTables::$17) ← (word~) initSquareTables::$14 [ initSquareTables::y#2 ] ( main:2::initSquareTables:27 [ initSquareTables::y#2 ] ) always clobbers reg byte a +Statement [114] (byte~) initSquareTables::$12 ← (byte) $c - (byte) initSquareTables::y#2 [ initSquareTables::y#2 initSquareTables::$12 ] ( main:2::initSquareTables:27 [ initSquareTables::y#2 initSquareTables::$12 ] ) always clobbers reg byte a +Statement [115] (byte~) initSquareTables::$4 ← (byte) $14 - (byte) initSquareTables::x#2 [ initSquareTables::x#2 initSquareTables::$4 ] ( main:2::initSquareTables:27 [ initSquareTables::x#2 initSquareTables::$4 ] ) always clobbers reg byte a +Statement [122] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 [ mul8u::a#3 mul8u::mb#2 mul8u::res#1 ] ( main:2::initSquareTables:27::mul8u:93 [ initSquareTables::x#2 mul8u::a#3 mul8u::mb#2 mul8u::res#1 ] main:2::initSquareTables:27::mul8u:106 [ initSquareTables::y#2 mul8u::a#3 mul8u::mb#2 mul8u::res#1 ] ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:27 [ mul8u::a#3 mul8u::a#6 mul8u::a#2 mul8u::a#1 mul8u::a#0 ] +Statement [127] *((const byte*) PROCPORT_DDR#0) ← (const byte) PROCPORT_DDR_MEMORY_MASK#0 [ ] ( main:2::setupRasterIrq:13 [ ] ) always clobbers reg byte a +Statement [128] *((const byte*) PROCPORT#0) ← (const byte) PROCPORT_RAM_IO#0 [ ] ( main:2::setupRasterIrq:13 [ ] ) always clobbers reg byte a +Statement [129] *((const byte*) CIA1_INTERRUPT#0) ← (const byte) CIA_INTERRUPT_CLEAR#0 [ ] ( main:2::setupRasterIrq:13 [ ] ) always clobbers reg byte a +Statement [130] *((const byte*) VIC_CONTROL#0) ← *((const byte*) VIC_CONTROL#0) & (byte) $7f [ ] ( main:2::setupRasterIrq:13 [ ] ) always clobbers reg byte a +Statement [131] *((const byte*) RASTER#0) ← <(const byte) RASTER_IRQ_TOP#0 [ ] ( main:2::setupRasterIrq:13 [ ] ) always clobbers reg byte a +Statement [132] *((const byte*) IRQ_ENABLE#0) ← (const byte) IRQ_RASTER#0 [ ] ( main:2::setupRasterIrq:13 [ ] ) always clobbers reg byte a +Statement [133] *((const void()**) HARDWARE_IRQ#0) ← (const void()*) setupRasterIrq::irqRoutine#0 [ ] ( main:2::setupRasterIrq:13 [ ] ) always clobbers reg byte a +Statement [140] *((const byte*) BORDERCOL#0) ← (const byte) WHITE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [141] *((const byte*) BGCOL#0) ← (const byte) WHITE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [143] *((const byte*) BORDERCOL#0) ← (const byte) LIGHT_BLUE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [144] *((const byte*) BGCOL#0) ← (const byte) BLUE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [145] *((const byte*) RASTER#0) ← (const byte) RASTER_IRQ_TOP#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [146] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(HARDWARE_ALL)(void()) irqTop() [ ] ( [ ] ) always clobbers reg byte a +Statement [147] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [148] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y +Statement [151] (byte~) processChars::$13 ← (byte) processChars::i#2 << (byte) 2 [ processChars::i#2 processChars::$13 ] ( processChars:142 [ processChars::i#2 processChars::$13 ] ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:33 [ processChars::i#2 processChars::i#1 ] +Statement [152] if(*((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) processChars::$13)==(const word) NOT_FOUND#0) goto processChars::@2 [ processChars::i#2 ] ( processChars:142 [ processChars::i#2 ] ) always clobbers reg byte a +Statement [153] (byte~) processChars::$14 ← (byte) processChars::i#2 << (byte) 2 [ processChars::i#2 processChars::$14 ] ( processChars:142 [ processChars::i#2 processChars::$14 ] ) always clobbers reg byte a +Statement [156] (word~) processChars::$2 ← (word)(byte) processChars::processing_y#0 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$2 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$2 ] ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:79 [ processChars::processing_x#0 ] +Removing always clobbered register reg byte a as potential for zp ZP_BYTE:80 [ processChars::processing_y#0 ] +Statement [157] (word) processChars::$21 ← (word~) processChars::$2 << (byte) 2 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$2 processChars::$21 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$2 processChars::$21 ] ) always clobbers reg byte a +Statement [158] (word) processChars::$22 ← (word) processChars::$21 + (word~) processChars::$2 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$22 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$22 ] ) always clobbers reg byte a +Statement [159] (word~) processChars::$3 ← (word) processChars::$22 << (byte) 3 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$3 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$3 ] ) always clobbers reg byte a +Statement [160] (byte*~) processChars::$4 ← (const byte*) COLS#0 + (word~) processChars::$3 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$4 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$4 ] ) always clobbers reg byte a +Statement [161] *((byte*~) processChars::$4 + (byte) processChars::processing_x#0) ← (const byte) WHITE#0 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 ] ) always clobbers reg byte a +Statement [162] (word~) processChars::$6 ← (word)(byte) processChars::processing_y#0 [ processChars::i#2 processChars::processing_x#0 processChars::$6 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::$6 ] ) always clobbers reg byte a +Statement [163] (word) processChars::$24 ← (word~) processChars::$6 << (byte) 2 [ processChars::i#2 processChars::processing_x#0 processChars::$6 processChars::$24 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::$6 processChars::$24 ] ) always clobbers reg byte a +Statement [164] (word) processChars::$25 ← (word) processChars::$24 + (word~) processChars::$6 [ processChars::i#2 processChars::processing_x#0 processChars::$25 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::$25 ] ) always clobbers reg byte a +Statement [165] (word~) processChars::$7 ← (word) processChars::$25 << (byte) 3 [ processChars::i#2 processChars::processing_x#0 processChars::$7 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::$7 ] ) always clobbers reg byte a +Statement [166] (byte*~) processChars::$8 ← (const byte*) SCREEN#0 + (word~) processChars::$7 [ processChars::i#2 processChars::processing_x#0 processChars::$8 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::$8 ] ) always clobbers reg byte a +Statement [167] if(*((byte*~) processChars::$8 + (byte) processChars::processing_x#0)==(byte) ' ') goto processChars::@3 [ processChars::i#2 processChars::processing_x#0 processChars::$8 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::$8 ] ) always clobbers reg byte a +Statement [168] if(*((byte*~) processChars::$8 + (byte) processChars::processing_x#0)>(byte) ' ') goto processChars::@4 [ processChars::i#2 processChars::processing_x#0 processChars::$8 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::$8 ] ) always clobbers reg byte a +Statement [169] *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) ← ++ *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) [ processChars::i#2 ] ( processChars:142 [ processChars::i#2 ] ) always clobbers reg byte a +Statement [173] *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) ← -- *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) [ processChars::i#2 ] ( processChars:142 [ processChars::i#2 ] ) always clobbers reg byte a +Statement [174] (byte~) processChars::$15 ← (byte) processChars::i#2 << (byte) 2 [ processChars::i#2 processChars::$15 ] ( processChars:142 [ processChars::i#2 processChars::$15 ] ) always clobbers reg byte a +Statement [175] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) processChars::$15) ← (const word) NOT_FOUND#0 [ processChars::i#2 ] ( processChars:142 [ processChars::i#2 ] ) always clobbers reg byte a +Statement [180] *((const byte*) BORDERCOL#0) ← (const byte) WHITE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [181] *((const byte*) BGCOL#0) ← (const byte) WHITE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [185] *((const byte*) BORDERCOL#0) ← (const byte) LIGHT_BLUE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [186] *((const byte*) BGCOL#0) ← (const byte) BLUE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [187] *((const byte*) RASTER#0) ← (const byte) RASTER_IRQ_MIDDLE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [188] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(HARDWARE_ALL)(void()) irqBottom() [ ] ( [ ] ) always clobbers reg byte a +Statement [189] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [190] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y +Statement [6] (byte~) main::$18 ← (byte) main::i#2 << (byte) 2 [ main::i#2 main::$18 ] ( main:2 [ main::i#2 main::$18 ] ) always clobbers reg byte a +Statement [7] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) main::$18) ← (byte) 0 [ main::i#2 main::$18 ] ( main:2 [ main::i#2 main::$18 ] ) always clobbers reg byte a +Statement [8] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) main::$18) ← (byte) 0 [ main::i#2 main::$18 ] ( main:2 [ main::i#2 main::$18 ] ) always clobbers reg byte a +Statement [9] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) main::$18) ← (const word) NOT_FOUND#0 [ main::i#2 ] ( main:2 [ main::i#2 ] ) always clobbers reg byte a +Statement [18] *((byte*) main::sc#2) ← (byte~) main::$7 [ main::sc#2 ] ( main:2 [ main::sc#2 ] ) always clobbers reg byte y +Statement [20] if((byte*) main::sc#1!=(const byte*) SCREEN#0+(word) $3e7+(byte) 1) goto main::@3 [ main::sc#1 ] ( main:2 [ main::sc#1 ] ) always clobbers reg byte a +Statement [22] *((byte*) main::dst#2) ← *((byte*) main::src#2) [ main::src#2 main::dst#2 ] ( main:2 [ main::src#2 main::dst#2 ] ) always clobbers reg byte a reg byte y +Statement [25] if((byte*) main::src#1!=(const byte*) SCREEN#0+(word) $3e7) goto main::@4 [ main::src#1 main::dst#1 ] ( main:2 [ main::src#1 main::dst#1 ] ) always clobbers reg byte a +Statement [32] (word) getCenterChar::return_dist#0 ← (word) getCenterChar::return_dist#1 [ getCenterChar::return_x#0 getCenterChar::return_y#0 getCenterChar::return_dist#0 ] ( main:2 [ getCenterChar::return_x#0 getCenterChar::return_y#0 getCenterChar::return_dist#0 ] ) always clobbers reg byte a +Statement [35] (word) main::center_dist#0 ← (word) getCenterChar::return_dist#0 [ main::center_x#0 main::center_y#0 main::center_dist#0 ] ( main:2 [ main::center_x#0 main::center_y#0 main::center_dist#0 ] ) always clobbers reg byte a +Statement [36] if((word) main::center_dist#0!=(const word) NOT_FOUND#0) goto main::@7 [ main::center_x#0 main::center_y#0 main::center_dist#0 ] ( main:2 [ main::center_x#0 main::center_y#0 main::center_dist#0 ] ) always clobbers reg byte a +Statement [40] (word) startProcessing::center_dist#0 ← (word) main::center_dist#0 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 ] ( main:2 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 ] ) always clobbers reg byte a +Statement [45] (byte~) startProcessing::$4 ← (byte) startProcessing::i#2 << (byte) 2 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::freeIdx#6 startProcessing::i#2 startProcessing::$4 ] ( main:2::startProcessing:41 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::freeIdx#6 startProcessing::i#2 startProcessing::$4 ] ) always clobbers reg byte a +Statement [46] if(*((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) startProcessing::$4)!=(const word) NOT_FOUND#0) goto startProcessing::@3 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::freeIdx#6 startProcessing::i#2 ] ( main:2::startProcessing:41 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::freeIdx#6 startProcessing::i#2 ] ) always clobbers reg byte a +Statement [49] (byte~) startProcessing::$5 ← (byte) startProcessing::freeIdx#2 << (byte) 2 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::$5 ] ( main:2::startProcessing:41 [ startProcessing::center_x#0 startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::$5 ] ) always clobbers reg byte a +Statement [50] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) startProcessing::$5) ← (byte) startProcessing::center_x#0 [ startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::$5 ] ( main:2::startProcessing:41 [ startProcessing::center_y#0 startProcessing::center_dist#0 startProcessing::$5 ] ) always clobbers reg byte a +Statement [51] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) startProcessing::$5) ← (byte) startProcessing::center_y#0 [ startProcessing::center_dist#0 startProcessing::$5 ] ( main:2::startProcessing:41 [ startProcessing::center_dist#0 startProcessing::$5 ] ) always clobbers reg byte a +Statement [52] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) startProcessing::$5) ← (word) startProcessing::center_dist#0 [ ] ( main:2::startProcessing:41 [ ] ) always clobbers reg byte a +Statement [61] if(*((byte*) getCenterChar::screen_line#4 + (byte) getCenterChar::x#2)==(byte) ' ') goto getCenterChar::@11 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 ] ( main:2::getCenterChar:29 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 ] ) always clobbers reg byte a +Statement [62] (byte~) getCenterChar::$13 ← (byte) getCenterChar::x#2 << (byte) 1 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::$13 ] ( main:2::getCenterChar:29 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::$13 ] ) always clobbers reg byte a +Statement [63] (byte~) getCenterChar::$14 ← (byte) getCenterChar::y#7 << (byte) 1 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::$13 getCenterChar::$14 ] ( main:2::getCenterChar:29 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::$13 getCenterChar::$14 ] ) always clobbers reg byte a +Statement [64] (word) getCenterChar::dist#0 ← *((const word[$28]) SQUARES_X#0 + (byte~) getCenterChar::$13) + *((const word[$19]) SQUARES_Y#0 + (byte~) getCenterChar::$14) [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::dist#0 ] ( main:2::getCenterChar:29 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::dist#0 ] ) always clobbers reg byte a +Statement [65] if((word) getCenterChar::dist#0>=(word) getCenterChar::closest_dist#2) goto getCenterChar::@12 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::dist#0 ] ( main:2::getCenterChar:29 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_dist#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::dist#0 ] ) always clobbers reg byte a +Statement [71] (byte*) getCenterChar::screen_line#1 ← (byte*) getCenterChar::screen_line#4 + (byte) $28 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::y#7 getCenterChar::screen_line#1 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::y#7 getCenterChar::screen_line#1 ] ) always clobbers reg byte a +Statement [74] if((word) getCenterChar::return_dist#1==(const word) NOT_FOUND#0) goto getCenterChar::@return [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 ] ) always clobbers reg byte a +Statement [75] (word~) getCenterChar::$9 ← (word)(byte) getCenterChar::return_y#1 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$9 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$9 ] ) always clobbers reg byte a +Statement [76] (word) getCenterChar::$15 ← (word~) getCenterChar::$9 << (byte) 2 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$9 getCenterChar::$15 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$9 getCenterChar::$15 ] ) always clobbers reg byte a +Statement [77] (word) getCenterChar::$16 ← (word) getCenterChar::$15 + (word~) getCenterChar::$9 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$16 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$16 ] ) always clobbers reg byte a +Statement [78] (word~) getCenterChar::$10 ← (word) getCenterChar::$16 << (byte) 3 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$10 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$10 ] ) always clobbers reg byte a +Statement [79] (byte*~) getCenterChar::$11 ← (const byte[$3e8]) SCREEN_COPY#0 + (word~) getCenterChar::$10 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$11 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 getCenterChar::$11 ] ) always clobbers reg byte a +Statement [80] *((byte*~) getCenterChar::$11 + (byte) getCenterChar::return_x#1) ← (byte) ' ' [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::return_dist#1 ] ) always clobbers reg byte a +Statement [82] (word~) getCenterChar::closest_dist#10 ← (word) getCenterChar::return_dist#1 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::screen_line#1 getCenterChar::y#1 getCenterChar::closest_dist#10 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::screen_line#1 getCenterChar::y#1 getCenterChar::closest_dist#10 ] ) always clobbers reg byte a +Statement [83] (word~) getCenterChar::closest_dist#12 ← (word) getCenterChar::return_dist#1 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#1 getCenterChar::closest_dist#12 ] ( main:2::getCenterChar:29 [ getCenterChar::return_x#1 getCenterChar::return_y#1 getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#1 getCenterChar::closest_dist#12 ] ) always clobbers reg byte a +Statement [84] (word~) getCenterChar::return_dist#6 ← (word) getCenterChar::closest_dist#2 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::return_dist#6 ] ( main:2::getCenterChar:29 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::return_dist#6 ] ) always clobbers reg byte a +Statement [85] (word~) getCenterChar::return_dist#5 ← (word) getCenterChar::closest_dist#2 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::return_dist#5 ] ( main:2::getCenterChar:29 [ getCenterChar::screen_line#4 getCenterChar::y#7 getCenterChar::x#2 getCenterChar::closest_x#7 getCenterChar::closest_y#7 getCenterChar::return_dist#5 ] ) always clobbers reg byte a +Statement [89] (byte~) initSquareTables::$2 ← (byte) initSquareTables::x#2 - (byte) $14 [ initSquareTables::x#2 initSquareTables::$2 ] ( main:2::initSquareTables:27 [ initSquareTables::x#2 initSquareTables::$2 ] ) always clobbers reg byte a +Statement [94] (word) mul8u::return#2 ← (word) mul8u::res#2 [ initSquareTables::x#2 mul8u::return#2 ] ( main:2::initSquareTables:27 [ initSquareTables::x#2 mul8u::return#2 ] ) always clobbers reg byte a +Statement [95] (word~) initSquareTables::$6 ← (word) mul8u::return#2 [ initSquareTables::x#2 initSquareTables::$6 ] ( main:2::initSquareTables:27 [ initSquareTables::x#2 initSquareTables::$6 ] ) always clobbers reg byte a +Statement [96] (byte~) initSquareTables::$16 ← (byte) initSquareTables::x#2 << (byte) 1 [ initSquareTables::x#2 initSquareTables::$6 initSquareTables::$16 ] ( main:2::initSquareTables:27 [ initSquareTables::x#2 initSquareTables::$6 initSquareTables::$16 ] ) always clobbers reg byte a +Statement [97] *((const word[$28]) SQUARES_X#0 + (byte~) initSquareTables::$16) ← (word~) initSquareTables::$6 [ initSquareTables::x#2 ] ( main:2::initSquareTables:27 [ initSquareTables::x#2 ] ) always clobbers reg byte a +Statement [102] (byte~) initSquareTables::$10 ← (byte) initSquareTables::y#2 - (byte) $c [ initSquareTables::y#2 initSquareTables::$10 ] ( main:2::initSquareTables:27 [ initSquareTables::y#2 initSquareTables::$10 ] ) always clobbers reg byte a +Statement [107] (word) mul8u::return#3 ← (word) mul8u::res#2 [ initSquareTables::y#2 mul8u::return#3 ] ( main:2::initSquareTables:27 [ initSquareTables::y#2 mul8u::return#3 ] ) always clobbers reg byte a +Statement [108] (word~) initSquareTables::$14 ← (word) mul8u::return#3 [ initSquareTables::y#2 initSquareTables::$14 ] ( main:2::initSquareTables:27 [ initSquareTables::y#2 initSquareTables::$14 ] ) always clobbers reg byte a +Statement [109] (byte~) initSquareTables::$17 ← (byte) initSquareTables::y#2 << (byte) 1 [ initSquareTables::y#2 initSquareTables::$14 initSquareTables::$17 ] ( main:2::initSquareTables:27 [ initSquareTables::y#2 initSquareTables::$14 initSquareTables::$17 ] ) always clobbers reg byte a +Statement [110] *((const word[$19]) SQUARES_Y#0 + (byte~) initSquareTables::$17) ← (word~) initSquareTables::$14 [ initSquareTables::y#2 ] ( main:2::initSquareTables:27 [ initSquareTables::y#2 ] ) always clobbers reg byte a +Statement [114] (byte~) initSquareTables::$12 ← (byte) $c - (byte) initSquareTables::y#2 [ initSquareTables::y#2 initSquareTables::$12 ] ( main:2::initSquareTables:27 [ initSquareTables::y#2 initSquareTables::$12 ] ) always clobbers reg byte a +Statement [115] (byte~) initSquareTables::$4 ← (byte) $14 - (byte) initSquareTables::x#2 [ initSquareTables::x#2 initSquareTables::$4 ] ( main:2::initSquareTables:27 [ initSquareTables::x#2 initSquareTables::$4 ] ) always clobbers reg byte a +Statement [120] (byte~) mul8u::$1 ← (byte) mul8u::a#3 & (byte) 1 [ mul8u::res#2 mul8u::a#3 mul8u::mb#2 mul8u::$1 ] ( main:2::initSquareTables:27::mul8u:93 [ initSquareTables::x#2 mul8u::res#2 mul8u::a#3 mul8u::mb#2 mul8u::$1 ] main:2::initSquareTables:27::mul8u:106 [ initSquareTables::y#2 mul8u::res#2 mul8u::a#3 mul8u::mb#2 mul8u::$1 ] ) always clobbers reg byte a +Statement [122] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 [ mul8u::a#3 mul8u::mb#2 mul8u::res#1 ] ( main:2::initSquareTables:27::mul8u:93 [ initSquareTables::x#2 mul8u::a#3 mul8u::mb#2 mul8u::res#1 ] main:2::initSquareTables:27::mul8u:106 [ initSquareTables::y#2 mul8u::a#3 mul8u::mb#2 mul8u::res#1 ] ) always clobbers reg byte a +Statement [127] *((const byte*) PROCPORT_DDR#0) ← (const byte) PROCPORT_DDR_MEMORY_MASK#0 [ ] ( main:2::setupRasterIrq:13 [ ] ) always clobbers reg byte a +Statement [128] *((const byte*) PROCPORT#0) ← (const byte) PROCPORT_RAM_IO#0 [ ] ( main:2::setupRasterIrq:13 [ ] ) always clobbers reg byte a +Statement [129] *((const byte*) CIA1_INTERRUPT#0) ← (const byte) CIA_INTERRUPT_CLEAR#0 [ ] ( main:2::setupRasterIrq:13 [ ] ) always clobbers reg byte a +Statement [130] *((const byte*) VIC_CONTROL#0) ← *((const byte*) VIC_CONTROL#0) & (byte) $7f [ ] ( main:2::setupRasterIrq:13 [ ] ) always clobbers reg byte a +Statement [131] *((const byte*) RASTER#0) ← <(const byte) RASTER_IRQ_TOP#0 [ ] ( main:2::setupRasterIrq:13 [ ] ) always clobbers reg byte a +Statement [132] *((const byte*) IRQ_ENABLE#0) ← (const byte) IRQ_RASTER#0 [ ] ( main:2::setupRasterIrq:13 [ ] ) always clobbers reg byte a +Statement [133] *((const void()**) HARDWARE_IRQ#0) ← (const void()*) setupRasterIrq::irqRoutine#0 [ ] ( main:2::setupRasterIrq:13 [ ] ) always clobbers reg byte a +Statement [140] *((const byte*) BORDERCOL#0) ← (const byte) WHITE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [141] *((const byte*) BGCOL#0) ← (const byte) WHITE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [143] *((const byte*) BORDERCOL#0) ← (const byte) LIGHT_BLUE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [144] *((const byte*) BGCOL#0) ← (const byte) BLUE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [145] *((const byte*) RASTER#0) ← (const byte) RASTER_IRQ_TOP#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [146] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(HARDWARE_ALL)(void()) irqTop() [ ] ( [ ] ) always clobbers reg byte a +Statement [147] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [148] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y +Statement [151] (byte~) processChars::$13 ← (byte) processChars::i#2 << (byte) 2 [ processChars::i#2 processChars::$13 ] ( processChars:142 [ processChars::i#2 processChars::$13 ] ) always clobbers reg byte a +Statement [152] if(*((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) processChars::$13)==(const word) NOT_FOUND#0) goto processChars::@2 [ processChars::i#2 ] ( processChars:142 [ processChars::i#2 ] ) always clobbers reg byte a +Statement [153] (byte~) processChars::$14 ← (byte) processChars::i#2 << (byte) 2 [ processChars::i#2 processChars::$14 ] ( processChars:142 [ processChars::i#2 processChars::$14 ] ) always clobbers reg byte a +Statement [156] (word~) processChars::$2 ← (word)(byte) processChars::processing_y#0 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$2 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$2 ] ) always clobbers reg byte a +Statement [157] (word) processChars::$21 ← (word~) processChars::$2 << (byte) 2 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$2 processChars::$21 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$2 processChars::$21 ] ) always clobbers reg byte a +Statement [158] (word) processChars::$22 ← (word) processChars::$21 + (word~) processChars::$2 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$22 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$22 ] ) always clobbers reg byte a +Statement [159] (word~) processChars::$3 ← (word) processChars::$22 << (byte) 3 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$3 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$3 ] ) always clobbers reg byte a +Statement [160] (byte*~) processChars::$4 ← (const byte*) COLS#0 + (word~) processChars::$3 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$4 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 processChars::$4 ] ) always clobbers reg byte a +Statement [161] *((byte*~) processChars::$4 + (byte) processChars::processing_x#0) ← (const byte) WHITE#0 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::processing_y#0 ] ) always clobbers reg byte a +Statement [162] (word~) processChars::$6 ← (word)(byte) processChars::processing_y#0 [ processChars::i#2 processChars::processing_x#0 processChars::$6 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::$6 ] ) always clobbers reg byte a +Statement [163] (word) processChars::$24 ← (word~) processChars::$6 << (byte) 2 [ processChars::i#2 processChars::processing_x#0 processChars::$6 processChars::$24 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::$6 processChars::$24 ] ) always clobbers reg byte a +Statement [164] (word) processChars::$25 ← (word) processChars::$24 + (word~) processChars::$6 [ processChars::i#2 processChars::processing_x#0 processChars::$25 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::$25 ] ) always clobbers reg byte a +Statement [165] (word~) processChars::$7 ← (word) processChars::$25 << (byte) 3 [ processChars::i#2 processChars::processing_x#0 processChars::$7 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::$7 ] ) always clobbers reg byte a +Statement [166] (byte*~) processChars::$8 ← (const byte*) SCREEN#0 + (word~) processChars::$7 [ processChars::i#2 processChars::processing_x#0 processChars::$8 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::$8 ] ) always clobbers reg byte a +Statement [167] if(*((byte*~) processChars::$8 + (byte) processChars::processing_x#0)==(byte) ' ') goto processChars::@3 [ processChars::i#2 processChars::processing_x#0 processChars::$8 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::$8 ] ) always clobbers reg byte a +Statement [168] if(*((byte*~) processChars::$8 + (byte) processChars::processing_x#0)>(byte) ' ') goto processChars::@4 [ processChars::i#2 processChars::processing_x#0 processChars::$8 ] ( processChars:142 [ processChars::i#2 processChars::processing_x#0 processChars::$8 ] ) always clobbers reg byte a +Statement [169] *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) ← ++ *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) [ processChars::i#2 ] ( processChars:142 [ processChars::i#2 ] ) always clobbers reg byte a +Statement [173] *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) ← -- *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) [ processChars::i#2 ] ( processChars:142 [ processChars::i#2 ] ) always clobbers reg byte a +Statement [174] (byte~) processChars::$15 ← (byte) processChars::i#2 << (byte) 2 [ processChars::i#2 processChars::$15 ] ( processChars:142 [ processChars::i#2 processChars::$15 ] ) always clobbers reg byte a +Statement [175] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) processChars::$15) ← (const word) NOT_FOUND#0 [ processChars::i#2 ] ( processChars:142 [ processChars::i#2 ] ) always clobbers reg byte a +Statement [180] *((const byte*) BORDERCOL#0) ← (const byte) WHITE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [181] *((const byte*) BGCOL#0) ← (const byte) WHITE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [185] *((const byte*) BORDERCOL#0) ← (const byte) LIGHT_BLUE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [186] *((const byte*) BGCOL#0) ← (const byte) BLUE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [187] *((const byte*) RASTER#0) ← (const byte) RASTER_IRQ_MIDDLE#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [188] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(HARDWARE_ALL)(void()) irqBottom() [ ] ( [ ] ) always clobbers reg byte a +Statement [189] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 [ ] ( [ ] ) always clobbers reg byte a +Statement [190] return [ ] ( [ ] ) always clobbers reg byte a reg byte x reg byte y +Potential registers zp ZP_BYTE:2 [ main::i#2 main::i#1 ] : zp ZP_BYTE:2 , reg byte x , reg byte y , +Potential registers zp ZP_WORD:3 [ main::sc#2 main::sc#1 ] : zp ZP_WORD:3 , +Potential registers zp ZP_WORD:5 [ main::src#2 main::src#1 ] : zp ZP_WORD:5 , +Potential registers zp ZP_WORD:7 [ main::dst#2 main::dst#1 ] : zp ZP_WORD:7 , +Potential registers zp ZP_BYTE:9 [ startProcessing::freeIdx#6 startProcessing::freeIdx#7 ] : zp ZP_BYTE:9 , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:10 [ startProcessing::freeIdx#2 startProcessing::freeIdx#8 startProcessing::i#2 startProcessing::i#1 ] : zp ZP_BYTE:10 , reg byte x , reg byte y , +Potential registers zp ZP_WORD:11 [ getCenterChar::screen_line#4 getCenterChar::screen_line#1 ] : zp ZP_WORD:11 , +Potential registers zp ZP_BYTE:13 [ getCenterChar::y#7 getCenterChar::y#1 ] : zp ZP_BYTE:13 , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:14 [ getCenterChar::x#2 getCenterChar::x#1 ] : zp ZP_BYTE:14 , reg byte x , reg byte y , +Potential registers zp ZP_WORD:15 [ getCenterChar::closest_dist#2 getCenterChar::closest_dist#8 getCenterChar::closest_dist#10 getCenterChar::closest_dist#12 ] : zp ZP_WORD:15 , +Potential registers zp ZP_BYTE:17 [ getCenterChar::closest_x#7 getCenterChar::closest_x#9 getCenterChar::return_x#1 getCenterChar::return_x#7 ] : zp ZP_BYTE:17 , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:18 [ getCenterChar::closest_y#7 getCenterChar::closest_y#9 getCenterChar::return_y#1 getCenterChar::return_y#7 ] : zp ZP_BYTE:18 , reg byte x , reg byte y , +Potential registers zp ZP_WORD:19 [ getCenterChar::return_dist#1 getCenterChar::return_dist#5 getCenterChar::return_dist#6 getCenterChar::dist#0 ] : zp ZP_WORD:19 , +Potential registers zp ZP_BYTE:21 [ initSquareTables::x#2 initSquareTables::x#1 ] : zp ZP_BYTE:21 , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:22 [ initSquareTables::x_dist#0 initSquareTables::$4 initSquareTables::$2 ] : zp ZP_BYTE:22 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:23 [ initSquareTables::y#2 initSquareTables::y#1 ] : zp ZP_BYTE:23 , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:24 [ initSquareTables::y_dist#0 initSquareTables::$12 initSquareTables::$10 ] : zp ZP_BYTE:24 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:25 [ mul8u::b#1 ] : zp ZP_BYTE:25 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:26 [ mul8u::b#0 ] : zp ZP_BYTE:26 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:27 [ mul8u::a#3 mul8u::a#6 mul8u::a#2 mul8u::a#1 mul8u::a#0 ] : zp ZP_BYTE:27 , reg byte x , reg byte y , +Potential registers zp ZP_WORD:28 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] : zp ZP_WORD:28 , +Potential registers zp ZP_WORD:30 [ mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 ] : zp ZP_WORD:30 , +Potential registers zp ZP_BYTE:32 [ irqBottom::i#2 irqBottom::i#1 ] : zp ZP_BYTE:32 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:33 [ processChars::i#2 processChars::i#1 ] : zp ZP_BYTE:33 , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:34 [ irqTop::i#2 irqTop::i#1 ] : zp ZP_BYTE:34 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:35 [ irqTop::i1#2 irqTop::i1#1 ] : zp ZP_BYTE:35 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:36 [ main::$18 ] : zp ZP_BYTE:36 , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:37 [ main::$5 ] : zp ZP_BYTE:37 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:38 [ main::$6 ] : zp ZP_BYTE:38 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:39 [ main::$7 ] : zp ZP_BYTE:39 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:40 [ getCenterChar::return_x#0 ] : zp ZP_BYTE:40 , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:41 [ getCenterChar::return_y#0 ] : zp ZP_BYTE:41 , reg byte x , reg byte y , +Potential registers zp ZP_WORD:42 [ getCenterChar::return_dist#0 ] : zp ZP_WORD:42 , +Potential registers zp ZP_BYTE:44 [ main::center_x#0 ] : zp ZP_BYTE:44 , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:45 [ main::center_y#0 ] : zp ZP_BYTE:45 , reg byte x , reg byte y , +Potential registers zp ZP_WORD:46 [ main::center_dist#0 ] : zp ZP_WORD:46 , +Potential registers zp ZP_BYTE:48 [ startProcessing::center_x#0 ] : zp ZP_BYTE:48 , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:49 [ startProcessing::center_y#0 ] : zp ZP_BYTE:49 , reg byte x , reg byte y , +Potential registers zp ZP_WORD:50 [ startProcessing::center_dist#0 ] : zp ZP_WORD:50 , +Potential registers zp ZP_BYTE:52 [ startProcessing::$4 ] : zp ZP_BYTE:52 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:53 [ startProcessing::$5 ] : zp ZP_BYTE:53 , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:54 [ getCenterChar::$13 ] : zp ZP_BYTE:54 , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:55 [ getCenterChar::$14 ] : zp ZP_BYTE:55 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_WORD:56 [ getCenterChar::$9 ] : zp ZP_WORD:56 , +Potential registers zp ZP_WORD:58 [ getCenterChar::$15 ] : zp ZP_WORD:58 , +Potential registers zp ZP_WORD:60 [ getCenterChar::$16 ] : zp ZP_WORD:60 , +Potential registers zp ZP_WORD:62 [ getCenterChar::$10 ] : zp ZP_WORD:62 , +Potential registers zp ZP_WORD:64 [ getCenterChar::$11 ] : zp ZP_WORD:64 , +Potential registers zp ZP_WORD:66 [ mul8u::return#2 ] : zp ZP_WORD:66 , +Potential registers zp ZP_WORD:68 [ initSquareTables::$6 ] : zp ZP_WORD:68 , +Potential registers zp ZP_BYTE:70 [ initSquareTables::$16 ] : zp ZP_BYTE:70 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_WORD:71 [ mul8u::return#3 ] : zp ZP_WORD:71 , +Potential registers zp ZP_WORD:73 [ initSquareTables::$14 ] : zp ZP_WORD:73 , +Potential registers zp ZP_BYTE:75 [ initSquareTables::$17 ] : zp ZP_BYTE:75 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:76 [ mul8u::$1 ] : zp ZP_BYTE:76 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:77 [ processChars::$13 ] : zp ZP_BYTE:77 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:78 [ processChars::$14 ] : zp ZP_BYTE:78 , reg byte a , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:79 [ processChars::processing_x#0 ] : zp ZP_BYTE:79 , reg byte x , reg byte y , +Potential registers zp ZP_BYTE:80 [ processChars::processing_y#0 ] : zp ZP_BYTE:80 , reg byte x , reg byte y , +Potential registers zp ZP_WORD:81 [ processChars::$2 ] : zp ZP_WORD:81 , +Potential registers zp ZP_WORD:83 [ processChars::$21 ] : zp ZP_WORD:83 , +Potential registers zp ZP_WORD:85 [ processChars::$22 ] : zp ZP_WORD:85 , +Potential registers zp ZP_WORD:87 [ processChars::$3 ] : zp ZP_WORD:87 , +Potential registers zp ZP_WORD:89 [ processChars::$4 ] : zp ZP_WORD:89 , +Potential registers zp ZP_WORD:91 [ processChars::$6 ] : zp ZP_WORD:91 , +Potential registers zp ZP_WORD:93 [ processChars::$24 ] : zp ZP_WORD:93 , +Potential registers zp ZP_WORD:95 [ processChars::$25 ] : zp ZP_WORD:95 , +Potential registers zp ZP_WORD:97 [ processChars::$7 ] : zp ZP_WORD:97 , +Potential registers zp ZP_WORD:99 [ processChars::$8 ] : zp ZP_WORD:99 , +Potential registers zp ZP_BYTE:101 [ processChars::$15 ] : zp ZP_BYTE:101 , reg byte a , reg byte x , reg byte y , + +REGISTER UPLIFT SCOPES +Uplift Scope [getCenterChar] 4,996.99: zp ZP_WORD:19 [ getCenterChar::return_dist#1 getCenterChar::return_dist#5 getCenterChar::return_dist#6 getCenterChar::dist#0 ] 3,090.17: zp ZP_WORD:15 [ getCenterChar::closest_dist#2 getCenterChar::closest_dist#8 getCenterChar::closest_dist#10 getCenterChar::closest_dist#12 ] 2,820.67: zp ZP_BYTE:18 [ getCenterChar::closest_y#7 getCenterChar::closest_y#9 getCenterChar::return_y#1 getCenterChar::return_y#7 ] 2,002: zp ZP_BYTE:55 [ getCenterChar::$14 ] 1,833.24: zp ZP_BYTE:17 [ getCenterChar::closest_x#7 getCenterChar::closest_x#9 getCenterChar::return_x#1 getCenterChar::return_x#7 ] 1,456: zp ZP_BYTE:14 [ getCenterChar::x#2 getCenterChar::x#1 ] 1,001: zp ZP_BYTE:54 [ getCenterChar::$13 ] 238.75: zp ZP_BYTE:13 [ getCenterChar::y#7 getCenterChar::y#1 ] 130.7: zp ZP_WORD:11 [ getCenterChar::screen_line#4 getCenterChar::screen_line#1 ] 7.33: zp ZP_BYTE:40 [ getCenterChar::return_x#0 ] 7.33: zp ZP_BYTE:41 [ getCenterChar::return_y#0 ] 7.33: zp ZP_WORD:42 [ getCenterChar::return_dist#0 ] 4: zp ZP_WORD:58 [ getCenterChar::$15 ] 4: zp ZP_WORD:60 [ getCenterChar::$16 ] 4: zp ZP_WORD:62 [ getCenterChar::$10 ] 4: zp ZP_WORD:64 [ getCenterChar::$11 ] 3: zp ZP_WORD:56 [ getCenterChar::$9 ] +Uplift Scope [startProcessing] 3,691.17: zp ZP_BYTE:10 [ startProcessing::freeIdx#2 startProcessing::freeIdx#8 startProcessing::i#2 startProcessing::i#1 ] 2,002: zp ZP_BYTE:52 [ startProcessing::$4 ] 235.67: zp ZP_BYTE:9 [ startProcessing::freeIdx#6 startProcessing::freeIdx#7 ] 2.67: zp ZP_BYTE:53 [ startProcessing::$5 ] 0.87: zp ZP_BYTE:48 [ startProcessing::center_x#0 ] 0.87: zp ZP_BYTE:49 [ startProcessing::center_y#0 ] 0.87: zp ZP_WORD:50 [ startProcessing::center_dist#0 ] +Uplift Scope [mul8u] 349.43: zp ZP_WORD:28 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] 269.57: zp ZP_WORD:30 [ mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 ] 214.67: zp ZP_BYTE:27 [ mul8u::a#3 mul8u::a#6 mul8u::a#2 mul8u::a#1 mul8u::a#0 ] 202: zp ZP_BYTE:76 [ mul8u::$1 ] 22: zp ZP_BYTE:25 [ mul8u::b#1 ] 22: zp ZP_BYTE:26 [ mul8u::b#0 ] 22: zp ZP_WORD:66 [ mul8u::return#2 ] 22: zp ZP_WORD:71 [ mul8u::return#3 ] +Uplift Scope [processChars] 25.67: zp ZP_WORD:99 [ processChars::$8 ] 22: zp ZP_BYTE:77 [ processChars::$13 ] 22: zp ZP_WORD:83 [ processChars::$21 ] 22: zp ZP_WORD:85 [ processChars::$22 ] 22: zp ZP_WORD:87 [ processChars::$3 ] 22: zp ZP_WORD:89 [ processChars::$4 ] 22: zp ZP_WORD:93 [ processChars::$24 ] 22: zp ZP_WORD:95 [ processChars::$25 ] 22: zp ZP_WORD:97 [ processChars::$7 ] 22: zp ZP_BYTE:101 [ processChars::$15 ] 18.89: zp ZP_BYTE:33 [ processChars::i#2 processChars::i#1 ] 16.5: zp ZP_BYTE:78 [ processChars::$14 ] 16.5: zp ZP_WORD:81 [ processChars::$2 ] 16.5: zp ZP_WORD:91 [ processChars::$6 ] 5.87: zp ZP_BYTE:79 [ processChars::processing_x#0 ] 1.57: zp ZP_BYTE:80 [ processChars::processing_y#0 ] +Uplift Scope [initSquareTables] 66: zp ZP_BYTE:22 [ initSquareTables::x_dist#0 initSquareTables::$4 initSquareTables::$2 ] 66: zp ZP_BYTE:24 [ initSquareTables::y_dist#0 initSquareTables::$12 initSquareTables::$10 ] 22: zp ZP_BYTE:21 [ initSquareTables::x#2 initSquareTables::x#1 ] 22: zp ZP_BYTE:23 [ initSquareTables::y#2 initSquareTables::y#1 ] 22: zp ZP_BYTE:70 [ initSquareTables::$16 ] 22: zp ZP_BYTE:75 [ initSquareTables::$17 ] 11: zp ZP_WORD:68 [ initSquareTables::$6 ] 11: zp ZP_WORD:73 [ initSquareTables::$14 ] +Uplift Scope [main] 27.5: zp ZP_WORD:5 [ main::src#2 main::src#1 ] 25.3: zp ZP_WORD:3 [ main::sc#2 main::sc#1 ] 23.1: zp ZP_BYTE:2 [ main::i#2 main::i#1 ] 22: zp ZP_WORD:7 [ main::dst#2 main::dst#1 ] 22: zp ZP_BYTE:37 [ main::$5 ] 22: zp ZP_BYTE:38 [ main::$6 ] 22: zp ZP_BYTE:39 [ main::$7 ] 14.67: zp ZP_BYTE:36 [ main::$18 ] 8.25: zp ZP_WORD:46 [ main::center_dist#0 ] 5.5: zp ZP_BYTE:44 [ main::center_x#0 ] 5.5: zp ZP_BYTE:45 [ main::center_y#0 ] +Uplift Scope [irqTop] 38.5: zp ZP_BYTE:34 [ irqTop::i#2 irqTop::i#1 ] 38.5: zp ZP_BYTE:35 [ irqTop::i1#2 irqTop::i1#1 ] +Uplift Scope [irqBottom] 38.5: zp ZP_BYTE:32 [ irqBottom::i#2 irqBottom::i#1 ] +Uplift Scope [ProcessingChar] +Uplift Scope [setupRasterIrq] +Uplift Scope [] + +Uplifting [getCenterChar] best 256062 combination zp ZP_WORD:19 [ getCenterChar::return_dist#1 getCenterChar::return_dist#5 getCenterChar::return_dist#6 getCenterChar::dist#0 ] zp ZP_WORD:15 [ getCenterChar::closest_dist#2 getCenterChar::closest_dist#8 getCenterChar::closest_dist#10 getCenterChar::closest_dist#12 ] zp ZP_BYTE:18 [ getCenterChar::closest_y#7 getCenterChar::closest_y#9 getCenterChar::return_y#1 getCenterChar::return_y#7 ] reg byte a [ getCenterChar::$14 ] zp ZP_BYTE:17 [ getCenterChar::closest_x#7 getCenterChar::closest_x#9 getCenterChar::return_x#1 getCenterChar::return_x#7 ] zp ZP_BYTE:14 [ getCenterChar::x#2 getCenterChar::x#1 ] zp ZP_BYTE:54 [ getCenterChar::$13 ] zp ZP_BYTE:13 [ getCenterChar::y#7 getCenterChar::y#1 ] zp ZP_WORD:11 [ getCenterChar::screen_line#4 getCenterChar::screen_line#1 ] zp ZP_BYTE:40 [ getCenterChar::return_x#0 ] zp ZP_BYTE:41 [ getCenterChar::return_y#0 ] zp ZP_WORD:42 [ getCenterChar::return_dist#0 ] zp ZP_WORD:58 [ getCenterChar::$15 ] zp ZP_WORD:60 [ getCenterChar::$16 ] zp ZP_WORD:62 [ getCenterChar::$10 ] zp ZP_WORD:64 [ getCenterChar::$11 ] zp ZP_WORD:56 [ getCenterChar::$9 ] +Limited combination testing to 100 combinations of 8748 possible. +Uplifting [startProcessing] best 241151 combination reg byte x [ startProcessing::freeIdx#2 startProcessing::freeIdx#8 startProcessing::i#2 startProcessing::i#1 ] reg byte a [ startProcessing::$4 ] zp ZP_BYTE:9 [ startProcessing::freeIdx#6 startProcessing::freeIdx#7 ] reg byte x [ startProcessing::$5 ] zp ZP_BYTE:48 [ startProcessing::center_x#0 ] zp ZP_BYTE:49 [ startProcessing::center_y#0 ] zp ZP_WORD:50 [ startProcessing::center_dist#0 ] +Limited combination testing to 100 combinations of 972 possible. +Uplifting [mul8u] best 240125 combination zp ZP_WORD:28 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] zp ZP_WORD:30 [ mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 ] reg byte x [ mul8u::a#3 mul8u::a#6 mul8u::a#2 mul8u::a#1 mul8u::a#0 ] reg byte a [ mul8u::$1 ] reg byte a [ mul8u::b#1 ] reg byte a [ mul8u::b#0 ] zp ZP_WORD:66 [ mul8u::return#2 ] zp ZP_WORD:71 [ mul8u::return#3 ] +Limited combination testing to 100 combinations of 192 possible. +Uplifting [processChars] best 239925 combination zp ZP_WORD:99 [ processChars::$8 ] reg byte a [ processChars::$13 ] zp ZP_WORD:83 [ processChars::$21 ] zp ZP_WORD:85 [ processChars::$22 ] zp ZP_WORD:87 [ processChars::$3 ] zp ZP_WORD:89 [ processChars::$4 ] zp ZP_WORD:93 [ processChars::$24 ] zp ZP_WORD:95 [ processChars::$25 ] zp ZP_WORD:97 [ processChars::$7 ] reg byte a [ processChars::$15 ] reg byte x [ processChars::i#2 processChars::i#1 ] zp ZP_BYTE:78 [ processChars::$14 ] zp ZP_WORD:81 [ processChars::$2 ] zp ZP_WORD:91 [ processChars::$6 ] zp ZP_BYTE:79 [ processChars::processing_x#0 ] zp ZP_BYTE:80 [ processChars::processing_y#0 ] +Limited combination testing to 100 combinations of 1728 possible. +Uplifting [initSquareTables] best 239765 combination reg byte a [ initSquareTables::x_dist#0 initSquareTables::$4 initSquareTables::$2 ] reg byte a [ initSquareTables::y_dist#0 initSquareTables::$12 initSquareTables::$10 ] zp ZP_BYTE:21 [ initSquareTables::x#2 initSquareTables::x#1 ] zp ZP_BYTE:23 [ initSquareTables::y#2 initSquareTables::y#1 ] zp ZP_BYTE:70 [ initSquareTables::$16 ] zp ZP_BYTE:75 [ initSquareTables::$17 ] zp ZP_WORD:68 [ initSquareTables::$6 ] zp ZP_WORD:73 [ initSquareTables::$14 ] +Limited combination testing to 100 combinations of 2304 possible. +Uplifting [main] best 239505 combination zp ZP_WORD:5 [ main::src#2 main::src#1 ] zp ZP_WORD:3 [ main::sc#2 main::sc#1 ] reg byte x [ main::i#2 main::i#1 ] zp ZP_WORD:7 [ main::dst#2 main::dst#1 ] reg byte a [ main::$5 ] reg byte a [ main::$6 ] reg byte a [ main::$7 ] zp ZP_BYTE:36 [ main::$18 ] zp ZP_WORD:46 [ main::center_dist#0 ] zp ZP_BYTE:44 [ main::center_x#0 ] zp ZP_BYTE:45 [ main::center_y#0 ] +Limited combination testing to 100 combinations of 5184 possible. +Uplifting [irqTop] best 239325 combination reg byte x [ irqTop::i#2 irqTop::i#1 ] reg byte x [ irqTop::i1#2 irqTop::i1#1 ] +Uplifting [irqBottom] best 239235 combination reg byte x [ irqBottom::i#2 irqBottom::i#1 ] +Uplifting [ProcessingChar] best 239235 combination +Uplifting [setupRasterIrq] best 239235 combination +Uplifting [] best 239235 combination +Attempting to uplift remaining variables inzp ZP_BYTE:18 [ getCenterChar::closest_y#7 getCenterChar::closest_y#9 getCenterChar::return_y#1 getCenterChar::return_y#7 ] +Uplifting [getCenterChar] best 239235 combination zp ZP_BYTE:18 [ getCenterChar::closest_y#7 getCenterChar::closest_y#9 getCenterChar::return_y#1 getCenterChar::return_y#7 ] +Attempting to uplift remaining variables inzp ZP_BYTE:17 [ getCenterChar::closest_x#7 getCenterChar::closest_x#9 getCenterChar::return_x#1 getCenterChar::return_x#7 ] +Uplifting [getCenterChar] best 239235 combination zp ZP_BYTE:17 [ getCenterChar::closest_x#7 getCenterChar::closest_x#9 getCenterChar::return_x#1 getCenterChar::return_x#7 ] +Attempting to uplift remaining variables inzp ZP_BYTE:14 [ getCenterChar::x#2 getCenterChar::x#1 ] +Uplifting [getCenterChar] best 239235 combination zp ZP_BYTE:14 [ getCenterChar::x#2 getCenterChar::x#1 ] +Attempting to uplift remaining variables inzp ZP_BYTE:54 [ getCenterChar::$13 ] +Uplifting [getCenterChar] best 235235 combination reg byte x [ getCenterChar::$13 ] +Attempting to uplift remaining variables inzp ZP_BYTE:13 [ getCenterChar::y#7 getCenterChar::y#1 ] +Uplifting [getCenterChar] best 235235 combination zp ZP_BYTE:13 [ getCenterChar::y#7 getCenterChar::y#1 ] +Attempting to uplift remaining variables inzp ZP_BYTE:9 [ startProcessing::freeIdx#6 startProcessing::freeIdx#7 ] +Uplifting [startProcessing] best 235235 combination zp ZP_BYTE:9 [ startProcessing::freeIdx#6 startProcessing::freeIdx#7 ] +Attempting to uplift remaining variables inzp ZP_BYTE:21 [ initSquareTables::x#2 initSquareTables::x#1 ] +Uplifting [initSquareTables] best 235235 combination zp ZP_BYTE:21 [ initSquareTables::x#2 initSquareTables::x#1 ] +Attempting to uplift remaining variables inzp ZP_BYTE:23 [ initSquareTables::y#2 initSquareTables::y#1 ] +Uplifting [initSquareTables] best 235235 combination zp ZP_BYTE:23 [ initSquareTables::y#2 initSquareTables::y#1 ] +Attempting to uplift remaining variables inzp ZP_BYTE:70 [ initSquareTables::$16 ] +Uplifting [initSquareTables] best 235195 combination reg byte a [ initSquareTables::$16 ] +Attempting to uplift remaining variables inzp ZP_BYTE:75 [ initSquareTables::$17 ] +Uplifting [initSquareTables] best 235155 combination reg byte a [ initSquareTables::$17 ] +Attempting to uplift remaining variables inzp ZP_BYTE:78 [ processChars::$14 ] +Uplifting [processChars] best 235085 combination reg byte y [ processChars::$14 ] +Attempting to uplift remaining variables inzp ZP_BYTE:36 [ main::$18 ] +Uplifting [main] best 234985 combination reg byte y [ main::$18 ] +Attempting to uplift remaining variables inzp ZP_BYTE:40 [ getCenterChar::return_x#0 ] +Uplifting [getCenterChar] best 234925 combination reg byte x [ getCenterChar::return_x#0 ] +Attempting to uplift remaining variables inzp ZP_BYTE:41 [ getCenterChar::return_y#0 ] +Uplifting [getCenterChar] best 234865 combination reg byte y [ getCenterChar::return_y#0 ] +Attempting to uplift remaining variables inzp ZP_BYTE:79 [ processChars::processing_x#0 ] +Uplifting [processChars] best 234865 combination zp ZP_BYTE:79 [ processChars::processing_x#0 ] +Attempting to uplift remaining variables inzp ZP_BYTE:44 [ main::center_x#0 ] +Uplifting [main] best 234805 combination reg byte x [ main::center_x#0 ] +Attempting to uplift remaining variables inzp ZP_BYTE:45 [ main::center_y#0 ] +Uplifting [main] best 234745 combination reg byte y [ main::center_y#0 ] +Attempting to uplift remaining variables inzp ZP_BYTE:80 [ processChars::processing_y#0 ] +Uplifting [processChars] best 234745 combination zp ZP_BYTE:80 [ processChars::processing_y#0 ] +Attempting to uplift remaining variables inzp ZP_BYTE:48 [ startProcessing::center_x#0 ] +Uplifting [startProcessing] best 234745 combination zp ZP_BYTE:48 [ startProcessing::center_x#0 ] +Attempting to uplift remaining variables inzp ZP_BYTE:49 [ startProcessing::center_y#0 ] +Uplifting [startProcessing] best 234745 combination zp ZP_BYTE:49 [ startProcessing::center_y#0 ] +Coalescing zero page register with common assignment [ zp ZP_WORD:19 [ getCenterChar::return_dist#1 getCenterChar::return_dist#5 getCenterChar::return_dist#6 getCenterChar::dist#0 ] ] with [ zp ZP_WORD:42 [ getCenterChar::return_dist#0 ] ] - score: 1 +Coalescing zero page register with common assignment [ zp ZP_WORD:28 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] ] with [ zp ZP_WORD:66 [ mul8u::return#2 ] ] - score: 1 +Coalescing zero page register with common assignment [ zp ZP_WORD:28 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 ] ] with [ zp ZP_WORD:71 [ mul8u::return#3 ] ] - score: 1 +Coalescing zero page register with common assignment [ zp ZP_WORD:46 [ main::center_dist#0 ] ] with [ zp ZP_WORD:50 [ startProcessing::center_dist#0 ] ] - score: 1 +Coalescing zero page register with common assignment [ zp ZP_WORD:56 [ getCenterChar::$9 ] ] with [ zp ZP_WORD:60 [ getCenterChar::$16 ] ] - score: 1 +Coalescing zero page register with common assignment [ zp ZP_WORD:62 [ getCenterChar::$10 ] ] with [ zp ZP_WORD:64 [ getCenterChar::$11 ] ] - score: 1 +Coalescing zero page register with common assignment [ zp ZP_WORD:81 [ processChars::$2 ] ] with [ zp ZP_WORD:85 [ processChars::$22 ] ] - score: 1 +Coalescing zero page register with common assignment [ zp ZP_WORD:87 [ processChars::$3 ] ] with [ zp ZP_WORD:89 [ processChars::$4 ] ] - score: 1 +Coalescing zero page register with common assignment [ zp ZP_WORD:91 [ processChars::$6 ] ] with [ zp ZP_WORD:95 [ processChars::$25 ] ] - score: 1 +Coalescing zero page register with common assignment [ zp ZP_WORD:97 [ processChars::$7 ] ] with [ zp ZP_WORD:99 [ processChars::$8 ] ] - score: 1 +Coalescing zero page register with common assignment [ zp ZP_WORD:19 [ getCenterChar::return_dist#1 getCenterChar::return_dist#5 getCenterChar::return_dist#6 getCenterChar::dist#0 getCenterChar::return_dist#0 ] ] with [ zp ZP_WORD:46 [ main::center_dist#0 startProcessing::center_dist#0 ] ] - score: 1 +Coalescing zero page register with common assignment [ zp ZP_WORD:28 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 mul8u::return#3 ] ] with [ zp ZP_WORD:68 [ initSquareTables::$6 ] ] - score: 1 +Coalescing zero page register with common assignment [ zp ZP_WORD:28 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 mul8u::return#3 initSquareTables::$6 ] ] with [ zp ZP_WORD:73 [ initSquareTables::$14 ] ] - score: 1 +Coalescing zero page register with common assignment [ zp ZP_WORD:56 [ getCenterChar::$9 getCenterChar::$16 ] ] with [ zp ZP_WORD:62 [ getCenterChar::$10 getCenterChar::$11 ] ] - score: 1 +Coalescing zero page register with common assignment [ zp ZP_WORD:81 [ processChars::$2 processChars::$22 ] ] with [ zp ZP_WORD:87 [ processChars::$3 processChars::$4 ] ] - score: 1 +Coalescing zero page register with common assignment [ zp ZP_WORD:91 [ processChars::$6 processChars::$25 ] ] with [ zp ZP_WORD:97 [ processChars::$7 processChars::$8 ] ] - score: 1 +Allocated (was zp ZP_WORD:3) zp ZP_WORD:2 [ main::sc#2 main::sc#1 ] +Allocated (was zp ZP_WORD:5) zp ZP_WORD:4 [ main::src#2 main::src#1 ] +Allocated (was zp ZP_WORD:7) zp ZP_WORD:6 [ main::dst#2 main::dst#1 ] +Allocated (was zp ZP_BYTE:9) zp ZP_BYTE:8 [ startProcessing::freeIdx#6 startProcessing::freeIdx#7 ] +Allocated (was zp ZP_WORD:11) zp ZP_WORD:9 [ getCenterChar::screen_line#4 getCenterChar::screen_line#1 ] +Allocated (was zp ZP_BYTE:13) zp ZP_BYTE:11 [ getCenterChar::y#7 getCenterChar::y#1 ] +Allocated (was zp ZP_BYTE:14) zp ZP_BYTE:12 [ getCenterChar::x#2 getCenterChar::x#1 ] +Allocated (was zp ZP_WORD:15) zp ZP_WORD:13 [ getCenterChar::closest_dist#2 getCenterChar::closest_dist#8 getCenterChar::closest_dist#10 getCenterChar::closest_dist#12 ] +Allocated (was zp ZP_BYTE:17) zp ZP_BYTE:15 [ getCenterChar::closest_x#7 getCenterChar::closest_x#9 getCenterChar::return_x#1 getCenterChar::return_x#7 ] +Allocated (was zp ZP_BYTE:18) zp ZP_BYTE:16 [ getCenterChar::closest_y#7 getCenterChar::closest_y#9 getCenterChar::return_y#1 getCenterChar::return_y#7 ] +Allocated (was zp ZP_WORD:19) zp ZP_WORD:17 [ getCenterChar::return_dist#1 getCenterChar::return_dist#5 getCenterChar::return_dist#6 getCenterChar::dist#0 getCenterChar::return_dist#0 main::center_dist#0 startProcessing::center_dist#0 ] +Allocated (was zp ZP_BYTE:21) zp ZP_BYTE:19 [ initSquareTables::x#2 initSquareTables::x#1 ] +Allocated (was zp ZP_BYTE:23) zp ZP_BYTE:20 [ initSquareTables::y#2 initSquareTables::y#1 ] +Allocated (was zp ZP_WORD:28) zp ZP_WORD:21 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 mul8u::return#3 initSquareTables::$6 initSquareTables::$14 ] +Allocated (was zp ZP_WORD:30) zp ZP_WORD:23 [ mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 ] +Allocated (was zp ZP_BYTE:48) zp ZP_BYTE:25 [ startProcessing::center_x#0 ] +Allocated (was zp ZP_BYTE:49) zp ZP_BYTE:26 [ startProcessing::center_y#0 ] +Allocated (was zp ZP_WORD:56) zp ZP_WORD:27 [ getCenterChar::$9 getCenterChar::$16 getCenterChar::$10 getCenterChar::$11 ] +Allocated (was zp ZP_WORD:58) zp ZP_WORD:29 [ getCenterChar::$15 ] +Allocated (was zp ZP_BYTE:79) zp ZP_BYTE:31 [ processChars::processing_x#0 ] +Allocated (was zp ZP_BYTE:80) zp ZP_BYTE:32 [ processChars::processing_y#0 ] +Allocated (was zp ZP_WORD:81) zp ZP_WORD:33 [ processChars::$2 processChars::$22 processChars::$3 processChars::$4 ] +Allocated (was zp ZP_WORD:83) zp ZP_WORD:35 [ processChars::$21 ] +Allocated (was zp ZP_WORD:91) zp ZP_WORD:37 [ processChars::$6 processChars::$25 processChars::$7 processChars::$8 ] +Allocated (was zp ZP_WORD:93) zp ZP_WORD:39 [ processChars::$24 ] + +ASSEMBLER BEFORE OPTIMIZATION +//SEG0 File Comments +// Black Hole at the center of the BASIC screen sucking in any letters +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(bbegin) +.pc = $80d "Program" +//SEG2 Global Constants & labels + .const OFFSET_STRUCT_PROCESSINGCHAR_Y = 1 + .const OFFSET_STRUCT_PROCESSINGCHAR_DIST = 2 + // Processor port data direction register + .label PROCPORT_DDR = 0 + // Mask for PROCESSOR_PORT_DDR which allows only memory configuration to be written + .const PROCPORT_DDR_MEMORY_MASK = 7 + // Processor Port Register controlling RAM/ROM configuration and the datasette + .label PROCPORT = 1 + // RAM in $A000, $E000 I/O in $D000 + .const PROCPORT_RAM_IO = $35 + .label RASTER = $d012 + .label BORDERCOL = $d020 + .label BGCOL = $d021 + .label VIC_CONTROL = $d011 + // VIC II IRQ Status Register + .label IRQ_STATUS = $d019 + // VIC II IRQ Enable Register + .label IRQ_ENABLE = $d01a + // Bits for the IRQ Status/Enable Registers + .const IRQ_RASTER = 1 + // Color Ram + .label COLS = $d800 + // CIA#1 Interrupt Status & Control Register + .label CIA1_INTERRUPT = $dc0d + // Value that disables all CIA interrupts when stored to the CIA Interrupt registers + .const CIA_INTERRUPT_CLEAR = $7f + // The vector used when the HARDWARE serves IRQ interrupts + .label HARDWARE_IRQ = $fffe + .const WHITE = 1 + .const BLUE = 6 + .const LIGHT_BLUE = $e + .label SCREEN = $400 + // Distance value meaning not found + .const NOT_FOUND = $ffff + .const RASTER_IRQ_TOP = $30 + .const RASTER_IRQ_MIDDLE = $ff +//SEG3 @begin +bbegin: +//SEG4 [1] phi from @begin to @1 [phi:@begin->@1] +b1_from_bbegin: + jmp b1 +//SEG5 @1 +b1: +//SEG6 [2] call main +//SEG7 [4] phi from @1 to main [phi:@1->main] +main_from_b1: + jsr main +//SEG8 [3] phi from @1 to @end [phi:@1->@end] +bend_from_b1: + jmp bend +//SEG9 @end +bend: +//SEG10 main +main: { + .label sc = 2 + .label src = 4 + .label dst = 6 + .label center_dist = $11 + //SEG11 [5] phi from main to main::@1 [phi:main->main::@1] + b1_from_main: + //SEG12 [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 + ldx #0 + jmp b1 + // Init processing array + //SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1] + b1_from_b1: + //SEG14 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy + jmp b1 + //SEG15 main::@1 + b1: + //SEG16 [6] (byte~) main::$18 ← (byte) main::i#2 << (byte) 2 -- vbuyy=vbuxx_rol_2 + txa + asl + asl + tay + //SEG17 [7] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) main::$18) ← (byte) 0 -- pbuc1_derefidx_vbuyy=vbuc2 + lda #0 + sta PROCESSING,y + //SEG18 [8] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) main::$18) ← (byte) 0 -- pbuc1_derefidx_vbuyy=vbuc2 + lda #0 + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_Y,y + //SEG19 [9] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) main::$18) ← (const word) NOT_FOUND#0 -- pwuc1_derefidx_vbuyy=vwuc2 + lda #NOT_FOUND + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST+1,y + //SEG20 [10] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuxx=_inc_vbuxx + inx + //SEG21 [11] if((byte) main::i#1!=(byte) 8) goto main::@1 -- vbuxx_neq_vbuc1_then_la1 + cpx #8 + bne b1_from_b1 + //SEG22 [12] phi from main::@1 to main::@2 [phi:main::@1->main::@2] + b2_from_b1: + jmp b2 + //SEG23 main::@2 + b2: + //SEG24 [13] call setupRasterIrq + jsr setupRasterIrq + //SEG25 [14] phi from main::@2 to main::@3 [phi:main::@2->main::@3] + b3_from_b2: + //SEG26 [14] phi (byte*) main::sc#2 = (const byte*) SCREEN#0 [phi:main::@2->main::@3#0] -- pbuz1=pbuc1 + lda #SCREEN + sta sc+1 + jmp b3 + // Fill screen with some chars + //SEG27 [14] phi from main::@3 to main::@3 [phi:main::@3->main::@3] + b3_from_b3: + //SEG28 [14] phi (byte*) main::sc#2 = (byte*) main::sc#1 [phi:main::@3->main::@3#0] -- register_copy + jmp b3 + //SEG29 main::@3 + b3: + //SEG30 [15] (byte~) main::$5 ← < (byte*) main::sc#2 -- vbuaa=_lo_pbuz1 + lda sc + //SEG31 [16] (byte~) main::$6 ← (byte~) main::$5 & (byte) $1f -- vbuaa=vbuaa_band_vbuc1 + and #$1f + //SEG32 [17] (byte~) main::$7 ← (byte) 'a' + (byte~) main::$6 -- vbuaa=vbuc1_plus_vbuaa + clc + adc #'a' + //SEG33 [18] *((byte*) main::sc#2) ← (byte~) main::$7 -- _deref_pbuz1=vbuaa + ldy #0 + sta (sc),y + //SEG34 [19] (byte*) main::sc#1 ← ++ (byte*) main::sc#2 -- pbuz1=_inc_pbuz1 + inc sc + bne !+ + inc sc+1 + !: + //SEG35 [20] if((byte*) main::sc#1!=(const byte*) SCREEN#0+(word) $3e7+(byte) 1) goto main::@3 -- pbuz1_neq_pbuc1_then_la1 + lda sc+1 + cmp #>SCREEN+$3e7+1 + bne b3_from_b3 + lda sc + cmp #main::@4] + b4_from_b3: + //SEG37 [21] phi (byte*) main::dst#2 = (const byte[$3e8]) SCREEN_COPY#0 [phi:main::@3->main::@4#0] -- pbuz1=pbuc1 + lda #SCREEN_COPY + sta dst+1 + //SEG38 [21] phi (byte*) main::src#2 = (const byte*) SCREEN#0 [phi:main::@3->main::@4#1] -- pbuz1=pbuc1 + lda #SCREEN + sta src+1 + jmp b4 + // Copy screen to screen copy + //SEG39 [21] phi from main::@4 to main::@4 [phi:main::@4->main::@4] + b4_from_b4: + //SEG40 [21] phi (byte*) main::dst#2 = (byte*) main::dst#1 [phi:main::@4->main::@4#0] -- register_copy + //SEG41 [21] phi (byte*) main::src#2 = (byte*) main::src#1 [phi:main::@4->main::@4#1] -- register_copy + jmp b4 + //SEG42 main::@4 + b4: + //SEG43 [22] *((byte*) main::dst#2) ← *((byte*) main::src#2) -- _deref_pbuz1=_deref_pbuz2 + ldy #0 + lda (src),y + ldy #0 + sta (dst),y + //SEG44 [23] (byte*) main::src#1 ← ++ (byte*) main::src#2 -- pbuz1=_inc_pbuz1 + inc src + bne !+ + inc src+1 + !: + //SEG45 [24] (byte*) main::dst#1 ← ++ (byte*) main::dst#2 -- pbuz1=_inc_pbuz1 + inc dst + bne !+ + inc dst+1 + !: + //SEG46 [25] if((byte*) main::src#1!=(const byte*) SCREEN#0+(word) $3e7) goto main::@4 -- pbuz1_neq_pbuc1_then_la1 + lda src+1 + cmp #>SCREEN+$3e7 + bne b4_from_b4 + lda src + cmp #main::@5] + b5_from_b4: + jmp b5 + //SEG48 main::@5 + b5: + //SEG49 [27] call initSquareTables + //SEG50 [86] phi from main::@5 to initSquareTables [phi:main::@5->initSquareTables] + initSquareTables_from_b5: + jsr initSquareTables + //SEG51 [28] phi from main::@5 main::@7 to main::@6 [phi:main::@5/main::@7->main::@6] + b6_from_b5: + b6_from_b7: + jmp b6 + // Main loop + //SEG52 main::@6 + b6: + //SEG53 [29] call getCenterChar + //SEG54 [58] phi from main::@6 to getCenterChar [phi:main::@6->getCenterChar] + getCenterChar_from_b6: + jsr getCenterChar + //SEG55 [30] (byte) getCenterChar::return_x#0 ← (byte) getCenterChar::return_x#1 -- vbuxx=vbuz1 + ldx getCenterChar.return_x + //SEG56 [31] (byte) getCenterChar::return_y#0 ← (byte) getCenterChar::return_y#1 -- vbuyy=vbuz1 + ldy getCenterChar.return_y + //SEG57 [32] (word) getCenterChar::return_dist#0 ← (word) getCenterChar::return_dist#1 + jmp b9 + //SEG58 main::@9 + b9: + //SEG59 [33] (byte) main::center_x#0 ← (byte) getCenterChar::return_x#0 + //SEG60 [34] (byte) main::center_y#0 ← (byte) getCenterChar::return_y#0 + //SEG61 [35] (word) main::center_dist#0 ← (word) getCenterChar::return_dist#0 + //SEG62 [36] if((word) main::center_dist#0!=(const word) NOT_FOUND#0) goto main::@7 -- vwuz1_neq_vwuc1_then_la1 + lda center_dist+1 + cmp #>NOT_FOUND + bne b7 + lda center_dist + cmp #startProcessing] + startProcessing_from_b7: + jsr startProcessing + jmp b6_from_b7 +} +//SEG71 startProcessing +// Start processing a char - by inserting it into the PROCESSING array +// startProcessing(byte zeropage($19) center_x, byte zeropage($1a) center_y, word zeropage($11) center_dist) +startProcessing: { + .label center_x = $19 + .label center_y = $1a + .label center_dist = $11 + .label freeIdx = 8 + //SEG72 [43] phi from startProcessing to startProcessing::@1 [phi:startProcessing->startProcessing::@1] + b1_from_startProcessing: + //SEG73 [43] phi (byte) startProcessing::freeIdx#6 = (byte) $ff [phi:startProcessing->startProcessing::@1#0] -- vbuz1=vbuc1 + lda #$ff + sta freeIdx + jmp b1 + //SEG74 startProcessing::@1 + b1: + //SEG75 [44] phi from startProcessing::@1 to startProcessing::@2 [phi:startProcessing::@1->startProcessing::@2] + b2_from_b1: + //SEG76 [44] phi (byte) startProcessing::i#2 = (byte) 0 [phi:startProcessing::@1->startProcessing::@2#0] -- vbuxx=vbuc1 + ldx #0 + jmp b2 + //SEG77 [44] phi from startProcessing::@3 to startProcessing::@2 [phi:startProcessing::@3->startProcessing::@2] + b2_from_b3: + //SEG78 [44] phi (byte) startProcessing::i#2 = (byte) startProcessing::i#1 [phi:startProcessing::@3->startProcessing::@2#0] -- register_copy + jmp b2 + //SEG79 startProcessing::@2 + b2: + //SEG80 [45] (byte~) startProcessing::$4 ← (byte) startProcessing::i#2 << (byte) 2 -- vbuaa=vbuxx_rol_2 + txa + asl + asl + //SEG81 [46] if(*((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) startProcessing::$4)!=(const word) NOT_FOUND#0) goto startProcessing::@3 -- pwuc1_derefidx_vbuaa_neq_vwuc2_then_la1 + tay + lda PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST+1,y + cmp #>NOT_FOUND + bne b3 + lda PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST,y + cmp #startProcessing::@4] + b4_from_b2: + b4_from_b7: + //SEG83 [47] phi (byte) startProcessing::freeIdx#2 = (byte) startProcessing::i#2 [phi:startProcessing::@2/startProcessing::@7->startProcessing::@4#0] -- register_copy + jmp b4 + //SEG84 startProcessing::@4 + b4: + //SEG85 [48] if((byte) startProcessing::freeIdx#2==(byte) $ff) goto startProcessing::@6 -- vbuxx_eq_vbuc1_then_la1 + cpx #$ff + beq b6 + jmp b5 + //SEG86 startProcessing::@5 + b5: + //SEG87 [49] (byte~) startProcessing::$5 ← (byte) startProcessing::freeIdx#2 << (byte) 2 -- vbuxx=vbuxx_rol_2 + txa + asl + asl + tax + //SEG88 [50] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) startProcessing::$5) ← (byte) startProcessing::center_x#0 -- pbuc1_derefidx_vbuxx=vbuz1 + lda center_x + sta PROCESSING,x + //SEG89 [51] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) startProcessing::$5) ← (byte) startProcessing::center_y#0 -- pbuc1_derefidx_vbuxx=vbuz1 + lda center_y + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_Y,x + //SEG90 [52] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) startProcessing::$5) ← (word) startProcessing::center_dist#0 -- pwuc1_derefidx_vbuxx=vwuz1 + lda center_dist + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST,x + lda center_dist+1 + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST+1,x + jmp breturn + //SEG91 startProcessing::@return + breturn: + //SEG92 [53] return + rts + //SEG93 startProcessing::@6 + b6: + //SEG94 [54] (byte~) startProcessing::freeIdx#7 ← (byte) startProcessing::freeIdx#2 -- vbuz1=vbuxx + stx freeIdx + //SEG95 [43] phi from startProcessing::@6 to startProcessing::@1 [phi:startProcessing::@6->startProcessing::@1] + b1_from_b6: + //SEG96 [43] phi (byte) startProcessing::freeIdx#6 = (byte~) startProcessing::freeIdx#7 [phi:startProcessing::@6->startProcessing::@1#0] -- register_copy + jmp b1 + //SEG97 startProcessing::@3 + b3: + //SEG98 [55] (byte) startProcessing::i#1 ← ++ (byte) startProcessing::i#2 -- vbuxx=_inc_vbuxx + inx + //SEG99 [56] if((byte) startProcessing::i#1!=(byte) 8) goto startProcessing::@2 -- vbuxx_neq_vbuc1_then_la1 + cpx #8 + bne b2_from_b3 + jmp b7 + //SEG100 startProcessing::@7 + b7: + //SEG101 [57] (byte~) startProcessing::freeIdx#8 ← (byte) startProcessing::freeIdx#6 -- vbuxx=vbuz1 + ldx freeIdx + jmp b4_from_b7 +} +//SEG102 getCenterChar +// Find the non-space char closest to the center of the screen +// If no non-space char is found the distance will be 0xffff +getCenterChar: { + .label _9 = $1b + .label _10 = $1b + .label _11 = $1b + .label return_dist = $11 + .label x = $c + .label dist = $11 + .label screen_line = 9 + .label y = $b + .label return_x = $f + .label return_y = $10 + .label closest_dist = $d + .label closest_x = $f + .label closest_y = $10 + .label _15 = $1d + .label _16 = $1b + //SEG103 [59] phi from getCenterChar to getCenterChar::@1 [phi:getCenterChar->getCenterChar::@1] + b1_from_getCenterChar: + //SEG104 [59] phi (byte) getCenterChar::closest_y#9 = (byte) 0 [phi:getCenterChar->getCenterChar::@1#0] -- vbuz1=vbuc1 + lda #0 + sta closest_y + //SEG105 [59] phi (byte) getCenterChar::closest_x#9 = (byte) 0 [phi:getCenterChar->getCenterChar::@1#1] -- vbuz1=vbuc1 + lda #0 + sta closest_x + //SEG106 [59] phi (word) getCenterChar::closest_dist#8 = (const word) NOT_FOUND#0 [phi:getCenterChar->getCenterChar::@1#2] -- vwuz1=vwuc1 + lda #NOT_FOUND + sta closest_dist+1 + //SEG107 [59] phi (byte) getCenterChar::y#7 = (byte) 0 [phi:getCenterChar->getCenterChar::@1#3] -- vbuz1=vbuc1 + lda #0 + sta y + //SEG108 [59] phi (byte*) getCenterChar::screen_line#4 = (const byte[$3e8]) SCREEN_COPY#0 [phi:getCenterChar->getCenterChar::@1#4] -- pbuz1=pbuc1 + lda #SCREEN_COPY + sta screen_line+1 + jmp b1 + //SEG109 getCenterChar::@1 + b1: + //SEG110 [60] phi from getCenterChar::@1 to getCenterChar::@2 [phi:getCenterChar::@1->getCenterChar::@2] + b2_from_b1: + //SEG111 [60] phi (byte) getCenterChar::closest_y#7 = (byte) getCenterChar::closest_y#9 [phi:getCenterChar::@1->getCenterChar::@2#0] -- register_copy + //SEG112 [60] phi (byte) getCenterChar::closest_x#7 = (byte) getCenterChar::closest_x#9 [phi:getCenterChar::@1->getCenterChar::@2#1] -- register_copy + //SEG113 [60] phi (word) getCenterChar::closest_dist#2 = (word) getCenterChar::closest_dist#8 [phi:getCenterChar::@1->getCenterChar::@2#2] -- register_copy + //SEG114 [60] phi (byte) getCenterChar::x#2 = (byte) 0 [phi:getCenterChar::@1->getCenterChar::@2#3] -- vbuz1=vbuc1 + lda #0 + sta x + jmp b2 + //SEG115 getCenterChar::@2 + b2: + //SEG116 [61] if(*((byte*) getCenterChar::screen_line#4 + (byte) getCenterChar::x#2)==(byte) ' ') goto getCenterChar::@11 -- pbuz1_derefidx_vbuz2_eq_vbuc1_then_la1 + ldy x + lda (screen_line),y + cmp #' ' + beq b11 + jmp b4 + //SEG117 getCenterChar::@4 + b4: + //SEG118 [62] (byte~) getCenterChar::$13 ← (byte) getCenterChar::x#2 << (byte) 1 -- vbuxx=vbuz1_rol_1 + lda x + asl + tax + //SEG119 [63] (byte~) getCenterChar::$14 ← (byte) getCenterChar::y#7 << (byte) 1 -- vbuaa=vbuz1_rol_1 + lda y + asl + //SEG120 [64] (word) getCenterChar::dist#0 ← *((const word[$28]) SQUARES_X#0 + (byte~) getCenterChar::$13) + *((const word[$19]) SQUARES_Y#0 + (byte~) getCenterChar::$14) -- vwuz1=pwuc1_derefidx_vbuxx_plus_pwuc2_derefidx_vbuaa + tay + lda SQUARES_X,x + clc + adc SQUARES_Y,y + sta dist + lda SQUARES_X+1,x + adc SQUARES_Y+1,y + sta dist+1 + //SEG121 [65] if((word) getCenterChar::dist#0>=(word) getCenterChar::closest_dist#2) goto getCenterChar::@12 -- vwuz1_ge_vwuz2_then_la1 + lda closest_dist+1 + cmp dist+1 + bne !+ + lda closest_dist + cmp dist + beq b12 + !: + bcc b12 + jmp b5 + //SEG122 getCenterChar::@5 + b5: + //SEG123 [66] (byte~) getCenterChar::return_x#7 ← (byte) getCenterChar::x#2 -- vbuz1=vbuz2 + lda x + sta return_x + //SEG124 [67] (byte~) getCenterChar::return_y#7 ← (byte) getCenterChar::y#7 -- vbuz1=vbuz2 + lda y + sta return_y + //SEG125 [68] phi from getCenterChar::@11 getCenterChar::@12 getCenterChar::@5 to getCenterChar::@3 [phi:getCenterChar::@11/getCenterChar::@12/getCenterChar::@5->getCenterChar::@3] + b3_from_b11: + b3_from_b12: + b3_from_b5: + //SEG126 [68] phi (byte) getCenterChar::return_y#1 = (byte) getCenterChar::closest_y#7 [phi:getCenterChar::@11/getCenterChar::@12/getCenterChar::@5->getCenterChar::@3#0] -- register_copy + //SEG127 [68] phi (byte) getCenterChar::return_x#1 = (byte) getCenterChar::closest_x#7 [phi:getCenterChar::@11/getCenterChar::@12/getCenterChar::@5->getCenterChar::@3#1] -- register_copy + //SEG128 [68] phi (word) getCenterChar::return_dist#1 = (word~) getCenterChar::return_dist#5 [phi:getCenterChar::@11/getCenterChar::@12/getCenterChar::@5->getCenterChar::@3#2] -- register_copy + jmp b3 + //SEG129 getCenterChar::@3 + b3: + //SEG130 [69] (byte) getCenterChar::x#1 ← ++ (byte) getCenterChar::x#2 -- vbuz1=_inc_vbuz1 + inc x + //SEG131 [70] if((byte) getCenterChar::x#1!=(byte) $28) goto getCenterChar::@10 -- vbuz1_neq_vbuc1_then_la1 + lda #$28 + cmp x + bne b10 + jmp b6 + //SEG132 getCenterChar::@6 + b6: + //SEG133 [71] (byte*) getCenterChar::screen_line#1 ← (byte*) getCenterChar::screen_line#4 + (byte) $28 -- pbuz1=pbuz1_plus_vbuc1 + lda #$28 + clc + adc screen_line + sta screen_line + bcc !+ + inc screen_line+1 + !: + //SEG134 [72] (byte) getCenterChar::y#1 ← ++ (byte) getCenterChar::y#7 -- vbuz1=_inc_vbuz1 + inc y + //SEG135 [73] if((byte) getCenterChar::y#1!=(byte) $19) goto getCenterChar::@9 -- vbuz1_neq_vbuc1_then_la1 + lda #$19 + cmp y + bne b9 + jmp b7 + //SEG136 getCenterChar::@7 + b7: + //SEG137 [74] if((word) getCenterChar::return_dist#1==(const word) NOT_FOUND#0) goto getCenterChar::@return -- vwuz1_eq_vwuc1_then_la1 + lda return_dist + cmp #NOT_FOUND + beq breturn + !: + jmp b8 + //SEG138 getCenterChar::@8 + b8: + //SEG139 [75] (word~) getCenterChar::$9 ← (word)(byte) getCenterChar::return_y#1 -- vwuz1=_word_vbuz2 + lda return_y + sta _9 + lda #0 + sta _9+1 + //SEG140 [76] (word) getCenterChar::$15 ← (word~) getCenterChar::$9 << (byte) 2 -- vwuz1=vwuz2_rol_2 + lda _9 + asl + sta _15 + lda _9+1 + rol + sta _15+1 + asl _15 + rol _15+1 + //SEG141 [77] (word) getCenterChar::$16 ← (word) getCenterChar::$15 + (word~) getCenterChar::$9 -- vwuz1=vwuz2_plus_vwuz1 + lda _16 + clc + adc _15 + sta _16 + lda _16+1 + adc _15+1 + sta _16+1 + //SEG142 [78] (word~) getCenterChar::$10 ← (word) getCenterChar::$16 << (byte) 3 -- vwuz1=vwuz1_rol_3 + asl _10 + rol _10+1 + asl _10 + rol _10+1 + asl _10 + rol _10+1 + //SEG143 [79] (byte*~) getCenterChar::$11 ← (const byte[$3e8]) SCREEN_COPY#0 + (word~) getCenterChar::$10 -- pbuz1=pbuc1_plus_vwuz1 + clc + lda _11 + adc #SCREEN_COPY + sta _11+1 + //SEG144 [80] *((byte*~) getCenterChar::$11 + (byte) getCenterChar::return_x#1) ← (byte) ' ' -- pbuz1_derefidx_vbuz2=vbuc1 + // clear the found char on the screen copy + lda #' ' + ldy return_x + sta (_11),y + jmp breturn + //SEG145 getCenterChar::@return + breturn: + //SEG146 [81] return + rts + //SEG147 getCenterChar::@9 + b9: + //SEG148 [82] (word~) getCenterChar::closest_dist#10 ← (word) getCenterChar::return_dist#1 -- vwuz1=vwuz2 + lda return_dist + sta closest_dist + lda return_dist+1 + sta closest_dist+1 + //SEG149 [59] phi from getCenterChar::@9 to getCenterChar::@1 [phi:getCenterChar::@9->getCenterChar::@1] + b1_from_b9: + //SEG150 [59] phi (byte) getCenterChar::closest_y#9 = (byte) getCenterChar::return_y#1 [phi:getCenterChar::@9->getCenterChar::@1#0] -- register_copy + //SEG151 [59] phi (byte) getCenterChar::closest_x#9 = (byte) getCenterChar::return_x#1 [phi:getCenterChar::@9->getCenterChar::@1#1] -- register_copy + //SEG152 [59] phi (word) getCenterChar::closest_dist#8 = (word~) getCenterChar::closest_dist#10 [phi:getCenterChar::@9->getCenterChar::@1#2] -- register_copy + //SEG153 [59] phi (byte) getCenterChar::y#7 = (byte) getCenterChar::y#1 [phi:getCenterChar::@9->getCenterChar::@1#3] -- register_copy + //SEG154 [59] phi (byte*) getCenterChar::screen_line#4 = (byte*) getCenterChar::screen_line#1 [phi:getCenterChar::@9->getCenterChar::@1#4] -- register_copy + jmp b1 + //SEG155 getCenterChar::@10 + b10: + //SEG156 [83] (word~) getCenterChar::closest_dist#12 ← (word) getCenterChar::return_dist#1 -- vwuz1=vwuz2 + lda return_dist + sta closest_dist + lda return_dist+1 + sta closest_dist+1 + //SEG157 [60] phi from getCenterChar::@10 to getCenterChar::@2 [phi:getCenterChar::@10->getCenterChar::@2] + b2_from_b10: + //SEG158 [60] phi (byte) getCenterChar::closest_y#7 = (byte) getCenterChar::return_y#1 [phi:getCenterChar::@10->getCenterChar::@2#0] -- register_copy + //SEG159 [60] phi (byte) getCenterChar::closest_x#7 = (byte) getCenterChar::return_x#1 [phi:getCenterChar::@10->getCenterChar::@2#1] -- register_copy + //SEG160 [60] phi (word) getCenterChar::closest_dist#2 = (word~) getCenterChar::closest_dist#12 [phi:getCenterChar::@10->getCenterChar::@2#2] -- register_copy + //SEG161 [60] phi (byte) getCenterChar::x#2 = (byte) getCenterChar::x#1 [phi:getCenterChar::@10->getCenterChar::@2#3] -- register_copy + jmp b2 + //SEG162 getCenterChar::@12 + b12: + //SEG163 [84] (word~) getCenterChar::return_dist#6 ← (word) getCenterChar::closest_dist#2 -- vwuz1=vwuz2 + lda closest_dist + sta return_dist + lda closest_dist+1 + sta return_dist+1 + jmp b3_from_b12 + //SEG164 getCenterChar::@11 + b11: + //SEG165 [85] (word~) getCenterChar::return_dist#5 ← (word) getCenterChar::closest_dist#2 -- vwuz1=vwuz2 + lda closest_dist + sta return_dist + lda closest_dist+1 + sta return_dist+1 + jmp b3_from_b11 +} +//SEG166 initSquareTables +// initialize SQUARES table +initSquareTables: { + .label _6 = $15 + .label _14 = $15 + .label x = $13 + .label y = $14 + //SEG167 [87] phi from initSquareTables to initSquareTables::@1 [phi:initSquareTables->initSquareTables::@1] + b1_from_initSquareTables: + //SEG168 [87] phi (byte) initSquareTables::x#2 = (byte) 0 [phi:initSquareTables->initSquareTables::@1#0] -- vbuz1=vbuc1 + lda #0 + sta x + jmp b1 + //SEG169 [87] phi from initSquareTables::@9 to initSquareTables::@1 [phi:initSquareTables::@9->initSquareTables::@1] + b1_from_b9: + //SEG170 [87] phi (byte) initSquareTables::x#2 = (byte) initSquareTables::x#1 [phi:initSquareTables::@9->initSquareTables::@1#0] -- register_copy + jmp b1 + //SEG171 initSquareTables::@1 + b1: + //SEG172 [88] if((byte) initSquareTables::x#2<(byte) $14) goto initSquareTables::@2 -- vbuz1_lt_vbuc1_then_la1 + lda x + cmp #$14 + bcc b2 + jmp b3 + //SEG173 initSquareTables::@3 + b3: + //SEG174 [89] (byte~) initSquareTables::$2 ← (byte) initSquareTables::x#2 - (byte) $14 -- vbuaa=vbuz1_minus_vbuc1 + lda x + sec + sbc #$14 + //SEG175 [90] phi from initSquareTables::@2 initSquareTables::@3 to initSquareTables::@4 [phi:initSquareTables::@2/initSquareTables::@3->initSquareTables::@4] + b4_from_b2: + b4_from_b3: + //SEG176 [90] phi (byte) initSquareTables::x_dist#0 = (byte~) initSquareTables::$4 [phi:initSquareTables::@2/initSquareTables::@3->initSquareTables::@4#0] -- register_copy + jmp b4 + //SEG177 initSquareTables::@4 + b4: + //SEG178 [91] (byte) mul8u::a#1 ← (byte) initSquareTables::x_dist#0 -- vbuxx=vbuaa + tax + //SEG179 [92] (byte) mul8u::b#0 ← (byte) initSquareTables::x_dist#0 + //SEG180 [93] call mul8u + //SEG181 [116] phi from initSquareTables::@4 to mul8u [phi:initSquareTables::@4->mul8u] + mul8u_from_b4: + //SEG182 [116] phi (byte) mul8u::a#6 = (byte) mul8u::a#1 [phi:initSquareTables::@4->mul8u#0] -- register_copy + //SEG183 [116] phi (word) mul8u::mb#0 = (byte) mul8u::b#0 [phi:initSquareTables::@4->mul8u#1] -- vwuz1=vbuaa + sta mul8u.mb + lda #0 + sta mul8u.mb+1 + jsr mul8u + //SEG184 [94] (word) mul8u::return#2 ← (word) mul8u::res#2 + jmp b9 + //SEG185 initSquareTables::@9 + b9: + //SEG186 [95] (word~) initSquareTables::$6 ← (word) mul8u::return#2 + //SEG187 [96] (byte~) initSquareTables::$16 ← (byte) initSquareTables::x#2 << (byte) 1 -- vbuaa=vbuz1_rol_1 + lda x + asl + //SEG188 [97] *((const word[$28]) SQUARES_X#0 + (byte~) initSquareTables::$16) ← (word~) initSquareTables::$6 -- pwuc1_derefidx_vbuaa=vwuz1 + tay + lda _6 + sta SQUARES_X,y + lda _6+1 + sta SQUARES_X+1,y + //SEG189 [98] (byte) initSquareTables::x#1 ← ++ (byte) initSquareTables::x#2 -- vbuz1=_inc_vbuz1 + inc x + //SEG190 [99] if((byte) initSquareTables::x#1!=(byte) $28) goto initSquareTables::@1 -- vbuz1_neq_vbuc1_then_la1 + lda #$28 + cmp x + bne b1_from_b9 + //SEG191 [100] phi from initSquareTables::@9 to initSquareTables::@5 [phi:initSquareTables::@9->initSquareTables::@5] + b5_from_b9: + //SEG192 [100] phi (byte) initSquareTables::y#2 = (byte) 0 [phi:initSquareTables::@9->initSquareTables::@5#0] -- vbuz1=vbuc1 + lda #0 + sta y + jmp b5 + //SEG193 [100] phi from initSquareTables::@10 to initSquareTables::@5 [phi:initSquareTables::@10->initSquareTables::@5] + b5_from_b10: + //SEG194 [100] phi (byte) initSquareTables::y#2 = (byte) initSquareTables::y#1 [phi:initSquareTables::@10->initSquareTables::@5#0] -- register_copy + jmp b5 + //SEG195 initSquareTables::@5 + b5: + //SEG196 [101] if((byte) initSquareTables::y#2<(byte) $c) goto initSquareTables::@6 -- vbuz1_lt_vbuc1_then_la1 + lda y + cmp #$c + bcc b6 + jmp b7 + //SEG197 initSquareTables::@7 + b7: + //SEG198 [102] (byte~) initSquareTables::$10 ← (byte) initSquareTables::y#2 - (byte) $c -- vbuaa=vbuz1_minus_vbuc1 + lda y + sec + sbc #$c + //SEG199 [103] phi from initSquareTables::@6 initSquareTables::@7 to initSquareTables::@8 [phi:initSquareTables::@6/initSquareTables::@7->initSquareTables::@8] + b8_from_b6: + b8_from_b7: + //SEG200 [103] phi (byte) initSquareTables::y_dist#0 = (byte~) initSquareTables::$12 [phi:initSquareTables::@6/initSquareTables::@7->initSquareTables::@8#0] -- register_copy + jmp b8 + //SEG201 initSquareTables::@8 + b8: + //SEG202 [104] (byte) mul8u::a#2 ← (byte) initSquareTables::y_dist#0 -- vbuxx=vbuaa + tax + //SEG203 [105] (byte) mul8u::b#1 ← (byte) initSquareTables::y_dist#0 + //SEG204 [106] call mul8u + //SEG205 [116] phi from initSquareTables::@8 to mul8u [phi:initSquareTables::@8->mul8u] + mul8u_from_b8: + //SEG206 [116] phi (byte) mul8u::a#6 = (byte) mul8u::a#2 [phi:initSquareTables::@8->mul8u#0] -- register_copy + //SEG207 [116] phi (word) mul8u::mb#0 = (byte) mul8u::b#1 [phi:initSquareTables::@8->mul8u#1] -- vwuz1=vbuaa + sta mul8u.mb + lda #0 + sta mul8u.mb+1 + jsr mul8u + //SEG208 [107] (word) mul8u::return#3 ← (word) mul8u::res#2 + jmp b10 + //SEG209 initSquareTables::@10 + b10: + //SEG210 [108] (word~) initSquareTables::$14 ← (word) mul8u::return#3 + //SEG211 [109] (byte~) initSquareTables::$17 ← (byte) initSquareTables::y#2 << (byte) 1 -- vbuaa=vbuz1_rol_1 + lda y + asl + //SEG212 [110] *((const word[$19]) SQUARES_Y#0 + (byte~) initSquareTables::$17) ← (word~) initSquareTables::$14 -- pwuc1_derefidx_vbuaa=vwuz1 + tay + lda _14 + sta SQUARES_Y,y + lda _14+1 + sta SQUARES_Y+1,y + //SEG213 [111] (byte) initSquareTables::y#1 ← ++ (byte) initSquareTables::y#2 -- vbuz1=_inc_vbuz1 + inc y + //SEG214 [112] if((byte) initSquareTables::y#1!=(byte) $19) goto initSquareTables::@5 -- vbuz1_neq_vbuc1_then_la1 + lda #$19 + cmp y + bne b5_from_b10 + jmp breturn + //SEG215 initSquareTables::@return + breturn: + //SEG216 [113] return + rts + //SEG217 initSquareTables::@6 + b6: + //SEG218 [114] (byte~) initSquareTables::$12 ← (byte) $c - (byte) initSquareTables::y#2 -- vbuaa=vbuc1_minus_vbuz1 + lda #$c + sec + sbc y + jmp b8_from_b6 + //SEG219 initSquareTables::@2 + b2: + //SEG220 [115] (byte~) initSquareTables::$4 ← (byte) $14 - (byte) initSquareTables::x#2 -- vbuaa=vbuc1_minus_vbuz1 + lda #$14 + sec + sbc x + jmp b4_from_b2 +} +//SEG221 mul8u +// Perform binary multiplication of two unsigned 8-bit bytes into a 16-bit unsigned word +// mul8u(byte register(X) a, byte register(A) b) +mul8u: { + .label mb = $17 + .label res = $15 + .label return = $15 + //SEG222 [117] phi from mul8u to mul8u::@1 [phi:mul8u->mul8u::@1] + b1_from_mul8u: + //SEG223 [117] phi (word) mul8u::mb#2 = (word) mul8u::mb#0 [phi:mul8u->mul8u::@1#0] -- register_copy + //SEG224 [117] phi (word) mul8u::res#2 = (byte) 0 [phi:mul8u->mul8u::@1#1] -- vwuz1=vbuc1 + lda #0 + sta res + lda #0 + sta res+1 + //SEG225 [117] phi (byte) mul8u::a#3 = (byte) mul8u::a#6 [phi:mul8u->mul8u::@1#2] -- register_copy + jmp b1 + //SEG226 mul8u::@1 + b1: + //SEG227 [118] if((byte) mul8u::a#3!=(byte) 0) goto mul8u::@2 -- vbuxx_neq_0_then_la1 + cpx #0 + bne b2 + jmp breturn + //SEG228 mul8u::@return + breturn: + //SEG229 [119] return + rts + //SEG230 mul8u::@2 + b2: + //SEG231 [120] (byte~) mul8u::$1 ← (byte) mul8u::a#3 & (byte) 1 -- vbuaa=vbuxx_band_vbuc1 + txa + and #1 + //SEG232 [121] if((byte~) mul8u::$1==(byte) 0) goto mul8u::@3 -- vbuaa_eq_0_then_la1 + cmp #0 + beq b3_from_b2 + jmp b4 + //SEG233 mul8u::@4 + b4: + //SEG234 [122] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 -- vwuz1=vwuz1_plus_vwuz2 + lda res + clc + adc mb + sta res + lda res+1 + adc mb+1 + sta res+1 + //SEG235 [123] phi from mul8u::@2 mul8u::@4 to mul8u::@3 [phi:mul8u::@2/mul8u::@4->mul8u::@3] + b3_from_b2: + b3_from_b4: + //SEG236 [123] phi (word) mul8u::res#6 = (word) mul8u::res#2 [phi:mul8u::@2/mul8u::@4->mul8u::@3#0] -- register_copy + jmp b3 + //SEG237 mul8u::@3 + b3: + //SEG238 [124] (byte) mul8u::a#0 ← (byte) mul8u::a#3 >> (byte) 1 -- vbuxx=vbuxx_ror_1 + txa + lsr + tax + //SEG239 [125] (word) mul8u::mb#1 ← (word) mul8u::mb#2 << (byte) 1 -- vwuz1=vwuz1_rol_1 + asl mb + rol mb+1 + //SEG240 [117] phi from mul8u::@3 to mul8u::@1 [phi:mul8u::@3->mul8u::@1] + b1_from_b3: + //SEG241 [117] phi (word) mul8u::mb#2 = (word) mul8u::mb#1 [phi:mul8u::@3->mul8u::@1#0] -- register_copy + //SEG242 [117] phi (word) mul8u::res#2 = (word) mul8u::res#6 [phi:mul8u::@3->mul8u::@1#1] -- register_copy + //SEG243 [117] phi (byte) mul8u::a#3 = (byte) mul8u::a#0 [phi:mul8u::@3->mul8u::@1#2] -- register_copy + jmp b1 +} +//SEG244 setupRasterIrq +// Setup Raster IRQ +setupRasterIrq: { + .label irqRoutine = irqTop + //SEG245 asm { sei } + sei + //SEG246 [127] *((const byte*) PROCPORT_DDR#0) ← (const byte) PROCPORT_DDR_MEMORY_MASK#0 -- _deref_pbuc1=vbuc2 + // Disable kernal & basic + lda #PROCPORT_DDR_MEMORY_MASK + sta PROCPORT_DDR + //SEG247 [128] *((const byte*) PROCPORT#0) ← (const byte) PROCPORT_RAM_IO#0 -- _deref_pbuc1=vbuc2 + lda #PROCPORT_RAM_IO + sta PROCPORT + //SEG248 [129] *((const byte*) CIA1_INTERRUPT#0) ← (const byte) CIA_INTERRUPT_CLEAR#0 -- _deref_pbuc1=vbuc2 + // Disable CIA 1 Timer IRQ + lda #CIA_INTERRUPT_CLEAR + sta CIA1_INTERRUPT + jmp b1 + //SEG249 setupRasterIrq::@1 + b1: + //SEG250 [130] *((const byte*) VIC_CONTROL#0) ← *((const byte*) VIC_CONTROL#0) & (byte) $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2 + lda #$7f + and VIC_CONTROL + sta VIC_CONTROL + jmp b2 + //SEG251 setupRasterIrq::@2 + b2: + //SEG252 [131] *((const byte*) RASTER#0) ← <(const byte) RASTER_IRQ_TOP#0 -- _deref_pbuc1=vbuc2 + lda #RASTER_IRQ_TOP + sta RASTER + //SEG253 [132] *((const byte*) IRQ_ENABLE#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2 + // Enable Raster Interrupt + lda #IRQ_RASTER + sta IRQ_ENABLE + //SEG254 [133] *((const void()**) HARDWARE_IRQ#0) ← (const void()*) setupRasterIrq::irqRoutine#0 -- _deref_pptc1=pprc2 + // Set the IRQ routine + lda #irqRoutine + sta HARDWARE_IRQ+1 + //SEG255 asm { cli } + cli + jmp breturn + //SEG256 setupRasterIrq::@return + breturn: + //SEG257 [135] return + rts +} +//SEG258 irqBottom +// Raster Interrupt at the middle of the screen +irqBottom: { + //SEG259 entry interrupt(HARDWARE_ALL) + sta rega+1 + stx regx+1 + sty regy+1 + //SEG260 [137] phi from irqBottom to irqBottom::@1 [phi:irqBottom->irqBottom::@1] + b1_from_irqBottom: + //SEG261 [137] phi (byte) irqBottom::i#2 = (byte) 0 [phi:irqBottom->irqBottom::@1#0] -- vbuxx=vbuc1 + ldx #0 + jmp b1 + //SEG262 [137] phi from irqBottom::@1 to irqBottom::@1 [phi:irqBottom::@1->irqBottom::@1] + b1_from_b1: + //SEG263 [137] phi (byte) irqBottom::i#2 = (byte) irqBottom::i#1 [phi:irqBottom::@1->irqBottom::@1#0] -- register_copy + jmp b1 + //SEG264 irqBottom::@1 + b1: + //SEG265 [138] (byte) irqBottom::i#1 ← ++ (byte) irqBottom::i#2 -- vbuxx=_inc_vbuxx + inx + //SEG266 [139] if((byte) irqBottom::i#1!=(byte) 5) goto irqBottom::@1 -- vbuxx_neq_vbuc1_then_la1 + cpx #5 + bne b1_from_b1 + jmp b2 + //SEG267 irqBottom::@2 + b2: + //SEG268 [140] *((const byte*) BORDERCOL#0) ← (const byte) WHITE#0 -- _deref_pbuc1=vbuc2 + lda #WHITE + sta BORDERCOL + //SEG269 [141] *((const byte*) BGCOL#0) ← (const byte) WHITE#0 -- _deref_pbuc1=vbuc2 + lda #WHITE + sta BGCOL + //SEG270 [142] call processChars + //SEG271 [149] phi from irqBottom::@2 to processChars [phi:irqBottom::@2->processChars] + processChars_from_b2: + jsr processChars + jmp b3 + //SEG272 irqBottom::@3 + b3: + //SEG273 [143] *((const byte*) BORDERCOL#0) ← (const byte) LIGHT_BLUE#0 -- _deref_pbuc1=vbuc2 + lda #LIGHT_BLUE + sta BORDERCOL + //SEG274 [144] *((const byte*) BGCOL#0) ← (const byte) BLUE#0 -- _deref_pbuc1=vbuc2 + lda #BLUE + sta BGCOL + //SEG275 [145] *((const byte*) RASTER#0) ← (const byte) RASTER_IRQ_TOP#0 -- _deref_pbuc1=vbuc2 + // Trigger IRQ at the top of the screen + lda #RASTER_IRQ_TOP + sta RASTER + //SEG276 [146] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(HARDWARE_ALL)(void()) irqTop() -- _deref_pptc1=pprc2 + lda #irqTop + sta HARDWARE_IRQ+1 + //SEG277 [147] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2 + // Acknowledge the IRQ + lda #IRQ_RASTER + sta IRQ_STATUS + jmp breturn + //SEG278 irqBottom::@return + breturn: + //SEG279 [148] return - exit interrupt(HARDWARE_ALL) + rega: + lda #00 + regx: + ldx #00 + regy: + ldy #00 + rti +} +//SEG280 processChars +// Process any chars in the PROCESSING array +processChars: { + .label _2 = $21 + .label _3 = $21 + .label _4 = $21 + .label _6 = $25 + .label _7 = $25 + .label _8 = $25 + .label processing_x = $1f + .label processing_y = $20 + .label _21 = $23 + .label _22 = $21 + .label _24 = $27 + .label _25 = $25 + //SEG281 [150] phi from processChars to processChars::@1 [phi:processChars->processChars::@1] + b1_from_processChars: + //SEG282 [150] phi (byte) processChars::i#2 = (byte) 0 [phi:processChars->processChars::@1#0] -- vbuxx=vbuc1 + ldx #0 + jmp b1 + //SEG283 [150] phi from processChars::@2 to processChars::@1 [phi:processChars::@2->processChars::@1] + b1_from_b2: + //SEG284 [150] phi (byte) processChars::i#2 = (byte) processChars::i#1 [phi:processChars::@2->processChars::@1#0] -- register_copy + jmp b1 + //SEG285 processChars::@1 + b1: + //SEG286 [151] (byte~) processChars::$13 ← (byte) processChars::i#2 << (byte) 2 -- vbuaa=vbuxx_rol_2 + txa + asl + asl + //SEG287 [152] if(*((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) processChars::$13)==(const word) NOT_FOUND#0) goto processChars::@2 -- pwuc1_derefidx_vbuaa_eq_vwuc2_then_la1 + tay + lda PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST,y + cmp #NOT_FOUND + beq b2 + !: + jmp b5 + //SEG288 processChars::@5 + b5: + //SEG289 [153] (byte~) processChars::$14 ← (byte) processChars::i#2 << (byte) 2 -- vbuyy=vbuxx_rol_2 + txa + asl + asl + tay + //SEG290 [154] (byte) processChars::processing_x#0 ← *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) processChars::$14) -- vbuz1=pbuc1_derefidx_vbuyy + lda PROCESSING,y + sta processing_x + //SEG291 [155] (byte) processChars::processing_y#0 ← *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) processChars::$14) -- vbuz1=pbuc1_derefidx_vbuyy + lda PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_Y,y + sta processing_y + //SEG292 [156] (word~) processChars::$2 ← (word)(byte) processChars::processing_y#0 -- vwuz1=_word_vbuz2 + lda processing_y + sta _2 + lda #0 + sta _2+1 + //SEG293 [157] (word) processChars::$21 ← (word~) processChars::$2 << (byte) 2 -- vwuz1=vwuz2_rol_2 + lda _2 + asl + sta _21 + lda _2+1 + rol + sta _21+1 + asl _21 + rol _21+1 + //SEG294 [158] (word) processChars::$22 ← (word) processChars::$21 + (word~) processChars::$2 -- vwuz1=vwuz2_plus_vwuz1 + lda _22 + clc + adc _21 + sta _22 + lda _22+1 + adc _21+1 + sta _22+1 + //SEG295 [159] (word~) processChars::$3 ← (word) processChars::$22 << (byte) 3 -- vwuz1=vwuz1_rol_3 + asl _3 + rol _3+1 + asl _3 + rol _3+1 + asl _3 + rol _3+1 + //SEG296 [160] (byte*~) processChars::$4 ← (const byte*) COLS#0 + (word~) processChars::$3 -- pbuz1=pbuc1_plus_vwuz1 + clc + lda _4 + adc #COLS + sta _4+1 + //SEG297 [161] *((byte*~) processChars::$4 + (byte) processChars::processing_x#0) ← (const byte) WHITE#0 -- pbuz1_derefidx_vbuz2=vbuc1 + lda #WHITE + ldy processing_x + sta (_4),y + //SEG298 [162] (word~) processChars::$6 ← (word)(byte) processChars::processing_y#0 -- vwuz1=_word_vbuz2 + lda processing_y + sta _6 + lda #0 + sta _6+1 + //SEG299 [163] (word) processChars::$24 ← (word~) processChars::$6 << (byte) 2 -- vwuz1=vwuz2_rol_2 + lda _6 + asl + sta _24 + lda _6+1 + rol + sta _24+1 + asl _24 + rol _24+1 + //SEG300 [164] (word) processChars::$25 ← (word) processChars::$24 + (word~) processChars::$6 -- vwuz1=vwuz2_plus_vwuz1 + lda _25 + clc + adc _24 + sta _25 + lda _25+1 + adc _24+1 + sta _25+1 + //SEG301 [165] (word~) processChars::$7 ← (word) processChars::$25 << (byte) 3 -- vwuz1=vwuz1_rol_3 + asl _7 + rol _7+1 + asl _7 + rol _7+1 + asl _7 + rol _7+1 + //SEG302 [166] (byte*~) processChars::$8 ← (const byte*) SCREEN#0 + (word~) processChars::$7 -- pbuz1=pbuc1_plus_vwuz1 + clc + lda _8 + adc #SCREEN + sta _8+1 + //SEG303 [167] if(*((byte*~) processChars::$8 + (byte) processChars::processing_x#0)==(byte) ' ') goto processChars::@3 -- pbuz1_derefidx_vbuz2_eq_vbuc1_then_la1 + ldy processing_x + lda (_8),y + cmp #' ' + beq b3 + jmp b6 + //SEG304 processChars::@6 + b6: + //SEG305 [168] if(*((byte*~) processChars::$8 + (byte) processChars::processing_x#0)>(byte) ' ') goto processChars::@4 -- pbuz1_derefidx_vbuz2_gt_vbuc1_then_la1 + ldy processing_x + lda (_8),y + cmp #' ' + beq !+ + bcs b4 + !: + jmp b7 + //SEG306 processChars::@7 + b7: + //SEG307 [169] *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) ← ++ *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) -- pbuz1_derefidx_vbuz2=_inc_pbuz1_derefidx_vbuz2 + ldy processing_x + lda (_8),y + clc + adc #1 + sta (_8),y + jmp b2 + //SEG308 processChars::@2 + b2: + //SEG309 [170] (byte) processChars::i#1 ← ++ (byte) processChars::i#2 -- vbuxx=_inc_vbuxx + inx + //SEG310 [171] if((byte) processChars::i#1!=(byte) 8) goto processChars::@1 -- vbuxx_neq_vbuc1_then_la1 + cpx #8 + bne b1_from_b2 + jmp breturn + //SEG311 processChars::@return + breturn: + //SEG312 [172] return + rts + //SEG313 processChars::@4 + b4: + //SEG314 [173] *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) ← -- *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) -- pbuz1_derefidx_vbuz2=_dec_pbuz1_derefidx_vbuz2 + ldy processing_x + lda (_8),y + sec + sbc #1 + sta (_8),y + jmp b2 + //SEG315 processChars::@3 + b3: + //SEG316 [174] (byte~) processChars::$15 ← (byte) processChars::i#2 << (byte) 2 -- vbuaa=vbuxx_rol_2 + txa + asl + asl + //SEG317 [175] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) processChars::$15) ← (const word) NOT_FOUND#0 -- pwuc1_derefidx_vbuaa=vwuc2 + tay + lda #NOT_FOUND + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST+1,y + jmp b2 +} +//SEG318 irqTop +// Raster Interrupt at the top of the screen +irqTop: { + //SEG319 entry interrupt(HARDWARE_ALL) + sta rega+1 + stx regx+1 + sty regy+1 + //SEG320 [177] phi from irqTop to irqTop::@1 [phi:irqTop->irqTop::@1] + b1_from_irqTop: + //SEG321 [177] phi (byte) irqTop::i#2 = (byte) 0 [phi:irqTop->irqTop::@1#0] -- vbuxx=vbuc1 + ldx #0 + jmp b1 + //SEG322 [177] phi from irqTop::@1 to irqTop::@1 [phi:irqTop::@1->irqTop::@1] + b1_from_b1: + //SEG323 [177] phi (byte) irqTop::i#2 = (byte) irqTop::i#1 [phi:irqTop::@1->irqTop::@1#0] -- register_copy + jmp b1 + //SEG324 irqTop::@1 + b1: + //SEG325 [178] (byte) irqTop::i#1 ← ++ (byte) irqTop::i#2 -- vbuxx=_inc_vbuxx + inx + //SEG326 [179] if((byte) irqTop::i#1!=(byte) 5) goto irqTop::@1 -- vbuxx_neq_vbuc1_then_la1 + cpx #5 + bne b1_from_b1 + jmp b2 + //SEG327 irqTop::@2 + b2: + //SEG328 [180] *((const byte*) BORDERCOL#0) ← (const byte) WHITE#0 -- _deref_pbuc1=vbuc2 + lda #WHITE + sta BORDERCOL + //SEG329 [181] *((const byte*) BGCOL#0) ← (const byte) WHITE#0 -- _deref_pbuc1=vbuc2 + lda #WHITE + sta BGCOL + //SEG330 [182] phi from irqTop::@2 to irqTop::@3 [phi:irqTop::@2->irqTop::@3] + b3_from_b2: + //SEG331 [182] phi (byte) irqTop::i1#2 = (byte) 0 [phi:irqTop::@2->irqTop::@3#0] -- vbuxx=vbuc1 + ldx #0 + jmp b3 + //SEG332 [182] phi from irqTop::@3 to irqTop::@3 [phi:irqTop::@3->irqTop::@3] + b3_from_b3: + //SEG333 [182] phi (byte) irqTop::i1#2 = (byte) irqTop::i1#1 [phi:irqTop::@3->irqTop::@3#0] -- register_copy + jmp b3 + //SEG334 irqTop::@3 + b3: + //SEG335 [183] (byte) irqTop::i1#1 ← ++ (byte) irqTop::i1#2 -- vbuxx=_inc_vbuxx + inx + //SEG336 [184] if((byte) irqTop::i1#1!=(byte) 8) goto irqTop::@3 -- vbuxx_neq_vbuc1_then_la1 + cpx #8 + bne b3_from_b3 + jmp b4 + //SEG337 irqTop::@4 + b4: + //SEG338 [185] *((const byte*) BORDERCOL#0) ← (const byte) LIGHT_BLUE#0 -- _deref_pbuc1=vbuc2 + lda #LIGHT_BLUE + sta BORDERCOL + //SEG339 [186] *((const byte*) BGCOL#0) ← (const byte) BLUE#0 -- _deref_pbuc1=vbuc2 + lda #BLUE + sta BGCOL + //SEG340 [187] *((const byte*) RASTER#0) ← (const byte) RASTER_IRQ_MIDDLE#0 -- _deref_pbuc1=vbuc2 + // Trigger IRQ at the middle of the screen + lda #RASTER_IRQ_MIDDLE + sta RASTER + //SEG341 [188] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(HARDWARE_ALL)(void()) irqBottom() -- _deref_pptc1=pprc2 + lda #irqBottom + sta HARDWARE_IRQ+1 + //SEG342 [189] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2 + // Acknowledge the IRQ + lda #IRQ_RASTER + sta IRQ_STATUS + jmp breturn + //SEG343 irqTop::@return + breturn: + //SEG344 [190] return - exit interrupt(HARDWARE_ALL) + rega: + lda #00 + regx: + ldx #00 + regy: + ldy #00 + rti +} + // Copy of the screen used for finding chars to process + SCREEN_COPY: .fill $3e8, 0 + // Chars currently being processed in the interrupt + PROCESSING: .fill 4*8, 0 + // SQUARES_X[i] = (i-20)*(i-20) + SQUARES_X: .fill 2*$28, 0 + // SQUARES_Y[i] = (i-12)*(i-12) + SQUARES_Y: .fill 2*$19, 0 + +ASSEMBLER OPTIMIZATIONS +Removing instruction jmp b1 +Removing instruction jmp bend +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b3 +Removing instruction jmp b4 +Removing instruction jmp b5 +Removing instruction jmp b6 +Removing instruction jmp b9 +Removing instruction jmp b8 +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b4 +Removing instruction jmp b5 +Removing instruction jmp breturn +Removing instruction jmp b7 +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b4 +Removing instruction jmp b5 +Removing instruction jmp b3 +Removing instruction jmp b6 +Removing instruction jmp b7 +Removing instruction jmp b8 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp b3 +Removing instruction jmp b4 +Removing instruction jmp b9 +Removing instruction jmp b5 +Removing instruction jmp b7 +Removing instruction jmp b8 +Removing instruction jmp b10 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp breturn +Removing instruction jmp b4 +Removing instruction jmp b3 +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b3 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp b5 +Removing instruction jmp b6 +Removing instruction jmp b7 +Removing instruction jmp b2 +Removing instruction jmp breturn +Removing instruction jmp b1 +Removing instruction jmp b2 +Removing instruction jmp b3 +Removing instruction jmp b4 +Removing instruction jmp breturn +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction lda #0 +Removing instruction ldy #0 +Removing instruction lda #0 +Removing instruction lda #0 +Removing instruction lda #WHITE +Removing instruction lda processing_y +Removing instruction ldy processing_x +Removing instruction lda #WHITE +Succesful ASM optimization Pass5UnnecesaryLoadElimination +Replacing label b1_from_b1 with b1 +Replacing label b3_from_b3 with b3 +Replacing label b3_from_b3 with b3 +Replacing label b4_from_b4 with b4 +Replacing label b4_from_b4 with b4 +Replacing label b2_from_b3 with b2 +Replacing label b4_from_b7 with b4 +Replacing label b3_from_b12 with b3 +Replacing label b3_from_b11 with b3 +Replacing label b1_from_b9 with b1 +Replacing label b5_from_b10 with b5 +Replacing label b8_from_b6 with b8 +Replacing label b4_from_b2 with b4 +Replacing label b3_from_b2 with b3 +Replacing label b1_from_b1 with b1 +Replacing label b1_from_b2 with b1 +Replacing label b1_from_b1 with b1 +Replacing label b3_from_b3 with b3 +Removing instruction b1_from_bbegin: +Removing instruction b1: +Removing instruction main_from_b1: +Removing instruction bend_from_b1: +Removing instruction b1_from_b1: +Removing instruction b2_from_b1: +Removing instruction b3_from_b3: +Removing instruction b4_from_b4: +Removing instruction b5_from_b4: +Removing instruction initSquareTables_from_b5: +Removing instruction b6_from_b5: +Removing instruction getCenterChar_from_b6: +Removing instruction b2_from_b1: +Removing instruction b2_from_b3: +Removing instruction b4_from_b2: +Removing instruction b4_from_b7: +Removing instruction b2_from_b1: +Removing instruction b3_from_b11: +Removing instruction b3_from_b12: +Removing instruction b3_from_b5: +Removing instruction b1_from_b9: +Removing instruction b4_from_b2: +Removing instruction b4_from_b3: +Removing instruction b5_from_b10: +Removing instruction b8_from_b6: +Removing instruction b8_from_b7: +Removing instruction b3_from_b2: +Removing instruction b3_from_b4: +Removing instruction b1_from_b1: +Removing instruction breturn: +Removing instruction b1_from_b2: +Removing instruction b1_from_b1: +Removing instruction b3_from_b3: +Removing instruction breturn: +Succesful ASM optimization Pass5RedundantLabelElimination +Removing instruction bend: +Removing instruction b1_from_main: +Removing instruction b2: +Removing instruction b3_from_b2: +Removing instruction b4_from_b3: +Removing instruction b5: +Removing instruction b6: +Removing instruction b9: +Removing instruction startProcessing_from_b7: +Removing instruction b1_from_startProcessing: +Removing instruction b5: +Removing instruction breturn: +Removing instruction b1_from_b6: +Removing instruction b7: +Removing instruction b1_from_getCenterChar: +Removing instruction b4: +Removing instruction b5: +Removing instruction b6: +Removing instruction b7: +Removing instruction b8: +Removing instruction b1_from_b9: +Removing instruction b2_from_b10: +Removing instruction b1_from_initSquareTables: +Removing instruction b3: +Removing instruction mul8u_from_b4: +Removing instruction b9: +Removing instruction b5_from_b9: +Removing instruction b7: +Removing instruction mul8u_from_b8: +Removing instruction b10: +Removing instruction breturn: +Removing instruction b1_from_mul8u: +Removing instruction breturn: +Removing instruction b4: +Removing instruction b1_from_b3: +Removing instruction b1: +Removing instruction b2: +Removing instruction breturn: +Removing instruction b1_from_irqBottom: +Removing instruction b2: +Removing instruction processChars_from_b2: +Removing instruction b3: +Removing instruction b1_from_processChars: +Removing instruction b5: +Removing instruction b6: +Removing instruction b7: +Removing instruction breturn: +Removing instruction b1_from_irqTop: +Removing instruction b2: +Removing instruction b3_from_b2: +Removing instruction b4: +Succesful ASM optimization Pass5UnusedLabelElimination +Updating BasicUpstart to call main directly +Removing instruction jsr main +Succesful ASM optimization Pass5SkipBegin +Relabelling long label b6_from_b7 to b2 +Succesful ASM optimization Pass5RelabelLongLabels +Removing instruction jmp b1 +Removing instruction jmp b3 +Removing instruction jmp b4 +Removing instruction jmp b2 +Removing instruction jmp b1 +Removing instruction jmp b5 +Removing instruction jmp b1 +Removing instruction jmp b1 +Removing instruction jmp b1 +Removing instruction jmp b3 +Succesful ASM optimization Pass5NextJumpElimination +Replacing instruction lda x with TYA +Removing instruction lda #$28 +Removing instruction lda x +Removing instruction lda y +Removing instruction ldy processing_x +Succesful ASM optimization Pass5UnnecesaryLoadElimination +Removing instruction bbegin: +Succesful ASM optimization Pass5UnusedLabelElimination +Fixing long branch [612] bne b1 to beq +Fixing long branch [219] beq b11 to bne +Fixing long branch [240] beq b12 to bne +Fixing long branch [244] bcc b12 to bcs +Fixing long branch [526] beq b2 to bne + +FINAL SYMBOL TABLE +(label) @1 +(label) @begin +(label) @end +(byte*) BGCOL +(const byte*) BGCOL#0 BGCOL = (byte*) 53281 +(byte) BLUE +(const byte) BLUE#0 BLUE = (byte) 6 +(byte*) BORDERCOL +(const byte*) BORDERCOL#0 BORDERCOL = (byte*) 53280 +(byte*) CIA1_INTERRUPT +(const byte*) CIA1_INTERRUPT#0 CIA1_INTERRUPT = (byte*) 56333 +(byte) CIA_INTERRUPT_CLEAR +(const byte) CIA_INTERRUPT_CLEAR#0 CIA_INTERRUPT_CLEAR = (byte) $7f +(byte*) COLS +(const byte*) COLS#0 COLS = (byte*) 55296 +(void()**) HARDWARE_IRQ +(const void()**) HARDWARE_IRQ#0 HARDWARE_IRQ = (void()**) 65534 +(byte*) IRQ_ENABLE +(const byte*) IRQ_ENABLE#0 IRQ_ENABLE = (byte*) 53274 +(byte) IRQ_RASTER +(const byte) IRQ_RASTER#0 IRQ_RASTER = (byte) 1 +(byte*) IRQ_STATUS +(const byte*) IRQ_STATUS#0 IRQ_STATUS = (byte*) 53273 +(byte) LIGHT_BLUE +(const byte) LIGHT_BLUE#0 LIGHT_BLUE = (byte) $e +(word) NOT_FOUND +(const word) NOT_FOUND#0 NOT_FOUND = (word) $ffff +(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST OFFSET_STRUCT_PROCESSINGCHAR_DIST = (byte) 2 +(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y OFFSET_STRUCT_PROCESSINGCHAR_Y = (byte) 1 +(struct ProcessingChar[8]) PROCESSING +(const struct ProcessingChar[8]) PROCESSING#0 PROCESSING = { fill( 8, 0) } +(byte*) PROCPORT +(const byte*) PROCPORT#0 PROCPORT = (byte*) 1 +(byte*) PROCPORT_DDR +(const byte*) PROCPORT_DDR#0 PROCPORT_DDR = (byte*) 0 +(byte) PROCPORT_DDR_MEMORY_MASK +(const byte) PROCPORT_DDR_MEMORY_MASK#0 PROCPORT_DDR_MEMORY_MASK = (byte) 7 +(byte) PROCPORT_RAM_IO +(const byte) PROCPORT_RAM_IO#0 PROCPORT_RAM_IO = (byte) $35 +(word) ProcessingChar::dist +(byte) ProcessingChar::x +(byte) ProcessingChar::y +(byte*) RASTER +(const byte*) RASTER#0 RASTER = (byte*) 53266 +(byte) RASTER_IRQ_MIDDLE +(const byte) RASTER_IRQ_MIDDLE#0 RASTER_IRQ_MIDDLE = (byte) $ff +(byte) RASTER_IRQ_TOP +(const byte) RASTER_IRQ_TOP#0 RASTER_IRQ_TOP = (byte) $30 +(byte*) SCREEN +(const byte*) SCREEN#0 SCREEN = (byte*) 1024 +(byte[$3e8]) SCREEN_COPY +(const byte[$3e8]) SCREEN_COPY#0 SCREEN_COPY = { fill( $3e8, 0) } +(word[$28]) SQUARES_X +(const word[$28]) SQUARES_X#0 SQUARES_X = { fill( $28, 0) } +(word[$19]) SQUARES_Y +(const word[$19]) SQUARES_Y#0 SQUARES_Y = { fill( $19, 0) } +(byte*) VIC_CONTROL +(const byte*) VIC_CONTROL#0 VIC_CONTROL = (byte*) 53265 +(byte) WHITE +(const byte) WHITE#0 WHITE = (byte) 1 +(struct ProcessingChar()) getCenterChar() +(word~) getCenterChar::$10 $10 zp ZP_WORD:27 4.0 +(byte*~) getCenterChar::$11 $11 zp ZP_WORD:27 4.0 +(byte~) getCenterChar::$13 reg byte x 1001.0 +(byte~) getCenterChar::$14 reg byte a 2002.0 +(word) getCenterChar::$15 $15 zp ZP_WORD:29 4.0 +(word) getCenterChar::$16 $16 zp ZP_WORD:27 4.0 +(word~) getCenterChar::$9 $9 zp ZP_WORD:27 3.0 +(label) getCenterChar::@1 +(label) getCenterChar::@10 +(label) getCenterChar::@11 +(label) getCenterChar::@12 +(label) getCenterChar::@2 +(label) getCenterChar::@3 +(label) getCenterChar::@4 +(label) getCenterChar::@5 +(label) getCenterChar::@6 +(label) getCenterChar::@7 +(label) getCenterChar::@8 +(label) getCenterChar::@9 +(label) getCenterChar::@return +(struct ProcessingChar) getCenterChar::closest +(word) getCenterChar::closest_dist +(word~) getCenterChar::closest_dist#10 closest_dist zp ZP_WORD:13 202.0 +(word~) getCenterChar::closest_dist#12 closest_dist zp ZP_WORD:13 2002.0 +(word) getCenterChar::closest_dist#2 closest_dist zp ZP_WORD:13 684.1666666666667 +(word) getCenterChar::closest_dist#8 closest_dist zp ZP_WORD:13 202.0 +(byte) getCenterChar::closest_x +(byte) getCenterChar::closest_x#7 closest_x zp ZP_BYTE:15 388.0 +(byte) getCenterChar::closest_x#9 closest_x zp ZP_BYTE:15 202.0 +(byte) getCenterChar::closest_y +(byte) getCenterChar::closest_y#7 closest_y zp ZP_BYTE:16 388.0 +(byte) getCenterChar::closest_y#9 closest_y zp ZP_BYTE:16 202.0 +(word) getCenterChar::dist +(word) getCenterChar::dist#0 dist zp ZP_WORD:17 750.75 +(struct ProcessingChar) getCenterChar::return +(word) getCenterChar::return_dist +(word) getCenterChar::return_dist#0 return_dist zp ZP_WORD:17 7.333333333333333 +(word) getCenterChar::return_dist#1 return_dist zp ZP_WORD:17 242.23529411764704 +(word~) getCenterChar::return_dist#5 return_dist zp ZP_WORD:17 2002.0 +(word~) getCenterChar::return_dist#6 return_dist zp ZP_WORD:17 2002.0 +(byte) getCenterChar::return_x +(byte) getCenterChar::return_x#0 reg byte x 7.333333333333333 +(byte) getCenterChar::return_x#1 return_x zp ZP_BYTE:15 242.23529411764704 +(byte~) getCenterChar::return_x#7 return_x zp ZP_BYTE:15 1001.0 +(byte) getCenterChar::return_y +(byte) getCenterChar::return_y#0 reg byte y 7.333333333333333 +(byte) getCenterChar::return_y#1 return_y zp ZP_BYTE:16 228.66666666666669 +(byte~) getCenterChar::return_y#7 return_y zp ZP_BYTE:16 2002.0 +(byte*) getCenterChar::screen_line +(byte*) getCenterChar::screen_line#1 screen_line zp ZP_WORD:9 50.5 +(byte*) getCenterChar::screen_line#4 screen_line zp ZP_WORD:9 80.2 +(byte) getCenterChar::x +(byte) getCenterChar::x#1 x zp ZP_BYTE:12 1001.0 +(byte) getCenterChar::x#2 x zp ZP_BYTE:12 455.0 +(byte) getCenterChar::y +(byte) getCenterChar::y#1 y zp ZP_BYTE:11 101.0 +(byte) getCenterChar::y#7 y zp ZP_BYTE:11 137.75 +(void()) initSquareTables() +(byte~) initSquareTables::$10 reg byte a 22.0 +(byte~) initSquareTables::$12 reg byte a 22.0 +(word~) initSquareTables::$14 $14 zp ZP_WORD:21 11.0 +(byte~) initSquareTables::$16 reg byte a 22.0 +(byte~) initSquareTables::$17 reg byte a 22.0 +(byte~) initSquareTables::$2 reg byte a 22.0 +(byte~) initSquareTables::$4 reg byte a 22.0 +(word~) initSquareTables::$6 $6 zp ZP_WORD:21 11.0 +(label) initSquareTables::@1 +(label) initSquareTables::@10 +(label) initSquareTables::@2 +(label) initSquareTables::@3 +(label) initSquareTables::@4 +(label) initSquareTables::@5 +(label) initSquareTables::@6 +(label) initSquareTables::@7 +(label) initSquareTables::@8 +(label) initSquareTables::@9 +(label) initSquareTables::@return +(byte) initSquareTables::x +(byte) initSquareTables::x#1 x zp ZP_BYTE:19 16.5 +(byte) initSquareTables::x#2 x zp ZP_BYTE:19 5.5 +(byte) initSquareTables::x_dist +(byte) initSquareTables::x_dist#0 reg byte a 22.0 +(byte) initSquareTables::y +(byte) initSquareTables::y#1 y zp ZP_BYTE:20 16.5 +(byte) initSquareTables::y#2 y zp ZP_BYTE:20 5.5 +(byte) initSquareTables::y_dist +(byte) initSquareTables::y_dist#0 reg byte a 22.0 +interrupt(HARDWARE_ALL)(void()) irqBottom() +(label) irqBottom::@1 +(label) irqBottom::@2 +(label) irqBottom::@3 +(label) irqBottom::@return +(byte) irqBottom::i +(byte) irqBottom::i#1 reg byte x 16.5 +(byte) irqBottom::i#2 reg byte x 22.0 +interrupt(HARDWARE_ALL)(void()) irqTop() +(label) irqTop::@1 +(label) irqTop::@2 +(label) irqTop::@3 +(label) irqTop::@4 +(label) irqTop::@return +(byte) irqTop::i +(byte) irqTop::i#1 reg byte x 16.5 +(byte) irqTop::i#2 reg byte x 22.0 +(byte) irqTop::i1 +(byte) irqTop::i1#1 reg byte x 16.5 +(byte) irqTop::i1#2 reg byte x 22.0 +(void()) main() +(struct ProcessingChar~) main::$11 +(byte~) main::$18 reg byte y 14.666666666666666 +(byte~) main::$5 reg byte a 22.0 +(byte~) main::$6 reg byte a 22.0 +(byte~) main::$7 reg byte a 22.0 +(label) main::@1 +(label) main::@2 +(label) main::@3 +(label) main::@4 +(label) main::@5 +(label) main::@6 +(label) main::@7 +(label) main::@8 +(label) main::@9 +(struct ProcessingChar) main::center +(word) main::center_dist +(word) main::center_dist#0 center_dist zp ZP_WORD:17 8.25 +(byte) main::center_x +(byte) main::center_x#0 reg byte x 5.5 +(byte) main::center_y +(byte) main::center_y#0 reg byte y 5.5 +(byte*) main::dst +(byte*) main::dst#1 dst zp ZP_WORD:6 11.0 +(byte*) main::dst#2 dst zp ZP_WORD:6 11.0 +(byte) main::i +(byte) main::i#1 reg byte x 16.5 +(byte) main::i#2 reg byte x 6.6000000000000005 +(byte*) main::sc +(byte*) main::sc#1 sc zp ZP_WORD:2 16.5 +(byte*) main::sc#2 sc zp ZP_WORD:2 8.8 +(byte*) main::src +(byte*) main::src#1 src zp ZP_WORD:4 11.0 +(byte*) main::src#2 src zp ZP_WORD:4 16.5 +(word()) mul8u((byte) mul8u::a , (byte) mul8u::b) +(byte~) mul8u::$1 reg byte a 202.0 +(label) mul8u::@1 +(label) mul8u::@2 +(label) mul8u::@3 +(label) mul8u::@4 +(label) mul8u::@return +(byte) mul8u::a +(byte) mul8u::a#0 reg byte x 101.0 +(byte) mul8u::a#1 reg byte x 11.0 +(byte) mul8u::a#2 reg byte x 11.0 +(byte) mul8u::a#3 reg byte x 67.66666666666666 +(byte) mul8u::a#6 reg byte x 24.0 +(byte) mul8u::b +(byte) mul8u::b#0 reg byte a 22.0 +(byte) mul8u::b#1 reg byte a 22.0 +(word) mul8u::mb +(word) mul8u::mb#0 mb zp ZP_WORD:23 24.0 +(word) mul8u::mb#1 mb zp ZP_WORD:23 202.0 +(word) mul8u::mb#2 mb zp ZP_WORD:23 43.57142857142858 +(word) mul8u::res +(word) mul8u::res#1 res zp ZP_WORD:21 202.0 +(word) mul8u::res#2 res zp ZP_WORD:21 46.42857142857143 +(word) mul8u::res#6 res zp ZP_WORD:21 101.0 +(word) mul8u::return +(word) mul8u::return#2 return zp ZP_WORD:21 22.0 +(word) mul8u::return#3 return zp ZP_WORD:21 22.0 +(void()) processChars() +(byte~) processChars::$13 reg byte a 22.0 +(byte~) processChars::$14 reg byte y 16.5 +(byte~) processChars::$15 reg byte a 22.0 +(word~) processChars::$2 $2 zp ZP_WORD:33 16.5 +(word) processChars::$21 $21 zp ZP_WORD:35 22.0 +(word) processChars::$22 $22 zp ZP_WORD:33 22.0 +(word) processChars::$24 $24 zp ZP_WORD:39 22.0 +(word) processChars::$25 $25 zp ZP_WORD:37 22.0 +(word~) processChars::$3 $3 zp ZP_WORD:33 22.0 +(byte*~) processChars::$4 $4 zp ZP_WORD:33 22.0 +(word~) processChars::$6 $6 zp ZP_WORD:37 16.5 +(word~) processChars::$7 $7 zp ZP_WORD:37 22.0 +(byte*~) processChars::$8 $8 zp ZP_WORD:37 25.666666666666668 +(label) processChars::@1 +(label) processChars::@2 +(label) processChars::@3 +(label) processChars::@4 +(label) processChars::@5 +(label) processChars::@6 +(label) processChars::@7 +(label) processChars::@return +(byte) processChars::i +(byte) processChars::i#1 reg byte x 16.5 +(byte) processChars::i#2 reg byte x 2.391304347826087 +(struct ProcessingChar) processChars::processing +(byte*) processChars::processing_ptr +(byte) processChars::processing_x +(byte) processChars::processing_x#0 processing_x zp ZP_BYTE:31 5.866666666666666 +(byte) processChars::processing_y +(byte) processChars::processing_y#0 processing_y zp ZP_BYTE:32 1.5714285714285714 +(void()) setupRasterIrq((word) setupRasterIrq::raster , (void()*) setupRasterIrq::irqRoutine) +(label) setupRasterIrq::@1 +(label) setupRasterIrq::@2 +(label) setupRasterIrq::@return +(void()*) setupRasterIrq::irqRoutine +(const void()*) setupRasterIrq::irqRoutine#0 irqRoutine = &interrupt(HARDWARE_ALL)(void()) irqTop() +(word) setupRasterIrq::raster +(void()) startProcessing((byte) startProcessing::center_x , (byte) startProcessing::center_y , (word) startProcessing::center_dist) +(byte~) startProcessing::$4 reg byte a 2002.0 +(byte~) startProcessing::$5 reg byte x 2.6666666666666665 +(label) startProcessing::@1 +(label) startProcessing::@2 +(label) startProcessing::@3 +(label) startProcessing::@4 +(label) startProcessing::@5 +(label) startProcessing::@6 +(label) startProcessing::@7 +(label) startProcessing::@return +(struct ProcessingChar) startProcessing::center +(word) startProcessing::center_dist +(word) startProcessing::center_dist#0 center_dist zp ZP_WORD:17 0.8666666666666666 +(byte) startProcessing::center_x +(byte) startProcessing::center_x#0 center_x zp ZP_BYTE:25 0.8666666666666666 +(byte) startProcessing::center_y +(byte) startProcessing::center_y#0 center_y zp ZP_BYTE:26 0.8666666666666666 +(byte) startProcessing::freeIdx +(byte) startProcessing::freeIdx#2 reg byte x 653.0 +(byte) startProcessing::freeIdx#6 freeIdx zp ZP_BYTE:8 33.666666666666664 +(byte~) startProcessing::freeIdx#7 freeIdx zp ZP_BYTE:8 202.0 +(byte~) startProcessing::freeIdx#8 reg byte x 202.0 +(byte) startProcessing::i +(byte) startProcessing::i#1 reg byte x 1501.5 +(byte) startProcessing::i#2 reg byte x 1334.6666666666667 + +reg byte x [ main::i#2 main::i#1 ] +zp ZP_WORD:2 [ main::sc#2 main::sc#1 ] +zp ZP_WORD:4 [ main::src#2 main::src#1 ] +zp ZP_WORD:6 [ main::dst#2 main::dst#1 ] +zp ZP_BYTE:8 [ startProcessing::freeIdx#6 startProcessing::freeIdx#7 ] +reg byte x [ startProcessing::freeIdx#2 startProcessing::freeIdx#8 startProcessing::i#2 startProcessing::i#1 ] +zp ZP_WORD:9 [ getCenterChar::screen_line#4 getCenterChar::screen_line#1 ] +zp ZP_BYTE:11 [ getCenterChar::y#7 getCenterChar::y#1 ] +zp ZP_BYTE:12 [ getCenterChar::x#2 getCenterChar::x#1 ] +zp ZP_WORD:13 [ getCenterChar::closest_dist#2 getCenterChar::closest_dist#8 getCenterChar::closest_dist#10 getCenterChar::closest_dist#12 ] +zp ZP_BYTE:15 [ getCenterChar::closest_x#7 getCenterChar::closest_x#9 getCenterChar::return_x#1 getCenterChar::return_x#7 ] +zp ZP_BYTE:16 [ getCenterChar::closest_y#7 getCenterChar::closest_y#9 getCenterChar::return_y#1 getCenterChar::return_y#7 ] +zp ZP_WORD:17 [ getCenterChar::return_dist#1 getCenterChar::return_dist#5 getCenterChar::return_dist#6 getCenterChar::dist#0 getCenterChar::return_dist#0 main::center_dist#0 startProcessing::center_dist#0 ] +zp ZP_BYTE:19 [ initSquareTables::x#2 initSquareTables::x#1 ] +reg byte a [ initSquareTables::x_dist#0 initSquareTables::$4 initSquareTables::$2 ] +zp ZP_BYTE:20 [ initSquareTables::y#2 initSquareTables::y#1 ] +reg byte a [ initSquareTables::y_dist#0 initSquareTables::$12 initSquareTables::$10 ] +reg byte a [ mul8u::b#1 ] +reg byte a [ mul8u::b#0 ] +reg byte x [ mul8u::a#3 mul8u::a#6 mul8u::a#2 mul8u::a#1 mul8u::a#0 ] +zp ZP_WORD:21 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 mul8u::return#3 initSquareTables::$6 initSquareTables::$14 ] +zp ZP_WORD:23 [ mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 ] +reg byte x [ irqBottom::i#2 irqBottom::i#1 ] +reg byte x [ processChars::i#2 processChars::i#1 ] +reg byte x [ irqTop::i#2 irqTop::i#1 ] +reg byte x [ irqTop::i1#2 irqTop::i1#1 ] +reg byte y [ main::$18 ] +reg byte a [ main::$5 ] +reg byte a [ main::$6 ] +reg byte a [ main::$7 ] +reg byte x [ getCenterChar::return_x#0 ] +reg byte y [ getCenterChar::return_y#0 ] +reg byte x [ main::center_x#0 ] +reg byte y [ main::center_y#0 ] +zp ZP_BYTE:25 [ startProcessing::center_x#0 ] +zp ZP_BYTE:26 [ startProcessing::center_y#0 ] +reg byte a [ startProcessing::$4 ] +reg byte x [ startProcessing::$5 ] +reg byte x [ getCenterChar::$13 ] +reg byte a [ getCenterChar::$14 ] +zp ZP_WORD:27 [ getCenterChar::$9 getCenterChar::$16 getCenterChar::$10 getCenterChar::$11 ] +zp ZP_WORD:29 [ getCenterChar::$15 ] +reg byte a [ initSquareTables::$16 ] +reg byte a [ initSquareTables::$17 ] +reg byte a [ mul8u::$1 ] +reg byte a [ processChars::$13 ] +reg byte y [ processChars::$14 ] +zp ZP_BYTE:31 [ processChars::processing_x#0 ] +zp ZP_BYTE:32 [ processChars::processing_y#0 ] +zp ZP_WORD:33 [ processChars::$2 processChars::$22 processChars::$3 processChars::$4 ] +zp ZP_WORD:35 [ processChars::$21 ] +zp ZP_WORD:37 [ processChars::$6 processChars::$25 processChars::$7 processChars::$8 ] +zp ZP_WORD:39 [ processChars::$24 ] +reg byte a [ processChars::$15 ] + + +FINAL ASSEMBLER +Score: 213220 + +//SEG0 File Comments +// Black Hole at the center of the BASIC screen sucking in any letters +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" +//SEG2 Global Constants & labels + .const OFFSET_STRUCT_PROCESSINGCHAR_Y = 1 + .const OFFSET_STRUCT_PROCESSINGCHAR_DIST = 2 + // Processor port data direction register + .label PROCPORT_DDR = 0 + // Mask for PROCESSOR_PORT_DDR which allows only memory configuration to be written + .const PROCPORT_DDR_MEMORY_MASK = 7 + // Processor Port Register controlling RAM/ROM configuration and the datasette + .label PROCPORT = 1 + // RAM in $A000, $E000 I/O in $D000 + .const PROCPORT_RAM_IO = $35 + .label RASTER = $d012 + .label BORDERCOL = $d020 + .label BGCOL = $d021 + .label VIC_CONTROL = $d011 + // VIC II IRQ Status Register + .label IRQ_STATUS = $d019 + // VIC II IRQ Enable Register + .label IRQ_ENABLE = $d01a + // Bits for the IRQ Status/Enable Registers + .const IRQ_RASTER = 1 + // Color Ram + .label COLS = $d800 + // CIA#1 Interrupt Status & Control Register + .label CIA1_INTERRUPT = $dc0d + // Value that disables all CIA interrupts when stored to the CIA Interrupt registers + .const CIA_INTERRUPT_CLEAR = $7f + // The vector used when the HARDWARE serves IRQ interrupts + .label HARDWARE_IRQ = $fffe + .const WHITE = 1 + .const BLUE = 6 + .const LIGHT_BLUE = $e + .label SCREEN = $400 + // Distance value meaning not found + .const NOT_FOUND = $ffff + .const RASTER_IRQ_TOP = $30 + .const RASTER_IRQ_MIDDLE = $ff +//SEG3 @begin +//SEG4 [1] phi from @begin to @1 [phi:@begin->@1] +//SEG5 @1 +//SEG6 [2] call main +//SEG7 [4] phi from @1 to main [phi:@1->main] +//SEG8 [3] phi from @1 to @end [phi:@1->@end] +//SEG9 @end +//SEG10 main +main: { + .label sc = 2 + .label src = 4 + .label dst = 6 + .label center_dist = $11 + //SEG11 [5] phi from main to main::@1 [phi:main->main::@1] + //SEG12 [5] phi (byte) main::i#2 = (byte) 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 + ldx #0 + // Init processing array + //SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1] + //SEG14 [5] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@1->main::@1#0] -- register_copy + //SEG15 main::@1 + b1: + //SEG16 [6] (byte~) main::$18 ← (byte) main::i#2 << (byte) 2 -- vbuyy=vbuxx_rol_2 + txa + asl + asl + tay + //SEG17 [7] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) main::$18) ← (byte) 0 -- pbuc1_derefidx_vbuyy=vbuc2 + lda #0 + sta PROCESSING,y + //SEG18 [8] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) main::$18) ← (byte) 0 -- pbuc1_derefidx_vbuyy=vbuc2 + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_Y,y + //SEG19 [9] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) main::$18) ← (const word) NOT_FOUND#0 -- pwuc1_derefidx_vbuyy=vwuc2 + lda #NOT_FOUND + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST+1,y + //SEG20 [10] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuxx=_inc_vbuxx + inx + //SEG21 [11] if((byte) main::i#1!=(byte) 8) goto main::@1 -- vbuxx_neq_vbuc1_then_la1 + cpx #8 + bne b1 + //SEG22 [12] phi from main::@1 to main::@2 [phi:main::@1->main::@2] + //SEG23 main::@2 + //SEG24 [13] call setupRasterIrq + jsr setupRasterIrq + //SEG25 [14] phi from main::@2 to main::@3 [phi:main::@2->main::@3] + //SEG26 [14] phi (byte*) main::sc#2 = (const byte*) SCREEN#0 [phi:main::@2->main::@3#0] -- pbuz1=pbuc1 + lda #SCREEN + sta sc+1 + // Fill screen with some chars + //SEG27 [14] phi from main::@3 to main::@3 [phi:main::@3->main::@3] + //SEG28 [14] phi (byte*) main::sc#2 = (byte*) main::sc#1 [phi:main::@3->main::@3#0] -- register_copy + //SEG29 main::@3 + b3: + //SEG30 [15] (byte~) main::$5 ← < (byte*) main::sc#2 -- vbuaa=_lo_pbuz1 + lda sc + //SEG31 [16] (byte~) main::$6 ← (byte~) main::$5 & (byte) $1f -- vbuaa=vbuaa_band_vbuc1 + and #$1f + //SEG32 [17] (byte~) main::$7 ← (byte) 'a' + (byte~) main::$6 -- vbuaa=vbuc1_plus_vbuaa + clc + adc #'a' + //SEG33 [18] *((byte*) main::sc#2) ← (byte~) main::$7 -- _deref_pbuz1=vbuaa + ldy #0 + sta (sc),y + //SEG34 [19] (byte*) main::sc#1 ← ++ (byte*) main::sc#2 -- pbuz1=_inc_pbuz1 + inc sc + bne !+ + inc sc+1 + !: + //SEG35 [20] if((byte*) main::sc#1!=(const byte*) SCREEN#0+(word) $3e7+(byte) 1) goto main::@3 -- pbuz1_neq_pbuc1_then_la1 + lda sc+1 + cmp #>SCREEN+$3e7+1 + bne b3 + lda sc + cmp #main::@4] + //SEG37 [21] phi (byte*) main::dst#2 = (const byte[$3e8]) SCREEN_COPY#0 [phi:main::@3->main::@4#0] -- pbuz1=pbuc1 + lda #SCREEN_COPY + sta dst+1 + //SEG38 [21] phi (byte*) main::src#2 = (const byte*) SCREEN#0 [phi:main::@3->main::@4#1] -- pbuz1=pbuc1 + lda #SCREEN + sta src+1 + // Copy screen to screen copy + //SEG39 [21] phi from main::@4 to main::@4 [phi:main::@4->main::@4] + //SEG40 [21] phi (byte*) main::dst#2 = (byte*) main::dst#1 [phi:main::@4->main::@4#0] -- register_copy + //SEG41 [21] phi (byte*) main::src#2 = (byte*) main::src#1 [phi:main::@4->main::@4#1] -- register_copy + //SEG42 main::@4 + b4: + //SEG43 [22] *((byte*) main::dst#2) ← *((byte*) main::src#2) -- _deref_pbuz1=_deref_pbuz2 + ldy #0 + lda (src),y + sta (dst),y + //SEG44 [23] (byte*) main::src#1 ← ++ (byte*) main::src#2 -- pbuz1=_inc_pbuz1 + inc src + bne !+ + inc src+1 + !: + //SEG45 [24] (byte*) main::dst#1 ← ++ (byte*) main::dst#2 -- pbuz1=_inc_pbuz1 + inc dst + bne !+ + inc dst+1 + !: + //SEG46 [25] if((byte*) main::src#1!=(const byte*) SCREEN#0+(word) $3e7) goto main::@4 -- pbuz1_neq_pbuc1_then_la1 + lda src+1 + cmp #>SCREEN+$3e7 + bne b4 + lda src + cmp #main::@5] + //SEG48 main::@5 + //SEG49 [27] call initSquareTables + //SEG50 [86] phi from main::@5 to initSquareTables [phi:main::@5->initSquareTables] + jsr initSquareTables + //SEG51 [28] phi from main::@5 main::@7 to main::@6 [phi:main::@5/main::@7->main::@6] + b2: + // Main loop + //SEG52 main::@6 + //SEG53 [29] call getCenterChar + //SEG54 [58] phi from main::@6 to getCenterChar [phi:main::@6->getCenterChar] + jsr getCenterChar + //SEG55 [30] (byte) getCenterChar::return_x#0 ← (byte) getCenterChar::return_x#1 -- vbuxx=vbuz1 + ldx getCenterChar.return_x + //SEG56 [31] (byte) getCenterChar::return_y#0 ← (byte) getCenterChar::return_y#1 -- vbuyy=vbuz1 + ldy getCenterChar.return_y + //SEG57 [32] (word) getCenterChar::return_dist#0 ← (word) getCenterChar::return_dist#1 + //SEG58 main::@9 + //SEG59 [33] (byte) main::center_x#0 ← (byte) getCenterChar::return_x#0 + //SEG60 [34] (byte) main::center_y#0 ← (byte) getCenterChar::return_y#0 + //SEG61 [35] (word) main::center_dist#0 ← (word) getCenterChar::return_dist#0 + //SEG62 [36] if((word) main::center_dist#0!=(const word) NOT_FOUND#0) goto main::@7 -- vwuz1_neq_vwuc1_then_la1 + lda center_dist+1 + cmp #>NOT_FOUND + bne b7 + lda center_dist + cmp #startProcessing] + jsr startProcessing + jmp b2 +} +//SEG71 startProcessing +// Start processing a char - by inserting it into the PROCESSING array +// startProcessing(byte zeropage($19) center_x, byte zeropage($1a) center_y, word zeropage($11) center_dist) +startProcessing: { + .label center_x = $19 + .label center_y = $1a + .label center_dist = $11 + .label freeIdx = 8 + //SEG72 [43] phi from startProcessing to startProcessing::@1 [phi:startProcessing->startProcessing::@1] + //SEG73 [43] phi (byte) startProcessing::freeIdx#6 = (byte) $ff [phi:startProcessing->startProcessing::@1#0] -- vbuz1=vbuc1 + lda #$ff + sta freeIdx + //SEG74 startProcessing::@1 + b1: + //SEG75 [44] phi from startProcessing::@1 to startProcessing::@2 [phi:startProcessing::@1->startProcessing::@2] + //SEG76 [44] phi (byte) startProcessing::i#2 = (byte) 0 [phi:startProcessing::@1->startProcessing::@2#0] -- vbuxx=vbuc1 + ldx #0 + //SEG77 [44] phi from startProcessing::@3 to startProcessing::@2 [phi:startProcessing::@3->startProcessing::@2] + //SEG78 [44] phi (byte) startProcessing::i#2 = (byte) startProcessing::i#1 [phi:startProcessing::@3->startProcessing::@2#0] -- register_copy + //SEG79 startProcessing::@2 + b2: + //SEG80 [45] (byte~) startProcessing::$4 ← (byte) startProcessing::i#2 << (byte) 2 -- vbuaa=vbuxx_rol_2 + txa + asl + asl + //SEG81 [46] if(*((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) startProcessing::$4)!=(const word) NOT_FOUND#0) goto startProcessing::@3 -- pwuc1_derefidx_vbuaa_neq_vwuc2_then_la1 + tay + lda PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST+1,y + cmp #>NOT_FOUND + bne b3 + lda PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST,y + cmp #startProcessing::@4] + //SEG83 [47] phi (byte) startProcessing::freeIdx#2 = (byte) startProcessing::i#2 [phi:startProcessing::@2/startProcessing::@7->startProcessing::@4#0] -- register_copy + //SEG84 startProcessing::@4 + b4: + //SEG85 [48] if((byte) startProcessing::freeIdx#2==(byte) $ff) goto startProcessing::@6 -- vbuxx_eq_vbuc1_then_la1 + cpx #$ff + beq b6 + //SEG86 startProcessing::@5 + //SEG87 [49] (byte~) startProcessing::$5 ← (byte) startProcessing::freeIdx#2 << (byte) 2 -- vbuxx=vbuxx_rol_2 + txa + asl + asl + tax + //SEG88 [50] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) startProcessing::$5) ← (byte) startProcessing::center_x#0 -- pbuc1_derefidx_vbuxx=vbuz1 + lda center_x + sta PROCESSING,x + //SEG89 [51] *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) startProcessing::$5) ← (byte) startProcessing::center_y#0 -- pbuc1_derefidx_vbuxx=vbuz1 + lda center_y + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_Y,x + //SEG90 [52] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) startProcessing::$5) ← (word) startProcessing::center_dist#0 -- pwuc1_derefidx_vbuxx=vwuz1 + lda center_dist + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST,x + lda center_dist+1 + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST+1,x + //SEG91 startProcessing::@return + //SEG92 [53] return + rts + //SEG93 startProcessing::@6 + b6: + //SEG94 [54] (byte~) startProcessing::freeIdx#7 ← (byte) startProcessing::freeIdx#2 -- vbuz1=vbuxx + stx freeIdx + //SEG95 [43] phi from startProcessing::@6 to startProcessing::@1 [phi:startProcessing::@6->startProcessing::@1] + //SEG96 [43] phi (byte) startProcessing::freeIdx#6 = (byte~) startProcessing::freeIdx#7 [phi:startProcessing::@6->startProcessing::@1#0] -- register_copy + jmp b1 + //SEG97 startProcessing::@3 + b3: + //SEG98 [55] (byte) startProcessing::i#1 ← ++ (byte) startProcessing::i#2 -- vbuxx=_inc_vbuxx + inx + //SEG99 [56] if((byte) startProcessing::i#1!=(byte) 8) goto startProcessing::@2 -- vbuxx_neq_vbuc1_then_la1 + cpx #8 + bne b2 + //SEG100 startProcessing::@7 + //SEG101 [57] (byte~) startProcessing::freeIdx#8 ← (byte) startProcessing::freeIdx#6 -- vbuxx=vbuz1 + ldx freeIdx + jmp b4 +} +//SEG102 getCenterChar +// Find the non-space char closest to the center of the screen +// If no non-space char is found the distance will be 0xffff +getCenterChar: { + .label _9 = $1b + .label _10 = $1b + .label _11 = $1b + .label return_dist = $11 + .label x = $c + .label dist = $11 + .label screen_line = 9 + .label y = $b + .label return_x = $f + .label return_y = $10 + .label closest_dist = $d + .label closest_x = $f + .label closest_y = $10 + .label _15 = $1d + .label _16 = $1b + //SEG103 [59] phi from getCenterChar to getCenterChar::@1 [phi:getCenterChar->getCenterChar::@1] + //SEG104 [59] phi (byte) getCenterChar::closest_y#9 = (byte) 0 [phi:getCenterChar->getCenterChar::@1#0] -- vbuz1=vbuc1 + lda #0 + sta closest_y + //SEG105 [59] phi (byte) getCenterChar::closest_x#9 = (byte) 0 [phi:getCenterChar->getCenterChar::@1#1] -- vbuz1=vbuc1 + sta closest_x + //SEG106 [59] phi (word) getCenterChar::closest_dist#8 = (const word) NOT_FOUND#0 [phi:getCenterChar->getCenterChar::@1#2] -- vwuz1=vwuc1 + lda #NOT_FOUND + sta closest_dist+1 + //SEG107 [59] phi (byte) getCenterChar::y#7 = (byte) 0 [phi:getCenterChar->getCenterChar::@1#3] -- vbuz1=vbuc1 + lda #0 + sta y + //SEG108 [59] phi (byte*) getCenterChar::screen_line#4 = (const byte[$3e8]) SCREEN_COPY#0 [phi:getCenterChar->getCenterChar::@1#4] -- pbuz1=pbuc1 + lda #SCREEN_COPY + sta screen_line+1 + //SEG109 getCenterChar::@1 + b1: + //SEG110 [60] phi from getCenterChar::@1 to getCenterChar::@2 [phi:getCenterChar::@1->getCenterChar::@2] + //SEG111 [60] phi (byte) getCenterChar::closest_y#7 = (byte) getCenterChar::closest_y#9 [phi:getCenterChar::@1->getCenterChar::@2#0] -- register_copy + //SEG112 [60] phi (byte) getCenterChar::closest_x#7 = (byte) getCenterChar::closest_x#9 [phi:getCenterChar::@1->getCenterChar::@2#1] -- register_copy + //SEG113 [60] phi (word) getCenterChar::closest_dist#2 = (word) getCenterChar::closest_dist#8 [phi:getCenterChar::@1->getCenterChar::@2#2] -- register_copy + //SEG114 [60] phi (byte) getCenterChar::x#2 = (byte) 0 [phi:getCenterChar::@1->getCenterChar::@2#3] -- vbuz1=vbuc1 + lda #0 + sta x + //SEG115 getCenterChar::@2 + b2: + //SEG116 [61] if(*((byte*) getCenterChar::screen_line#4 + (byte) getCenterChar::x#2)==(byte) ' ') goto getCenterChar::@11 -- pbuz1_derefidx_vbuz2_eq_vbuc1_then_la1 + ldy x + lda (screen_line),y + cmp #' ' + bne !b11+ + jmp b11 + !b11: + //SEG117 getCenterChar::@4 + //SEG118 [62] (byte~) getCenterChar::$13 ← (byte) getCenterChar::x#2 << (byte) 1 -- vbuxx=vbuz1_rol_1 + tya + asl + tax + //SEG119 [63] (byte~) getCenterChar::$14 ← (byte) getCenterChar::y#7 << (byte) 1 -- vbuaa=vbuz1_rol_1 + lda y + asl + //SEG120 [64] (word) getCenterChar::dist#0 ← *((const word[$28]) SQUARES_X#0 + (byte~) getCenterChar::$13) + *((const word[$19]) SQUARES_Y#0 + (byte~) getCenterChar::$14) -- vwuz1=pwuc1_derefidx_vbuxx_plus_pwuc2_derefidx_vbuaa + tay + lda SQUARES_X,x + clc + adc SQUARES_Y,y + sta dist + lda SQUARES_X+1,x + adc SQUARES_Y+1,y + sta dist+1 + //SEG121 [65] if((word) getCenterChar::dist#0>=(word) getCenterChar::closest_dist#2) goto getCenterChar::@12 -- vwuz1_ge_vwuz2_then_la1 + lda closest_dist+1 + cmp dist+1 + bne !+ + lda closest_dist + cmp dist + bne !b12+ + jmp b12 + !b12: + !: + bcs !b12+ + jmp b12 + !b12: + //SEG122 getCenterChar::@5 + //SEG123 [66] (byte~) getCenterChar::return_x#7 ← (byte) getCenterChar::x#2 -- vbuz1=vbuz2 + lda x + sta return_x + //SEG124 [67] (byte~) getCenterChar::return_y#7 ← (byte) getCenterChar::y#7 -- vbuz1=vbuz2 + lda y + sta return_y + //SEG125 [68] phi from getCenterChar::@11 getCenterChar::@12 getCenterChar::@5 to getCenterChar::@3 [phi:getCenterChar::@11/getCenterChar::@12/getCenterChar::@5->getCenterChar::@3] + //SEG126 [68] phi (byte) getCenterChar::return_y#1 = (byte) getCenterChar::closest_y#7 [phi:getCenterChar::@11/getCenterChar::@12/getCenterChar::@5->getCenterChar::@3#0] -- register_copy + //SEG127 [68] phi (byte) getCenterChar::return_x#1 = (byte) getCenterChar::closest_x#7 [phi:getCenterChar::@11/getCenterChar::@12/getCenterChar::@5->getCenterChar::@3#1] -- register_copy + //SEG128 [68] phi (word) getCenterChar::return_dist#1 = (word~) getCenterChar::return_dist#5 [phi:getCenterChar::@11/getCenterChar::@12/getCenterChar::@5->getCenterChar::@3#2] -- register_copy + //SEG129 getCenterChar::@3 + b3: + //SEG130 [69] (byte) getCenterChar::x#1 ← ++ (byte) getCenterChar::x#2 -- vbuz1=_inc_vbuz1 + inc x + //SEG131 [70] if((byte) getCenterChar::x#1!=(byte) $28) goto getCenterChar::@10 -- vbuz1_neq_vbuc1_then_la1 + lda #$28 + cmp x + bne b10 + //SEG132 getCenterChar::@6 + //SEG133 [71] (byte*) getCenterChar::screen_line#1 ← (byte*) getCenterChar::screen_line#4 + (byte) $28 -- pbuz1=pbuz1_plus_vbuc1 + clc + adc screen_line + sta screen_line + bcc !+ + inc screen_line+1 + !: + //SEG134 [72] (byte) getCenterChar::y#1 ← ++ (byte) getCenterChar::y#7 -- vbuz1=_inc_vbuz1 + inc y + //SEG135 [73] if((byte) getCenterChar::y#1!=(byte) $19) goto getCenterChar::@9 -- vbuz1_neq_vbuc1_then_la1 + lda #$19 + cmp y + bne b9 + //SEG136 getCenterChar::@7 + //SEG137 [74] if((word) getCenterChar::return_dist#1==(const word) NOT_FOUND#0) goto getCenterChar::@return -- vwuz1_eq_vwuc1_then_la1 + lda return_dist + cmp #NOT_FOUND + beq breturn + !: + //SEG138 getCenterChar::@8 + //SEG139 [75] (word~) getCenterChar::$9 ← (word)(byte) getCenterChar::return_y#1 -- vwuz1=_word_vbuz2 + lda return_y + sta _9 + lda #0 + sta _9+1 + //SEG140 [76] (word) getCenterChar::$15 ← (word~) getCenterChar::$9 << (byte) 2 -- vwuz1=vwuz2_rol_2 + lda _9 + asl + sta _15 + lda _9+1 + rol + sta _15+1 + asl _15 + rol _15+1 + //SEG141 [77] (word) getCenterChar::$16 ← (word) getCenterChar::$15 + (word~) getCenterChar::$9 -- vwuz1=vwuz2_plus_vwuz1 + lda _16 + clc + adc _15 + sta _16 + lda _16+1 + adc _15+1 + sta _16+1 + //SEG142 [78] (word~) getCenterChar::$10 ← (word) getCenterChar::$16 << (byte) 3 -- vwuz1=vwuz1_rol_3 + asl _10 + rol _10+1 + asl _10 + rol _10+1 + asl _10 + rol _10+1 + //SEG143 [79] (byte*~) getCenterChar::$11 ← (const byte[$3e8]) SCREEN_COPY#0 + (word~) getCenterChar::$10 -- pbuz1=pbuc1_plus_vwuz1 + clc + lda _11 + adc #SCREEN_COPY + sta _11+1 + //SEG144 [80] *((byte*~) getCenterChar::$11 + (byte) getCenterChar::return_x#1) ← (byte) ' ' -- pbuz1_derefidx_vbuz2=vbuc1 + // clear the found char on the screen copy + lda #' ' + ldy return_x + sta (_11),y + //SEG145 getCenterChar::@return + breturn: + //SEG146 [81] return + rts + //SEG147 getCenterChar::@9 + b9: + //SEG148 [82] (word~) getCenterChar::closest_dist#10 ← (word) getCenterChar::return_dist#1 -- vwuz1=vwuz2 + lda return_dist + sta closest_dist + lda return_dist+1 + sta closest_dist+1 + //SEG149 [59] phi from getCenterChar::@9 to getCenterChar::@1 [phi:getCenterChar::@9->getCenterChar::@1] + //SEG150 [59] phi (byte) getCenterChar::closest_y#9 = (byte) getCenterChar::return_y#1 [phi:getCenterChar::@9->getCenterChar::@1#0] -- register_copy + //SEG151 [59] phi (byte) getCenterChar::closest_x#9 = (byte) getCenterChar::return_x#1 [phi:getCenterChar::@9->getCenterChar::@1#1] -- register_copy + //SEG152 [59] phi (word) getCenterChar::closest_dist#8 = (word~) getCenterChar::closest_dist#10 [phi:getCenterChar::@9->getCenterChar::@1#2] -- register_copy + //SEG153 [59] phi (byte) getCenterChar::y#7 = (byte) getCenterChar::y#1 [phi:getCenterChar::@9->getCenterChar::@1#3] -- register_copy + //SEG154 [59] phi (byte*) getCenterChar::screen_line#4 = (byte*) getCenterChar::screen_line#1 [phi:getCenterChar::@9->getCenterChar::@1#4] -- register_copy + jmp b1 + //SEG155 getCenterChar::@10 + b10: + //SEG156 [83] (word~) getCenterChar::closest_dist#12 ← (word) getCenterChar::return_dist#1 -- vwuz1=vwuz2 + lda return_dist + sta closest_dist + lda return_dist+1 + sta closest_dist+1 + //SEG157 [60] phi from getCenterChar::@10 to getCenterChar::@2 [phi:getCenterChar::@10->getCenterChar::@2] + //SEG158 [60] phi (byte) getCenterChar::closest_y#7 = (byte) getCenterChar::return_y#1 [phi:getCenterChar::@10->getCenterChar::@2#0] -- register_copy + //SEG159 [60] phi (byte) getCenterChar::closest_x#7 = (byte) getCenterChar::return_x#1 [phi:getCenterChar::@10->getCenterChar::@2#1] -- register_copy + //SEG160 [60] phi (word) getCenterChar::closest_dist#2 = (word~) getCenterChar::closest_dist#12 [phi:getCenterChar::@10->getCenterChar::@2#2] -- register_copy + //SEG161 [60] phi (byte) getCenterChar::x#2 = (byte) getCenterChar::x#1 [phi:getCenterChar::@10->getCenterChar::@2#3] -- register_copy + jmp b2 + //SEG162 getCenterChar::@12 + b12: + //SEG163 [84] (word~) getCenterChar::return_dist#6 ← (word) getCenterChar::closest_dist#2 -- vwuz1=vwuz2 + lda closest_dist + sta return_dist + lda closest_dist+1 + sta return_dist+1 + jmp b3 + //SEG164 getCenterChar::@11 + b11: + //SEG165 [85] (word~) getCenterChar::return_dist#5 ← (word) getCenterChar::closest_dist#2 -- vwuz1=vwuz2 + lda closest_dist + sta return_dist + lda closest_dist+1 + sta return_dist+1 + jmp b3 +} +//SEG166 initSquareTables +// initialize SQUARES table +initSquareTables: { + .label _6 = $15 + .label _14 = $15 + .label x = $13 + .label y = $14 + //SEG167 [87] phi from initSquareTables to initSquareTables::@1 [phi:initSquareTables->initSquareTables::@1] + //SEG168 [87] phi (byte) initSquareTables::x#2 = (byte) 0 [phi:initSquareTables->initSquareTables::@1#0] -- vbuz1=vbuc1 + lda #0 + sta x + //SEG169 [87] phi from initSquareTables::@9 to initSquareTables::@1 [phi:initSquareTables::@9->initSquareTables::@1] + //SEG170 [87] phi (byte) initSquareTables::x#2 = (byte) initSquareTables::x#1 [phi:initSquareTables::@9->initSquareTables::@1#0] -- register_copy + //SEG171 initSquareTables::@1 + b1: + //SEG172 [88] if((byte) initSquareTables::x#2<(byte) $14) goto initSquareTables::@2 -- vbuz1_lt_vbuc1_then_la1 + lda x + cmp #$14 + bcc b2 + //SEG173 initSquareTables::@3 + //SEG174 [89] (byte~) initSquareTables::$2 ← (byte) initSquareTables::x#2 - (byte) $14 -- vbuaa=vbuz1_minus_vbuc1 + sec + sbc #$14 + //SEG175 [90] phi from initSquareTables::@2 initSquareTables::@3 to initSquareTables::@4 [phi:initSquareTables::@2/initSquareTables::@3->initSquareTables::@4] + //SEG176 [90] phi (byte) initSquareTables::x_dist#0 = (byte~) initSquareTables::$4 [phi:initSquareTables::@2/initSquareTables::@3->initSquareTables::@4#0] -- register_copy + //SEG177 initSquareTables::@4 + b4: + //SEG178 [91] (byte) mul8u::a#1 ← (byte) initSquareTables::x_dist#0 -- vbuxx=vbuaa + tax + //SEG179 [92] (byte) mul8u::b#0 ← (byte) initSquareTables::x_dist#0 + //SEG180 [93] call mul8u + //SEG181 [116] phi from initSquareTables::@4 to mul8u [phi:initSquareTables::@4->mul8u] + //SEG182 [116] phi (byte) mul8u::a#6 = (byte) mul8u::a#1 [phi:initSquareTables::@4->mul8u#0] -- register_copy + //SEG183 [116] phi (word) mul8u::mb#0 = (byte) mul8u::b#0 [phi:initSquareTables::@4->mul8u#1] -- vwuz1=vbuaa + sta mul8u.mb + lda #0 + sta mul8u.mb+1 + jsr mul8u + //SEG184 [94] (word) mul8u::return#2 ← (word) mul8u::res#2 + //SEG185 initSquareTables::@9 + //SEG186 [95] (word~) initSquareTables::$6 ← (word) mul8u::return#2 + //SEG187 [96] (byte~) initSquareTables::$16 ← (byte) initSquareTables::x#2 << (byte) 1 -- vbuaa=vbuz1_rol_1 + lda x + asl + //SEG188 [97] *((const word[$28]) SQUARES_X#0 + (byte~) initSquareTables::$16) ← (word~) initSquareTables::$6 -- pwuc1_derefidx_vbuaa=vwuz1 + tay + lda _6 + sta SQUARES_X,y + lda _6+1 + sta SQUARES_X+1,y + //SEG189 [98] (byte) initSquareTables::x#1 ← ++ (byte) initSquareTables::x#2 -- vbuz1=_inc_vbuz1 + inc x + //SEG190 [99] if((byte) initSquareTables::x#1!=(byte) $28) goto initSquareTables::@1 -- vbuz1_neq_vbuc1_then_la1 + lda #$28 + cmp x + bne b1 + //SEG191 [100] phi from initSquareTables::@9 to initSquareTables::@5 [phi:initSquareTables::@9->initSquareTables::@5] + //SEG192 [100] phi (byte) initSquareTables::y#2 = (byte) 0 [phi:initSquareTables::@9->initSquareTables::@5#0] -- vbuz1=vbuc1 + lda #0 + sta y + //SEG193 [100] phi from initSquareTables::@10 to initSquareTables::@5 [phi:initSquareTables::@10->initSquareTables::@5] + //SEG194 [100] phi (byte) initSquareTables::y#2 = (byte) initSquareTables::y#1 [phi:initSquareTables::@10->initSquareTables::@5#0] -- register_copy + //SEG195 initSquareTables::@5 + b5: + //SEG196 [101] if((byte) initSquareTables::y#2<(byte) $c) goto initSquareTables::@6 -- vbuz1_lt_vbuc1_then_la1 + lda y + cmp #$c + bcc b6 + //SEG197 initSquareTables::@7 + //SEG198 [102] (byte~) initSquareTables::$10 ← (byte) initSquareTables::y#2 - (byte) $c -- vbuaa=vbuz1_minus_vbuc1 + sec + sbc #$c + //SEG199 [103] phi from initSquareTables::@6 initSquareTables::@7 to initSquareTables::@8 [phi:initSquareTables::@6/initSquareTables::@7->initSquareTables::@8] + //SEG200 [103] phi (byte) initSquareTables::y_dist#0 = (byte~) initSquareTables::$12 [phi:initSquareTables::@6/initSquareTables::@7->initSquareTables::@8#0] -- register_copy + //SEG201 initSquareTables::@8 + b8: + //SEG202 [104] (byte) mul8u::a#2 ← (byte) initSquareTables::y_dist#0 -- vbuxx=vbuaa + tax + //SEG203 [105] (byte) mul8u::b#1 ← (byte) initSquareTables::y_dist#0 + //SEG204 [106] call mul8u + //SEG205 [116] phi from initSquareTables::@8 to mul8u [phi:initSquareTables::@8->mul8u] + //SEG206 [116] phi (byte) mul8u::a#6 = (byte) mul8u::a#2 [phi:initSquareTables::@8->mul8u#0] -- register_copy + //SEG207 [116] phi (word) mul8u::mb#0 = (byte) mul8u::b#1 [phi:initSquareTables::@8->mul8u#1] -- vwuz1=vbuaa + sta mul8u.mb + lda #0 + sta mul8u.mb+1 + jsr mul8u + //SEG208 [107] (word) mul8u::return#3 ← (word) mul8u::res#2 + //SEG209 initSquareTables::@10 + //SEG210 [108] (word~) initSquareTables::$14 ← (word) mul8u::return#3 + //SEG211 [109] (byte~) initSquareTables::$17 ← (byte) initSquareTables::y#2 << (byte) 1 -- vbuaa=vbuz1_rol_1 + lda y + asl + //SEG212 [110] *((const word[$19]) SQUARES_Y#0 + (byte~) initSquareTables::$17) ← (word~) initSquareTables::$14 -- pwuc1_derefidx_vbuaa=vwuz1 + tay + lda _14 + sta SQUARES_Y,y + lda _14+1 + sta SQUARES_Y+1,y + //SEG213 [111] (byte) initSquareTables::y#1 ← ++ (byte) initSquareTables::y#2 -- vbuz1=_inc_vbuz1 + inc y + //SEG214 [112] if((byte) initSquareTables::y#1!=(byte) $19) goto initSquareTables::@5 -- vbuz1_neq_vbuc1_then_la1 + lda #$19 + cmp y + bne b5 + //SEG215 initSquareTables::@return + //SEG216 [113] return + rts + //SEG217 initSquareTables::@6 + b6: + //SEG218 [114] (byte~) initSquareTables::$12 ← (byte) $c - (byte) initSquareTables::y#2 -- vbuaa=vbuc1_minus_vbuz1 + lda #$c + sec + sbc y + jmp b8 + //SEG219 initSquareTables::@2 + b2: + //SEG220 [115] (byte~) initSquareTables::$4 ← (byte) $14 - (byte) initSquareTables::x#2 -- vbuaa=vbuc1_minus_vbuz1 + lda #$14 + sec + sbc x + jmp b4 +} +//SEG221 mul8u +// Perform binary multiplication of two unsigned 8-bit bytes into a 16-bit unsigned word +// mul8u(byte register(X) a, byte register(A) b) +mul8u: { + .label mb = $17 + .label res = $15 + .label return = $15 + //SEG222 [117] phi from mul8u to mul8u::@1 [phi:mul8u->mul8u::@1] + //SEG223 [117] phi (word) mul8u::mb#2 = (word) mul8u::mb#0 [phi:mul8u->mul8u::@1#0] -- register_copy + //SEG224 [117] phi (word) mul8u::res#2 = (byte) 0 [phi:mul8u->mul8u::@1#1] -- vwuz1=vbuc1 + lda #0 + sta res + sta res+1 + //SEG225 [117] phi (byte) mul8u::a#3 = (byte) mul8u::a#6 [phi:mul8u->mul8u::@1#2] -- register_copy + //SEG226 mul8u::@1 + b1: + //SEG227 [118] if((byte) mul8u::a#3!=(byte) 0) goto mul8u::@2 -- vbuxx_neq_0_then_la1 + cpx #0 + bne b2 + //SEG228 mul8u::@return + //SEG229 [119] return + rts + //SEG230 mul8u::@2 + b2: + //SEG231 [120] (byte~) mul8u::$1 ← (byte) mul8u::a#3 & (byte) 1 -- vbuaa=vbuxx_band_vbuc1 + txa + and #1 + //SEG232 [121] if((byte~) mul8u::$1==(byte) 0) goto mul8u::@3 -- vbuaa_eq_0_then_la1 + cmp #0 + beq b3 + //SEG233 mul8u::@4 + //SEG234 [122] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 -- vwuz1=vwuz1_plus_vwuz2 + lda res + clc + adc mb + sta res + lda res+1 + adc mb+1 + sta res+1 + //SEG235 [123] phi from mul8u::@2 mul8u::@4 to mul8u::@3 [phi:mul8u::@2/mul8u::@4->mul8u::@3] + //SEG236 [123] phi (word) mul8u::res#6 = (word) mul8u::res#2 [phi:mul8u::@2/mul8u::@4->mul8u::@3#0] -- register_copy + //SEG237 mul8u::@3 + b3: + //SEG238 [124] (byte) mul8u::a#0 ← (byte) mul8u::a#3 >> (byte) 1 -- vbuxx=vbuxx_ror_1 + txa + lsr + tax + //SEG239 [125] (word) mul8u::mb#1 ← (word) mul8u::mb#2 << (byte) 1 -- vwuz1=vwuz1_rol_1 + asl mb + rol mb+1 + //SEG240 [117] phi from mul8u::@3 to mul8u::@1 [phi:mul8u::@3->mul8u::@1] + //SEG241 [117] phi (word) mul8u::mb#2 = (word) mul8u::mb#1 [phi:mul8u::@3->mul8u::@1#0] -- register_copy + //SEG242 [117] phi (word) mul8u::res#2 = (word) mul8u::res#6 [phi:mul8u::@3->mul8u::@1#1] -- register_copy + //SEG243 [117] phi (byte) mul8u::a#3 = (byte) mul8u::a#0 [phi:mul8u::@3->mul8u::@1#2] -- register_copy + jmp b1 +} +//SEG244 setupRasterIrq +// Setup Raster IRQ +setupRasterIrq: { + .label irqRoutine = irqTop + //SEG245 asm { sei } + sei + //SEG246 [127] *((const byte*) PROCPORT_DDR#0) ← (const byte) PROCPORT_DDR_MEMORY_MASK#0 -- _deref_pbuc1=vbuc2 + // Disable kernal & basic + lda #PROCPORT_DDR_MEMORY_MASK + sta PROCPORT_DDR + //SEG247 [128] *((const byte*) PROCPORT#0) ← (const byte) PROCPORT_RAM_IO#0 -- _deref_pbuc1=vbuc2 + lda #PROCPORT_RAM_IO + sta PROCPORT + //SEG248 [129] *((const byte*) CIA1_INTERRUPT#0) ← (const byte) CIA_INTERRUPT_CLEAR#0 -- _deref_pbuc1=vbuc2 + // Disable CIA 1 Timer IRQ + lda #CIA_INTERRUPT_CLEAR + sta CIA1_INTERRUPT + //SEG249 setupRasterIrq::@1 + //SEG250 [130] *((const byte*) VIC_CONTROL#0) ← *((const byte*) VIC_CONTROL#0) & (byte) $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2 + lda #$7f + and VIC_CONTROL + sta VIC_CONTROL + //SEG251 setupRasterIrq::@2 + //SEG252 [131] *((const byte*) RASTER#0) ← <(const byte) RASTER_IRQ_TOP#0 -- _deref_pbuc1=vbuc2 + lda #RASTER_IRQ_TOP + sta RASTER + //SEG253 [132] *((const byte*) IRQ_ENABLE#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2 + // Enable Raster Interrupt + lda #IRQ_RASTER + sta IRQ_ENABLE + //SEG254 [133] *((const void()**) HARDWARE_IRQ#0) ← (const void()*) setupRasterIrq::irqRoutine#0 -- _deref_pptc1=pprc2 + // Set the IRQ routine + lda #irqRoutine + sta HARDWARE_IRQ+1 + //SEG255 asm { cli } + cli + //SEG256 setupRasterIrq::@return + //SEG257 [135] return + rts +} +//SEG258 irqBottom +// Raster Interrupt at the middle of the screen +irqBottom: { + //SEG259 entry interrupt(HARDWARE_ALL) + sta rega+1 + stx regx+1 + sty regy+1 + //SEG260 [137] phi from irqBottom to irqBottom::@1 [phi:irqBottom->irqBottom::@1] + //SEG261 [137] phi (byte) irqBottom::i#2 = (byte) 0 [phi:irqBottom->irqBottom::@1#0] -- vbuxx=vbuc1 + ldx #0 + //SEG262 [137] phi from irqBottom::@1 to irqBottom::@1 [phi:irqBottom::@1->irqBottom::@1] + //SEG263 [137] phi (byte) irqBottom::i#2 = (byte) irqBottom::i#1 [phi:irqBottom::@1->irqBottom::@1#0] -- register_copy + //SEG264 irqBottom::@1 + b1: + //SEG265 [138] (byte) irqBottom::i#1 ← ++ (byte) irqBottom::i#2 -- vbuxx=_inc_vbuxx + inx + //SEG266 [139] if((byte) irqBottom::i#1!=(byte) 5) goto irqBottom::@1 -- vbuxx_neq_vbuc1_then_la1 + cpx #5 + bne b1 + //SEG267 irqBottom::@2 + //SEG268 [140] *((const byte*) BORDERCOL#0) ← (const byte) WHITE#0 -- _deref_pbuc1=vbuc2 + lda #WHITE + sta BORDERCOL + //SEG269 [141] *((const byte*) BGCOL#0) ← (const byte) WHITE#0 -- _deref_pbuc1=vbuc2 + sta BGCOL + //SEG270 [142] call processChars + //SEG271 [149] phi from irqBottom::@2 to processChars [phi:irqBottom::@2->processChars] + jsr processChars + //SEG272 irqBottom::@3 + //SEG273 [143] *((const byte*) BORDERCOL#0) ← (const byte) LIGHT_BLUE#0 -- _deref_pbuc1=vbuc2 + lda #LIGHT_BLUE + sta BORDERCOL + //SEG274 [144] *((const byte*) BGCOL#0) ← (const byte) BLUE#0 -- _deref_pbuc1=vbuc2 + lda #BLUE + sta BGCOL + //SEG275 [145] *((const byte*) RASTER#0) ← (const byte) RASTER_IRQ_TOP#0 -- _deref_pbuc1=vbuc2 + // Trigger IRQ at the top of the screen + lda #RASTER_IRQ_TOP + sta RASTER + //SEG276 [146] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(HARDWARE_ALL)(void()) irqTop() -- _deref_pptc1=pprc2 + lda #irqTop + sta HARDWARE_IRQ+1 + //SEG277 [147] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2 + // Acknowledge the IRQ + lda #IRQ_RASTER + sta IRQ_STATUS + //SEG278 irqBottom::@return + //SEG279 [148] return - exit interrupt(HARDWARE_ALL) + rega: + lda #00 + regx: + ldx #00 + regy: + ldy #00 + rti +} +//SEG280 processChars +// Process any chars in the PROCESSING array +processChars: { + .label _2 = $21 + .label _3 = $21 + .label _4 = $21 + .label _6 = $25 + .label _7 = $25 + .label _8 = $25 + .label processing_x = $1f + .label processing_y = $20 + .label _21 = $23 + .label _22 = $21 + .label _24 = $27 + .label _25 = $25 + //SEG281 [150] phi from processChars to processChars::@1 [phi:processChars->processChars::@1] + //SEG282 [150] phi (byte) processChars::i#2 = (byte) 0 [phi:processChars->processChars::@1#0] -- vbuxx=vbuc1 + ldx #0 + //SEG283 [150] phi from processChars::@2 to processChars::@1 [phi:processChars::@2->processChars::@1] + //SEG284 [150] phi (byte) processChars::i#2 = (byte) processChars::i#1 [phi:processChars::@2->processChars::@1#0] -- register_copy + //SEG285 processChars::@1 + b1: + //SEG286 [151] (byte~) processChars::$13 ← (byte) processChars::i#2 << (byte) 2 -- vbuaa=vbuxx_rol_2 + txa + asl + asl + //SEG287 [152] if(*((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) processChars::$13)==(const word) NOT_FOUND#0) goto processChars::@2 -- pwuc1_derefidx_vbuaa_eq_vwuc2_then_la1 + tay + lda PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST,y + cmp #NOT_FOUND + bne !b2+ + jmp b2 + !b2: + !: + //SEG288 processChars::@5 + //SEG289 [153] (byte~) processChars::$14 ← (byte) processChars::i#2 << (byte) 2 -- vbuyy=vbuxx_rol_2 + txa + asl + asl + tay + //SEG290 [154] (byte) processChars::processing_x#0 ← *((byte*)(const struct ProcessingChar[8]) PROCESSING#0 + (byte~) processChars::$14) -- vbuz1=pbuc1_derefidx_vbuyy + lda PROCESSING,y + sta processing_x + //SEG291 [155] (byte) processChars::processing_y#0 ← *((byte*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y + (byte~) processChars::$14) -- vbuz1=pbuc1_derefidx_vbuyy + lda PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_Y,y + sta processing_y + //SEG292 [156] (word~) processChars::$2 ← (word)(byte) processChars::processing_y#0 -- vwuz1=_word_vbuz2 + sta _2 + lda #0 + sta _2+1 + //SEG293 [157] (word) processChars::$21 ← (word~) processChars::$2 << (byte) 2 -- vwuz1=vwuz2_rol_2 + lda _2 + asl + sta _21 + lda _2+1 + rol + sta _21+1 + asl _21 + rol _21+1 + //SEG294 [158] (word) processChars::$22 ← (word) processChars::$21 + (word~) processChars::$2 -- vwuz1=vwuz2_plus_vwuz1 + lda _22 + clc + adc _21 + sta _22 + lda _22+1 + adc _21+1 + sta _22+1 + //SEG295 [159] (word~) processChars::$3 ← (word) processChars::$22 << (byte) 3 -- vwuz1=vwuz1_rol_3 + asl _3 + rol _3+1 + asl _3 + rol _3+1 + asl _3 + rol _3+1 + //SEG296 [160] (byte*~) processChars::$4 ← (const byte*) COLS#0 + (word~) processChars::$3 -- pbuz1=pbuc1_plus_vwuz1 + clc + lda _4 + adc #COLS + sta _4+1 + //SEG297 [161] *((byte*~) processChars::$4 + (byte) processChars::processing_x#0) ← (const byte) WHITE#0 -- pbuz1_derefidx_vbuz2=vbuc1 + lda #WHITE + ldy processing_x + sta (_4),y + //SEG298 [162] (word~) processChars::$6 ← (word)(byte) processChars::processing_y#0 -- vwuz1=_word_vbuz2 + lda processing_y + sta _6 + lda #0 + sta _6+1 + //SEG299 [163] (word) processChars::$24 ← (word~) processChars::$6 << (byte) 2 -- vwuz1=vwuz2_rol_2 + lda _6 + asl + sta _24 + lda _6+1 + rol + sta _24+1 + asl _24 + rol _24+1 + //SEG300 [164] (word) processChars::$25 ← (word) processChars::$24 + (word~) processChars::$6 -- vwuz1=vwuz2_plus_vwuz1 + lda _25 + clc + adc _24 + sta _25 + lda _25+1 + adc _24+1 + sta _25+1 + //SEG301 [165] (word~) processChars::$7 ← (word) processChars::$25 << (byte) 3 -- vwuz1=vwuz1_rol_3 + asl _7 + rol _7+1 + asl _7 + rol _7+1 + asl _7 + rol _7+1 + //SEG302 [166] (byte*~) processChars::$8 ← (const byte*) SCREEN#0 + (word~) processChars::$7 -- pbuz1=pbuc1_plus_vwuz1 + clc + lda _8 + adc #SCREEN + sta _8+1 + //SEG303 [167] if(*((byte*~) processChars::$8 + (byte) processChars::processing_x#0)==(byte) ' ') goto processChars::@3 -- pbuz1_derefidx_vbuz2_eq_vbuc1_then_la1 + lda (_8),y + cmp #' ' + beq b3 + //SEG304 processChars::@6 + //SEG305 [168] if(*((byte*~) processChars::$8 + (byte) processChars::processing_x#0)>(byte) ' ') goto processChars::@4 -- pbuz1_derefidx_vbuz2_gt_vbuc1_then_la1 + lda (_8),y + cmp #' ' + beq !+ + bcs b4 + !: + //SEG306 processChars::@7 + //SEG307 [169] *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) ← ++ *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) -- pbuz1_derefidx_vbuz2=_inc_pbuz1_derefidx_vbuz2 + ldy processing_x + lda (_8),y + clc + adc #1 + sta (_8),y + //SEG308 processChars::@2 + b2: + //SEG309 [170] (byte) processChars::i#1 ← ++ (byte) processChars::i#2 -- vbuxx=_inc_vbuxx + inx + //SEG310 [171] if((byte) processChars::i#1!=(byte) 8) goto processChars::@1 -- vbuxx_neq_vbuc1_then_la1 + cpx #8 + beq !b1+ + jmp b1 + !b1: + //SEG311 processChars::@return + //SEG312 [172] return + rts + //SEG313 processChars::@4 + b4: + //SEG314 [173] *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) ← -- *((byte*~) processChars::$8 + (byte) processChars::processing_x#0) -- pbuz1_derefidx_vbuz2=_dec_pbuz1_derefidx_vbuz2 + ldy processing_x + lda (_8),y + sec + sbc #1 + sta (_8),y + jmp b2 + //SEG315 processChars::@3 + b3: + //SEG316 [174] (byte~) processChars::$15 ← (byte) processChars::i#2 << (byte) 2 -- vbuaa=vbuxx_rol_2 + txa + asl + asl + //SEG317 [175] *((word*)(const struct ProcessingChar[8]) PROCESSING#0+(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST + (byte~) processChars::$15) ← (const word) NOT_FOUND#0 -- pwuc1_derefidx_vbuaa=vwuc2 + tay + lda #NOT_FOUND + sta PROCESSING+OFFSET_STRUCT_PROCESSINGCHAR_DIST+1,y + jmp b2 +} +//SEG318 irqTop +// Raster Interrupt at the top of the screen +irqTop: { + //SEG319 entry interrupt(HARDWARE_ALL) + sta rega+1 + stx regx+1 + sty regy+1 + //SEG320 [177] phi from irqTop to irqTop::@1 [phi:irqTop->irqTop::@1] + //SEG321 [177] phi (byte) irqTop::i#2 = (byte) 0 [phi:irqTop->irqTop::@1#0] -- vbuxx=vbuc1 + ldx #0 + //SEG322 [177] phi from irqTop::@1 to irqTop::@1 [phi:irqTop::@1->irqTop::@1] + //SEG323 [177] phi (byte) irqTop::i#2 = (byte) irqTop::i#1 [phi:irqTop::@1->irqTop::@1#0] -- register_copy + //SEG324 irqTop::@1 + b1: + //SEG325 [178] (byte) irqTop::i#1 ← ++ (byte) irqTop::i#2 -- vbuxx=_inc_vbuxx + inx + //SEG326 [179] if((byte) irqTop::i#1!=(byte) 5) goto irqTop::@1 -- vbuxx_neq_vbuc1_then_la1 + cpx #5 + bne b1 + //SEG327 irqTop::@2 + //SEG328 [180] *((const byte*) BORDERCOL#0) ← (const byte) WHITE#0 -- _deref_pbuc1=vbuc2 + lda #WHITE + sta BORDERCOL + //SEG329 [181] *((const byte*) BGCOL#0) ← (const byte) WHITE#0 -- _deref_pbuc1=vbuc2 + sta BGCOL + //SEG330 [182] phi from irqTop::@2 to irqTop::@3 [phi:irqTop::@2->irqTop::@3] + //SEG331 [182] phi (byte) irqTop::i1#2 = (byte) 0 [phi:irqTop::@2->irqTop::@3#0] -- vbuxx=vbuc1 + ldx #0 + //SEG332 [182] phi from irqTop::@3 to irqTop::@3 [phi:irqTop::@3->irqTop::@3] + //SEG333 [182] phi (byte) irqTop::i1#2 = (byte) irqTop::i1#1 [phi:irqTop::@3->irqTop::@3#0] -- register_copy + //SEG334 irqTop::@3 + b3: + //SEG335 [183] (byte) irqTop::i1#1 ← ++ (byte) irqTop::i1#2 -- vbuxx=_inc_vbuxx + inx + //SEG336 [184] if((byte) irqTop::i1#1!=(byte) 8) goto irqTop::@3 -- vbuxx_neq_vbuc1_then_la1 + cpx #8 + bne b3 + //SEG337 irqTop::@4 + //SEG338 [185] *((const byte*) BORDERCOL#0) ← (const byte) LIGHT_BLUE#0 -- _deref_pbuc1=vbuc2 + lda #LIGHT_BLUE + sta BORDERCOL + //SEG339 [186] *((const byte*) BGCOL#0) ← (const byte) BLUE#0 -- _deref_pbuc1=vbuc2 + lda #BLUE + sta BGCOL + //SEG340 [187] *((const byte*) RASTER#0) ← (const byte) RASTER_IRQ_MIDDLE#0 -- _deref_pbuc1=vbuc2 + // Trigger IRQ at the middle of the screen + lda #RASTER_IRQ_MIDDLE + sta RASTER + //SEG341 [188] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(HARDWARE_ALL)(void()) irqBottom() -- _deref_pptc1=pprc2 + lda #irqBottom + sta HARDWARE_IRQ+1 + //SEG342 [189] *((const byte*) IRQ_STATUS#0) ← (const byte) IRQ_RASTER#0 -- _deref_pbuc1=vbuc2 + // Acknowledge the IRQ + lda #IRQ_RASTER + sta IRQ_STATUS + //SEG343 irqTop::@return + //SEG344 [190] return - exit interrupt(HARDWARE_ALL) + rega: + lda #00 + regx: + ldx #00 + regy: + ldy #00 + rti +} + // Copy of the screen used for finding chars to process + SCREEN_COPY: .fill $3e8, 0 + // Chars currently being processed in the interrupt + PROCESSING: .fill 4*8, 0 + // SQUARES_X[i] = (i-20)*(i-20) + SQUARES_X: .fill 2*$28, 0 + // SQUARES_Y[i] = (i-12)*(i-12) + SQUARES_Y: .fill 2*$19, 0 + diff --git a/src/test/ref/complex/blackhole/blackhole.sym b/src/test/ref/complex/blackhole/blackhole.sym new file mode 100644 index 000000000..157e0a3e5 --- /dev/null +++ b/src/test/ref/complex/blackhole/blackhole.sym @@ -0,0 +1,348 @@ +(label) @1 +(label) @begin +(label) @end +(byte*) BGCOL +(const byte*) BGCOL#0 BGCOL = (byte*) 53281 +(byte) BLUE +(const byte) BLUE#0 BLUE = (byte) 6 +(byte*) BORDERCOL +(const byte*) BORDERCOL#0 BORDERCOL = (byte*) 53280 +(byte*) CIA1_INTERRUPT +(const byte*) CIA1_INTERRUPT#0 CIA1_INTERRUPT = (byte*) 56333 +(byte) CIA_INTERRUPT_CLEAR +(const byte) CIA_INTERRUPT_CLEAR#0 CIA_INTERRUPT_CLEAR = (byte) $7f +(byte*) COLS +(const byte*) COLS#0 COLS = (byte*) 55296 +(void()**) HARDWARE_IRQ +(const void()**) HARDWARE_IRQ#0 HARDWARE_IRQ = (void()**) 65534 +(byte*) IRQ_ENABLE +(const byte*) IRQ_ENABLE#0 IRQ_ENABLE = (byte*) 53274 +(byte) IRQ_RASTER +(const byte) IRQ_RASTER#0 IRQ_RASTER = (byte) 1 +(byte*) IRQ_STATUS +(const byte*) IRQ_STATUS#0 IRQ_STATUS = (byte*) 53273 +(byte) LIGHT_BLUE +(const byte) LIGHT_BLUE#0 LIGHT_BLUE = (byte) $e +(word) NOT_FOUND +(const word) NOT_FOUND#0 NOT_FOUND = (word) $ffff +(const byte) OFFSET_STRUCT_PROCESSINGCHAR_DIST OFFSET_STRUCT_PROCESSINGCHAR_DIST = (byte) 2 +(const byte) OFFSET_STRUCT_PROCESSINGCHAR_Y OFFSET_STRUCT_PROCESSINGCHAR_Y = (byte) 1 +(struct ProcessingChar[8]) PROCESSING +(const struct ProcessingChar[8]) PROCESSING#0 PROCESSING = { fill( 8, 0) } +(byte*) PROCPORT +(const byte*) PROCPORT#0 PROCPORT = (byte*) 1 +(byte*) PROCPORT_DDR +(const byte*) PROCPORT_DDR#0 PROCPORT_DDR = (byte*) 0 +(byte) PROCPORT_DDR_MEMORY_MASK +(const byte) PROCPORT_DDR_MEMORY_MASK#0 PROCPORT_DDR_MEMORY_MASK = (byte) 7 +(byte) PROCPORT_RAM_IO +(const byte) PROCPORT_RAM_IO#0 PROCPORT_RAM_IO = (byte) $35 +(word) ProcessingChar::dist +(byte) ProcessingChar::x +(byte) ProcessingChar::y +(byte*) RASTER +(const byte*) RASTER#0 RASTER = (byte*) 53266 +(byte) RASTER_IRQ_MIDDLE +(const byte) RASTER_IRQ_MIDDLE#0 RASTER_IRQ_MIDDLE = (byte) $ff +(byte) RASTER_IRQ_TOP +(const byte) RASTER_IRQ_TOP#0 RASTER_IRQ_TOP = (byte) $30 +(byte*) SCREEN +(const byte*) SCREEN#0 SCREEN = (byte*) 1024 +(byte[$3e8]) SCREEN_COPY +(const byte[$3e8]) SCREEN_COPY#0 SCREEN_COPY = { fill( $3e8, 0) } +(word[$28]) SQUARES_X +(const word[$28]) SQUARES_X#0 SQUARES_X = { fill( $28, 0) } +(word[$19]) SQUARES_Y +(const word[$19]) SQUARES_Y#0 SQUARES_Y = { fill( $19, 0) } +(byte*) VIC_CONTROL +(const byte*) VIC_CONTROL#0 VIC_CONTROL = (byte*) 53265 +(byte) WHITE +(const byte) WHITE#0 WHITE = (byte) 1 +(struct ProcessingChar()) getCenterChar() +(word~) getCenterChar::$10 $10 zp ZP_WORD:27 4.0 +(byte*~) getCenterChar::$11 $11 zp ZP_WORD:27 4.0 +(byte~) getCenterChar::$13 reg byte x 1001.0 +(byte~) getCenterChar::$14 reg byte a 2002.0 +(word) getCenterChar::$15 $15 zp ZP_WORD:29 4.0 +(word) getCenterChar::$16 $16 zp ZP_WORD:27 4.0 +(word~) getCenterChar::$9 $9 zp ZP_WORD:27 3.0 +(label) getCenterChar::@1 +(label) getCenterChar::@10 +(label) getCenterChar::@11 +(label) getCenterChar::@12 +(label) getCenterChar::@2 +(label) getCenterChar::@3 +(label) getCenterChar::@4 +(label) getCenterChar::@5 +(label) getCenterChar::@6 +(label) getCenterChar::@7 +(label) getCenterChar::@8 +(label) getCenterChar::@9 +(label) getCenterChar::@return +(struct ProcessingChar) getCenterChar::closest +(word) getCenterChar::closest_dist +(word~) getCenterChar::closest_dist#10 closest_dist zp ZP_WORD:13 202.0 +(word~) getCenterChar::closest_dist#12 closest_dist zp ZP_WORD:13 2002.0 +(word) getCenterChar::closest_dist#2 closest_dist zp ZP_WORD:13 684.1666666666667 +(word) getCenterChar::closest_dist#8 closest_dist zp ZP_WORD:13 202.0 +(byte) getCenterChar::closest_x +(byte) getCenterChar::closest_x#7 closest_x zp ZP_BYTE:15 388.0 +(byte) getCenterChar::closest_x#9 closest_x zp ZP_BYTE:15 202.0 +(byte) getCenterChar::closest_y +(byte) getCenterChar::closest_y#7 closest_y zp ZP_BYTE:16 388.0 +(byte) getCenterChar::closest_y#9 closest_y zp ZP_BYTE:16 202.0 +(word) getCenterChar::dist +(word) getCenterChar::dist#0 dist zp ZP_WORD:17 750.75 +(struct ProcessingChar) getCenterChar::return +(word) getCenterChar::return_dist +(word) getCenterChar::return_dist#0 return_dist zp ZP_WORD:17 7.333333333333333 +(word) getCenterChar::return_dist#1 return_dist zp ZP_WORD:17 242.23529411764704 +(word~) getCenterChar::return_dist#5 return_dist zp ZP_WORD:17 2002.0 +(word~) getCenterChar::return_dist#6 return_dist zp ZP_WORD:17 2002.0 +(byte) getCenterChar::return_x +(byte) getCenterChar::return_x#0 reg byte x 7.333333333333333 +(byte) getCenterChar::return_x#1 return_x zp ZP_BYTE:15 242.23529411764704 +(byte~) getCenterChar::return_x#7 return_x zp ZP_BYTE:15 1001.0 +(byte) getCenterChar::return_y +(byte) getCenterChar::return_y#0 reg byte y 7.333333333333333 +(byte) getCenterChar::return_y#1 return_y zp ZP_BYTE:16 228.66666666666669 +(byte~) getCenterChar::return_y#7 return_y zp ZP_BYTE:16 2002.0 +(byte*) getCenterChar::screen_line +(byte*) getCenterChar::screen_line#1 screen_line zp ZP_WORD:9 50.5 +(byte*) getCenterChar::screen_line#4 screen_line zp ZP_WORD:9 80.2 +(byte) getCenterChar::x +(byte) getCenterChar::x#1 x zp ZP_BYTE:12 1001.0 +(byte) getCenterChar::x#2 x zp ZP_BYTE:12 455.0 +(byte) getCenterChar::y +(byte) getCenterChar::y#1 y zp ZP_BYTE:11 101.0 +(byte) getCenterChar::y#7 y zp ZP_BYTE:11 137.75 +(void()) initSquareTables() +(byte~) initSquareTables::$10 reg byte a 22.0 +(byte~) initSquareTables::$12 reg byte a 22.0 +(word~) initSquareTables::$14 $14 zp ZP_WORD:21 11.0 +(byte~) initSquareTables::$16 reg byte a 22.0 +(byte~) initSquareTables::$17 reg byte a 22.0 +(byte~) initSquareTables::$2 reg byte a 22.0 +(byte~) initSquareTables::$4 reg byte a 22.0 +(word~) initSquareTables::$6 $6 zp ZP_WORD:21 11.0 +(label) initSquareTables::@1 +(label) initSquareTables::@10 +(label) initSquareTables::@2 +(label) initSquareTables::@3 +(label) initSquareTables::@4 +(label) initSquareTables::@5 +(label) initSquareTables::@6 +(label) initSquareTables::@7 +(label) initSquareTables::@8 +(label) initSquareTables::@9 +(label) initSquareTables::@return +(byte) initSquareTables::x +(byte) initSquareTables::x#1 x zp ZP_BYTE:19 16.5 +(byte) initSquareTables::x#2 x zp ZP_BYTE:19 5.5 +(byte) initSquareTables::x_dist +(byte) initSquareTables::x_dist#0 reg byte a 22.0 +(byte) initSquareTables::y +(byte) initSquareTables::y#1 y zp ZP_BYTE:20 16.5 +(byte) initSquareTables::y#2 y zp ZP_BYTE:20 5.5 +(byte) initSquareTables::y_dist +(byte) initSquareTables::y_dist#0 reg byte a 22.0 +interrupt(HARDWARE_ALL)(void()) irqBottom() +(label) irqBottom::@1 +(label) irqBottom::@2 +(label) irqBottom::@3 +(label) irqBottom::@return +(byte) irqBottom::i +(byte) irqBottom::i#1 reg byte x 16.5 +(byte) irqBottom::i#2 reg byte x 22.0 +interrupt(HARDWARE_ALL)(void()) irqTop() +(label) irqTop::@1 +(label) irqTop::@2 +(label) irqTop::@3 +(label) irqTop::@4 +(label) irqTop::@return +(byte) irqTop::i +(byte) irqTop::i#1 reg byte x 16.5 +(byte) irqTop::i#2 reg byte x 22.0 +(byte) irqTop::i1 +(byte) irqTop::i1#1 reg byte x 16.5 +(byte) irqTop::i1#2 reg byte x 22.0 +(void()) main() +(struct ProcessingChar~) main::$11 +(byte~) main::$18 reg byte y 14.666666666666666 +(byte~) main::$5 reg byte a 22.0 +(byte~) main::$6 reg byte a 22.0 +(byte~) main::$7 reg byte a 22.0 +(label) main::@1 +(label) main::@2 +(label) main::@3 +(label) main::@4 +(label) main::@5 +(label) main::@6 +(label) main::@7 +(label) main::@8 +(label) main::@9 +(struct ProcessingChar) main::center +(word) main::center_dist +(word) main::center_dist#0 center_dist zp ZP_WORD:17 8.25 +(byte) main::center_x +(byte) main::center_x#0 reg byte x 5.5 +(byte) main::center_y +(byte) main::center_y#0 reg byte y 5.5 +(byte*) main::dst +(byte*) main::dst#1 dst zp ZP_WORD:6 11.0 +(byte*) main::dst#2 dst zp ZP_WORD:6 11.0 +(byte) main::i +(byte) main::i#1 reg byte x 16.5 +(byte) main::i#2 reg byte x 6.6000000000000005 +(byte*) main::sc +(byte*) main::sc#1 sc zp ZP_WORD:2 16.5 +(byte*) main::sc#2 sc zp ZP_WORD:2 8.8 +(byte*) main::src +(byte*) main::src#1 src zp ZP_WORD:4 11.0 +(byte*) main::src#2 src zp ZP_WORD:4 16.5 +(word()) mul8u((byte) mul8u::a , (byte) mul8u::b) +(byte~) mul8u::$1 reg byte a 202.0 +(label) mul8u::@1 +(label) mul8u::@2 +(label) mul8u::@3 +(label) mul8u::@4 +(label) mul8u::@return +(byte) mul8u::a +(byte) mul8u::a#0 reg byte x 101.0 +(byte) mul8u::a#1 reg byte x 11.0 +(byte) mul8u::a#2 reg byte x 11.0 +(byte) mul8u::a#3 reg byte x 67.66666666666666 +(byte) mul8u::a#6 reg byte x 24.0 +(byte) mul8u::b +(byte) mul8u::b#0 reg byte a 22.0 +(byte) mul8u::b#1 reg byte a 22.0 +(word) mul8u::mb +(word) mul8u::mb#0 mb zp ZP_WORD:23 24.0 +(word) mul8u::mb#1 mb zp ZP_WORD:23 202.0 +(word) mul8u::mb#2 mb zp ZP_WORD:23 43.57142857142858 +(word) mul8u::res +(word) mul8u::res#1 res zp ZP_WORD:21 202.0 +(word) mul8u::res#2 res zp ZP_WORD:21 46.42857142857143 +(word) mul8u::res#6 res zp ZP_WORD:21 101.0 +(word) mul8u::return +(word) mul8u::return#2 return zp ZP_WORD:21 22.0 +(word) mul8u::return#3 return zp ZP_WORD:21 22.0 +(void()) processChars() +(byte~) processChars::$13 reg byte a 22.0 +(byte~) processChars::$14 reg byte y 16.5 +(byte~) processChars::$15 reg byte a 22.0 +(word~) processChars::$2 $2 zp ZP_WORD:33 16.5 +(word) processChars::$21 $21 zp ZP_WORD:35 22.0 +(word) processChars::$22 $22 zp ZP_WORD:33 22.0 +(word) processChars::$24 $24 zp ZP_WORD:39 22.0 +(word) processChars::$25 $25 zp ZP_WORD:37 22.0 +(word~) processChars::$3 $3 zp ZP_WORD:33 22.0 +(byte*~) processChars::$4 $4 zp ZP_WORD:33 22.0 +(word~) processChars::$6 $6 zp ZP_WORD:37 16.5 +(word~) processChars::$7 $7 zp ZP_WORD:37 22.0 +(byte*~) processChars::$8 $8 zp ZP_WORD:37 25.666666666666668 +(label) processChars::@1 +(label) processChars::@2 +(label) processChars::@3 +(label) processChars::@4 +(label) processChars::@5 +(label) processChars::@6 +(label) processChars::@7 +(label) processChars::@return +(byte) processChars::i +(byte) processChars::i#1 reg byte x 16.5 +(byte) processChars::i#2 reg byte x 2.391304347826087 +(struct ProcessingChar) processChars::processing +(byte*) processChars::processing_ptr +(byte) processChars::processing_x +(byte) processChars::processing_x#0 processing_x zp ZP_BYTE:31 5.866666666666666 +(byte) processChars::processing_y +(byte) processChars::processing_y#0 processing_y zp ZP_BYTE:32 1.5714285714285714 +(void()) setupRasterIrq((word) setupRasterIrq::raster , (void()*) setupRasterIrq::irqRoutine) +(label) setupRasterIrq::@1 +(label) setupRasterIrq::@2 +(label) setupRasterIrq::@return +(void()*) setupRasterIrq::irqRoutine +(const void()*) setupRasterIrq::irqRoutine#0 irqRoutine = &interrupt(HARDWARE_ALL)(void()) irqTop() +(word) setupRasterIrq::raster +(void()) startProcessing((byte) startProcessing::center_x , (byte) startProcessing::center_y , (word) startProcessing::center_dist) +(byte~) startProcessing::$4 reg byte a 2002.0 +(byte~) startProcessing::$5 reg byte x 2.6666666666666665 +(label) startProcessing::@1 +(label) startProcessing::@2 +(label) startProcessing::@3 +(label) startProcessing::@4 +(label) startProcessing::@5 +(label) startProcessing::@6 +(label) startProcessing::@7 +(label) startProcessing::@return +(struct ProcessingChar) startProcessing::center +(word) startProcessing::center_dist +(word) startProcessing::center_dist#0 center_dist zp ZP_WORD:17 0.8666666666666666 +(byte) startProcessing::center_x +(byte) startProcessing::center_x#0 center_x zp ZP_BYTE:25 0.8666666666666666 +(byte) startProcessing::center_y +(byte) startProcessing::center_y#0 center_y zp ZP_BYTE:26 0.8666666666666666 +(byte) startProcessing::freeIdx +(byte) startProcessing::freeIdx#2 reg byte x 653.0 +(byte) startProcessing::freeIdx#6 freeIdx zp ZP_BYTE:8 33.666666666666664 +(byte~) startProcessing::freeIdx#7 freeIdx zp ZP_BYTE:8 202.0 +(byte~) startProcessing::freeIdx#8 reg byte x 202.0 +(byte) startProcessing::i +(byte) startProcessing::i#1 reg byte x 1501.5 +(byte) startProcessing::i#2 reg byte x 1334.6666666666667 + +reg byte x [ main::i#2 main::i#1 ] +zp ZP_WORD:2 [ main::sc#2 main::sc#1 ] +zp ZP_WORD:4 [ main::src#2 main::src#1 ] +zp ZP_WORD:6 [ main::dst#2 main::dst#1 ] +zp ZP_BYTE:8 [ startProcessing::freeIdx#6 startProcessing::freeIdx#7 ] +reg byte x [ startProcessing::freeIdx#2 startProcessing::freeIdx#8 startProcessing::i#2 startProcessing::i#1 ] +zp ZP_WORD:9 [ getCenterChar::screen_line#4 getCenterChar::screen_line#1 ] +zp ZP_BYTE:11 [ getCenterChar::y#7 getCenterChar::y#1 ] +zp ZP_BYTE:12 [ getCenterChar::x#2 getCenterChar::x#1 ] +zp ZP_WORD:13 [ getCenterChar::closest_dist#2 getCenterChar::closest_dist#8 getCenterChar::closest_dist#10 getCenterChar::closest_dist#12 ] +zp ZP_BYTE:15 [ getCenterChar::closest_x#7 getCenterChar::closest_x#9 getCenterChar::return_x#1 getCenterChar::return_x#7 ] +zp ZP_BYTE:16 [ getCenterChar::closest_y#7 getCenterChar::closest_y#9 getCenterChar::return_y#1 getCenterChar::return_y#7 ] +zp ZP_WORD:17 [ getCenterChar::return_dist#1 getCenterChar::return_dist#5 getCenterChar::return_dist#6 getCenterChar::dist#0 getCenterChar::return_dist#0 main::center_dist#0 startProcessing::center_dist#0 ] +zp ZP_BYTE:19 [ initSquareTables::x#2 initSquareTables::x#1 ] +reg byte a [ initSquareTables::x_dist#0 initSquareTables::$4 initSquareTables::$2 ] +zp ZP_BYTE:20 [ initSquareTables::y#2 initSquareTables::y#1 ] +reg byte a [ initSquareTables::y_dist#0 initSquareTables::$12 initSquareTables::$10 ] +reg byte a [ mul8u::b#1 ] +reg byte a [ mul8u::b#0 ] +reg byte x [ mul8u::a#3 mul8u::a#6 mul8u::a#2 mul8u::a#1 mul8u::a#0 ] +zp ZP_WORD:21 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 mul8u::return#3 initSquareTables::$6 initSquareTables::$14 ] +zp ZP_WORD:23 [ mul8u::mb#2 mul8u::mb#0 mul8u::mb#1 ] +reg byte x [ irqBottom::i#2 irqBottom::i#1 ] +reg byte x [ processChars::i#2 processChars::i#1 ] +reg byte x [ irqTop::i#2 irqTop::i#1 ] +reg byte x [ irqTop::i1#2 irqTop::i1#1 ] +reg byte y [ main::$18 ] +reg byte a [ main::$5 ] +reg byte a [ main::$6 ] +reg byte a [ main::$7 ] +reg byte x [ getCenterChar::return_x#0 ] +reg byte y [ getCenterChar::return_y#0 ] +reg byte x [ main::center_x#0 ] +reg byte y [ main::center_y#0 ] +zp ZP_BYTE:25 [ startProcessing::center_x#0 ] +zp ZP_BYTE:26 [ startProcessing::center_y#0 ] +reg byte a [ startProcessing::$4 ] +reg byte x [ startProcessing::$5 ] +reg byte x [ getCenterChar::$13 ] +reg byte a [ getCenterChar::$14 ] +zp ZP_WORD:27 [ getCenterChar::$9 getCenterChar::$16 getCenterChar::$10 getCenterChar::$11 ] +zp ZP_WORD:29 [ getCenterChar::$15 ] +reg byte a [ initSquareTables::$16 ] +reg byte a [ initSquareTables::$17 ] +reg byte a [ mul8u::$1 ] +reg byte a [ processChars::$13 ] +reg byte y [ processChars::$14 ] +zp ZP_BYTE:31 [ processChars::processing_x#0 ] +zp ZP_BYTE:32 [ processChars::processing_y#0 ] +zp ZP_WORD:33 [ processChars::$2 processChars::$22 processChars::$3 processChars::$4 ] +zp ZP_WORD:35 [ processChars::$21 ] +zp ZP_WORD:37 [ processChars::$6 processChars::$25 processChars::$7 processChars::$8 ] +zp ZP_WORD:39 [ processChars::$24 ] +reg byte a [ processChars::$15 ] diff --git a/src/test/ref/unused-irq.asm b/src/test/ref/unused-irq.asm new file mode 100644 index 000000000..c127a915c --- /dev/null +++ b/src/test/ref/unused-irq.asm @@ -0,0 +1,27 @@ +// Unused interrupts pointing to each other but never used from main loop - should be optimized away +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" + .label SCREEN = $400 + .label HARDWARE_IRQ = $fffe +main: { + lda #'x' + sta SCREEN + rts +} +// Unused Interrupt Routine +irq2: { + lda #irq1 + sta HARDWARE_IRQ+1 + jmp $ea81 +} +// Unused Interrupt Routine +irq1: { + lda #irq2 + sta HARDWARE_IRQ+1 + jmp $ea81 +} diff --git a/src/test/ref/unused-irq.cfg b/src/test/ref/unused-irq.cfg new file mode 100644 index 000000000..6d61e4af4 --- /dev/null +++ b/src/test/ref/unused-irq.cfg @@ -0,0 +1,27 @@ +@begin: scope:[] from + [0] phi() + to:@1 +@1: scope:[] from @begin + [1] phi() + [2] call main + to:@end +@end: scope:[] from @1 + [3] phi() +main: scope:[main] from @1 + [4] *((const byte*) SCREEN#0) ← (byte) 'x' + to:main::@return +main::@return: scope:[main] from main + [5] return + to:@return +irq2: scope:[irq2] from + [6] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq1() + to:irq2::@return +irq2::@return: scope:[irq2] from irq2 + [7] return + to:@return +irq1: scope:[irq1] from + [8] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq2() + to:irq1::@return +irq1::@return: scope:[irq1] from irq1 + [9] return + to:@return diff --git a/src/test/ref/unused-irq.log b/src/test/ref/unused-irq.log new file mode 100644 index 000000000..70f9284a1 --- /dev/null +++ b/src/test/ref/unused-irq.log @@ -0,0 +1,373 @@ +Resolved forward reference irq2 to interrupt(KERNEL_MIN)(void()) irq2() +Adding pointer type conversion cast (byte*) SCREEN in (byte*) SCREEN ← (number) $400 +Adding pointer type conversion cast (void()**) HARDWARE_IRQ in (void()**) HARDWARE_IRQ ← (number) $fffe +Culled Empty Block (label) @2 + +CONTROL FLOW GRAPH SSA +@begin: scope:[] from + (byte*) SCREEN#0 ← ((byte*)) (number) $400 + to:@1 +main: scope:[main] from @3 + *((byte*) SCREEN#0) ← (byte) 'x' + to:main::@return +main::@return: scope:[main] from main + return + to:@return +@1: scope:[] from @begin + (void()**) HARDWARE_IRQ#0 ← ((void()**)) (number) $fffe + to:@3 +irq1: scope:[irq1] from + (void()*~) irq1::$0 ← & interrupt(KERNEL_MIN)(void()) irq2() + *((void()**) HARDWARE_IRQ#0) ← (void()*~) irq1::$0 + to:irq1::@return +irq1::@return: scope:[irq1] from irq1 + return + to:@return +irq2: scope:[irq2] from + (void()*~) irq2::$0 ← & interrupt(KERNEL_MIN)(void()) irq1() + *((void()**) HARDWARE_IRQ#0) ← (void()*~) irq2::$0 + to:irq2::@return +irq2::@return: scope:[irq2] from irq2 + return + to:@return +@3: scope:[] from @1 + call main + to:@4 +@4: scope:[] from @3 + to:@end +@end: scope:[] from @4 + +SYMBOL TABLE SSA +(label) @1 +(label) @3 +(label) @4 +(label) @begin +(label) @end +(void()**) HARDWARE_IRQ +(void()**) HARDWARE_IRQ#0 +(byte*) SCREEN +(byte*) SCREEN#0 +interrupt(KERNEL_MIN)(void()) irq1() +(void()*~) irq1::$0 +(label) irq1::@return +interrupt(KERNEL_MIN)(void()) irq2() +(void()*~) irq2::$0 +(label) irq2::@return +(void()) main() +(label) main::@return + +Inlining cast (byte*) SCREEN#0 ← (byte*)(number) $400 +Inlining cast (void()**) HARDWARE_IRQ#0 ← (void()**)(number) $fffe +Successful SSA optimization Pass2InlineCast +Simplifying constant pointer cast (byte*) 1024 +Simplifying constant pointer cast (void()**) 65534 +Successful SSA optimization PassNCastSimplification +Constant right-side identified [4] (void()*~) irq1::$0 ← & interrupt(KERNEL_MIN)(void()) irq2() +Constant right-side identified [7] (void()*~) irq2::$0 ← & interrupt(KERNEL_MIN)(void()) irq1() +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant (const byte*) SCREEN#0 = (byte*) 1024 +Constant (const void()**) HARDWARE_IRQ#0 = (void()**) 65534 +Constant (const void()*) irq1::$0 = &irq2 +Constant (const void()*) irq2::$0 = &irq1 +Successful SSA optimization Pass2ConstantIdentification +Constant inlined irq1::$0 = &interrupt(KERNEL_MIN)(void()) irq2() +Constant inlined irq2::$0 = &interrupt(KERNEL_MIN)(void()) irq1() +Successful SSA optimization Pass2ConstantInlining +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @1 +Adding NOP phi() at start of @3 +Adding NOP phi() at start of @4 +Adding NOP phi() at start of @end +CALL GRAPH +Calls in [] to main:3 + +Created 0 initial phi equivalence classes +Coalesced down to 0 phi equivalence classes +Culled Empty Block (label) @1 +Culled Empty Block (label) @4 +Renumbering block @3 to @1 +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @1 +Adding NOP phi() at start of @end + +FINAL CONTROL FLOW GRAPH +@begin: scope:[] from + [0] phi() + to:@1 +@1: scope:[] from @begin + [1] phi() + [2] call main + to:@end +@end: scope:[] from @1 + [3] phi() +main: scope:[main] from @1 + [4] *((const byte*) SCREEN#0) ← (byte) 'x' + to:main::@return +main::@return: scope:[main] from main + [5] return + to:@return +irq2: scope:[irq2] from + [6] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq1() + to:irq2::@return +irq2::@return: scope:[irq2] from irq2 + [7] return + to:@return +irq1: scope:[irq1] from + [8] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq2() + to:irq1::@return +irq1::@return: scope:[irq1] from irq1 + [9] return + to:@return + + +VARIABLE REGISTER WEIGHTS +(void()**) HARDWARE_IRQ +(byte*) SCREEN +interrupt(KERNEL_MIN)(void()) irq1() +interrupt(KERNEL_MIN)(void()) irq2() +(void()) main() + +Initial phi equivalence classes +Complete equivalence classes + +INITIAL ASM +//SEG0 File Comments +// Unused interrupts pointing to each other but never used from main loop - should be optimized away +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(bbegin) +.pc = $80d "Program" +//SEG2 Global Constants & labels + .label SCREEN = $400 + .label HARDWARE_IRQ = $fffe +//SEG3 @begin +bbegin: +//SEG4 [1] phi from @begin to @1 [phi:@begin->@1] +b1_from_bbegin: + jmp b1 +//SEG5 @1 +b1: +//SEG6 [2] call main + jsr main +//SEG7 [3] phi from @1 to @end [phi:@1->@end] +bend_from_b1: + jmp bend +//SEG8 @end +bend: +//SEG9 main +main: { + //SEG10 [4] *((const byte*) SCREEN#0) ← (byte) 'x' -- _deref_pbuc1=vbuc2 + lda #'x' + sta SCREEN + jmp breturn + //SEG11 main::@return + breturn: + //SEG12 [5] return + rts +} +//SEG13 irq2 +// Unused Interrupt Routine +irq2: { + //SEG14 entry interrupt(KERNEL_MIN) + //SEG15 [6] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq1() -- _deref_pptc1=pprc2 + lda #irq1 + sta HARDWARE_IRQ+1 + jmp breturn + //SEG16 irq2::@return + breturn: + //SEG17 [7] return - exit interrupt(KERNEL_MIN) + jmp $ea81 +} +//SEG18 irq1 +// Unused Interrupt Routine +irq1: { + //SEG19 entry interrupt(KERNEL_MIN) + //SEG20 [8] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq2() -- _deref_pptc1=pprc2 + lda #irq2 + sta HARDWARE_IRQ+1 + jmp breturn + //SEG21 irq1::@return + breturn: + //SEG22 [9] return - exit interrupt(KERNEL_MIN) + jmp $ea81 +} + +REGISTER UPLIFT POTENTIAL REGISTERS +Statement [4] *((const byte*) SCREEN#0) ← (byte) 'x' [ ] ( main:2 [ ] ) always clobbers reg byte a +Statement [6] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq1() [ ] ( [ ] ) always clobbers reg byte a +Statement [8] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq2() [ ] ( [ ] ) always clobbers reg byte a + +REGISTER UPLIFT SCOPES +Uplift Scope [main] +Uplift Scope [irq1] +Uplift Scope [irq2] +Uplift Scope [] + +Uplifting [main] best 63 combination +Uplifting [irq1] best 63 combination +Uplifting [irq2] best 63 combination +Uplifting [] best 63 combination + +ASSEMBLER BEFORE OPTIMIZATION +//SEG0 File Comments +// Unused interrupts pointing to each other but never used from main loop - should be optimized away +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(bbegin) +.pc = $80d "Program" +//SEG2 Global Constants & labels + .label SCREEN = $400 + .label HARDWARE_IRQ = $fffe +//SEG3 @begin +bbegin: +//SEG4 [1] phi from @begin to @1 [phi:@begin->@1] +b1_from_bbegin: + jmp b1 +//SEG5 @1 +b1: +//SEG6 [2] call main + jsr main +//SEG7 [3] phi from @1 to @end [phi:@1->@end] +bend_from_b1: + jmp bend +//SEG8 @end +bend: +//SEG9 main +main: { + //SEG10 [4] *((const byte*) SCREEN#0) ← (byte) 'x' -- _deref_pbuc1=vbuc2 + lda #'x' + sta SCREEN + jmp breturn + //SEG11 main::@return + breturn: + //SEG12 [5] return + rts +} +//SEG13 irq2 +// Unused Interrupt Routine +irq2: { + //SEG14 entry interrupt(KERNEL_MIN) + //SEG15 [6] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq1() -- _deref_pptc1=pprc2 + lda #irq1 + sta HARDWARE_IRQ+1 + jmp breturn + //SEG16 irq2::@return + breturn: + //SEG17 [7] return - exit interrupt(KERNEL_MIN) + jmp $ea81 +} +//SEG18 irq1 +// Unused Interrupt Routine +irq1: { + //SEG19 entry interrupt(KERNEL_MIN) + //SEG20 [8] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq2() -- _deref_pptc1=pprc2 + lda #irq2 + sta HARDWARE_IRQ+1 + jmp breturn + //SEG21 irq1::@return + breturn: + //SEG22 [9] return - exit interrupt(KERNEL_MIN) + jmp $ea81 +} + +ASSEMBLER OPTIMIZATIONS +Removing instruction jmp b1 +Removing instruction jmp bend +Removing instruction jmp breturn +Removing instruction jmp breturn +Removing instruction jmp breturn +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction b1_from_bbegin: +Removing instruction b1: +Removing instruction bend_from_b1: +Succesful ASM optimization Pass5RedundantLabelElimination +Removing instruction bend: +Removing instruction breturn: +Removing instruction breturn: +Removing instruction breturn: +Succesful ASM optimization Pass5UnusedLabelElimination +Updating BasicUpstart to call main directly +Removing instruction jsr main +Succesful ASM optimization Pass5SkipBegin +Removing instruction bbegin: +Succesful ASM optimization Pass5UnusedLabelElimination + +FINAL SYMBOL TABLE +(label) @1 +(label) @begin +(label) @end +(void()**) HARDWARE_IRQ +(const void()**) HARDWARE_IRQ#0 HARDWARE_IRQ = (void()**) 65534 +(byte*) SCREEN +(const byte*) SCREEN#0 SCREEN = (byte*) 1024 +interrupt(KERNEL_MIN)(void()) irq1() +(label) irq1::@return +interrupt(KERNEL_MIN)(void()) irq2() +(label) irq2::@return +(void()) main() +(label) main::@return + + + +FINAL ASSEMBLER +Score: 42 + +//SEG0 File Comments +// Unused interrupts pointing to each other but never used from main loop - should be optimized away +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" +//SEG2 Global Constants & labels + .label SCREEN = $400 + .label HARDWARE_IRQ = $fffe +//SEG3 @begin +//SEG4 [1] phi from @begin to @1 [phi:@begin->@1] +//SEG5 @1 +//SEG6 [2] call main +//SEG7 [3] phi from @1 to @end [phi:@1->@end] +//SEG8 @end +//SEG9 main +main: { + //SEG10 [4] *((const byte*) SCREEN#0) ← (byte) 'x' -- _deref_pbuc1=vbuc2 + lda #'x' + sta SCREEN + //SEG11 main::@return + //SEG12 [5] return + rts +} +//SEG13 irq2 +// Unused Interrupt Routine +irq2: { + //SEG14 entry interrupt(KERNEL_MIN) + //SEG15 [6] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq1() -- _deref_pptc1=pprc2 + lda #irq1 + sta HARDWARE_IRQ+1 + //SEG16 irq2::@return + //SEG17 [7] return - exit interrupt(KERNEL_MIN) + jmp $ea81 +} +//SEG18 irq1 +// Unused Interrupt Routine +irq1: { + //SEG19 entry interrupt(KERNEL_MIN) + //SEG20 [8] *((const void()**) HARDWARE_IRQ#0) ← &interrupt(KERNEL_MIN)(void()) irq2() -- _deref_pptc1=pprc2 + lda #irq2 + sta HARDWARE_IRQ+1 + //SEG21 irq1::@return + //SEG22 [9] return - exit interrupt(KERNEL_MIN) + jmp $ea81 +} + diff --git a/src/test/ref/unused-irq.sym b/src/test/ref/unused-irq.sym new file mode 100644 index 000000000..041259bc4 --- /dev/null +++ b/src/test/ref/unused-irq.sym @@ -0,0 +1,14 @@ +(label) @1 +(label) @begin +(label) @end +(void()**) HARDWARE_IRQ +(const void()**) HARDWARE_IRQ#0 HARDWARE_IRQ = (void()**) 65534 +(byte*) SCREEN +(const byte*) SCREEN#0 SCREEN = (byte*) 1024 +interrupt(KERNEL_MIN)(void()) irq1() +(label) irq1::@return +interrupt(KERNEL_MIN)(void()) irq2() +(label) irq2::@return +(void()) main() +(label) main::@return +