From 253263983e62b0eec29d248a956acf4552dfa102 Mon Sep 17 00:00:00 2001 From: Jesper Gravgaard Date: Wed, 25 Mar 2020 17:51:45 +0100 Subject: [PATCH] Added 2x2 font compression example. Improved chargen example. --- .../mos6502-common/vwum1=vwum1_bor_vbuaa.asm | 2 + .../dk/camelot64/kickc/test/TestPrograms.java | 35 +- src/test/kc/complex/elefont/elefont.kc | 85 - .../kc/examples/chargen/chargen-analysis.kc | 3 +- src/test/kc/examples/font-2x2/font-2x2.kc | 127 + src/test/kc/problem-const-addition.kc | 17 + .../ref/examples/chargen/chargen-analysis.asm | 80 +- .../ref/examples/chargen/chargen-analysis.cfg | 127 +- .../ref/examples/chargen/chargen-analysis.log | 1952 +++---- .../ref/examples/chargen/chargen-analysis.sym | 75 +- src/test/ref/examples/font-2x2/font-2x2.asm | 480 ++ src/test/ref/examples/font-2x2/font-2x2.cfg | 239 + src/test/ref/examples/font-2x2/font-2x2.log | 5094 +++++++++++++++++ src/test/ref/examples/font-2x2/font-2x2.sym | 225 + 14 files changed, 7036 insertions(+), 1505 deletions(-) create mode 100644 src/main/fragment/mos6502-common/vwum1=vwum1_bor_vbuaa.asm delete mode 100644 src/test/kc/complex/elefont/elefont.kc create mode 100644 src/test/kc/examples/font-2x2/font-2x2.kc create mode 100644 src/test/kc/problem-const-addition.kc create mode 100644 src/test/ref/examples/font-2x2/font-2x2.asm create mode 100644 src/test/ref/examples/font-2x2/font-2x2.cfg create mode 100644 src/test/ref/examples/font-2x2/font-2x2.log create mode 100644 src/test/ref/examples/font-2x2/font-2x2.sym diff --git a/src/main/fragment/mos6502-common/vwum1=vwum1_bor_vbuaa.asm b/src/main/fragment/mos6502-common/vwum1=vwum1_bor_vbuaa.asm new file mode 100644 index 000000000..75427e7a0 --- /dev/null +++ b/src/main/fragment/mos6502-common/vwum1=vwum1_bor_vbuaa.asm @@ -0,0 +1,2 @@ +ora {m1} +sta {m1} \ No newline at end of file diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java index ea53c5ad5..7f0d61373 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java @@ -722,6 +722,11 @@ public class TestPrograms { compileAndCompare("problem-negative-word-const"); } + //@Test + //public void testProblemConstAddition() throws IOException, URISyntaxException { + // compileAndCompare("problem-const-addition", log()); + //} + @Test public void testInnerIncrementProblem() throws IOException, URISyntaxException { compileAndCompare("inner-increment-problem"); @@ -968,16 +973,23 @@ public class TestPrograms { compileAndCompare("unused-irq"); } - /** + +/* * TODO: Fix error with number resolving - * - * @Test public void testNumberTernaryFail2() throws IOException, URISyntaxException { - * compileAndCompare("number-ternary-fail-2"); - * } - * @Test public void testNumberTernaryFail() throws IOException, URISyntaxException { - * compileAndCompare("number-ternary-fail"); - * } - */ + + @Test public void testNumberTernaryFail2() throws IOException, URISyntaxException { + compileAndCompare("number-ternary-fail-2"); + } + @Test public void testNumberTernaryFail() throws IOException, URISyntaxException { + compileAndCompare("number-ternary-fail"); + } + + @Test public void testNumberTernaryFail3() throws IOException, URISyntaxException { + compileAndCompare("number-ternary-fail-3"); + } + + */ + @Test public void testTextbox() throws IOException, URISyntaxException { @@ -2016,6 +2028,11 @@ public class TestPrograms { compileAndCompare("examples/fire/fire"); } + @Test + public void testFont2x2() throws IOException, URISyntaxException { + compileAndCompare("examples/font-2x2/font-2x2"); + } + @Test public void testCTypes() throws IOException, URISyntaxException { compileAndCompare("c-types"); diff --git a/src/test/kc/complex/elefont/elefont.kc b/src/test/kc/complex/elefont/elefont.kc deleted file mode 100644 index c2db75afc..000000000 --- a/src/test/kc/complex/elefont/elefont.kc +++ /dev/null @@ -1,85 +0,0 @@ -// Snabel Elefont Compression testing - -import "c64" -import "string" - -const byte* SCREEN = 0x0400; -const byte* ELEFONT = 0x2000; -const byte* ELEFONT2 = 0x2800; -byte[0x100] align(0x100) ELEFONT2_MAP; - -kickasm(pc ELEFONT, resource "elefont.bin" ) {{ - .var fontFile = LoadBinary("elefont.bin") - .fill fontFile.getSize(), fontFile.get(i) -}} - -void main() { - // Compress the font finding identical characters - char size = font_compress(ELEFONT, ELEFONT2, ELEFONT2_MAP); - // Show compressed font - *D018 = toD018(SCREEN, ELEFONT2); - // Clear the screen - memset(SCREEN, ELEFONT2_MAP[' '], 0x0400); - // Show the font - char* cursor = SCREEN; - char c = 0; - for(char y:0..7) { - for(char x:0..7) { - out(c++, x, y, ELEFONT2_MAP); - } - } -} - -// Show a 2x2 char on the screen at 2x2-position (x, y) using a font compress mapping -void out(char c, char x, char y, char* font_mapping) { - char* ptr = SCREEN + (unsigned int)y*80 + x*2; - ptr[0] = font_mapping[c]; - ptr[1] = font_mapping[c+0x40]; - ptr[40] = font_mapping[c+0x80]; - ptr[41] = font_mapping[c+0xc0]; -} - -// Compress a font finding identical characters -// The compressed font is put into font_compressed and the compress_mapping is updated -// so that compress_mapping[c] points to the char in font_compressed that is identical to char c in font_original -// Returns the size of the compressed font (in chars) -char font_compress(char* font_original, char* font_compressed, char* compress_mapping) { - char font_size = 0; - char* next_original = font_original; - char* next_compressed = font_compressed; - for(char i: 0..0xff) { - // Look for the char in font_compressed - char found = font_find(next_original, font_compressed, font_size); - if(found==0xff) { - // Glyph not found - create it - for(char l:0..7) - next_compressed[l] = next_original[l]; - next_compressed += 8; - found = font_size; - font_size++; - } - compress_mapping[i] = found; - next_original += 8; - } - return font_size; -} - -// Look for a glyph within a font -// Only looks at the first font_size glyphs -// Returns the index of the glyph within the font. Returns 0xff if the glyph is not found. -char font_find(char* glyph, char* font, char font_size) { - for(char i=0;iglyph_bits_2x2; + next_2x2_left[l2+1] = >glyph_bits_2x2; + next_2x2_right[l2] = SCREEN+$28+1 + lda #>SCREEN+$29 + adc #0 sta.z sc+1 lda #0 sta.z y @@ -373,51 +374,6 @@ plot_chargen: { // } rts } -// Perform binary multiplication of two unsigned 8-bit bytes into a 16-bit unsigned word -// mul8u(byte register(X) a) -mul8u: { - .const b = $a - .label mb = $a - .label res = $e - .label return = $e - lda #b - sta.z mb+1 - lda #<0 - sta.z res - sta.z res+1 - __b1: - // while(a!=0) - cpx #0 - bne __b2 - // } - rts - __b2: - // a&1 - txa - and #1 - // if( (a&1) != 0) - cmp #0 - beq __b3 - // res = res + mb - lda.z res - clc - adc.z mb - sta.z res - lda.z res+1 - adc.z mb+1 - sta.z res+1 - __b3: - // a = a>>1 - txa - lsr - tax - // mb = mb<<1 - asl.z mb - rol.z mb+1 - jmp __b1 -} // Determines whether a specific key is currently pressed by accessing the matrix directly // The key is a keyboard code defined from the keyboard matrix by %00rrrccc, where rrr is the row ID (0-7) and ccc is the column ID (0-7) // All keys exist as as KEY_XXX constants. @@ -469,10 +425,10 @@ keyboard_get_keycode: { rts } // Print a string at a specific screen position -// print_str_at(byte* zp($c) str, byte* zp($e) at) +// print_str_at(byte* zp($a) str, byte* zp($c) at) print_str_at: { - .label at = $e - .label str = $c + .label at = $c + .label str = $a __b1: // while(*str) ldy #0 diff --git a/src/test/ref/examples/chargen/chargen-analysis.cfg b/src/test/ref/examples/chargen/chargen-analysis.cfg index 67f144007..1627a10d8 100644 --- a/src/test/ref/examples/chargen/chargen-analysis.cfg +++ b/src/test/ref/examples/chargen/chargen-analysis.cfg @@ -156,127 +156,98 @@ plot_chargen::@2: scope:[plot_chargen] from plot_chargen [77] (byte*) plot_chargen::chargen#1 ← (byte*) plot_chargen::chargen#0 + (word) $800 to:plot_chargen::@1 plot_chargen::@1: scope:[plot_chargen] from plot_chargen plot_chargen::@2 - [78] (byte*) plot_chargen::chargen#5 ← phi( plot_chargen/(byte*) plot_chargen::chargen#0 plot_chargen::@2/(byte*) plot_chargen::chargen#1 ) + [78] (byte*) plot_chargen::chargen#4 ← phi( plot_chargen/(byte*) plot_chargen::chargen#0 plot_chargen::@2/(byte*) plot_chargen::chargen#1 ) [79] *((const byte*) PROCPORT) ← (byte) $32 - [80] (byte) mul8u::a#1 ← (byte) plot_chargen::pos#2 - [81] call mul8u - [82] (word) mul8u::return#2 ← (word) mul8u::res#2 - to:plot_chargen::@9 -plot_chargen::@9: scope:[plot_chargen] from plot_chargen::@1 - [83] (word~) plot_chargen::$7 ← (word) mul8u::return#2 - [84] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN+(byte) $28+(byte) 1 + (word~) plot_chargen::$7 + [80] (byte~) plot_chargen::$16 ← (byte) plot_chargen::pos#2 << (byte) 2 + [81] (byte~) plot_chargen::$17 ← (byte~) plot_chargen::$16 + (byte) plot_chargen::pos#2 + [82] (byte~) plot_chargen::$6 ← (byte~) plot_chargen::$17 << (byte) 1 + [83] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN+(byte) $29 + (byte~) plot_chargen::$6 to:plot_chargen::@3 -plot_chargen::@3: scope:[plot_chargen] from plot_chargen::@7 plot_chargen::@9 - [85] (byte*) plot_chargen::sc#7 ← phi( plot_chargen::@7/(byte*) plot_chargen::sc#2 plot_chargen::@9/(byte*) plot_chargen::sc#0 ) - [85] (byte) plot_chargen::y#2 ← phi( plot_chargen::@7/(byte) plot_chargen::y#1 plot_chargen::@9/(byte) 0 ) - [86] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#5 + (byte) plot_chargen::y#2) +plot_chargen::@3: scope:[plot_chargen] from plot_chargen::@1 plot_chargen::@7 + [84] (byte*) plot_chargen::sc#7 ← phi( plot_chargen::@1/(byte*) plot_chargen::sc#0 plot_chargen::@7/(byte*) plot_chargen::sc#2 ) + [84] (byte) plot_chargen::y#2 ← phi( plot_chargen::@1/(byte) 0 plot_chargen::@7/(byte) plot_chargen::y#1 ) + [85] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#4 + (byte) plot_chargen::y#2) to:plot_chargen::@4 plot_chargen::@4: scope:[plot_chargen] from plot_chargen::@3 plot_chargen::@5 - [87] (byte) plot_chargen::x#2 ← phi( plot_chargen::@3/(byte) 0 plot_chargen::@5/(byte) plot_chargen::x#1 ) - [87] (byte*) plot_chargen::sc#3 ← phi( plot_chargen::@3/(byte*) plot_chargen::sc#7 plot_chargen::@5/(byte*) plot_chargen::sc#1 ) - [87] (byte) plot_chargen::bits#2 ← phi( plot_chargen::@3/(byte) plot_chargen::bits#0 plot_chargen::@5/(byte) plot_chargen::bits#1 ) - [88] (byte~) plot_chargen::$10 ← (byte) plot_chargen::bits#2 & (byte) $80 - [89] if((byte~) plot_chargen::$10==(byte) 0) goto plot_chargen::@5 + [86] (byte) plot_chargen::x#2 ← phi( plot_chargen::@3/(byte) 0 plot_chargen::@5/(byte) plot_chargen::x#1 ) + [86] (byte*) plot_chargen::sc#3 ← phi( plot_chargen::@3/(byte*) plot_chargen::sc#7 plot_chargen::@5/(byte*) plot_chargen::sc#1 ) + [86] (byte) plot_chargen::bits#2 ← phi( plot_chargen::@3/(byte) plot_chargen::bits#0 plot_chargen::@5/(byte) plot_chargen::bits#1 ) + [87] (byte~) plot_chargen::$9 ← (byte) plot_chargen::bits#2 & (byte) $80 + [88] if((byte~) plot_chargen::$9==(byte) 0) goto plot_chargen::@5 to:plot_chargen::@6 plot_chargen::@6: scope:[plot_chargen] from plot_chargen::@4 - [90] phi() + [89] phi() to:plot_chargen::@5 plot_chargen::@5: scope:[plot_chargen] from plot_chargen::@4 plot_chargen::@6 - [91] (byte) plot_chargen::c#2 ← phi( plot_chargen::@4/(byte) '.' plot_chargen::@6/(byte) '*' ) - [92] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 - [93] (byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3 - [94] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 << (byte) 1 - [95] (byte) plot_chargen::x#1 ← ++ (byte) plot_chargen::x#2 - [96] if((byte) plot_chargen::x#1!=(byte) 8) goto plot_chargen::@4 + [90] (byte) plot_chargen::c#2 ← phi( plot_chargen::@4/(byte) '.' plot_chargen::@6/(byte) '*' ) + [91] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 + [92] (byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3 + [93] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 << (byte) 1 + [94] (byte) plot_chargen::x#1 ← ++ (byte) plot_chargen::x#2 + [95] if((byte) plot_chargen::x#1!=(byte) 8) goto plot_chargen::@4 to:plot_chargen::@7 plot_chargen::@7: scope:[plot_chargen] from plot_chargen::@5 - [97] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte) $20 - [98] (byte) plot_chargen::y#1 ← ++ (byte) plot_chargen::y#2 - [99] if((byte) plot_chargen::y#1!=(byte) 8) goto plot_chargen::@3 + [96] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte) $20 + [97] (byte) plot_chargen::y#1 ← ++ (byte) plot_chargen::y#2 + [98] if((byte) plot_chargen::y#1!=(byte) 8) goto plot_chargen::@3 to:plot_chargen::@8 plot_chargen::@8: scope:[plot_chargen] from plot_chargen::@7 - [100] *((const byte*) PROCPORT) ← (byte) $37 + [99] *((const byte*) PROCPORT) ← (byte) $37 asm { cli } to:plot_chargen::@return plot_chargen::@return: scope:[plot_chargen] from plot_chargen::@8 - [102] return + [101] return to:@return -(word()) mul8u((byte) mul8u::a , (byte) mul8u::b) -mul8u: scope:[mul8u] from plot_chargen::@1 - [103] phi() - to:mul8u::@1 -mul8u::@1: scope:[mul8u] from mul8u mul8u::@3 - [104] (word) mul8u::mb#2 ← phi( mul8u/(word)(const byte) mul8u::b#0 mul8u::@3/(word) mul8u::mb#1 ) - [104] (word) mul8u::res#2 ← phi( mul8u/(word) 0 mul8u::@3/(word) mul8u::res#6 ) - [104] (byte) mul8u::a#2 ← phi( mul8u/(byte) mul8u::a#1 mul8u::@3/(byte) mul8u::a#0 ) - [105] if((byte) mul8u::a#2!=(byte) 0) goto mul8u::@2 - to:mul8u::@return -mul8u::@return: scope:[mul8u] from mul8u::@1 - [106] return - to:@return -mul8u::@2: scope:[mul8u] from mul8u::@1 - [107] (byte~) mul8u::$1 ← (byte) mul8u::a#2 & (byte) 1 - [108] if((byte~) mul8u::$1==(byte) 0) goto mul8u::@3 - to:mul8u::@4 -mul8u::@4: scope:[mul8u] from mul8u::@2 - [109] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 - to:mul8u::@3 -mul8u::@3: scope:[mul8u] from mul8u::@2 mul8u::@4 - [110] (word) mul8u::res#6 ← phi( mul8u::@2/(word) mul8u::res#2 mul8u::@4/(word) mul8u::res#1 ) - [111] (byte) mul8u::a#0 ← (byte) mul8u::a#2 >> (byte) 1 - [112] (word) mul8u::mb#1 ← (word) mul8u::mb#2 << (byte) 1 - to:mul8u::@1 - (byte()) keyboard_key_pressed((byte) keyboard_key_pressed::key) keyboard_key_pressed: scope:[keyboard_key_pressed] from main::@15 main::@5 main::@6 main::@7 main::@8 main::@9 - [113] (byte) keyboard_key_pressed::key#6 ← phi( main::@6/(const byte) KEY_F3 main::@7/(const byte) KEY_F5 main::@8/(const byte) KEY_F7 main::@9/(const byte) KEY_LSHIFT main::@15/(byte) keyboard_key_pressed::key#5 main::@5/(const byte) KEY_F1 ) - [114] (byte) keyboard_key_pressed::colidx#0 ← (byte) keyboard_key_pressed::key#6 & (byte) 7 - [115] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte) 3 - [116] (byte) keyboard_matrix_read::rowid#0 ← (byte) keyboard_key_pressed::rowidx#0 - [117] call keyboard_matrix_read - [118] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0 + [102] (byte) keyboard_key_pressed::key#6 ← phi( main::@6/(const byte) KEY_F3 main::@7/(const byte) KEY_F5 main::@8/(const byte) KEY_F7 main::@9/(const byte) KEY_LSHIFT main::@15/(byte) keyboard_key_pressed::key#5 main::@5/(const byte) KEY_F1 ) + [103] (byte) keyboard_key_pressed::colidx#0 ← (byte) keyboard_key_pressed::key#6 & (byte) 7 + [104] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte) 3 + [105] (byte) keyboard_matrix_read::rowid#0 ← (byte) keyboard_key_pressed::rowidx#0 + [106] call keyboard_matrix_read + [107] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0 to:keyboard_key_pressed::@1 keyboard_key_pressed::@1: scope:[keyboard_key_pressed] from keyboard_key_pressed - [119] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2 - [120] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte*) keyboard_matrix_col_bitmask + (byte) keyboard_key_pressed::colidx#0) + [108] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2 + [109] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte*) keyboard_matrix_col_bitmask + (byte) keyboard_key_pressed::colidx#0) to:keyboard_key_pressed::@return keyboard_key_pressed::@return: scope:[keyboard_key_pressed] from keyboard_key_pressed::@1 - [121] return + [110] return to:@return (byte()) keyboard_matrix_read((byte) keyboard_matrix_read::rowid) keyboard_matrix_read: scope:[keyboard_matrix_read] from keyboard_key_pressed - [122] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask + (byte) keyboard_matrix_read::rowid#0) - [123] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B) + [111] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask + (byte) keyboard_matrix_read::rowid#0) + [112] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B) to:keyboard_matrix_read::@return keyboard_matrix_read::@return: scope:[keyboard_matrix_read] from keyboard_matrix_read - [124] return + [113] return to:@return (byte()) keyboard_get_keycode((byte) keyboard_get_keycode::ch) keyboard_get_keycode: scope:[keyboard_get_keycode] from main::@12 - [125] (byte) keyboard_get_keycode::return#0 ← *((const byte*) keyboard_char_keycodes + (byte) keyboard_get_keycode::ch#0) + [114] (byte) keyboard_get_keycode::return#0 ← *((const byte*) keyboard_char_keycodes + (byte) keyboard_get_keycode::ch#0) to:keyboard_get_keycode::@return keyboard_get_keycode::@return: scope:[keyboard_get_keycode] from keyboard_get_keycode - [126] return + [115] return to:@return (void()) print_str_at((byte*) print_str_at::str , (byte*) print_str_at::at) print_str_at: scope:[print_str_at] from main::@17 main::@18 main::@19 main::@3 - [127] (byte*) print_str_at::at#7 ← phi( main::@17/(const byte*) SCREEN+(byte) 1+(byte) $a main::@3/(const byte*) SCREEN+(byte) 1 main::@18/(const byte*) SCREEN+(byte) 1+(byte) $14 main::@19/(const byte*) SCREEN+(byte) 1+(byte) $1e ) - [127] (byte*) print_str_at::str#7 ← phi( main::@17/(const byte*) main::str1 main::@3/(const byte*) main::str main::@18/(const byte*) main::str2 main::@19/(const byte*) main::str3 ) + [116] (byte*) print_str_at::at#7 ← phi( main::@17/(const byte*) SCREEN+(byte) 1+(byte) $a main::@3/(const byte*) SCREEN+(byte) 1 main::@18/(const byte*) SCREEN+(byte) 1+(byte) $14 main::@19/(const byte*) SCREEN+(byte) 1+(byte) $1e ) + [116] (byte*) print_str_at::str#7 ← phi( main::@17/(const byte*) main::str1 main::@3/(const byte*) main::str main::@18/(const byte*) main::str2 main::@19/(const byte*) main::str3 ) to:print_str_at::@1 print_str_at::@1: scope:[print_str_at] from print_str_at print_str_at::@2 - [128] (byte*) print_str_at::at#5 ← phi( print_str_at/(byte*) print_str_at::at#7 print_str_at::@2/(byte*) print_str_at::at#4 ) - [128] (byte*) print_str_at::str#5 ← phi( print_str_at/(byte*) print_str_at::str#7 print_str_at::@2/(byte*) print_str_at::str#4 ) - [129] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 + [117] (byte*) print_str_at::at#5 ← phi( print_str_at/(byte*) print_str_at::at#7 print_str_at::@2/(byte*) print_str_at::at#4 ) + [117] (byte*) print_str_at::str#5 ← phi( print_str_at/(byte*) print_str_at::str#7 print_str_at::@2/(byte*) print_str_at::str#4 ) + [118] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 to:print_str_at::@return print_str_at::@return: scope:[print_str_at] from print_str_at::@1 - [130] return + [119] return to:@return print_str_at::@2: scope:[print_str_at] from print_str_at::@1 - [131] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) - [132] (byte*) print_str_at::at#4 ← ++ (byte*) print_str_at::at#5 - [133] (byte*) print_str_at::str#4 ← ++ (byte*) print_str_at::str#5 + [120] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) + [121] (byte*) print_str_at::at#4 ← ++ (byte*) print_str_at::at#5 + [122] (byte*) print_str_at::str#4 ← ++ (byte*) print_str_at::str#5 to:print_str_at::@1 diff --git a/src/test/ref/examples/chargen/chargen-analysis.log b/src/test/ref/examples/chargen/chargen-analysis.log index 7417f09ca..3434b9261 100644 --- a/src/test/ref/examples/chargen/chargen-analysis.log +++ b/src/test/ref/examples/chargen/chargen-analysis.log @@ -5,89 +5,31 @@ 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) keyboard_matrix_read::@1 Culled Empty Block (label) @6 +Culled Empty Block (label) keyboard_key_pressed::@1 Culled Empty Block (label) @7 +Culled Empty Block (label) keyboard_get_keycode::@1 Culled Empty Block (label) @8 Culled Empty Block (label) @9 Culled Empty Block (label) @10 -Culled Empty Block (label) keyboard_matrix_read::@1 Culled Empty Block (label) @11 -Culled Empty Block (label) keyboard_key_pressed::@1 -Culled Empty Block (label) @12 -Culled Empty Block (label) keyboard_get_keycode::@1 -Culled Empty Block (label) @13 -Culled Empty Block (label) @14 -Culled Empty Block (label) @15 -Culled Empty Block (label) @16 Culled Empty Block (label) main::@4 Culled Empty Block (label) main::@5 Culled Empty Block (label) main::@6 Culled Empty Block (label) main::@28 Culled Empty Block (label) main::@22 -Culled Empty Block (label) @17 +Culled Empty Block (label) @12 Culled Empty Block (label) print_str_at::@4 Culled Empty Block (label) print_str_at::@3 Culled Empty Block (label) print_str_at::@5 Culled Empty Block (label) print_str_at::@6 -Culled Empty Block (label) @18 +Culled Empty Block (label) @13 CONTROL FLOW GRAPH SSA @begin: scope:[] from - to:@19 - -(word()) mul8u((byte) mul8u::a , (byte) mul8u::b) -mul8u: scope:[mul8u] from plot_chargen::@1 - (byte) mul8u::a#5 ← phi( plot_chargen::@1/(byte) mul8u::a#1 ) - (byte) mul8u::b#1 ← phi( plot_chargen::@1/(byte) mul8u::b#0 ) - (word) mul8u::res#0 ← (word) 0 - (word) mul8u::mb#0 ← (word)(byte) mul8u::b#1 - 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#2 ← phi( mul8u/(byte) mul8u::a#5 mul8u::@4/(byte) mul8u::a#0 ) - (bool~) mul8u::$0 ← (byte) mul8u::a#2 != (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#3 ← phi( mul8u::@1/(byte) mul8u::a#2 ) - (number~) mul8u::$1 ← (byte) mul8u::a#3 & (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#4 ← phi( mul8u::@2/(byte) mul8u::a#3 mul8u::@7/(byte) mul8u::a#6 ) - (byte~) mul8u::$5 ← (byte) mul8u::a#4 >> (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#6 ← phi( mul8u::@2/(byte) mul8u::a#3 ) - (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#3 ← phi( mul8u::@3/(word) mul8u::return#0 ) - (word) mul8u::return#1 ← (word) mul8u::return#3 - return - to:@return + to:@14 (byte()) keyboard_matrix_read((byte) keyboard_matrix_read::rowid) keyboard_matrix_read: scope:[keyboard_matrix_read] from keyboard_key_pressed @@ -139,7 +81,7 @@ keyboard_get_keycode::@return: scope:[keyboard_get_keycode] from keyboard_get_k to:@return (void()) main() -main: scope:[main] from @19 +main: scope:[main] from @14 (byte*) main::sc#0 ← (const byte*) SCREEN to:main::@1 main::@1: scope:[main] from main main::@2 @@ -408,51 +350,42 @@ plot_chargen: scope:[plot_chargen] from main::@20 main::@7 if((bool~) plot_chargen::$4) goto plot_chargen::@1 to:plot_chargen::@2 plot_chargen::@1: scope:[plot_chargen] from plot_chargen plot_chargen::@2 - (byte*) plot_chargen::chargen#6 ← phi( plot_chargen/(byte*) plot_chargen::chargen#0 plot_chargen::@2/(byte*) plot_chargen::chargen#1 ) + (byte*) plot_chargen::chargen#4 ← phi( plot_chargen/(byte*) plot_chargen::chargen#0 plot_chargen::@2/(byte*) plot_chargen::chargen#1 ) (byte) plot_chargen::pos#2 ← phi( plot_chargen/(byte) plot_chargen::pos#3 plot_chargen::@2/(byte) plot_chargen::pos#4 ) *((const byte*) PROCPORT) ← (number) $32 - (byte*~) plot_chargen::$5 ← (const byte*) SCREEN + (number) $28 - (byte*~) plot_chargen::$6 ← (byte*~) plot_chargen::$5 + (number) 1 - (byte) mul8u::a#1 ← (byte) plot_chargen::pos#2 - (byte) mul8u::b#0 ← (number) $a - call mul8u - (word) mul8u::return#2 ← (word) mul8u::return#1 - to:plot_chargen::@9 -plot_chargen::@9: scope:[plot_chargen] from plot_chargen::@1 - (byte*) plot_chargen::chargen#5 ← phi( plot_chargen::@1/(byte*) plot_chargen::chargen#6 ) - (word) mul8u::return#4 ← phi( plot_chargen::@1/(word) mul8u::return#2 ) - (word~) plot_chargen::$7 ← (word) mul8u::return#4 - (byte*~) plot_chargen::$8 ← (byte*~) plot_chargen::$6 + (word~) plot_chargen::$7 - (byte*) plot_chargen::sc#0 ← (byte*~) plot_chargen::$8 + (byte*~) plot_chargen::$5 ← (const byte*) SCREEN + (number) $29 + (number~) plot_chargen::$6 ← (byte) plot_chargen::pos#2 * (number) $a + (byte*~) plot_chargen::$7 ← (byte*~) plot_chargen::$5 + (number~) plot_chargen::$6 + (byte*) plot_chargen::sc#0 ← (byte*~) plot_chargen::$7 (byte) plot_chargen::y#0 ← (byte) 0 to:plot_chargen::@3 plot_chargen::@2: scope:[plot_chargen] from plot_chargen (byte) plot_chargen::pos#4 ← phi( plot_chargen/(byte) plot_chargen::pos#3 ) (byte*) plot_chargen::chargen#2 ← phi( plot_chargen/(byte*) plot_chargen::chargen#0 ) - (byte*~) plot_chargen::$9 ← (byte*) plot_chargen::chargen#2 + (number) $800 - (byte*) plot_chargen::chargen#1 ← (byte*~) plot_chargen::$9 + (byte*~) plot_chargen::$8 ← (byte*) plot_chargen::chargen#2 + (number) $800 + (byte*) plot_chargen::chargen#1 ← (byte*~) plot_chargen::$8 to:plot_chargen::@1 -plot_chargen::@3: scope:[plot_chargen] from plot_chargen::@7 plot_chargen::@9 - (byte*) plot_chargen::sc#7 ← phi( plot_chargen::@7/(byte*) plot_chargen::sc#2 plot_chargen::@9/(byte*) plot_chargen::sc#0 ) - (byte) plot_chargen::y#2 ← phi( plot_chargen::@7/(byte) plot_chargen::y#1 plot_chargen::@9/(byte) plot_chargen::y#0 ) - (byte*) plot_chargen::chargen#3 ← phi( plot_chargen::@7/(byte*) plot_chargen::chargen#4 plot_chargen::@9/(byte*) plot_chargen::chargen#5 ) +plot_chargen::@3: scope:[plot_chargen] from plot_chargen::@1 plot_chargen::@7 + (byte*) plot_chargen::sc#7 ← phi( plot_chargen::@1/(byte*) plot_chargen::sc#0 plot_chargen::@7/(byte*) plot_chargen::sc#2 ) + (byte) plot_chargen::y#2 ← phi( plot_chargen::@1/(byte) plot_chargen::y#0 plot_chargen::@7/(byte) plot_chargen::y#1 ) + (byte*) plot_chargen::chargen#3 ← phi( plot_chargen::@1/(byte*) plot_chargen::chargen#4 plot_chargen::@7/(byte*) plot_chargen::chargen#5 ) (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#3 + (byte) plot_chargen::y#2) (byte) plot_chargen::x#0 ← (byte) 0 to:plot_chargen::@4 plot_chargen::@4: scope:[plot_chargen] from plot_chargen::@3 plot_chargen::@5 - (byte*) plot_chargen::chargen#8 ← phi( plot_chargen::@3/(byte*) plot_chargen::chargen#3 plot_chargen::@5/(byte*) plot_chargen::chargen#7 ) + (byte*) plot_chargen::chargen#7 ← phi( plot_chargen::@3/(byte*) plot_chargen::chargen#3 plot_chargen::@5/(byte*) plot_chargen::chargen#6 ) (byte) plot_chargen::y#5 ← phi( plot_chargen::@3/(byte) plot_chargen::y#2 plot_chargen::@5/(byte) plot_chargen::y#4 ) (byte) plot_chargen::x#3 ← phi( plot_chargen::@3/(byte) plot_chargen::x#0 plot_chargen::@5/(byte) plot_chargen::x#1 ) (byte*) plot_chargen::sc#5 ← phi( plot_chargen::@3/(byte*) plot_chargen::sc#7 plot_chargen::@5/(byte*) plot_chargen::sc#1 ) (byte) plot_chargen::bits#2 ← phi( plot_chargen::@3/(byte) plot_chargen::bits#0 plot_chargen::@5/(byte) plot_chargen::bits#1 ) (byte) plot_chargen::c#0 ← (byte) '.' - (number~) plot_chargen::$10 ← (byte) plot_chargen::bits#2 & (number) $80 - (bool~) plot_chargen::$11 ← (number~) plot_chargen::$10 != (number) 0 - (bool~) plot_chargen::$12 ← ! (bool~) plot_chargen::$11 - if((bool~) plot_chargen::$12) goto plot_chargen::@5 + (number~) plot_chargen::$9 ← (byte) plot_chargen::bits#2 & (number) $80 + (bool~) plot_chargen::$10 ← (number~) plot_chargen::$9 != (number) 0 + (bool~) plot_chargen::$11 ← ! (bool~) plot_chargen::$10 + if((bool~) plot_chargen::$11) goto plot_chargen::@5 to:plot_chargen::@6 plot_chargen::@5: scope:[plot_chargen] from plot_chargen::@4 plot_chargen::@6 - (byte*) plot_chargen::chargen#7 ← phi( plot_chargen::@4/(byte*) plot_chargen::chargen#8 plot_chargen::@6/(byte*) plot_chargen::chargen#9 ) + (byte*) plot_chargen::chargen#6 ← phi( plot_chargen::@4/(byte*) plot_chargen::chargen#7 plot_chargen::@6/(byte*) plot_chargen::chargen#8 ) (byte) plot_chargen::y#4 ← phi( plot_chargen::@4/(byte) plot_chargen::y#5 plot_chargen::@6/(byte) plot_chargen::y#6 ) (byte) plot_chargen::x#2 ← phi( plot_chargen::@4/(byte) plot_chargen::x#3 plot_chargen::@6/(byte) plot_chargen::x#4 ) (byte) plot_chargen::bits#3 ← phi( plot_chargen::@4/(byte) plot_chargen::bits#2 plot_chargen::@6/(byte) plot_chargen::bits#4 ) @@ -460,14 +393,14 @@ plot_chargen::@5: scope:[plot_chargen] from plot_chargen::@4 plot_chargen::@6 (byte) plot_chargen::c#2 ← phi( plot_chargen::@4/(byte) plot_chargen::c#0 plot_chargen::@6/(byte) plot_chargen::c#1 ) *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 (byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3 - (number~) plot_chargen::$13 ← (byte) plot_chargen::bits#3 * (number) 2 - (byte) plot_chargen::bits#1 ← (number~) plot_chargen::$13 + (number~) plot_chargen::$12 ← (byte) plot_chargen::bits#3 * (number) 2 + (byte) plot_chargen::bits#1 ← (number~) plot_chargen::$12 (byte) plot_chargen::x#1 ← (byte) plot_chargen::x#2 + rangenext(0,7) - (bool~) plot_chargen::$14 ← (byte) plot_chargen::x#1 != rangelast(0,7) - if((bool~) plot_chargen::$14) goto plot_chargen::@4 + (bool~) plot_chargen::$13 ← (byte) plot_chargen::x#1 != rangelast(0,7) + if((bool~) plot_chargen::$13) goto plot_chargen::@4 to:plot_chargen::@7 plot_chargen::@6: scope:[plot_chargen] from plot_chargen::@4 - (byte*) plot_chargen::chargen#9 ← phi( plot_chargen::@4/(byte*) plot_chargen::chargen#8 ) + (byte*) plot_chargen::chargen#8 ← phi( plot_chargen::@4/(byte*) plot_chargen::chargen#7 ) (byte) plot_chargen::y#6 ← phi( plot_chargen::@4/(byte) plot_chargen::y#5 ) (byte) plot_chargen::x#4 ← phi( plot_chargen::@4/(byte) plot_chargen::x#3 ) (byte) plot_chargen::bits#4 ← phi( plot_chargen::@4/(byte) plot_chargen::bits#2 ) @@ -475,14 +408,14 @@ plot_chargen::@6: scope:[plot_chargen] from plot_chargen::@4 (byte) plot_chargen::c#1 ← (byte) '*' to:plot_chargen::@5 plot_chargen::@7: scope:[plot_chargen] from plot_chargen::@5 - (byte*) plot_chargen::chargen#4 ← phi( plot_chargen::@5/(byte*) plot_chargen::chargen#7 ) + (byte*) plot_chargen::chargen#5 ← phi( plot_chargen::@5/(byte*) plot_chargen::chargen#6 ) (byte) plot_chargen::y#3 ← phi( plot_chargen::@5/(byte) plot_chargen::y#4 ) (byte*) plot_chargen::sc#4 ← phi( plot_chargen::@5/(byte*) plot_chargen::sc#1 ) - (byte*~) plot_chargen::$15 ← (byte*) plot_chargen::sc#4 + (number) $20 - (byte*) plot_chargen::sc#2 ← (byte*~) plot_chargen::$15 + (byte*~) plot_chargen::$14 ← (byte*) plot_chargen::sc#4 + (number) $20 + (byte*) plot_chargen::sc#2 ← (byte*~) plot_chargen::$14 (byte) plot_chargen::y#1 ← (byte) plot_chargen::y#3 + rangenext(0,7) - (bool~) plot_chargen::$16 ← (byte) plot_chargen::y#1 != rangelast(0,7) - if((bool~) plot_chargen::$16) goto plot_chargen::@3 + (bool~) plot_chargen::$15 ← (byte) plot_chargen::y#1 != rangelast(0,7) + if((bool~) plot_chargen::$15) goto plot_chargen::@3 to:plot_chargen::@8 plot_chargen::@8: scope:[plot_chargen] from plot_chargen::@7 *((const byte*) PROCPORT) ← (number) $37 @@ -491,16 +424,16 @@ plot_chargen::@8: scope:[plot_chargen] from plot_chargen::@7 plot_chargen::@return: scope:[plot_chargen] from plot_chargen::@8 return to:@return -@19: scope:[] from @begin +@14: scope:[] from @begin call main - to:@20 -@20: scope:[] from @19 + to:@15 +@15: scope:[] from @14 to:@end -@end: scope:[] from @20 +@end: scope:[] from @15 SYMBOL TABLE SSA -(label) @19 -(label) @20 +(label) @14 +(label) @15 (label) @begin (label) @end (const byte*) CHARGEN = (byte*)(number) $d000 @@ -770,70 +703,23 @@ SYMBOL TABLE SSA (const byte*) main::str1[(byte) 3] = (byte*) "f3" (const byte*) main::str2[(byte) 3] = (byte*) "f5" (const byte*) main::str3[(byte) 3] = (byte*) "f7" -(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::b -(byte) mul8u::b#0 -(byte) mul8u::b#1 -(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 (void()) plot_chargen((byte) plot_chargen::pos , (byte) plot_chargen::ch , (byte) plot_chargen::shift) (word~) plot_chargen::$0 (number~) plot_chargen::$1 -(number~) plot_chargen::$10 +(bool~) plot_chargen::$10 (bool~) plot_chargen::$11 -(bool~) plot_chargen::$12 -(number~) plot_chargen::$13 -(bool~) plot_chargen::$14 -(byte*~) plot_chargen::$15 -(bool~) plot_chargen::$16 +(number~) plot_chargen::$12 +(bool~) plot_chargen::$13 +(byte*~) plot_chargen::$14 +(bool~) plot_chargen::$15 (byte*~) plot_chargen::$2 (bool~) plot_chargen::$3 (bool~) plot_chargen::$4 (byte*~) plot_chargen::$5 -(byte*~) plot_chargen::$6 -(word~) plot_chargen::$7 +(number~) plot_chargen::$6 +(byte*~) plot_chargen::$7 (byte*~) plot_chargen::$8 -(byte*~) plot_chargen::$9 +(number~) plot_chargen::$9 (label) plot_chargen::@1 (label) plot_chargen::@2 (label) plot_chargen::@3 @@ -842,7 +728,6 @@ SYMBOL TABLE SSA (label) plot_chargen::@6 (label) plot_chargen::@7 (label) plot_chargen::@8 -(label) plot_chargen::@9 (label) plot_chargen::@return (byte) plot_chargen::bits (byte) plot_chargen::bits#0 @@ -868,7 +753,6 @@ SYMBOL TABLE SSA (byte*) plot_chargen::chargen#6 (byte*) plot_chargen::chargen#7 (byte*) plot_chargen::chargen#8 -(byte*) plot_chargen::chargen#9 (byte) plot_chargen::pos (byte) plot_chargen::pos#0 (byte) plot_chargen::pos#1 @@ -926,12 +810,6 @@ SYMBOL TABLE SSA (byte*) print_str_at::str#6 (byte*) print_str_at::str#7 -Adding number conversion cast (unumber) 0 in (bool~) mul8u::$0 ← (byte) mul8u::a#2 != (number) 0 -Adding number conversion cast (unumber) 1 in (number~) mul8u::$1 ← (byte) mul8u::a#3 & (number) 1 -Adding number conversion cast (unumber) mul8u::$1 in (number~) mul8u::$1 ← (byte) mul8u::a#3 & (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#4 >> (number) 1 -Adding number conversion cast (unumber) 1 in (word~) mul8u::$6 ← (word) mul8u::mb#2 << (number) 1 Adding number conversion cast (unumber) 7 in (number~) keyboard_key_pressed::$0 ← (byte) keyboard_key_pressed::key#6 & (number) 7 Adding number conversion cast (unumber) keyboard_key_pressed::$0 in (number~) keyboard_key_pressed::$0 ← (byte) keyboard_key_pressed::key#6 & (unumber)(number) 7 Adding number conversion cast (unumber) 3 in (byte~) keyboard_key_pressed::$1 ← (byte) keyboard_key_pressed::key#6 >> (number) 3 @@ -963,16 +841,16 @@ Adding number conversion cast (unumber) 8 in (number~) plot_chargen::$1 ← (wor Adding number conversion cast (unumber) plot_chargen::$1 in (number~) plot_chargen::$1 ← (word~) plot_chargen::$0 * (unumber)(number) 8 Adding number conversion cast (unumber) 0 in (bool~) plot_chargen::$3 ← (byte) plot_chargen::shift#2 != (number) 0 Adding number conversion cast (unumber) $32 in *((const byte*) PROCPORT) ← (number) $32 -Adding number conversion cast (unumber) $28 in (byte*~) plot_chargen::$5 ← (const byte*) SCREEN + (number) $28 -Adding number conversion cast (unumber) 1 in (byte*~) plot_chargen::$6 ← (byte*~) plot_chargen::$5 + (number) 1 -Adding number conversion cast (unumber) $a in (byte) mul8u::b#0 ← (number) $a -Adding number conversion cast (unumber) $800 in (byte*~) plot_chargen::$9 ← (byte*) plot_chargen::chargen#2 + (number) $800 -Adding number conversion cast (unumber) $80 in (number~) plot_chargen::$10 ← (byte) plot_chargen::bits#2 & (number) $80 -Adding number conversion cast (unumber) plot_chargen::$10 in (number~) plot_chargen::$10 ← (byte) plot_chargen::bits#2 & (unumber)(number) $80 -Adding number conversion cast (unumber) 0 in (bool~) plot_chargen::$11 ← (unumber~) plot_chargen::$10 != (number) 0 -Adding number conversion cast (unumber) 2 in (number~) plot_chargen::$13 ← (byte) plot_chargen::bits#3 * (number) 2 -Adding number conversion cast (unumber) plot_chargen::$13 in (number~) plot_chargen::$13 ← (byte) plot_chargen::bits#3 * (unumber)(number) 2 -Adding number conversion cast (unumber) $20 in (byte*~) plot_chargen::$15 ← (byte*) plot_chargen::sc#4 + (number) $20 +Adding number conversion cast (unumber) $29 in (byte*~) plot_chargen::$5 ← (const byte*) SCREEN + (number) $29 +Adding number conversion cast (unumber) $a in (number~) plot_chargen::$6 ← (byte) plot_chargen::pos#2 * (number) $a +Adding number conversion cast (unumber) plot_chargen::$6 in (number~) plot_chargen::$6 ← (byte) plot_chargen::pos#2 * (unumber)(number) $a +Adding number conversion cast (unumber) $800 in (byte*~) plot_chargen::$8 ← (byte*) plot_chargen::chargen#2 + (number) $800 +Adding number conversion cast (unumber) $80 in (number~) plot_chargen::$9 ← (byte) plot_chargen::bits#2 & (number) $80 +Adding number conversion cast (unumber) plot_chargen::$9 in (number~) plot_chargen::$9 ← (byte) plot_chargen::bits#2 & (unumber)(number) $80 +Adding number conversion cast (unumber) 0 in (bool~) plot_chargen::$10 ← (unumber~) plot_chargen::$9 != (number) 0 +Adding number conversion cast (unumber) 2 in (number~) plot_chargen::$12 ← (byte) plot_chargen::bits#3 * (number) 2 +Adding number conversion cast (unumber) plot_chargen::$12 in (number~) plot_chargen::$12 ← (byte) plot_chargen::bits#3 * (unumber)(number) 2 +Adding number conversion cast (unumber) $20 in (byte*~) plot_chargen::$14 ← (byte*) plot_chargen::sc#4 + (number) $20 Adding number conversion cast (unumber) $37 in *((const byte*) PROCPORT) ← (number) $37 Successful SSA optimization PassNAddNumberTypeConversions Inlining cast (byte) plot_chargen::ch#0 ← (unumber)(number) $20 @@ -985,7 +863,6 @@ Inlining cast (byte) main::shift#1 ← (unumber)(number) 1 Inlining cast (byte) main::shift#2 ← (unumber)(number) 0 Inlining cast (word~) plot_chargen::$0 ← (word)(byte) plot_chargen::ch#2 Inlining cast *((const byte*) PROCPORT) ← (unumber)(number) $32 -Inlining cast (byte) mul8u::b#0 ← (unumber)(number) $a Inlining cast *((const byte*) PROCPORT) ← (unumber)(number) $37 Successful SSA optimization Pass2InlineCast Simplifying constant pointer cast (byte*) 1 @@ -993,11 +870,6 @@ Simplifying constant pointer cast (byte*) 53248 Simplifying constant pointer cast (byte*) 56320 Simplifying constant pointer cast (byte*) 56321 Simplifying constant pointer cast (byte*) 1024 -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 integer cast 7 Simplifying constant integer cast 3 Simplifying constant integer cast $3e8 @@ -1027,8 +899,7 @@ Simplifying constant integer cast 0 Simplifying constant integer cast 8 Simplifying constant integer cast 0 Simplifying constant integer cast $32 -Simplifying constant integer cast $28 -Simplifying constant integer cast 1 +Simplifying constant integer cast $29 Simplifying constant integer cast $a Simplifying constant integer cast $800 Simplifying constant integer cast $80 @@ -1037,11 +908,6 @@ Simplifying constant integer cast 2 Simplifying constant integer cast $20 Simplifying constant integer cast $37 Successful SSA optimization PassNCastSimplification -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 (byte) 7 Finalized unsigned number type (byte) 3 Finalized unsigned number type (word) $3e8 @@ -1071,8 +937,7 @@ Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) 8 Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) $32 -Finalized unsigned number type (byte) $28 -Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) $29 Finalized unsigned number type (byte) $a Finalized unsigned number type (word) $800 Finalized unsigned number type (byte) $80 @@ -1081,27 +946,20 @@ Finalized unsigned number type (byte) 2 Finalized unsigned number type (byte) $20 Finalized unsigned number type (byte) $37 Successful SSA optimization PassNFinalizeNumberTypeConversions -Inferred type updated to byte in (unumber~) mul8u::$1 ← (byte) mul8u::a#3 & (byte) 1 Inferred type updated to byte in (unumber~) keyboard_key_pressed::$0 ← (byte) keyboard_key_pressed::key#6 & (byte) 7 Inferred type updated to word in (unumber~) plot_chargen::$1 ← (word~) plot_chargen::$0 * (byte) 8 -Inferred type updated to byte in (unumber~) plot_chargen::$10 ← (byte) plot_chargen::bits#2 & (byte) $80 -Inferred type updated to byte in (unumber~) plot_chargen::$13 ← (byte) plot_chargen::bits#3 * (byte) 2 -Inversing boolean not [9] (bool~) mul8u::$3 ← (byte~) mul8u::$1 == (byte) 0 from [8] (bool~) mul8u::$2 ← (byte~) mul8u::$1 != (byte) 0 -Inversing boolean not [98] (bool~) main::$17 ← (byte~) main::$15 == (byte) 0 from [97] (bool~) main::$16 ← (byte~) main::$15 != (byte) 0 -Inversing boolean not [107] (bool~) main::$20 ← (byte~) main::$18 == (byte) 0 from [106] (bool~) main::$19 ← (byte~) main::$18 != (byte) 0 -Inversing boolean not [117] (bool~) main::$23 ← (byte~) main::$21 == (byte) 0 from [116] (bool~) main::$22 ← (byte~) main::$21 != (byte) 0 -Inversing boolean not [127] (bool~) main::$26 ← (byte~) main::$24 == (byte) 0 from [126] (bool~) main::$25 ← (byte~) main::$24 != (byte) 0 -Inversing boolean not [154] (bool~) main::$31 ← (byte) main::key#0 == (byte) $3f from [153] (bool~) main::$30 ← (byte) main::key#0 != (byte) $3f -Inversing boolean not [158] (bool~) main::$34 ← (byte) main::pressed#2 == (byte) 0 from [157] (bool~) main::$33 ← (byte) main::pressed#2 != (byte) 0 -Inversing boolean not [196] (bool~) plot_chargen::$4 ← (byte) plot_chargen::shift#2 == (byte) 0 from [195] (bool~) plot_chargen::$3 ← (byte) plot_chargen::shift#2 != (byte) 0 -Inversing boolean not [221] (bool~) plot_chargen::$12 ← (byte~) plot_chargen::$10 == (byte) 0 from [220] (bool~) plot_chargen::$11 ← (byte~) plot_chargen::$10 != (byte) 0 +Inferred type updated to byte in (unumber~) plot_chargen::$6 ← (byte) plot_chargen::pos#2 * (byte) $a +Inferred type updated to byte in (unumber~) plot_chargen::$9 ← (byte) plot_chargen::bits#2 & (byte) $80 +Inferred type updated to byte in (unumber~) plot_chargen::$12 ← (byte) plot_chargen::bits#3 * (byte) 2 +Inversing boolean not [74] (bool~) main::$17 ← (byte~) main::$15 == (byte) 0 from [73] (bool~) main::$16 ← (byte~) main::$15 != (byte) 0 +Inversing boolean not [83] (bool~) main::$20 ← (byte~) main::$18 == (byte) 0 from [82] (bool~) main::$19 ← (byte~) main::$18 != (byte) 0 +Inversing boolean not [93] (bool~) main::$23 ← (byte~) main::$21 == (byte) 0 from [92] (bool~) main::$22 ← (byte~) main::$21 != (byte) 0 +Inversing boolean not [103] (bool~) main::$26 ← (byte~) main::$24 == (byte) 0 from [102] (bool~) main::$25 ← (byte~) main::$24 != (byte) 0 +Inversing boolean not [130] (bool~) main::$31 ← (byte) main::key#0 == (byte) $3f from [129] (bool~) main::$30 ← (byte) main::key#0 != (byte) $3f +Inversing boolean not [134] (bool~) main::$34 ← (byte) main::pressed#2 == (byte) 0 from [133] (bool~) main::$33 ← (byte) main::pressed#2 != (byte) 0 +Inversing boolean not [172] (bool~) plot_chargen::$4 ← (byte) plot_chargen::shift#2 == (byte) 0 from [171] (bool~) plot_chargen::$3 ← (byte) plot_chargen::shift#2 != (byte) 0 +Inversing boolean not [191] (bool~) plot_chargen::$11 ← (byte~) plot_chargen::$9 == (byte) 0 from [190] (bool~) plot_chargen::$10 ← (byte~) plot_chargen::$9 != (byte) 0 Successful SSA optimization Pass2UnaryNotSimplification -Alias mul8u::a#2 = mul8u::a#3 mul8u::a#6 -Alias mul8u::mb#3 = mul8u::mb#4 mul8u::mb#5 -Alias mul8u::res#2 = mul8u::res#5 mul8u::res#4 mul8u::return#0 mul8u::res#3 mul8u::return#3 mul8u::return#1 -Alias mul8u::a#0 = mul8u::$5 -Alias mul8u::mb#1 = mul8u::$6 -Alias mul8u::res#1 = mul8u::$4 Alias keyboard_matrix_read::return#0 = keyboard_matrix_read::row_pressed_bits#0 keyboard_matrix_read::$0 keyboard_matrix_read::return#3 keyboard_matrix_read::return#1 Alias keyboard_key_pressed::colidx#0 = keyboard_key_pressed::$0 keyboard_key_pressed::colidx#1 Alias keyboard_key_pressed::rowidx#0 = keyboard_key_pressed::$1 @@ -1139,24 +997,20 @@ Alias main::cur_pos#12 = main::cur_pos#26 Alias print_str_at::str#5 = print_str_at::str#6 Alias print_str_at::at#5 = print_str_at::at#6 Alias plot_chargen::chargen#0 = plot_chargen::$2 plot_chargen::chargen#2 -Alias mul8u::return#2 = mul8u::return#4 -Alias plot_chargen::chargen#5 = plot_chargen::chargen#6 -Alias plot_chargen::sc#0 = plot_chargen::$8 +Alias plot_chargen::sc#0 = plot_chargen::$7 Alias plot_chargen::pos#3 = plot_chargen::pos#4 -Alias plot_chargen::chargen#1 = plot_chargen::$9 -Alias plot_chargen::bits#1 = plot_chargen::$13 +Alias plot_chargen::chargen#1 = plot_chargen::$8 +Alias plot_chargen::bits#1 = plot_chargen::$12 Alias plot_chargen::sc#5 = plot_chargen::sc#6 Alias plot_chargen::bits#2 = plot_chargen::bits#4 Alias plot_chargen::x#3 = plot_chargen::x#4 Alias plot_chargen::y#5 = plot_chargen::y#6 -Alias plot_chargen::chargen#8 = plot_chargen::chargen#9 +Alias plot_chargen::chargen#7 = plot_chargen::chargen#8 Alias plot_chargen::sc#1 = plot_chargen::sc#4 Alias plot_chargen::y#3 = plot_chargen::y#4 -Alias plot_chargen::chargen#4 = plot_chargen::chargen#7 -Alias plot_chargen::sc#2 = plot_chargen::$15 +Alias plot_chargen::chargen#5 = plot_chargen::chargen#6 +Alias plot_chargen::sc#2 = plot_chargen::$14 Successful SSA optimization Pass2AliasElimination -Alias mul8u::a#2 = mul8u::a#4 -Alias mul8u::mb#2 = mul8u::mb#3 Alias main::cur_pos#11 = main::cur_pos#13 Alias main::ch#2 = main::ch#4 main::ch#3 Alias main::cur_pos#10 = main::cur_pos#15 main::cur_pos#12 @@ -1166,45 +1020,40 @@ Alias plot_chargen::sc#3 = plot_chargen::sc#5 Alias plot_chargen::bits#2 = plot_chargen::bits#3 Alias plot_chargen::x#2 = plot_chargen::x#3 Alias plot_chargen::y#3 = plot_chargen::y#5 -Alias plot_chargen::chargen#4 = plot_chargen::chargen#8 +Alias plot_chargen::chargen#5 = plot_chargen::chargen#7 Successful SSA optimization Pass2AliasElimination -Identical Phi Values (byte) mul8u::b#1 (byte) mul8u::b#0 -Identical Phi Values (byte) mul8u::a#5 (byte) mul8u::a#1 Identical Phi Values (byte) keyboard_matrix_read::rowid#1 (byte) keyboard_matrix_read::rowid#0 Identical Phi Values (byte) keyboard_get_keycode::ch#1 (byte) keyboard_get_keycode::ch#0 Identical Phi Values (byte) main::cur_pos#10 (byte) main::cur_pos#11 Identical Phi Values (byte) main::shift#10 (byte) main::shift#9 Identical Phi Values (byte) plot_chargen::y#3 (byte) plot_chargen::y#2 -Identical Phi Values (byte*) plot_chargen::chargen#4 (byte*) plot_chargen::chargen#3 +Identical Phi Values (byte*) plot_chargen::chargen#5 (byte*) plot_chargen::chargen#3 Successful SSA optimization Pass2IdenticalPhiElimination -Identical Phi Values (byte*) plot_chargen::chargen#3 (byte*) plot_chargen::chargen#5 +Identical Phi Values (byte*) plot_chargen::chargen#3 (byte*) plot_chargen::chargen#4 Successful SSA optimization Pass2IdenticalPhiElimination -Simple Condition (bool~) mul8u::$0 [5] if((byte) mul8u::a#2!=(byte) 0) goto mul8u::@2 -Simple Condition (bool~) mul8u::$3 [8] if((byte~) mul8u::$1==(byte) 0) goto mul8u::@4 -Simple Condition (bool~) main::$12 [34] if((byte*) main::sc#2<(byte*~) main::$11) goto main::@2 -Simple Condition (bool~) main::$14 [60] if((byte) main::i#1!=rangelast(0,3)) goto main::@7 -Simple Condition (bool~) main::$17 [69] if((byte~) main::$15==(byte) 0) goto main::@10 -Simple Condition (bool~) main::$20 [76] if((byte~) main::$18==(byte) 0) goto main::@11 -Simple Condition (bool~) main::$23 [84] if((byte~) main::$21==(byte) 0) goto main::@12 -Simple Condition (bool~) main::$26 [92] if((byte~) main::$24==(byte) 0) goto main::@13 -Simple Condition (bool~) main::$28 [100] if((byte~) main::$27!=(byte) 0) goto main::@14 -Simple Condition (bool~) main::$31 [113] if((byte) main::key#0==(byte) $3f) goto main::@17 -Simple Condition (bool~) main::$34 [116] if((byte) main::pressed#2==(byte) 0) goto main::@18 -Simple Condition (bool~) main::$36 [123] if((byte) main::ch#1!=rangelast(0,$3f)) goto main::@16 -Simple Condition (bool~) print_str_at::$0 [133] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 -Simple Condition (bool~) plot_chargen::$4 [144] if((byte) plot_chargen::shift#2==(byte) 0) goto plot_chargen::@1 -Simple Condition (bool~) plot_chargen::$12 [164] if((byte~) plot_chargen::$10==(byte) 0) goto plot_chargen::@5 -Simple Condition (bool~) plot_chargen::$14 [171] if((byte) plot_chargen::x#1!=rangelast(0,7)) goto plot_chargen::@4 -Simple Condition (bool~) plot_chargen::$16 [176] if((byte) plot_chargen::y#1!=rangelast(0,7)) goto plot_chargen::@3 +Simple Condition (bool~) main::$12 [20] if((byte*) main::sc#2<(byte*~) main::$11) goto main::@2 +Simple Condition (bool~) main::$14 [46] if((byte) main::i#1!=rangelast(0,3)) goto main::@7 +Simple Condition (bool~) main::$17 [55] if((byte~) main::$15==(byte) 0) goto main::@10 +Simple Condition (bool~) main::$20 [62] if((byte~) main::$18==(byte) 0) goto main::@11 +Simple Condition (bool~) main::$23 [70] if((byte~) main::$21==(byte) 0) goto main::@12 +Simple Condition (bool~) main::$26 [78] if((byte~) main::$24==(byte) 0) goto main::@13 +Simple Condition (bool~) main::$28 [86] if((byte~) main::$27!=(byte) 0) goto main::@14 +Simple Condition (bool~) main::$31 [99] if((byte) main::key#0==(byte) $3f) goto main::@17 +Simple Condition (bool~) main::$34 [102] if((byte) main::pressed#2==(byte) 0) goto main::@18 +Simple Condition (bool~) main::$36 [109] if((byte) main::ch#1!=rangelast(0,$3f)) goto main::@16 +Simple Condition (bool~) print_str_at::$0 [119] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 +Simple Condition (bool~) plot_chargen::$4 [130] if((byte) plot_chargen::shift#2==(byte) 0) goto plot_chargen::@1 +Simple Condition (bool~) plot_chargen::$11 [145] if((byte~) plot_chargen::$9==(byte) 0) goto plot_chargen::@5 +Simple Condition (bool~) plot_chargen::$13 [152] if((byte) plot_chargen::x#1!=rangelast(0,7)) goto plot_chargen::@4 +Simple Condition (bool~) plot_chargen::$15 [157] if((byte) plot_chargen::y#1!=rangelast(0,7)) goto plot_chargen::@3 Successful SSA optimization Pass2ConditionalJumpSimplification -Constant right-side identified [32] (byte*~) main::$11 ← (const byte*) SCREEN + (word) $3e8 -Constant right-side identified [37] (byte*) print_str_at::at#0 ← (const byte*) SCREEN + (byte) 1 -Constant right-side identified [40] (byte*~) main::$2 ← (const byte*) SCREEN + (byte) 1 -Constant right-side identified [44] (byte*~) main::$5 ← (const byte*) SCREEN + (byte) 1 -Constant right-side identified [48] (byte*~) main::$8 ← (const byte*) SCREEN + (byte) 1 -Constant right-side identified [147] (byte*~) plot_chargen::$5 ← (const byte*) SCREEN + (byte) $28 +Constant right-side identified [18] (byte*~) main::$11 ← (const byte*) SCREEN + (word) $3e8 +Constant right-side identified [23] (byte*) print_str_at::at#0 ← (const byte*) SCREEN + (byte) 1 +Constant right-side identified [26] (byte*~) main::$2 ← (const byte*) SCREEN + (byte) 1 +Constant right-side identified [30] (byte*~) main::$5 ← (const byte*) SCREEN + (byte) 1 +Constant right-side identified [34] (byte*~) main::$8 ← (const byte*) SCREEN + (byte) 1 +Constant right-side identified [133] (byte*~) plot_chargen::$5 ← (const byte*) SCREEN + (byte) $29 Successful SSA optimization Pass2ConstantRValueConsolidation -Constant (const word) mul8u::res#0 = 0 Constant (const byte*) main::sc#0 = SCREEN Constant (const byte*) main::$11 = SCREEN+$3e8 Constant (const byte*) print_str_at::at#0 = SCREEN+1 @@ -1233,25 +1082,22 @@ Constant (const byte) main::shift#1 = 1 Constant (const byte) main::shift#2 = 0 Constant (const byte) main::ch#0 = 0 Constant (const byte) main::pressed#0 = 0 -Constant (const byte*) plot_chargen::$5 = SCREEN+$28 -Constant (const byte) mul8u::b#0 = $a +Constant (const byte*) plot_chargen::$5 = SCREEN+$29 Constant (const byte) plot_chargen::y#0 = 0 Constant (const byte) plot_chargen::x#0 = 0 Constant (const byte) plot_chargen::c#0 = '.' Constant (const byte) plot_chargen::c#1 = '*' Successful SSA optimization Pass2ConstantIdentification -Constant (const word) mul8u::mb#0 = (word)mul8u::b#0 -Successful SSA optimization Pass2ConstantIdentification -if() condition always true - replacing block destination [128] if(true) goto main::@9 +if() condition always true - replacing block destination [114] if(true) goto main::@9 Successful SSA optimization Pass2ConstantIfs -Resolved ranged next value [58] main::i#1 ← ++ main::i#2 to ++ -Resolved ranged comparison value [60] if(main::i#1!=rangelast(0,3)) goto main::@7 to (number) 4 -Resolved ranged next value [121] main::ch#1 ← ++ main::ch#2 to ++ -Resolved ranged comparison value [123] if(main::ch#1!=rangelast(0,$3f)) goto main::@16 to (number) $40 -Resolved ranged next value [169] plot_chargen::x#1 ← ++ plot_chargen::x#2 to ++ -Resolved ranged comparison value [171] if(plot_chargen::x#1!=rangelast(0,7)) goto plot_chargen::@4 to (number) 8 -Resolved ranged next value [174] plot_chargen::y#1 ← ++ plot_chargen::y#2 to ++ -Resolved ranged comparison value [176] if(plot_chargen::y#1!=rangelast(0,7)) goto plot_chargen::@3 to (number) 8 +Resolved ranged next value [44] main::i#1 ← ++ main::i#2 to ++ +Resolved ranged comparison value [46] if(main::i#1!=rangelast(0,3)) goto main::@7 to (number) 4 +Resolved ranged next value [107] main::ch#1 ← ++ main::ch#2 to ++ +Resolved ranged comparison value [109] if(main::ch#1!=rangelast(0,$3f)) goto main::@16 to (number) $40 +Resolved ranged next value [150] plot_chargen::x#1 ← ++ plot_chargen::x#2 to ++ +Resolved ranged comparison value [152] if(plot_chargen::x#1!=rangelast(0,7)) goto plot_chargen::@4 to (number) 8 +Resolved ranged next value [155] plot_chargen::y#1 ← ++ plot_chargen::y#2 to ++ +Resolved ranged comparison value [157] if(plot_chargen::y#1!=rangelast(0,7)) goto plot_chargen::@3 to (number) 8 Eliminating unused constant (const byte) main::shift#0 Successful SSA optimization PassNEliminateUnusedVars Removing unused block main::@return @@ -1271,21 +1117,18 @@ Finalized unsigned number type (byte) $40 Finalized unsigned number type (byte) 8 Finalized unsigned number type (byte) 8 Successful SSA optimization PassNFinalizeNumberTypeConversions -Constant right-side identified [28] (byte*) print_str_at::at#1 ← (const byte*) main::$2 + (byte) $a -Constant right-side identified [30] (byte*) print_str_at::at#2 ← (const byte*) main::$5 + (byte) $14 -Constant right-side identified [32] (byte*) print_str_at::at#3 ← (const byte*) main::$8 + (byte) $1e -Constant right-side identified [98] (byte*~) plot_chargen::$6 ← (const byte*) plot_chargen::$5 + (byte) 1 +Constant right-side identified [19] (byte*) print_str_at::at#1 ← (const byte*) main::$2 + (byte) $a +Constant right-side identified [21] (byte*) print_str_at::at#2 ← (const byte*) main::$5 + (byte) $14 +Constant right-side identified [23] (byte*) print_str_at::at#3 ← (const byte*) main::$8 + (byte) $1e Successful SSA optimization Pass2ConstantRValueConsolidation Constant (const byte*) print_str_at::at#1 = main::$2+$a Constant (const byte*) print_str_at::at#2 = main::$5+$14 Constant (const byte*) print_str_at::at#3 = main::$8+$1e -Constant (const byte*) plot_chargen::$6 = plot_chargen::$5+1 Successful SSA optimization Pass2ConstantIdentification -Rewriting multiplication to use shift [90] (word~) plot_chargen::$1 ← (word~) plot_chargen::$0 * (byte) 8 -Rewriting multiplication to use shift [109] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 * (byte) 2 +Rewriting multiplication to use shift [81] (word~) plot_chargen::$1 ← (word~) plot_chargen::$0 * (byte) 8 +Rewriting multiplication to use shift and addition[86] (byte~) plot_chargen::$6 ← (byte) plot_chargen::pos#2 * (byte) $a +Rewriting multiplication to use shift [97] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 * (byte) 2 Successful SSA optimization Pass2MultiplyToShiftRewriting -Inlining constant with var siblings (const word) mul8u::res#0 -Inlining constant with var siblings (const word) mul8u::mb#0 Inlining constant with var siblings (const byte) keyboard_key_pressed::key#0 Inlining constant with var siblings (const byte) keyboard_key_pressed::key#1 Inlining constant with var siblings (const byte) keyboard_key_pressed::key#2 @@ -1330,20 +1173,17 @@ Constant inlined print_str_at::str#0 = (const byte*) main::str Constant inlined main::$11 = (const byte*) SCREEN+(word) $3e8 Constant inlined main::shift#2 = (byte) 0 Constant inlined main::i#0 = (byte) 0 -Constant inlined plot_chargen::$6 = (const byte*) SCREEN+(byte) $28+(byte) 1 -Constant inlined plot_chargen::$5 = (const byte*) SCREEN+(byte) $28 +Constant inlined plot_chargen::$5 = (const byte*) SCREEN+(byte) $29 Constant inlined plot_chargen::shift#0 = (byte) 0 Constant inlined main::ch#0 = (byte) 0 Constant inlined keyboard_key_pressed::key#0 = (const byte) KEY_F1 Constant inlined plot_chargen::ch#0 = (byte) $20 Constant inlined keyboard_key_pressed::key#1 = (const byte) KEY_F3 Constant inlined keyboard_key_pressed::key#4 = (const byte) KEY_LSHIFT -Constant inlined mul8u::mb#0 = (word)(const byte) mul8u::b#0 Constant inlined keyboard_key_pressed::key#2 = (const byte) KEY_F5 Constant inlined keyboard_key_pressed::key#3 = (const byte) KEY_F7 Constant inlined main::sc#0 = (const byte*) SCREEN Constant inlined main::cur_pos#3 = (byte) 2 -Constant inlined mul8u::res#0 = (word) 0 Constant inlined main::cur_pos#4 = (byte) 3 Constant inlined main::cur_pos#1 = (byte) 0 Constant inlined main::$2 = (const byte*) SCREEN+(byte) 1 @@ -1355,19 +1195,20 @@ Constant inlined main::$8 = (const byte*) SCREEN+(byte) 1 Constant inlined main::pressed#0 = (byte) 0 Constant inlined plot_chargen::x#0 = (byte) 0 Successful SSA optimization Pass2ConstantInlining -Added new block during phi lifting mul8u::@10(between mul8u::@2 and mul8u::@4) +Alias plot_chargen::$6 = plot_chargen::$18 +Successful SSA optimization Pass2AliasElimination Added new block during phi lifting main::@42(between main::@33 and main::@7) Added new block during phi lifting main::@43(between main::@34 and main::@10) Added new block during phi lifting main::@44(between main::@35 and main::@11) Added new block during phi lifting main::@45(between main::@36 and main::@12) Added new block during phi lifting main::@46(between main::@37 and main::@13) Added new block during phi lifting main::@47(between main::@18 and main::@16) -Added new block during phi lifting plot_chargen::@10(between plot_chargen and plot_chargen::@1) -Added new block during phi lifting plot_chargen::@11(between plot_chargen::@7 and plot_chargen::@3) -Added new block during phi lifting plot_chargen::@12(between plot_chargen::@5 and plot_chargen::@4) +Added new block during phi lifting plot_chargen::@9(between plot_chargen and plot_chargen::@1) +Added new block during phi lifting plot_chargen::@10(between plot_chargen::@7 and plot_chargen::@3) +Added new block during phi lifting plot_chargen::@11(between plot_chargen::@5 and plot_chargen::@4) Adding NOP phi() at start of @begin -Adding NOP phi() at start of @19 -Adding NOP phi() at start of @20 +Adding NOP phi() at start of @14 +Adding NOP phi() at start of @15 Adding NOP phi() at start of @end Adding NOP phi() at start of main Adding NOP phi() at start of main::@3 @@ -1384,14 +1225,12 @@ Adding NOP phi() at start of main::@27 Adding NOP phi() at start of main::@41 Adding NOP phi() at start of main::@14 Adding NOP phi() at start of plot_chargen::@6 -Adding NOP phi() at start of mul8u::@3 CALL GRAPH Calls in [] to main:2 Calls in [main] to print_str_at:9 print_str_at:11 print_str_at:13 print_str_at:15 plot_chargen:20 keyboard_key_pressed:25 keyboard_key_pressed:31 keyboard_key_pressed:37 keyboard_key_pressed:43 keyboard_key_pressed:49 keyboard_get_keycode:57 keyboard_key_pressed:63 plot_chargen:75 -Calls in [plot_chargen] to mul8u:101 -Calls in [keyboard_key_pressed] to keyboard_matrix_read:152 +Calls in [keyboard_key_pressed] to keyboard_matrix_read:135 -Created 29 initial phi equivalence classes +Created 25 initial phi equivalence classes Coalesced [19] plot_chargen::pos#6 ← plot_chargen::pos#0 Coalesced [62] keyboard_key_pressed::key#7 ← keyboard_key_pressed::key#5 Coalesced [66] main::pressed#4 ← main::pressed#1 @@ -1406,28 +1245,22 @@ Coalesced [84] main::cur_pos#29 ← main::cur_pos#22 Coalesced (already) [85] main::cur_pos#28 ← main::cur_pos#24 Coalesced [86] main::i#4 ← main::i#1 Coalesced [89] main::sc#4 ← main::sc#1 -Coalesced [97] plot_chargen::chargen#11 ← plot_chargen::chargen#1 -Coalesced [105] plot_chargen::sc#9 ← plot_chargen::sc#0 -Coalesced [108] plot_chargen::bits#5 ← plot_chargen::bits#0 -Coalesced [109] plot_chargen::sc#10 ← plot_chargen::sc#7 -Coalesced [126] plot_chargen::y#7 ← plot_chargen::y#1 -Coalesced [127] plot_chargen::sc#8 ← plot_chargen::sc#2 -Coalesced [128] plot_chargen::bits#6 ← plot_chargen::bits#1 -Coalesced [129] plot_chargen::sc#11 ← plot_chargen::sc#1 -Coalesced [130] plot_chargen::x#5 ← plot_chargen::x#1 -Coalesced [131] plot_chargen::chargen#10 ← plot_chargen::chargen#0 -Coalesced [132] mul8u::a#7 ← mul8u::a#1 -Coalesced [140] mul8u::res#9 ← mul8u::res#1 -Coalesced [144] mul8u::a#8 ← mul8u::a#0 -Coalesced [145] mul8u::res#7 ← mul8u::res#6 -Coalesced [146] mul8u::mb#6 ← mul8u::mb#1 -Coalesced (already) [147] mul8u::res#8 ← mul8u::res#2 -Coalesced [163] print_str_at::str#8 ← print_str_at::str#7 -Coalesced [164] print_str_at::at#8 ← print_str_at::at#7 -Coalesced [171] print_str_at::str#9 ← print_str_at::str#4 -Coalesced [172] print_str_at::at#9 ← print_str_at::at#4 -Coalesced down to 21 phi equivalence classes -Culled Empty Block (label) @20 +Coalesced [97] plot_chargen::chargen#10 ← plot_chargen::chargen#1 +Coalesced [104] plot_chargen::sc#8 ← plot_chargen::sc#0 +Coalesced [107] plot_chargen::bits#5 ← plot_chargen::bits#0 +Coalesced [108] plot_chargen::sc#10 ← plot_chargen::sc#7 +Coalesced [125] plot_chargen::y#7 ← plot_chargen::y#1 +Coalesced [126] plot_chargen::sc#9 ← plot_chargen::sc#2 +Coalesced [127] plot_chargen::bits#6 ← plot_chargen::bits#1 +Coalesced [128] plot_chargen::sc#11 ← plot_chargen::sc#1 +Coalesced [129] plot_chargen::x#5 ← plot_chargen::x#1 +Coalesced [130] plot_chargen::chargen#9 ← plot_chargen::chargen#0 +Coalesced [146] print_str_at::str#8 ← print_str_at::str#7 +Coalesced [147] print_str_at::at#8 ← print_str_at::at#7 +Coalesced [154] print_str_at::str#9 ← print_str_at::str#4 +Coalesced [155] print_str_at::at#9 ← print_str_at::at#4 +Coalesced down to 18 phi equivalence classes +Culled Empty Block (label) @15 Culled Empty Block (label) main::@32 Culled Empty Block (label) main::@8 Culled Empty Block (label) main::@23 @@ -1439,14 +1272,10 @@ Culled Empty Block (label) main::@41 Culled Empty Block (label) main::@21 Culled Empty Block (label) main::@47 Culled Empty Block (label) main::@42 -Culled Empty Block (label) plot_chargen::@11 -Culled Empty Block (label) plot_chargen::@12 Culled Empty Block (label) plot_chargen::@10 -Culled Empty Block (label) mul8u::@3 -Culled Empty Block (label) mul8u::@10 -Renumbering block @19 to @1 -Renumbering block mul8u::@4 to mul8u::@3 -Renumbering block mul8u::@7 to mul8u::@4 +Culled Empty Block (label) plot_chargen::@11 +Culled Empty Block (label) plot_chargen::@9 +Renumbering block @14 to @1 Renumbering block keyboard_key_pressed::@2 to keyboard_key_pressed::@1 Renumbering block main::@7 to main::@4 Renumbering block main::@9 to main::@5 @@ -1490,7 +1319,6 @@ Adding NOP phi() at start of main::@30 Adding NOP phi() at start of main::@31 Adding NOP phi() at start of main::@10 Adding NOP phi() at start of plot_chargen::@6 -Adding NOP phi() at start of mul8u FINAL CONTROL FLOW GRAPH @begin: scope:[] from @@ -1651,129 +1479,100 @@ plot_chargen::@2: scope:[plot_chargen] from plot_chargen [77] (byte*) plot_chargen::chargen#1 ← (byte*) plot_chargen::chargen#0 + (word) $800 to:plot_chargen::@1 plot_chargen::@1: scope:[plot_chargen] from plot_chargen plot_chargen::@2 - [78] (byte*) plot_chargen::chargen#5 ← phi( plot_chargen/(byte*) plot_chargen::chargen#0 plot_chargen::@2/(byte*) plot_chargen::chargen#1 ) + [78] (byte*) plot_chargen::chargen#4 ← phi( plot_chargen/(byte*) plot_chargen::chargen#0 plot_chargen::@2/(byte*) plot_chargen::chargen#1 ) [79] *((const byte*) PROCPORT) ← (byte) $32 - [80] (byte) mul8u::a#1 ← (byte) plot_chargen::pos#2 - [81] call mul8u - [82] (word) mul8u::return#2 ← (word) mul8u::res#2 - to:plot_chargen::@9 -plot_chargen::@9: scope:[plot_chargen] from plot_chargen::@1 - [83] (word~) plot_chargen::$7 ← (word) mul8u::return#2 - [84] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN+(byte) $28+(byte) 1 + (word~) plot_chargen::$7 + [80] (byte~) plot_chargen::$16 ← (byte) plot_chargen::pos#2 << (byte) 2 + [81] (byte~) plot_chargen::$17 ← (byte~) plot_chargen::$16 + (byte) plot_chargen::pos#2 + [82] (byte~) plot_chargen::$6 ← (byte~) plot_chargen::$17 << (byte) 1 + [83] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN+(byte) $29 + (byte~) plot_chargen::$6 to:plot_chargen::@3 -plot_chargen::@3: scope:[plot_chargen] from plot_chargen::@7 plot_chargen::@9 - [85] (byte*) plot_chargen::sc#7 ← phi( plot_chargen::@7/(byte*) plot_chargen::sc#2 plot_chargen::@9/(byte*) plot_chargen::sc#0 ) - [85] (byte) plot_chargen::y#2 ← phi( plot_chargen::@7/(byte) plot_chargen::y#1 plot_chargen::@9/(byte) 0 ) - [86] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#5 + (byte) plot_chargen::y#2) +plot_chargen::@3: scope:[plot_chargen] from plot_chargen::@1 plot_chargen::@7 + [84] (byte*) plot_chargen::sc#7 ← phi( plot_chargen::@1/(byte*) plot_chargen::sc#0 plot_chargen::@7/(byte*) plot_chargen::sc#2 ) + [84] (byte) plot_chargen::y#2 ← phi( plot_chargen::@1/(byte) 0 plot_chargen::@7/(byte) plot_chargen::y#1 ) + [85] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#4 + (byte) plot_chargen::y#2) to:plot_chargen::@4 plot_chargen::@4: scope:[plot_chargen] from plot_chargen::@3 plot_chargen::@5 - [87] (byte) plot_chargen::x#2 ← phi( plot_chargen::@3/(byte) 0 plot_chargen::@5/(byte) plot_chargen::x#1 ) - [87] (byte*) plot_chargen::sc#3 ← phi( plot_chargen::@3/(byte*) plot_chargen::sc#7 plot_chargen::@5/(byte*) plot_chargen::sc#1 ) - [87] (byte) plot_chargen::bits#2 ← phi( plot_chargen::@3/(byte) plot_chargen::bits#0 plot_chargen::@5/(byte) plot_chargen::bits#1 ) - [88] (byte~) plot_chargen::$10 ← (byte) plot_chargen::bits#2 & (byte) $80 - [89] if((byte~) plot_chargen::$10==(byte) 0) goto plot_chargen::@5 + [86] (byte) plot_chargen::x#2 ← phi( plot_chargen::@3/(byte) 0 plot_chargen::@5/(byte) plot_chargen::x#1 ) + [86] (byte*) plot_chargen::sc#3 ← phi( plot_chargen::@3/(byte*) plot_chargen::sc#7 plot_chargen::@5/(byte*) plot_chargen::sc#1 ) + [86] (byte) plot_chargen::bits#2 ← phi( plot_chargen::@3/(byte) plot_chargen::bits#0 plot_chargen::@5/(byte) plot_chargen::bits#1 ) + [87] (byte~) plot_chargen::$9 ← (byte) plot_chargen::bits#2 & (byte) $80 + [88] if((byte~) plot_chargen::$9==(byte) 0) goto plot_chargen::@5 to:plot_chargen::@6 plot_chargen::@6: scope:[plot_chargen] from plot_chargen::@4 - [90] phi() + [89] phi() to:plot_chargen::@5 plot_chargen::@5: scope:[plot_chargen] from plot_chargen::@4 plot_chargen::@6 - [91] (byte) plot_chargen::c#2 ← phi( plot_chargen::@4/(byte) '.' plot_chargen::@6/(byte) '*' ) - [92] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 - [93] (byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3 - [94] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 << (byte) 1 - [95] (byte) plot_chargen::x#1 ← ++ (byte) plot_chargen::x#2 - [96] if((byte) plot_chargen::x#1!=(byte) 8) goto plot_chargen::@4 + [90] (byte) plot_chargen::c#2 ← phi( plot_chargen::@4/(byte) '.' plot_chargen::@6/(byte) '*' ) + [91] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 + [92] (byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3 + [93] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 << (byte) 1 + [94] (byte) plot_chargen::x#1 ← ++ (byte) plot_chargen::x#2 + [95] if((byte) plot_chargen::x#1!=(byte) 8) goto plot_chargen::@4 to:plot_chargen::@7 plot_chargen::@7: scope:[plot_chargen] from plot_chargen::@5 - [97] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte) $20 - [98] (byte) plot_chargen::y#1 ← ++ (byte) plot_chargen::y#2 - [99] if((byte) plot_chargen::y#1!=(byte) 8) goto plot_chargen::@3 + [96] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte) $20 + [97] (byte) plot_chargen::y#1 ← ++ (byte) plot_chargen::y#2 + [98] if((byte) plot_chargen::y#1!=(byte) 8) goto plot_chargen::@3 to:plot_chargen::@8 plot_chargen::@8: scope:[plot_chargen] from plot_chargen::@7 - [100] *((const byte*) PROCPORT) ← (byte) $37 + [99] *((const byte*) PROCPORT) ← (byte) $37 asm { cli } to:plot_chargen::@return plot_chargen::@return: scope:[plot_chargen] from plot_chargen::@8 - [102] return + [101] return to:@return -(word()) mul8u((byte) mul8u::a , (byte) mul8u::b) -mul8u: scope:[mul8u] from plot_chargen::@1 - [103] phi() - to:mul8u::@1 -mul8u::@1: scope:[mul8u] from mul8u mul8u::@3 - [104] (word) mul8u::mb#2 ← phi( mul8u/(word)(const byte) mul8u::b#0 mul8u::@3/(word) mul8u::mb#1 ) - [104] (word) mul8u::res#2 ← phi( mul8u/(word) 0 mul8u::@3/(word) mul8u::res#6 ) - [104] (byte) mul8u::a#2 ← phi( mul8u/(byte) mul8u::a#1 mul8u::@3/(byte) mul8u::a#0 ) - [105] if((byte) mul8u::a#2!=(byte) 0) goto mul8u::@2 - to:mul8u::@return -mul8u::@return: scope:[mul8u] from mul8u::@1 - [106] return - to:@return -mul8u::@2: scope:[mul8u] from mul8u::@1 - [107] (byte~) mul8u::$1 ← (byte) mul8u::a#2 & (byte) 1 - [108] if((byte~) mul8u::$1==(byte) 0) goto mul8u::@3 - to:mul8u::@4 -mul8u::@4: scope:[mul8u] from mul8u::@2 - [109] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 - to:mul8u::@3 -mul8u::@3: scope:[mul8u] from mul8u::@2 mul8u::@4 - [110] (word) mul8u::res#6 ← phi( mul8u::@2/(word) mul8u::res#2 mul8u::@4/(word) mul8u::res#1 ) - [111] (byte) mul8u::a#0 ← (byte) mul8u::a#2 >> (byte) 1 - [112] (word) mul8u::mb#1 ← (word) mul8u::mb#2 << (byte) 1 - to:mul8u::@1 - (byte()) keyboard_key_pressed((byte) keyboard_key_pressed::key) keyboard_key_pressed: scope:[keyboard_key_pressed] from main::@15 main::@5 main::@6 main::@7 main::@8 main::@9 - [113] (byte) keyboard_key_pressed::key#6 ← phi( main::@6/(const byte) KEY_F3 main::@7/(const byte) KEY_F5 main::@8/(const byte) KEY_F7 main::@9/(const byte) KEY_LSHIFT main::@15/(byte) keyboard_key_pressed::key#5 main::@5/(const byte) KEY_F1 ) - [114] (byte) keyboard_key_pressed::colidx#0 ← (byte) keyboard_key_pressed::key#6 & (byte) 7 - [115] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte) 3 - [116] (byte) keyboard_matrix_read::rowid#0 ← (byte) keyboard_key_pressed::rowidx#0 - [117] call keyboard_matrix_read - [118] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0 + [102] (byte) keyboard_key_pressed::key#6 ← phi( main::@6/(const byte) KEY_F3 main::@7/(const byte) KEY_F5 main::@8/(const byte) KEY_F7 main::@9/(const byte) KEY_LSHIFT main::@15/(byte) keyboard_key_pressed::key#5 main::@5/(const byte) KEY_F1 ) + [103] (byte) keyboard_key_pressed::colidx#0 ← (byte) keyboard_key_pressed::key#6 & (byte) 7 + [104] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte) 3 + [105] (byte) keyboard_matrix_read::rowid#0 ← (byte) keyboard_key_pressed::rowidx#0 + [106] call keyboard_matrix_read + [107] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0 to:keyboard_key_pressed::@1 keyboard_key_pressed::@1: scope:[keyboard_key_pressed] from keyboard_key_pressed - [119] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2 - [120] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte*) keyboard_matrix_col_bitmask + (byte) keyboard_key_pressed::colidx#0) + [108] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2 + [109] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte*) keyboard_matrix_col_bitmask + (byte) keyboard_key_pressed::colidx#0) to:keyboard_key_pressed::@return keyboard_key_pressed::@return: scope:[keyboard_key_pressed] from keyboard_key_pressed::@1 - [121] return + [110] return to:@return (byte()) keyboard_matrix_read((byte) keyboard_matrix_read::rowid) keyboard_matrix_read: scope:[keyboard_matrix_read] from keyboard_key_pressed - [122] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask + (byte) keyboard_matrix_read::rowid#0) - [123] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B) + [111] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask + (byte) keyboard_matrix_read::rowid#0) + [112] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B) to:keyboard_matrix_read::@return keyboard_matrix_read::@return: scope:[keyboard_matrix_read] from keyboard_matrix_read - [124] return + [113] return to:@return (byte()) keyboard_get_keycode((byte) keyboard_get_keycode::ch) keyboard_get_keycode: scope:[keyboard_get_keycode] from main::@12 - [125] (byte) keyboard_get_keycode::return#0 ← *((const byte*) keyboard_char_keycodes + (byte) keyboard_get_keycode::ch#0) + [114] (byte) keyboard_get_keycode::return#0 ← *((const byte*) keyboard_char_keycodes + (byte) keyboard_get_keycode::ch#0) to:keyboard_get_keycode::@return keyboard_get_keycode::@return: scope:[keyboard_get_keycode] from keyboard_get_keycode - [126] return + [115] return to:@return (void()) print_str_at((byte*) print_str_at::str , (byte*) print_str_at::at) print_str_at: scope:[print_str_at] from main::@17 main::@18 main::@19 main::@3 - [127] (byte*) print_str_at::at#7 ← phi( main::@17/(const byte*) SCREEN+(byte) 1+(byte) $a main::@3/(const byte*) SCREEN+(byte) 1 main::@18/(const byte*) SCREEN+(byte) 1+(byte) $14 main::@19/(const byte*) SCREEN+(byte) 1+(byte) $1e ) - [127] (byte*) print_str_at::str#7 ← phi( main::@17/(const byte*) main::str1 main::@3/(const byte*) main::str main::@18/(const byte*) main::str2 main::@19/(const byte*) main::str3 ) + [116] (byte*) print_str_at::at#7 ← phi( main::@17/(const byte*) SCREEN+(byte) 1+(byte) $a main::@3/(const byte*) SCREEN+(byte) 1 main::@18/(const byte*) SCREEN+(byte) 1+(byte) $14 main::@19/(const byte*) SCREEN+(byte) 1+(byte) $1e ) + [116] (byte*) print_str_at::str#7 ← phi( main::@17/(const byte*) main::str1 main::@3/(const byte*) main::str main::@18/(const byte*) main::str2 main::@19/(const byte*) main::str3 ) to:print_str_at::@1 print_str_at::@1: scope:[print_str_at] from print_str_at print_str_at::@2 - [128] (byte*) print_str_at::at#5 ← phi( print_str_at/(byte*) print_str_at::at#7 print_str_at::@2/(byte*) print_str_at::at#4 ) - [128] (byte*) print_str_at::str#5 ← phi( print_str_at/(byte*) print_str_at::str#7 print_str_at::@2/(byte*) print_str_at::str#4 ) - [129] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 + [117] (byte*) print_str_at::at#5 ← phi( print_str_at/(byte*) print_str_at::at#7 print_str_at::@2/(byte*) print_str_at::at#4 ) + [117] (byte*) print_str_at::str#5 ← phi( print_str_at/(byte*) print_str_at::str#7 print_str_at::@2/(byte*) print_str_at::str#4 ) + [118] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 to:print_str_at::@return print_str_at::@return: scope:[print_str_at] from print_str_at::@1 - [130] return + [119] return to:@return print_str_at::@2: scope:[print_str_at] from print_str_at::@1 - [131] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) - [132] (byte*) print_str_at::at#4 ← ++ (byte*) print_str_at::at#5 - [133] (byte*) print_str_at::str#4 ← ++ (byte*) print_str_at::str#5 + [120] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) + [121] (byte*) print_str_at::at#4 ← ++ (byte*) print_str_at::at#5 + [122] (byte*) print_str_at::str#4 ← ++ (byte*) print_str_at::str#5 to:print_str_at::@1 @@ -1836,27 +1635,13 @@ VARIABLE REGISTER WEIGHTS (byte*) main::sc#2 134.66666666666666 (byte) main::shift (byte) main::shift#9 52.68421052631579 -(word()) mul8u((byte) mul8u::a , (byte) mul8u::b) -(byte~) mul8u::$1 2.00000002E8 -(byte) mul8u::a -(byte) mul8u::a#0 1.00000001E8 -(byte) mul8u::a#1 55001.0 -(byte) mul8u::a#2 6.668333416666667E7 -(byte) mul8u::b -(word) mul8u::mb -(word) mul8u::mb#1 2.00000002E8 -(word) mul8u::mb#2 4.285714328571428E7 -(word) mul8u::res -(word) mul8u::res#1 2.00000002E8 -(word) mul8u::res#2 5.0001667333333336E7 -(word) mul8u::res#6 1.00000001E8 -(word) mul8u::return -(word) mul8u::return#2 20002.0 (void()) plot_chargen((byte) plot_chargen::pos , (byte) plot_chargen::ch , (byte) plot_chargen::shift) (word~) plot_chargen::$0 20002.0 (word~) plot_chargen::$1 20002.0 -(byte~) plot_chargen::$10 2.00000002E8 -(word~) plot_chargen::$7 20002.0 +(byte~) plot_chargen::$16 20002.0 +(byte~) plot_chargen::$17 20002.0 +(byte~) plot_chargen::$6 20002.0 +(byte~) plot_chargen::$9 2.00000002E8 (byte) plot_chargen::bits (byte) plot_chargen::bits#0 2.0000002E7 (byte) plot_chargen::bits#1 6.6666667333333336E7 @@ -1869,11 +1654,11 @@ VARIABLE REGISTER WEIGHTS (byte*) plot_chargen::chargen (byte*) plot_chargen::chargen#0 15001.5 (byte*) plot_chargen::chargen#1 20002.0 -(byte*) plot_chargen::chargen#5 455454.6818181818 +(byte*) plot_chargen::chargen#4 477143.0 (byte) plot_chargen::pos (byte) plot_chargen::pos#0 202.0 (byte) plot_chargen::pos#1 667.3333333333334 -(byte) plot_chargen::pos#2 1233.6666666666665 +(byte) plot_chargen::pos#2 2110.4 (byte*) plot_chargen::sc (byte*) plot_chargen::sc#0 20002.0 (byte*) plot_chargen::sc#1 5.250000075E7 @@ -1909,15 +1694,12 @@ Initial phi equivalence classes [ plot_chargen::ch#2 plot_chargen::ch#1 ] [ plot_chargen::shift#2 plot_chargen::shift#1 ] [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ] -[ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 ] +[ plot_chargen::chargen#4 plot_chargen::chargen#0 plot_chargen::chargen#1 ] [ plot_chargen::y#2 plot_chargen::y#1 ] [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] -[ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 ] +[ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#0 plot_chargen::sc#2 plot_chargen::sc#1 ] [ plot_chargen::x#2 plot_chargen::x#1 ] [ plot_chargen::c#2 ] -[ mul8u::a#2 mul8u::a#1 mul8u::a#0 ] -[ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] -[ mul8u::mb#2 mul8u::mb#1 ] [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ] [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ] @@ -1937,10 +1719,10 @@ Added variable main::key#0 to live range equivalence class [ main::key#0 ] Added variable keyboard_key_pressed::return#14 to live range equivalence class [ keyboard_key_pressed::return#14 ] Added variable plot_chargen::$0 to live range equivalence class [ plot_chargen::$0 ] Added variable plot_chargen::$1 to live range equivalence class [ plot_chargen::$1 ] -Added variable mul8u::return#2 to live range equivalence class [ mul8u::return#2 ] -Added variable plot_chargen::$7 to live range equivalence class [ plot_chargen::$7 ] -Added variable plot_chargen::$10 to live range equivalence class [ plot_chargen::$10 ] -Added variable mul8u::$1 to live range equivalence class [ mul8u::$1 ] +Added variable plot_chargen::$16 to live range equivalence class [ plot_chargen::$16 ] +Added variable plot_chargen::$17 to live range equivalence class [ plot_chargen::$17 ] +Added variable plot_chargen::$6 to live range equivalence class [ plot_chargen::$6 ] +Added variable plot_chargen::$9 to live range equivalence class [ plot_chargen::$9 ] Added variable keyboard_key_pressed::colidx#0 to live range equivalence class [ keyboard_key_pressed::colidx#0 ] Added variable keyboard_key_pressed::rowidx#0 to live range equivalence class [ keyboard_key_pressed::rowidx#0 ] Added variable keyboard_matrix_read::rowid#0 to live range equivalence class [ keyboard_matrix_read::rowid#0 ] @@ -1959,15 +1741,12 @@ Complete equivalence classes [ plot_chargen::ch#2 plot_chargen::ch#1 ] [ plot_chargen::shift#2 plot_chargen::shift#1 ] [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ] -[ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 ] +[ plot_chargen::chargen#4 plot_chargen::chargen#0 plot_chargen::chargen#1 ] [ plot_chargen::y#2 plot_chargen::y#1 ] [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] -[ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 ] +[ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#0 plot_chargen::sc#2 plot_chargen::sc#1 ] [ plot_chargen::x#2 plot_chargen::x#1 ] [ plot_chargen::c#2 ] -[ mul8u::a#2 mul8u::a#1 mul8u::a#0 ] -[ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] -[ mul8u::mb#2 mul8u::mb#1 ] [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ] [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ] @@ -1987,10 +1766,10 @@ Complete equivalence classes [ keyboard_key_pressed::return#14 ] [ plot_chargen::$0 ] [ plot_chargen::$1 ] -[ mul8u::return#2 ] -[ plot_chargen::$7 ] -[ plot_chargen::$10 ] -[ mul8u::$1 ] +[ plot_chargen::$16 ] +[ plot_chargen::$17 ] +[ plot_chargen::$6 ] +[ plot_chargen::$9 ] [ keyboard_key_pressed::colidx#0 ] [ keyboard_key_pressed::rowidx#0 ] [ keyboard_matrix_read::rowid#0 ] @@ -2008,46 +1787,43 @@ Allocated zp[1]:8 [ main::pressed#2 main::pressed#1 ] Allocated zp[1]:9 [ plot_chargen::ch#2 plot_chargen::ch#1 ] Allocated zp[1]:10 [ plot_chargen::shift#2 plot_chargen::shift#1 ] Allocated zp[1]:11 [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ] -Allocated zp[2]:12 [ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 ] +Allocated zp[2]:12 [ plot_chargen::chargen#4 plot_chargen::chargen#0 plot_chargen::chargen#1 ] Allocated zp[1]:14 [ plot_chargen::y#2 plot_chargen::y#1 ] Allocated zp[1]:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] -Allocated zp[2]:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 ] +Allocated zp[2]:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#0 plot_chargen::sc#2 plot_chargen::sc#1 ] Allocated zp[1]:18 [ plot_chargen::x#2 plot_chargen::x#1 ] Allocated zp[1]:19 [ plot_chargen::c#2 ] -Allocated zp[1]:20 [ mul8u::a#2 mul8u::a#1 mul8u::a#0 ] -Allocated zp[2]:21 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] -Allocated zp[2]:23 [ mul8u::mb#2 mul8u::mb#1 ] -Allocated zp[1]:25 [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ] -Allocated zp[2]:26 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] -Allocated zp[2]:28 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ] -Allocated zp[1]:30 [ keyboard_key_pressed::return#2 ] -Allocated zp[1]:31 [ main::$15 ] -Allocated zp[1]:32 [ keyboard_key_pressed::return#10 ] -Allocated zp[1]:33 [ main::$18 ] -Allocated zp[1]:34 [ keyboard_key_pressed::return#11 ] -Allocated zp[1]:35 [ main::$21 ] -Allocated zp[1]:36 [ keyboard_key_pressed::return#12 ] -Allocated zp[1]:37 [ main::$24 ] -Allocated zp[1]:38 [ keyboard_key_pressed::return#13 ] -Allocated zp[1]:39 [ main::$27 ] -Allocated zp[1]:40 [ keyboard_get_keycode::ch#0 ] -Allocated zp[1]:41 [ keyboard_get_keycode::return#2 ] -Allocated zp[1]:42 [ main::key#0 ] -Allocated zp[1]:43 [ keyboard_key_pressed::return#14 ] -Allocated zp[2]:44 [ plot_chargen::$0 ] -Allocated zp[2]:46 [ plot_chargen::$1 ] -Allocated zp[2]:48 [ mul8u::return#2 ] -Allocated zp[2]:50 [ plot_chargen::$7 ] -Allocated zp[1]:52 [ plot_chargen::$10 ] -Allocated zp[1]:53 [ mul8u::$1 ] -Allocated zp[1]:54 [ keyboard_key_pressed::colidx#0 ] -Allocated zp[1]:55 [ keyboard_key_pressed::rowidx#0 ] -Allocated zp[1]:56 [ keyboard_matrix_read::rowid#0 ] -Allocated zp[1]:57 [ keyboard_matrix_read::return#2 ] -Allocated zp[1]:58 [ keyboard_key_pressed::$2 ] -Allocated zp[1]:59 [ keyboard_key_pressed::return#0 ] -Allocated zp[1]:60 [ keyboard_matrix_read::return#0 ] -Allocated zp[1]:61 [ keyboard_get_keycode::return#0 ] +Allocated zp[1]:20 [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ] +Allocated zp[2]:21 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] +Allocated zp[2]:23 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ] +Allocated zp[1]:25 [ keyboard_key_pressed::return#2 ] +Allocated zp[1]:26 [ main::$15 ] +Allocated zp[1]:27 [ keyboard_key_pressed::return#10 ] +Allocated zp[1]:28 [ main::$18 ] +Allocated zp[1]:29 [ keyboard_key_pressed::return#11 ] +Allocated zp[1]:30 [ main::$21 ] +Allocated zp[1]:31 [ keyboard_key_pressed::return#12 ] +Allocated zp[1]:32 [ main::$24 ] +Allocated zp[1]:33 [ keyboard_key_pressed::return#13 ] +Allocated zp[1]:34 [ main::$27 ] +Allocated zp[1]:35 [ keyboard_get_keycode::ch#0 ] +Allocated zp[1]:36 [ keyboard_get_keycode::return#2 ] +Allocated zp[1]:37 [ main::key#0 ] +Allocated zp[1]:38 [ keyboard_key_pressed::return#14 ] +Allocated zp[2]:39 [ plot_chargen::$0 ] +Allocated zp[2]:41 [ plot_chargen::$1 ] +Allocated zp[1]:43 [ plot_chargen::$16 ] +Allocated zp[1]:44 [ plot_chargen::$17 ] +Allocated zp[1]:45 [ plot_chargen::$6 ] +Allocated zp[1]:46 [ plot_chargen::$9 ] +Allocated zp[1]:47 [ keyboard_key_pressed::colidx#0 ] +Allocated zp[1]:48 [ keyboard_key_pressed::rowidx#0 ] +Allocated zp[1]:49 [ keyboard_matrix_read::rowid#0 ] +Allocated zp[1]:50 [ keyboard_matrix_read::return#2 ] +Allocated zp[1]:51 [ keyboard_key_pressed::$2 ] +Allocated zp[1]:52 [ keyboard_key_pressed::return#0 ] +Allocated zp[1]:53 [ keyboard_matrix_read::return#0 ] +Allocated zp[1]:54 [ keyboard_get_keycode::return#0 ] INITIAL ASM Target platform is c64basic / MOS6502X @@ -2140,14 +1916,14 @@ __bend_from___b1: __bend: // main main: { - .label __15 = $1f - .label __18 = $21 - .label __21 = $23 - .label __24 = $25 - .label __27 = $27 + .label __15 = $1a + .label __18 = $1c + .label __21 = $1e + .label __24 = $20 + .label __27 = $22 .label sc = 2 .label i = 4 - .label key = $2a + .label key = $25 .label pressed = 8 .label ch = 7 // Which char canvas to use @@ -2181,14 +1957,14 @@ main: { __b3: // [8] call print_str_at // Plot 4 initial analysis chars - // [127] phi from main::@3 to print_str_at [phi:main::@3->print_str_at] + // [116] phi from main::@3 to print_str_at [phi:main::@3->print_str_at] print_str_at_from___b3: - // [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1 [phi:main::@3->print_str_at#0] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1 [phi:main::@3->print_str_at#0] -- pbuz1=pbuc1 lda #SCREEN+1 sta.z print_str_at.at+1 - // [127] phi (byte*) print_str_at::str#7 = (const byte*) main::str [phi:main::@3->print_str_at#1] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::str#7 = (const byte*) main::str [phi:main::@3->print_str_at#1] -- pbuz1=pbuc1 lda #str @@ -2200,14 +1976,14 @@ main: { // main::@17 __b17: // [10] call print_str_at - // [127] phi from main::@17 to print_str_at [phi:main::@17->print_str_at] + // [116] phi from main::@17 to print_str_at [phi:main::@17->print_str_at] print_str_at_from___b17: - // [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $a [phi:main::@17->print_str_at#0] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $a [phi:main::@17->print_str_at#0] -- pbuz1=pbuc1 lda #SCREEN+1+$a sta.z print_str_at.at+1 - // [127] phi (byte*) print_str_at::str#7 = (const byte*) main::str1 [phi:main::@17->print_str_at#1] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::str#7 = (const byte*) main::str1 [phi:main::@17->print_str_at#1] -- pbuz1=pbuc1 lda #str1 @@ -2219,14 +1995,14 @@ main: { // main::@18 __b18: // [12] call print_str_at - // [127] phi from main::@18 to print_str_at [phi:main::@18->print_str_at] + // [116] phi from main::@18 to print_str_at [phi:main::@18->print_str_at] print_str_at_from___b18: - // [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $14 [phi:main::@18->print_str_at#0] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $14 [phi:main::@18->print_str_at#0] -- pbuz1=pbuc1 lda #SCREEN+1+$14 sta.z print_str_at.at+1 - // [127] phi (byte*) print_str_at::str#7 = (const byte*) main::str2 [phi:main::@18->print_str_at#1] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::str#7 = (const byte*) main::str2 [phi:main::@18->print_str_at#1] -- pbuz1=pbuc1 lda #str2 @@ -2238,14 +2014,14 @@ main: { // main::@19 __b19: // [14] call print_str_at - // [127] phi from main::@19 to print_str_at [phi:main::@19->print_str_at] + // [116] phi from main::@19 to print_str_at [phi:main::@19->print_str_at] print_str_at_from___b19: - // [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $1e [phi:main::@19->print_str_at#0] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $1e [phi:main::@19->print_str_at#0] -- pbuz1=pbuc1 lda #SCREEN+1+$1e sta.z print_str_at.at+1 - // [127] phi (byte*) print_str_at::str#7 = (const byte*) main::str3 [phi:main::@19->print_str_at#1] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::str#7 = (const byte*) main::str3 [phi:main::@19->print_str_at#1] -- pbuz1=pbuc1 lda #str3 @@ -2295,9 +2071,9 @@ main: { // main::@5 __b5: // [21] call keyboard_key_pressed - // [113] phi from main::@5 to keyboard_key_pressed [phi:main::@5->keyboard_key_pressed] + // [102] phi from main::@5 to keyboard_key_pressed [phi:main::@5->keyboard_key_pressed] keyboard_key_pressed_from___b5: - // [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F1 [phi:main::@5->keyboard_key_pressed#0] -- vbuz1=vbuc1 + // [102] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F1 [phi:main::@5->keyboard_key_pressed#0] -- vbuz1=vbuc1 lda #KEY_F1 sta.z keyboard_key_pressed.key jsr keyboard_key_pressed @@ -2332,9 +2108,9 @@ main: { // main::@6 __b6: // [27] call keyboard_key_pressed - // [113] phi from main::@6 to keyboard_key_pressed [phi:main::@6->keyboard_key_pressed] + // [102] phi from main::@6 to keyboard_key_pressed [phi:main::@6->keyboard_key_pressed] keyboard_key_pressed_from___b6: - // [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F3 [phi:main::@6->keyboard_key_pressed#0] -- vbuz1=vbuc1 + // [102] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F3 [phi:main::@6->keyboard_key_pressed#0] -- vbuz1=vbuc1 lda #KEY_F3 sta.z keyboard_key_pressed.key jsr keyboard_key_pressed @@ -2369,9 +2145,9 @@ main: { // main::@7 __b7: // [33] call keyboard_key_pressed - // [113] phi from main::@7 to keyboard_key_pressed [phi:main::@7->keyboard_key_pressed] + // [102] phi from main::@7 to keyboard_key_pressed [phi:main::@7->keyboard_key_pressed] keyboard_key_pressed_from___b7: - // [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F5 [phi:main::@7->keyboard_key_pressed#0] -- vbuz1=vbuc1 + // [102] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F5 [phi:main::@7->keyboard_key_pressed#0] -- vbuz1=vbuc1 lda #KEY_F5 sta.z keyboard_key_pressed.key jsr keyboard_key_pressed @@ -2406,9 +2182,9 @@ main: { // main::@8 __b8: // [39] call keyboard_key_pressed - // [113] phi from main::@8 to keyboard_key_pressed [phi:main::@8->keyboard_key_pressed] + // [102] phi from main::@8 to keyboard_key_pressed [phi:main::@8->keyboard_key_pressed] keyboard_key_pressed_from___b8: - // [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F7 [phi:main::@8->keyboard_key_pressed#0] -- vbuz1=vbuc1 + // [102] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F7 [phi:main::@8->keyboard_key_pressed#0] -- vbuz1=vbuc1 lda #KEY_F7 sta.z keyboard_key_pressed.key jsr keyboard_key_pressed @@ -2443,9 +2219,9 @@ main: { // main::@9 __b9: // [45] call keyboard_key_pressed - // [113] phi from main::@9 to keyboard_key_pressed [phi:main::@9->keyboard_key_pressed] + // [102] phi from main::@9 to keyboard_key_pressed [phi:main::@9->keyboard_key_pressed] keyboard_key_pressed_from___b9: - // [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_LSHIFT [phi:main::@9->keyboard_key_pressed#0] -- vbuz1=vbuc1 + // [102] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_LSHIFT [phi:main::@9->keyboard_key_pressed#0] -- vbuz1=vbuc1 lda #KEY_LSHIFT sta.z keyboard_key_pressed.key jsr keyboard_key_pressed @@ -2519,9 +2295,9 @@ main: { lda.z key sta.z keyboard_key_pressed.key // [58] call keyboard_key_pressed - // [113] phi from main::@15 to keyboard_key_pressed [phi:main::@15->keyboard_key_pressed] + // [102] phi from main::@15 to keyboard_key_pressed [phi:main::@15->keyboard_key_pressed] keyboard_key_pressed_from___b15: - // [113] phi (byte) keyboard_key_pressed::key#6 = (byte) keyboard_key_pressed::key#5 [phi:main::@15->keyboard_key_pressed#0] -- register_copy + // [102] phi (byte) keyboard_key_pressed::key#6 = (byte) keyboard_key_pressed::key#5 [phi:main::@15->keyboard_key_pressed#0] -- register_copy jsr keyboard_key_pressed // [59] (byte) keyboard_key_pressed::return#14 ← (byte) keyboard_key_pressed::return#0 -- vbuz1=vbuz2 lda.z keyboard_key_pressed.return @@ -2608,10 +2384,10 @@ main: { // Render 8x8 char (ch) as pixels on char canvas #pos // plot_chargen(byte zp($b) pos, byte zp(9) ch, byte zp($a) shift) plot_chargen: { - .label __0 = $2c - .label __1 = $2e - .label __7 = $32 - .label __10 = $34 + .label __0 = $27 + .label __1 = $29 + .label __6 = $2d + .label __9 = $2e .label pos = $b .label ch = 9 .label shift = $a @@ -2621,6 +2397,8 @@ plot_chargen: { .label x = $12 .label y = $e .label c = $13 + .label __16 = $2b + .label __17 = $2c // asm { sei } sei // [73] (word~) plot_chargen::$0 ← (word)(byte) plot_chargen::ch#2 -- vwuz1=_word_vbuz2 @@ -2665,123 +2443,117 @@ plot_chargen: { // [78] phi from plot_chargen plot_chargen::@2 to plot_chargen::@1 [phi:plot_chargen/plot_chargen::@2->plot_chargen::@1] __b1_from_plot_chargen: __b1_from___b2: - // [78] phi (byte*) plot_chargen::chargen#5 = (byte*) plot_chargen::chargen#0 [phi:plot_chargen/plot_chargen::@2->plot_chargen::@1#0] -- register_copy + // [78] phi (byte*) plot_chargen::chargen#4 = (byte*) plot_chargen::chargen#0 [phi:plot_chargen/plot_chargen::@2->plot_chargen::@1#0] -- register_copy jmp __b1 // plot_chargen::@1 __b1: // [79] *((const byte*) PROCPORT) ← (byte) $32 -- _deref_pbuc1=vbuc2 lda #$32 sta PROCPORT - // [80] (byte) mul8u::a#1 ← (byte) plot_chargen::pos#2 -- vbuz1=vbuz2 + // [80] (byte~) plot_chargen::$16 ← (byte) plot_chargen::pos#2 << (byte) 2 -- vbuz1=vbuz2_rol_2 lda.z pos - sta.z mul8u.a - // [81] call mul8u - // [103] phi from plot_chargen::@1 to mul8u [phi:plot_chargen::@1->mul8u] - mul8u_from___b1: - jsr mul8u - // [82] (word) mul8u::return#2 ← (word) mul8u::res#2 -- vwuz1=vwuz2 - lda.z mul8u.res - sta.z mul8u.return - lda.z mul8u.res+1 - sta.z mul8u.return+1 - jmp __b9 - // plot_chargen::@9 - __b9: - // [83] (word~) plot_chargen::$7 ← (word) mul8u::return#2 -- vwuz1=vwuz2 - lda.z mul8u.return - sta.z __7 - lda.z mul8u.return+1 - sta.z __7+1 - // [84] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN+(byte) $28+(byte) 1 + (word~) plot_chargen::$7 -- pbuz1=pbuc1_plus_vwuz2 - lda.z __7 + asl + asl + sta.z __16 + // [81] (byte~) plot_chargen::$17 ← (byte~) plot_chargen::$16 + (byte) plot_chargen::pos#2 -- vbuz1=vbuz2_plus_vbuz3 + lda.z __16 clc - adc #SCREEN+$28+1 + lda #>SCREEN+$29 + adc #0 sta.z sc+1 - // [85] phi from plot_chargen::@9 to plot_chargen::@3 [phi:plot_chargen::@9->plot_chargen::@3] - __b3_from___b9: - // [85] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#0 [phi:plot_chargen::@9->plot_chargen::@3#0] -- register_copy - // [85] phi (byte) plot_chargen::y#2 = (byte) 0 [phi:plot_chargen::@9->plot_chargen::@3#1] -- vbuz1=vbuc1 + // [84] phi from plot_chargen::@1 to plot_chargen::@3 [phi:plot_chargen::@1->plot_chargen::@3] + __b3_from___b1: + // [84] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#0 [phi:plot_chargen::@1->plot_chargen::@3#0] -- register_copy + // [84] phi (byte) plot_chargen::y#2 = (byte) 0 [phi:plot_chargen::@1->plot_chargen::@3#1] -- vbuz1=vbuc1 lda #0 sta.z y jmp __b3 - // [85] phi from plot_chargen::@7 to plot_chargen::@3 [phi:plot_chargen::@7->plot_chargen::@3] + // [84] phi from plot_chargen::@7 to plot_chargen::@3 [phi:plot_chargen::@7->plot_chargen::@3] __b3_from___b7: - // [85] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#2 [phi:plot_chargen::@7->plot_chargen::@3#0] -- register_copy - // [85] phi (byte) plot_chargen::y#2 = (byte) plot_chargen::y#1 [phi:plot_chargen::@7->plot_chargen::@3#1] -- register_copy + // [84] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#2 [phi:plot_chargen::@7->plot_chargen::@3#0] -- register_copy + // [84] phi (byte) plot_chargen::y#2 = (byte) plot_chargen::y#1 [phi:plot_chargen::@7->plot_chargen::@3#1] -- register_copy jmp __b3 // plot_chargen::@3 __b3: - // [86] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#5 + (byte) plot_chargen::y#2) -- vbuz1=pbuz2_derefidx_vbuz3 + // [85] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#4 + (byte) plot_chargen::y#2) -- vbuz1=pbuz2_derefidx_vbuz3 ldy.z y lda (chargen),y sta.z bits - // [87] phi from plot_chargen::@3 to plot_chargen::@4 [phi:plot_chargen::@3->plot_chargen::@4] + // [86] phi from plot_chargen::@3 to plot_chargen::@4 [phi:plot_chargen::@3->plot_chargen::@4] __b4_from___b3: - // [87] phi (byte) plot_chargen::x#2 = (byte) 0 [phi:plot_chargen::@3->plot_chargen::@4#0] -- vbuz1=vbuc1 + // [86] phi (byte) plot_chargen::x#2 = (byte) 0 [phi:plot_chargen::@3->plot_chargen::@4#0] -- vbuz1=vbuc1 lda #0 sta.z x - // [87] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#7 [phi:plot_chargen::@3->plot_chargen::@4#1] -- register_copy - // [87] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#0 [phi:plot_chargen::@3->plot_chargen::@4#2] -- register_copy + // [86] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#7 [phi:plot_chargen::@3->plot_chargen::@4#1] -- register_copy + // [86] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#0 [phi:plot_chargen::@3->plot_chargen::@4#2] -- register_copy jmp __b4 - // [87] phi from plot_chargen::@5 to plot_chargen::@4 [phi:plot_chargen::@5->plot_chargen::@4] + // [86] phi from plot_chargen::@5 to plot_chargen::@4 [phi:plot_chargen::@5->plot_chargen::@4] __b4_from___b5: - // [87] phi (byte) plot_chargen::x#2 = (byte) plot_chargen::x#1 [phi:plot_chargen::@5->plot_chargen::@4#0] -- register_copy - // [87] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#1 [phi:plot_chargen::@5->plot_chargen::@4#1] -- register_copy - // [87] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#1 [phi:plot_chargen::@5->plot_chargen::@4#2] -- register_copy + // [86] phi (byte) plot_chargen::x#2 = (byte) plot_chargen::x#1 [phi:plot_chargen::@5->plot_chargen::@4#0] -- register_copy + // [86] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#1 [phi:plot_chargen::@5->plot_chargen::@4#1] -- register_copy + // [86] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#1 [phi:plot_chargen::@5->plot_chargen::@4#2] -- register_copy jmp __b4 // plot_chargen::@4 __b4: - // [88] (byte~) plot_chargen::$10 ← (byte) plot_chargen::bits#2 & (byte) $80 -- vbuz1=vbuz2_band_vbuc1 + // [87] (byte~) plot_chargen::$9 ← (byte) plot_chargen::bits#2 & (byte) $80 -- vbuz1=vbuz2_band_vbuc1 lda #$80 and.z bits - sta.z __10 - // [89] if((byte~) plot_chargen::$10==(byte) 0) goto plot_chargen::@5 -- vbuz1_eq_0_then_la1 - lda.z __10 + sta.z __9 + // [88] if((byte~) plot_chargen::$9==(byte) 0) goto plot_chargen::@5 -- vbuz1_eq_0_then_la1 + lda.z __9 cmp #0 beq __b5_from___b4 - // [90] phi from plot_chargen::@4 to plot_chargen::@6 [phi:plot_chargen::@4->plot_chargen::@6] + // [89] phi from plot_chargen::@4 to plot_chargen::@6 [phi:plot_chargen::@4->plot_chargen::@6] __b6_from___b4: jmp __b6 // plot_chargen::@6 __b6: - // [91] phi from plot_chargen::@6 to plot_chargen::@5 [phi:plot_chargen::@6->plot_chargen::@5] + // [90] phi from plot_chargen::@6 to plot_chargen::@5 [phi:plot_chargen::@6->plot_chargen::@5] __b5_from___b6: - // [91] phi (byte) plot_chargen::c#2 = (byte) '*' [phi:plot_chargen::@6->plot_chargen::@5#0] -- vbuz1=vbuc1 + // [90] phi (byte) plot_chargen::c#2 = (byte) '*' [phi:plot_chargen::@6->plot_chargen::@5#0] -- vbuz1=vbuc1 lda #'*' sta.z c jmp __b5 - // [91] phi from plot_chargen::@4 to plot_chargen::@5 [phi:plot_chargen::@4->plot_chargen::@5] + // [90] phi from plot_chargen::@4 to plot_chargen::@5 [phi:plot_chargen::@4->plot_chargen::@5] __b5_from___b4: - // [91] phi (byte) plot_chargen::c#2 = (byte) '.' [phi:plot_chargen::@4->plot_chargen::@5#0] -- vbuz1=vbuc1 + // [90] phi (byte) plot_chargen::c#2 = (byte) '.' [phi:plot_chargen::@4->plot_chargen::@5#0] -- vbuz1=vbuc1 lda #'.' sta.z c jmp __b5 // plot_chargen::@5 __b5: - // [92] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 -- _deref_pbuz1=vbuz2 + // [91] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 -- _deref_pbuz1=vbuz2 lda.z c ldy #0 sta (sc),y - // [93] (byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3 -- pbuz1=_inc_pbuz1 + // [92] (byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3 -- pbuz1=_inc_pbuz1 inc.z sc bne !+ inc.z sc+1 !: - // [94] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 << (byte) 1 -- vbuz1=vbuz1_rol_1 + // [93] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 << (byte) 1 -- vbuz1=vbuz1_rol_1 asl.z bits - // [95] (byte) plot_chargen::x#1 ← ++ (byte) plot_chargen::x#2 -- vbuz1=_inc_vbuz1 + // [94] (byte) plot_chargen::x#1 ← ++ (byte) plot_chargen::x#2 -- vbuz1=_inc_vbuz1 inc.z x - // [96] if((byte) plot_chargen::x#1!=(byte) 8) goto plot_chargen::@4 -- vbuz1_neq_vbuc1_then_la1 + // [95] if((byte) plot_chargen::x#1!=(byte) 8) goto plot_chargen::@4 -- vbuz1_neq_vbuc1_then_la1 lda #8 cmp.z x bne __b4_from___b5 jmp __b7 // plot_chargen::@7 __b7: - // [97] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte) $20 -- pbuz1=pbuz1_plus_vbuc1 + // [96] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte) $20 -- pbuz1=pbuz1_plus_vbuc1 lda #$20 clc adc.z sc @@ -2789,16 +2561,16 @@ plot_chargen: { bcc !+ inc.z sc+1 !: - // [98] (byte) plot_chargen::y#1 ← ++ (byte) plot_chargen::y#2 -- vbuz1=_inc_vbuz1 + // [97] (byte) plot_chargen::y#1 ← ++ (byte) plot_chargen::y#2 -- vbuz1=_inc_vbuz1 inc.z y - // [99] if((byte) plot_chargen::y#1!=(byte) 8) goto plot_chargen::@3 -- vbuz1_neq_vbuc1_then_la1 + // [98] if((byte) plot_chargen::y#1!=(byte) 8) goto plot_chargen::@3 -- vbuz1_neq_vbuc1_then_la1 lda #8 cmp.z y bne __b3_from___b7 jmp __b8 // plot_chargen::@8 __b8: - // [100] *((const byte*) PROCPORT) ← (byte) $37 -- _deref_pbuc1=vbuc2 + // [99] *((const byte*) PROCPORT) ← (byte) $37 -- _deref_pbuc1=vbuc2 lda #$37 sta PROCPORT // asm { cli } @@ -2806,127 +2578,52 @@ plot_chargen: { jmp __breturn // plot_chargen::@return __breturn: - // [102] return + // [101] return rts -} - // mul8u -// Perform binary multiplication of two unsigned 8-bit bytes into a 16-bit unsigned word -// mul8u(byte zp($14) a) -mul8u: { - .const b = $a - .label __1 = $35 - .label a = $14 - .label mb = $17 - .label res = $15 - .label return = $30 - // [104] phi from mul8u to mul8u::@1 [phi:mul8u->mul8u::@1] - __b1_from_mul8u: - // [104] phi (word) mul8u::mb#2 = (word)(const byte) mul8u::b#0 [phi:mul8u->mul8u::@1#0] -- vwuz1=vwuc1 - lda #b - sta.z mb+1 - // [104] phi (word) mul8u::res#2 = (word) 0 [phi:mul8u->mul8u::@1#1] -- vwuz1=vwuc1 - lda #<0 - sta.z res - lda #>0 - sta.z res+1 - // [104] phi (byte) mul8u::a#2 = (byte) mul8u::a#1 [phi:mul8u->mul8u::@1#2] -- register_copy - jmp __b1 - // mul8u::@1 - __b1: - // [105] if((byte) mul8u::a#2!=(byte) 0) goto mul8u::@2 -- vbuz1_neq_0_then_la1 - lda.z a - cmp #0 - bne __b2 - jmp __breturn - // mul8u::@return - __breturn: - // [106] return - rts - // mul8u::@2 - __b2: - // [107] (byte~) mul8u::$1 ← (byte) mul8u::a#2 & (byte) 1 -- vbuz1=vbuz2_band_vbuc1 - lda #1 - and.z a - sta.z __1 - // [108] if((byte~) mul8u::$1==(byte) 0) goto mul8u::@3 -- vbuz1_eq_0_then_la1 - lda.z __1 - cmp #0 - beq __b3_from___b2 - jmp __b4 - // mul8u::@4 - __b4: - // [109] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 -- vwuz1=vwuz1_plus_vwuz2 - lda.z res - clc - adc.z mb - sta.z res - lda.z res+1 - adc.z mb+1 - sta.z res+1 - // [110] phi from mul8u::@2 mul8u::@4 to mul8u::@3 [phi:mul8u::@2/mul8u::@4->mul8u::@3] - __b3_from___b2: - __b3_from___b4: - // [110] phi (word) mul8u::res#6 = (word) mul8u::res#2 [phi:mul8u::@2/mul8u::@4->mul8u::@3#0] -- register_copy - jmp __b3 - // mul8u::@3 - __b3: - // [111] (byte) mul8u::a#0 ← (byte) mul8u::a#2 >> (byte) 1 -- vbuz1=vbuz1_ror_1 - lsr.z a - // [112] (word) mul8u::mb#1 ← (word) mul8u::mb#2 << (byte) 1 -- vwuz1=vwuz1_rol_1 - asl.z mb - rol.z mb+1 - // [104] phi from mul8u::@3 to mul8u::@1 [phi:mul8u::@3->mul8u::@1] - __b1_from___b3: - // [104] phi (word) mul8u::mb#2 = (word) mul8u::mb#1 [phi:mul8u::@3->mul8u::@1#0] -- register_copy - // [104] phi (word) mul8u::res#2 = (word) mul8u::res#6 [phi:mul8u::@3->mul8u::@1#1] -- register_copy - // [104] phi (byte) mul8u::a#2 = (byte) mul8u::a#0 [phi:mul8u::@3->mul8u::@1#2] -- register_copy - jmp __b1 } // keyboard_key_pressed // Determines whether a specific key is currently pressed by accessing the matrix directly // The key is a keyboard code defined from the keyboard matrix by %00rrrccc, where rrr is the row ID (0-7) and ccc is the column ID (0-7) // All keys exist as as KEY_XXX constants. // Returns zero if the key is not pressed and a non-zero value if the key is currently pressed -// keyboard_key_pressed(byte zp($19) key) +// keyboard_key_pressed(byte zp($14) key) keyboard_key_pressed: { - .label __2 = $3a - .label colidx = $36 - .label rowidx = $37 - .label return = $3b - .label return_1 = $1e - .label key = $19 - .label return_2 = $20 - .label return_3 = $22 - .label return_4 = $24 - .label return_5 = $26 - .label return_6 = $2b - // [114] (byte) keyboard_key_pressed::colidx#0 ← (byte) keyboard_key_pressed::key#6 & (byte) 7 -- vbuz1=vbuz2_band_vbuc1 + .label __2 = $33 + .label colidx = $2f + .label rowidx = $30 + .label return = $34 + .label return_1 = $19 + .label key = $14 + .label return_2 = $1b + .label return_3 = $1d + .label return_4 = $1f + .label return_5 = $21 + .label return_6 = $26 + // [103] (byte) keyboard_key_pressed::colidx#0 ← (byte) keyboard_key_pressed::key#6 & (byte) 7 -- vbuz1=vbuz2_band_vbuc1 lda #7 and.z key sta.z colidx - // [115] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte) 3 -- vbuz1=vbuz2_ror_3 + // [104] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte) 3 -- vbuz1=vbuz2_ror_3 lda.z key lsr lsr lsr sta.z rowidx - // [116] (byte) keyboard_matrix_read::rowid#0 ← (byte) keyboard_key_pressed::rowidx#0 -- vbuz1=vbuz2 + // [105] (byte) keyboard_matrix_read::rowid#0 ← (byte) keyboard_key_pressed::rowidx#0 -- vbuz1=vbuz2 lda.z rowidx sta.z keyboard_matrix_read.rowid - // [117] call keyboard_matrix_read + // [106] call keyboard_matrix_read jsr keyboard_matrix_read - // [118] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0 -- vbuz1=vbuz2 + // [107] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0 -- vbuz1=vbuz2 lda.z keyboard_matrix_read.return sta.z keyboard_matrix_read.return_1 jmp __b1 // keyboard_key_pressed::@1 __b1: - // [119] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2 -- vbuz1=vbuz2 + // [108] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2 -- vbuz1=vbuz2 lda.z keyboard_matrix_read.return_1 sta.z __2 - // [120] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte*) keyboard_matrix_col_bitmask + (byte) keyboard_key_pressed::colidx#0) -- vbuz1=vbuz2_band_pbuc1_derefidx_vbuz3 + // [109] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte*) keyboard_matrix_col_bitmask + (byte) keyboard_key_pressed::colidx#0) -- vbuz1=vbuz2_band_pbuc1_derefidx_vbuz3 lda.z __2 ldy.z colidx and keyboard_matrix_col_bitmask,y @@ -2934,7 +2631,7 @@ keyboard_key_pressed: { jmp __breturn // keyboard_key_pressed::@return __breturn: - // [121] return + // [110] return rts } // keyboard_matrix_read @@ -2943,23 +2640,23 @@ keyboard_key_pressed: { // Returns the keys pressed on the row as bits according to the C64 key matrix. // Notice: If the C64 normal interrupt is still running it will occasionally interrupt right between the read & write // leading to erroneous readings. You must disable kill the normal interrupt or sei/cli around calls to the keyboard matrix reader. -// keyboard_matrix_read(byte zp($38) rowid) +// keyboard_matrix_read(byte zp($31) rowid) keyboard_matrix_read: { - .label return = $3c - .label rowid = $38 - .label return_1 = $39 - // [122] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask + (byte) keyboard_matrix_read::rowid#0) -- _deref_pbuc1=pbuc2_derefidx_vbuz1 + .label return = $35 + .label rowid = $31 + .label return_1 = $32 + // [111] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask + (byte) keyboard_matrix_read::rowid#0) -- _deref_pbuc1=pbuc2_derefidx_vbuz1 ldy.z rowid lda keyboard_matrix_row_bitmask,y sta CIA1_PORT_A - // [123] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B) -- vbuz1=_bnot__deref_pbuc1 + // [112] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B) -- vbuz1=_bnot__deref_pbuc1 lda CIA1_PORT_B eor #$ff sta.z return jmp __breturn // keyboard_matrix_read::@return __breturn: - // [124] return + // [113] return rts } // keyboard_get_keycode @@ -2967,36 +2664,36 @@ keyboard_matrix_read: { // ch is the character to get the key code for ($00-$3f) // Returns the key code corresponding to the passed character. Only characters with a non-shifted key are handled. // If there is no non-shifted key representing the char $3f is returned (representing RUN/STOP) . -// keyboard_get_keycode(byte zp($28) ch) +// keyboard_get_keycode(byte zp($23) ch) keyboard_get_keycode: { - .label return = $3d - .label ch = $28 - .label return_1 = $29 - // [125] (byte) keyboard_get_keycode::return#0 ← *((const byte*) keyboard_char_keycodes + (byte) keyboard_get_keycode::ch#0) -- vbuz1=pbuc1_derefidx_vbuz2 + .label return = $36 + .label ch = $23 + .label return_1 = $24 + // [114] (byte) keyboard_get_keycode::return#0 ← *((const byte*) keyboard_char_keycodes + (byte) keyboard_get_keycode::ch#0) -- vbuz1=pbuc1_derefidx_vbuz2 ldy.z ch lda keyboard_char_keycodes,y sta.z return jmp __breturn // keyboard_get_keycode::@return __breturn: - // [126] return + // [115] return rts } // print_str_at // Print a string at a specific screen position -// print_str_at(byte* zp($1a) str, byte* zp($1c) at) +// print_str_at(byte* zp($15) str, byte* zp($17) at) print_str_at: { - .label at = $1c - .label str = $1a - // [128] phi from print_str_at print_str_at::@2 to print_str_at::@1 [phi:print_str_at/print_str_at::@2->print_str_at::@1] + .label at = $17 + .label str = $15 + // [117] phi from print_str_at print_str_at::@2 to print_str_at::@1 [phi:print_str_at/print_str_at::@2->print_str_at::@1] __b1_from_print_str_at: __b1_from___b2: - // [128] phi (byte*) print_str_at::at#5 = (byte*) print_str_at::at#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#0] -- register_copy - // [128] phi (byte*) print_str_at::str#5 = (byte*) print_str_at::str#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#1] -- register_copy + // [117] phi (byte*) print_str_at::at#5 = (byte*) print_str_at::at#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#0] -- register_copy + // [117] phi (byte*) print_str_at::str#5 = (byte*) print_str_at::str#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#1] -- register_copy jmp __b1 // print_str_at::@1 __b1: - // [129] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 -- vbuc1_neq__deref_pbuz1_then_la1 + // [118] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 -- vbuc1_neq__deref_pbuz1_then_la1 ldy #0 lda (str),y cmp #0 @@ -3004,21 +2701,21 @@ print_str_at: { jmp __breturn // print_str_at::@return __breturn: - // [130] return + // [119] return rts // print_str_at::@2 __b2: - // [131] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) -- _deref_pbuz1=_deref_pbuz2 + // [120] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) -- _deref_pbuz1=_deref_pbuz2 ldy #0 lda (str),y ldy #0 sta (at),y - // [132] (byte*) print_str_at::at#4 ← ++ (byte*) print_str_at::at#5 -- pbuz1=_inc_pbuz1 + // [121] (byte*) print_str_at::at#4 ← ++ (byte*) print_str_at::at#5 -- pbuz1=_inc_pbuz1 inc.z at bne !+ inc.z at+1 !: - // [133] (byte*) print_str_at::str#4 ← ++ (byte*) print_str_at::str#5 -- pbuz1=_inc_pbuz1 + // [122] (byte*) print_str_at::str#4 ← ++ (byte*) print_str_at::str#5 -- pbuz1=_inc_pbuz1 inc.z str bne !+ inc.z str+1 @@ -3047,13 +2744,14 @@ Removing always clobbered register reg byte a as potential for zp[1]:7 [ main::c Statement [74] (word~) plot_chargen::$1 ← (word~) plot_chargen::$0 << (byte) 3 [ plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$1 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$1 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$1 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a Statement [75] (byte*) plot_chargen::chargen#0 ← (const byte*) CHARGEN + (word~) plot_chargen::$1 [ plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::chargen#0 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::chargen#0 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::chargen#0 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a Statement [77] (byte*) plot_chargen::chargen#1 ← (byte*) plot_chargen::chargen#0 + (word) $800 [ plot_chargen::pos#2 plot_chargen::chargen#1 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::pos#2 plot_chargen::chargen#1 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::pos#2 plot_chargen::chargen#1 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a -Statement [79] *((const byte*) PROCPORT) ← (byte) $32 [ plot_chargen::pos#2 plot_chargen::chargen#5 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::pos#2 plot_chargen::chargen#5 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 mul8u::a#1 } { mul8u::return#2 = mul8u::res#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::pos#2 plot_chargen::chargen#5 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 mul8u::a#1 } { mul8u::return#2 = mul8u::res#2 } } ) always clobbers reg byte a -Statement [82] (word) mul8u::return#2 ← (word) mul8u::res#2 [ plot_chargen::chargen#5 mul8u::return#2 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#5 mul8u::return#2 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 mul8u::a#1 } { mul8u::return#2 = mul8u::res#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 mul8u::return#2 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 mul8u::a#1 } { mul8u::return#2 = mul8u::res#2 } } ) always clobbers reg byte a -Statement [83] (word~) plot_chargen::$7 ← (word) mul8u::return#2 [ plot_chargen::chargen#5 plot_chargen::$7 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#5 plot_chargen::$7 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::$7 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a -Statement [84] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN+(byte) $28+(byte) 1 + (word~) plot_chargen::$7 [ plot_chargen::chargen#5 plot_chargen::sc#0 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#5 plot_chargen::sc#0 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::sc#0 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a -Statement [86] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#5 + (byte) plot_chargen::y#2) [ plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a +Statement [79] *((const byte*) PROCPORT) ← (byte) $32 [ plot_chargen::pos#2 plot_chargen::chargen#4 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::pos#2 plot_chargen::chargen#4 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::pos#2 plot_chargen::chargen#4 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a +Statement [80] (byte~) plot_chargen::$16 ← (byte) plot_chargen::pos#2 << (byte) 2 [ plot_chargen::pos#2 plot_chargen::chargen#4 plot_chargen::$16 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::pos#2 plot_chargen::chargen#4 plot_chargen::$16 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::pos#2 plot_chargen::chargen#4 plot_chargen::$16 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a +Statement [81] (byte~) plot_chargen::$17 ← (byte~) plot_chargen::$16 + (byte) plot_chargen::pos#2 [ plot_chargen::chargen#4 plot_chargen::$17 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#4 plot_chargen::$17 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#4 plot_chargen::$17 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a +Statement [82] (byte~) plot_chargen::$6 ← (byte~) plot_chargen::$17 << (byte) 1 [ plot_chargen::chargen#4 plot_chargen::$6 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#4 plot_chargen::$6 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#4 plot_chargen::$6 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a +Statement [83] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN+(byte) $29 + (byte~) plot_chargen::$6 [ plot_chargen::chargen#4 plot_chargen::sc#0 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#4 plot_chargen::sc#0 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#4 plot_chargen::sc#0 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a +Statement [85] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#4 + (byte) plot_chargen::y#2) [ plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:14 [ plot_chargen::y#2 plot_chargen::y#1 ] -Statement [92] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 [ plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte y +Statement [91] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 [ plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte y Removing always clobbered register reg byte y as potential for zp[1]:4 [ main::i#2 main::i#1 ] Removing always clobbered register reg byte y as potential for zp[1]:14 [ plot_chargen::y#2 plot_chargen::y#1 ] Removing always clobbered register reg byte y as potential for zp[1]:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] @@ -3061,37 +2759,34 @@ Removing always clobbered register reg byte y as potential for zp[1]:18 [ plot_c Removing always clobbered register reg byte y as potential for zp[1]:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ] Removing always clobbered register reg byte y as potential for zp[1]:6 [ main::shift#9 ] Removing always clobbered register reg byte y as potential for zp[1]:7 [ main::ch#2 main::ch#1 ] -Statement [97] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte) $20 [ plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#2 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#2 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#2 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a -Statement [100] *((const byte*) PROCPORT) ← (byte) $37 [ ] ( main:2::plot_chargen:17 [ main::i#2 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a -Statement [109] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 [ mul8u::a#2 mul8u::mb#2 mul8u::res#1 ] ( main:2::plot_chargen:17::mul8u:81 [ main::i#2 plot_chargen::chargen#5 mul8u::a#2 mul8u::mb#2 mul8u::res#1 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 mul8u::a#1 } { mul8u::return#2 = mul8u::res#2 } } main:2::plot_chargen:66::mul8u:81 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 mul8u::a#2 mul8u::mb#2 mul8u::res#1 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 mul8u::a#1 } { mul8u::return#2 = mul8u::res#2 } } ) always clobbers reg byte a -Removing always clobbered register reg byte a as potential for zp[1]:20 [ mul8u::a#2 mul8u::a#1 mul8u::a#0 ] -Statement [115] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte) 3 [ keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] ( main:2::keyboard_key_pressed:21 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:27 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#10 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:33 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#11 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:39 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#12 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:45 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#13 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:58 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::key#5 = keyboard_key_pressed::key#6 main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#14 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a -Removing always clobbered register reg byte a as potential for zp[1]:54 [ keyboard_key_pressed::colidx#0 ] -Statement [122] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask + (byte) keyboard_matrix_read::rowid#0) [ ] ( main:2::keyboard_key_pressed:21::keyboard_matrix_read:117 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:27::keyboard_matrix_read:117 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#10 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:33::keyboard_matrix_read:117 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#11 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:39::keyboard_matrix_read:117 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#12 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:45::keyboard_matrix_read:117 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#13 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:58::keyboard_matrix_read:117 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::key#5 = keyboard_key_pressed::key#6 main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#14 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a -Statement [123] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B) [ keyboard_matrix_read::return#0 ] ( main:2::keyboard_key_pressed:21::keyboard_matrix_read:117 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:27::keyboard_matrix_read:117 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#10 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:33::keyboard_matrix_read:117 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#11 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:39::keyboard_matrix_read:117 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#12 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:45::keyboard_matrix_read:117 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#13 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:58::keyboard_matrix_read:117 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::key#5 = keyboard_key_pressed::key#6 main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#14 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a -Statement [129] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 [ print_str_at::str#5 print_str_at::at#5 ] ( main:2::print_str_at:8 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:10 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:12 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:14 [ print_str_at::str#5 print_str_at::at#5 ] { } ) always clobbers reg byte a reg byte y -Statement [131] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) [ print_str_at::str#5 print_str_at::at#5 ] ( main:2::print_str_at:8 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:10 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:12 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:14 [ print_str_at::str#5 print_str_at::at#5 ] { } ) always clobbers reg byte a reg byte y +Statement [96] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte) $20 [ plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::sc#2 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::sc#2 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::sc#2 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a +Statement [99] *((const byte*) PROCPORT) ← (byte) $37 [ ] ( main:2::plot_chargen:17 [ main::i#2 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a +Statement [104] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte) 3 [ keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] ( main:2::keyboard_key_pressed:21 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:27 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#10 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:33 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#11 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:39 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#12 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:45 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#13 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:58 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::key#5 = keyboard_key_pressed::key#6 main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#14 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:47 [ keyboard_key_pressed::colidx#0 ] +Statement [111] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask + (byte) keyboard_matrix_read::rowid#0) [ ] ( main:2::keyboard_key_pressed:21::keyboard_matrix_read:106 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:27::keyboard_matrix_read:106 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#10 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:33::keyboard_matrix_read:106 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#11 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:39::keyboard_matrix_read:106 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#12 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:45::keyboard_matrix_read:106 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#13 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:58::keyboard_matrix_read:106 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::key#5 = keyboard_key_pressed::key#6 main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#14 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a +Statement [112] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B) [ keyboard_matrix_read::return#0 ] ( main:2::keyboard_key_pressed:21::keyboard_matrix_read:106 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:27::keyboard_matrix_read:106 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#10 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:33::keyboard_matrix_read:106 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#11 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:39::keyboard_matrix_read:106 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#12 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:45::keyboard_matrix_read:106 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#13 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:58::keyboard_matrix_read:106 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::key#5 = keyboard_key_pressed::key#6 main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#14 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a +Statement [118] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 [ print_str_at::str#5 print_str_at::at#5 ] ( main:2::print_str_at:8 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:10 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:12 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:14 [ print_str_at::str#5 print_str_at::at#5 ] { } ) always clobbers reg byte a reg byte y +Statement [120] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) [ print_str_at::str#5 print_str_at::at#5 ] ( main:2::print_str_at:8 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:10 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:12 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:14 [ print_str_at::str#5 print_str_at::at#5 ] { } ) always clobbers reg byte a reg byte y Statement [6] if((byte*) main::sc#2<(const byte*) SCREEN+(word) $3e8) goto main::@2 [ main::sc#2 ] ( main:2 [ main::sc#2 ] { } ) always clobbers reg byte a Statement [69] *((byte*) main::sc#2) ← (byte) ' ' [ main::sc#2 ] ( main:2 [ main::sc#2 ] { } ) always clobbers reg byte a reg byte y Statement [73] (word~) plot_chargen::$0 ← (word)(byte) plot_chargen::ch#2 [ plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$0 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$0 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$0 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a Statement [74] (word~) plot_chargen::$1 ← (word~) plot_chargen::$0 << (byte) 3 [ plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$1 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$1 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$1 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a Statement [75] (byte*) plot_chargen::chargen#0 ← (const byte*) CHARGEN + (word~) plot_chargen::$1 [ plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::chargen#0 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::chargen#0 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::chargen#0 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a Statement [77] (byte*) plot_chargen::chargen#1 ← (byte*) plot_chargen::chargen#0 + (word) $800 [ plot_chargen::pos#2 plot_chargen::chargen#1 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::pos#2 plot_chargen::chargen#1 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::pos#2 plot_chargen::chargen#1 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a -Statement [79] *((const byte*) PROCPORT) ← (byte) $32 [ plot_chargen::pos#2 plot_chargen::chargen#5 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::pos#2 plot_chargen::chargen#5 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 mul8u::a#1 } { mul8u::return#2 = mul8u::res#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::pos#2 plot_chargen::chargen#5 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 mul8u::a#1 } { mul8u::return#2 = mul8u::res#2 } } ) always clobbers reg byte a -Statement [82] (word) mul8u::return#2 ← (word) mul8u::res#2 [ plot_chargen::chargen#5 mul8u::return#2 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#5 mul8u::return#2 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 mul8u::a#1 } { mul8u::return#2 = mul8u::res#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 mul8u::return#2 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 mul8u::a#1 } { mul8u::return#2 = mul8u::res#2 } } ) always clobbers reg byte a -Statement [83] (word~) plot_chargen::$7 ← (word) mul8u::return#2 [ plot_chargen::chargen#5 plot_chargen::$7 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#5 plot_chargen::$7 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::$7 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a -Statement [84] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN+(byte) $28+(byte) 1 + (word~) plot_chargen::$7 [ plot_chargen::chargen#5 plot_chargen::sc#0 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#5 plot_chargen::sc#0 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::sc#0 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a -Statement [86] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#5 + (byte) plot_chargen::y#2) [ plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a reg byte y -Statement [92] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 [ plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte y -Statement [97] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte) $20 [ plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#2 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#2 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#2 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a -Statement [100] *((const byte*) PROCPORT) ← (byte) $37 [ ] ( main:2::plot_chargen:17 [ main::i#2 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a -Statement [107] (byte~) mul8u::$1 ← (byte) mul8u::a#2 & (byte) 1 [ mul8u::res#2 mul8u::a#2 mul8u::mb#2 mul8u::$1 ] ( main:2::plot_chargen:17::mul8u:81 [ main::i#2 plot_chargen::chargen#5 mul8u::res#2 mul8u::a#2 mul8u::mb#2 mul8u::$1 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 mul8u::a#1 } { mul8u::return#2 = mul8u::res#2 } } main:2::plot_chargen:66::mul8u:81 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 mul8u::res#2 mul8u::a#2 mul8u::mb#2 mul8u::$1 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 mul8u::a#1 } { mul8u::return#2 = mul8u::res#2 } } ) always clobbers reg byte a -Statement [109] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 [ mul8u::a#2 mul8u::mb#2 mul8u::res#1 ] ( main:2::plot_chargen:17::mul8u:81 [ main::i#2 plot_chargen::chargen#5 mul8u::a#2 mul8u::mb#2 mul8u::res#1 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 mul8u::a#1 } { mul8u::return#2 = mul8u::res#2 } } main:2::plot_chargen:66::mul8u:81 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 mul8u::a#2 mul8u::mb#2 mul8u::res#1 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 mul8u::a#1 } { mul8u::return#2 = mul8u::res#2 } } ) always clobbers reg byte a -Statement [115] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte) 3 [ keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] ( main:2::keyboard_key_pressed:21 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:27 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#10 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:33 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#11 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:39 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#12 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:45 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#13 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:58 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::key#5 = keyboard_key_pressed::key#6 main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#14 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a -Statement [122] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask + (byte) keyboard_matrix_read::rowid#0) [ ] ( main:2::keyboard_key_pressed:21::keyboard_matrix_read:117 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:27::keyboard_matrix_read:117 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#10 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:33::keyboard_matrix_read:117 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#11 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:39::keyboard_matrix_read:117 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#12 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:45::keyboard_matrix_read:117 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#13 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:58::keyboard_matrix_read:117 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::key#5 = keyboard_key_pressed::key#6 main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#14 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a -Statement [123] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B) [ keyboard_matrix_read::return#0 ] ( main:2::keyboard_key_pressed:21::keyboard_matrix_read:117 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:27::keyboard_matrix_read:117 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#10 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:33::keyboard_matrix_read:117 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#11 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:39::keyboard_matrix_read:117 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#12 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:45::keyboard_matrix_read:117 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#13 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:58::keyboard_matrix_read:117 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::key#5 = keyboard_key_pressed::key#6 main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#14 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a -Statement [129] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 [ print_str_at::str#5 print_str_at::at#5 ] ( main:2::print_str_at:8 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:10 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:12 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:14 [ print_str_at::str#5 print_str_at::at#5 ] { } ) always clobbers reg byte a reg byte y -Statement [131] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) [ print_str_at::str#5 print_str_at::at#5 ] ( main:2::print_str_at:8 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:10 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:12 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:14 [ print_str_at::str#5 print_str_at::at#5 ] { } ) always clobbers reg byte a reg byte y +Statement [79] *((const byte*) PROCPORT) ← (byte) $32 [ plot_chargen::pos#2 plot_chargen::chargen#4 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::pos#2 plot_chargen::chargen#4 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::pos#2 plot_chargen::chargen#4 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a +Statement [80] (byte~) plot_chargen::$16 ← (byte) plot_chargen::pos#2 << (byte) 2 [ plot_chargen::pos#2 plot_chargen::chargen#4 plot_chargen::$16 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::pos#2 plot_chargen::chargen#4 plot_chargen::$16 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::pos#2 plot_chargen::chargen#4 plot_chargen::$16 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a +Statement [81] (byte~) plot_chargen::$17 ← (byte~) plot_chargen::$16 + (byte) plot_chargen::pos#2 [ plot_chargen::chargen#4 plot_chargen::$17 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#4 plot_chargen::$17 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#4 plot_chargen::$17 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a +Statement [82] (byte~) plot_chargen::$6 ← (byte~) plot_chargen::$17 << (byte) 1 [ plot_chargen::chargen#4 plot_chargen::$6 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#4 plot_chargen::$6 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#4 plot_chargen::$6 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a +Statement [83] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN+(byte) $29 + (byte~) plot_chargen::$6 [ plot_chargen::chargen#4 plot_chargen::sc#0 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#4 plot_chargen::sc#0 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#4 plot_chargen::sc#0 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a +Statement [85] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#4 + (byte) plot_chargen::y#2) [ plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a reg byte y +Statement [91] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 [ plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte y +Statement [96] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte) $20 [ plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::sc#2 ] ( main:2::plot_chargen:17 [ main::i#2 plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::sc#2 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#4 plot_chargen::y#2 plot_chargen::sc#2 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a +Statement [99] *((const byte*) PROCPORT) ← (byte) $37 [ ] ( main:2::plot_chargen:17 [ main::i#2 ] { { plot_chargen::pos#0 = plot_chargen::pos#2 main::i#2 } } main:2::plot_chargen:66 [ main::cur_pos#11 main::shift#9 main::ch#2 ] { { plot_chargen::ch#1 = plot_chargen::ch#2 main::ch#2 } { plot_chargen::shift#1 = plot_chargen::shift#2 main::shift#9 } { plot_chargen::pos#1 = plot_chargen::pos#2 main::cur_pos#11 } } ) always clobbers reg byte a +Statement [104] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte) 3 [ keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] ( main:2::keyboard_key_pressed:21 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:27 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#10 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:33 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#11 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:39 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#12 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:45 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#13 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:58 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::key#5 = keyboard_key_pressed::key#6 main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#14 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a +Statement [111] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask + (byte) keyboard_matrix_read::rowid#0) [ ] ( main:2::keyboard_key_pressed:21::keyboard_matrix_read:106 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:27::keyboard_matrix_read:106 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#10 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:33::keyboard_matrix_read:106 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#11 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:39::keyboard_matrix_read:106 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#12 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:45::keyboard_matrix_read:106 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#13 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:58::keyboard_matrix_read:106 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::key#5 = keyboard_key_pressed::key#6 main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#14 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a +Statement [112] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B) [ keyboard_matrix_read::return#0 ] ( main:2::keyboard_key_pressed:21::keyboard_matrix_read:106 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:27::keyboard_matrix_read:106 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#10 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:33::keyboard_matrix_read:106 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#11 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:39::keyboard_matrix_read:106 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#12 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:45::keyboard_matrix_read:106 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#13 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } main:2::keyboard_key_pressed:58::keyboard_matrix_read:106 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::key#5 = keyboard_key_pressed::key#6 main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#14 } { keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a +Statement [118] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 [ print_str_at::str#5 print_str_at::at#5 ] ( main:2::print_str_at:8 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:10 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:12 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:14 [ print_str_at::str#5 print_str_at::at#5 ] { } ) always clobbers reg byte a reg byte y +Statement [120] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) [ print_str_at::str#5 print_str_at::at#5 ] ( main:2::print_str_at:8 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:10 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:12 [ print_str_at::str#5 print_str_at::at#5 ] { } main:2::print_str_at:14 [ print_str_at::str#5 print_str_at::at#5 ] { } ) always clobbers reg byte a reg byte y Potential registers zp[2]:2 [ main::sc#2 main::sc#1 ] : zp[2]:2 , Potential registers zp[1]:4 [ main::i#2 main::i#1 ] : zp[1]:4 , reg byte x , Potential registers zp[1]:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ] : zp[1]:5 , reg byte x , @@ -3101,124 +2796,121 @@ Potential registers zp[1]:8 [ main::pressed#2 main::pressed#1 ] : zp[1]:8 , reg Potential registers zp[1]:9 [ plot_chargen::ch#2 plot_chargen::ch#1 ] : zp[1]:9 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:10 [ plot_chargen::shift#2 plot_chargen::shift#1 ] : zp[1]:10 , reg byte x , reg byte y , Potential registers zp[1]:11 [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ] : zp[1]:11 , reg byte x , reg byte y , -Potential registers zp[2]:12 [ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 ] : zp[2]:12 , +Potential registers zp[2]:12 [ plot_chargen::chargen#4 plot_chargen::chargen#0 plot_chargen::chargen#1 ] : zp[2]:12 , Potential registers zp[1]:14 [ plot_chargen::y#2 plot_chargen::y#1 ] : zp[1]:14 , reg byte x , Potential registers zp[1]:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] : zp[1]:15 , reg byte a , reg byte x , -Potential registers zp[2]:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 ] : zp[2]:16 , +Potential registers zp[2]:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#0 plot_chargen::sc#2 plot_chargen::sc#1 ] : zp[2]:16 , Potential registers zp[1]:18 [ plot_chargen::x#2 plot_chargen::x#1 ] : zp[1]:18 , reg byte a , reg byte x , Potential registers zp[1]:19 [ plot_chargen::c#2 ] : zp[1]:19 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:20 [ mul8u::a#2 mul8u::a#1 mul8u::a#0 ] : zp[1]:20 , reg byte x , reg byte y , -Potential registers zp[2]:21 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] : zp[2]:21 , -Potential registers zp[2]:23 [ mul8u::mb#2 mul8u::mb#1 ] : zp[2]:23 , -Potential registers zp[1]:25 [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ] : zp[1]:25 , reg byte a , reg byte x , reg byte y , -Potential registers zp[2]:26 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] : zp[2]:26 , -Potential registers zp[2]:28 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ] : zp[2]:28 , -Potential registers zp[1]:30 [ keyboard_key_pressed::return#2 ] : zp[1]:30 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:31 [ main::$15 ] : zp[1]:31 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:32 [ keyboard_key_pressed::return#10 ] : zp[1]:32 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:33 [ main::$18 ] : zp[1]:33 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:34 [ keyboard_key_pressed::return#11 ] : zp[1]:34 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:35 [ main::$21 ] : zp[1]:35 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:36 [ keyboard_key_pressed::return#12 ] : zp[1]:36 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:37 [ main::$24 ] : zp[1]:37 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:38 [ keyboard_key_pressed::return#13 ] : zp[1]:38 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:39 [ main::$27 ] : zp[1]:39 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:40 [ keyboard_get_keycode::ch#0 ] : zp[1]:40 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:41 [ keyboard_get_keycode::return#2 ] : zp[1]:41 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:42 [ main::key#0 ] : zp[1]:42 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:43 [ keyboard_key_pressed::return#14 ] : zp[1]:43 , reg byte a , reg byte x , reg byte y , -Potential registers zp[2]:44 [ plot_chargen::$0 ] : zp[2]:44 , -Potential registers zp[2]:46 [ plot_chargen::$1 ] : zp[2]:46 , -Potential registers zp[2]:48 [ mul8u::return#2 ] : zp[2]:48 , -Potential registers zp[2]:50 [ plot_chargen::$7 ] : zp[2]:50 , -Potential registers zp[1]:52 [ plot_chargen::$10 ] : zp[1]:52 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:53 [ mul8u::$1 ] : zp[1]:53 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:54 [ keyboard_key_pressed::colidx#0 ] : zp[1]:54 , reg byte x , reg byte y , -Potential registers zp[1]:55 [ keyboard_key_pressed::rowidx#0 ] : zp[1]:55 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:56 [ keyboard_matrix_read::rowid#0 ] : zp[1]:56 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:57 [ keyboard_matrix_read::return#2 ] : zp[1]:57 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:58 [ keyboard_key_pressed::$2 ] : zp[1]:58 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:59 [ keyboard_key_pressed::return#0 ] : zp[1]:59 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:60 [ keyboard_matrix_read::return#0 ] : zp[1]:60 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:61 [ keyboard_get_keycode::return#0 ] : zp[1]:61 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:20 [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ] : zp[1]:20 , reg byte a , reg byte x , reg byte y , +Potential registers zp[2]:21 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] : zp[2]:21 , +Potential registers zp[2]:23 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ] : zp[2]:23 , +Potential registers zp[1]:25 [ keyboard_key_pressed::return#2 ] : zp[1]:25 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:26 [ main::$15 ] : zp[1]:26 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:27 [ keyboard_key_pressed::return#10 ] : zp[1]:27 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:28 [ main::$18 ] : zp[1]:28 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:29 [ keyboard_key_pressed::return#11 ] : zp[1]:29 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:30 [ main::$21 ] : zp[1]:30 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:31 [ keyboard_key_pressed::return#12 ] : zp[1]:31 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:32 [ main::$24 ] : zp[1]:32 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:33 [ keyboard_key_pressed::return#13 ] : zp[1]:33 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:34 [ main::$27 ] : zp[1]:34 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:35 [ keyboard_get_keycode::ch#0 ] : zp[1]:35 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:36 [ keyboard_get_keycode::return#2 ] : zp[1]:36 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:37 [ main::key#0 ] : zp[1]:37 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:38 [ keyboard_key_pressed::return#14 ] : zp[1]:38 , reg byte a , reg byte x , reg byte y , +Potential registers zp[2]:39 [ plot_chargen::$0 ] : zp[2]:39 , +Potential registers zp[2]:41 [ plot_chargen::$1 ] : zp[2]:41 , +Potential registers zp[1]:43 [ plot_chargen::$16 ] : zp[1]:43 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:44 [ plot_chargen::$17 ] : zp[1]:44 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:45 [ plot_chargen::$6 ] : zp[1]:45 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:46 [ plot_chargen::$9 ] : zp[1]:46 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:47 [ keyboard_key_pressed::colidx#0 ] : zp[1]:47 , reg byte x , reg byte y , +Potential registers zp[1]:48 [ keyboard_key_pressed::rowidx#0 ] : zp[1]:48 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:49 [ keyboard_matrix_read::rowid#0 ] : zp[1]:49 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:50 [ keyboard_matrix_read::return#2 ] : zp[1]:50 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:51 [ keyboard_key_pressed::$2 ] : zp[1]:51 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:52 [ keyboard_key_pressed::return#0 ] : zp[1]:52 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:53 [ keyboard_matrix_read::return#0 ] : zp[1]:53 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:54 [ keyboard_get_keycode::return#0 ] : zp[1]:54 , reg byte a , reg byte x , reg byte y , REGISTER UPLIFT SCOPES -Uplift Scope [mul8u] 350,001,670.33: zp[2]:21 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] 242,857,145.29: zp[2]:23 [ mul8u::mb#2 mul8u::mb#1 ] 200,000,002: zp[1]:53 [ mul8u::$1 ] 166,738,336.17: zp[1]:20 [ mul8u::a#2 mul8u::a#1 mul8u::a#0 ] 20,002: zp[2]:48 [ mul8u::return#2 ] -Uplift Scope [plot_chargen] 200,000,002: zp[1]:52 [ plot_chargen::$10 ] 175,000,001.75: zp[1]:18 [ plot_chargen::x#2 plot_chargen::x#1 ] 130,952,384.19: zp[1]:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] 120,858,338.92: zp[2]:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 ] 100,000,001: zp[1]:19 [ plot_chargen::c#2 ] 17,307,694.04: zp[1]:14 [ plot_chargen::y#2 plot_chargen::y#1 ] 490,458.18: zp[2]:12 [ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 ] 20,002: zp[2]:44 [ plot_chargen::$0 ] 20,002: zp[2]:46 [ plot_chargen::$1 ] 20,002: zp[2]:50 [ plot_chargen::$7 ] 4,202.4: zp[1]:10 [ plot_chargen::shift#2 plot_chargen::shift#1 ] 2,103: zp[1]:11 [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ] 1,501.5: zp[1]:9 [ plot_chargen::ch#2 plot_chargen::ch#1 ] -Uplift Scope [keyboard_matrix_read] 110,002: zp[1]:56 [ keyboard_matrix_read::rowid#0 ] 36,667.33: zp[1]:60 [ keyboard_matrix_read::return#0 ] 20,002: zp[1]:57 [ keyboard_matrix_read::return#2 ] -Uplift Scope [keyboard_key_pressed] 20,002: zp[1]:55 [ keyboard_key_pressed::rowidx#0 ] 20,002: zp[1]:58 [ keyboard_key_pressed::$2 ] 12,503.5: zp[1]:25 [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ] 3,333.67: zp[1]:54 [ keyboard_key_pressed::colidx#0 ] 2,002: zp[1]:43 [ keyboard_key_pressed::return#14 ] 1,438.38: zp[1]:59 [ keyboard_key_pressed::return#0 ] 202: zp[1]:30 [ keyboard_key_pressed::return#2 ] 202: zp[1]:32 [ keyboard_key_pressed::return#10 ] 202: zp[1]:34 [ keyboard_key_pressed::return#11 ] 202: zp[1]:36 [ keyboard_key_pressed::return#12 ] 202: zp[1]:38 [ keyboard_key_pressed::return#13 ] -Uplift Scope [keyboard_get_keycode] 11,002: zp[1]:40 [ keyboard_get_keycode::ch#0 ] 3,667.33: zp[1]:61 [ keyboard_get_keycode::return#0 ] 2,002: zp[1]:41 [ keyboard_get_keycode::return#2 ] -Uplift Scope [main] 4,004: zp[1]:8 [ main::pressed#2 main::pressed#1 ] 1,751.75: zp[1]:7 [ main::ch#2 main::ch#1 ] 1,501.5: zp[1]:42 [ main::key#0 ] 368.79: zp[1]:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ] 336.67: zp[2]:2 [ main::sc#2 main::sc#1 ] 252.5: zp[1]:4 [ main::i#2 main::i#1 ] 202: zp[1]:31 [ main::$15 ] 202: zp[1]:33 [ main::$18 ] 202: zp[1]:35 [ main::$21 ] 202: zp[1]:37 [ main::$24 ] 202: zp[1]:39 [ main::$27 ] 52.68: zp[1]:6 [ main::shift#9 ] -Uplift Scope [print_str_at] 3,129.25: zp[2]:26 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] 2,136.67: zp[2]:28 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ] +Uplift Scope [plot_chargen] 200,000,002: zp[1]:46 [ plot_chargen::$9 ] 175,000,001.75: zp[1]:18 [ plot_chargen::x#2 plot_chargen::x#1 ] 130,952,384.19: zp[1]:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] 120,858,338.92: zp[2]:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#0 plot_chargen::sc#2 plot_chargen::sc#1 ] 100,000,001: zp[1]:19 [ plot_chargen::c#2 ] 17,307,694.04: zp[1]:14 [ plot_chargen::y#2 plot_chargen::y#1 ] 512,146.5: zp[2]:12 [ plot_chargen::chargen#4 plot_chargen::chargen#0 plot_chargen::chargen#1 ] 20,002: zp[2]:39 [ plot_chargen::$0 ] 20,002: zp[2]:41 [ plot_chargen::$1 ] 20,002: zp[1]:43 [ plot_chargen::$16 ] 20,002: zp[1]:44 [ plot_chargen::$17 ] 20,002: zp[1]:45 [ plot_chargen::$6 ] 4,202.4: zp[1]:10 [ plot_chargen::shift#2 plot_chargen::shift#1 ] 2,979.73: zp[1]:11 [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ] 1,501.5: zp[1]:9 [ plot_chargen::ch#2 plot_chargen::ch#1 ] +Uplift Scope [keyboard_matrix_read] 110,002: zp[1]:49 [ keyboard_matrix_read::rowid#0 ] 36,667.33: zp[1]:53 [ keyboard_matrix_read::return#0 ] 20,002: zp[1]:50 [ keyboard_matrix_read::return#2 ] +Uplift Scope [keyboard_key_pressed] 20,002: zp[1]:48 [ keyboard_key_pressed::rowidx#0 ] 20,002: zp[1]:51 [ keyboard_key_pressed::$2 ] 12,503.5: zp[1]:20 [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ] 3,333.67: zp[1]:47 [ keyboard_key_pressed::colidx#0 ] 2,002: zp[1]:38 [ keyboard_key_pressed::return#14 ] 1,438.38: zp[1]:52 [ keyboard_key_pressed::return#0 ] 202: zp[1]:25 [ keyboard_key_pressed::return#2 ] 202: zp[1]:27 [ keyboard_key_pressed::return#10 ] 202: zp[1]:29 [ keyboard_key_pressed::return#11 ] 202: zp[1]:31 [ keyboard_key_pressed::return#12 ] 202: zp[1]:33 [ keyboard_key_pressed::return#13 ] +Uplift Scope [keyboard_get_keycode] 11,002: zp[1]:35 [ keyboard_get_keycode::ch#0 ] 3,667.33: zp[1]:54 [ keyboard_get_keycode::return#0 ] 2,002: zp[1]:36 [ keyboard_get_keycode::return#2 ] +Uplift Scope [main] 4,004: zp[1]:8 [ main::pressed#2 main::pressed#1 ] 1,751.75: zp[1]:7 [ main::ch#2 main::ch#1 ] 1,501.5: zp[1]:37 [ main::key#0 ] 368.79: zp[1]:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ] 336.67: zp[2]:2 [ main::sc#2 main::sc#1 ] 252.5: zp[1]:4 [ main::i#2 main::i#1 ] 202: zp[1]:26 [ main::$15 ] 202: zp[1]:28 [ main::$18 ] 202: zp[1]:30 [ main::$21 ] 202: zp[1]:32 [ main::$24 ] 202: zp[1]:34 [ main::$27 ] 52.68: zp[1]:6 [ main::shift#9 ] +Uplift Scope [print_str_at] 3,129.25: zp[2]:21 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] 2,136.67: zp[2]:23 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ] Uplift Scope [] -Uplifting [mul8u] best 1050626 combination zp[2]:21 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] zp[2]:23 [ mul8u::mb#2 mul8u::mb#1 ] reg byte a [ mul8u::$1 ] reg byte x [ mul8u::a#2 mul8u::a#1 mul8u::a#0 ] zp[2]:48 [ mul8u::return#2 ] -Uplifting [plot_chargen] best 810626 combination reg byte a [ plot_chargen::$10 ] reg byte x [ plot_chargen::x#2 plot_chargen::x#1 ] zp[1]:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] zp[2]:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 ] reg byte a [ plot_chargen::c#2 ] zp[1]:14 [ plot_chargen::y#2 plot_chargen::y#1 ] zp[2]:12 [ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 ] zp[2]:44 [ plot_chargen::$0 ] zp[2]:46 [ plot_chargen::$1 ] zp[2]:50 [ plot_chargen::$7 ] zp[1]:10 [ plot_chargen::shift#2 plot_chargen::shift#1 ] zp[1]:11 [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ] zp[1]:9 [ plot_chargen::ch#2 plot_chargen::ch#1 ] -Limited combination testing to 100 combinations of 10368 possible. -Uplifting [keyboard_matrix_read] best 810608 combination reg byte x [ keyboard_matrix_read::rowid#0 ] reg byte a [ keyboard_matrix_read::return#0 ] reg byte a [ keyboard_matrix_read::return#2 ] -Uplifting [keyboard_key_pressed] best 810279 combination reg byte a [ keyboard_key_pressed::rowidx#0 ] reg byte a [ keyboard_key_pressed::$2 ] reg byte x [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ] zp[1]:54 [ keyboard_key_pressed::colidx#0 ] zp[1]:43 [ keyboard_key_pressed::return#14 ] zp[1]:59 [ keyboard_key_pressed::return#0 ] zp[1]:30 [ keyboard_key_pressed::return#2 ] zp[1]:32 [ keyboard_key_pressed::return#10 ] zp[1]:34 [ keyboard_key_pressed::return#11 ] zp[1]:36 [ keyboard_key_pressed::return#12 ] zp[1]:38 [ keyboard_key_pressed::return#13 ] +Uplifting [plot_chargen] best 726612 combination reg byte a [ plot_chargen::$9 ] reg byte x [ plot_chargen::x#2 plot_chargen::x#1 ] zp[1]:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] zp[2]:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#0 plot_chargen::sc#2 plot_chargen::sc#1 ] reg byte a [ plot_chargen::c#2 ] zp[1]:14 [ plot_chargen::y#2 plot_chargen::y#1 ] zp[2]:12 [ plot_chargen::chargen#4 plot_chargen::chargen#0 plot_chargen::chargen#1 ] zp[2]:39 [ plot_chargen::$0 ] zp[2]:41 [ plot_chargen::$1 ] zp[1]:43 [ plot_chargen::$16 ] zp[1]:44 [ plot_chargen::$17 ] zp[1]:45 [ plot_chargen::$6 ] zp[1]:10 [ plot_chargen::shift#2 plot_chargen::shift#1 ] zp[1]:11 [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ] zp[1]:9 [ plot_chargen::ch#2 plot_chargen::ch#1 ] +Limited combination testing to 100 combinations of 663552 possible. +Uplifting [keyboard_matrix_read] best 726594 combination reg byte x [ keyboard_matrix_read::rowid#0 ] reg byte a [ keyboard_matrix_read::return#0 ] reg byte a [ keyboard_matrix_read::return#2 ] +Uplifting [keyboard_key_pressed] best 726265 combination reg byte a [ keyboard_key_pressed::rowidx#0 ] reg byte a [ keyboard_key_pressed::$2 ] reg byte x [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ] zp[1]:47 [ keyboard_key_pressed::colidx#0 ] zp[1]:38 [ keyboard_key_pressed::return#14 ] zp[1]:52 [ keyboard_key_pressed::return#0 ] zp[1]:25 [ keyboard_key_pressed::return#2 ] zp[1]:27 [ keyboard_key_pressed::return#10 ] zp[1]:29 [ keyboard_key_pressed::return#11 ] zp[1]:31 [ keyboard_key_pressed::return#12 ] zp[1]:33 [ keyboard_key_pressed::return#13 ] Limited combination testing to 100 combinations of 3145728 possible. -Uplifting [keyboard_get_keycode] best 809073 combination reg byte x [ keyboard_get_keycode::ch#0 ] reg byte a [ keyboard_get_keycode::return#0 ] reg byte a [ keyboard_get_keycode::return#2 ] -Uplifting [main] best 807473 combination reg byte a [ main::pressed#2 main::pressed#1 ] zp[1]:7 [ main::ch#2 main::ch#1 ] reg byte a [ main::key#0 ] zp[1]:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ] zp[2]:2 [ main::sc#2 main::sc#1 ] zp[1]:4 [ main::i#2 main::i#1 ] zp[1]:31 [ main::$15 ] zp[1]:33 [ main::$18 ] zp[1]:35 [ main::$21 ] zp[1]:37 [ main::$24 ] zp[1]:39 [ main::$27 ] zp[1]:6 [ main::shift#9 ] +Uplifting [keyboard_get_keycode] best 725059 combination reg byte x [ keyboard_get_keycode::ch#0 ] reg byte a [ keyboard_get_keycode::return#0 ] reg byte a [ keyboard_get_keycode::return#2 ] +Uplifting [main] best 723459 combination reg byte a [ main::pressed#2 main::pressed#1 ] zp[1]:7 [ main::ch#2 main::ch#1 ] reg byte a [ main::key#0 ] zp[1]:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ] zp[2]:2 [ main::sc#2 main::sc#1 ] zp[1]:4 [ main::i#2 main::i#1 ] zp[1]:26 [ main::$15 ] zp[1]:28 [ main::$18 ] zp[1]:30 [ main::$21 ] zp[1]:32 [ main::$24 ] zp[1]:34 [ main::$27 ] zp[1]:6 [ main::shift#9 ] Limited combination testing to 100 combinations of 262144 possible. -Uplifting [print_str_at] best 807473 combination zp[2]:26 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] zp[2]:28 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ] -Uplifting [] best 807473 combination +Uplifting [print_str_at] best 723459 combination zp[2]:21 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] zp[2]:23 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ] +Uplifting [] best 723459 combination Attempting to uplift remaining variables inzp[1]:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] -Uplifting [plot_chargen] best 807473 combination zp[1]:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] +Uplifting [plot_chargen] best 723459 combination zp[1]:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] Attempting to uplift remaining variables inzp[1]:14 [ plot_chargen::y#2 plot_chargen::y#1 ] -Uplifting [plot_chargen] best 807473 combination zp[1]:14 [ plot_chargen::y#2 plot_chargen::y#1 ] +Uplifting [plot_chargen] best 723459 combination zp[1]:14 [ plot_chargen::y#2 plot_chargen::y#1 ] +Attempting to uplift remaining variables inzp[1]:43 [ plot_chargen::$16 ] +Uplifting [plot_chargen] best 723453 combination reg byte a [ plot_chargen::$16 ] +Attempting to uplift remaining variables inzp[1]:44 [ plot_chargen::$17 ] +Uplifting [plot_chargen] best 723447 combination reg byte a [ plot_chargen::$17 ] +Attempting to uplift remaining variables inzp[1]:45 [ plot_chargen::$6 ] +Uplifting [plot_chargen] best 723441 combination reg byte a [ plot_chargen::$6 ] Attempting to uplift remaining variables inzp[1]:10 [ plot_chargen::shift#2 plot_chargen::shift#1 ] -Uplifting [plot_chargen] best 807167 combination reg byte x [ plot_chargen::shift#2 plot_chargen::shift#1 ] -Attempting to uplift remaining variables inzp[1]:54 [ keyboard_key_pressed::colidx#0 ] -Uplifting [keyboard_key_pressed] best 807165 combination reg byte y [ keyboard_key_pressed::colidx#0 ] +Uplifting [plot_chargen] best 723135 combination reg byte x [ plot_chargen::shift#2 plot_chargen::shift#1 ] +Attempting to uplift remaining variables inzp[1]:47 [ keyboard_key_pressed::colidx#0 ] +Uplifting [keyboard_key_pressed] best 723133 combination reg byte y [ keyboard_key_pressed::colidx#0 ] Attempting to uplift remaining variables inzp[1]:11 [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ] -Uplifting [plot_chargen] best 806836 combination reg byte y [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ] -Attempting to uplift remaining variables inzp[1]:43 [ keyboard_key_pressed::return#14 ] -Uplifting [keyboard_key_pressed] best 806236 combination reg byte a [ keyboard_key_pressed::return#14 ] +Uplifting [plot_chargen] best 722805 combination reg byte y [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ] +Attempting to uplift remaining variables inzp[1]:38 [ keyboard_key_pressed::return#14 ] +Uplifting [keyboard_key_pressed] best 722205 combination reg byte a [ keyboard_key_pressed::return#14 ] Attempting to uplift remaining variables inzp[1]:7 [ main::ch#2 main::ch#1 ] -Uplifting [main] best 806236 combination zp[1]:7 [ main::ch#2 main::ch#1 ] +Uplifting [main] best 722205 combination zp[1]:7 [ main::ch#2 main::ch#1 ] Attempting to uplift remaining variables inzp[1]:9 [ plot_chargen::ch#2 plot_chargen::ch#1 ] -Uplifting [plot_chargen] best 805930 combination reg byte a [ plot_chargen::ch#2 plot_chargen::ch#1 ] -Attempting to uplift remaining variables inzp[1]:59 [ keyboard_key_pressed::return#0 ] -Uplifting [keyboard_key_pressed] best 805477 combination reg byte a [ keyboard_key_pressed::return#0 ] +Uplifting [plot_chargen] best 721899 combination reg byte a [ plot_chargen::ch#2 plot_chargen::ch#1 ] +Attempting to uplift remaining variables inzp[1]:52 [ keyboard_key_pressed::return#0 ] +Uplifting [keyboard_key_pressed] best 721446 combination reg byte a [ keyboard_key_pressed::return#0 ] Attempting to uplift remaining variables inzp[1]:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ] -Uplifting [main] best 805477 combination zp[1]:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ] +Uplifting [main] best 721446 combination zp[1]:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ] Attempting to uplift remaining variables inzp[1]:4 [ main::i#2 main::i#1 ] -Uplifting [main] best 805477 combination zp[1]:4 [ main::i#2 main::i#1 ] -Attempting to uplift remaining variables inzp[1]:30 [ keyboard_key_pressed::return#2 ] -Uplifting [keyboard_key_pressed] best 805417 combination reg byte a [ keyboard_key_pressed::return#2 ] -Attempting to uplift remaining variables inzp[1]:31 [ main::$15 ] -Uplifting [main] best 805357 combination reg byte a [ main::$15 ] -Attempting to uplift remaining variables inzp[1]:32 [ keyboard_key_pressed::return#10 ] -Uplifting [keyboard_key_pressed] best 805297 combination reg byte a [ keyboard_key_pressed::return#10 ] -Attempting to uplift remaining variables inzp[1]:33 [ main::$18 ] -Uplifting [main] best 805237 combination reg byte a [ main::$18 ] -Attempting to uplift remaining variables inzp[1]:34 [ keyboard_key_pressed::return#11 ] -Uplifting [keyboard_key_pressed] best 805177 combination reg byte a [ keyboard_key_pressed::return#11 ] -Attempting to uplift remaining variables inzp[1]:35 [ main::$21 ] -Uplifting [main] best 805117 combination reg byte a [ main::$21 ] -Attempting to uplift remaining variables inzp[1]:36 [ keyboard_key_pressed::return#12 ] -Uplifting [keyboard_key_pressed] best 805057 combination reg byte a [ keyboard_key_pressed::return#12 ] -Attempting to uplift remaining variables inzp[1]:37 [ main::$24 ] -Uplifting [main] best 804997 combination reg byte a [ main::$24 ] -Attempting to uplift remaining variables inzp[1]:38 [ keyboard_key_pressed::return#13 ] -Uplifting [keyboard_key_pressed] best 804937 combination reg byte a [ keyboard_key_pressed::return#13 ] -Attempting to uplift remaining variables inzp[1]:39 [ main::$27 ] -Uplifting [main] best 804877 combination reg byte a [ main::$27 ] +Uplifting [main] best 721446 combination zp[1]:4 [ main::i#2 main::i#1 ] +Attempting to uplift remaining variables inzp[1]:25 [ keyboard_key_pressed::return#2 ] +Uplifting [keyboard_key_pressed] best 721386 combination reg byte a [ keyboard_key_pressed::return#2 ] +Attempting to uplift remaining variables inzp[1]:26 [ main::$15 ] +Uplifting [main] best 721326 combination reg byte a [ main::$15 ] +Attempting to uplift remaining variables inzp[1]:27 [ keyboard_key_pressed::return#10 ] +Uplifting [keyboard_key_pressed] best 721266 combination reg byte a [ keyboard_key_pressed::return#10 ] +Attempting to uplift remaining variables inzp[1]:28 [ main::$18 ] +Uplifting [main] best 721206 combination reg byte a [ main::$18 ] +Attempting to uplift remaining variables inzp[1]:29 [ keyboard_key_pressed::return#11 ] +Uplifting [keyboard_key_pressed] best 721146 combination reg byte a [ keyboard_key_pressed::return#11 ] +Attempting to uplift remaining variables inzp[1]:30 [ main::$21 ] +Uplifting [main] best 721086 combination reg byte a [ main::$21 ] +Attempting to uplift remaining variables inzp[1]:31 [ keyboard_key_pressed::return#12 ] +Uplifting [keyboard_key_pressed] best 721026 combination reg byte a [ keyboard_key_pressed::return#12 ] +Attempting to uplift remaining variables inzp[1]:32 [ main::$24 ] +Uplifting [main] best 720966 combination reg byte a [ main::$24 ] +Attempting to uplift remaining variables inzp[1]:33 [ keyboard_key_pressed::return#13 ] +Uplifting [keyboard_key_pressed] best 720906 combination reg byte a [ keyboard_key_pressed::return#13 ] +Attempting to uplift remaining variables inzp[1]:34 [ main::$27 ] +Uplifting [main] best 720846 combination reg byte a [ main::$27 ] Attempting to uplift remaining variables inzp[1]:6 [ main::shift#9 ] -Uplifting [main] best 804877 combination zp[1]:6 [ main::shift#9 ] -Coalescing zero page register [ zp[2]:12 [ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 ] ] with [ zp[2]:46 [ plot_chargen::$1 ] ] - score: 1 -Coalescing zero page register [ zp[2]:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 ] ] with [ zp[2]:50 [ plot_chargen::$7 ] ] - score: 1 -Coalescing zero page register [ zp[2]:21 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] ] with [ zp[2]:48 [ mul8u::return#2 ] ] - score: 1 -Coalescing zero page register [ zp[2]:12 [ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 plot_chargen::$1 ] ] with [ zp[2]:44 [ plot_chargen::$0 ] ] - score: 1 -Coalescing zero page register [ zp[2]:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 plot_chargen::$7 ] ] with [ zp[2]:21 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 ] ] - score: 1 -Coalescing zero page register [ zp[2]:26 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] ] with [ zp[2]:12 [ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 plot_chargen::$1 plot_chargen::$0 ] ] -Coalescing zero page register [ zp[2]:28 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ] ] with [ zp[2]:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 plot_chargen::$7 mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 ] ] +Uplifting [main] best 720846 combination zp[1]:6 [ main::shift#9 ] +Coalescing zero page register [ zp[2]:12 [ plot_chargen::chargen#4 plot_chargen::chargen#0 plot_chargen::chargen#1 ] ] with [ zp[2]:41 [ plot_chargen::$1 ] ] - score: 1 +Coalescing zero page register [ zp[2]:12 [ plot_chargen::chargen#4 plot_chargen::chargen#0 plot_chargen::chargen#1 plot_chargen::$1 ] ] with [ zp[2]:39 [ plot_chargen::$0 ] ] - score: 1 +Coalescing zero page register [ zp[2]:21 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] ] with [ zp[2]:12 [ plot_chargen::chargen#4 plot_chargen::chargen#0 plot_chargen::chargen#1 plot_chargen::$1 plot_chargen::$0 ] ] +Coalescing zero page register [ zp[2]:23 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ] ] with [ zp[2]:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#0 plot_chargen::sc#2 plot_chargen::sc#1 ] ] Allocated (was zp[1]:14) zp[1]:8 [ plot_chargen::y#2 plot_chargen::y#1 ] Allocated (was zp[1]:15) zp[1]:9 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] -Allocated (was zp[2]:23) zp[2]:10 [ mul8u::mb#2 mul8u::mb#1 ] -Allocated (was zp[2]:26) zp[2]:12 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 plot_chargen::$1 plot_chargen::$0 ] -Allocated (was zp[2]:28) zp[2]:14 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 plot_chargen::$7 mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 ] +Allocated (was zp[2]:21) zp[2]:10 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 plot_chargen::chargen#4 plot_chargen::chargen#0 plot_chargen::chargen#1 plot_chargen::$1 plot_chargen::$0 ] +Allocated (was zp[2]:23) zp[2]:12 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#0 plot_chargen::sc#2 plot_chargen::sc#1 ] ASSEMBLER BEFORE OPTIMIZATION // File Comments @@ -3344,14 +3036,14 @@ main: { __b3: // [8] call print_str_at // Plot 4 initial analysis chars - // [127] phi from main::@3 to print_str_at [phi:main::@3->print_str_at] + // [116] phi from main::@3 to print_str_at [phi:main::@3->print_str_at] print_str_at_from___b3: - // [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1 [phi:main::@3->print_str_at#0] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1 [phi:main::@3->print_str_at#0] -- pbuz1=pbuc1 lda #SCREEN+1 sta.z print_str_at.at+1 - // [127] phi (byte*) print_str_at::str#7 = (const byte*) main::str [phi:main::@3->print_str_at#1] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::str#7 = (const byte*) main::str [phi:main::@3->print_str_at#1] -- pbuz1=pbuc1 lda #str @@ -3363,14 +3055,14 @@ main: { // main::@17 __b17: // [10] call print_str_at - // [127] phi from main::@17 to print_str_at [phi:main::@17->print_str_at] + // [116] phi from main::@17 to print_str_at [phi:main::@17->print_str_at] print_str_at_from___b17: - // [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $a [phi:main::@17->print_str_at#0] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $a [phi:main::@17->print_str_at#0] -- pbuz1=pbuc1 lda #SCREEN+1+$a sta.z print_str_at.at+1 - // [127] phi (byte*) print_str_at::str#7 = (const byte*) main::str1 [phi:main::@17->print_str_at#1] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::str#7 = (const byte*) main::str1 [phi:main::@17->print_str_at#1] -- pbuz1=pbuc1 lda #str1 @@ -3382,14 +3074,14 @@ main: { // main::@18 __b18: // [12] call print_str_at - // [127] phi from main::@18 to print_str_at [phi:main::@18->print_str_at] + // [116] phi from main::@18 to print_str_at [phi:main::@18->print_str_at] print_str_at_from___b18: - // [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $14 [phi:main::@18->print_str_at#0] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $14 [phi:main::@18->print_str_at#0] -- pbuz1=pbuc1 lda #SCREEN+1+$14 sta.z print_str_at.at+1 - // [127] phi (byte*) print_str_at::str#7 = (const byte*) main::str2 [phi:main::@18->print_str_at#1] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::str#7 = (const byte*) main::str2 [phi:main::@18->print_str_at#1] -- pbuz1=pbuc1 lda #str2 @@ -3401,14 +3093,14 @@ main: { // main::@19 __b19: // [14] call print_str_at - // [127] phi from main::@19 to print_str_at [phi:main::@19->print_str_at] + // [116] phi from main::@19 to print_str_at [phi:main::@19->print_str_at] print_str_at_from___b19: - // [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $1e [phi:main::@19->print_str_at#0] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $1e [phi:main::@19->print_str_at#0] -- pbuz1=pbuc1 lda #SCREEN+1+$1e sta.z print_str_at.at+1 - // [127] phi (byte*) print_str_at::str#7 = (const byte*) main::str3 [phi:main::@19->print_str_at#1] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::str#7 = (const byte*) main::str3 [phi:main::@19->print_str_at#1] -- pbuz1=pbuc1 lda #str3 @@ -3455,9 +3147,9 @@ main: { // main::@5 __b5: // [21] call keyboard_key_pressed - // [113] phi from main::@5 to keyboard_key_pressed [phi:main::@5->keyboard_key_pressed] + // [102] phi from main::@5 to keyboard_key_pressed [phi:main::@5->keyboard_key_pressed] keyboard_key_pressed_from___b5: - // [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F1 [phi:main::@5->keyboard_key_pressed#0] -- vbuxx=vbuc1 + // [102] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F1 [phi:main::@5->keyboard_key_pressed#0] -- vbuxx=vbuc1 ldx #KEY_F1 jsr keyboard_key_pressed // [22] (byte) keyboard_key_pressed::return#2 ← (byte) keyboard_key_pressed::return#0 @@ -3486,9 +3178,9 @@ main: { // main::@6 __b6: // [27] call keyboard_key_pressed - // [113] phi from main::@6 to keyboard_key_pressed [phi:main::@6->keyboard_key_pressed] + // [102] phi from main::@6 to keyboard_key_pressed [phi:main::@6->keyboard_key_pressed] keyboard_key_pressed_from___b6: - // [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F3 [phi:main::@6->keyboard_key_pressed#0] -- vbuxx=vbuc1 + // [102] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F3 [phi:main::@6->keyboard_key_pressed#0] -- vbuxx=vbuc1 ldx #KEY_F3 jsr keyboard_key_pressed // [28] (byte) keyboard_key_pressed::return#10 ← (byte) keyboard_key_pressed::return#0 @@ -3517,9 +3209,9 @@ main: { // main::@7 __b7: // [33] call keyboard_key_pressed - // [113] phi from main::@7 to keyboard_key_pressed [phi:main::@7->keyboard_key_pressed] + // [102] phi from main::@7 to keyboard_key_pressed [phi:main::@7->keyboard_key_pressed] keyboard_key_pressed_from___b7: - // [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F5 [phi:main::@7->keyboard_key_pressed#0] -- vbuxx=vbuc1 + // [102] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F5 [phi:main::@7->keyboard_key_pressed#0] -- vbuxx=vbuc1 ldx #KEY_F5 jsr keyboard_key_pressed // [34] (byte) keyboard_key_pressed::return#11 ← (byte) keyboard_key_pressed::return#0 @@ -3548,9 +3240,9 @@ main: { // main::@8 __b8: // [39] call keyboard_key_pressed - // [113] phi from main::@8 to keyboard_key_pressed [phi:main::@8->keyboard_key_pressed] + // [102] phi from main::@8 to keyboard_key_pressed [phi:main::@8->keyboard_key_pressed] keyboard_key_pressed_from___b8: - // [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F7 [phi:main::@8->keyboard_key_pressed#0] -- vbuxx=vbuc1 + // [102] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F7 [phi:main::@8->keyboard_key_pressed#0] -- vbuxx=vbuc1 ldx #KEY_F7 jsr keyboard_key_pressed // [40] (byte) keyboard_key_pressed::return#12 ← (byte) keyboard_key_pressed::return#0 @@ -3579,9 +3271,9 @@ main: { // main::@9 __b9: // [45] call keyboard_key_pressed - // [113] phi from main::@9 to keyboard_key_pressed [phi:main::@9->keyboard_key_pressed] + // [102] phi from main::@9 to keyboard_key_pressed [phi:main::@9->keyboard_key_pressed] keyboard_key_pressed_from___b9: - // [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_LSHIFT [phi:main::@9->keyboard_key_pressed#0] -- vbuxx=vbuc1 + // [102] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_LSHIFT [phi:main::@9->keyboard_key_pressed#0] -- vbuxx=vbuc1 ldx #KEY_LSHIFT jsr keyboard_key_pressed // [46] (byte) keyboard_key_pressed::return#13 ← (byte) keyboard_key_pressed::return#0 @@ -3642,9 +3334,9 @@ main: { // [57] (byte) keyboard_key_pressed::key#5 ← (byte) main::key#0 -- vbuxx=vbuaa tax // [58] call keyboard_key_pressed - // [113] phi from main::@15 to keyboard_key_pressed [phi:main::@15->keyboard_key_pressed] + // [102] phi from main::@15 to keyboard_key_pressed [phi:main::@15->keyboard_key_pressed] keyboard_key_pressed_from___b15: - // [113] phi (byte) keyboard_key_pressed::key#6 = (byte) keyboard_key_pressed::key#5 [phi:main::@15->keyboard_key_pressed#0] -- register_copy + // [102] phi (byte) keyboard_key_pressed::key#6 = (byte) keyboard_key_pressed::key#5 [phi:main::@15->keyboard_key_pressed#0] -- register_copy jsr keyboard_key_pressed // [59] (byte) keyboard_key_pressed::return#14 ← (byte) keyboard_key_pressed::return#0 jmp __b27 @@ -3722,11 +3414,10 @@ main: { // Render 8x8 char (ch) as pixels on char canvas #pos // plot_chargen(byte register(Y) pos, byte register(A) ch, byte register(X) shift) plot_chargen: { - .label __0 = $c - .label __1 = $c - .label __7 = $e - .label chargen = $c - .label sc = $e + .label __0 = $a + .label __1 = $a + .label chargen = $a + .label sc = $c .label bits = 9 .label y = 8 // asm { sei } @@ -3767,108 +3458,105 @@ plot_chargen: { // [78] phi from plot_chargen plot_chargen::@2 to plot_chargen::@1 [phi:plot_chargen/plot_chargen::@2->plot_chargen::@1] __b1_from_plot_chargen: __b1_from___b2: - // [78] phi (byte*) plot_chargen::chargen#5 = (byte*) plot_chargen::chargen#0 [phi:plot_chargen/plot_chargen::@2->plot_chargen::@1#0] -- register_copy + // [78] phi (byte*) plot_chargen::chargen#4 = (byte*) plot_chargen::chargen#0 [phi:plot_chargen/plot_chargen::@2->plot_chargen::@1#0] -- register_copy jmp __b1 // plot_chargen::@1 __b1: // [79] *((const byte*) PROCPORT) ← (byte) $32 -- _deref_pbuc1=vbuc2 lda #$32 sta PROCPORT - // [80] (byte) mul8u::a#1 ← (byte) plot_chargen::pos#2 -- vbuxx=vbuyy + // [80] (byte~) plot_chargen::$16 ← (byte) plot_chargen::pos#2 << (byte) 2 -- vbuaa=vbuyy_rol_2 tya - tax - // [81] call mul8u - // [103] phi from plot_chargen::@1 to mul8u [phi:plot_chargen::@1->mul8u] - mul8u_from___b1: - jsr mul8u - // [82] (word) mul8u::return#2 ← (word) mul8u::res#2 - jmp __b9 - // plot_chargen::@9 - __b9: - // [83] (word~) plot_chargen::$7 ← (word) mul8u::return#2 - // [84] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN+(byte) $28+(byte) 1 + (word~) plot_chargen::$7 -- pbuz1=pbuc1_plus_vwuz1 + asl + asl + // [81] (byte~) plot_chargen::$17 ← (byte~) plot_chargen::$16 + (byte) plot_chargen::pos#2 -- vbuaa=vbuaa_plus_vbuyy + sty.z $ff clc - lda.z sc - adc #SCREEN+$28+1 + lda #>SCREEN+$29 + adc #0 sta.z sc+1 - // [85] phi from plot_chargen::@9 to plot_chargen::@3 [phi:plot_chargen::@9->plot_chargen::@3] - __b3_from___b9: - // [85] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#0 [phi:plot_chargen::@9->plot_chargen::@3#0] -- register_copy - // [85] phi (byte) plot_chargen::y#2 = (byte) 0 [phi:plot_chargen::@9->plot_chargen::@3#1] -- vbuz1=vbuc1 + // [84] phi from plot_chargen::@1 to plot_chargen::@3 [phi:plot_chargen::@1->plot_chargen::@3] + __b3_from___b1: + // [84] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#0 [phi:plot_chargen::@1->plot_chargen::@3#0] -- register_copy + // [84] phi (byte) plot_chargen::y#2 = (byte) 0 [phi:plot_chargen::@1->plot_chargen::@3#1] -- vbuz1=vbuc1 lda #0 sta.z y jmp __b3 - // [85] phi from plot_chargen::@7 to plot_chargen::@3 [phi:plot_chargen::@7->plot_chargen::@3] + // [84] phi from plot_chargen::@7 to plot_chargen::@3 [phi:plot_chargen::@7->plot_chargen::@3] __b3_from___b7: - // [85] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#2 [phi:plot_chargen::@7->plot_chargen::@3#0] -- register_copy - // [85] phi (byte) plot_chargen::y#2 = (byte) plot_chargen::y#1 [phi:plot_chargen::@7->plot_chargen::@3#1] -- register_copy + // [84] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#2 [phi:plot_chargen::@7->plot_chargen::@3#0] -- register_copy + // [84] phi (byte) plot_chargen::y#2 = (byte) plot_chargen::y#1 [phi:plot_chargen::@7->plot_chargen::@3#1] -- register_copy jmp __b3 // plot_chargen::@3 __b3: - // [86] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#5 + (byte) plot_chargen::y#2) -- vbuz1=pbuz2_derefidx_vbuz3 + // [85] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#4 + (byte) plot_chargen::y#2) -- vbuz1=pbuz2_derefidx_vbuz3 ldy.z y lda (chargen),y sta.z bits - // [87] phi from plot_chargen::@3 to plot_chargen::@4 [phi:plot_chargen::@3->plot_chargen::@4] + // [86] phi from plot_chargen::@3 to plot_chargen::@4 [phi:plot_chargen::@3->plot_chargen::@4] __b4_from___b3: - // [87] phi (byte) plot_chargen::x#2 = (byte) 0 [phi:plot_chargen::@3->plot_chargen::@4#0] -- vbuxx=vbuc1 + // [86] phi (byte) plot_chargen::x#2 = (byte) 0 [phi:plot_chargen::@3->plot_chargen::@4#0] -- vbuxx=vbuc1 ldx #0 - // [87] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#7 [phi:plot_chargen::@3->plot_chargen::@4#1] -- register_copy - // [87] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#0 [phi:plot_chargen::@3->plot_chargen::@4#2] -- register_copy + // [86] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#7 [phi:plot_chargen::@3->plot_chargen::@4#1] -- register_copy + // [86] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#0 [phi:plot_chargen::@3->plot_chargen::@4#2] -- register_copy jmp __b4 - // [87] phi from plot_chargen::@5 to plot_chargen::@4 [phi:plot_chargen::@5->plot_chargen::@4] + // [86] phi from plot_chargen::@5 to plot_chargen::@4 [phi:plot_chargen::@5->plot_chargen::@4] __b4_from___b5: - // [87] phi (byte) plot_chargen::x#2 = (byte) plot_chargen::x#1 [phi:plot_chargen::@5->plot_chargen::@4#0] -- register_copy - // [87] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#1 [phi:plot_chargen::@5->plot_chargen::@4#1] -- register_copy - // [87] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#1 [phi:plot_chargen::@5->plot_chargen::@4#2] -- register_copy + // [86] phi (byte) plot_chargen::x#2 = (byte) plot_chargen::x#1 [phi:plot_chargen::@5->plot_chargen::@4#0] -- register_copy + // [86] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#1 [phi:plot_chargen::@5->plot_chargen::@4#1] -- register_copy + // [86] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#1 [phi:plot_chargen::@5->plot_chargen::@4#2] -- register_copy jmp __b4 // plot_chargen::@4 __b4: - // [88] (byte~) plot_chargen::$10 ← (byte) plot_chargen::bits#2 & (byte) $80 -- vbuaa=vbuz1_band_vbuc1 + // [87] (byte~) plot_chargen::$9 ← (byte) plot_chargen::bits#2 & (byte) $80 -- vbuaa=vbuz1_band_vbuc1 lda #$80 and.z bits - // [89] if((byte~) plot_chargen::$10==(byte) 0) goto plot_chargen::@5 -- vbuaa_eq_0_then_la1 + // [88] if((byte~) plot_chargen::$9==(byte) 0) goto plot_chargen::@5 -- vbuaa_eq_0_then_la1 cmp #0 beq __b5_from___b4 - // [90] phi from plot_chargen::@4 to plot_chargen::@6 [phi:plot_chargen::@4->plot_chargen::@6] + // [89] phi from plot_chargen::@4 to plot_chargen::@6 [phi:plot_chargen::@4->plot_chargen::@6] __b6_from___b4: jmp __b6 // plot_chargen::@6 __b6: - // [91] phi from plot_chargen::@6 to plot_chargen::@5 [phi:plot_chargen::@6->plot_chargen::@5] + // [90] phi from plot_chargen::@6 to plot_chargen::@5 [phi:plot_chargen::@6->plot_chargen::@5] __b5_from___b6: - // [91] phi (byte) plot_chargen::c#2 = (byte) '*' [phi:plot_chargen::@6->plot_chargen::@5#0] -- vbuaa=vbuc1 + // [90] phi (byte) plot_chargen::c#2 = (byte) '*' [phi:plot_chargen::@6->plot_chargen::@5#0] -- vbuaa=vbuc1 lda #'*' jmp __b5 - // [91] phi from plot_chargen::@4 to plot_chargen::@5 [phi:plot_chargen::@4->plot_chargen::@5] + // [90] phi from plot_chargen::@4 to plot_chargen::@5 [phi:plot_chargen::@4->plot_chargen::@5] __b5_from___b4: - // [91] phi (byte) plot_chargen::c#2 = (byte) '.' [phi:plot_chargen::@4->plot_chargen::@5#0] -- vbuaa=vbuc1 + // [90] phi (byte) plot_chargen::c#2 = (byte) '.' [phi:plot_chargen::@4->plot_chargen::@5#0] -- vbuaa=vbuc1 lda #'.' jmp __b5 // plot_chargen::@5 __b5: - // [92] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 -- _deref_pbuz1=vbuaa + // [91] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 -- _deref_pbuz1=vbuaa ldy #0 sta (sc),y - // [93] (byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3 -- pbuz1=_inc_pbuz1 + // [92] (byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3 -- pbuz1=_inc_pbuz1 inc.z sc bne !+ inc.z sc+1 !: - // [94] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 << (byte) 1 -- vbuz1=vbuz1_rol_1 + // [93] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 << (byte) 1 -- vbuz1=vbuz1_rol_1 asl.z bits - // [95] (byte) plot_chargen::x#1 ← ++ (byte) plot_chargen::x#2 -- vbuxx=_inc_vbuxx + // [94] (byte) plot_chargen::x#1 ← ++ (byte) plot_chargen::x#2 -- vbuxx=_inc_vbuxx inx - // [96] if((byte) plot_chargen::x#1!=(byte) 8) goto plot_chargen::@4 -- vbuxx_neq_vbuc1_then_la1 + // [95] if((byte) plot_chargen::x#1!=(byte) 8) goto plot_chargen::@4 -- vbuxx_neq_vbuc1_then_la1 cpx #8 bne __b4_from___b5 jmp __b7 // plot_chargen::@7 __b7: - // [97] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte) $20 -- pbuz1=pbuz1_plus_vbuc1 + // [96] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte) $20 -- pbuz1=pbuz1_plus_vbuc1 lda #$20 clc adc.z sc @@ -3876,16 +3564,16 @@ plot_chargen: { bcc !+ inc.z sc+1 !: - // [98] (byte) plot_chargen::y#1 ← ++ (byte) plot_chargen::y#2 -- vbuz1=_inc_vbuz1 + // [97] (byte) plot_chargen::y#1 ← ++ (byte) plot_chargen::y#2 -- vbuz1=_inc_vbuz1 inc.z y - // [99] if((byte) plot_chargen::y#1!=(byte) 8) goto plot_chargen::@3 -- vbuz1_neq_vbuc1_then_la1 + // [98] if((byte) plot_chargen::y#1!=(byte) 8) goto plot_chargen::@3 -- vbuz1_neq_vbuc1_then_la1 lda #8 cmp.z y bne __b3_from___b7 jmp __b8 // plot_chargen::@8 __b8: - // [100] *((const byte*) PROCPORT) ← (byte) $37 -- _deref_pbuc1=vbuc2 + // [99] *((const byte*) PROCPORT) ← (byte) $37 -- _deref_pbuc1=vbuc2 lda #$37 sta PROCPORT // asm { cli } @@ -3893,80 +3581,8 @@ plot_chargen: { jmp __breturn // plot_chargen::@return __breturn: - // [102] return + // [101] return rts -} - // mul8u -// Perform binary multiplication of two unsigned 8-bit bytes into a 16-bit unsigned word -// mul8u(byte register(X) a) -mul8u: { - .const b = $a - .label mb = $a - .label res = $e - .label return = $e - // [104] phi from mul8u to mul8u::@1 [phi:mul8u->mul8u::@1] - __b1_from_mul8u: - // [104] phi (word) mul8u::mb#2 = (word)(const byte) mul8u::b#0 [phi:mul8u->mul8u::@1#0] -- vwuz1=vwuc1 - lda #b - sta.z mb+1 - // [104] phi (word) mul8u::res#2 = (word) 0 [phi:mul8u->mul8u::@1#1] -- vwuz1=vwuc1 - lda #<0 - sta.z res - lda #>0 - sta.z res+1 - // [104] phi (byte) mul8u::a#2 = (byte) mul8u::a#1 [phi:mul8u->mul8u::@1#2] -- register_copy - jmp __b1 - // mul8u::@1 - __b1: - // [105] if((byte) mul8u::a#2!=(byte) 0) goto mul8u::@2 -- vbuxx_neq_0_then_la1 - cpx #0 - bne __b2 - jmp __breturn - // mul8u::@return - __breturn: - // [106] return - rts - // mul8u::@2 - __b2: - // [107] (byte~) mul8u::$1 ← (byte) mul8u::a#2 & (byte) 1 -- vbuaa=vbuxx_band_vbuc1 - txa - and #1 - // [108] if((byte~) mul8u::$1==(byte) 0) goto mul8u::@3 -- vbuaa_eq_0_then_la1 - cmp #0 - beq __b3_from___b2 - jmp __b4 - // mul8u::@4 - __b4: - // [109] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 -- vwuz1=vwuz1_plus_vwuz2 - lda.z res - clc - adc.z mb - sta.z res - lda.z res+1 - adc.z mb+1 - sta.z res+1 - // [110] phi from mul8u::@2 mul8u::@4 to mul8u::@3 [phi:mul8u::@2/mul8u::@4->mul8u::@3] - __b3_from___b2: - __b3_from___b4: - // [110] phi (word) mul8u::res#6 = (word) mul8u::res#2 [phi:mul8u::@2/mul8u::@4->mul8u::@3#0] -- register_copy - jmp __b3 - // mul8u::@3 - __b3: - // [111] (byte) mul8u::a#0 ← (byte) mul8u::a#2 >> (byte) 1 -- vbuxx=vbuxx_ror_1 - txa - lsr - tax - // [112] (word) mul8u::mb#1 ← (word) mul8u::mb#2 << (byte) 1 -- vwuz1=vwuz1_rol_1 - asl.z mb - rol.z mb+1 - // [104] phi from mul8u::@3 to mul8u::@1 [phi:mul8u::@3->mul8u::@1] - __b1_from___b3: - // [104] phi (word) mul8u::mb#2 = (word) mul8u::mb#1 [phi:mul8u::@3->mul8u::@1#0] -- register_copy - // [104] phi (word) mul8u::res#2 = (word) mul8u::res#6 [phi:mul8u::@3->mul8u::@1#1] -- register_copy - // [104] phi (byte) mul8u::a#2 = (byte) mul8u::a#0 [phi:mul8u::@3->mul8u::@1#2] -- register_copy - jmp __b1 } // keyboard_key_pressed // Determines whether a specific key is currently pressed by accessing the matrix directly @@ -3975,30 +3591,30 @@ mul8u: { // Returns zero if the key is not pressed and a non-zero value if the key is currently pressed // keyboard_key_pressed(byte register(X) key) keyboard_key_pressed: { - // [114] (byte) keyboard_key_pressed::colidx#0 ← (byte) keyboard_key_pressed::key#6 & (byte) 7 -- vbuyy=vbuxx_band_vbuc1 + // [103] (byte) keyboard_key_pressed::colidx#0 ← (byte) keyboard_key_pressed::key#6 & (byte) 7 -- vbuyy=vbuxx_band_vbuc1 txa and #7 tay - // [115] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte) 3 -- vbuaa=vbuxx_ror_3 + // [104] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte) 3 -- vbuaa=vbuxx_ror_3 txa lsr lsr lsr - // [116] (byte) keyboard_matrix_read::rowid#0 ← (byte) keyboard_key_pressed::rowidx#0 -- vbuxx=vbuaa + // [105] (byte) keyboard_matrix_read::rowid#0 ← (byte) keyboard_key_pressed::rowidx#0 -- vbuxx=vbuaa tax - // [117] call keyboard_matrix_read + // [106] call keyboard_matrix_read jsr keyboard_matrix_read - // [118] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0 + // [107] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0 jmp __b1 // keyboard_key_pressed::@1 __b1: - // [119] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2 - // [120] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte*) keyboard_matrix_col_bitmask + (byte) keyboard_key_pressed::colidx#0) -- vbuaa=vbuaa_band_pbuc1_derefidx_vbuyy + // [108] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2 + // [109] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte*) keyboard_matrix_col_bitmask + (byte) keyboard_key_pressed::colidx#0) -- vbuaa=vbuaa_band_pbuc1_derefidx_vbuyy and keyboard_matrix_col_bitmask,y jmp __breturn // keyboard_key_pressed::@return __breturn: - // [121] return + // [110] return rts } // keyboard_matrix_read @@ -4009,16 +3625,16 @@ keyboard_key_pressed: { // leading to erroneous readings. You must disable kill the normal interrupt or sei/cli around calls to the keyboard matrix reader. // keyboard_matrix_read(byte register(X) rowid) keyboard_matrix_read: { - // [122] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask + (byte) keyboard_matrix_read::rowid#0) -- _deref_pbuc1=pbuc2_derefidx_vbuxx + // [111] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask + (byte) keyboard_matrix_read::rowid#0) -- _deref_pbuc1=pbuc2_derefidx_vbuxx lda keyboard_matrix_row_bitmask,x sta CIA1_PORT_A - // [123] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B) -- vbuaa=_bnot__deref_pbuc1 + // [112] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B) -- vbuaa=_bnot__deref_pbuc1 lda CIA1_PORT_B eor #$ff jmp __breturn // keyboard_matrix_read::@return __breturn: - // [124] return + // [113] return rts } // keyboard_get_keycode @@ -4028,29 +3644,29 @@ keyboard_matrix_read: { // If there is no non-shifted key representing the char $3f is returned (representing RUN/STOP) . // keyboard_get_keycode(byte register(X) ch) keyboard_get_keycode: { - // [125] (byte) keyboard_get_keycode::return#0 ← *((const byte*) keyboard_char_keycodes + (byte) keyboard_get_keycode::ch#0) -- vbuaa=pbuc1_derefidx_vbuxx + // [114] (byte) keyboard_get_keycode::return#0 ← *((const byte*) keyboard_char_keycodes + (byte) keyboard_get_keycode::ch#0) -- vbuaa=pbuc1_derefidx_vbuxx lda keyboard_char_keycodes,x jmp __breturn // keyboard_get_keycode::@return __breturn: - // [126] return + // [115] return rts } // print_str_at // Print a string at a specific screen position -// print_str_at(byte* zp($c) str, byte* zp($e) at) +// print_str_at(byte* zp($a) str, byte* zp($c) at) print_str_at: { - .label at = $e - .label str = $c - // [128] phi from print_str_at print_str_at::@2 to print_str_at::@1 [phi:print_str_at/print_str_at::@2->print_str_at::@1] + .label at = $c + .label str = $a + // [117] phi from print_str_at print_str_at::@2 to print_str_at::@1 [phi:print_str_at/print_str_at::@2->print_str_at::@1] __b1_from_print_str_at: __b1_from___b2: - // [128] phi (byte*) print_str_at::at#5 = (byte*) print_str_at::at#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#0] -- register_copy - // [128] phi (byte*) print_str_at::str#5 = (byte*) print_str_at::str#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#1] -- register_copy + // [117] phi (byte*) print_str_at::at#5 = (byte*) print_str_at::at#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#0] -- register_copy + // [117] phi (byte*) print_str_at::str#5 = (byte*) print_str_at::str#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#1] -- register_copy jmp __b1 // print_str_at::@1 __b1: - // [129] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 -- vbuc1_neq__deref_pbuz1_then_la1 + // [118] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 -- vbuc1_neq__deref_pbuz1_then_la1 ldy #0 lda (str),y cmp #0 @@ -4058,21 +3674,21 @@ print_str_at: { jmp __breturn // print_str_at::@return __breturn: - // [130] return + // [119] return rts // print_str_at::@2 __b2: - // [131] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) -- _deref_pbuz1=_deref_pbuz2 + // [120] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) -- _deref_pbuz1=_deref_pbuz2 ldy #0 lda (str),y ldy #0 sta (at),y - // [132] (byte*) print_str_at::at#4 ← ++ (byte*) print_str_at::at#5 -- pbuz1=_inc_pbuz1 + // [121] (byte*) print_str_at::at#4 ← ++ (byte*) print_str_at::at#5 -- pbuz1=_inc_pbuz1 inc.z at bne !+ inc.z at+1 !: - // [133] (byte*) print_str_at::str#4 ← ++ (byte*) print_str_at::str#5 -- pbuz1=_inc_pbuz1 + // [122] (byte*) print_str_at::str#4 ← ++ (byte*) print_str_at::str#5 -- pbuz1=_inc_pbuz1 inc.z str bne !+ inc.z str+1 @@ -4123,7 +3739,6 @@ Removing instruction jmp __b16 Removing instruction jmp __b14 Removing instruction jmp __b2 Removing instruction jmp __b1 -Removing instruction jmp __b9 Removing instruction jmp __b3 Removing instruction jmp __b4 Removing instruction jmp __b6 @@ -4133,16 +3748,11 @@ Removing instruction jmp __b8 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 __breturn Removing instruction jmp __breturn Removing instruction jmp __breturn Removing instruction jmp __b1 Removing instruction jmp __breturn Succesful ASM optimization Pass5NextJumpElimination -Removing instruction lda #>0 Removing instruction ldy #0 Succesful ASM optimization Pass5UnnecesaryLoadElimination Replacing label __b4_from___b20 with __b4 @@ -4155,7 +3765,6 @@ Replacing label __b12_from___b14 with __b12 Replacing label __b1_from_plot_chargen with __b1 Replacing label __b4_from___b5 with __b4 Replacing label __b3_from___b7 with __b3 -Replacing label __b3_from___b2 with __b3 Replacing label __b1_from___b2 with __b1 Removing instruction __b1_from___bbegin: Removing instruction __b1: @@ -4197,8 +3806,6 @@ Removing instruction __b3_from___b7: Removing instruction __b4_from___b5: Removing instruction __b6_from___b4: Removing instruction __b5_from___b6: -Removing instruction __b3_from___b2: -Removing instruction __b3_from___b4: Removing instruction __b1_from_print_str_at: Removing instruction __b1_from___b2: Succesful ASM optimization Pass5RedundantLabelElimination @@ -4232,18 +3839,12 @@ Removing instruction plot_chargen_from___b16: Removing instruction __b5_from___b14: Removing instruction __b1_from___b2: Removing instruction __b2: -Removing instruction mul8u_from___b1: -Removing instruction __b9: -Removing instruction __b3_from___b9: +Removing instruction __b3_from___b1: Removing instruction __b4_from___b3: Removing instruction __b6: Removing instruction __b7: Removing instruction __b8: Removing instruction __breturn: -Removing instruction __b1_from_mul8u: -Removing instruction __breturn: -Removing instruction __b4: -Removing instruction __b1_from___b3: Removing instruction __b1: Removing instruction __breturn: Removing instruction __breturn: @@ -4434,33 +4035,13 @@ FINAL SYMBOL TABLE (const byte*) main::str1[(byte) 3] = (byte*) "f3" (const byte*) main::str2[(byte) 3] = (byte*) "f5" (const byte*) main::str3[(byte) 3] = (byte*) "f7" -(word()) mul8u((byte) mul8u::a , (byte) mul8u::b) -(byte~) mul8u::$1 reg byte a 2.00000002E8 -(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 1.00000001E8 -(byte) mul8u::a#1 reg byte x 55001.0 -(byte) mul8u::a#2 reg byte x 6.668333416666667E7 -(byte) mul8u::b -(const byte) mul8u::b#0 b = (byte) $a -(word) mul8u::mb -(word) mul8u::mb#1 mb zp[2]:10 2.00000002E8 -(word) mul8u::mb#2 mb zp[2]:10 4.285714328571428E7 -(word) mul8u::res -(word) mul8u::res#1 res zp[2]:14 2.00000002E8 -(word) mul8u::res#2 res zp[2]:14 5.0001667333333336E7 -(word) mul8u::res#6 res zp[2]:14 1.00000001E8 -(word) mul8u::return -(word) mul8u::return#2 return zp[2]:14 20002.0 (void()) plot_chargen((byte) plot_chargen::pos , (byte) plot_chargen::ch , (byte) plot_chargen::shift) -(word~) plot_chargen::$0 zp[2]:12 20002.0 -(word~) plot_chargen::$1 zp[2]:12 20002.0 -(byte~) plot_chargen::$10 reg byte a 2.00000002E8 -(word~) plot_chargen::$7 zp[2]:14 20002.0 +(word~) plot_chargen::$0 zp[2]:10 20002.0 +(word~) plot_chargen::$1 zp[2]:10 20002.0 +(byte~) plot_chargen::$16 reg byte a 20002.0 +(byte~) plot_chargen::$17 reg byte a 20002.0 +(byte~) plot_chargen::$6 reg byte a 20002.0 +(byte~) plot_chargen::$9 reg byte a 2.00000002E8 (label) plot_chargen::@1 (label) plot_chargen::@2 (label) plot_chargen::@3 @@ -4469,7 +4050,6 @@ FINAL SYMBOL TABLE (label) plot_chargen::@6 (label) plot_chargen::@7 (label) plot_chargen::@8 -(label) plot_chargen::@9 (label) plot_chargen::@return (byte) plot_chargen::bits (byte) plot_chargen::bits#0 bits zp[1]:9 2.0000002E7 @@ -4481,19 +4061,19 @@ FINAL SYMBOL TABLE (byte) plot_chargen::ch#1 reg byte a 1001.0 (byte) plot_chargen::ch#2 reg byte a 500.5 (byte*) plot_chargen::chargen -(byte*) plot_chargen::chargen#0 chargen zp[2]:12 15001.5 -(byte*) plot_chargen::chargen#1 chargen zp[2]:12 20002.0 -(byte*) plot_chargen::chargen#5 chargen zp[2]:12 455454.6818181818 +(byte*) plot_chargen::chargen#0 chargen zp[2]:10 15001.5 +(byte*) plot_chargen::chargen#1 chargen zp[2]:10 20002.0 +(byte*) plot_chargen::chargen#4 chargen zp[2]:10 477143.0 (byte) plot_chargen::pos (byte) plot_chargen::pos#0 reg byte y 202.0 (byte) plot_chargen::pos#1 reg byte y 667.3333333333334 -(byte) plot_chargen::pos#2 reg byte y 1233.6666666666665 +(byte) plot_chargen::pos#2 reg byte y 2110.4 (byte*) plot_chargen::sc -(byte*) plot_chargen::sc#0 sc zp[2]:14 20002.0 -(byte*) plot_chargen::sc#1 sc zp[2]:14 5.250000075E7 -(byte*) plot_chargen::sc#2 sc zp[2]:14 6666667.333333333 -(byte*) plot_chargen::sc#3 sc zp[2]:14 5.1666667333333336E7 -(byte*) plot_chargen::sc#7 sc zp[2]:14 1.00050015E7 +(byte*) plot_chargen::sc#0 sc zp[2]:12 20002.0 +(byte*) plot_chargen::sc#1 sc zp[2]:12 5.250000075E7 +(byte*) plot_chargen::sc#2 sc zp[2]:12 6666667.333333333 +(byte*) plot_chargen::sc#3 sc zp[2]:12 5.1666667333333336E7 +(byte*) plot_chargen::sc#7 sc zp[2]:12 1.00050015E7 (byte) plot_chargen::shift (byte) plot_chargen::shift#1 reg byte x 2002.0 (byte) plot_chargen::shift#2 reg byte x 2200.4 @@ -4508,13 +4088,13 @@ FINAL SYMBOL TABLE (label) print_str_at::@2 (label) print_str_at::@return (byte*) print_str_at::at -(byte*) print_str_at::at#4 at zp[2]:14 1001.0 -(byte*) print_str_at::at#5 at zp[2]:14 1034.6666666666667 -(byte*) print_str_at::at#7 at zp[2]:14 101.0 +(byte*) print_str_at::at#4 at zp[2]:12 1001.0 +(byte*) print_str_at::at#5 at zp[2]:12 1034.6666666666667 +(byte*) print_str_at::at#7 at zp[2]:12 101.0 (byte*) print_str_at::str -(byte*) print_str_at::str#4 str zp[2]:12 2002.0 -(byte*) print_str_at::str#5 str zp[2]:12 1026.25 -(byte*) print_str_at::str#7 str zp[2]:12 101.0 +(byte*) print_str_at::str#4 str zp[2]:10 2002.0 +(byte*) print_str_at::str#5 str zp[2]:10 1026.25 +(byte*) print_str_at::str#7 str zp[2]:10 101.0 zp[2]:2 [ main::sc#2 main::sc#1 ] zp[1]:4 [ main::i#2 main::i#1 ] @@ -4529,11 +4109,9 @@ zp[1]:8 [ plot_chargen::y#2 plot_chargen::y#1 ] zp[1]:9 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] reg byte x [ plot_chargen::x#2 plot_chargen::x#1 ] reg byte a [ plot_chargen::c#2 ] -reg byte x [ mul8u::a#2 mul8u::a#1 mul8u::a#0 ] -zp[2]:10 [ mul8u::mb#2 mul8u::mb#1 ] reg byte x [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ] -zp[2]:12 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 plot_chargen::$1 plot_chargen::$0 ] -zp[2]:14 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 plot_chargen::$7 mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 ] +zp[2]:10 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 plot_chargen::chargen#4 plot_chargen::chargen#0 plot_chargen::chargen#1 plot_chargen::$1 plot_chargen::$0 ] +zp[2]:12 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#0 plot_chargen::sc#2 plot_chargen::sc#1 ] reg byte a [ keyboard_key_pressed::return#2 ] reg byte a [ main::$15 ] reg byte a [ keyboard_key_pressed::return#10 ] @@ -4548,8 +4126,10 @@ reg byte x [ keyboard_get_keycode::ch#0 ] reg byte a [ keyboard_get_keycode::return#2 ] reg byte a [ main::key#0 ] reg byte a [ keyboard_key_pressed::return#14 ] -reg byte a [ plot_chargen::$10 ] -reg byte a [ mul8u::$1 ] +reg byte a [ plot_chargen::$16 ] +reg byte a [ plot_chargen::$17 ] +reg byte a [ plot_chargen::$6 ] +reg byte a [ plot_chargen::$9 ] reg byte y [ keyboard_key_pressed::colidx#0 ] reg byte a [ keyboard_key_pressed::rowidx#0 ] reg byte x [ keyboard_matrix_read::rowid#0 ] @@ -4561,7 +4141,7 @@ reg byte a [ keyboard_get_keycode::return#0 ] FINAL ASSEMBLER -Score: 628983 +Score: 558979 // File Comments // Allows analysis of the CHARGEN ROM font @@ -4678,13 +4258,13 @@ main: { // print_str_at("f1", SCREEN+1) // [8] call print_str_at // Plot 4 initial analysis chars - // [127] phi from main::@3 to print_str_at [phi:main::@3->print_str_at] - // [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1 [phi:main::@3->print_str_at#0] -- pbuz1=pbuc1 + // [116] phi from main::@3 to print_str_at [phi:main::@3->print_str_at] + // [116] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1 [phi:main::@3->print_str_at#0] -- pbuz1=pbuc1 lda #SCREEN+1 sta.z print_str_at.at+1 - // [127] phi (byte*) print_str_at::str#7 = (const byte*) main::str [phi:main::@3->print_str_at#1] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::str#7 = (const byte*) main::str [phi:main::@3->print_str_at#1] -- pbuz1=pbuc1 lda #str @@ -4694,13 +4274,13 @@ main: { // main::@17 // print_str_at("f3", SCREEN+1+10) // [10] call print_str_at - // [127] phi from main::@17 to print_str_at [phi:main::@17->print_str_at] - // [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $a [phi:main::@17->print_str_at#0] -- pbuz1=pbuc1 + // [116] phi from main::@17 to print_str_at [phi:main::@17->print_str_at] + // [116] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $a [phi:main::@17->print_str_at#0] -- pbuz1=pbuc1 lda #SCREEN+1+$a sta.z print_str_at.at+1 - // [127] phi (byte*) print_str_at::str#7 = (const byte*) main::str1 [phi:main::@17->print_str_at#1] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::str#7 = (const byte*) main::str1 [phi:main::@17->print_str_at#1] -- pbuz1=pbuc1 lda #str1 @@ -4710,13 +4290,13 @@ main: { // main::@18 // print_str_at("f5", SCREEN+1+20) // [12] call print_str_at - // [127] phi from main::@18 to print_str_at [phi:main::@18->print_str_at] - // [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $14 [phi:main::@18->print_str_at#0] -- pbuz1=pbuc1 + // [116] phi from main::@18 to print_str_at [phi:main::@18->print_str_at] + // [116] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $14 [phi:main::@18->print_str_at#0] -- pbuz1=pbuc1 lda #SCREEN+1+$14 sta.z print_str_at.at+1 - // [127] phi (byte*) print_str_at::str#7 = (const byte*) main::str2 [phi:main::@18->print_str_at#1] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::str#7 = (const byte*) main::str2 [phi:main::@18->print_str_at#1] -- pbuz1=pbuc1 lda #str2 @@ -4726,13 +4306,13 @@ main: { // main::@19 // print_str_at("f7", SCREEN+1+30) // [14] call print_str_at - // [127] phi from main::@19 to print_str_at [phi:main::@19->print_str_at] - // [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $1e [phi:main::@19->print_str_at#0] -- pbuz1=pbuc1 + // [116] phi from main::@19 to print_str_at [phi:main::@19->print_str_at] + // [116] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN+(byte) 1+(byte) $1e [phi:main::@19->print_str_at#0] -- pbuz1=pbuc1 lda #SCREEN+1+$1e sta.z print_str_at.at+1 - // [127] phi (byte*) print_str_at::str#7 = (const byte*) main::str3 [phi:main::@19->print_str_at#1] -- pbuz1=pbuc1 + // [116] phi (byte*) print_str_at::str#7 = (const byte*) main::str3 [phi:main::@19->print_str_at#1] -- pbuz1=pbuc1 lda #str3 @@ -4773,8 +4353,8 @@ main: { __b5: // keyboard_key_pressed(KEY_F1) // [21] call keyboard_key_pressed - // [113] phi from main::@5 to keyboard_key_pressed [phi:main::@5->keyboard_key_pressed] - // [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F1 [phi:main::@5->keyboard_key_pressed#0] -- vbuxx=vbuc1 + // [102] phi from main::@5 to keyboard_key_pressed [phi:main::@5->keyboard_key_pressed] + // [102] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F1 [phi:main::@5->keyboard_key_pressed#0] -- vbuxx=vbuc1 ldx #KEY_F1 jsr keyboard_key_pressed // keyboard_key_pressed(KEY_F1) @@ -4797,8 +4377,8 @@ main: { __b6: // keyboard_key_pressed(KEY_F3) // [27] call keyboard_key_pressed - // [113] phi from main::@6 to keyboard_key_pressed [phi:main::@6->keyboard_key_pressed] - // [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F3 [phi:main::@6->keyboard_key_pressed#0] -- vbuxx=vbuc1 + // [102] phi from main::@6 to keyboard_key_pressed [phi:main::@6->keyboard_key_pressed] + // [102] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F3 [phi:main::@6->keyboard_key_pressed#0] -- vbuxx=vbuc1 ldx #KEY_F3 jsr keyboard_key_pressed // keyboard_key_pressed(KEY_F3) @@ -4821,8 +4401,8 @@ main: { __b7: // keyboard_key_pressed(KEY_F5) // [33] call keyboard_key_pressed - // [113] phi from main::@7 to keyboard_key_pressed [phi:main::@7->keyboard_key_pressed] - // [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F5 [phi:main::@7->keyboard_key_pressed#0] -- vbuxx=vbuc1 + // [102] phi from main::@7 to keyboard_key_pressed [phi:main::@7->keyboard_key_pressed] + // [102] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F5 [phi:main::@7->keyboard_key_pressed#0] -- vbuxx=vbuc1 ldx #KEY_F5 jsr keyboard_key_pressed // keyboard_key_pressed(KEY_F5) @@ -4845,8 +4425,8 @@ main: { __b8: // keyboard_key_pressed(KEY_F7) // [39] call keyboard_key_pressed - // [113] phi from main::@8 to keyboard_key_pressed [phi:main::@8->keyboard_key_pressed] - // [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F7 [phi:main::@8->keyboard_key_pressed#0] -- vbuxx=vbuc1 + // [102] phi from main::@8 to keyboard_key_pressed [phi:main::@8->keyboard_key_pressed] + // [102] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F7 [phi:main::@8->keyboard_key_pressed#0] -- vbuxx=vbuc1 ldx #KEY_F7 jsr keyboard_key_pressed // keyboard_key_pressed(KEY_F7) @@ -4869,8 +4449,8 @@ main: { __b9: // keyboard_key_pressed(KEY_LSHIFT) // [45] call keyboard_key_pressed - // [113] phi from main::@9 to keyboard_key_pressed [phi:main::@9->keyboard_key_pressed] - // [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_LSHIFT [phi:main::@9->keyboard_key_pressed#0] -- vbuxx=vbuc1 + // [102] phi from main::@9 to keyboard_key_pressed [phi:main::@9->keyboard_key_pressed] + // [102] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_LSHIFT [phi:main::@9->keyboard_key_pressed#0] -- vbuxx=vbuc1 ldx #KEY_LSHIFT jsr keyboard_key_pressed // keyboard_key_pressed(KEY_LSHIFT) @@ -4922,8 +4502,8 @@ main: { // [57] (byte) keyboard_key_pressed::key#5 ← (byte) main::key#0 -- vbuxx=vbuaa tax // [58] call keyboard_key_pressed - // [113] phi from main::@15 to keyboard_key_pressed [phi:main::@15->keyboard_key_pressed] - // [113] phi (byte) keyboard_key_pressed::key#6 = (byte) keyboard_key_pressed::key#5 [phi:main::@15->keyboard_key_pressed#0] -- register_copy + // [102] phi from main::@15 to keyboard_key_pressed [phi:main::@15->keyboard_key_pressed] + // [102] phi (byte) keyboard_key_pressed::key#6 = (byte) keyboard_key_pressed::key#5 [phi:main::@15->keyboard_key_pressed#0] -- register_copy jsr keyboard_key_pressed // keyboard_key_pressed(key) // [59] (byte) keyboard_key_pressed::return#14 ← (byte) keyboard_key_pressed::return#0 @@ -4998,11 +4578,10 @@ main: { // Render 8x8 char (ch) as pixels on char canvas #pos // plot_chargen(byte register(Y) pos, byte register(A) ch, byte register(X) shift) plot_chargen: { - .label __0 = $c - .label __1 = $c - .label __7 = $e - .label chargen = $c - .label sc = $e + .label __0 = $a + .label __1 = $a + .label chargen = $a + .label sc = $c .label bits = 9 .label y = 8 // asm @@ -5045,101 +4624,100 @@ plot_chargen: { adc #>$800 sta.z chargen+1 // [78] phi from plot_chargen plot_chargen::@2 to plot_chargen::@1 [phi:plot_chargen/plot_chargen::@2->plot_chargen::@1] - // [78] phi (byte*) plot_chargen::chargen#5 = (byte*) plot_chargen::chargen#0 [phi:plot_chargen/plot_chargen::@2->plot_chargen::@1#0] -- register_copy + // [78] phi (byte*) plot_chargen::chargen#4 = (byte*) plot_chargen::chargen#0 [phi:plot_chargen/plot_chargen::@2->plot_chargen::@1#0] -- register_copy // plot_chargen::@1 __b1: // *PROCPORT = $32 // [79] *((const byte*) PROCPORT) ← (byte) $32 -- _deref_pbuc1=vbuc2 lda #$32 sta PROCPORT - // mul8u(pos, 10) - // [80] (byte) mul8u::a#1 ← (byte) plot_chargen::pos#2 -- vbuxx=vbuyy + // pos*10 + // [80] (byte~) plot_chargen::$16 ← (byte) plot_chargen::pos#2 << (byte) 2 -- vbuaa=vbuyy_rol_2 tya - tax - // [81] call mul8u - // [103] phi from plot_chargen::@1 to mul8u [phi:plot_chargen::@1->mul8u] - jsr mul8u - // mul8u(pos, 10) - // [82] (word) mul8u::return#2 ← (word) mul8u::res#2 - // plot_chargen::@9 - // [83] (word~) plot_chargen::$7 ← (word) mul8u::return#2 - // sc = SCREEN+40+1+mul8u(pos, 10) - // [84] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN+(byte) $28+(byte) 1 + (word~) plot_chargen::$7 -- pbuz1=pbuc1_plus_vwuz1 + asl + asl + // [81] (byte~) plot_chargen::$17 ← (byte~) plot_chargen::$16 + (byte) plot_chargen::pos#2 -- vbuaa=vbuaa_plus_vbuyy + sty.z $ff clc - lda.z sc - adc #SCREEN+$28+1 + lda #>SCREEN+$29 + adc #0 sta.z sc+1 - // [85] phi from plot_chargen::@9 to plot_chargen::@3 [phi:plot_chargen::@9->plot_chargen::@3] - // [85] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#0 [phi:plot_chargen::@9->plot_chargen::@3#0] -- register_copy - // [85] phi (byte) plot_chargen::y#2 = (byte) 0 [phi:plot_chargen::@9->plot_chargen::@3#1] -- vbuz1=vbuc1 + // [84] phi from plot_chargen::@1 to plot_chargen::@3 [phi:plot_chargen::@1->plot_chargen::@3] + // [84] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#0 [phi:plot_chargen::@1->plot_chargen::@3#0] -- register_copy + // [84] phi (byte) plot_chargen::y#2 = (byte) 0 [phi:plot_chargen::@1->plot_chargen::@3#1] -- vbuz1=vbuc1 lda #0 sta.z y - // [85] phi from plot_chargen::@7 to plot_chargen::@3 [phi:plot_chargen::@7->plot_chargen::@3] - // [85] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#2 [phi:plot_chargen::@7->plot_chargen::@3#0] -- register_copy - // [85] phi (byte) plot_chargen::y#2 = (byte) plot_chargen::y#1 [phi:plot_chargen::@7->plot_chargen::@3#1] -- register_copy + // [84] phi from plot_chargen::@7 to plot_chargen::@3 [phi:plot_chargen::@7->plot_chargen::@3] + // [84] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#2 [phi:plot_chargen::@7->plot_chargen::@3#0] -- register_copy + // [84] phi (byte) plot_chargen::y#2 = (byte) plot_chargen::y#1 [phi:plot_chargen::@7->plot_chargen::@3#1] -- register_copy // plot_chargen::@3 __b3: // bits = chargen[y] - // [86] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#5 + (byte) plot_chargen::y#2) -- vbuz1=pbuz2_derefidx_vbuz3 + // [85] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#4 + (byte) plot_chargen::y#2) -- vbuz1=pbuz2_derefidx_vbuz3 ldy.z y lda (chargen),y sta.z bits - // [87] phi from plot_chargen::@3 to plot_chargen::@4 [phi:plot_chargen::@3->plot_chargen::@4] - // [87] phi (byte) plot_chargen::x#2 = (byte) 0 [phi:plot_chargen::@3->plot_chargen::@4#0] -- vbuxx=vbuc1 + // [86] phi from plot_chargen::@3 to plot_chargen::@4 [phi:plot_chargen::@3->plot_chargen::@4] + // [86] phi (byte) plot_chargen::x#2 = (byte) 0 [phi:plot_chargen::@3->plot_chargen::@4#0] -- vbuxx=vbuc1 ldx #0 - // [87] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#7 [phi:plot_chargen::@3->plot_chargen::@4#1] -- register_copy - // [87] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#0 [phi:plot_chargen::@3->plot_chargen::@4#2] -- register_copy - // [87] phi from plot_chargen::@5 to plot_chargen::@4 [phi:plot_chargen::@5->plot_chargen::@4] - // [87] phi (byte) plot_chargen::x#2 = (byte) plot_chargen::x#1 [phi:plot_chargen::@5->plot_chargen::@4#0] -- register_copy - // [87] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#1 [phi:plot_chargen::@5->plot_chargen::@4#1] -- register_copy - // [87] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#1 [phi:plot_chargen::@5->plot_chargen::@4#2] -- register_copy + // [86] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#7 [phi:plot_chargen::@3->plot_chargen::@4#1] -- register_copy + // [86] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#0 [phi:plot_chargen::@3->plot_chargen::@4#2] -- register_copy + // [86] phi from plot_chargen::@5 to plot_chargen::@4 [phi:plot_chargen::@5->plot_chargen::@4] + // [86] phi (byte) plot_chargen::x#2 = (byte) plot_chargen::x#1 [phi:plot_chargen::@5->plot_chargen::@4#0] -- register_copy + // [86] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#1 [phi:plot_chargen::@5->plot_chargen::@4#1] -- register_copy + // [86] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#1 [phi:plot_chargen::@5->plot_chargen::@4#2] -- register_copy // plot_chargen::@4 __b4: // bits & $80 - // [88] (byte~) plot_chargen::$10 ← (byte) plot_chargen::bits#2 & (byte) $80 -- vbuaa=vbuz1_band_vbuc1 + // [87] (byte~) plot_chargen::$9 ← (byte) plot_chargen::bits#2 & (byte) $80 -- vbuaa=vbuz1_band_vbuc1 lda #$80 and.z bits // if((bits & $80) != 0) - // [89] if((byte~) plot_chargen::$10==(byte) 0) goto plot_chargen::@5 -- vbuaa_eq_0_then_la1 + // [88] if((byte~) plot_chargen::$9==(byte) 0) goto plot_chargen::@5 -- vbuaa_eq_0_then_la1 cmp #0 beq b1 - // [90] phi from plot_chargen::@4 to plot_chargen::@6 [phi:plot_chargen::@4->plot_chargen::@6] + // [89] phi from plot_chargen::@4 to plot_chargen::@6 [phi:plot_chargen::@4->plot_chargen::@6] // plot_chargen::@6 - // [91] phi from plot_chargen::@6 to plot_chargen::@5 [phi:plot_chargen::@6->plot_chargen::@5] - // [91] phi (byte) plot_chargen::c#2 = (byte) '*' [phi:plot_chargen::@6->plot_chargen::@5#0] -- vbuaa=vbuc1 + // [90] phi from plot_chargen::@6 to plot_chargen::@5 [phi:plot_chargen::@6->plot_chargen::@5] + // [90] phi (byte) plot_chargen::c#2 = (byte) '*' [phi:plot_chargen::@6->plot_chargen::@5#0] -- vbuaa=vbuc1 lda #'*' jmp __b5 - // [91] phi from plot_chargen::@4 to plot_chargen::@5 [phi:plot_chargen::@4->plot_chargen::@5] + // [90] phi from plot_chargen::@4 to plot_chargen::@5 [phi:plot_chargen::@4->plot_chargen::@5] b1: - // [91] phi (byte) plot_chargen::c#2 = (byte) '.' [phi:plot_chargen::@4->plot_chargen::@5#0] -- vbuaa=vbuc1 + // [90] phi (byte) plot_chargen::c#2 = (byte) '.' [phi:plot_chargen::@4->plot_chargen::@5#0] -- vbuaa=vbuc1 lda #'.' // plot_chargen::@5 __b5: // *sc = c - // [92] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 -- _deref_pbuz1=vbuaa + // [91] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 -- _deref_pbuz1=vbuaa ldy #0 sta (sc),y // sc++; - // [93] (byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3 -- pbuz1=_inc_pbuz1 + // [92] (byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3 -- pbuz1=_inc_pbuz1 inc.z sc bne !+ inc.z sc+1 !: // bits = bits*2 - // [94] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 << (byte) 1 -- vbuz1=vbuz1_rol_1 + // [93] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 << (byte) 1 -- vbuz1=vbuz1_rol_1 asl.z bits // for(byte x:0..7) - // [95] (byte) plot_chargen::x#1 ← ++ (byte) plot_chargen::x#2 -- vbuxx=_inc_vbuxx + // [94] (byte) plot_chargen::x#1 ← ++ (byte) plot_chargen::x#2 -- vbuxx=_inc_vbuxx inx - // [96] if((byte) plot_chargen::x#1!=(byte) 8) goto plot_chargen::@4 -- vbuxx_neq_vbuc1_then_la1 + // [95] if((byte) plot_chargen::x#1!=(byte) 8) goto plot_chargen::@4 -- vbuxx_neq_vbuc1_then_la1 cpx #8 bne __b4 // plot_chargen::@7 // sc = sc+32 - // [97] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte) $20 -- pbuz1=pbuz1_plus_vbuc1 + // [96] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte) $20 -- pbuz1=pbuz1_plus_vbuc1 lda #$20 clc adc.z sc @@ -5148,15 +4726,15 @@ plot_chargen: { inc.z sc+1 !: // for(byte y:0..7) - // [98] (byte) plot_chargen::y#1 ← ++ (byte) plot_chargen::y#2 -- vbuz1=_inc_vbuz1 + // [97] (byte) plot_chargen::y#1 ← ++ (byte) plot_chargen::y#2 -- vbuz1=_inc_vbuz1 inc.z y - // [99] if((byte) plot_chargen::y#1!=(byte) 8) goto plot_chargen::@3 -- vbuz1_neq_vbuc1_then_la1 + // [98] if((byte) plot_chargen::y#1!=(byte) 8) goto plot_chargen::@3 -- vbuz1_neq_vbuc1_then_la1 lda #8 cmp.z y bne __b3 // plot_chargen::@8 // *PROCPORT = $37 - // [100] *((const byte*) PROCPORT) ← (byte) $37 -- _deref_pbuc1=vbuc2 + // [99] *((const byte*) PROCPORT) ← (byte) $37 -- _deref_pbuc1=vbuc2 lda #$37 sta PROCPORT // asm @@ -5164,76 +4742,8 @@ plot_chargen: { cli // plot_chargen::@return // } - // [102] return + // [101] return rts -} - // mul8u -// Perform binary multiplication of two unsigned 8-bit bytes into a 16-bit unsigned word -// mul8u(byte register(X) a) -mul8u: { - .const b = $a - .label mb = $a - .label res = $e - .label return = $e - // [104] phi from mul8u to mul8u::@1 [phi:mul8u->mul8u::@1] - // [104] phi (word) mul8u::mb#2 = (word)(const byte) mul8u::b#0 [phi:mul8u->mul8u::@1#0] -- vwuz1=vwuc1 - lda #b - sta.z mb+1 - // [104] phi (word) mul8u::res#2 = (word) 0 [phi:mul8u->mul8u::@1#1] -- vwuz1=vwuc1 - lda #<0 - sta.z res - sta.z res+1 - // [104] phi (byte) mul8u::a#2 = (byte) mul8u::a#1 [phi:mul8u->mul8u::@1#2] -- register_copy - // mul8u::@1 - __b1: - // while(a!=0) - // [105] if((byte) mul8u::a#2!=(byte) 0) goto mul8u::@2 -- vbuxx_neq_0_then_la1 - cpx #0 - bne __b2 - // mul8u::@return - // } - // [106] return - rts - // mul8u::@2 - __b2: - // a&1 - // [107] (byte~) mul8u::$1 ← (byte) mul8u::a#2 & (byte) 1 -- vbuaa=vbuxx_band_vbuc1 - txa - and #1 - // if( (a&1) != 0) - // [108] if((byte~) mul8u::$1==(byte) 0) goto mul8u::@3 -- vbuaa_eq_0_then_la1 - cmp #0 - beq __b3 - // mul8u::@4 - // res = res + mb - // [109] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 -- vwuz1=vwuz1_plus_vwuz2 - lda.z res - clc - adc.z mb - sta.z res - lda.z res+1 - adc.z mb+1 - sta.z res+1 - // [110] phi from mul8u::@2 mul8u::@4 to mul8u::@3 [phi:mul8u::@2/mul8u::@4->mul8u::@3] - // [110] phi (word) mul8u::res#6 = (word) mul8u::res#2 [phi:mul8u::@2/mul8u::@4->mul8u::@3#0] -- register_copy - // mul8u::@3 - __b3: - // a = a>>1 - // [111] (byte) mul8u::a#0 ← (byte) mul8u::a#2 >> (byte) 1 -- vbuxx=vbuxx_ror_1 - txa - lsr - tax - // mb = mb<<1 - // [112] (word) mul8u::mb#1 ← (word) mul8u::mb#2 << (byte) 1 -- vwuz1=vwuz1_rol_1 - asl.z mb - rol.z mb+1 - // [104] phi from mul8u::@3 to mul8u::@1 [phi:mul8u::@3->mul8u::@1] - // [104] phi (word) mul8u::mb#2 = (word) mul8u::mb#1 [phi:mul8u::@3->mul8u::@1#0] -- register_copy - // [104] phi (word) mul8u::res#2 = (word) mul8u::res#6 [phi:mul8u::@3->mul8u::@1#1] -- register_copy - // [104] phi (byte) mul8u::a#2 = (byte) mul8u::a#0 [phi:mul8u::@3->mul8u::@1#2] -- register_copy - jmp __b1 } // keyboard_key_pressed // Determines whether a specific key is currently pressed by accessing the matrix directly @@ -5243,30 +4753,30 @@ mul8u: { // keyboard_key_pressed(byte register(X) key) keyboard_key_pressed: { // colidx = key&7 - // [114] (byte) keyboard_key_pressed::colidx#0 ← (byte) keyboard_key_pressed::key#6 & (byte) 7 -- vbuyy=vbuxx_band_vbuc1 + // [103] (byte) keyboard_key_pressed::colidx#0 ← (byte) keyboard_key_pressed::key#6 & (byte) 7 -- vbuyy=vbuxx_band_vbuc1 txa and #7 tay // rowidx = key>>3 - // [115] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte) 3 -- vbuaa=vbuxx_ror_3 + // [104] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte) 3 -- vbuaa=vbuxx_ror_3 txa lsr lsr lsr // keyboard_matrix_read(rowidx) - // [116] (byte) keyboard_matrix_read::rowid#0 ← (byte) keyboard_key_pressed::rowidx#0 -- vbuxx=vbuaa + // [105] (byte) keyboard_matrix_read::rowid#0 ← (byte) keyboard_key_pressed::rowidx#0 -- vbuxx=vbuaa tax - // [117] call keyboard_matrix_read + // [106] call keyboard_matrix_read jsr keyboard_matrix_read - // [118] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0 + // [107] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0 // keyboard_key_pressed::@1 - // [119] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2 + // [108] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2 // keyboard_matrix_read(rowidx) & keyboard_matrix_col_bitmask[colidx] - // [120] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte*) keyboard_matrix_col_bitmask + (byte) keyboard_key_pressed::colidx#0) -- vbuaa=vbuaa_band_pbuc1_derefidx_vbuyy + // [109] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte*) keyboard_matrix_col_bitmask + (byte) keyboard_key_pressed::colidx#0) -- vbuaa=vbuaa_band_pbuc1_derefidx_vbuyy and keyboard_matrix_col_bitmask,y // keyboard_key_pressed::@return // } - // [121] return + // [110] return rts } // keyboard_matrix_read @@ -5278,16 +4788,16 @@ keyboard_key_pressed: { // keyboard_matrix_read(byte register(X) rowid) keyboard_matrix_read: { // *CIA1_PORT_A = keyboard_matrix_row_bitmask[rowid] - // [122] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask + (byte) keyboard_matrix_read::rowid#0) -- _deref_pbuc1=pbuc2_derefidx_vbuxx + // [111] *((const byte*) CIA1_PORT_A) ← *((const byte*) keyboard_matrix_row_bitmask + (byte) keyboard_matrix_read::rowid#0) -- _deref_pbuc1=pbuc2_derefidx_vbuxx lda keyboard_matrix_row_bitmask,x sta CIA1_PORT_A // ~*CIA1_PORT_B - // [123] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B) -- vbuaa=_bnot__deref_pbuc1 + // [112] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B) -- vbuaa=_bnot__deref_pbuc1 lda CIA1_PORT_B eor #$ff // keyboard_matrix_read::@return // } - // [124] return + // [113] return rts } // keyboard_get_keycode @@ -5298,48 +4808,48 @@ keyboard_matrix_read: { // keyboard_get_keycode(byte register(X) ch) keyboard_get_keycode: { // return keyboard_char_keycodes[ch]; - // [125] (byte) keyboard_get_keycode::return#0 ← *((const byte*) keyboard_char_keycodes + (byte) keyboard_get_keycode::ch#0) -- vbuaa=pbuc1_derefidx_vbuxx + // [114] (byte) keyboard_get_keycode::return#0 ← *((const byte*) keyboard_char_keycodes + (byte) keyboard_get_keycode::ch#0) -- vbuaa=pbuc1_derefidx_vbuxx lda keyboard_char_keycodes,x // keyboard_get_keycode::@return // } - // [126] return + // [115] return rts } // print_str_at // Print a string at a specific screen position -// print_str_at(byte* zp($c) str, byte* zp($e) at) +// print_str_at(byte* zp($a) str, byte* zp($c) at) print_str_at: { - .label at = $e - .label str = $c - // [128] phi from print_str_at print_str_at::@2 to print_str_at::@1 [phi:print_str_at/print_str_at::@2->print_str_at::@1] - // [128] phi (byte*) print_str_at::at#5 = (byte*) print_str_at::at#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#0] -- register_copy - // [128] phi (byte*) print_str_at::str#5 = (byte*) print_str_at::str#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#1] -- register_copy + .label at = $c + .label str = $a + // [117] phi from print_str_at print_str_at::@2 to print_str_at::@1 [phi:print_str_at/print_str_at::@2->print_str_at::@1] + // [117] phi (byte*) print_str_at::at#5 = (byte*) print_str_at::at#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#0] -- register_copy + // [117] phi (byte*) print_str_at::str#5 = (byte*) print_str_at::str#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#1] -- register_copy // print_str_at::@1 __b1: // while(*str) - // [129] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 -- vbuc1_neq__deref_pbuz1_then_la1 + // [118] if((byte) 0!=*((byte*) print_str_at::str#5)) goto print_str_at::@2 -- vbuc1_neq__deref_pbuz1_then_la1 ldy #0 lda (str),y cmp #0 bne __b2 // print_str_at::@return // } - // [130] return + // [119] return rts // print_str_at::@2 __b2: // *(at++) = *(str++) - // [131] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) -- _deref_pbuz1=_deref_pbuz2 + // [120] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) -- _deref_pbuz1=_deref_pbuz2 ldy #0 lda (str),y sta (at),y // *(at++) = *(str++); - // [132] (byte*) print_str_at::at#4 ← ++ (byte*) print_str_at::at#5 -- pbuz1=_inc_pbuz1 + // [121] (byte*) print_str_at::at#4 ← ++ (byte*) print_str_at::at#5 -- pbuz1=_inc_pbuz1 inc.z at bne !+ inc.z at+1 !: - // [133] (byte*) print_str_at::str#4 ← ++ (byte*) print_str_at::str#5 -- pbuz1=_inc_pbuz1 + // [122] (byte*) print_str_at::str#4 ← ++ (byte*) print_str_at::str#5 -- pbuz1=_inc_pbuz1 inc.z str bne !+ inc.z str+1 diff --git a/src/test/ref/examples/chargen/chargen-analysis.sym b/src/test/ref/examples/chargen/chargen-analysis.sym index 5bc63a9dd..4efd6071f 100644 --- a/src/test/ref/examples/chargen/chargen-analysis.sym +++ b/src/test/ref/examples/chargen/chargen-analysis.sym @@ -161,33 +161,13 @@ (const byte*) main::str1[(byte) 3] = (byte*) "f3" (const byte*) main::str2[(byte) 3] = (byte*) "f5" (const byte*) main::str3[(byte) 3] = (byte*) "f7" -(word()) mul8u((byte) mul8u::a , (byte) mul8u::b) -(byte~) mul8u::$1 reg byte a 2.00000002E8 -(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 1.00000001E8 -(byte) mul8u::a#1 reg byte x 55001.0 -(byte) mul8u::a#2 reg byte x 6.668333416666667E7 -(byte) mul8u::b -(const byte) mul8u::b#0 b = (byte) $a -(word) mul8u::mb -(word) mul8u::mb#1 mb zp[2]:10 2.00000002E8 -(word) mul8u::mb#2 mb zp[2]:10 4.285714328571428E7 -(word) mul8u::res -(word) mul8u::res#1 res zp[2]:14 2.00000002E8 -(word) mul8u::res#2 res zp[2]:14 5.0001667333333336E7 -(word) mul8u::res#6 res zp[2]:14 1.00000001E8 -(word) mul8u::return -(word) mul8u::return#2 return zp[2]:14 20002.0 (void()) plot_chargen((byte) plot_chargen::pos , (byte) plot_chargen::ch , (byte) plot_chargen::shift) -(word~) plot_chargen::$0 zp[2]:12 20002.0 -(word~) plot_chargen::$1 zp[2]:12 20002.0 -(byte~) plot_chargen::$10 reg byte a 2.00000002E8 -(word~) plot_chargen::$7 zp[2]:14 20002.0 +(word~) plot_chargen::$0 zp[2]:10 20002.0 +(word~) plot_chargen::$1 zp[2]:10 20002.0 +(byte~) plot_chargen::$16 reg byte a 20002.0 +(byte~) plot_chargen::$17 reg byte a 20002.0 +(byte~) plot_chargen::$6 reg byte a 20002.0 +(byte~) plot_chargen::$9 reg byte a 2.00000002E8 (label) plot_chargen::@1 (label) plot_chargen::@2 (label) plot_chargen::@3 @@ -196,7 +176,6 @@ (label) plot_chargen::@6 (label) plot_chargen::@7 (label) plot_chargen::@8 -(label) plot_chargen::@9 (label) plot_chargen::@return (byte) plot_chargen::bits (byte) plot_chargen::bits#0 bits zp[1]:9 2.0000002E7 @@ -208,19 +187,19 @@ (byte) plot_chargen::ch#1 reg byte a 1001.0 (byte) plot_chargen::ch#2 reg byte a 500.5 (byte*) plot_chargen::chargen -(byte*) plot_chargen::chargen#0 chargen zp[2]:12 15001.5 -(byte*) plot_chargen::chargen#1 chargen zp[2]:12 20002.0 -(byte*) plot_chargen::chargen#5 chargen zp[2]:12 455454.6818181818 +(byte*) plot_chargen::chargen#0 chargen zp[2]:10 15001.5 +(byte*) plot_chargen::chargen#1 chargen zp[2]:10 20002.0 +(byte*) plot_chargen::chargen#4 chargen zp[2]:10 477143.0 (byte) plot_chargen::pos (byte) plot_chargen::pos#0 reg byte y 202.0 (byte) plot_chargen::pos#1 reg byte y 667.3333333333334 -(byte) plot_chargen::pos#2 reg byte y 1233.6666666666665 +(byte) plot_chargen::pos#2 reg byte y 2110.4 (byte*) plot_chargen::sc -(byte*) plot_chargen::sc#0 sc zp[2]:14 20002.0 -(byte*) plot_chargen::sc#1 sc zp[2]:14 5.250000075E7 -(byte*) plot_chargen::sc#2 sc zp[2]:14 6666667.333333333 -(byte*) plot_chargen::sc#3 sc zp[2]:14 5.1666667333333336E7 -(byte*) plot_chargen::sc#7 sc zp[2]:14 1.00050015E7 +(byte*) plot_chargen::sc#0 sc zp[2]:12 20002.0 +(byte*) plot_chargen::sc#1 sc zp[2]:12 5.250000075E7 +(byte*) plot_chargen::sc#2 sc zp[2]:12 6666667.333333333 +(byte*) plot_chargen::sc#3 sc zp[2]:12 5.1666667333333336E7 +(byte*) plot_chargen::sc#7 sc zp[2]:12 1.00050015E7 (byte) plot_chargen::shift (byte) plot_chargen::shift#1 reg byte x 2002.0 (byte) plot_chargen::shift#2 reg byte x 2200.4 @@ -235,13 +214,13 @@ (label) print_str_at::@2 (label) print_str_at::@return (byte*) print_str_at::at -(byte*) print_str_at::at#4 at zp[2]:14 1001.0 -(byte*) print_str_at::at#5 at zp[2]:14 1034.6666666666667 -(byte*) print_str_at::at#7 at zp[2]:14 101.0 +(byte*) print_str_at::at#4 at zp[2]:12 1001.0 +(byte*) print_str_at::at#5 at zp[2]:12 1034.6666666666667 +(byte*) print_str_at::at#7 at zp[2]:12 101.0 (byte*) print_str_at::str -(byte*) print_str_at::str#4 str zp[2]:12 2002.0 -(byte*) print_str_at::str#5 str zp[2]:12 1026.25 -(byte*) print_str_at::str#7 str zp[2]:12 101.0 +(byte*) print_str_at::str#4 str zp[2]:10 2002.0 +(byte*) print_str_at::str#5 str zp[2]:10 1026.25 +(byte*) print_str_at::str#7 str zp[2]:10 101.0 zp[2]:2 [ main::sc#2 main::sc#1 ] zp[1]:4 [ main::i#2 main::i#1 ] @@ -256,11 +235,9 @@ zp[1]:8 [ plot_chargen::y#2 plot_chargen::y#1 ] zp[1]:9 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] reg byte x [ plot_chargen::x#2 plot_chargen::x#1 ] reg byte a [ plot_chargen::c#2 ] -reg byte x [ mul8u::a#2 mul8u::a#1 mul8u::a#0 ] -zp[2]:10 [ mul8u::mb#2 mul8u::mb#1 ] reg byte x [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ] -zp[2]:12 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 plot_chargen::$1 plot_chargen::$0 ] -zp[2]:14 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 plot_chargen::$7 mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 ] +zp[2]:10 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 plot_chargen::chargen#4 plot_chargen::chargen#0 plot_chargen::chargen#1 plot_chargen::$1 plot_chargen::$0 ] +zp[2]:12 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#0 plot_chargen::sc#2 plot_chargen::sc#1 ] reg byte a [ keyboard_key_pressed::return#2 ] reg byte a [ main::$15 ] reg byte a [ keyboard_key_pressed::return#10 ] @@ -275,8 +252,10 @@ reg byte x [ keyboard_get_keycode::ch#0 ] reg byte a [ keyboard_get_keycode::return#2 ] reg byte a [ main::key#0 ] reg byte a [ keyboard_key_pressed::return#14 ] -reg byte a [ plot_chargen::$10 ] -reg byte a [ mul8u::$1 ] +reg byte a [ plot_chargen::$16 ] +reg byte a [ plot_chargen::$17 ] +reg byte a [ plot_chargen::$6 ] +reg byte a [ plot_chargen::$9 ] reg byte y [ keyboard_key_pressed::colidx#0 ] reg byte a [ keyboard_key_pressed::rowidx#0 ] reg byte x [ keyboard_matrix_read::rowid#0 ] diff --git a/src/test/ref/examples/font-2x2/font-2x2.asm b/src/test/ref/examples/font-2x2/font-2x2.asm new file mode 100644 index 000000000..6c76a8d84 --- /dev/null +++ b/src/test/ref/examples/font-2x2/font-2x2.asm @@ -0,0 +1,480 @@ +// Creates a 2x2 font from the system CHARGEN font and compress it by identifying identical chars +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" + // Processor Port Register controlling RAM/ROM configuration and the datasette + .label PROCPORT = 1 + // RAM in $A000, $E000 CHAR ROM in $D000 + .const PROCPORT_RAM_CHARROM = 1 + // BASIC in $A000, I/O in $D000, KERNEL in $E000 + .const PROCPORT_BASIC_KERNEL_IO = 7 + // The address of the CHARGEN character set + .label CHARGEN = $d000 + .label D018 = $d018 + .label SCREEN = $400 + .label FONT_ORIGINAL = $2000 + .label FONT_COMPRESSED = $2800 +main: { + .const toD0181_return = (>(SCREEN&$3fff)*4)|(>FONT_COMPRESSED)/4&$f + .label c = 3 + .label x = 4 + .label y = 2 + // asm + // Create 2x2 font from CHARGEN + sei + // *PROCPORT = PROCPORT_RAM_CHARROM + lda #PROCPORT_RAM_CHARROM + sta PROCPORT + // font_2x2(CHARGEN, FONT_ORIGINAL) + jsr font_2x2 + // *PROCPORT = PROCPORT_BASIC_KERNEL_IO + lda #PROCPORT_BASIC_KERNEL_IO + sta PROCPORT + // asm + cli + // font_compress(FONT_ORIGINAL, FONT_COMPRESSED, FONT_COMPRESSED_MAP) + jsr font_compress + // *D018 = toD018(SCREEN, FONT_COMPRESSED) + // Show compressed font + lda #toD0181_return + sta D018 + // memset(SCREEN, FONT_COMPRESSED_MAP[' '], 0x0400) + ldx FONT_COMPRESSED_MAP+' ' + // Clear the screen + jsr memset + lda #0 + sta.z y + sta.z c + __b1: + lda #0 + sta.z x + __b2: + // show(c++, x, y, FONT_COMPRESSED_MAP) + ldx.z x + lda.z y + jsr show + // show(c++, x, y, FONT_COMPRESSED_MAP); + inc.z c + // for(char x:0..7) + inc.z x + lda #8 + cmp.z x + bne __b2 + // for(char y:0..7) + inc.z y + cmp.z y + bne __b1 + __b4: + // (*(SCREEN+999))++; + inc SCREEN+$3e7 + jmp __b4 +} +// Show a 2x2 char on the screen at 2x2-position (x, y) using a font compress mapping +// show(byte zp(3) c, byte register(X) x, byte register(A) y) +show: { + .label __0 = $f + .label __1 = $f + .label __2 = $f + .label c = 3 + .label ptr = $f + .label __8 = $11 + .label __9 = $f + // (unsigned int)y + sta.z __0 + lda #0 + sta.z __0+1 + // (unsigned int)y*80 + lda.z __0 + asl + sta.z __8 + lda.z __0+1 + rol + sta.z __8+1 + asl.z __8 + rol.z __8+1 + lda.z __9 + clc + adc.z __8 + sta.z __9 + lda.z __9+1 + adc.z __8+1 + sta.z __9+1 + asl.z __1 + rol.z __1+1 + asl.z __1 + rol.z __1+1 + asl.z __1 + rol.z __1+1 + asl.z __1 + rol.z __1+1 + // SCREEN + (unsigned int)y*80 + clc + lda.z __2 + adc #SCREEN + sta.z __2+1 + // x*2 + txa + asl + // ptr = SCREEN + (unsigned int)y*80 + x*2 + clc + adc.z ptr + sta.z ptr + bcc !+ + inc.z ptr+1 + !: + // ptr[0] = font_mapping[c] + ldy.z c + lda FONT_COMPRESSED_MAP,y + ldy #0 + sta (ptr),y + // c+0x40 + ldx.z c + // ptr[1] = font_mapping[c+0x40] + lda FONT_COMPRESSED_MAP+$40,x + ldy #1 + sta (ptr),y + // c+0x80 + txa + // ptr[40] = font_mapping[c+0x80] + tay + lda FONT_COMPRESSED_MAP+$80,y + ldy #$28 + sta (ptr),y + // c+0xc0 + txa + // ptr[41] = font_mapping[c+0xc0] + tay + lda FONT_COMPRESSED_MAP+$c0,y + ldy #$29 + sta (ptr),y + // } + rts +} +// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str. +// memset(byte register(X) c) +memset: { + .label str = SCREEN + .const num = $400 + .label end = str+num + .label dst = $d + lda #str + sta.z dst+1 + __b1: + // for(char* dst = str; dst!=end; dst++) + lda.z dst+1 + cmp #>end + bne __b2 + lda.z dst + cmp #FONT_COMPRESSED + sta.z next_compressed+1 + lda #0 + sta.z i + sta.z font_size + lda #FONT_ORIGINAL + sta.z next_original+1 + __b1: + // font_find(next_original, font_compressed, font_size) + jsr font_find + // font_find(next_original, font_compressed, font_size) + txa + // found = font_find(next_original, font_compressed, font_size) + // if(found==0xff) + cmp #$ff + bne __b7 + ldy #0 + // Glyph not found - create it + __b3: + // next_compressed[l] = next_original[l] + lda (next_original),y + sta (next_compressed),y + // for(char l:0..7) + iny + cpy #8 + bne __b3 + // next_compressed += 8 + lda #8 + clc + adc.z next_compressed + sta.z next_compressed + bcc !+ + inc.z next_compressed+1 + !: + // font_size++; + ldx.z font_size + inx + lda.z font_size + __b2: + // compress_mapping[i] = found + ldy.z i + sta FONT_COMPRESSED_MAP,y + // next_original += 8 + lda #8 + clc + adc.z next_original + sta.z next_original + bcc !+ + inc.z next_original+1 + !: + // for(char i: 0..0xff) + inc.z i + lda.z i + cmp #0 + bne __b6 + // } + rts + __b6: + stx.z font_size + jmp __b1 + __b7: + ldx.z font_size + jmp __b2 +} +// Look for a glyph within a font +// Only looks at the first font_size glyphs +// Returns the index of the glyph within the font. Returns 0xff if the glyph is not found. +// font_find(byte* zp($d) glyph, byte* zp(7) font, byte zp(9) font_size) +font_find: { + .label glyph = $d + .label font_size = 9 + .label font = 7 + lda #FONT_COMPRESSED + sta.z font+1 + ldx #0 + __b1: + // for(char i=0;iCHARGEN + sta.z next_original+1 + lda #FONT_ORIGINAL + sta.z next_2x2_left+1 + __b1: + // next_2x2_right = next_2x2 + 0x40*8 + lda.z next_2x2_left + clc + adc #<$40*8 + sta.z next_2x2_right + lda.z next_2x2_left+1 + adc #>$40*8 + sta.z next_2x2_right+1 + lda.z next_2x2_left + sta.z next_2x2_left_1 + lda.z next_2x2_left+1 + sta.z next_2x2_left_1+1 + lda #0 + sta.z l2 + sta.z l + __b2: + // glyph_bits = next_original[l] + ldy.z l + lda (next_original),y + sta.z glyph_bits + ldy #0 + tya + sta.z glyph_bits_2x2 + sta.z glyph_bits_2x2+1 + __b3: + // glyph_bits&0x80 + lda #$80 + and.z glyph_bits + // (glyph_bits&0x80)?1uc:0uc + cmp #0 + bne __b4 + ldx #0 + jmp __b5 + __b4: + // (glyph_bits&0x80)?1uc:0uc + ldx #1 + __b5: + // glyph_bits_2x2<<1 + asl.z __5 + rol.z __5+1 + // glyph_bits_2x2 = glyph_bits_2x2<<1|glyph_bit + txa + ora.z glyph_bits_2x2 + sta.z glyph_bits_2x2 + // glyph_bits_2x2<<1 + asl.z __7 + rol.z __7+1 + // glyph_bits_2x2 = glyph_bits_2x2<<1|glyph_bit + txa + ora.z glyph_bits_2x2 + sta.z glyph_bits_2x2 + // glyph_bits <<= 1 + // Move to next bit + asl.z glyph_bits + // for(char b: 0..7) + iny + cpy #8 + bne __b3 + // >glyph_bits_2x2 + lda.z glyph_bits_2x2+1 + // next_2x2_left[l2] = >glyph_bits_2x2 + // Put the generated 2x2-line into the 2x2-font twice + ldy.z l2 + sta (next_2x2_left_1),y + // l2+1 + iny + // next_2x2_left[l2+1] = >glyph_bits_2x2 + sta (next_2x2_left_1),y + // $80*8 + sta.z next_2x2_left_1+1 + // next_2x2_right = next_2x2 + 0xc0*8 + lda.z next_2x2_left + clc + adc #<$c0*8 + sta.z next_2x2_right + lda.z next_2x2_left+1 + adc #>$c0*8 + sta.z next_2x2_right+1 + lda #0 + sta.z l2 + __b8: + // for(char l: 0..7) + inc.z l + lda #8 + cmp.z l + bne __b2 + // next_2x2 += 8 + clc + adc.z next_2x2 + sta.z next_2x2 + bcc !+ + inc.z next_2x2+1 + !: + // next_original += 8 + lda #8 + clc + adc.z next_original + sta.z next_original + bcc !+ + inc.z next_original+1 + !: + // for(char c: 0..0x3f) + inc.z c + lda #$40 + cmp.z c + beq !__b1+ + jmp __b1 + !__b1: + // } + rts +} + .align $100 + FONT_COMPRESSED_MAP: .fill $100, 0 diff --git a/src/test/ref/examples/font-2x2/font-2x2.cfg b/src/test/ref/examples/font-2x2/font-2x2.cfg new file mode 100644 index 000000000..daf86250d --- /dev/null +++ b/src/test/ref/examples/font-2x2/font-2x2.cfg @@ -0,0 +1,239 @@ +@begin: scope:[] from + [0] phi() + to:@1 +@1: scope:[] from @begin + [1] phi() + [2] call main + to:@end +@end: scope:[] from @1 + [3] phi() + +(void()) main() +main: scope:[main] from @1 + asm { sei } + [5] *((const byte*) PROCPORT) ← (const byte) PROCPORT_RAM_CHARROM + [6] call font_2x2 + to:main::@6 +main::@6: scope:[main] from main + [7] *((const byte*) PROCPORT) ← (const byte) PROCPORT_BASIC_KERNEL_IO + asm { cli } + [9] call font_compress + to:main::toD0181 +main::toD0181: scope:[main] from main::@6 + [10] phi() + to:main::@5 +main::@5: scope:[main] from main::toD0181 + [11] *((const byte*) D018) ← (const byte) main::toD0181_return#0 + [12] (byte) memset::c#0 ← *((const byte*) FONT_COMPRESSED_MAP+(byte) ' ') + [13] call memset + to:main::@1 +main::@1: scope:[main] from main::@3 main::@5 + [14] (byte) main::y#4 ← phi( main::@5/(byte) 0 main::@3/(byte) main::y#1 ) + [14] (byte) main::c#4 ← phi( main::@5/(byte) 0 main::@3/(byte) main::c#1 ) + to:main::@2 +main::@2: scope:[main] from main::@1 main::@7 + [15] (byte) main::x#2 ← phi( main::@1/(byte) 0 main::@7/(byte) main::x#1 ) + [15] (byte) main::c#2 ← phi( main::@1/(byte) main::c#4 main::@7/(byte) main::c#1 ) + [16] (byte) show::c#0 ← (byte) main::c#2 + [17] (byte) show::x#0 ← (byte) main::x#2 + [18] (byte) show::y#0 ← (byte) main::y#4 + [19] call show + to:main::@7 +main::@7: scope:[main] from main::@2 + [20] (byte) main::c#1 ← ++ (byte) main::c#2 + [21] (byte) main::x#1 ← ++ (byte) main::x#2 + [22] if((byte) main::x#1!=(byte) 8) goto main::@2 + to:main::@3 +main::@3: scope:[main] from main::@7 + [23] (byte) main::y#1 ← ++ (byte) main::y#4 + [24] if((byte) main::y#1!=(byte) 8) goto main::@1 + to:main::@4 +main::@4: scope:[main] from main::@3 main::@4 + [25] *((const byte*) SCREEN+(word) $3e7) ← ++ *((const byte*) SCREEN+(word) $3e7) + to:main::@4 + +(void()) show((byte) show::c , (byte) show::x , (byte) show::y , (byte*) show::font_mapping) +show: scope:[show] from main::@2 + [26] (word~) show::$0 ← (word)(byte) show::y#0 + [27] (word~) show::$8 ← (word~) show::$0 << (byte) 2 + [28] (word~) show::$9 ← (word~) show::$8 + (word~) show::$0 + [29] (word~) show::$1 ← (word~) show::$9 << (byte) 4 + [30] (byte*~) show::$2 ← (const byte*) SCREEN + (word~) show::$1 + [31] (byte~) show::$3 ← (byte) show::x#0 << (byte) 1 + [32] (byte*) show::ptr#0 ← (byte*~) show::$2 + (byte~) show::$3 + [33] *((byte*) show::ptr#0) ← *((const byte*) FONT_COMPRESSED_MAP + (byte) show::c#0) + [34] (byte~) show::$5 ← (byte) show::c#0 + [35] *((byte*) show::ptr#0 + (byte) 1) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $40 + (byte~) show::$5) + [36] (byte~) show::$6 ← (byte) show::c#0 + [37] *((byte*) show::ptr#0 + (byte) $28) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $80 + (byte~) show::$6) + [38] (byte~) show::$7 ← (byte) show::c#0 + [39] *((byte*) show::ptr#0 + (byte) $29) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $c0 + (byte~) show::$7) + to:show::@return +show::@return: scope:[show] from show + [40] return + to:@return + +(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) +memset: scope:[memset] from main::@5 + [41] phi() + to:memset::@1 +memset::@1: scope:[memset] from memset memset::@2 + [42] (byte*) memset::dst#2 ← phi( memset/(byte*)(const void*) memset::str#0 memset::@2/(byte*) memset::dst#1 ) + [43] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2 + to:memset::@return +memset::@return: scope:[memset] from memset::@1 + [44] return + to:@return +memset::@2: scope:[memset] from memset::@1 + [45] *((byte*) memset::dst#2) ← (byte) memset::c#0 + [46] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2 + to:memset::@1 + +(byte()) font_compress((byte*) font_compress::font_original , (byte*) font_compress::font_compressed , (byte*) font_compress::compress_mapping) +font_compress: scope:[font_compress] from main::@6 + [47] phi() + to:font_compress::@1 +font_compress::@1: scope:[font_compress] from font_compress font_compress::@6 + [48] (byte*) font_compress::next_compressed#4 ← phi( font_compress/(const byte*) FONT_COMPRESSED font_compress::@6/(byte*) font_compress::next_compressed#7 ) + [48] (byte) font_compress::i#4 ← phi( font_compress/(byte) 0 font_compress::@6/(byte) font_compress::i#1 ) + [48] (byte) font_compress::font_size#2 ← phi( font_compress/(byte) 0 font_compress::@6/(byte) font_compress::font_size#9 ) + [48] (byte*) font_compress::next_original#2 ← phi( font_compress/(const byte*) FONT_ORIGINAL font_compress::@6/(byte*) font_compress::next_original#1 ) + [49] (byte*) font_find::glyph#0 ← (byte*) font_compress::next_original#2 + [50] (byte) font_find::font_size#0 ← (byte) font_compress::font_size#2 + [51] call font_find + [52] (byte) font_find::return#0 ← (byte) font_find::return#3 + to:font_compress::@5 +font_compress::@5: scope:[font_compress] from font_compress::@1 + [53] (byte) font_compress::found#0 ← (byte) font_find::return#0 + [54] if((byte) font_compress::found#0!=(byte) $ff) goto font_compress::@7 + to:font_compress::@3 +font_compress::@3: scope:[font_compress] from font_compress::@3 font_compress::@5 + [55] (byte) font_compress::l#2 ← phi( font_compress::@3/(byte) font_compress::l#1 font_compress::@5/(byte) 0 ) + [56] *((byte*) font_compress::next_compressed#4 + (byte) font_compress::l#2) ← *((byte*) font_compress::next_original#2 + (byte) font_compress::l#2) + [57] (byte) font_compress::l#1 ← ++ (byte) font_compress::l#2 + [58] if((byte) font_compress::l#1!=(byte) 8) goto font_compress::@3 + to:font_compress::@4 +font_compress::@4: scope:[font_compress] from font_compress::@3 + [59] (byte*) font_compress::next_compressed#1 ← (byte*) font_compress::next_compressed#4 + (byte) 8 + [60] (byte) font_compress::font_size#1 ← ++ (byte) font_compress::font_size#2 + [61] (byte) font_compress::found#3 ← (byte) font_compress::font_size#2 + to:font_compress::@2 +font_compress::@2: scope:[font_compress] from font_compress::@4 font_compress::@7 + [62] (byte*) font_compress::next_compressed#7 ← phi( font_compress::@4/(byte*) font_compress::next_compressed#1 font_compress::@7/(byte*) font_compress::next_compressed#4 ) + [62] (byte) font_compress::return#1 ← phi( font_compress::@4/(byte) font_compress::font_size#1 font_compress::@7/(byte) font_compress::return#5 ) + [62] (byte) font_compress::found#2 ← phi( font_compress::@4/(byte) font_compress::found#3 font_compress::@7/(byte) font_compress::found#0 ) + [63] *((const byte*) FONT_COMPRESSED_MAP + (byte) font_compress::i#4) ← (byte) font_compress::found#2 + [64] (byte*) font_compress::next_original#1 ← (byte*) font_compress::next_original#2 + (byte) 8 + [65] (byte) font_compress::i#1 ← ++ (byte) font_compress::i#4 + [66] if((byte) font_compress::i#1!=(byte) 0) goto font_compress::@6 + to:font_compress::@return +font_compress::@return: scope:[font_compress] from font_compress::@2 + [67] return + to:@return +font_compress::@6: scope:[font_compress] from font_compress::@2 + [68] (byte) font_compress::font_size#9 ← (byte) font_compress::return#1 + to:font_compress::@1 +font_compress::@7: scope:[font_compress] from font_compress::@5 + [69] (byte) font_compress::return#5 ← (byte) font_compress::font_size#2 + to:font_compress::@2 + +(byte()) font_find((byte*) font_find::glyph , (byte*) font_find::font , (byte) font_find::font_size) +font_find: scope:[font_find] from font_compress::@1 + [70] phi() + to:font_find::@1 +font_find::@1: scope:[font_find] from font_find font_find::@5 + [71] (byte*) font_find::font#4 ← phi( font_find/(const byte*) FONT_COMPRESSED font_find::@5/(byte*) font_find::font#1 ) + [71] (byte) font_find::i#2 ← phi( font_find/(byte) 0 font_find::@5/(byte) font_find::i#1 ) + [72] if((byte) font_find::i#2<(byte) font_find::font_size#0) goto font_find::@2 + to:font_find::@return +font_find::@return: scope:[font_find] from font_find::@1 font_find::@4 + [73] (byte) font_find::return#3 ← phi( font_find::@4/(byte) font_find::i#2 font_find::@1/(byte) $ff ) + [74] return + to:@return +font_find::@2: scope:[font_find] from font_find::@1 font_find::@3 + [75] (byte) font_find::l#2 ← phi( font_find::@1/(byte) 0 font_find::@3/(byte) font_find::l#1 ) + [76] if(*((byte*) font_find::glyph#0 + (byte) font_find::l#2)==*((byte*) font_find::font#4 + (byte) font_find::l#2)) goto font_find::@3 + to:font_find::@4 +font_find::@3: scope:[font_find] from font_find::@2 + [77] (byte) font_find::l#1 ← ++ (byte) font_find::l#2 + [78] if((byte) font_find::l#1!=(byte) 8) goto font_find::@2 + to:font_find::@4 +font_find::@4: scope:[font_find] from font_find::@2 font_find::@3 + [79] (byte) font_find::found#2 ← phi( font_find::@3/(byte) 1 font_find::@2/(byte) 0 ) + [80] if((byte) 0==(byte) font_find::found#2) goto font_find::@5 + to:font_find::@return +font_find::@5: scope:[font_find] from font_find::@4 + [81] (byte*) font_find::font#1 ← (byte*) font_find::font#4 + (byte) 8 + [82] (byte) font_find::i#1 ← ++ (byte) font_find::i#2 + to:font_find::@1 + +(void()) font_2x2((byte*) font_2x2::font_original , (byte*) font_2x2::font_2x2) +font_2x2: scope:[font_2x2] from main + [83] phi() + to:font_2x2::@1 +font_2x2::@1: scope:[font_2x2] from font_2x2 font_2x2::@9 + [84] (byte) font_2x2::c#11 ← phi( font_2x2/(byte) 0 font_2x2::@9/(byte) font_2x2::c#1 ) + [84] (byte*) font_2x2::next_original#4 ← phi( font_2x2/(const byte*) CHARGEN font_2x2::@9/(byte*) font_2x2::next_original#1 ) + [84] (byte*) font_2x2::next_2x2_left#0 ← phi( font_2x2/(const byte*) FONT_ORIGINAL font_2x2::@9/(byte*) font_2x2::next_2x2#1 ) + [85] (byte*) font_2x2::next_2x2_right#0 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $40*(number) 8 + [86] (byte*) font_2x2::next_2x2_left#10 ← (byte*) font_2x2::next_2x2_left#0 + to:font_2x2::@2 +font_2x2::@2: scope:[font_2x2] from font_2x2::@1 font_2x2::@8 + [87] (byte*) font_2x2::next_2x2_right#7 ← phi( font_2x2::@1/(byte*) font_2x2::next_2x2_right#0 font_2x2::@8/(byte*) font_2x2::next_2x2_right#8 ) + [87] (byte) font_2x2::l2#8 ← phi( font_2x2::@1/(byte) 0 font_2x2::@8/(byte) font_2x2::l2#9 ) + [87] (byte*) font_2x2::next_2x2_left#7 ← phi( font_2x2::@1/(byte*) font_2x2::next_2x2_left#10 font_2x2::@8/(byte*) font_2x2::next_2x2_left#8 ) + [87] (byte) font_2x2::l#2 ← phi( font_2x2::@1/(byte) 0 font_2x2::@8/(byte) font_2x2::l#1 ) + [88] (byte) font_2x2::glyph_bits#0 ← *((byte*) font_2x2::next_original#4 + (byte) font_2x2::l#2) + to:font_2x2::@3 +font_2x2::@3: scope:[font_2x2] from font_2x2::@2 font_2x2::@5 + [89] (byte) font_2x2::b#2 ← phi( font_2x2::@2/(byte) 0 font_2x2::@5/(byte) font_2x2::b#1 ) + [89] (word) font_2x2::glyph_bits_2x2#3 ← phi( font_2x2::@2/(word) 0 font_2x2::@5/(word) font_2x2::glyph_bits_2x2#2 ) + [89] (byte) font_2x2::glyph_bits#2 ← phi( font_2x2::@2/(byte) font_2x2::glyph_bits#0 font_2x2::@5/(byte) font_2x2::glyph_bits#1 ) + [90] (byte~) font_2x2::$1 ← (byte) font_2x2::glyph_bits#2 & (byte) $80 + [91] if((byte) 0!=(byte~) font_2x2::$1) goto font_2x2::@4 + to:font_2x2::@5 +font_2x2::@4: scope:[font_2x2] from font_2x2::@3 + [92] phi() + to:font_2x2::@5 +font_2x2::@5: scope:[font_2x2] from font_2x2::@3 font_2x2::@4 + [93] (byte) font_2x2::glyph_bit#0 ← phi( font_2x2::@4/(byte) 1 font_2x2::@3/(byte) 0 ) + [94] (word~) font_2x2::$5 ← (word) font_2x2::glyph_bits_2x2#3 << (byte) 1 + [95] (word) font_2x2::glyph_bits_2x2#1 ← (word~) font_2x2::$5 | (byte) font_2x2::glyph_bit#0 + [96] (word~) font_2x2::$7 ← (word) font_2x2::glyph_bits_2x2#1 << (byte) 1 + [97] (word) font_2x2::glyph_bits_2x2#2 ← (word~) font_2x2::$7 | (byte) font_2x2::glyph_bit#0 + [98] (byte) font_2x2::glyph_bits#1 ← (byte) font_2x2::glyph_bits#2 << (byte) 1 + [99] (byte) font_2x2::b#1 ← ++ (byte) font_2x2::b#2 + [100] if((byte) font_2x2::b#1!=(byte) 8) goto font_2x2::@3 + to:font_2x2::@6 +font_2x2::@6: scope:[font_2x2] from font_2x2::@5 + [101] (byte~) font_2x2::$12 ← > (word) font_2x2::glyph_bits_2x2#2 + [102] *((byte*) font_2x2::next_2x2_left#7 + (byte) font_2x2::l2#8) ← (byte~) font_2x2::$12 + [103] (byte~) font_2x2::$11 ← (byte) font_2x2::l2#8 + (byte) 1 + [104] *((byte*) font_2x2::next_2x2_left#7 + (byte~) font_2x2::$11) ← (byte~) font_2x2::$12 + [105] (byte~) font_2x2::$15 ← < (word) font_2x2::glyph_bits_2x2#2 + [106] *((byte*) font_2x2::next_2x2_right#7 + (byte) font_2x2::l2#8) ← (byte~) font_2x2::$15 + [107] (byte~) font_2x2::$14 ← (byte) font_2x2::l2#8 + (byte) 1 + [108] *((byte*) font_2x2::next_2x2_right#7 + (byte~) font_2x2::$14) ← (byte~) font_2x2::$15 + [109] (byte) font_2x2::l2#1 ← (byte) font_2x2::l2#8 + (byte) 2 + [110] if((byte) font_2x2::l2#1!=(byte) 8) goto font_2x2::@8 + to:font_2x2::@7 +font_2x2::@7: scope:[font_2x2] from font_2x2::@6 + [111] (byte*) font_2x2::next_2x2_left#1 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $80*(number) 8 + [112] (byte*) font_2x2::next_2x2_right#1 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $c0*(number) 8 + to:font_2x2::@8 +font_2x2::@8: scope:[font_2x2] from font_2x2::@6 font_2x2::@7 + [113] (byte*) font_2x2::next_2x2_right#8 ← phi( font_2x2::@7/(byte*) font_2x2::next_2x2_right#1 font_2x2::@6/(byte*) font_2x2::next_2x2_right#7 ) + [113] (byte) font_2x2::l2#9 ← phi( font_2x2::@7/(byte) 0 font_2x2::@6/(byte) font_2x2::l2#1 ) + [113] (byte*) font_2x2::next_2x2_left#8 ← phi( font_2x2::@7/(byte*) font_2x2::next_2x2_left#1 font_2x2::@6/(byte*) font_2x2::next_2x2_left#7 ) + [114] (byte) font_2x2::l#1 ← ++ (byte) font_2x2::l#2 + [115] if((byte) font_2x2::l#1!=(byte) 8) goto font_2x2::@2 + to:font_2x2::@9 +font_2x2::@9: scope:[font_2x2] from font_2x2::@8 + [116] (byte*) font_2x2::next_2x2#1 ← (byte*) font_2x2::next_2x2_left#0 + (byte) 8 + [117] (byte*) font_2x2::next_original#1 ← (byte*) font_2x2::next_original#4 + (byte) 8 + [118] (byte) font_2x2::c#1 ← ++ (byte) font_2x2::c#11 + [119] if((byte) font_2x2::c#1!=(byte) $40) goto font_2x2::@1 + to:font_2x2::@return +font_2x2::@return: scope:[font_2x2] from font_2x2::@9 + [120] return + to:@return diff --git a/src/test/ref/examples/font-2x2/font-2x2.log b/src/test/ref/examples/font-2x2/font-2x2.log new file mode 100644 index 000000000..8b6c4957c --- /dev/null +++ b/src/test/ref/examples/font-2x2/font-2x2.log @@ -0,0 +1,5094 @@ +Warning! Adding boolean cast to non-boolean condition *((byte*) strcpy::src) +Warning! Adding boolean cast to non-boolean condition *((byte*) strlen::str) +Warning! Adding boolean cast to non-boolean condition (number~) font_2x2::$1 +Warning! Adding boolean cast to non-boolean sub-expression (byte) font_find::found +Identified constant variable (byte*) main::cursor +Inlined call (byte~) vicSelectGfxBank::$0 ← call toDd00 (byte*) vicSelectGfxBank::gfx +Inlined call (byte~) main::$2 ← call toD018 (const byte*) SCREEN (const byte*) FONT_COMPRESSED +Culled Empty Block (label) @1 +Culled Empty Block (label) @2 +Culled Empty Block (label) @3 +Culled Empty Block (label) @4 +Culled Empty Block (label) @5 +Culled Empty Block (label) @6 +Culled Empty Block (label) memset::@7 +Culled Empty Block (label) memset::@6 +Culled Empty Block (label) memset::@8 +Culled Empty Block (label) memset::@9 +Culled Empty Block (label) memset::@3 +Culled Empty Block (label) @7 +Culled Empty Block (label) @8 +Culled Empty Block (label) @9 +Culled Empty Block (label) main::toD0181_@1 +Culled Empty Block (label) main::@4 +Culled Empty Block (label) main::@8 +Culled Empty Block (label) main::@7 +Culled Empty Block (label) main::@9 +Culled Empty Block (label) main::@10 +Culled Empty Block (label) @10 +Culled Empty Block (label) @11 +Culled Empty Block (label) font_2x2::@7 +Culled Empty Block (label) font_2x2::@8 +Culled Empty Block (label) font_2x2::@13 +Culled Empty Block (label) @12 +Culled Empty Block (label) font_compress::@7 +Culled Empty Block (label) @13 +Culled Empty Block (label) font_find::@13 +Culled Empty Block (label) font_find::@14 +Culled Empty Block (label) font_find::@8 +Culled Empty Block (label) font_find::@9 +Culled Empty Block (label) font_find::@11 +Culled Empty Block (label) font_find::@15 +Culled Empty Block (label) font_find::@16 + +CONTROL FLOW GRAPH SSA +@begin: scope:[] from + to:@14 + +(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) +memset: scope:[memset] from main::@11 + (byte) memset::c#4 ← phi( main::@11/(byte) memset::c#0 ) + (void*) memset::str#3 ← phi( main::@11/(void*) memset::str#0 ) + (word) memset::num#1 ← phi( main::@11/(word) memset::num#0 ) + (bool~) memset::$0 ← (word) memset::num#1 > (number) 0 + (bool~) memset::$1 ← ! (bool~) memset::$0 + if((bool~) memset::$1) goto memset::@1 + to:memset::@2 +memset::@1: scope:[memset] from memset memset::@4 + (void*) memset::str#1 ← phi( memset/(void*) memset::str#3 memset::@4/(void*) memset::str#4 ) + (void*) memset::return#0 ← (void*) memset::str#1 + to:memset::@return +memset::@2: scope:[memset] from memset + (byte) memset::c#3 ← phi( memset/(byte) memset::c#4 ) + (word) memset::num#2 ← phi( memset/(word) memset::num#1 ) + (void*) memset::str#2 ← phi( memset/(void*) memset::str#3 ) + (byte*~) memset::$2 ← ((byte*)) (void*) memset::str#2 + (byte*~) memset::$3 ← (byte*~) memset::$2 + (word) memset::num#2 + (byte*) memset::end#0 ← (byte*~) memset::$3 + (byte*) memset::dst#0 ← ((byte*)) (void*) memset::str#2 + to:memset::@4 +memset::@4: scope:[memset] from memset::@2 memset::@5 + (byte) memset::c#2 ← phi( memset::@2/(byte) memset::c#3 memset::@5/(byte) memset::c#1 ) + (void*) memset::str#4 ← phi( memset::@2/(void*) memset::str#2 memset::@5/(void*) memset::str#5 ) + (byte*) memset::end#1 ← phi( memset::@2/(byte*) memset::end#0 memset::@5/(byte*) memset::end#2 ) + (byte*) memset::dst#2 ← phi( memset::@2/(byte*) memset::dst#0 memset::@5/(byte*) memset::dst#1 ) + (bool~) memset::$4 ← (byte*) memset::dst#2 != (byte*) memset::end#1 + if((bool~) memset::$4) goto memset::@5 + to:memset::@1 +memset::@5: scope:[memset] from memset::@4 + (void*) memset::str#5 ← phi( memset::@4/(void*) memset::str#4 ) + (byte*) memset::end#2 ← phi( memset::@4/(byte*) memset::end#1 ) + (byte*) memset::dst#3 ← phi( memset::@4/(byte*) memset::dst#2 ) + (byte) memset::c#1 ← phi( memset::@4/(byte) memset::c#2 ) + *((byte*) memset::dst#3) ← (byte) memset::c#1 + (byte*) memset::dst#1 ← ++ (byte*) memset::dst#3 + to:memset::@4 +memset::@return: scope:[memset] from memset::@1 + (void*) memset::return#3 ← phi( memset::@1/(void*) memset::return#0 ) + (void*) memset::return#1 ← (void*) memset::return#3 + return + to:@return + +(void()) main() +main: scope:[main] from @14 + asm { sei } + *((const byte*) PROCPORT) ← (const byte) PROCPORT_RAM_CHARROM + (byte*) font_2x2::font_original#0 ← (const byte*) CHARGEN + (byte*) font_2x2::font_2x2#0 ← (const byte*) FONT_ORIGINAL + call font_2x2 + to:main::@12 +main::@12: scope:[main] from main + *((const byte*) PROCPORT) ← (const byte) PROCPORT_BASIC_KERNEL_IO + asm { cli } + (byte*) font_compress::font_original#0 ← (const byte*) FONT_ORIGINAL + (byte*) font_compress::font_compressed#0 ← (const byte*) FONT_COMPRESSED + (byte*) font_compress::compress_mapping#0 ← (const byte*) FONT_COMPRESSED_MAP + call font_compress + (byte) font_compress::return#0 ← (byte) font_compress::return#2 + to:main::@13 +main::@13: scope:[main] from main::@12 + (byte*) main::toD0181_screen#0 ← (const byte*) SCREEN + (byte*) main::toD0181_gfx#0 ← (const byte*) FONT_COMPRESSED + to:main::toD0181 +main::toD0181: scope:[main] from main::@13 + (byte*) main::toD0181_gfx#1 ← phi( main::@13/(byte*) main::toD0181_gfx#0 ) + (byte*) main::toD0181_screen#1 ← phi( main::@13/(byte*) main::toD0181_screen#0 ) + (word~) main::toD0181_$0 ← ((word)) (byte*) main::toD0181_screen#1 + (number~) main::toD0181_$1 ← (word~) main::toD0181_$0 & (number) $3fff + (number~) main::toD0181_$2 ← (number~) main::toD0181_$1 * (number) 4 + (number~) main::toD0181_$3 ← > (number~) main::toD0181_$2 + (word~) main::toD0181_$4 ← ((word)) (byte*) main::toD0181_gfx#1 + (byte~) main::toD0181_$5 ← > (word~) main::toD0181_$4 + (number~) main::toD0181_$6 ← (byte~) main::toD0181_$5 / (number) 4 + (number~) main::toD0181_$7 ← (number~) main::toD0181_$6 & (number) $f + (number~) main::toD0181_$8 ← (number~) main::toD0181_$3 | (number~) main::toD0181_$7 + (byte) main::toD0181_return#0 ← (number~) main::toD0181_$8 + to:main::toD0181_@return +main::toD0181_@return: scope:[main] from main::toD0181 + (byte) main::toD0181_return#2 ← phi( main::toD0181/(byte) main::toD0181_return#0 ) + (byte) main::toD0181_return#1 ← (byte) main::toD0181_return#2 + to:main::@11 +main::@11: scope:[main] from main::toD0181_@return + (byte) main::toD0181_return#3 ← phi( main::toD0181_@return/(byte) main::toD0181_return#1 ) + (byte~) main::$2 ← (byte) main::toD0181_return#3 + *((const byte*) D018) ← (byte~) main::$2 + (void*) memset::str#0 ← (void*)(const byte*) SCREEN + (byte) memset::c#0 ← *((const byte*) FONT_COMPRESSED_MAP + (byte) ' ') + (word) memset::num#0 ← (number) $400 + call memset + (void*) memset::return#2 ← (void*) memset::return#1 + to:main::@14 +main::@14: scope:[main] from main::@11 + (byte) main::c#0 ← (byte) 0 + (byte) main::y#0 ← (byte) 0 + to:main::@1 +main::@1: scope:[main] from main::@14 main::@3 + (byte) main::y#4 ← phi( main::@14/(byte) main::y#0 main::@3/(byte) main::y#1 ) + (byte) main::c#4 ← phi( main::@14/(byte) main::c#0 main::@3/(byte) main::c#5 ) + (byte) main::x#0 ← (byte) 0 + to:main::@2 +main::@2: scope:[main] from main::@1 main::@15 + (byte) main::y#2 ← phi( main::@1/(byte) main::y#4 main::@15/(byte) main::y#5 ) + (byte) main::x#2 ← phi( main::@1/(byte) main::x#0 main::@15/(byte) main::x#1 ) + (byte) main::c#2 ← phi( main::@1/(byte) main::c#4 main::@15/(byte) main::c#1 ) + (byte) show::c#0 ← (byte) main::c#2 + (byte) show::x#0 ← (byte) main::x#2 + (byte) show::y#0 ← (byte) main::y#2 + (byte*) show::font_mapping#0 ← (const byte*) FONT_COMPRESSED_MAP + call show + to:main::@15 +main::@15: scope:[main] from main::@2 + (byte) main::y#5 ← phi( main::@2/(byte) main::y#2 ) + (byte) main::x#3 ← phi( main::@2/(byte) main::x#2 ) + (byte) main::c#3 ← phi( main::@2/(byte) main::c#2 ) + (byte) main::c#1 ← ++ (byte) main::c#3 + (byte) main::x#1 ← (byte) main::x#3 + rangenext(0,7) + (bool~) main::$5 ← (byte) main::x#1 != rangelast(0,7) + if((bool~) main::$5) goto main::@2 + to:main::@3 +main::@3: scope:[main] from main::@15 + (byte) main::c#5 ← phi( main::@15/(byte) main::c#1 ) + (byte) main::y#3 ← phi( main::@15/(byte) main::y#5 ) + (byte) main::y#1 ← (byte) main::y#3 + rangenext(0,7) + (bool~) main::$6 ← (byte) main::y#1 != rangelast(0,7) + if((bool~) main::$6) goto main::@1 + to:main::@5 +main::@5: scope:[main] from main::@3 main::@6 + if(true) goto main::@6 + to:main::@return +main::@6: scope:[main] from main::@5 + *((const byte*) SCREEN+(number) $3e7) ← ++ *((const byte*) SCREEN+(number) $3e7) + to:main::@5 +main::@return: scope:[main] from main::@5 + return + to:@return + +(void()) show((byte) show::c , (byte) show::x , (byte) show::y , (byte*) show::font_mapping) +show: scope:[show] from main::@2 + (byte) show::c#1 ← phi( main::@2/(byte) show::c#0 ) + (byte*) show::font_mapping#1 ← phi( main::@2/(byte*) show::font_mapping#0 ) + (byte) show::x#1 ← phi( main::@2/(byte) show::x#0 ) + (byte) show::y#1 ← phi( main::@2/(byte) show::y#0 ) + (word~) show::$0 ← ((word)) (byte) show::y#1 + (number~) show::$1 ← (word~) show::$0 * (number) $50 + (byte*~) show::$2 ← (const byte*) SCREEN + (number~) show::$1 + (number~) show::$3 ← (byte) show::x#1 * (number) 2 + (byte*~) show::$4 ← (byte*~) show::$2 + (number~) show::$3 + (byte*) show::ptr#0 ← (byte*~) show::$4 + *((byte*) show::ptr#0 + (number) 0) ← *((byte*) show::font_mapping#1 + (byte) show::c#1) + (number~) show::$5 ← (byte) show::c#1 + (number) $40 + *((byte*) show::ptr#0 + (number) 1) ← *((byte*) show::font_mapping#1 + (number~) show::$5) + (number~) show::$6 ← (byte) show::c#1 + (number) $80 + *((byte*) show::ptr#0 + (number) $28) ← *((byte*) show::font_mapping#1 + (number~) show::$6) + (number~) show::$7 ← (byte) show::c#1 + (number) $c0 + *((byte*) show::ptr#0 + (number) $29) ← *((byte*) show::font_mapping#1 + (number~) show::$7) + to:show::@return +show::@return: scope:[show] from show + return + to:@return + +(void()) font_2x2((byte*) font_2x2::font_original , (byte*) font_2x2::font_2x2) +font_2x2: scope:[font_2x2] from main + (byte*) font_2x2::font_2x2#1 ← phi( main/(byte*) font_2x2::font_2x2#0 ) + (byte*) font_2x2::font_original#1 ← phi( main/(byte*) font_2x2::font_original#0 ) + (byte*) font_2x2::next_original#0 ← (byte*) font_2x2::font_original#1 + (byte*) font_2x2::next_2x2#0 ← (byte*) font_2x2::font_2x2#1 + (byte) font_2x2::c#0 ← (byte) 0 + to:font_2x2::@1 +font_2x2::@1: scope:[font_2x2] from font_2x2 font_2x2::@12 + (byte) font_2x2::c#11 ← phi( font_2x2/(byte) font_2x2::c#0 font_2x2::@12/(byte) font_2x2::c#1 ) + (byte*) font_2x2::next_original#4 ← phi( font_2x2/(byte*) font_2x2::next_original#0 font_2x2::@12/(byte*) font_2x2::next_original#1 ) + (byte*) font_2x2::next_2x2#2 ← phi( font_2x2/(byte*) font_2x2::next_2x2#0 font_2x2::@12/(byte*) font_2x2::next_2x2#1 ) + (byte*) font_2x2::next_2x2_left#0 ← (byte*) font_2x2::next_2x2#2 + (byte*~) font_2x2::$0 ← (byte*) font_2x2::next_2x2#2 + (number) $40*(number) 8 + (byte*) font_2x2::next_2x2_right#0 ← (byte*~) font_2x2::$0 + (byte) font_2x2::l2#0 ← (byte) 0 + (byte) font_2x2::l#0 ← (byte) 0 + to:font_2x2::@2 +font_2x2::@2: scope:[font_2x2] from font_2x2::@1 font_2x2::@11 + (byte) font_2x2::c#10 ← phi( font_2x2::@1/(byte) font_2x2::c#11 font_2x2::@11/(byte) font_2x2::c#3 ) + (byte*) font_2x2::next_2x2#11 ← phi( font_2x2::@1/(byte*) font_2x2::next_2x2#2 font_2x2::@11/(byte*) font_2x2::next_2x2#6 ) + (byte*) font_2x2::next_2x2_right#7 ← phi( font_2x2::@1/(byte*) font_2x2::next_2x2_right#0 font_2x2::@11/(byte*) font_2x2::next_2x2_right#8 ) + (byte) font_2x2::l2#8 ← phi( font_2x2::@1/(byte) font_2x2::l2#0 font_2x2::@11/(byte) font_2x2::l2#9 ) + (byte*) font_2x2::next_2x2_left#7 ← phi( font_2x2::@1/(byte*) font_2x2::next_2x2_left#0 font_2x2::@11/(byte*) font_2x2::next_2x2_left#8 ) + (byte) font_2x2::l#2 ← phi( font_2x2::@1/(byte) font_2x2::l#0 font_2x2::@11/(byte) font_2x2::l#1 ) + (byte*) font_2x2::next_original#2 ← phi( font_2x2::@1/(byte*) font_2x2::next_original#4 font_2x2::@11/(byte*) font_2x2::next_original#5 ) + (byte) font_2x2::glyph_bits#0 ← *((byte*) font_2x2::next_original#2 + (byte) font_2x2::l#2) + (word) font_2x2::glyph_bits_2x2#0 ← (word) 0 + (byte) font_2x2::b#0 ← (byte) 0 + to:font_2x2::@3 +font_2x2::@3: scope:[font_2x2] from font_2x2::@2 font_2x2::@6 + (byte) font_2x2::c#9 ← phi( font_2x2::@2/(byte) font_2x2::c#10 font_2x2::@6/(byte) font_2x2::c#6 ) + (byte*) font_2x2::next_original#11 ← phi( font_2x2::@2/(byte*) font_2x2::next_original#2 font_2x2::@6/(byte*) font_2x2::next_original#8 ) + (byte*) font_2x2::next_2x2#10 ← phi( font_2x2::@2/(byte*) font_2x2::next_2x2#11 font_2x2::@6/(byte*) font_2x2::next_2x2#7 ) + (byte) font_2x2::l#9 ← phi( font_2x2::@2/(byte) font_2x2::l#2 font_2x2::@6/(byte) font_2x2::l#6 ) + (byte*) font_2x2::next_2x2_right#6 ← phi( font_2x2::@2/(byte*) font_2x2::next_2x2_right#7 font_2x2::@6/(byte*) font_2x2::next_2x2_right#3 ) + (byte) font_2x2::l2#7 ← phi( font_2x2::@2/(byte) font_2x2::l2#8 font_2x2::@6/(byte) font_2x2::l2#4 ) + (byte*) font_2x2::next_2x2_left#6 ← phi( font_2x2::@2/(byte*) font_2x2::next_2x2_left#7 font_2x2::@6/(byte*) font_2x2::next_2x2_left#3 ) + (byte) font_2x2::b#5 ← phi( font_2x2::@2/(byte) font_2x2::b#0 font_2x2::@6/(byte) font_2x2::b#1 ) + (word) font_2x2::glyph_bits_2x2#7 ← phi( font_2x2::@2/(word) font_2x2::glyph_bits_2x2#0 font_2x2::@6/(word) font_2x2::glyph_bits_2x2#2 ) + (byte) font_2x2::glyph_bits#2 ← phi( font_2x2::@2/(byte) font_2x2::glyph_bits#0 font_2x2::@6/(byte) font_2x2::glyph_bits#1 ) + (number~) font_2x2::$1 ← (byte) font_2x2::glyph_bits#2 & (number) $80 + (bool~) font_2x2::$22 ← (number) 0 != (number~) font_2x2::$1 + if((bool~) font_2x2::$22) goto font_2x2::@4 + to:font_2x2::@5 +font_2x2::@4: scope:[font_2x2] from font_2x2::@3 + (byte) font_2x2::c#7 ← phi( font_2x2::@3/(byte) font_2x2::c#9 ) + (byte*) font_2x2::next_original#9 ← phi( font_2x2::@3/(byte*) font_2x2::next_original#11 ) + (byte*) font_2x2::next_2x2#8 ← phi( font_2x2::@3/(byte*) font_2x2::next_2x2#10 ) + (byte) font_2x2::l#7 ← phi( font_2x2::@3/(byte) font_2x2::l#9 ) + (byte*) font_2x2::next_2x2_right#4 ← phi( font_2x2::@3/(byte*) font_2x2::next_2x2_right#6 ) + (byte) font_2x2::l2#5 ← phi( font_2x2::@3/(byte) font_2x2::l2#7 ) + (byte*) font_2x2::next_2x2_left#4 ← phi( font_2x2::@3/(byte*) font_2x2::next_2x2_left#6 ) + (byte) font_2x2::b#3 ← phi( font_2x2::@3/(byte) font_2x2::b#5 ) + (byte) font_2x2::glyph_bits#4 ← phi( font_2x2::@3/(byte) font_2x2::glyph_bits#2 ) + (word) font_2x2::glyph_bits_2x2#5 ← phi( font_2x2::@3/(word) font_2x2::glyph_bits_2x2#7 ) + (byte~) font_2x2::$3 ← (byte) 1 + to:font_2x2::@6 +font_2x2::@5: scope:[font_2x2] from font_2x2::@3 + (byte) font_2x2::c#8 ← phi( font_2x2::@3/(byte) font_2x2::c#9 ) + (byte*) font_2x2::next_original#10 ← phi( font_2x2::@3/(byte*) font_2x2::next_original#11 ) + (byte*) font_2x2::next_2x2#9 ← phi( font_2x2::@3/(byte*) font_2x2::next_2x2#10 ) + (byte) font_2x2::l#8 ← phi( font_2x2::@3/(byte) font_2x2::l#9 ) + (byte*) font_2x2::next_2x2_right#5 ← phi( font_2x2::@3/(byte*) font_2x2::next_2x2_right#6 ) + (byte) font_2x2::l2#6 ← phi( font_2x2::@3/(byte) font_2x2::l2#7 ) + (byte*) font_2x2::next_2x2_left#5 ← phi( font_2x2::@3/(byte*) font_2x2::next_2x2_left#6 ) + (byte) font_2x2::b#4 ← phi( font_2x2::@3/(byte) font_2x2::b#5 ) + (byte) font_2x2::glyph_bits#5 ← phi( font_2x2::@3/(byte) font_2x2::glyph_bits#2 ) + (word) font_2x2::glyph_bits_2x2#6 ← phi( font_2x2::@3/(word) font_2x2::glyph_bits_2x2#7 ) + (byte~) font_2x2::$2 ← (byte) 0 + to:font_2x2::@6 +font_2x2::@6: scope:[font_2x2] from font_2x2::@4 font_2x2::@5 + (byte) font_2x2::c#6 ← phi( font_2x2::@4/(byte) font_2x2::c#7 font_2x2::@5/(byte) font_2x2::c#8 ) + (byte*) font_2x2::next_original#8 ← phi( font_2x2::@4/(byte*) font_2x2::next_original#9 font_2x2::@5/(byte*) font_2x2::next_original#10 ) + (byte*) font_2x2::next_2x2#7 ← phi( font_2x2::@4/(byte*) font_2x2::next_2x2#8 font_2x2::@5/(byte*) font_2x2::next_2x2#9 ) + (byte) font_2x2::l#6 ← phi( font_2x2::@4/(byte) font_2x2::l#7 font_2x2::@5/(byte) font_2x2::l#8 ) + (byte*) font_2x2::next_2x2_right#3 ← phi( font_2x2::@4/(byte*) font_2x2::next_2x2_right#4 font_2x2::@5/(byte*) font_2x2::next_2x2_right#5 ) + (byte) font_2x2::l2#4 ← phi( font_2x2::@4/(byte) font_2x2::l2#5 font_2x2::@5/(byte) font_2x2::l2#6 ) + (byte*) font_2x2::next_2x2_left#3 ← phi( font_2x2::@4/(byte*) font_2x2::next_2x2_left#4 font_2x2::@5/(byte*) font_2x2::next_2x2_left#5 ) + (byte) font_2x2::b#2 ← phi( font_2x2::@4/(byte) font_2x2::b#3 font_2x2::@5/(byte) font_2x2::b#4 ) + (byte) font_2x2::glyph_bits#3 ← phi( font_2x2::@4/(byte) font_2x2::glyph_bits#4 font_2x2::@5/(byte) font_2x2::glyph_bits#5 ) + (word) font_2x2::glyph_bits_2x2#3 ← phi( font_2x2::@4/(word) font_2x2::glyph_bits_2x2#5 font_2x2::@5/(word) font_2x2::glyph_bits_2x2#6 ) + (byte~) font_2x2::$4 ← phi( font_2x2::@4/(byte~) font_2x2::$3 font_2x2::@5/(byte~) font_2x2::$2 ) + (byte) font_2x2::glyph_bit#0 ← (byte~) font_2x2::$4 + (word~) font_2x2::$5 ← (word) font_2x2::glyph_bits_2x2#3 << (number) 1 + (word~) font_2x2::$6 ← (word~) font_2x2::$5 | (byte) font_2x2::glyph_bit#0 + (word) font_2x2::glyph_bits_2x2#1 ← (word~) font_2x2::$6 + (word~) font_2x2::$7 ← (word) font_2x2::glyph_bits_2x2#1 << (number) 1 + (word~) font_2x2::$8 ← (word~) font_2x2::$7 | (byte) font_2x2::glyph_bit#0 + (word) font_2x2::glyph_bits_2x2#2 ← (word~) font_2x2::$8 + (byte) font_2x2::glyph_bits#1 ← (byte) font_2x2::glyph_bits#3 << (number) 1 + (byte) font_2x2::b#1 ← (byte) font_2x2::b#2 + rangenext(0,7) + (bool~) font_2x2::$9 ← (byte) font_2x2::b#1 != rangelast(0,7) + if((bool~) font_2x2::$9) goto font_2x2::@3 + to:font_2x2::@9 +font_2x2::@9: scope:[font_2x2] from font_2x2::@6 + (byte) font_2x2::c#5 ← phi( font_2x2::@6/(byte) font_2x2::c#6 ) + (byte*) font_2x2::next_original#7 ← phi( font_2x2::@6/(byte*) font_2x2::next_original#8 ) + (byte*) font_2x2::next_2x2#5 ← phi( font_2x2::@6/(byte*) font_2x2::next_2x2#7 ) + (byte) font_2x2::l#5 ← phi( font_2x2::@6/(byte) font_2x2::l#6 ) + (byte*) font_2x2::next_2x2_right#2 ← phi( font_2x2::@6/(byte*) font_2x2::next_2x2_right#3 ) + (byte) font_2x2::l2#3 ← phi( font_2x2::@6/(byte) font_2x2::l2#4 ) + (byte*) font_2x2::next_2x2_left#2 ← phi( font_2x2::@6/(byte*) font_2x2::next_2x2_left#3 ) + (word) font_2x2::glyph_bits_2x2#4 ← phi( font_2x2::@6/(word) font_2x2::glyph_bits_2x2#2 ) + (byte~) font_2x2::$10 ← > (word) font_2x2::glyph_bits_2x2#4 + *((byte*) font_2x2::next_2x2_left#2 + (byte) font_2x2::l2#3) ← (byte~) font_2x2::$10 + (number~) font_2x2::$11 ← (byte) font_2x2::l2#3 + (number) 1 + (byte~) font_2x2::$12 ← > (word) font_2x2::glyph_bits_2x2#4 + *((byte*) font_2x2::next_2x2_left#2 + (number~) font_2x2::$11) ← (byte~) font_2x2::$12 + (byte~) font_2x2::$13 ← < (word) font_2x2::glyph_bits_2x2#4 + *((byte*) font_2x2::next_2x2_right#2 + (byte) font_2x2::l2#3) ← (byte~) font_2x2::$13 + (number~) font_2x2::$14 ← (byte) font_2x2::l2#3 + (number) 1 + (byte~) font_2x2::$15 ← < (word) font_2x2::glyph_bits_2x2#4 + *((byte*) font_2x2::next_2x2_right#2 + (number~) font_2x2::$14) ← (byte~) font_2x2::$15 + (byte) font_2x2::l2#1 ← (byte) font_2x2::l2#3 + (number) 2 + (bool~) font_2x2::$16 ← (byte) font_2x2::l2#1 == (number) 8 + (bool~) font_2x2::$17 ← ! (bool~) font_2x2::$16 + if((bool~) font_2x2::$17) goto font_2x2::@11 + to:font_2x2::@10 +font_2x2::@11: scope:[font_2x2] from font_2x2::@10 font_2x2::@9 + (byte*) font_2x2::next_2x2_right#8 ← phi( font_2x2::@10/(byte*) font_2x2::next_2x2_right#1 font_2x2::@9/(byte*) font_2x2::next_2x2_right#2 ) + (byte) font_2x2::l2#9 ← phi( font_2x2::@10/(byte) font_2x2::l2#2 font_2x2::@9/(byte) font_2x2::l2#1 ) + (byte*) font_2x2::next_2x2_left#8 ← phi( font_2x2::@10/(byte*) font_2x2::next_2x2_left#1 font_2x2::@9/(byte*) font_2x2::next_2x2_left#2 ) + (byte) font_2x2::c#3 ← phi( font_2x2::@10/(byte) font_2x2::c#4 font_2x2::@9/(byte) font_2x2::c#5 ) + (byte*) font_2x2::next_2x2#6 ← phi( font_2x2::@10/(byte*) font_2x2::next_2x2#3 font_2x2::@9/(byte*) font_2x2::next_2x2#5 ) + (byte*) font_2x2::next_original#5 ← phi( font_2x2::@10/(byte*) font_2x2::next_original#6 font_2x2::@9/(byte*) font_2x2::next_original#7 ) + (byte) font_2x2::l#3 ← phi( font_2x2::@10/(byte) font_2x2::l#4 font_2x2::@9/(byte) font_2x2::l#5 ) + (byte) font_2x2::l#1 ← (byte) font_2x2::l#3 + rangenext(0,7) + (bool~) font_2x2::$20 ← (byte) font_2x2::l#1 != rangelast(0,7) + if((bool~) font_2x2::$20) goto font_2x2::@2 + to:font_2x2::@12 +font_2x2::@10: scope:[font_2x2] from font_2x2::@9 + (byte) font_2x2::c#4 ← phi( font_2x2::@9/(byte) font_2x2::c#5 ) + (byte*) font_2x2::next_original#6 ← phi( font_2x2::@9/(byte*) font_2x2::next_original#7 ) + (byte) font_2x2::l#4 ← phi( font_2x2::@9/(byte) font_2x2::l#5 ) + (byte*) font_2x2::next_2x2#3 ← phi( font_2x2::@9/(byte*) font_2x2::next_2x2#5 ) + (byte*~) font_2x2::$18 ← (byte*) font_2x2::next_2x2#3 + (number) $80*(number) 8 + (byte*) font_2x2::next_2x2_left#1 ← (byte*~) font_2x2::$18 + (byte*~) font_2x2::$19 ← (byte*) font_2x2::next_2x2#3 + (number) $c0*(number) 8 + (byte*) font_2x2::next_2x2_right#1 ← (byte*~) font_2x2::$19 + (byte) font_2x2::l2#2 ← (number) 0 + to:font_2x2::@11 +font_2x2::@12: scope:[font_2x2] from font_2x2::@11 + (byte) font_2x2::c#2 ← phi( font_2x2::@11/(byte) font_2x2::c#3 ) + (byte*) font_2x2::next_original#3 ← phi( font_2x2::@11/(byte*) font_2x2::next_original#5 ) + (byte*) font_2x2::next_2x2#4 ← phi( font_2x2::@11/(byte*) font_2x2::next_2x2#6 ) + (byte*) font_2x2::next_2x2#1 ← (byte*) font_2x2::next_2x2#4 + (number) 8 + (byte*) font_2x2::next_original#1 ← (byte*) font_2x2::next_original#3 + (number) 8 + (byte) font_2x2::c#1 ← (byte) font_2x2::c#2 + rangenext(0,$3f) + (bool~) font_2x2::$21 ← (byte) font_2x2::c#1 != rangelast(0,$3f) + if((bool~) font_2x2::$21) goto font_2x2::@1 + to:font_2x2::@return +font_2x2::@return: scope:[font_2x2] from font_2x2::@12 + return + to:@return + +(byte()) font_compress((byte*) font_compress::font_original , (byte*) font_compress::font_compressed , (byte*) font_compress::compress_mapping) +font_compress: scope:[font_compress] from main::@12 + (byte*) font_compress::compress_mapping#6 ← phi( main::@12/(byte*) font_compress::compress_mapping#0 ) + (byte*) font_compress::font_compressed#1 ← phi( main::@12/(byte*) font_compress::font_compressed#0 ) + (byte*) font_compress::font_original#1 ← phi( main::@12/(byte*) font_compress::font_original#0 ) + (byte) font_compress::font_size#0 ← (byte) 0 + (byte*) font_compress::next_original#0 ← (byte*) font_compress::font_original#1 + (byte*) font_compress::next_compressed#0 ← (byte*) font_compress::font_compressed#1 + (byte) font_compress::i#0 ← (byte) 0 + to:font_compress::@1 +font_compress::@1: scope:[font_compress] from font_compress font_compress::@2 + (byte*) font_compress::next_compressed#6 ← phi( font_compress/(byte*) font_compress::next_compressed#0 font_compress::@2/(byte*) font_compress::next_compressed#7 ) + (byte) font_compress::i#5 ← phi( font_compress/(byte) font_compress::i#0 font_compress::@2/(byte) font_compress::i#1 ) + (byte*) font_compress::compress_mapping#4 ← phi( font_compress/(byte*) font_compress::compress_mapping#6 font_compress::@2/(byte*) font_compress::compress_mapping#1 ) + (byte) font_compress::font_size#2 ← phi( font_compress/(byte) font_compress::font_size#0 font_compress::@2/(byte) font_compress::font_size#5 ) + (byte*) font_compress::font_compressed#2 ← phi( font_compress/(byte*) font_compress::font_compressed#1 font_compress::@2/(byte*) font_compress::font_compressed#3 ) + (byte*) font_compress::next_original#2 ← phi( font_compress/(byte*) font_compress::next_original#0 font_compress::@2/(byte*) font_compress::next_original#1 ) + (byte*) font_find::glyph#0 ← (byte*) font_compress::next_original#2 + (byte*) font_find::font#0 ← (byte*) font_compress::font_compressed#2 + (byte) font_find::font_size#0 ← (byte) font_compress::font_size#2 + call font_find + (byte) font_find::return#0 ← (byte) font_find::return#3 + to:font_compress::@8 +font_compress::@8: scope:[font_compress] from font_compress::@1 + (byte*) font_compress::next_compressed#5 ← phi( font_compress::@1/(byte*) font_compress::next_compressed#6 ) + (byte) font_compress::font_size#7 ← phi( font_compress::@1/(byte) font_compress::font_size#2 ) + (byte*) font_compress::font_compressed#5 ← phi( font_compress::@1/(byte*) font_compress::font_compressed#2 ) + (byte*) font_compress::next_original#6 ← phi( font_compress::@1/(byte*) font_compress::next_original#2 ) + (byte) font_compress::i#4 ← phi( font_compress::@1/(byte) font_compress::i#5 ) + (byte*) font_compress::compress_mapping#3 ← phi( font_compress::@1/(byte*) font_compress::compress_mapping#4 ) + (byte) font_find::return#4 ← phi( font_compress::@1/(byte) font_find::return#0 ) + (byte~) font_compress::$0 ← (byte) font_find::return#4 + (byte) font_compress::found#0 ← (byte~) font_compress::$0 + (bool~) font_compress::$1 ← (byte) font_compress::found#0 == (number) $ff + (bool~) font_compress::$2 ← ! (bool~) font_compress::$1 + if((bool~) font_compress::$2) goto font_compress::@2 + to:font_compress::@5 +font_compress::@2: scope:[font_compress] from font_compress::@4 font_compress::@8 + (byte*) font_compress::next_compressed#7 ← phi( font_compress::@4/(byte*) font_compress::next_compressed#1 font_compress::@8/(byte*) font_compress::next_compressed#5 ) + (byte) font_compress::font_size#5 ← phi( font_compress::@4/(byte) font_compress::font_size#1 font_compress::@8/(byte) font_compress::font_size#7 ) + (byte*) font_compress::font_compressed#3 ← phi( font_compress::@4/(byte*) font_compress::font_compressed#4 font_compress::@8/(byte*) font_compress::font_compressed#5 ) + (byte*) font_compress::next_original#3 ← phi( font_compress::@4/(byte*) font_compress::next_original#5 font_compress::@8/(byte*) font_compress::next_original#6 ) + (byte) font_compress::i#2 ← phi( font_compress::@4/(byte) font_compress::i#3 font_compress::@8/(byte) font_compress::i#4 ) + (byte*) font_compress::compress_mapping#1 ← phi( font_compress::@4/(byte*) font_compress::compress_mapping#2 font_compress::@8/(byte*) font_compress::compress_mapping#3 ) + (byte) font_compress::found#2 ← phi( font_compress::@4/(byte) font_compress::found#1 font_compress::@8/(byte) font_compress::found#0 ) + *((byte*) font_compress::compress_mapping#1 + (byte) font_compress::i#2) ← (byte) font_compress::found#2 + (byte*) font_compress::next_original#1 ← (byte*) font_compress::next_original#3 + (number) 8 + (byte) font_compress::i#1 ← (byte) font_compress::i#2 + rangenext(0,$ff) + (bool~) font_compress::$4 ← (byte) font_compress::i#1 != rangelast(0,$ff) + if((bool~) font_compress::$4) goto font_compress::@1 + to:font_compress::@6 +font_compress::@5: scope:[font_compress] from font_compress::@8 + (byte*) font_compress::font_compressed#7 ← phi( font_compress::@8/(byte*) font_compress::font_compressed#5 ) + (byte) font_compress::i#7 ← phi( font_compress::@8/(byte) font_compress::i#4 ) + (byte*) font_compress::compress_mapping#7 ← phi( font_compress::@8/(byte*) font_compress::compress_mapping#3 ) + (byte) font_compress::font_size#8 ← phi( font_compress::@8/(byte) font_compress::font_size#7 ) + (byte*) font_compress::next_compressed#4 ← phi( font_compress::@8/(byte*) font_compress::next_compressed#5 ) + (byte*) font_compress::next_original#7 ← phi( font_compress::@8/(byte*) font_compress::next_original#6 ) + (byte) font_compress::l#0 ← (byte) 0 + to:font_compress::@3 +font_compress::@3: scope:[font_compress] from font_compress::@3 font_compress::@5 + (byte*) font_compress::font_compressed#6 ← phi( font_compress::@3/(byte*) font_compress::font_compressed#6 font_compress::@5/(byte*) font_compress::font_compressed#7 ) + (byte) font_compress::i#6 ← phi( font_compress::@3/(byte) font_compress::i#6 font_compress::@5/(byte) font_compress::i#7 ) + (byte*) font_compress::compress_mapping#5 ← phi( font_compress::@3/(byte*) font_compress::compress_mapping#5 font_compress::@5/(byte*) font_compress::compress_mapping#7 ) + (byte) font_compress::font_size#6 ← phi( font_compress::@3/(byte) font_compress::font_size#6 font_compress::@5/(byte) font_compress::font_size#8 ) + (byte*) font_compress::next_compressed#2 ← phi( font_compress::@3/(byte*) font_compress::next_compressed#2 font_compress::@5/(byte*) font_compress::next_compressed#4 ) + (byte) font_compress::l#2 ← phi( font_compress::@3/(byte) font_compress::l#1 font_compress::@5/(byte) font_compress::l#0 ) + (byte*) font_compress::next_original#4 ← phi( font_compress::@3/(byte*) font_compress::next_original#4 font_compress::@5/(byte*) font_compress::next_original#7 ) + *((byte*) font_compress::next_compressed#2 + (byte) font_compress::l#2) ← *((byte*) font_compress::next_original#4 + (byte) font_compress::l#2) + (byte) font_compress::l#1 ← (byte) font_compress::l#2 + rangenext(0,7) + (bool~) font_compress::$3 ← (byte) font_compress::l#1 != rangelast(0,7) + if((bool~) font_compress::$3) goto font_compress::@3 + to:font_compress::@4 +font_compress::@4: scope:[font_compress] from font_compress::@3 + (byte*) font_compress::font_compressed#4 ← phi( font_compress::@3/(byte*) font_compress::font_compressed#6 ) + (byte*) font_compress::next_original#5 ← phi( font_compress::@3/(byte*) font_compress::next_original#4 ) + (byte) font_compress::i#3 ← phi( font_compress::@3/(byte) font_compress::i#6 ) + (byte*) font_compress::compress_mapping#2 ← phi( font_compress::@3/(byte*) font_compress::compress_mapping#5 ) + (byte) font_compress::font_size#3 ← phi( font_compress::@3/(byte) font_compress::font_size#6 ) + (byte*) font_compress::next_compressed#3 ← phi( font_compress::@3/(byte*) font_compress::next_compressed#2 ) + (byte*) font_compress::next_compressed#1 ← (byte*) font_compress::next_compressed#3 + (number) 8 + (byte) font_compress::found#1 ← (byte) font_compress::font_size#3 + (byte) font_compress::font_size#1 ← ++ (byte) font_compress::font_size#3 + to:font_compress::@2 +font_compress::@6: scope:[font_compress] from font_compress::@2 + (byte) font_compress::font_size#4 ← phi( font_compress::@2/(byte) font_compress::font_size#5 ) + (byte) font_compress::return#1 ← (byte) font_compress::font_size#4 + to:font_compress::@return +font_compress::@return: scope:[font_compress] from font_compress::@6 + (byte) font_compress::return#3 ← phi( font_compress::@6/(byte) font_compress::return#1 ) + (byte) font_compress::return#2 ← (byte) font_compress::return#3 + return + to:@return + +(byte()) font_find((byte*) font_find::glyph , (byte*) font_find::font , (byte) font_find::font_size) +font_find: scope:[font_find] from font_compress::@1 + (byte*) font_find::font#9 ← phi( font_compress::@1/(byte*) font_find::font#0 ) + (byte*) font_find::glyph#5 ← phi( font_compress::@1/(byte*) font_find::glyph#0 ) + (byte) font_find::font_size#2 ← phi( font_compress::@1/(byte) font_find::font_size#0 ) + (byte) font_find::i#0 ← (byte) 0 + to:font_find::@1 +font_find::@1: scope:[font_find] from font_find font_find::@12 + (byte*) font_find::font#7 ← phi( font_find/(byte*) font_find::font#9 font_find::@12/(byte*) font_find::font#1 ) + (byte*) font_find::glyph#4 ← phi( font_find/(byte*) font_find::glyph#5 font_find::@12/(byte*) font_find::glyph#6 ) + (byte) font_find::font_size#1 ← phi( font_find/(byte) font_find::font_size#2 font_find::@12/(byte) font_find::font_size#3 ) + (byte) font_find::i#2 ← phi( font_find/(byte) font_find::i#0 font_find::@12/(byte) font_find::i#1 ) + (bool~) font_find::$0 ← (byte) font_find::i#2 < (byte) font_find::font_size#1 + if((bool~) font_find::$0) goto font_find::@2 + to:font_find::@3 +font_find::@2: scope:[font_find] from font_find::@1 + (byte) font_find::font_size#8 ← phi( font_find::@1/(byte) font_find::font_size#1 ) + (byte) font_find::i#9 ← phi( font_find::@1/(byte) font_find::i#2 ) + (byte*) font_find::font#4 ← phi( font_find::@1/(byte*) font_find::font#7 ) + (byte*) font_find::glyph#2 ← phi( font_find::@1/(byte*) font_find::glyph#4 ) + (byte) font_find::found#0 ← (byte) 1 + (byte) font_find::l#0 ← (byte) 0 + to:font_find::@4 +font_find::@3: scope:[font_find] from font_find::@1 + (byte) font_find::return#1 ← (number) $ff + to:font_find::@return +font_find::@4: scope:[font_find] from font_find::@2 font_find::@5 + (byte) font_find::font_size#7 ← phi( font_find::@2/(byte) font_find::font_size#8 font_find::@5/(byte) font_find::font_size#5 ) + (byte) font_find::i#8 ← phi( font_find::@2/(byte) font_find::i#9 font_find::@5/(byte) font_find::i#6 ) + (byte) font_find::found#4 ← phi( font_find::@2/(byte) font_find::found#0 font_find::@5/(byte) font_find::found#3 ) + (byte*) font_find::font#2 ← phi( font_find::@2/(byte*) font_find::font#4 font_find::@5/(byte*) font_find::font#5 ) + (byte) font_find::l#2 ← phi( font_find::@2/(byte) font_find::l#0 font_find::@5/(byte) font_find::l#1 ) + (byte*) font_find::glyph#1 ← phi( font_find::@2/(byte*) font_find::glyph#2 font_find::@5/(byte*) font_find::glyph#3 ) + (bool~) font_find::$1 ← *((byte*) font_find::glyph#1 + (byte) font_find::l#2) != *((byte*) font_find::font#2 + (byte) font_find::l#2) + (bool~) font_find::$2 ← ! (bool~) font_find::$1 + if((bool~) font_find::$2) goto font_find::@5 + to:font_find::@7 +font_find::@5: scope:[font_find] from font_find::@4 + (byte) font_find::font_size#5 ← phi( font_find::@4/(byte) font_find::font_size#7 ) + (byte) font_find::i#6 ← phi( font_find::@4/(byte) font_find::i#8 ) + (byte) font_find::found#3 ← phi( font_find::@4/(byte) font_find::found#4 ) + (byte*) font_find::font#5 ← phi( font_find::@4/(byte*) font_find::font#2 ) + (byte*) font_find::glyph#3 ← phi( font_find::@4/(byte*) font_find::glyph#1 ) + (byte) font_find::l#3 ← phi( font_find::@4/(byte) font_find::l#2 ) + (byte) font_find::l#1 ← (byte) font_find::l#3 + rangenext(0,7) + (bool~) font_find::$3 ← (byte) font_find::l#1 != rangelast(0,7) + if((bool~) font_find::$3) goto font_find::@4 + to:font_find::@6 +font_find::@7: scope:[font_find] from font_find::@4 + (byte*) font_find::glyph#8 ← phi( font_find::@4/(byte*) font_find::glyph#1 ) + (byte) font_find::font_size#6 ← phi( font_find::@4/(byte) font_find::font_size#7 ) + (byte) font_find::i#7 ← phi( font_find::@4/(byte) font_find::i#8 ) + (byte*) font_find::font#8 ← phi( font_find::@4/(byte*) font_find::font#2 ) + (byte) font_find::found#1 ← (number) 0 + to:font_find::@6 +font_find::@6: scope:[font_find] from font_find::@5 font_find::@7 + (byte*) font_find::glyph#7 ← phi( font_find::@5/(byte*) font_find::glyph#3 font_find::@7/(byte*) font_find::glyph#8 ) + (byte) font_find::font_size#4 ← phi( font_find::@5/(byte) font_find::font_size#5 font_find::@7/(byte) font_find::font_size#6 ) + (byte) font_find::i#5 ← phi( font_find::@5/(byte) font_find::i#6 font_find::@7/(byte) font_find::i#7 ) + (byte*) font_find::font#6 ← phi( font_find::@5/(byte*) font_find::font#5 font_find::@7/(byte*) font_find::font#8 ) + (byte) font_find::found#2 ← phi( font_find::@5/(byte) font_find::found#3 font_find::@7/(byte) font_find::found#1 ) + (bool~) font_find::$5 ← (number) 0 != (byte) font_find::found#2 + (bool~) font_find::$4 ← ! (bool~) font_find::$5 + if((bool~) font_find::$4) goto font_find::@12 + to:font_find::@10 +font_find::@12: scope:[font_find] from font_find::@6 + (byte*) font_find::glyph#6 ← phi( font_find::@6/(byte*) font_find::glyph#7 ) + (byte) font_find::font_size#3 ← phi( font_find::@6/(byte) font_find::font_size#4 ) + (byte) font_find::i#3 ← phi( font_find::@6/(byte) font_find::i#5 ) + (byte*) font_find::font#3 ← phi( font_find::@6/(byte*) font_find::font#6 ) + (byte*) font_find::font#1 ← (byte*) font_find::font#3 + (number) 8 + (byte) font_find::i#1 ← ++ (byte) font_find::i#3 + to:font_find::@1 +font_find::@10: scope:[font_find] from font_find::@6 + (byte) font_find::i#4 ← phi( font_find::@6/(byte) font_find::i#5 ) + (byte) font_find::return#2 ← (byte) font_find::i#4 + to:font_find::@return +font_find::@return: scope:[font_find] from font_find::@10 font_find::@3 + (byte) font_find::return#5 ← phi( font_find::@10/(byte) font_find::return#2 font_find::@3/(byte) font_find::return#1 ) + (byte) font_find::return#3 ← (byte) font_find::return#5 + return + to:@return +@14: scope:[] from @begin + call main + to:@15 +@15: scope:[] from @14 + to:@end +@end: scope:[] from @15 + +SYMBOL TABLE SSA +(label) @14 +(label) @15 +(label) @begin +(label) @end +(const byte*) CHARGEN = (byte*)(number) $d000 +(const byte*) D018 = (byte*)(number) $d018 +(const byte*) FONT_COMPRESSED = (byte*)(number) $2800 +(const byte*) FONT_COMPRESSED_MAP[(number) $100] = { fill( $100, 0) } +(const byte*) FONT_ORIGINAL = (byte*)(number) $2000 +(const byte*) PROCPORT = (byte*)(number) 1 +(const byte) PROCPORT_BASIC_KERNEL_IO = (byte) 7 +(const byte) PROCPORT_RAM_CHARROM = (byte) 1 +(const byte*) SCREEN = (byte*)(number) $400 +(void()) font_2x2((byte*) font_2x2::font_original , (byte*) font_2x2::font_2x2) +(byte*~) font_2x2::$0 +(number~) font_2x2::$1 +(byte~) font_2x2::$10 +(number~) font_2x2::$11 +(byte~) font_2x2::$12 +(byte~) font_2x2::$13 +(number~) font_2x2::$14 +(byte~) font_2x2::$15 +(bool~) font_2x2::$16 +(bool~) font_2x2::$17 +(byte*~) font_2x2::$18 +(byte*~) font_2x2::$19 +(byte~) font_2x2::$2 +(bool~) font_2x2::$20 +(bool~) font_2x2::$21 +(bool~) font_2x2::$22 +(byte~) font_2x2::$3 +(byte~) font_2x2::$4 +(word~) font_2x2::$5 +(word~) font_2x2::$6 +(word~) font_2x2::$7 +(word~) font_2x2::$8 +(bool~) font_2x2::$9 +(label) font_2x2::@1 +(label) font_2x2::@10 +(label) font_2x2::@11 +(label) font_2x2::@12 +(label) font_2x2::@2 +(label) font_2x2::@3 +(label) font_2x2::@4 +(label) font_2x2::@5 +(label) font_2x2::@6 +(label) font_2x2::@9 +(label) font_2x2::@return +(byte) font_2x2::b +(byte) font_2x2::b#0 +(byte) font_2x2::b#1 +(byte) font_2x2::b#2 +(byte) font_2x2::b#3 +(byte) font_2x2::b#4 +(byte) font_2x2::b#5 +(byte) font_2x2::c +(byte) font_2x2::c#0 +(byte) font_2x2::c#1 +(byte) font_2x2::c#10 +(byte) font_2x2::c#11 +(byte) font_2x2::c#2 +(byte) font_2x2::c#3 +(byte) font_2x2::c#4 +(byte) font_2x2::c#5 +(byte) font_2x2::c#6 +(byte) font_2x2::c#7 +(byte) font_2x2::c#8 +(byte) font_2x2::c#9 +(byte*) font_2x2::font_2x2 +(byte*) font_2x2::font_2x2#0 +(byte*) font_2x2::font_2x2#1 +(byte*) font_2x2::font_original +(byte*) font_2x2::font_original#0 +(byte*) font_2x2::font_original#1 +(byte) font_2x2::glyph_bit +(byte) font_2x2::glyph_bit#0 +(byte) font_2x2::glyph_bits +(byte) font_2x2::glyph_bits#0 +(byte) font_2x2::glyph_bits#1 +(byte) font_2x2::glyph_bits#2 +(byte) font_2x2::glyph_bits#3 +(byte) font_2x2::glyph_bits#4 +(byte) font_2x2::glyph_bits#5 +(word) font_2x2::glyph_bits_2x2 +(word) font_2x2::glyph_bits_2x2#0 +(word) font_2x2::glyph_bits_2x2#1 +(word) font_2x2::glyph_bits_2x2#2 +(word) font_2x2::glyph_bits_2x2#3 +(word) font_2x2::glyph_bits_2x2#4 +(word) font_2x2::glyph_bits_2x2#5 +(word) font_2x2::glyph_bits_2x2#6 +(word) font_2x2::glyph_bits_2x2#7 +(byte) font_2x2::l +(byte) font_2x2::l#0 +(byte) font_2x2::l#1 +(byte) font_2x2::l#2 +(byte) font_2x2::l#3 +(byte) font_2x2::l#4 +(byte) font_2x2::l#5 +(byte) font_2x2::l#6 +(byte) font_2x2::l#7 +(byte) font_2x2::l#8 +(byte) font_2x2::l#9 +(byte) font_2x2::l2 +(byte) font_2x2::l2#0 +(byte) font_2x2::l2#1 +(byte) font_2x2::l2#2 +(byte) font_2x2::l2#3 +(byte) font_2x2::l2#4 +(byte) font_2x2::l2#5 +(byte) font_2x2::l2#6 +(byte) font_2x2::l2#7 +(byte) font_2x2::l2#8 +(byte) font_2x2::l2#9 +(byte*) font_2x2::next_2x2 +(byte*) font_2x2::next_2x2#0 +(byte*) font_2x2::next_2x2#1 +(byte*) font_2x2::next_2x2#10 +(byte*) font_2x2::next_2x2#11 +(byte*) font_2x2::next_2x2#2 +(byte*) font_2x2::next_2x2#3 +(byte*) font_2x2::next_2x2#4 +(byte*) font_2x2::next_2x2#5 +(byte*) font_2x2::next_2x2#6 +(byte*) font_2x2::next_2x2#7 +(byte*) font_2x2::next_2x2#8 +(byte*) font_2x2::next_2x2#9 +(byte*) font_2x2::next_2x2_left +(byte*) font_2x2::next_2x2_left#0 +(byte*) font_2x2::next_2x2_left#1 +(byte*) font_2x2::next_2x2_left#2 +(byte*) font_2x2::next_2x2_left#3 +(byte*) font_2x2::next_2x2_left#4 +(byte*) font_2x2::next_2x2_left#5 +(byte*) font_2x2::next_2x2_left#6 +(byte*) font_2x2::next_2x2_left#7 +(byte*) font_2x2::next_2x2_left#8 +(byte*) font_2x2::next_2x2_right +(byte*) font_2x2::next_2x2_right#0 +(byte*) font_2x2::next_2x2_right#1 +(byte*) font_2x2::next_2x2_right#2 +(byte*) font_2x2::next_2x2_right#3 +(byte*) font_2x2::next_2x2_right#4 +(byte*) font_2x2::next_2x2_right#5 +(byte*) font_2x2::next_2x2_right#6 +(byte*) font_2x2::next_2x2_right#7 +(byte*) font_2x2::next_2x2_right#8 +(byte*) font_2x2::next_original +(byte*) font_2x2::next_original#0 +(byte*) font_2x2::next_original#1 +(byte*) font_2x2::next_original#10 +(byte*) font_2x2::next_original#11 +(byte*) font_2x2::next_original#2 +(byte*) font_2x2::next_original#3 +(byte*) font_2x2::next_original#4 +(byte*) font_2x2::next_original#5 +(byte*) font_2x2::next_original#6 +(byte*) font_2x2::next_original#7 +(byte*) font_2x2::next_original#8 +(byte*) font_2x2::next_original#9 +(byte()) font_compress((byte*) font_compress::font_original , (byte*) font_compress::font_compressed , (byte*) font_compress::compress_mapping) +(byte~) font_compress::$0 +(bool~) font_compress::$1 +(bool~) font_compress::$2 +(bool~) font_compress::$3 +(bool~) font_compress::$4 +(label) font_compress::@1 +(label) font_compress::@2 +(label) font_compress::@3 +(label) font_compress::@4 +(label) font_compress::@5 +(label) font_compress::@6 +(label) font_compress::@8 +(label) font_compress::@return +(byte*) font_compress::compress_mapping +(byte*) font_compress::compress_mapping#0 +(byte*) font_compress::compress_mapping#1 +(byte*) font_compress::compress_mapping#2 +(byte*) font_compress::compress_mapping#3 +(byte*) font_compress::compress_mapping#4 +(byte*) font_compress::compress_mapping#5 +(byte*) font_compress::compress_mapping#6 +(byte*) font_compress::compress_mapping#7 +(byte*) font_compress::font_compressed +(byte*) font_compress::font_compressed#0 +(byte*) font_compress::font_compressed#1 +(byte*) font_compress::font_compressed#2 +(byte*) font_compress::font_compressed#3 +(byte*) font_compress::font_compressed#4 +(byte*) font_compress::font_compressed#5 +(byte*) font_compress::font_compressed#6 +(byte*) font_compress::font_compressed#7 +(byte*) font_compress::font_original +(byte*) font_compress::font_original#0 +(byte*) font_compress::font_original#1 +(byte) font_compress::font_size +(byte) font_compress::font_size#0 +(byte) font_compress::font_size#1 +(byte) font_compress::font_size#2 +(byte) font_compress::font_size#3 +(byte) font_compress::font_size#4 +(byte) font_compress::font_size#5 +(byte) font_compress::font_size#6 +(byte) font_compress::font_size#7 +(byte) font_compress::font_size#8 +(byte) font_compress::found +(byte) font_compress::found#0 +(byte) font_compress::found#1 +(byte) font_compress::found#2 +(byte) font_compress::i +(byte) font_compress::i#0 +(byte) font_compress::i#1 +(byte) font_compress::i#2 +(byte) font_compress::i#3 +(byte) font_compress::i#4 +(byte) font_compress::i#5 +(byte) font_compress::i#6 +(byte) font_compress::i#7 +(byte) font_compress::l +(byte) font_compress::l#0 +(byte) font_compress::l#1 +(byte) font_compress::l#2 +(byte*) font_compress::next_compressed +(byte*) font_compress::next_compressed#0 +(byte*) font_compress::next_compressed#1 +(byte*) font_compress::next_compressed#2 +(byte*) font_compress::next_compressed#3 +(byte*) font_compress::next_compressed#4 +(byte*) font_compress::next_compressed#5 +(byte*) font_compress::next_compressed#6 +(byte*) font_compress::next_compressed#7 +(byte*) font_compress::next_original +(byte*) font_compress::next_original#0 +(byte*) font_compress::next_original#1 +(byte*) font_compress::next_original#2 +(byte*) font_compress::next_original#3 +(byte*) font_compress::next_original#4 +(byte*) font_compress::next_original#5 +(byte*) font_compress::next_original#6 +(byte*) font_compress::next_original#7 +(byte) font_compress::return +(byte) font_compress::return#0 +(byte) font_compress::return#1 +(byte) font_compress::return#2 +(byte) font_compress::return#3 +(byte()) font_find((byte*) font_find::glyph , (byte*) font_find::font , (byte) font_find::font_size) +(bool~) font_find::$0 +(bool~) font_find::$1 +(bool~) font_find::$2 +(bool~) font_find::$3 +(bool~) font_find::$4 +(bool~) font_find::$5 +(label) font_find::@1 +(label) font_find::@10 +(label) font_find::@12 +(label) font_find::@2 +(label) font_find::@3 +(label) font_find::@4 +(label) font_find::@5 +(label) font_find::@6 +(label) font_find::@7 +(label) font_find::@return +(byte*) font_find::font +(byte*) font_find::font#0 +(byte*) font_find::font#1 +(byte*) font_find::font#2 +(byte*) font_find::font#3 +(byte*) font_find::font#4 +(byte*) font_find::font#5 +(byte*) font_find::font#6 +(byte*) font_find::font#7 +(byte*) font_find::font#8 +(byte*) font_find::font#9 +(byte) font_find::font_size +(byte) font_find::font_size#0 +(byte) font_find::font_size#1 +(byte) font_find::font_size#2 +(byte) font_find::font_size#3 +(byte) font_find::font_size#4 +(byte) font_find::font_size#5 +(byte) font_find::font_size#6 +(byte) font_find::font_size#7 +(byte) font_find::font_size#8 +(byte) font_find::found +(byte) font_find::found#0 +(byte) font_find::found#1 +(byte) font_find::found#2 +(byte) font_find::found#3 +(byte) font_find::found#4 +(byte*) font_find::glyph +(byte*) font_find::glyph#0 +(byte*) font_find::glyph#1 +(byte*) font_find::glyph#2 +(byte*) font_find::glyph#3 +(byte*) font_find::glyph#4 +(byte*) font_find::glyph#5 +(byte*) font_find::glyph#6 +(byte*) font_find::glyph#7 +(byte*) font_find::glyph#8 +(byte) font_find::i +(byte) font_find::i#0 +(byte) font_find::i#1 +(byte) font_find::i#2 +(byte) font_find::i#3 +(byte) font_find::i#4 +(byte) font_find::i#5 +(byte) font_find::i#6 +(byte) font_find::i#7 +(byte) font_find::i#8 +(byte) font_find::i#9 +(byte) font_find::l +(byte) font_find::l#0 +(byte) font_find::l#1 +(byte) font_find::l#2 +(byte) font_find::l#3 +(byte) font_find::return +(byte) font_find::return#0 +(byte) font_find::return#1 +(byte) font_find::return#2 +(byte) font_find::return#3 +(byte) font_find::return#4 +(byte) font_find::return#5 +(void()) main() +(byte~) main::$2 +(bool~) main::$5 +(bool~) main::$6 +(label) main::@1 +(label) main::@11 +(label) main::@12 +(label) main::@13 +(label) main::@14 +(label) main::@15 +(label) main::@2 +(label) main::@3 +(label) main::@5 +(label) main::@6 +(label) main::@return +(byte) main::c +(byte) main::c#0 +(byte) main::c#1 +(byte) main::c#2 +(byte) main::c#3 +(byte) main::c#4 +(byte) main::c#5 +(label) main::toD0181 +(word~) main::toD0181_$0 +(number~) main::toD0181_$1 +(number~) main::toD0181_$2 +(number~) main::toD0181_$3 +(word~) main::toD0181_$4 +(byte~) main::toD0181_$5 +(number~) main::toD0181_$6 +(number~) main::toD0181_$7 +(number~) main::toD0181_$8 +(label) main::toD0181_@return +(byte*) main::toD0181_gfx +(byte*) main::toD0181_gfx#0 +(byte*) main::toD0181_gfx#1 +(byte) main::toD0181_return +(byte) main::toD0181_return#0 +(byte) main::toD0181_return#1 +(byte) main::toD0181_return#2 +(byte) main::toD0181_return#3 +(byte*) main::toD0181_screen +(byte*) main::toD0181_screen#0 +(byte*) main::toD0181_screen#1 +(byte) main::x +(byte) main::x#0 +(byte) main::x#1 +(byte) main::x#2 +(byte) main::x#3 +(byte) main::y +(byte) main::y#0 +(byte) main::y#1 +(byte) main::y#2 +(byte) main::y#3 +(byte) main::y#4 +(byte) main::y#5 +(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) +(bool~) memset::$0 +(bool~) memset::$1 +(byte*~) memset::$2 +(byte*~) memset::$3 +(bool~) memset::$4 +(label) memset::@1 +(label) memset::@2 +(label) memset::@4 +(label) memset::@5 +(label) memset::@return +(byte) memset::c +(byte) memset::c#0 +(byte) memset::c#1 +(byte) memset::c#2 +(byte) memset::c#3 +(byte) memset::c#4 +(byte*) memset::dst +(byte*) memset::dst#0 +(byte*) memset::dst#1 +(byte*) memset::dst#2 +(byte*) memset::dst#3 +(byte*) memset::end +(byte*) memset::end#0 +(byte*) memset::end#1 +(byte*) memset::end#2 +(word) memset::num +(word) memset::num#0 +(word) memset::num#1 +(word) memset::num#2 +(void*) memset::return +(void*) memset::return#0 +(void*) memset::return#1 +(void*) memset::return#2 +(void*) memset::return#3 +(void*) memset::str +(void*) memset::str#0 +(void*) memset::str#1 +(void*) memset::str#2 +(void*) memset::str#3 +(void*) memset::str#4 +(void*) memset::str#5 +(void()) show((byte) show::c , (byte) show::x , (byte) show::y , (byte*) show::font_mapping) +(word~) show::$0 +(number~) show::$1 +(byte*~) show::$2 +(number~) show::$3 +(byte*~) show::$4 +(number~) show::$5 +(number~) show::$6 +(number~) show::$7 +(label) show::@return +(byte) show::c +(byte) show::c#0 +(byte) show::c#1 +(byte*) show::font_mapping +(byte*) show::font_mapping#0 +(byte*) show::font_mapping#1 +(byte*) show::ptr +(byte*) show::ptr#0 +(byte) show::x +(byte) show::x#0 +(byte) show::x#1 +(byte) show::y +(byte) show::y#0 +(byte) show::y#1 + +Adding number conversion cast (unumber) 0 in (bool~) memset::$0 ← (word) memset::num#1 > (number) 0 +Adding number conversion cast (unumber) $3fff in (number~) main::toD0181_$1 ← (word~) main::toD0181_$0 & (number) $3fff +Adding number conversion cast (unumber) main::toD0181_$1 in (number~) main::toD0181_$1 ← (word~) main::toD0181_$0 & (unumber)(number) $3fff +Adding number conversion cast (unumber) 4 in (number~) main::toD0181_$2 ← (unumber~) main::toD0181_$1 * (number) 4 +Adding number conversion cast (unumber) main::toD0181_$2 in (number~) main::toD0181_$2 ← (unumber~) main::toD0181_$1 * (unumber)(number) 4 +Adding number conversion cast (unumber) main::toD0181_$3 in (number~) main::toD0181_$3 ← > (unumber~) main::toD0181_$2 +Adding number conversion cast (unumber) 4 in (number~) main::toD0181_$6 ← (byte~) main::toD0181_$5 / (number) 4 +Adding number conversion cast (unumber) main::toD0181_$6 in (number~) main::toD0181_$6 ← (byte~) main::toD0181_$5 / (unumber)(number) 4 +Adding number conversion cast (unumber) $f in (number~) main::toD0181_$7 ← (unumber~) main::toD0181_$6 & (number) $f +Adding number conversion cast (unumber) main::toD0181_$7 in (number~) main::toD0181_$7 ← (unumber~) main::toD0181_$6 & (unumber)(number) $f +Adding number conversion cast (unumber) main::toD0181_$8 in (number~) main::toD0181_$8 ← (unumber~) main::toD0181_$3 | (unumber~) main::toD0181_$7 +Adding number conversion cast (unumber) $400 in (word) memset::num#0 ← (number) $400 +Adding number conversion cast (unumber) $3e7 in *((const byte*) SCREEN+(number) $3e7) ← ++ *((const byte*) SCREEN+(number) $3e7) +Adding number conversion cast (unumber) $50 in (number~) show::$1 ← (word~) show::$0 * (number) $50 +Adding number conversion cast (unumber) show::$1 in (number~) show::$1 ← (word~) show::$0 * (unumber)(number) $50 +Adding number conversion cast (unumber) 2 in (number~) show::$3 ← (byte) show::x#1 * (number) 2 +Adding number conversion cast (unumber) show::$3 in (number~) show::$3 ← (byte) show::x#1 * (unumber)(number) 2 +Adding number conversion cast (unumber) 0 in *((byte*) show::ptr#0 + (number) 0) ← *((byte*) show::font_mapping#1 + (byte) show::c#1) +Adding number conversion cast (unumber) $40 in (number~) show::$5 ← (byte) show::c#1 + (number) $40 +Adding number conversion cast (unumber) show::$5 in (number~) show::$5 ← (byte) show::c#1 + (unumber)(number) $40 +Adding number conversion cast (unumber) 1 in *((byte*) show::ptr#0 + (number) 1) ← *((byte*) show::font_mapping#1 + (unumber~) show::$5) +Adding number conversion cast (unumber) $80 in (number~) show::$6 ← (byte) show::c#1 + (number) $80 +Adding number conversion cast (unumber) show::$6 in (number~) show::$6 ← (byte) show::c#1 + (unumber)(number) $80 +Adding number conversion cast (unumber) $28 in *((byte*) show::ptr#0 + (number) $28) ← *((byte*) show::font_mapping#1 + (unumber~) show::$6) +Adding number conversion cast (unumber) $c0 in (number~) show::$7 ← (byte) show::c#1 + (number) $c0 +Adding number conversion cast (unumber) show::$7 in (number~) show::$7 ← (byte) show::c#1 + (unumber)(number) $c0 +Adding number conversion cast (unumber) $29 in *((byte*) show::ptr#0 + (number) $29) ← *((byte*) show::font_mapping#1 + (unumber~) show::$7) +Adding number conversion cast (unumber) $40*8 in (byte*~) font_2x2::$0 ← (byte*) font_2x2::next_2x2#2 + (number) $40*(number) 8 +Adding number conversion cast (unumber) $80 in (number~) font_2x2::$1 ← (byte) font_2x2::glyph_bits#2 & (number) $80 +Adding number conversion cast (unumber) font_2x2::$1 in (number~) font_2x2::$1 ← (byte) font_2x2::glyph_bits#2 & (unumber)(number) $80 +Adding number conversion cast (unumber) 0 in (bool~) font_2x2::$22 ← (number) 0 != (unumber~) font_2x2::$1 +Adding number conversion cast (unumber) 1 in (word~) font_2x2::$5 ← (word) font_2x2::glyph_bits_2x2#3 << (number) 1 +Adding number conversion cast (unumber) 1 in (word~) font_2x2::$7 ← (word) font_2x2::glyph_bits_2x2#1 << (number) 1 +Adding number conversion cast (unumber) 1 in (byte) font_2x2::glyph_bits#1 ← (byte) font_2x2::glyph_bits#3 << (number) 1 +Adding number conversion cast (unumber) 1 in (number~) font_2x2::$11 ← (byte) font_2x2::l2#3 + (number) 1 +Adding number conversion cast (unumber) font_2x2::$11 in (number~) font_2x2::$11 ← (byte) font_2x2::l2#3 + (unumber)(number) 1 +Adding number conversion cast (unumber) 1 in (number~) font_2x2::$14 ← (byte) font_2x2::l2#3 + (number) 1 +Adding number conversion cast (unumber) font_2x2::$14 in (number~) font_2x2::$14 ← (byte) font_2x2::l2#3 + (unumber)(number) 1 +Adding number conversion cast (unumber) 2 in (byte) font_2x2::l2#1 ← (byte) font_2x2::l2#3 + (number) 2 +Adding number conversion cast (unumber) 8 in (bool~) font_2x2::$16 ← (byte) font_2x2::l2#1 == (number) 8 +Adding number conversion cast (unumber) $80*8 in (byte*~) font_2x2::$18 ← (byte*) font_2x2::next_2x2#3 + (number) $80*(number) 8 +Adding number conversion cast (unumber) $c0*8 in (byte*~) font_2x2::$19 ← (byte*) font_2x2::next_2x2#3 + (number) $c0*(number) 8 +Adding number conversion cast (unumber) 0 in (byte) font_2x2::l2#2 ← (number) 0 +Adding number conversion cast (unumber) 8 in (byte*) font_2x2::next_2x2#1 ← (byte*) font_2x2::next_2x2#4 + (number) 8 +Adding number conversion cast (unumber) 8 in (byte*) font_2x2::next_original#1 ← (byte*) font_2x2::next_original#3 + (number) 8 +Adding number conversion cast (unumber) $ff in (bool~) font_compress::$1 ← (byte) font_compress::found#0 == (number) $ff +Adding number conversion cast (unumber) 8 in (byte*) font_compress::next_original#1 ← (byte*) font_compress::next_original#3 + (number) 8 +Adding number conversion cast (unumber) 8 in (byte*) font_compress::next_compressed#1 ← (byte*) font_compress::next_compressed#3 + (number) 8 +Adding number conversion cast (unumber) $ff in (byte) font_find::return#1 ← (number) $ff +Adding number conversion cast (unumber) 0 in (byte) font_find::found#1 ← (number) 0 +Adding number conversion cast (unumber) 0 in (bool~) font_find::$5 ← (number) 0 != (byte) font_find::found#2 +Adding number conversion cast (unumber) 8 in (byte*) font_find::font#1 ← (byte*) font_find::font#3 + (number) 8 +Successful SSA optimization PassNAddNumberTypeConversions +Inlining cast (byte*~) memset::$2 ← (byte*)(void*) memset::str#2 +Inlining cast (byte*) memset::dst#0 ← (byte*)(void*) memset::str#2 +Inlining cast (word~) main::toD0181_$0 ← (word)(byte*) main::toD0181_screen#1 +Inlining cast (word~) main::toD0181_$4 ← (word)(byte*) main::toD0181_gfx#1 +Inlining cast (word) memset::num#0 ← (unumber)(number) $400 +Inlining cast (word~) show::$0 ← (word)(byte) show::y#1 +Inlining cast (byte) font_2x2::l2#2 ← (unumber)(number) 0 +Inlining cast (byte) font_find::return#1 ← (unumber)(number) $ff +Inlining cast (byte) font_find::found#1 ← (unumber)(number) 0 +Successful SSA optimization Pass2InlineCast +Simplifying constant pointer cast (byte*) 1 +Simplifying constant pointer cast (byte*) 53248 +Simplifying constant pointer cast (byte*) 53272 +Simplifying constant pointer cast (byte*) 1024 +Simplifying constant pointer cast (byte*) 8192 +Simplifying constant pointer cast (byte*) 10240 +Simplifying constant integer cast 0 +Simplifying constant integer cast $3fff +Simplifying constant integer cast 4 +Simplifying constant integer cast 4 +Simplifying constant integer cast $f +Simplifying constant integer cast $400 +Simplifying constant integer cast $3e7 +Simplifying constant integer cast $50 +Simplifying constant integer cast 2 +Simplifying constant integer cast 0 +Simplifying constant integer cast $40 +Simplifying constant integer cast 1 +Simplifying constant integer cast $80 +Simplifying constant integer cast $28 +Simplifying constant integer cast $c0 +Simplifying constant integer cast $29 +Simplifying constant integer cast $80 +Simplifying constant integer cast 0 +Simplifying constant integer cast 1 +Simplifying constant integer cast 1 +Simplifying constant integer cast 1 +Simplifying constant integer cast 1 +Simplifying constant integer cast 1 +Simplifying constant integer cast 2 +Simplifying constant integer cast 8 +Simplifying constant integer cast 0 +Simplifying constant integer cast 8 +Simplifying constant integer cast 8 +Simplifying constant integer cast $ff +Simplifying constant integer cast 8 +Simplifying constant integer cast 8 +Simplifying constant integer cast $ff +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 8 +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (word) $3fff +Finalized unsigned number type (byte) 4 +Finalized unsigned number type (byte) 4 +Finalized unsigned number type (byte) $f +Finalized unsigned number type (word) $400 +Finalized unsigned number type (word) $3e7 +Finalized unsigned number type (byte) $50 +Finalized unsigned number type (byte) 2 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) $40 +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) $80 +Finalized unsigned number type (byte) $28 +Finalized unsigned number type (byte) $c0 +Finalized unsigned number type (byte) $29 +Finalized unsigned number type (byte) $80 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) 2 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) $ff +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) $ff +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 8 +Successful SSA optimization PassNFinalizeNumberTypeConversions +Inferred type updated to word in (unumber~) main::toD0181_$1 ← (word~) main::toD0181_$0 & (word) $3fff +Inferred type updated to word in (unumber~) main::toD0181_$2 ← (word~) main::toD0181_$1 * (byte) 4 +Inferred type updated to byte in (unumber~) main::toD0181_$3 ← > (word~) main::toD0181_$2 +Inferred type updated to byte in (unumber~) main::toD0181_$6 ← (byte~) main::toD0181_$5 / (byte) 4 +Inferred type updated to byte in (unumber~) main::toD0181_$7 ← (byte~) main::toD0181_$6 & (byte) $f +Inferred type updated to byte in (unumber~) main::toD0181_$8 ← (byte~) main::toD0181_$3 | (byte~) main::toD0181_$7 +Inferred type updated to word in (unumber~) show::$1 ← (word~) show::$0 * (byte) $50 +Inferred type updated to byte in (unumber~) show::$3 ← (byte) show::x#1 * (byte) 2 +Inferred type updated to byte in (unumber~) show::$5 ← (byte) show::c#1 + (byte) $40 +Inferred type updated to byte in (unumber~) show::$6 ← (byte) show::c#1 + (byte) $80 +Inferred type updated to byte in (unumber~) show::$7 ← (byte) show::c#1 + (byte) $c0 +Inferred type updated to byte in (unumber~) font_2x2::$1 ← (byte) font_2x2::glyph_bits#2 & (byte) $80 +Inferred type updated to byte in (unumber~) font_2x2::$11 ← (byte) font_2x2::l2#3 + (byte) 1 +Inferred type updated to byte in (unumber~) font_2x2::$14 ← (byte) font_2x2::l2#3 + (byte) 1 +Inversing boolean not [2] (bool~) memset::$1 ← (word) memset::num#1 <= (byte) 0 from [1] (bool~) memset::$0 ← (word) memset::num#1 > (byte) 0 +Inversing boolean not [139] (bool~) font_2x2::$17 ← (byte) font_2x2::l2#1 != (byte) 8 from [138] (bool~) font_2x2::$16 ← (byte) font_2x2::l2#1 == (byte) 8 +Inversing boolean not [173] (bool~) font_compress::$2 ← (byte) font_compress::found#0 != (byte) $ff from [172] (bool~) font_compress::$1 ← (byte) font_compress::found#0 == (byte) $ff +Inversing boolean not [208] (bool~) font_find::$2 ← *((byte*) font_find::glyph#1 + (byte) font_find::l#2) == *((byte*) font_find::font#2 + (byte) font_find::l#2) from [207] (bool~) font_find::$1 ← *((byte*) font_find::glyph#1 + (byte) font_find::l#2) != *((byte*) font_find::font#2 + (byte) font_find::l#2) +Inversing boolean not [218] (bool~) font_find::$4 ← (byte) 0 == (byte) font_find::found#2 from [217] (bool~) font_find::$5 ← (byte) 0 != (byte) font_find::found#2 +Successful SSA optimization Pass2UnaryNotSimplification +Alias memset::return#0 = memset::str#1 memset::return#3 memset::return#1 +Alias memset::str#2 = memset::str#3 +Alias memset::num#1 = memset::num#2 +Alias memset::c#3 = memset::c#4 +Alias memset::end#0 = memset::$3 +Alias memset::c#1 = memset::c#2 +Alias memset::dst#2 = memset::dst#3 +Alias memset::end#1 = memset::end#2 +Alias memset::str#4 = memset::str#5 +Alias main::toD0181_screen#0 = main::toD0181_screen#1 +Alias main::toD0181_gfx#0 = main::toD0181_gfx#1 +Alias main::toD0181_return#0 = main::toD0181_$8 main::toD0181_return#2 main::toD0181_return#1 main::toD0181_return#3 main::$2 +Alias main::c#2 = main::c#3 +Alias main::x#2 = main::x#3 +Alias main::y#2 = main::y#5 main::y#3 +Alias main::c#1 = main::c#5 +Alias show::ptr#0 = show::$4 +Alias font_2x2::next_original#0 = font_2x2::font_original#1 +Alias font_2x2::next_2x2#0 = font_2x2::font_2x2#1 +Alias font_2x2::next_2x2_left#0 = font_2x2::next_2x2#2 +Alias font_2x2::next_2x2_right#0 = font_2x2::$0 +Alias font_2x2::glyph_bits_2x2#5 = font_2x2::glyph_bits_2x2#7 font_2x2::glyph_bits_2x2#6 +Alias font_2x2::glyph_bits#2 = font_2x2::glyph_bits#4 font_2x2::glyph_bits#5 +Alias font_2x2::b#3 = font_2x2::b#5 font_2x2::b#4 +Alias font_2x2::next_2x2_left#4 = font_2x2::next_2x2_left#6 font_2x2::next_2x2_left#5 +Alias font_2x2::l2#5 = font_2x2::l2#7 font_2x2::l2#6 +Alias font_2x2::next_2x2_right#4 = font_2x2::next_2x2_right#6 font_2x2::next_2x2_right#5 +Alias font_2x2::l#7 = font_2x2::l#9 font_2x2::l#8 +Alias font_2x2::next_2x2#10 = font_2x2::next_2x2#8 font_2x2::next_2x2#9 +Alias font_2x2::next_original#10 = font_2x2::next_original#9 font_2x2::next_original#11 +Alias font_2x2::c#7 = font_2x2::c#9 font_2x2::c#8 +Alias font_2x2::glyph_bit#0 = font_2x2::$4 +Alias font_2x2::glyph_bits_2x2#1 = font_2x2::$6 +Alias font_2x2::glyph_bits_2x2#2 = font_2x2::$8 font_2x2::glyph_bits_2x2#4 +Alias font_2x2::next_2x2_left#2 = font_2x2::next_2x2_left#3 +Alias font_2x2::l2#3 = font_2x2::l2#4 +Alias font_2x2::next_2x2_right#2 = font_2x2::next_2x2_right#3 +Alias font_2x2::l#4 = font_2x2::l#5 font_2x2::l#6 +Alias font_2x2::next_2x2#3 = font_2x2::next_2x2#5 font_2x2::next_2x2#7 +Alias font_2x2::next_original#6 = font_2x2::next_original#7 font_2x2::next_original#8 +Alias font_2x2::c#4 = font_2x2::c#5 font_2x2::c#6 +Alias font_2x2::next_2x2_left#1 = font_2x2::$18 +Alias font_2x2::next_2x2_right#1 = font_2x2::$19 +Alias font_2x2::next_2x2#4 = font_2x2::next_2x2#6 +Alias font_2x2::next_original#3 = font_2x2::next_original#5 +Alias font_2x2::c#2 = font_2x2::c#3 +Alias font_compress::next_original#0 = font_compress::font_original#1 +Alias font_compress::next_compressed#0 = font_compress::font_compressed#1 +Alias font_find::return#0 = font_find::return#4 +Alias font_compress::compress_mapping#3 = font_compress::compress_mapping#4 font_compress::compress_mapping#7 +Alias font_compress::i#4 = font_compress::i#5 font_compress::i#7 +Alias font_compress::next_original#2 = font_compress::next_original#6 font_compress::next_original#7 +Alias font_compress::font_compressed#2 = font_compress::font_compressed#5 font_compress::font_compressed#7 +Alias font_compress::font_size#2 = font_compress::font_size#7 font_compress::font_size#8 +Alias font_compress::next_compressed#4 = font_compress::next_compressed#5 font_compress::next_compressed#6 +Alias font_compress::found#0 = font_compress::$0 +Alias font_compress::next_compressed#2 = font_compress::next_compressed#3 +Alias font_compress::font_size#3 = font_compress::font_size#6 font_compress::found#1 +Alias font_compress::compress_mapping#2 = font_compress::compress_mapping#5 +Alias font_compress::i#3 = font_compress::i#6 +Alias font_compress::next_original#4 = font_compress::next_original#5 +Alias font_compress::font_compressed#4 = font_compress::font_compressed#6 +Alias font_compress::return#1 = font_compress::font_size#4 font_compress::font_size#5 font_compress::return#3 font_compress::return#2 +Alias font_find::glyph#2 = font_find::glyph#4 +Alias font_find::font#4 = font_find::font#7 +Alias font_find::i#2 = font_find::i#9 +Alias font_find::font_size#1 = font_find::font_size#8 +Alias font_find::l#2 = font_find::l#3 +Alias font_find::glyph#1 = font_find::glyph#3 font_find::glyph#8 +Alias font_find::font#2 = font_find::font#5 font_find::font#8 +Alias font_find::found#3 = font_find::found#4 +Alias font_find::i#6 = font_find::i#8 font_find::i#7 +Alias font_find::font_size#5 = font_find::font_size#7 font_find::font_size#6 +Alias font_find::font#3 = font_find::font#6 +Alias font_find::i#3 = font_find::i#5 font_find::i#4 font_find::return#2 +Alias font_find::font_size#3 = font_find::font_size#4 +Alias font_find::glyph#6 = font_find::glyph#7 +Alias font_find::return#3 = font_find::return#5 +Successful SSA optimization Pass2AliasElimination +Alias font_2x2::glyph_bits_2x2#3 = font_2x2::glyph_bits_2x2#5 +Alias font_2x2::glyph_bits#2 = font_2x2::glyph_bits#3 +Alias font_2x2::b#2 = font_2x2::b#3 +Alias font_2x2::next_2x2_left#2 = font_2x2::next_2x2_left#4 +Alias font_2x2::l2#3 = font_2x2::l2#5 +Alias font_2x2::next_2x2_right#2 = font_2x2::next_2x2_right#4 +Alias font_2x2::l#3 = font_2x2::l#4 font_2x2::l#7 +Alias font_2x2::next_2x2#10 = font_2x2::next_2x2#3 font_2x2::next_2x2#4 +Alias font_2x2::next_original#10 = font_2x2::next_original#6 font_2x2::next_original#3 +Alias font_2x2::c#2 = font_2x2::c#4 font_2x2::c#7 +Alias font_find::font#2 = font_find::font#3 +Alias font_find::i#3 = font_find::i#6 +Alias font_find::font_size#3 = font_find::font_size#5 +Alias font_find::glyph#1 = font_find::glyph#6 +Successful SSA optimization Pass2AliasElimination +Identical Phi Values (word) memset::num#1 (word) memset::num#0 +Identical Phi Values (void*) memset::str#2 (void*) memset::str#0 +Identical Phi Values (byte) memset::c#3 (byte) memset::c#0 +Identical Phi Values (byte*) memset::end#1 (byte*) memset::end#0 +Identical Phi Values (void*) memset::str#4 (void*) memset::str#2 +Identical Phi Values (byte) memset::c#1 (byte) memset::c#3 +Identical Phi Values (byte) main::y#2 (byte) main::y#4 +Identical Phi Values (byte) show::y#1 (byte) show::y#0 +Identical Phi Values (byte) show::x#1 (byte) show::x#0 +Identical Phi Values (byte*) show::font_mapping#1 (byte*) show::font_mapping#0 +Identical Phi Values (byte) show::c#1 (byte) show::c#0 +Identical Phi Values (byte*) font_2x2::next_original#0 (byte*) font_2x2::font_original#0 +Identical Phi Values (byte*) font_2x2::next_2x2#0 (byte*) font_2x2::font_2x2#0 +Identical Phi Values (byte*) font_2x2::next_2x2_left#2 (byte*) font_2x2::next_2x2_left#7 +Identical Phi Values (byte) font_2x2::l2#3 (byte) font_2x2::l2#8 +Identical Phi Values (byte*) font_2x2::next_2x2_right#2 (byte*) font_2x2::next_2x2_right#7 +Identical Phi Values (byte) font_2x2::l#3 (byte) font_2x2::l#2 +Identical Phi Values (byte*) font_2x2::next_2x2#10 (byte*) font_2x2::next_2x2#11 +Identical Phi Values (byte*) font_2x2::next_original#10 (byte*) font_2x2::next_original#2 +Identical Phi Values (byte) font_2x2::c#2 (byte) font_2x2::c#10 +Identical Phi Values (byte*) font_compress::next_original#0 (byte*) font_compress::font_original#0 +Identical Phi Values (byte*) font_compress::next_compressed#0 (byte*) font_compress::font_compressed#0 +Identical Phi Values (byte*) font_compress::compress_mapping#6 (byte*) font_compress::compress_mapping#0 +Identical Phi Values (byte*) font_compress::next_original#4 (byte*) font_compress::next_original#2 +Identical Phi Values (byte*) font_compress::next_compressed#2 (byte*) font_compress::next_compressed#4 +Identical Phi Values (byte) font_compress::font_size#3 (byte) font_compress::font_size#2 +Identical Phi Values (byte*) font_compress::compress_mapping#2 (byte*) font_compress::compress_mapping#3 +Identical Phi Values (byte) font_compress::i#3 (byte) font_compress::i#4 +Identical Phi Values (byte*) font_compress::font_compressed#4 (byte*) font_compress::font_compressed#2 +Identical Phi Values (byte) font_find::font_size#2 (byte) font_find::font_size#0 +Identical Phi Values (byte*) font_find::glyph#5 (byte*) font_find::glyph#0 +Identical Phi Values (byte*) font_find::font#9 (byte*) font_find::font#0 +Identical Phi Values (byte*) font_find::glyph#1 (byte*) font_find::glyph#2 +Identical Phi Values (byte*) font_find::font#2 (byte*) font_find::font#4 +Identical Phi Values (byte) font_find::found#3 (byte) font_find::found#0 +Identical Phi Values (byte) font_find::i#3 (byte) font_find::i#2 +Identical Phi Values (byte) font_find::font_size#3 (byte) font_find::font_size#1 +Successful SSA optimization Pass2IdenticalPhiElimination +Identical Phi Values (void*) memset::return#0 (void*) memset::str#0 +Identical Phi Values (byte*) font_2x2::next_original#2 (byte*) font_2x2::next_original#4 +Identical Phi Values (byte*) font_2x2::next_2x2#11 (byte*) font_2x2::next_2x2_left#0 +Identical Phi Values (byte) font_2x2::c#10 (byte) font_2x2::c#11 +Identical Phi Values (byte*) font_compress::compress_mapping#1 (byte*) font_compress::compress_mapping#3 +Identical Phi Values (byte) font_compress::i#2 (byte) font_compress::i#4 +Identical Phi Values (byte*) font_compress::next_original#3 (byte*) font_compress::next_original#2 +Identical Phi Values (byte*) font_compress::font_compressed#3 (byte*) font_compress::font_compressed#2 +Identical Phi Values (byte) font_find::font_size#1 (byte) font_find::font_size#0 +Identical Phi Values (byte*) font_find::glyph#2 (byte*) font_find::glyph#0 +Successful SSA optimization Pass2IdenticalPhiElimination +Identical Phi Values (byte*) font_compress::font_compressed#2 (byte*) font_compress::font_compressed#0 +Identical Phi Values (byte*) font_compress::compress_mapping#3 (byte*) font_compress::compress_mapping#0 +Successful SSA optimization Pass2IdenticalPhiElimination +Identified duplicate assignment right side [130] (byte~) font_2x2::$12 ← > (word) font_2x2::glyph_bits_2x2#2 +Identified duplicate assignment right side [135] (byte~) font_2x2::$15 ← < (word) font_2x2::glyph_bits_2x2#2 +Successful SSA optimization Pass2DuplicateRValueIdentification +Simple Condition (bool~) memset::$1 [2] if((word) memset::num#0<=(byte) 0) goto memset::@1 +Simple Condition (bool~) memset::$4 [9] if((byte*) memset::dst#2!=(byte*) memset::end#0) goto memset::@5 +Simple Condition (bool~) main::$5 [55] if((byte) main::x#1!=rangelast(0,7)) goto main::@2 +Simple Condition (bool~) main::$6 [58] if((byte) main::y#1!=rangelast(0,7)) goto main::@1 +Simple Condition (bool~) font_2x2::$22 [89] if((byte) 0!=(byte~) font_2x2::$1) goto font_2x2::@4 +Simple Condition (bool~) font_2x2::$9 [100] if((byte) font_2x2::b#1!=rangelast(0,7)) goto font_2x2::@3 +Simple Condition (bool~) font_2x2::$17 [113] if((byte) font_2x2::l2#1!=(byte) 8) goto font_2x2::@11 +Simple Condition (bool~) font_2x2::$20 [117] if((byte) font_2x2::l#1!=rangelast(0,7)) goto font_2x2::@2 +Simple Condition (bool~) font_2x2::$21 [125] if((byte) font_2x2::c#1!=rangelast(0,$3f)) goto font_2x2::@1 +Simple Condition (bool~) font_compress::$2 [138] if((byte) font_compress::found#0!=(byte) $ff) goto font_compress::@2 +Simple Condition (bool~) font_compress::$4 [144] if((byte) font_compress::i#1!=rangelast(0,$ff)) goto font_compress::@1 +Simple Condition (bool~) font_compress::$3 [150] if((byte) font_compress::l#1!=rangelast(0,7)) goto font_compress::@3 +Simple Condition (bool~) font_find::$0 [158] if((byte) font_find::i#2<(byte) font_find::font_size#0) goto font_find::@2 +Simple Condition (bool~) font_find::$2 [164] if(*((byte*) font_find::glyph#0 + (byte) font_find::l#2)==*((byte*) font_find::font#4 + (byte) font_find::l#2)) goto font_find::@5 +Simple Condition (bool~) font_find::$3 [167] if((byte) font_find::l#1!=rangelast(0,7)) goto font_find::@4 +Simple Condition (bool~) font_find::$4 [171] if((byte) 0==(byte) font_find::found#2) goto font_find::@12 +Successful SSA optimization Pass2ConditionalJumpSimplification +Constant (const byte*) font_2x2::font_original#0 = CHARGEN +Constant (const byte*) font_2x2::font_2x2#0 = FONT_ORIGINAL +Constant (const byte*) font_compress::font_original#0 = FONT_ORIGINAL +Constant (const byte*) font_compress::font_compressed#0 = FONT_COMPRESSED +Constant (const byte*) font_compress::compress_mapping#0 = FONT_COMPRESSED_MAP +Constant (const byte*) main::toD0181_screen#0 = SCREEN +Constant (const byte*) main::toD0181_gfx#0 = FONT_COMPRESSED +Constant (const void*) memset::str#0 = (void*)SCREEN +Constant (const word) memset::num#0 = $400 +Constant (const byte) main::c#0 = 0 +Constant (const byte) main::y#0 = 0 +Constant (const byte) main::x#0 = 0 +Constant (const byte*) show::font_mapping#0 = FONT_COMPRESSED_MAP +Constant (const byte) font_2x2::c#0 = 0 +Constant (const byte) font_2x2::l2#0 = 0 +Constant (const byte) font_2x2::l#0 = 0 +Constant (const word) font_2x2::glyph_bits_2x2#0 = 0 +Constant (const byte) font_2x2::b#0 = 0 +Constant (const byte) font_2x2::$3 = 1 +Constant (const byte) font_2x2::$2 = 0 +Constant (const byte) font_2x2::l2#2 = 0 +Constant (const byte) font_compress::font_size#0 = 0 +Constant (const byte) font_compress::i#0 = 0 +Constant (const byte) font_compress::l#0 = 0 +Constant (const byte) font_find::i#0 = 0 +Constant (const byte) font_find::found#0 = 1 +Constant (const byte) font_find::l#0 = 0 +Constant (const byte) font_find::return#1 = $ff +Constant (const byte) font_find::found#1 = 0 +Successful SSA optimization Pass2ConstantIdentification +Constant (const byte*) memset::$2 = (byte*)memset::str#0 +Constant (const byte*) memset::dst#0 = (byte*)memset::str#0 +Constant (const word) main::toD0181_$0 = (word)main::toD0181_screen#0 +Constant (const word) main::toD0181_$4 = (word)main::toD0181_gfx#0 +Constant (const void*) memset::return#2 = memset::str#0 +Constant (const byte*) font_find::font#0 = font_compress::font_compressed#0 +Successful SSA optimization Pass2ConstantIdentification +if() condition always false - eliminating [2] if((const word) memset::num#0<=(byte) 0) goto memset::@1 +if() condition always true - replacing block destination [59] if(true) goto main::@6 +Successful SSA optimization Pass2ConstantIfs +Resolved ranged next value [53] main::x#1 ← ++ main::x#2 to ++ +Resolved ranged comparison value [55] if(main::x#1!=rangelast(0,7)) goto main::@2 to (number) 8 +Resolved ranged next value [56] main::y#1 ← ++ main::y#4 to ++ +Resolved ranged comparison value [58] if(main::y#1!=rangelast(0,7)) goto main::@1 to (number) 8 +Resolved ranged next value [98] font_2x2::b#1 ← ++ font_2x2::b#2 to ++ +Resolved ranged comparison value [100] if(font_2x2::b#1!=rangelast(0,7)) goto font_2x2::@3 to (number) 8 +Resolved ranged next value [115] font_2x2::l#1 ← ++ font_2x2::l#2 to ++ +Resolved ranged comparison value [117] if(font_2x2::l#1!=rangelast(0,7)) goto font_2x2::@2 to (number) 8 +Resolved ranged next value [123] font_2x2::c#1 ← ++ font_2x2::c#11 to ++ +Resolved ranged comparison value [125] if(font_2x2::c#1!=rangelast(0,$3f)) goto font_2x2::@1 to (number) $40 +Resolved ranged next value [142] font_compress::i#1 ← ++ font_compress::i#4 to ++ +Resolved ranged comparison value [144] if(font_compress::i#1!=rangelast(0,$ff)) goto font_compress::@1 to (number) 0 +Resolved ranged next value [148] font_compress::l#1 ← ++ font_compress::l#2 to ++ +Resolved ranged comparison value [150] if(font_compress::l#1!=rangelast(0,7)) goto font_compress::@3 to (number) 8 +Resolved ranged next value [165] font_find::l#1 ← ++ font_find::l#2 to ++ +Resolved ranged comparison value [167] if(font_find::l#1!=rangelast(0,7)) goto font_find::@4 to (number) 8 +Simplifying expression containing zero show::ptr#0 in [68] *((byte*) show::ptr#0 + (byte) 0) ← *((const byte*) show::font_mapping#0 + (byte) show::c#0) +Successful SSA optimization PassNSimplifyExpressionWithZero +Eliminating unused variable (byte) font_compress::return#0 and assignment [12] (byte) font_compress::return#0 ← (byte) font_compress::return#1 +Eliminating unused constant (const void*) memset::return#2 +Successful SSA optimization PassNEliminateUnusedVars +Removing unused block main::@return +Successful SSA optimization Pass2EliminateUnusedBlocks +Adding number conversion cast (unumber) 8 in if((byte) main::x#1!=(number) 8) goto main::@2 +Adding number conversion cast (unumber) 8 in if((byte) main::y#1!=(number) 8) goto main::@1 +Adding number conversion cast (unumber) 8 in if((byte) font_2x2::b#1!=(number) 8) goto font_2x2::@3 +Adding number conversion cast (unumber) 8 in if((byte) font_2x2::l#1!=(number) 8) goto font_2x2::@2 +Adding number conversion cast (unumber) $40 in if((byte) font_2x2::c#1!=(number) $40) goto font_2x2::@1 +Adding number conversion cast (unumber) 0 in if((byte) font_compress::i#1!=(number) 0) goto font_compress::@1 +Adding number conversion cast (unumber) 8 in if((byte) font_compress::l#1!=(number) 8) goto font_compress::@3 +Adding number conversion cast (unumber) 8 in if((byte) font_find::l#1!=(number) 8) goto font_find::@4 +Successful SSA optimization PassNAddNumberTypeConversions +Simplifying constant integer cast 8 +Simplifying constant integer cast 8 +Simplifying constant integer cast 8 +Simplifying constant integer cast 8 +Simplifying constant integer cast $40 +Simplifying constant integer cast 0 +Simplifying constant integer cast 8 +Simplifying constant integer cast 8 +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) 8 +Finalized unsigned number type (byte) $40 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) 8 +Successful SSA optimization PassNFinalizeNumberTypeConversions +Alias font_2x2::$12 = font_2x2::$10 +Alias font_2x2::$15 = font_2x2::$13 +Successful SSA optimization Pass2AliasElimination +Constant right-side identified [0] (byte*) memset::end#0 ← (const byte*) memset::$2 + (const word) memset::num#0 +Constant right-side identified [12] (word~) main::toD0181_$1 ← (const word) main::toD0181_$0 & (word) $3fff +Constant right-side identified [15] (byte~) main::toD0181_$5 ← > (const word) main::toD0181_$4 +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant (const byte*) memset::end#0 = memset::$2+memset::num#0 +Constant (const word) main::toD0181_$1 = main::toD0181_$0&$3fff +Constant (const byte) main::toD0181_$5 = >main::toD0181_$4 +Successful SSA optimization Pass2ConstantIdentification +Constant right-side identified [11] (word~) main::toD0181_$2 ← (const word) main::toD0181_$1 * (byte) 4 +Constant right-side identified [13] (byte~) main::toD0181_$6 ← (const byte) main::toD0181_$5 / (byte) 4 +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant (const word) main::toD0181_$2 = main::toD0181_$1*4 +Constant (const byte) main::toD0181_$6 = main::toD0181_$5/4 +Successful SSA optimization Pass2ConstantIdentification +Constant right-side identified [11] (byte~) main::toD0181_$3 ← > (const word) main::toD0181_$2 +Constant right-side identified [12] (byte~) main::toD0181_$7 ← (const byte) main::toD0181_$6 & (byte) $f +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant (const byte) main::toD0181_$3 = >main::toD0181_$2 +Constant (const byte) main::toD0181_$7 = main::toD0181_$6&$f +Successful SSA optimization Pass2ConstantIdentification +Constant right-side identified [11] (byte) main::toD0181_return#0 ← (const byte) main::toD0181_$3 | (const byte) main::toD0181_$7 +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant (const byte) main::toD0181_return#0 = main::toD0181_$3|main::toD0181_$7 +Successful SSA optimization Pass2ConstantIdentification +Rewriting multiplication to use shift and addition[27] (word~) show::$1 ← (word~) show::$0 * (byte) $50 +Rewriting multiplication to use shift [29] (byte~) show::$3 ← (byte) show::x#0 * (byte) 2 +Successful SSA optimization Pass2MultiplyToShiftRewriting +Inlining constant with var siblings (const byte*) memset::dst#0 +Inlining constant with var siblings (const byte) main::c#0 +Inlining constant with var siblings (const byte) main::y#0 +Inlining constant with var siblings (const byte) main::x#0 +Inlining constant with var siblings (const byte) font_2x2::c#0 +Inlining constant with var siblings (const byte) font_2x2::l2#0 +Inlining constant with var siblings (const byte) font_2x2::l#0 +Inlining constant with var siblings (const word) font_2x2::glyph_bits_2x2#0 +Inlining constant with var siblings (const byte) font_2x2::b#0 +Inlining constant with var siblings (const byte) font_2x2::l2#2 +Inlining constant with var siblings (const byte) font_compress::font_size#0 +Inlining constant with var siblings (const byte) font_compress::i#0 +Inlining constant with var siblings (const byte) font_compress::l#0 +Inlining constant with var siblings (const byte) font_find::i#0 +Inlining constant with var siblings (const byte) font_find::found#0 +Inlining constant with var siblings (const byte) font_find::l#0 +Inlining constant with var siblings (const byte) font_find::return#1 +Inlining constant with var siblings (const byte) font_find::found#1 +Inlining constant with var siblings (const byte*) font_find::font#0 +Constant inlined main::toD0181_screen#0 = (const byte*) SCREEN +Constant inlined main::toD0181_gfx#0 = (const byte*) FONT_COMPRESSED +Constant inlined font_find::return#1 = (byte) $ff +Constant inlined font_compress::compress_mapping#0 = (const byte*) FONT_COMPRESSED_MAP +Constant inlined font_2x2::glyph_bits_2x2#0 = (word) 0 +Constant inlined font_2x2::l2#0 = (byte) 0 +Constant inlined font_2x2::font_2x2#0 = (const byte*) FONT_ORIGINAL +Constant inlined memset::$2 = (byte*)(const void*) memset::str#0 +Constant inlined main::c#0 = (byte) 0 +Constant inlined font_2x2::l2#2 = (byte) 0 +Constant inlined font_compress::font_compressed#0 = (const byte*) FONT_COMPRESSED +Constant inlined show::font_mapping#0 = (const byte*) FONT_COMPRESSED_MAP +Constant inlined font_find::font#0 = (const byte*) FONT_COMPRESSED +Constant inlined font_2x2::$2 = (byte) 0 +Constant inlined font_2x2::$3 = (byte) 1 +Constant inlined font_2x2::b#0 = (byte) 0 +Constant inlined font_find::found#0 = (byte) 1 +Constant inlined main::toD0181_$7 = >(word)(const byte*) FONT_COMPRESSED/(byte) 4&(byte) $f +Constant inlined font_find::found#1 = (byte) 0 +Constant inlined font_2x2::c#0 = (byte) 0 +Constant inlined main::toD0181_$2 = (word)(const byte*) SCREEN&(word) $3fff*(byte) 4 +Constant inlined main::toD0181_$1 = (word)(const byte*) SCREEN&(word) $3fff +Constant inlined font_find::i#0 = (byte) 0 +Constant inlined main::toD0181_$0 = (word)(const byte*) SCREEN +Constant inlined main::x#0 = (byte) 0 +Constant inlined font_compress::font_size#0 = (byte) 0 +Constant inlined main::y#0 = (byte) 0 +Constant inlined main::toD0181_$6 = >(word)(const byte*) FONT_COMPRESSED/(byte) 4 +Constant inlined main::toD0181_$5 = >(word)(const byte*) FONT_COMPRESSED +Constant inlined font_compress::i#0 = (byte) 0 +Constant inlined main::toD0181_$4 = (word)(const byte*) FONT_COMPRESSED +Constant inlined font_compress::l#0 = (byte) 0 +Constant inlined main::toD0181_$3 = >(word)(const byte*) SCREEN&(word) $3fff*(byte) 4 +Constant inlined font_2x2::l#0 = (byte) 0 +Constant inlined font_find::l#0 = (byte) 0 +Constant inlined memset::dst#0 = (byte*)(const void*) memset::str#0 +Constant inlined font_compress::font_original#0 = (const byte*) FONT_ORIGINAL +Constant inlined font_2x2::font_original#0 = (const byte*) CHARGEN +Successful SSA optimization Pass2ConstantInlining +Consolidated array index constant in *(FONT_COMPRESSED_MAP+' ') +Consolidated array index constant in assignment *(FONT_COMPRESSED_MAP+$40 + show::$5) +Consolidated array index constant in assignment *(FONT_COMPRESSED_MAP+$80 + show::$6) +Consolidated array index constant in assignment *(FONT_COMPRESSED_MAP+$c0 + show::$7) +Successful SSA optimization Pass2ConstantAdditionElimination +Alias show::$1 = show::$10 +Successful SSA optimization Pass2AliasElimination +Added new block during phi lifting main::@16(between main::@3 and main::@1) +Added new block during phi lifting main::@17(between main::@15 and main::@2) +Added new block during phi lifting font_2x2::@14(between font_2x2::@12 and font_2x2::@1) +Added new block during phi lifting font_2x2::@15(between font_2x2::@11 and font_2x2::@2) +Added new block during phi lifting font_2x2::@16(between font_2x2::@6 and font_2x2::@3) +Added new block during phi lifting font_2x2::@17(between font_2x2::@9 and font_2x2::@11) +Added new block during phi lifting font_compress::@9(between font_compress::@2 and font_compress::@1) +Added new block during phi lifting font_compress::@10(between font_compress::@8 and font_compress::@2) +Added new block during phi lifting font_compress::@11(between font_compress::@3 and font_compress::@3) +Added new block during phi lifting font_find::@17(between font_find::@5 and font_find::@4) +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @14 +Adding NOP phi() at start of @15 +Adding NOP phi() at start of @end +Adding NOP phi() at start of main::@13 +Adding NOP phi() at start of main::toD0181 +Adding NOP phi() at start of main::toD0181_@return +Adding NOP phi() at start of main::@14 +Adding NOP phi() at start of main::@5 +Adding NOP phi() at start of memset +Adding NOP phi() at start of memset::@2 +Adding NOP phi() at start of memset::@1 +Adding NOP phi() at start of font_compress +Adding NOP phi() at start of font_compress::@5 +Adding NOP phi() at start of font_compress::@6 +Adding NOP phi() at start of font_find +Adding NOP phi() at start of font_find::@3 +Adding NOP phi() at start of font_find::@2 +Adding NOP phi() at start of font_find::@7 +Adding NOP phi() at start of font_2x2 +Adding NOP phi() at start of font_2x2::@5 +Adding NOP phi() at start of font_2x2::@4 +CALL GRAPH +Calls in [] to main:2 +Calls in [main] to font_2x2:7 font_compress:10 memset:16 show:24 +Calls in [font_compress] to font_find:64 + +Created 32 initial phi equivalence classes +Coalesced [19] main::c#7 ← main::c#4 +Coalesced [32] main::c#6 ← main::c#1 +Coalesced [33] main::y#6 ← main::y#1 +Coalesced (already) [34] main::c#8 ← main::c#1 +Coalesced [35] main::x#4 ← main::x#1 +Coalesced [59] memset::dst#4 ← memset::dst#1 +Not coalescing [75] font_compress::found#3 ← font_compress::font_size#2 +Coalesced [76] font_compress::return#4 ← font_compress::font_size#1 +Coalesced [77] font_compress::next_compressed#9 ← font_compress::next_compressed#1 +Coalesced [85] font_compress::next_original#8 ← font_compress::next_original#1 +Not coalescing [86] font_compress::font_size#9 ← font_compress::return#1 +Coalesced [87] font_compress::i#8 ← font_compress::i#1 +Coalesced [88] font_compress::next_compressed#8 ← font_compress::next_compressed#7 +Coalesced [89] font_compress::l#3 ← font_compress::l#1 +Coalesced [90] font_compress::found#4 ← font_compress::found#0 +Not coalescing [91] font_compress::return#5 ← font_compress::font_size#2 +Coalesced (already) [92] font_compress::next_compressed#10 ← font_compress::next_compressed#4 +Coalesced [105] font_find::return#6 ← font_find::i#2 +Coalesced [108] font_find::i#10 ← font_find::i#1 +Coalesced [109] font_find::font#10 ← font_find::font#1 +Coalesced [112] font_find::l#4 ← font_find::l#1 +Not coalescing [116] font_2x2::next_2x2_left#10 ← font_2x2::next_2x2_left#0 +Coalesced [117] font_2x2::next_2x2_right#9 ← font_2x2::next_2x2_right#0 +Coalesced [120] font_2x2::glyph_bits#6 ← font_2x2::glyph_bits#0 +Coalesced [145] font_2x2::next_2x2_left#12 ← font_2x2::next_2x2_left#1 +Coalesced [146] font_2x2::next_2x2_right#11 ← font_2x2::next_2x2_right#1 +Coalesced [155] font_2x2::next_2x2_left#9 ← font_2x2::next_2x2#1 +Coalesced [156] font_2x2::next_original#12 ← font_2x2::next_original#1 +Coalesced [157] font_2x2::c#12 ← font_2x2::c#1 +Coalesced [158] font_2x2::l#10 ← font_2x2::l#1 +Coalesced [159] font_2x2::next_2x2_left#11 ← font_2x2::next_2x2_left#8 +Coalesced [160] font_2x2::l2#10 ← font_2x2::l2#9 +Coalesced [161] font_2x2::next_2x2_right#10 ← font_2x2::next_2x2_right#8 +Coalesced (already) [162] font_2x2::next_2x2_left#13 ← font_2x2::next_2x2_left#7 +Coalesced [163] font_2x2::l2#11 ← font_2x2::l2#1 +Coalesced (already) [164] font_2x2::next_2x2_right#12 ← font_2x2::next_2x2_right#7 +Coalesced [165] font_2x2::glyph_bits#7 ← font_2x2::glyph_bits#1 +Coalesced [166] font_2x2::glyph_bits_2x2#8 ← font_2x2::glyph_bits_2x2#2 +Coalesced [167] font_2x2::b#6 ← font_2x2::b#1 +Coalesced down to 26 phi equivalence classes +Culled Empty Block (label) @15 +Culled Empty Block (label) main::@13 +Culled Empty Block (label) main::toD0181_@return +Culled Empty Block (label) main::@14 +Culled Empty Block (label) main::@5 +Culled Empty Block (label) main::@16 +Culled Empty Block (label) main::@17 +Culled Empty Block (label) memset::@2 +Culled Empty Block (label) memset::@1 +Culled Empty Block (label) font_compress::@5 +Culled Empty Block (label) font_compress::@6 +Culled Empty Block (label) font_compress::@11 +Culled Empty Block (label) font_find::@3 +Culled Empty Block (label) font_find::@2 +Culled Empty Block (label) font_find::@7 +Culled Empty Block (label) font_find::@10 +Culled Empty Block (label) font_find::@17 +Culled Empty Block (label) font_2x2::@5 +Culled Empty Block (label) font_2x2::@14 +Culled Empty Block (label) font_2x2::@15 +Culled Empty Block (label) font_2x2::@17 +Culled Empty Block (label) font_2x2::@16 +Renumbering block @14 to @1 +Renumbering block memset::@4 to memset::@1 +Renumbering block memset::@5 to memset::@2 +Renumbering block main::@6 to main::@4 +Renumbering block main::@11 to main::@5 +Renumbering block main::@12 to main::@6 +Renumbering block main::@15 to main::@7 +Renumbering block font_2x2::@6 to font_2x2::@5 +Renumbering block font_2x2::@9 to font_2x2::@6 +Renumbering block font_2x2::@10 to font_2x2::@7 +Renumbering block font_2x2::@11 to font_2x2::@8 +Renumbering block font_2x2::@12 to font_2x2::@9 +Renumbering block font_compress::@8 to font_compress::@5 +Renumbering block font_compress::@9 to font_compress::@6 +Renumbering block font_compress::@10 to font_compress::@7 +Renumbering block font_find::@4 to font_find::@2 +Renumbering block font_find::@5 to font_find::@3 +Renumbering block font_find::@6 to font_find::@4 +Renumbering block font_find::@12 to font_find::@5 +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @1 +Adding NOP phi() at start of @end +Adding NOP phi() at start of main::toD0181 +Adding NOP phi() at start of memset +Adding NOP phi() at start of font_compress +Adding NOP phi() at start of font_find +Adding NOP phi() at start of font_2x2 +Adding NOP phi() at start of font_2x2::@4 + +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() + +(void()) main() +main: scope:[main] from @1 + asm { sei } + [5] *((const byte*) PROCPORT) ← (const byte) PROCPORT_RAM_CHARROM + [6] call font_2x2 + to:main::@6 +main::@6: scope:[main] from main + [7] *((const byte*) PROCPORT) ← (const byte) PROCPORT_BASIC_KERNEL_IO + asm { cli } + [9] call font_compress + to:main::toD0181 +main::toD0181: scope:[main] from main::@6 + [10] phi() + to:main::@5 +main::@5: scope:[main] from main::toD0181 + [11] *((const byte*) D018) ← (const byte) main::toD0181_return#0 + [12] (byte) memset::c#0 ← *((const byte*) FONT_COMPRESSED_MAP+(byte) ' ') + [13] call memset + to:main::@1 +main::@1: scope:[main] from main::@3 main::@5 + [14] (byte) main::y#4 ← phi( main::@5/(byte) 0 main::@3/(byte) main::y#1 ) + [14] (byte) main::c#4 ← phi( main::@5/(byte) 0 main::@3/(byte) main::c#1 ) + to:main::@2 +main::@2: scope:[main] from main::@1 main::@7 + [15] (byte) main::x#2 ← phi( main::@1/(byte) 0 main::@7/(byte) main::x#1 ) + [15] (byte) main::c#2 ← phi( main::@1/(byte) main::c#4 main::@7/(byte) main::c#1 ) + [16] (byte) show::c#0 ← (byte) main::c#2 + [17] (byte) show::x#0 ← (byte) main::x#2 + [18] (byte) show::y#0 ← (byte) main::y#4 + [19] call show + to:main::@7 +main::@7: scope:[main] from main::@2 + [20] (byte) main::c#1 ← ++ (byte) main::c#2 + [21] (byte) main::x#1 ← ++ (byte) main::x#2 + [22] if((byte) main::x#1!=(byte) 8) goto main::@2 + to:main::@3 +main::@3: scope:[main] from main::@7 + [23] (byte) main::y#1 ← ++ (byte) main::y#4 + [24] if((byte) main::y#1!=(byte) 8) goto main::@1 + to:main::@4 +main::@4: scope:[main] from main::@3 main::@4 + [25] *((const byte*) SCREEN+(word) $3e7) ← ++ *((const byte*) SCREEN+(word) $3e7) + to:main::@4 + +(void()) show((byte) show::c , (byte) show::x , (byte) show::y , (byte*) show::font_mapping) +show: scope:[show] from main::@2 + [26] (word~) show::$0 ← (word)(byte) show::y#0 + [27] (word~) show::$8 ← (word~) show::$0 << (byte) 2 + [28] (word~) show::$9 ← (word~) show::$8 + (word~) show::$0 + [29] (word~) show::$1 ← (word~) show::$9 << (byte) 4 + [30] (byte*~) show::$2 ← (const byte*) SCREEN + (word~) show::$1 + [31] (byte~) show::$3 ← (byte) show::x#0 << (byte) 1 + [32] (byte*) show::ptr#0 ← (byte*~) show::$2 + (byte~) show::$3 + [33] *((byte*) show::ptr#0) ← *((const byte*) FONT_COMPRESSED_MAP + (byte) show::c#0) + [34] (byte~) show::$5 ← (byte) show::c#0 + [35] *((byte*) show::ptr#0 + (byte) 1) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $40 + (byte~) show::$5) + [36] (byte~) show::$6 ← (byte) show::c#0 + [37] *((byte*) show::ptr#0 + (byte) $28) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $80 + (byte~) show::$6) + [38] (byte~) show::$7 ← (byte) show::c#0 + [39] *((byte*) show::ptr#0 + (byte) $29) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $c0 + (byte~) show::$7) + to:show::@return +show::@return: scope:[show] from show + [40] return + to:@return + +(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) +memset: scope:[memset] from main::@5 + [41] phi() + to:memset::@1 +memset::@1: scope:[memset] from memset memset::@2 + [42] (byte*) memset::dst#2 ← phi( memset/(byte*)(const void*) memset::str#0 memset::@2/(byte*) memset::dst#1 ) + [43] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2 + to:memset::@return +memset::@return: scope:[memset] from memset::@1 + [44] return + to:@return +memset::@2: scope:[memset] from memset::@1 + [45] *((byte*) memset::dst#2) ← (byte) memset::c#0 + [46] (byte*) memset::dst#1 ← ++ (byte*) memset::dst#2 + to:memset::@1 + +(byte()) font_compress((byte*) font_compress::font_original , (byte*) font_compress::font_compressed , (byte*) font_compress::compress_mapping) +font_compress: scope:[font_compress] from main::@6 + [47] phi() + to:font_compress::@1 +font_compress::@1: scope:[font_compress] from font_compress font_compress::@6 + [48] (byte*) font_compress::next_compressed#4 ← phi( font_compress/(const byte*) FONT_COMPRESSED font_compress::@6/(byte*) font_compress::next_compressed#7 ) + [48] (byte) font_compress::i#4 ← phi( font_compress/(byte) 0 font_compress::@6/(byte) font_compress::i#1 ) + [48] (byte) font_compress::font_size#2 ← phi( font_compress/(byte) 0 font_compress::@6/(byte) font_compress::font_size#9 ) + [48] (byte*) font_compress::next_original#2 ← phi( font_compress/(const byte*) FONT_ORIGINAL font_compress::@6/(byte*) font_compress::next_original#1 ) + [49] (byte*) font_find::glyph#0 ← (byte*) font_compress::next_original#2 + [50] (byte) font_find::font_size#0 ← (byte) font_compress::font_size#2 + [51] call font_find + [52] (byte) font_find::return#0 ← (byte) font_find::return#3 + to:font_compress::@5 +font_compress::@5: scope:[font_compress] from font_compress::@1 + [53] (byte) font_compress::found#0 ← (byte) font_find::return#0 + [54] if((byte) font_compress::found#0!=(byte) $ff) goto font_compress::@7 + to:font_compress::@3 +font_compress::@3: scope:[font_compress] from font_compress::@3 font_compress::@5 + [55] (byte) font_compress::l#2 ← phi( font_compress::@3/(byte) font_compress::l#1 font_compress::@5/(byte) 0 ) + [56] *((byte*) font_compress::next_compressed#4 + (byte) font_compress::l#2) ← *((byte*) font_compress::next_original#2 + (byte) font_compress::l#2) + [57] (byte) font_compress::l#1 ← ++ (byte) font_compress::l#2 + [58] if((byte) font_compress::l#1!=(byte) 8) goto font_compress::@3 + to:font_compress::@4 +font_compress::@4: scope:[font_compress] from font_compress::@3 + [59] (byte*) font_compress::next_compressed#1 ← (byte*) font_compress::next_compressed#4 + (byte) 8 + [60] (byte) font_compress::font_size#1 ← ++ (byte) font_compress::font_size#2 + [61] (byte) font_compress::found#3 ← (byte) font_compress::font_size#2 + to:font_compress::@2 +font_compress::@2: scope:[font_compress] from font_compress::@4 font_compress::@7 + [62] (byte*) font_compress::next_compressed#7 ← phi( font_compress::@4/(byte*) font_compress::next_compressed#1 font_compress::@7/(byte*) font_compress::next_compressed#4 ) + [62] (byte) font_compress::return#1 ← phi( font_compress::@4/(byte) font_compress::font_size#1 font_compress::@7/(byte) font_compress::return#5 ) + [62] (byte) font_compress::found#2 ← phi( font_compress::@4/(byte) font_compress::found#3 font_compress::@7/(byte) font_compress::found#0 ) + [63] *((const byte*) FONT_COMPRESSED_MAP + (byte) font_compress::i#4) ← (byte) font_compress::found#2 + [64] (byte*) font_compress::next_original#1 ← (byte*) font_compress::next_original#2 + (byte) 8 + [65] (byte) font_compress::i#1 ← ++ (byte) font_compress::i#4 + [66] if((byte) font_compress::i#1!=(byte) 0) goto font_compress::@6 + to:font_compress::@return +font_compress::@return: scope:[font_compress] from font_compress::@2 + [67] return + to:@return +font_compress::@6: scope:[font_compress] from font_compress::@2 + [68] (byte) font_compress::font_size#9 ← (byte) font_compress::return#1 + to:font_compress::@1 +font_compress::@7: scope:[font_compress] from font_compress::@5 + [69] (byte) font_compress::return#5 ← (byte) font_compress::font_size#2 + to:font_compress::@2 + +(byte()) font_find((byte*) font_find::glyph , (byte*) font_find::font , (byte) font_find::font_size) +font_find: scope:[font_find] from font_compress::@1 + [70] phi() + to:font_find::@1 +font_find::@1: scope:[font_find] from font_find font_find::@5 + [71] (byte*) font_find::font#4 ← phi( font_find/(const byte*) FONT_COMPRESSED font_find::@5/(byte*) font_find::font#1 ) + [71] (byte) font_find::i#2 ← phi( font_find/(byte) 0 font_find::@5/(byte) font_find::i#1 ) + [72] if((byte) font_find::i#2<(byte) font_find::font_size#0) goto font_find::@2 + to:font_find::@return +font_find::@return: scope:[font_find] from font_find::@1 font_find::@4 + [73] (byte) font_find::return#3 ← phi( font_find::@4/(byte) font_find::i#2 font_find::@1/(byte) $ff ) + [74] return + to:@return +font_find::@2: scope:[font_find] from font_find::@1 font_find::@3 + [75] (byte) font_find::l#2 ← phi( font_find::@1/(byte) 0 font_find::@3/(byte) font_find::l#1 ) + [76] if(*((byte*) font_find::glyph#0 + (byte) font_find::l#2)==*((byte*) font_find::font#4 + (byte) font_find::l#2)) goto font_find::@3 + to:font_find::@4 +font_find::@3: scope:[font_find] from font_find::@2 + [77] (byte) font_find::l#1 ← ++ (byte) font_find::l#2 + [78] if((byte) font_find::l#1!=(byte) 8) goto font_find::@2 + to:font_find::@4 +font_find::@4: scope:[font_find] from font_find::@2 font_find::@3 + [79] (byte) font_find::found#2 ← phi( font_find::@3/(byte) 1 font_find::@2/(byte) 0 ) + [80] if((byte) 0==(byte) font_find::found#2) goto font_find::@5 + to:font_find::@return +font_find::@5: scope:[font_find] from font_find::@4 + [81] (byte*) font_find::font#1 ← (byte*) font_find::font#4 + (byte) 8 + [82] (byte) font_find::i#1 ← ++ (byte) font_find::i#2 + to:font_find::@1 + +(void()) font_2x2((byte*) font_2x2::font_original , (byte*) font_2x2::font_2x2) +font_2x2: scope:[font_2x2] from main + [83] phi() + to:font_2x2::@1 +font_2x2::@1: scope:[font_2x2] from font_2x2 font_2x2::@9 + [84] (byte) font_2x2::c#11 ← phi( font_2x2/(byte) 0 font_2x2::@9/(byte) font_2x2::c#1 ) + [84] (byte*) font_2x2::next_original#4 ← phi( font_2x2/(const byte*) CHARGEN font_2x2::@9/(byte*) font_2x2::next_original#1 ) + [84] (byte*) font_2x2::next_2x2_left#0 ← phi( font_2x2/(const byte*) FONT_ORIGINAL font_2x2::@9/(byte*) font_2x2::next_2x2#1 ) + [85] (byte*) font_2x2::next_2x2_right#0 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $40*(number) 8 + [86] (byte*) font_2x2::next_2x2_left#10 ← (byte*) font_2x2::next_2x2_left#0 + to:font_2x2::@2 +font_2x2::@2: scope:[font_2x2] from font_2x2::@1 font_2x2::@8 + [87] (byte*) font_2x2::next_2x2_right#7 ← phi( font_2x2::@1/(byte*) font_2x2::next_2x2_right#0 font_2x2::@8/(byte*) font_2x2::next_2x2_right#8 ) + [87] (byte) font_2x2::l2#8 ← phi( font_2x2::@1/(byte) 0 font_2x2::@8/(byte) font_2x2::l2#9 ) + [87] (byte*) font_2x2::next_2x2_left#7 ← phi( font_2x2::@1/(byte*) font_2x2::next_2x2_left#10 font_2x2::@8/(byte*) font_2x2::next_2x2_left#8 ) + [87] (byte) font_2x2::l#2 ← phi( font_2x2::@1/(byte) 0 font_2x2::@8/(byte) font_2x2::l#1 ) + [88] (byte) font_2x2::glyph_bits#0 ← *((byte*) font_2x2::next_original#4 + (byte) font_2x2::l#2) + to:font_2x2::@3 +font_2x2::@3: scope:[font_2x2] from font_2x2::@2 font_2x2::@5 + [89] (byte) font_2x2::b#2 ← phi( font_2x2::@2/(byte) 0 font_2x2::@5/(byte) font_2x2::b#1 ) + [89] (word) font_2x2::glyph_bits_2x2#3 ← phi( font_2x2::@2/(word) 0 font_2x2::@5/(word) font_2x2::glyph_bits_2x2#2 ) + [89] (byte) font_2x2::glyph_bits#2 ← phi( font_2x2::@2/(byte) font_2x2::glyph_bits#0 font_2x2::@5/(byte) font_2x2::glyph_bits#1 ) + [90] (byte~) font_2x2::$1 ← (byte) font_2x2::glyph_bits#2 & (byte) $80 + [91] if((byte) 0!=(byte~) font_2x2::$1) goto font_2x2::@4 + to:font_2x2::@5 +font_2x2::@4: scope:[font_2x2] from font_2x2::@3 + [92] phi() + to:font_2x2::@5 +font_2x2::@5: scope:[font_2x2] from font_2x2::@3 font_2x2::@4 + [93] (byte) font_2x2::glyph_bit#0 ← phi( font_2x2::@4/(byte) 1 font_2x2::@3/(byte) 0 ) + [94] (word~) font_2x2::$5 ← (word) font_2x2::glyph_bits_2x2#3 << (byte) 1 + [95] (word) font_2x2::glyph_bits_2x2#1 ← (word~) font_2x2::$5 | (byte) font_2x2::glyph_bit#0 + [96] (word~) font_2x2::$7 ← (word) font_2x2::glyph_bits_2x2#1 << (byte) 1 + [97] (word) font_2x2::glyph_bits_2x2#2 ← (word~) font_2x2::$7 | (byte) font_2x2::glyph_bit#0 + [98] (byte) font_2x2::glyph_bits#1 ← (byte) font_2x2::glyph_bits#2 << (byte) 1 + [99] (byte) font_2x2::b#1 ← ++ (byte) font_2x2::b#2 + [100] if((byte) font_2x2::b#1!=(byte) 8) goto font_2x2::@3 + to:font_2x2::@6 +font_2x2::@6: scope:[font_2x2] from font_2x2::@5 + [101] (byte~) font_2x2::$12 ← > (word) font_2x2::glyph_bits_2x2#2 + [102] *((byte*) font_2x2::next_2x2_left#7 + (byte) font_2x2::l2#8) ← (byte~) font_2x2::$12 + [103] (byte~) font_2x2::$11 ← (byte) font_2x2::l2#8 + (byte) 1 + [104] *((byte*) font_2x2::next_2x2_left#7 + (byte~) font_2x2::$11) ← (byte~) font_2x2::$12 + [105] (byte~) font_2x2::$15 ← < (word) font_2x2::glyph_bits_2x2#2 + [106] *((byte*) font_2x2::next_2x2_right#7 + (byte) font_2x2::l2#8) ← (byte~) font_2x2::$15 + [107] (byte~) font_2x2::$14 ← (byte) font_2x2::l2#8 + (byte) 1 + [108] *((byte*) font_2x2::next_2x2_right#7 + (byte~) font_2x2::$14) ← (byte~) font_2x2::$15 + [109] (byte) font_2x2::l2#1 ← (byte) font_2x2::l2#8 + (byte) 2 + [110] if((byte) font_2x2::l2#1!=(byte) 8) goto font_2x2::@8 + to:font_2x2::@7 +font_2x2::@7: scope:[font_2x2] from font_2x2::@6 + [111] (byte*) font_2x2::next_2x2_left#1 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $80*(number) 8 + [112] (byte*) font_2x2::next_2x2_right#1 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $c0*(number) 8 + to:font_2x2::@8 +font_2x2::@8: scope:[font_2x2] from font_2x2::@6 font_2x2::@7 + [113] (byte*) font_2x2::next_2x2_right#8 ← phi( font_2x2::@7/(byte*) font_2x2::next_2x2_right#1 font_2x2::@6/(byte*) font_2x2::next_2x2_right#7 ) + [113] (byte) font_2x2::l2#9 ← phi( font_2x2::@7/(byte) 0 font_2x2::@6/(byte) font_2x2::l2#1 ) + [113] (byte*) font_2x2::next_2x2_left#8 ← phi( font_2x2::@7/(byte*) font_2x2::next_2x2_left#1 font_2x2::@6/(byte*) font_2x2::next_2x2_left#7 ) + [114] (byte) font_2x2::l#1 ← ++ (byte) font_2x2::l#2 + [115] if((byte) font_2x2::l#1!=(byte) 8) goto font_2x2::@2 + to:font_2x2::@9 +font_2x2::@9: scope:[font_2x2] from font_2x2::@8 + [116] (byte*) font_2x2::next_2x2#1 ← (byte*) font_2x2::next_2x2_left#0 + (byte) 8 + [117] (byte*) font_2x2::next_original#1 ← (byte*) font_2x2::next_original#4 + (byte) 8 + [118] (byte) font_2x2::c#1 ← ++ (byte) font_2x2::c#11 + [119] if((byte) font_2x2::c#1!=(byte) $40) goto font_2x2::@1 + to:font_2x2::@return +font_2x2::@return: scope:[font_2x2] from font_2x2::@9 + [120] return + to:@return + + +VARIABLE REGISTER WEIGHTS +(void()) font_2x2((byte*) font_2x2::font_original , (byte*) font_2x2::font_2x2) +(byte~) font_2x2::$1 200002.0 +(byte~) font_2x2::$11 20002.0 +(byte~) font_2x2::$12 10001.0 +(byte~) font_2x2::$14 20002.0 +(byte~) font_2x2::$15 10001.0 +(word~) font_2x2::$5 200002.0 +(word~) font_2x2::$7 200002.0 +(byte) font_2x2::b +(byte) font_2x2::b#1 150001.5 +(byte) font_2x2::b#2 20000.2 +(byte) font_2x2::c +(byte) font_2x2::c#1 1501.5 +(byte) font_2x2::c#11 58.88235294117647 +(byte*) font_2x2::font_2x2 +(byte*) font_2x2::font_original +(byte) font_2x2::glyph_bit +(byte) font_2x2::glyph_bit#0 50000.5 +(byte) font_2x2::glyph_bits +(byte) font_2x2::glyph_bits#0 20002.0 +(byte) font_2x2::glyph_bits#1 66667.33333333333 +(byte) font_2x2::glyph_bits#2 34444.88888888889 +(word) font_2x2::glyph_bits_2x2 +(word) font_2x2::glyph_bits_2x2#1 200002.0 +(word) font_2x2::glyph_bits_2x2#2 27500.5 +(word) font_2x2::glyph_bits_2x2#3 40000.4 +(byte) font_2x2::l +(byte) font_2x2::l#1 15001.5 +(byte) font_2x2::l#2 1111.2222222222222 +(byte) font_2x2::l2 +(byte) font_2x2::l2#1 15001.5 +(byte) font_2x2::l2#8 2727.5454545454545 +(byte) font_2x2::l2#9 6667.333333333333 +(byte*) font_2x2::next_2x2 +(byte*) font_2x2::next_2x2#1 500.5 +(byte*) font_2x2::next_2x2_left +(byte*) font_2x2::next_2x2_left#0 750.1875 +(byte*) font_2x2::next_2x2_left#1 10001.0 +(byte*) font_2x2::next_2x2_left#10 2002.0 +(byte*) font_2x2::next_2x2_left#7 1708.5416666666665 +(byte*) font_2x2::next_2x2_left#8 10001.0 +(byte*) font_2x2::next_2x2_right +(byte*) font_2x2::next_2x2_right#0 1001.0 +(byte*) font_2x2::next_2x2_right#1 20002.0 +(byte*) font_2x2::next_2x2_right#7 1708.5416666666665 +(byte*) font_2x2::next_2x2_right#8 10001.0 +(byte*) font_2x2::next_original +(byte*) font_2x2::next_original#1 667.3333333333334 +(byte*) font_2x2::next_original#4 363.7272727272727 +(byte()) font_compress((byte*) font_compress::font_original , (byte*) font_compress::font_compressed , (byte*) font_compress::compress_mapping) +(byte*) font_compress::compress_mapping +(byte*) font_compress::font_compressed +(byte*) font_compress::font_original +(byte) font_compress::font_size +(byte) font_compress::font_size#1 1001.0 +(byte) font_compress::font_size#2 385.0 +(byte) font_compress::font_size#9 2002.0 +(byte) font_compress::found +(byte) font_compress::found#0 1001.0 +(byte) font_compress::found#2 3003.0 +(byte) font_compress::found#3 2002.0 +(byte) font_compress::i +(byte) font_compress::i#1 1001.0 +(byte) font_compress::i#4 166.83333333333334 +(byte) font_compress::l +(byte) font_compress::l#1 15001.5 +(byte) font_compress::l#2 20002.0 +(byte*) font_compress::next_compressed +(byte*) font_compress::next_compressed#1 667.3333333333334 +(byte*) font_compress::next_compressed#4 1083.6666666666665 +(byte*) font_compress::next_compressed#7 500.5 +(byte*) font_compress::next_original +(byte*) font_compress::next_original#1 500.5 +(byte*) font_compress::next_original#2 764.9411764705882 +(byte) font_compress::return +(byte) font_compress::return#1 600.5999999999999 +(byte) font_compress::return#5 2002.0 +(byte()) font_find((byte*) font_find::glyph , (byte*) font_find::font , (byte) font_find::font_size) +(byte*) font_find::font +(byte*) font_find::font#1 1000001.0 +(byte*) font_find::font#4 1500000.375 +(byte) font_find::font_size +(byte) font_find::font_size#0 83416.83333333334 +(byte) font_find::found +(byte) font_find::found#2 1000001.0 +(byte*) font_find::glyph +(byte*) font_find::glyph#0 769307.8461538461 +(byte) font_find::i +(byte) font_find::i#1 2000002.0 +(byte) font_find::i#2 444444.8888888889 +(byte) font_find::l +(byte) font_find::l#1 1.50000015E7 +(byte) font_find::l#2 2.0000002E7 +(byte) font_find::return +(byte) font_find::return#0 2002.0 +(byte) font_find::return#3 333667.3333333334 +(void()) main() +(byte) main::c +(byte) main::c#1 420.59999999999997 +(byte) main::c#2 620.8 +(byte) main::c#4 202.0 +(byte*) main::toD0181_gfx +(byte) main::toD0181_return +(byte*) main::toD0181_screen +(byte) main::x +(byte) main::x#1 1501.5 +(byte) main::x#2 500.5 +(byte) main::y +(byte) main::y#1 151.5 +(byte) main::y#4 133.66666666666669 +(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) +(byte) memset::c +(byte) memset::c#0 168.66666666666669 +(byte*) memset::dst +(byte*) memset::dst#1 2002.0 +(byte*) memset::dst#2 1334.6666666666667 +(byte*) memset::end +(word) memset::num +(void*) memset::return +(void*) memset::str +(void()) show((byte) show::c , (byte) show::x , (byte) show::y , (byte*) show::font_mapping) +(word~) show::$0 15001.5 +(word~) show::$1 20002.0 +(byte*~) show::$2 10001.0 +(byte~) show::$3 20002.0 +(byte~) show::$5 20002.0 +(byte~) show::$6 20002.0 +(byte~) show::$7 20002.0 +(word~) show::$8 20002.0 +(word~) show::$9 20002.0 +(byte) show::c +(byte) show::c#0 2733.666666666667 +(byte*) show::font_mapping +(byte*) show::ptr +(byte*) show::ptr#0 7143.571428571429 +(byte) show::x +(byte) show::x#0 1571.7142857142858 +(byte) show::y +(byte) show::y#0 1001.0 + +Initial phi equivalence classes +[ main::y#4 main::y#1 ] +[ main::c#2 main::c#4 main::c#1 ] +[ main::x#2 main::x#1 ] +[ memset::dst#2 memset::dst#1 ] +[ font_compress::next_original#2 font_compress::next_original#1 ] +[ font_compress::font_size#2 font_compress::font_size#9 ] +[ font_compress::i#4 font_compress::i#1 ] +[ font_compress::next_compressed#4 font_compress::next_compressed#7 font_compress::next_compressed#1 ] +[ font_compress::l#2 font_compress::l#1 ] +[ font_compress::found#2 font_compress::found#3 font_compress::found#0 ] +[ font_compress::return#1 font_compress::font_size#1 font_compress::return#5 ] +[ font_find::font#4 font_find::font#1 ] +[ font_find::return#3 font_find::i#2 font_find::i#1 ] +[ font_find::l#2 font_find::l#1 ] +[ font_find::found#2 ] +[ font_2x2::next_2x2_left#0 font_2x2::next_2x2#1 ] +[ font_2x2::next_original#4 font_2x2::next_original#1 ] +[ font_2x2::c#11 font_2x2::c#1 ] +[ font_2x2::l#2 font_2x2::l#1 ] +[ font_2x2::next_2x2_left#7 font_2x2::next_2x2_left#10 font_2x2::next_2x2_left#8 font_2x2::next_2x2_left#1 ] +[ font_2x2::l2#8 font_2x2::l2#9 font_2x2::l2#1 ] +[ font_2x2::next_2x2_right#7 font_2x2::next_2x2_right#0 font_2x2::next_2x2_right#8 font_2x2::next_2x2_right#1 ] +[ font_2x2::glyph_bits#2 font_2x2::glyph_bits#0 font_2x2::glyph_bits#1 ] +[ font_2x2::glyph_bits_2x2#3 font_2x2::glyph_bits_2x2#2 ] +[ font_2x2::b#2 font_2x2::b#1 ] +[ font_2x2::glyph_bit#0 ] +Added variable memset::c#0 to live range equivalence class [ memset::c#0 ] +Added variable show::c#0 to live range equivalence class [ show::c#0 ] +Added variable show::x#0 to live range equivalence class [ show::x#0 ] +Added variable show::y#0 to live range equivalence class [ show::y#0 ] +Added variable show::$0 to live range equivalence class [ show::$0 ] +Added variable show::$8 to live range equivalence class [ show::$8 ] +Added variable show::$9 to live range equivalence class [ show::$9 ] +Added variable show::$1 to live range equivalence class [ show::$1 ] +Added variable show::$2 to live range equivalence class [ show::$2 ] +Added variable show::$3 to live range equivalence class [ show::$3 ] +Added variable show::ptr#0 to live range equivalence class [ show::ptr#0 ] +Added variable show::$5 to live range equivalence class [ show::$5 ] +Added variable show::$6 to live range equivalence class [ show::$6 ] +Added variable show::$7 to live range equivalence class [ show::$7 ] +Added variable font_find::glyph#0 to live range equivalence class [ font_find::glyph#0 ] +Added variable font_find::font_size#0 to live range equivalence class [ font_find::font_size#0 ] +Added variable font_find::return#0 to live range equivalence class [ font_find::return#0 ] +Added variable font_2x2::$1 to live range equivalence class [ font_2x2::$1 ] +Added variable font_2x2::$5 to live range equivalence class [ font_2x2::$5 ] +Added variable font_2x2::glyph_bits_2x2#1 to live range equivalence class [ font_2x2::glyph_bits_2x2#1 ] +Added variable font_2x2::$7 to live range equivalence class [ font_2x2::$7 ] +Added variable font_2x2::$12 to live range equivalence class [ font_2x2::$12 ] +Added variable font_2x2::$11 to live range equivalence class [ font_2x2::$11 ] +Added variable font_2x2::$15 to live range equivalence class [ font_2x2::$15 ] +Added variable font_2x2::$14 to live range equivalence class [ font_2x2::$14 ] +Complete equivalence classes +[ main::y#4 main::y#1 ] +[ main::c#2 main::c#4 main::c#1 ] +[ main::x#2 main::x#1 ] +[ memset::dst#2 memset::dst#1 ] +[ font_compress::next_original#2 font_compress::next_original#1 ] +[ font_compress::font_size#2 font_compress::font_size#9 ] +[ font_compress::i#4 font_compress::i#1 ] +[ font_compress::next_compressed#4 font_compress::next_compressed#7 font_compress::next_compressed#1 ] +[ font_compress::l#2 font_compress::l#1 ] +[ font_compress::found#2 font_compress::found#3 font_compress::found#0 ] +[ font_compress::return#1 font_compress::font_size#1 font_compress::return#5 ] +[ font_find::font#4 font_find::font#1 ] +[ font_find::return#3 font_find::i#2 font_find::i#1 ] +[ font_find::l#2 font_find::l#1 ] +[ font_find::found#2 ] +[ font_2x2::next_2x2_left#0 font_2x2::next_2x2#1 ] +[ font_2x2::next_original#4 font_2x2::next_original#1 ] +[ font_2x2::c#11 font_2x2::c#1 ] +[ font_2x2::l#2 font_2x2::l#1 ] +[ font_2x2::next_2x2_left#7 font_2x2::next_2x2_left#10 font_2x2::next_2x2_left#8 font_2x2::next_2x2_left#1 ] +[ font_2x2::l2#8 font_2x2::l2#9 font_2x2::l2#1 ] +[ font_2x2::next_2x2_right#7 font_2x2::next_2x2_right#0 font_2x2::next_2x2_right#8 font_2x2::next_2x2_right#1 ] +[ font_2x2::glyph_bits#2 font_2x2::glyph_bits#0 font_2x2::glyph_bits#1 ] +[ font_2x2::glyph_bits_2x2#3 font_2x2::glyph_bits_2x2#2 ] +[ font_2x2::b#2 font_2x2::b#1 ] +[ font_2x2::glyph_bit#0 ] +[ memset::c#0 ] +[ show::c#0 ] +[ show::x#0 ] +[ show::y#0 ] +[ show::$0 ] +[ show::$8 ] +[ show::$9 ] +[ show::$1 ] +[ show::$2 ] +[ show::$3 ] +[ show::ptr#0 ] +[ show::$5 ] +[ show::$6 ] +[ show::$7 ] +[ font_find::glyph#0 ] +[ font_find::font_size#0 ] +[ font_find::return#0 ] +[ font_2x2::$1 ] +[ font_2x2::$5 ] +[ font_2x2::glyph_bits_2x2#1 ] +[ font_2x2::$7 ] +[ font_2x2::$12 ] +[ font_2x2::$11 ] +[ font_2x2::$15 ] +[ font_2x2::$14 ] +Allocated zp[1]:2 [ main::y#4 main::y#1 ] +Allocated zp[1]:3 [ main::c#2 main::c#4 main::c#1 ] +Allocated zp[1]:4 [ main::x#2 main::x#1 ] +Allocated zp[2]:5 [ memset::dst#2 memset::dst#1 ] +Allocated zp[2]:7 [ font_compress::next_original#2 font_compress::next_original#1 ] +Allocated zp[1]:9 [ font_compress::font_size#2 font_compress::font_size#9 ] +Allocated zp[1]:10 [ font_compress::i#4 font_compress::i#1 ] +Allocated zp[2]:11 [ font_compress::next_compressed#4 font_compress::next_compressed#7 font_compress::next_compressed#1 ] +Allocated zp[1]:13 [ font_compress::l#2 font_compress::l#1 ] +Allocated zp[1]:14 [ font_compress::found#2 font_compress::found#3 font_compress::found#0 ] +Allocated zp[1]:15 [ font_compress::return#1 font_compress::font_size#1 font_compress::return#5 ] +Allocated zp[2]:16 [ font_find::font#4 font_find::font#1 ] +Allocated zp[1]:18 [ font_find::return#3 font_find::i#2 font_find::i#1 ] +Allocated zp[1]:19 [ font_find::l#2 font_find::l#1 ] +Allocated zp[1]:20 [ font_find::found#2 ] +Allocated zp[2]:21 [ font_2x2::next_2x2_left#0 font_2x2::next_2x2#1 ] +Allocated zp[2]:23 [ font_2x2::next_original#4 font_2x2::next_original#1 ] +Allocated zp[1]:25 [ font_2x2::c#11 font_2x2::c#1 ] +Allocated zp[1]:26 [ font_2x2::l#2 font_2x2::l#1 ] +Allocated zp[2]:27 [ font_2x2::next_2x2_left#7 font_2x2::next_2x2_left#10 font_2x2::next_2x2_left#8 font_2x2::next_2x2_left#1 ] +Allocated zp[1]:29 [ font_2x2::l2#8 font_2x2::l2#9 font_2x2::l2#1 ] +Allocated zp[2]:30 [ font_2x2::next_2x2_right#7 font_2x2::next_2x2_right#0 font_2x2::next_2x2_right#8 font_2x2::next_2x2_right#1 ] +Allocated zp[1]:32 [ font_2x2::glyph_bits#2 font_2x2::glyph_bits#0 font_2x2::glyph_bits#1 ] +Allocated zp[2]:33 [ font_2x2::glyph_bits_2x2#3 font_2x2::glyph_bits_2x2#2 ] +Allocated zp[1]:35 [ font_2x2::b#2 font_2x2::b#1 ] +Allocated zp[1]:36 [ font_2x2::glyph_bit#0 ] +Allocated zp[1]:37 [ memset::c#0 ] +Allocated zp[1]:38 [ show::c#0 ] +Allocated zp[1]:39 [ show::x#0 ] +Allocated zp[1]:40 [ show::y#0 ] +Allocated zp[2]:41 [ show::$0 ] +Allocated zp[2]:43 [ show::$8 ] +Allocated zp[2]:45 [ show::$9 ] +Allocated zp[2]:47 [ show::$1 ] +Allocated zp[2]:49 [ show::$2 ] +Allocated zp[1]:51 [ show::$3 ] +Allocated zp[2]:52 [ show::ptr#0 ] +Allocated zp[1]:54 [ show::$5 ] +Allocated zp[1]:55 [ show::$6 ] +Allocated zp[1]:56 [ show::$7 ] +Allocated zp[2]:57 [ font_find::glyph#0 ] +Allocated zp[1]:59 [ font_find::font_size#0 ] +Allocated zp[1]:60 [ font_find::return#0 ] +Allocated zp[1]:61 [ font_2x2::$1 ] +Allocated zp[2]:62 [ font_2x2::$5 ] +Allocated zp[2]:64 [ font_2x2::glyph_bits_2x2#1 ] +Allocated zp[2]:66 [ font_2x2::$7 ] +Allocated zp[1]:68 [ font_2x2::$12 ] +Allocated zp[1]:69 [ font_2x2::$11 ] +Allocated zp[1]:70 [ font_2x2::$15 ] +Allocated zp[1]:71 [ font_2x2::$14 ] + +INITIAL ASM +Target platform is c64basic / MOS6502X + // File Comments +// Creates a 2x2 font from the system CHARGEN font and compress it by identifying identical chars + // Upstart +.pc = $801 "Basic" +:BasicUpstart(__bbegin) +.pc = $80d "Program" + // Global Constants & labels + // Processor Port Register controlling RAM/ROM configuration and the datasette + .label PROCPORT = 1 + // RAM in $A000, $E000 CHAR ROM in $D000 + .const PROCPORT_RAM_CHARROM = 1 + // BASIC in $A000, I/O in $D000, KERNEL in $E000 + .const PROCPORT_BASIC_KERNEL_IO = 7 + // The address of the CHARGEN character set + .label CHARGEN = $d000 + .label D018 = $d018 + .label SCREEN = $400 + .label FONT_ORIGINAL = $2000 + .label FONT_COMPRESSED = $2800 + // @begin +__bbegin: + // [1] phi from @begin to @1 [phi:@begin->@1] +__b1_from___bbegin: + jmp __b1 + // @1 +__b1: + // [2] call main + jsr main + // [3] phi from @1 to @end [phi:@1->@end] +__bend_from___b1: + jmp __bend + // @end +__bend: + // main +main: { + .const toD0181_return = (>(SCREEN&$3fff)*4)|(>FONT_COMPRESSED)/4&$f + .label c = 3 + .label x = 4 + .label y = 2 + // asm { sei } + // Create 2x2 font from CHARGEN + sei + // [5] *((const byte*) PROCPORT) ← (const byte) PROCPORT_RAM_CHARROM -- _deref_pbuc1=vbuc2 + lda #PROCPORT_RAM_CHARROM + sta PROCPORT + // [6] call font_2x2 + // [83] phi from main to font_2x2 [phi:main->font_2x2] + font_2x2_from_main: + jsr font_2x2 + jmp __b6 + // main::@6 + __b6: + // [7] *((const byte*) PROCPORT) ← (const byte) PROCPORT_BASIC_KERNEL_IO -- _deref_pbuc1=vbuc2 + lda #PROCPORT_BASIC_KERNEL_IO + sta PROCPORT + // asm { cli } + cli + // [9] call font_compress + // [47] phi from main::@6 to font_compress [phi:main::@6->font_compress] + font_compress_from___b6: + jsr font_compress + // [10] phi from main::@6 to main::toD0181 [phi:main::@6->main::toD0181] + toD0181_from___b6: + jmp toD0181 + // main::toD0181 + toD0181: + jmp __b5 + // main::@5 + __b5: + // [11] *((const byte*) D018) ← (const byte) main::toD0181_return#0 -- _deref_pbuc1=vbuc2 + // Show compressed font + lda #toD0181_return + sta D018 + // [12] (byte) memset::c#0 ← *((const byte*) FONT_COMPRESSED_MAP+(byte) ' ') -- vbuz1=_deref_pbuc1 + lda FONT_COMPRESSED_MAP+' ' + sta.z memset.c + // [13] call memset + // Clear the screen + // [41] phi from main::@5 to memset [phi:main::@5->memset] + memset_from___b5: + jsr memset + // [14] phi from main::@5 to main::@1 [phi:main::@5->main::@1] + __b1_from___b5: + // [14] phi (byte) main::y#4 = (byte) 0 [phi:main::@5->main::@1#0] -- vbuz1=vbuc1 + lda #0 + sta.z y + // [14] phi (byte) main::c#4 = (byte) 0 [phi:main::@5->main::@1#1] -- vbuz1=vbuc1 + lda #0 + sta.z c + jmp __b1 + // [14] phi from main::@3 to main::@1 [phi:main::@3->main::@1] + __b1_from___b3: + // [14] phi (byte) main::y#4 = (byte) main::y#1 [phi:main::@3->main::@1#0] -- register_copy + // [14] phi (byte) main::c#4 = (byte) main::c#1 [phi:main::@3->main::@1#1] -- register_copy + jmp __b1 + // main::@1 + __b1: + // [15] phi from main::@1 to main::@2 [phi:main::@1->main::@2] + __b2_from___b1: + // [15] phi (byte) main::x#2 = (byte) 0 [phi:main::@1->main::@2#0] -- vbuz1=vbuc1 + lda #0 + sta.z x + // [15] phi (byte) main::c#2 = (byte) main::c#4 [phi:main::@1->main::@2#1] -- register_copy + jmp __b2 + // [15] phi from main::@7 to main::@2 [phi:main::@7->main::@2] + __b2_from___b7: + // [15] phi (byte) main::x#2 = (byte) main::x#1 [phi:main::@7->main::@2#0] -- register_copy + // [15] phi (byte) main::c#2 = (byte) main::c#1 [phi:main::@7->main::@2#1] -- register_copy + jmp __b2 + // main::@2 + __b2: + // [16] (byte) show::c#0 ← (byte) main::c#2 -- vbuz1=vbuz2 + lda.z c + sta.z show.c + // [17] (byte) show::x#0 ← (byte) main::x#2 -- vbuz1=vbuz2 + lda.z x + sta.z show.x + // [18] (byte) show::y#0 ← (byte) main::y#4 -- vbuz1=vbuz2 + lda.z y + sta.z show.y + // [19] call show + jsr show + jmp __b7 + // main::@7 + __b7: + // [20] (byte) main::c#1 ← ++ (byte) main::c#2 -- vbuz1=_inc_vbuz1 + inc.z c + // [21] (byte) main::x#1 ← ++ (byte) main::x#2 -- vbuz1=_inc_vbuz1 + inc.z x + // [22] if((byte) main::x#1!=(byte) 8) goto main::@2 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp.z x + bne __b2_from___b7 + jmp __b3 + // main::@3 + __b3: + // [23] (byte) main::y#1 ← ++ (byte) main::y#4 -- vbuz1=_inc_vbuz1 + inc.z y + // [24] if((byte) main::y#1!=(byte) 8) goto main::@1 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp.z y + bne __b1_from___b3 + jmp __b4 + // main::@4 + __b4: + // [25] *((const byte*) SCREEN+(word) $3e7) ← ++ *((const byte*) SCREEN+(word) $3e7) -- _deref_pbuc1=_inc__deref_pbuc1 + inc SCREEN+$3e7 + jmp __b4 +} + // show +// Show a 2x2 char on the screen at 2x2-position (x, y) using a font compress mapping +// show(byte zp($26) c, byte zp($27) x, byte zp($28) y) +show: { + .label __0 = $29 + .label __1 = $2f + .label __2 = $31 + .label __3 = $33 + .label __5 = $36 + .label __6 = $37 + .label __7 = $38 + .label c = $26 + .label x = $27 + .label y = $28 + .label ptr = $34 + .label __8 = $2b + .label __9 = $2d + // [26] (word~) show::$0 ← (word)(byte) show::y#0 -- vwuz1=_word_vbuz2 + lda.z y + sta.z __0 + lda #0 + sta.z __0+1 + // [27] (word~) show::$8 ← (word~) show::$0 << (byte) 2 -- vwuz1=vwuz2_rol_2 + lda.z __0 + asl + sta.z __8 + lda.z __0+1 + rol + sta.z __8+1 + asl.z __8 + rol.z __8+1 + // [28] (word~) show::$9 ← (word~) show::$8 + (word~) show::$0 -- vwuz1=vwuz2_plus_vwuz3 + lda.z __8 + clc + adc.z __0 + sta.z __9 + lda.z __8+1 + adc.z __0+1 + sta.z __9+1 + // [29] (word~) show::$1 ← (word~) show::$9 << (byte) 4 -- vwuz1=vwuz2_rol_4 + lda.z __9 + asl + sta.z __1 + lda.z __9+1 + rol + sta.z __1+1 + asl.z __1 + rol.z __1+1 + asl.z __1 + rol.z __1+1 + asl.z __1 + rol.z __1+1 + // [30] (byte*~) show::$2 ← (const byte*) SCREEN + (word~) show::$1 -- pbuz1=pbuc1_plus_vwuz2 + lda.z __1 + clc + adc #SCREEN + sta.z __2+1 + // [31] (byte~) show::$3 ← (byte) show::x#0 << (byte) 1 -- vbuz1=vbuz2_rol_1 + lda.z x + asl + sta.z __3 + // [32] (byte*) show::ptr#0 ← (byte*~) show::$2 + (byte~) show::$3 -- pbuz1=pbuz2_plus_vbuz3 + lda.z __3 + clc + adc.z __2 + sta.z ptr + lda #0 + adc.z __2+1 + sta.z ptr+1 + // [33] *((byte*) show::ptr#0) ← *((const byte*) FONT_COMPRESSED_MAP + (byte) show::c#0) -- _deref_pbuz1=pbuc1_derefidx_vbuz2 + ldy.z c + lda FONT_COMPRESSED_MAP,y + ldy #0 + sta (ptr),y + // [34] (byte~) show::$5 ← (byte) show::c#0 -- vbuz1=vbuz2 + lda.z c + sta.z __5 + // [35] *((byte*) show::ptr#0 + (byte) 1) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $40 + (byte~) show::$5) -- pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuz2 + ldy.z __5 + lda FONT_COMPRESSED_MAP+$40,y + ldy #1 + sta (ptr),y + // [36] (byte~) show::$6 ← (byte) show::c#0 -- vbuz1=vbuz2 + lda.z c + sta.z __6 + // [37] *((byte*) show::ptr#0 + (byte) $28) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $80 + (byte~) show::$6) -- pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuz2 + ldy.z __6 + lda FONT_COMPRESSED_MAP+$80,y + ldy #$28 + sta (ptr),y + // [38] (byte~) show::$7 ← (byte) show::c#0 -- vbuz1=vbuz2 + lda.z c + sta.z __7 + // [39] *((byte*) show::ptr#0 + (byte) $29) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $c0 + (byte~) show::$7) -- pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuz2 + ldy.z __7 + lda FONT_COMPRESSED_MAP+$c0,y + ldy #$29 + sta (ptr),y + jmp __breturn + // show::@return + __breturn: + // [40] return + rts +} + // memset +// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str. +// memset(byte zp($25) c) +memset: { + .label str = SCREEN + .const num = $400 + .label end = str+num + .label dst = 5 + .label c = $25 + // [42] phi from memset to memset::@1 [phi:memset->memset::@1] + __b1_from_memset: + // [42] phi (byte*) memset::dst#2 = (byte*)(const void*) memset::str#0 [phi:memset->memset::@1#0] -- pbuz1=pbuc1 + lda #str + sta.z dst+1 + jmp __b1 + // memset::@1 + __b1: + // [43] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2 -- pbuz1_neq_pbuc1_then_la1 + lda.z dst+1 + cmp #>end + bne __b2 + lda.z dst + cmp #memset::@1] + __b1_from___b2: + // [42] phi (byte*) memset::dst#2 = (byte*) memset::dst#1 [phi:memset::@2->memset::@1#0] -- register_copy + jmp __b1 +} + // font_compress +// Compress a font finding identical characters +// The compressed font is put into font_compressed and the compress_mapping is updated +// so that compress_mapping[c] points to the char in font_compressed that is identical to char c in font_original +// Returns the size of the compressed font (in chars) +font_compress: { + .label found = $e + .label next_original = 7 + .label i = $a + .label l = $d + .label next_compressed = $b + .label font_size = $f + .label return = $f + .label font_size_1 = 9 + // [48] phi from font_compress to font_compress::@1 [phi:font_compress->font_compress::@1] + __b1_from_font_compress: + // [48] phi (byte*) font_compress::next_compressed#4 = (const byte*) FONT_COMPRESSED [phi:font_compress->font_compress::@1#0] -- pbuz1=pbuc1 + lda #FONT_COMPRESSED + sta.z next_compressed+1 + // [48] phi (byte) font_compress::i#4 = (byte) 0 [phi:font_compress->font_compress::@1#1] -- vbuz1=vbuc1 + lda #0 + sta.z i + // [48] phi (byte) font_compress::font_size#2 = (byte) 0 [phi:font_compress->font_compress::@1#2] -- vbuz1=vbuc1 + lda #0 + sta.z font_size_1 + // [48] phi (byte*) font_compress::next_original#2 = (const byte*) FONT_ORIGINAL [phi:font_compress->font_compress::@1#3] -- pbuz1=pbuc1 + lda #FONT_ORIGINAL + sta.z next_original+1 + jmp __b1 + // font_compress::@1 + __b1: + // [49] (byte*) font_find::glyph#0 ← (byte*) font_compress::next_original#2 -- pbuz1=pbuz2 + lda.z next_original + sta.z font_find.glyph + lda.z next_original+1 + sta.z font_find.glyph+1 + // [50] (byte) font_find::font_size#0 ← (byte) font_compress::font_size#2 -- vbuz1=vbuz2 + lda.z font_size_1 + sta.z font_find.font_size + // [51] call font_find + // [70] phi from font_compress::@1 to font_find [phi:font_compress::@1->font_find] + font_find_from___b1: + jsr font_find + // [52] (byte) font_find::return#0 ← (byte) font_find::return#3 -- vbuz1=vbuz2 + lda.z font_find.return_1 + sta.z font_find.return + jmp __b5 + // font_compress::@5 + __b5: + // [53] (byte) font_compress::found#0 ← (byte) font_find::return#0 -- vbuz1=vbuz2 + lda.z font_find.return + sta.z found + // [54] if((byte) font_compress::found#0!=(byte) $ff) goto font_compress::@7 -- vbuz1_neq_vbuc1_then_la1 + lda #$ff + cmp.z found + bne __b7 + // [55] phi from font_compress::@5 to font_compress::@3 [phi:font_compress::@5->font_compress::@3] + __b3_from___b5: + // [55] phi (byte) font_compress::l#2 = (byte) 0 [phi:font_compress::@5->font_compress::@3#0] -- vbuz1=vbuc1 + lda #0 + sta.z l + jmp __b3 + // Glyph not found - create it + // [55] phi from font_compress::@3 to font_compress::@3 [phi:font_compress::@3->font_compress::@3] + __b3_from___b3: + // [55] phi (byte) font_compress::l#2 = (byte) font_compress::l#1 [phi:font_compress::@3->font_compress::@3#0] -- register_copy + jmp __b3 + // font_compress::@3 + __b3: + // [56] *((byte*) font_compress::next_compressed#4 + (byte) font_compress::l#2) ← *((byte*) font_compress::next_original#2 + (byte) font_compress::l#2) -- pbuz1_derefidx_vbuz2=pbuz3_derefidx_vbuz2 + ldy.z l + lda (next_original),y + sta (next_compressed),y + // [57] (byte) font_compress::l#1 ← ++ (byte) font_compress::l#2 -- vbuz1=_inc_vbuz1 + inc.z l + // [58] if((byte) font_compress::l#1!=(byte) 8) goto font_compress::@3 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp.z l + bne __b3_from___b3 + jmp __b4 + // font_compress::@4 + __b4: + // [59] (byte*) font_compress::next_compressed#1 ← (byte*) font_compress::next_compressed#4 + (byte) 8 -- pbuz1=pbuz1_plus_vbuc1 + lda #8 + clc + adc.z next_compressed + sta.z next_compressed + bcc !+ + inc.z next_compressed+1 + !: + // [60] (byte) font_compress::font_size#1 ← ++ (byte) font_compress::font_size#2 -- vbuz1=_inc_vbuz2 + ldy.z font_size_1 + iny + sty.z font_size + // [61] (byte) font_compress::found#3 ← (byte) font_compress::font_size#2 -- vbuz1=vbuz2 + lda.z font_size_1 + sta.z found + // [62] phi from font_compress::@4 font_compress::@7 to font_compress::@2 [phi:font_compress::@4/font_compress::@7->font_compress::@2] + __b2_from___b4: + __b2_from___b7: + // [62] phi (byte*) font_compress::next_compressed#7 = (byte*) font_compress::next_compressed#1 [phi:font_compress::@4/font_compress::@7->font_compress::@2#0] -- register_copy + // [62] phi (byte) font_compress::return#1 = (byte) font_compress::font_size#1 [phi:font_compress::@4/font_compress::@7->font_compress::@2#1] -- register_copy + // [62] phi (byte) font_compress::found#2 = (byte) font_compress::found#3 [phi:font_compress::@4/font_compress::@7->font_compress::@2#2] -- register_copy + jmp __b2 + // font_compress::@2 + __b2: + // [63] *((const byte*) FONT_COMPRESSED_MAP + (byte) font_compress::i#4) ← (byte) font_compress::found#2 -- pbuc1_derefidx_vbuz1=vbuz2 + lda.z found + ldy.z i + sta FONT_COMPRESSED_MAP,y + // [64] (byte*) font_compress::next_original#1 ← (byte*) font_compress::next_original#2 + (byte) 8 -- pbuz1=pbuz1_plus_vbuc1 + lda #8 + clc + adc.z next_original + sta.z next_original + bcc !+ + inc.z next_original+1 + !: + // [65] (byte) font_compress::i#1 ← ++ (byte) font_compress::i#4 -- vbuz1=_inc_vbuz1 + inc.z i + // [66] if((byte) font_compress::i#1!=(byte) 0) goto font_compress::@6 -- vbuz1_neq_0_then_la1 + lda.z i + cmp #0 + bne __b6 + jmp __breturn + // font_compress::@return + __breturn: + // [67] return + rts + // font_compress::@6 + __b6: + // [68] (byte) font_compress::font_size#9 ← (byte) font_compress::return#1 -- vbuz1=vbuz2 + lda.z return + sta.z font_size_1 + // [48] phi from font_compress::@6 to font_compress::@1 [phi:font_compress::@6->font_compress::@1] + __b1_from___b6: + // [48] phi (byte*) font_compress::next_compressed#4 = (byte*) font_compress::next_compressed#7 [phi:font_compress::@6->font_compress::@1#0] -- register_copy + // [48] phi (byte) font_compress::i#4 = (byte) font_compress::i#1 [phi:font_compress::@6->font_compress::@1#1] -- register_copy + // [48] phi (byte) font_compress::font_size#2 = (byte) font_compress::font_size#9 [phi:font_compress::@6->font_compress::@1#2] -- register_copy + // [48] phi (byte*) font_compress::next_original#2 = (byte*) font_compress::next_original#1 [phi:font_compress::@6->font_compress::@1#3] -- register_copy + jmp __b1 + // font_compress::@7 + __b7: + // [69] (byte) font_compress::return#5 ← (byte) font_compress::font_size#2 -- vbuz1=vbuz2 + lda.z font_size_1 + sta.z return + jmp __b2_from___b7 +} + // font_find +// Look for a glyph within a font +// Only looks at the first font_size glyphs +// Returns the index of the glyph within the font. Returns 0xff if the glyph is not found. +// font_find(byte* zp($39) glyph, byte* zp($10) font, byte zp($3b) font_size) +font_find: { + .label glyph = $39 + .label font_size = $3b + // Not found + .label return = $3c + .label l = $13 + .label font = $10 + .label i = $12 + // Not found + .label return_1 = $12 + .label found = $14 + // [71] phi from font_find to font_find::@1 [phi:font_find->font_find::@1] + __b1_from_font_find: + // [71] phi (byte*) font_find::font#4 = (const byte*) FONT_COMPRESSED [phi:font_find->font_find::@1#0] -- pbuz1=pbuc1 + lda #FONT_COMPRESSED + sta.z font+1 + // [71] phi (byte) font_find::i#2 = (byte) 0 [phi:font_find->font_find::@1#1] -- vbuz1=vbuc1 + lda #0 + sta.z i + jmp __b1 + // font_find::@1 + __b1: + // [72] if((byte) font_find::i#2<(byte) font_find::font_size#0) goto font_find::@2 -- vbuz1_lt_vbuz2_then_la1 + lda.z i + cmp.z font_size + bcc __b2_from___b1 + // [73] phi from font_find::@1 to font_find::@return [phi:font_find::@1->font_find::@return] + __breturn_from___b1: + // [73] phi (byte) font_find::return#3 = (byte) $ff [phi:font_find::@1->font_find::@return#0] -- vbuz1=vbuc1 + lda #$ff + sta.z return_1 + jmp __breturn + // font_find::@return + __breturn: + // [74] return + rts + // [75] phi from font_find::@1 to font_find::@2 [phi:font_find::@1->font_find::@2] + __b2_from___b1: + // [75] phi (byte) font_find::l#2 = (byte) 0 [phi:font_find::@1->font_find::@2#0] -- vbuz1=vbuc1 + lda #0 + sta.z l + jmp __b2 + // [75] phi from font_find::@3 to font_find::@2 [phi:font_find::@3->font_find::@2] + __b2_from___b3: + // [75] phi (byte) font_find::l#2 = (byte) font_find::l#1 [phi:font_find::@3->font_find::@2#0] -- register_copy + jmp __b2 + // font_find::@2 + __b2: + // [76] if(*((byte*) font_find::glyph#0 + (byte) font_find::l#2)==*((byte*) font_find::font#4 + (byte) font_find::l#2)) goto font_find::@3 -- pbuz1_derefidx_vbuz2_eq_pbuz3_derefidx_vbuz2_then_la1 + ldy.z l + lda (glyph),y + cmp (font),y + beq __b3 + // [79] phi from font_find::@2 to font_find::@4 [phi:font_find::@2->font_find::@4] + __b4_from___b2: + // [79] phi (byte) font_find::found#2 = (byte) 0 [phi:font_find::@2->font_find::@4#0] -- vbuz1=vbuc1 + lda #0 + sta.z found + jmp __b4 + // font_find::@3 + __b3: + // [77] (byte) font_find::l#1 ← ++ (byte) font_find::l#2 -- vbuz1=_inc_vbuz1 + inc.z l + // [78] if((byte) font_find::l#1!=(byte) 8) goto font_find::@2 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp.z l + bne __b2_from___b3 + // [79] phi from font_find::@3 to font_find::@4 [phi:font_find::@3->font_find::@4] + __b4_from___b3: + // [79] phi (byte) font_find::found#2 = (byte) 1 [phi:font_find::@3->font_find::@4#0] -- vbuz1=vbuc1 + lda #1 + sta.z found + jmp __b4 + // font_find::@4 + __b4: + // [80] if((byte) 0==(byte) font_find::found#2) goto font_find::@5 -- vbuc1_eq_vbuz1_then_la1 + lda #0 + cmp.z found + beq __b5 + // [73] phi from font_find::@4 to font_find::@return [phi:font_find::@4->font_find::@return] + __breturn_from___b4: + // [73] phi (byte) font_find::return#3 = (byte) font_find::i#2 [phi:font_find::@4->font_find::@return#0] -- register_copy + jmp __breturn + // font_find::@5 + __b5: + // [81] (byte*) font_find::font#1 ← (byte*) font_find::font#4 + (byte) 8 -- pbuz1=pbuz1_plus_vbuc1 + lda #8 + clc + adc.z font + sta.z font + bcc !+ + inc.z font+1 + !: + // [82] (byte) font_find::i#1 ← ++ (byte) font_find::i#2 -- vbuz1=_inc_vbuz1 + inc.z i + // [71] phi from font_find::@5 to font_find::@1 [phi:font_find::@5->font_find::@1] + __b1_from___b5: + // [71] phi (byte*) font_find::font#4 = (byte*) font_find::font#1 [phi:font_find::@5->font_find::@1#0] -- register_copy + // [71] phi (byte) font_find::i#2 = (byte) font_find::i#1 [phi:font_find::@5->font_find::@1#1] -- register_copy + jmp __b1 +} + // font_2x2 +// Create a 2x2-font by doubling all pixels of the 64 first chars +font_2x2: { + .label __1 = $3d + .label __5 = $3e + .label __7 = $42 + .label __11 = $45 + .label __12 = $44 + .label __14 = $47 + .label __15 = $46 + .label next_2x2_left = $15 + .label next_2x2_right = $1e + .label glyph_bits = $20 + .label glyph_bit = $24 + .label glyph_bits_2x2 = $40 + .label glyph_bits_2x2_1 = $21 + .label b = $23 + .label l2 = $1d + .label l = $1a + .label next_2x2_left_1 = $1b + .label next_2x2 = $15 + .label next_original = $17 + .label c = $19 + // [84] phi from font_2x2 to font_2x2::@1 [phi:font_2x2->font_2x2::@1] + __b1_from_font_2x2: + // [84] phi (byte) font_2x2::c#11 = (byte) 0 [phi:font_2x2->font_2x2::@1#0] -- vbuz1=vbuc1 + lda #0 + sta.z c + // [84] phi (byte*) font_2x2::next_original#4 = (const byte*) CHARGEN [phi:font_2x2->font_2x2::@1#1] -- pbuz1=pbuc1 + lda #CHARGEN + sta.z next_original+1 + // [84] phi (byte*) font_2x2::next_2x2_left#0 = (const byte*) FONT_ORIGINAL [phi:font_2x2->font_2x2::@1#2] -- pbuz1=pbuc1 + lda #FONT_ORIGINAL + sta.z next_2x2_left+1 + jmp __b1 + // [84] phi from font_2x2::@9 to font_2x2::@1 [phi:font_2x2::@9->font_2x2::@1] + __b1_from___b9: + // [84] phi (byte) font_2x2::c#11 = (byte) font_2x2::c#1 [phi:font_2x2::@9->font_2x2::@1#0] -- register_copy + // [84] phi (byte*) font_2x2::next_original#4 = (byte*) font_2x2::next_original#1 [phi:font_2x2::@9->font_2x2::@1#1] -- register_copy + // [84] phi (byte*) font_2x2::next_2x2_left#0 = (byte*) font_2x2::next_2x2#1 [phi:font_2x2::@9->font_2x2::@1#2] -- register_copy + jmp __b1 + // font_2x2::@1 + __b1: + // [85] (byte*) font_2x2::next_2x2_right#0 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $40*(number) 8 -- pbuz1=pbuz2_plus_vwuc1 + lda.z next_2x2_left + clc + adc #<$40*8 + sta.z next_2x2_right + lda.z next_2x2_left+1 + adc #>$40*8 + sta.z next_2x2_right+1 + // [86] (byte*) font_2x2::next_2x2_left#10 ← (byte*) font_2x2::next_2x2_left#0 -- pbuz1=pbuz2 + lda.z next_2x2_left + sta.z next_2x2_left_1 + lda.z next_2x2_left+1 + sta.z next_2x2_left_1+1 + // [87] phi from font_2x2::@1 to font_2x2::@2 [phi:font_2x2::@1->font_2x2::@2] + __b2_from___b1: + // [87] phi (byte*) font_2x2::next_2x2_right#7 = (byte*) font_2x2::next_2x2_right#0 [phi:font_2x2::@1->font_2x2::@2#0] -- register_copy + // [87] phi (byte) font_2x2::l2#8 = (byte) 0 [phi:font_2x2::@1->font_2x2::@2#1] -- vbuz1=vbuc1 + lda #0 + sta.z l2 + // [87] phi (byte*) font_2x2::next_2x2_left#7 = (byte*) font_2x2::next_2x2_left#10 [phi:font_2x2::@1->font_2x2::@2#2] -- register_copy + // [87] phi (byte) font_2x2::l#2 = (byte) 0 [phi:font_2x2::@1->font_2x2::@2#3] -- vbuz1=vbuc1 + lda #0 + sta.z l + jmp __b2 + // [87] phi from font_2x2::@8 to font_2x2::@2 [phi:font_2x2::@8->font_2x2::@2] + __b2_from___b8: + // [87] phi (byte*) font_2x2::next_2x2_right#7 = (byte*) font_2x2::next_2x2_right#8 [phi:font_2x2::@8->font_2x2::@2#0] -- register_copy + // [87] phi (byte) font_2x2::l2#8 = (byte) font_2x2::l2#9 [phi:font_2x2::@8->font_2x2::@2#1] -- register_copy + // [87] phi (byte*) font_2x2::next_2x2_left#7 = (byte*) font_2x2::next_2x2_left#8 [phi:font_2x2::@8->font_2x2::@2#2] -- register_copy + // [87] phi (byte) font_2x2::l#2 = (byte) font_2x2::l#1 [phi:font_2x2::@8->font_2x2::@2#3] -- register_copy + jmp __b2 + // font_2x2::@2 + __b2: + // [88] (byte) font_2x2::glyph_bits#0 ← *((byte*) font_2x2::next_original#4 + (byte) font_2x2::l#2) -- vbuz1=pbuz2_derefidx_vbuz3 + ldy.z l + lda (next_original),y + sta.z glyph_bits + // [89] phi from font_2x2::@2 to font_2x2::@3 [phi:font_2x2::@2->font_2x2::@3] + __b3_from___b2: + // [89] phi (byte) font_2x2::b#2 = (byte) 0 [phi:font_2x2::@2->font_2x2::@3#0] -- vbuz1=vbuc1 + lda #0 + sta.z b + // [89] phi (word) font_2x2::glyph_bits_2x2#3 = (word) 0 [phi:font_2x2::@2->font_2x2::@3#1] -- vwuz1=vwuc1 + lda #<0 + sta.z glyph_bits_2x2_1 + lda #>0 + sta.z glyph_bits_2x2_1+1 + // [89] phi (byte) font_2x2::glyph_bits#2 = (byte) font_2x2::glyph_bits#0 [phi:font_2x2::@2->font_2x2::@3#2] -- register_copy + jmp __b3 + // [89] phi from font_2x2::@5 to font_2x2::@3 [phi:font_2x2::@5->font_2x2::@3] + __b3_from___b5: + // [89] phi (byte) font_2x2::b#2 = (byte) font_2x2::b#1 [phi:font_2x2::@5->font_2x2::@3#0] -- register_copy + // [89] phi (word) font_2x2::glyph_bits_2x2#3 = (word) font_2x2::glyph_bits_2x2#2 [phi:font_2x2::@5->font_2x2::@3#1] -- register_copy + // [89] phi (byte) font_2x2::glyph_bits#2 = (byte) font_2x2::glyph_bits#1 [phi:font_2x2::@5->font_2x2::@3#2] -- register_copy + jmp __b3 + // font_2x2::@3 + __b3: + // [90] (byte~) font_2x2::$1 ← (byte) font_2x2::glyph_bits#2 & (byte) $80 -- vbuz1=vbuz2_band_vbuc1 + lda #$80 + and.z glyph_bits + sta.z __1 + // [91] if((byte) 0!=(byte~) font_2x2::$1) goto font_2x2::@4 -- vbuc1_neq_vbuz1_then_la1 + lda #0 + cmp.z __1 + bne __b4_from___b3 + // [93] phi from font_2x2::@3 to font_2x2::@5 [phi:font_2x2::@3->font_2x2::@5] + __b5_from___b3: + // [93] phi (byte) font_2x2::glyph_bit#0 = (byte) 0 [phi:font_2x2::@3->font_2x2::@5#0] -- vbuz1=vbuc1 + lda #0 + sta.z glyph_bit + jmp __b5 + // [92] phi from font_2x2::@3 to font_2x2::@4 [phi:font_2x2::@3->font_2x2::@4] + __b4_from___b3: + jmp __b4 + // font_2x2::@4 + __b4: + // [93] phi from font_2x2::@4 to font_2x2::@5 [phi:font_2x2::@4->font_2x2::@5] + __b5_from___b4: + // [93] phi (byte) font_2x2::glyph_bit#0 = (byte) 1 [phi:font_2x2::@4->font_2x2::@5#0] -- vbuz1=vbuc1 + lda #1 + sta.z glyph_bit + jmp __b5 + // font_2x2::@5 + __b5: + // [94] (word~) font_2x2::$5 ← (word) font_2x2::glyph_bits_2x2#3 << (byte) 1 -- vwuz1=vwuz2_rol_1 + lda.z glyph_bits_2x2_1 + asl + sta.z __5 + lda.z glyph_bits_2x2_1+1 + rol + sta.z __5+1 + // [95] (word) font_2x2::glyph_bits_2x2#1 ← (word~) font_2x2::$5 | (byte) font_2x2::glyph_bit#0 -- vwuz1=vwuz2_bor_vbuz3 + lda.z glyph_bit + ora.z __5 + sta.z glyph_bits_2x2 + lda.z __5+1 + sta.z glyph_bits_2x2+1 + // [96] (word~) font_2x2::$7 ← (word) font_2x2::glyph_bits_2x2#1 << (byte) 1 -- vwuz1=vwuz2_rol_1 + lda.z glyph_bits_2x2 + asl + sta.z __7 + lda.z glyph_bits_2x2+1 + rol + sta.z __7+1 + // [97] (word) font_2x2::glyph_bits_2x2#2 ← (word~) font_2x2::$7 | (byte) font_2x2::glyph_bit#0 -- vwuz1=vwuz2_bor_vbuz3 + lda.z glyph_bit + ora.z __7 + sta.z glyph_bits_2x2_1 + lda.z __7+1 + sta.z glyph_bits_2x2_1+1 + // [98] (byte) font_2x2::glyph_bits#1 ← (byte) font_2x2::glyph_bits#2 << (byte) 1 -- vbuz1=vbuz1_rol_1 + // Move to next bit + asl.z glyph_bits + // [99] (byte) font_2x2::b#1 ← ++ (byte) font_2x2::b#2 -- vbuz1=_inc_vbuz1 + inc.z b + // [100] if((byte) font_2x2::b#1!=(byte) 8) goto font_2x2::@3 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp.z b + bne __b3_from___b5 + jmp __b6 + // font_2x2::@6 + __b6: + // [101] (byte~) font_2x2::$12 ← > (word) font_2x2::glyph_bits_2x2#2 -- vbuz1=_hi_vwuz2 + lda.z glyph_bits_2x2_1+1 + sta.z __12 + // [102] *((byte*) font_2x2::next_2x2_left#7 + (byte) font_2x2::l2#8) ← (byte~) font_2x2::$12 -- pbuz1_derefidx_vbuz2=vbuz3 + // Put the generated 2x2-line into the 2x2-font twice + lda.z __12 + ldy.z l2 + sta (next_2x2_left_1),y + // [103] (byte~) font_2x2::$11 ← (byte) font_2x2::l2#8 + (byte) 1 -- vbuz1=vbuz2_plus_1 + ldy.z l2 + iny + sty.z __11 + // [104] *((byte*) font_2x2::next_2x2_left#7 + (byte~) font_2x2::$11) ← (byte~) font_2x2::$12 -- pbuz1_derefidx_vbuz2=vbuz3 + lda.z __12 + ldy.z __11 + sta (next_2x2_left_1),y + // [105] (byte~) font_2x2::$15 ← < (word) font_2x2::glyph_bits_2x2#2 -- vbuz1=_lo_vwuz2 + lda.z glyph_bits_2x2_1 + sta.z __15 + // [106] *((byte*) font_2x2::next_2x2_right#7 + (byte) font_2x2::l2#8) ← (byte~) font_2x2::$15 -- pbuz1_derefidx_vbuz2=vbuz3 + lda.z __15 + ldy.z l2 + sta (next_2x2_right),y + // [107] (byte~) font_2x2::$14 ← (byte) font_2x2::l2#8 + (byte) 1 -- vbuz1=vbuz2_plus_1 + ldy.z l2 + iny + sty.z __14 + // [108] *((byte*) font_2x2::next_2x2_right#7 + (byte~) font_2x2::$14) ← (byte~) font_2x2::$15 -- pbuz1_derefidx_vbuz2=vbuz3 + lda.z __15 + ldy.z __14 + sta (next_2x2_right),y + // [109] (byte) font_2x2::l2#1 ← (byte) font_2x2::l2#8 + (byte) 2 -- vbuz1=vbuz1_plus_2 + lda.z l2 + clc + adc #2 + sta.z l2 + // [110] if((byte) font_2x2::l2#1!=(byte) 8) goto font_2x2::@8 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp.z l2 + bne __b8_from___b6 + jmp __b7 + // font_2x2::@7 + __b7: + // [111] (byte*) font_2x2::next_2x2_left#1 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $80*(number) 8 -- pbuz1=pbuz2_plus_vwuc1 + lda.z next_2x2_left + clc + adc #<$80*8 + sta.z next_2x2_left_1 + lda.z next_2x2_left+1 + adc #>$80*8 + sta.z next_2x2_left_1+1 + // [112] (byte*) font_2x2::next_2x2_right#1 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $c0*(number) 8 -- pbuz1=pbuz2_plus_vwuc1 + lda.z next_2x2_left + clc + adc #<$c0*8 + sta.z next_2x2_right + lda.z next_2x2_left+1 + adc #>$c0*8 + sta.z next_2x2_right+1 + // [113] phi from font_2x2::@7 to font_2x2::@8 [phi:font_2x2::@7->font_2x2::@8] + __b8_from___b7: + // [113] phi (byte*) font_2x2::next_2x2_right#8 = (byte*) font_2x2::next_2x2_right#1 [phi:font_2x2::@7->font_2x2::@8#0] -- register_copy + // [113] phi (byte) font_2x2::l2#9 = (byte) 0 [phi:font_2x2::@7->font_2x2::@8#1] -- vbuz1=vbuc1 + lda #0 + sta.z l2 + // [113] phi (byte*) font_2x2::next_2x2_left#8 = (byte*) font_2x2::next_2x2_left#1 [phi:font_2x2::@7->font_2x2::@8#2] -- register_copy + jmp __b8 + // [113] phi from font_2x2::@6 to font_2x2::@8 [phi:font_2x2::@6->font_2x2::@8] + __b8_from___b6: + // [113] phi (byte*) font_2x2::next_2x2_right#8 = (byte*) font_2x2::next_2x2_right#7 [phi:font_2x2::@6->font_2x2::@8#0] -- register_copy + // [113] phi (byte) font_2x2::l2#9 = (byte) font_2x2::l2#1 [phi:font_2x2::@6->font_2x2::@8#1] -- register_copy + // [113] phi (byte*) font_2x2::next_2x2_left#8 = (byte*) font_2x2::next_2x2_left#7 [phi:font_2x2::@6->font_2x2::@8#2] -- register_copy + jmp __b8 + // font_2x2::@8 + __b8: + // [114] (byte) font_2x2::l#1 ← ++ (byte) font_2x2::l#2 -- vbuz1=_inc_vbuz1 + inc.z l + // [115] if((byte) font_2x2::l#1!=(byte) 8) goto font_2x2::@2 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp.z l + bne __b2_from___b8 + jmp __b9 + // font_2x2::@9 + __b9: + // [116] (byte*) font_2x2::next_2x2#1 ← (byte*) font_2x2::next_2x2_left#0 + (byte) 8 -- pbuz1=pbuz1_plus_vbuc1 + lda #8 + clc + adc.z next_2x2 + sta.z next_2x2 + bcc !+ + inc.z next_2x2+1 + !: + // [117] (byte*) font_2x2::next_original#1 ← (byte*) font_2x2::next_original#4 + (byte) 8 -- pbuz1=pbuz1_plus_vbuc1 + lda #8 + clc + adc.z next_original + sta.z next_original + bcc !+ + inc.z next_original+1 + !: + // [118] (byte) font_2x2::c#1 ← ++ (byte) font_2x2::c#11 -- vbuz1=_inc_vbuz1 + inc.z c + // [119] if((byte) font_2x2::c#1!=(byte) $40) goto font_2x2::@1 -- vbuz1_neq_vbuc1_then_la1 + lda #$40 + cmp.z c + bne __b1_from___b9 + jmp __breturn + // font_2x2::@return + __breturn: + // [120] return + rts +} + // File Data + .align $100 + FONT_COMPRESSED_MAP: .fill $100, 0 + +REGISTER UPLIFT POTENTIAL REGISTERS +Statement [5] *((const byte*) PROCPORT) ← (const byte) PROCPORT_RAM_CHARROM [ ] ( main:2 [ ] { } ) always clobbers reg byte a +Statement [7] *((const byte*) PROCPORT) ← (const byte) PROCPORT_BASIC_KERNEL_IO [ ] ( main:2 [ ] { } ) always clobbers reg byte a +Statement [11] *((const byte*) D018) ← (const byte) main::toD0181_return#0 [ ] ( main:2 [ ] { } ) always clobbers reg byte a +Statement [26] (word~) show::$0 ← (word)(byte) show::y#0 [ show::c#0 show::x#0 show::$0 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::x#0 show::$0 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::y#4 main::y#1 ] +Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::c#2 main::c#4 main::c#1 ] +Removing always clobbered register reg byte a as potential for zp[1]:4 [ main::x#2 main::x#1 ] +Removing always clobbered register reg byte a as potential for zp[1]:38 [ show::c#0 ] +Removing always clobbered register reg byte a as potential for zp[1]:39 [ show::x#0 ] +Statement [27] (word~) show::$8 ← (word~) show::$0 << (byte) 2 [ show::c#0 show::x#0 show::$0 show::$8 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::x#0 show::$0 show::$8 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a +Statement [28] (word~) show::$9 ← (word~) show::$8 + (word~) show::$0 [ show::c#0 show::x#0 show::$9 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::x#0 show::$9 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a +Statement [29] (word~) show::$1 ← (word~) show::$9 << (byte) 4 [ show::c#0 show::x#0 show::$1 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::x#0 show::$1 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a +Statement [30] (byte*~) show::$2 ← (const byte*) SCREEN + (word~) show::$1 [ show::c#0 show::x#0 show::$2 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::x#0 show::$2 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a +Statement [31] (byte~) show::$3 ← (byte) show::x#0 << (byte) 1 [ show::c#0 show::$2 show::$3 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::$2 show::$3 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a +Statement [32] (byte*) show::ptr#0 ← (byte*~) show::$2 + (byte~) show::$3 [ show::c#0 show::ptr#0 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::ptr#0 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a +Statement [33] *((byte*) show::ptr#0) ← *((const byte*) FONT_COMPRESSED_MAP + (byte) show::c#0) [ show::c#0 show::ptr#0 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::ptr#0 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a reg byte y +Removing always clobbered register reg byte y as potential for zp[1]:2 [ main::y#4 main::y#1 ] +Removing always clobbered register reg byte y as potential for zp[1]:3 [ main::c#2 main::c#4 main::c#1 ] +Removing always clobbered register reg byte y as potential for zp[1]:4 [ main::x#2 main::x#1 ] +Removing always clobbered register reg byte y as potential for zp[1]:38 [ show::c#0 ] +Statement [35] *((byte*) show::ptr#0 + (byte) 1) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $40 + (byte~) show::$5) [ show::c#0 show::ptr#0 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::ptr#0 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a reg byte y +Statement [37] *((byte*) show::ptr#0 + (byte) $28) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $80 + (byte~) show::$6) [ show::c#0 show::ptr#0 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::ptr#0 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a reg byte y +Statement [39] *((byte*) show::ptr#0 + (byte) $29) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $c0 + (byte~) show::$7) [ ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a reg byte y +Statement [43] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2 [ memset::c#0 memset::dst#2 ] ( main:2::memset:13 [ memset::c#0 memset::dst#2 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:37 [ memset::c#0 ] +Statement [45] *((byte*) memset::dst#2) ← (byte) memset::c#0 [ memset::c#0 memset::dst#2 ] ( main:2::memset:13 [ memset::c#0 memset::dst#2 ] { } ) always clobbers reg byte a reg byte y +Removing always clobbered register reg byte y as potential for zp[1]:37 [ memset::c#0 ] +Statement [49] (byte*) font_find::glyph#0 ← (byte*) font_compress::next_original#2 [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#4 font_find::glyph#0 ] ( main:2::font_compress:9 [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#4 font_find::glyph#0 ] { { font_find::glyph#0 = font_compress::next_original#2 } { font_find::font_size#0 = font_compress::font_size#2 } { font_find::return#0 = font_find::return#3 } } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:9 [ font_compress::font_size#2 font_compress::font_size#9 ] +Removing always clobbered register reg byte a as potential for zp[1]:10 [ font_compress::i#4 font_compress::i#1 ] +Statement [56] *((byte*) font_compress::next_compressed#4 + (byte) font_compress::l#2) ← *((byte*) font_compress::next_original#2 + (byte) font_compress::l#2) [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#4 font_compress::l#2 ] ( main:2::font_compress:9 [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#4 font_compress::l#2 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:13 [ font_compress::l#2 font_compress::l#1 ] +Statement [59] (byte*) font_compress::next_compressed#1 ← (byte*) font_compress::next_compressed#4 + (byte) 8 [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#1 ] ( main:2::font_compress:9 [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#1 ] { } ) always clobbers reg byte a +Statement [64] (byte*) font_compress::next_original#1 ← (byte*) font_compress::next_original#2 + (byte) 8 [ font_compress::i#4 font_compress::next_original#1 font_compress::next_compressed#7 font_compress::return#1 ] ( main:2::font_compress:9 [ font_compress::i#4 font_compress::next_original#1 font_compress::next_compressed#7 font_compress::return#1 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:15 [ font_compress::return#1 font_compress::font_size#1 font_compress::return#5 ] +Statement [76] if(*((byte*) font_find::glyph#0 + (byte) font_find::l#2)==*((byte*) font_find::font#4 + (byte) font_find::l#2)) goto font_find::@3 [ font_find::glyph#0 font_find::font_size#0 font_find::i#2 font_find::font#4 font_find::l#2 ] ( main:2::font_compress:9::font_find:51 [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#4 font_find::glyph#0 font_find::font_size#0 font_find::i#2 font_find::font#4 font_find::l#2 ] { { font_find::glyph#0 = font_compress::next_original#2 } { font_find::font_size#0 = font_compress::font_size#2 } { font_find::return#0 = font_find::return#3 } } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:59 [ font_find::font_size#0 ] +Removing always clobbered register reg byte a as potential for zp[1]:18 [ font_find::return#3 font_find::i#2 font_find::i#1 ] +Removing always clobbered register reg byte a as potential for zp[1]:19 [ font_find::l#2 font_find::l#1 ] +Statement [81] (byte*) font_find::font#1 ← (byte*) font_find::font#4 + (byte) 8 [ font_find::glyph#0 font_find::font_size#0 font_find::i#2 font_find::font#1 ] ( main:2::font_compress:9::font_find:51 [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#4 font_find::glyph#0 font_find::font_size#0 font_find::i#2 font_find::font#1 ] { { font_find::glyph#0 = font_compress::next_original#2 } { font_find::font_size#0 = font_compress::font_size#2 } { font_find::return#0 = font_find::return#3 } } ) always clobbers reg byte a +Statement [85] (byte*) font_2x2::next_2x2_right#0 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $40*(number) 8 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::next_2x2_right#0 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::next_2x2_right#0 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:25 [ font_2x2::c#11 font_2x2::c#1 ] +Statement [86] (byte*) font_2x2::next_2x2_left#10 ← (byte*) font_2x2::next_2x2_left#0 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::next_2x2_right#0 font_2x2::next_2x2_left#10 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::next_2x2_right#0 font_2x2::next_2x2_left#10 ] { } ) always clobbers reg byte a +Statement [88] (byte) font_2x2::glyph_bits#0 ← *((byte*) font_2x2::next_original#4 + (byte) font_2x2::l#2) [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#0 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#0 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:26 [ font_2x2::l#2 font_2x2::l#1 ] +Removing always clobbered register reg byte a as potential for zp[1]:29 [ font_2x2::l2#8 font_2x2::l2#9 font_2x2::l2#1 ] +Statement [94] (word~) font_2x2::$5 ← (word) font_2x2::glyph_bits_2x2#3 << (byte) 1 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bit#0 font_2x2::$5 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bit#0 font_2x2::$5 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:32 [ font_2x2::glyph_bits#2 font_2x2::glyph_bits#0 font_2x2::glyph_bits#1 ] +Removing always clobbered register reg byte a as potential for zp[1]:35 [ font_2x2::b#2 font_2x2::b#1 ] +Removing always clobbered register reg byte a as potential for zp[1]:36 [ font_2x2::glyph_bit#0 ] +Statement [95] (word) font_2x2::glyph_bits_2x2#1 ← (word~) font_2x2::$5 | (byte) font_2x2::glyph_bit#0 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bit#0 font_2x2::glyph_bits_2x2#1 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bit#0 font_2x2::glyph_bits_2x2#1 ] { } ) always clobbers reg byte a +Statement [96] (word~) font_2x2::$7 ← (word) font_2x2::glyph_bits_2x2#1 << (byte) 1 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bit#0 font_2x2::$7 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bit#0 font_2x2::$7 ] { } ) always clobbers reg byte a +Statement [97] (word) font_2x2::glyph_bits_2x2#2 ← (word~) font_2x2::$7 | (byte) font_2x2::glyph_bit#0 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bits_2x2#2 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bits_2x2#2 ] { } ) always clobbers reg byte a +Statement [111] (byte*) font_2x2::next_2x2_left#1 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $80*(number) 8 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#1 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#1 ] { } ) always clobbers reg byte a +Statement [112] (byte*) font_2x2::next_2x2_right#1 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $c0*(number) 8 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#1 font_2x2::next_2x2_right#1 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#1 font_2x2::next_2x2_right#1 ] { } ) always clobbers reg byte a +Statement [116] (byte*) font_2x2::next_2x2#1 ← (byte*) font_2x2::next_2x2_left#0 + (byte) 8 [ font_2x2::next_original#4 font_2x2::c#11 font_2x2::next_2x2#1 ] ( main:2::font_2x2:6 [ font_2x2::next_original#4 font_2x2::c#11 font_2x2::next_2x2#1 ] { } ) always clobbers reg byte a +Statement [117] (byte*) font_2x2::next_original#1 ← (byte*) font_2x2::next_original#4 + (byte) 8 [ font_2x2::c#11 font_2x2::next_2x2#1 font_2x2::next_original#1 ] ( main:2::font_2x2:6 [ font_2x2::c#11 font_2x2::next_2x2#1 font_2x2::next_original#1 ] { } ) always clobbers reg byte a +Statement [5] *((const byte*) PROCPORT) ← (const byte) PROCPORT_RAM_CHARROM [ ] ( main:2 [ ] { } ) always clobbers reg byte a +Statement [7] *((const byte*) PROCPORT) ← (const byte) PROCPORT_BASIC_KERNEL_IO [ ] ( main:2 [ ] { } ) always clobbers reg byte a +Statement [11] *((const byte*) D018) ← (const byte) main::toD0181_return#0 [ ] ( main:2 [ ] { } ) always clobbers reg byte a +Statement [26] (word~) show::$0 ← (word)(byte) show::y#0 [ show::c#0 show::x#0 show::$0 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::x#0 show::$0 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a +Statement [27] (word~) show::$8 ← (word~) show::$0 << (byte) 2 [ show::c#0 show::x#0 show::$0 show::$8 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::x#0 show::$0 show::$8 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a +Statement [28] (word~) show::$9 ← (word~) show::$8 + (word~) show::$0 [ show::c#0 show::x#0 show::$9 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::x#0 show::$9 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a +Statement [29] (word~) show::$1 ← (word~) show::$9 << (byte) 4 [ show::c#0 show::x#0 show::$1 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::x#0 show::$1 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a +Statement [30] (byte*~) show::$2 ← (const byte*) SCREEN + (word~) show::$1 [ show::c#0 show::x#0 show::$2 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::x#0 show::$2 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a +Statement [31] (byte~) show::$3 ← (byte) show::x#0 << (byte) 1 [ show::c#0 show::$2 show::$3 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::$2 show::$3 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a +Statement [32] (byte*) show::ptr#0 ← (byte*~) show::$2 + (byte~) show::$3 [ show::c#0 show::ptr#0 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::ptr#0 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a +Statement [33] *((byte*) show::ptr#0) ← *((const byte*) FONT_COMPRESSED_MAP + (byte) show::c#0) [ show::c#0 show::ptr#0 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::ptr#0 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a reg byte y +Statement [35] *((byte*) show::ptr#0 + (byte) 1) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $40 + (byte~) show::$5) [ show::c#0 show::ptr#0 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::ptr#0 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a reg byte y +Statement [37] *((byte*) show::ptr#0 + (byte) $28) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $80 + (byte~) show::$6) [ show::c#0 show::ptr#0 ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 show::c#0 show::ptr#0 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a reg byte y +Statement [39] *((byte*) show::ptr#0 + (byte) $29) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $c0 + (byte~) show::$7) [ ] ( main:2::show:19 [ main::y#4 main::c#2 main::x#2 ] { { show::c#0 = main::c#2 } { show::x#0 = main::x#2 } { show::y#0 = main::y#4 } } ) always clobbers reg byte a reg byte y +Statement [43] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2 [ memset::c#0 memset::dst#2 ] ( main:2::memset:13 [ memset::c#0 memset::dst#2 ] { } ) always clobbers reg byte a +Statement [45] *((byte*) memset::dst#2) ← (byte) memset::c#0 [ memset::c#0 memset::dst#2 ] ( main:2::memset:13 [ memset::c#0 memset::dst#2 ] { } ) always clobbers reg byte a reg byte y +Statement [49] (byte*) font_find::glyph#0 ← (byte*) font_compress::next_original#2 [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#4 font_find::glyph#0 ] ( main:2::font_compress:9 [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#4 font_find::glyph#0 ] { { font_find::glyph#0 = font_compress::next_original#2 } { font_find::font_size#0 = font_compress::font_size#2 } { font_find::return#0 = font_find::return#3 } } ) always clobbers reg byte a +Statement [56] *((byte*) font_compress::next_compressed#4 + (byte) font_compress::l#2) ← *((byte*) font_compress::next_original#2 + (byte) font_compress::l#2) [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#4 font_compress::l#2 ] ( main:2::font_compress:9 [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#4 font_compress::l#2 ] { } ) always clobbers reg byte a +Statement [59] (byte*) font_compress::next_compressed#1 ← (byte*) font_compress::next_compressed#4 + (byte) 8 [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#1 ] ( main:2::font_compress:9 [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#1 ] { } ) always clobbers reg byte a +Statement [64] (byte*) font_compress::next_original#1 ← (byte*) font_compress::next_original#2 + (byte) 8 [ font_compress::i#4 font_compress::next_original#1 font_compress::next_compressed#7 font_compress::return#1 ] ( main:2::font_compress:9 [ font_compress::i#4 font_compress::next_original#1 font_compress::next_compressed#7 font_compress::return#1 ] { } ) always clobbers reg byte a +Statement [76] if(*((byte*) font_find::glyph#0 + (byte) font_find::l#2)==*((byte*) font_find::font#4 + (byte) font_find::l#2)) goto font_find::@3 [ font_find::glyph#0 font_find::font_size#0 font_find::i#2 font_find::font#4 font_find::l#2 ] ( main:2::font_compress:9::font_find:51 [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#4 font_find::glyph#0 font_find::font_size#0 font_find::i#2 font_find::font#4 font_find::l#2 ] { { font_find::glyph#0 = font_compress::next_original#2 } { font_find::font_size#0 = font_compress::font_size#2 } { font_find::return#0 = font_find::return#3 } } ) always clobbers reg byte a +Statement [81] (byte*) font_find::font#1 ← (byte*) font_find::font#4 + (byte) 8 [ font_find::glyph#0 font_find::font_size#0 font_find::i#2 font_find::font#1 ] ( main:2::font_compress:9::font_find:51 [ font_compress::next_original#2 font_compress::font_size#2 font_compress::i#4 font_compress::next_compressed#4 font_find::glyph#0 font_find::font_size#0 font_find::i#2 font_find::font#1 ] { { font_find::glyph#0 = font_compress::next_original#2 } { font_find::font_size#0 = font_compress::font_size#2 } { font_find::return#0 = font_find::return#3 } } ) always clobbers reg byte a +Statement [85] (byte*) font_2x2::next_2x2_right#0 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $40*(number) 8 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::next_2x2_right#0 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::next_2x2_right#0 ] { } ) always clobbers reg byte a +Statement [86] (byte*) font_2x2::next_2x2_left#10 ← (byte*) font_2x2::next_2x2_left#0 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::next_2x2_right#0 font_2x2::next_2x2_left#10 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::next_2x2_right#0 font_2x2::next_2x2_left#10 ] { } ) always clobbers reg byte a +Statement [88] (byte) font_2x2::glyph_bits#0 ← *((byte*) font_2x2::next_original#4 + (byte) font_2x2::l#2) [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#0 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#0 ] { } ) always clobbers reg byte a +Statement [90] (byte~) font_2x2::$1 ← (byte) font_2x2::glyph_bits#2 & (byte) $80 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::glyph_bits_2x2#3 font_2x2::b#2 font_2x2::$1 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::glyph_bits_2x2#3 font_2x2::b#2 font_2x2::$1 ] { } ) always clobbers reg byte a +Statement [94] (word~) font_2x2::$5 ← (word) font_2x2::glyph_bits_2x2#3 << (byte) 1 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bit#0 font_2x2::$5 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bit#0 font_2x2::$5 ] { } ) always clobbers reg byte a +Statement [95] (word) font_2x2::glyph_bits_2x2#1 ← (word~) font_2x2::$5 | (byte) font_2x2::glyph_bit#0 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bit#0 font_2x2::glyph_bits_2x2#1 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bit#0 font_2x2::glyph_bits_2x2#1 ] { } ) always clobbers reg byte a +Statement [96] (word~) font_2x2::$7 ← (word) font_2x2::glyph_bits_2x2#1 << (byte) 1 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bit#0 font_2x2::$7 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bit#0 font_2x2::$7 ] { } ) always clobbers reg byte a +Statement [97] (word) font_2x2::glyph_bits_2x2#2 ← (word~) font_2x2::$7 | (byte) font_2x2::glyph_bit#0 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bits_2x2#2 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#7 font_2x2::l2#8 font_2x2::next_2x2_right#7 font_2x2::glyph_bits#2 font_2x2::b#2 font_2x2::glyph_bits_2x2#2 ] { } ) always clobbers reg byte a +Statement [111] (byte*) font_2x2::next_2x2_left#1 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $80*(number) 8 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#1 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#1 ] { } ) always clobbers reg byte a +Statement [112] (byte*) font_2x2::next_2x2_right#1 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $c0*(number) 8 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#1 font_2x2::next_2x2_right#1 ] ( main:2::font_2x2:6 [ font_2x2::next_2x2_left#0 font_2x2::next_original#4 font_2x2::c#11 font_2x2::l#2 font_2x2::next_2x2_left#1 font_2x2::next_2x2_right#1 ] { } ) always clobbers reg byte a +Statement [116] (byte*) font_2x2::next_2x2#1 ← (byte*) font_2x2::next_2x2_left#0 + (byte) 8 [ font_2x2::next_original#4 font_2x2::c#11 font_2x2::next_2x2#1 ] ( main:2::font_2x2:6 [ font_2x2::next_original#4 font_2x2::c#11 font_2x2::next_2x2#1 ] { } ) always clobbers reg byte a +Statement [117] (byte*) font_2x2::next_original#1 ← (byte*) font_2x2::next_original#4 + (byte) 8 [ font_2x2::c#11 font_2x2::next_2x2#1 font_2x2::next_original#1 ] ( main:2::font_2x2:6 [ font_2x2::c#11 font_2x2::next_2x2#1 font_2x2::next_original#1 ] { } ) always clobbers reg byte a +Potential registers zp[1]:2 [ main::y#4 main::y#1 ] : zp[1]:2 , reg byte x , +Potential registers zp[1]:3 [ main::c#2 main::c#4 main::c#1 ] : zp[1]:3 , reg byte x , +Potential registers zp[1]:4 [ main::x#2 main::x#1 ] : zp[1]:4 , reg byte x , +Potential registers zp[2]:5 [ memset::dst#2 memset::dst#1 ] : zp[2]:5 , +Potential registers zp[2]:7 [ font_compress::next_original#2 font_compress::next_original#1 ] : zp[2]:7 , +Potential registers zp[1]:9 [ font_compress::font_size#2 font_compress::font_size#9 ] : zp[1]:9 , reg byte x , reg byte y , +Potential registers zp[1]:10 [ font_compress::i#4 font_compress::i#1 ] : zp[1]:10 , reg byte x , reg byte y , +Potential registers zp[2]:11 [ font_compress::next_compressed#4 font_compress::next_compressed#7 font_compress::next_compressed#1 ] : zp[2]:11 , +Potential registers zp[1]:13 [ font_compress::l#2 font_compress::l#1 ] : zp[1]:13 , reg byte x , reg byte y , +Potential registers zp[1]:14 [ font_compress::found#2 font_compress::found#3 font_compress::found#0 ] : zp[1]:14 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:15 [ font_compress::return#1 font_compress::font_size#1 font_compress::return#5 ] : zp[1]:15 , reg byte x , reg byte y , +Potential registers zp[2]:16 [ font_find::font#4 font_find::font#1 ] : zp[2]:16 , +Potential registers zp[1]:18 [ font_find::return#3 font_find::i#2 font_find::i#1 ] : zp[1]:18 , reg byte x , reg byte y , +Potential registers zp[1]:19 [ font_find::l#2 font_find::l#1 ] : zp[1]:19 , reg byte x , reg byte y , +Potential registers zp[1]:20 [ font_find::found#2 ] : zp[1]:20 , reg byte a , reg byte x , reg byte y , +Potential registers zp[2]:21 [ font_2x2::next_2x2_left#0 font_2x2::next_2x2#1 ] : zp[2]:21 , +Potential registers zp[2]:23 [ font_2x2::next_original#4 font_2x2::next_original#1 ] : zp[2]:23 , +Potential registers zp[1]:25 [ font_2x2::c#11 font_2x2::c#1 ] : zp[1]:25 , reg byte x , reg byte y , +Potential registers zp[1]:26 [ font_2x2::l#2 font_2x2::l#1 ] : zp[1]:26 , reg byte x , reg byte y , +Potential registers zp[2]:27 [ font_2x2::next_2x2_left#7 font_2x2::next_2x2_left#10 font_2x2::next_2x2_left#8 font_2x2::next_2x2_left#1 ] : zp[2]:27 , +Potential registers zp[1]:29 [ font_2x2::l2#8 font_2x2::l2#9 font_2x2::l2#1 ] : zp[1]:29 , reg byte x , reg byte y , +Potential registers zp[2]:30 [ font_2x2::next_2x2_right#7 font_2x2::next_2x2_right#0 font_2x2::next_2x2_right#8 font_2x2::next_2x2_right#1 ] : zp[2]:30 , +Potential registers zp[1]:32 [ font_2x2::glyph_bits#2 font_2x2::glyph_bits#0 font_2x2::glyph_bits#1 ] : zp[1]:32 , reg byte x , reg byte y , +Potential registers zp[2]:33 [ font_2x2::glyph_bits_2x2#3 font_2x2::glyph_bits_2x2#2 ] : zp[2]:33 , +Potential registers zp[1]:35 [ font_2x2::b#2 font_2x2::b#1 ] : zp[1]:35 , reg byte x , reg byte y , +Potential registers zp[1]:36 [ font_2x2::glyph_bit#0 ] : zp[1]:36 , reg byte x , reg byte y , +Potential registers zp[1]:37 [ memset::c#0 ] : zp[1]:37 , reg byte x , +Potential registers zp[1]:38 [ show::c#0 ] : zp[1]:38 , reg byte x , +Potential registers zp[1]:39 [ show::x#0 ] : zp[1]:39 , reg byte x , reg byte y , +Potential registers zp[1]:40 [ show::y#0 ] : zp[1]:40 , reg byte a , reg byte x , reg byte y , +Potential registers zp[2]:41 [ show::$0 ] : zp[2]:41 , +Potential registers zp[2]:43 [ show::$8 ] : zp[2]:43 , +Potential registers zp[2]:45 [ show::$9 ] : zp[2]:45 , +Potential registers zp[2]:47 [ show::$1 ] : zp[2]:47 , +Potential registers zp[2]:49 [ show::$2 ] : zp[2]:49 , +Potential registers zp[1]:51 [ show::$3 ] : zp[1]:51 , reg byte a , reg byte x , reg byte y , +Potential registers zp[2]:52 [ show::ptr#0 ] : zp[2]:52 , +Potential registers zp[1]:54 [ show::$5 ] : zp[1]:54 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:55 [ show::$6 ] : zp[1]:55 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:56 [ show::$7 ] : zp[1]:56 , reg byte a , reg byte x , reg byte y , +Potential registers zp[2]:57 [ font_find::glyph#0 ] : zp[2]:57 , +Potential registers zp[1]:59 [ font_find::font_size#0 ] : zp[1]:59 , reg byte x , reg byte y , +Potential registers zp[1]:60 [ font_find::return#0 ] : zp[1]:60 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:61 [ font_2x2::$1 ] : zp[1]:61 , reg byte a , reg byte x , reg byte y , +Potential registers zp[2]:62 [ font_2x2::$5 ] : zp[2]:62 , +Potential registers zp[2]:64 [ font_2x2::glyph_bits_2x2#1 ] : zp[2]:64 , +Potential registers zp[2]:66 [ font_2x2::$7 ] : zp[2]:66 , +Potential registers zp[1]:68 [ font_2x2::$12 ] : zp[1]:68 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:69 [ font_2x2::$11 ] : zp[1]:69 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:70 [ font_2x2::$15 ] : zp[1]:70 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:71 [ font_2x2::$14 ] : zp[1]:71 , reg byte a , reg byte x , reg byte y , + +REGISTER UPLIFT SCOPES +Uplift Scope [font_find] 35,000,003.5: zp[1]:19 [ font_find::l#2 font_find::l#1 ] 2,778,114.22: zp[1]:18 [ font_find::return#3 font_find::i#2 font_find::i#1 ] 2,500,001.38: zp[2]:16 [ font_find::font#4 font_find::font#1 ] 1,000,001: zp[1]:20 [ font_find::found#2 ] 769,307.85: zp[2]:57 [ font_find::glyph#0 ] 83,416.83: zp[1]:59 [ font_find::font_size#0 ] 2,002: zp[1]:60 [ font_find::return#0 ] +Uplift Scope [font_2x2] 200,002: zp[1]:61 [ font_2x2::$1 ] 200,002: zp[2]:62 [ font_2x2::$5 ] 200,002: zp[2]:64 [ font_2x2::glyph_bits_2x2#1 ] 200,002: zp[2]:66 [ font_2x2::$7 ] 170,001.7: zp[1]:35 [ font_2x2::b#2 font_2x2::b#1 ] 121,114.22: zp[1]:32 [ font_2x2::glyph_bits#2 font_2x2::glyph_bits#0 font_2x2::glyph_bits#1 ] 67,500.9: zp[2]:33 [ font_2x2::glyph_bits_2x2#3 font_2x2::glyph_bits_2x2#2 ] 50,000.5: zp[1]:36 [ font_2x2::glyph_bit#0 ] 32,712.54: zp[2]:30 [ font_2x2::next_2x2_right#7 font_2x2::next_2x2_right#0 font_2x2::next_2x2_right#8 font_2x2::next_2x2_right#1 ] 24,396.38: zp[1]:29 [ font_2x2::l2#8 font_2x2::l2#9 font_2x2::l2#1 ] 23,712.54: zp[2]:27 [ font_2x2::next_2x2_left#7 font_2x2::next_2x2_left#10 font_2x2::next_2x2_left#8 font_2x2::next_2x2_left#1 ] 20,002: zp[1]:69 [ font_2x2::$11 ] 20,002: zp[1]:71 [ font_2x2::$14 ] 16,112.72: zp[1]:26 [ font_2x2::l#2 font_2x2::l#1 ] 10,001: zp[1]:68 [ font_2x2::$12 ] 10,001: zp[1]:70 [ font_2x2::$15 ] 1,560.38: zp[1]:25 [ font_2x2::c#11 font_2x2::c#1 ] 1,250.69: zp[2]:21 [ font_2x2::next_2x2_left#0 font_2x2::next_2x2#1 ] 1,031.06: zp[2]:23 [ font_2x2::next_original#4 font_2x2::next_original#1 ] +Uplift Scope [show] 20,002: zp[2]:43 [ show::$8 ] 20,002: zp[2]:45 [ show::$9 ] 20,002: zp[2]:47 [ show::$1 ] 20,002: zp[1]:51 [ show::$3 ] 20,002: zp[1]:54 [ show::$5 ] 20,002: zp[1]:55 [ show::$6 ] 20,002: zp[1]:56 [ show::$7 ] 15,001.5: zp[2]:41 [ show::$0 ] 10,001: zp[2]:49 [ show::$2 ] 7,143.57: zp[2]:52 [ show::ptr#0 ] 2,733.67: zp[1]:38 [ show::c#0 ] 1,571.71: zp[1]:39 [ show::x#0 ] 1,001: zp[1]:40 [ show::y#0 ] +Uplift Scope [font_compress] 35,003.5: zp[1]:13 [ font_compress::l#2 font_compress::l#1 ] 6,006: zp[1]:14 [ font_compress::found#2 font_compress::found#3 font_compress::found#0 ] 3,603.6: zp[1]:15 [ font_compress::return#1 font_compress::font_size#1 font_compress::return#5 ] 2,387: zp[1]:9 [ font_compress::font_size#2 font_compress::font_size#9 ] 2,251.5: zp[2]:11 [ font_compress::next_compressed#4 font_compress::next_compressed#7 font_compress::next_compressed#1 ] 1,265.44: zp[2]:7 [ font_compress::next_original#2 font_compress::next_original#1 ] 1,167.83: zp[1]:10 [ font_compress::i#4 font_compress::i#1 ] +Uplift Scope [main] 2,002: zp[1]:4 [ main::x#2 main::x#1 ] 1,243.4: zp[1]:3 [ main::c#2 main::c#4 main::c#1 ] 285.17: zp[1]:2 [ main::y#4 main::y#1 ] +Uplift Scope [memset] 3,336.67: zp[2]:5 [ memset::dst#2 memset::dst#1 ] 168.67: zp[1]:37 [ memset::c#0 ] +Uplift Scope [] + +Uplifting [font_find] best 204483 combination reg byte y [ font_find::l#2 font_find::l#1 ] reg byte x [ font_find::return#3 font_find::i#2 font_find::i#1 ] zp[2]:16 [ font_find::font#4 font_find::font#1 ] reg byte a [ font_find::found#2 ] zp[2]:57 [ font_find::glyph#0 ] zp[1]:59 [ font_find::font_size#0 ] zp[1]:60 [ font_find::return#0 ] +Limited combination testing to 100 combinations of 432 possible. +Uplifting [font_2x2] best 181483 combination reg byte a [ font_2x2::$1 ] zp[2]:62 [ font_2x2::$5 ] zp[2]:64 [ font_2x2::glyph_bits_2x2#1 ] zp[2]:66 [ font_2x2::$7 ] reg byte y [ font_2x2::b#2 font_2x2::b#1 ] zp[1]:32 [ font_2x2::glyph_bits#2 font_2x2::glyph_bits#0 font_2x2::glyph_bits#1 ] zp[2]:33 [ font_2x2::glyph_bits_2x2#3 font_2x2::glyph_bits_2x2#2 ] reg byte x [ font_2x2::glyph_bit#0 ] zp[2]:30 [ font_2x2::next_2x2_right#7 font_2x2::next_2x2_right#0 font_2x2::next_2x2_right#8 font_2x2::next_2x2_right#1 ] zp[1]:29 [ font_2x2::l2#8 font_2x2::l2#9 font_2x2::l2#1 ] zp[2]:27 [ font_2x2::next_2x2_left#7 font_2x2::next_2x2_left#10 font_2x2::next_2x2_left#8 font_2x2::next_2x2_left#1 ] zp[1]:69 [ font_2x2::$11 ] zp[1]:71 [ font_2x2::$14 ] zp[1]:26 [ font_2x2::l#2 font_2x2::l#1 ] zp[1]:68 [ font_2x2::$12 ] zp[1]:70 [ font_2x2::$15 ] zp[1]:25 [ font_2x2::c#11 font_2x2::c#1 ] zp[2]:21 [ font_2x2::next_2x2_left#0 font_2x2::next_2x2#1 ] zp[2]:23 [ font_2x2::next_original#4 font_2x2::next_original#1 ] +Limited combination testing to 100 combinations of 746496 possible. +Uplifting [show] best 181463 combination zp[2]:43 [ show::$8 ] zp[2]:45 [ show::$9 ] zp[2]:47 [ show::$1 ] reg byte a [ show::$3 ] reg byte x [ show::$5 ] reg byte a [ show::$6 ] reg byte a [ show::$7 ] zp[2]:41 [ show::$0 ] zp[2]:49 [ show::$2 ] zp[2]:52 [ show::ptr#0 ] zp[1]:38 [ show::c#0 ] zp[1]:39 [ show::x#0 ] zp[1]:40 [ show::y#0 ] +Limited combination testing to 100 combinations of 6144 possible. +Uplifting [font_compress] best 180053 combination reg byte y [ font_compress::l#2 font_compress::l#1 ] reg byte a [ font_compress::found#2 font_compress::found#3 font_compress::found#0 ] reg byte x [ font_compress::return#1 font_compress::font_size#1 font_compress::return#5 ] zp[1]:9 [ font_compress::font_size#2 font_compress::font_size#9 ] zp[2]:11 [ font_compress::next_compressed#4 font_compress::next_compressed#7 font_compress::next_compressed#1 ] zp[2]:7 [ font_compress::next_original#2 font_compress::next_original#1 ] zp[1]:10 [ font_compress::i#4 font_compress::i#1 ] +Limited combination testing to 100 combinations of 324 possible. +Uplifting [main] best 180053 combination zp[1]:4 [ main::x#2 main::x#1 ] zp[1]:3 [ main::c#2 main::c#4 main::c#1 ] zp[1]:2 [ main::y#4 main::y#1 ] +Uplifting [memset] best 180040 combination zp[2]:5 [ memset::dst#2 memset::dst#1 ] reg byte x [ memset::c#0 ] +Uplifting [] best 180040 combination +Attempting to uplift remaining variables inzp[1]:32 [ font_2x2::glyph_bits#2 font_2x2::glyph_bits#0 font_2x2::glyph_bits#1 ] +Uplifting [font_2x2] best 180040 combination zp[1]:32 [ font_2x2::glyph_bits#2 font_2x2::glyph_bits#0 font_2x2::glyph_bits#1 ] +Attempting to uplift remaining variables inzp[1]:59 [ font_find::font_size#0 ] +Uplifting [font_find] best 180040 combination zp[1]:59 [ font_find::font_size#0 ] +Attempting to uplift remaining variables inzp[1]:29 [ font_2x2::l2#8 font_2x2::l2#9 font_2x2::l2#1 ] +Uplifting [font_2x2] best 180040 combination zp[1]:29 [ font_2x2::l2#8 font_2x2::l2#9 font_2x2::l2#1 ] +Attempting to uplift remaining variables inzp[1]:69 [ font_2x2::$11 ] +Uplifting [font_2x2] best 179440 combination reg byte y [ font_2x2::$11 ] +Attempting to uplift remaining variables inzp[1]:71 [ font_2x2::$14 ] +Uplifting [font_2x2] best 178840 combination reg byte y [ font_2x2::$14 ] +Attempting to uplift remaining variables inzp[1]:26 [ font_2x2::l#2 font_2x2::l#1 ] +Uplifting [font_2x2] best 178840 combination zp[1]:26 [ font_2x2::l#2 font_2x2::l#1 ] +Attempting to uplift remaining variables inzp[1]:68 [ font_2x2::$12 ] +Uplifting [font_2x2] best 177940 combination reg byte a [ font_2x2::$12 ] +Attempting to uplift remaining variables inzp[1]:70 [ font_2x2::$15 ] +Uplifting [font_2x2] best 177040 combination reg byte a [ font_2x2::$15 ] +Attempting to uplift remaining variables inzp[1]:38 [ show::c#0 ] +Uplifting [show] best 177040 combination zp[1]:38 [ show::c#0 ] +Attempting to uplift remaining variables inzp[1]:9 [ font_compress::font_size#2 font_compress::font_size#9 ] +Uplifting [font_compress] best 177040 combination zp[1]:9 [ font_compress::font_size#2 font_compress::font_size#9 ] +Attempting to uplift remaining variables inzp[1]:4 [ main::x#2 main::x#1 ] +Uplifting [main] best 177040 combination zp[1]:4 [ main::x#2 main::x#1 ] +Attempting to uplift remaining variables inzp[1]:60 [ font_find::return#0 ] +Uplifting [font_find] best 177000 combination reg byte a [ font_find::return#0 ] +Attempting to uplift remaining variables inzp[1]:39 [ show::x#0 ] +Uplifting [show] best 176699 combination reg byte x [ show::x#0 ] +Attempting to uplift remaining variables inzp[1]:25 [ font_2x2::c#11 font_2x2::c#1 ] +Uplifting [font_2x2] best 176699 combination zp[1]:25 [ font_2x2::c#11 font_2x2::c#1 ] +Attempting to uplift remaining variables inzp[1]:3 [ main::c#2 main::c#4 main::c#1 ] +Uplifting [main] best 176699 combination zp[1]:3 [ main::c#2 main::c#4 main::c#1 ] +Attempting to uplift remaining variables inzp[1]:10 [ font_compress::i#4 font_compress::i#1 ] +Uplifting [font_compress] best 176699 combination zp[1]:10 [ font_compress::i#4 font_compress::i#1 ] +Attempting to uplift remaining variables inzp[1]:40 [ show::y#0 ] +Uplifting [show] best 176396 combination reg byte a [ show::y#0 ] +Attempting to uplift remaining variables inzp[1]:2 [ main::y#4 main::y#1 ] +Uplifting [main] best 176396 combination zp[1]:2 [ main::y#4 main::y#1 ] +Coalescing zero page register [ zp[1]:3 [ main::c#2 main::c#4 main::c#1 ] ] with [ zp[1]:38 [ show::c#0 ] ] - score: 1 +Coalescing zero page register [ zp[2]:7 [ font_compress::next_original#2 font_compress::next_original#1 ] ] with [ zp[2]:57 [ font_find::glyph#0 ] ] - score: 1 +Coalescing zero page register [ zp[1]:9 [ font_compress::font_size#2 font_compress::font_size#9 ] ] with [ zp[1]:59 [ font_find::font_size#0 ] ] - score: 1 +Coalescing zero page register [ zp[2]:33 [ font_2x2::glyph_bits_2x2#3 font_2x2::glyph_bits_2x2#2 ] ] with [ zp[2]:62 [ font_2x2::$5 ] ] - score: 1 +Coalescing zero page register [ zp[2]:33 [ font_2x2::glyph_bits_2x2#3 font_2x2::glyph_bits_2x2#2 font_2x2::$5 ] ] with [ zp[2]:66 [ font_2x2::$7 ] ] - score: 1 +Coalescing zero page register [ zp[2]:41 [ show::$0 ] ] with [ zp[2]:45 [ show::$9 ] ] - score: 1 +Coalescing zero page register [ zp[2]:47 [ show::$1 ] ] with [ zp[2]:49 [ show::$2 ] ] - score: 1 +Coalescing zero page register [ zp[2]:33 [ font_2x2::glyph_bits_2x2#3 font_2x2::glyph_bits_2x2#2 font_2x2::$5 font_2x2::$7 ] ] with [ zp[2]:64 [ font_2x2::glyph_bits_2x2#1 ] ] - score: 2 +Coalescing zero page register [ zp[2]:41 [ show::$0 show::$9 ] ] with [ zp[2]:47 [ show::$1 show::$2 ] ] - score: 1 +Coalescing zero page register [ zp[2]:41 [ show::$0 show::$9 show::$1 show::$2 ] ] with [ zp[2]:52 [ show::ptr#0 ] ] - score: 1 +Coalescing zero page register [ zp[2]:7 [ font_compress::next_original#2 font_compress::next_original#1 font_find::glyph#0 ] ] with [ zp[2]:5 [ memset::dst#2 memset::dst#1 ] ] +Coalescing zero page register [ zp[2]:21 [ font_2x2::next_2x2_left#0 font_2x2::next_2x2#1 ] ] with [ zp[2]:11 [ font_compress::next_compressed#4 font_compress::next_compressed#7 font_compress::next_compressed#1 ] ] +Coalescing zero page register [ zp[2]:23 [ font_2x2::next_original#4 font_2x2::next_original#1 ] ] with [ zp[2]:16 [ font_find::font#4 font_find::font#1 ] ] +Coalescing zero page register [ zp[1]:25 [ font_2x2::c#11 font_2x2::c#1 ] ] with [ zp[1]:9 [ font_compress::font_size#2 font_compress::font_size#9 font_find::font_size#0 ] ] +Coalescing zero page register [ zp[1]:26 [ font_2x2::l#2 font_2x2::l#1 ] ] with [ zp[1]:10 [ font_compress::i#4 font_compress::i#1 ] ] +Coalescing zero page register [ zp[2]:41 [ show::$0 show::$9 show::$1 show::$2 show::ptr#0 ] ] with [ zp[2]:27 [ font_2x2::next_2x2_left#7 font_2x2::next_2x2_left#10 font_2x2::next_2x2_left#8 font_2x2::next_2x2_left#1 ] ] +Coalescing zero page register [ zp[2]:43 [ show::$8 ] ] with [ zp[2]:30 [ font_2x2::next_2x2_right#7 font_2x2::next_2x2_right#0 font_2x2::next_2x2_right#8 font_2x2::next_2x2_right#1 ] ] +Coalescing zero page register [ zp[2]:33 [ font_2x2::glyph_bits_2x2#3 font_2x2::glyph_bits_2x2#2 font_2x2::$5 font_2x2::$7 font_2x2::glyph_bits_2x2#1 ] ] with [ zp[2]:7 [ font_compress::next_original#2 font_compress::next_original#1 font_find::glyph#0 memset::dst#2 memset::dst#1 ] ] +Allocated (was zp[2]:21) zp[2]:5 [ font_2x2::next_2x2_left#0 font_2x2::next_2x2#1 font_compress::next_compressed#4 font_compress::next_compressed#7 font_compress::next_compressed#1 ] +Allocated (was zp[2]:23) zp[2]:7 [ font_2x2::next_original#4 font_2x2::next_original#1 font_find::font#4 font_find::font#1 ] +Allocated (was zp[1]:25) zp[1]:9 [ font_2x2::c#11 font_2x2::c#1 font_compress::font_size#2 font_compress::font_size#9 font_find::font_size#0 ] +Allocated (was zp[1]:26) zp[1]:10 [ font_2x2::l#2 font_2x2::l#1 font_compress::i#4 font_compress::i#1 ] +Allocated (was zp[1]:29) zp[1]:11 [ font_2x2::l2#8 font_2x2::l2#9 font_2x2::l2#1 ] +Allocated (was zp[1]:32) zp[1]:12 [ font_2x2::glyph_bits#2 font_2x2::glyph_bits#0 font_2x2::glyph_bits#1 ] +Allocated (was zp[2]:33) zp[2]:13 [ font_2x2::glyph_bits_2x2#3 font_2x2::glyph_bits_2x2#2 font_2x2::$5 font_2x2::$7 font_2x2::glyph_bits_2x2#1 font_compress::next_original#2 font_compress::next_original#1 font_find::glyph#0 memset::dst#2 memset::dst#1 ] +Allocated (was zp[2]:41) zp[2]:15 [ show::$0 show::$9 show::$1 show::$2 show::ptr#0 font_2x2::next_2x2_left#7 font_2x2::next_2x2_left#10 font_2x2::next_2x2_left#8 font_2x2::next_2x2_left#1 ] +Allocated (was zp[2]:43) zp[2]:17 [ show::$8 font_2x2::next_2x2_right#7 font_2x2::next_2x2_right#0 font_2x2::next_2x2_right#8 font_2x2::next_2x2_right#1 ] + +ASSEMBLER BEFORE OPTIMIZATION + // File Comments +// Creates a 2x2 font from the system CHARGEN font and compress it by identifying identical chars + // Upstart +.pc = $801 "Basic" +:BasicUpstart(__bbegin) +.pc = $80d "Program" + // Global Constants & labels + // Processor Port Register controlling RAM/ROM configuration and the datasette + .label PROCPORT = 1 + // RAM in $A000, $E000 CHAR ROM in $D000 + .const PROCPORT_RAM_CHARROM = 1 + // BASIC in $A000, I/O in $D000, KERNEL in $E000 + .const PROCPORT_BASIC_KERNEL_IO = 7 + // The address of the CHARGEN character set + .label CHARGEN = $d000 + .label D018 = $d018 + .label SCREEN = $400 + .label FONT_ORIGINAL = $2000 + .label FONT_COMPRESSED = $2800 + // @begin +__bbegin: + // [1] phi from @begin to @1 [phi:@begin->@1] +__b1_from___bbegin: + jmp __b1 + // @1 +__b1: + // [2] call main + jsr main + // [3] phi from @1 to @end [phi:@1->@end] +__bend_from___b1: + jmp __bend + // @end +__bend: + // main +main: { + .const toD0181_return = (>(SCREEN&$3fff)*4)|(>FONT_COMPRESSED)/4&$f + .label c = 3 + .label x = 4 + .label y = 2 + // asm { sei } + // Create 2x2 font from CHARGEN + sei + // [5] *((const byte*) PROCPORT) ← (const byte) PROCPORT_RAM_CHARROM -- _deref_pbuc1=vbuc2 + lda #PROCPORT_RAM_CHARROM + sta PROCPORT + // [6] call font_2x2 + // [83] phi from main to font_2x2 [phi:main->font_2x2] + font_2x2_from_main: + jsr font_2x2 + jmp __b6 + // main::@6 + __b6: + // [7] *((const byte*) PROCPORT) ← (const byte) PROCPORT_BASIC_KERNEL_IO -- _deref_pbuc1=vbuc2 + lda #PROCPORT_BASIC_KERNEL_IO + sta PROCPORT + // asm { cli } + cli + // [9] call font_compress + // [47] phi from main::@6 to font_compress [phi:main::@6->font_compress] + font_compress_from___b6: + jsr font_compress + // [10] phi from main::@6 to main::toD0181 [phi:main::@6->main::toD0181] + toD0181_from___b6: + jmp toD0181 + // main::toD0181 + toD0181: + jmp __b5 + // main::@5 + __b5: + // [11] *((const byte*) D018) ← (const byte) main::toD0181_return#0 -- _deref_pbuc1=vbuc2 + // Show compressed font + lda #toD0181_return + sta D018 + // [12] (byte) memset::c#0 ← *((const byte*) FONT_COMPRESSED_MAP+(byte) ' ') -- vbuxx=_deref_pbuc1 + ldx FONT_COMPRESSED_MAP+' ' + // [13] call memset + // Clear the screen + // [41] phi from main::@5 to memset [phi:main::@5->memset] + memset_from___b5: + jsr memset + // [14] phi from main::@5 to main::@1 [phi:main::@5->main::@1] + __b1_from___b5: + // [14] phi (byte) main::y#4 = (byte) 0 [phi:main::@5->main::@1#0] -- vbuz1=vbuc1 + lda #0 + sta.z y + // [14] phi (byte) main::c#4 = (byte) 0 [phi:main::@5->main::@1#1] -- vbuz1=vbuc1 + lda #0 + sta.z c + jmp __b1 + // [14] phi from main::@3 to main::@1 [phi:main::@3->main::@1] + __b1_from___b3: + // [14] phi (byte) main::y#4 = (byte) main::y#1 [phi:main::@3->main::@1#0] -- register_copy + // [14] phi (byte) main::c#4 = (byte) main::c#1 [phi:main::@3->main::@1#1] -- register_copy + jmp __b1 + // main::@1 + __b1: + // [15] phi from main::@1 to main::@2 [phi:main::@1->main::@2] + __b2_from___b1: + // [15] phi (byte) main::x#2 = (byte) 0 [phi:main::@1->main::@2#0] -- vbuz1=vbuc1 + lda #0 + sta.z x + // [15] phi (byte) main::c#2 = (byte) main::c#4 [phi:main::@1->main::@2#1] -- register_copy + jmp __b2 + // [15] phi from main::@7 to main::@2 [phi:main::@7->main::@2] + __b2_from___b7: + // [15] phi (byte) main::x#2 = (byte) main::x#1 [phi:main::@7->main::@2#0] -- register_copy + // [15] phi (byte) main::c#2 = (byte) main::c#1 [phi:main::@7->main::@2#1] -- register_copy + jmp __b2 + // main::@2 + __b2: + // [16] (byte) show::c#0 ← (byte) main::c#2 + // [17] (byte) show::x#0 ← (byte) main::x#2 -- vbuxx=vbuz1 + ldx.z x + // [18] (byte) show::y#0 ← (byte) main::y#4 -- vbuaa=vbuz1 + lda.z y + // [19] call show + jsr show + jmp __b7 + // main::@7 + __b7: + // [20] (byte) main::c#1 ← ++ (byte) main::c#2 -- vbuz1=_inc_vbuz1 + inc.z c + // [21] (byte) main::x#1 ← ++ (byte) main::x#2 -- vbuz1=_inc_vbuz1 + inc.z x + // [22] if((byte) main::x#1!=(byte) 8) goto main::@2 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp.z x + bne __b2_from___b7 + jmp __b3 + // main::@3 + __b3: + // [23] (byte) main::y#1 ← ++ (byte) main::y#4 -- vbuz1=_inc_vbuz1 + inc.z y + // [24] if((byte) main::y#1!=(byte) 8) goto main::@1 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp.z y + bne __b1_from___b3 + jmp __b4 + // main::@4 + __b4: + // [25] *((const byte*) SCREEN+(word) $3e7) ← ++ *((const byte*) SCREEN+(word) $3e7) -- _deref_pbuc1=_inc__deref_pbuc1 + inc SCREEN+$3e7 + jmp __b4 +} + // show +// Show a 2x2 char on the screen at 2x2-position (x, y) using a font compress mapping +// show(byte zp(3) c, byte register(X) x, byte register(A) y) +show: { + .label __0 = $f + .label __1 = $f + .label __2 = $f + .label c = 3 + .label ptr = $f + .label __8 = $11 + .label __9 = $f + // [26] (word~) show::$0 ← (word)(byte) show::y#0 -- vwuz1=_word_vbuaa + sta.z __0 + lda #0 + sta.z __0+1 + // [27] (word~) show::$8 ← (word~) show::$0 << (byte) 2 -- vwuz1=vwuz2_rol_2 + lda.z __0 + asl + sta.z __8 + lda.z __0+1 + rol + sta.z __8+1 + asl.z __8 + rol.z __8+1 + // [28] (word~) show::$9 ← (word~) show::$8 + (word~) show::$0 -- vwuz1=vwuz2_plus_vwuz1 + lda.z __9 + clc + adc.z __8 + sta.z __9 + lda.z __9+1 + adc.z __8+1 + sta.z __9+1 + // [29] (word~) show::$1 ← (word~) show::$9 << (byte) 4 -- vwuz1=vwuz1_rol_4 + asl.z __1 + rol.z __1+1 + asl.z __1 + rol.z __1+1 + asl.z __1 + rol.z __1+1 + asl.z __1 + rol.z __1+1 + // [30] (byte*~) show::$2 ← (const byte*) SCREEN + (word~) show::$1 -- pbuz1=pbuc1_plus_vwuz1 + clc + lda.z __2 + adc #SCREEN + sta.z __2+1 + // [31] (byte~) show::$3 ← (byte) show::x#0 << (byte) 1 -- vbuaa=vbuxx_rol_1 + txa + asl + // [32] (byte*) show::ptr#0 ← (byte*~) show::$2 + (byte~) show::$3 -- pbuz1=pbuz1_plus_vbuaa + clc + adc.z ptr + sta.z ptr + bcc !+ + inc.z ptr+1 + !: + // [33] *((byte*) show::ptr#0) ← *((const byte*) FONT_COMPRESSED_MAP + (byte) show::c#0) -- _deref_pbuz1=pbuc1_derefidx_vbuz2 + ldy.z c + lda FONT_COMPRESSED_MAP,y + ldy #0 + sta (ptr),y + // [34] (byte~) show::$5 ← (byte) show::c#0 -- vbuxx=vbuz1 + ldx.z c + // [35] *((byte*) show::ptr#0 + (byte) 1) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $40 + (byte~) show::$5) -- pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuxx + lda FONT_COMPRESSED_MAP+$40,x + ldy #1 + sta (ptr),y + // [36] (byte~) show::$6 ← (byte) show::c#0 -- vbuaa=vbuz1 + lda.z c + // [37] *((byte*) show::ptr#0 + (byte) $28) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $80 + (byte~) show::$6) -- pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuaa + tay + lda FONT_COMPRESSED_MAP+$80,y + ldy #$28 + sta (ptr),y + // [38] (byte~) show::$7 ← (byte) show::c#0 -- vbuaa=vbuz1 + lda.z c + // [39] *((byte*) show::ptr#0 + (byte) $29) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $c0 + (byte~) show::$7) -- pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuaa + tay + lda FONT_COMPRESSED_MAP+$c0,y + ldy #$29 + sta (ptr),y + jmp __breturn + // show::@return + __breturn: + // [40] return + rts +} + // memset +// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str. +// memset(byte register(X) c) +memset: { + .label str = SCREEN + .const num = $400 + .label end = str+num + .label dst = $d + // [42] phi from memset to memset::@1 [phi:memset->memset::@1] + __b1_from_memset: + // [42] phi (byte*) memset::dst#2 = (byte*)(const void*) memset::str#0 [phi:memset->memset::@1#0] -- pbuz1=pbuc1 + lda #str + sta.z dst+1 + jmp __b1 + // memset::@1 + __b1: + // [43] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2 -- pbuz1_neq_pbuc1_then_la1 + lda.z dst+1 + cmp #>end + bne __b2 + lda.z dst + cmp #memset::@1] + __b1_from___b2: + // [42] phi (byte*) memset::dst#2 = (byte*) memset::dst#1 [phi:memset::@2->memset::@1#0] -- register_copy + jmp __b1 +} + // font_compress +// Compress a font finding identical characters +// The compressed font is put into font_compressed and the compress_mapping is updated +// so that compress_mapping[c] points to the char in font_compressed that is identical to char c in font_original +// Returns the size of the compressed font (in chars) +font_compress: { + .label next_original = $d + .label i = $a + .label next_compressed = 5 + .label font_size = 9 + // [48] phi from font_compress to font_compress::@1 [phi:font_compress->font_compress::@1] + __b1_from_font_compress: + // [48] phi (byte*) font_compress::next_compressed#4 = (const byte*) FONT_COMPRESSED [phi:font_compress->font_compress::@1#0] -- pbuz1=pbuc1 + lda #FONT_COMPRESSED + sta.z next_compressed+1 + // [48] phi (byte) font_compress::i#4 = (byte) 0 [phi:font_compress->font_compress::@1#1] -- vbuz1=vbuc1 + lda #0 + sta.z i + // [48] phi (byte) font_compress::font_size#2 = (byte) 0 [phi:font_compress->font_compress::@1#2] -- vbuz1=vbuc1 + lda #0 + sta.z font_size + // [48] phi (byte*) font_compress::next_original#2 = (const byte*) FONT_ORIGINAL [phi:font_compress->font_compress::@1#3] -- pbuz1=pbuc1 + lda #FONT_ORIGINAL + sta.z next_original+1 + jmp __b1 + // font_compress::@1 + __b1: + // [49] (byte*) font_find::glyph#0 ← (byte*) font_compress::next_original#2 + // [50] (byte) font_find::font_size#0 ← (byte) font_compress::font_size#2 + // [51] call font_find + // [70] phi from font_compress::@1 to font_find [phi:font_compress::@1->font_find] + font_find_from___b1: + jsr font_find + // [52] (byte) font_find::return#0 ← (byte) font_find::return#3 -- vbuaa=vbuxx + txa + jmp __b5 + // font_compress::@5 + __b5: + // [53] (byte) font_compress::found#0 ← (byte) font_find::return#0 + // [54] if((byte) font_compress::found#0!=(byte) $ff) goto font_compress::@7 -- vbuaa_neq_vbuc1_then_la1 + cmp #$ff + bne __b7 + // [55] phi from font_compress::@5 to font_compress::@3 [phi:font_compress::@5->font_compress::@3] + __b3_from___b5: + // [55] phi (byte) font_compress::l#2 = (byte) 0 [phi:font_compress::@5->font_compress::@3#0] -- vbuyy=vbuc1 + ldy #0 + jmp __b3 + // Glyph not found - create it + // [55] phi from font_compress::@3 to font_compress::@3 [phi:font_compress::@3->font_compress::@3] + __b3_from___b3: + // [55] phi (byte) font_compress::l#2 = (byte) font_compress::l#1 [phi:font_compress::@3->font_compress::@3#0] -- register_copy + jmp __b3 + // font_compress::@3 + __b3: + // [56] *((byte*) font_compress::next_compressed#4 + (byte) font_compress::l#2) ← *((byte*) font_compress::next_original#2 + (byte) font_compress::l#2) -- pbuz1_derefidx_vbuyy=pbuz2_derefidx_vbuyy + lda (next_original),y + sta (next_compressed),y + // [57] (byte) font_compress::l#1 ← ++ (byte) font_compress::l#2 -- vbuyy=_inc_vbuyy + iny + // [58] if((byte) font_compress::l#1!=(byte) 8) goto font_compress::@3 -- vbuyy_neq_vbuc1_then_la1 + cpy #8 + bne __b3_from___b3 + jmp __b4 + // font_compress::@4 + __b4: + // [59] (byte*) font_compress::next_compressed#1 ← (byte*) font_compress::next_compressed#4 + (byte) 8 -- pbuz1=pbuz1_plus_vbuc1 + lda #8 + clc + adc.z next_compressed + sta.z next_compressed + bcc !+ + inc.z next_compressed+1 + !: + // [60] (byte) font_compress::font_size#1 ← ++ (byte) font_compress::font_size#2 -- vbuxx=_inc_vbuz1 + ldx.z font_size + inx + // [61] (byte) font_compress::found#3 ← (byte) font_compress::font_size#2 -- vbuaa=vbuz1 + lda.z font_size + // [62] phi from font_compress::@4 font_compress::@7 to font_compress::@2 [phi:font_compress::@4/font_compress::@7->font_compress::@2] + __b2_from___b4: + __b2_from___b7: + // [62] phi (byte*) font_compress::next_compressed#7 = (byte*) font_compress::next_compressed#1 [phi:font_compress::@4/font_compress::@7->font_compress::@2#0] -- register_copy + // [62] phi (byte) font_compress::return#1 = (byte) font_compress::font_size#1 [phi:font_compress::@4/font_compress::@7->font_compress::@2#1] -- register_copy + // [62] phi (byte) font_compress::found#2 = (byte) font_compress::found#3 [phi:font_compress::@4/font_compress::@7->font_compress::@2#2] -- register_copy + jmp __b2 + // font_compress::@2 + __b2: + // [63] *((const byte*) FONT_COMPRESSED_MAP + (byte) font_compress::i#4) ← (byte) font_compress::found#2 -- pbuc1_derefidx_vbuz1=vbuaa + ldy.z i + sta FONT_COMPRESSED_MAP,y + // [64] (byte*) font_compress::next_original#1 ← (byte*) font_compress::next_original#2 + (byte) 8 -- pbuz1=pbuz1_plus_vbuc1 + lda #8 + clc + adc.z next_original + sta.z next_original + bcc !+ + inc.z next_original+1 + !: + // [65] (byte) font_compress::i#1 ← ++ (byte) font_compress::i#4 -- vbuz1=_inc_vbuz1 + inc.z i + // [66] if((byte) font_compress::i#1!=(byte) 0) goto font_compress::@6 -- vbuz1_neq_0_then_la1 + lda.z i + cmp #0 + bne __b6 + jmp __breturn + // font_compress::@return + __breturn: + // [67] return + rts + // font_compress::@6 + __b6: + // [68] (byte) font_compress::font_size#9 ← (byte) font_compress::return#1 -- vbuz1=vbuxx + stx.z font_size + // [48] phi from font_compress::@6 to font_compress::@1 [phi:font_compress::@6->font_compress::@1] + __b1_from___b6: + // [48] phi (byte*) font_compress::next_compressed#4 = (byte*) font_compress::next_compressed#7 [phi:font_compress::@6->font_compress::@1#0] -- register_copy + // [48] phi (byte) font_compress::i#4 = (byte) font_compress::i#1 [phi:font_compress::@6->font_compress::@1#1] -- register_copy + // [48] phi (byte) font_compress::font_size#2 = (byte) font_compress::font_size#9 [phi:font_compress::@6->font_compress::@1#2] -- register_copy + // [48] phi (byte*) font_compress::next_original#2 = (byte*) font_compress::next_original#1 [phi:font_compress::@6->font_compress::@1#3] -- register_copy + jmp __b1 + // font_compress::@7 + __b7: + // [69] (byte) font_compress::return#5 ← (byte) font_compress::font_size#2 -- vbuxx=vbuz1 + ldx.z font_size + jmp __b2_from___b7 +} + // font_find +// Look for a glyph within a font +// Only looks at the first font_size glyphs +// Returns the index of the glyph within the font. Returns 0xff if the glyph is not found. +// font_find(byte* zp($d) glyph, byte* zp(7) font, byte zp(9) font_size) +font_find: { + .label glyph = $d + .label font_size = 9 + .label font = 7 + // [71] phi from font_find to font_find::@1 [phi:font_find->font_find::@1] + __b1_from_font_find: + // [71] phi (byte*) font_find::font#4 = (const byte*) FONT_COMPRESSED [phi:font_find->font_find::@1#0] -- pbuz1=pbuc1 + lda #FONT_COMPRESSED + sta.z font+1 + // [71] phi (byte) font_find::i#2 = (byte) 0 [phi:font_find->font_find::@1#1] -- vbuxx=vbuc1 + ldx #0 + jmp __b1 + // font_find::@1 + __b1: + // [72] if((byte) font_find::i#2<(byte) font_find::font_size#0) goto font_find::@2 -- vbuxx_lt_vbuz1_then_la1 + cpx.z font_size + bcc __b2_from___b1 + // [73] phi from font_find::@1 to font_find::@return [phi:font_find::@1->font_find::@return] + __breturn_from___b1: + // [73] phi (byte) font_find::return#3 = (byte) $ff [phi:font_find::@1->font_find::@return#0] -- vbuxx=vbuc1 + ldx #$ff + jmp __breturn + // font_find::@return + __breturn: + // [74] return + rts + // [75] phi from font_find::@1 to font_find::@2 [phi:font_find::@1->font_find::@2] + __b2_from___b1: + // [75] phi (byte) font_find::l#2 = (byte) 0 [phi:font_find::@1->font_find::@2#0] -- vbuyy=vbuc1 + ldy #0 + jmp __b2 + // [75] phi from font_find::@3 to font_find::@2 [phi:font_find::@3->font_find::@2] + __b2_from___b3: + // [75] phi (byte) font_find::l#2 = (byte) font_find::l#1 [phi:font_find::@3->font_find::@2#0] -- register_copy + jmp __b2 + // font_find::@2 + __b2: + // [76] if(*((byte*) font_find::glyph#0 + (byte) font_find::l#2)==*((byte*) font_find::font#4 + (byte) font_find::l#2)) goto font_find::@3 -- pbuz1_derefidx_vbuyy_eq_pbuz2_derefidx_vbuyy_then_la1 + lda (glyph),y + cmp (font),y + beq __b3 + // [79] phi from font_find::@2 to font_find::@4 [phi:font_find::@2->font_find::@4] + __b4_from___b2: + // [79] phi (byte) font_find::found#2 = (byte) 0 [phi:font_find::@2->font_find::@4#0] -- vbuaa=vbuc1 + lda #0 + jmp __b4 + // font_find::@3 + __b3: + // [77] (byte) font_find::l#1 ← ++ (byte) font_find::l#2 -- vbuyy=_inc_vbuyy + iny + // [78] if((byte) font_find::l#1!=(byte) 8) goto font_find::@2 -- vbuyy_neq_vbuc1_then_la1 + cpy #8 + bne __b2_from___b3 + // [79] phi from font_find::@3 to font_find::@4 [phi:font_find::@3->font_find::@4] + __b4_from___b3: + // [79] phi (byte) font_find::found#2 = (byte) 1 [phi:font_find::@3->font_find::@4#0] -- vbuaa=vbuc1 + lda #1 + jmp __b4 + // font_find::@4 + __b4: + // [80] if((byte) 0==(byte) font_find::found#2) goto font_find::@5 -- vbuc1_eq_vbuaa_then_la1 + cmp #0 + beq __b5 + // [73] phi from font_find::@4 to font_find::@return [phi:font_find::@4->font_find::@return] + __breturn_from___b4: + // [73] phi (byte) font_find::return#3 = (byte) font_find::i#2 [phi:font_find::@4->font_find::@return#0] -- register_copy + jmp __breturn + // font_find::@5 + __b5: + // [81] (byte*) font_find::font#1 ← (byte*) font_find::font#4 + (byte) 8 -- pbuz1=pbuz1_plus_vbuc1 + lda #8 + clc + adc.z font + sta.z font + bcc !+ + inc.z font+1 + !: + // [82] (byte) font_find::i#1 ← ++ (byte) font_find::i#2 -- vbuxx=_inc_vbuxx + inx + // [71] phi from font_find::@5 to font_find::@1 [phi:font_find::@5->font_find::@1] + __b1_from___b5: + // [71] phi (byte*) font_find::font#4 = (byte*) font_find::font#1 [phi:font_find::@5->font_find::@1#0] -- register_copy + // [71] phi (byte) font_find::i#2 = (byte) font_find::i#1 [phi:font_find::@5->font_find::@1#1] -- register_copy + jmp __b1 +} + // font_2x2 +// Create a 2x2-font by doubling all pixels of the 64 first chars +font_2x2: { + .label __5 = $d + .label __7 = $d + .label next_2x2_left = 5 + .label next_2x2_right = $11 + .label glyph_bits = $c + .label glyph_bits_2x2 = $d + .label l2 = $b + .label l = $a + .label next_2x2_left_1 = $f + .label next_2x2 = 5 + .label next_original = 7 + .label c = 9 + // [84] phi from font_2x2 to font_2x2::@1 [phi:font_2x2->font_2x2::@1] + __b1_from_font_2x2: + // [84] phi (byte) font_2x2::c#11 = (byte) 0 [phi:font_2x2->font_2x2::@1#0] -- vbuz1=vbuc1 + lda #0 + sta.z c + // [84] phi (byte*) font_2x2::next_original#4 = (const byte*) CHARGEN [phi:font_2x2->font_2x2::@1#1] -- pbuz1=pbuc1 + lda #CHARGEN + sta.z next_original+1 + // [84] phi (byte*) font_2x2::next_2x2_left#0 = (const byte*) FONT_ORIGINAL [phi:font_2x2->font_2x2::@1#2] -- pbuz1=pbuc1 + lda #FONT_ORIGINAL + sta.z next_2x2_left+1 + jmp __b1 + // [84] phi from font_2x2::@9 to font_2x2::@1 [phi:font_2x2::@9->font_2x2::@1] + __b1_from___b9: + // [84] phi (byte) font_2x2::c#11 = (byte) font_2x2::c#1 [phi:font_2x2::@9->font_2x2::@1#0] -- register_copy + // [84] phi (byte*) font_2x2::next_original#4 = (byte*) font_2x2::next_original#1 [phi:font_2x2::@9->font_2x2::@1#1] -- register_copy + // [84] phi (byte*) font_2x2::next_2x2_left#0 = (byte*) font_2x2::next_2x2#1 [phi:font_2x2::@9->font_2x2::@1#2] -- register_copy + jmp __b1 + // font_2x2::@1 + __b1: + // [85] (byte*) font_2x2::next_2x2_right#0 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $40*(number) 8 -- pbuz1=pbuz2_plus_vwuc1 + lda.z next_2x2_left + clc + adc #<$40*8 + sta.z next_2x2_right + lda.z next_2x2_left+1 + adc #>$40*8 + sta.z next_2x2_right+1 + // [86] (byte*) font_2x2::next_2x2_left#10 ← (byte*) font_2x2::next_2x2_left#0 -- pbuz1=pbuz2 + lda.z next_2x2_left + sta.z next_2x2_left_1 + lda.z next_2x2_left+1 + sta.z next_2x2_left_1+1 + // [87] phi from font_2x2::@1 to font_2x2::@2 [phi:font_2x2::@1->font_2x2::@2] + __b2_from___b1: + // [87] phi (byte*) font_2x2::next_2x2_right#7 = (byte*) font_2x2::next_2x2_right#0 [phi:font_2x2::@1->font_2x2::@2#0] -- register_copy + // [87] phi (byte) font_2x2::l2#8 = (byte) 0 [phi:font_2x2::@1->font_2x2::@2#1] -- vbuz1=vbuc1 + lda #0 + sta.z l2 + // [87] phi (byte*) font_2x2::next_2x2_left#7 = (byte*) font_2x2::next_2x2_left#10 [phi:font_2x2::@1->font_2x2::@2#2] -- register_copy + // [87] phi (byte) font_2x2::l#2 = (byte) 0 [phi:font_2x2::@1->font_2x2::@2#3] -- vbuz1=vbuc1 + lda #0 + sta.z l + jmp __b2 + // [87] phi from font_2x2::@8 to font_2x2::@2 [phi:font_2x2::@8->font_2x2::@2] + __b2_from___b8: + // [87] phi (byte*) font_2x2::next_2x2_right#7 = (byte*) font_2x2::next_2x2_right#8 [phi:font_2x2::@8->font_2x2::@2#0] -- register_copy + // [87] phi (byte) font_2x2::l2#8 = (byte) font_2x2::l2#9 [phi:font_2x2::@8->font_2x2::@2#1] -- register_copy + // [87] phi (byte*) font_2x2::next_2x2_left#7 = (byte*) font_2x2::next_2x2_left#8 [phi:font_2x2::@8->font_2x2::@2#2] -- register_copy + // [87] phi (byte) font_2x2::l#2 = (byte) font_2x2::l#1 [phi:font_2x2::@8->font_2x2::@2#3] -- register_copy + jmp __b2 + // font_2x2::@2 + __b2: + // [88] (byte) font_2x2::glyph_bits#0 ← *((byte*) font_2x2::next_original#4 + (byte) font_2x2::l#2) -- vbuz1=pbuz2_derefidx_vbuz3 + ldy.z l + lda (next_original),y + sta.z glyph_bits + // [89] phi from font_2x2::@2 to font_2x2::@3 [phi:font_2x2::@2->font_2x2::@3] + __b3_from___b2: + // [89] phi (byte) font_2x2::b#2 = (byte) 0 [phi:font_2x2::@2->font_2x2::@3#0] -- vbuyy=vbuc1 + ldy #0 + // [89] phi (word) font_2x2::glyph_bits_2x2#3 = (word) 0 [phi:font_2x2::@2->font_2x2::@3#1] -- vwuz1=vwuc1 + lda #<0 + sta.z glyph_bits_2x2 + lda #>0 + sta.z glyph_bits_2x2+1 + // [89] phi (byte) font_2x2::glyph_bits#2 = (byte) font_2x2::glyph_bits#0 [phi:font_2x2::@2->font_2x2::@3#2] -- register_copy + jmp __b3 + // [89] phi from font_2x2::@5 to font_2x2::@3 [phi:font_2x2::@5->font_2x2::@3] + __b3_from___b5: + // [89] phi (byte) font_2x2::b#2 = (byte) font_2x2::b#1 [phi:font_2x2::@5->font_2x2::@3#0] -- register_copy + // [89] phi (word) font_2x2::glyph_bits_2x2#3 = (word) font_2x2::glyph_bits_2x2#2 [phi:font_2x2::@5->font_2x2::@3#1] -- register_copy + // [89] phi (byte) font_2x2::glyph_bits#2 = (byte) font_2x2::glyph_bits#1 [phi:font_2x2::@5->font_2x2::@3#2] -- register_copy + jmp __b3 + // font_2x2::@3 + __b3: + // [90] (byte~) font_2x2::$1 ← (byte) font_2x2::glyph_bits#2 & (byte) $80 -- vbuaa=vbuz1_band_vbuc1 + lda #$80 + and.z glyph_bits + // [91] if((byte) 0!=(byte~) font_2x2::$1) goto font_2x2::@4 -- vbuc1_neq_vbuaa_then_la1 + cmp #0 + bne __b4_from___b3 + // [93] phi from font_2x2::@3 to font_2x2::@5 [phi:font_2x2::@3->font_2x2::@5] + __b5_from___b3: + // [93] phi (byte) font_2x2::glyph_bit#0 = (byte) 0 [phi:font_2x2::@3->font_2x2::@5#0] -- vbuxx=vbuc1 + ldx #0 + jmp __b5 + // [92] phi from font_2x2::@3 to font_2x2::@4 [phi:font_2x2::@3->font_2x2::@4] + __b4_from___b3: + jmp __b4 + // font_2x2::@4 + __b4: + // [93] phi from font_2x2::@4 to font_2x2::@5 [phi:font_2x2::@4->font_2x2::@5] + __b5_from___b4: + // [93] phi (byte) font_2x2::glyph_bit#0 = (byte) 1 [phi:font_2x2::@4->font_2x2::@5#0] -- vbuxx=vbuc1 + ldx #1 + jmp __b5 + // font_2x2::@5 + __b5: + // [94] (word~) font_2x2::$5 ← (word) font_2x2::glyph_bits_2x2#3 << (byte) 1 -- vwuz1=vwuz1_rol_1 + asl.z __5 + rol.z __5+1 + // [95] (word) font_2x2::glyph_bits_2x2#1 ← (word~) font_2x2::$5 | (byte) font_2x2::glyph_bit#0 -- vwuz1=vwuz1_bor_vbuxx + txa + ora.z glyph_bits_2x2 + sta.z glyph_bits_2x2 + // [96] (word~) font_2x2::$7 ← (word) font_2x2::glyph_bits_2x2#1 << (byte) 1 -- vwuz1=vwuz1_rol_1 + asl.z __7 + rol.z __7+1 + // [97] (word) font_2x2::glyph_bits_2x2#2 ← (word~) font_2x2::$7 | (byte) font_2x2::glyph_bit#0 -- vwuz1=vwuz1_bor_vbuxx + txa + ora.z glyph_bits_2x2 + sta.z glyph_bits_2x2 + // [98] (byte) font_2x2::glyph_bits#1 ← (byte) font_2x2::glyph_bits#2 << (byte) 1 -- vbuz1=vbuz1_rol_1 + // Move to next bit + asl.z glyph_bits + // [99] (byte) font_2x2::b#1 ← ++ (byte) font_2x2::b#2 -- vbuyy=_inc_vbuyy + iny + // [100] if((byte) font_2x2::b#1!=(byte) 8) goto font_2x2::@3 -- vbuyy_neq_vbuc1_then_la1 + cpy #8 + bne __b3_from___b5 + jmp __b6 + // font_2x2::@6 + __b6: + // [101] (byte~) font_2x2::$12 ← > (word) font_2x2::glyph_bits_2x2#2 -- vbuaa=_hi_vwuz1 + lda.z glyph_bits_2x2+1 + // [102] *((byte*) font_2x2::next_2x2_left#7 + (byte) font_2x2::l2#8) ← (byte~) font_2x2::$12 -- pbuz1_derefidx_vbuz2=vbuaa + // Put the generated 2x2-line into the 2x2-font twice + ldy.z l2 + sta (next_2x2_left_1),y + // [103] (byte~) font_2x2::$11 ← (byte) font_2x2::l2#8 + (byte) 1 -- vbuyy=vbuz1_plus_1 + ldy.z l2 + iny + // [104] *((byte*) font_2x2::next_2x2_left#7 + (byte~) font_2x2::$11) ← (byte~) font_2x2::$12 -- pbuz1_derefidx_vbuyy=vbuaa + sta (next_2x2_left_1),y + // [105] (byte~) font_2x2::$15 ← < (word) font_2x2::glyph_bits_2x2#2 -- vbuaa=_lo_vwuz1 + lda.z glyph_bits_2x2 + // [106] *((byte*) font_2x2::next_2x2_right#7 + (byte) font_2x2::l2#8) ← (byte~) font_2x2::$15 -- pbuz1_derefidx_vbuz2=vbuaa + ldy.z l2 + sta (next_2x2_right),y + // [107] (byte~) font_2x2::$14 ← (byte) font_2x2::l2#8 + (byte) 1 -- vbuyy=vbuz1_plus_1 + ldy.z l2 + iny + // [108] *((byte*) font_2x2::next_2x2_right#7 + (byte~) font_2x2::$14) ← (byte~) font_2x2::$15 -- pbuz1_derefidx_vbuyy=vbuaa + sta (next_2x2_right),y + // [109] (byte) font_2x2::l2#1 ← (byte) font_2x2::l2#8 + (byte) 2 -- vbuz1=vbuz1_plus_2 + lda.z l2 + clc + adc #2 + sta.z l2 + // [110] if((byte) font_2x2::l2#1!=(byte) 8) goto font_2x2::@8 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp.z l2 + bne __b8_from___b6 + jmp __b7 + // font_2x2::@7 + __b7: + // [111] (byte*) font_2x2::next_2x2_left#1 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $80*(number) 8 -- pbuz1=pbuz2_plus_vwuc1 + lda.z next_2x2_left + clc + adc #<$80*8 + sta.z next_2x2_left_1 + lda.z next_2x2_left+1 + adc #>$80*8 + sta.z next_2x2_left_1+1 + // [112] (byte*) font_2x2::next_2x2_right#1 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $c0*(number) 8 -- pbuz1=pbuz2_plus_vwuc1 + lda.z next_2x2_left + clc + adc #<$c0*8 + sta.z next_2x2_right + lda.z next_2x2_left+1 + adc #>$c0*8 + sta.z next_2x2_right+1 + // [113] phi from font_2x2::@7 to font_2x2::@8 [phi:font_2x2::@7->font_2x2::@8] + __b8_from___b7: + // [113] phi (byte*) font_2x2::next_2x2_right#8 = (byte*) font_2x2::next_2x2_right#1 [phi:font_2x2::@7->font_2x2::@8#0] -- register_copy + // [113] phi (byte) font_2x2::l2#9 = (byte) 0 [phi:font_2x2::@7->font_2x2::@8#1] -- vbuz1=vbuc1 + lda #0 + sta.z l2 + // [113] phi (byte*) font_2x2::next_2x2_left#8 = (byte*) font_2x2::next_2x2_left#1 [phi:font_2x2::@7->font_2x2::@8#2] -- register_copy + jmp __b8 + // [113] phi from font_2x2::@6 to font_2x2::@8 [phi:font_2x2::@6->font_2x2::@8] + __b8_from___b6: + // [113] phi (byte*) font_2x2::next_2x2_right#8 = (byte*) font_2x2::next_2x2_right#7 [phi:font_2x2::@6->font_2x2::@8#0] -- register_copy + // [113] phi (byte) font_2x2::l2#9 = (byte) font_2x2::l2#1 [phi:font_2x2::@6->font_2x2::@8#1] -- register_copy + // [113] phi (byte*) font_2x2::next_2x2_left#8 = (byte*) font_2x2::next_2x2_left#7 [phi:font_2x2::@6->font_2x2::@8#2] -- register_copy + jmp __b8 + // font_2x2::@8 + __b8: + // [114] (byte) font_2x2::l#1 ← ++ (byte) font_2x2::l#2 -- vbuz1=_inc_vbuz1 + inc.z l + // [115] if((byte) font_2x2::l#1!=(byte) 8) goto font_2x2::@2 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp.z l + bne __b2_from___b8 + jmp __b9 + // font_2x2::@9 + __b9: + // [116] (byte*) font_2x2::next_2x2#1 ← (byte*) font_2x2::next_2x2_left#0 + (byte) 8 -- pbuz1=pbuz1_plus_vbuc1 + lda #8 + clc + adc.z next_2x2 + sta.z next_2x2 + bcc !+ + inc.z next_2x2+1 + !: + // [117] (byte*) font_2x2::next_original#1 ← (byte*) font_2x2::next_original#4 + (byte) 8 -- pbuz1=pbuz1_plus_vbuc1 + lda #8 + clc + adc.z next_original + sta.z next_original + bcc !+ + inc.z next_original+1 + !: + // [118] (byte) font_2x2::c#1 ← ++ (byte) font_2x2::c#11 -- vbuz1=_inc_vbuz1 + inc.z c + // [119] if((byte) font_2x2::c#1!=(byte) $40) goto font_2x2::@1 -- vbuz1_neq_vbuc1_then_la1 + lda #$40 + cmp.z c + bne __b1_from___b9 + jmp __breturn + // font_2x2::@return + __breturn: + // [120] return + rts +} + // File Data + .align $100 + FONT_COMPRESSED_MAP: .fill $100, 0 + +ASSEMBLER OPTIMIZATIONS +Removing instruction jmp __b1 +Removing instruction jmp __bend +Removing instruction jmp __b6 +Removing instruction jmp toD0181 +Removing instruction jmp __b5 +Removing instruction jmp __b1 +Removing instruction jmp __b2 +Removing instruction jmp __b7 +Removing instruction jmp __b3 +Removing instruction jmp __b4 +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp __b5 +Removing instruction jmp __b3 +Removing instruction jmp __b4 +Removing instruction jmp __b2 +Removing instruction jmp __breturn +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Removing instruction jmp __b2 +Removing instruction jmp __b4 +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 __b7 +Removing instruction jmp __b8 +Removing instruction jmp __b9 +Removing instruction jmp __breturn +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction lda #0 +Replacing instruction lda.z c with TXA +Replacing instruction lda.z c with TXA +Removing instruction lda #0 +Removing instruction lda #0 +Replacing instruction lda #<0 with TYA +Removing instruction lda #>0 +Removing instruction ldy.z l2 +Removing instruction ldy.z l2 +Succesful ASM optimization Pass5UnnecesaryLoadElimination +Replacing label __b2_from___b7 with __b2 +Replacing label __b1_from___b3 with __b1 +Replacing label __b3_from___b3 with __b3 +Replacing label __b2_from___b7 with __b2 +Replacing label __b2_from___b3 with __b2 +Replacing label __b4_from___b3 with __b4 +Replacing label __b3_from___b5 with __b3 +Replacing label __b8_from___b6 with __b8 +Replacing label __b2_from___b8 with __b2 +Replacing label __b1_from___b9 with __b1 +Removing instruction __b1_from___bbegin: +Removing instruction __b1: +Removing instruction __bend_from___b1: +Removing instruction toD0181_from___b6: +Removing instruction toD0181: +Removing instruction __b1_from___b3: +Removing instruction __b2_from___b1: +Removing instruction __b2_from___b7: +Removing instruction font_find_from___b1: +Removing instruction __b3_from___b3: +Removing instruction __b2_from___b4: +Removing instruction __b2_from___b7: +Removing instruction __b2_from___b3: +Removing instruction __b1_from___b9: +Removing instruction __b2_from___b8: +Removing instruction __b3_from___b5: +Removing instruction __b4_from___b3: +Removing instruction __b5_from___b4: +Removing instruction __b8_from___b6: +Succesful ASM optimization Pass5RedundantLabelElimination +Removing instruction __bend: +Removing instruction font_2x2_from_main: +Removing instruction __b6: +Removing instruction font_compress_from___b6: +Removing instruction __b5: +Removing instruction memset_from___b5: +Removing instruction __b1_from___b5: +Removing instruction __b7: +Removing instruction __b3: +Removing instruction __breturn: +Removing instruction __b1_from_memset: +Removing instruction __breturn: +Removing instruction __b1_from___b2: +Removing instruction __b1_from_font_compress: +Removing instruction __b5: +Removing instruction __b3_from___b5: +Removing instruction __b4: +Removing instruction __breturn: +Removing instruction __b1_from___b6: +Removing instruction __b1_from_font_find: +Removing instruction __breturn_from___b1: +Removing instruction __b4_from___b2: +Removing instruction __b4_from___b3: +Removing instruction __breturn_from___b4: +Removing instruction __b1_from___b5: +Removing instruction __b1_from_font_2x2: +Removing instruction __b2_from___b1: +Removing instruction __b3_from___b2: +Removing instruction __b5_from___b3: +Removing instruction __b6: +Removing instruction __b7: +Removing instruction __b8_from___b7: +Removing instruction __b9: +Removing instruction __breturn: +Succesful ASM optimization Pass5UnusedLabelElimination +Updating BasicUpstart to call main directly +Removing instruction jsr main +Succesful ASM optimization Pass5SkipBegin +Replacing jump to rts with rts in jmp __breturn +Succesful ASM optimization Pass5DoubleJumpElimination +Relabelling long label __b2_from___b1 to b1 +Succesful ASM optimization Pass5RelabelLongLabels +Removing instruction jmp __b1 +Removing instruction jmp __b2 +Removing instruction jmp __b3 +Removing instruction jmp __b2 +Removing instruction jmp __b1 +Removing instruction jmp __b2 +Removing instruction jmp __b3 +Removing instruction jmp __b8 +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction lda #8 +Removing instruction lda #8 +Succesful ASM optimization Pass5UnnecesaryLoadElimination +Removing instruction __bbegin: +Removing instruction __breturn: +Succesful ASM optimization Pass5UnusedLabelElimination +Fixing long branch [396] bne __b1 to beq + +FINAL SYMBOL TABLE +(label) @1 +(label) @begin +(label) @end +(const byte*) CHARGEN = (byte*) 53248 +(const byte*) D018 = (byte*) 53272 +(const byte*) FONT_COMPRESSED = (byte*) 10240 +(const byte*) FONT_COMPRESSED_MAP[(number) $100] = { fill( $100, 0) } +(const byte*) FONT_ORIGINAL = (byte*) 8192 +(const byte*) PROCPORT = (byte*) 1 +(const byte) PROCPORT_BASIC_KERNEL_IO = (byte) 7 +(const byte) PROCPORT_RAM_CHARROM = (byte) 1 +(const byte*) SCREEN = (byte*) 1024 +(void()) font_2x2((byte*) font_2x2::font_original , (byte*) font_2x2::font_2x2) +(byte~) font_2x2::$1 reg byte a 200002.0 +(byte~) font_2x2::$11 reg byte y 20002.0 +(byte~) font_2x2::$12 reg byte a 10001.0 +(byte~) font_2x2::$14 reg byte y 20002.0 +(byte~) font_2x2::$15 reg byte a 10001.0 +(word~) font_2x2::$5 zp[2]:13 200002.0 +(word~) font_2x2::$7 zp[2]:13 200002.0 +(label) font_2x2::@1 +(label) font_2x2::@2 +(label) font_2x2::@3 +(label) font_2x2::@4 +(label) font_2x2::@5 +(label) font_2x2::@6 +(label) font_2x2::@7 +(label) font_2x2::@8 +(label) font_2x2::@9 +(label) font_2x2::@return +(byte) font_2x2::b +(byte) font_2x2::b#1 reg byte y 150001.5 +(byte) font_2x2::b#2 reg byte y 20000.2 +(byte) font_2x2::c +(byte) font_2x2::c#1 c zp[1]:9 1501.5 +(byte) font_2x2::c#11 c zp[1]:9 58.88235294117647 +(byte*) font_2x2::font_2x2 +(byte*) font_2x2::font_original +(byte) font_2x2::glyph_bit +(byte) font_2x2::glyph_bit#0 reg byte x 50000.5 +(byte) font_2x2::glyph_bits +(byte) font_2x2::glyph_bits#0 glyph_bits zp[1]:12 20002.0 +(byte) font_2x2::glyph_bits#1 glyph_bits zp[1]:12 66667.33333333333 +(byte) font_2x2::glyph_bits#2 glyph_bits zp[1]:12 34444.88888888889 +(word) font_2x2::glyph_bits_2x2 +(word) font_2x2::glyph_bits_2x2#1 glyph_bits_2x2 zp[2]:13 200002.0 +(word) font_2x2::glyph_bits_2x2#2 glyph_bits_2x2 zp[2]:13 27500.5 +(word) font_2x2::glyph_bits_2x2#3 glyph_bits_2x2 zp[2]:13 40000.4 +(byte) font_2x2::l +(byte) font_2x2::l#1 l zp[1]:10 15001.5 +(byte) font_2x2::l#2 l zp[1]:10 1111.2222222222222 +(byte) font_2x2::l2 +(byte) font_2x2::l2#1 l2 zp[1]:11 15001.5 +(byte) font_2x2::l2#8 l2 zp[1]:11 2727.5454545454545 +(byte) font_2x2::l2#9 l2 zp[1]:11 6667.333333333333 +(byte*) font_2x2::next_2x2 +(byte*) font_2x2::next_2x2#1 next_2x2 zp[2]:5 500.5 +(byte*) font_2x2::next_2x2_left +(byte*) font_2x2::next_2x2_left#0 next_2x2_left zp[2]:5 750.1875 +(byte*) font_2x2::next_2x2_left#1 next_2x2_left_1 zp[2]:15 10001.0 +(byte*) font_2x2::next_2x2_left#10 next_2x2_left_1 zp[2]:15 2002.0 +(byte*) font_2x2::next_2x2_left#7 next_2x2_left_1 zp[2]:15 1708.5416666666665 +(byte*) font_2x2::next_2x2_left#8 next_2x2_left_1 zp[2]:15 10001.0 +(byte*) font_2x2::next_2x2_right +(byte*) font_2x2::next_2x2_right#0 next_2x2_right zp[2]:17 1001.0 +(byte*) font_2x2::next_2x2_right#1 next_2x2_right zp[2]:17 20002.0 +(byte*) font_2x2::next_2x2_right#7 next_2x2_right zp[2]:17 1708.5416666666665 +(byte*) font_2x2::next_2x2_right#8 next_2x2_right zp[2]:17 10001.0 +(byte*) font_2x2::next_original +(byte*) font_2x2::next_original#1 next_original zp[2]:7 667.3333333333334 +(byte*) font_2x2::next_original#4 next_original zp[2]:7 363.7272727272727 +(byte()) font_compress((byte*) font_compress::font_original , (byte*) font_compress::font_compressed , (byte*) font_compress::compress_mapping) +(label) font_compress::@1 +(label) font_compress::@2 +(label) font_compress::@3 +(label) font_compress::@4 +(label) font_compress::@5 +(label) font_compress::@6 +(label) font_compress::@7 +(label) font_compress::@return +(byte*) font_compress::compress_mapping +(byte*) font_compress::font_compressed +(byte*) font_compress::font_original +(byte) font_compress::font_size +(byte) font_compress::font_size#1 reg byte x 1001.0 +(byte) font_compress::font_size#2 font_size zp[1]:9 385.0 +(byte) font_compress::font_size#9 font_size zp[1]:9 2002.0 +(byte) font_compress::found +(byte) font_compress::found#0 reg byte a 1001.0 +(byte) font_compress::found#2 reg byte a 3003.0 +(byte) font_compress::found#3 reg byte a 2002.0 +(byte) font_compress::i +(byte) font_compress::i#1 i zp[1]:10 1001.0 +(byte) font_compress::i#4 i zp[1]:10 166.83333333333334 +(byte) font_compress::l +(byte) font_compress::l#1 reg byte y 15001.5 +(byte) font_compress::l#2 reg byte y 20002.0 +(byte*) font_compress::next_compressed +(byte*) font_compress::next_compressed#1 next_compressed zp[2]:5 667.3333333333334 +(byte*) font_compress::next_compressed#4 next_compressed zp[2]:5 1083.6666666666665 +(byte*) font_compress::next_compressed#7 next_compressed zp[2]:5 500.5 +(byte*) font_compress::next_original +(byte*) font_compress::next_original#1 next_original zp[2]:13 500.5 +(byte*) font_compress::next_original#2 next_original zp[2]:13 764.9411764705882 +(byte) font_compress::return +(byte) font_compress::return#1 reg byte x 600.5999999999999 +(byte) font_compress::return#5 reg byte x 2002.0 +(byte()) font_find((byte*) font_find::glyph , (byte*) font_find::font , (byte) font_find::font_size) +(label) font_find::@1 +(label) font_find::@2 +(label) font_find::@3 +(label) font_find::@4 +(label) font_find::@5 +(label) font_find::@return +(byte*) font_find::font +(byte*) font_find::font#1 font zp[2]:7 1000001.0 +(byte*) font_find::font#4 font zp[2]:7 1500000.375 +(byte) font_find::font_size +(byte) font_find::font_size#0 font_size zp[1]:9 83416.83333333334 +(byte) font_find::found +(byte) font_find::found#2 reg byte a 1000001.0 +(byte*) font_find::glyph +(byte*) font_find::glyph#0 glyph zp[2]:13 769307.8461538461 +(byte) font_find::i +(byte) font_find::i#1 reg byte x 2000002.0 +(byte) font_find::i#2 reg byte x 444444.8888888889 +(byte) font_find::l +(byte) font_find::l#1 reg byte y 1.50000015E7 +(byte) font_find::l#2 reg byte y 2.0000002E7 +(byte) font_find::return +(byte) font_find::return#0 reg byte a 2002.0 +(byte) font_find::return#3 reg byte x 333667.3333333334 +(void()) main() +(label) main::@1 +(label) main::@2 +(label) main::@3 +(label) main::@4 +(label) main::@5 +(label) main::@6 +(label) main::@7 +(byte) main::c +(byte) main::c#1 c zp[1]:3 420.59999999999997 +(byte) main::c#2 c zp[1]:3 620.8 +(byte) main::c#4 c zp[1]:3 202.0 +(label) main::toD0181 +(byte*) main::toD0181_gfx +(byte) main::toD0181_return +(const byte) main::toD0181_return#0 toD0181_return = >(word)(const byte*) SCREEN&(word) $3fff*(byte) 4|>(word)(const byte*) FONT_COMPRESSED/(byte) 4&(byte) $f +(byte*) main::toD0181_screen +(byte) main::x +(byte) main::x#1 x zp[1]:4 1501.5 +(byte) main::x#2 x zp[1]:4 500.5 +(byte) main::y +(byte) main::y#1 y zp[1]:2 151.5 +(byte) main::y#4 y zp[1]:2 133.66666666666669 +(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) +(label) memset::@1 +(label) memset::@2 +(label) memset::@return +(byte) memset::c +(byte) memset::c#0 reg byte x 168.66666666666669 +(byte*) memset::dst +(byte*) memset::dst#1 dst zp[2]:13 2002.0 +(byte*) memset::dst#2 dst zp[2]:13 1334.6666666666667 +(byte*) memset::end +(const byte*) memset::end#0 end = (byte*)(const void*) memset::str#0+(const word) memset::num#0 +(word) memset::num +(const word) memset::num#0 num = (word) $400 +(void*) memset::return +(void*) memset::str +(const void*) memset::str#0 str = (void*)(const byte*) SCREEN +(void()) show((byte) show::c , (byte) show::x , (byte) show::y , (byte*) show::font_mapping) +(word~) show::$0 zp[2]:15 15001.5 +(word~) show::$1 zp[2]:15 20002.0 +(byte*~) show::$2 zp[2]:15 10001.0 +(byte~) show::$3 reg byte a 20002.0 +(byte~) show::$5 reg byte x 20002.0 +(byte~) show::$6 reg byte a 20002.0 +(byte~) show::$7 reg byte a 20002.0 +(word~) show::$8 zp[2]:17 20002.0 +(word~) show::$9 zp[2]:15 20002.0 +(label) show::@return +(byte) show::c +(byte) show::c#0 c zp[1]:3 2733.666666666667 +(byte*) show::font_mapping +(byte*) show::ptr +(byte*) show::ptr#0 ptr zp[2]:15 7143.571428571429 +(byte) show::x +(byte) show::x#0 reg byte x 1571.7142857142858 +(byte) show::y +(byte) show::y#0 reg byte a 1001.0 + +zp[1]:2 [ main::y#4 main::y#1 ] +zp[1]:3 [ main::c#2 main::c#4 main::c#1 show::c#0 ] +zp[1]:4 [ main::x#2 main::x#1 ] +reg byte y [ font_compress::l#2 font_compress::l#1 ] +reg byte a [ font_compress::found#2 font_compress::found#3 font_compress::found#0 ] +reg byte x [ font_compress::return#1 font_compress::font_size#1 font_compress::return#5 ] +reg byte x [ font_find::return#3 font_find::i#2 font_find::i#1 ] +reg byte y [ font_find::l#2 font_find::l#1 ] +reg byte a [ font_find::found#2 ] +zp[2]:5 [ font_2x2::next_2x2_left#0 font_2x2::next_2x2#1 font_compress::next_compressed#4 font_compress::next_compressed#7 font_compress::next_compressed#1 ] +zp[2]:7 [ font_2x2::next_original#4 font_2x2::next_original#1 font_find::font#4 font_find::font#1 ] +zp[1]:9 [ font_2x2::c#11 font_2x2::c#1 font_compress::font_size#2 font_compress::font_size#9 font_find::font_size#0 ] +zp[1]:10 [ font_2x2::l#2 font_2x2::l#1 font_compress::i#4 font_compress::i#1 ] +zp[1]:11 [ font_2x2::l2#8 font_2x2::l2#9 font_2x2::l2#1 ] +zp[1]:12 [ font_2x2::glyph_bits#2 font_2x2::glyph_bits#0 font_2x2::glyph_bits#1 ] +zp[2]:13 [ font_2x2::glyph_bits_2x2#3 font_2x2::glyph_bits_2x2#2 font_2x2::$5 font_2x2::$7 font_2x2::glyph_bits_2x2#1 font_compress::next_original#2 font_compress::next_original#1 font_find::glyph#0 memset::dst#2 memset::dst#1 ] +reg byte y [ font_2x2::b#2 font_2x2::b#1 ] +reg byte x [ font_2x2::glyph_bit#0 ] +reg byte x [ memset::c#0 ] +reg byte x [ show::x#0 ] +reg byte a [ show::y#0 ] +zp[2]:15 [ show::$0 show::$9 show::$1 show::$2 show::ptr#0 font_2x2::next_2x2_left#7 font_2x2::next_2x2_left#10 font_2x2::next_2x2_left#8 font_2x2::next_2x2_left#1 ] +zp[2]:17 [ show::$8 font_2x2::next_2x2_right#7 font_2x2::next_2x2_right#0 font_2x2::next_2x2_right#8 font_2x2::next_2x2_right#1 ] +reg byte a [ show::$3 ] +reg byte x [ show::$5 ] +reg byte a [ show::$6 ] +reg byte a [ show::$7 ] +reg byte a [ font_find::return#0 ] +reg byte a [ font_2x2::$1 ] +reg byte a [ font_2x2::$12 ] +reg byte y [ font_2x2::$11 ] +reg byte a [ font_2x2::$15 ] +reg byte y [ font_2x2::$14 ] + + +FINAL ASSEMBLER +Score: 122846 + + // File Comments +// Creates a 2x2 font from the system CHARGEN font and compress it by identifying identical chars + // Upstart +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" + // Global Constants & labels + // Processor Port Register controlling RAM/ROM configuration and the datasette + .label PROCPORT = 1 + // RAM in $A000, $E000 CHAR ROM in $D000 + .const PROCPORT_RAM_CHARROM = 1 + // BASIC in $A000, I/O in $D000, KERNEL in $E000 + .const PROCPORT_BASIC_KERNEL_IO = 7 + // The address of the CHARGEN character set + .label CHARGEN = $d000 + .label D018 = $d018 + .label SCREEN = $400 + .label FONT_ORIGINAL = $2000 + .label FONT_COMPRESSED = $2800 + // @begin + // [1] phi from @begin to @1 [phi:@begin->@1] + // @1 + // [2] call main + // [3] phi from @1 to @end [phi:@1->@end] + // @end + // main +main: { + .const toD0181_return = (>(SCREEN&$3fff)*4)|(>FONT_COMPRESSED)/4&$f + .label c = 3 + .label x = 4 + .label y = 2 + // asm + // asm { sei } + // Create 2x2 font from CHARGEN + sei + // *PROCPORT = PROCPORT_RAM_CHARROM + // [5] *((const byte*) PROCPORT) ← (const byte) PROCPORT_RAM_CHARROM -- _deref_pbuc1=vbuc2 + lda #PROCPORT_RAM_CHARROM + sta PROCPORT + // font_2x2(CHARGEN, FONT_ORIGINAL) + // [6] call font_2x2 + // [83] phi from main to font_2x2 [phi:main->font_2x2] + jsr font_2x2 + // main::@6 + // *PROCPORT = PROCPORT_BASIC_KERNEL_IO + // [7] *((const byte*) PROCPORT) ← (const byte) PROCPORT_BASIC_KERNEL_IO -- _deref_pbuc1=vbuc2 + lda #PROCPORT_BASIC_KERNEL_IO + sta PROCPORT + // asm + // asm { cli } + cli + // font_compress(FONT_ORIGINAL, FONT_COMPRESSED, FONT_COMPRESSED_MAP) + // [9] call font_compress + // [47] phi from main::@6 to font_compress [phi:main::@6->font_compress] + jsr font_compress + // [10] phi from main::@6 to main::toD0181 [phi:main::@6->main::toD0181] + // main::toD0181 + // main::@5 + // *D018 = toD018(SCREEN, FONT_COMPRESSED) + // [11] *((const byte*) D018) ← (const byte) main::toD0181_return#0 -- _deref_pbuc1=vbuc2 + // Show compressed font + lda #toD0181_return + sta D018 + // memset(SCREEN, FONT_COMPRESSED_MAP[' '], 0x0400) + // [12] (byte) memset::c#0 ← *((const byte*) FONT_COMPRESSED_MAP+(byte) ' ') -- vbuxx=_deref_pbuc1 + ldx FONT_COMPRESSED_MAP+' ' + // [13] call memset + // Clear the screen + // [41] phi from main::@5 to memset [phi:main::@5->memset] + jsr memset + // [14] phi from main::@5 to main::@1 [phi:main::@5->main::@1] + // [14] phi (byte) main::y#4 = (byte) 0 [phi:main::@5->main::@1#0] -- vbuz1=vbuc1 + lda #0 + sta.z y + // [14] phi (byte) main::c#4 = (byte) 0 [phi:main::@5->main::@1#1] -- vbuz1=vbuc1 + sta.z c + // [14] phi from main::@3 to main::@1 [phi:main::@3->main::@1] + // [14] phi (byte) main::y#4 = (byte) main::y#1 [phi:main::@3->main::@1#0] -- register_copy + // [14] phi (byte) main::c#4 = (byte) main::c#1 [phi:main::@3->main::@1#1] -- register_copy + // main::@1 + __b1: + // [15] phi from main::@1 to main::@2 [phi:main::@1->main::@2] + // [15] phi (byte) main::x#2 = (byte) 0 [phi:main::@1->main::@2#0] -- vbuz1=vbuc1 + lda #0 + sta.z x + // [15] phi (byte) main::c#2 = (byte) main::c#4 [phi:main::@1->main::@2#1] -- register_copy + // [15] phi from main::@7 to main::@2 [phi:main::@7->main::@2] + // [15] phi (byte) main::x#2 = (byte) main::x#1 [phi:main::@7->main::@2#0] -- register_copy + // [15] phi (byte) main::c#2 = (byte) main::c#1 [phi:main::@7->main::@2#1] -- register_copy + // main::@2 + __b2: + // show(c++, x, y, FONT_COMPRESSED_MAP) + // [16] (byte) show::c#0 ← (byte) main::c#2 + // [17] (byte) show::x#0 ← (byte) main::x#2 -- vbuxx=vbuz1 + ldx.z x + // [18] (byte) show::y#0 ← (byte) main::y#4 -- vbuaa=vbuz1 + lda.z y + // [19] call show + jsr show + // main::@7 + // show(c++, x, y, FONT_COMPRESSED_MAP); + // [20] (byte) main::c#1 ← ++ (byte) main::c#2 -- vbuz1=_inc_vbuz1 + inc.z c + // for(char x:0..7) + // [21] (byte) main::x#1 ← ++ (byte) main::x#2 -- vbuz1=_inc_vbuz1 + inc.z x + // [22] if((byte) main::x#1!=(byte) 8) goto main::@2 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp.z x + bne __b2 + // main::@3 + // for(char y:0..7) + // [23] (byte) main::y#1 ← ++ (byte) main::y#4 -- vbuz1=_inc_vbuz1 + inc.z y + // [24] if((byte) main::y#1!=(byte) 8) goto main::@1 -- vbuz1_neq_vbuc1_then_la1 + cmp.z y + bne __b1 + // main::@4 + __b4: + // (*(SCREEN+999))++; + // [25] *((const byte*) SCREEN+(word) $3e7) ← ++ *((const byte*) SCREEN+(word) $3e7) -- _deref_pbuc1=_inc__deref_pbuc1 + inc SCREEN+$3e7 + jmp __b4 +} + // show +// Show a 2x2 char on the screen at 2x2-position (x, y) using a font compress mapping +// show(byte zp(3) c, byte register(X) x, byte register(A) y) +show: { + .label __0 = $f + .label __1 = $f + .label __2 = $f + .label c = 3 + .label ptr = $f + .label __8 = $11 + .label __9 = $f + // (unsigned int)y + // [26] (word~) show::$0 ← (word)(byte) show::y#0 -- vwuz1=_word_vbuaa + sta.z __0 + lda #0 + sta.z __0+1 + // (unsigned int)y*80 + // [27] (word~) show::$8 ← (word~) show::$0 << (byte) 2 -- vwuz1=vwuz2_rol_2 + lda.z __0 + asl + sta.z __8 + lda.z __0+1 + rol + sta.z __8+1 + asl.z __8 + rol.z __8+1 + // [28] (word~) show::$9 ← (word~) show::$8 + (word~) show::$0 -- vwuz1=vwuz2_plus_vwuz1 + lda.z __9 + clc + adc.z __8 + sta.z __9 + lda.z __9+1 + adc.z __8+1 + sta.z __9+1 + // [29] (word~) show::$1 ← (word~) show::$9 << (byte) 4 -- vwuz1=vwuz1_rol_4 + asl.z __1 + rol.z __1+1 + asl.z __1 + rol.z __1+1 + asl.z __1 + rol.z __1+1 + asl.z __1 + rol.z __1+1 + // SCREEN + (unsigned int)y*80 + // [30] (byte*~) show::$2 ← (const byte*) SCREEN + (word~) show::$1 -- pbuz1=pbuc1_plus_vwuz1 + clc + lda.z __2 + adc #SCREEN + sta.z __2+1 + // x*2 + // [31] (byte~) show::$3 ← (byte) show::x#0 << (byte) 1 -- vbuaa=vbuxx_rol_1 + txa + asl + // ptr = SCREEN + (unsigned int)y*80 + x*2 + // [32] (byte*) show::ptr#0 ← (byte*~) show::$2 + (byte~) show::$3 -- pbuz1=pbuz1_plus_vbuaa + clc + adc.z ptr + sta.z ptr + bcc !+ + inc.z ptr+1 + !: + // ptr[0] = font_mapping[c] + // [33] *((byte*) show::ptr#0) ← *((const byte*) FONT_COMPRESSED_MAP + (byte) show::c#0) -- _deref_pbuz1=pbuc1_derefidx_vbuz2 + ldy.z c + lda FONT_COMPRESSED_MAP,y + ldy #0 + sta (ptr),y + // c+0x40 + // [34] (byte~) show::$5 ← (byte) show::c#0 -- vbuxx=vbuz1 + ldx.z c + // ptr[1] = font_mapping[c+0x40] + // [35] *((byte*) show::ptr#0 + (byte) 1) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $40 + (byte~) show::$5) -- pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuxx + lda FONT_COMPRESSED_MAP+$40,x + ldy #1 + sta (ptr),y + // c+0x80 + // [36] (byte~) show::$6 ← (byte) show::c#0 -- vbuaa=vbuz1 + txa + // ptr[40] = font_mapping[c+0x80] + // [37] *((byte*) show::ptr#0 + (byte) $28) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $80 + (byte~) show::$6) -- pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuaa + tay + lda FONT_COMPRESSED_MAP+$80,y + ldy #$28 + sta (ptr),y + // c+0xc0 + // [38] (byte~) show::$7 ← (byte) show::c#0 -- vbuaa=vbuz1 + txa + // ptr[41] = font_mapping[c+0xc0] + // [39] *((byte*) show::ptr#0 + (byte) $29) ← *((const byte*) FONT_COMPRESSED_MAP+(byte) $c0 + (byte~) show::$7) -- pbuz1_derefidx_vbuc1=pbuc2_derefidx_vbuaa + tay + lda FONT_COMPRESSED_MAP+$c0,y + ldy #$29 + sta (ptr),y + // show::@return + // } + // [40] return + rts +} + // memset +// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str. +// memset(byte register(X) c) +memset: { + .label str = SCREEN + .const num = $400 + .label end = str+num + .label dst = $d + // [42] phi from memset to memset::@1 [phi:memset->memset::@1] + // [42] phi (byte*) memset::dst#2 = (byte*)(const void*) memset::str#0 [phi:memset->memset::@1#0] -- pbuz1=pbuc1 + lda #str + sta.z dst+1 + // memset::@1 + __b1: + // for(char* dst = str; dst!=end; dst++) + // [43] if((byte*) memset::dst#2!=(const byte*) memset::end#0) goto memset::@2 -- pbuz1_neq_pbuc1_then_la1 + lda.z dst+1 + cmp #>end + bne __b2 + lda.z dst + cmp #memset::@1] + // [42] phi (byte*) memset::dst#2 = (byte*) memset::dst#1 [phi:memset::@2->memset::@1#0] -- register_copy + jmp __b1 +} + // font_compress +// Compress a font finding identical characters +// The compressed font is put into font_compressed and the compress_mapping is updated +// so that compress_mapping[c] points to the char in font_compressed that is identical to char c in font_original +// Returns the size of the compressed font (in chars) +font_compress: { + .label next_original = $d + .label i = $a + .label next_compressed = 5 + .label font_size = 9 + // [48] phi from font_compress to font_compress::@1 [phi:font_compress->font_compress::@1] + // [48] phi (byte*) font_compress::next_compressed#4 = (const byte*) FONT_COMPRESSED [phi:font_compress->font_compress::@1#0] -- pbuz1=pbuc1 + lda #FONT_COMPRESSED + sta.z next_compressed+1 + // [48] phi (byte) font_compress::i#4 = (byte) 0 [phi:font_compress->font_compress::@1#1] -- vbuz1=vbuc1 + lda #0 + sta.z i + // [48] phi (byte) font_compress::font_size#2 = (byte) 0 [phi:font_compress->font_compress::@1#2] -- vbuz1=vbuc1 + sta.z font_size + // [48] phi (byte*) font_compress::next_original#2 = (const byte*) FONT_ORIGINAL [phi:font_compress->font_compress::@1#3] -- pbuz1=pbuc1 + lda #FONT_ORIGINAL + sta.z next_original+1 + // font_compress::@1 + __b1: + // font_find(next_original, font_compressed, font_size) + // [49] (byte*) font_find::glyph#0 ← (byte*) font_compress::next_original#2 + // [50] (byte) font_find::font_size#0 ← (byte) font_compress::font_size#2 + // [51] call font_find + // [70] phi from font_compress::@1 to font_find [phi:font_compress::@1->font_find] + jsr font_find + // font_find(next_original, font_compressed, font_size) + // [52] (byte) font_find::return#0 ← (byte) font_find::return#3 -- vbuaa=vbuxx + txa + // font_compress::@5 + // found = font_find(next_original, font_compressed, font_size) + // [53] (byte) font_compress::found#0 ← (byte) font_find::return#0 + // if(found==0xff) + // [54] if((byte) font_compress::found#0!=(byte) $ff) goto font_compress::@7 -- vbuaa_neq_vbuc1_then_la1 + cmp #$ff + bne __b7 + // [55] phi from font_compress::@5 to font_compress::@3 [phi:font_compress::@5->font_compress::@3] + // [55] phi (byte) font_compress::l#2 = (byte) 0 [phi:font_compress::@5->font_compress::@3#0] -- vbuyy=vbuc1 + ldy #0 + // Glyph not found - create it + // [55] phi from font_compress::@3 to font_compress::@3 [phi:font_compress::@3->font_compress::@3] + // [55] phi (byte) font_compress::l#2 = (byte) font_compress::l#1 [phi:font_compress::@3->font_compress::@3#0] -- register_copy + // font_compress::@3 + __b3: + // next_compressed[l] = next_original[l] + // [56] *((byte*) font_compress::next_compressed#4 + (byte) font_compress::l#2) ← *((byte*) font_compress::next_original#2 + (byte) font_compress::l#2) -- pbuz1_derefidx_vbuyy=pbuz2_derefidx_vbuyy + lda (next_original),y + sta (next_compressed),y + // for(char l:0..7) + // [57] (byte) font_compress::l#1 ← ++ (byte) font_compress::l#2 -- vbuyy=_inc_vbuyy + iny + // [58] if((byte) font_compress::l#1!=(byte) 8) goto font_compress::@3 -- vbuyy_neq_vbuc1_then_la1 + cpy #8 + bne __b3 + // font_compress::@4 + // next_compressed += 8 + // [59] (byte*) font_compress::next_compressed#1 ← (byte*) font_compress::next_compressed#4 + (byte) 8 -- pbuz1=pbuz1_plus_vbuc1 + lda #8 + clc + adc.z next_compressed + sta.z next_compressed + bcc !+ + inc.z next_compressed+1 + !: + // font_size++; + // [60] (byte) font_compress::font_size#1 ← ++ (byte) font_compress::font_size#2 -- vbuxx=_inc_vbuz1 + ldx.z font_size + inx + // [61] (byte) font_compress::found#3 ← (byte) font_compress::font_size#2 -- vbuaa=vbuz1 + lda.z font_size + // [62] phi from font_compress::@4 font_compress::@7 to font_compress::@2 [phi:font_compress::@4/font_compress::@7->font_compress::@2] + // [62] phi (byte*) font_compress::next_compressed#7 = (byte*) font_compress::next_compressed#1 [phi:font_compress::@4/font_compress::@7->font_compress::@2#0] -- register_copy + // [62] phi (byte) font_compress::return#1 = (byte) font_compress::font_size#1 [phi:font_compress::@4/font_compress::@7->font_compress::@2#1] -- register_copy + // [62] phi (byte) font_compress::found#2 = (byte) font_compress::found#3 [phi:font_compress::@4/font_compress::@7->font_compress::@2#2] -- register_copy + // font_compress::@2 + __b2: + // compress_mapping[i] = found + // [63] *((const byte*) FONT_COMPRESSED_MAP + (byte) font_compress::i#4) ← (byte) font_compress::found#2 -- pbuc1_derefidx_vbuz1=vbuaa + ldy.z i + sta FONT_COMPRESSED_MAP,y + // next_original += 8 + // [64] (byte*) font_compress::next_original#1 ← (byte*) font_compress::next_original#2 + (byte) 8 -- pbuz1=pbuz1_plus_vbuc1 + lda #8 + clc + adc.z next_original + sta.z next_original + bcc !+ + inc.z next_original+1 + !: + // for(char i: 0..0xff) + // [65] (byte) font_compress::i#1 ← ++ (byte) font_compress::i#4 -- vbuz1=_inc_vbuz1 + inc.z i + // [66] if((byte) font_compress::i#1!=(byte) 0) goto font_compress::@6 -- vbuz1_neq_0_then_la1 + lda.z i + cmp #0 + bne __b6 + // font_compress::@return + // } + // [67] return + rts + // font_compress::@6 + __b6: + // [68] (byte) font_compress::font_size#9 ← (byte) font_compress::return#1 -- vbuz1=vbuxx + stx.z font_size + // [48] phi from font_compress::@6 to font_compress::@1 [phi:font_compress::@6->font_compress::@1] + // [48] phi (byte*) font_compress::next_compressed#4 = (byte*) font_compress::next_compressed#7 [phi:font_compress::@6->font_compress::@1#0] -- register_copy + // [48] phi (byte) font_compress::i#4 = (byte) font_compress::i#1 [phi:font_compress::@6->font_compress::@1#1] -- register_copy + // [48] phi (byte) font_compress::font_size#2 = (byte) font_compress::font_size#9 [phi:font_compress::@6->font_compress::@1#2] -- register_copy + // [48] phi (byte*) font_compress::next_original#2 = (byte*) font_compress::next_original#1 [phi:font_compress::@6->font_compress::@1#3] -- register_copy + jmp __b1 + // font_compress::@7 + __b7: + // [69] (byte) font_compress::return#5 ← (byte) font_compress::font_size#2 -- vbuxx=vbuz1 + ldx.z font_size + jmp __b2 +} + // font_find +// Look for a glyph within a font +// Only looks at the first font_size glyphs +// Returns the index of the glyph within the font. Returns 0xff if the glyph is not found. +// font_find(byte* zp($d) glyph, byte* zp(7) font, byte zp(9) font_size) +font_find: { + .label glyph = $d + .label font_size = 9 + .label font = 7 + // [71] phi from font_find to font_find::@1 [phi:font_find->font_find::@1] + // [71] phi (byte*) font_find::font#4 = (const byte*) FONT_COMPRESSED [phi:font_find->font_find::@1#0] -- pbuz1=pbuc1 + lda #FONT_COMPRESSED + sta.z font+1 + // [71] phi (byte) font_find::i#2 = (byte) 0 [phi:font_find->font_find::@1#1] -- vbuxx=vbuc1 + ldx #0 + // font_find::@1 + __b1: + // for(char i=0;ifont_find::@return] + // [73] phi (byte) font_find::return#3 = (byte) $ff [phi:font_find::@1->font_find::@return#0] -- vbuxx=vbuc1 + ldx #$ff + // font_find::@return + // } + // [74] return + rts + // [75] phi from font_find::@1 to font_find::@2 [phi:font_find::@1->font_find::@2] + b1: + // [75] phi (byte) font_find::l#2 = (byte) 0 [phi:font_find::@1->font_find::@2#0] -- vbuyy=vbuc1 + ldy #0 + // [75] phi from font_find::@3 to font_find::@2 [phi:font_find::@3->font_find::@2] + // [75] phi (byte) font_find::l#2 = (byte) font_find::l#1 [phi:font_find::@3->font_find::@2#0] -- register_copy + // font_find::@2 + __b2: + // if(glyph[l]!=font[l]) + // [76] if(*((byte*) font_find::glyph#0 + (byte) font_find::l#2)==*((byte*) font_find::font#4 + (byte) font_find::l#2)) goto font_find::@3 -- pbuz1_derefidx_vbuyy_eq_pbuz2_derefidx_vbuyy_then_la1 + lda (glyph),y + cmp (font),y + beq __b3 + // [79] phi from font_find::@2 to font_find::@4 [phi:font_find::@2->font_find::@4] + // [79] phi (byte) font_find::found#2 = (byte) 0 [phi:font_find::@2->font_find::@4#0] -- vbuaa=vbuc1 + lda #0 + jmp __b4 + // font_find::@3 + __b3: + // for(char l:0..7) + // [77] (byte) font_find::l#1 ← ++ (byte) font_find::l#2 -- vbuyy=_inc_vbuyy + iny + // [78] if((byte) font_find::l#1!=(byte) 8) goto font_find::@2 -- vbuyy_neq_vbuc1_then_la1 + cpy #8 + bne __b2 + // [79] phi from font_find::@3 to font_find::@4 [phi:font_find::@3->font_find::@4] + // [79] phi (byte) font_find::found#2 = (byte) 1 [phi:font_find::@3->font_find::@4#0] -- vbuaa=vbuc1 + lda #1 + // font_find::@4 + __b4: + // if(found) + // [80] if((byte) 0==(byte) font_find::found#2) goto font_find::@5 -- vbuc1_eq_vbuaa_then_la1 + cmp #0 + beq __b5 + // [73] phi from font_find::@4 to font_find::@return [phi:font_find::@4->font_find::@return] + // [73] phi (byte) font_find::return#3 = (byte) font_find::i#2 [phi:font_find::@4->font_find::@return#0] -- register_copy + rts + // font_find::@5 + __b5: + // font += 8 + // [81] (byte*) font_find::font#1 ← (byte*) font_find::font#4 + (byte) 8 -- pbuz1=pbuz1_plus_vbuc1 + lda #8 + clc + adc.z font + sta.z font + bcc !+ + inc.z font+1 + !: + // for(char i=0;ifont_find::@1] + // [71] phi (byte*) font_find::font#4 = (byte*) font_find::font#1 [phi:font_find::@5->font_find::@1#0] -- register_copy + // [71] phi (byte) font_find::i#2 = (byte) font_find::i#1 [phi:font_find::@5->font_find::@1#1] -- register_copy + jmp __b1 +} + // font_2x2 +// Create a 2x2-font by doubling all pixels of the 64 first chars +font_2x2: { + .label __5 = $d + .label __7 = $d + .label next_2x2_left = 5 + .label next_2x2_right = $11 + .label glyph_bits = $c + .label glyph_bits_2x2 = $d + .label l2 = $b + .label l = $a + .label next_2x2_left_1 = $f + .label next_2x2 = 5 + .label next_original = 7 + .label c = 9 + // [84] phi from font_2x2 to font_2x2::@1 [phi:font_2x2->font_2x2::@1] + // [84] phi (byte) font_2x2::c#11 = (byte) 0 [phi:font_2x2->font_2x2::@1#0] -- vbuz1=vbuc1 + lda #0 + sta.z c + // [84] phi (byte*) font_2x2::next_original#4 = (const byte*) CHARGEN [phi:font_2x2->font_2x2::@1#1] -- pbuz1=pbuc1 + lda #CHARGEN + sta.z next_original+1 + // [84] phi (byte*) font_2x2::next_2x2_left#0 = (const byte*) FONT_ORIGINAL [phi:font_2x2->font_2x2::@1#2] -- pbuz1=pbuc1 + lda #FONT_ORIGINAL + sta.z next_2x2_left+1 + // [84] phi from font_2x2::@9 to font_2x2::@1 [phi:font_2x2::@9->font_2x2::@1] + // [84] phi (byte) font_2x2::c#11 = (byte) font_2x2::c#1 [phi:font_2x2::@9->font_2x2::@1#0] -- register_copy + // [84] phi (byte*) font_2x2::next_original#4 = (byte*) font_2x2::next_original#1 [phi:font_2x2::@9->font_2x2::@1#1] -- register_copy + // [84] phi (byte*) font_2x2::next_2x2_left#0 = (byte*) font_2x2::next_2x2#1 [phi:font_2x2::@9->font_2x2::@1#2] -- register_copy + // font_2x2::@1 + __b1: + // next_2x2_right = next_2x2 + 0x40*8 + // [85] (byte*) font_2x2::next_2x2_right#0 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $40*(number) 8 -- pbuz1=pbuz2_plus_vwuc1 + lda.z next_2x2_left + clc + adc #<$40*8 + sta.z next_2x2_right + lda.z next_2x2_left+1 + adc #>$40*8 + sta.z next_2x2_right+1 + // [86] (byte*) font_2x2::next_2x2_left#10 ← (byte*) font_2x2::next_2x2_left#0 -- pbuz1=pbuz2 + lda.z next_2x2_left + sta.z next_2x2_left_1 + lda.z next_2x2_left+1 + sta.z next_2x2_left_1+1 + // [87] phi from font_2x2::@1 to font_2x2::@2 [phi:font_2x2::@1->font_2x2::@2] + // [87] phi (byte*) font_2x2::next_2x2_right#7 = (byte*) font_2x2::next_2x2_right#0 [phi:font_2x2::@1->font_2x2::@2#0] -- register_copy + // [87] phi (byte) font_2x2::l2#8 = (byte) 0 [phi:font_2x2::@1->font_2x2::@2#1] -- vbuz1=vbuc1 + lda #0 + sta.z l2 + // [87] phi (byte*) font_2x2::next_2x2_left#7 = (byte*) font_2x2::next_2x2_left#10 [phi:font_2x2::@1->font_2x2::@2#2] -- register_copy + // [87] phi (byte) font_2x2::l#2 = (byte) 0 [phi:font_2x2::@1->font_2x2::@2#3] -- vbuz1=vbuc1 + sta.z l + // [87] phi from font_2x2::@8 to font_2x2::@2 [phi:font_2x2::@8->font_2x2::@2] + // [87] phi (byte*) font_2x2::next_2x2_right#7 = (byte*) font_2x2::next_2x2_right#8 [phi:font_2x2::@8->font_2x2::@2#0] -- register_copy + // [87] phi (byte) font_2x2::l2#8 = (byte) font_2x2::l2#9 [phi:font_2x2::@8->font_2x2::@2#1] -- register_copy + // [87] phi (byte*) font_2x2::next_2x2_left#7 = (byte*) font_2x2::next_2x2_left#8 [phi:font_2x2::@8->font_2x2::@2#2] -- register_copy + // [87] phi (byte) font_2x2::l#2 = (byte) font_2x2::l#1 [phi:font_2x2::@8->font_2x2::@2#3] -- register_copy + // font_2x2::@2 + __b2: + // glyph_bits = next_original[l] + // [88] (byte) font_2x2::glyph_bits#0 ← *((byte*) font_2x2::next_original#4 + (byte) font_2x2::l#2) -- vbuz1=pbuz2_derefidx_vbuz3 + ldy.z l + lda (next_original),y + sta.z glyph_bits + // [89] phi from font_2x2::@2 to font_2x2::@3 [phi:font_2x2::@2->font_2x2::@3] + // [89] phi (byte) font_2x2::b#2 = (byte) 0 [phi:font_2x2::@2->font_2x2::@3#0] -- vbuyy=vbuc1 + ldy #0 + // [89] phi (word) font_2x2::glyph_bits_2x2#3 = (word) 0 [phi:font_2x2::@2->font_2x2::@3#1] -- vwuz1=vwuc1 + tya + sta.z glyph_bits_2x2 + sta.z glyph_bits_2x2+1 + // [89] phi (byte) font_2x2::glyph_bits#2 = (byte) font_2x2::glyph_bits#0 [phi:font_2x2::@2->font_2x2::@3#2] -- register_copy + // [89] phi from font_2x2::@5 to font_2x2::@3 [phi:font_2x2::@5->font_2x2::@3] + // [89] phi (byte) font_2x2::b#2 = (byte) font_2x2::b#1 [phi:font_2x2::@5->font_2x2::@3#0] -- register_copy + // [89] phi (word) font_2x2::glyph_bits_2x2#3 = (word) font_2x2::glyph_bits_2x2#2 [phi:font_2x2::@5->font_2x2::@3#1] -- register_copy + // [89] phi (byte) font_2x2::glyph_bits#2 = (byte) font_2x2::glyph_bits#1 [phi:font_2x2::@5->font_2x2::@3#2] -- register_copy + // font_2x2::@3 + __b3: + // glyph_bits&0x80 + // [90] (byte~) font_2x2::$1 ← (byte) font_2x2::glyph_bits#2 & (byte) $80 -- vbuaa=vbuz1_band_vbuc1 + lda #$80 + and.z glyph_bits + // (glyph_bits&0x80)?1uc:0uc + // [91] if((byte) 0!=(byte~) font_2x2::$1) goto font_2x2::@4 -- vbuc1_neq_vbuaa_then_la1 + cmp #0 + bne __b4 + // [93] phi from font_2x2::@3 to font_2x2::@5 [phi:font_2x2::@3->font_2x2::@5] + // [93] phi (byte) font_2x2::glyph_bit#0 = (byte) 0 [phi:font_2x2::@3->font_2x2::@5#0] -- vbuxx=vbuc1 + ldx #0 + jmp __b5 + // [92] phi from font_2x2::@3 to font_2x2::@4 [phi:font_2x2::@3->font_2x2::@4] + // font_2x2::@4 + __b4: + // (glyph_bits&0x80)?1uc:0uc + // [93] phi from font_2x2::@4 to font_2x2::@5 [phi:font_2x2::@4->font_2x2::@5] + // [93] phi (byte) font_2x2::glyph_bit#0 = (byte) 1 [phi:font_2x2::@4->font_2x2::@5#0] -- vbuxx=vbuc1 + ldx #1 + // font_2x2::@5 + __b5: + // glyph_bits_2x2<<1 + // [94] (word~) font_2x2::$5 ← (word) font_2x2::glyph_bits_2x2#3 << (byte) 1 -- vwuz1=vwuz1_rol_1 + asl.z __5 + rol.z __5+1 + // glyph_bits_2x2 = glyph_bits_2x2<<1|glyph_bit + // [95] (word) font_2x2::glyph_bits_2x2#1 ← (word~) font_2x2::$5 | (byte) font_2x2::glyph_bit#0 -- vwuz1=vwuz1_bor_vbuxx + txa + ora.z glyph_bits_2x2 + sta.z glyph_bits_2x2 + // glyph_bits_2x2<<1 + // [96] (word~) font_2x2::$7 ← (word) font_2x2::glyph_bits_2x2#1 << (byte) 1 -- vwuz1=vwuz1_rol_1 + asl.z __7 + rol.z __7+1 + // glyph_bits_2x2 = glyph_bits_2x2<<1|glyph_bit + // [97] (word) font_2x2::glyph_bits_2x2#2 ← (word~) font_2x2::$7 | (byte) font_2x2::glyph_bit#0 -- vwuz1=vwuz1_bor_vbuxx + txa + ora.z glyph_bits_2x2 + sta.z glyph_bits_2x2 + // glyph_bits <<= 1 + // [98] (byte) font_2x2::glyph_bits#1 ← (byte) font_2x2::glyph_bits#2 << (byte) 1 -- vbuz1=vbuz1_rol_1 + // Move to next bit + asl.z glyph_bits + // for(char b: 0..7) + // [99] (byte) font_2x2::b#1 ← ++ (byte) font_2x2::b#2 -- vbuyy=_inc_vbuyy + iny + // [100] if((byte) font_2x2::b#1!=(byte) 8) goto font_2x2::@3 -- vbuyy_neq_vbuc1_then_la1 + cpy #8 + bne __b3 + // font_2x2::@6 + // >glyph_bits_2x2 + // [101] (byte~) font_2x2::$12 ← > (word) font_2x2::glyph_bits_2x2#2 -- vbuaa=_hi_vwuz1 + lda.z glyph_bits_2x2+1 + // next_2x2_left[l2] = >glyph_bits_2x2 + // [102] *((byte*) font_2x2::next_2x2_left#7 + (byte) font_2x2::l2#8) ← (byte~) font_2x2::$12 -- pbuz1_derefidx_vbuz2=vbuaa + // Put the generated 2x2-line into the 2x2-font twice + ldy.z l2 + sta (next_2x2_left_1),y + // l2+1 + // [103] (byte~) font_2x2::$11 ← (byte) font_2x2::l2#8 + (byte) 1 -- vbuyy=vbuz1_plus_1 + iny + // next_2x2_left[l2+1] = >glyph_bits_2x2 + // [104] *((byte*) font_2x2::next_2x2_left#7 + (byte~) font_2x2::$11) ← (byte~) font_2x2::$12 -- pbuz1_derefidx_vbuyy=vbuaa + sta (next_2x2_left_1),y + // $80*8 + sta.z next_2x2_left_1+1 + // next_2x2_right = next_2x2 + 0xc0*8 + // [112] (byte*) font_2x2::next_2x2_right#1 ← (byte*) font_2x2::next_2x2_left#0 + (word)(number) $c0*(number) 8 -- pbuz1=pbuz2_plus_vwuc1 + lda.z next_2x2_left + clc + adc #<$c0*8 + sta.z next_2x2_right + lda.z next_2x2_left+1 + adc #>$c0*8 + sta.z next_2x2_right+1 + // [113] phi from font_2x2::@7 to font_2x2::@8 [phi:font_2x2::@7->font_2x2::@8] + // [113] phi (byte*) font_2x2::next_2x2_right#8 = (byte*) font_2x2::next_2x2_right#1 [phi:font_2x2::@7->font_2x2::@8#0] -- register_copy + // [113] phi (byte) font_2x2::l2#9 = (byte) 0 [phi:font_2x2::@7->font_2x2::@8#1] -- vbuz1=vbuc1 + lda #0 + sta.z l2 + // [113] phi (byte*) font_2x2::next_2x2_left#8 = (byte*) font_2x2::next_2x2_left#1 [phi:font_2x2::@7->font_2x2::@8#2] -- register_copy + // [113] phi from font_2x2::@6 to font_2x2::@8 [phi:font_2x2::@6->font_2x2::@8] + // [113] phi (byte*) font_2x2::next_2x2_right#8 = (byte*) font_2x2::next_2x2_right#7 [phi:font_2x2::@6->font_2x2::@8#0] -- register_copy + // [113] phi (byte) font_2x2::l2#9 = (byte) font_2x2::l2#1 [phi:font_2x2::@6->font_2x2::@8#1] -- register_copy + // [113] phi (byte*) font_2x2::next_2x2_left#8 = (byte*) font_2x2::next_2x2_left#7 [phi:font_2x2::@6->font_2x2::@8#2] -- register_copy + // font_2x2::@8 + __b8: + // for(char l: 0..7) + // [114] (byte) font_2x2::l#1 ← ++ (byte) font_2x2::l#2 -- vbuz1=_inc_vbuz1 + inc.z l + // [115] if((byte) font_2x2::l#1!=(byte) 8) goto font_2x2::@2 -- vbuz1_neq_vbuc1_then_la1 + lda #8 + cmp.z l + bne __b2 + // font_2x2::@9 + // next_2x2 += 8 + // [116] (byte*) font_2x2::next_2x2#1 ← (byte*) font_2x2::next_2x2_left#0 + (byte) 8 -- pbuz1=pbuz1_plus_vbuc1 + clc + adc.z next_2x2 + sta.z next_2x2 + bcc !+ + inc.z next_2x2+1 + !: + // next_original += 8 + // [117] (byte*) font_2x2::next_original#1 ← (byte*) font_2x2::next_original#4 + (byte) 8 -- pbuz1=pbuz1_plus_vbuc1 + lda #8 + clc + adc.z next_original + sta.z next_original + bcc !+ + inc.z next_original+1 + !: + // for(char c: 0..0x3f) + // [118] (byte) font_2x2::c#1 ← ++ (byte) font_2x2::c#11 -- vbuz1=_inc_vbuz1 + inc.z c + // [119] if((byte) font_2x2::c#1!=(byte) $40) goto font_2x2::@1 -- vbuz1_neq_vbuc1_then_la1 + lda #$40 + cmp.z c + beq !__b1+ + jmp __b1 + !__b1: + // font_2x2::@return + // } + // [120] return + rts +} + // File Data + .align $100 + FONT_COMPRESSED_MAP: .fill $100, 0 + diff --git a/src/test/ref/examples/font-2x2/font-2x2.sym b/src/test/ref/examples/font-2x2/font-2x2.sym new file mode 100644 index 000000000..af664e48d --- /dev/null +++ b/src/test/ref/examples/font-2x2/font-2x2.sym @@ -0,0 +1,225 @@ +(label) @1 +(label) @begin +(label) @end +(const byte*) CHARGEN = (byte*) 53248 +(const byte*) D018 = (byte*) 53272 +(const byte*) FONT_COMPRESSED = (byte*) 10240 +(const byte*) FONT_COMPRESSED_MAP[(number) $100] = { fill( $100, 0) } +(const byte*) FONT_ORIGINAL = (byte*) 8192 +(const byte*) PROCPORT = (byte*) 1 +(const byte) PROCPORT_BASIC_KERNEL_IO = (byte) 7 +(const byte) PROCPORT_RAM_CHARROM = (byte) 1 +(const byte*) SCREEN = (byte*) 1024 +(void()) font_2x2((byte*) font_2x2::font_original , (byte*) font_2x2::font_2x2) +(byte~) font_2x2::$1 reg byte a 200002.0 +(byte~) font_2x2::$11 reg byte y 20002.0 +(byte~) font_2x2::$12 reg byte a 10001.0 +(byte~) font_2x2::$14 reg byte y 20002.0 +(byte~) font_2x2::$15 reg byte a 10001.0 +(word~) font_2x2::$5 zp[2]:13 200002.0 +(word~) font_2x2::$7 zp[2]:13 200002.0 +(label) font_2x2::@1 +(label) font_2x2::@2 +(label) font_2x2::@3 +(label) font_2x2::@4 +(label) font_2x2::@5 +(label) font_2x2::@6 +(label) font_2x2::@7 +(label) font_2x2::@8 +(label) font_2x2::@9 +(label) font_2x2::@return +(byte) font_2x2::b +(byte) font_2x2::b#1 reg byte y 150001.5 +(byte) font_2x2::b#2 reg byte y 20000.2 +(byte) font_2x2::c +(byte) font_2x2::c#1 c zp[1]:9 1501.5 +(byte) font_2x2::c#11 c zp[1]:9 58.88235294117647 +(byte*) font_2x2::font_2x2 +(byte*) font_2x2::font_original +(byte) font_2x2::glyph_bit +(byte) font_2x2::glyph_bit#0 reg byte x 50000.5 +(byte) font_2x2::glyph_bits +(byte) font_2x2::glyph_bits#0 glyph_bits zp[1]:12 20002.0 +(byte) font_2x2::glyph_bits#1 glyph_bits zp[1]:12 66667.33333333333 +(byte) font_2x2::glyph_bits#2 glyph_bits zp[1]:12 34444.88888888889 +(word) font_2x2::glyph_bits_2x2 +(word) font_2x2::glyph_bits_2x2#1 glyph_bits_2x2 zp[2]:13 200002.0 +(word) font_2x2::glyph_bits_2x2#2 glyph_bits_2x2 zp[2]:13 27500.5 +(word) font_2x2::glyph_bits_2x2#3 glyph_bits_2x2 zp[2]:13 40000.4 +(byte) font_2x2::l +(byte) font_2x2::l#1 l zp[1]:10 15001.5 +(byte) font_2x2::l#2 l zp[1]:10 1111.2222222222222 +(byte) font_2x2::l2 +(byte) font_2x2::l2#1 l2 zp[1]:11 15001.5 +(byte) font_2x2::l2#8 l2 zp[1]:11 2727.5454545454545 +(byte) font_2x2::l2#9 l2 zp[1]:11 6667.333333333333 +(byte*) font_2x2::next_2x2 +(byte*) font_2x2::next_2x2#1 next_2x2 zp[2]:5 500.5 +(byte*) font_2x2::next_2x2_left +(byte*) font_2x2::next_2x2_left#0 next_2x2_left zp[2]:5 750.1875 +(byte*) font_2x2::next_2x2_left#1 next_2x2_left_1 zp[2]:15 10001.0 +(byte*) font_2x2::next_2x2_left#10 next_2x2_left_1 zp[2]:15 2002.0 +(byte*) font_2x2::next_2x2_left#7 next_2x2_left_1 zp[2]:15 1708.5416666666665 +(byte*) font_2x2::next_2x2_left#8 next_2x2_left_1 zp[2]:15 10001.0 +(byte*) font_2x2::next_2x2_right +(byte*) font_2x2::next_2x2_right#0 next_2x2_right zp[2]:17 1001.0 +(byte*) font_2x2::next_2x2_right#1 next_2x2_right zp[2]:17 20002.0 +(byte*) font_2x2::next_2x2_right#7 next_2x2_right zp[2]:17 1708.5416666666665 +(byte*) font_2x2::next_2x2_right#8 next_2x2_right zp[2]:17 10001.0 +(byte*) font_2x2::next_original +(byte*) font_2x2::next_original#1 next_original zp[2]:7 667.3333333333334 +(byte*) font_2x2::next_original#4 next_original zp[2]:7 363.7272727272727 +(byte()) font_compress((byte*) font_compress::font_original , (byte*) font_compress::font_compressed , (byte*) font_compress::compress_mapping) +(label) font_compress::@1 +(label) font_compress::@2 +(label) font_compress::@3 +(label) font_compress::@4 +(label) font_compress::@5 +(label) font_compress::@6 +(label) font_compress::@7 +(label) font_compress::@return +(byte*) font_compress::compress_mapping +(byte*) font_compress::font_compressed +(byte*) font_compress::font_original +(byte) font_compress::font_size +(byte) font_compress::font_size#1 reg byte x 1001.0 +(byte) font_compress::font_size#2 font_size zp[1]:9 385.0 +(byte) font_compress::font_size#9 font_size zp[1]:9 2002.0 +(byte) font_compress::found +(byte) font_compress::found#0 reg byte a 1001.0 +(byte) font_compress::found#2 reg byte a 3003.0 +(byte) font_compress::found#3 reg byte a 2002.0 +(byte) font_compress::i +(byte) font_compress::i#1 i zp[1]:10 1001.0 +(byte) font_compress::i#4 i zp[1]:10 166.83333333333334 +(byte) font_compress::l +(byte) font_compress::l#1 reg byte y 15001.5 +(byte) font_compress::l#2 reg byte y 20002.0 +(byte*) font_compress::next_compressed +(byte*) font_compress::next_compressed#1 next_compressed zp[2]:5 667.3333333333334 +(byte*) font_compress::next_compressed#4 next_compressed zp[2]:5 1083.6666666666665 +(byte*) font_compress::next_compressed#7 next_compressed zp[2]:5 500.5 +(byte*) font_compress::next_original +(byte*) font_compress::next_original#1 next_original zp[2]:13 500.5 +(byte*) font_compress::next_original#2 next_original zp[2]:13 764.9411764705882 +(byte) font_compress::return +(byte) font_compress::return#1 reg byte x 600.5999999999999 +(byte) font_compress::return#5 reg byte x 2002.0 +(byte()) font_find((byte*) font_find::glyph , (byte*) font_find::font , (byte) font_find::font_size) +(label) font_find::@1 +(label) font_find::@2 +(label) font_find::@3 +(label) font_find::@4 +(label) font_find::@5 +(label) font_find::@return +(byte*) font_find::font +(byte*) font_find::font#1 font zp[2]:7 1000001.0 +(byte*) font_find::font#4 font zp[2]:7 1500000.375 +(byte) font_find::font_size +(byte) font_find::font_size#0 font_size zp[1]:9 83416.83333333334 +(byte) font_find::found +(byte) font_find::found#2 reg byte a 1000001.0 +(byte*) font_find::glyph +(byte*) font_find::glyph#0 glyph zp[2]:13 769307.8461538461 +(byte) font_find::i +(byte) font_find::i#1 reg byte x 2000002.0 +(byte) font_find::i#2 reg byte x 444444.8888888889 +(byte) font_find::l +(byte) font_find::l#1 reg byte y 1.50000015E7 +(byte) font_find::l#2 reg byte y 2.0000002E7 +(byte) font_find::return +(byte) font_find::return#0 reg byte a 2002.0 +(byte) font_find::return#3 reg byte x 333667.3333333334 +(void()) main() +(label) main::@1 +(label) main::@2 +(label) main::@3 +(label) main::@4 +(label) main::@5 +(label) main::@6 +(label) main::@7 +(byte) main::c +(byte) main::c#1 c zp[1]:3 420.59999999999997 +(byte) main::c#2 c zp[1]:3 620.8 +(byte) main::c#4 c zp[1]:3 202.0 +(label) main::toD0181 +(byte*) main::toD0181_gfx +(byte) main::toD0181_return +(const byte) main::toD0181_return#0 toD0181_return = >(word)(const byte*) SCREEN&(word) $3fff*(byte) 4|>(word)(const byte*) FONT_COMPRESSED/(byte) 4&(byte) $f +(byte*) main::toD0181_screen +(byte) main::x +(byte) main::x#1 x zp[1]:4 1501.5 +(byte) main::x#2 x zp[1]:4 500.5 +(byte) main::y +(byte) main::y#1 y zp[1]:2 151.5 +(byte) main::y#4 y zp[1]:2 133.66666666666669 +(void*()) memset((void*) memset::str , (byte) memset::c , (word) memset::num) +(label) memset::@1 +(label) memset::@2 +(label) memset::@return +(byte) memset::c +(byte) memset::c#0 reg byte x 168.66666666666669 +(byte*) memset::dst +(byte*) memset::dst#1 dst zp[2]:13 2002.0 +(byte*) memset::dst#2 dst zp[2]:13 1334.6666666666667 +(byte*) memset::end +(const byte*) memset::end#0 end = (byte*)(const void*) memset::str#0+(const word) memset::num#0 +(word) memset::num +(const word) memset::num#0 num = (word) $400 +(void*) memset::return +(void*) memset::str +(const void*) memset::str#0 str = (void*)(const byte*) SCREEN +(void()) show((byte) show::c , (byte) show::x , (byte) show::y , (byte*) show::font_mapping) +(word~) show::$0 zp[2]:15 15001.5 +(word~) show::$1 zp[2]:15 20002.0 +(byte*~) show::$2 zp[2]:15 10001.0 +(byte~) show::$3 reg byte a 20002.0 +(byte~) show::$5 reg byte x 20002.0 +(byte~) show::$6 reg byte a 20002.0 +(byte~) show::$7 reg byte a 20002.0 +(word~) show::$8 zp[2]:17 20002.0 +(word~) show::$9 zp[2]:15 20002.0 +(label) show::@return +(byte) show::c +(byte) show::c#0 c zp[1]:3 2733.666666666667 +(byte*) show::font_mapping +(byte*) show::ptr +(byte*) show::ptr#0 ptr zp[2]:15 7143.571428571429 +(byte) show::x +(byte) show::x#0 reg byte x 1571.7142857142858 +(byte) show::y +(byte) show::y#0 reg byte a 1001.0 + +zp[1]:2 [ main::y#4 main::y#1 ] +zp[1]:3 [ main::c#2 main::c#4 main::c#1 show::c#0 ] +zp[1]:4 [ main::x#2 main::x#1 ] +reg byte y [ font_compress::l#2 font_compress::l#1 ] +reg byte a [ font_compress::found#2 font_compress::found#3 font_compress::found#0 ] +reg byte x [ font_compress::return#1 font_compress::font_size#1 font_compress::return#5 ] +reg byte x [ font_find::return#3 font_find::i#2 font_find::i#1 ] +reg byte y [ font_find::l#2 font_find::l#1 ] +reg byte a [ font_find::found#2 ] +zp[2]:5 [ font_2x2::next_2x2_left#0 font_2x2::next_2x2#1 font_compress::next_compressed#4 font_compress::next_compressed#7 font_compress::next_compressed#1 ] +zp[2]:7 [ font_2x2::next_original#4 font_2x2::next_original#1 font_find::font#4 font_find::font#1 ] +zp[1]:9 [ font_2x2::c#11 font_2x2::c#1 font_compress::font_size#2 font_compress::font_size#9 font_find::font_size#0 ] +zp[1]:10 [ font_2x2::l#2 font_2x2::l#1 font_compress::i#4 font_compress::i#1 ] +zp[1]:11 [ font_2x2::l2#8 font_2x2::l2#9 font_2x2::l2#1 ] +zp[1]:12 [ font_2x2::glyph_bits#2 font_2x2::glyph_bits#0 font_2x2::glyph_bits#1 ] +zp[2]:13 [ font_2x2::glyph_bits_2x2#3 font_2x2::glyph_bits_2x2#2 font_2x2::$5 font_2x2::$7 font_2x2::glyph_bits_2x2#1 font_compress::next_original#2 font_compress::next_original#1 font_find::glyph#0 memset::dst#2 memset::dst#1 ] +reg byte y [ font_2x2::b#2 font_2x2::b#1 ] +reg byte x [ font_2x2::glyph_bit#0 ] +reg byte x [ memset::c#0 ] +reg byte x [ show::x#0 ] +reg byte a [ show::y#0 ] +zp[2]:15 [ show::$0 show::$9 show::$1 show::$2 show::ptr#0 font_2x2::next_2x2_left#7 font_2x2::next_2x2_left#10 font_2x2::next_2x2_left#8 font_2x2::next_2x2_left#1 ] +zp[2]:17 [ show::$8 font_2x2::next_2x2_right#7 font_2x2::next_2x2_right#0 font_2x2::next_2x2_right#8 font_2x2::next_2x2_right#1 ] +reg byte a [ show::$3 ] +reg byte x [ show::$5 ] +reg byte a [ show::$6 ] +reg byte a [ show::$7 ] +reg byte a [ font_find::return#0 ] +reg byte a [ font_2x2::$1 ] +reg byte a [ font_2x2::$12 ] +reg byte y [ font_2x2::$11 ] +reg byte a [ font_2x2::$15 ] +reg byte y [ font_2x2::$14 ]