kickc/src/test/ref/millfork-benchmarks/romsum-kc.log

3601 lines
164 KiB
Plaintext

Setting inferred volatile on symbol affected by address-of last_time
Inlined call vicSelectGfxBank::$0 = call toDd00(vicSelectGfxBank::gfx)
Inlined call call __init
CONTROL FLOW GRAPH SSA
void print_str(char *str)
print_str: scope:[print_str] from print_uint_decimal::@1
print_char_cursor#57 = phi( print_uint_decimal::@1/print_char_cursor#51 )
print_str::str#5 = phi( print_uint_decimal::@1/print_str::str#1 )
to:print_str::@1
print_str::@1: scope:[print_str] from print_str print_str::@3
print_char_cursor#48 = phi( print_str/print_char_cursor#57, print_str::@3/print_char_cursor#0 )
print_str::str#2 = phi( print_str/print_str::str#5, print_str::@3/print_str::str#0 )
print_str::$1 = 0 != *print_str::str#2
if(print_str::$1) goto print_str::@2
to:print_str::@return
print_str::@2: scope:[print_str] from print_str::@1
print_char_cursor#47 = phi( print_str::@1/print_char_cursor#48 )
print_str::str#3 = phi( print_str::@1/print_str::str#2 )
print_char::ch#0 = *print_str::str#3
call print_char
to:print_str::@3
print_str::@3: scope:[print_str] from print_str::@2
print_str::str#4 = phi( print_str::@2/print_str::str#3 )
print_char_cursor#24 = phi( print_str::@2/print_char_cursor#13 )
print_char_cursor#0 = print_char_cursor#24
print_str::str#0 = ++ print_str::str#4
to:print_str::@1
print_str::@return: scope:[print_str] from print_str::@1
print_char_cursor#25 = phi( print_str::@1/print_char_cursor#48 )
print_char_cursor#1 = print_char_cursor#25
return
to:@return
void print_ln()
print_ln: scope:[print_ln] from end::@2 main::@6
print_char_cursor#49 = phi( end::@2/print_char_cursor#14, main::@6/print_char_cursor#17 )
print_line_cursor#20 = phi( end::@2/print_line_cursor#21, main::@6/print_line_cursor#22 )
to:print_ln::@1
print_ln::@1: scope:[print_ln] from print_ln print_ln::@1
print_char_cursor#26 = phi( print_ln/print_char_cursor#49, print_ln::@1/print_char_cursor#26 )
print_line_cursor#10 = phi( print_ln/print_line_cursor#20, print_ln::@1/print_line_cursor#0 )
print_ln::$0 = print_line_cursor#10 + $28
print_line_cursor#0 = print_ln::$0
print_ln::$1 = print_line_cursor#0 < print_char_cursor#26
if(print_ln::$1) goto print_ln::@1
to:print_ln::@2
print_ln::@2: scope:[print_ln] from print_ln::@1
print_line_cursor#11 = phi( print_ln::@1/print_line_cursor#0 )
print_char_cursor#2 = print_line_cursor#11
to:print_ln::@return
print_ln::@return: scope:[print_ln] from print_ln::@2
print_char_cursor#27 = phi( print_ln::@2/print_char_cursor#2 )
print_line_cursor#12 = phi( print_ln::@2/print_line_cursor#11 )
print_line_cursor#1 = print_line_cursor#12
print_char_cursor#3 = print_char_cursor#27
return
to:@return
void print_uint(unsigned int w)
print_uint: scope:[print_uint] from end::@1
print_char_cursor#50 = phi( end::@1/print_char_cursor#53 )
print_uint::w#1 = phi( end::@1/print_uint::w#0 )
print_uint::$0 = byte1 print_uint::w#1
print_uchar::b#0 = print_uint::$0
call print_uchar
to:print_uint::@1
print_uint::@1: scope:[print_uint] from print_uint
print_uint::w#2 = phi( print_uint/print_uint::w#1 )
print_char_cursor#28 = phi( print_uint/print_char_cursor#11 )
print_char_cursor#4 = print_char_cursor#28
print_uint::$2 = byte0 print_uint::w#2
print_uchar::b#1 = print_uint::$2
call print_uchar
to:print_uint::@2
print_uint::@2: scope:[print_uint] from print_uint::@1
print_char_cursor#29 = phi( print_uint::@1/print_char_cursor#11 )
print_char_cursor#5 = print_char_cursor#29
to:print_uint::@return
print_uint::@return: scope:[print_uint] from print_uint::@2
print_char_cursor#30 = phi( print_uint::@2/print_char_cursor#5 )
print_char_cursor#6 = print_char_cursor#30
return
to:@return
void print_uint_decimal(unsigned int w)
print_uint_decimal: scope:[print_uint_decimal] from main::@5
print_char_cursor#58 = phi( main::@5/print_char_cursor#54 )
print_uint_decimal::w#1 = phi( main::@5/print_uint_decimal::w#0 )
utoa::value#0 = print_uint_decimal::w#1
utoa::buffer#0 = decimal_digits
utoa::radix#0 = DECIMAL
call utoa
to:print_uint_decimal::@1
print_uint_decimal::@1: scope:[print_uint_decimal] from print_uint_decimal
print_char_cursor#51 = phi( print_uint_decimal/print_char_cursor#58 )
print_str::str#1 = decimal_digits
call print_str
to:print_uint_decimal::@2
print_uint_decimal::@2: scope:[print_uint_decimal] from print_uint_decimal::@1
print_char_cursor#31 = phi( print_uint_decimal::@1/print_char_cursor#1 )
print_char_cursor#7 = print_char_cursor#31
to:print_uint_decimal::@return
print_uint_decimal::@return: scope:[print_uint_decimal] from print_uint_decimal::@2
print_char_cursor#32 = phi( print_uint_decimal::@2/print_char_cursor#7 )
print_char_cursor#8 = print_char_cursor#32
return
to:@return
void print_uchar(char b)
print_uchar: scope:[print_uchar] from print_uint print_uint::@1
print_char_cursor#52 = phi( print_uint/print_char_cursor#50, print_uint::@1/print_char_cursor#4 )
print_uchar::b#2 = phi( print_uint/print_uchar::b#0, print_uint::@1/print_uchar::b#1 )
print_uchar::$0 = print_uchar::b#2 >> 4
print_char::ch#1 = print_hextab[print_uchar::$0]
call print_char
to:print_uchar::@1
print_uchar::@1: scope:[print_uchar] from print_uchar
print_uchar::b#3 = phi( print_uchar/print_uchar::b#2 )
print_char_cursor#33 = phi( print_uchar/print_char_cursor#13 )
print_char_cursor#9 = print_char_cursor#33
print_uchar::$2 = print_uchar::b#3 & $f
print_char::ch#2 = print_hextab[print_uchar::$2]
call print_char
to:print_uchar::@2
print_uchar::@2: scope:[print_uchar] from print_uchar::@1
print_char_cursor#34 = phi( print_uchar::@1/print_char_cursor#13 )
print_char_cursor#10 = print_char_cursor#34
to:print_uchar::@return
print_uchar::@return: scope:[print_uchar] from print_uchar::@2
print_char_cursor#35 = phi( print_uchar::@2/print_char_cursor#10 )
print_char_cursor#11 = print_char_cursor#35
return
to:@return
void print_char(char ch)
print_char: scope:[print_char] from print_str::@2 print_uchar print_uchar::@1
print_char_cursor#36 = phi( print_str::@2/print_char_cursor#47, print_uchar/print_char_cursor#52, print_uchar::@1/print_char_cursor#9 )
print_char::ch#3 = phi( print_str::@2/print_char::ch#0, print_uchar/print_char::ch#1, print_uchar::@1/print_char::ch#2 )
*print_char_cursor#36 = print_char::ch#3
print_char_cursor#12 = ++ print_char_cursor#36
to:print_char::@return
print_char::@return: scope:[print_char] from print_char
print_char_cursor#37 = phi( print_char/print_char_cursor#12 )
print_char_cursor#13 = print_char_cursor#37
return
to:@return
void utoa(unsigned int value , char *buffer , char radix)
utoa: scope:[utoa] from print_uint_decimal
utoa::buffer#21 = phi( print_uint_decimal/utoa::buffer#0 )
utoa::value#12 = phi( print_uint_decimal/utoa::value#0 )
utoa::radix#1 = phi( print_uint_decimal/utoa::radix#0 )
utoa::max_digits#0 = 0
utoa::digit_values#0 = (unsigned int *) 0
utoa::$0 = utoa::radix#1 == DECIMAL
if(utoa::$0) goto utoa::@1
to:utoa::@6
utoa::@1: scope:[utoa] from utoa
utoa::buffer#17 = phi( utoa/utoa::buffer#21 )
utoa::value#8 = phi( utoa/utoa::value#12 )
utoa::max_digits#1 = 5
utoa::digit_values#1 = RADIX_DECIMAL_VALUES
to:utoa::@5
utoa::@6: scope:[utoa] from utoa
utoa::value#13 = phi( utoa/utoa::value#12 )
utoa::buffer#16 = phi( utoa/utoa::buffer#21 )
utoa::radix#2 = phi( utoa/utoa::radix#1 )
utoa::$1 = utoa::radix#2 == HEXADECIMAL
if(utoa::$1) goto utoa::@2
to:utoa::@7
utoa::@2: scope:[utoa] from utoa::@6
utoa::buffer#18 = phi( utoa::@6/utoa::buffer#16 )
utoa::value#9 = phi( utoa::@6/utoa::value#13 )
utoa::max_digits#2 = 4
utoa::digit_values#2 = RADIX_HEXADECIMAL_VALUES
to:utoa::@5
utoa::@7: scope:[utoa] from utoa::@6
utoa::value#14 = phi( utoa::@6/utoa::value#13 )
utoa::buffer#13 = phi( utoa::@6/utoa::buffer#16 )
utoa::radix#3 = phi( utoa::@6/utoa::radix#2 )
utoa::$2 = utoa::radix#3 == OCTAL
if(utoa::$2) goto utoa::@3
to:utoa::@8
utoa::@3: scope:[utoa] from utoa::@7
utoa::buffer#19 = phi( utoa::@7/utoa::buffer#13 )
utoa::value#10 = phi( utoa::@7/utoa::value#14 )
utoa::max_digits#3 = 6
utoa::digit_values#3 = RADIX_OCTAL_VALUES
to:utoa::@5
utoa::@8: scope:[utoa] from utoa::@7
utoa::value#15 = phi( utoa::@7/utoa::value#14 )
utoa::buffer#10 = phi( utoa::@7/utoa::buffer#13 )
utoa::radix#4 = phi( utoa::@7/utoa::radix#3 )
utoa::$3 = utoa::radix#4 == BINARY
if(utoa::$3) goto utoa::@4
to:utoa::@9
utoa::@4: scope:[utoa] from utoa::@8
utoa::buffer#20 = phi( utoa::@8/utoa::buffer#10 )
utoa::value#11 = phi( utoa::@8/utoa::value#15 )
utoa::max_digits#4 = $10
utoa::digit_values#4 = RADIX_BINARY_VALUES
to:utoa::@5
utoa::@9: scope:[utoa] from utoa::@8
utoa::buffer#6 = phi( utoa::@8/utoa::buffer#10 )
*utoa::buffer#6 = 'e'
utoa::buffer#1 = ++ utoa::buffer#6
*utoa::buffer#1 = 'r'
utoa::buffer#2 = ++ utoa::buffer#1
*utoa::buffer#2 = 'r'
utoa::buffer#3 = ++ utoa::buffer#2
*utoa::buffer#3 = 0
to:utoa::@return
utoa::@return: scope:[utoa] from utoa::@12 utoa::@9
return
to:@return
utoa::@5: scope:[utoa] from utoa::@1 utoa::@2 utoa::@3 utoa::@4
utoa::buffer#15 = phi( utoa::@1/utoa::buffer#17, utoa::@2/utoa::buffer#18, utoa::@3/utoa::buffer#19, utoa::@4/utoa::buffer#20 )
utoa::value#7 = phi( utoa::@1/utoa::value#8, utoa::@2/utoa::value#9, utoa::@3/utoa::value#10, utoa::@4/utoa::value#11 )
utoa::digit_values#8 = phi( utoa::@1/utoa::digit_values#1, utoa::@2/utoa::digit_values#2, utoa::@3/utoa::digit_values#3, utoa::@4/utoa::digit_values#4 )
utoa::max_digits#7 = phi( utoa::@1/utoa::max_digits#1, utoa::@2/utoa::max_digits#2, utoa::@3/utoa::max_digits#3, utoa::@4/utoa::max_digits#4 )
utoa::started#0 = 0
utoa::digit#0 = 0
to:utoa::@10
utoa::@10: scope:[utoa] from utoa::@13 utoa::@5
utoa::buffer#11 = phi( utoa::@13/utoa::buffer#14, utoa::@5/utoa::buffer#15 )
utoa::started#3 = phi( utoa::@13/utoa::started#4, utoa::@5/utoa::started#0 )
utoa::value#5 = phi( utoa::@13/utoa::value#6, utoa::@5/utoa::value#7 )
utoa::digit_values#6 = phi( utoa::@13/utoa::digit_values#7, utoa::@5/utoa::digit_values#8 )
utoa::digit#2 = phi( utoa::@13/utoa::digit#1, utoa::@5/utoa::digit#0 )
utoa::max_digits#5 = phi( utoa::@13/utoa::max_digits#6, utoa::@5/utoa::max_digits#7 )
utoa::$4 = utoa::max_digits#5 - 1
utoa::$5 = utoa::digit#2 < utoa::$4
if(utoa::$5) goto utoa::@11
to:utoa::@12
utoa::@11: scope:[utoa] from utoa::@10
utoa::max_digits#8 = phi( utoa::@10/utoa::max_digits#5 )
utoa::buffer#12 = phi( utoa::@10/utoa::buffer#11 )
utoa::started#2 = phi( utoa::@10/utoa::started#3 )
utoa::value#2 = phi( utoa::@10/utoa::value#5 )
utoa::digit_values#5 = phi( utoa::@10/utoa::digit_values#6 )
utoa::digit#3 = phi( utoa::@10/utoa::digit#2 )
utoa::$10 = utoa::digit#3 * SIZEOF_UNSIGNED_INT
utoa::digit_value#0 = utoa::digit_values#5[utoa::$10]
utoa::$6 = utoa::value#2 >= utoa::digit_value#0
utoa::$7 = utoa::started#2 || utoa::$6
utoa::$8 = ! utoa::$7
if(utoa::$8) goto utoa::@13
to:utoa::@14
utoa::@12: scope:[utoa] from utoa::@10
utoa::buffer#7 = phi( utoa::@10/utoa::buffer#11 )
utoa::value#3 = phi( utoa::@10/utoa::value#5 )
utoa::$11 = (char)utoa::value#3
*utoa::buffer#7 = DIGITS[utoa::$11]
utoa::buffer#4 = ++ utoa::buffer#7
*utoa::buffer#4 = 0
to:utoa::@return
utoa::@13: scope:[utoa] from utoa::@11 utoa::@15
utoa::buffer#14 = phi( utoa::@11/utoa::buffer#12, utoa::@15/utoa::buffer#5 )
utoa::started#4 = phi( utoa::@11/utoa::started#2, utoa::@15/utoa::started#1 )
utoa::value#6 = phi( utoa::@11/utoa::value#2, utoa::@15/utoa::value#1 )
utoa::digit_values#7 = phi( utoa::@11/utoa::digit_values#5, utoa::@15/utoa::digit_values#9 )
utoa::max_digits#6 = phi( utoa::@11/utoa::max_digits#8, utoa::@15/utoa::max_digits#9 )
utoa::digit#4 = phi( utoa::@11/utoa::digit#3, utoa::@15/utoa::digit#5 )
utoa::digit#1 = ++ utoa::digit#4
to:utoa::@10
utoa::@14: scope:[utoa] from utoa::@11
utoa::digit_values#10 = phi( utoa::@11/utoa::digit_values#5 )
utoa::max_digits#10 = phi( utoa::@11/utoa::max_digits#8 )
utoa::digit#6 = phi( utoa::@11/utoa::digit#3 )
utoa::digit_value#1 = phi( utoa::@11/utoa::digit_value#0 )
utoa::value#4 = phi( utoa::@11/utoa::value#2 )
utoa::buffer#8 = phi( utoa::@11/utoa::buffer#12 )
utoa_append::buffer#0 = utoa::buffer#8
utoa_append::value#0 = utoa::value#4
utoa_append::sub#0 = utoa::digit_value#1
call utoa_append
utoa_append::return#0 = utoa_append::return#2
to:utoa::@15
utoa::@15: scope:[utoa] from utoa::@14
utoa::digit_values#9 = phi( utoa::@14/utoa::digit_values#10 )
utoa::max_digits#9 = phi( utoa::@14/utoa::max_digits#10 )
utoa::digit#5 = phi( utoa::@14/utoa::digit#6 )
utoa::buffer#9 = phi( utoa::@14/utoa::buffer#8 )
utoa_append::return#3 = phi( utoa::@14/utoa_append::return#0 )
utoa::$9 = utoa_append::return#3
utoa::value#1 = utoa::$9
utoa::buffer#5 = ++ utoa::buffer#9
utoa::started#1 = 1
to:utoa::@13
unsigned int utoa_append(char *buffer , unsigned int value , unsigned int sub)
utoa_append: scope:[utoa_append] from utoa::@14
utoa_append::buffer#3 = phi( utoa::@14/utoa_append::buffer#0 )
utoa_append::sub#3 = phi( utoa::@14/utoa_append::sub#0 )
utoa_append::value#5 = phi( utoa::@14/utoa_append::value#0 )
utoa_append::digit#0 = 0
to:utoa_append::@1
utoa_append::@1: scope:[utoa_append] from utoa_append utoa_append::@2
utoa_append::buffer#2 = phi( utoa_append/utoa_append::buffer#3, utoa_append::@2/utoa_append::buffer#4 )
utoa_append::digit#4 = phi( utoa_append/utoa_append::digit#0, utoa_append::@2/utoa_append::digit#1 )
utoa_append::sub#1 = phi( utoa_append/utoa_append::sub#3, utoa_append::@2/utoa_append::sub#2 )
utoa_append::value#2 = phi( utoa_append/utoa_append::value#5, utoa_append::@2/utoa_append::value#1 )
utoa_append::$0 = utoa_append::value#2 >= utoa_append::sub#1
if(utoa_append::$0) goto utoa_append::@2
to:utoa_append::@3
utoa_append::@2: scope:[utoa_append] from utoa_append::@1
utoa_append::buffer#4 = phi( utoa_append::@1/utoa_append::buffer#2 )
utoa_append::sub#2 = phi( utoa_append::@1/utoa_append::sub#1 )
utoa_append::value#3 = phi( utoa_append::@1/utoa_append::value#2 )
utoa_append::digit#2 = phi( utoa_append::@1/utoa_append::digit#4 )
utoa_append::digit#1 = ++ utoa_append::digit#2
utoa_append::value#1 = utoa_append::value#3 - utoa_append::sub#2
to:utoa_append::@1
utoa_append::@3: scope:[utoa_append] from utoa_append::@1
utoa_append::value#4 = phi( utoa_append::@1/utoa_append::value#2 )
utoa_append::buffer#1 = phi( utoa_append::@1/utoa_append::buffer#2 )
utoa_append::digit#3 = phi( utoa_append::@1/utoa_append::digit#4 )
*utoa_append::buffer#1 = DIGITS[utoa_append::digit#3]
utoa_append::return#1 = utoa_append::value#4
to:utoa_append::@return
utoa_append::@return: scope:[utoa_append] from utoa_append::@3
utoa_append::return#4 = phi( utoa_append::@3/utoa_append::return#1 )
utoa_append::return#2 = utoa_append::return#4
return
to:@return
void start()
start: scope:[start] from end main
asm { jsr$FFDE staLAST_TIME stxLAST_TIME+1 }
to:start::@return
start::@return: scope:[start] from start
return
to:@return
void end()
end: scope:[end] from main::@3
print_line_cursor#28 = phi( main::@3/print_line_cursor#23 )
print_char_cursor#59 = phi( main::@3/print_char_cursor#55 )
Ticks#0 = last_time
call start
to:end::@1
end::@1: scope:[end] from end
print_line_cursor#25 = phi( end/print_line_cursor#28 )
print_char_cursor#53 = phi( end/print_char_cursor#59 )
Ticks#8 = phi( end/Ticks#0 )
last_time = last_time - Ticks#8
Ticks#1 = last_time
print_uint::w#0 = Ticks#1
call print_uint
to:end::@2
end::@2: scope:[end] from end::@1
Ticks#17 = phi( end::@1/Ticks#1 )
print_line_cursor#21 = phi( end::@1/print_line_cursor#25 )
print_char_cursor#38 = phi( end::@1/print_char_cursor#6 )
print_char_cursor#14 = print_char_cursor#38
call print_ln
to:end::@3
end::@3: scope:[end] from end::@2
Ticks#14 = phi( end::@2/Ticks#17 )
print_char_cursor#39 = phi( end::@2/print_char_cursor#3 )
print_line_cursor#13 = phi( end::@2/print_line_cursor#1 )
print_line_cursor#2 = print_line_cursor#13
print_char_cursor#15 = print_char_cursor#39
to:end::@return
end::@return: scope:[end] from end::@3
print_line_cursor#14 = phi( end::@3/print_line_cursor#2 )
print_char_cursor#40 = phi( end::@3/print_char_cursor#15 )
Ticks#9 = phi( end::@3/Ticks#14 )
Ticks#2 = Ticks#9
print_char_cursor#16 = print_char_cursor#40
print_line_cursor#3 = print_line_cursor#14
return
to:@return
unsigned int sum()
sum: scope:[sum] from main::@2
sum::s#0 = 0
sum::p#0 = (char *) 0
sum::page#0 = 0
sum::i#0 = 0
sum::tmp#0 = 0
sum::p#1 = rom
sum::s#1 = 0
sum::page#1 = 0
to:sum::@1
sum::@1: scope:[sum] from sum sum::@5
sum::p#6 = phi( sum/sum::p#1, sum::@5/sum::p#2 )
sum::s#5 = phi( sum/sum::s#1, sum::@5/sum::s#7 )
sum::page#3 = phi( sum/sum::page#1, sum::@5/sum::page#2 )
sum::$0 = sum::page#3 < $20
if(sum::$0) goto sum::@2
to:sum::@3
sum::@2: scope:[sum] from sum::@1
sum::page#6 = phi( sum::@1/sum::page#3 )
sum::s#6 = phi( sum::@1/sum::s#5 )
sum::p#5 = phi( sum::@1/sum::p#6 )
sum::i#1 = 0
to:sum::@4
sum::@3: scope:[sum] from sum::@1
sum::s#3 = phi( sum::@1/sum::s#5 )
sum::return#0 = sum::s#3
to:sum::@return
sum::@4: scope:[sum] from sum::@2 sum::@4
sum::page#5 = phi( sum::@2/sum::page#6, sum::@4/sum::page#5 )
sum::s#4 = phi( sum::@2/sum::s#6, sum::@4/sum::s#2 )
sum::i#3 = phi( sum::@2/sum::i#1, sum::@4/sum::i#2 )
sum::p#3 = phi( sum::@2/sum::p#5, sum::@4/sum::p#3 )
sum::tmp#1 = sum::p#3[sum::i#3]
sum::s#2 = sum::s#4 + sum::tmp#1
sum::i#2 = ++ sum::i#3
sum::$1 = 0 != sum::i#2
if(sum::$1) goto sum::@4
to:sum::@5
sum::@5: scope:[sum] from sum::@4
sum::s#7 = phi( sum::@4/sum::s#2 )
sum::page#4 = phi( sum::@4/sum::page#5 )
sum::p#4 = phi( sum::@4/sum::p#3 )
sum::p#2 = sum::p#4 + $100
sum::page#2 = ++ sum::page#4
to:sum::@1
sum::@return: scope:[sum] from sum::@3
sum::return#3 = phi( sum::@3/sum::return#0 )
sum::return#1 = sum::return#3
return
to:@return
int main()
main: scope:[main] from __start::@1
print_line_cursor#31 = phi( __start::@1/print_line_cursor#24 )
print_char_cursor#63 = phi( __start::@1/print_char_cursor#56 )
Ticks#21 = phi( __start::@1/Ticks#16 )
main::i#0 = 0
call start
to:main::@4
main::@4: scope:[main] from main
print_line_cursor#29 = phi( main/print_line_cursor#31 )
print_char_cursor#62 = phi( main/print_char_cursor#63 )
Ticks#19 = phi( main/Ticks#21 )
main::i#1 = 0
to:main::@1
main::@1: scope:[main] from main::@4 main::@7
print_line_cursor#27 = phi( main::@4/print_line_cursor#29, main::@7/print_line_cursor#4 )
print_char_cursor#61 = phi( main::@4/print_char_cursor#62, main::@7/print_char_cursor#18 )
Ticks#18 = phi( main::@4/Ticks#19, main::@7/Ticks#20 )
main::i#3 = phi( main::@4/main::i#1, main::@7/main::i#2 )
main::$2 = main::i#3 < 6
if(main::$2) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1
Ticks#24 = phi( main::@1/Ticks#18 )
main::i#7 = phi( main::@1/main::i#3 )
print_line_cursor#30 = phi( main::@1/print_line_cursor#27 )
print_char_cursor#60 = phi( main::@1/print_char_cursor#61 )
call sum
sum::return#2 = sum::return#1
to:main::@5
main::@5: scope:[main] from main::@2
Ticks#23 = phi( main::@2/Ticks#24 )
main::i#6 = phi( main::@2/main::i#7 )
print_line_cursor#26 = phi( main::@2/print_line_cursor#30 )
print_char_cursor#54 = phi( main::@2/print_char_cursor#60 )
sum::return#4 = phi( main::@2/sum::return#2 )
main::$3 = sum::return#4
print_uint_decimal::w#0 = main::$3
call print_uint_decimal
to:main::@6
main::@6: scope:[main] from main::@5
Ticks#22 = phi( main::@5/Ticks#23 )
main::i#5 = phi( main::@5/main::i#6 )
print_line_cursor#22 = phi( main::@5/print_line_cursor#26 )
print_char_cursor#41 = phi( main::@5/print_char_cursor#8 )
print_char_cursor#17 = print_char_cursor#41
call print_ln
to:main::@7
main::@7: scope:[main] from main::@6
Ticks#20 = phi( main::@6/Ticks#22 )
main::i#4 = phi( main::@6/main::i#5 )
print_char_cursor#42 = phi( main::@6/print_char_cursor#3 )
print_line_cursor#15 = phi( main::@6/print_line_cursor#1 )
print_line_cursor#4 = print_line_cursor#15
print_char_cursor#18 = print_char_cursor#42
main::i#2 = ++ main::i#4
to:main::@1
main::@3: scope:[main] from main::@1
print_line_cursor#23 = phi( main::@1/print_line_cursor#27 )
print_char_cursor#55 = phi( main::@1/print_char_cursor#61 )
Ticks#15 = phi( main::@1/Ticks#18 )
call end
to:main::@8
main::@8: scope:[main] from main::@3
print_line_cursor#16 = phi( main::@3/print_line_cursor#3 )
print_char_cursor#43 = phi( main::@3/print_char_cursor#16 )
Ticks#10 = phi( main::@3/Ticks#2 )
Ticks#3 = Ticks#10
print_char_cursor#19 = print_char_cursor#43
print_line_cursor#5 = print_line_cursor#16
main::return#0 = 0
to:main::@return
main::@return: scope:[main] from main::@8
Ticks#11 = phi( main::@8/Ticks#3 )
print_line_cursor#17 = phi( main::@8/print_line_cursor#5 )
print_char_cursor#44 = phi( main::@8/print_char_cursor#19 )
main::return#3 = phi( main::@8/main::return#0 )
main::return#1 = main::return#3
print_char_cursor#20 = print_char_cursor#44
print_line_cursor#6 = print_line_cursor#17
Ticks#4 = Ticks#11
return
to:@return
void __start()
__start: scope:[__start] from
to:__start::__init1
__start::__init1: scope:[__start] from __start
print_screen#0 = (char *)$400
print_line_cursor#7 = print_screen#0
print_char_cursor#21 = print_line_cursor#7
last_time = 0
Ticks#5 = 0
to:__start::@1
__start::@1: scope:[__start] from __start::__init1
print_screen#4 = phi( __start::__init1/print_screen#0 )
Ticks#16 = phi( __start::__init1/Ticks#5 )
print_line_cursor#24 = phi( __start::__init1/print_line_cursor#7 )
print_char_cursor#56 = phi( __start::__init1/print_char_cursor#21 )
call main
main::return#2 = main::return#1
to:__start::@2
__start::@2: scope:[__start] from __start::@1
print_screen#3 = phi( __start::@1/print_screen#4 )
Ticks#12 = phi( __start::@1/Ticks#4 )
print_line_cursor#18 = phi( __start::@1/print_line_cursor#6 )
print_char_cursor#45 = phi( __start::@1/print_char_cursor#20 )
print_char_cursor#22 = print_char_cursor#45
print_line_cursor#8 = print_line_cursor#18
Ticks#6 = Ticks#12
to:__start::@return
__start::@return: scope:[__start] from __start::@2
Ticks#13 = phi( __start::@2/Ticks#6 )
print_char_cursor#46 = phi( __start::@2/print_char_cursor#22 )
print_line_cursor#19 = phi( __start::@2/print_line_cursor#8 )
print_screen#2 = phi( __start::@2/print_screen#3 )
print_screen#1 = print_screen#2
print_line_cursor#9 = print_line_cursor#19
print_char_cursor#23 = print_char_cursor#46
Ticks#7 = Ticks#13
return
to:@return
SYMBOL TABLE SSA
__constant char BINARY = 2
__constant char DECIMAL = $a
__constant char DIGITS[] = "0123456789abcdef"z
__constant char HEXADECIMAL = $10
__constant char OCTAL = 8
__constant char RADIX::BINARY = 2
__constant char RADIX::DECIMAL = $a
__constant char RADIX::HEXADECIMAL = $10
__constant char RADIX::OCTAL = 8
__constant unsigned int RADIX_BINARY_VALUES[] = { $8000, $4000, $2000, $1000, $800, $400, $200, $100, $80, $40, $20, $10, 8, 4, 2 }
__constant unsigned int RADIX_DECIMAL_VALUES[] = { $2710, $3e8, $64, $a }
__constant unsigned int RADIX_HEXADECIMAL_VALUES[] = { $1000, $100, $10 }
__constant unsigned int RADIX_OCTAL_VALUES[] = { $8000, $1000, $200, $40, 8 }
__constant char SIZEOF_UNSIGNED_INT = 2
unsigned int Ticks
unsigned int Ticks#0
unsigned int Ticks#1
unsigned int Ticks#10
unsigned int Ticks#11
unsigned int Ticks#12
unsigned int Ticks#13
unsigned int Ticks#14
unsigned int Ticks#15
unsigned int Ticks#16
unsigned int Ticks#17
unsigned int Ticks#18
unsigned int Ticks#19
unsigned int Ticks#2
unsigned int Ticks#20
unsigned int Ticks#21
unsigned int Ticks#22
unsigned int Ticks#23
unsigned int Ticks#24
unsigned int Ticks#3
unsigned int Ticks#4
unsigned int Ticks#5
unsigned int Ticks#6
unsigned int Ticks#7
unsigned int Ticks#8
unsigned int Ticks#9
void __start()
__constant char decimal_digits[6] = { fill( 6, 0) }
void end()
__loadstore volatile unsigned int last_time
int main()
bool main::$2
unsigned int main::$3
unsigned int main::i
unsigned int main::i#0
unsigned int main::i#1
unsigned int main::i#2
unsigned int main::i#3
unsigned int main::i#4
unsigned int main::i#5
unsigned int main::i#6
unsigned int main::i#7
int main::return
int main::return#0
int main::return#1
int main::return#2
int main::return#3
void print_char(char ch)
char print_char::ch
char print_char::ch#0
char print_char::ch#1
char print_char::ch#2
char print_char::ch#3
char *print_char_cursor
char *print_char_cursor#0
char *print_char_cursor#1
char *print_char_cursor#10
char *print_char_cursor#11
char *print_char_cursor#12
char *print_char_cursor#13
char *print_char_cursor#14
char *print_char_cursor#15
char *print_char_cursor#16
char *print_char_cursor#17
char *print_char_cursor#18
char *print_char_cursor#19
char *print_char_cursor#2
char *print_char_cursor#20
char *print_char_cursor#21
char *print_char_cursor#22
char *print_char_cursor#23
char *print_char_cursor#24
char *print_char_cursor#25
char *print_char_cursor#26
char *print_char_cursor#27
char *print_char_cursor#28
char *print_char_cursor#29
char *print_char_cursor#3
char *print_char_cursor#30
char *print_char_cursor#31
char *print_char_cursor#32
char *print_char_cursor#33
char *print_char_cursor#34
char *print_char_cursor#35
char *print_char_cursor#36
char *print_char_cursor#37
char *print_char_cursor#38
char *print_char_cursor#39
char *print_char_cursor#4
char *print_char_cursor#40
char *print_char_cursor#41
char *print_char_cursor#42
char *print_char_cursor#43
char *print_char_cursor#44
char *print_char_cursor#45
char *print_char_cursor#46
char *print_char_cursor#47
char *print_char_cursor#48
char *print_char_cursor#49
char *print_char_cursor#5
char *print_char_cursor#50
char *print_char_cursor#51
char *print_char_cursor#52
char *print_char_cursor#53
char *print_char_cursor#54
char *print_char_cursor#55
char *print_char_cursor#56
char *print_char_cursor#57
char *print_char_cursor#58
char *print_char_cursor#59
char *print_char_cursor#6
char *print_char_cursor#60
char *print_char_cursor#61
char *print_char_cursor#62
char *print_char_cursor#63
char *print_char_cursor#7
char *print_char_cursor#8
char *print_char_cursor#9
__constant const char print_hextab[] = "0123456789abcdef"z
char *print_line_cursor
char *print_line_cursor#0
char *print_line_cursor#1
char *print_line_cursor#10
char *print_line_cursor#11
char *print_line_cursor#12
char *print_line_cursor#13
char *print_line_cursor#14
char *print_line_cursor#15
char *print_line_cursor#16
char *print_line_cursor#17
char *print_line_cursor#18
char *print_line_cursor#19
char *print_line_cursor#2
char *print_line_cursor#20
char *print_line_cursor#21
char *print_line_cursor#22
char *print_line_cursor#23
char *print_line_cursor#24
char *print_line_cursor#25
char *print_line_cursor#26
char *print_line_cursor#27
char *print_line_cursor#28
char *print_line_cursor#29
char *print_line_cursor#3
char *print_line_cursor#30
char *print_line_cursor#31
char *print_line_cursor#4
char *print_line_cursor#5
char *print_line_cursor#6
char *print_line_cursor#7
char *print_line_cursor#8
char *print_line_cursor#9
void print_ln()
char *print_ln::$0
bool print_ln::$1
char *print_screen
char *print_screen#0
char *print_screen#1
char *print_screen#2
char *print_screen#3
char *print_screen#4
void print_str(char *str)
bool print_str::$1
char *print_str::str
char *print_str::str#0
char *print_str::str#1
char *print_str::str#2
char *print_str::str#3
char *print_str::str#4
char *print_str::str#5
void print_uchar(char b)
char print_uchar::$0
number print_uchar::$2
char print_uchar::b
char print_uchar::b#0
char print_uchar::b#1
char print_uchar::b#2
char print_uchar::b#3
void print_uint(unsigned int w)
char print_uint::$0
char print_uint::$2
unsigned int print_uint::w
unsigned int print_uint::w#0
unsigned int print_uint::w#1
unsigned int print_uint::w#2
void print_uint_decimal(unsigned int w)
unsigned int print_uint_decimal::w
unsigned int print_uint_decimal::w#0
unsigned int print_uint_decimal::w#1
__constant char * const rom = (char *)$e000
void start()
__constant unsigned int * const start::LAST_TIME = &last_time
unsigned int sum()
bool sum::$0
bool sum::$1
char sum::i
char sum::i#0
char sum::i#1
char sum::i#2
char sum::i#3
char *sum::p
char *sum::p#0
char *sum::p#1
char *sum::p#2
char *sum::p#3
char *sum::p#4
char *sum::p#5
char *sum::p#6
char sum::page
char sum::page#0
char sum::page#1
char sum::page#2
char sum::page#3
char sum::page#4
char sum::page#5
char sum::page#6
unsigned int sum::return
unsigned int sum::return#0
unsigned int sum::return#1
unsigned int sum::return#2
unsigned int sum::return#3
unsigned int sum::return#4
unsigned int sum::s
unsigned int sum::s#0
unsigned int sum::s#1
unsigned int sum::s#2
unsigned int sum::s#3
unsigned int sum::s#4
unsigned int sum::s#5
unsigned int sum::s#6
unsigned int sum::s#7
char sum::tmp
char sum::tmp#0
char sum::tmp#1
void utoa(unsigned int value , char *buffer , char radix)
bool utoa::$0
bool utoa::$1
char utoa::$10
char utoa::$11
bool utoa::$2
bool utoa::$3
number utoa::$4
bool utoa::$5
bool utoa::$6
bool utoa::$7
bool utoa::$8
unsigned int utoa::$9
char *utoa::buffer
char *utoa::buffer#0
char *utoa::buffer#1
char *utoa::buffer#10
char *utoa::buffer#11
char *utoa::buffer#12
char *utoa::buffer#13
char *utoa::buffer#14
char *utoa::buffer#15
char *utoa::buffer#16
char *utoa::buffer#17
char *utoa::buffer#18
char *utoa::buffer#19
char *utoa::buffer#2
char *utoa::buffer#20
char *utoa::buffer#21
char *utoa::buffer#3
char *utoa::buffer#4
char *utoa::buffer#5
char *utoa::buffer#6
char *utoa::buffer#7
char *utoa::buffer#8
char *utoa::buffer#9
char utoa::digit
char utoa::digit#0
char utoa::digit#1
char utoa::digit#2
char utoa::digit#3
char utoa::digit#4
char utoa::digit#5
char utoa::digit#6
unsigned int utoa::digit_value
unsigned int utoa::digit_value#0
unsigned int utoa::digit_value#1
unsigned int *utoa::digit_values
unsigned int *utoa::digit_values#0
unsigned int *utoa::digit_values#1
unsigned int *utoa::digit_values#10
unsigned int *utoa::digit_values#2
unsigned int *utoa::digit_values#3
unsigned int *utoa::digit_values#4
unsigned int *utoa::digit_values#5
unsigned int *utoa::digit_values#6
unsigned int *utoa::digit_values#7
unsigned int *utoa::digit_values#8
unsigned int *utoa::digit_values#9
char utoa::max_digits
char utoa::max_digits#0
char utoa::max_digits#1
char utoa::max_digits#10
char utoa::max_digits#2
char utoa::max_digits#3
char utoa::max_digits#4
char utoa::max_digits#5
char utoa::max_digits#6
char utoa::max_digits#7
char utoa::max_digits#8
char utoa::max_digits#9
char utoa::radix
char utoa::radix#0
char utoa::radix#1
char utoa::radix#2
char utoa::radix#3
char utoa::radix#4
char utoa::started
char utoa::started#0
char utoa::started#1
char utoa::started#2
char utoa::started#3
char utoa::started#4
unsigned int utoa::value
unsigned int utoa::value#0
unsigned int utoa::value#1
unsigned int utoa::value#10
unsigned int utoa::value#11
unsigned int utoa::value#12
unsigned int utoa::value#13
unsigned int utoa::value#14
unsigned int utoa::value#15
unsigned int utoa::value#2
unsigned int utoa::value#3
unsigned int utoa::value#4
unsigned int utoa::value#5
unsigned int utoa::value#6
unsigned int utoa::value#7
unsigned int utoa::value#8
unsigned int utoa::value#9
unsigned int utoa_append(char *buffer , unsigned int value , unsigned int sub)
bool utoa_append::$0
char *utoa_append::buffer
char *utoa_append::buffer#0
char *utoa_append::buffer#1
char *utoa_append::buffer#2
char *utoa_append::buffer#3
char *utoa_append::buffer#4
char utoa_append::digit
char utoa_append::digit#0
char utoa_append::digit#1
char utoa_append::digit#2
char utoa_append::digit#3
char utoa_append::digit#4
unsigned int utoa_append::return
unsigned int utoa_append::return#0
unsigned int utoa_append::return#1
unsigned int utoa_append::return#2
unsigned int utoa_append::return#3
unsigned int utoa_append::return#4
unsigned int utoa_append::sub
unsigned int utoa_append::sub#0
unsigned int utoa_append::sub#1
unsigned int utoa_append::sub#2
unsigned int utoa_append::sub#3
unsigned int utoa_append::value
unsigned int utoa_append::value#0
unsigned int utoa_append::value#1
unsigned int utoa_append::value#2
unsigned int utoa_append::value#3
unsigned int utoa_append::value#4
unsigned int utoa_append::value#5
Adding number conversion cast (unumber) 0 in print_str::$1 = 0 != *print_str::str#2
Adding number conversion cast (unumber) $28 in print_ln::$0 = print_line_cursor#10 + $28
Adding number conversion cast (unumber) 4 in print_uchar::$0 = print_uchar::b#2 >> 4
Adding number conversion cast (unumber) $f in print_uchar::$2 = print_uchar::b#3 & $f
Adding number conversion cast (unumber) print_uchar::$2 in print_uchar::$2 = print_uchar::b#3 & (unumber)$f
Adding number conversion cast (unumber) 5 in utoa::max_digits#1 = 5
Adding number conversion cast (unumber) 4 in utoa::max_digits#2 = 4
Adding number conversion cast (unumber) 6 in utoa::max_digits#3 = 6
Adding number conversion cast (unumber) $10 in utoa::max_digits#4 = $10
Adding number conversion cast (unumber) 0 in *utoa::buffer#3 = 0
Adding number conversion cast (unumber) 1 in utoa::$4 = utoa::max_digits#5 - 1
Adding number conversion cast (unumber) utoa::$4 in utoa::$4 = utoa::max_digits#5 - (unumber)1
Adding number conversion cast (unumber) 0 in *utoa::buffer#4 = 0
Adding number conversion cast (unumber) 1 in utoa::started#1 = 1
Adding number conversion cast (unumber) 0 in sum::s#1 = 0
Adding number conversion cast (unumber) 0 in sum::page#1 = 0
Adding number conversion cast (unumber) $20 in sum::$0 = sum::page#3 < $20
Adding number conversion cast (unumber) 0 in sum::i#1 = 0
Adding number conversion cast (unumber) 0 in sum::$1 = 0 != sum::i#2
Adding number conversion cast (unumber) $100 in sum::p#2 = sum::p#4 + $100
Adding number conversion cast (unumber) 0 in main::i#1 = 0
Adding number conversion cast (unumber) 6 in main::$2 = main::i#3 < 6
Adding number conversion cast (snumber) 0 in main::return#0 = 0
Successful SSA optimization PassNAddNumberTypeConversions
Inlining cast utoa::max_digits#1 = (unumber)5
Inlining cast utoa::max_digits#2 = (unumber)4
Inlining cast utoa::max_digits#3 = (unumber)6
Inlining cast utoa::max_digits#4 = (unumber)$10
Inlining cast *utoa::buffer#3 = (unumber)0
Inlining cast *utoa::buffer#4 = (unumber)0
Inlining cast utoa::started#1 = (unumber)1
Inlining cast sum::s#1 = (unumber)0
Inlining cast sum::page#1 = (unumber)0
Inlining cast sum::i#1 = (unumber)0
Inlining cast main::i#1 = (unumber)0
Inlining cast main::return#0 = (snumber)0
Successful SSA optimization Pass2InlineCast
Simplifying constant pointer cast (char *) 57344
Simplifying constant integer cast 0
Simplifying constant integer cast $28
Simplifying constant integer cast 4
Simplifying constant integer cast $f
Simplifying constant integer cast 5
Simplifying constant integer cast 4
Simplifying constant integer cast 6
Simplifying constant integer cast $10
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast $20
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast $100
Simplifying constant integer cast 0
Simplifying constant integer cast 6
Simplifying constant integer cast 0
Simplifying constant pointer cast (char *) 1024
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) $28
Finalized unsigned number type (char) 4
Finalized unsigned number type (char) $f
Finalized unsigned number type (char) 5
Finalized unsigned number type (char) 4
Finalized unsigned number type (char) 6
Finalized unsigned number type (char) $10
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (unsigned int) $100
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 6
Finalized signed number type (signed char) 0
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inferred type updated to char in print_uchar::$2 = print_uchar::b#3 & $f
Inferred type updated to char in utoa::$4 = utoa::max_digits#5 - 1
Alias print_str::str#2 = print_str::str#3 print_str::str#4
Alias print_char_cursor#1 = print_char_cursor#47 print_char_cursor#48 print_char_cursor#25
Alias print_char_cursor#0 = print_char_cursor#24
Alias print_line_cursor#0 = print_ln::$0 print_line_cursor#11 print_char_cursor#2 print_line_cursor#12 print_char_cursor#27 print_line_cursor#1 print_char_cursor#3
Alias print_uchar::b#0 = print_uint::$0
Alias print_uint::w#1 = print_uint::w#2
Alias print_char_cursor#28 = print_char_cursor#4
Alias print_uchar::b#1 = print_uint::$2
Alias print_char_cursor#29 = print_char_cursor#5 print_char_cursor#30 print_char_cursor#6
Alias print_char_cursor#51 = print_char_cursor#58
Alias print_char_cursor#31 = print_char_cursor#7 print_char_cursor#32 print_char_cursor#8
Alias print_uchar::b#2 = print_uchar::b#3
Alias print_char_cursor#33 = print_char_cursor#9
Alias print_char_cursor#10 = print_char_cursor#34 print_char_cursor#35 print_char_cursor#11
Alias print_char_cursor#12 = print_char_cursor#37 print_char_cursor#13
Alias utoa::value#10 = utoa::value#8 utoa::value#12 utoa::value#13 utoa::value#9 utoa::value#14 utoa::value#15 utoa::value#11
Alias utoa::buffer#10 = utoa::buffer#17 utoa::buffer#21 utoa::buffer#16 utoa::buffer#18 utoa::buffer#13 utoa::buffer#19 utoa::buffer#20 utoa::buffer#6
Alias utoa::radix#1 = utoa::radix#2 utoa::radix#3 utoa::radix#4
Alias utoa::digit#2 = utoa::digit#3 utoa::digit#6 utoa::digit#5
Alias utoa::digit_values#10 = utoa::digit_values#5 utoa::digit_values#6 utoa::digit_values#9
Alias utoa::value#2 = utoa::value#5 utoa::value#3 utoa::value#4
Alias utoa::started#2 = utoa::started#3
Alias utoa::buffer#11 = utoa::buffer#12 utoa::buffer#7 utoa::buffer#8 utoa::buffer#9
Alias utoa::max_digits#10 = utoa::max_digits#8 utoa::max_digits#5 utoa::max_digits#9
Alias utoa::digit_value#0 = utoa::digit_value#1
Alias utoa_append::return#0 = utoa_append::return#3
Alias utoa::value#1 = utoa::$9
Alias utoa_append::digit#2 = utoa_append::digit#4 utoa_append::digit#3
Alias utoa_append::value#2 = utoa_append::value#3 utoa_append::value#4 utoa_append::return#1 utoa_append::return#4 utoa_append::return#2
Alias utoa_append::sub#1 = utoa_append::sub#2
Alias utoa_append::buffer#1 = utoa_append::buffer#4 utoa_append::buffer#2
Alias Ticks#0 = Ticks#8
Alias print_char_cursor#53 = print_char_cursor#59
Alias print_line_cursor#21 = print_line_cursor#25 print_line_cursor#28
Alias Ticks#1 = Ticks#17 Ticks#14 Ticks#9 Ticks#2
Alias print_char_cursor#14 = print_char_cursor#38
Alias print_line_cursor#13 = print_line_cursor#2 print_line_cursor#14 print_line_cursor#3
Alias print_char_cursor#15 = print_char_cursor#39 print_char_cursor#40 print_char_cursor#16
Alias sum::p#5 = sum::p#6
Alias sum::s#3 = sum::s#6 sum::s#5 sum::return#0 sum::return#3 sum::return#1
Alias sum::page#3 = sum::page#6
Alias sum::p#3 = sum::p#4
Alias sum::page#4 = sum::page#5
Alias sum::s#2 = sum::s#7
Alias Ticks#19 = Ticks#21
Alias print_char_cursor#62 = print_char_cursor#63
Alias print_line_cursor#29 = print_line_cursor#31
Alias print_char_cursor#54 = print_char_cursor#60 print_char_cursor#61 print_char_cursor#55
Alias print_line_cursor#22 = print_line_cursor#30 print_line_cursor#27 print_line_cursor#26 print_line_cursor#23
Alias main::i#3 = main::i#7 main::i#6 main::i#5 main::i#4
Alias Ticks#15 = Ticks#24 Ticks#18 Ticks#23 Ticks#22 Ticks#20
Alias sum::return#2 = sum::return#4
Alias print_uint_decimal::w#0 = main::$3
Alias print_char_cursor#17 = print_char_cursor#41
Alias print_line_cursor#15 = print_line_cursor#4
Alias print_char_cursor#18 = print_char_cursor#42
Alias Ticks#10 = Ticks#3 Ticks#11 Ticks#4
Alias print_char_cursor#19 = print_char_cursor#43 print_char_cursor#44 print_char_cursor#20
Alias print_line_cursor#16 = print_line_cursor#5 print_line_cursor#17 print_line_cursor#6
Alias main::return#0 = main::return#3 main::return#1
Alias print_screen#0 = print_line_cursor#7 print_char_cursor#21 print_char_cursor#56 print_line_cursor#24 print_screen#4 print_screen#3 print_screen#2 print_screen#1
Alias Ticks#16 = Ticks#5
Alias print_char_cursor#22 = print_char_cursor#45 print_char_cursor#46 print_char_cursor#23
Alias print_line_cursor#18 = print_line_cursor#8 print_line_cursor#19 print_line_cursor#9
Alias Ticks#12 = Ticks#6 Ticks#13 Ticks#7
Successful SSA optimization Pass2AliasElimination
Alias utoa::value#10 = utoa::value#7
Alias utoa::buffer#10 = utoa::buffer#15
Alias utoa::digit#2 = utoa::digit#4
Alias utoa::max_digits#10 = utoa::max_digits#6
Alias utoa::digit_values#10 = utoa::digit_values#7
Successful SSA optimization Pass2AliasElimination
Identical Phi Values print_str::str#5 print_str::str#1
Identical Phi Values print_char_cursor#57 print_char_cursor#51
Identical Phi Values print_char_cursor#0 print_char_cursor#12
Identical Phi Values print_char_cursor#26 print_char_cursor#49
Identical Phi Values print_uint::w#1 print_uint::w#0
Identical Phi Values print_char_cursor#50 print_char_cursor#53
Identical Phi Values print_char_cursor#28 print_char_cursor#10
Identical Phi Values print_char_cursor#29 print_char_cursor#10
Identical Phi Values print_uint_decimal::w#1 print_uint_decimal::w#0
Identical Phi Values print_char_cursor#51 print_char_cursor#54
Identical Phi Values print_char_cursor#31 print_char_cursor#1
Identical Phi Values print_char_cursor#33 print_char_cursor#12
Identical Phi Values print_char_cursor#10 print_char_cursor#12
Identical Phi Values utoa::radix#1 utoa::radix#0
Identical Phi Values utoa::value#10 utoa::value#0
Identical Phi Values utoa::buffer#10 utoa::buffer#0
Identical Phi Values utoa::max_digits#10 utoa::max_digits#7
Identical Phi Values utoa::digit_values#10 utoa::digit_values#8
Identical Phi Values utoa_append::value#5 utoa_append::value#0
Identical Phi Values utoa_append::sub#3 utoa_append::sub#0
Identical Phi Values utoa_append::buffer#3 utoa_append::buffer#0
Identical Phi Values utoa_append::sub#1 utoa_append::sub#3
Identical Phi Values utoa_append::buffer#1 utoa_append::buffer#3
Identical Phi Values print_char_cursor#53 print_char_cursor#54
Identical Phi Values print_line_cursor#21 print_line_cursor#22
Identical Phi Values print_char_cursor#14 print_char_cursor#29
Identical Phi Values print_line_cursor#13 print_line_cursor#0
Identical Phi Values print_char_cursor#15 print_line_cursor#0
Identical Phi Values sum::p#3 sum::p#5
Identical Phi Values sum::page#4 sum::page#3
Identical Phi Values Ticks#19 Ticks#16
Identical Phi Values print_char_cursor#62 print_screen#0
Identical Phi Values print_line_cursor#29 print_screen#0
Identical Phi Values Ticks#15 Ticks#19
Identical Phi Values print_char_cursor#17 print_char_cursor#31
Identical Phi Values print_line_cursor#15 print_line_cursor#0
Identical Phi Values print_char_cursor#18 print_line_cursor#0
Identical Phi Values Ticks#10 Ticks#1
Identical Phi Values print_char_cursor#19 print_char_cursor#15
Identical Phi Values print_line_cursor#16 print_line_cursor#13
Identical Phi Values print_char_cursor#22 print_char_cursor#19
Identical Phi Values print_line_cursor#18 print_line_cursor#16
Identical Phi Values Ticks#12 Ticks#10
Successful SSA optimization Pass2IdenticalPhiElimination
Identical Phi Values print_line_cursor#20 print_line_cursor#22
Successful SSA optimization Pass2IdenticalPhiElimination
Simple Condition print_str::$1 [3] if(0!=*print_str::str#2) goto print_str::@2
Simple Condition print_ln::$1 [13] if(print_line_cursor#0<print_char_cursor#49) goto print_ln::@1
Simple Condition utoa::$0 [50] if(utoa::radix#0==DECIMAL) goto utoa::@1
Simple Condition utoa::$1 [54] if(utoa::radix#0==HEXADECIMAL) goto utoa::@2
Simple Condition utoa::$2 [58] if(utoa::radix#0==OCTAL) goto utoa::@3
Simple Condition utoa::$3 [62] if(utoa::radix#0==BINARY) goto utoa::@4
Simple Condition utoa::$5 [79] if(utoa::digit#2<utoa::$4) goto utoa::@11
Simple Condition utoa_append::$0 [104] if(utoa_append::value#2>=utoa_append::sub#0) goto utoa_append::@2
Simple Condition sum::$0 [132] if(sum::page#3<$20) goto sum::@2
Simple Condition sum::$1 [139] if(0!=sum::i#2) goto sum::@4
Simple Condition main::$2 [149] if(main::i#3<6) goto main::@2
Successful SSA optimization Pass2ConditionalJumpSimplification
Rewriting ! if()-condition to reversed if() [84] utoa::$8 = ! utoa::$7
Rewriting || if()-condition to two if()s [83] utoa::$7 = utoa::started#2 || utoa::$6
Successful SSA optimization Pass2ConditionalAndOrRewriting
Warning! Adding boolean cast to non-boolean condition utoa::started#2
Constant utoa::buffer#0 = decimal_digits
Constant utoa::radix#0 = DECIMAL
Constant print_str::str#1 = decimal_digits
Constant utoa::max_digits#0 = 0
Constant utoa::digit_values#0 = (unsigned int *) 0
Constant utoa::max_digits#1 = 5
Constant utoa::digit_values#1 = RADIX_DECIMAL_VALUES
Constant utoa::max_digits#2 = 4
Constant utoa::digit_values#2 = RADIX_HEXADECIMAL_VALUES
Constant utoa::max_digits#3 = 6
Constant utoa::digit_values#3 = RADIX_OCTAL_VALUES
Constant utoa::max_digits#4 = $10
Constant utoa::digit_values#4 = RADIX_BINARY_VALUES
Constant utoa::started#0 = 0
Constant utoa::digit#0 = 0
Constant utoa::started#1 = 1
Constant utoa_append::digit#0 = 0
Constant sum::s#0 = 0
Constant sum::p#0 = (char *) 0
Constant sum::page#0 = 0
Constant sum::i#0 = 0
Constant sum::tmp#0 = 0
Constant sum::p#1 = rom
Constant sum::s#1 = 0
Constant sum::page#1 = 0
Constant sum::i#1 = 0
Constant main::i#0 = 0
Constant main::i#1 = 0
Constant main::return#0 = 0
Constant print_screen#0 = (char *) 1024
Constant Ticks#16 = 0
Successful SSA optimization Pass2ConstantIdentification
Constant main::return#2 = main::return#0
Successful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination [50] if(utoa::radix#0==DECIMAL) goto utoa::@1
if() condition always false - eliminating [54] if(utoa::radix#0==HEXADECIMAL) goto utoa::@2
if() condition always false - eliminating [58] if(utoa::radix#0==OCTAL) goto utoa::@3
if() condition always false - eliminating [62] if(utoa::radix#0==BINARY) goto utoa::@4
Successful SSA optimization Pass2ConstantIfs
Consolidated constant strings into DIGITS
Successful SSA optimization Pass2ConstantStringConsolidation
Eliminating variable utoa::buffer#1 from unused block utoa::@9
Eliminating variable utoa::buffer#2 from unused block utoa::@9
Eliminating variable utoa::buffer#3 from unused block utoa::@9
Removing unused block utoa::@6
Removing PHI-reference to removed block (utoa::@2) in block utoa::@5
Removing PHI-reference to removed block (utoa::@2) in block utoa::@5
Removing unused block utoa::@2
Removing unused block utoa::@7
Removing PHI-reference to removed block (utoa::@3) in block utoa::@5
Removing PHI-reference to removed block (utoa::@3) in block utoa::@5
Removing unused block utoa::@3
Removing unused block utoa::@8
Removing PHI-reference to removed block (utoa::@4) in block utoa::@5
Removing PHI-reference to removed block (utoa::@4) in block utoa::@5
Removing unused block utoa::@4
Removing unused block utoa::@9
Successful SSA optimization Pass2EliminateUnusedBlocks
Eliminating unused constant BINARY
Eliminating unused constant OCTAL
Eliminating unused constant HEXADECIMAL
Eliminating unused constant utoa::radix#0
Eliminating unused constant utoa::max_digits#0
Eliminating unused constant utoa::digit_values#0
Eliminating unused constant utoa::max_digits#2
Eliminating unused constant utoa::digit_values#2
Eliminating unused constant utoa::max_digits#3
Eliminating unused constant utoa::digit_values#3
Eliminating unused constant utoa::max_digits#4
Eliminating unused constant utoa::digit_values#4
Eliminating unused constant sum::s#0
Eliminating unused constant sum::p#0
Eliminating unused constant sum::page#0
Eliminating unused constant sum::i#0
Eliminating unused constant sum::tmp#0
Eliminating unused constant main::i#0
Eliminating unused constant main::return#2
Eliminating unused constant Ticks#16
Successful SSA optimization PassNEliminateUnusedVars
Eliminating unused constant DECIMAL
Eliminating unused constant RADIX_BINARY_VALUES
Eliminating unused constant RADIX_OCTAL_VALUES
Eliminating unused constant RADIX_HEXADECIMAL_VALUES
Eliminating unused constant main::return#0
Successful SSA optimization PassNEliminateUnusedVars
Adding number conversion cast (unumber) 0 in utoa::$12 = 0 != utoa::started#2
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant integer cast 0
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (char) 0
Successful SSA optimization PassNFinalizeNumberTypeConversions
Identical Phi Values utoa::max_digits#7 utoa::max_digits#1
Identical Phi Values utoa::digit_values#8 utoa::digit_values#1
Successful SSA optimization Pass2IdenticalPhiElimination
Simple Condition utoa::$12 [41] if(0!=utoa::started#2) goto utoa::@14
Simple Condition utoa::$6 [55] if(utoa::value#2>=utoa::digit_value#0) goto utoa::@14
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant right-side identified [35] utoa::$4 = utoa::max_digits#1 - 1
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant utoa::$4 = utoa::max_digits#1-1
Successful SSA optimization Pass2ConstantIdentification
Rewriting multiplication to use shift [35] utoa::$10 = utoa::digit#2 * SIZEOF_UNSIGNED_INT
Successful SSA optimization Pass2MultiplyToShiftRewriting
Inlining constant with var siblings print_str::str#1
Inlining constant with var siblings utoa::buffer#0
Inlining constant with var siblings utoa::started#0
Inlining constant with var siblings utoa::digit#0
Inlining constant with var siblings utoa::started#1
Inlining constant with var siblings utoa_append::digit#0
Inlining constant with var siblings sum::p#1
Inlining constant with var siblings sum::s#1
Inlining constant with var siblings sum::page#1
Inlining constant with var siblings sum::i#1
Inlining constant with var siblings main::i#1
Constant inlined utoa_append::digit#0 = 0
Constant inlined utoa::digit_values#1 = RADIX_DECIMAL_VALUES
Constant inlined sum::i#1 = 0
Constant inlined print_hextab = DIGITS
Constant inlined utoa::buffer#0 = decimal_digits
Constant inlined utoa::started#1 = 1
Constant inlined utoa::started#0 = 0
Constant inlined sum::page#1 = 0
Constant inlined utoa::digit#0 = 0
Constant inlined utoa::$4 = utoa::max_digits#1-1
Constant inlined print_str::str#1 = decimal_digits
Constant inlined sum::s#1 = 0
Constant inlined main::i#1 = 0
Constant inlined sum::p#1 = rom
Successful SSA optimization Pass2ConstantInlining
Eliminating unused constant SIZEOF_UNSIGNED_INT
Successful SSA optimization PassNEliminateUnusedVars
Finalized unsigned number type (char) 2
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) $a
Finalized unsigned number type (char) $10
Finalized unsigned number type (char) 6
Finalized unsigned number type (char) 6
Successful SSA optimization PassNFinalizeNumberTypeConversions
Added new block during phi lifting print_ln::@3(between print_ln::@1 and print_ln::@1)
Added new block during phi lifting utoa::@17(between utoa::@16 and utoa::@13)
Added new block during phi lifting sum::@6(between sum::@4 and sum::@4)
Adding NOP phi() at start of __start
Adding NOP phi() at start of __start::@1
Adding NOP phi() at start of __start::@2
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@4
Adding NOP phi() at start of main::@3
Adding NOP phi() at start of main::@8
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of end::@3
Adding NOP phi() at start of sum
Adding NOP phi() at start of sum::@3
Adding NOP phi() at start of print_uint_decimal::@1
Adding NOP phi() at start of print_uint_decimal::@2
Adding NOP phi() at start of print_ln::@2
Adding NOP phi() at start of print_uint::@2
Adding NOP phi() at start of utoa
Adding NOP phi() at start of utoa::@1
Adding NOP phi() at start of print_uchar::@2
CALL GRAPH
Calls in [__start] to main:3
Calls in [main] to start:7 end:12 sum:16 print_uint_decimal:19 print_ln:21
Calls in [end] to start:29 print_uint:33 print_ln:35
Calls in [print_uint_decimal] to utoa:57 print_str:59
Calls in [print_uint] to print_uchar:73 print_uchar:77
Calls in [utoa] to utoa_append:106
Calls in [print_str] to print_char:119
Calls in [print_uchar] to print_char:128 print_char:133
Created 25 initial phi equivalence classes
Coalesced [20] print_char_cursor#67 = print_char_cursor#1
Coalesced [23] main::i#8 = main::i#2
Not coalescing [24] print_char_cursor#73 = print_line_cursor#0
Coalesced [25] print_line_cursor#34 = print_line_cursor#0
Coalesced [34] print_char_cursor#66 = print_char_cursor#12
Coalesced [43] sum::s#9 = sum::s#3
Coalesced [51] sum::page#7 = sum::page#2
Coalesced [52] sum::s#8 = sum::s#2
Coalesced [53] sum::p#7 = sum::p#2
Coalesced [54] sum::i#4 = sum::i#2
Coalesced (already) [55] sum::s#10 = sum::s#2
Coalesced [63] print_line_cursor#32 = print_line_cursor#22
Coalesced (already) [69] print_line_cursor#33 = print_line_cursor#0
Coalesced [71] print_uchar::b#4 = print_uchar::b#0
Coalesced [72] print_char_cursor#68 = print_char_cursor#54
Coalesced [75] print_uchar::b#5 = print_uchar::b#1
Coalesced [76] print_char_cursor#69 = print_char_cursor#12
Coalesced [82] utoa::value#17 = utoa::value#0
Coalesced [94] utoa::value#18 = utoa::value#2
Coalesced [95] utoa::started#6 = utoa::started#2
Coalesced [96] utoa::buffer#23 = utoa::buffer#11
Coalesced [99] utoa::digit#7 = utoa::digit#1
Coalesced (already) [100] utoa::value#16 = utoa::value#6
Coalesced (already) [101] utoa::started#5 = utoa::started#4
Coalesced (already) [102] utoa::buffer#22 = utoa::buffer#14
Coalesced [110] utoa::value#19 = utoa::value#1
Coalesced [111] utoa::buffer#24 = utoa::buffer#5
Coalesced (already) [112] print_char_cursor#64 = print_char_cursor#54
Coalesced [117] print_char::ch#4 = print_char::ch#0
Coalesced [118] print_char_cursor#70 = print_char_cursor#1
Coalesced [121] print_str::str#6 = print_str::str#0
Coalesced (already) [122] print_char_cursor#65 = print_char_cursor#12
Coalesced [126] print_char::ch#5 = print_char::ch#1
Coalesced (already) [127] print_char_cursor#71 = print_char_cursor#52
Coalesced [131] print_char::ch#6 = print_char::ch#2
Coalesced (already) [132] print_char_cursor#72 = print_char_cursor#12
Coalesced [136] utoa_append::value#6 = utoa_append::value#0
Coalesced [143] utoa_append::value#7 = utoa_append::value#1
Coalesced [144] utoa_append::digit#5 = utoa_append::digit#1
Coalesced down to 16 phi equivalence classes
Culled Empty Block label __start::@2
Culled Empty Block label main::@4
Culled Empty Block label main::@8
Culled Empty Block label end::@3
Culled Empty Block label sum::@3
Culled Empty Block label sum::@2
Culled Empty Block label sum::@6
Culled Empty Block label print_uint_decimal::@2
Culled Empty Block label print_ln::@2
Culled Empty Block label print_ln::@3
Culled Empty Block label print_uint::@2
Culled Empty Block label utoa::@1
Culled Empty Block label utoa::@5
Culled Empty Block label utoa::@17
Culled Empty Block label print_uchar::@2
Renumbering block utoa::@10 to utoa::@1
Renumbering block utoa::@11 to utoa::@2
Renumbering block utoa::@12 to utoa::@3
Renumbering block utoa::@13 to utoa::@4
Renumbering block utoa::@14 to utoa::@5
Renumbering block utoa::@15 to utoa::@6
Renumbering block utoa::@16 to utoa::@7
Renumbering block sum::@4 to sum::@2
Renumbering block sum::@5 to sum::@3
Renumbering block main::@5 to main::@4
Renumbering block main::@6 to main::@5
Renumbering block main::@7 to main::@6
Adding NOP phi() at start of __start
Adding NOP phi() at start of __start::@1
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@3
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of main::@5
Adding NOP phi() at start of end::@2
Adding NOP phi() at start of sum
Adding NOP phi() at start of print_uint_decimal::@1
Adding NOP phi() at start of utoa
Adding NOP phi() at start of print_str
Adding NOP phi() at start of utoa_append
FINAL CONTROL FLOW GRAPH
void __start()
__start: scope:[__start] from
[0] phi()
to:__start::__init1
__start::__init1: scope:[__start] from __start
[1] last_time = 0
to:__start::@1
__start::@1: scope:[__start] from __start::__init1
[2] phi()
[3] call main
to:__start::@return
__start::@return: scope:[__start] from __start::@1
[4] return
to:@return
int main()
main: scope:[main] from __start::@1
[5] phi()
[6] call start
to:main::@1
main::@1: scope:[main] from main main::@6
[7] print_line_cursor#22 = phi( main/print_screen#0, main::@6/print_line_cursor#0 )
[7] print_char_cursor#54 = phi( main/print_screen#0, main::@6/print_char_cursor#73 )
[7] main::i#3 = phi( main/0, main::@6/main::i#2 )
[8] if(main::i#3<6) goto main::@2
to:main::@3
main::@3: scope:[main] from main::@1
[9] phi()
[10] call end
to:main::@return
main::@return: scope:[main] from main::@3
[11] return
to:@return
main::@2: scope:[main] from main::@1
[12] phi()
[13] call sum
[14] sum::return#2 = sum::s#3
to:main::@4
main::@4: scope:[main] from main::@2
[15] print_uint_decimal::w#0 = sum::return#2
[16] call print_uint_decimal
to:main::@5
main::@5: scope:[main] from main::@4
[17] phi()
[18] call print_ln
to:main::@6
main::@6: scope:[main] from main::@5
[19] main::i#2 = ++ main::i#3
[20] print_char_cursor#73 = print_line_cursor#0
to:main::@1
void start()
start: scope:[start] from end main
asm { jsr$FFDE staLAST_TIME stxLAST_TIME+1 }
to:start::@return
start::@return: scope:[start] from start
[22] return
to:@return
void end()
end: scope:[end] from main::@3
[23] Ticks#0 = last_time
[24] call start
to:end::@1
end::@1: scope:[end] from end
[25] last_time = last_time - Ticks#0
[26] Ticks#1 = last_time
[27] print_uint::w#0 = Ticks#1
[28] call print_uint
to:end::@2
end::@2: scope:[end] from end::@1
[29] phi()
[30] call print_ln
to:end::@return
end::@return: scope:[end] from end::@2
[31] return
to:@return
unsigned int sum()
sum: scope:[sum] from main::@2
[32] phi()
to:sum::@1
sum::@1: scope:[sum] from sum sum::@3
[33] sum::p#5 = phi( sum/rom, sum::@3/sum::p#2 )
[33] sum::s#3 = phi( sum/0, sum::@3/sum::s#2 )
[33] sum::page#3 = phi( sum/0, sum::@3/sum::page#2 )
[34] if(sum::page#3<$20) goto sum::@2
to:sum::@return
sum::@return: scope:[sum] from sum::@1
[35] return
to:@return
sum::@2: scope:[sum] from sum::@1 sum::@2
[36] sum::s#4 = phi( sum::@1/sum::s#3, sum::@2/sum::s#2 )
[36] sum::i#3 = phi( sum::@1/0, sum::@2/sum::i#2 )
[37] sum::tmp#1 = sum::p#5[sum::i#3]
[38] sum::s#2 = sum::s#4 + sum::tmp#1
[39] sum::i#2 = ++ sum::i#3
[40] if(0!=sum::i#2) goto sum::@2
to:sum::@3
sum::@3: scope:[sum] from sum::@2
[41] sum::p#2 = sum::p#5 + $100
[42] sum::page#2 = ++ sum::page#3
to:sum::@1
void print_uint_decimal(unsigned int w)
print_uint_decimal: scope:[print_uint_decimal] from main::@4
[43] utoa::value#0 = print_uint_decimal::w#0
[44] call utoa
to:print_uint_decimal::@1
print_uint_decimal::@1: scope:[print_uint_decimal] from print_uint_decimal
[45] phi()
[46] call print_str
to:print_uint_decimal::@return
print_uint_decimal::@return: scope:[print_uint_decimal] from print_uint_decimal::@1
[47] return
to:@return
void print_ln()
print_ln: scope:[print_ln] from end::@2 main::@5
[48] print_char_cursor#49 = phi( end::@2/print_char_cursor#12, main::@5/print_char_cursor#1 )
to:print_ln::@1
print_ln::@1: scope:[print_ln] from print_ln print_ln::@1
[49] print_line_cursor#10 = phi( print_ln/print_line_cursor#22, print_ln::@1/print_line_cursor#0 )
[50] print_line_cursor#0 = print_line_cursor#10 + $28
[51] if(print_line_cursor#0<print_char_cursor#49) goto print_ln::@1
to:print_ln::@return
print_ln::@return: scope:[print_ln] from print_ln::@1
[52] return
to:@return
void print_uint(unsigned int w)
print_uint: scope:[print_uint] from end::@1
[53] print_uchar::b#0 = byte1 print_uint::w#0
[54] call print_uchar
to:print_uint::@1
print_uint::@1: scope:[print_uint] from print_uint
[55] print_uchar::b#1 = byte0 print_uint::w#0
[56] call print_uchar
to:print_uint::@return
print_uint::@return: scope:[print_uint] from print_uint::@1
[57] return
to:@return
void utoa(unsigned int value , char *buffer , char radix)
utoa: scope:[utoa] from print_uint_decimal
[58] phi()
to:utoa::@1
utoa::@1: scope:[utoa] from utoa utoa::@4
[59] utoa::buffer#11 = phi( utoa::@4/utoa::buffer#14, utoa/decimal_digits )
[59] utoa::started#2 = phi( utoa::@4/utoa::started#4, utoa/0 )
[59] utoa::value#2 = phi( utoa::@4/utoa::value#6, utoa/utoa::value#0 )
[59] utoa::digit#2 = phi( utoa::@4/utoa::digit#1, utoa/0 )
[60] if(utoa::digit#2<utoa::max_digits#1-1) goto utoa::@2
to:utoa::@3
utoa::@3: scope:[utoa] from utoa::@1
[61] utoa::$11 = (char)utoa::value#2
[62] *utoa::buffer#11 = DIGITS[utoa::$11]
[63] utoa::buffer#4 = ++ utoa::buffer#11
[64] *utoa::buffer#4 = 0
to:utoa::@return
utoa::@return: scope:[utoa] from utoa::@3
[65] return
to:@return
utoa::@2: scope:[utoa] from utoa::@1
[66] utoa::$10 = utoa::digit#2 << 1
[67] utoa::digit_value#0 = RADIX_DECIMAL_VALUES[utoa::$10]
[68] if(0!=utoa::started#2) goto utoa::@5
to:utoa::@7
utoa::@7: scope:[utoa] from utoa::@2
[69] if(utoa::value#2>=utoa::digit_value#0) goto utoa::@5
to:utoa::@4
utoa::@4: scope:[utoa] from utoa::@6 utoa::@7
[70] utoa::buffer#14 = phi( utoa::@7/utoa::buffer#11, utoa::@6/utoa::buffer#5 )
[70] utoa::started#4 = phi( utoa::@7/utoa::started#2, utoa::@6/1 )
[70] utoa::value#6 = phi( utoa::@7/utoa::value#2, utoa::@6/utoa::value#1 )
[71] utoa::digit#1 = ++ utoa::digit#2
to:utoa::@1
utoa::@5: scope:[utoa] from utoa::@2 utoa::@7
[72] utoa_append::buffer#0 = utoa::buffer#11
[73] utoa_append::value#0 = utoa::value#2
[74] utoa_append::sub#0 = utoa::digit_value#0
[75] call utoa_append
[76] utoa_append::return#0 = utoa_append::value#2
to:utoa::@6
utoa::@6: scope:[utoa] from utoa::@5
[77] utoa::value#1 = utoa_append::return#0
[78] utoa::buffer#5 = ++ utoa::buffer#11
to:utoa::@4
void print_str(char *str)
print_str: scope:[print_str] from print_uint_decimal::@1
[79] phi()
to:print_str::@1
print_str::@1: scope:[print_str] from print_str print_str::@3
[80] print_char_cursor#1 = phi( print_str/print_char_cursor#54, print_str::@3/print_char_cursor#12 )
[80] print_str::str#2 = phi( print_str/decimal_digits, print_str::@3/print_str::str#0 )
[81] if(0!=*print_str::str#2) goto print_str::@2
to:print_str::@return
print_str::@return: scope:[print_str] from print_str::@1
[82] return
to:@return
print_str::@2: scope:[print_str] from print_str::@1
[83] print_char::ch#0 = *print_str::str#2
[84] call print_char
to:print_str::@3
print_str::@3: scope:[print_str] from print_str::@2
[85] print_str::str#0 = ++ print_str::str#2
to:print_str::@1
void print_uchar(char b)
print_uchar: scope:[print_uchar] from print_uint print_uint::@1
[86] print_char_cursor#52 = phi( print_uint/print_char_cursor#54, print_uint::@1/print_char_cursor#12 )
[86] print_uchar::b#2 = phi( print_uint/print_uchar::b#0, print_uint::@1/print_uchar::b#1 )
[87] print_uchar::$0 = print_uchar::b#2 >> 4
[88] print_char::ch#1 = DIGITS[print_uchar::$0]
[89] call print_char
to:print_uchar::@1
print_uchar::@1: scope:[print_uchar] from print_uchar
[90] print_uchar::$2 = print_uchar::b#2 & $f
[91] print_char::ch#2 = DIGITS[print_uchar::$2]
[92] call print_char
to:print_uchar::@return
print_uchar::@return: scope:[print_uchar] from print_uchar::@1
[93] return
to:@return
unsigned int utoa_append(char *buffer , unsigned int value , unsigned int sub)
utoa_append: scope:[utoa_append] from utoa::@5
[94] phi()
to:utoa_append::@1
utoa_append::@1: scope:[utoa_append] from utoa_append utoa_append::@2
[95] utoa_append::digit#2 = phi( utoa_append/0, utoa_append::@2/utoa_append::digit#1 )
[95] utoa_append::value#2 = phi( utoa_append/utoa_append::value#0, utoa_append::@2/utoa_append::value#1 )
[96] if(utoa_append::value#2>=utoa_append::sub#0) goto utoa_append::@2
to:utoa_append::@3
utoa_append::@3: scope:[utoa_append] from utoa_append::@1
[97] *utoa_append::buffer#0 = DIGITS[utoa_append::digit#2]
to:utoa_append::@return
utoa_append::@return: scope:[utoa_append] from utoa_append::@3
[98] return
to:@return
utoa_append::@2: scope:[utoa_append] from utoa_append::@1
[99] utoa_append::digit#1 = ++ utoa_append::digit#2
[100] utoa_append::value#1 = utoa_append::value#2 - utoa_append::sub#0
to:utoa_append::@1
void print_char(char ch)
print_char: scope:[print_char] from print_str::@2 print_uchar print_uchar::@1
[101] print_char_cursor#36 = phi( print_str::@2/print_char_cursor#1, print_uchar/print_char_cursor#52, print_uchar::@1/print_char_cursor#12 )
[101] print_char::ch#3 = phi( print_str::@2/print_char::ch#0, print_uchar/print_char::ch#1, print_uchar::@1/print_char::ch#2 )
[102] *print_char_cursor#36 = print_char::ch#3
[103] print_char_cursor#12 = ++ print_char_cursor#36
to:print_char::@return
print_char::@return: scope:[print_char] from print_char
[104] return
to:@return
VARIABLE REGISTER WEIGHTS
unsigned int Ticks
unsigned int Ticks#0 // 101.0
unsigned int Ticks#1 // 202.0
void __start()
void end()
__loadstore volatile unsigned int last_time // 21.368421052631582
int main()
unsigned int main::i
unsigned int main::i#2 // 101.0
unsigned int main::i#3 // 33.666666666666664
int main::return
void print_char(char ch)
char print_char::ch
char print_char::ch#0 // 2000002.0
char print_char::ch#1 // 20002.0
char print_char::ch#2 // 20002.0
char print_char::ch#3 // 1.1020004E7
char *print_char_cursor
char *print_char_cursor#1 // 251263.0
char *print_char_cursor#12 // 734073.6666666666
char *print_char_cursor#36 // 1.05100025E7
char *print_char_cursor#49 // 25050.75
char *print_char_cursor#52 // 4001.0
char *print_char_cursor#54 // 653.1176470588235
char *print_char_cursor#73 // 202.0
char *print_line_cursor
char *print_line_cursor#0 // 50034.16666666666
char *print_line_cursor#10 // 201003.0
char *print_line_cursor#22 // 64.82352941176471
void print_ln()
char *print_screen
void print_str(char *str)
char *print_str::str
char *print_str::str#0 // 2000002.0
char *print_str::str#2 // 1000001.0
void print_uchar(char b)
char print_uchar::$0 // 20002.0
char print_uchar::$2 // 20002.0
char print_uchar::b
char print_uchar::b#0 // 2002.0
char print_uchar::b#1 // 2002.0
char print_uchar::b#2 // 5501.0
void print_uint(unsigned int w)
unsigned int print_uint::w
unsigned int print_uint::w#0 // 701.0
void print_uint_decimal(unsigned int w)
unsigned int print_uint_decimal::w
unsigned int print_uint_decimal::w#0 // 1102.0
void start()
unsigned int sum()
char sum::i
char sum::i#2 // 1500001.5
char sum::i#3 // 1000001.0
char *sum::p
char *sum::p#2 // 100001.0
char *sum::p#5 // 171428.99999999997
char sum::page
char sum::page#2 // 200002.0
char sum::page#3 // 37500.375
unsigned int sum::return
unsigned int sum::return#2 // 202.0
unsigned int sum::s
unsigned int sum::s#2 // 420000.60000000003
unsigned int sum::s#3 // 50025.75
unsigned int sum::s#4 // 1050001.5
char sum::tmp
char sum::tmp#1 // 2000002.0
void utoa(unsigned int value , char *buffer , char radix)
char utoa::$10 // 2000002.0
char utoa::$11 // 20002.0
char *utoa::buffer
char *utoa::buffer#11 // 287143.2857142857
char *utoa::buffer#14 // 1500001.5
char *utoa::buffer#4 // 20002.0
char *utoa::buffer#5 // 2000002.0
char utoa::digit
char utoa::digit#1 // 2000002.0
char utoa::digit#2 // 285714.5714285714
unsigned int utoa::digit_value
unsigned int utoa::digit_value#0 // 600000.6000000001
unsigned int *utoa::digit_values
char utoa::max_digits
char utoa::radix
char utoa::started
char utoa::started#2 // 500000.5
char utoa::started#4 // 1000001.0
unsigned int utoa::value
unsigned int utoa::value#0 // 5501.0
unsigned int utoa::value#1 // 1000001.0
unsigned int utoa::value#2 // 572857.857142857
unsigned int utoa::value#6 // 1500001.5
unsigned int utoa_append(char *buffer , unsigned int value , unsigned int sub)
char *utoa_append::buffer
char *utoa_append::buffer#0 // 1375000.25
char utoa_append::digit
char utoa_append::digit#1 // 1.0000000001E10
char utoa_append::digit#2 // 1.00050000015E10
unsigned int utoa_append::return
unsigned int utoa_append::return#0 // 2000002.0
unsigned int utoa_append::sub
unsigned int utoa_append::sub#0 // 3.3335000005E9
unsigned int utoa_append::value
unsigned int utoa_append::value#0 // 3666667.333333333
unsigned int utoa_append::value#1 // 2.0000000002E10
unsigned int utoa_append::value#2 // 5.001833334166666E9
Initial phi equivalence classes
[ main::i#3 main::i#2 ]
[ sum::page#3 sum::page#2 ]
[ sum::p#5 sum::p#2 ]
[ sum::i#3 sum::i#2 ]
[ sum::s#4 sum::s#3 sum::s#2 ]
[ print_line_cursor#10 print_line_cursor#22 print_line_cursor#0 ]
[ utoa::digit#2 utoa::digit#1 ]
[ utoa::value#2 utoa::value#6 utoa::value#0 utoa::value#1 ]
[ utoa::started#2 utoa::started#4 ]
[ utoa::buffer#11 utoa::buffer#14 utoa::buffer#5 ]
[ print_str::str#2 print_str::str#0 ]
[ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
[ utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 ]
[ utoa_append::digit#2 utoa_append::digit#1 ]
[ print_char::ch#3 print_char::ch#0 print_char::ch#1 print_char::ch#2 ]
[ print_char_cursor#36 print_char_cursor#52 print_char_cursor#49 print_char_cursor#12 print_char_cursor#1 print_char_cursor#54 print_char_cursor#73 ]
Added variable last_time to live range equivalence class [ last_time ]
Added variable sum::return#2 to live range equivalence class [ sum::return#2 ]
Added variable print_uint_decimal::w#0 to live range equivalence class [ print_uint_decimal::w#0 ]
Added variable Ticks#0 to live range equivalence class [ Ticks#0 ]
Added variable Ticks#1 to live range equivalence class [ Ticks#1 ]
Added variable print_uint::w#0 to live range equivalence class [ print_uint::w#0 ]
Added variable sum::tmp#1 to live range equivalence class [ sum::tmp#1 ]
Added variable utoa::$11 to live range equivalence class [ utoa::$11 ]
Added variable utoa::buffer#4 to live range equivalence class [ utoa::buffer#4 ]
Added variable utoa::$10 to live range equivalence class [ utoa::$10 ]
Added variable utoa::digit_value#0 to live range equivalence class [ utoa::digit_value#0 ]
Added variable utoa_append::buffer#0 to live range equivalence class [ utoa_append::buffer#0 ]
Added variable utoa_append::sub#0 to live range equivalence class [ utoa_append::sub#0 ]
Added variable utoa_append::return#0 to live range equivalence class [ utoa_append::return#0 ]
Added variable print_uchar::$0 to live range equivalence class [ print_uchar::$0 ]
Added variable print_uchar::$2 to live range equivalence class [ print_uchar::$2 ]
Complete equivalence classes
[ main::i#3 main::i#2 ]
[ sum::page#3 sum::page#2 ]
[ sum::p#5 sum::p#2 ]
[ sum::i#3 sum::i#2 ]
[ sum::s#4 sum::s#3 sum::s#2 ]
[ print_line_cursor#10 print_line_cursor#22 print_line_cursor#0 ]
[ utoa::digit#2 utoa::digit#1 ]
[ utoa::value#2 utoa::value#6 utoa::value#0 utoa::value#1 ]
[ utoa::started#2 utoa::started#4 ]
[ utoa::buffer#11 utoa::buffer#14 utoa::buffer#5 ]
[ print_str::str#2 print_str::str#0 ]
[ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
[ utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 ]
[ utoa_append::digit#2 utoa_append::digit#1 ]
[ print_char::ch#3 print_char::ch#0 print_char::ch#1 print_char::ch#2 ]
[ print_char_cursor#36 print_char_cursor#52 print_char_cursor#49 print_char_cursor#12 print_char_cursor#1 print_char_cursor#54 print_char_cursor#73 ]
[ last_time ]
[ sum::return#2 ]
[ print_uint_decimal::w#0 ]
[ Ticks#0 ]
[ Ticks#1 ]
[ print_uint::w#0 ]
[ sum::tmp#1 ]
[ utoa::$11 ]
[ utoa::buffer#4 ]
[ utoa::$10 ]
[ utoa::digit_value#0 ]
[ utoa_append::buffer#0 ]
[ utoa_append::sub#0 ]
[ utoa_append::return#0 ]
[ print_uchar::$0 ]
[ print_uchar::$2 ]
Allocated zp[2]:2 [ utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 ]
Allocated zp[1]:4 [ utoa_append::digit#2 utoa_append::digit#1 ]
Allocated zp[2]:5 [ utoa_append::sub#0 ]
Allocated zp[1]:7 [ print_char::ch#3 print_char::ch#0 print_char::ch#1 print_char::ch#2 ]
Allocated zp[2]:8 [ print_char_cursor#36 print_char_cursor#52 print_char_cursor#49 print_char_cursor#12 print_char_cursor#1 print_char_cursor#54 print_char_cursor#73 ]
Allocated zp[2]:10 [ utoa::buffer#11 utoa::buffer#14 utoa::buffer#5 ]
Allocated zp[2]:12 [ utoa::value#2 utoa::value#6 utoa::value#0 utoa::value#1 ]
Allocated zp[2]:14 [ print_str::str#2 print_str::str#0 ]
Allocated zp[1]:16 [ sum::i#3 sum::i#2 ]
Allocated zp[1]:17 [ utoa::digit#2 utoa::digit#1 ]
Allocated zp[1]:18 [ sum::tmp#1 ]
Allocated zp[1]:19 [ utoa::$10 ]
Allocated zp[2]:20 [ utoa_append::return#0 ]
Allocated zp[2]:22 [ sum::s#4 sum::s#3 sum::s#2 ]
Allocated zp[1]:24 [ utoa::started#2 utoa::started#4 ]
Allocated zp[2]:25 [ utoa_append::buffer#0 ]
Allocated zp[2]:27 [ utoa::digit_value#0 ]
Allocated zp[2]:29 [ sum::p#5 sum::p#2 ]
Allocated zp[2]:31 [ print_line_cursor#10 print_line_cursor#22 print_line_cursor#0 ]
Allocated zp[1]:33 [ sum::page#3 sum::page#2 ]
Allocated zp[1]:34 [ utoa::$11 ]
Allocated zp[2]:35 [ utoa::buffer#4 ]
Allocated zp[1]:37 [ print_uchar::$0 ]
Allocated zp[1]:38 [ print_uchar::$2 ]
Allocated zp[1]:39 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Allocated zp[2]:40 [ print_uint_decimal::w#0 ]
Allocated zp[2]:42 [ print_uint::w#0 ]
Allocated zp[2]:44 [ sum::return#2 ]
Allocated zp[2]:46 [ Ticks#1 ]
Allocated zp[2]:48 [ main::i#3 main::i#2 ]
Allocated zp[2]:50 [ Ticks#0 ]
Allocated zp[2]:52 [ last_time ]
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [1] last_time = 0 [ last_time ] ( [ last_time ] { } ) always clobbers reg byte a
Statement [8] if(main::i#3<6) goto main::@2 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 ] ( main:3 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 ] { } ) always clobbers reg byte a
Statement [14] sum::return#2 = sum::s#3 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 sum::return#2 ] ( main:3 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 sum::return#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [15] print_uint_decimal::w#0 = sum::return#2 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 print_uint_decimal::w#0 ] ( main:3 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 print_uint_decimal::w#0 ] { { print_uint_decimal::w#0 = sum::return#2 } } ) always clobbers reg byte a
Statement [20] print_char_cursor#73 = print_line_cursor#0 [ last_time main::i#2 print_char_cursor#73 print_line_cursor#0 ] ( main:3 [ last_time main::i#2 print_char_cursor#73 print_line_cursor#0 ] { } ) always clobbers reg byte a
Statement asm { jsr$FFDE staLAST_TIME stxLAST_TIME+1 } always clobbers reg byte a reg byte x reg byte y
Statement [23] Ticks#0 = last_time [ last_time print_char_cursor#54 print_line_cursor#22 Ticks#0 ] ( main:3::end:10 [ last_time print_char_cursor#54 print_line_cursor#22 Ticks#0 ] { } ) always clobbers reg byte a
Statement [25] last_time = last_time - Ticks#0 [ last_time print_char_cursor#54 print_line_cursor#22 ] ( main:3::end:10 [ last_time print_char_cursor#54 print_line_cursor#22 ] { { Ticks#1 = print_uint::w#0 } } ) always clobbers reg byte a
Statement [26] Ticks#1 = last_time [ print_char_cursor#54 print_line_cursor#22 Ticks#1 ] ( main:3::end:10 [ print_char_cursor#54 print_line_cursor#22 Ticks#1 ] { { Ticks#1 = print_uint::w#0 } } ) always clobbers reg byte a
Statement [27] print_uint::w#0 = Ticks#1 [ print_char_cursor#54 print_line_cursor#22 print_uint::w#0 ] ( main:3::end:10 [ print_char_cursor#54 print_line_cursor#22 print_uint::w#0 ] { { Ticks#1 = print_uint::w#0 } } ) always clobbers reg byte a
Statement [37] sum::tmp#1 = sum::p#5[sum::i#3] [ sum::page#3 sum::p#5 sum::i#3 sum::s#4 sum::tmp#1 ] ( main:3::sum:13 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 sum::page#3 sum::p#5 sum::i#3 sum::s#4 sum::tmp#1 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:33 [ sum::page#3 sum::page#2 ]
Removing always clobbered register reg byte a as potential for zp[1]:16 [ sum::i#3 sum::i#2 ]
Statement [38] sum::s#2 = sum::s#4 + sum::tmp#1 [ sum::page#3 sum::p#5 sum::s#2 sum::i#3 ] ( main:3::sum:13 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 sum::page#3 sum::p#5 sum::s#2 sum::i#3 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [41] sum::p#2 = sum::p#5 + $100 [ sum::page#3 sum::s#2 sum::p#2 ] ( main:3::sum:13 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 sum::page#3 sum::s#2 sum::p#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [43] utoa::value#0 = print_uint_decimal::w#0 [ print_char_cursor#54 utoa::value#0 ] ( main:3::print_uint_decimal:16 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::value#0 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a
Statement [50] print_line_cursor#0 = print_line_cursor#10 + $28 [ print_line_cursor#0 print_char_cursor#49 ] ( main:3::print_ln:18 [ last_time main::i#3 print_line_cursor#0 print_char_cursor#49 ] { { print_char_cursor#1 = print_char_cursor#49 } } main:3::end:10::print_ln:30 [ print_line_cursor#0 print_char_cursor#49 ] { { print_char_cursor#12 = print_char_cursor#49 } } ) always clobbers reg byte a
Statement [51] if(print_line_cursor#0<print_char_cursor#49) goto print_ln::@1 [ print_line_cursor#0 print_char_cursor#49 ] ( main:3::print_ln:18 [ last_time main::i#3 print_line_cursor#0 print_char_cursor#49 ] { { print_char_cursor#1 = print_char_cursor#49 } } main:3::end:10::print_ln:30 [ print_line_cursor#0 print_char_cursor#49 ] { { print_char_cursor#12 = print_char_cursor#49 } } ) always clobbers reg byte a
Statement [62] *utoa::buffer#11 = DIGITS[utoa::$11] [ utoa::buffer#11 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::buffer#11 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a reg byte y
Statement [63] utoa::buffer#4 = ++ utoa::buffer#11 [ utoa::buffer#4 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::buffer#4 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a
Statement [64] *utoa::buffer#4 = 0 [ ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a reg byte y
Statement [66] utoa::$10 = utoa::digit#2 << 1 [ utoa::digit#2 utoa::value#2 utoa::started#2 utoa::buffer#11 utoa::$10 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::value#2 utoa::started#2 utoa::buffer#11 utoa::$10 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:17 [ utoa::digit#2 utoa::digit#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:24 [ utoa::started#2 utoa::started#4 ]
Statement [67] utoa::digit_value#0 = RADIX_DECIMAL_VALUES[utoa::$10] [ utoa::digit#2 utoa::value#2 utoa::started#2 utoa::buffer#11 utoa::digit_value#0 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::value#2 utoa::started#2 utoa::buffer#11 utoa::digit_value#0 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a
Statement [69] if(utoa::value#2>=utoa::digit_value#0) goto utoa::@5 [ utoa::digit#2 utoa::value#2 utoa::started#2 utoa::buffer#11 utoa::digit_value#0 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::value#2 utoa::started#2 utoa::buffer#11 utoa::digit_value#0 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a
Statement [72] utoa_append::buffer#0 = utoa::buffer#11 [ utoa::digit#2 utoa::value#2 utoa::buffer#11 utoa::digit_value#0 utoa_append::buffer#0 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::value#2 utoa::buffer#11 utoa::digit_value#0 utoa_append::buffer#0 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } { utoa_append::buffer#0 = utoa::buffer#11 } { utoa_append::value#0 = utoa::value#2 } { utoa_append::sub#0 = utoa::digit_value#0 } { utoa_append::return#0 = utoa_append::value#2 } } ) always clobbers reg byte a
Statement [73] utoa_append::value#0 = utoa::value#2 [ utoa::digit#2 utoa::buffer#11 utoa::digit_value#0 utoa_append::buffer#0 utoa_append::value#0 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::buffer#11 utoa::digit_value#0 utoa_append::buffer#0 utoa_append::value#0 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } { utoa_append::buffer#0 = utoa::buffer#11 } { utoa_append::value#0 = utoa::value#2 } { utoa_append::sub#0 = utoa::digit_value#0 } { utoa_append::return#0 = utoa_append::value#2 } } ) always clobbers reg byte a
Statement [74] utoa_append::sub#0 = utoa::digit_value#0 [ utoa::digit#2 utoa::buffer#11 utoa_append::buffer#0 utoa_append::value#0 utoa_append::sub#0 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::buffer#11 utoa_append::buffer#0 utoa_append::value#0 utoa_append::sub#0 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } { utoa_append::buffer#0 = utoa::buffer#11 } { utoa_append::value#0 = utoa::value#2 } { utoa_append::sub#0 = utoa::digit_value#0 } { utoa_append::return#0 = utoa_append::value#2 } } ) always clobbers reg byte a
Statement [76] utoa_append::return#0 = utoa_append::value#2 [ utoa::digit#2 utoa::buffer#11 utoa_append::return#0 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::buffer#11 utoa_append::return#0 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } { utoa_append::buffer#0 = utoa::buffer#11 } { utoa_append::value#0 = utoa::value#2 } { utoa_append::sub#0 = utoa::digit_value#0 } { utoa_append::return#0 = utoa_append::value#2 } } ) always clobbers reg byte a
Statement [77] utoa::value#1 = utoa_append::return#0 [ utoa::digit#2 utoa::buffer#11 utoa::value#1 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::buffer#11 utoa::value#1 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a
Statement [81] if(0!=*print_str::str#2) goto print_str::@2 [ print_char_cursor#1 print_str::str#2 ] ( main:3::print_uint_decimal:16::print_str:46 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#1 print_str::str#2 ] { { print_uint_decimal::w#0 = sum::return#2 } } ) always clobbers reg byte a reg byte y
Statement [83] print_char::ch#0 = *print_str::str#2 [ print_char_cursor#1 print_str::str#2 print_char::ch#0 ] ( main:3::print_uint_decimal:16::print_str:46 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#1 print_str::str#2 print_char::ch#0 ] { { print_uint_decimal::w#0 = sum::return#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#1 = print_char_cursor#36 } } ) always clobbers reg byte a reg byte y
Statement [87] print_uchar::$0 = print_uchar::b#2 >> 4 [ print_uchar::b#2 print_char_cursor#52 print_uchar::$0 ] ( main:3::end:10::print_uint:28::print_uchar:54 [ print_line_cursor#22 print_uint::w#0 print_uchar::b#2 print_char_cursor#52 print_uchar::$0 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#36 = print_char_cursor#52 print_char_cursor#54 } { print_char::ch#1 = print_char::ch#3 } } main:3::end:10::print_uint:28::print_uchar:56 [ print_line_cursor#22 print_uchar::b#2 print_char_cursor#52 print_uchar::$0 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#12 = print_char_cursor#52 print_char_cursor#36 } { print_char::ch#1 = print_char::ch#3 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:39 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Statement [90] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#12 print_uchar::$2 ] ( main:3::end:10::print_uint:28::print_uchar:54 [ print_line_cursor#22 print_uint::w#0 print_char_cursor#12 print_uchar::$2 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#52 = print_char_cursor#54 } { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#12 = print_char_cursor#36 } } main:3::end:10::print_uint:28::print_uchar:56 [ print_line_cursor#22 print_char_cursor#12 print_uchar::$2 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#12 = print_char_cursor#52 print_char_cursor#36 } { print_char::ch#2 = print_char::ch#3 } } ) always clobbers reg byte a
Statement [96] if(utoa_append::value#2>=utoa_append::sub#0) goto utoa_append::@2 [ utoa_append::buffer#0 utoa_append::sub#0 utoa_append::value#2 utoa_append::digit#2 ] ( main:3::print_uint_decimal:16::utoa:44::utoa_append:75 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::buffer#11 utoa_append::buffer#0 utoa_append::sub#0 utoa_append::value#2 utoa_append::digit#2 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } { utoa_append::buffer#0 = utoa::buffer#11 } { utoa_append::value#0 = utoa::value#2 } { utoa_append::sub#0 = utoa::digit_value#0 } { utoa_append::return#0 = utoa_append::value#2 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:4 [ utoa_append::digit#2 utoa_append::digit#1 ]
Statement [97] *utoa_append::buffer#0 = DIGITS[utoa_append::digit#2] [ utoa_append::value#2 ] ( main:3::print_uint_decimal:16::utoa:44::utoa_append:75 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::buffer#11 utoa_append::value#2 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } { utoa_append::buffer#0 = utoa::buffer#11 } { utoa_append::value#0 = utoa::value#2 } { utoa_append::sub#0 = utoa::digit_value#0 } { utoa_append::return#0 = utoa_append::value#2 } } ) always clobbers reg byte a reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:17 [ utoa::digit#2 utoa::digit#1 ]
Statement [100] utoa_append::value#1 = utoa_append::value#2 - utoa_append::sub#0 [ utoa_append::buffer#0 utoa_append::sub#0 utoa_append::value#1 utoa_append::digit#1 ] ( main:3::print_uint_decimal:16::utoa:44::utoa_append:75 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::buffer#11 utoa_append::buffer#0 utoa_append::sub#0 utoa_append::value#1 utoa_append::digit#1 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } { utoa_append::buffer#0 = utoa::buffer#11 } { utoa_append::value#0 = utoa::value#2 } { utoa_append::sub#0 = utoa::digit_value#0 } { utoa_append::return#0 = utoa_append::value#2 } } ) always clobbers reg byte a
Statement [102] *print_char_cursor#36 = print_char::ch#3 [ print_char_cursor#36 ] ( main:3::print_uint_decimal:16::print_str:46::print_char:84 [ last_time main::i#3 print_line_cursor#22 print_str::str#2 print_char_cursor#36 ] { { print_uint_decimal::w#0 = sum::return#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#1 = print_char_cursor#36 } } main:3::end:10::print_uint:28::print_uchar:54::print_char:89 [ print_line_cursor#22 print_uint::w#0 print_uchar::b#2 print_char_cursor#36 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#36 = print_char_cursor#52 print_char_cursor#54 } { print_char::ch#1 = print_char::ch#3 } } main:3::end:10::print_uint:28::print_uchar:56::print_char:89 [ print_line_cursor#22 print_uchar::b#2 print_char_cursor#36 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#12 = print_char_cursor#52 print_char_cursor#36 } { print_char::ch#1 = print_char::ch#3 } } main:3::end:10::print_uint:28::print_uchar:54::print_char:92 [ print_line_cursor#22 print_uint::w#0 print_char_cursor#36 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#52 = print_char_cursor#54 } { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#12 = print_char_cursor#36 } } main:3::end:10::print_uint:28::print_uchar:56::print_char:92 [ print_line_cursor#22 print_char_cursor#36 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#12 = print_char_cursor#52 print_char_cursor#36 } { print_char::ch#2 = print_char::ch#3 } } ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:39 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Statement [1] last_time = 0 [ last_time ] ( [ last_time ] { } ) always clobbers reg byte a
Statement [8] if(main::i#3<6) goto main::@2 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 ] ( main:3 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 ] { } ) always clobbers reg byte a
Statement [14] sum::return#2 = sum::s#3 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 sum::return#2 ] ( main:3 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 sum::return#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [15] print_uint_decimal::w#0 = sum::return#2 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 print_uint_decimal::w#0 ] ( main:3 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 print_uint_decimal::w#0 ] { { print_uint_decimal::w#0 = sum::return#2 } } ) always clobbers reg byte a
Statement [20] print_char_cursor#73 = print_line_cursor#0 [ last_time main::i#2 print_char_cursor#73 print_line_cursor#0 ] ( main:3 [ last_time main::i#2 print_char_cursor#73 print_line_cursor#0 ] { } ) always clobbers reg byte a
Statement asm { jsr$FFDE staLAST_TIME stxLAST_TIME+1 } always clobbers reg byte a reg byte x reg byte y
Statement [23] Ticks#0 = last_time [ last_time print_char_cursor#54 print_line_cursor#22 Ticks#0 ] ( main:3::end:10 [ last_time print_char_cursor#54 print_line_cursor#22 Ticks#0 ] { } ) always clobbers reg byte a
Statement [25] last_time = last_time - Ticks#0 [ last_time print_char_cursor#54 print_line_cursor#22 ] ( main:3::end:10 [ last_time print_char_cursor#54 print_line_cursor#22 ] { { Ticks#1 = print_uint::w#0 } } ) always clobbers reg byte a
Statement [26] Ticks#1 = last_time [ print_char_cursor#54 print_line_cursor#22 Ticks#1 ] ( main:3::end:10 [ print_char_cursor#54 print_line_cursor#22 Ticks#1 ] { { Ticks#1 = print_uint::w#0 } } ) always clobbers reg byte a
Statement [27] print_uint::w#0 = Ticks#1 [ print_char_cursor#54 print_line_cursor#22 print_uint::w#0 ] ( main:3::end:10 [ print_char_cursor#54 print_line_cursor#22 print_uint::w#0 ] { { Ticks#1 = print_uint::w#0 } } ) always clobbers reg byte a
Statement [37] sum::tmp#1 = sum::p#5[sum::i#3] [ sum::page#3 sum::p#5 sum::i#3 sum::s#4 sum::tmp#1 ] ( main:3::sum:13 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 sum::page#3 sum::p#5 sum::i#3 sum::s#4 sum::tmp#1 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [38] sum::s#2 = sum::s#4 + sum::tmp#1 [ sum::page#3 sum::p#5 sum::s#2 sum::i#3 ] ( main:3::sum:13 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 sum::page#3 sum::p#5 sum::s#2 sum::i#3 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [41] sum::p#2 = sum::p#5 + $100 [ sum::page#3 sum::s#2 sum::p#2 ] ( main:3::sum:13 [ last_time main::i#3 print_char_cursor#54 print_line_cursor#22 sum::page#3 sum::s#2 sum::p#2 ] { { sum::return#2 = sum::s#3 } } ) always clobbers reg byte a
Statement [43] utoa::value#0 = print_uint_decimal::w#0 [ print_char_cursor#54 utoa::value#0 ] ( main:3::print_uint_decimal:16 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::value#0 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a
Statement [50] print_line_cursor#0 = print_line_cursor#10 + $28 [ print_line_cursor#0 print_char_cursor#49 ] ( main:3::print_ln:18 [ last_time main::i#3 print_line_cursor#0 print_char_cursor#49 ] { { print_char_cursor#1 = print_char_cursor#49 } } main:3::end:10::print_ln:30 [ print_line_cursor#0 print_char_cursor#49 ] { { print_char_cursor#12 = print_char_cursor#49 } } ) always clobbers reg byte a
Statement [51] if(print_line_cursor#0<print_char_cursor#49) goto print_ln::@1 [ print_line_cursor#0 print_char_cursor#49 ] ( main:3::print_ln:18 [ last_time main::i#3 print_line_cursor#0 print_char_cursor#49 ] { { print_char_cursor#1 = print_char_cursor#49 } } main:3::end:10::print_ln:30 [ print_line_cursor#0 print_char_cursor#49 ] { { print_char_cursor#12 = print_char_cursor#49 } } ) always clobbers reg byte a
Statement [62] *utoa::buffer#11 = DIGITS[utoa::$11] [ utoa::buffer#11 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::buffer#11 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a reg byte y
Statement [63] utoa::buffer#4 = ++ utoa::buffer#11 [ utoa::buffer#4 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::buffer#4 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a
Statement [64] *utoa::buffer#4 = 0 [ ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a reg byte y
Statement [66] utoa::$10 = utoa::digit#2 << 1 [ utoa::digit#2 utoa::value#2 utoa::started#2 utoa::buffer#11 utoa::$10 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::value#2 utoa::started#2 utoa::buffer#11 utoa::$10 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a
Statement [67] utoa::digit_value#0 = RADIX_DECIMAL_VALUES[utoa::$10] [ utoa::digit#2 utoa::value#2 utoa::started#2 utoa::buffer#11 utoa::digit_value#0 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::value#2 utoa::started#2 utoa::buffer#11 utoa::digit_value#0 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a
Statement [69] if(utoa::value#2>=utoa::digit_value#0) goto utoa::@5 [ utoa::digit#2 utoa::value#2 utoa::started#2 utoa::buffer#11 utoa::digit_value#0 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::value#2 utoa::started#2 utoa::buffer#11 utoa::digit_value#0 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a
Statement [72] utoa_append::buffer#0 = utoa::buffer#11 [ utoa::digit#2 utoa::value#2 utoa::buffer#11 utoa::digit_value#0 utoa_append::buffer#0 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::value#2 utoa::buffer#11 utoa::digit_value#0 utoa_append::buffer#0 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } { utoa_append::buffer#0 = utoa::buffer#11 } { utoa_append::value#0 = utoa::value#2 } { utoa_append::sub#0 = utoa::digit_value#0 } { utoa_append::return#0 = utoa_append::value#2 } } ) always clobbers reg byte a
Statement [73] utoa_append::value#0 = utoa::value#2 [ utoa::digit#2 utoa::buffer#11 utoa::digit_value#0 utoa_append::buffer#0 utoa_append::value#0 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::buffer#11 utoa::digit_value#0 utoa_append::buffer#0 utoa_append::value#0 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } { utoa_append::buffer#0 = utoa::buffer#11 } { utoa_append::value#0 = utoa::value#2 } { utoa_append::sub#0 = utoa::digit_value#0 } { utoa_append::return#0 = utoa_append::value#2 } } ) always clobbers reg byte a
Statement [74] utoa_append::sub#0 = utoa::digit_value#0 [ utoa::digit#2 utoa::buffer#11 utoa_append::buffer#0 utoa_append::value#0 utoa_append::sub#0 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::buffer#11 utoa_append::buffer#0 utoa_append::value#0 utoa_append::sub#0 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } { utoa_append::buffer#0 = utoa::buffer#11 } { utoa_append::value#0 = utoa::value#2 } { utoa_append::sub#0 = utoa::digit_value#0 } { utoa_append::return#0 = utoa_append::value#2 } } ) always clobbers reg byte a
Statement [76] utoa_append::return#0 = utoa_append::value#2 [ utoa::digit#2 utoa::buffer#11 utoa_append::return#0 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::buffer#11 utoa_append::return#0 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } { utoa_append::buffer#0 = utoa::buffer#11 } { utoa_append::value#0 = utoa::value#2 } { utoa_append::sub#0 = utoa::digit_value#0 } { utoa_append::return#0 = utoa_append::value#2 } } ) always clobbers reg byte a
Statement [77] utoa::value#1 = utoa_append::return#0 [ utoa::digit#2 utoa::buffer#11 utoa::value#1 ] ( main:3::print_uint_decimal:16::utoa:44 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::buffer#11 utoa::value#1 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } } ) always clobbers reg byte a
Statement [81] if(0!=*print_str::str#2) goto print_str::@2 [ print_char_cursor#1 print_str::str#2 ] ( main:3::print_uint_decimal:16::print_str:46 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#1 print_str::str#2 ] { { print_uint_decimal::w#0 = sum::return#2 } } ) always clobbers reg byte a reg byte y
Statement [83] print_char::ch#0 = *print_str::str#2 [ print_char_cursor#1 print_str::str#2 print_char::ch#0 ] ( main:3::print_uint_decimal:16::print_str:46 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#1 print_str::str#2 print_char::ch#0 ] { { print_uint_decimal::w#0 = sum::return#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#1 = print_char_cursor#36 } } ) always clobbers reg byte a reg byte y
Statement [87] print_uchar::$0 = print_uchar::b#2 >> 4 [ print_uchar::b#2 print_char_cursor#52 print_uchar::$0 ] ( main:3::end:10::print_uint:28::print_uchar:54 [ print_line_cursor#22 print_uint::w#0 print_uchar::b#2 print_char_cursor#52 print_uchar::$0 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#36 = print_char_cursor#52 print_char_cursor#54 } { print_char::ch#1 = print_char::ch#3 } } main:3::end:10::print_uint:28::print_uchar:56 [ print_line_cursor#22 print_uchar::b#2 print_char_cursor#52 print_uchar::$0 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#12 = print_char_cursor#52 print_char_cursor#36 } { print_char::ch#1 = print_char::ch#3 } } ) always clobbers reg byte a
Statement [90] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#12 print_uchar::$2 ] ( main:3::end:10::print_uint:28::print_uchar:54 [ print_line_cursor#22 print_uint::w#0 print_char_cursor#12 print_uchar::$2 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#52 = print_char_cursor#54 } { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#12 = print_char_cursor#36 } } main:3::end:10::print_uint:28::print_uchar:56 [ print_line_cursor#22 print_char_cursor#12 print_uchar::$2 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#12 = print_char_cursor#52 print_char_cursor#36 } { print_char::ch#2 = print_char::ch#3 } } ) always clobbers reg byte a
Statement [96] if(utoa_append::value#2>=utoa_append::sub#0) goto utoa_append::@2 [ utoa_append::buffer#0 utoa_append::sub#0 utoa_append::value#2 utoa_append::digit#2 ] ( main:3::print_uint_decimal:16::utoa:44::utoa_append:75 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::buffer#11 utoa_append::buffer#0 utoa_append::sub#0 utoa_append::value#2 utoa_append::digit#2 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } { utoa_append::buffer#0 = utoa::buffer#11 } { utoa_append::value#0 = utoa::value#2 } { utoa_append::sub#0 = utoa::digit_value#0 } { utoa_append::return#0 = utoa_append::value#2 } } ) always clobbers reg byte a
Statement [97] *utoa_append::buffer#0 = DIGITS[utoa_append::digit#2] [ utoa_append::value#2 ] ( main:3::print_uint_decimal:16::utoa:44::utoa_append:75 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::buffer#11 utoa_append::value#2 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } { utoa_append::buffer#0 = utoa::buffer#11 } { utoa_append::value#0 = utoa::value#2 } { utoa_append::sub#0 = utoa::digit_value#0 } { utoa_append::return#0 = utoa_append::value#2 } } ) always clobbers reg byte a reg byte y
Statement [100] utoa_append::value#1 = utoa_append::value#2 - utoa_append::sub#0 [ utoa_append::buffer#0 utoa_append::sub#0 utoa_append::value#1 utoa_append::digit#1 ] ( main:3::print_uint_decimal:16::utoa:44::utoa_append:75 [ last_time main::i#3 print_line_cursor#22 print_char_cursor#54 utoa::digit#2 utoa::buffer#11 utoa_append::buffer#0 utoa_append::sub#0 utoa_append::value#1 utoa_append::digit#1 ] { { print_uint_decimal::w#0 = sum::return#2 utoa::value#0 } { utoa_append::buffer#0 = utoa::buffer#11 } { utoa_append::value#0 = utoa::value#2 } { utoa_append::sub#0 = utoa::digit_value#0 } { utoa_append::return#0 = utoa_append::value#2 } } ) always clobbers reg byte a
Statement [102] *print_char_cursor#36 = print_char::ch#3 [ print_char_cursor#36 ] ( main:3::print_uint_decimal:16::print_str:46::print_char:84 [ last_time main::i#3 print_line_cursor#22 print_str::str#2 print_char_cursor#36 ] { { print_uint_decimal::w#0 = sum::return#2 } { print_char::ch#0 = print_char::ch#3 } { print_char_cursor#1 = print_char_cursor#36 } } main:3::end:10::print_uint:28::print_uchar:54::print_char:89 [ print_line_cursor#22 print_uint::w#0 print_uchar::b#2 print_char_cursor#36 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#36 = print_char_cursor#52 print_char_cursor#54 } { print_char::ch#1 = print_char::ch#3 } } main:3::end:10::print_uint:28::print_uchar:56::print_char:89 [ print_line_cursor#22 print_uchar::b#2 print_char_cursor#36 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#12 = print_char_cursor#52 print_char_cursor#36 } { print_char::ch#1 = print_char::ch#3 } } main:3::end:10::print_uint:28::print_uchar:54::print_char:92 [ print_line_cursor#22 print_uint::w#0 print_char_cursor#36 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#52 = print_char_cursor#54 } { print_char::ch#2 = print_char::ch#3 } { print_char_cursor#12 = print_char_cursor#36 } } main:3::end:10::print_uint:28::print_uchar:56::print_char:92 [ print_line_cursor#22 print_char_cursor#36 ] { { Ticks#1 = print_uint::w#0 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#12 = print_char_cursor#52 print_char_cursor#36 } { print_char::ch#2 = print_char::ch#3 } } ) always clobbers reg byte y
Potential registers zp[2]:48 [ main::i#3 main::i#2 ] : zp[2]:48 ,
Potential registers zp[1]:33 [ sum::page#3 sum::page#2 ] : zp[1]:33 , reg byte x , reg byte y ,
Potential registers zp[2]:29 [ sum::p#5 sum::p#2 ] : zp[2]:29 ,
Potential registers zp[1]:16 [ sum::i#3 sum::i#2 ] : zp[1]:16 , reg byte x , reg byte y ,
Potential registers zp[2]:22 [ sum::s#4 sum::s#3 sum::s#2 ] : zp[2]:22 ,
Potential registers zp[2]:31 [ print_line_cursor#10 print_line_cursor#22 print_line_cursor#0 ] : zp[2]:31 ,
Potential registers zp[1]:17 [ utoa::digit#2 utoa::digit#1 ] : zp[1]:17 , reg byte x ,
Potential registers zp[2]:12 [ utoa::value#2 utoa::value#6 utoa::value#0 utoa::value#1 ] : zp[2]:12 ,
Potential registers zp[1]:24 [ utoa::started#2 utoa::started#4 ] : zp[1]:24 , reg byte x , reg byte y ,
Potential registers zp[2]:10 [ utoa::buffer#11 utoa::buffer#14 utoa::buffer#5 ] : zp[2]:10 ,
Potential registers zp[2]:14 [ print_str::str#2 print_str::str#0 ] : zp[2]:14 ,
Potential registers zp[1]:39 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] : zp[1]:39 , reg byte x ,
Potential registers zp[2]:2 [ utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 ] : zp[2]:2 ,
Potential registers zp[1]:4 [ utoa_append::digit#2 utoa_append::digit#1 ] : zp[1]:4 , reg byte x , reg byte y ,
Potential registers zp[1]:7 [ print_char::ch#3 print_char::ch#0 print_char::ch#1 print_char::ch#2 ] : zp[1]:7 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[2]:8 [ print_char_cursor#36 print_char_cursor#52 print_char_cursor#49 print_char_cursor#12 print_char_cursor#1 print_char_cursor#54 print_char_cursor#73 ] : zp[2]:8 ,
Potential registers zp[2]:52 [ last_time ] : zp[2]:52 ,
Potential registers zp[2]:44 [ sum::return#2 ] : zp[2]:44 ,
Potential registers zp[2]:40 [ print_uint_decimal::w#0 ] : zp[2]:40 ,
Potential registers zp[2]:50 [ Ticks#0 ] : zp[2]:50 ,
Potential registers zp[2]:46 [ Ticks#1 ] : zp[2]:46 ,
Potential registers zp[2]:42 [ print_uint::w#0 ] : zp[2]:42 ,
Potential registers zp[1]:18 [ sum::tmp#1 ] : zp[1]:18 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:34 [ utoa::$11 ] : zp[1]:34 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[2]:35 [ utoa::buffer#4 ] : zp[2]:35 ,
Potential registers zp[1]:19 [ utoa::$10 ] : zp[1]:19 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[2]:27 [ utoa::digit_value#0 ] : zp[2]:27 ,
Potential registers zp[2]:25 [ utoa_append::buffer#0 ] : zp[2]:25 ,
Potential registers zp[2]:5 [ utoa_append::sub#0 ] : zp[2]:5 ,
Potential registers zp[2]:20 [ utoa_append::return#0 ] : zp[2]:20 ,
Potential registers zp[1]:37 [ print_uchar::$0 ] : zp[1]:37 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:38 [ print_uchar::$2 ] : zp[1]:38 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [utoa_append] 25,005,500,003.5: zp[2]:2 [ utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 ] 20,005,000,002.5: zp[1]:4 [ utoa_append::digit#2 utoa_append::digit#1 ] 3,333,500,000.5: zp[2]:5 [ utoa_append::sub#0 ] 2,000,002: zp[2]:20 [ utoa_append::return#0 ] 1,375,000.25: zp[2]:25 [ utoa_append::buffer#0 ]
Uplift Scope [utoa] 3,787,146.79: zp[2]:10 [ utoa::buffer#11 utoa::buffer#14 utoa::buffer#5 ] 3,078,361.36: zp[2]:12 [ utoa::value#2 utoa::value#6 utoa::value#0 utoa::value#1 ] 2,285,716.57: zp[1]:17 [ utoa::digit#2 utoa::digit#1 ] 2,000,002: zp[1]:19 [ utoa::$10 ] 1,500,001.5: zp[1]:24 [ utoa::started#2 utoa::started#4 ] 600,000.6: zp[2]:27 [ utoa::digit_value#0 ] 20,002: zp[1]:34 [ utoa::$11 ] 20,002: zp[2]:35 [ utoa::buffer#4 ]
Uplift Scope [print_char] 13,060,010: zp[1]:7 [ print_char::ch#3 print_char::ch#0 print_char::ch#1 print_char::ch#2 ]
Uplift Scope [] 11,525,246.03: zp[2]:8 [ print_char_cursor#36 print_char_cursor#52 print_char_cursor#49 print_char_cursor#12 print_char_cursor#1 print_char_cursor#54 print_char_cursor#73 ] 251,101.99: zp[2]:31 [ print_line_cursor#10 print_line_cursor#22 print_line_cursor#0 ] 202: zp[2]:46 [ Ticks#1 ] 101: zp[2]:50 [ Ticks#0 ] 21.37: zp[2]:52 [ last_time ]
Uplift Scope [sum] 2,500,002.5: zp[1]:16 [ sum::i#3 sum::i#2 ] 2,000,002: zp[1]:18 [ sum::tmp#1 ] 1,520,027.85: zp[2]:22 [ sum::s#4 sum::s#3 sum::s#2 ] 271,430: zp[2]:29 [ sum::p#5 sum::p#2 ] 237,502.38: zp[1]:33 [ sum::page#3 sum::page#2 ] 202: zp[2]:44 [ sum::return#2 ]
Uplift Scope [print_str] 3,000,003: zp[2]:14 [ print_str::str#2 print_str::str#0 ]
Uplift Scope [print_uchar] 20,002: zp[1]:37 [ print_uchar::$0 ] 20,002: zp[1]:38 [ print_uchar::$2 ] 9,505: zp[1]:39 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Uplift Scope [print_uint_decimal] 1,102: zp[2]:40 [ print_uint_decimal::w#0 ]
Uplift Scope [print_uint] 701: zp[2]:42 [ print_uint::w#0 ]
Uplift Scope [main] 134.67: zp[2]:48 [ main::i#3 main::i#2 ]
Uplift Scope [print_ln]
Uplift Scope [RADIX]
Uplift Scope [MOS6526_CIA]
Uplift Scope [MOS6569_VICII]
Uplift Scope [MOS6581_SID]
Uplift Scope [start]
Uplift Scope [end]
Uplift Scope [__start]
Uplifting [utoa_append] best 142966 combination zp[2]:2 [ utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 ] reg byte x [ utoa_append::digit#2 utoa_append::digit#1 ] zp[2]:5 [ utoa_append::sub#0 ] zp[2]:20 [ utoa_append::return#0 ] zp[2]:25 [ utoa_append::buffer#0 ]
Uplifting [utoa] best 141860 combination zp[2]:10 [ utoa::buffer#11 utoa::buffer#14 utoa::buffer#5 ] zp[2]:12 [ utoa::value#2 utoa::value#6 utoa::value#0 utoa::value#1 ] zp[1]:17 [ utoa::digit#2 utoa::digit#1 ] reg byte a [ utoa::$10 ] reg byte x [ utoa::started#2 utoa::started#4 ] zp[2]:27 [ utoa::digit_value#0 ] reg byte x [ utoa::$11 ] zp[2]:35 [ utoa::buffer#4 ]
Uplifting [print_char] best 141551 combination reg byte a [ print_char::ch#3 print_char::ch#0 print_char::ch#1 print_char::ch#2 ]
Uplifting [] best 141551 combination zp[2]:8 [ print_char_cursor#36 print_char_cursor#52 print_char_cursor#49 print_char_cursor#12 print_char_cursor#1 print_char_cursor#54 print_char_cursor#73 ] zp[2]:31 [ print_line_cursor#10 print_line_cursor#22 print_line_cursor#0 ] zp[2]:46 [ Ticks#1 ] zp[2]:50 [ Ticks#0 ] zp[2]:52 [ last_time ]
Uplifting [sum] best 124651 combination reg byte y [ sum::i#3 sum::i#2 ] reg byte a [ sum::tmp#1 ] zp[2]:22 [ sum::s#4 sum::s#3 sum::s#2 ] zp[2]:29 [ sum::p#5 sum::p#2 ] reg byte x [ sum::page#3 sum::page#2 ] zp[2]:44 [ sum::return#2 ]
Uplifting [print_str] best 124651 combination zp[2]:14 [ print_str::str#2 print_str::str#0 ]
Uplifting [print_uchar] best 124633 combination reg byte a [ print_uchar::$0 ] reg byte x [ print_uchar::$2 ] reg byte x [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Uplifting [print_uint_decimal] best 124633 combination zp[2]:40 [ print_uint_decimal::w#0 ]
Uplifting [print_uint] best 124633 combination zp[2]:42 [ print_uint::w#0 ]
Uplifting [main] best 124633 combination zp[2]:48 [ main::i#3 main::i#2 ]
Uplifting [print_ln] best 124633 combination
Uplifting [RADIX] best 124633 combination
Uplifting [MOS6526_CIA] best 124633 combination
Uplifting [MOS6569_VICII] best 124633 combination
Uplifting [MOS6581_SID] best 124633 combination
Uplifting [start] best 124633 combination
Uplifting [end] best 124633 combination
Uplifting [__start] best 124633 combination
Attempting to uplift remaining variables inzp[1]:17 [ utoa::digit#2 utoa::digit#1 ]
Uplifting [utoa] best 124633 combination zp[1]:17 [ utoa::digit#2 utoa::digit#1 ]
Coalescing zero page register [ zp[2]:22 [ sum::s#4 sum::s#3 sum::s#2 ] ] with [ zp[2]:44 [ sum::return#2 ] ] - score: 1
Coalescing zero page register [ zp[2]:12 [ utoa::value#2 utoa::value#6 utoa::value#0 utoa::value#1 ] ] with [ zp[2]:2 [ utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 ] ] - score: 1
Coalescing zero page register [ zp[2]:12 [ utoa::value#2 utoa::value#6 utoa::value#0 utoa::value#1 utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 ] ] with [ zp[2]:40 [ print_uint_decimal::w#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:12 [ utoa::value#2 utoa::value#6 utoa::value#0 utoa::value#1 utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 print_uint_decimal::w#0 ] ] with [ zp[2]:20 [ utoa_append::return#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:10 [ utoa::buffer#11 utoa::buffer#14 utoa::buffer#5 ] ] with [ zp[2]:35 [ utoa::buffer#4 ] ] - score: 1
Coalescing zero page register [ zp[2]:10 [ utoa::buffer#11 utoa::buffer#14 utoa::buffer#5 utoa::buffer#4 ] ] with [ zp[2]:25 [ utoa_append::buffer#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:46 [ Ticks#1 ] ] with [ zp[2]:42 [ print_uint::w#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:27 [ utoa::digit_value#0 ] ] with [ zp[2]:5 [ utoa_append::sub#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:22 [ sum::s#4 sum::s#3 sum::s#2 sum::return#2 ] ] with [ zp[2]:12 [ utoa::value#2 utoa::value#6 utoa::value#0 utoa::value#1 utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 print_uint_decimal::w#0 utoa_append::return#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:10 [ utoa::buffer#11 utoa::buffer#14 utoa::buffer#5 utoa::buffer#4 utoa_append::buffer#0 ] ] with [ zp[2]:29 [ sum::p#5 sum::p#2 ] ]
Coalescing zero page register [ zp[2]:50 [ Ticks#0 ] ] with [ zp[2]:48 [ main::i#3 main::i#2 ] ]
Coalescing zero page register [ zp[2]:46 [ Ticks#1 print_uint::w#0 ] ] with [ zp[2]:22 [ sum::s#4 sum::s#3 sum::s#2 sum::return#2 utoa::value#2 utoa::value#6 utoa::value#0 utoa::value#1 utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 print_uint_decimal::w#0 utoa_append::return#0 ] ]
Coalescing zero page register [ zp[2]:27 [ utoa::digit_value#0 utoa_append::sub#0 ] ] with [ zp[2]:14 [ print_str::str#2 print_str::str#0 ] ]
Allocated (was zp[2]:46) zp[2]:2 [ Ticks#1 print_uint::w#0 sum::s#4 sum::s#3 sum::s#2 sum::return#2 utoa::value#2 utoa::value#6 utoa::value#0 utoa::value#1 utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 print_uint_decimal::w#0 utoa_append::return#0 ]
Allocated (was zp[2]:27) zp[2]:4 [ utoa::digit_value#0 utoa_append::sub#0 print_str::str#2 print_str::str#0 ]
Allocated (was zp[2]:8) zp[2]:6 [ print_char_cursor#36 print_char_cursor#52 print_char_cursor#49 print_char_cursor#12 print_char_cursor#1 print_char_cursor#54 print_char_cursor#73 ]
Allocated (was zp[2]:10) zp[2]:8 [ utoa::buffer#11 utoa::buffer#14 utoa::buffer#5 utoa::buffer#4 utoa_append::buffer#0 sum::p#5 sum::p#2 ]
Allocated (was zp[1]:17) zp[1]:10 [ utoa::digit#2 utoa::digit#1 ]
Allocated (was zp[2]:31) zp[2]:11 [ print_line_cursor#10 print_line_cursor#22 print_line_cursor#0 ]
Allocated (was zp[2]:50) zp[2]:13 [ Ticks#0 main::i#3 main::i#2 ]
Allocated (was zp[2]:52) zp[2]:15 [ last_time ]
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
/// @file
/// A lightweight library for printing on the C64.
///
/// Printing with this library is done by calling print_ function for each element
// Upstart
// Commodore 64 PRG executable file
.file [name="romsum-kc.prg", type="prg", segments="Program"]
.segmentdef Program [segments="Basic, Code, Data"]
.segmentdef Basic [start=$0801]
.segmentdef Code [start=$80d]
.segmentdef Data [startAfter="Code"]
.segment Basic
:BasicUpstart(__start)
// Global Constants & labels
.label rom = $e000
.label print_screen = $400
.label last_time = $f
.label print_char_cursor = 6
.label print_line_cursor = $b
.label Ticks = $d
.label Ticks_1 = 2
.segment Code
// __start
__start: {
jmp __init1
// __start::__init1
__init1:
// [1] last_time = 0 -- vwuz1=vwuc1
lda #<0
sta.z last_time
lda #>0
sta.z last_time+1
// [2] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1]
__b1_from___init1:
jmp __b1
// __start::@1
__b1:
// [3] call main
// [5] phi from __start::@1 to main [phi:__start::@1->main]
main_from___b1:
jsr main
jmp __breturn
// __start::@return
__breturn:
// [4] return
rts
}
// main
main: {
.label i = $d
// [6] call start
jsr start
// [7] phi from main to main::@1 [phi:main->main::@1]
__b1_from_main:
// [7] phi print_line_cursor#22 = print_screen#0 [phi:main->main::@1#0] -- pbuz1=pbuc1
lda #<print_screen
sta.z print_line_cursor
lda #>print_screen
sta.z print_line_cursor+1
// [7] phi print_char_cursor#54 = print_screen#0 [phi:main->main::@1#1] -- pbuz1=pbuc1
lda #<print_screen
sta.z print_char_cursor
lda #>print_screen
sta.z print_char_cursor+1
// [7] phi main::i#3 = 0 [phi:main->main::@1#2] -- vwuz1=vbuc1
lda #<0
sta.z i
lda #>0
sta.z i+1
jmp __b1
// main::@1
__b1:
// [8] if(main::i#3<6) goto main::@2 -- vwuz1_lt_vbuc1_then_la1
lda.z i+1
bne !+
lda.z i
cmp #6
bcc __b2_from___b1
!:
// [9] phi from main::@1 to main::@3 [phi:main::@1->main::@3]
__b3_from___b1:
jmp __b3
// main::@3
__b3:
// [10] call end
jsr end
jmp __breturn
// main::@return
__breturn:
// [11] return
rts
// [12] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
__b2_from___b1:
jmp __b2
// main::@2
__b2:
// [13] call sum
// [32] phi from main::@2 to sum [phi:main::@2->sum]
sum_from___b2:
jsr sum
// [14] sum::return#2 = sum::s#3
jmp __b4
// main::@4
__b4:
// [15] print_uint_decimal::w#0 = sum::return#2
// [16] call print_uint_decimal
jsr print_uint_decimal
// [17] phi from main::@4 to main::@5 [phi:main::@4->main::@5]
__b5_from___b4:
jmp __b5
// main::@5
__b5:
// [18] call print_ln
// [48] phi from main::@5 to print_ln [phi:main::@5->print_ln]
print_ln_from___b5:
// [48] phi print_char_cursor#49 = print_char_cursor#1 [phi:main::@5->print_ln#0] -- register_copy
jsr print_ln
jmp __b6
// main::@6
__b6:
// [19] main::i#2 = ++ main::i#3 -- vwuz1=_inc_vwuz1
inc.z i
bne !+
inc.z i+1
!:
// [20] print_char_cursor#73 = print_line_cursor#0 -- pbuz1=pbuz2
lda.z print_line_cursor
sta.z print_char_cursor
lda.z print_line_cursor+1
sta.z print_char_cursor+1
// [7] phi from main::@6 to main::@1 [phi:main::@6->main::@1]
__b1_from___b6:
// [7] phi print_line_cursor#22 = print_line_cursor#0 [phi:main::@6->main::@1#0] -- register_copy
// [7] phi print_char_cursor#54 = print_char_cursor#73 [phi:main::@6->main::@1#1] -- register_copy
// [7] phi main::i#3 = main::i#2 [phi:main::@6->main::@1#2] -- register_copy
jmp __b1
}
// start
start: {
.label LAST_TIME = last_time
// asm { jsr$FFDE staLAST_TIME stxLAST_TIME+1 }
jsr $ffde
sta LAST_TIME
stx LAST_TIME+1
jmp __breturn
// start::@return
__breturn:
// [22] return
rts
}
// end
end: {
// [23] Ticks#0 = last_time -- vwuz1=vwuz2
lda.z last_time
sta.z Ticks
lda.z last_time+1
sta.z Ticks+1
// [24] call start
jsr start
jmp __b1
// end::@1
__b1:
// [25] last_time = last_time - Ticks#0 -- vwuz1=vwuz1_minus_vwuz2
lda.z last_time
sec
sbc.z Ticks
sta.z last_time
lda.z last_time+1
sbc.z Ticks+1
sta.z last_time+1
// [26] Ticks#1 = last_time -- vwuz1=vwuz2
lda.z last_time
sta.z Ticks_1
lda.z last_time+1
sta.z Ticks_1+1
// [27] print_uint::w#0 = Ticks#1
// [28] call print_uint
jsr print_uint
// [29] phi from end::@1 to end::@2 [phi:end::@1->end::@2]
__b2_from___b1:
jmp __b2
// end::@2
__b2:
// [30] call print_ln
// [48] phi from end::@2 to print_ln [phi:end::@2->print_ln]
print_ln_from___b2:
// [48] phi print_char_cursor#49 = print_char_cursor#12 [phi:end::@2->print_ln#0] -- register_copy
jsr print_ln
jmp __breturn
// end::@return
__breturn:
// [31] return
rts
}
// sum
sum: {
.label s = 2
.label p = 8
.label return = 2
// [33] phi from sum to sum::@1 [phi:sum->sum::@1]
__b1_from_sum:
// [33] phi sum::p#5 = rom [phi:sum->sum::@1#0] -- pbuz1=pbuc1
lda #<rom
sta.z p
lda #>rom
sta.z p+1
// [33] phi sum::s#3 = 0 [phi:sum->sum::@1#1] -- vwuz1=vbuc1
lda #<0
sta.z s
lda #>0
sta.z s+1
// [33] phi sum::page#3 = 0 [phi:sum->sum::@1#2] -- vbuxx=vbuc1
ldx #0
jmp __b1
/* doing it page-by-page is faster than doing just one huge loop */
// sum::@1
__b1:
// [34] if(sum::page#3<$20) goto sum::@2 -- vbuxx_lt_vbuc1_then_la1
cpx #$20
bcc __b2_from___b1
jmp __breturn
// sum::@return
__breturn:
// [35] return
rts
// [36] phi from sum::@1 to sum::@2 [phi:sum::@1->sum::@2]
__b2_from___b1:
// [36] phi sum::s#4 = sum::s#3 [phi:sum::@1->sum::@2#0] -- register_copy
// [36] phi sum::i#3 = 0 [phi:sum::@1->sum::@2#1] -- vbuyy=vbuc1
ldy #0
jmp __b2
// [36] phi from sum::@2 to sum::@2 [phi:sum::@2->sum::@2]
__b2_from___b2:
// [36] phi sum::s#4 = sum::s#2 [phi:sum::@2->sum::@2#0] -- register_copy
// [36] phi sum::i#3 = sum::i#2 [phi:sum::@2->sum::@2#1] -- register_copy
jmp __b2
// sum::@2
__b2:
// [37] sum::tmp#1 = sum::p#5[sum::i#3] -- vbuaa=pbuz1_derefidx_vbuyy
lda (p),y
// [38] sum::s#2 = sum::s#4 + sum::tmp#1 -- vwuz1=vwuz1_plus_vbuaa
clc
adc.z s
sta.z s
bcc !+
inc.z s+1
!:
// [39] sum::i#2 = ++ sum::i#3 -- vbuyy=_inc_vbuyy
iny
// [40] if(0!=sum::i#2) goto sum::@2 -- 0_neq_vbuyy_then_la1
cpy #0
bne __b2_from___b2
jmp __b3
// sum::@3
__b3:
// [41] sum::p#2 = sum::p#5 + $100 -- pbuz1=pbuz1_plus_vwuc1
lda.z p
clc
adc #<$100
sta.z p
lda.z p+1
adc #>$100
sta.z p+1
// [42] sum::page#2 = ++ sum::page#3 -- vbuxx=_inc_vbuxx
inx
// [33] phi from sum::@3 to sum::@1 [phi:sum::@3->sum::@1]
__b1_from___b3:
// [33] phi sum::p#5 = sum::p#2 [phi:sum::@3->sum::@1#0] -- register_copy
// [33] phi sum::s#3 = sum::s#2 [phi:sum::@3->sum::@1#1] -- register_copy
// [33] phi sum::page#3 = sum::page#2 [phi:sum::@3->sum::@1#2] -- register_copy
jmp __b1
}
// print_uint_decimal
// Print a unsigned int as DECIMAL
// void print_uint_decimal(__zp(2) unsigned int w)
print_uint_decimal: {
.label w = 2
// [43] utoa::value#0 = print_uint_decimal::w#0
// [44] call utoa
// [58] phi from print_uint_decimal to utoa [phi:print_uint_decimal->utoa]
utoa_from_print_uint_decimal:
jsr utoa
// [45] phi from print_uint_decimal to print_uint_decimal::@1 [phi:print_uint_decimal->print_uint_decimal::@1]
__b1_from_print_uint_decimal:
jmp __b1
// print_uint_decimal::@1
__b1:
// [46] call print_str
// [79] phi from print_uint_decimal::@1 to print_str [phi:print_uint_decimal::@1->print_str]
print_str_from___b1:
jsr print_str
jmp __breturn
// print_uint_decimal::@return
__breturn:
// [47] return
rts
}
// print_ln
// Print a newline
print_ln: {
// [49] phi from print_ln print_ln::@1 to print_ln::@1 [phi:print_ln/print_ln::@1->print_ln::@1]
__b1_from_print_ln:
__b1_from___b1:
// [49] phi print_line_cursor#10 = print_line_cursor#22 [phi:print_ln/print_ln::@1->print_ln::@1#0] -- register_copy
jmp __b1
// print_ln::@1
__b1:
// [50] print_line_cursor#0 = print_line_cursor#10 + $28 -- pbuz1=pbuz1_plus_vbuc1
lda #$28
clc
adc.z print_line_cursor
sta.z print_line_cursor
bcc !+
inc.z print_line_cursor+1
!:
// [51] if(print_line_cursor#0<print_char_cursor#49) goto print_ln::@1 -- pbuz1_lt_pbuz2_then_la1
lda.z print_line_cursor+1
cmp.z print_char_cursor+1
bcc __b1_from___b1
bne !+
lda.z print_line_cursor
cmp.z print_char_cursor
bcc __b1_from___b1
!:
jmp __breturn
// print_ln::@return
__breturn:
// [52] return
rts
}
// print_uint
// Print a unsigned int as HEX
// void print_uint(__zp(2) unsigned int w)
print_uint: {
.label w = 2
// [53] print_uchar::b#0 = byte1 print_uint::w#0 -- vbuxx=_byte1_vwuz1
ldx.z w+1
// [54] call print_uchar
// [86] phi from print_uint to print_uchar [phi:print_uint->print_uchar]
print_uchar_from_print_uint:
// [86] phi print_char_cursor#52 = print_char_cursor#54 [phi:print_uint->print_uchar#0] -- register_copy
// [86] phi print_uchar::b#2 = print_uchar::b#0 [phi:print_uint->print_uchar#1] -- register_copy
jsr print_uchar
jmp __b1
// print_uint::@1
__b1:
// [55] print_uchar::b#1 = byte0 print_uint::w#0 -- vbuxx=_byte0_vwuz1
ldx.z w
// [56] call print_uchar
// [86] phi from print_uint::@1 to print_uchar [phi:print_uint::@1->print_uchar]
print_uchar_from___b1:
// [86] phi print_char_cursor#52 = print_char_cursor#12 [phi:print_uint::@1->print_uchar#0] -- register_copy
// [86] phi print_uchar::b#2 = print_uchar::b#1 [phi:print_uint::@1->print_uchar#1] -- register_copy
jsr print_uchar
jmp __breturn
// print_uint::@return
__breturn:
// [57] return
rts
}
// utoa
// Converts unsigned number value to a string representing it in RADIX format.
// If the leading digits are zero they are not included in the string.
// - value : The number to be converted to RADIX
// - buffer : receives the string representing the number and zero-termination.
// - radix : The radix to convert the number to (from the enum RADIX)
// void utoa(__zp(2) unsigned int value, __zp(8) char *buffer, char radix)
utoa: {
.const max_digits = 5
.label value = 2
.label digit_value = 4
.label buffer = 8
.label digit = $a
// [59] phi from utoa to utoa::@1 [phi:utoa->utoa::@1]
__b1_from_utoa:
// [59] phi utoa::buffer#11 = decimal_digits [phi:utoa->utoa::@1#0] -- pbuz1=pbuc1
lda #<decimal_digits
sta.z buffer
lda #>decimal_digits
sta.z buffer+1
// [59] phi utoa::started#2 = 0 [phi:utoa->utoa::@1#1] -- vbuxx=vbuc1
ldx #0
// [59] phi utoa::value#2 = utoa::value#0 [phi:utoa->utoa::@1#2] -- register_copy
// [59] phi utoa::digit#2 = 0 [phi:utoa->utoa::@1#3] -- vbuz1=vbuc1
lda #0
sta.z digit
jmp __b1
// utoa::@1
__b1:
// [60] if(utoa::digit#2<utoa::max_digits#1-1) goto utoa::@2 -- vbuz1_lt_vbuc1_then_la1
lda.z digit
cmp #max_digits-1
bcc __b2
jmp __b3
// utoa::@3
__b3:
// [61] utoa::$11 = (char)utoa::value#2 -- vbuxx=_byte_vwuz1
ldx.z value
// [62] *utoa::buffer#11 = DIGITS[utoa::$11] -- _deref_pbuz1=pbuc1_derefidx_vbuxx
lda DIGITS,x
ldy #0
sta (buffer),y
// [63] utoa::buffer#4 = ++ utoa::buffer#11 -- pbuz1=_inc_pbuz1
inc.z buffer
bne !+
inc.z buffer+1
!:
// [64] *utoa::buffer#4 = 0 -- _deref_pbuz1=vbuc1
lda #0
ldy #0
sta (buffer),y
jmp __breturn
// utoa::@return
__breturn:
// [65] return
rts
// utoa::@2
__b2:
// [66] utoa::$10 = utoa::digit#2 << 1 -- vbuaa=vbuz1_rol_1
lda.z digit
asl
// [67] utoa::digit_value#0 = RADIX_DECIMAL_VALUES[utoa::$10] -- vwuz1=pwuc1_derefidx_vbuaa
tay
lda RADIX_DECIMAL_VALUES,y
sta.z digit_value
lda RADIX_DECIMAL_VALUES+1,y
sta.z digit_value+1
// [68] if(0!=utoa::started#2) goto utoa::@5 -- 0_neq_vbuxx_then_la1
cpx #0
bne __b5
jmp __b7
// utoa::@7
__b7:
// [69] if(utoa::value#2>=utoa::digit_value#0) goto utoa::@5 -- vwuz1_ge_vwuz2_then_la1
lda.z digit_value+1
cmp.z value+1
bne !+
lda.z digit_value
cmp.z value
beq __b5
!:
bcc __b5
// [70] phi from utoa::@7 to utoa::@4 [phi:utoa::@7->utoa::@4]
__b4_from___b7:
// [70] phi utoa::buffer#14 = utoa::buffer#11 [phi:utoa::@7->utoa::@4#0] -- register_copy
// [70] phi utoa::started#4 = utoa::started#2 [phi:utoa::@7->utoa::@4#1] -- register_copy
// [70] phi utoa::value#6 = utoa::value#2 [phi:utoa::@7->utoa::@4#2] -- register_copy
jmp __b4
// utoa::@4
__b4:
// [71] utoa::digit#1 = ++ utoa::digit#2 -- vbuz1=_inc_vbuz1
inc.z digit
// [59] phi from utoa::@4 to utoa::@1 [phi:utoa::@4->utoa::@1]
__b1_from___b4:
// [59] phi utoa::buffer#11 = utoa::buffer#14 [phi:utoa::@4->utoa::@1#0] -- register_copy
// [59] phi utoa::started#2 = utoa::started#4 [phi:utoa::@4->utoa::@1#1] -- register_copy
// [59] phi utoa::value#2 = utoa::value#6 [phi:utoa::@4->utoa::@1#2] -- register_copy
// [59] phi utoa::digit#2 = utoa::digit#1 [phi:utoa::@4->utoa::@1#3] -- register_copy
jmp __b1
// utoa::@5
__b5:
// [72] utoa_append::buffer#0 = utoa::buffer#11
// [73] utoa_append::value#0 = utoa::value#2
// [74] utoa_append::sub#0 = utoa::digit_value#0
// [75] call utoa_append
// [94] phi from utoa::@5 to utoa_append [phi:utoa::@5->utoa_append]
utoa_append_from___b5:
jsr utoa_append
// [76] utoa_append::return#0 = utoa_append::value#2
jmp __b6
// utoa::@6
__b6:
// [77] utoa::value#1 = utoa_append::return#0
// [78] utoa::buffer#5 = ++ utoa::buffer#11 -- pbuz1=_inc_pbuz1
inc.z buffer
bne !+
inc.z buffer+1
!:
// [70] phi from utoa::@6 to utoa::@4 [phi:utoa::@6->utoa::@4]
__b4_from___b6:
// [70] phi utoa::buffer#14 = utoa::buffer#5 [phi:utoa::@6->utoa::@4#0] -- register_copy
// [70] phi utoa::started#4 = 1 [phi:utoa::@6->utoa::@4#1] -- vbuxx=vbuc1
ldx #1
// [70] phi utoa::value#6 = utoa::value#1 [phi:utoa::@6->utoa::@4#2] -- register_copy
jmp __b4
}
// print_str
// Print a zero-terminated string
// void print_str(__zp(4) char *str)
print_str: {
.label str = 4
// [80] phi from print_str to print_str::@1 [phi:print_str->print_str::@1]
__b1_from_print_str:
// [80] phi print_char_cursor#1 = print_char_cursor#54 [phi:print_str->print_str::@1#0] -- register_copy
// [80] phi print_str::str#2 = decimal_digits [phi:print_str->print_str::@1#1] -- pbuz1=pbuc1
lda #<decimal_digits
sta.z str
lda #>decimal_digits
sta.z str+1
jmp __b1
// print_str::@1
__b1:
// [81] if(0!=*print_str::str#2) goto print_str::@2 -- 0_neq__deref_pbuz1_then_la1
ldy #0
lda (str),y
cmp #0
bne __b2
jmp __breturn
// print_str::@return
__breturn:
// [82] return
rts
// print_str::@2
__b2:
// [83] print_char::ch#0 = *print_str::str#2 -- vbuaa=_deref_pbuz1
ldy #0
lda (str),y
// [84] call print_char
// [101] phi from print_str::@2 to print_char [phi:print_str::@2->print_char]
print_char_from___b2:
// [101] phi print_char_cursor#36 = print_char_cursor#1 [phi:print_str::@2->print_char#0] -- register_copy
// [101] phi print_char::ch#3 = print_char::ch#0 [phi:print_str::@2->print_char#1] -- register_copy
jsr print_char
jmp __b3
// print_str::@3
__b3:
// [85] print_str::str#0 = ++ print_str::str#2 -- pbuz1=_inc_pbuz1
inc.z str
bne !+
inc.z str+1
!:
// [80] phi from print_str::@3 to print_str::@1 [phi:print_str::@3->print_str::@1]
__b1_from___b3:
// [80] phi print_char_cursor#1 = print_char_cursor#12 [phi:print_str::@3->print_str::@1#0] -- register_copy
// [80] phi print_str::str#2 = print_str::str#0 [phi:print_str::@3->print_str::@1#1] -- register_copy
jmp __b1
}
// print_uchar
// Print a char as HEX
// void print_uchar(__register(X) char b)
print_uchar: {
// [87] print_uchar::$0 = print_uchar::b#2 >> 4 -- vbuaa=vbuxx_ror_4
txa
lsr
lsr
lsr
lsr
// [88] print_char::ch#1 = DIGITS[print_uchar::$0] -- vbuaa=pbuc1_derefidx_vbuaa
tay
lda DIGITS,y
// [89] call print_char
// Table of hexadecimal digits
// [101] phi from print_uchar to print_char [phi:print_uchar->print_char]
print_char_from_print_uchar:
// [101] phi print_char_cursor#36 = print_char_cursor#52 [phi:print_uchar->print_char#0] -- register_copy
// [101] phi print_char::ch#3 = print_char::ch#1 [phi:print_uchar->print_char#1] -- register_copy
jsr print_char
jmp __b1
// print_uchar::@1
__b1:
// [90] print_uchar::$2 = print_uchar::b#2 & $f -- vbuxx=vbuxx_band_vbuc1
lda #$f
axs #0
// [91] print_char::ch#2 = DIGITS[print_uchar::$2] -- vbuaa=pbuc1_derefidx_vbuxx
lda DIGITS,x
// [92] call print_char
// [101] phi from print_uchar::@1 to print_char [phi:print_uchar::@1->print_char]
print_char_from___b1:
// [101] phi print_char_cursor#36 = print_char_cursor#12 [phi:print_uchar::@1->print_char#0] -- register_copy
// [101] phi print_char::ch#3 = print_char::ch#2 [phi:print_uchar::@1->print_char#1] -- register_copy
jsr print_char
jmp __breturn
// print_uchar::@return
__breturn:
// [93] return
rts
}
// utoa_append
// Used to convert a single digit of an unsigned number value to a string representation
// Counts a single digit up from '0' as long as the value is larger than sub.
// Each time the digit is increased sub is subtracted from value.
// - buffer : pointer to the char that receives the digit
// - value : The value where the digit will be derived from
// - sub : the value of a '1' in the digit. Subtracted continually while the digit is increased.
// (For decimal the subs used are 10000, 1000, 100, 10, 1)
// returns : the value reduced by sub * digit so that it is less than sub.
// __zp(2) unsigned int utoa_append(__zp(8) char *buffer, __zp(2) unsigned int value, __zp(4) unsigned int sub)
utoa_append: {
.label buffer = 8
.label value = 2
.label sub = 4
.label return = 2
// [95] phi from utoa_append to utoa_append::@1 [phi:utoa_append->utoa_append::@1]
__b1_from_utoa_append:
// [95] phi utoa_append::digit#2 = 0 [phi:utoa_append->utoa_append::@1#0] -- vbuxx=vbuc1
ldx #0
// [95] phi utoa_append::value#2 = utoa_append::value#0 [phi:utoa_append->utoa_append::@1#1] -- register_copy
jmp __b1
// utoa_append::@1
__b1:
// [96] if(utoa_append::value#2>=utoa_append::sub#0) goto utoa_append::@2 -- vwuz1_ge_vwuz2_then_la1
lda.z sub+1
cmp.z value+1
bne !+
lda.z sub
cmp.z value
beq __b2
!:
bcc __b2
jmp __b3
// utoa_append::@3
__b3:
// [97] *utoa_append::buffer#0 = DIGITS[utoa_append::digit#2] -- _deref_pbuz1=pbuc1_derefidx_vbuxx
lda DIGITS,x
ldy #0
sta (buffer),y
jmp __breturn
// utoa_append::@return
__breturn:
// [98] return
rts
// utoa_append::@2
__b2:
// [99] utoa_append::digit#1 = ++ utoa_append::digit#2 -- vbuxx=_inc_vbuxx
inx
// [100] utoa_append::value#1 = utoa_append::value#2 - utoa_append::sub#0 -- vwuz1=vwuz1_minus_vwuz2
lda.z value
sec
sbc.z sub
sta.z value
lda.z value+1
sbc.z sub+1
sta.z value+1
// [95] phi from utoa_append::@2 to utoa_append::@1 [phi:utoa_append::@2->utoa_append::@1]
__b1_from___b2:
// [95] phi utoa_append::digit#2 = utoa_append::digit#1 [phi:utoa_append::@2->utoa_append::@1#0] -- register_copy
// [95] phi utoa_append::value#2 = utoa_append::value#1 [phi:utoa_append::@2->utoa_append::@1#1] -- register_copy
jmp __b1
}
// print_char
// Print a single char
// void print_char(__register(A) char ch)
print_char: {
// [102] *print_char_cursor#36 = print_char::ch#3 -- _deref_pbuz1=vbuaa
ldy #0
sta (print_char_cursor),y
// [103] print_char_cursor#12 = ++ print_char_cursor#36 -- pbuz1=_inc_pbuz1
inc.z print_char_cursor
bne !+
inc.z print_char_cursor+1
!:
jmp __breturn
// print_char::@return
__breturn:
// [104] return
rts
}
// File Data
.segment Data
// The digits used for numbers
DIGITS: .text "0123456789abcdef"
// Values of decimal digits
RADIX_DECIMAL_VALUES: .word $2710, $3e8, $64, $a
// Digits used for storing the decimal unsigned int
decimal_digits: .fill 6, 0
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __init1
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b3
Removing instruction jmp __breturn
Removing instruction jmp __b2
Removing instruction jmp __b4
Removing instruction jmp __b5
Removing instruction jmp __b6
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b2
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b2
Removing instruction jmp __b3
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b3
Removing instruction jmp __breturn
Removing instruction jmp __b7
Removing instruction jmp __b4
Removing instruction jmp __b6
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b3
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b3
Removing instruction jmp __breturn
Removing instruction jmp __breturn
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda #>0
Removing instruction lda #>0
Removing instruction lda #>0
Replacing instruction ldx #0 with TAX
Replacing instruction lda #0 with TXA
Replacing instruction ldy #0 with TAY
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Replacing label __b2_from___b1 with __b2
Replacing label __b2_from___b2 with __b2
Replacing label __b1_from___b1 with __b1
Replacing label __b1_from___b1 with __b1
Removing instruction __b1_from___init1:
Removing instruction main_from___b1:
Removing instruction __b3_from___b1:
Removing instruction __b2_from___b1:
Removing instruction sum_from___b2:
Removing instruction __b5_from___b4:
Removing instruction print_ln_from___b5:
Removing instruction __b2_from___b1:
Removing instruction print_ln_from___b2:
Removing instruction __b2_from___b2:
Removing instruction __b1_from_print_uint_decimal:
Removing instruction print_str_from___b1:
Removing instruction __b1_from_print_ln:
Removing instruction __b1_from___b1:
Removing instruction __b4_from___b7:
Removing instruction utoa_append_from___b5:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction __init1:
Removing instruction __b1:
Removing instruction __breturn:
Removing instruction __b1_from_main:
Removing instruction __b3:
Removing instruction __breturn:
Removing instruction __b4:
Removing instruction __b5:
Removing instruction __b6:
Removing instruction __b1_from___b6:
Removing instruction __breturn:
Removing instruction __b1:
Removing instruction __b2:
Removing instruction __breturn:
Removing instruction __b1_from_sum:
Removing instruction __breturn:
Removing instruction __b3:
Removing instruction __b1_from___b3:
Removing instruction utoa_from_print_uint_decimal:
Removing instruction __b1:
Removing instruction __breturn:
Removing instruction __breturn:
Removing instruction print_uchar_from_print_uint:
Removing instruction __b1:
Removing instruction print_uchar_from___b1:
Removing instruction __breturn:
Removing instruction __b1_from_utoa:
Removing instruction __b3:
Removing instruction __breturn:
Removing instruction __b7:
Removing instruction __b1_from___b4:
Removing instruction __b6:
Removing instruction __b4_from___b6:
Removing instruction __b1_from_print_str:
Removing instruction __breturn:
Removing instruction print_char_from___b2:
Removing instruction __b3:
Removing instruction __b1_from___b3:
Removing instruction print_char_from_print_uchar:
Removing instruction __b1:
Removing instruction print_char_from___b1:
Removing instruction __breturn:
Removing instruction __b1_from_utoa_append:
Removing instruction __b3:
Removing instruction __breturn:
Removing instruction __b1_from___b2:
Removing instruction __breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Relabelling long label __b2_from___b1 to __b3
Succesful ASM optimization Pass5RelabelLongLabels
Removing instruction jmp __b2
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda.z digit_value+1
Succesful ASM optimization Pass5UnnecesaryLoadElimination
FINAL SYMBOL TABLE
__constant char DIGITS[] = "0123456789abcdef"z
__constant char RADIX::BINARY = 2
__constant char RADIX::DECIMAL = $a
__constant char RADIX::HEXADECIMAL = $10
__constant char RADIX::OCTAL = 8
__constant unsigned int RADIX_DECIMAL_VALUES[] = { $2710, $3e8, $64, $a }
unsigned int Ticks
unsigned int Ticks#0 // Ticks zp[2]:13 101.0
unsigned int Ticks#1 // Ticks_1 zp[2]:2 202.0
void __start()
__constant char decimal_digits[6] = { fill( 6, 0) }
void end()
__loadstore volatile unsigned int last_time // zp[2]:15 21.368421052631582
int main()
unsigned int main::i
unsigned int main::i#2 // i zp[2]:13 101.0
unsigned int main::i#3 // i zp[2]:13 33.666666666666664
int main::return
void print_char(char ch)
char print_char::ch
char print_char::ch#0 // reg byte a 2000002.0
char print_char::ch#1 // reg byte a 20002.0
char print_char::ch#2 // reg byte a 20002.0
char print_char::ch#3 // reg byte a 1.1020004E7
char *print_char_cursor
char *print_char_cursor#1 // print_char_cursor zp[2]:6 251263.0
char *print_char_cursor#12 // print_char_cursor zp[2]:6 734073.6666666666
char *print_char_cursor#36 // print_char_cursor zp[2]:6 1.05100025E7
char *print_char_cursor#49 // print_char_cursor zp[2]:6 25050.75
char *print_char_cursor#52 // print_char_cursor zp[2]:6 4001.0
char *print_char_cursor#54 // print_char_cursor zp[2]:6 653.1176470588235
char *print_char_cursor#73 // print_char_cursor zp[2]:6 202.0
char *print_line_cursor
char *print_line_cursor#0 // print_line_cursor zp[2]:11 50034.16666666666
char *print_line_cursor#10 // print_line_cursor zp[2]:11 201003.0
char *print_line_cursor#22 // print_line_cursor zp[2]:11 64.82352941176471
void print_ln()
char *print_screen
__constant char *print_screen#0 = (char *) 1024 // print_screen
void print_str(char *str)
char *print_str::str
char *print_str::str#0 // str zp[2]:4 2000002.0
char *print_str::str#2 // str zp[2]:4 1000001.0
void print_uchar(char b)
char print_uchar::$0 // reg byte a 20002.0
char print_uchar::$2 // reg byte x 20002.0
char print_uchar::b
char print_uchar::b#0 // reg byte x 2002.0
char print_uchar::b#1 // reg byte x 2002.0
char print_uchar::b#2 // reg byte x 5501.0
void print_uint(unsigned int w)
unsigned int print_uint::w
unsigned int print_uint::w#0 // w zp[2]:2 701.0
void print_uint_decimal(unsigned int w)
unsigned int print_uint_decimal::w
unsigned int print_uint_decimal::w#0 // w zp[2]:2 1102.0
__constant char * const rom = (char *) 57344
void start()
__constant unsigned int * const start::LAST_TIME = &last_time
unsigned int sum()
char sum::i
char sum::i#2 // reg byte y 1500001.5
char sum::i#3 // reg byte y 1000001.0
char *sum::p
char *sum::p#2 // p zp[2]:8 100001.0
char *sum::p#5 // p zp[2]:8 171428.99999999997
char sum::page
char sum::page#2 // reg byte x 200002.0
char sum::page#3 // reg byte x 37500.375
unsigned int sum::return
unsigned int sum::return#2 // return zp[2]:2 202.0
unsigned int sum::s
unsigned int sum::s#2 // s zp[2]:2 420000.60000000003
unsigned int sum::s#3 // s zp[2]:2 50025.75
unsigned int sum::s#4 // s zp[2]:2 1050001.5
char sum::tmp
char sum::tmp#1 // reg byte a 2000002.0
void utoa(unsigned int value , char *buffer , char radix)
char utoa::$10 // reg byte a 2000002.0
char utoa::$11 // reg byte x 20002.0
char *utoa::buffer
char *utoa::buffer#11 // buffer zp[2]:8 287143.2857142857
char *utoa::buffer#14 // buffer zp[2]:8 1500001.5
char *utoa::buffer#4 // buffer zp[2]:8 20002.0
char *utoa::buffer#5 // buffer zp[2]:8 2000002.0
char utoa::digit
char utoa::digit#1 // digit zp[1]:10 2000002.0
char utoa::digit#2 // digit zp[1]:10 285714.5714285714
unsigned int utoa::digit_value
unsigned int utoa::digit_value#0 // digit_value zp[2]:4 600000.6000000001
unsigned int *utoa::digit_values
char utoa::max_digits
__constant char utoa::max_digits#1 = 5 // max_digits
char utoa::radix
char utoa::started
char utoa::started#2 // reg byte x 500000.5
char utoa::started#4 // reg byte x 1000001.0
unsigned int utoa::value
unsigned int utoa::value#0 // value zp[2]:2 5501.0
unsigned int utoa::value#1 // value zp[2]:2 1000001.0
unsigned int utoa::value#2 // value zp[2]:2 572857.857142857
unsigned int utoa::value#6 // value zp[2]:2 1500001.5
unsigned int utoa_append(char *buffer , unsigned int value , unsigned int sub)
char *utoa_append::buffer
char *utoa_append::buffer#0 // buffer zp[2]:8 1375000.25
char utoa_append::digit
char utoa_append::digit#1 // reg byte x 1.0000000001E10
char utoa_append::digit#2 // reg byte x 1.00050000015E10
unsigned int utoa_append::return
unsigned int utoa_append::return#0 // return zp[2]:2 2000002.0
unsigned int utoa_append::sub
unsigned int utoa_append::sub#0 // sub zp[2]:4 3.3335000005E9
unsigned int utoa_append::value
unsigned int utoa_append::value#0 // value zp[2]:2 3666667.333333333
unsigned int utoa_append::value#1 // value zp[2]:2 2.0000000002E10
unsigned int utoa_append::value#2 // value zp[2]:2 5.001833334166666E9
reg byte x [ sum::page#3 sum::page#2 ]
reg byte y [ sum::i#3 sum::i#2 ]
zp[2]:11 [ print_line_cursor#10 print_line_cursor#22 print_line_cursor#0 ]
zp[1]:10 [ utoa::digit#2 utoa::digit#1 ]
reg byte x [ utoa::started#2 utoa::started#4 ]
zp[2]:8 [ utoa::buffer#11 utoa::buffer#14 utoa::buffer#5 utoa::buffer#4 utoa_append::buffer#0 sum::p#5 sum::p#2 ]
reg byte x [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
reg byte x [ utoa_append::digit#2 utoa_append::digit#1 ]
reg byte a [ print_char::ch#3 print_char::ch#0 print_char::ch#1 print_char::ch#2 ]
zp[2]:6 [ print_char_cursor#36 print_char_cursor#52 print_char_cursor#49 print_char_cursor#12 print_char_cursor#1 print_char_cursor#54 print_char_cursor#73 ]
zp[2]:15 [ last_time ]
zp[2]:13 [ Ticks#0 main::i#3 main::i#2 ]
zp[2]:2 [ Ticks#1 print_uint::w#0 sum::s#4 sum::s#3 sum::s#2 sum::return#2 utoa::value#2 utoa::value#6 utoa::value#0 utoa::value#1 utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 print_uint_decimal::w#0 utoa_append::return#0 ]
reg byte a [ sum::tmp#1 ]
reg byte x [ utoa::$11 ]
reg byte a [ utoa::$10 ]
zp[2]:4 [ utoa::digit_value#0 utoa_append::sub#0 print_str::str#2 print_str::str#0 ]
reg byte a [ print_uchar::$0 ]
reg byte x [ print_uchar::$2 ]
FINAL ASSEMBLER
Score: 99334
// File Comments
/// @file
/// A lightweight library for printing on the C64.
///
/// Printing with this library is done by calling print_ function for each element
// Upstart
// Commodore 64 PRG executable file
.file [name="romsum-kc.prg", type="prg", segments="Program"]
.segmentdef Program [segments="Basic, Code, Data"]
.segmentdef Basic [start=$0801]
.segmentdef Code [start=$80d]
.segmentdef Data [startAfter="Code"]
.segment Basic
:BasicUpstart(__start)
// Global Constants & labels
.label rom = $e000
.label print_screen = $400
.label last_time = $f
.label print_char_cursor = 6
.label print_line_cursor = $b
.label Ticks = $d
.label Ticks_1 = 2
.segment Code
// __start
__start: {
// __start::__init1
// unsigned int last_time
// [1] last_time = 0 -- vwuz1=vwuc1
lda #<0
sta.z last_time
sta.z last_time+1
// [2] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1]
// __start::@1
// [3] call main
// [5] phi from __start::@1 to main [phi:__start::@1->main]
jsr main
// __start::@return
// [4] return
rts
}
// main
main: {
.label i = $d
// start()
// [6] call start
jsr start
// [7] phi from main to main::@1 [phi:main->main::@1]
// [7] phi print_line_cursor#22 = print_screen#0 [phi:main->main::@1#0] -- pbuz1=pbuc1
lda #<print_screen
sta.z print_line_cursor
lda #>print_screen
sta.z print_line_cursor+1
// [7] phi print_char_cursor#54 = print_screen#0 [phi:main->main::@1#1] -- pbuz1=pbuc1
lda #<print_screen
sta.z print_char_cursor
lda #>print_screen
sta.z print_char_cursor+1
// [7] phi main::i#3 = 0 [phi:main->main::@1#2] -- vwuz1=vbuc1
lda #<0
sta.z i
sta.z i+1
// main::@1
__b1:
// for(i=0;i<6;i++)
// [8] if(main::i#3<6) goto main::@2 -- vwuz1_lt_vbuc1_then_la1
lda.z i+1
bne !+
lda.z i
cmp #6
bcc __b2
!:
// [9] phi from main::@1 to main::@3 [phi:main::@1->main::@3]
// main::@3
// end()
// [10] call end
jsr end
// main::@return
// }
// [11] return
rts
// [12] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
// main::@2
__b2:
// sum()
// [13] call sum
// [32] phi from main::@2 to sum [phi:main::@2->sum]
jsr sum
// sum()
// [14] sum::return#2 = sum::s#3
// main::@4
// print_uint_decimal(sum())
// [15] print_uint_decimal::w#0 = sum::return#2
// [16] call print_uint_decimal
jsr print_uint_decimal
// [17] phi from main::@4 to main::@5 [phi:main::@4->main::@5]
// main::@5
// print_ln()
// [18] call print_ln
// [48] phi from main::@5 to print_ln [phi:main::@5->print_ln]
// [48] phi print_char_cursor#49 = print_char_cursor#1 [phi:main::@5->print_ln#0] -- register_copy
jsr print_ln
// main::@6
// for(i=0;i<6;i++)
// [19] main::i#2 = ++ main::i#3 -- vwuz1=_inc_vwuz1
inc.z i
bne !+
inc.z i+1
!:
// [20] print_char_cursor#73 = print_line_cursor#0 -- pbuz1=pbuz2
lda.z print_line_cursor
sta.z print_char_cursor
lda.z print_line_cursor+1
sta.z print_char_cursor+1
// [7] phi from main::@6 to main::@1 [phi:main::@6->main::@1]
// [7] phi print_line_cursor#22 = print_line_cursor#0 [phi:main::@6->main::@1#0] -- register_copy
// [7] phi print_char_cursor#54 = print_char_cursor#73 [phi:main::@6->main::@1#1] -- register_copy
// [7] phi main::i#3 = main::i#2 [phi:main::@6->main::@1#2] -- register_copy
jmp __b1
}
// start
start: {
.label LAST_TIME = last_time
// asm
// asm { jsr$FFDE staLAST_TIME stxLAST_TIME+1 }
jsr $ffde
sta LAST_TIME
stx LAST_TIME+1
// start::@return
// }
// [22] return
rts
}
// end
end: {
// Ticks = last_time
// [23] Ticks#0 = last_time -- vwuz1=vwuz2
lda.z last_time
sta.z Ticks
lda.z last_time+1
sta.z Ticks+1
// start()
// [24] call start
jsr start
// end::@1
// last_time -= Ticks
// [25] last_time = last_time - Ticks#0 -- vwuz1=vwuz1_minus_vwuz2
lda.z last_time
sec
sbc.z Ticks
sta.z last_time
lda.z last_time+1
sbc.z Ticks+1
sta.z last_time+1
// Ticks = last_time
// [26] Ticks#1 = last_time -- vwuz1=vwuz2
lda.z last_time
sta.z Ticks_1
lda.z last_time+1
sta.z Ticks_1+1
// print_uint(Ticks)
// [27] print_uint::w#0 = Ticks#1
// [28] call print_uint
jsr print_uint
// [29] phi from end::@1 to end::@2 [phi:end::@1->end::@2]
// end::@2
// print_ln()
// [30] call print_ln
// [48] phi from end::@2 to print_ln [phi:end::@2->print_ln]
// [48] phi print_char_cursor#49 = print_char_cursor#12 [phi:end::@2->print_ln#0] -- register_copy
jsr print_ln
// end::@return
// }
// [31] return
rts
}
// sum
sum: {
.label s = 2
.label p = 8
.label return = 2
// [33] phi from sum to sum::@1 [phi:sum->sum::@1]
// [33] phi sum::p#5 = rom [phi:sum->sum::@1#0] -- pbuz1=pbuc1
lda #<rom
sta.z p
lda #>rom
sta.z p+1
// [33] phi sum::s#3 = 0 [phi:sum->sum::@1#1] -- vwuz1=vbuc1
lda #<0
sta.z s
sta.z s+1
// [33] phi sum::page#3 = 0 [phi:sum->sum::@1#2] -- vbuxx=vbuc1
tax
/* doing it page-by-page is faster than doing just one huge loop */
// sum::@1
__b1:
// for (page = 0; page < 0x20; page++)
// [34] if(sum::page#3<$20) goto sum::@2 -- vbuxx_lt_vbuc1_then_la1
cpx #$20
bcc __b3
// sum::@return
// }
// [35] return
rts
// [36] phi from sum::@1 to sum::@2 [phi:sum::@1->sum::@2]
__b3:
// [36] phi sum::s#4 = sum::s#3 [phi:sum::@1->sum::@2#0] -- register_copy
// [36] phi sum::i#3 = 0 [phi:sum::@1->sum::@2#1] -- vbuyy=vbuc1
ldy #0
// [36] phi from sum::@2 to sum::@2 [phi:sum::@2->sum::@2]
// [36] phi sum::s#4 = sum::s#2 [phi:sum::@2->sum::@2#0] -- register_copy
// [36] phi sum::i#3 = sum::i#2 [phi:sum::@2->sum::@2#1] -- register_copy
// sum::@2
__b2:
// tmp = p[i]
// [37] sum::tmp#1 = sum::p#5[sum::i#3] -- vbuaa=pbuz1_derefidx_vbuyy
lda (p),y
// s += tmp
// [38] sum::s#2 = sum::s#4 + sum::tmp#1 -- vwuz1=vwuz1_plus_vbuaa
clc
adc.z s
sta.z s
bcc !+
inc.z s+1
!:
// i++;
// [39] sum::i#2 = ++ sum::i#3 -- vbuyy=_inc_vbuyy
iny
// while (i)
// [40] if(0!=sum::i#2) goto sum::@2 -- 0_neq_vbuyy_then_la1
cpy #0
bne __b2
// sum::@3
// p += 0x100
// [41] sum::p#2 = sum::p#5 + $100 -- pbuz1=pbuz1_plus_vwuc1
lda.z p
clc
adc #<$100
sta.z p
lda.z p+1
adc #>$100
sta.z p+1
// for (page = 0; page < 0x20; page++)
// [42] sum::page#2 = ++ sum::page#3 -- vbuxx=_inc_vbuxx
inx
// [33] phi from sum::@3 to sum::@1 [phi:sum::@3->sum::@1]
// [33] phi sum::p#5 = sum::p#2 [phi:sum::@3->sum::@1#0] -- register_copy
// [33] phi sum::s#3 = sum::s#2 [phi:sum::@3->sum::@1#1] -- register_copy
// [33] phi sum::page#3 = sum::page#2 [phi:sum::@3->sum::@1#2] -- register_copy
jmp __b1
}
// print_uint_decimal
// Print a unsigned int as DECIMAL
// void print_uint_decimal(__zp(2) unsigned int w)
print_uint_decimal: {
.label w = 2
// utoa(w, decimal_digits, DECIMAL)
// [43] utoa::value#0 = print_uint_decimal::w#0
// [44] call utoa
// [58] phi from print_uint_decimal to utoa [phi:print_uint_decimal->utoa]
jsr utoa
// [45] phi from print_uint_decimal to print_uint_decimal::@1 [phi:print_uint_decimal->print_uint_decimal::@1]
// print_uint_decimal::@1
// print_str(decimal_digits)
// [46] call print_str
// [79] phi from print_uint_decimal::@1 to print_str [phi:print_uint_decimal::@1->print_str]
jsr print_str
// print_uint_decimal::@return
// }
// [47] return
rts
}
// print_ln
// Print a newline
print_ln: {
// [49] phi from print_ln print_ln::@1 to print_ln::@1 [phi:print_ln/print_ln::@1->print_ln::@1]
// [49] phi print_line_cursor#10 = print_line_cursor#22 [phi:print_ln/print_ln::@1->print_ln::@1#0] -- register_copy
// print_ln::@1
__b1:
// print_line_cursor + 0x28
// [50] print_line_cursor#0 = print_line_cursor#10 + $28 -- pbuz1=pbuz1_plus_vbuc1
lda #$28
clc
adc.z print_line_cursor
sta.z print_line_cursor
bcc !+
inc.z print_line_cursor+1
!:
// while (print_line_cursor<print_char_cursor)
// [51] if(print_line_cursor#0<print_char_cursor#49) goto print_ln::@1 -- pbuz1_lt_pbuz2_then_la1
lda.z print_line_cursor+1
cmp.z print_char_cursor+1
bcc __b1
bne !+
lda.z print_line_cursor
cmp.z print_char_cursor
bcc __b1
!:
// print_ln::@return
// }
// [52] return
rts
}
// print_uint
// Print a unsigned int as HEX
// void print_uint(__zp(2) unsigned int w)
print_uint: {
.label w = 2
// print_uchar(BYTE1(w))
// [53] print_uchar::b#0 = byte1 print_uint::w#0 -- vbuxx=_byte1_vwuz1
ldx.z w+1
// [54] call print_uchar
// [86] phi from print_uint to print_uchar [phi:print_uint->print_uchar]
// [86] phi print_char_cursor#52 = print_char_cursor#54 [phi:print_uint->print_uchar#0] -- register_copy
// [86] phi print_uchar::b#2 = print_uchar::b#0 [phi:print_uint->print_uchar#1] -- register_copy
jsr print_uchar
// print_uint::@1
// print_uchar(BYTE0(w))
// [55] print_uchar::b#1 = byte0 print_uint::w#0 -- vbuxx=_byte0_vwuz1
ldx.z w
// [56] call print_uchar
// [86] phi from print_uint::@1 to print_uchar [phi:print_uint::@1->print_uchar]
// [86] phi print_char_cursor#52 = print_char_cursor#12 [phi:print_uint::@1->print_uchar#0] -- register_copy
// [86] phi print_uchar::b#2 = print_uchar::b#1 [phi:print_uint::@1->print_uchar#1] -- register_copy
jsr print_uchar
// print_uint::@return
// }
// [57] return
rts
}
// utoa
// Converts unsigned number value to a string representing it in RADIX format.
// If the leading digits are zero they are not included in the string.
// - value : The number to be converted to RADIX
// - buffer : receives the string representing the number and zero-termination.
// - radix : The radix to convert the number to (from the enum RADIX)
// void utoa(__zp(2) unsigned int value, __zp(8) char *buffer, char radix)
utoa: {
.const max_digits = 5
.label value = 2
.label digit_value = 4
.label buffer = 8
.label digit = $a
// [59] phi from utoa to utoa::@1 [phi:utoa->utoa::@1]
// [59] phi utoa::buffer#11 = decimal_digits [phi:utoa->utoa::@1#0] -- pbuz1=pbuc1
lda #<decimal_digits
sta.z buffer
lda #>decimal_digits
sta.z buffer+1
// [59] phi utoa::started#2 = 0 [phi:utoa->utoa::@1#1] -- vbuxx=vbuc1
ldx #0
// [59] phi utoa::value#2 = utoa::value#0 [phi:utoa->utoa::@1#2] -- register_copy
// [59] phi utoa::digit#2 = 0 [phi:utoa->utoa::@1#3] -- vbuz1=vbuc1
txa
sta.z digit
// utoa::@1
__b1:
// for( char digit=0; digit<max_digits-1; digit++ )
// [60] if(utoa::digit#2<utoa::max_digits#1-1) goto utoa::@2 -- vbuz1_lt_vbuc1_then_la1
lda.z digit
cmp #max_digits-1
bcc __b2
// utoa::@3
// *buffer++ = DIGITS[(char)value]
// [61] utoa::$11 = (char)utoa::value#2 -- vbuxx=_byte_vwuz1
ldx.z value
// [62] *utoa::buffer#11 = DIGITS[utoa::$11] -- _deref_pbuz1=pbuc1_derefidx_vbuxx
lda DIGITS,x
ldy #0
sta (buffer),y
// *buffer++ = DIGITS[(char)value];
// [63] utoa::buffer#4 = ++ utoa::buffer#11 -- pbuz1=_inc_pbuz1
inc.z buffer
bne !+
inc.z buffer+1
!:
// *buffer = 0
// [64] *utoa::buffer#4 = 0 -- _deref_pbuz1=vbuc1
lda #0
tay
sta (buffer),y
// utoa::@return
// }
// [65] return
rts
// utoa::@2
__b2:
// unsigned int digit_value = digit_values[digit]
// [66] utoa::$10 = utoa::digit#2 << 1 -- vbuaa=vbuz1_rol_1
lda.z digit
asl
// [67] utoa::digit_value#0 = RADIX_DECIMAL_VALUES[utoa::$10] -- vwuz1=pwuc1_derefidx_vbuaa
tay
lda RADIX_DECIMAL_VALUES,y
sta.z digit_value
lda RADIX_DECIMAL_VALUES+1,y
sta.z digit_value+1
// if (started || value >= digit_value)
// [68] if(0!=utoa::started#2) goto utoa::@5 -- 0_neq_vbuxx_then_la1
cpx #0
bne __b5
// utoa::@7
// [69] if(utoa::value#2>=utoa::digit_value#0) goto utoa::@5 -- vwuz1_ge_vwuz2_then_la1
cmp.z value+1
bne !+
lda.z digit_value
cmp.z value
beq __b5
!:
bcc __b5
// [70] phi from utoa::@7 to utoa::@4 [phi:utoa::@7->utoa::@4]
// [70] phi utoa::buffer#14 = utoa::buffer#11 [phi:utoa::@7->utoa::@4#0] -- register_copy
// [70] phi utoa::started#4 = utoa::started#2 [phi:utoa::@7->utoa::@4#1] -- register_copy
// [70] phi utoa::value#6 = utoa::value#2 [phi:utoa::@7->utoa::@4#2] -- register_copy
// utoa::@4
__b4:
// for( char digit=0; digit<max_digits-1; digit++ )
// [71] utoa::digit#1 = ++ utoa::digit#2 -- vbuz1=_inc_vbuz1
inc.z digit
// [59] phi from utoa::@4 to utoa::@1 [phi:utoa::@4->utoa::@1]
// [59] phi utoa::buffer#11 = utoa::buffer#14 [phi:utoa::@4->utoa::@1#0] -- register_copy
// [59] phi utoa::started#2 = utoa::started#4 [phi:utoa::@4->utoa::@1#1] -- register_copy
// [59] phi utoa::value#2 = utoa::value#6 [phi:utoa::@4->utoa::@1#2] -- register_copy
// [59] phi utoa::digit#2 = utoa::digit#1 [phi:utoa::@4->utoa::@1#3] -- register_copy
jmp __b1
// utoa::@5
__b5:
// utoa_append(buffer++, value, digit_value)
// [72] utoa_append::buffer#0 = utoa::buffer#11
// [73] utoa_append::value#0 = utoa::value#2
// [74] utoa_append::sub#0 = utoa::digit_value#0
// [75] call utoa_append
// [94] phi from utoa::@5 to utoa_append [phi:utoa::@5->utoa_append]
jsr utoa_append
// utoa_append(buffer++, value, digit_value)
// [76] utoa_append::return#0 = utoa_append::value#2
// utoa::@6
// value = utoa_append(buffer++, value, digit_value)
// [77] utoa::value#1 = utoa_append::return#0
// value = utoa_append(buffer++, value, digit_value);
// [78] utoa::buffer#5 = ++ utoa::buffer#11 -- pbuz1=_inc_pbuz1
inc.z buffer
bne !+
inc.z buffer+1
!:
// [70] phi from utoa::@6 to utoa::@4 [phi:utoa::@6->utoa::@4]
// [70] phi utoa::buffer#14 = utoa::buffer#5 [phi:utoa::@6->utoa::@4#0] -- register_copy
// [70] phi utoa::started#4 = 1 [phi:utoa::@6->utoa::@4#1] -- vbuxx=vbuc1
ldx #1
// [70] phi utoa::value#6 = utoa::value#1 [phi:utoa::@6->utoa::@4#2] -- register_copy
jmp __b4
}
// print_str
// Print a zero-terminated string
// void print_str(__zp(4) char *str)
print_str: {
.label str = 4
// [80] phi from print_str to print_str::@1 [phi:print_str->print_str::@1]
// [80] phi print_char_cursor#1 = print_char_cursor#54 [phi:print_str->print_str::@1#0] -- register_copy
// [80] phi print_str::str#2 = decimal_digits [phi:print_str->print_str::@1#1] -- pbuz1=pbuc1
lda #<decimal_digits
sta.z str
lda #>decimal_digits
sta.z str+1
// print_str::@1
__b1:
// while(*str)
// [81] if(0!=*print_str::str#2) goto print_str::@2 -- 0_neq__deref_pbuz1_then_la1
ldy #0
lda (str),y
cmp #0
bne __b2
// print_str::@return
// }
// [82] return
rts
// print_str::@2
__b2:
// print_char(*(str++))
// [83] print_char::ch#0 = *print_str::str#2 -- vbuaa=_deref_pbuz1
ldy #0
lda (str),y
// [84] call print_char
// [101] phi from print_str::@2 to print_char [phi:print_str::@2->print_char]
// [101] phi print_char_cursor#36 = print_char_cursor#1 [phi:print_str::@2->print_char#0] -- register_copy
// [101] phi print_char::ch#3 = print_char::ch#0 [phi:print_str::@2->print_char#1] -- register_copy
jsr print_char
// print_str::@3
// print_char(*(str++));
// [85] print_str::str#0 = ++ print_str::str#2 -- pbuz1=_inc_pbuz1
inc.z str
bne !+
inc.z str+1
!:
// [80] phi from print_str::@3 to print_str::@1 [phi:print_str::@3->print_str::@1]
// [80] phi print_char_cursor#1 = print_char_cursor#12 [phi:print_str::@3->print_str::@1#0] -- register_copy
// [80] phi print_str::str#2 = print_str::str#0 [phi:print_str::@3->print_str::@1#1] -- register_copy
jmp __b1
}
// print_uchar
// Print a char as HEX
// void print_uchar(__register(X) char b)
print_uchar: {
// b>>4
// [87] print_uchar::$0 = print_uchar::b#2 >> 4 -- vbuaa=vbuxx_ror_4
txa
lsr
lsr
lsr
lsr
// print_char(print_hextab[b>>4])
// [88] print_char::ch#1 = DIGITS[print_uchar::$0] -- vbuaa=pbuc1_derefidx_vbuaa
tay
lda DIGITS,y
// [89] call print_char
// Table of hexadecimal digits
// [101] phi from print_uchar to print_char [phi:print_uchar->print_char]
// [101] phi print_char_cursor#36 = print_char_cursor#52 [phi:print_uchar->print_char#0] -- register_copy
// [101] phi print_char::ch#3 = print_char::ch#1 [phi:print_uchar->print_char#1] -- register_copy
jsr print_char
// print_uchar::@1
// b&0xf
// [90] print_uchar::$2 = print_uchar::b#2 & $f -- vbuxx=vbuxx_band_vbuc1
lda #$f
axs #0
// print_char(print_hextab[b&0xf])
// [91] print_char::ch#2 = DIGITS[print_uchar::$2] -- vbuaa=pbuc1_derefidx_vbuxx
lda DIGITS,x
// [92] call print_char
// [101] phi from print_uchar::@1 to print_char [phi:print_uchar::@1->print_char]
// [101] phi print_char_cursor#36 = print_char_cursor#12 [phi:print_uchar::@1->print_char#0] -- register_copy
// [101] phi print_char::ch#3 = print_char::ch#2 [phi:print_uchar::@1->print_char#1] -- register_copy
jsr print_char
// print_uchar::@return
// }
// [93] return
rts
}
// utoa_append
// Used to convert a single digit of an unsigned number value to a string representation
// Counts a single digit up from '0' as long as the value is larger than sub.
// Each time the digit is increased sub is subtracted from value.
// - buffer : pointer to the char that receives the digit
// - value : The value where the digit will be derived from
// - sub : the value of a '1' in the digit. Subtracted continually while the digit is increased.
// (For decimal the subs used are 10000, 1000, 100, 10, 1)
// returns : the value reduced by sub * digit so that it is less than sub.
// __zp(2) unsigned int utoa_append(__zp(8) char *buffer, __zp(2) unsigned int value, __zp(4) unsigned int sub)
utoa_append: {
.label buffer = 8
.label value = 2
.label sub = 4
.label return = 2
// [95] phi from utoa_append to utoa_append::@1 [phi:utoa_append->utoa_append::@1]
// [95] phi utoa_append::digit#2 = 0 [phi:utoa_append->utoa_append::@1#0] -- vbuxx=vbuc1
ldx #0
// [95] phi utoa_append::value#2 = utoa_append::value#0 [phi:utoa_append->utoa_append::@1#1] -- register_copy
// utoa_append::@1
__b1:
// while (value >= sub)
// [96] if(utoa_append::value#2>=utoa_append::sub#0) goto utoa_append::@2 -- vwuz1_ge_vwuz2_then_la1
lda.z sub+1
cmp.z value+1
bne !+
lda.z sub
cmp.z value
beq __b2
!:
bcc __b2
// utoa_append::@3
// *buffer = DIGITS[digit]
// [97] *utoa_append::buffer#0 = DIGITS[utoa_append::digit#2] -- _deref_pbuz1=pbuc1_derefidx_vbuxx
lda DIGITS,x
ldy #0
sta (buffer),y
// utoa_append::@return
// }
// [98] return
rts
// utoa_append::@2
__b2:
// digit++;
// [99] utoa_append::digit#1 = ++ utoa_append::digit#2 -- vbuxx=_inc_vbuxx
inx
// value -= sub
// [100] utoa_append::value#1 = utoa_append::value#2 - utoa_append::sub#0 -- vwuz1=vwuz1_minus_vwuz2
lda.z value
sec
sbc.z sub
sta.z value
lda.z value+1
sbc.z sub+1
sta.z value+1
// [95] phi from utoa_append::@2 to utoa_append::@1 [phi:utoa_append::@2->utoa_append::@1]
// [95] phi utoa_append::digit#2 = utoa_append::digit#1 [phi:utoa_append::@2->utoa_append::@1#0] -- register_copy
// [95] phi utoa_append::value#2 = utoa_append::value#1 [phi:utoa_append::@2->utoa_append::@1#1] -- register_copy
jmp __b1
}
// print_char
// Print a single char
// void print_char(__register(A) char ch)
print_char: {
// *(print_char_cursor++) = ch
// [102] *print_char_cursor#36 = print_char::ch#3 -- _deref_pbuz1=vbuaa
ldy #0
sta (print_char_cursor),y
// *(print_char_cursor++) = ch;
// [103] print_char_cursor#12 = ++ print_char_cursor#36 -- pbuz1=_inc_pbuz1
inc.z print_char_cursor
bne !+
inc.z print_char_cursor+1
!:
// print_char::@return
// }
// [104] return
rts
}
// File Data
.segment Data
// The digits used for numbers
DIGITS: .text "0123456789abcdef"
// Values of decimal digits
RADIX_DECIMAL_VALUES: .word $2710, $3e8, $64, $a
// Digits used for storing the decimal unsigned int
decimal_digits: .fill 6, 0