1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-09-08 17:54:40 +00:00
kickc/src/test/ref/min-fmul-16.log

3513 lines
162 KiB
Plaintext

Fixing pointer addition (word*~) bsearch16u::$7 ← (word*) bsearch16u::items + (byte~) bsearch16u::$6
Fixing pointer addition (word*~) bsearch16u::$15 ← (word*) bsearch16u::pivot + (number) 1
Fixing pointer addition (word*~) bsearch16u::$1 ← (word*) bsearch16u::items - (number) 1
Fixing pointer array-indexing *((word*) utoa::digit_values + (byte) utoa::digit)
Fixing pointer array-indexing *((dword*) ultoa::digit_values + (byte) ultoa::digit)
Warning! Adding boolean cast to non-boolean condition *((byte*) strcpy::src)
Warning! Adding boolean cast to non-boolean condition *((byte*) print_str_lines::str)
Warning! Adding boolean cast to non-boolean condition (byte) print_str_lines::ch
Warning! Adding boolean cast to non-boolean condition *((byte*) print_str::str)
Warning! Adding boolean cast to non-boolean condition *((byte*) print_str_at::str)
Warning! Adding boolean cast to non-boolean sub-expression (byte) print_str_lines::ch
Identified constant variable (byte*) HEAP_TOP
Identified constant variable (byte*) RASTER
Identified constant variable (byte*) BORDERCOL
Identified constant variable (byte*) SCREEN
Identified constant variable (word) main::a
Identified constant variable (word) main::b
Culled Empty Block (label) @1
Culled Empty Block (label) @2
Culled Empty Block (label) @3
Culled Empty Block (label) @4
Culled Empty Block (label) @5
Culled Empty Block (label) @6
Culled Empty Block (label) @7
Culled Empty Block (label) @8
Culled Empty Block (label) @9
Culled Empty Block (label) @10
Culled Empty Block (label) @11
Culled Empty Block (label) @13
Culled Empty Block (label) @14
Culled Empty Block (label) @15
Culled Empty Block (label) @16
Culled Empty Block (label) @17
Culled Empty Block (label) @18
Culled Empty Block (label) @19
Culled Empty Block (label) @20
Culled Empty Block (label) @21
Culled Empty Block (label) @22
Culled Empty Block (label) @23
Culled Empty Block (label) @24
Culled Empty Block (label) @25
Culled Empty Block (label) @26
Culled Empty Block (label) @27
Culled Empty Block (label) @28
Culled Empty Block (label) @30
Culled Empty Block (label) @31
Culled Empty Block (label) @32
Culled Empty Block (label) @33
Culled Empty Block (label) @34
Culled Empty Block (label) @35
Culled Empty Block (label) main::@2
Culled Empty Block (label) main::@11
Culled Empty Block (label) main::@3
Culled Empty Block (label) main::@12
Culled Empty Block (label) main::@5
Culled Empty Block (label) main::@7
Culled Empty Block (label) main::@8
Culled Empty Block (label) main::@9
Culled Empty Block (label) main::@10
Culled Empty Block (label) mulf_init::@5
Culled Empty Block (label) mulf_init::@6
Culled Empty Block (label) mulf_init::@8
Culled Empty Block (label) mulf_init::@13
Culled Empty Block (label) mulf_init::@14
Culled Empty Block (label) mulf_init::@16
Culled Empty Block (label) @38
Culled Empty Block (label) mulf16u::@1
CONTROL FLOW GRAPH SSA
@begin: scope:[] from
to:@12
@12: scope:[] from @begin
(byte*) print_screen#0 ← ((byte*)) (number) $400
(byte*) print_line_cursor#0 ← (byte*) print_screen#0
(byte*) print_char_cursor#0 ← (byte*) print_line_cursor#0
to:@29
print_word: scope:[print_word] from print_dword print_dword::@1
(byte*) print_char_cursor#34 ← phi( print_dword/(byte*) print_char_cursor#35 print_dword::@1/(byte*) print_char_cursor#4 )
(word) print_word::w#2 ← phi( print_dword/(word) print_word::w#0 print_dword::@1/(word) print_word::w#1 )
(byte~) print_word::$0 ← > (word) print_word::w#2
(byte) print_byte::b#0 ← (byte~) print_word::$0
call print_byte
to:print_word::@1
print_word::@1: scope:[print_word] from print_word
(word) print_word::w#3 ← phi( print_word/(word) print_word::w#2 )
(byte*) print_char_cursor#18 ← phi( print_word/(byte*) print_char_cursor#9 )
(byte*) print_char_cursor#1 ← (byte*) print_char_cursor#18
(byte~) print_word::$2 ← < (word) print_word::w#3
(byte) print_byte::b#1 ← (byte~) print_word::$2
call print_byte
to:print_word::@2
print_word::@2: scope:[print_word] from print_word::@1
(byte*) print_char_cursor#19 ← phi( print_word::@1/(byte*) print_char_cursor#9 )
(byte*) print_char_cursor#2 ← (byte*) print_char_cursor#19
to:print_word::@return
print_word::@return: scope:[print_word] from print_word::@2
(byte*) print_char_cursor#20 ← phi( print_word::@2/(byte*) print_char_cursor#2 )
(byte*) print_char_cursor#3 ← (byte*) print_char_cursor#20
return
to:@return
print_dword: scope:[print_dword] from main::@14
(byte*) print_char_cursor#35 ← phi( main::@14/(byte*) print_char_cursor#37 )
(dword) print_dword::dw#1 ← phi( main::@14/(dword) print_dword::dw#0 )
(word~) print_dword::$0 ← > (dword) print_dword::dw#1
(word) print_word::w#0 ← (word~) print_dword::$0
call print_word
to:print_dword::@1
print_dword::@1: scope:[print_dword] from print_dword
(dword) print_dword::dw#2 ← phi( print_dword/(dword) print_dword::dw#1 )
(byte*) print_char_cursor#21 ← phi( print_dword/(byte*) print_char_cursor#3 )
(byte*) print_char_cursor#4 ← (byte*) print_char_cursor#21
(word~) print_dword::$2 ← < (dword) print_dword::dw#2
(word) print_word::w#1 ← (word~) print_dword::$2
call print_word
to:print_dword::@2
print_dword::@2: scope:[print_dword] from print_dword::@1
(byte*) print_char_cursor#22 ← phi( print_dword::@1/(byte*) print_char_cursor#3 )
(byte*) print_char_cursor#5 ← (byte*) print_char_cursor#22
to:print_dword::@return
print_dword::@return: scope:[print_dword] from print_dword::@2
(byte*) print_char_cursor#23 ← phi( print_dword::@2/(byte*) print_char_cursor#5 )
(byte*) print_char_cursor#6 ← (byte*) print_char_cursor#23
return
to:@return
@29: scope:[] from @12
(byte*) print_line_cursor#19 ← phi( @12/(byte*) print_line_cursor#0 )
(byte*) print_screen#19 ← phi( @12/(byte*) print_screen#0 )
(byte*) print_char_cursor#46 ← phi( @12/(byte*) print_char_cursor#0 )
(byte[]) print_hextab#0 ← (const string) $0
to:@36
print_byte: scope:[print_byte] from print_word print_word::@1
(byte*) print_char_cursor#36 ← phi( print_word/(byte*) print_char_cursor#34 print_word::@1/(byte*) print_char_cursor#1 )
(byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 )
(byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (number) 4
(byte) print_char::ch#0 ← *((byte[]) print_hextab#0 + (byte~) print_byte::$0)
call print_char
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
(byte) print_byte::b#3 ← phi( print_byte/(byte) print_byte::b#2 )
(byte*) print_char_cursor#24 ← phi( print_byte/(byte*) print_char_cursor#11 )
(byte*) print_char_cursor#7 ← (byte*) print_char_cursor#24
(number~) print_byte::$2 ← (byte) print_byte::b#3 & (number) $f
(byte) print_char::ch#1 ← *((byte[]) print_hextab#0 + (number~) print_byte::$2)
call print_char
to:print_byte::@2
print_byte::@2: scope:[print_byte] from print_byte::@1
(byte*) print_char_cursor#25 ← phi( print_byte::@1/(byte*) print_char_cursor#11 )
(byte*) print_char_cursor#8 ← (byte*) print_char_cursor#25
to:print_byte::@return
print_byte::@return: scope:[print_byte] from print_byte::@2
(byte*) print_char_cursor#26 ← phi( print_byte::@2/(byte*) print_char_cursor#8 )
(byte*) print_char_cursor#9 ← (byte*) print_char_cursor#26
return
to:@return
print_char: scope:[print_char] from print_byte print_byte::@1
(byte*) print_char_cursor#27 ← phi( print_byte/(byte*) print_char_cursor#36 print_byte::@1/(byte*) print_char_cursor#7 )
(byte) print_char::ch#2 ← phi( print_byte/(byte) print_char::ch#0 print_byte::@1/(byte) print_char::ch#1 )
*((byte*) print_char_cursor#27) ← (byte) print_char::ch#2
(byte*) print_char_cursor#10 ← ++ (byte*) print_char_cursor#27
to:print_char::@return
print_char::@return: scope:[print_char] from print_char
(byte*) print_char_cursor#28 ← phi( print_char/(byte*) print_char_cursor#10 )
(byte*) print_char_cursor#11 ← (byte*) print_char_cursor#28
return
to:@return
print_set_screen: scope:[print_set_screen] from main::@15
(byte*) print_set_screen::screen#1 ← phi( main::@15/(byte*) print_set_screen::screen#0 )
(byte*) print_screen#1 ← (byte*) print_set_screen::screen#1
(byte*) print_line_cursor#1 ← (byte*) print_screen#1
(byte*) print_char_cursor#12 ← (byte*) print_line_cursor#1
to:print_set_screen::@return
print_set_screen::@return: scope:[print_set_screen] from print_set_screen
(byte*) print_char_cursor#29 ← phi( print_set_screen/(byte*) print_char_cursor#12 )
(byte*) print_line_cursor#6 ← phi( print_set_screen/(byte*) print_line_cursor#1 )
(byte*) print_screen#6 ← phi( print_set_screen/(byte*) print_screen#1 )
(byte*) print_screen#2 ← (byte*) print_screen#6
(byte*) print_line_cursor#2 ← (byte*) print_line_cursor#6
(byte*) print_char_cursor#13 ← (byte*) print_char_cursor#29
return
to:@return
@36: scope:[] from @29
(byte*) print_line_cursor#18 ← phi( @29/(byte*) print_line_cursor#19 )
(byte*) print_screen#18 ← phi( @29/(byte*) print_screen#19 )
(byte*) print_char_cursor#45 ← phi( @29/(byte*) print_char_cursor#46 )
(byte*) RASTER#0 ← ((byte*)) (number) $d012
(byte*) BORDERCOL#0 ← ((byte*)) (number) $d020
(byte*) SCREEN#0 ← ((byte*)) (number) $400
to:@37
main: scope:[main] from @39
(byte*) print_line_cursor#16 ← phi( @39/(byte*) print_line_cursor#12 )
(byte*) print_screen#16 ← phi( @39/(byte*) print_screen#12 )
(byte*) print_char_cursor#43 ← phi( @39/(byte*) print_char_cursor#39 )
call mulf_init
to:main::@13
main::@13: scope:[main] from main
(byte*) print_line_cursor#13 ← phi( main/(byte*) print_line_cursor#16 )
(byte*) print_screen#13 ← phi( main/(byte*) print_screen#16 )
(byte*) print_char_cursor#40 ← phi( main/(byte*) print_char_cursor#43 )
(word) main::a#0 ← (number) $4d2
(word) main::b#0 ← (number) $929
asm { sei }
to:main::@1
main::@1: scope:[main] from main::@13 main::@16
(byte*) print_line_cursor#11 ← phi( main::@13/(byte*) print_line_cursor#13 main::@16/(byte*) print_line_cursor#3 )
(byte*) print_screen#11 ← phi( main::@13/(byte*) print_screen#13 main::@16/(byte*) print_screen#3 )
(byte*) print_char_cursor#38 ← phi( main::@13/(byte*) print_char_cursor#40 main::@16/(byte*) print_char_cursor#15 )
if(true) goto main::@4
to:main::@return
main::@4: scope:[main] from main::@1 main::@4
(byte*) print_line_cursor#20 ← phi( main::@1/(byte*) print_line_cursor#11 main::@4/(byte*) print_line_cursor#20 )
(byte*) print_screen#20 ← phi( main::@1/(byte*) print_screen#11 main::@4/(byte*) print_screen#20 )
(byte*) print_char_cursor#44 ← phi( main::@1/(byte*) print_char_cursor#38 main::@4/(byte*) print_char_cursor#44 )
(bool~) main::$1 ← *((byte*) RASTER#0) != (number) $ff
if((bool~) main::$1) goto main::@4
to:main::@6
main::@6: scope:[main] from main::@4
(byte*) print_line_cursor#17 ← phi( main::@4/(byte*) print_line_cursor#20 )
(byte*) print_screen#17 ← phi( main::@4/(byte*) print_screen#20 )
(byte*) print_char_cursor#41 ← phi( main::@4/(byte*) print_char_cursor#44 )
*((byte*) BORDERCOL#0) ← ++ *((byte*) BORDERCOL#0)
(word) mulf16u::a#0 ← (word) main::a#0
(word) mulf16u::b#0 ← (word) main::b#0
call mulf16u
(dword) mulf16u::return#0 ← (dword) mulf16u::return#2
to:main::@14
main::@14: scope:[main] from main::@6
(byte*) print_line_cursor#14 ← phi( main::@6/(byte*) print_line_cursor#17 )
(byte*) print_screen#14 ← phi( main::@6/(byte*) print_screen#17 )
(byte*) print_char_cursor#37 ← phi( main::@6/(byte*) print_char_cursor#41 )
(dword) mulf16u::return#3 ← phi( main::@6/(dword) mulf16u::return#0 )
(dword~) main::$3 ← (dword) mulf16u::return#3
(dword) main::r#0 ← (dword~) main::$3
*((byte*) BORDERCOL#0) ← -- *((byte*) BORDERCOL#0)
(dword) print_dword::dw#0 ← (dword) main::r#0
call print_dword
to:main::@15
main::@15: scope:[main] from main::@14
(byte*) print_line_cursor#10 ← phi( main::@14/(byte*) print_line_cursor#14 )
(byte*) print_screen#10 ← phi( main::@14/(byte*) print_screen#14 )
(byte*) print_char_cursor#30 ← phi( main::@14/(byte*) print_char_cursor#6 )
(byte*) print_char_cursor#14 ← (byte*) print_char_cursor#30
(byte*) print_set_screen::screen#0 ← (byte*) SCREEN#0
call print_set_screen
to:main::@16
main::@16: scope:[main] from main::@15
(byte*) print_char_cursor#31 ← phi( main::@15/(byte*) print_char_cursor#13 )
(byte*) print_line_cursor#7 ← phi( main::@15/(byte*) print_line_cursor#2 )
(byte*) print_screen#7 ← phi( main::@15/(byte*) print_screen#2 )
(byte*) print_screen#3 ← (byte*) print_screen#7
(byte*) print_line_cursor#3 ← (byte*) print_line_cursor#7
(byte*) print_char_cursor#15 ← (byte*) print_char_cursor#31
to:main::@1
main::@return: scope:[main] from main::@1
(byte*) print_line_cursor#8 ← phi( main::@1/(byte*) print_line_cursor#11 )
(byte*) print_screen#8 ← phi( main::@1/(byte*) print_screen#11 )
(byte*) print_char_cursor#32 ← phi( main::@1/(byte*) print_char_cursor#38 )
(byte*) print_char_cursor#16 ← (byte*) print_char_cursor#32
(byte*) print_screen#4 ← (byte*) print_screen#8
(byte*) print_line_cursor#4 ← (byte*) print_line_cursor#8
return
to:@return
@37: scope:[] from @36
(byte*) print_line_cursor#15 ← phi( @36/(byte*) print_line_cursor#18 )
(byte*) print_screen#15 ← phi( @36/(byte*) print_screen#18 )
(byte*) print_char_cursor#42 ← phi( @36/(byte*) print_char_cursor#45 )
(byte[$200]) mulf_sqr1_lo#0 ← { fill( $200, 0) }
(byte[$200]) mulf_sqr1_hi#0 ← { fill( $200, 0) }
(byte[$200]) mulf_sqr2_lo#0 ← { fill( $200, 0) }
(byte[$200]) mulf_sqr2_hi#0 ← { fill( $200, 0) }
to:@39
mulf_init: scope:[mulf_init] from main
(word) mulf_init::sqr#0 ← (number) 0
(byte) mulf_init::x_2#0 ← (number) 0
(byte) mulf_init::c#0 ← (number) 0
(byte*~) mulf_init::$0 ← (byte[$200]) mulf_sqr1_hi#0 + (number) 1
(byte*) mulf_init::sqr1_hi#0 ← (byte*~) mulf_init::$0
(byte*~) mulf_init::$6 ← (byte[$200]) mulf_sqr1_lo#0 + (number) 1
(byte*) mulf_init::sqr1_lo#0 ← (byte*~) mulf_init::$6
to:mulf_init::@1
mulf_init::@1: scope:[mulf_init] from mulf_init mulf_init::@4
(byte) mulf_init::x_2#5 ← phi( mulf_init/(byte) mulf_init::x_2#0 mulf_init::@4/(byte) mulf_init::x_2#2 )
(byte*) mulf_init::sqr1_hi#5 ← phi( mulf_init/(byte*) mulf_init::sqr1_hi#0 mulf_init::@4/(byte*) mulf_init::sqr1_hi#1 )
(word) mulf_init::sqr#6 ← phi( mulf_init/(word) mulf_init::sqr#0 mulf_init::@4/(word) mulf_init::sqr#1 )
(byte) mulf_init::c#3 ← phi( mulf_init/(byte) mulf_init::c#0 mulf_init::@4/(byte) mulf_init::c#4 )
(byte*) mulf_init::sqr1_lo#2 ← phi( mulf_init/(byte*) mulf_init::sqr1_lo#0 mulf_init::@4/(byte*) mulf_init::sqr1_lo#1 )
(byte*~) mulf_init::$7 ← (byte[$200]) mulf_sqr1_lo#0 + (number) $200
(bool~) mulf_init::$8 ← (byte*) mulf_init::sqr1_lo#2 != (byte*~) mulf_init::$7
if((bool~) mulf_init::$8) goto mulf_init::@2
to:mulf_init::@3
mulf_init::@2: scope:[mulf_init] from mulf_init::@1
(byte) mulf_init::x_2#4 ← phi( mulf_init::@1/(byte) mulf_init::x_2#5 )
(byte*) mulf_init::sqr1_hi#3 ← phi( mulf_init::@1/(byte*) mulf_init::sqr1_hi#5 )
(byte*) mulf_init::sqr1_lo#4 ← phi( mulf_init::@1/(byte*) mulf_init::sqr1_lo#2 )
(word) mulf_init::sqr#5 ← phi( mulf_init::@1/(word) mulf_init::sqr#6 )
(byte) mulf_init::c#2 ← phi( mulf_init::@1/(byte) mulf_init::c#3 )
(byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2
(number~) mulf_init::$9 ← (byte) mulf_init::c#1 & (number) 1
(bool~) mulf_init::$10 ← (number~) mulf_init::$9 == (number) 0
(bool~) mulf_init::$11 ← ! (bool~) mulf_init::$10
if((bool~) mulf_init::$11) goto mulf_init::@4
to:mulf_init::@7
mulf_init::@3: scope:[mulf_init] from mulf_init::@1
(byte~) mulf_init::$1 ← ((byte)) (number) -1
(byte) mulf_init::x_255#0 ← (byte~) mulf_init::$1
(byte) mulf_init::dir#0 ← (number) $ff
(byte*) mulf_init::sqr2_hi#0 ← (byte[$200]) mulf_sqr2_hi#0
(byte*) mulf_init::sqr2_lo#0 ← (byte[$200]) mulf_sqr2_lo#0
to:mulf_init::@9
mulf_init::@4: scope:[mulf_init] from mulf_init::@2 mulf_init::@7
(byte) mulf_init::c#4 ← phi( mulf_init::@2/(byte) mulf_init::c#1 mulf_init::@7/(byte) mulf_init::c#5 )
(byte) mulf_init::x_2#2 ← phi( mulf_init::@2/(byte) mulf_init::x_2#4 mulf_init::@7/(byte) mulf_init::x_2#1 )
(byte*) mulf_init::sqr1_hi#2 ← phi( mulf_init::@2/(byte*) mulf_init::sqr1_hi#3 mulf_init::@7/(byte*) mulf_init::sqr1_hi#4 )
(byte*) mulf_init::sqr1_lo#3 ← phi( mulf_init::@2/(byte*) mulf_init::sqr1_lo#4 mulf_init::@7/(byte*) mulf_init::sqr1_lo#5 )
(word) mulf_init::sqr#3 ← phi( mulf_init::@2/(word) mulf_init::sqr#5 mulf_init::@7/(word) mulf_init::sqr#2 )
(byte~) mulf_init::$12 ← < (word) mulf_init::sqr#3
*((byte*) mulf_init::sqr1_lo#3) ← (byte~) mulf_init::$12
(byte~) mulf_init::$13 ← > (word) mulf_init::sqr#3
*((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$13
(byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2
(word~) mulf_init::$14 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2
(word) mulf_init::sqr#1 ← (word~) mulf_init::$14
(byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#3
to:mulf_init::@1
mulf_init::@7: scope:[mulf_init] from mulf_init::@2
(byte) mulf_init::c#5 ← phi( mulf_init::@2/(byte) mulf_init::c#1 )
(byte*) mulf_init::sqr1_hi#4 ← phi( mulf_init::@2/(byte*) mulf_init::sqr1_hi#3 )
(byte*) mulf_init::sqr1_lo#5 ← phi( mulf_init::@2/(byte*) mulf_init::sqr1_lo#4 )
(word) mulf_init::sqr#4 ← phi( mulf_init::@2/(word) mulf_init::sqr#5 )
(byte) mulf_init::x_2#3 ← phi( mulf_init::@2/(byte) mulf_init::x_2#4 )
(byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3
(word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4
to:mulf_init::@4
mulf_init::@9: scope:[mulf_init] from mulf_init::@12 mulf_init::@3
(byte) mulf_init::dir#3 ← phi( mulf_init::@12/(byte) mulf_init::dir#4 mulf_init::@3/(byte) mulf_init::dir#0 )
(byte*) mulf_init::sqr2_hi#3 ← phi( mulf_init::@12/(byte*) mulf_init::sqr2_hi#4 mulf_init::@3/(byte*) mulf_init::sqr2_hi#0 )
(byte) mulf_init::x_255#3 ← phi( mulf_init::@12/(byte) mulf_init::x_255#4 mulf_init::@3/(byte) mulf_init::x_255#0 )
(byte*) mulf_init::sqr2_lo#2 ← phi( mulf_init::@12/(byte*) mulf_init::sqr2_lo#1 mulf_init::@3/(byte*) mulf_init::sqr2_lo#0 )
(byte*~) mulf_init::$15 ← (byte[$200]) mulf_sqr2_lo#0 + (number) $1ff
(bool~) mulf_init::$16 ← (byte*) mulf_init::sqr2_lo#2 != (byte*~) mulf_init::$15
if((bool~) mulf_init::$16) goto mulf_init::@10
to:mulf_init::@11
mulf_init::@10: scope:[mulf_init] from mulf_init::@9
(byte) mulf_init::dir#2 ← phi( mulf_init::@9/(byte) mulf_init::dir#3 )
(byte*) mulf_init::sqr2_hi#2 ← phi( mulf_init::@9/(byte*) mulf_init::sqr2_hi#3 )
(byte*) mulf_init::sqr2_lo#3 ← phi( mulf_init::@9/(byte*) mulf_init::sqr2_lo#2 )
(byte) mulf_init::x_255#2 ← phi( mulf_init::@9/(byte) mulf_init::x_255#3 )
*((byte*) mulf_init::sqr2_lo#3) ← *((byte[$200]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2)
*((byte*) mulf_init::sqr2_hi#2) ← *((byte[$200]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2)
(byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2
(byte~) mulf_init::$17 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2
(byte) mulf_init::x_255#1 ← (byte~) mulf_init::$17
(bool~) mulf_init::$18 ← (byte) mulf_init::x_255#1 == (number) 0
(bool~) mulf_init::$19 ← ! (bool~) mulf_init::$18
if((bool~) mulf_init::$19) goto mulf_init::@12
to:mulf_init::@15
mulf_init::@11: scope:[mulf_init] from mulf_init::@9
(byte*~) mulf_init::$2 ← (byte[$200]) mulf_sqr2_lo#0 + (number) $1ff
(byte*~) mulf_init::$3 ← (byte[$200]) mulf_sqr1_lo#0 + (number) $100
*((byte*~) mulf_init::$2) ← *((byte*~) mulf_init::$3)
(byte*~) mulf_init::$4 ← (byte[$200]) mulf_sqr2_hi#0 + (number) $1ff
(byte*~) mulf_init::$5 ← (byte[$200]) mulf_sqr1_hi#0 + (number) $100
*((byte*~) mulf_init::$4) ← *((byte*~) mulf_init::$5)
to:mulf_init::@return
mulf_init::@12: scope:[mulf_init] from mulf_init::@10 mulf_init::@15
(byte) mulf_init::dir#4 ← phi( mulf_init::@10/(byte) mulf_init::dir#2 mulf_init::@15/(byte) mulf_init::dir#1 )
(byte*) mulf_init::sqr2_hi#4 ← phi( mulf_init::@10/(byte*) mulf_init::sqr2_hi#1 mulf_init::@15/(byte*) mulf_init::sqr2_hi#5 )
(byte) mulf_init::x_255#4 ← phi( mulf_init::@10/(byte) mulf_init::x_255#1 mulf_init::@15/(byte) mulf_init::x_255#5 )
(byte*) mulf_init::sqr2_lo#4 ← phi( mulf_init::@10/(byte*) mulf_init::sqr2_lo#3 mulf_init::@15/(byte*) mulf_init::sqr2_lo#5 )
(byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#4
to:mulf_init::@9
mulf_init::@15: scope:[mulf_init] from mulf_init::@10
(byte*) mulf_init::sqr2_hi#5 ← phi( mulf_init::@10/(byte*) mulf_init::sqr2_hi#1 )
(byte) mulf_init::x_255#5 ← phi( mulf_init::@10/(byte) mulf_init::x_255#1 )
(byte*) mulf_init::sqr2_lo#5 ← phi( mulf_init::@10/(byte*) mulf_init::sqr2_lo#3 )
(byte) mulf_init::dir#1 ← (number) 1
to:mulf_init::@12
mulf_init::@return: scope:[mulf_init] from mulf_init::@11
return
to:@return
mulf16u: scope:[mulf16u] from main::@6
(word) mulf16u::b#1 ← phi( main::@6/(word) mulf16u::b#0 )
(word) mulf16u::a#1 ← phi( main::@6/(word) mulf16u::a#0 )
(word*) mulf16u::memA#0 ← ((word*)) (number) $f8
(word*) mulf16u::memB#0 ← ((word*)) (number) $fa
(dword*) mulf16u::memR#0 ← ((dword*)) (number) $fc
*((word*) mulf16u::memA#0) ← (word) mulf16u::a#1
*((word*) mulf16u::memB#0) ← (word) mulf16u::b#1
asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: }
(dword) mulf16u::return#1 ← *((dword*) mulf16u::memR#0)
to:mulf16u::@return
mulf16u::@return: scope:[mulf16u] from mulf16u
(dword) mulf16u::return#4 ← phi( mulf16u/(dword) mulf16u::return#1 )
(dword) mulf16u::return#2 ← (dword) mulf16u::return#4
return
to:@return
@39: scope:[] from @37
(byte*) print_line_cursor#12 ← phi( @37/(byte*) print_line_cursor#15 )
(byte*) print_screen#12 ← phi( @37/(byte*) print_screen#15 )
(byte*) print_char_cursor#39 ← phi( @37/(byte*) print_char_cursor#42 )
call main
to:@40
@40: scope:[] from @39
(byte*) print_line_cursor#9 ← phi( @39/(byte*) print_line_cursor#4 )
(byte*) print_screen#9 ← phi( @39/(byte*) print_screen#4 )
(byte*) print_char_cursor#33 ← phi( @39/(byte*) print_char_cursor#16 )
(byte*) print_char_cursor#17 ← (byte*) print_char_cursor#33
(byte*) print_screen#5 ← (byte*) print_screen#9
(byte*) print_line_cursor#5 ← (byte*) print_line_cursor#9
to:@end
@end: scope:[] from @40
SYMBOL TABLE SSA
(const string) $0 = (string) "0123456789abcdef"z
(label) @12
(label) @29
(label) @36
(label) @37
(label) @39
(label) @40
(label) @begin
(label) @end
(byte*) BORDERCOL
(byte*) BORDERCOL#0
(const byte) RADIX::BINARY = (number) 2
(const byte) RADIX::DECIMAL = (number) $a
(const byte) RADIX::HEXADECIMAL = (number) $10
(const byte) RADIX::OCTAL = (number) 8
(byte*) RASTER
(byte*) RASTER#0
(byte*) SCREEN
(byte*) SCREEN#0
(void()) main()
(bool~) main::$1
(dword~) main::$3
(label) main::@1
(label) main::@13
(label) main::@14
(label) main::@15
(label) main::@16
(label) main::@4
(label) main::@6
(label) main::@return
(word) main::a
(word) main::a#0
(word) main::b
(word) main::b#0
(dword) main::r
(dword) main::r#0
(dword()) mulf16u((word) mulf16u::a , (word) mulf16u::b)
(label) mulf16u::@return
(word) mulf16u::a
(word) mulf16u::a#0
(word) mulf16u::a#1
(word) mulf16u::b
(word) mulf16u::b#0
(word) mulf16u::b#1
(word*) mulf16u::memA
(word*) mulf16u::memA#0
(word*) mulf16u::memB
(word*) mulf16u::memB#0
(dword*) mulf16u::memR
(dword*) mulf16u::memR#0
(dword) mulf16u::return
(dword) mulf16u::return#0
(dword) mulf16u::return#1
(dword) mulf16u::return#2
(dword) mulf16u::return#3
(dword) mulf16u::return#4
(void()) mulf_init()
(byte*~) mulf_init::$0
(byte~) mulf_init::$1
(bool~) mulf_init::$10
(bool~) mulf_init::$11
(byte~) mulf_init::$12
(byte~) mulf_init::$13
(word~) mulf_init::$14
(byte*~) mulf_init::$15
(bool~) mulf_init::$16
(byte~) mulf_init::$17
(bool~) mulf_init::$18
(bool~) mulf_init::$19
(byte*~) mulf_init::$2
(byte*~) mulf_init::$3
(byte*~) mulf_init::$4
(byte*~) mulf_init::$5
(byte*~) mulf_init::$6
(byte*~) mulf_init::$7
(bool~) mulf_init::$8
(number~) mulf_init::$9
(label) mulf_init::@1
(label) mulf_init::@10
(label) mulf_init::@11
(label) mulf_init::@12
(label) mulf_init::@15
(label) mulf_init::@2
(label) mulf_init::@3
(label) mulf_init::@4
(label) mulf_init::@7
(label) mulf_init::@9
(label) mulf_init::@return
(byte) mulf_init::c
(byte) mulf_init::c#0
(byte) mulf_init::c#1
(byte) mulf_init::c#2
(byte) mulf_init::c#3
(byte) mulf_init::c#4
(byte) mulf_init::c#5
(byte) mulf_init::dir
(byte) mulf_init::dir#0
(byte) mulf_init::dir#1
(byte) mulf_init::dir#2
(byte) mulf_init::dir#3
(byte) mulf_init::dir#4
(word) mulf_init::sqr
(word) mulf_init::sqr#0
(word) mulf_init::sqr#1
(word) mulf_init::sqr#2
(word) mulf_init::sqr#3
(word) mulf_init::sqr#4
(word) mulf_init::sqr#5
(word) mulf_init::sqr#6
(byte*) mulf_init::sqr1_hi
(byte*) mulf_init::sqr1_hi#0
(byte*) mulf_init::sqr1_hi#1
(byte*) mulf_init::sqr1_hi#2
(byte*) mulf_init::sqr1_hi#3
(byte*) mulf_init::sqr1_hi#4
(byte*) mulf_init::sqr1_hi#5
(byte*) mulf_init::sqr1_lo
(byte*) mulf_init::sqr1_lo#0
(byte*) mulf_init::sqr1_lo#1
(byte*) mulf_init::sqr1_lo#2
(byte*) mulf_init::sqr1_lo#3
(byte*) mulf_init::sqr1_lo#4
(byte*) mulf_init::sqr1_lo#5
(byte*) mulf_init::sqr2_hi
(byte*) mulf_init::sqr2_hi#0
(byte*) mulf_init::sqr2_hi#1
(byte*) mulf_init::sqr2_hi#2
(byte*) mulf_init::sqr2_hi#3
(byte*) mulf_init::sqr2_hi#4
(byte*) mulf_init::sqr2_hi#5
(byte*) mulf_init::sqr2_lo
(byte*) mulf_init::sqr2_lo#0
(byte*) mulf_init::sqr2_lo#1
(byte*) mulf_init::sqr2_lo#2
(byte*) mulf_init::sqr2_lo#3
(byte*) mulf_init::sqr2_lo#4
(byte*) mulf_init::sqr2_lo#5
(byte) mulf_init::x_2
(byte) mulf_init::x_2#0
(byte) mulf_init::x_2#1
(byte) mulf_init::x_2#2
(byte) mulf_init::x_2#3
(byte) mulf_init::x_2#4
(byte) mulf_init::x_2#5
(byte) mulf_init::x_255
(byte) mulf_init::x_255#0
(byte) mulf_init::x_255#1
(byte) mulf_init::x_255#2
(byte) mulf_init::x_255#3
(byte) mulf_init::x_255#4
(byte) mulf_init::x_255#5
(byte[$200]) mulf_sqr1_hi
(byte[$200]) mulf_sqr1_hi#0
(byte[$200]) mulf_sqr1_lo
(byte[$200]) mulf_sqr1_lo#0
(byte[$200]) mulf_sqr2_hi
(byte[$200]) mulf_sqr2_hi#0
(byte[$200]) mulf_sqr2_lo
(byte[$200]) mulf_sqr2_lo#0
(void()) print_byte((byte) print_byte::b)
(byte~) print_byte::$0
(number~) print_byte::$2
(label) print_byte::@1
(label) print_byte::@2
(label) print_byte::@return
(byte) print_byte::b
(byte) print_byte::b#0
(byte) print_byte::b#1
(byte) print_byte::b#2
(byte) print_byte::b#3
(void()) print_char((byte) print_char::ch)
(label) print_char::@return
(byte) print_char::ch
(byte) print_char::ch#0
(byte) print_char::ch#1
(byte) print_char::ch#2
(byte*) print_char_cursor
(byte*) print_char_cursor#0
(byte*) print_char_cursor#1
(byte*) print_char_cursor#10
(byte*) print_char_cursor#11
(byte*) print_char_cursor#12
(byte*) print_char_cursor#13
(byte*) print_char_cursor#14
(byte*) print_char_cursor#15
(byte*) print_char_cursor#16
(byte*) print_char_cursor#17
(byte*) print_char_cursor#18
(byte*) print_char_cursor#19
(byte*) print_char_cursor#2
(byte*) print_char_cursor#20
(byte*) print_char_cursor#21
(byte*) print_char_cursor#22
(byte*) print_char_cursor#23
(byte*) print_char_cursor#24
(byte*) print_char_cursor#25
(byte*) print_char_cursor#26
(byte*) print_char_cursor#27
(byte*) print_char_cursor#28
(byte*) print_char_cursor#29
(byte*) print_char_cursor#3
(byte*) print_char_cursor#30
(byte*) print_char_cursor#31
(byte*) print_char_cursor#32
(byte*) print_char_cursor#33
(byte*) print_char_cursor#34
(byte*) print_char_cursor#35
(byte*) print_char_cursor#36
(byte*) print_char_cursor#37
(byte*) print_char_cursor#38
(byte*) print_char_cursor#39
(byte*) print_char_cursor#4
(byte*) print_char_cursor#40
(byte*) print_char_cursor#41
(byte*) print_char_cursor#42
(byte*) print_char_cursor#43
(byte*) print_char_cursor#44
(byte*) print_char_cursor#45
(byte*) print_char_cursor#46
(byte*) print_char_cursor#5
(byte*) print_char_cursor#6
(byte*) print_char_cursor#7
(byte*) print_char_cursor#8
(byte*) print_char_cursor#9
(void()) print_dword((dword) print_dword::dw)
(word~) print_dword::$0
(word~) print_dword::$2
(label) print_dword::@1
(label) print_dword::@2
(label) print_dword::@return
(dword) print_dword::dw
(dword) print_dword::dw#0
(dword) print_dword::dw#1
(dword) print_dword::dw#2
(byte[]) print_hextab
(byte[]) print_hextab#0
(byte*) print_line_cursor
(byte*) print_line_cursor#0
(byte*) print_line_cursor#1
(byte*) print_line_cursor#10
(byte*) print_line_cursor#11
(byte*) print_line_cursor#12
(byte*) print_line_cursor#13
(byte*) print_line_cursor#14
(byte*) print_line_cursor#15
(byte*) print_line_cursor#16
(byte*) print_line_cursor#17
(byte*) print_line_cursor#18
(byte*) print_line_cursor#19
(byte*) print_line_cursor#2
(byte*) print_line_cursor#20
(byte*) print_line_cursor#3
(byte*) print_line_cursor#4
(byte*) print_line_cursor#5
(byte*) print_line_cursor#6
(byte*) print_line_cursor#7
(byte*) print_line_cursor#8
(byte*) print_line_cursor#9
(byte*) print_screen
(byte*) print_screen#0
(byte*) print_screen#1
(byte*) print_screen#10
(byte*) print_screen#11
(byte*) print_screen#12
(byte*) print_screen#13
(byte*) print_screen#14
(byte*) print_screen#15
(byte*) print_screen#16
(byte*) print_screen#17
(byte*) print_screen#18
(byte*) print_screen#19
(byte*) print_screen#2
(byte*) print_screen#20
(byte*) print_screen#3
(byte*) print_screen#4
(byte*) print_screen#5
(byte*) print_screen#6
(byte*) print_screen#7
(byte*) print_screen#8
(byte*) print_screen#9
(void()) print_set_screen((byte*) print_set_screen::screen)
(label) print_set_screen::@return
(byte*) print_set_screen::screen
(byte*) print_set_screen::screen#0
(byte*) print_set_screen::screen#1
(void()) print_word((word) print_word::w)
(byte~) print_word::$0
(byte~) print_word::$2
(label) print_word::@1
(label) print_word::@2
(label) print_word::@return
(word) print_word::w
(word) print_word::w#0
(word) print_word::w#1
(word) print_word::w#2
(word) print_word::w#3
Adding number conversion cast (unumber) 4 in (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (number) 4
Adding number conversion cast (unumber) $f in (number~) print_byte::$2 ← (byte) print_byte::b#3 & (number) $f
Adding number conversion cast (unumber) print_byte::$2 in (number~) print_byte::$2 ← (byte) print_byte::b#3 & (unumber)(number) $f
Adding number conversion cast (unumber) $4d2 in (word) main::a#0 ← (number) $4d2
Adding number conversion cast (unumber) $929 in (word) main::b#0 ← (number) $929
Adding number conversion cast (unumber) $ff in (bool~) main::$1 ← *((byte*) RASTER#0) != (number) $ff
Adding number conversion cast (unumber) 0 in (word) mulf_init::sqr#0 ← (number) 0
Adding number conversion cast (unumber) 0 in (byte) mulf_init::x_2#0 ← (number) 0
Adding number conversion cast (unumber) 0 in (byte) mulf_init::c#0 ← (number) 0
Adding number conversion cast (unumber) 1 in (byte*~) mulf_init::$0 ← (byte[$200]) mulf_sqr1_hi#0 + (number) 1
Adding number conversion cast (unumber) 1 in (byte*~) mulf_init::$6 ← (byte[$200]) mulf_sqr1_lo#0 + (number) 1
Adding number conversion cast (unumber) $200 in (byte*~) mulf_init::$7 ← (byte[$200]) mulf_sqr1_lo#0 + (number) $200
Adding number conversion cast (unumber) 1 in (number~) mulf_init::$9 ← (byte) mulf_init::c#1 & (number) 1
Adding number conversion cast (unumber) mulf_init::$9 in (number~) mulf_init::$9 ← (byte) mulf_init::c#1 & (unumber)(number) 1
Adding number conversion cast (unumber) 0 in (bool~) mulf_init::$10 ← (unumber~) mulf_init::$9 == (number) 0
Adding number conversion cast (unumber) $ff in (byte) mulf_init::dir#0 ← (number) $ff
Adding number conversion cast (unumber) $1ff in (byte*~) mulf_init::$15 ← (byte[$200]) mulf_sqr2_lo#0 + (number) $1ff
Adding number conversion cast (unumber) 0 in (bool~) mulf_init::$18 ← (byte) mulf_init::x_255#1 == (number) 0
Adding number conversion cast (unumber) $1ff in (byte*~) mulf_init::$2 ← (byte[$200]) mulf_sqr2_lo#0 + (number) $1ff
Adding number conversion cast (unumber) $100 in (byte*~) mulf_init::$3 ← (byte[$200]) mulf_sqr1_lo#0 + (number) $100
Adding number conversion cast (unumber) $1ff in (byte*~) mulf_init::$4 ← (byte[$200]) mulf_sqr2_hi#0 + (number) $1ff
Adding number conversion cast (unumber) $100 in (byte*~) mulf_init::$5 ← (byte[$200]) mulf_sqr1_hi#0 + (number) $100
Adding number conversion cast (unumber) 1 in (byte) mulf_init::dir#1 ← (number) 1
Successful SSA optimization PassNAddNumberTypeConversions
Inlining cast (byte*) print_screen#0 ← (byte*)(number) $400
Inlining cast (byte*) RASTER#0 ← (byte*)(number) $d012
Inlining cast (byte*) BORDERCOL#0 ← (byte*)(number) $d020
Inlining cast (byte*) SCREEN#0 ← (byte*)(number) $400
Inlining cast (word) main::a#0 ← (unumber)(number) $4d2
Inlining cast (word) main::b#0 ← (unumber)(number) $929
Inlining cast (word) mulf_init::sqr#0 ← (unumber)(number) 0
Inlining cast (byte) mulf_init::x_2#0 ← (unumber)(number) 0
Inlining cast (byte) mulf_init::c#0 ← (unumber)(number) 0
Inlining cast (byte~) mulf_init::$1 ← (byte)(number) -1
Inlining cast (byte) mulf_init::dir#0 ← (unumber)(number) $ff
Inlining cast (byte) mulf_init::dir#1 ← (unumber)(number) 1
Inlining cast (word*) mulf16u::memA#0 ← (word*)(number) $f8
Inlining cast (word*) mulf16u::memB#0 ← (word*)(number) $fa
Inlining cast (dword*) mulf16u::memR#0 ← (dword*)(number) $fc
Successful SSA optimization Pass2InlineCast
Simplifying constant pointer cast (byte*) 1024
Simplifying constant integer cast 4
Simplifying constant integer cast $f
Simplifying constant pointer cast (byte*) 53266
Simplifying constant pointer cast (byte*) 53280
Simplifying constant pointer cast (byte*) 1024
Simplifying constant integer cast $4d2
Simplifying constant integer cast $929
Simplifying constant integer cast $ff
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast 1
Simplifying constant integer cast $200
Simplifying constant integer cast 1
Simplifying constant integer cast 0
Simplifying constant integer cast -1
Simplifying constant integer cast $ff
Simplifying constant integer cast $1ff
Simplifying constant integer cast 0
Simplifying constant integer cast $1ff
Simplifying constant integer cast $100
Simplifying constant integer cast $1ff
Simplifying constant integer cast $100
Simplifying constant integer cast 1
Simplifying constant pointer cast (word*) 248
Simplifying constant pointer cast (word*) 250
Simplifying constant pointer cast (dword*) 252
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (byte) 4
Finalized unsigned number type (byte) $f
Finalized unsigned number type (word) $4d2
Finalized unsigned number type (word) $929
Finalized unsigned number type (byte) $ff
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) 1
Finalized unsigned number type (word) $200
Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) $ff
Finalized unsigned number type (word) $1ff
Finalized unsigned number type (byte) 0
Finalized unsigned number type (word) $1ff
Finalized unsigned number type (word) $100
Finalized unsigned number type (word) $1ff
Finalized unsigned number type (word) $100
Finalized unsigned number type (byte) 1
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inferred type updated to byte in (unumber~) print_byte::$2 ← (byte) print_byte::b#3 & (byte) $f
Inferred type updated to byte in (unumber~) mulf_init::$9 ← (byte) mulf_init::c#1 & (byte) 1
Inversing boolean not [122] (bool~) mulf_init::$11 ← (byte~) mulf_init::$9 != (byte) 0 from [121] (bool~) mulf_init::$10 ← (byte~) mulf_init::$9 == (byte) 0
Inversing boolean not [152] (bool~) mulf_init::$19 ← (byte) mulf_init::x_255#1 != (byte) 0 from [151] (bool~) mulf_init::$18 ← (byte) mulf_init::x_255#1 == (byte) 0
Successful SSA optimization Pass2UnaryNotSimplification
Alias (byte*) print_char_cursor#0 = (byte*) print_line_cursor#0 (byte*) print_screen#0 (byte*) print_char_cursor#46 (byte*) print_screen#19 (byte*) print_line_cursor#19 (byte*) print_char_cursor#45 (byte*) print_screen#18 (byte*) print_line_cursor#18 (byte*) print_char_cursor#42 (byte*) print_screen#15 (byte*) print_line_cursor#15 (byte*) print_char_cursor#39 (byte*) print_screen#12 (byte*) print_line_cursor#12
Alias (byte) print_byte::b#0 = (byte~) print_word::$0
Alias (word) print_word::w#2 = (word) print_word::w#3
Alias (byte*) print_char_cursor#1 = (byte*) print_char_cursor#18
Alias (byte) print_byte::b#1 = (byte~) print_word::$2
Alias (byte*) print_char_cursor#19 = (byte*) print_char_cursor#2 (byte*) print_char_cursor#20 (byte*) print_char_cursor#3
Alias (word) print_word::w#0 = (word~) print_dword::$0
Alias (dword) print_dword::dw#1 = (dword) print_dword::dw#2
Alias (byte*) print_char_cursor#21 = (byte*) print_char_cursor#4
Alias (word) print_word::w#1 = (word~) print_dword::$2
Alias (byte*) print_char_cursor#22 = (byte*) print_char_cursor#5 (byte*) print_char_cursor#23 (byte*) print_char_cursor#6
Alias (byte) print_byte::b#2 = (byte) print_byte::b#3
Alias (byte*) print_char_cursor#24 = (byte*) print_char_cursor#7
Alias (byte*) print_char_cursor#25 = (byte*) print_char_cursor#8 (byte*) print_char_cursor#26 (byte*) print_char_cursor#9
Alias (byte*) print_char_cursor#10 = (byte*) print_char_cursor#28 (byte*) print_char_cursor#11
Alias (byte*) print_screen#1 = (byte*) print_line_cursor#1 (byte*) print_char_cursor#12 (byte*) print_screen#6 (byte*) print_line_cursor#6 (byte*) print_char_cursor#29 (byte*) print_screen#2 (byte*) print_line_cursor#2 (byte*) print_char_cursor#13
Alias (byte*) print_char_cursor#40 = (byte*) print_char_cursor#43
Alias (byte*) print_screen#13 = (byte*) print_screen#16
Alias (byte*) print_line_cursor#13 = (byte*) print_line_cursor#16
Alias (byte*) print_char_cursor#37 = (byte*) print_char_cursor#41 (byte*) print_char_cursor#44
Alias (byte*) print_screen#10 = (byte*) print_screen#17 (byte*) print_screen#20 (byte*) print_screen#14
Alias (byte*) print_line_cursor#10 = (byte*) print_line_cursor#17 (byte*) print_line_cursor#20 (byte*) print_line_cursor#14
Alias (dword) mulf16u::return#0 = (dword) mulf16u::return#3
Alias (dword) main::r#0 = (dword~) main::$3
Alias (byte*) print_char_cursor#14 = (byte*) print_char_cursor#30
Alias (byte*) print_screen#3 = (byte*) print_screen#7
Alias (byte*) print_line_cursor#3 = (byte*) print_line_cursor#7
Alias (byte*) print_char_cursor#15 = (byte*) print_char_cursor#31
Alias (byte*) print_char_cursor#16 = (byte*) print_char_cursor#32 (byte*) print_char_cursor#38
Alias (byte*) print_screen#11 = (byte*) print_screen#8 (byte*) print_screen#4
Alias (byte*) print_line_cursor#11 = (byte*) print_line_cursor#8 (byte*) print_line_cursor#4
Alias (byte*) mulf_init::sqr1_hi#0 = (byte*~) mulf_init::$0
Alias (byte*) mulf_init::sqr1_lo#0 = (byte*~) mulf_init::$6
Alias (byte) mulf_init::c#2 = (byte) mulf_init::c#3
Alias (word) mulf_init::sqr#4 = (word) mulf_init::sqr#5 (word) mulf_init::sqr#6
Alias (byte*) mulf_init::sqr1_lo#2 = (byte*) mulf_init::sqr1_lo#4 (byte*) mulf_init::sqr1_lo#5
Alias (byte*) mulf_init::sqr1_hi#3 = (byte*) mulf_init::sqr1_hi#5 (byte*) mulf_init::sqr1_hi#4
Alias (byte) mulf_init::x_2#3 = (byte) mulf_init::x_2#4 (byte) mulf_init::x_2#5
Alias (byte) mulf_init::x_255#0 = (byte~) mulf_init::$1
Alias (word) mulf_init::sqr#1 = (word~) mulf_init::$14
Alias (byte) mulf_init::c#1 = (byte) mulf_init::c#5
Alias (byte) mulf_init::x_255#2 = (byte) mulf_init::x_255#3
Alias (byte*) mulf_init::sqr2_lo#2 = (byte*) mulf_init::sqr2_lo#3 (byte*) mulf_init::sqr2_lo#5
Alias (byte*) mulf_init::sqr2_hi#2 = (byte*) mulf_init::sqr2_hi#3
Alias (byte) mulf_init::dir#2 = (byte) mulf_init::dir#3
Alias (byte) mulf_init::x_255#1 = (byte~) mulf_init::$17 (byte) mulf_init::x_255#5
Alias (byte*) mulf_init::sqr2_hi#1 = (byte*) mulf_init::sqr2_hi#5
Alias (dword) mulf16u::return#1 = (dword) mulf16u::return#4 (dword) mulf16u::return#2
Alias (byte*) print_char_cursor#17 = (byte*) print_char_cursor#33
Alias (byte*) print_screen#5 = (byte*) print_screen#9
Alias (byte*) print_line_cursor#5 = (byte*) print_line_cursor#9
Successful SSA optimization Pass2AliasElimination
Alias (byte*) mulf_init::sqr1_lo#2 = (byte*) mulf_init::sqr1_lo#3
Alias (byte*) mulf_init::sqr1_hi#2 = (byte*) mulf_init::sqr1_hi#3
Alias (byte) mulf_init::c#1 = (byte) mulf_init::c#4
Alias (byte*) mulf_init::sqr2_lo#2 = (byte*) mulf_init::sqr2_lo#4
Alias (byte) mulf_init::x_255#1 = (byte) mulf_init::x_255#4
Alias (byte*) mulf_init::sqr2_hi#1 = (byte*) mulf_init::sqr2_hi#4
Successful SSA optimization Pass2AliasElimination
Identical Phi Values (byte*) print_char_cursor#1 (byte*) print_char_cursor#25
Identical Phi Values (byte*) print_char_cursor#19 (byte*) print_char_cursor#25
Identical Phi Values (dword) print_dword::dw#1 (dword) print_dword::dw#0
Identical Phi Values (byte*) print_char_cursor#35 (byte*) print_char_cursor#37
Identical Phi Values (byte*) print_char_cursor#21 (byte*) print_char_cursor#19
Identical Phi Values (byte*) print_char_cursor#22 (byte*) print_char_cursor#19
Identical Phi Values (byte*) print_char_cursor#24 (byte*) print_char_cursor#10
Identical Phi Values (byte*) print_char_cursor#25 (byte*) print_char_cursor#10
Identical Phi Values (byte*) print_set_screen::screen#1 (byte*) print_set_screen::screen#0
Identical Phi Values (byte*) print_char_cursor#40 (byte*) print_char_cursor#0
Identical Phi Values (byte*) print_screen#13 (byte*) print_char_cursor#0
Identical Phi Values (byte*) print_line_cursor#13 (byte*) print_char_cursor#0
Identical Phi Values (byte*) print_char_cursor#37 (byte*) print_char_cursor#16
Identical Phi Values (byte*) print_screen#10 (byte*) print_screen#11
Identical Phi Values (byte*) print_line_cursor#10 (byte*) print_line_cursor#11
Identical Phi Values (byte*) print_char_cursor#14 (byte*) print_char_cursor#22
Identical Phi Values (byte*) print_screen#3 (byte*) print_screen#1
Identical Phi Values (byte*) print_line_cursor#3 (byte*) print_screen#1
Identical Phi Values (byte*) print_char_cursor#15 (byte*) print_screen#1
Identical Phi Values (word) mulf16u::a#1 (word) mulf16u::a#0
Identical Phi Values (word) mulf16u::b#1 (word) mulf16u::b#0
Identical Phi Values (byte*) print_char_cursor#17 (byte*) print_char_cursor#16
Identical Phi Values (byte*) print_screen#5 (byte*) print_screen#11
Identical Phi Values (byte*) print_line_cursor#5 (byte*) print_line_cursor#11
Successful SSA optimization Pass2IdenticalPhiElimination
Simple Condition (bool~) main::$1 [76] if(*((byte*) RASTER#0)!=(byte) $ff) goto main::@4
Simple Condition (bool~) mulf_init::$8 [117] if((byte*) mulf_init::sqr1_lo#2!=(byte*~) mulf_init::$7) goto mulf_init::@2
Simple Condition (bool~) mulf_init::$11 [123] if((byte~) mulf_init::$9!=(byte) 0) goto mulf_init::@4
Simple Condition (bool~) mulf_init::$16 [144] if((byte*) mulf_init::sqr2_lo#2!=(byte*~) mulf_init::$15) goto mulf_init::@10
Simple Condition (bool~) mulf_init::$19 [153] if((byte) mulf_init::x_255#1!=(byte) 0) goto mulf_init::@12
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant right-side identified [103] (byte[$200]) mulf_sqr1_lo#0 ← { fill( $200, 0) }
Constant right-side identified [104] (byte[$200]) mulf_sqr1_hi#0 ← { fill( $200, 0) }
Constant right-side identified [105] (byte[$200]) mulf_sqr2_lo#0 ← { fill( $200, 0) }
Constant right-side identified [106] (byte[$200]) mulf_sqr2_hi#0 ← { fill( $200, 0) }
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant (const byte*) print_char_cursor#0 = (byte*) 1024
Constant (const byte[]) print_hextab#0 = $0
Constant (const byte*) RASTER#0 = (byte*) 53266
Constant (const byte*) BORDERCOL#0 = (byte*) 53280
Constant (const byte*) SCREEN#0 = (byte*) 1024
Constant (const word) main::a#0 = $4d2
Constant (const word) main::b#0 = $929
Constant (const byte[$200]) mulf_sqr1_lo#0 = { fill( $200, 0) }
Constant (const byte[$200]) mulf_sqr1_hi#0 = { fill( $200, 0) }
Constant (const byte[$200]) mulf_sqr2_lo#0 = { fill( $200, 0) }
Constant (const byte[$200]) mulf_sqr2_hi#0 = { fill( $200, 0) }
Constant (const word) mulf_init::sqr#0 = 0
Constant (const byte) mulf_init::x_2#0 = 0
Constant (const byte) mulf_init::c#0 = 0
Constant (const byte) mulf_init::x_255#0 = -1
Constant (const byte) mulf_init::dir#0 = $ff
Constant (const byte) mulf_init::dir#1 = 1
Constant (const word*) mulf16u::memA#0 = (word*) 248
Constant (const word*) mulf16u::memB#0 = (word*) 250
Constant (const dword*) mulf16u::memR#0 = (dword*) 252
Successful SSA optimization Pass2ConstantIdentification
Constant (const word) mulf16u::a#0 = main::a#0
Constant (const word) mulf16u::b#0 = main::b#0
Constant (const byte*) print_set_screen::screen#0 = SCREEN#0
Constant (const byte*) mulf_init::sqr2_hi#0 = mulf_sqr2_hi#0
Constant (const byte*) mulf_init::sqr2_lo#0 = mulf_sqr2_lo#0
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte*) print_screen#1 = print_set_screen::screen#0
Successful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination [73] if(true) goto main::@4
Successful SSA optimization Pass2ConstantIfs
Eliminating unused variable - keeping the phi block (byte*) print_screen#11
Eliminating unused variable - keeping the phi block (byte*) print_line_cursor#11
Successful SSA optimization PassNEliminateUnusedVars
Removing unused block main::@return
Successful SSA optimization Pass2EliminateUnusedBlocks
Constant right-side identified [36] (byte*) mulf_init::sqr1_hi#0 ← (const byte[$200]) mulf_sqr1_hi#0 + (byte) 1
Constant right-side identified [37] (byte*) mulf_init::sqr1_lo#0 ← (const byte[$200]) mulf_sqr1_lo#0 + (byte) 1
Constant right-side identified [39] (byte*~) mulf_init::$7 ← (const byte[$200]) mulf_sqr1_lo#0 + (word) $200
Constant right-side identified [55] (byte*~) mulf_init::$15 ← (const byte[$200]) mulf_sqr2_lo#0 + (word) $1ff
Constant right-side identified [62] (byte*~) mulf_init::$2 ← (const byte[$200]) mulf_sqr2_lo#0 + (word) $1ff
Constant right-side identified [63] (byte*~) mulf_init::$3 ← (const byte[$200]) mulf_sqr1_lo#0 + (word) $100
Constant right-side identified [65] (byte*~) mulf_init::$4 ← (const byte[$200]) mulf_sqr2_hi#0 + (word) $1ff
Constant right-side identified [66] (byte*~) mulf_init::$5 ← (const byte[$200]) mulf_sqr1_hi#0 + (word) $100
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant (const byte*) mulf_init::sqr1_hi#0 = mulf_sqr1_hi#0+1
Constant (const byte*) mulf_init::sqr1_lo#0 = mulf_sqr1_lo#0+1
Constant (const byte*) mulf_init::$7 = mulf_sqr1_lo#0+$200
Constant (const byte*) mulf_init::$15 = mulf_sqr2_lo#0+$1ff
Constant (const byte*) mulf_init::$2 = mulf_sqr2_lo#0+$1ff
Constant (const byte*) mulf_init::$3 = mulf_sqr1_lo#0+$100
Constant (const byte*) mulf_init::$4 = mulf_sqr2_hi#0+$1ff
Constant (const byte*) mulf_init::$5 = mulf_sqr1_hi#0+$100
Successful SSA optimization Pass2ConstantIdentification
Inlining constant with var siblings (const word) mulf_init::sqr#0
Inlining constant with var siblings (const byte) mulf_init::x_2#0
Inlining constant with var siblings (const byte) mulf_init::c#0
Inlining constant with var siblings (const byte) mulf_init::x_255#0
Inlining constant with var siblings (const byte) mulf_init::dir#0
Inlining constant with var siblings (const byte) mulf_init::dir#1
Inlining constant with var siblings (const byte*) mulf_init::sqr2_hi#0
Inlining constant with var siblings (const byte*) mulf_init::sqr2_lo#0
Inlining constant with var siblings (const byte*) mulf_init::sqr1_hi#0
Inlining constant with var siblings (const byte*) mulf_init::sqr1_lo#0
Inlining constant with var siblings (const byte*) print_char_cursor#0
Constant inlined mulf_init::c#0 = (byte) 0
Constant inlined mulf_init::sqr2_lo#0 = (const byte[$200]) mulf_sqr2_lo#0
Constant inlined mulf_init::sqr#0 = (byte) 0
Constant inlined mulf16u::b#0 = (const word) main::b#0
Constant inlined mulf_init::sqr2_hi#0 = (const byte[$200]) mulf_sqr2_hi#0
Constant inlined mulf16u::a#0 = (const word) main::a#0
Constant inlined print_screen#1 = (const byte*) SCREEN#0
Constant inlined mulf_init::$2 = (const byte[$200]) mulf_sqr2_lo#0+(word) $1ff
Constant inlined $0 = (const byte[]) print_hextab#0
Constant inlined mulf_init::$4 = (const byte[$200]) mulf_sqr2_hi#0+(word) $1ff
Constant inlined mulf_init::$3 = (const byte[$200]) mulf_sqr1_lo#0+(word) $100
Constant inlined mulf_init::$5 = (const byte[$200]) mulf_sqr1_hi#0+(word) $100
Constant inlined mulf_init::$7 = (const byte[$200]) mulf_sqr1_lo#0+(word) $200
Constant inlined mulf_init::dir#1 = (byte) 1
Constant inlined print_char_cursor#0 = (byte*) 1024
Constant inlined mulf_init::dir#0 = (byte) $ff
Constant inlined mulf_init::sqr1_hi#0 = (const byte[$200]) mulf_sqr1_hi#0+(byte) 1
Constant inlined print_set_screen::screen#0 = (const byte*) SCREEN#0
Constant inlined mulf_init::sqr1_lo#0 = (const byte[$200]) mulf_sqr1_lo#0+(byte) 1
Constant inlined mulf_init::$15 = (const byte[$200]) mulf_sqr2_lo#0+(word) $1ff
Constant inlined mulf_init::x_255#0 = (byte) -1
Constant inlined mulf_init::x_2#0 = (byte) 0
Successful SSA optimization Pass2ConstantInlining
Added new block during phi lifting mulf_init::@17(between mulf_init::@2 and mulf_init::@4)
Added new block during phi lifting mulf_init::@18(between mulf_init::@10 and mulf_init::@12)
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @12
Adding NOP phi() at start of @29
Adding NOP phi() at start of @36
Adding NOP phi() at start of @37
Adding NOP phi() at start of @39
Adding NOP phi() at start of @40
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@15
Adding NOP phi() at start of main::@16
Adding NOP phi() at start of print_set_screen
Adding NOP phi() at start of print_dword::@2
Adding NOP phi() at start of print_word::@2
Adding NOP phi() at start of print_byte::@2
Adding NOP phi() at start of mulf_init
Adding NOP phi() at start of mulf_init::@3
Adding NOP phi() at start of mulf_init::@15
CALL GRAPH
Calls in [] to main:6
Calls in [main] to mulf_init:10 mulf16u:15 print_dword:20 print_set_screen:22
Calls in [print_dword] to print_word:29 print_word:33
Calls in [print_word] to print_byte:40 print_byte:44
Calls in [print_byte] to print_char:52 print_char:57
Created 19 initial phi equivalence classes
Coalesced [27] print_word::w#4 ← print_word::w#0
Coalesced [28] print_char_cursor#47 ← print_char_cursor#16
Coalesced [31] print_word::w#5 ← print_word::w#1
Coalesced [32] print_char_cursor#48 ← print_char_cursor#10
Coalesced [38] print_byte::b#4 ← print_byte::b#0
Coalesced [39] print_char_cursor#49 ← print_char_cursor#34
Coalesced [42] print_byte::b#5 ← print_byte::b#1
Coalesced (already) [43] print_char_cursor#50 ← print_char_cursor#10
Coalesced [50] print_char::ch#3 ← print_char::ch#0
Coalesced [51] print_char_cursor#51 ← print_char_cursor#36
Coalesced [55] print_char::ch#4 ← print_char::ch#1
Coalesced (already) [56] print_char_cursor#52 ← print_char_cursor#10
Coalesced [86] mulf_init::sqr2_lo#6 ← mulf_init::sqr2_lo#1
Coalesced [87] mulf_init::x_255#6 ← mulf_init::x_255#1
Coalesced [88] mulf_init::sqr2_hi#6 ← mulf_init::sqr2_hi#1
Coalesced [89] mulf_init::dir#5 ← mulf_init::dir#4
Coalesced (already) [90] mulf_init::dir#6 ← mulf_init::dir#2
Coalesced [96] mulf_init::sqr#9 ← mulf_init::sqr#2
Coalesced [97] mulf_init::x_2#8 ← mulf_init::x_2#1
Coalesced [106] mulf_init::sqr1_lo#6 ← mulf_init::sqr1_lo#1
Coalesced [107] mulf_init::c#6 ← mulf_init::c#1
Coalesced [108] mulf_init::sqr#7 ← mulf_init::sqr#1
Coalesced [109] mulf_init::sqr1_hi#6 ← mulf_init::sqr1_hi#1
Coalesced [110] mulf_init::x_2#6 ← mulf_init::x_2#2
Coalesced [111] mulf_init::sqr#8 ← mulf_init::sqr#4
Coalesced (already) [112] mulf_init::x_2#7 ← mulf_init::x_2#3
Coalesced down to 13 phi equivalence classes
Culled Empty Block (label) @12
Culled Empty Block (label) @29
Culled Empty Block (label) @36
Culled Empty Block (label) @37
Culled Empty Block (label) @40
Culled Empty Block (label) main::@16
Culled Empty Block (label) print_dword::@2
Culled Empty Block (label) print_word::@2
Culled Empty Block (label) print_byte::@2
Culled Empty Block (label) mulf_init::@3
Culled Empty Block (label) mulf_init::@15
Culled Empty Block (label) mulf_init::@17
Renumbering block @39 to @1
Renumbering block main::@4 to main::@2
Renumbering block main::@6 to main::@3
Renumbering block main::@13 to main::@4
Renumbering block main::@14 to main::@5
Renumbering block main::@15 to main::@6
Renumbering block mulf_init::@4 to mulf_init::@3
Renumbering block mulf_init::@7 to mulf_init::@4
Renumbering block mulf_init::@9 to mulf_init::@5
Renumbering block mulf_init::@10 to mulf_init::@6
Renumbering block mulf_init::@11 to mulf_init::@7
Renumbering block mulf_init::@12 to mulf_init::@8
Renumbering block mulf_init::@18 to mulf_init::@9
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@6
Adding NOP phi() at start of print_set_screen
Adding NOP phi() at start of mulf_init
Adding NOP phi() at start of mulf_init::@9
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
[1] phi()
[2] call main
to:@end
@end: scope:[] from @1
[3] phi()
main: scope:[main] from @1
[4] phi()
[5] call mulf_init
to:main::@4
main::@4: scope:[main] from main
asm { sei }
to:main::@1
main::@1: scope:[main] from main::@4 main::@6
[7] (byte*) print_char_cursor#16 ← phi( main::@4/(byte*) 1024 main::@6/(const byte*) SCREEN#0 )
to:main::@2
main::@2: scope:[main] from main::@1 main::@2
[8] if(*((const byte*) RASTER#0)!=(byte) $ff) goto main::@2
to:main::@3
main::@3: scope:[main] from main::@2
[9] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0)
[10] call mulf16u
[11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1
to:main::@5
main::@5: scope:[main] from main::@3
[12] (dword) main::r#0 ← (dword) mulf16u::return#0
[13] *((const byte*) BORDERCOL#0) ← -- *((const byte*) BORDERCOL#0)
[14] (dword) print_dword::dw#0 ← (dword) main::r#0
[15] call print_dword
to:main::@6
main::@6: scope:[main] from main::@5
[16] phi()
[17] call print_set_screen
to:main::@1
print_set_screen: scope:[print_set_screen] from main::@6
[18] phi()
to:print_set_screen::@return
print_set_screen::@return: scope:[print_set_screen] from print_set_screen
[19] return
to:@return
print_dword: scope:[print_dword] from main::@5
[20] (word) print_word::w#0 ← > (dword) print_dword::dw#0
[21] call print_word
to:print_dword::@1
print_dword::@1: scope:[print_dword] from print_dword
[22] (word) print_word::w#1 ← < (dword) print_dword::dw#0
[23] call print_word
to:print_dword::@return
print_dword::@return: scope:[print_dword] from print_dword::@1
[24] return
to:@return
print_word: scope:[print_word] from print_dword print_dword::@1
[25] (byte*) print_char_cursor#34 ← phi( print_dword/(byte*) print_char_cursor#16 print_dword::@1/(byte*) print_char_cursor#10 )
[25] (word) print_word::w#2 ← phi( print_dword/(word) print_word::w#0 print_dword::@1/(word) print_word::w#1 )
[26] (byte) print_byte::b#0 ← > (word) print_word::w#2
[27] call print_byte
to:print_word::@1
print_word::@1: scope:[print_word] from print_word
[28] (byte) print_byte::b#1 ← < (word) print_word::w#2
[29] call print_byte
to:print_word::@return
print_word::@return: scope:[print_word] from print_word::@1
[30] return
to:@return
print_byte: scope:[print_byte] from print_word print_word::@1
[31] (byte*) print_char_cursor#36 ← phi( print_word/(byte*) print_char_cursor#34 print_word::@1/(byte*) print_char_cursor#10 )
[31] (byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 )
[32] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte) 4
[33] (byte) print_char::ch#0 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$0)
[34] call print_char
to:print_byte::@1
print_byte::@1: scope:[print_byte] from print_byte
[35] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte) $f
[36] (byte) print_char::ch#1 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$2)
[37] call print_char
to:print_byte::@return
print_byte::@return: scope:[print_byte] from print_byte::@1
[38] return
to:@return
print_char: scope:[print_char] from print_byte print_byte::@1
[39] (byte*) print_char_cursor#27 ← phi( print_byte/(byte*) print_char_cursor#36 print_byte::@1/(byte*) print_char_cursor#10 )
[39] (byte) print_char::ch#2 ← phi( print_byte/(byte) print_char::ch#0 print_byte::@1/(byte) print_char::ch#1 )
[40] *((byte*) print_char_cursor#27) ← (byte) print_char::ch#2
[41] (byte*) print_char_cursor#10 ← ++ (byte*) print_char_cursor#27
to:print_char::@return
print_char::@return: scope:[print_char] from print_char
[42] return
to:@return
mulf16u: scope:[mulf16u] from main::@3
[43] *((const word*) mulf16u::memA#0) ← (const word) main::a#0
[44] *((const word*) mulf16u::memB#0) ← (const word) main::b#0
asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: }
[46] (dword) mulf16u::return#1 ← *((const dword*) mulf16u::memR#0)
to:mulf16u::@return
mulf16u::@return: scope:[mulf16u] from mulf16u
[47] return
to:@return
mulf_init: scope:[mulf_init] from main
[48] phi()
to:mulf_init::@1
mulf_init::@1: scope:[mulf_init] from mulf_init mulf_init::@3
[49] (byte) mulf_init::x_2#3 ← phi( mulf_init/(byte) 0 mulf_init::@3/(byte) mulf_init::x_2#2 )
[49] (byte*) mulf_init::sqr1_hi#2 ← phi( mulf_init/(const byte[$200]) mulf_sqr1_hi#0+(byte) 1 mulf_init::@3/(byte*) mulf_init::sqr1_hi#1 )
[49] (word) mulf_init::sqr#4 ← phi( mulf_init/(byte) 0 mulf_init::@3/(word) mulf_init::sqr#1 )
[49] (byte) mulf_init::c#2 ← phi( mulf_init/(byte) 0 mulf_init::@3/(byte) mulf_init::c#1 )
[49] (byte*) mulf_init::sqr1_lo#2 ← phi( mulf_init/(const byte[$200]) mulf_sqr1_lo#0+(byte) 1 mulf_init::@3/(byte*) mulf_init::sqr1_lo#1 )
[50] if((byte*) mulf_init::sqr1_lo#2!=(const byte[$200]) mulf_sqr1_lo#0+(word) $200) goto mulf_init::@2
to:mulf_init::@5
mulf_init::@5: scope:[mulf_init] from mulf_init::@1 mulf_init::@8
[51] (byte) mulf_init::dir#2 ← phi( mulf_init::@8/(byte) mulf_init::dir#4 mulf_init::@1/(byte) $ff )
[51] (byte*) mulf_init::sqr2_hi#2 ← phi( mulf_init::@8/(byte*) mulf_init::sqr2_hi#1 mulf_init::@1/(const byte[$200]) mulf_sqr2_hi#0 )
[51] (byte) mulf_init::x_255#2 ← phi( mulf_init::@8/(byte) mulf_init::x_255#1 mulf_init::@1/(byte) -1 )
[51] (byte*) mulf_init::sqr2_lo#2 ← phi( mulf_init::@8/(byte*) mulf_init::sqr2_lo#1 mulf_init::@1/(const byte[$200]) mulf_sqr2_lo#0 )
[52] if((byte*) mulf_init::sqr2_lo#2!=(const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) goto mulf_init::@6
to:mulf_init::@7
mulf_init::@7: scope:[mulf_init] from mulf_init::@5
[53] *((const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_lo#0+(word) $100)
[54] *((const byte[$200]) mulf_sqr2_hi#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_hi#0+(word) $100)
to:mulf_init::@return
mulf_init::@return: scope:[mulf_init] from mulf_init::@7
[55] return
to:@return
mulf_init::@6: scope:[mulf_init] from mulf_init::@5
[56] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[$200]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2)
[57] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[$200]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2)
[58] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2
[59] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2
[60] if((byte) mulf_init::x_255#1!=(byte) 0) goto mulf_init::@9
to:mulf_init::@8
mulf_init::@9: scope:[mulf_init] from mulf_init::@6
[61] phi()
to:mulf_init::@8
mulf_init::@8: scope:[mulf_init] from mulf_init::@6 mulf_init::@9
[62] (byte) mulf_init::dir#4 ← phi( mulf_init::@9/(byte) mulf_init::dir#2 mulf_init::@6/(byte) 1 )
[63] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2
to:mulf_init::@5
mulf_init::@2: scope:[mulf_init] from mulf_init::@1
[64] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2
[65] (byte~) mulf_init::$9 ← (byte) mulf_init::c#1 & (byte) 1
[66] if((byte~) mulf_init::$9!=(byte) 0) goto mulf_init::@3
to:mulf_init::@4
mulf_init::@4: scope:[mulf_init] from mulf_init::@2
[67] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3
[68] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4
to:mulf_init::@3
mulf_init::@3: scope:[mulf_init] from mulf_init::@2 mulf_init::@4
[69] (byte) mulf_init::x_2#2 ← phi( mulf_init::@2/(byte) mulf_init::x_2#3 mulf_init::@4/(byte) mulf_init::x_2#1 )
[69] (word) mulf_init::sqr#3 ← phi( mulf_init::@2/(word) mulf_init::sqr#4 mulf_init::@4/(word) mulf_init::sqr#2 )
[70] (byte~) mulf_init::$12 ← < (word) mulf_init::sqr#3
[71] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$12
[72] (byte~) mulf_init::$13 ← > (word) mulf_init::sqr#3
[73] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$13
[74] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2
[75] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2
[76] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2
to:mulf_init::@1
VARIABLE REGISTER WEIGHTS
(byte*) BORDERCOL
(byte*) RASTER
(byte*) SCREEN
(void()) main()
(word) main::a
(word) main::b
(dword) main::r
(dword) main::r#0 11.0
(dword()) mulf16u((word) mulf16u::a , (word) mulf16u::b)
(word) mulf16u::a
(word) mulf16u::b
(word*) mulf16u::memA
(word*) mulf16u::memB
(dword*) mulf16u::memR
(dword) mulf16u::return
(dword) mulf16u::return#0 22.0
(dword) mulf16u::return#1 4.333333333333333
(void()) mulf_init()
(byte~) mulf_init::$12 22.0
(byte~) mulf_init::$13 22.0
(byte~) mulf_init::$9 22.0
(byte) mulf_init::c
(byte) mulf_init::c#1 2.5384615384615383
(byte) mulf_init::c#2 11.0
(byte) mulf_init::dir
(byte) mulf_init::dir#2 4.125
(byte) mulf_init::dir#4 11.0
(word) mulf_init::sqr
(word) mulf_init::sqr#1 11.0
(word) mulf_init::sqr#2 22.0
(word) mulf_init::sqr#3 9.166666666666666
(word) mulf_init::sqr#4 5.5
(byte*) mulf_init::sqr1_hi
(byte*) mulf_init::sqr1_hi#1 7.333333333333333
(byte*) mulf_init::sqr1_hi#2 2.75
(byte*) mulf_init::sqr1_lo
(byte*) mulf_init::sqr1_lo#1 22.0
(byte*) mulf_init::sqr1_lo#2 3.142857142857143
(byte*) mulf_init::sqr2_hi
(byte*) mulf_init::sqr2_hi#1 3.6666666666666665
(byte*) mulf_init::sqr2_hi#2 8.25
(byte*) mulf_init::sqr2_lo
(byte*) mulf_init::sqr2_lo#1 22.0
(byte*) mulf_init::sqr2_lo#2 4.888888888888889
(byte) mulf_init::x_2
(byte) mulf_init::x_2#1 11.0
(byte) mulf_init::x_2#2 5.5
(byte) mulf_init::x_2#3 6.6000000000000005
(byte) mulf_init::x_255
(byte) mulf_init::x_255#1 6.6000000000000005
(byte) mulf_init::x_255#2 8.8
(byte[$200]) mulf_sqr1_hi
(byte[$200]) mulf_sqr1_lo
(byte[$200]) mulf_sqr2_hi
(byte[$200]) mulf_sqr2_lo
(void()) print_byte((byte) print_byte::b)
(byte~) print_byte::$0 4.0
(byte~) print_byte::$2 4.0
(byte) print_byte::b
(byte) print_byte::b#0 4.0
(byte) print_byte::b#1 4.0
(byte) print_byte::b#2 2.0
(void()) print_char((byte) print_char::ch)
(byte) print_char::ch
(byte) print_char::ch#0 4.0
(byte) print_char::ch#1 4.0
(byte) print_char::ch#2 6.0
(byte*) print_char_cursor
(byte*) print_char_cursor#10 0.6153846153846154
(byte*) print_char_cursor#16 0.2222222222222222
(byte*) print_char_cursor#27 4.0
(byte*) print_char_cursor#34 3.0
(byte*) print_char_cursor#36 2.0
(void()) print_dword((dword) print_dword::dw)
(dword) print_dword::dw
(dword) print_dword::dw#0 5.0
(byte[]) print_hextab
(byte*) print_line_cursor
(byte*) print_screen
(void()) print_set_screen((byte*) print_set_screen::screen)
(byte*) print_set_screen::screen
(void()) print_word((word) print_word::w)
(word) print_word::w
(word) print_word::w#0 4.0
(word) print_word::w#1 4.0
(word) print_word::w#2 2.6666666666666665
Initial phi equivalence classes
[ print_word::w#2 print_word::w#0 print_word::w#1 ]
[ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
[ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
[ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ]
[ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ]
[ mulf_init::c#2 mulf_init::c#1 ]
[ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
[ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
[ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
[ mulf_init::x_255#2 mulf_init::x_255#1 ]
[ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
[ mulf_init::dir#2 mulf_init::dir#4 ]
[ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
Added variable mulf16u::return#0 to zero page equivalence class [ mulf16u::return#0 ]
Added variable main::r#0 to zero page equivalence class [ main::r#0 ]
Added variable print_dword::dw#0 to zero page equivalence class [ print_dword::dw#0 ]
Added variable print_byte::$0 to zero page equivalence class [ print_byte::$0 ]
Added variable print_byte::$2 to zero page equivalence class [ print_byte::$2 ]
Added variable mulf16u::return#1 to zero page equivalence class [ mulf16u::return#1 ]
Added variable mulf_init::$9 to zero page equivalence class [ mulf_init::$9 ]
Added variable mulf_init::$12 to zero page equivalence class [ mulf_init::$12 ]
Added variable mulf_init::$13 to zero page equivalence class [ mulf_init::$13 ]
Complete equivalence classes
[ print_word::w#2 print_word::w#0 print_word::w#1 ]
[ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
[ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
[ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ]
[ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ]
[ mulf_init::c#2 mulf_init::c#1 ]
[ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
[ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
[ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
[ mulf_init::x_255#2 mulf_init::x_255#1 ]
[ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
[ mulf_init::dir#2 mulf_init::dir#4 ]
[ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
[ mulf16u::return#0 ]
[ main::r#0 ]
[ print_dword::dw#0 ]
[ print_byte::$0 ]
[ print_byte::$2 ]
[ mulf16u::return#1 ]
[ mulf_init::$9 ]
[ mulf_init::$12 ]
[ mulf_init::$13 ]
Allocated zp ZP_WORD:2 [ print_word::w#2 print_word::w#0 print_word::w#1 ]
Allocated zp ZP_BYTE:4 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
Allocated zp ZP_BYTE:5 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
Allocated zp ZP_WORD:6 [ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ]
Allocated zp ZP_WORD:8 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ]
Allocated zp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ]
Allocated zp ZP_WORD:11 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
Allocated zp ZP_BYTE:13 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
Allocated zp ZP_WORD:14 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
Allocated zp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ]
Allocated zp ZP_WORD:17 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
Allocated zp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ]
Allocated zp ZP_WORD:20 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
Allocated zp ZP_DWORD:22 [ mulf16u::return#0 ]
Allocated zp ZP_DWORD:26 [ main::r#0 ]
Allocated zp ZP_DWORD:30 [ print_dword::dw#0 ]
Allocated zp ZP_BYTE:34 [ print_byte::$0 ]
Allocated zp ZP_BYTE:35 [ print_byte::$2 ]
Allocated zp ZP_DWORD:36 [ mulf16u::return#1 ]
Allocated zp ZP_BYTE:40 [ mulf_init::$9 ]
Allocated zp ZP_BYTE:41 [ mulf_init::$12 ]
Allocated zp ZP_BYTE:42 [ mulf_init::$13 ]
INITIAL ASM
Target platform is c64basic / MOS6502X
// File Comments
// Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
// Global Constants & labels
.label RASTER = $d012
.label BORDERCOL = $d020
.label SCREEN = $400
.label print_char_cursor = 6
// @begin
bbegin:
// [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
// @1
b1:
// [2] call main
// [4] phi from @1 to main [phi:@1->main]
main_from_b1:
jsr main
// [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
// @end
bend:
// main
main: {
.label a = $4d2
.label b = $929
.label r = $1a
// [5] call mulf_init
// [48] phi from main to mulf_init [phi:main->mulf_init]
mulf_init_from_main:
jsr mulf_init
jmp b4
// main::@4
b4:
// asm { sei }
sei
// [7] phi from main::@4 to main::@1 [phi:main::@4->main::@1]
b1_from_b4:
// [7] phi (byte*) print_char_cursor#16 = (byte*) 1024 [phi:main::@4->main::@1#0] -- pbuz1=pbuc1
lda #<$400
sta.z print_char_cursor
lda #>$400
sta.z print_char_cursor+1
jmp b1
// main::@1
b1:
jmp b2
// main::@2
b2:
// [8] if(*((const byte*) RASTER#0)!=(byte) $ff) goto main::@2 -- _deref_pbuc1_neq_vbuc2_then_la1
lda #$ff
cmp RASTER
bne b2
jmp b3
// main::@3
b3:
// [9] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1
inc BORDERCOL
// [10] call mulf16u
jsr mulf16u
// [11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1 -- vduz1=vduz2
lda.z mulf16u.return_1
sta.z mulf16u.return
lda.z mulf16u.return_1+1
sta.z mulf16u.return+1
lda.z mulf16u.return_1+2
sta.z mulf16u.return+2
lda.z mulf16u.return_1+3
sta.z mulf16u.return+3
jmp b5
// main::@5
b5:
// [12] (dword) main::r#0 ← (dword) mulf16u::return#0 -- vduz1=vduz2
lda.z mulf16u.return
sta.z r
lda.z mulf16u.return+1
sta.z r+1
lda.z mulf16u.return+2
sta.z r+2
lda.z mulf16u.return+3
sta.z r+3
// [13] *((const byte*) BORDERCOL#0) ← -- *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_dec__deref_pbuc1
dec BORDERCOL
// [14] (dword) print_dword::dw#0 ← (dword) main::r#0 -- vduz1=vduz2
lda.z r
sta.z print_dword.dw
lda.z r+1
sta.z print_dword.dw+1
lda.z r+2
sta.z print_dword.dw+2
lda.z r+3
sta.z print_dword.dw+3
// [15] call print_dword
jsr print_dword
// [16] phi from main::@5 to main::@6 [phi:main::@5->main::@6]
b6_from_b5:
jmp b6
// main::@6
b6:
// [17] call print_set_screen
// [18] phi from main::@6 to print_set_screen [phi:main::@6->print_set_screen]
print_set_screen_from_b6:
jsr print_set_screen
// [7] phi from main::@6 to main::@1 [phi:main::@6->main::@1]
b1_from_b6:
// [7] phi (byte*) print_char_cursor#16 = (const byte*) SCREEN#0 [phi:main::@6->main::@1#0] -- pbuz1=pbuc1
lda #<SCREEN
sta.z print_char_cursor
lda #>SCREEN
sta.z print_char_cursor+1
jmp b1
}
// print_set_screen
// Set the screen to print on. Also resets current line/char cursor.
print_set_screen: {
jmp breturn
// print_set_screen::@return
breturn:
// [19] return
rts
}
// print_dword
// Print a dword as HEX
// print_dword(dword zeropage($1e) dw)
print_dword: {
.label dw = $1e
// [20] (word) print_word::w#0 ← > (dword) print_dword::dw#0 -- vwuz1=_hi_vduz2
lda.z dw+2
sta.z print_word.w
lda.z dw+3
sta.z print_word.w+1
// [21] call print_word
// [25] phi from print_dword to print_word [phi:print_dword->print_word]
print_word_from_print_dword:
// [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#16 [phi:print_dword->print_word#0] -- register_copy
// [25] phi (word) print_word::w#2 = (word) print_word::w#0 [phi:print_dword->print_word#1] -- register_copy
jsr print_word
jmp b1
// print_dword::@1
b1:
// [22] (word) print_word::w#1 ← < (dword) print_dword::dw#0 -- vwuz1=_lo_vduz2
lda.z dw
sta.z print_word.w
lda.z dw+1
sta.z print_word.w+1
// [23] call print_word
// [25] phi from print_dword::@1 to print_word [phi:print_dword::@1->print_word]
print_word_from_b1:
// [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#10 [phi:print_dword::@1->print_word#0] -- register_copy
// [25] phi (word) print_word::w#2 = (word) print_word::w#1 [phi:print_dword::@1->print_word#1] -- register_copy
jsr print_word
jmp breturn
// print_dword::@return
breturn:
// [24] return
rts
}
// print_word
// Print a word as HEX
// print_word(word zeropage(2) w)
print_word: {
.label w = 2
// [26] (byte) print_byte::b#0 ← > (word) print_word::w#2 -- vbuz1=_hi_vwuz2
lda.z w+1
sta.z print_byte.b
// [27] call print_byte
// [31] phi from print_word to print_byte [phi:print_word->print_byte]
print_byte_from_print_word:
// [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#34 [phi:print_word->print_byte#0] -- register_copy
// [31] phi (byte) print_byte::b#2 = (byte) print_byte::b#0 [phi:print_word->print_byte#1] -- register_copy
jsr print_byte
jmp b1
// print_word::@1
b1:
// [28] (byte) print_byte::b#1 ← < (word) print_word::w#2 -- vbuz1=_lo_vwuz2
lda.z w
sta.z print_byte.b
// [29] call print_byte
// [31] phi from print_word::@1 to print_byte [phi:print_word::@1->print_byte]
print_byte_from_b1:
// [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#10 [phi:print_word::@1->print_byte#0] -- register_copy
// [31] phi (byte) print_byte::b#2 = (byte) print_byte::b#1 [phi:print_word::@1->print_byte#1] -- register_copy
jsr print_byte
jmp breturn
// print_word::@return
breturn:
// [30] return
rts
}
// print_byte
// Print a byte as HEX
// print_byte(byte zeropage(4) b)
print_byte: {
.label _0 = $22
.label _2 = $23
.label b = 4
// [32] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte) 4 -- vbuz1=vbuz2_ror_4
lda.z b
lsr
lsr
lsr
lsr
sta.z _0
// [33] (byte) print_char::ch#0 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$0) -- vbuz1=pbuc1_derefidx_vbuz2
ldy.z _0
lda print_hextab,y
sta.z print_char.ch
// [34] call print_char
// [39] phi from print_byte to print_char [phi:print_byte->print_char]
print_char_from_print_byte:
// [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#36 [phi:print_byte->print_char#0] -- register_copy
// [39] phi (byte) print_char::ch#2 = (byte) print_char::ch#0 [phi:print_byte->print_char#1] -- register_copy
jsr print_char
jmp b1
// print_byte::@1
b1:
// [35] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte) $f -- vbuz1=vbuz2_band_vbuc1
lda #$f
and.z b
sta.z _2
// [36] (byte) print_char::ch#1 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$2) -- vbuz1=pbuc1_derefidx_vbuz2
ldy.z _2
lda print_hextab,y
sta.z print_char.ch
// [37] call print_char
// [39] phi from print_byte::@1 to print_char [phi:print_byte::@1->print_char]
print_char_from_b1:
// [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#10 [phi:print_byte::@1->print_char#0] -- register_copy
// [39] phi (byte) print_char::ch#2 = (byte) print_char::ch#1 [phi:print_byte::@1->print_char#1] -- register_copy
jsr print_char
jmp breturn
// print_byte::@return
breturn:
// [38] return
rts
}
// print_char
// Print a single char
// print_char(byte zeropage(5) ch)
print_char: {
.label ch = 5
// [40] *((byte*) print_char_cursor#27) ← (byte) print_char::ch#2 -- _deref_pbuz1=vbuz2
lda.z ch
ldy #0
sta (print_char_cursor),y
// [41] (byte*) print_char_cursor#10 ← ++ (byte*) print_char_cursor#27 -- pbuz1=_inc_pbuz1
inc.z print_char_cursor
bne !+
inc.z print_char_cursor+1
!:
jmp breturn
// print_char::@return
breturn:
// [42] return
rts
}
// mulf16u
// Fast multiply two unsigned words to a double word result
// Done in assembler to utilize fast addition A+X
mulf16u: {
.label memA = $f8
.label memB = $fa
.label memR = $fc
.label return = $16
.label return_1 = $24
// [43] *((const word*) mulf16u::memA#0) ← (const word) main::a#0 -- _deref_pwuc1=vwuc2
lda #<main.a
sta memA
lda #>main.a
sta memA+1
// [44] *((const word*) mulf16u::memB#0) ← (const word) main::b#0 -- _deref_pwuc1=vwuc2
lda #<main.b
sta memB
lda #>main.b
sta memB+1
// asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: }
lda memA
sta sm1a+1
sta sm3a+1
sta sm5a+1
sta sm7a+1
eor #$ff
sta sm2a+1
sta sm4a+1
sta sm6a+1
sta sm8a+1
lda memA+1
sta sm1b+1
sta sm3b+1
sta sm5b+1
sta sm7b+1
eor #$ff
sta sm2b+1
sta sm4b+1
sta sm6b+1
sta sm8b+1
ldx memB
sec
sm1a:
lda mulf_sqr1_lo,x
sm2a:
sbc mulf_sqr2_lo,x
sta memR+0
sm3a:
lda mulf_sqr1_hi,x
sm4a:
sbc mulf_sqr2_hi,x
sta _AA+1
sec
sm1b:
lda mulf_sqr1_lo,x
sm2b:
sbc mulf_sqr2_lo,x
sta _cc+1
sm3b:
lda mulf_sqr1_hi,x
sm4b:
sbc mulf_sqr2_hi,x
sta _CC+1
ldx memB+1
sec
sm5a:
lda mulf_sqr1_lo,x
sm6a:
sbc mulf_sqr2_lo,x
sta _bb+1
sm7a:
lda mulf_sqr1_hi,x
sm8a:
sbc mulf_sqr2_hi,x
sta _BB+1
sec
sm5b:
lda mulf_sqr1_lo,x
sm6b:
sbc mulf_sqr2_lo,x
sta _dd+1
sm7b:
lda mulf_sqr1_hi,x
sm8b:
sbc mulf_sqr2_hi,x
sta memR+3
clc
_AA:
lda #0
_bb:
adc #0
sta memR+1
_BB:
lda #0
_CC:
adc #0
sta memR+2
bcc !+
inc memR+3
clc
!:
_cc:
lda #0
adc memR+1
sta memR+1
_dd:
lda #0
adc memR+2
sta memR+2
bcc !+
inc memR+3
!:
// [46] (dword) mulf16u::return#1 ← *((const dword*) mulf16u::memR#0) -- vduz1=_deref_pduc1
lda memR
sta.z return_1
lda memR+1
sta.z return_1+1
lda memR+2
sta.z return_1+2
lda memR+3
sta.z return_1+3
jmp breturn
// mulf16u::@return
breturn:
// [47] return
rts
}
// mulf_init
// Initialize the mulf_sqr multiplication tables with f(x)=int(x*x/4)
mulf_init: {
.label _9 = $28
.label _12 = $29
.label _13 = $2a
.label c = $a
.label sqr1_hi = $b
.label sqr = $14
.label sqr1_lo = 8
.label x_2 = $d
.label sqr2_hi = $11
.label x_255 = $10
.label sqr2_lo = $e
.label dir = $13
// [49] phi from mulf_init to mulf_init::@1 [phi:mulf_init->mulf_init::@1]
b1_from_mulf_init:
// [49] phi (byte) mulf_init::x_2#3 = (byte) 0 [phi:mulf_init->mulf_init::@1#0] -- vbuz1=vbuc1
lda #0
sta.z x_2
// [49] phi (byte*) mulf_init::sqr1_hi#2 = (const byte[$200]) mulf_sqr1_hi#0+(byte) 1 [phi:mulf_init->mulf_init::@1#1] -- pbuz1=pbuc1
lda #<mulf_sqr1_hi+1
sta.z sqr1_hi
lda #>mulf_sqr1_hi+1
sta.z sqr1_hi+1
// [49] phi (word) mulf_init::sqr#4 = (byte) 0 [phi:mulf_init->mulf_init::@1#2] -- vwuz1=vbuc1
lda #<0
sta.z sqr
lda #>0
sta.z sqr+1
// [49] phi (byte) mulf_init::c#2 = (byte) 0 [phi:mulf_init->mulf_init::@1#3] -- vbuz1=vbuc1
lda #0
sta.z c
// [49] phi (byte*) mulf_init::sqr1_lo#2 = (const byte[$200]) mulf_sqr1_lo#0+(byte) 1 [phi:mulf_init->mulf_init::@1#4] -- pbuz1=pbuc1
lda #<mulf_sqr1_lo+1
sta.z sqr1_lo
lda #>mulf_sqr1_lo+1
sta.z sqr1_lo+1
jmp b1
// mulf_init::@1
b1:
// [50] if((byte*) mulf_init::sqr1_lo#2!=(const byte[$200]) mulf_sqr1_lo#0+(word) $200) goto mulf_init::@2 -- pbuz1_neq_pbuc1_then_la1
lda.z sqr1_lo+1
cmp #>mulf_sqr1_lo+$200
bne b2
lda.z sqr1_lo
cmp #<mulf_sqr1_lo+$200
bne b2
// [51] phi from mulf_init::@1 to mulf_init::@5 [phi:mulf_init::@1->mulf_init::@5]
b5_from_b1:
// [51] phi (byte) mulf_init::dir#2 = (byte) $ff [phi:mulf_init::@1->mulf_init::@5#0] -- vbuz1=vbuc1
lda #$ff
sta.z dir
// [51] phi (byte*) mulf_init::sqr2_hi#2 = (const byte[$200]) mulf_sqr2_hi#0 [phi:mulf_init::@1->mulf_init::@5#1] -- pbuz1=pbuc1
lda #<mulf_sqr2_hi
sta.z sqr2_hi
lda #>mulf_sqr2_hi
sta.z sqr2_hi+1
// [51] phi (byte) mulf_init::x_255#2 = (byte) -1 [phi:mulf_init::@1->mulf_init::@5#2] -- vbuz1=vbuc1
lda #-1
sta.z x_255
// [51] phi (byte*) mulf_init::sqr2_lo#2 = (const byte[$200]) mulf_sqr2_lo#0 [phi:mulf_init::@1->mulf_init::@5#3] -- pbuz1=pbuc1
lda #<mulf_sqr2_lo
sta.z sqr2_lo
lda #>mulf_sqr2_lo
sta.z sqr2_lo+1
jmp b5
// mulf_init::@5
b5:
// [52] if((byte*) mulf_init::sqr2_lo#2!=(const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) goto mulf_init::@6 -- pbuz1_neq_pbuc1_then_la1
lda.z sqr2_lo+1
cmp #>mulf_sqr2_lo+$1ff
bne b6
lda.z sqr2_lo
cmp #<mulf_sqr2_lo+$1ff
bne b6
jmp b7
// mulf_init::@7
b7:
// [53] *((const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_lo#0+(word) $100) -- _deref_pbuc1=_deref_pbuc2
// Set the very last value g(511) = f(256)
lda mulf_sqr1_lo+$100
sta mulf_sqr2_lo+$1ff
// [54] *((const byte[$200]) mulf_sqr2_hi#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_hi#0+(word) $100) -- _deref_pbuc1=_deref_pbuc2
lda mulf_sqr1_hi+$100
sta mulf_sqr2_hi+$1ff
jmp breturn
// mulf_init::@return
breturn:
// [55] return
rts
// mulf_init::@6
b6:
// [56] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[$200]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2) -- _deref_pbuz1=pbuc1_derefidx_vbuz2
ldy.z x_255
lda mulf_sqr1_lo,y
ldy #0
sta (sqr2_lo),y
// [57] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[$200]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2) -- _deref_pbuz1=pbuc1_derefidx_vbuz2
ldy.z x_255
lda mulf_sqr1_hi,y
ldy #0
sta (sqr2_hi),y
// [58] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2 -- pbuz1=_inc_pbuz1
inc.z sqr2_hi
bne !+
inc.z sqr2_hi+1
!:
// [59] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2 -- vbuz1=vbuz1_plus_vbuz2
lda.z x_255
clc
adc.z dir
sta.z x_255
// [60] if((byte) mulf_init::x_255#1!=(byte) 0) goto mulf_init::@9 -- vbuz1_neq_0_then_la1
lda.z x_255
cmp #0
bne b9_from_b6
// [62] phi from mulf_init::@6 to mulf_init::@8 [phi:mulf_init::@6->mulf_init::@8]
b8_from_b6:
// [62] phi (byte) mulf_init::dir#4 = (byte) 1 [phi:mulf_init::@6->mulf_init::@8#0] -- vbuz1=vbuc1
lda #1
sta.z dir
jmp b8
// [61] phi from mulf_init::@6 to mulf_init::@9 [phi:mulf_init::@6->mulf_init::@9]
b9_from_b6:
jmp b9
// mulf_init::@9
b9:
// [62] phi from mulf_init::@9 to mulf_init::@8 [phi:mulf_init::@9->mulf_init::@8]
b8_from_b9:
// [62] phi (byte) mulf_init::dir#4 = (byte) mulf_init::dir#2 [phi:mulf_init::@9->mulf_init::@8#0] -- register_copy
jmp b8
// mulf_init::@8
b8:
// [63] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2 -- pbuz1=_inc_pbuz1
inc.z sqr2_lo
bne !+
inc.z sqr2_lo+1
!:
// [51] phi from mulf_init::@8 to mulf_init::@5 [phi:mulf_init::@8->mulf_init::@5]
b5_from_b8:
// [51] phi (byte) mulf_init::dir#2 = (byte) mulf_init::dir#4 [phi:mulf_init::@8->mulf_init::@5#0] -- register_copy
// [51] phi (byte*) mulf_init::sqr2_hi#2 = (byte*) mulf_init::sqr2_hi#1 [phi:mulf_init::@8->mulf_init::@5#1] -- register_copy
// [51] phi (byte) mulf_init::x_255#2 = (byte) mulf_init::x_255#1 [phi:mulf_init::@8->mulf_init::@5#2] -- register_copy
// [51] phi (byte*) mulf_init::sqr2_lo#2 = (byte*) mulf_init::sqr2_lo#1 [phi:mulf_init::@8->mulf_init::@5#3] -- register_copy
jmp b5
// mulf_init::@2
b2:
// [64] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2 -- vbuz1=_inc_vbuz1
inc.z c
// [65] (byte~) mulf_init::$9 ← (byte) mulf_init::c#1 & (byte) 1 -- vbuz1=vbuz2_band_vbuc1
lda #1
and.z c
sta.z _9
// [66] if((byte~) mulf_init::$9!=(byte) 0) goto mulf_init::@3 -- vbuz1_neq_0_then_la1
lda.z _9
cmp #0
bne b3_from_b2
jmp b4
// mulf_init::@4
b4:
// [67] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3 -- vbuz1=_inc_vbuz1
inc.z x_2
// [68] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4 -- vwuz1=_inc_vwuz1
inc.z sqr
bne !+
inc.z sqr+1
!:
// [69] phi from mulf_init::@2 mulf_init::@4 to mulf_init::@3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3]
b3_from_b2:
b3_from_b4:
// [69] phi (byte) mulf_init::x_2#2 = (byte) mulf_init::x_2#3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#0] -- register_copy
// [69] phi (word) mulf_init::sqr#3 = (word) mulf_init::sqr#4 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#1] -- register_copy
jmp b3
// mulf_init::@3
b3:
// [70] (byte~) mulf_init::$12 ← < (word) mulf_init::sqr#3 -- vbuz1=_lo_vwuz2
lda.z sqr
sta.z _12
// [71] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$12 -- _deref_pbuz1=vbuz2
lda.z _12
ldy #0
sta (sqr1_lo),y
// [72] (byte~) mulf_init::$13 ← > (word) mulf_init::sqr#3 -- vbuz1=_hi_vwuz2
lda.z sqr+1
sta.z _13
// [73] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$13 -- _deref_pbuz1=vbuz2
lda.z _13
ldy #0
sta (sqr1_hi),y
// [74] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2 -- pbuz1=_inc_pbuz1
inc.z sqr1_hi
bne !+
inc.z sqr1_hi+1
!:
// [75] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2 -- vwuz1=vwuz1_plus_vbuz2
lda.z x_2
clc
adc.z sqr
sta.z sqr
bcc !+
inc.z sqr+1
!:
// [76] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2 -- pbuz1=_inc_pbuz1
inc.z sqr1_lo
bne !+
inc.z sqr1_lo+1
!:
// [49] phi from mulf_init::@3 to mulf_init::@1 [phi:mulf_init::@3->mulf_init::@1]
b1_from_b3:
// [49] phi (byte) mulf_init::x_2#3 = (byte) mulf_init::x_2#2 [phi:mulf_init::@3->mulf_init::@1#0] -- register_copy
// [49] phi (byte*) mulf_init::sqr1_hi#2 = (byte*) mulf_init::sqr1_hi#1 [phi:mulf_init::@3->mulf_init::@1#1] -- register_copy
// [49] phi (word) mulf_init::sqr#4 = (word) mulf_init::sqr#1 [phi:mulf_init::@3->mulf_init::@1#2] -- register_copy
// [49] phi (byte) mulf_init::c#2 = (byte) mulf_init::c#1 [phi:mulf_init::@3->mulf_init::@1#3] -- register_copy
// [49] phi (byte*) mulf_init::sqr1_lo#2 = (byte*) mulf_init::sqr1_lo#1 [phi:mulf_init::@3->mulf_init::@1#4] -- register_copy
jmp b1
}
// File Data
print_hextab: .text "0123456789abcdef"
// mulf_sqr tables will contain f(x)=int(x*x/4) and g(x) = f(x-255).
// <f(x) = <(( x * x )/4)
.align $100
mulf_sqr1_lo: .fill $200, 0
// >f(x) = >(( x * x )/4)
.align $100
mulf_sqr1_hi: .fill $200, 0
// <g(x) = <((( x - 255) * ( x - 255 ))/4)
.align $100
mulf_sqr2_lo: .fill $200, 0
// >g(x) = >((( x - 255) * ( x - 255 ))/4)
.align $100
mulf_sqr2_hi: .fill $200, 0
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [8] if(*((const byte*) RASTER#0)!=(byte) $ff) goto main::@2 [ print_char_cursor#16 ] ( main:2 [ print_char_cursor#16 ] ) always clobbers reg byte a
Statement [11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1 [ print_char_cursor#16 mulf16u::return#0 ] ( main:2 [ print_char_cursor#16 mulf16u::return#0 ] ) always clobbers reg byte a
Statement [12] (dword) main::r#0 ← (dword) mulf16u::return#0 [ print_char_cursor#16 main::r#0 ] ( main:2 [ print_char_cursor#16 main::r#0 ] ) always clobbers reg byte a
Statement [14] (dword) print_dword::dw#0 ← (dword) main::r#0 [ print_char_cursor#16 print_dword::dw#0 ] ( main:2 [ print_char_cursor#16 print_dword::dw#0 ] ) always clobbers reg byte a
Statement [20] (word) print_word::w#0 ← > (dword) print_dword::dw#0 [ print_char_cursor#16 print_dword::dw#0 print_word::w#0 ] ( main:2::print_dword:15 [ print_char_cursor#16 print_dword::dw#0 print_word::w#0 ] ) always clobbers reg byte a
Statement [22] (word) print_word::w#1 ← < (dword) print_dword::dw#0 [ print_word::w#1 print_char_cursor#10 ] ( main:2::print_dword:15 [ print_word::w#1 print_char_cursor#10 ] ) always clobbers reg byte a
Statement [26] (byte) print_byte::b#0 ← > (word) print_word::w#2 [ print_word::w#2 print_char_cursor#34 print_byte::b#0 ] ( main:2::print_dword:15::print_word:21 [ print_dword::dw#0 print_word::w#2 print_char_cursor#34 print_byte::b#0 ] main:2::print_dword:15::print_word:23 [ print_word::w#2 print_char_cursor#34 print_byte::b#0 ] ) always clobbers reg byte a
Statement [28] (byte) print_byte::b#1 ← < (word) print_word::w#2 [ print_char_cursor#10 print_byte::b#1 ] ( main:2::print_dword:15::print_word:21 [ print_dword::dw#0 print_char_cursor#10 print_byte::b#1 ] main:2::print_dword:15::print_word:23 [ print_char_cursor#10 print_byte::b#1 ] ) always clobbers reg byte a
Statement [32] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte) 4 [ print_byte::b#2 print_char_cursor#36 print_byte::$0 ] ( main:2::print_dword:15::print_word:21::print_byte:27 [ print_dword::dw#0 print_word::w#2 print_byte::b#2 print_char_cursor#36 print_byte::$0 ] main:2::print_dword:15::print_word:23::print_byte:27 [ print_word::w#2 print_byte::b#2 print_char_cursor#36 print_byte::$0 ] main:2::print_dword:15::print_word:21::print_byte:29 [ print_dword::dw#0 print_byte::b#2 print_char_cursor#36 print_byte::$0 ] main:2::print_dword:15::print_word:23::print_byte:29 [ print_byte::b#2 print_char_cursor#36 print_byte::$0 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:4 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
Statement [35] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte) $f [ print_char_cursor#10 print_byte::$2 ] ( main:2::print_dword:15::print_word:21::print_byte:27 [ print_dword::dw#0 print_word::w#2 print_char_cursor#10 print_byte::$2 ] main:2::print_dword:15::print_word:23::print_byte:27 [ print_word::w#2 print_char_cursor#10 print_byte::$2 ] main:2::print_dword:15::print_word:21::print_byte:29 [ print_dword::dw#0 print_char_cursor#10 print_byte::$2 ] main:2::print_dword:15::print_word:23::print_byte:29 [ print_char_cursor#10 print_byte::$2 ] ) always clobbers reg byte a
Statement [40] *((byte*) print_char_cursor#27) ← (byte) print_char::ch#2 [ print_char_cursor#27 ] ( main:2::print_dword:15::print_word:21::print_byte:27::print_char:34 [ print_dword::dw#0 print_word::w#2 print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:27::print_char:34 [ print_word::w#2 print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:21::print_byte:29::print_char:34 [ print_dword::dw#0 print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:29::print_char:34 [ print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:21::print_byte:27::print_char:37 [ print_dword::dw#0 print_word::w#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:27::print_char:37 [ print_word::w#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:21::print_byte:29::print_char:37 [ print_dword::dw#0 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:29::print_char:37 [ print_char_cursor#27 ] ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:4 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
Statement [43] *((const word*) mulf16u::memA#0) ← (const word) main::a#0 [ ] ( main:2::mulf16u:10 [ print_char_cursor#16 ] ) always clobbers reg byte a
Statement [44] *((const word*) mulf16u::memB#0) ← (const word) main::b#0 [ ] ( main:2::mulf16u:10 [ print_char_cursor#16 ] ) always clobbers reg byte a
Statement asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: } always clobbers reg byte a reg byte x
Statement [46] (dword) mulf16u::return#1 ← *((const dword*) mulf16u::memR#0) [ mulf16u::return#1 ] ( main:2::mulf16u:10 [ print_char_cursor#16 mulf16u::return#1 ] ) always clobbers reg byte a
Statement [50] if((byte*) mulf_init::sqr1_lo#2!=(const byte[$200]) mulf_sqr1_lo#0+(word) $200) goto mulf_init::@2 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:13 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
Statement [52] if((byte*) mulf_init::sqr2_lo#2!=(const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) goto mulf_init::@6 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ]
Statement [53] *((const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_lo#0+(word) $100) [ ] ( main:2::mulf_init:5 [ ] ) always clobbers reg byte a
Statement [54] *((const byte[$200]) mulf_sqr2_hi#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_hi#0+(word) $100) [ ] ( main:2::mulf_init:5 [ ] ) always clobbers reg byte a
Statement [56] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[$200]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2) [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a reg byte y
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ]
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ]
Statement [57] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[$200]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2) [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a reg byte y
Statement [59] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] ) always clobbers reg byte a
Statement [65] (byte~) mulf_init::$9 ← (byte) mulf_init::c#1 & (byte) 1 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$9 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$9 ] ) always clobbers reg byte a
Statement [70] (byte~) mulf_init::$12 ← < (word) mulf_init::sqr#3 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$12 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$12 ] ) always clobbers reg byte a
Statement [71] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$12 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ]
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:13 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
Statement [72] (byte~) mulf_init::$13 ← > (word) mulf_init::sqr#3 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$13 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$13 ] ) always clobbers reg byte a
Statement [73] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$13 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ) always clobbers reg byte y
Statement [75] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ) always clobbers reg byte a
Statement [8] if(*((const byte*) RASTER#0)!=(byte) $ff) goto main::@2 [ print_char_cursor#16 ] ( main:2 [ print_char_cursor#16 ] ) always clobbers reg byte a
Statement [11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1 [ print_char_cursor#16 mulf16u::return#0 ] ( main:2 [ print_char_cursor#16 mulf16u::return#0 ] ) always clobbers reg byte a
Statement [12] (dword) main::r#0 ← (dword) mulf16u::return#0 [ print_char_cursor#16 main::r#0 ] ( main:2 [ print_char_cursor#16 main::r#0 ] ) always clobbers reg byte a
Statement [14] (dword) print_dword::dw#0 ← (dword) main::r#0 [ print_char_cursor#16 print_dword::dw#0 ] ( main:2 [ print_char_cursor#16 print_dword::dw#0 ] ) always clobbers reg byte a
Statement [20] (word) print_word::w#0 ← > (dword) print_dword::dw#0 [ print_char_cursor#16 print_dword::dw#0 print_word::w#0 ] ( main:2::print_dword:15 [ print_char_cursor#16 print_dword::dw#0 print_word::w#0 ] ) always clobbers reg byte a
Statement [22] (word) print_word::w#1 ← < (dword) print_dword::dw#0 [ print_word::w#1 print_char_cursor#10 ] ( main:2::print_dword:15 [ print_word::w#1 print_char_cursor#10 ] ) always clobbers reg byte a
Statement [26] (byte) print_byte::b#0 ← > (word) print_word::w#2 [ print_word::w#2 print_char_cursor#34 print_byte::b#0 ] ( main:2::print_dword:15::print_word:21 [ print_dword::dw#0 print_word::w#2 print_char_cursor#34 print_byte::b#0 ] main:2::print_dword:15::print_word:23 [ print_word::w#2 print_char_cursor#34 print_byte::b#0 ] ) always clobbers reg byte a
Statement [28] (byte) print_byte::b#1 ← < (word) print_word::w#2 [ print_char_cursor#10 print_byte::b#1 ] ( main:2::print_dword:15::print_word:21 [ print_dword::dw#0 print_char_cursor#10 print_byte::b#1 ] main:2::print_dword:15::print_word:23 [ print_char_cursor#10 print_byte::b#1 ] ) always clobbers reg byte a
Statement [32] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte) 4 [ print_byte::b#2 print_char_cursor#36 print_byte::$0 ] ( main:2::print_dword:15::print_word:21::print_byte:27 [ print_dword::dw#0 print_word::w#2 print_byte::b#2 print_char_cursor#36 print_byte::$0 ] main:2::print_dword:15::print_word:23::print_byte:27 [ print_word::w#2 print_byte::b#2 print_char_cursor#36 print_byte::$0 ] main:2::print_dword:15::print_word:21::print_byte:29 [ print_dword::dw#0 print_byte::b#2 print_char_cursor#36 print_byte::$0 ] main:2::print_dword:15::print_word:23::print_byte:29 [ print_byte::b#2 print_char_cursor#36 print_byte::$0 ] ) always clobbers reg byte a
Statement [35] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte) $f [ print_char_cursor#10 print_byte::$2 ] ( main:2::print_dword:15::print_word:21::print_byte:27 [ print_dword::dw#0 print_word::w#2 print_char_cursor#10 print_byte::$2 ] main:2::print_dword:15::print_word:23::print_byte:27 [ print_word::w#2 print_char_cursor#10 print_byte::$2 ] main:2::print_dword:15::print_word:21::print_byte:29 [ print_dword::dw#0 print_char_cursor#10 print_byte::$2 ] main:2::print_dword:15::print_word:23::print_byte:29 [ print_char_cursor#10 print_byte::$2 ] ) always clobbers reg byte a
Statement [40] *((byte*) print_char_cursor#27) ← (byte) print_char::ch#2 [ print_char_cursor#27 ] ( main:2::print_dword:15::print_word:21::print_byte:27::print_char:34 [ print_dword::dw#0 print_word::w#2 print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:27::print_char:34 [ print_word::w#2 print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:21::print_byte:29::print_char:34 [ print_dword::dw#0 print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:29::print_char:34 [ print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:21::print_byte:27::print_char:37 [ print_dword::dw#0 print_word::w#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:27::print_char:37 [ print_word::w#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:21::print_byte:29::print_char:37 [ print_dword::dw#0 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:29::print_char:37 [ print_char_cursor#27 ] ) always clobbers reg byte y
Statement [43] *((const word*) mulf16u::memA#0) ← (const word) main::a#0 [ ] ( main:2::mulf16u:10 [ print_char_cursor#16 ] ) always clobbers reg byte a
Statement [44] *((const word*) mulf16u::memB#0) ← (const word) main::b#0 [ ] ( main:2::mulf16u:10 [ print_char_cursor#16 ] ) always clobbers reg byte a
Statement asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: } always clobbers reg byte a reg byte x
Statement [46] (dword) mulf16u::return#1 ← *((const dword*) mulf16u::memR#0) [ mulf16u::return#1 ] ( main:2::mulf16u:10 [ print_char_cursor#16 mulf16u::return#1 ] ) always clobbers reg byte a
Statement [50] if((byte*) mulf_init::sqr1_lo#2!=(const byte[$200]) mulf_sqr1_lo#0+(word) $200) goto mulf_init::@2 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ) always clobbers reg byte a
Statement [52] if((byte*) mulf_init::sqr2_lo#2!=(const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) goto mulf_init::@6 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a
Statement [53] *((const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_lo#0+(word) $100) [ ] ( main:2::mulf_init:5 [ ] ) always clobbers reg byte a
Statement [54] *((const byte[$200]) mulf_sqr2_hi#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_hi#0+(word) $100) [ ] ( main:2::mulf_init:5 [ ] ) always clobbers reg byte a
Statement [56] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[$200]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2) [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a reg byte y
Statement [57] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[$200]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2) [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a reg byte y
Statement [59] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] ) always clobbers reg byte a
Statement [65] (byte~) mulf_init::$9 ← (byte) mulf_init::c#1 & (byte) 1 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$9 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$9 ] ) always clobbers reg byte a
Statement [70] (byte~) mulf_init::$12 ← < (word) mulf_init::sqr#3 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$12 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$12 ] ) always clobbers reg byte a
Statement [71] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$12 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ) always clobbers reg byte y
Statement [72] (byte~) mulf_init::$13 ← > (word) mulf_init::sqr#3 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$13 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$13 ] ) always clobbers reg byte a
Statement [73] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$13 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ) always clobbers reg byte y
Statement [75] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ) always clobbers reg byte a
Potential registers zp ZP_WORD:2 [ print_word::w#2 print_word::w#0 print_word::w#1 ] : zp ZP_WORD:2 ,
Potential registers zp ZP_BYTE:4 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] : zp ZP_BYTE:4 , reg byte x ,
Potential registers zp ZP_BYTE:5 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ] : zp ZP_BYTE:5 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_WORD:6 [ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ] : zp ZP_WORD:6 ,
Potential registers zp ZP_WORD:8 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] : zp ZP_WORD:8 ,
Potential registers zp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ] : zp ZP_BYTE:10 , reg byte x ,
Potential registers zp ZP_WORD:11 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] : zp ZP_WORD:11 ,
Potential registers zp ZP_BYTE:13 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] : zp ZP_BYTE:13 , reg byte x ,
Potential registers zp ZP_WORD:14 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] : zp ZP_WORD:14 ,
Potential registers zp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ] : zp ZP_BYTE:16 , reg byte x ,
Potential registers zp ZP_WORD:17 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] : zp ZP_WORD:17 ,
Potential registers zp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ] : zp ZP_BYTE:19 , reg byte x ,
Potential registers zp ZP_WORD:20 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] : zp ZP_WORD:20 ,
Potential registers zp ZP_DWORD:22 [ mulf16u::return#0 ] : zp ZP_DWORD:22 ,
Potential registers zp ZP_DWORD:26 [ main::r#0 ] : zp ZP_DWORD:26 ,
Potential registers zp ZP_DWORD:30 [ print_dword::dw#0 ] : zp ZP_DWORD:30 ,
Potential registers zp ZP_BYTE:34 [ print_byte::$0 ] : zp ZP_BYTE:34 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:35 [ print_byte::$2 ] : zp ZP_BYTE:35 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_DWORD:36 [ mulf16u::return#1 ] : zp ZP_DWORD:36 ,
Potential registers zp ZP_BYTE:40 [ mulf_init::$9 ] : zp ZP_BYTE:40 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:41 [ mulf_init::$12 ] : zp ZP_BYTE:41 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:42 [ mulf_init::$13 ] : zp ZP_BYTE:42 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [mulf_init] 47.67: zp ZP_WORD:20 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] 26.89: zp ZP_WORD:14 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] 25.14: zp ZP_WORD:8 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] 23.1: zp ZP_BYTE:13 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] 22: zp ZP_BYTE:40 [ mulf_init::$9 ] 22: zp ZP_BYTE:41 [ mulf_init::$12 ] 22: zp ZP_BYTE:42 [ mulf_init::$13 ] 15.4: zp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ] 15.12: zp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ] 13.54: zp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ] 11.92: zp ZP_WORD:17 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] 10.08: zp ZP_WORD:11 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
Uplift Scope [mulf16u] 22: zp ZP_DWORD:22 [ mulf16u::return#0 ] 4.33: zp ZP_DWORD:36 [ mulf16u::return#1 ]
Uplift Scope [print_byte] 10: zp ZP_BYTE:4 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] 4: zp ZP_BYTE:34 [ print_byte::$0 ] 4: zp ZP_BYTE:35 [ print_byte::$2 ]
Uplift Scope [print_char] 14: zp ZP_BYTE:5 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
Uplift Scope [main] 11: zp ZP_DWORD:26 [ main::r#0 ]
Uplift Scope [print_word] 10.67: zp ZP_WORD:2 [ print_word::w#2 print_word::w#0 print_word::w#1 ]
Uplift Scope [] 9.84: zp ZP_WORD:6 [ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ]
Uplift Scope [print_dword] 5: zp ZP_DWORD:30 [ print_dword::dw#0 ]
Uplift Scope [RADIX]
Uplift Scope [print_set_screen]
Uplifting [mulf_init] best 6046 combination zp ZP_WORD:20 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] zp ZP_WORD:14 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] zp ZP_WORD:8 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] reg byte x [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] reg byte a [ mulf_init::$9 ] reg byte a [ mulf_init::$12 ] reg byte a [ mulf_init::$13 ] zp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ] zp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ] zp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ] zp ZP_WORD:17 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] zp ZP_WORD:11 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
Limited combination testing to 100 combinations of 1024 possible.
Uplifting [mulf16u] best 6046 combination zp ZP_DWORD:22 [ mulf16u::return#0 ] zp ZP_DWORD:36 [ mulf16u::return#1 ]
Uplifting [print_byte] best 6032 combination reg byte x [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] reg byte a [ print_byte::$0 ] reg byte x [ print_byte::$2 ]
Uplifting [print_char] best 6023 combination reg byte a [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
Uplifting [main] best 6023 combination zp ZP_DWORD:26 [ main::r#0 ]
Uplifting [print_word] best 6023 combination zp ZP_WORD:2 [ print_word::w#2 print_word::w#0 print_word::w#1 ]
Uplifting [] best 6023 combination zp ZP_WORD:6 [ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ]
Uplifting [print_dword] best 6023 combination zp ZP_DWORD:30 [ print_dword::dw#0 ]
Uplifting [RADIX] best 6023 combination
Uplifting [print_set_screen] best 6023 combination
Attempting to uplift remaining variables inzp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ]
Uplifting [mulf_init] best 5883 combination reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ]
Attempting to uplift remaining variables inzp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ]
Uplifting [mulf_init] best 5883 combination zp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ]
Attempting to uplift remaining variables inzp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ]
Uplifting [mulf_init] best 5883 combination zp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ]
Coalescing zero page register [ zp ZP_DWORD:22 [ mulf16u::return#0 ] ] with [ zp ZP_DWORD:26 [ main::r#0 ] ] - score: 1
Coalescing zero page register [ zp ZP_DWORD:22 [ mulf16u::return#0 main::r#0 ] ] with [ zp ZP_DWORD:36 [ mulf16u::return#1 ] ] - score: 1
Coalescing zero page register [ zp ZP_DWORD:22 [ mulf16u::return#0 main::r#0 mulf16u::return#1 ] ] with [ zp ZP_DWORD:30 [ print_dword::dw#0 ] ] - score: 1
Coalescing zero page register [ zp ZP_WORD:8 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] ] with [ zp ZP_WORD:2 [ print_word::w#2 print_word::w#0 print_word::w#1 ] ]
Coalescing zero page register [ zp ZP_WORD:11 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] ] with [ zp ZP_WORD:6 [ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ] ]
Allocated (was zp ZP_WORD:8) zp ZP_WORD:2 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 print_word::w#2 print_word::w#0 print_word::w#1 ]
Allocated (was zp ZP_BYTE:10) zp ZP_BYTE:4 [ mulf_init::c#2 mulf_init::c#1 ]
Allocated (was zp ZP_WORD:11) zp ZP_WORD:5 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ]
Allocated (was zp ZP_WORD:14) zp ZP_WORD:7 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
Allocated (was zp ZP_WORD:17) zp ZP_WORD:9 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
Allocated (was zp ZP_BYTE:19) zp ZP_BYTE:11 [ mulf_init::dir#2 mulf_init::dir#4 ]
Allocated (was zp ZP_WORD:20) zp ZP_WORD:12 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
Allocated (was zp ZP_DWORD:22) zp ZP_DWORD:14 [ mulf16u::return#0 main::r#0 mulf16u::return#1 print_dword::dw#0 ]
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
// Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
// Global Constants & labels
.label RASTER = $d012
.label BORDERCOL = $d020
.label SCREEN = $400
.label print_char_cursor = 5
// @begin
bbegin:
// [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
// @1
b1:
// [2] call main
// [4] phi from @1 to main [phi:@1->main]
main_from_b1:
jsr main
// [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
// @end
bend:
// main
main: {
.label a = $4d2
.label b = $929
.label r = $e
// [5] call mulf_init
// [48] phi from main to mulf_init [phi:main->mulf_init]
mulf_init_from_main:
jsr mulf_init
jmp b4
// main::@4
b4:
// asm { sei }
sei
// [7] phi from main::@4 to main::@1 [phi:main::@4->main::@1]
b1_from_b4:
// [7] phi (byte*) print_char_cursor#16 = (byte*) 1024 [phi:main::@4->main::@1#0] -- pbuz1=pbuc1
lda #<$400
sta.z print_char_cursor
lda #>$400
sta.z print_char_cursor+1
jmp b1
// main::@1
b1:
jmp b2
// main::@2
b2:
// [8] if(*((const byte*) RASTER#0)!=(byte) $ff) goto main::@2 -- _deref_pbuc1_neq_vbuc2_then_la1
lda #$ff
cmp RASTER
bne b2
jmp b3
// main::@3
b3:
// [9] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1
inc BORDERCOL
// [10] call mulf16u
jsr mulf16u
// [11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1
jmp b5
// main::@5
b5:
// [12] (dword) main::r#0 ← (dword) mulf16u::return#0
// [13] *((const byte*) BORDERCOL#0) ← -- *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_dec__deref_pbuc1
dec BORDERCOL
// [14] (dword) print_dword::dw#0 ← (dword) main::r#0
// [15] call print_dword
jsr print_dword
// [16] phi from main::@5 to main::@6 [phi:main::@5->main::@6]
b6_from_b5:
jmp b6
// main::@6
b6:
// [17] call print_set_screen
// [18] phi from main::@6 to print_set_screen [phi:main::@6->print_set_screen]
print_set_screen_from_b6:
jsr print_set_screen
// [7] phi from main::@6 to main::@1 [phi:main::@6->main::@1]
b1_from_b6:
// [7] phi (byte*) print_char_cursor#16 = (const byte*) SCREEN#0 [phi:main::@6->main::@1#0] -- pbuz1=pbuc1
lda #<SCREEN
sta.z print_char_cursor
lda #>SCREEN
sta.z print_char_cursor+1
jmp b1
}
// print_set_screen
// Set the screen to print on. Also resets current line/char cursor.
print_set_screen: {
jmp breturn
// print_set_screen::@return
breturn:
// [19] return
rts
}
// print_dword
// Print a dword as HEX
// print_dword(dword zeropage($e) dw)
print_dword: {
.label dw = $e
// [20] (word) print_word::w#0 ← > (dword) print_dword::dw#0 -- vwuz1=_hi_vduz2
lda.z dw+2
sta.z print_word.w
lda.z dw+3
sta.z print_word.w+1
// [21] call print_word
// [25] phi from print_dword to print_word [phi:print_dword->print_word]
print_word_from_print_dword:
// [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#16 [phi:print_dword->print_word#0] -- register_copy
// [25] phi (word) print_word::w#2 = (word) print_word::w#0 [phi:print_dword->print_word#1] -- register_copy
jsr print_word
jmp b1
// print_dword::@1
b1:
// [22] (word) print_word::w#1 ← < (dword) print_dword::dw#0 -- vwuz1=_lo_vduz2
lda.z dw
sta.z print_word.w
lda.z dw+1
sta.z print_word.w+1
// [23] call print_word
// [25] phi from print_dword::@1 to print_word [phi:print_dword::@1->print_word]
print_word_from_b1:
// [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#10 [phi:print_dword::@1->print_word#0] -- register_copy
// [25] phi (word) print_word::w#2 = (word) print_word::w#1 [phi:print_dword::@1->print_word#1] -- register_copy
jsr print_word
jmp breturn
// print_dword::@return
breturn:
// [24] return
rts
}
// print_word
// Print a word as HEX
// print_word(word zeropage(2) w)
print_word: {
.label w = 2
// [26] (byte) print_byte::b#0 ← > (word) print_word::w#2 -- vbuxx=_hi_vwuz1
lda.z w+1
tax
// [27] call print_byte
// [31] phi from print_word to print_byte [phi:print_word->print_byte]
print_byte_from_print_word:
// [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#34 [phi:print_word->print_byte#0] -- register_copy
// [31] phi (byte) print_byte::b#2 = (byte) print_byte::b#0 [phi:print_word->print_byte#1] -- register_copy
jsr print_byte
jmp b1
// print_word::@1
b1:
// [28] (byte) print_byte::b#1 ← < (word) print_word::w#2 -- vbuxx=_lo_vwuz1
lda.z w
tax
// [29] call print_byte
// [31] phi from print_word::@1 to print_byte [phi:print_word::@1->print_byte]
print_byte_from_b1:
// [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#10 [phi:print_word::@1->print_byte#0] -- register_copy
// [31] phi (byte) print_byte::b#2 = (byte) print_byte::b#1 [phi:print_word::@1->print_byte#1] -- register_copy
jsr print_byte
jmp breturn
// print_word::@return
breturn:
// [30] return
rts
}
// print_byte
// Print a byte as HEX
// print_byte(byte register(X) b)
print_byte: {
// [32] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte) 4 -- vbuaa=vbuxx_ror_4
txa
lsr
lsr
lsr
lsr
// [33] (byte) print_char::ch#0 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$0) -- vbuaa=pbuc1_derefidx_vbuaa
tay
lda print_hextab,y
// [34] call print_char
// [39] phi from print_byte to print_char [phi:print_byte->print_char]
print_char_from_print_byte:
// [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#36 [phi:print_byte->print_char#0] -- register_copy
// [39] phi (byte) print_char::ch#2 = (byte) print_char::ch#0 [phi:print_byte->print_char#1] -- register_copy
jsr print_char
jmp b1
// print_byte::@1
b1:
// [35] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte) $f -- vbuxx=vbuxx_band_vbuc1
lda #$f
axs #0
// [36] (byte) print_char::ch#1 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$2) -- vbuaa=pbuc1_derefidx_vbuxx
lda print_hextab,x
// [37] call print_char
// [39] phi from print_byte::@1 to print_char [phi:print_byte::@1->print_char]
print_char_from_b1:
// [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#10 [phi:print_byte::@1->print_char#0] -- register_copy
// [39] phi (byte) print_char::ch#2 = (byte) print_char::ch#1 [phi:print_byte::@1->print_char#1] -- register_copy
jsr print_char
jmp breturn
// print_byte::@return
breturn:
// [38] return
rts
}
// print_char
// Print a single char
// print_char(byte register(A) ch)
print_char: {
// [40] *((byte*) print_char_cursor#27) ← (byte) print_char::ch#2 -- _deref_pbuz1=vbuaa
ldy #0
sta (print_char_cursor),y
// [41] (byte*) print_char_cursor#10 ← ++ (byte*) print_char_cursor#27 -- pbuz1=_inc_pbuz1
inc.z print_char_cursor
bne !+
inc.z print_char_cursor+1
!:
jmp breturn
// print_char::@return
breturn:
// [42] return
rts
}
// mulf16u
// Fast multiply two unsigned words to a double word result
// Done in assembler to utilize fast addition A+X
mulf16u: {
.label memA = $f8
.label memB = $fa
.label memR = $fc
.label return = $e
// [43] *((const word*) mulf16u::memA#0) ← (const word) main::a#0 -- _deref_pwuc1=vwuc2
lda #<main.a
sta memA
lda #>main.a
sta memA+1
// [44] *((const word*) mulf16u::memB#0) ← (const word) main::b#0 -- _deref_pwuc1=vwuc2
lda #<main.b
sta memB
lda #>main.b
sta memB+1
// asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: }
lda memA
sta sm1a+1
sta sm3a+1
sta sm5a+1
sta sm7a+1
eor #$ff
sta sm2a+1
sta sm4a+1
sta sm6a+1
sta sm8a+1
lda memA+1
sta sm1b+1
sta sm3b+1
sta sm5b+1
sta sm7b+1
eor #$ff
sta sm2b+1
sta sm4b+1
sta sm6b+1
sta sm8b+1
ldx memB
sec
sm1a:
lda mulf_sqr1_lo,x
sm2a:
sbc mulf_sqr2_lo,x
sta memR+0
sm3a:
lda mulf_sqr1_hi,x
sm4a:
sbc mulf_sqr2_hi,x
sta _AA+1
sec
sm1b:
lda mulf_sqr1_lo,x
sm2b:
sbc mulf_sqr2_lo,x
sta _cc+1
sm3b:
lda mulf_sqr1_hi,x
sm4b:
sbc mulf_sqr2_hi,x
sta _CC+1
ldx memB+1
sec
sm5a:
lda mulf_sqr1_lo,x
sm6a:
sbc mulf_sqr2_lo,x
sta _bb+1
sm7a:
lda mulf_sqr1_hi,x
sm8a:
sbc mulf_sqr2_hi,x
sta _BB+1
sec
sm5b:
lda mulf_sqr1_lo,x
sm6b:
sbc mulf_sqr2_lo,x
sta _dd+1
sm7b:
lda mulf_sqr1_hi,x
sm8b:
sbc mulf_sqr2_hi,x
sta memR+3
clc
_AA:
lda #0
_bb:
adc #0
sta memR+1
_BB:
lda #0
_CC:
adc #0
sta memR+2
bcc !+
inc memR+3
clc
!:
_cc:
lda #0
adc memR+1
sta memR+1
_dd:
lda #0
adc memR+2
sta memR+2
bcc !+
inc memR+3
!:
// [46] (dword) mulf16u::return#1 ← *((const dword*) mulf16u::memR#0) -- vduz1=_deref_pduc1
lda memR
sta.z return
lda memR+1
sta.z return+1
lda memR+2
sta.z return+2
lda memR+3
sta.z return+3
jmp breturn
// mulf16u::@return
breturn:
// [47] return
rts
}
// mulf_init
// Initialize the mulf_sqr multiplication tables with f(x)=int(x*x/4)
mulf_init: {
.label c = 4
.label sqr1_hi = 5
.label sqr = $c
.label sqr1_lo = 2
.label sqr2_hi = 9
.label sqr2_lo = 7
.label dir = $b
// [49] phi from mulf_init to mulf_init::@1 [phi:mulf_init->mulf_init::@1]
b1_from_mulf_init:
// [49] phi (byte) mulf_init::x_2#3 = (byte) 0 [phi:mulf_init->mulf_init::@1#0] -- vbuxx=vbuc1
ldx #0
// [49] phi (byte*) mulf_init::sqr1_hi#2 = (const byte[$200]) mulf_sqr1_hi#0+(byte) 1 [phi:mulf_init->mulf_init::@1#1] -- pbuz1=pbuc1
lda #<mulf_sqr1_hi+1
sta.z sqr1_hi
lda #>mulf_sqr1_hi+1
sta.z sqr1_hi+1
// [49] phi (word) mulf_init::sqr#4 = (byte) 0 [phi:mulf_init->mulf_init::@1#2] -- vwuz1=vbuc1
lda #<0
sta.z sqr
lda #>0
sta.z sqr+1
// [49] phi (byte) mulf_init::c#2 = (byte) 0 [phi:mulf_init->mulf_init::@1#3] -- vbuz1=vbuc1
lda #0
sta.z c
// [49] phi (byte*) mulf_init::sqr1_lo#2 = (const byte[$200]) mulf_sqr1_lo#0+(byte) 1 [phi:mulf_init->mulf_init::@1#4] -- pbuz1=pbuc1
lda #<mulf_sqr1_lo+1
sta.z sqr1_lo
lda #>mulf_sqr1_lo+1
sta.z sqr1_lo+1
jmp b1
// mulf_init::@1
b1:
// [50] if((byte*) mulf_init::sqr1_lo#2!=(const byte[$200]) mulf_sqr1_lo#0+(word) $200) goto mulf_init::@2 -- pbuz1_neq_pbuc1_then_la1
lda.z sqr1_lo+1
cmp #>mulf_sqr1_lo+$200
bne b2
lda.z sqr1_lo
cmp #<mulf_sqr1_lo+$200
bne b2
// [51] phi from mulf_init::@1 to mulf_init::@5 [phi:mulf_init::@1->mulf_init::@5]
b5_from_b1:
// [51] phi (byte) mulf_init::dir#2 = (byte) $ff [phi:mulf_init::@1->mulf_init::@5#0] -- vbuz1=vbuc1
lda #$ff
sta.z dir
// [51] phi (byte*) mulf_init::sqr2_hi#2 = (const byte[$200]) mulf_sqr2_hi#0 [phi:mulf_init::@1->mulf_init::@5#1] -- pbuz1=pbuc1
lda #<mulf_sqr2_hi
sta.z sqr2_hi
lda #>mulf_sqr2_hi
sta.z sqr2_hi+1
// [51] phi (byte) mulf_init::x_255#2 = (byte) -1 [phi:mulf_init::@1->mulf_init::@5#2] -- vbuxx=vbuc1
ldx #-1
// [51] phi (byte*) mulf_init::sqr2_lo#2 = (const byte[$200]) mulf_sqr2_lo#0 [phi:mulf_init::@1->mulf_init::@5#3] -- pbuz1=pbuc1
lda #<mulf_sqr2_lo
sta.z sqr2_lo
lda #>mulf_sqr2_lo
sta.z sqr2_lo+1
jmp b5
// mulf_init::@5
b5:
// [52] if((byte*) mulf_init::sqr2_lo#2!=(const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) goto mulf_init::@6 -- pbuz1_neq_pbuc1_then_la1
lda.z sqr2_lo+1
cmp #>mulf_sqr2_lo+$1ff
bne b6
lda.z sqr2_lo
cmp #<mulf_sqr2_lo+$1ff
bne b6
jmp b7
// mulf_init::@7
b7:
// [53] *((const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_lo#0+(word) $100) -- _deref_pbuc1=_deref_pbuc2
// Set the very last value g(511) = f(256)
lda mulf_sqr1_lo+$100
sta mulf_sqr2_lo+$1ff
// [54] *((const byte[$200]) mulf_sqr2_hi#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_hi#0+(word) $100) -- _deref_pbuc1=_deref_pbuc2
lda mulf_sqr1_hi+$100
sta mulf_sqr2_hi+$1ff
jmp breturn
// mulf_init::@return
breturn:
// [55] return
rts
// mulf_init::@6
b6:
// [56] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[$200]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2) -- _deref_pbuz1=pbuc1_derefidx_vbuxx
lda mulf_sqr1_lo,x
ldy #0
sta (sqr2_lo),y
// [57] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[$200]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2) -- _deref_pbuz1=pbuc1_derefidx_vbuxx
lda mulf_sqr1_hi,x
ldy #0
sta (sqr2_hi),y
// [58] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2 -- pbuz1=_inc_pbuz1
inc.z sqr2_hi
bne !+
inc.z sqr2_hi+1
!:
// [59] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2 -- vbuxx=vbuxx_plus_vbuz1
txa
clc
adc.z dir
tax
// [60] if((byte) mulf_init::x_255#1!=(byte) 0) goto mulf_init::@9 -- vbuxx_neq_0_then_la1
cpx #0
bne b9_from_b6
// [62] phi from mulf_init::@6 to mulf_init::@8 [phi:mulf_init::@6->mulf_init::@8]
b8_from_b6:
// [62] phi (byte) mulf_init::dir#4 = (byte) 1 [phi:mulf_init::@6->mulf_init::@8#0] -- vbuz1=vbuc1
lda #1
sta.z dir
jmp b8
// [61] phi from mulf_init::@6 to mulf_init::@9 [phi:mulf_init::@6->mulf_init::@9]
b9_from_b6:
jmp b9
// mulf_init::@9
b9:
// [62] phi from mulf_init::@9 to mulf_init::@8 [phi:mulf_init::@9->mulf_init::@8]
b8_from_b9:
// [62] phi (byte) mulf_init::dir#4 = (byte) mulf_init::dir#2 [phi:mulf_init::@9->mulf_init::@8#0] -- register_copy
jmp b8
// mulf_init::@8
b8:
// [63] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2 -- pbuz1=_inc_pbuz1
inc.z sqr2_lo
bne !+
inc.z sqr2_lo+1
!:
// [51] phi from mulf_init::@8 to mulf_init::@5 [phi:mulf_init::@8->mulf_init::@5]
b5_from_b8:
// [51] phi (byte) mulf_init::dir#2 = (byte) mulf_init::dir#4 [phi:mulf_init::@8->mulf_init::@5#0] -- register_copy
// [51] phi (byte*) mulf_init::sqr2_hi#2 = (byte*) mulf_init::sqr2_hi#1 [phi:mulf_init::@8->mulf_init::@5#1] -- register_copy
// [51] phi (byte) mulf_init::x_255#2 = (byte) mulf_init::x_255#1 [phi:mulf_init::@8->mulf_init::@5#2] -- register_copy
// [51] phi (byte*) mulf_init::sqr2_lo#2 = (byte*) mulf_init::sqr2_lo#1 [phi:mulf_init::@8->mulf_init::@5#3] -- register_copy
jmp b5
// mulf_init::@2
b2:
// [64] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2 -- vbuz1=_inc_vbuz1
inc.z c
// [65] (byte~) mulf_init::$9 ← (byte) mulf_init::c#1 & (byte) 1 -- vbuaa=vbuz1_band_vbuc1
lda #1
and.z c
// [66] if((byte~) mulf_init::$9!=(byte) 0) goto mulf_init::@3 -- vbuaa_neq_0_then_la1
cmp #0
bne b3_from_b2
jmp b4
// mulf_init::@4
b4:
// [67] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3 -- vbuxx=_inc_vbuxx
inx
// [68] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4 -- vwuz1=_inc_vwuz1
inc.z sqr
bne !+
inc.z sqr+1
!:
// [69] phi from mulf_init::@2 mulf_init::@4 to mulf_init::@3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3]
b3_from_b2:
b3_from_b4:
// [69] phi (byte) mulf_init::x_2#2 = (byte) mulf_init::x_2#3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#0] -- register_copy
// [69] phi (word) mulf_init::sqr#3 = (word) mulf_init::sqr#4 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#1] -- register_copy
jmp b3
// mulf_init::@3
b3:
// [70] (byte~) mulf_init::$12 ← < (word) mulf_init::sqr#3 -- vbuaa=_lo_vwuz1
lda.z sqr
// [71] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$12 -- _deref_pbuz1=vbuaa
ldy #0
sta (sqr1_lo),y
// [72] (byte~) mulf_init::$13 ← > (word) mulf_init::sqr#3 -- vbuaa=_hi_vwuz1
lda.z sqr+1
// [73] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$13 -- _deref_pbuz1=vbuaa
ldy #0
sta (sqr1_hi),y
// [74] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2 -- pbuz1=_inc_pbuz1
inc.z sqr1_hi
bne !+
inc.z sqr1_hi+1
!:
// [75] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2 -- vwuz1=vwuz1_plus_vbuxx
txa
clc
adc.z sqr
sta.z sqr
bcc !+
inc.z sqr+1
!:
// [76] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2 -- pbuz1=_inc_pbuz1
inc.z sqr1_lo
bne !+
inc.z sqr1_lo+1
!:
// [49] phi from mulf_init::@3 to mulf_init::@1 [phi:mulf_init::@3->mulf_init::@1]
b1_from_b3:
// [49] phi (byte) mulf_init::x_2#3 = (byte) mulf_init::x_2#2 [phi:mulf_init::@3->mulf_init::@1#0] -- register_copy
// [49] phi (byte*) mulf_init::sqr1_hi#2 = (byte*) mulf_init::sqr1_hi#1 [phi:mulf_init::@3->mulf_init::@1#1] -- register_copy
// [49] phi (word) mulf_init::sqr#4 = (word) mulf_init::sqr#1 [phi:mulf_init::@3->mulf_init::@1#2] -- register_copy
// [49] phi (byte) mulf_init::c#2 = (byte) mulf_init::c#1 [phi:mulf_init::@3->mulf_init::@1#3] -- register_copy
// [49] phi (byte*) mulf_init::sqr1_lo#2 = (byte*) mulf_init::sqr1_lo#1 [phi:mulf_init::@3->mulf_init::@1#4] -- register_copy
jmp b1
}
// File Data
print_hextab: .text "0123456789abcdef"
// mulf_sqr tables will contain f(x)=int(x*x/4) and g(x) = f(x-255).
// <f(x) = <(( x * x )/4)
.align $100
mulf_sqr1_lo: .fill $200, 0
// >f(x) = >(( x * x )/4)
.align $100
mulf_sqr1_hi: .fill $200, 0
// <g(x) = <((( x - 255) * ( x - 255 ))/4)
.align $100
mulf_sqr2_lo: .fill $200, 0
// >g(x) = >((( x - 255) * ( x - 255 ))/4)
.align $100
mulf_sqr2_hi: .fill $200, 0
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b1
Removing instruction jmp bend
Removing instruction jmp b4
Removing instruction jmp b1
Removing instruction jmp b2
Removing instruction jmp b3
Removing instruction jmp b5
Removing instruction jmp b6
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 breturn
Removing instruction jmp breturn
Removing instruction jmp breturn
Removing instruction jmp b1
Removing instruction jmp b5
Removing instruction jmp b7
Removing instruction jmp breturn
Removing instruction jmp b9
Removing instruction jmp b8
Removing instruction jmp b4
Removing instruction jmp b3
Succesful ASM optimization Pass5NextJumpElimination
Replacing instruction lda #<0 with TXA
Removing instruction lda #>0
Removing instruction lda #0
Removing instruction ldy #0
Removing instruction ldy #0
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Replacing label b1 with b2
Replacing label b9_from_b6 with b8
Replacing label b3_from_b2 with b3
Removing instruction b1_from_bbegin:
Removing instruction b1:
Removing instruction main_from_b1:
Removing instruction bend_from_b1:
Removing instruction b1:
Removing instruction b6_from_b5:
Removing instruction print_set_screen_from_b6:
Removing instruction b9_from_b6:
Removing instruction b9:
Removing instruction b8_from_b9:
Removing instruction b3_from_b2:
Removing instruction b3_from_b4:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction bend:
Removing instruction mulf_init_from_main:
Removing instruction b4:
Removing instruction b1_from_b4:
Removing instruction b3:
Removing instruction b5:
Removing instruction b6:
Removing instruction b1_from_b6:
Removing instruction breturn:
Removing instruction print_word_from_print_dword:
Removing instruction b1:
Removing instruction print_word_from_b1:
Removing instruction breturn:
Removing instruction print_byte_from_print_word:
Removing instruction b1:
Removing instruction print_byte_from_b1:
Removing instruction breturn:
Removing instruction print_char_from_print_byte:
Removing instruction b1:
Removing instruction print_char_from_b1:
Removing instruction breturn:
Removing instruction breturn:
Removing instruction breturn:
Removing instruction b1_from_mulf_init:
Removing instruction b5_from_b1:
Removing instruction b7:
Removing instruction breturn:
Removing instruction b8_from_b6:
Removing instruction b5_from_b8:
Removing instruction b4:
Removing instruction b1_from_b3:
Succesful ASM optimization Pass5UnusedLabelElimination
Updating BasicUpstart to call main directly
Removing instruction jsr main
Succesful ASM optimization Pass5SkipBegin
Removing instruction jmp b8
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction bbegin:
Succesful ASM optimization Pass5UnusedLabelElimination
FINAL SYMBOL TABLE
(label) @1
(label) @begin
(label) @end
(byte*) BORDERCOL
(const byte*) BORDERCOL#0 BORDERCOL = (byte*) 53280
(const byte) RADIX::BINARY BINARY = (number) 2
(const byte) RADIX::DECIMAL DECIMAL = (number) $a
(const byte) RADIX::HEXADECIMAL HEXADECIMAL = (number) $10
(const byte) RADIX::OCTAL OCTAL = (number) 8
(byte*) RASTER
(const byte*) RASTER#0 RASTER = (byte*) 53266
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = (byte*) 1024
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@3
(label) main::@4
(label) main::@5
(label) main::@6
(word) main::a
(const word) main::a#0 a = (word) $4d2
(word) main::b
(const word) main::b#0 b = (word) $929
(dword) main::r
(dword) main::r#0 r zp ZP_DWORD:14 11.0
(dword()) mulf16u((word) mulf16u::a , (word) mulf16u::b)
(label) mulf16u::@return
(word) mulf16u::a
(word) mulf16u::b
(word*) mulf16u::memA
(const word*) mulf16u::memA#0 memA = (word*) 248
(word*) mulf16u::memB
(const word*) mulf16u::memB#0 memB = (word*) 250
(dword*) mulf16u::memR
(const dword*) mulf16u::memR#0 memR = (dword*) 252
(dword) mulf16u::return
(dword) mulf16u::return#0 return zp ZP_DWORD:14 22.0
(dword) mulf16u::return#1 return zp ZP_DWORD:14 4.333333333333333
(void()) mulf_init()
(byte~) mulf_init::$12 reg byte a 22.0
(byte~) mulf_init::$13 reg byte a 22.0
(byte~) mulf_init::$9 reg byte a 22.0
(label) mulf_init::@1
(label) mulf_init::@2
(label) mulf_init::@3
(label) mulf_init::@4
(label) mulf_init::@5
(label) mulf_init::@6
(label) mulf_init::@7
(label) mulf_init::@8
(label) mulf_init::@9
(label) mulf_init::@return
(byte) mulf_init::c
(byte) mulf_init::c#1 c zp ZP_BYTE:4 2.5384615384615383
(byte) mulf_init::c#2 c zp ZP_BYTE:4 11.0
(byte) mulf_init::dir
(byte) mulf_init::dir#2 dir zp ZP_BYTE:11 4.125
(byte) mulf_init::dir#4 dir zp ZP_BYTE:11 11.0
(word) mulf_init::sqr
(word) mulf_init::sqr#1 sqr zp ZP_WORD:12 11.0
(word) mulf_init::sqr#2 sqr zp ZP_WORD:12 22.0
(word) mulf_init::sqr#3 sqr zp ZP_WORD:12 9.166666666666666
(word) mulf_init::sqr#4 sqr zp ZP_WORD:12 5.5
(byte*) mulf_init::sqr1_hi
(byte*) mulf_init::sqr1_hi#1 sqr1_hi zp ZP_WORD:5 7.333333333333333
(byte*) mulf_init::sqr1_hi#2 sqr1_hi zp ZP_WORD:5 2.75
(byte*) mulf_init::sqr1_lo
(byte*) mulf_init::sqr1_lo#1 sqr1_lo zp ZP_WORD:2 22.0
(byte*) mulf_init::sqr1_lo#2 sqr1_lo zp ZP_WORD:2 3.142857142857143
(byte*) mulf_init::sqr2_hi
(byte*) mulf_init::sqr2_hi#1 sqr2_hi zp ZP_WORD:9 3.6666666666666665
(byte*) mulf_init::sqr2_hi#2 sqr2_hi zp ZP_WORD:9 8.25
(byte*) mulf_init::sqr2_lo
(byte*) mulf_init::sqr2_lo#1 sqr2_lo zp ZP_WORD:7 22.0
(byte*) mulf_init::sqr2_lo#2 sqr2_lo zp ZP_WORD:7 4.888888888888889
(byte) mulf_init::x_2
(byte) mulf_init::x_2#1 reg byte x 11.0
(byte) mulf_init::x_2#2 reg byte x 5.5
(byte) mulf_init::x_2#3 reg byte x 6.6000000000000005
(byte) mulf_init::x_255
(byte) mulf_init::x_255#1 reg byte x 6.6000000000000005
(byte) mulf_init::x_255#2 reg byte x 8.8
(byte[$200]) mulf_sqr1_hi
(const byte[$200]) mulf_sqr1_hi#0 mulf_sqr1_hi = { fill( $200, 0) }
(byte[$200]) mulf_sqr1_lo
(const byte[$200]) mulf_sqr1_lo#0 mulf_sqr1_lo = { fill( $200, 0) }
(byte[$200]) mulf_sqr2_hi
(const byte[$200]) mulf_sqr2_hi#0 mulf_sqr2_hi = { fill( $200, 0) }
(byte[$200]) mulf_sqr2_lo
(const byte[$200]) mulf_sqr2_lo#0 mulf_sqr2_lo = { fill( $200, 0) }
(void()) print_byte((byte) print_byte::b)
(byte~) print_byte::$0 reg byte a 4.0
(byte~) print_byte::$2 reg byte x 4.0
(label) print_byte::@1
(label) print_byte::@return
(byte) print_byte::b
(byte) print_byte::b#0 reg byte x 4.0
(byte) print_byte::b#1 reg byte x 4.0
(byte) print_byte::b#2 reg byte x 2.0
(void()) print_char((byte) print_char::ch)
(label) print_char::@return
(byte) print_char::ch
(byte) print_char::ch#0 reg byte a 4.0
(byte) print_char::ch#1 reg byte a 4.0
(byte) print_char::ch#2 reg byte a 6.0
(byte*) print_char_cursor
(byte*) print_char_cursor#10 print_char_cursor zp ZP_WORD:5 0.6153846153846154
(byte*) print_char_cursor#16 print_char_cursor zp ZP_WORD:5 0.2222222222222222
(byte*) print_char_cursor#27 print_char_cursor zp ZP_WORD:5 4.0
(byte*) print_char_cursor#34 print_char_cursor zp ZP_WORD:5 3.0
(byte*) print_char_cursor#36 print_char_cursor zp ZP_WORD:5 2.0
(void()) print_dword((dword) print_dword::dw)
(label) print_dword::@1
(label) print_dword::@return
(dword) print_dword::dw
(dword) print_dword::dw#0 dw zp ZP_DWORD:14 5.0
(byte[]) print_hextab
(const byte[]) print_hextab#0 print_hextab = (string) "0123456789abcdef"z
(byte*) print_line_cursor
(byte*) print_screen
(void()) print_set_screen((byte*) print_set_screen::screen)
(label) print_set_screen::@return
(byte*) print_set_screen::screen
(void()) print_word((word) print_word::w)
(label) print_word::@1
(label) print_word::@return
(word) print_word::w
(word) print_word::w#0 w zp ZP_WORD:2 4.0
(word) print_word::w#1 w zp ZP_WORD:2 4.0
(word) print_word::w#2 w zp ZP_WORD:2 2.6666666666666665
reg byte x [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
reg byte a [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
zp ZP_WORD:2 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 print_word::w#2 print_word::w#0 print_word::w#1 ]
zp ZP_BYTE:4 [ mulf_init::c#2 mulf_init::c#1 ]
zp ZP_WORD:5 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ]
reg byte x [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
zp ZP_WORD:7 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ]
zp ZP_WORD:9 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
zp ZP_BYTE:11 [ mulf_init::dir#2 mulf_init::dir#4 ]
zp ZP_WORD:12 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
zp ZP_DWORD:14 [ mulf16u::return#0 main::r#0 mulf16u::return#1 print_dword::dw#0 ]
reg byte a [ print_byte::$0 ]
reg byte x [ print_byte::$2 ]
reg byte a [ mulf_init::$9 ]
reg byte a [ mulf_init::$12 ]
reg byte a [ mulf_init::$13 ]
FINAL ASSEMBLER
Score: 4351
// File Comments
// Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
// Global Constants & labels
.label RASTER = $d012
.label BORDERCOL = $d020
.label SCREEN = $400
.label print_char_cursor = 5
// @begin
// [1] phi from @begin to @1 [phi:@begin->@1]
// @1
// [2] call main
// [4] phi from @1 to main [phi:@1->main]
// [3] phi from @1 to @end [phi:@1->@end]
// @end
// main
main: {
.label a = $4d2
.label b = $929
.label r = $e
// mulf_init()
// [5] call mulf_init
// [48] phi from main to mulf_init [phi:main->mulf_init]
jsr mulf_init
// main::@4
// asm
// asm { sei }
sei
// [7] phi from main::@4 to main::@1 [phi:main::@4->main::@1]
// [7] phi (byte*) print_char_cursor#16 = (byte*) 1024 [phi:main::@4->main::@1#0] -- pbuz1=pbuc1
lda #<$400
sta.z print_char_cursor
lda #>$400
sta.z print_char_cursor+1
// main::@1
// main::@2
b2:
// while(*RASTER!=$ff)
// [8] if(*((const byte*) RASTER#0)!=(byte) $ff) goto main::@2 -- _deref_pbuc1_neq_vbuc2_then_la1
lda #$ff
cmp RASTER
bne b2
// main::@3
// (*BORDERCOL)++;
// [9] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1
inc BORDERCOL
// mulf16u(a, b)
// [10] call mulf16u
jsr mulf16u
// [11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1
// main::@5
// r = mulf16u(a, b)
// [12] (dword) main::r#0 ← (dword) mulf16u::return#0
// (*BORDERCOL)--;
// [13] *((const byte*) BORDERCOL#0) ← -- *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_dec__deref_pbuc1
dec BORDERCOL
// print_dword(r)
// [14] (dword) print_dword::dw#0 ← (dword) main::r#0
// [15] call print_dword
jsr print_dword
// [16] phi from main::@5 to main::@6 [phi:main::@5->main::@6]
// main::@6
// print_set_screen(SCREEN)
// [17] call print_set_screen
// [18] phi from main::@6 to print_set_screen [phi:main::@6->print_set_screen]
jsr print_set_screen
// [7] phi from main::@6 to main::@1 [phi:main::@6->main::@1]
// [7] phi (byte*) print_char_cursor#16 = (const byte*) SCREEN#0 [phi:main::@6->main::@1#0] -- pbuz1=pbuc1
lda #<SCREEN
sta.z print_char_cursor
lda #>SCREEN
sta.z print_char_cursor+1
jmp b2
}
// print_set_screen
// Set the screen to print on. Also resets current line/char cursor.
print_set_screen: {
// print_set_screen::@return
// }
// [19] return
rts
}
// print_dword
// Print a dword as HEX
// print_dword(dword zeropage($e) dw)
print_dword: {
.label dw = $e
// print_word(>dw)
// [20] (word) print_word::w#0 ← > (dword) print_dword::dw#0 -- vwuz1=_hi_vduz2
lda.z dw+2
sta.z print_word.w
lda.z dw+3
sta.z print_word.w+1
// [21] call print_word
// [25] phi from print_dword to print_word [phi:print_dword->print_word]
// [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#16 [phi:print_dword->print_word#0] -- register_copy
// [25] phi (word) print_word::w#2 = (word) print_word::w#0 [phi:print_dword->print_word#1] -- register_copy
jsr print_word
// print_dword::@1
// print_word(<dw)
// [22] (word) print_word::w#1 ← < (dword) print_dword::dw#0 -- vwuz1=_lo_vduz2
lda.z dw
sta.z print_word.w
lda.z dw+1
sta.z print_word.w+1
// [23] call print_word
// [25] phi from print_dword::@1 to print_word [phi:print_dword::@1->print_word]
// [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#10 [phi:print_dword::@1->print_word#0] -- register_copy
// [25] phi (word) print_word::w#2 = (word) print_word::w#1 [phi:print_dword::@1->print_word#1] -- register_copy
jsr print_word
// print_dword::@return
// }
// [24] return
rts
}
// print_word
// Print a word as HEX
// print_word(word zeropage(2) w)
print_word: {
.label w = 2
// print_byte(>w)
// [26] (byte) print_byte::b#0 ← > (word) print_word::w#2 -- vbuxx=_hi_vwuz1
lda.z w+1
tax
// [27] call print_byte
// [31] phi from print_word to print_byte [phi:print_word->print_byte]
// [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#34 [phi:print_word->print_byte#0] -- register_copy
// [31] phi (byte) print_byte::b#2 = (byte) print_byte::b#0 [phi:print_word->print_byte#1] -- register_copy
jsr print_byte
// print_word::@1
// print_byte(<w)
// [28] (byte) print_byte::b#1 ← < (word) print_word::w#2 -- vbuxx=_lo_vwuz1
lda.z w
tax
// [29] call print_byte
// [31] phi from print_word::@1 to print_byte [phi:print_word::@1->print_byte]
// [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#10 [phi:print_word::@1->print_byte#0] -- register_copy
// [31] phi (byte) print_byte::b#2 = (byte) print_byte::b#1 [phi:print_word::@1->print_byte#1] -- register_copy
jsr print_byte
// print_word::@return
// }
// [30] return
rts
}
// print_byte
// Print a byte as HEX
// print_byte(byte register(X) b)
print_byte: {
// b>>4
// [32] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte) 4 -- vbuaa=vbuxx_ror_4
txa
lsr
lsr
lsr
lsr
// print_char(print_hextab[b>>4])
// [33] (byte) print_char::ch#0 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$0) -- vbuaa=pbuc1_derefidx_vbuaa
tay
lda print_hextab,y
// [34] call print_char
// [39] phi from print_byte to print_char [phi:print_byte->print_char]
// [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#36 [phi:print_byte->print_char#0] -- register_copy
// [39] phi (byte) print_char::ch#2 = (byte) print_char::ch#0 [phi:print_byte->print_char#1] -- register_copy
jsr print_char
// print_byte::@1
// b&$f
// [35] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte) $f -- vbuxx=vbuxx_band_vbuc1
lda #$f
axs #0
// print_char(print_hextab[b&$f])
// [36] (byte) print_char::ch#1 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$2) -- vbuaa=pbuc1_derefidx_vbuxx
lda print_hextab,x
// [37] call print_char
// [39] phi from print_byte::@1 to print_char [phi:print_byte::@1->print_char]
// [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#10 [phi:print_byte::@1->print_char#0] -- register_copy
// [39] phi (byte) print_char::ch#2 = (byte) print_char::ch#1 [phi:print_byte::@1->print_char#1] -- register_copy
jsr print_char
// print_byte::@return
// }
// [38] return
rts
}
// print_char
// Print a single char
// print_char(byte register(A) ch)
print_char: {
// *(print_char_cursor++) = ch
// [40] *((byte*) print_char_cursor#27) ← (byte) print_char::ch#2 -- _deref_pbuz1=vbuaa
ldy #0
sta (print_char_cursor),y
// *(print_char_cursor++) = ch;
// [41] (byte*) print_char_cursor#10 ← ++ (byte*) print_char_cursor#27 -- pbuz1=_inc_pbuz1
inc.z print_char_cursor
bne !+
inc.z print_char_cursor+1
!:
// print_char::@return
// }
// [42] return
rts
}
// mulf16u
// Fast multiply two unsigned words to a double word result
// Done in assembler to utilize fast addition A+X
mulf16u: {
.label memA = $f8
.label memB = $fa
.label memR = $fc
.label return = $e
// *memA = a
// [43] *((const word*) mulf16u::memA#0) ← (const word) main::a#0 -- _deref_pwuc1=vwuc2
lda #<main.a
sta memA
lda #>main.a
sta memA+1
// *memB = b
// [44] *((const word*) mulf16u::memB#0) ← (const word) main::b#0 -- _deref_pwuc1=vwuc2
lda #<main.b
sta memB
lda #>main.b
sta memB+1
// asm
// asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: }
lda memA
sta sm1a+1
sta sm3a+1
sta sm5a+1
sta sm7a+1
eor #$ff
sta sm2a+1
sta sm4a+1
sta sm6a+1
sta sm8a+1
lda memA+1
sta sm1b+1
sta sm3b+1
sta sm5b+1
sta sm7b+1
eor #$ff
sta sm2b+1
sta sm4b+1
sta sm6b+1
sta sm8b+1
ldx memB
sec
sm1a:
lda mulf_sqr1_lo,x
sm2a:
sbc mulf_sqr2_lo,x
sta memR+0
sm3a:
lda mulf_sqr1_hi,x
sm4a:
sbc mulf_sqr2_hi,x
sta _AA+1
sec
sm1b:
lda mulf_sqr1_lo,x
sm2b:
sbc mulf_sqr2_lo,x
sta _cc+1
sm3b:
lda mulf_sqr1_hi,x
sm4b:
sbc mulf_sqr2_hi,x
sta _CC+1
ldx memB+1
sec
sm5a:
lda mulf_sqr1_lo,x
sm6a:
sbc mulf_sqr2_lo,x
sta _bb+1
sm7a:
lda mulf_sqr1_hi,x
sm8a:
sbc mulf_sqr2_hi,x
sta _BB+1
sec
sm5b:
lda mulf_sqr1_lo,x
sm6b:
sbc mulf_sqr2_lo,x
sta _dd+1
sm7b:
lda mulf_sqr1_hi,x
sm8b:
sbc mulf_sqr2_hi,x
sta memR+3
clc
_AA:
lda #0
_bb:
adc #0
sta memR+1
_BB:
lda #0
_CC:
adc #0
sta memR+2
bcc !+
inc memR+3
clc
!:
_cc:
lda #0
adc memR+1
sta memR+1
_dd:
lda #0
adc memR+2
sta memR+2
bcc !+
inc memR+3
!:
// return *memR;
// [46] (dword) mulf16u::return#1 ← *((const dword*) mulf16u::memR#0) -- vduz1=_deref_pduc1
lda memR
sta.z return
lda memR+1
sta.z return+1
lda memR+2
sta.z return+2
lda memR+3
sta.z return+3
// mulf16u::@return
// }
// [47] return
rts
}
// mulf_init
// Initialize the mulf_sqr multiplication tables with f(x)=int(x*x/4)
mulf_init: {
.label c = 4
.label sqr1_hi = 5
.label sqr = $c
.label sqr1_lo = 2
.label sqr2_hi = 9
.label sqr2_lo = 7
.label dir = $b
// [49] phi from mulf_init to mulf_init::@1 [phi:mulf_init->mulf_init::@1]
// [49] phi (byte) mulf_init::x_2#3 = (byte) 0 [phi:mulf_init->mulf_init::@1#0] -- vbuxx=vbuc1
ldx #0
// [49] phi (byte*) mulf_init::sqr1_hi#2 = (const byte[$200]) mulf_sqr1_hi#0+(byte) 1 [phi:mulf_init->mulf_init::@1#1] -- pbuz1=pbuc1
lda #<mulf_sqr1_hi+1
sta.z sqr1_hi
lda #>mulf_sqr1_hi+1
sta.z sqr1_hi+1
// [49] phi (word) mulf_init::sqr#4 = (byte) 0 [phi:mulf_init->mulf_init::@1#2] -- vwuz1=vbuc1
txa
sta.z sqr
sta.z sqr+1
// [49] phi (byte) mulf_init::c#2 = (byte) 0 [phi:mulf_init->mulf_init::@1#3] -- vbuz1=vbuc1
sta.z c
// [49] phi (byte*) mulf_init::sqr1_lo#2 = (const byte[$200]) mulf_sqr1_lo#0+(byte) 1 [phi:mulf_init->mulf_init::@1#4] -- pbuz1=pbuc1
lda #<mulf_sqr1_lo+1
sta.z sqr1_lo
lda #>mulf_sqr1_lo+1
sta.z sqr1_lo+1
// mulf_init::@1
b1:
// for(byte* sqr1_lo = mulf_sqr1_lo+1; sqr1_lo!=mulf_sqr1_lo+512; sqr1_lo++)
// [50] if((byte*) mulf_init::sqr1_lo#2!=(const byte[$200]) mulf_sqr1_lo#0+(word) $200) goto mulf_init::@2 -- pbuz1_neq_pbuc1_then_la1
lda.z sqr1_lo+1
cmp #>mulf_sqr1_lo+$200
bne b2
lda.z sqr1_lo
cmp #<mulf_sqr1_lo+$200
bne b2
// [51] phi from mulf_init::@1 to mulf_init::@5 [phi:mulf_init::@1->mulf_init::@5]
// [51] phi (byte) mulf_init::dir#2 = (byte) $ff [phi:mulf_init::@1->mulf_init::@5#0] -- vbuz1=vbuc1
lda #$ff
sta.z dir
// [51] phi (byte*) mulf_init::sqr2_hi#2 = (const byte[$200]) mulf_sqr2_hi#0 [phi:mulf_init::@1->mulf_init::@5#1] -- pbuz1=pbuc1
lda #<mulf_sqr2_hi
sta.z sqr2_hi
lda #>mulf_sqr2_hi
sta.z sqr2_hi+1
// [51] phi (byte) mulf_init::x_255#2 = (byte) -1 [phi:mulf_init::@1->mulf_init::@5#2] -- vbuxx=vbuc1
ldx #-1
// [51] phi (byte*) mulf_init::sqr2_lo#2 = (const byte[$200]) mulf_sqr2_lo#0 [phi:mulf_init::@1->mulf_init::@5#3] -- pbuz1=pbuc1
lda #<mulf_sqr2_lo
sta.z sqr2_lo
lda #>mulf_sqr2_lo
sta.z sqr2_lo+1
// mulf_init::@5
b5:
// for(byte* sqr2_lo = mulf_sqr2_lo; sqr2_lo!=mulf_sqr2_lo+511; sqr2_lo++)
// [52] if((byte*) mulf_init::sqr2_lo#2!=(const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) goto mulf_init::@6 -- pbuz1_neq_pbuc1_then_la1
lda.z sqr2_lo+1
cmp #>mulf_sqr2_lo+$1ff
bne b6
lda.z sqr2_lo
cmp #<mulf_sqr2_lo+$1ff
bne b6
// mulf_init::@7
// *(mulf_sqr2_lo+511) = *(mulf_sqr1_lo+256)
// [53] *((const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_lo#0+(word) $100) -- _deref_pbuc1=_deref_pbuc2
// Set the very last value g(511) = f(256)
lda mulf_sqr1_lo+$100
sta mulf_sqr2_lo+$1ff
// *(mulf_sqr2_hi+511) = *(mulf_sqr1_hi+256)
// [54] *((const byte[$200]) mulf_sqr2_hi#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_hi#0+(word) $100) -- _deref_pbuc1=_deref_pbuc2
lda mulf_sqr1_hi+$100
sta mulf_sqr2_hi+$1ff
// mulf_init::@return
// }
// [55] return
rts
// mulf_init::@6
b6:
// *sqr2_lo = mulf_sqr1_lo[x_255]
// [56] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[$200]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2) -- _deref_pbuz1=pbuc1_derefidx_vbuxx
lda mulf_sqr1_lo,x
ldy #0
sta (sqr2_lo),y
// *sqr2_hi++ = mulf_sqr1_hi[x_255]
// [57] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[$200]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2) -- _deref_pbuz1=pbuc1_derefidx_vbuxx
lda mulf_sqr1_hi,x
sta (sqr2_hi),y
// *sqr2_hi++ = mulf_sqr1_hi[x_255];
// [58] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2 -- pbuz1=_inc_pbuz1
inc.z sqr2_hi
bne !+
inc.z sqr2_hi+1
!:
// x_255 = x_255 + dir
// [59] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2 -- vbuxx=vbuxx_plus_vbuz1
txa
clc
adc.z dir
tax
// if(x_255==0)
// [60] if((byte) mulf_init::x_255#1!=(byte) 0) goto mulf_init::@9 -- vbuxx_neq_0_then_la1
cpx #0
bne b8
// [62] phi from mulf_init::@6 to mulf_init::@8 [phi:mulf_init::@6->mulf_init::@8]
// [62] phi (byte) mulf_init::dir#4 = (byte) 1 [phi:mulf_init::@6->mulf_init::@8#0] -- vbuz1=vbuc1
lda #1
sta.z dir
// [61] phi from mulf_init::@6 to mulf_init::@9 [phi:mulf_init::@6->mulf_init::@9]
// mulf_init::@9
// [62] phi from mulf_init::@9 to mulf_init::@8 [phi:mulf_init::@9->mulf_init::@8]
// [62] phi (byte) mulf_init::dir#4 = (byte) mulf_init::dir#2 [phi:mulf_init::@9->mulf_init::@8#0] -- register_copy
// mulf_init::@8
b8:
// for(byte* sqr2_lo = mulf_sqr2_lo; sqr2_lo!=mulf_sqr2_lo+511; sqr2_lo++)
// [63] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2 -- pbuz1=_inc_pbuz1
inc.z sqr2_lo
bne !+
inc.z sqr2_lo+1
!:
// [51] phi from mulf_init::@8 to mulf_init::@5 [phi:mulf_init::@8->mulf_init::@5]
// [51] phi (byte) mulf_init::dir#2 = (byte) mulf_init::dir#4 [phi:mulf_init::@8->mulf_init::@5#0] -- register_copy
// [51] phi (byte*) mulf_init::sqr2_hi#2 = (byte*) mulf_init::sqr2_hi#1 [phi:mulf_init::@8->mulf_init::@5#1] -- register_copy
// [51] phi (byte) mulf_init::x_255#2 = (byte) mulf_init::x_255#1 [phi:mulf_init::@8->mulf_init::@5#2] -- register_copy
// [51] phi (byte*) mulf_init::sqr2_lo#2 = (byte*) mulf_init::sqr2_lo#1 [phi:mulf_init::@8->mulf_init::@5#3] -- register_copy
jmp b5
// mulf_init::@2
b2:
// if((++c&1)==0)
// [64] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2 -- vbuz1=_inc_vbuz1
inc.z c
// ++c&1
// [65] (byte~) mulf_init::$9 ← (byte) mulf_init::c#1 & (byte) 1 -- vbuaa=vbuz1_band_vbuc1
lda #1
and.z c
// if((++c&1)==0)
// [66] if((byte~) mulf_init::$9!=(byte) 0) goto mulf_init::@3 -- vbuaa_neq_0_then_la1
cmp #0
bne b3
// mulf_init::@4
// x_2++;
// [67] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3 -- vbuxx=_inc_vbuxx
inx
// sqr++;
// [68] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4 -- vwuz1=_inc_vwuz1
inc.z sqr
bne !+
inc.z sqr+1
!:
// [69] phi from mulf_init::@2 mulf_init::@4 to mulf_init::@3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3]
// [69] phi (byte) mulf_init::x_2#2 = (byte) mulf_init::x_2#3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#0] -- register_copy
// [69] phi (word) mulf_init::sqr#3 = (word) mulf_init::sqr#4 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#1] -- register_copy
// mulf_init::@3
b3:
// <sqr
// [70] (byte~) mulf_init::$12 ← < (word) mulf_init::sqr#3 -- vbuaa=_lo_vwuz1
lda.z sqr
// *sqr1_lo = <sqr
// [71] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$12 -- _deref_pbuz1=vbuaa
ldy #0
sta (sqr1_lo),y
// >sqr
// [72] (byte~) mulf_init::$13 ← > (word) mulf_init::sqr#3 -- vbuaa=_hi_vwuz1
lda.z sqr+1
// *sqr1_hi++ = >sqr
// [73] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$13 -- _deref_pbuz1=vbuaa
sta (sqr1_hi),y
// *sqr1_hi++ = >sqr;
// [74] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2 -- pbuz1=_inc_pbuz1
inc.z sqr1_hi
bne !+
inc.z sqr1_hi+1
!:
// sqr = sqr + x_2
// [75] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2 -- vwuz1=vwuz1_plus_vbuxx
txa
clc
adc.z sqr
sta.z sqr
bcc !+
inc.z sqr+1
!:
// for(byte* sqr1_lo = mulf_sqr1_lo+1; sqr1_lo!=mulf_sqr1_lo+512; sqr1_lo++)
// [76] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2 -- pbuz1=_inc_pbuz1
inc.z sqr1_lo
bne !+
inc.z sqr1_lo+1
!:
// [49] phi from mulf_init::@3 to mulf_init::@1 [phi:mulf_init::@3->mulf_init::@1]
// [49] phi (byte) mulf_init::x_2#3 = (byte) mulf_init::x_2#2 [phi:mulf_init::@3->mulf_init::@1#0] -- register_copy
// [49] phi (byte*) mulf_init::sqr1_hi#2 = (byte*) mulf_init::sqr1_hi#1 [phi:mulf_init::@3->mulf_init::@1#1] -- register_copy
// [49] phi (word) mulf_init::sqr#4 = (word) mulf_init::sqr#1 [phi:mulf_init::@3->mulf_init::@1#2] -- register_copy
// [49] phi (byte) mulf_init::c#2 = (byte) mulf_init::c#1 [phi:mulf_init::@3->mulf_init::@1#3] -- register_copy
// [49] phi (byte*) mulf_init::sqr1_lo#2 = (byte*) mulf_init::sqr1_lo#1 [phi:mulf_init::@3->mulf_init::@1#4] -- register_copy
jmp b1
}
// File Data
print_hextab: .text "0123456789abcdef"
// mulf_sqr tables will contain f(x)=int(x*x/4) and g(x) = f(x-255).
// <f(x) = <(( x * x )/4)
.align $100
mulf_sqr1_lo: .fill $200, 0
// >f(x) = >(( x * x )/4)
.align $100
mulf_sqr1_hi: .fill $200, 0
// <g(x) = <((( x - 255) * ( x - 255 ))/4)
.align $100
mulf_sqr2_lo: .fill $200, 0
// >g(x) = >((( x - 255) * ( x - 255 ))/4)
.align $100
mulf_sqr2_hi: .fill $200, 0