
CONTROL FLOW GRAPH SSA
@begin: scope:[]  from
  (byte*) print_screen#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024
  (byte*) print_line_cursor#0 ← (byte*) print_screen#0
  (byte*) print_char_cursor#0 ← (byte*) print_line_cursor#0
  to:@12
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
@12: scope:[]  from @begin
  (byte*) print_line_cursor#19 ← phi( @begin/(byte*) print_line_cursor#0 )
  (byte*) print_screen#19 ← phi( @begin/(byte*) print_screen#0 )
  (byte*) print_char_cursor#46 ← phi( @begin/(byte*) print_char_cursor#0 )
  (byte[]) print_hextab#0 ← (const string) $0
  to:@19
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 >> (byte/signed byte/word/signed word/dword/signed dword) 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
  (byte~) print_byte::$2 ← (byte) print_byte::b#3 & (byte/signed byte/word/signed word/dword/signed dword) 15
  (byte) print_char::ch#1 ← *((byte[]) print_hextab#0 + (byte~) 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
@19: scope:[]  from @12
  (byte*) print_line_cursor#18 ← phi( @12/(byte*) print_line_cursor#19 )
  (byte*) print_screen#18 ← phi( @12/(byte*) print_screen#19 )
  (byte*) print_char_cursor#45 ← phi( @12/(byte*) print_char_cursor#46 )
  (byte*) RASTER#0 ← ((byte*)) (word/dword/signed dword) 53266
  (byte*) BORDERCOL#0 ← ((byte*)) (word/dword/signed dword) 53280
  (byte*) SCREEN#0 ← ((byte*)) (word/signed word/dword/signed dword) 1024
  to:@20
main: scope:[main]  from @22
  (byte*) SCREEN#10 ← phi( @22/(byte*) SCREEN#11 )
  (byte*) BORDERCOL#9 ← phi( @22/(byte*) BORDERCOL#11 )
  (byte*) RASTER#7 ← phi( @22/(byte*) RASTER#9 )
  (byte*) print_line_cursor#16 ← phi( @22/(byte*) print_line_cursor#12 )
  (byte*) print_screen#16 ← phi( @22/(byte*) print_screen#12 )
  (byte*) print_char_cursor#43 ← phi( @22/(byte*) print_char_cursor#39 )
  call mulf_init 
  to:main::@13
main::@13: scope:[main]  from main
  (byte*) SCREEN#8 ← phi( main/(byte*) SCREEN#10 )
  (byte*) BORDERCOL#7 ← phi( main/(byte*) BORDERCOL#9 )
  (byte*) RASTER#5 ← phi( main/(byte*) RASTER#7 )
  (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 ← (word/signed word/dword/signed dword) 1234
  (word) main::b#0 ← (word/signed word/dword/signed dword) 2345
  asm { sei  }
  to:main::@1
main::@1: scope:[main]  from main::@13 main::@16
  (byte*) SCREEN#7 ← phi( main::@13/(byte*) SCREEN#8 main::@16/(byte*) SCREEN#9 )
  (word) main::b#5 ← phi( main::@13/(word) main::b#0 main::@16/(word) main::b#6 )
  (word) main::a#5 ← phi( main::@13/(word) main::a#0 main::@16/(word) main::a#6 )
  (byte*) BORDERCOL#6 ← phi( main::@13/(byte*) BORDERCOL#7 main::@16/(byte*) BORDERCOL#8 )
  (byte*) RASTER#4 ← phi( main::@13/(byte*) RASTER#5 main::@16/(byte*) RASTER#6 )
  (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::@2
  to:main::@return
main::@2: scope:[main]  from main::@1
  (byte*) print_line_cursor#21 ← phi( main::@1/(byte*) print_line_cursor#11 )
  (byte*) print_screen#21 ← phi( main::@1/(byte*) print_screen#11 )
  (byte*) SCREEN#5 ← phi( main::@1/(byte*) SCREEN#7 )
  (byte*) print_char_cursor#47 ← phi( main::@1/(byte*) print_char_cursor#38 )
  (word) main::b#3 ← phi( main::@1/(word) main::b#5 )
  (word) main::a#3 ← phi( main::@1/(word) main::a#5 )
  (byte*) BORDERCOL#4 ← phi( main::@1/(byte*) BORDERCOL#6 )
  (byte*) RASTER#2 ← phi( main::@1/(byte*) RASTER#4 )
  to:main::@4
main::@4: scope:[main]  from main::@2 main::@5
  (byte*) print_line_cursor#20 ← phi( main::@2/(byte*) print_line_cursor#21 main::@5/(byte*) print_line_cursor#22 )
  (byte*) print_screen#20 ← phi( main::@2/(byte*) print_screen#21 main::@5/(byte*) print_screen#22 )
  (byte*) SCREEN#4 ← phi( main::@2/(byte*) SCREEN#5 main::@5/(byte*) SCREEN#6 )
  (byte*) print_char_cursor#44 ← phi( main::@2/(byte*) print_char_cursor#47 main::@5/(byte*) print_char_cursor#48 )
  (word) main::b#2 ← phi( main::@2/(word) main::b#3 main::@5/(word) main::b#4 )
  (word) main::a#2 ← phi( main::@2/(word) main::a#3 main::@5/(word) main::a#4 )
  (byte*) BORDERCOL#3 ← phi( main::@2/(byte*) BORDERCOL#4 main::@5/(byte*) BORDERCOL#5 )
  (byte*) RASTER#1 ← phi( main::@2/(byte*) RASTER#2 main::@5/(byte*) RASTER#3 )
  (bool~) main::$1 ← *((byte*) RASTER#1) != (byte/word/signed word/dword/signed dword) 255
  if((bool~) main::$1) goto main::@5
  to:main::@6
main::@5: scope:[main]  from main::@4
  (byte*) print_line_cursor#22 ← phi( main::@4/(byte*) print_line_cursor#20 )
  (byte*) print_screen#22 ← phi( main::@4/(byte*) print_screen#20 )
  (byte*) SCREEN#6 ← phi( main::@4/(byte*) SCREEN#4 )
  (byte*) print_char_cursor#48 ← phi( main::@4/(byte*) print_char_cursor#44 )
  (word) main::b#4 ← phi( main::@4/(word) main::b#2 )
  (word) main::a#4 ← phi( main::@4/(word) main::a#2 )
  (byte*) BORDERCOL#5 ← phi( main::@4/(byte*) BORDERCOL#3 )
  (byte*) RASTER#3 ← phi( main::@4/(byte*) RASTER#1 )
  to:main::@4
main::@6: scope:[main]  from main::@4
  (byte*) RASTER#11 ← phi( main::@4/(byte*) RASTER#1 )
  (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*) SCREEN#3 ← phi( main::@4/(byte*) SCREEN#4 )
  (byte*) print_char_cursor#41 ← phi( main::@4/(byte*) print_char_cursor#44 )
  (word) main::b#1 ← phi( main::@4/(word) main::b#2 )
  (word) main::a#1 ← phi( main::@4/(word) main::a#2 )
  (byte*) BORDERCOL#1 ← phi( main::@4/(byte*) BORDERCOL#3 )
  *((byte*) BORDERCOL#1) ← ++ *((byte*) BORDERCOL#1)
  (word) mulf16u::a#0 ← (word) main::a#1
  (word) mulf16u::b#0 ← (word) main::b#1
  call mulf16u 
  (dword) mulf16u::return#0 ← (dword) mulf16u::return#2
  to:main::@14
main::@14: scope:[main]  from main::@6
  (word) main::b#8 ← phi( main::@6/(word) main::b#1 )
  (word) main::a#8 ← phi( main::@6/(word) main::a#1 )
  (byte*) RASTER#10 ← phi( main::@6/(byte*) RASTER#11 )
  (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*) SCREEN#2 ← phi( main::@6/(byte*) SCREEN#3 )
  (byte*) print_char_cursor#37 ← phi( main::@6/(byte*) print_char_cursor#41 )
  (byte*) BORDERCOL#2 ← phi( main::@6/(byte*) BORDERCOL#1 )
  (dword) mulf16u::return#3 ← phi( main::@6/(dword) mulf16u::return#0 )
  (dword~) main::$2 ← (dword) mulf16u::return#3
  (dword) main::r#0 ← (dword~) main::$2
  *((byte*) BORDERCOL#2) ← -- *((byte*) BORDERCOL#2)
  (dword) print_dword::dw#0 ← (dword) main::r#0
  call print_dword 
  to:main::@15
main::@15: scope:[main]  from main::@14
  (word) main::b#7 ← phi( main::@14/(word) main::b#8 )
  (word) main::a#7 ← phi( main::@14/(word) main::a#8 )
  (byte*) BORDERCOL#10 ← phi( main::@14/(byte*) BORDERCOL#2 )
  (byte*) RASTER#8 ← phi( main::@14/(byte*) RASTER#10 )
  (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*) SCREEN#1 ← phi( main::@14/(byte*) SCREEN#2 )
  (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#1
  call print_set_screen 
  to:main::@16
main::@16: scope:[main]  from main::@15
  (byte*) SCREEN#9 ← phi( main::@15/(byte*) SCREEN#1 )
  (word) main::b#6 ← phi( main::@15/(word) main::b#7 )
  (word) main::a#6 ← phi( main::@15/(word) main::a#7 )
  (byte*) BORDERCOL#8 ← phi( main::@15/(byte*) BORDERCOL#10 )
  (byte*) RASTER#6 ← phi( main::@15/(byte*) RASTER#8 )
  (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
@20: scope:[]  from @19
  (byte*) SCREEN#12 ← phi( @19/(byte*) SCREEN#0 )
  (byte*) BORDERCOL#12 ← phi( @19/(byte*) BORDERCOL#0 )
  (byte*) RASTER#12 ← phi( @19/(byte*) RASTER#0 )
  (byte*) print_line_cursor#15 ← phi( @19/(byte*) print_line_cursor#18 )
  (byte*) print_screen#15 ← phi( @19/(byte*) print_screen#18 )
  (byte*) print_char_cursor#42 ← phi( @19/(byte*) print_char_cursor#45 )
  (byte[512]) mulf_sqr1_lo#0 ← { fill( 512, 0) }
  (byte[512]) mulf_sqr1_hi#0 ← { fill( 512, 0) }
  (byte[512]) mulf_sqr2_lo#0 ← { fill( 512, 0) }
  (byte[512]) mulf_sqr2_hi#0 ← { fill( 512, 0) }
  to:@22
mulf_init: scope:[mulf_init]  from main
  (word) mulf_init::sqr#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
  (byte) mulf_init::x_2#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
  (byte) mulf_init::c#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
  (byte*~) mulf_init::$0 ← (byte[512]) mulf_sqr1_hi#0 + (byte/signed byte/word/signed word/dword/signed dword) 1
  (byte*) mulf_init::sqr1_hi#0 ← (byte*~) mulf_init::$0
  (byte*~) mulf_init::$1 ← (byte[512]) mulf_sqr1_lo#0 + (byte/signed byte/word/signed word/dword/signed dword) 1
  (byte*) mulf_init::sqr1_lo#0 ← (byte*~) mulf_init::$1
  to:mulf_init::@1
mulf_init::@1: scope:[mulf_init]  from mulf_init mulf_init::@2
  (byte) mulf_init::x_2#4 ← phi( mulf_init/(byte) mulf_init::x_2#0 mulf_init::@2/(byte) mulf_init::x_2#2 )
  (byte*) mulf_init::sqr1_hi#3 ← phi( mulf_init/(byte*) mulf_init::sqr1_hi#0 mulf_init::@2/(byte*) mulf_init::sqr1_hi#1 )
  (byte*) mulf_init::sqr1_lo#3 ← phi( mulf_init/(byte*) mulf_init::sqr1_lo#0 mulf_init::@2/(byte*) mulf_init::sqr1_lo#1 )
  (word) mulf_init::sqr#5 ← phi( mulf_init/(word) mulf_init::sqr#0 mulf_init::@2/(word) mulf_init::sqr#1 )
  (byte) mulf_init::c#2 ← phi( mulf_init/(byte) mulf_init::c#0 mulf_init::@2/(byte) mulf_init::c#3 )
  (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2
  (byte~) mulf_init::$2 ← (byte) mulf_init::c#1 & (byte/signed byte/word/signed word/dword/signed dword) 1
  (bool~) mulf_init::$3 ← (byte~) mulf_init::$2 == (byte/signed byte/word/signed word/dword/signed dword) 0
  (bool~) mulf_init::$4 ← ! (bool~) mulf_init::$3
  if((bool~) mulf_init::$4) goto mulf_init::@2
  to:mulf_init::@5
mulf_init::@2: scope:[mulf_init]  from mulf_init::@1 mulf_init::@5
  (byte) mulf_init::c#3 ← phi( mulf_init::@1/(byte) mulf_init::c#1 mulf_init::@5/(byte) mulf_init::c#4 )
  (byte) mulf_init::x_2#2 ← phi( mulf_init::@1/(byte) mulf_init::x_2#4 mulf_init::@5/(byte) mulf_init::x_2#1 )
  (byte*) mulf_init::sqr1_hi#2 ← phi( mulf_init::@1/(byte*) mulf_init::sqr1_hi#3 mulf_init::@5/(byte*) mulf_init::sqr1_hi#4 )
  (byte*) mulf_init::sqr1_lo#2 ← phi( mulf_init::@1/(byte*) mulf_init::sqr1_lo#3 mulf_init::@5/(byte*) mulf_init::sqr1_lo#4 )
  (word) mulf_init::sqr#3 ← phi( mulf_init::@1/(word) mulf_init::sqr#5 mulf_init::@5/(word) mulf_init::sqr#2 )
  (byte~) mulf_init::$5 ← < (word) mulf_init::sqr#3
  *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$5
  (byte~) mulf_init::$6 ← > (word) mulf_init::sqr#3
  *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$6
  (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2
  (word~) mulf_init::$7 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2
  (word) mulf_init::sqr#1 ← (word~) mulf_init::$7
  (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2
  (byte*~) mulf_init::$8 ← (byte[512]) mulf_sqr1_lo#0 + (word/signed word/dword/signed dword) 512
  (bool~) mulf_init::$9 ← (byte*) mulf_init::sqr1_lo#1 != (byte*~) mulf_init::$8
  if((bool~) mulf_init::$9) goto mulf_init::@1
  to:mulf_init::@6
mulf_init::@5: scope:[mulf_init]  from mulf_init::@1
  (byte) mulf_init::c#4 ← phi( mulf_init::@1/(byte) mulf_init::c#1 )
  (byte*) mulf_init::sqr1_hi#4 ← phi( mulf_init::@1/(byte*) mulf_init::sqr1_hi#3 )
  (byte*) mulf_init::sqr1_lo#4 ← phi( mulf_init::@1/(byte*) mulf_init::sqr1_lo#3 )
  (word) mulf_init::sqr#4 ← phi( mulf_init::@1/(word) mulf_init::sqr#5 )
  (byte) mulf_init::x_2#3 ← phi( mulf_init::@1/(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::@2
mulf_init::@6: scope:[mulf_init]  from mulf_init::@2
  (signed byte/signed word/signed dword~) mulf_init::$10 ← - (byte/signed byte/word/signed word/dword/signed dword) 1
  (byte~) mulf_init::$11 ← ((byte)) (signed byte/signed word/signed dword~) mulf_init::$10
  (byte) mulf_init::x_255#0 ← (byte~) mulf_init::$11
  (byte) mulf_init::dir#0 ← (byte/word/signed word/dword/signed dword) 255
  (byte*) mulf_init::sqr2_hi#0 ← (byte[512]) mulf_sqr2_hi#0
  (byte*) mulf_init::sqr2_lo#0 ← (byte[512]) mulf_sqr2_lo#0
  to:mulf_init::@3
mulf_init::@3: scope:[mulf_init]  from mulf_init::@4 mulf_init::@6
  (byte) mulf_init::dir#2 ← phi( mulf_init::@4/(byte) mulf_init::dir#3 mulf_init::@6/(byte) mulf_init::dir#0 )
  (byte*) mulf_init::sqr2_hi#2 ← phi( mulf_init::@4/(byte*) mulf_init::sqr2_hi#3 mulf_init::@6/(byte*) mulf_init::sqr2_hi#0 )
  (byte*) mulf_init::sqr2_lo#2 ← phi( mulf_init::@4/(byte*) mulf_init::sqr2_lo#1 mulf_init::@6/(byte*) mulf_init::sqr2_lo#0 )
  (byte) mulf_init::x_255#2 ← phi( mulf_init::@4/(byte) mulf_init::x_255#3 mulf_init::@6/(byte) mulf_init::x_255#0 )
  *((byte*) mulf_init::sqr2_lo#2) ← *((byte[512]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2)
  *((byte*) mulf_init::sqr2_hi#2) ← *((byte[512]) 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::$12 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2
  (byte) mulf_init::x_255#1 ← (byte~) mulf_init::$12
  (bool~) mulf_init::$13 ← (byte) mulf_init::x_255#1 == (byte/signed byte/word/signed word/dword/signed dword) 0
  (bool~) mulf_init::$14 ← ! (bool~) mulf_init::$13
  if((bool~) mulf_init::$14) goto mulf_init::@4
  to:mulf_init::@7
mulf_init::@4: scope:[mulf_init]  from mulf_init::@3 mulf_init::@7
  (byte) mulf_init::dir#3 ← phi( mulf_init::@3/(byte) mulf_init::dir#2 mulf_init::@7/(byte) mulf_init::dir#1 )
  (byte*) mulf_init::sqr2_hi#3 ← phi( mulf_init::@3/(byte*) mulf_init::sqr2_hi#1 mulf_init::@7/(byte*) mulf_init::sqr2_hi#4 )
  (byte) mulf_init::x_255#3 ← phi( mulf_init::@3/(byte) mulf_init::x_255#1 mulf_init::@7/(byte) mulf_init::x_255#4 )
  (byte*) mulf_init::sqr2_lo#3 ← phi( mulf_init::@3/(byte*) mulf_init::sqr2_lo#2 mulf_init::@7/(byte*) mulf_init::sqr2_lo#4 )
  (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#3
  (byte*~) mulf_init::$15 ← (byte[512]) mulf_sqr2_lo#0 + (word/signed word/dword/signed dword) 511
  (bool~) mulf_init::$16 ← (byte*) mulf_init::sqr2_lo#1 != (byte*~) mulf_init::$15
  if((bool~) mulf_init::$16) goto mulf_init::@3
  to:mulf_init::@8
mulf_init::@7: scope:[mulf_init]  from mulf_init::@3
  (byte*) mulf_init::sqr2_hi#4 ← phi( mulf_init::@3/(byte*) mulf_init::sqr2_hi#1 )
  (byte) mulf_init::x_255#4 ← phi( mulf_init::@3/(byte) mulf_init::x_255#1 )
  (byte*) mulf_init::sqr2_lo#4 ← phi( mulf_init::@3/(byte*) mulf_init::sqr2_lo#2 )
  (byte) mulf_init::dir#1 ← (byte/signed byte/word/signed word/dword/signed dword) 1
  to:mulf_init::@4
mulf_init::@8: scope:[mulf_init]  from mulf_init::@4
  (byte*~) mulf_init::$17 ← (byte[512]) mulf_sqr2_lo#0 + (word/signed word/dword/signed dword) 511
  (byte*~) mulf_init::$18 ← (byte[512]) mulf_sqr1_lo#0 + (word/signed word/dword/signed dword) 256
  *((byte*~) mulf_init::$17) ← *((byte*~) mulf_init::$18)
  (byte*~) mulf_init::$19 ← (byte[512]) mulf_sqr2_hi#0 + (word/signed word/dword/signed dword) 511
  (byte*~) mulf_init::$20 ← (byte[512]) mulf_sqr1_hi#0 + (word/signed word/dword/signed dword) 256
  *((byte*~) mulf_init::$19) ← *((byte*~) mulf_init::$20)
  to:mulf_init::@return
mulf_init::@return: scope:[mulf_init]  from mulf_init::@8
  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*)) (byte/word/signed word/dword/signed dword) 248
  (word*) mulf16u::memB#0 ← ((word*)) (byte/word/signed word/dword/signed dword) 250
  (dword*) mulf16u::memR#0 ← ((dword*)) (byte/word/signed word/dword/signed dword) 252
  *((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
@22: scope:[]  from @20
  (byte*) SCREEN#11 ← phi( @20/(byte*) SCREEN#12 )
  (byte*) BORDERCOL#11 ← phi( @20/(byte*) BORDERCOL#12 )
  (byte*) RASTER#9 ← phi( @20/(byte*) RASTER#12 )
  (byte*) print_line_cursor#12 ← phi( @20/(byte*) print_line_cursor#15 )
  (byte*) print_screen#12 ← phi( @20/(byte*) print_screen#15 )
  (byte*) print_char_cursor#39 ← phi( @20/(byte*) print_char_cursor#42 )
  call main 
  to:@23
@23: scope:[]  from @22
  (byte*) print_line_cursor#9 ← phi( @22/(byte*) print_line_cursor#4 )
  (byte*) print_screen#9 ← phi( @22/(byte*) print_screen#4 )
  (byte*) print_char_cursor#33 ← phi( @22/(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 @23

SYMBOL TABLE SSA
(const string) $0 = (string) "0123456789abcdef"
(label) @12
(label) @19
(label) @20
(label) @22
(label) @23
(label) @begin
(label) @end
(byte*) BORDERCOL
(byte*) BORDERCOL#0
(byte*) BORDERCOL#1
(byte*) BORDERCOL#10
(byte*) BORDERCOL#11
(byte*) BORDERCOL#12
(byte*) BORDERCOL#2
(byte*) BORDERCOL#3
(byte*) BORDERCOL#4
(byte*) BORDERCOL#5
(byte*) BORDERCOL#6
(byte*) BORDERCOL#7
(byte*) BORDERCOL#8
(byte*) BORDERCOL#9
(byte*) RASTER
(byte*) RASTER#0
(byte*) RASTER#1
(byte*) RASTER#10
(byte*) RASTER#11
(byte*) RASTER#12
(byte*) RASTER#2
(byte*) RASTER#3
(byte*) RASTER#4
(byte*) RASTER#5
(byte*) RASTER#6
(byte*) RASTER#7
(byte*) RASTER#8
(byte*) RASTER#9
(byte*) SCREEN
(byte*) SCREEN#0
(byte*) SCREEN#1
(byte*) SCREEN#10
(byte*) SCREEN#11
(byte*) SCREEN#12
(byte*) SCREEN#2
(byte*) SCREEN#3
(byte*) SCREEN#4
(byte*) SCREEN#5
(byte*) SCREEN#6
(byte*) SCREEN#7
(byte*) SCREEN#8
(byte*) SCREEN#9
(void()) main()
(bool~) main::$1
(dword~) main::$2
(label) main::@1
(label) main::@13
(label) main::@14
(label) main::@15
(label) main::@16
(label) main::@2
(label) main::@4
(label) main::@5
(label) main::@6
(label) main::@return
(word) main::a
(word) main::a#0
(word) main::a#1
(word) main::a#2
(word) main::a#3
(word) main::a#4
(word) main::a#5
(word) main::a#6
(word) main::a#7
(word) main::a#8
(word) main::b
(word) main::b#0
(word) main::b#1
(word) main::b#2
(word) main::b#3
(word) main::b#4
(word) main::b#5
(word) main::b#6
(word) main::b#7
(word) main::b#8
(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
(signed byte/signed word/signed dword~) mulf_init::$10
(byte~) mulf_init::$11
(byte~) mulf_init::$12
(bool~) mulf_init::$13
(bool~) mulf_init::$14
(byte*~) mulf_init::$15
(bool~) mulf_init::$16
(byte*~) mulf_init::$17
(byte*~) mulf_init::$18
(byte*~) mulf_init::$19
(byte~) mulf_init::$2
(byte*~) mulf_init::$20
(bool~) mulf_init::$3
(bool~) mulf_init::$4
(byte~) mulf_init::$5
(byte~) mulf_init::$6
(word~) mulf_init::$7
(byte*~) mulf_init::$8
(bool~) mulf_init::$9
(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::@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::dir
(byte) mulf_init::dir#0
(byte) mulf_init::dir#1
(byte) mulf_init::dir#2
(byte) mulf_init::dir#3
(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
(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_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::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_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::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_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[512]) mulf_sqr1_hi
(byte[512]) mulf_sqr1_hi#0
(byte[512]) mulf_sqr1_lo
(byte[512]) mulf_sqr1_lo#0
(byte[512]) mulf_sqr2_hi
(byte[512]) mulf_sqr2_hi#0
(byte[512]) mulf_sqr2_lo
(byte[512]) mulf_sqr2_lo#0
(void()) print_byte((byte) print_byte::b)
(byte~) print_byte::$0
(byte~) 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#47
(byte*) print_char_cursor#48
(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#21
(byte*) print_line_cursor#22
(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#21
(byte*) print_screen#22
(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

Inversing boolean not [120] (bool~) mulf_init::$4 ← (byte~) mulf_init::$2 != (byte/signed byte/word/signed word/dword/signed dword) 0 from [119] (bool~) mulf_init::$3 ← (byte~) mulf_init::$2 == (byte/signed byte/word/signed word/dword/signed dword) 0
Inversing boolean not [150] (bool~) mulf_init::$14 ← (byte) mulf_init::x_255#1 != (byte/signed byte/word/signed word/dword/signed dword) 0 from [149] (bool~) mulf_init::$13 ← (byte) mulf_init::x_255#1 == (byte/signed byte/word/signed word/dword/signed dword) 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*) RASTER#5 = (byte*) RASTER#7 
Alias (byte*) BORDERCOL#7 = (byte*) BORDERCOL#9 
Alias (byte*) SCREEN#10 = (byte*) SCREEN#8 
Alias (byte*) RASTER#2 = (byte*) RASTER#4 
Alias (byte*) BORDERCOL#4 = (byte*) BORDERCOL#6 
Alias (word) main::a#3 = (word) main::a#5 
Alias (word) main::b#3 = (word) main::b#5 
Alias (byte*) print_char_cursor#16 = (byte*) print_char_cursor#47 (byte*) print_char_cursor#38 (byte*) print_char_cursor#32 
Alias (byte*) SCREEN#5 = (byte*) SCREEN#7 
Alias (byte*) print_screen#11 = (byte*) print_screen#21 (byte*) print_screen#8 (byte*) print_screen#4 
Alias (byte*) print_line_cursor#11 = (byte*) print_line_cursor#21 (byte*) print_line_cursor#8 (byte*) print_line_cursor#4 
Alias (byte*) RASTER#1 = (byte*) RASTER#3 (byte*) RASTER#11 (byte*) RASTER#10 (byte*) RASTER#8 (byte*) RASTER#6 
Alias (byte*) BORDERCOL#1 = (byte*) BORDERCOL#5 (byte*) BORDERCOL#3 (byte*) BORDERCOL#2 (byte*) BORDERCOL#10 (byte*) BORDERCOL#8 
Alias (word) main::a#1 = (word) main::a#4 (word) main::a#2 (word) main::a#8 (word) main::a#7 (word) main::a#6 
Alias (word) main::b#1 = (word) main::b#4 (word) main::b#2 (word) main::b#8 (word) main::b#7 (word) main::b#6 
Alias (byte*) print_char_cursor#37 = (byte*) print_char_cursor#48 (byte*) print_char_cursor#44 (byte*) print_char_cursor#41 
Alias (byte*) SCREEN#1 = (byte*) SCREEN#6 (byte*) SCREEN#4 (byte*) SCREEN#3 (byte*) SCREEN#2 (byte*) SCREEN#9 
Alias (byte*) print_screen#10 = (byte*) print_screen#22 (byte*) print_screen#20 (byte*) print_screen#17 (byte*) print_screen#14 
Alias (byte*) print_line_cursor#10 = (byte*) print_line_cursor#22 (byte*) print_line_cursor#20 (byte*) print_line_cursor#17 (byte*) print_line_cursor#14 
Alias (dword) mulf16u::return#0 = (dword) mulf16u::return#3 
Alias (dword) main::r#0 = (dword~) main::$2 
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*) RASTER#0 = (byte*) RASTER#12 (byte*) RASTER#9 
Alias (byte*) BORDERCOL#0 = (byte*) BORDERCOL#12 (byte*) BORDERCOL#11 
Alias (byte*) SCREEN#0 = (byte*) SCREEN#12 (byte*) SCREEN#11 
Alias (byte*) mulf_init::sqr1_hi#0 = (byte*~) mulf_init::$0 
Alias (byte*) mulf_init::sqr1_lo#0 = (byte*~) mulf_init::$1 
Alias (word) mulf_init::sqr#1 = (word~) mulf_init::$7 
Alias (byte) mulf_init::x_2#3 = (byte) mulf_init::x_2#4 
Alias (word) mulf_init::sqr#4 = (word) mulf_init::sqr#5 
Alias (byte*) mulf_init::sqr1_lo#3 = (byte*) mulf_init::sqr1_lo#4 
Alias (byte*) mulf_init::sqr1_hi#3 = (byte*) mulf_init::sqr1_hi#4 
Alias (byte) mulf_init::c#1 = (byte) mulf_init::c#4 
Alias (byte) mulf_init::x_255#0 = (byte~) mulf_init::$11 
Alias (byte) mulf_init::x_255#1 = (byte~) mulf_init::$12 (byte) mulf_init::x_255#4 
Alias (byte*) mulf_init::sqr2_lo#2 = (byte*) mulf_init::sqr2_lo#4 
Alias (byte*) mulf_init::sqr2_hi#1 = (byte*) mulf_init::sqr2_hi#4 
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#3 
Alias (byte*) mulf_init::sqr2_lo#2 = (byte*) mulf_init::sqr2_lo#3 
Alias (byte) mulf_init::x_255#1 = (byte) mulf_init::x_255#3 
Alias (byte*) mulf_init::sqr2_hi#1 = (byte*) mulf_init::sqr2_hi#3 
Successful SSA optimization Pass2AliasElimination
Self Phi Eliminated (byte*) RASTER#1
Self Phi Eliminated (byte*) BORDERCOL#1
Self Phi Eliminated (word) main::a#1
Self Phi Eliminated (word) main::b#1
Self Phi Eliminated (byte*) print_char_cursor#37
Self Phi Eliminated (byte*) SCREEN#1
Self Phi Eliminated (byte*) print_screen#10
Self Phi Eliminated (byte*) print_line_cursor#10
Successful SSA optimization Pass2SelfPhiElimination
Redundant Phi (byte*) print_char_cursor#1 (byte*) print_char_cursor#25
Redundant Phi (byte*) print_char_cursor#19 (byte*) print_char_cursor#25
Redundant Phi (dword) print_dword::dw#1 (dword) print_dword::dw#0
Redundant Phi (byte*) print_char_cursor#35 (byte*) print_char_cursor#37
Redundant Phi (byte*) print_char_cursor#21 (byte*) print_char_cursor#19
Redundant Phi (byte*) print_char_cursor#22 (byte*) print_char_cursor#19
Redundant Phi (byte*) print_char_cursor#24 (byte*) print_char_cursor#10
Redundant Phi (byte*) print_char_cursor#25 (byte*) print_char_cursor#10
Redundant Phi (byte*) print_set_screen::screen#1 (byte*) print_set_screen::screen#0
Redundant Phi (byte*) print_char_cursor#40 (byte*) print_char_cursor#0
Redundant Phi (byte*) print_screen#13 (byte*) print_char_cursor#0
Redundant Phi (byte*) print_line_cursor#13 (byte*) print_char_cursor#0
Redundant Phi (byte*) RASTER#5 (byte*) RASTER#0
Redundant Phi (byte*) BORDERCOL#7 (byte*) BORDERCOL#0
Redundant Phi (byte*) SCREEN#10 (byte*) SCREEN#0
Redundant Phi (byte*) RASTER#1 (byte*) RASTER#2
Redundant Phi (byte*) BORDERCOL#1 (byte*) BORDERCOL#4
Redundant Phi (word) main::a#1 (word) main::a#3
Redundant Phi (word) main::b#1 (word) main::b#3
Redundant Phi (byte*) print_char_cursor#37 (byte*) print_char_cursor#16
Redundant Phi (byte*) SCREEN#1 (byte*) SCREEN#5
Redundant Phi (byte*) print_screen#10 (byte*) print_screen#11
Redundant Phi (byte*) print_line_cursor#10 (byte*) print_line_cursor#11
Redundant Phi (byte*) print_char_cursor#14 (byte*) print_char_cursor#22
Redundant Phi (byte*) print_screen#3 (byte*) print_screen#1
Redundant Phi (byte*) print_line_cursor#3 (byte*) print_screen#1
Redundant Phi (byte*) print_char_cursor#15 (byte*) print_screen#1
Redundant Phi (word) mulf16u::a#1 (word) mulf16u::a#0
Redundant Phi (word) mulf16u::b#1 (word) mulf16u::b#0
Redundant Phi (byte*) print_char_cursor#17 (byte*) print_char_cursor#16
Redundant Phi (byte*) print_screen#5 (byte*) print_screen#11
Redundant Phi (byte*) print_line_cursor#5 (byte*) print_line_cursor#11
Successful SSA optimization Pass2RedundantPhiElimination
Simple Condition (bool~) main::$1 [77] if(*((byte*) RASTER#2)!=(byte/word/signed word/dword/signed dword) 255) goto main::@5
Simple Condition (bool~) mulf_init::$4 [121] if((byte~) mulf_init::$2!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mulf_init::@2
Simple Condition (bool~) mulf_init::$9 [133] if((byte*) mulf_init::sqr1_lo#1!=(byte*~) mulf_init::$8) goto mulf_init::@1
Simple Condition (bool~) mulf_init::$14 [151] if((byte) mulf_init::x_255#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mulf_init::@4
Simple Condition (bool~) mulf_init::$16 [156] if((byte*) mulf_init::sqr2_lo#1!=(byte*~) mulf_init::$15) goto mulf_init::@3
Successful SSA optimization Pass2ConditionalJumpSimplification
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 = 1234
Constant (const word) main::b#0 = 2345
Constant (const byte[512]) mulf_sqr1_lo#0 = { fill( 512, 0) }
Constant (const byte[512]) mulf_sqr1_hi#0 = { fill( 512, 0) }
Constant (const byte[512]) mulf_sqr2_lo#0 = { fill( 512, 0) }
Constant (const byte[512]) mulf_sqr2_hi#0 = { fill( 512, 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 signed byte/signed word/signed dword) mulf_init::$10 = -1
Constant (const byte) mulf_init::dir#0 = 255
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 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::$8 = mulf_sqr1_lo#0+512
Constant (const byte) mulf_init::x_255#0 = ((byte))mulf_init::$10
Constant (const byte*) mulf_init::sqr2_hi#0 = mulf_sqr2_hi#0
Constant (const byte*) mulf_init::sqr2_lo#0 = mulf_sqr2_lo#0
Constant (const byte*) mulf_init::$15 = mulf_sqr2_lo#0+511
Constant (const byte*) mulf_init::$17 = mulf_sqr2_lo#0+511
Constant (const byte*) mulf_init::$18 = mulf_sqr1_lo#0+256
Constant (const byte*) mulf_init::$19 = mulf_sqr2_hi#0+511
Constant (const byte*) mulf_init::$20 = mulf_sqr1_hi#0+256
Successful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination [28] if(true) goto main::@2
Successful SSA optimization Pass2ConstantIfs
Successful SSA optimization PassNEliminateUnusedVars
Removing unused block main::@return
Successful SSA optimization Pass2EliminateUnusedBlocks
Culled Empty Block (label) print_word::@2
Culled Empty Block (label) print_dword::@2
Culled Empty Block (label) @12
Culled Empty Block (label) print_byte::@2
Culled Empty Block (label) @19
Culled Empty Block (label) main::@2
Culled Empty Block (label) main::@5
Culled Empty Block (label) main::@16
Culled Empty Block (label) @20
Culled Empty Block (label) mulf_init::@6
Culled Empty Block (label) @23
Successful SSA optimization Pass2CullEmptyBlocks
Self Phi Eliminated (byte*) RASTER#2
Self Phi Eliminated (byte*) BORDERCOL#4
Self Phi Eliminated (word) main::a#3
Self Phi Eliminated (word) main::b#3
Self Phi Eliminated (byte*) SCREEN#5
Successful SSA optimization Pass2SelfPhiElimination
Redundant Phi (byte*) RASTER#2 (const byte*) RASTER#0
Redundant Phi (byte*) BORDERCOL#4 (const byte*) BORDERCOL#0
Redundant Phi (word) main::a#3 (const word) main::a#0
Redundant Phi (word) main::b#3 (const word) main::b#0
Redundant Phi (byte*) SCREEN#5 (const byte*) SCREEN#0
Successful SSA optimization Pass2RedundantPhiElimination
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
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte*) print_screen#1 = print_set_screen::screen#0
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::dir#0
Inlining constant with var siblings (const byte) mulf_init::dir#1
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) mulf_init::x_255#0
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*) print_char_cursor#0
Constant inlined mulf_init::c#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined mulf_init::sqr2_lo#0 = (const byte[512]) mulf_sqr2_lo#0
Constant inlined mulf_init::sqr#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined mulf16u::b#0 = (const word) main::b#0
Constant inlined mulf_init::sqr2_hi#0 = (const byte[512]) 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 $0 = (const byte[]) print_hextab#0
Constant inlined mulf_init::$8 = (const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 512
Constant inlined mulf_init::dir#1 = (byte/signed byte/word/signed word/dword/signed dword) 1
Constant inlined print_char_cursor#0 = ((byte*))(word/signed word/dword/signed dword) 1024
Constant inlined mulf_init::dir#0 = (byte/word/signed word/dword/signed dword) 255
Constant inlined mulf_init::sqr1_hi#0 = (const byte[512]) mulf_sqr1_hi#0+(byte/signed byte/word/signed word/dword/signed dword) 1
Constant inlined mulf_init::$10 = -(byte/signed byte/word/signed word/dword/signed dword) 1
Constant inlined print_set_screen::screen#0 = (const byte*) SCREEN#0
Constant inlined mulf_init::$20 = (const byte[512]) mulf_sqr1_hi#0+(word/signed word/dword/signed dword) 256
Constant inlined mulf_init::sqr1_lo#0 = (const byte[512]) mulf_sqr1_lo#0+(byte/signed byte/word/signed word/dword/signed dword) 1
Constant inlined mulf_init::$15 = (const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511
Constant inlined mulf_init::x_255#0 = ((byte))-(byte/signed byte/word/signed word/dword/signed dword) 1
Constant inlined mulf_init::$18 = (const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 256
Constant inlined mulf_init::$19 = (const byte[512]) mulf_sqr2_hi#0+(word/signed word/dword/signed dword) 511
Constant inlined mulf_init::$17 = (const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511
Constant inlined mulf_init::x_2#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Successful SSA optimization Pass2ConstantInlining
Added new block during phi lifting mulf_init::@9(between mulf_init::@2 and mulf_init::@1)
Added new block during phi lifting mulf_init::@10(between mulf_init::@1 and mulf_init::@2)
Added new block during phi lifting mulf_init::@11(between mulf_init::@4 and mulf_init::@3)
Added new block during phi lifting mulf_init::@12(between mulf_init::@3 and mulf_init::@4)
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @22
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 print_set_screen
Adding NOP phi() at start of mulf_init
Adding NOP phi() at start of mulf_init::@7
CALL GRAPH
Calls in [] to main:2 
Calls in [main] to mulf_init:5 mulf16u:10 print_dword:15 print_set_screen:17 
Calls in [print_dword] to print_word:23 print_word:27 
Calls in [print_word] to print_byte:33 print_byte:37 
Calls in [print_byte] to print_char:44 print_char:49 

Created 19 initial phi equivalence classes
Coalesced [21] print_word::w#4 ← print_word::w#0
Coalesced [22] print_char_cursor#49 ← print_char_cursor#16
Coalesced [25] print_word::w#5 ← print_word::w#1
Coalesced [26] print_char_cursor#50 ← print_char_cursor#10
Coalesced [31] print_byte::b#4 ← print_byte::b#0
Coalesced [32] print_char_cursor#51 ← print_char_cursor#34
Coalesced [35] print_byte::b#5 ← print_byte::b#1
Coalesced (already) [36] print_char_cursor#52 ← print_char_cursor#10
Coalesced [42] print_char::ch#3 ← print_char::ch#0
Coalesced [43] print_char_cursor#53 ← print_char_cursor#36
Coalesced [47] print_char::ch#4 ← print_char::ch#1
Coalesced (already) [48] print_char_cursor#54 ← print_char_cursor#10
Coalesced [67] mulf_init::sqr#8 ← mulf_init::sqr#2
Coalesced [68] mulf_init::x_2#7 ← mulf_init::x_2#1
Coalesced [91] mulf_init::x_255#5 ← mulf_init::x_255#1
Coalesced [92] mulf_init::sqr2_lo#5 ← mulf_init::sqr2_lo#1
Coalesced [93] mulf_init::sqr2_hi#5 ← mulf_init::sqr2_hi#1
Coalesced [94] mulf_init::dir#4 ← mulf_init::dir#3
Coalesced (already) [95] mulf_init::dir#5 ← mulf_init::dir#2
Coalesced [96] mulf_init::c#5 ← mulf_init::c#1
Coalesced [97] mulf_init::sqr#6 ← mulf_init::sqr#1
Coalesced [98] mulf_init::sqr1_lo#5 ← mulf_init::sqr1_lo#1
Coalesced [99] mulf_init::sqr1_hi#5 ← mulf_init::sqr1_hi#1
Coalesced [100] mulf_init::x_2#5 ← mulf_init::x_2#2
Coalesced [101] mulf_init::sqr#7 ← mulf_init::sqr#4
Coalesced (already) [102] mulf_init::x_2#6 ← mulf_init::x_2#3
Coalesced down to 13 phi equivalence classes
Culled Empty Block (label) mulf_init::@7
Culled Empty Block (label) mulf_init::@11
Culled Empty Block (label) mulf_init::@9
Culled Empty Block (label) mulf_init::@10
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @22
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 print_set_screen
Adding NOP phi() at start of mulf_init
Adding NOP phi() at start of mulf_init::@12

FINAL CONTROL FLOW GRAPH
@begin: scope:[]  from
  [0] phi()
  to:@22
@22: scope:[]  from @begin
  [1] phi()
  [2] call main 
  to:@end
@end: scope:[]  from @22
  [3] phi()
main: scope:[main]  from @22
  [4] phi()
  [5] call mulf_init 
  to:main::@13
main::@13: scope:[main]  from main
  asm { sei  }
  to:main::@1
main::@1: scope:[main]  from main::@13 main::@15
  [7] (byte*) print_char_cursor#16 ← phi( main::@13/((byte*))(word/signed word/dword/signed dword) 1024 main::@15/(const byte*) SCREEN#0 )
  to:main::@4
main::@4: scope:[main]  from main::@1 main::@4
  [8] if(*((const byte*) RASTER#0)!=(byte/word/signed word/dword/signed dword) 255) goto main::@4
  to:main::@6
main::@6: scope:[main]  from main::@4
  [9] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0)
  [10] call mulf16u 
  [11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1
  to:main::@14
main::@14: scope:[main]  from main::@6
  [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::@15
main::@15: scope:[main]  from main::@14
  [16] phi()
  [17] call print_set_screen 
  to:main::@1
print_set_screen: scope:[print_set_screen]  from main::@15
  [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::@14
  [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/signed byte/word/signed word/dword/signed dword) 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/signed byte/word/signed word/dword/signed dword) 15
  [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::@6
  [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::@2
  [49] (byte) mulf_init::x_2#3 ← phi( mulf_init/(byte/signed byte/word/signed word/dword/signed dword) 0 mulf_init::@2/(byte) mulf_init::x_2#2 )
  [49] (byte*) mulf_init::sqr1_hi#2 ← phi( mulf_init/(const byte[512]) mulf_sqr1_hi#0+(byte/signed byte/word/signed word/dword/signed dword) 1 mulf_init::@2/(byte*) mulf_init::sqr1_hi#1 )
  [49] (byte*) mulf_init::sqr1_lo#2 ← phi( mulf_init/(const byte[512]) mulf_sqr1_lo#0+(byte/signed byte/word/signed word/dword/signed dword) 1 mulf_init::@2/(byte*) mulf_init::sqr1_lo#1 )
  [49] (word) mulf_init::sqr#4 ← phi( mulf_init/(byte/signed byte/word/signed word/dword/signed dword) 0 mulf_init::@2/(word) mulf_init::sqr#1 )
  [49] (byte) mulf_init::c#2 ← phi( mulf_init/(byte/signed byte/word/signed word/dword/signed dword) 0 mulf_init::@2/(byte) mulf_init::c#1 )
  [50] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2
  [51] (byte~) mulf_init::$2 ← (byte) mulf_init::c#1 & (byte/signed byte/word/signed word/dword/signed dword) 1
  [52] if((byte~) mulf_init::$2!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mulf_init::@2
  to:mulf_init::@5
mulf_init::@5: scope:[mulf_init]  from mulf_init::@1
  [53] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3
  [54] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4
  to:mulf_init::@2
mulf_init::@2: scope:[mulf_init]  from mulf_init::@1 mulf_init::@5
  [55] (byte) mulf_init::x_2#2 ← phi( mulf_init::@1/(byte) mulf_init::x_2#3 mulf_init::@5/(byte) mulf_init::x_2#1 )
  [55] (word) mulf_init::sqr#3 ← phi( mulf_init::@1/(word) mulf_init::sqr#4 mulf_init::@5/(word) mulf_init::sqr#2 )
  [56] (byte~) mulf_init::$5 ← < (word) mulf_init::sqr#3
  [57] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$5
  [58] (byte~) mulf_init::$6 ← > (word) mulf_init::sqr#3
  [59] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$6
  [60] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2
  [61] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2
  [62] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2
  [63] if((byte*) mulf_init::sqr1_lo#1!=(const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 512) goto mulf_init::@1
  to:mulf_init::@3
mulf_init::@3: scope:[mulf_init]  from mulf_init::@2 mulf_init::@4
  [64] (byte) mulf_init::dir#2 ← phi( mulf_init::@4/(byte) mulf_init::dir#3 mulf_init::@2/(byte/word/signed word/dword/signed dword) 255 )
  [64] (byte*) mulf_init::sqr2_hi#2 ← phi( mulf_init::@4/(byte*) mulf_init::sqr2_hi#1 mulf_init::@2/(const byte[512]) mulf_sqr2_hi#0 )
  [64] (byte*) mulf_init::sqr2_lo#2 ← phi( mulf_init::@4/(byte*) mulf_init::sqr2_lo#1 mulf_init::@2/(const byte[512]) mulf_sqr2_lo#0 )
  [64] (byte) mulf_init::x_255#2 ← phi( mulf_init::@4/(byte) mulf_init::x_255#1 mulf_init::@2/((byte))-(byte/signed byte/word/signed word/dword/signed dword) 1 )
  [65] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[512]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2)
  [66] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[512]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2)
  [67] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2
  [68] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2
  [69] if((byte) mulf_init::x_255#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mulf_init::@12
  to:mulf_init::@4
mulf_init::@4: scope:[mulf_init]  from mulf_init::@12 mulf_init::@3
  [70] (byte) mulf_init::dir#3 ← phi( mulf_init::@12/(byte) mulf_init::dir#2 mulf_init::@3/(byte/signed byte/word/signed word/dword/signed dword) 1 )
  [71] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2
  [72] if((byte*) mulf_init::sqr2_lo#1!=(const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511) goto mulf_init::@3
  to:mulf_init::@8
mulf_init::@8: scope:[mulf_init]  from mulf_init::@4
  [73] *((const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511) ← *((const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 256)
  [74] *((const byte[512]) mulf_sqr2_hi#0+(word/signed word/dword/signed dword) 511) ← *((const byte[512]) mulf_sqr1_hi#0+(word/signed word/dword/signed dword) 256)
  to:mulf_init::@return
mulf_init::@return: scope:[mulf_init]  from mulf_init::@8
  [75] return 
  to:@return
mulf_init::@12: scope:[mulf_init]  from mulf_init::@3
  [76] phi()
  to:mulf_init::@4


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::$2 22.0
(byte~) mulf_init::$5 22.0
(byte~) mulf_init::$6 22.0
(byte) mulf_init::c
(byte) mulf_init::c#1 2.357142857142857
(byte) mulf_init::c#2 22.0
(byte) mulf_init::dir
(byte) mulf_init::dir#2 4.714285714285714
(byte) mulf_init::dir#3 7.333333333333333
(word) mulf_init::sqr
(word) mulf_init::sqr#1 7.333333333333333
(word) mulf_init::sqr#2 22.0
(word) mulf_init::sqr#3 9.166666666666666
(word) mulf_init::sqr#4 6.6000000000000005
(byte*) mulf_init::sqr1_hi
(byte*) mulf_init::sqr1_hi#1 5.5
(byte*) mulf_init::sqr1_hi#2 3.0
(byte*) mulf_init::sqr1_lo
(byte*) mulf_init::sqr1_lo#1 16.5
(byte*) mulf_init::sqr1_lo#2 2.5384615384615383
(byte*) mulf_init::sqr2_hi
(byte*) mulf_init::sqr2_hi#1 3.142857142857143
(byte*) mulf_init::sqr2_hi#2 11.0
(byte*) mulf_init::sqr2_lo
(byte*) mulf_init::sqr2_lo#1 16.5
(byte*) mulf_init::sqr2_lo#2 4.125
(byte) mulf_init::x_2
(byte) mulf_init::x_2#1 11.0
(byte) mulf_init::x_2#2 4.888888888888889
(byte) mulf_init::x_2#3 8.25
(byte) mulf_init::x_255
(byte) mulf_init::x_255#1 5.5
(byte) mulf_init::x_255#2 11.0
(byte[512]) mulf_sqr1_hi
(byte[512]) mulf_sqr1_lo
(byte[512]) mulf_sqr2_hi
(byte[512]) 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::c#2 mulf_init::c#1 ]
[ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#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::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
[ mulf_init::x_255#2 mulf_init::x_255#1 ]
[ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
[ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
[ mulf_init::dir#2 mulf_init::dir#3 ]
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::$2 to zero page equivalence class [ mulf_init::$2 ]
Added variable mulf_init::$5 to zero page equivalence class [ mulf_init::$5 ]
Added variable mulf_init::$6 to zero page equivalence class [ mulf_init::$6 ]
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::c#2 mulf_init::c#1 ]
[ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#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::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
[ mulf_init::x_255#2 mulf_init::x_255#1 ]
[ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
[ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
[ mulf_init::dir#2 mulf_init::dir#3 ]
[ mulf16u::return#0 ]
[ main::r#0 ]
[ print_dword::dw#0 ]
[ print_byte::$0 ]
[ print_byte::$2 ]
[ mulf16u::return#1 ]
[ mulf_init::$2 ]
[ mulf_init::$5 ]
[ mulf_init::$6 ]
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_BYTE:8 [ mulf_init::c#2 mulf_init::c#1 ]
Allocated zp ZP_WORD:9 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#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::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
Allocated zp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ]
Allocated zp ZP_WORD:17 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
Allocated zp ZP_WORD:19 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
Allocated zp ZP_BYTE:21 [ mulf_init::dir#2 mulf_init::dir#3 ]
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::$2 ]
Allocated zp ZP_BYTE:41 [ mulf_init::$5 ]
Allocated zp ZP_BYTE:42 [ mulf_init::$6 ]

INITIAL ASM
//SEG0 File Comments
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
//SEG2 Global Constants & labels
  .label RASTER = $d012
  .label BORDERCOL = $d020
  .label SCREEN = $400
  .label print_char_cursor = 6
//SEG3 @begin
bbegin:
//SEG4 [1] phi from @begin to @22 [phi:@begin->@22]
b22_from_bbegin:
  jmp b22
//SEG5 @22
b22:
//SEG6 [2] call main 
//SEG7 [4] phi from @22 to main [phi:@22->main]
main_from_b22:
  jsr main
//SEG8 [3] phi from @22 to @end [phi:@22->@end]
bend_from_b22:
  jmp bend
//SEG9 @end
bend:
//SEG10 main
main: {
    .label a = $4d2
    .label b = $929
    .label r = $1a
  //SEG11 [5] call mulf_init 
  //SEG12 [48] phi from main to mulf_init [phi:main->mulf_init]
  mulf_init_from_main:
    jsr mulf_init
    jmp b13
  //SEG13 main::@13
  b13:
  //SEG14 asm { sei  }
    sei
  //SEG15 [7] phi from main::@13 to main::@1 [phi:main::@13->main::@1]
  b1_from_b13:
  //SEG16 [7] phi (byte*) print_char_cursor#16 = ((byte*))(word/signed word/dword/signed dword) 1024 [phi:main::@13->main::@1#0] -- pbuz1=pbuc1 
    lda #<$400
    sta print_char_cursor
    lda #>$400
    sta print_char_cursor+1
    jmp b1
  //SEG17 main::@1
  b1:
    jmp b4
  //SEG18 main::@4
  b4:
  //SEG19 [8] if(*((const byte*) RASTER#0)!=(byte/word/signed word/dword/signed dword) 255) goto main::@4 -- _deref_pbuc1_neq_vbuc2_then_la1 
    lda RASTER
    cmp #$ff
    bne b4
    jmp b6
  //SEG20 main::@6
  b6:
  //SEG21 [9] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1 
    inc BORDERCOL
  //SEG22 [10] call mulf16u 
    jsr mulf16u
  //SEG23 [11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1 -- vduz1=vduz2 
    lda mulf16u.return_1
    sta mulf16u.return
    lda mulf16u.return_1+1
    sta mulf16u.return+1
    lda mulf16u.return_1+2
    sta mulf16u.return+2
    lda mulf16u.return_1+3
    sta mulf16u.return+3
    jmp b14
  //SEG24 main::@14
  b14:
  //SEG25 [12] (dword) main::r#0 ← (dword) mulf16u::return#0 -- vduz1=vduz2 
    lda mulf16u.return
    sta r
    lda mulf16u.return+1
    sta r+1
    lda mulf16u.return+2
    sta r+2
    lda mulf16u.return+3
    sta r+3
  //SEG26 [13] *((const byte*) BORDERCOL#0) ← -- *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_dec__deref_pbuc1 
    dec BORDERCOL
  //SEG27 [14] (dword) print_dword::dw#0 ← (dword) main::r#0 -- vduz1=vduz2 
    lda r
    sta print_dword.dw
    lda r+1
    sta print_dword.dw+1
    lda r+2
    sta print_dword.dw+2
    lda r+3
    sta print_dword.dw+3
  //SEG28 [15] call print_dword 
    jsr print_dword
  //SEG29 [16] phi from main::@14 to main::@15 [phi:main::@14->main::@15]
  b15_from_b14:
    jmp b15
  //SEG30 main::@15
  b15:
  //SEG31 [17] call print_set_screen 
  //SEG32 [18] phi from main::@15 to print_set_screen [phi:main::@15->print_set_screen]
  print_set_screen_from_b15:
    jsr print_set_screen
  //SEG33 [7] phi from main::@15 to main::@1 [phi:main::@15->main::@1]
  b1_from_b15:
  //SEG34 [7] phi (byte*) print_char_cursor#16 = (const byte*) SCREEN#0 [phi:main::@15->main::@1#0] -- pbuz1=pbuc1 
    lda #<SCREEN
    sta print_char_cursor
    lda #>SCREEN
    sta print_char_cursor+1
    jmp b1
}
//SEG35 print_set_screen
// Set the screen to print on. Also resets current line/char cursor.
print_set_screen: {
    jmp breturn
  //SEG36 print_set_screen::@return
  breturn:
  //SEG37 [19] return 
    rts
}
//SEG38 print_dword
// Print a dword as HEX
// print_dword(dword zeropage($1e) dw)
print_dword: {
    .label dw = $1e
  //SEG39 [20] (word) print_word::w#0 ← > (dword) print_dword::dw#0 -- vwuz1=_hi_vduz2 
    lda dw+2
    sta print_word.w
    lda dw+3
    sta print_word.w+1
  //SEG40 [21] call print_word 
  //SEG41 [25] phi from print_dword to print_word [phi:print_dword->print_word]
  print_word_from_print_dword:
  //SEG42 [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#16 [phi:print_dword->print_word#0] -- register_copy 
  //SEG43 [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
  //SEG44 print_dword::@1
  b1:
  //SEG45 [22] (word) print_word::w#1 ← < (dword) print_dword::dw#0 -- vwuz1=_lo_vduz2 
    lda dw
    sta print_word.w
    lda dw+1
    sta print_word.w+1
  //SEG46 [23] call print_word 
  //SEG47 [25] phi from print_dword::@1 to print_word [phi:print_dword::@1->print_word]
  print_word_from_b1:
  //SEG48 [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#10 [phi:print_dword::@1->print_word#0] -- register_copy 
  //SEG49 [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
  //SEG50 print_dword::@return
  breturn:
  //SEG51 [24] return 
    rts
}
//SEG52 print_word
// Print a word as HEX
// print_word(word zeropage(2) w)
print_word: {
    .label w = 2
  //SEG53 [26] (byte) print_byte::b#0 ← > (word) print_word::w#2 -- vbuz1=_hi_vwuz2 
    lda w+1
    sta print_byte.b
  //SEG54 [27] call print_byte 
  //SEG55 [31] phi from print_word to print_byte [phi:print_word->print_byte]
  print_byte_from_print_word:
  //SEG56 [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#34 [phi:print_word->print_byte#0] -- register_copy 
  //SEG57 [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
  //SEG58 print_word::@1
  b1:
  //SEG59 [28] (byte) print_byte::b#1 ← < (word) print_word::w#2 -- vbuz1=_lo_vwuz2 
    lda w
    sta print_byte.b
  //SEG60 [29] call print_byte 
  //SEG61 [31] phi from print_word::@1 to print_byte [phi:print_word::@1->print_byte]
  print_byte_from_b1:
  //SEG62 [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#10 [phi:print_word::@1->print_byte#0] -- register_copy 
  //SEG63 [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
  //SEG64 print_word::@return
  breturn:
  //SEG65 [30] return 
    rts
}
//SEG66 print_byte
// Print a byte as HEX
// print_byte(byte zeropage(4) b)
print_byte: {
    .label _0 = $22
    .label _2 = $23
    .label b = 4
  //SEG67 [32] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word/dword/signed dword) 4 -- vbuz1=vbuz2_ror_4 
    lda b
    lsr
    lsr
    lsr
    lsr
    sta _0
  //SEG68 [33] (byte) print_char::ch#0 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$0) -- vbuz1=pbuc1_derefidx_vbuz2 
    ldy _0
    lda print_hextab,y
    sta print_char.ch
  //SEG69 [34] call print_char 
  //SEG70 [39] phi from print_byte to print_char [phi:print_byte->print_char]
  print_char_from_print_byte:
  //SEG71 [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#36 [phi:print_byte->print_char#0] -- register_copy 
  //SEG72 [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
  //SEG73 print_byte::@1
  b1:
  //SEG74 [35] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word/dword/signed dword) 15 -- vbuz1=vbuz2_band_vbuc1 
    lda #$f
    and b
    sta _2
  //SEG75 [36] (byte) print_char::ch#1 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$2) -- vbuz1=pbuc1_derefidx_vbuz2 
    ldy _2
    lda print_hextab,y
    sta print_char.ch
  //SEG76 [37] call print_char 
  //SEG77 [39] phi from print_byte::@1 to print_char [phi:print_byte::@1->print_char]
  print_char_from_b1:
  //SEG78 [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#10 [phi:print_byte::@1->print_char#0] -- register_copy 
  //SEG79 [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
  //SEG80 print_byte::@return
  breturn:
  //SEG81 [38] return 
    rts
}
//SEG82 print_char
// Print a single char
// print_char(byte zeropage(5) ch)
print_char: {
    .label ch = 5
  //SEG83 [40] *((byte*) print_char_cursor#27) ← (byte) print_char::ch#2 -- _deref_pbuz1=vbuz2 
    lda ch
    ldy #0
    sta (print_char_cursor),y
  //SEG84 [41] (byte*) print_char_cursor#10 ← ++ (byte*) print_char_cursor#27 -- pbuz1=_inc_pbuz1 
    inc print_char_cursor
    bne !+
    inc print_char_cursor+1
  !:
    jmp breturn
  //SEG85 print_char::@return
  breturn:
  //SEG86 [42] return 
    rts
}
//SEG87 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
  //SEG88 [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
  //SEG89 [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
  //SEG90 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
  !:
  //SEG91 [46] (dword) mulf16u::return#1 ← *((const dword*) mulf16u::memR#0) -- vduz1=_deref_pduc1 
    lda memR
    sta return_1
    lda memR+1
    sta return_1+1
    lda memR+2
    sta return_1+2
    lda memR+3
    sta return_1+3
    jmp breturn
  //SEG92 mulf16u::@return
  breturn:
  //SEG93 [47] return 
    rts
}
//SEG94 mulf_init
// Initialize the mulf_sqr multiplication tables with f(x)=int(x*x/4)
mulf_init: {
    .label _2 = $28
    .label _5 = $29
    .label _6 = $2a
    .label c = 8
    .label sqr1_hi = $b
    .label sqr = $e
    .label sqr1_lo = 9
    .label x_2 = $d
    .label sqr2_hi = $13
    .label x_255 = $10
    .label sqr2_lo = $11
    .label dir = $15
  //SEG95 [49] phi from mulf_init to mulf_init::@1 [phi:mulf_init->mulf_init::@1]
  b1_from_mulf_init:
  //SEG96 [49] phi (byte) mulf_init::x_2#3 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:mulf_init->mulf_init::@1#0] -- vbuz1=vbuc1 
    lda #0
    sta x_2
  //SEG97 [49] phi (byte*) mulf_init::sqr1_hi#2 = (const byte[512]) mulf_sqr1_hi#0+(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:mulf_init->mulf_init::@1#1] -- pbuz1=pbuc1 
    lda #<mulf_sqr1_hi+1
    sta sqr1_hi
    lda #>mulf_sqr1_hi+1
    sta sqr1_hi+1
  //SEG98 [49] phi (byte*) mulf_init::sqr1_lo#2 = (const byte[512]) mulf_sqr1_lo#0+(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:mulf_init->mulf_init::@1#2] -- pbuz1=pbuc1 
    lda #<mulf_sqr1_lo+1
    sta sqr1_lo
    lda #>mulf_sqr1_lo+1
    sta sqr1_lo+1
  //SEG99 [49] phi (word) mulf_init::sqr#4 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:mulf_init->mulf_init::@1#3] -- vwuz1=vbuc1 
    lda #<0
    sta sqr
    lda #>0
    sta sqr+1
  //SEG100 [49] phi (byte) mulf_init::c#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:mulf_init->mulf_init::@1#4] -- vbuz1=vbuc1 
    lda #0
    sta c
    jmp b1
  //SEG101 [49] phi from mulf_init::@2 to mulf_init::@1 [phi:mulf_init::@2->mulf_init::@1]
  b1_from_b2:
  //SEG102 [49] phi (byte) mulf_init::x_2#3 = (byte) mulf_init::x_2#2 [phi:mulf_init::@2->mulf_init::@1#0] -- register_copy 
  //SEG103 [49] phi (byte*) mulf_init::sqr1_hi#2 = (byte*) mulf_init::sqr1_hi#1 [phi:mulf_init::@2->mulf_init::@1#1] -- register_copy 
  //SEG104 [49] phi (byte*) mulf_init::sqr1_lo#2 = (byte*) mulf_init::sqr1_lo#1 [phi:mulf_init::@2->mulf_init::@1#2] -- register_copy 
  //SEG105 [49] phi (word) mulf_init::sqr#4 = (word) mulf_init::sqr#1 [phi:mulf_init::@2->mulf_init::@1#3] -- register_copy 
  //SEG106 [49] phi (byte) mulf_init::c#2 = (byte) mulf_init::c#1 [phi:mulf_init::@2->mulf_init::@1#4] -- register_copy 
    jmp b1
  //SEG107 mulf_init::@1
  b1:
  //SEG108 [50] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2 -- vbuz1=_inc_vbuz1 
    inc c
  //SEG109 [51] (byte~) mulf_init::$2 ← (byte) mulf_init::c#1 & (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuz1=vbuz2_band_vbuc1 
    lda #1
    and c
    sta _2
  //SEG110 [52] if((byte~) mulf_init::$2!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mulf_init::@2 -- vbuz1_neq_0_then_la1 
    lda _2
    cmp #0
    bne b2_from_b1
    jmp b5
  //SEG111 mulf_init::@5
  b5:
  //SEG112 [53] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3 -- vbuz1=_inc_vbuz1 
    inc x_2
  //SEG113 [54] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4 -- vwuz1=_inc_vwuz1 
    inc sqr
    bne !+
    inc sqr+1
  !:
  //SEG114 [55] phi from mulf_init::@1 mulf_init::@5 to mulf_init::@2 [phi:mulf_init::@1/mulf_init::@5->mulf_init::@2]
  b2_from_b1:
  b2_from_b5:
  //SEG115 [55] phi (byte) mulf_init::x_2#2 = (byte) mulf_init::x_2#3 [phi:mulf_init::@1/mulf_init::@5->mulf_init::@2#0] -- register_copy 
  //SEG116 [55] phi (word) mulf_init::sqr#3 = (word) mulf_init::sqr#4 [phi:mulf_init::@1/mulf_init::@5->mulf_init::@2#1] -- register_copy 
    jmp b2
  //SEG117 mulf_init::@2
  b2:
  //SEG118 [56] (byte~) mulf_init::$5 ← < (word) mulf_init::sqr#3 -- vbuz1=_lo_vwuz2 
    lda sqr
    sta _5
  //SEG119 [57] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$5 -- _deref_pbuz1=vbuz2 
    lda _5
    ldy #0
    sta (sqr1_lo),y
  //SEG120 [58] (byte~) mulf_init::$6 ← > (word) mulf_init::sqr#3 -- vbuz1=_hi_vwuz2 
    lda sqr+1
    sta _6
  //SEG121 [59] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$6 -- _deref_pbuz1=vbuz2 
    lda _6
    ldy #0
    sta (sqr1_hi),y
  //SEG122 [60] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2 -- pbuz1=_inc_pbuz1 
    inc sqr1_hi
    bne !+
    inc sqr1_hi+1
  !:
  //SEG123 [61] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2 -- vwuz1=vwuz1_plus_vbuz2 
    lda x_2
    clc
    adc sqr
    sta sqr
    lda #0
    adc sqr+1
    sta sqr+1
  //SEG124 [62] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2 -- pbuz1=_inc_pbuz1 
    inc sqr1_lo
    bne !+
    inc sqr1_lo+1
  !:
  //SEG125 [63] if((byte*) mulf_init::sqr1_lo#1!=(const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 512) goto mulf_init::@1 -- pbuz1_neq_pbuc1_then_la1 
    lda sqr1_lo+1
    cmp #>mulf_sqr1_lo+$200
    bne b1_from_b2
    lda sqr1_lo
    cmp #<mulf_sqr1_lo+$200
    bne b1_from_b2
  //SEG126 [64] phi from mulf_init::@2 to mulf_init::@3 [phi:mulf_init::@2->mulf_init::@3]
  b3_from_b2:
  //SEG127 [64] phi (byte) mulf_init::dir#2 = (byte/word/signed word/dword/signed dword) 255 [phi:mulf_init::@2->mulf_init::@3#0] -- vbuz1=vbuc1 
    lda #$ff
    sta dir
  //SEG128 [64] phi (byte*) mulf_init::sqr2_hi#2 = (const byte[512]) mulf_sqr2_hi#0 [phi:mulf_init::@2->mulf_init::@3#1] -- pbuz1=pbuc1 
    lda #<mulf_sqr2_hi
    sta sqr2_hi
    lda #>mulf_sqr2_hi
    sta sqr2_hi+1
  //SEG129 [64] phi (byte*) mulf_init::sqr2_lo#2 = (const byte[512]) mulf_sqr2_lo#0 [phi:mulf_init::@2->mulf_init::@3#2] -- pbuz1=pbuc1 
    lda #<mulf_sqr2_lo
    sta sqr2_lo
    lda #>mulf_sqr2_lo
    sta sqr2_lo+1
  //SEG130 [64] phi (byte) mulf_init::x_255#2 = ((byte))-(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:mulf_init::@2->mulf_init::@3#3] -- vbuz1=vbuc1 
    lda #-1
    sta x_255
    jmp b3
  //SEG131 [64] phi from mulf_init::@4 to mulf_init::@3 [phi:mulf_init::@4->mulf_init::@3]
  b3_from_b4:
  //SEG132 [64] phi (byte) mulf_init::dir#2 = (byte) mulf_init::dir#3 [phi:mulf_init::@4->mulf_init::@3#0] -- register_copy 
  //SEG133 [64] phi (byte*) mulf_init::sqr2_hi#2 = (byte*) mulf_init::sqr2_hi#1 [phi:mulf_init::@4->mulf_init::@3#1] -- register_copy 
  //SEG134 [64] phi (byte*) mulf_init::sqr2_lo#2 = (byte*) mulf_init::sqr2_lo#1 [phi:mulf_init::@4->mulf_init::@3#2] -- register_copy 
  //SEG135 [64] phi (byte) mulf_init::x_255#2 = (byte) mulf_init::x_255#1 [phi:mulf_init::@4->mulf_init::@3#3] -- register_copy 
    jmp b3
  //SEG136 mulf_init::@3
  b3:
  //SEG137 [65] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[512]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2) -- _deref_pbuz1=pbuc1_derefidx_vbuz2 
    ldy x_255
    lda mulf_sqr1_lo,y
    ldy #0
    sta (sqr2_lo),y
  //SEG138 [66] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[512]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2) -- _deref_pbuz1=pbuc1_derefidx_vbuz2 
    ldy x_255
    lda mulf_sqr1_hi,y
    ldy #0
    sta (sqr2_hi),y
  //SEG139 [67] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2 -- pbuz1=_inc_pbuz1 
    inc sqr2_hi
    bne !+
    inc sqr2_hi+1
  !:
  //SEG140 [68] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2 -- vbuz1=vbuz1_plus_vbuz2 
    lda x_255
    clc
    adc dir
    sta x_255
  //SEG141 [69] if((byte) mulf_init::x_255#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mulf_init::@12 -- vbuz1_neq_0_then_la1 
    lda x_255
    cmp #0
    bne b12_from_b3
  //SEG142 [70] phi from mulf_init::@3 to mulf_init::@4 [phi:mulf_init::@3->mulf_init::@4]
  b4_from_b3:
  //SEG143 [70] phi (byte) mulf_init::dir#3 = (byte/signed byte/word/signed word/dword/signed dword) 1 [phi:mulf_init::@3->mulf_init::@4#0] -- vbuz1=vbuc1 
    lda #1
    sta dir
    jmp b4
  //SEG144 mulf_init::@4
  b4:
  //SEG145 [71] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2 -- pbuz1=_inc_pbuz1 
    inc sqr2_lo
    bne !+
    inc sqr2_lo+1
  !:
  //SEG146 [72] if((byte*) mulf_init::sqr2_lo#1!=(const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511) goto mulf_init::@3 -- pbuz1_neq_pbuc1_then_la1 
    lda sqr2_lo+1
    cmp #>mulf_sqr2_lo+$1ff
    bne b3_from_b4
    lda sqr2_lo
    cmp #<mulf_sqr2_lo+$1ff
    bne b3_from_b4
    jmp b8
  //SEG147 mulf_init::@8
  b8:
  //SEG148 [73] *((const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511) ← *((const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 256) -- _deref_pbuc1=_deref_pbuc2 
    // Set the very last value g(511) = f(256)
    lda mulf_sqr1_lo+$100
    sta mulf_sqr2_lo+$1ff
  //SEG149 [74] *((const byte[512]) mulf_sqr2_hi#0+(word/signed word/dword/signed dword) 511) ← *((const byte[512]) mulf_sqr1_hi#0+(word/signed word/dword/signed dword) 256) -- _deref_pbuc1=_deref_pbuc2 
    lda mulf_sqr1_hi+$100
    sta mulf_sqr2_hi+$1ff
    jmp breturn
  //SEG150 mulf_init::@return
  breturn:
  //SEG151 [75] return 
    rts
  //SEG152 [76] phi from mulf_init::@3 to mulf_init::@12 [phi:mulf_init::@3->mulf_init::@12]
  b12_from_b3:
    jmp b12
  //SEG153 mulf_init::@12
  b12:
  //SEG154 [70] phi from mulf_init::@12 to mulf_init::@4 [phi:mulf_init::@12->mulf_init::@4]
  b4_from_b12:
  //SEG155 [70] phi (byte) mulf_init::dir#3 = (byte) mulf_init::dir#2 [phi:mulf_init::@12->mulf_init::@4#0] -- register_copy 
    jmp b4
}
  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/word/signed word/dword/signed dword) 255) goto main::@4 [ 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/signed byte/word/signed word/dword/signed dword) 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/signed byte/word/signed word/dword/signed dword) 15 [ 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 [51] (byte~) mulf_init::$2 ← (byte) mulf_init::c#1 & (byte/signed byte/word/signed word/dword/signed dword) 1 [ mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$2 ] ( main:2::mulf_init:5 [ mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$2 ] ) always clobbers reg byte a 
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 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:8 [ mulf_init::c#2 mulf_init::c#1 ]
Statement [56] (byte~) mulf_init::$5 ← < (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::$5 ] ( 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::$5 ] ) always clobbers reg byte a 
Statement [57] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) 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 ] ( 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:8 [ 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 [58] (byte~) mulf_init::$6 ← > (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::$6 ] ( 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::$6 ] ) always clobbers reg byte a 
Statement [59] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$6 [ 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 [61] (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 [63] if((byte*) mulf_init::sqr1_lo#1!=(const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 512) goto mulf_init::@1 [ mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_lo#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ( main:2::mulf_init:5 [ mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_lo#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ) always clobbers reg byte a 
Statement [65] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[512]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2) [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a reg byte y 
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 y 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:21 [ mulf_init::dir#2 mulf_init::dir#3 ]
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:21 [ mulf_init::dir#2 mulf_init::dir#3 ]
Statement [66] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[512]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2) [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a reg byte y 
Statement [68] (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 [72] if((byte*) mulf_init::sqr2_lo#1!=(const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511) goto mulf_init::@3 [ mulf_init::x_255#1 mulf_init::sqr2_lo#1 mulf_init::sqr2_hi#1 mulf_init::dir#3 ] ( main:2::mulf_init:5 [ mulf_init::x_255#1 mulf_init::sqr2_lo#1 mulf_init::sqr2_hi#1 mulf_init::dir#3 ] ) always clobbers reg byte a 
Statement [73] *((const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511) ← *((const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 256) [ ] ( main:2::mulf_init:5 [ ] ) always clobbers reg byte a 
Statement [74] *((const byte[512]) mulf_sqr2_hi#0+(word/signed word/dword/signed dword) 511) ← *((const byte[512]) mulf_sqr1_hi#0+(word/signed word/dword/signed dword) 256) [ ] ( main:2::mulf_init:5 [ ] ) always clobbers reg byte a 
Statement [8] if(*((const byte*) RASTER#0)!=(byte/word/signed word/dword/signed dword) 255) goto main::@4 [ 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/signed byte/word/signed word/dword/signed dword) 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/signed byte/word/signed word/dword/signed dword) 15 [ 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 [51] (byte~) mulf_init::$2 ← (byte) mulf_init::c#1 & (byte/signed byte/word/signed word/dword/signed dword) 1 [ mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$2 ] ( main:2::mulf_init:5 [ mulf_init::sqr#4 mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$2 ] ) always clobbers reg byte a 
Statement [56] (byte~) mulf_init::$5 ← < (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::$5 ] ( 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::$5 ] ) always clobbers reg byte a 
Statement [57] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) 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 ] ( 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 [58] (byte~) mulf_init::$6 ← > (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::$6 ] ( 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::$6 ] ) always clobbers reg byte a 
Statement [59] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$6 [ 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 [61] (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 [63] if((byte*) mulf_init::sqr1_lo#1!=(const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 512) goto mulf_init::@1 [ mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_lo#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ( main:2::mulf_init:5 [ mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_lo#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ) always clobbers reg byte a 
Statement [65] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[512]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2) [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a reg byte y 
Statement [66] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[512]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2) [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::x_255#2 mulf_init::sqr2_lo#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a reg byte y 
Statement [68] (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 [72] if((byte*) mulf_init::sqr2_lo#1!=(const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511) goto mulf_init::@3 [ mulf_init::x_255#1 mulf_init::sqr2_lo#1 mulf_init::sqr2_hi#1 mulf_init::dir#3 ] ( main:2::mulf_init:5 [ mulf_init::x_255#1 mulf_init::sqr2_lo#1 mulf_init::sqr2_hi#1 mulf_init::dir#3 ] ) always clobbers reg byte a 
Statement [73] *((const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511) ← *((const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 256) [ ] ( main:2::mulf_init:5 [ ] ) always clobbers reg byte a 
Statement [74] *((const byte[512]) mulf_sqr2_hi#0+(word/signed word/dword/signed dword) 511) ← *((const byte[512]) mulf_sqr1_hi#0+(word/signed word/dword/signed dword) 256) [ ] ( main:2::mulf_init:5 [ ] ) 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_BYTE:8 [ mulf_init::c#2 mulf_init::c#1 ] : zp ZP_BYTE:8 , reg byte x , 
Potential registers zp ZP_WORD:9 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] : zp ZP_WORD:9 , 
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::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] : 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_lo#2 mulf_init::sqr2_lo#1 ] : zp ZP_WORD:17 , 
Potential registers zp ZP_WORD:19 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] : zp ZP_WORD:19 , 
Potential registers zp ZP_BYTE:21 [ mulf_init::dir#2 mulf_init::dir#3 ] : zp ZP_BYTE:21 , reg byte x , 
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::$2 ] : zp ZP_BYTE:40 , reg byte a , reg byte x , reg byte y , 
Potential registers zp ZP_BYTE:41 [ mulf_init::$5 ] : zp ZP_BYTE:41 , reg byte a , reg byte x , reg byte y , 
Potential registers zp ZP_BYTE:42 [ mulf_init::$6 ] : zp ZP_BYTE:42 , reg byte a , reg byte x , reg byte y , 

REGISTER UPLIFT SCOPES
Uplift Scope [mulf_init] 45.1: zp ZP_WORD:14 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] 24.36: zp ZP_BYTE:8 [ mulf_init::c#2 mulf_init::c#1 ] 24.14: 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::$2 ] 22: zp ZP_BYTE:41 [ mulf_init::$5 ] 22: zp ZP_BYTE:42 [ mulf_init::$6 ] 20.62: zp ZP_WORD:17 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] 19.04: zp ZP_WORD:9 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] 16.5: zp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ] 14.14: zp ZP_WORD:19 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] 12.05: zp ZP_BYTE:21 [ mulf_init::dir#2 mulf_init::dir#3 ] 8.5: 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 [print_set_screen] 

Uplifting [mulf_init] best 6051 combination zp ZP_WORD:14 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] reg byte x [ mulf_init::c#2 mulf_init::c#1 ] zp ZP_BYTE:13 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] reg byte a [ mulf_init::$2 ] reg byte a [ mulf_init::$5 ] reg byte a [ mulf_init::$6 ] zp ZP_WORD:17 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] zp ZP_WORD:9 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] zp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ] zp ZP_WORD:19 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] zp ZP_BYTE:21 [ mulf_init::dir#2 mulf_init::dir#3 ] 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 6051 combination zp ZP_DWORD:22 [ mulf16u::return#0 ] zp ZP_DWORD:36 [ mulf16u::return#1 ] 
Uplifting [print_byte] best 6039 combination reg byte x [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] reg byte a [ print_byte::$0 ] reg byte a [ print_byte::$2 ] 
Uplifting [print_char] best 6030 combination reg byte a [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ] 
Uplifting [main] best 6030 combination zp ZP_DWORD:26 [ main::r#0 ] 
Uplifting [print_word] best 6030 combination zp ZP_WORD:2 [ print_word::w#2 print_word::w#0 print_word::w#1 ] 
Uplifting [] best 6030 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 6030 combination zp ZP_DWORD:30 [ print_dword::dw#0 ] 
Uplifting [print_set_screen] best 6030 combination 
Attempting to uplift remaining variables inzp ZP_BYTE:13 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
Uplifting [mulf_init] best 6030 combination zp ZP_BYTE:13 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] 
Attempting to uplift remaining variables inzp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ]
Uplifting [mulf_init] best 5890 combination reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ] 
Attempting to uplift remaining variables inzp ZP_BYTE:21 [ mulf_init::dir#2 mulf_init::dir#3 ]
Uplifting [mulf_init] best 5890 combination zp ZP_BYTE:21 [ mulf_init::dir#2 mulf_init::dir#3 ] 
Coalescing zero page register with common assignment [ zp ZP_DWORD:22 [ mulf16u::return#0 ] ] with [ zp ZP_DWORD:26 [ main::r#0 ] ] - score: 1
Coalescing zero page register with common assignment [ zp ZP_DWORD:22 [ mulf16u::return#0 main::r#0 ] ] with [ zp ZP_DWORD:36 [ mulf16u::return#1 ] ] - score: 1
Coalescing zero page register with common assignment [ 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:2 [ print_word::w#2 print_word::w#0 print_word::w#1 ] ] with [ zp ZP_WORD:9 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] ]
Coalescing zero page register [ zp ZP_WORD:2 [ print_word::w#2 print_word::w#0 print_word::w#1 mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] ] with [ zp ZP_WORD:17 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] ]
Coalescing zero page register [ zp ZP_WORD:6 [ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ] ] with [ zp ZP_WORD:11 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] ]
Coalescing zero page register [ zp ZP_WORD:6 [ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] ] with [ zp ZP_WORD:19 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] ]
Coalescing zero page register [ zp ZP_BYTE:13 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] ] with [ zp ZP_BYTE:21 [ mulf_init::dir#2 mulf_init::dir#3 ] ]
Allocated (was zp ZP_WORD:6) zp ZP_WORD:4 [ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
Allocated (was zp ZP_BYTE:13) zp ZP_BYTE:6 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 mulf_init::dir#2 mulf_init::dir#3 ]
Allocated (was zp ZP_WORD:14) zp ZP_WORD:7 [ 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:9 [ mulf16u::return#0 main::r#0 mulf16u::return#1 print_dword::dw#0 ]

ASSEMBLER BEFORE OPTIMIZATION
//SEG0 File Comments
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
//SEG2 Global Constants & labels
  .label RASTER = $d012
  .label BORDERCOL = $d020
  .label SCREEN = $400
  .label print_char_cursor = 4
//SEG3 @begin
bbegin:
//SEG4 [1] phi from @begin to @22 [phi:@begin->@22]
b22_from_bbegin:
  jmp b22
//SEG5 @22
b22:
//SEG6 [2] call main 
//SEG7 [4] phi from @22 to main [phi:@22->main]
main_from_b22:
  jsr main
//SEG8 [3] phi from @22 to @end [phi:@22->@end]
bend_from_b22:
  jmp bend
//SEG9 @end
bend:
//SEG10 main
main: {
    .label a = $4d2
    .label b = $929
    .label r = 9
  //SEG11 [5] call mulf_init 
  //SEG12 [48] phi from main to mulf_init [phi:main->mulf_init]
  mulf_init_from_main:
    jsr mulf_init
    jmp b13
  //SEG13 main::@13
  b13:
  //SEG14 asm { sei  }
    sei
  //SEG15 [7] phi from main::@13 to main::@1 [phi:main::@13->main::@1]
  b1_from_b13:
  //SEG16 [7] phi (byte*) print_char_cursor#16 = ((byte*))(word/signed word/dword/signed dword) 1024 [phi:main::@13->main::@1#0] -- pbuz1=pbuc1 
    lda #<$400
    sta print_char_cursor
    lda #>$400
    sta print_char_cursor+1
    jmp b1
  //SEG17 main::@1
  b1:
    jmp b4
  //SEG18 main::@4
  b4:
  //SEG19 [8] if(*((const byte*) RASTER#0)!=(byte/word/signed word/dword/signed dword) 255) goto main::@4 -- _deref_pbuc1_neq_vbuc2_then_la1 
    lda RASTER
    cmp #$ff
    bne b4
    jmp b6
  //SEG20 main::@6
  b6:
  //SEG21 [9] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1 
    inc BORDERCOL
  //SEG22 [10] call mulf16u 
    jsr mulf16u
  //SEG23 [11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1
    jmp b14
  //SEG24 main::@14
  b14:
  //SEG25 [12] (dword) main::r#0 ← (dword) mulf16u::return#0
  //SEG26 [13] *((const byte*) BORDERCOL#0) ← -- *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_dec__deref_pbuc1 
    dec BORDERCOL
  //SEG27 [14] (dword) print_dword::dw#0 ← (dword) main::r#0
  //SEG28 [15] call print_dword 
    jsr print_dword
  //SEG29 [16] phi from main::@14 to main::@15 [phi:main::@14->main::@15]
  b15_from_b14:
    jmp b15
  //SEG30 main::@15
  b15:
  //SEG31 [17] call print_set_screen 
  //SEG32 [18] phi from main::@15 to print_set_screen [phi:main::@15->print_set_screen]
  print_set_screen_from_b15:
    jsr print_set_screen
  //SEG33 [7] phi from main::@15 to main::@1 [phi:main::@15->main::@1]
  b1_from_b15:
  //SEG34 [7] phi (byte*) print_char_cursor#16 = (const byte*) SCREEN#0 [phi:main::@15->main::@1#0] -- pbuz1=pbuc1 
    lda #<SCREEN
    sta print_char_cursor
    lda #>SCREEN
    sta print_char_cursor+1
    jmp b1
}
//SEG35 print_set_screen
// Set the screen to print on. Also resets current line/char cursor.
print_set_screen: {
    jmp breturn
  //SEG36 print_set_screen::@return
  breturn:
  //SEG37 [19] return 
    rts
}
//SEG38 print_dword
// Print a dword as HEX
// print_dword(dword zeropage(9) dw)
print_dword: {
    .label dw = 9
  //SEG39 [20] (word) print_word::w#0 ← > (dword) print_dword::dw#0 -- vwuz1=_hi_vduz2 
    lda dw+2
    sta print_word.w
    lda dw+3
    sta print_word.w+1
  //SEG40 [21] call print_word 
  //SEG41 [25] phi from print_dword to print_word [phi:print_dword->print_word]
  print_word_from_print_dword:
  //SEG42 [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#16 [phi:print_dword->print_word#0] -- register_copy 
  //SEG43 [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
  //SEG44 print_dword::@1
  b1:
  //SEG45 [22] (word) print_word::w#1 ← < (dword) print_dword::dw#0 -- vwuz1=_lo_vduz2 
    lda dw
    sta print_word.w
    lda dw+1
    sta print_word.w+1
  //SEG46 [23] call print_word 
  //SEG47 [25] phi from print_dword::@1 to print_word [phi:print_dword::@1->print_word]
  print_word_from_b1:
  //SEG48 [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#10 [phi:print_dword::@1->print_word#0] -- register_copy 
  //SEG49 [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
  //SEG50 print_dword::@return
  breturn:
  //SEG51 [24] return 
    rts
}
//SEG52 print_word
// Print a word as HEX
// print_word(word zeropage(2) w)
print_word: {
    .label w = 2
  //SEG53 [26] (byte) print_byte::b#0 ← > (word) print_word::w#2 -- vbuxx=_hi_vwuz1 
    lda w+1
    tax
  //SEG54 [27] call print_byte 
  //SEG55 [31] phi from print_word to print_byte [phi:print_word->print_byte]
  print_byte_from_print_word:
  //SEG56 [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#34 [phi:print_word->print_byte#0] -- register_copy 
  //SEG57 [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
  //SEG58 print_word::@1
  b1:
  //SEG59 [28] (byte) print_byte::b#1 ← < (word) print_word::w#2 -- vbuxx=_lo_vwuz1 
    lda w
    tax
  //SEG60 [29] call print_byte 
  //SEG61 [31] phi from print_word::@1 to print_byte [phi:print_word::@1->print_byte]
  print_byte_from_b1:
  //SEG62 [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#10 [phi:print_word::@1->print_byte#0] -- register_copy 
  //SEG63 [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
  //SEG64 print_word::@return
  breturn:
  //SEG65 [30] return 
    rts
}
//SEG66 print_byte
// Print a byte as HEX
// print_byte(byte register(X) b)
print_byte: {
  //SEG67 [32] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word/dword/signed dword) 4 -- vbuaa=vbuxx_ror_4 
    txa
    lsr
    lsr
    lsr
    lsr
  //SEG68 [33] (byte) print_char::ch#0 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$0) -- vbuaa=pbuc1_derefidx_vbuaa 
    tay
    lda print_hextab,y
  //SEG69 [34] call print_char 
  //SEG70 [39] phi from print_byte to print_char [phi:print_byte->print_char]
  print_char_from_print_byte:
  //SEG71 [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#36 [phi:print_byte->print_char#0] -- register_copy 
  //SEG72 [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
  //SEG73 print_byte::@1
  b1:
  //SEG74 [35] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word/dword/signed dword) 15 -- vbuaa=vbuxx_band_vbuc1 
    txa
    and #$f
  //SEG75 [36] (byte) print_char::ch#1 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$2) -- vbuaa=pbuc1_derefidx_vbuaa 
    tay
    lda print_hextab,y
  //SEG76 [37] call print_char 
  //SEG77 [39] phi from print_byte::@1 to print_char [phi:print_byte::@1->print_char]
  print_char_from_b1:
  //SEG78 [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#10 [phi:print_byte::@1->print_char#0] -- register_copy 
  //SEG79 [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
  //SEG80 print_byte::@return
  breturn:
  //SEG81 [38] return 
    rts
}
//SEG82 print_char
// Print a single char
// print_char(byte register(A) ch)
print_char: {
  //SEG83 [40] *((byte*) print_char_cursor#27) ← (byte) print_char::ch#2 -- _deref_pbuz1=vbuaa 
    ldy #0
    sta (print_char_cursor),y
  //SEG84 [41] (byte*) print_char_cursor#10 ← ++ (byte*) print_char_cursor#27 -- pbuz1=_inc_pbuz1 
    inc print_char_cursor
    bne !+
    inc print_char_cursor+1
  !:
    jmp breturn
  //SEG85 print_char::@return
  breturn:
  //SEG86 [42] return 
    rts
}
//SEG87 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 = 9
  //SEG88 [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
  //SEG89 [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
  //SEG90 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
  !:
  //SEG91 [46] (dword) mulf16u::return#1 ← *((const dword*) mulf16u::memR#0) -- vduz1=_deref_pduc1 
    lda memR
    sta return
    lda memR+1
    sta return+1
    lda memR+2
    sta return+2
    lda memR+3
    sta return+3
    jmp breturn
  //SEG92 mulf16u::@return
  breturn:
  //SEG93 [47] return 
    rts
}
//SEG94 mulf_init
// Initialize the mulf_sqr multiplication tables with f(x)=int(x*x/4)
mulf_init: {
    .label sqr1_hi = 4
    .label sqr = 7
    .label sqr1_lo = 2
    .label x_2 = 6
    .label sqr2_hi = 4
    .label sqr2_lo = 2
    .label dir = 6
  //SEG95 [49] phi from mulf_init to mulf_init::@1 [phi:mulf_init->mulf_init::@1]
  b1_from_mulf_init:
  //SEG96 [49] phi (byte) mulf_init::x_2#3 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:mulf_init->mulf_init::@1#0] -- vbuz1=vbuc1 
    lda #0
    sta x_2
  //SEG97 [49] phi (byte*) mulf_init::sqr1_hi#2 = (const byte[512]) mulf_sqr1_hi#0+(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:mulf_init->mulf_init::@1#1] -- pbuz1=pbuc1 
    lda #<mulf_sqr1_hi+1
    sta sqr1_hi
    lda #>mulf_sqr1_hi+1
    sta sqr1_hi+1
  //SEG98 [49] phi (byte*) mulf_init::sqr1_lo#2 = (const byte[512]) mulf_sqr1_lo#0+(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:mulf_init->mulf_init::@1#2] -- pbuz1=pbuc1 
    lda #<mulf_sqr1_lo+1
    sta sqr1_lo
    lda #>mulf_sqr1_lo+1
    sta sqr1_lo+1
  //SEG99 [49] phi (word) mulf_init::sqr#4 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:mulf_init->mulf_init::@1#3] -- vwuz1=vbuc1 
    lda #<0
    sta sqr
    lda #>0
    sta sqr+1
  //SEG100 [49] phi (byte) mulf_init::c#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:mulf_init->mulf_init::@1#4] -- vbuxx=vbuc1 
    ldx #0
    jmp b1
  //SEG101 [49] phi from mulf_init::@2 to mulf_init::@1 [phi:mulf_init::@2->mulf_init::@1]
  b1_from_b2:
  //SEG102 [49] phi (byte) mulf_init::x_2#3 = (byte) mulf_init::x_2#2 [phi:mulf_init::@2->mulf_init::@1#0] -- register_copy 
  //SEG103 [49] phi (byte*) mulf_init::sqr1_hi#2 = (byte*) mulf_init::sqr1_hi#1 [phi:mulf_init::@2->mulf_init::@1#1] -- register_copy 
  //SEG104 [49] phi (byte*) mulf_init::sqr1_lo#2 = (byte*) mulf_init::sqr1_lo#1 [phi:mulf_init::@2->mulf_init::@1#2] -- register_copy 
  //SEG105 [49] phi (word) mulf_init::sqr#4 = (word) mulf_init::sqr#1 [phi:mulf_init::@2->mulf_init::@1#3] -- register_copy 
  //SEG106 [49] phi (byte) mulf_init::c#2 = (byte) mulf_init::c#1 [phi:mulf_init::@2->mulf_init::@1#4] -- register_copy 
    jmp b1
  //SEG107 mulf_init::@1
  b1:
  //SEG108 [50] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2 -- vbuxx=_inc_vbuxx 
    inx
  //SEG109 [51] (byte~) mulf_init::$2 ← (byte) mulf_init::c#1 & (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuxx_band_vbuc1 
    txa
    and #1
  //SEG110 [52] if((byte~) mulf_init::$2!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mulf_init::@2 -- vbuaa_neq_0_then_la1 
    cmp #0
    bne b2_from_b1
    jmp b5
  //SEG111 mulf_init::@5
  b5:
  //SEG112 [53] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3 -- vbuz1=_inc_vbuz1 
    inc x_2
  //SEG113 [54] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4 -- vwuz1=_inc_vwuz1 
    inc sqr
    bne !+
    inc sqr+1
  !:
  //SEG114 [55] phi from mulf_init::@1 mulf_init::@5 to mulf_init::@2 [phi:mulf_init::@1/mulf_init::@5->mulf_init::@2]
  b2_from_b1:
  b2_from_b5:
  //SEG115 [55] phi (byte) mulf_init::x_2#2 = (byte) mulf_init::x_2#3 [phi:mulf_init::@1/mulf_init::@5->mulf_init::@2#0] -- register_copy 
  //SEG116 [55] phi (word) mulf_init::sqr#3 = (word) mulf_init::sqr#4 [phi:mulf_init::@1/mulf_init::@5->mulf_init::@2#1] -- register_copy 
    jmp b2
  //SEG117 mulf_init::@2
  b2:
  //SEG118 [56] (byte~) mulf_init::$5 ← < (word) mulf_init::sqr#3 -- vbuaa=_lo_vwuz1 
    lda sqr
  //SEG119 [57] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$5 -- _deref_pbuz1=vbuaa 
    ldy #0
    sta (sqr1_lo),y
  //SEG120 [58] (byte~) mulf_init::$6 ← > (word) mulf_init::sqr#3 -- vbuaa=_hi_vwuz1 
    lda sqr+1
  //SEG121 [59] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$6 -- _deref_pbuz1=vbuaa 
    ldy #0
    sta (sqr1_hi),y
  //SEG122 [60] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2 -- pbuz1=_inc_pbuz1 
    inc sqr1_hi
    bne !+
    inc sqr1_hi+1
  !:
  //SEG123 [61] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2 -- vwuz1=vwuz1_plus_vbuz2 
    lda x_2
    clc
    adc sqr
    sta sqr
    lda #0
    adc sqr+1
    sta sqr+1
  //SEG124 [62] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2 -- pbuz1=_inc_pbuz1 
    inc sqr1_lo
    bne !+
    inc sqr1_lo+1
  !:
  //SEG125 [63] if((byte*) mulf_init::sqr1_lo#1!=(const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 512) goto mulf_init::@1 -- pbuz1_neq_pbuc1_then_la1 
    lda sqr1_lo+1
    cmp #>mulf_sqr1_lo+$200
    bne b1_from_b2
    lda sqr1_lo
    cmp #<mulf_sqr1_lo+$200
    bne b1_from_b2
  //SEG126 [64] phi from mulf_init::@2 to mulf_init::@3 [phi:mulf_init::@2->mulf_init::@3]
  b3_from_b2:
  //SEG127 [64] phi (byte) mulf_init::dir#2 = (byte/word/signed word/dword/signed dword) 255 [phi:mulf_init::@2->mulf_init::@3#0] -- vbuz1=vbuc1 
    lda #$ff
    sta dir
  //SEG128 [64] phi (byte*) mulf_init::sqr2_hi#2 = (const byte[512]) mulf_sqr2_hi#0 [phi:mulf_init::@2->mulf_init::@3#1] -- pbuz1=pbuc1 
    lda #<mulf_sqr2_hi
    sta sqr2_hi
    lda #>mulf_sqr2_hi
    sta sqr2_hi+1
  //SEG129 [64] phi (byte*) mulf_init::sqr2_lo#2 = (const byte[512]) mulf_sqr2_lo#0 [phi:mulf_init::@2->mulf_init::@3#2] -- pbuz1=pbuc1 
    lda #<mulf_sqr2_lo
    sta sqr2_lo
    lda #>mulf_sqr2_lo
    sta sqr2_lo+1
  //SEG130 [64] phi (byte) mulf_init::x_255#2 = ((byte))-(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:mulf_init::@2->mulf_init::@3#3] -- vbuxx=vbuc1 
    ldx #-1
    jmp b3
  //SEG131 [64] phi from mulf_init::@4 to mulf_init::@3 [phi:mulf_init::@4->mulf_init::@3]
  b3_from_b4:
  //SEG132 [64] phi (byte) mulf_init::dir#2 = (byte) mulf_init::dir#3 [phi:mulf_init::@4->mulf_init::@3#0] -- register_copy 
  //SEG133 [64] phi (byte*) mulf_init::sqr2_hi#2 = (byte*) mulf_init::sqr2_hi#1 [phi:mulf_init::@4->mulf_init::@3#1] -- register_copy 
  //SEG134 [64] phi (byte*) mulf_init::sqr2_lo#2 = (byte*) mulf_init::sqr2_lo#1 [phi:mulf_init::@4->mulf_init::@3#2] -- register_copy 
  //SEG135 [64] phi (byte) mulf_init::x_255#2 = (byte) mulf_init::x_255#1 [phi:mulf_init::@4->mulf_init::@3#3] -- register_copy 
    jmp b3
  //SEG136 mulf_init::@3
  b3:
  //SEG137 [65] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[512]) 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
  //SEG138 [66] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[512]) 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
  //SEG139 [67] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2 -- pbuz1=_inc_pbuz1 
    inc sqr2_hi
    bne !+
    inc sqr2_hi+1
  !:
  //SEG140 [68] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2 -- vbuxx=vbuxx_plus_vbuz1 
    txa
    clc
    adc dir
    tax
  //SEG141 [69] if((byte) mulf_init::x_255#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mulf_init::@12 -- vbuxx_neq_0_then_la1 
    cpx #0
    bne b12_from_b3
  //SEG142 [70] phi from mulf_init::@3 to mulf_init::@4 [phi:mulf_init::@3->mulf_init::@4]
  b4_from_b3:
  //SEG143 [70] phi (byte) mulf_init::dir#3 = (byte/signed byte/word/signed word/dword/signed dword) 1 [phi:mulf_init::@3->mulf_init::@4#0] -- vbuz1=vbuc1 
    lda #1
    sta dir
    jmp b4
  //SEG144 mulf_init::@4
  b4:
  //SEG145 [71] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2 -- pbuz1=_inc_pbuz1 
    inc sqr2_lo
    bne !+
    inc sqr2_lo+1
  !:
  //SEG146 [72] if((byte*) mulf_init::sqr2_lo#1!=(const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511) goto mulf_init::@3 -- pbuz1_neq_pbuc1_then_la1 
    lda sqr2_lo+1
    cmp #>mulf_sqr2_lo+$1ff
    bne b3_from_b4
    lda sqr2_lo
    cmp #<mulf_sqr2_lo+$1ff
    bne b3_from_b4
    jmp b8
  //SEG147 mulf_init::@8
  b8:
  //SEG148 [73] *((const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511) ← *((const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 256) -- _deref_pbuc1=_deref_pbuc2 
    // Set the very last value g(511) = f(256)
    lda mulf_sqr1_lo+$100
    sta mulf_sqr2_lo+$1ff
  //SEG149 [74] *((const byte[512]) mulf_sqr2_hi#0+(word/signed word/dword/signed dword) 511) ← *((const byte[512]) mulf_sqr1_hi#0+(word/signed word/dword/signed dword) 256) -- _deref_pbuc1=_deref_pbuc2 
    lda mulf_sqr1_hi+$100
    sta mulf_sqr2_hi+$1ff
    jmp breturn
  //SEG150 mulf_init::@return
  breturn:
  //SEG151 [75] return 
    rts
  //SEG152 [76] phi from mulf_init::@3 to mulf_init::@12 [phi:mulf_init::@3->mulf_init::@12]
  b12_from_b3:
    jmp b12
  //SEG153 mulf_init::@12
  b12:
  //SEG154 [70] phi from mulf_init::@12 to mulf_init::@4 [phi:mulf_init::@12->mulf_init::@4]
  b4_from_b12:
  //SEG155 [70] phi (byte) mulf_init::dir#3 = (byte) mulf_init::dir#2 [phi:mulf_init::@12->mulf_init::@4#0] -- register_copy 
    jmp b4
}
  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 b22
Removing instruction jmp bend
Removing instruction jmp b13
Removing instruction jmp b1
Removing instruction jmp b4
Removing instruction jmp b6
Removing instruction jmp b14
Removing instruction jmp b15
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 b2
Removing instruction jmp b3
Removing instruction jmp b4
Removing instruction jmp b8
Removing instruction jmp breturn
Removing instruction jmp b12
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda #>0
Replacing instruction ldx #0 with TAX
Removing instruction ldy #0
Removing instruction ldy #0
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Replacing label b1 with b4
Replacing label b2_from_b1 with b2
Replacing label b1_from_b2 with b1
Replacing label b1_from_b2 with b1
Replacing label b12_from_b3 with b12
Replacing label b3_from_b4 with b3
Replacing label b3_from_b4 with b3
Removing instruction b22_from_bbegin:
Removing instruction b22:
Removing instruction main_from_b22:
Removing instruction bend_from_b22:
Removing instruction b1:
Removing instruction b15_from_b14:
Removing instruction print_set_screen_from_b15:
Removing instruction b1_from_b2:
Removing instruction b2_from_b1:
Removing instruction b2_from_b5:
Removing instruction b3_from_b4:
Removing instruction b12_from_b3:
Removing instruction b4_from_b12:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction bend:
Removing instruction mulf_init_from_main:
Removing instruction b13:
Removing instruction b1_from_b13:
Removing instruction b6:
Removing instruction b14:
Removing instruction b15:
Removing instruction b1_from_b15:
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:
Removing instruction b3_from_b2:
Removing instruction b4_from_b3:
Removing instruction b8:
Removing instruction breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Updating BasicUpstart to call main directly
Removing instruction jsr main
Succesful ASM optimization Pass5SkipBegin
Skipping double jump to b4 in bne b12
Succesful ASM optimization Pass5DoubleJumpElimination
Removing instruction jmp b1
Removing instruction jmp b3
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction bbegin:
Removing instruction b12:
Succesful ASM optimization Pass5UnusedLabelElimination
Removing unreachable instruction jmp b4
Succesful ASM optimization Pass5UnreachableCodeElimination

FINAL SYMBOL TABLE
(label) @22
(label) @begin
(label) @end
(byte*) BORDERCOL
(const byte*) BORDERCOL#0 BORDERCOL = ((byte*))(word/dword/signed dword) 53280
(byte*) RASTER
(const byte*) RASTER#0 RASTER = ((byte*))(word/dword/signed dword) 53266
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) 1024
(void()) main()
(label) main::@1
(label) main::@13
(label) main::@14
(label) main::@15
(label) main::@4
(label) main::@6
(word) main::a
(const word) main::a#0 a = (word/signed word/dword/signed dword) 1234
(word) main::b
(const word) main::b#0 b = (word/signed word/dword/signed dword) 2345
(dword) main::r
(dword) main::r#0 r zp ZP_DWORD:9 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*))(byte/word/signed word/dword/signed dword) 248
(word*) mulf16u::memB
(const word*) mulf16u::memB#0 memB = ((word*))(byte/word/signed word/dword/signed dword) 250
(dword*) mulf16u::memR
(const dword*) mulf16u::memR#0 memR = ((dword*))(byte/word/signed word/dword/signed dword) 252
(dword) mulf16u::return
(dword) mulf16u::return#0 return zp ZP_DWORD:9 22.0
(dword) mulf16u::return#1 return zp ZP_DWORD:9 4.333333333333333
(void()) mulf_init()
(byte~) mulf_init::$2 reg byte a 22.0
(byte~) mulf_init::$5 reg byte a 22.0
(byte~) mulf_init::$6 reg byte a 22.0
(label) mulf_init::@1
(label) mulf_init::@12
(label) mulf_init::@2
(label) mulf_init::@3
(label) mulf_init::@4
(label) mulf_init::@5
(label) mulf_init::@8
(label) mulf_init::@return
(byte) mulf_init::c
(byte) mulf_init::c#1 reg byte x 2.357142857142857
(byte) mulf_init::c#2 reg byte x 22.0
(byte) mulf_init::dir
(byte) mulf_init::dir#2 dir zp ZP_BYTE:6 4.714285714285714
(byte) mulf_init::dir#3 dir zp ZP_BYTE:6 7.333333333333333
(word) mulf_init::sqr
(word) mulf_init::sqr#1 sqr zp ZP_WORD:7 7.333333333333333
(word) mulf_init::sqr#2 sqr zp ZP_WORD:7 22.0
(word) mulf_init::sqr#3 sqr zp ZP_WORD:7 9.166666666666666
(word) mulf_init::sqr#4 sqr zp ZP_WORD:7 6.6000000000000005
(byte*) mulf_init::sqr1_hi
(byte*) mulf_init::sqr1_hi#1 sqr1_hi zp ZP_WORD:4 5.5
(byte*) mulf_init::sqr1_hi#2 sqr1_hi zp ZP_WORD:4 3.0
(byte*) mulf_init::sqr1_lo
(byte*) mulf_init::sqr1_lo#1 sqr1_lo zp ZP_WORD:2 16.5
(byte*) mulf_init::sqr1_lo#2 sqr1_lo zp ZP_WORD:2 2.5384615384615383
(byte*) mulf_init::sqr2_hi
(byte*) mulf_init::sqr2_hi#1 sqr2_hi zp ZP_WORD:4 3.142857142857143
(byte*) mulf_init::sqr2_hi#2 sqr2_hi zp ZP_WORD:4 11.0
(byte*) mulf_init::sqr2_lo
(byte*) mulf_init::sqr2_lo#1 sqr2_lo zp ZP_WORD:2 16.5
(byte*) mulf_init::sqr2_lo#2 sqr2_lo zp ZP_WORD:2 4.125
(byte) mulf_init::x_2
(byte) mulf_init::x_2#1 x_2 zp ZP_BYTE:6 11.0
(byte) mulf_init::x_2#2 x_2 zp ZP_BYTE:6 4.888888888888889
(byte) mulf_init::x_2#3 x_2 zp ZP_BYTE:6 8.25
(byte) mulf_init::x_255
(byte) mulf_init::x_255#1 reg byte x 5.5
(byte) mulf_init::x_255#2 reg byte x 11.0
(byte[512]) mulf_sqr1_hi
(const byte[512]) mulf_sqr1_hi#0 mulf_sqr1_hi = { fill( 512, 0) }
(byte[512]) mulf_sqr1_lo
(const byte[512]) mulf_sqr1_lo#0 mulf_sqr1_lo = { fill( 512, 0) }
(byte[512]) mulf_sqr2_hi
(const byte[512]) mulf_sqr2_hi#0 mulf_sqr2_hi = { fill( 512, 0) }
(byte[512]) mulf_sqr2_lo
(const byte[512]) mulf_sqr2_lo#0 mulf_sqr2_lo = { fill( 512, 0) }
(void()) print_byte((byte) print_byte::b)
(byte~) print_byte::$0 reg byte a 4.0
(byte~) print_byte::$2 reg byte a 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:4 0.6153846153846154
(byte*) print_char_cursor#16 print_char_cursor zp ZP_WORD:4 0.2222222222222222
(byte*) print_char_cursor#27 print_char_cursor zp ZP_WORD:4 4.0
(byte*) print_char_cursor#34 print_char_cursor zp ZP_WORD:4 3.0
(byte*) print_char_cursor#36 print_char_cursor zp ZP_WORD:4 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:9 5.0
(byte[]) print_hextab
(const byte[]) print_hextab#0 print_hextab = (string) "0123456789abcdef"
(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

zp ZP_WORD:2 [ print_word::w#2 print_word::w#0 print_word::w#1 mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
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:4 [ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
reg byte x [ mulf_init::c#2 mulf_init::c#1 ]
zp ZP_BYTE:6 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 mulf_init::dir#2 mulf_init::dir#3 ]
zp ZP_WORD:7 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ]
zp ZP_DWORD:9 [ mulf16u::return#0 main::r#0 mulf16u::return#1 print_dword::dw#0 ]
reg byte a [ print_byte::$0 ]
reg byte a [ print_byte::$2 ]
reg byte a [ mulf_init::$2 ]
reg byte a [ mulf_init::$5 ]
reg byte a [ mulf_init::$6 ]


FINAL ASSEMBLER
Score: 4318

//SEG0 File Comments
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG2 Global Constants & labels
  .label RASTER = $d012
  .label BORDERCOL = $d020
  .label SCREEN = $400
  .label print_char_cursor = 4
//SEG3 @begin
//SEG4 [1] phi from @begin to @22 [phi:@begin->@22]
//SEG5 @22
//SEG6 [2] call main 
//SEG7 [4] phi from @22 to main [phi:@22->main]
//SEG8 [3] phi from @22 to @end [phi:@22->@end]
//SEG9 @end
//SEG10 main
main: {
    .label a = $4d2
    .label b = $929
    .label r = 9
  //SEG11 [5] call mulf_init 
  //SEG12 [48] phi from main to mulf_init [phi:main->mulf_init]
    jsr mulf_init
  //SEG13 main::@13
  //SEG14 asm { sei  }
    sei
  //SEG15 [7] phi from main::@13 to main::@1 [phi:main::@13->main::@1]
  //SEG16 [7] phi (byte*) print_char_cursor#16 = ((byte*))(word/signed word/dword/signed dword) 1024 [phi:main::@13->main::@1#0] -- pbuz1=pbuc1 
    lda #<$400
    sta print_char_cursor
    lda #>$400
    sta print_char_cursor+1
  //SEG17 main::@1
  //SEG18 main::@4
  b4:
  //SEG19 [8] if(*((const byte*) RASTER#0)!=(byte/word/signed word/dword/signed dword) 255) goto main::@4 -- _deref_pbuc1_neq_vbuc2_then_la1 
    lda RASTER
    cmp #$ff
    bne b4
  //SEG20 main::@6
  //SEG21 [9] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1 
    inc BORDERCOL
  //SEG22 [10] call mulf16u 
    jsr mulf16u
  //SEG23 [11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1
  //SEG24 main::@14
  //SEG25 [12] (dword) main::r#0 ← (dword) mulf16u::return#0
  //SEG26 [13] *((const byte*) BORDERCOL#0) ← -- *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_dec__deref_pbuc1 
    dec BORDERCOL
  //SEG27 [14] (dword) print_dword::dw#0 ← (dword) main::r#0
  //SEG28 [15] call print_dword 
    jsr print_dword
  //SEG29 [16] phi from main::@14 to main::@15 [phi:main::@14->main::@15]
  //SEG30 main::@15
  //SEG31 [17] call print_set_screen 
  //SEG32 [18] phi from main::@15 to print_set_screen [phi:main::@15->print_set_screen]
    jsr print_set_screen
  //SEG33 [7] phi from main::@15 to main::@1 [phi:main::@15->main::@1]
  //SEG34 [7] phi (byte*) print_char_cursor#16 = (const byte*) SCREEN#0 [phi:main::@15->main::@1#0] -- pbuz1=pbuc1 
    lda #<SCREEN
    sta print_char_cursor
    lda #>SCREEN
    sta print_char_cursor+1
    jmp b4
}
//SEG35 print_set_screen
// Set the screen to print on. Also resets current line/char cursor.
print_set_screen: {
  //SEG36 print_set_screen::@return
  //SEG37 [19] return 
    rts
}
//SEG38 print_dword
// Print a dword as HEX
// print_dword(dword zeropage(9) dw)
print_dword: {
    .label dw = 9
  //SEG39 [20] (word) print_word::w#0 ← > (dword) print_dword::dw#0 -- vwuz1=_hi_vduz2 
    lda dw+2
    sta print_word.w
    lda dw+3
    sta print_word.w+1
  //SEG40 [21] call print_word 
  //SEG41 [25] phi from print_dword to print_word [phi:print_dword->print_word]
  //SEG42 [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#16 [phi:print_dword->print_word#0] -- register_copy 
  //SEG43 [25] phi (word) print_word::w#2 = (word) print_word::w#0 [phi:print_dword->print_word#1] -- register_copy 
    jsr print_word
  //SEG44 print_dword::@1
  //SEG45 [22] (word) print_word::w#1 ← < (dword) print_dword::dw#0 -- vwuz1=_lo_vduz2 
    lda dw
    sta print_word.w
    lda dw+1
    sta print_word.w+1
  //SEG46 [23] call print_word 
  //SEG47 [25] phi from print_dword::@1 to print_word [phi:print_dword::@1->print_word]
  //SEG48 [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#10 [phi:print_dword::@1->print_word#0] -- register_copy 
  //SEG49 [25] phi (word) print_word::w#2 = (word) print_word::w#1 [phi:print_dword::@1->print_word#1] -- register_copy 
    jsr print_word
  //SEG50 print_dword::@return
  //SEG51 [24] return 
    rts
}
//SEG52 print_word
// Print a word as HEX
// print_word(word zeropage(2) w)
print_word: {
    .label w = 2
  //SEG53 [26] (byte) print_byte::b#0 ← > (word) print_word::w#2 -- vbuxx=_hi_vwuz1 
    lda w+1
    tax
  //SEG54 [27] call print_byte 
  //SEG55 [31] phi from print_word to print_byte [phi:print_word->print_byte]
  //SEG56 [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#34 [phi:print_word->print_byte#0] -- register_copy 
  //SEG57 [31] phi (byte) print_byte::b#2 = (byte) print_byte::b#0 [phi:print_word->print_byte#1] -- register_copy 
    jsr print_byte
  //SEG58 print_word::@1
  //SEG59 [28] (byte) print_byte::b#1 ← < (word) print_word::w#2 -- vbuxx=_lo_vwuz1 
    lda w
    tax
  //SEG60 [29] call print_byte 
  //SEG61 [31] phi from print_word::@1 to print_byte [phi:print_word::@1->print_byte]
  //SEG62 [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#10 [phi:print_word::@1->print_byte#0] -- register_copy 
  //SEG63 [31] phi (byte) print_byte::b#2 = (byte) print_byte::b#1 [phi:print_word::@1->print_byte#1] -- register_copy 
    jsr print_byte
  //SEG64 print_word::@return
  //SEG65 [30] return 
    rts
}
//SEG66 print_byte
// Print a byte as HEX
// print_byte(byte register(X) b)
print_byte: {
  //SEG67 [32] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte/signed byte/word/signed word/dword/signed dword) 4 -- vbuaa=vbuxx_ror_4 
    txa
    lsr
    lsr
    lsr
    lsr
  //SEG68 [33] (byte) print_char::ch#0 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$0) -- vbuaa=pbuc1_derefidx_vbuaa 
    tay
    lda print_hextab,y
  //SEG69 [34] call print_char 
  //SEG70 [39] phi from print_byte to print_char [phi:print_byte->print_char]
  //SEG71 [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#36 [phi:print_byte->print_char#0] -- register_copy 
  //SEG72 [39] phi (byte) print_char::ch#2 = (byte) print_char::ch#0 [phi:print_byte->print_char#1] -- register_copy 
    jsr print_char
  //SEG73 print_byte::@1
  //SEG74 [35] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte/signed byte/word/signed word/dword/signed dword) 15 -- vbuaa=vbuxx_band_vbuc1 
    txa
    and #$f
  //SEG75 [36] (byte) print_char::ch#1 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$2) -- vbuaa=pbuc1_derefidx_vbuaa 
    tay
    lda print_hextab,y
  //SEG76 [37] call print_char 
  //SEG77 [39] phi from print_byte::@1 to print_char [phi:print_byte::@1->print_char]
  //SEG78 [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#10 [phi:print_byte::@1->print_char#0] -- register_copy 
  //SEG79 [39] phi (byte) print_char::ch#2 = (byte) print_char::ch#1 [phi:print_byte::@1->print_char#1] -- register_copy 
    jsr print_char
  //SEG80 print_byte::@return
  //SEG81 [38] return 
    rts
}
//SEG82 print_char
// Print a single char
// print_char(byte register(A) ch)
print_char: {
  //SEG83 [40] *((byte*) print_char_cursor#27) ← (byte) print_char::ch#2 -- _deref_pbuz1=vbuaa 
    ldy #0
    sta (print_char_cursor),y
  //SEG84 [41] (byte*) print_char_cursor#10 ← ++ (byte*) print_char_cursor#27 -- pbuz1=_inc_pbuz1 
    inc print_char_cursor
    bne !+
    inc print_char_cursor+1
  !:
  //SEG85 print_char::@return
  //SEG86 [42] return 
    rts
}
//SEG87 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 = 9
  //SEG88 [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
  //SEG89 [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
  //SEG90 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
  !:
  //SEG91 [46] (dword) mulf16u::return#1 ← *((const dword*) mulf16u::memR#0) -- vduz1=_deref_pduc1 
    lda memR
    sta return
    lda memR+1
    sta return+1
    lda memR+2
    sta return+2
    lda memR+3
    sta return+3
  //SEG92 mulf16u::@return
  //SEG93 [47] return 
    rts
}
//SEG94 mulf_init
// Initialize the mulf_sqr multiplication tables with f(x)=int(x*x/4)
mulf_init: {
    .label sqr1_hi = 4
    .label sqr = 7
    .label sqr1_lo = 2
    .label x_2 = 6
    .label sqr2_hi = 4
    .label sqr2_lo = 2
    .label dir = 6
  //SEG95 [49] phi from mulf_init to mulf_init::@1 [phi:mulf_init->mulf_init::@1]
  //SEG96 [49] phi (byte) mulf_init::x_2#3 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:mulf_init->mulf_init::@1#0] -- vbuz1=vbuc1 
    lda #0
    sta x_2
  //SEG97 [49] phi (byte*) mulf_init::sqr1_hi#2 = (const byte[512]) mulf_sqr1_hi#0+(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:mulf_init->mulf_init::@1#1] -- pbuz1=pbuc1 
    lda #<mulf_sqr1_hi+1
    sta sqr1_hi
    lda #>mulf_sqr1_hi+1
    sta sqr1_hi+1
  //SEG98 [49] phi (byte*) mulf_init::sqr1_lo#2 = (const byte[512]) mulf_sqr1_lo#0+(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:mulf_init->mulf_init::@1#2] -- pbuz1=pbuc1 
    lda #<mulf_sqr1_lo+1
    sta sqr1_lo
    lda #>mulf_sqr1_lo+1
    sta sqr1_lo+1
  //SEG99 [49] phi (word) mulf_init::sqr#4 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:mulf_init->mulf_init::@1#3] -- vwuz1=vbuc1 
    lda #<0
    sta sqr
    sta sqr+1
  //SEG100 [49] phi (byte) mulf_init::c#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:mulf_init->mulf_init::@1#4] -- vbuxx=vbuc1 
    tax
  //SEG101 [49] phi from mulf_init::@2 to mulf_init::@1 [phi:mulf_init::@2->mulf_init::@1]
  //SEG102 [49] phi (byte) mulf_init::x_2#3 = (byte) mulf_init::x_2#2 [phi:mulf_init::@2->mulf_init::@1#0] -- register_copy 
  //SEG103 [49] phi (byte*) mulf_init::sqr1_hi#2 = (byte*) mulf_init::sqr1_hi#1 [phi:mulf_init::@2->mulf_init::@1#1] -- register_copy 
  //SEG104 [49] phi (byte*) mulf_init::sqr1_lo#2 = (byte*) mulf_init::sqr1_lo#1 [phi:mulf_init::@2->mulf_init::@1#2] -- register_copy 
  //SEG105 [49] phi (word) mulf_init::sqr#4 = (word) mulf_init::sqr#1 [phi:mulf_init::@2->mulf_init::@1#3] -- register_copy 
  //SEG106 [49] phi (byte) mulf_init::c#2 = (byte) mulf_init::c#1 [phi:mulf_init::@2->mulf_init::@1#4] -- register_copy 
  //SEG107 mulf_init::@1
  b1:
  //SEG108 [50] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2 -- vbuxx=_inc_vbuxx 
    inx
  //SEG109 [51] (byte~) mulf_init::$2 ← (byte) mulf_init::c#1 & (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuxx_band_vbuc1 
    txa
    and #1
  //SEG110 [52] if((byte~) mulf_init::$2!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mulf_init::@2 -- vbuaa_neq_0_then_la1 
    cmp #0
    bne b2
  //SEG111 mulf_init::@5
  //SEG112 [53] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3 -- vbuz1=_inc_vbuz1 
    inc x_2
  //SEG113 [54] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4 -- vwuz1=_inc_vwuz1 
    inc sqr
    bne !+
    inc sqr+1
  !:
  //SEG114 [55] phi from mulf_init::@1 mulf_init::@5 to mulf_init::@2 [phi:mulf_init::@1/mulf_init::@5->mulf_init::@2]
  //SEG115 [55] phi (byte) mulf_init::x_2#2 = (byte) mulf_init::x_2#3 [phi:mulf_init::@1/mulf_init::@5->mulf_init::@2#0] -- register_copy 
  //SEG116 [55] phi (word) mulf_init::sqr#3 = (word) mulf_init::sqr#4 [phi:mulf_init::@1/mulf_init::@5->mulf_init::@2#1] -- register_copy 
  //SEG117 mulf_init::@2
  b2:
  //SEG118 [56] (byte~) mulf_init::$5 ← < (word) mulf_init::sqr#3 -- vbuaa=_lo_vwuz1 
    lda sqr
  //SEG119 [57] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$5 -- _deref_pbuz1=vbuaa 
    ldy #0
    sta (sqr1_lo),y
  //SEG120 [58] (byte~) mulf_init::$6 ← > (word) mulf_init::sqr#3 -- vbuaa=_hi_vwuz1 
    lda sqr+1
  //SEG121 [59] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$6 -- _deref_pbuz1=vbuaa 
    sta (sqr1_hi),y
  //SEG122 [60] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2 -- pbuz1=_inc_pbuz1 
    inc sqr1_hi
    bne !+
    inc sqr1_hi+1
  !:
  //SEG123 [61] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2 -- vwuz1=vwuz1_plus_vbuz2 
    lda x_2
    clc
    adc sqr
    sta sqr
    lda #0
    adc sqr+1
    sta sqr+1
  //SEG124 [62] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2 -- pbuz1=_inc_pbuz1 
    inc sqr1_lo
    bne !+
    inc sqr1_lo+1
  !:
  //SEG125 [63] if((byte*) mulf_init::sqr1_lo#1!=(const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 512) goto mulf_init::@1 -- pbuz1_neq_pbuc1_then_la1 
    lda sqr1_lo+1
    cmp #>mulf_sqr1_lo+$200
    bne b1
    lda sqr1_lo
    cmp #<mulf_sqr1_lo+$200
    bne b1
  //SEG126 [64] phi from mulf_init::@2 to mulf_init::@3 [phi:mulf_init::@2->mulf_init::@3]
  //SEG127 [64] phi (byte) mulf_init::dir#2 = (byte/word/signed word/dword/signed dword) 255 [phi:mulf_init::@2->mulf_init::@3#0] -- vbuz1=vbuc1 
    lda #$ff
    sta dir
  //SEG128 [64] phi (byte*) mulf_init::sqr2_hi#2 = (const byte[512]) mulf_sqr2_hi#0 [phi:mulf_init::@2->mulf_init::@3#1] -- pbuz1=pbuc1 
    lda #<mulf_sqr2_hi
    sta sqr2_hi
    lda #>mulf_sqr2_hi
    sta sqr2_hi+1
  //SEG129 [64] phi (byte*) mulf_init::sqr2_lo#2 = (const byte[512]) mulf_sqr2_lo#0 [phi:mulf_init::@2->mulf_init::@3#2] -- pbuz1=pbuc1 
    lda #<mulf_sqr2_lo
    sta sqr2_lo
    lda #>mulf_sqr2_lo
    sta sqr2_lo+1
  //SEG130 [64] phi (byte) mulf_init::x_255#2 = ((byte))-(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:mulf_init::@2->mulf_init::@3#3] -- vbuxx=vbuc1 
    ldx #-1
  //SEG131 [64] phi from mulf_init::@4 to mulf_init::@3 [phi:mulf_init::@4->mulf_init::@3]
  //SEG132 [64] phi (byte) mulf_init::dir#2 = (byte) mulf_init::dir#3 [phi:mulf_init::@4->mulf_init::@3#0] -- register_copy 
  //SEG133 [64] phi (byte*) mulf_init::sqr2_hi#2 = (byte*) mulf_init::sqr2_hi#1 [phi:mulf_init::@4->mulf_init::@3#1] -- register_copy 
  //SEG134 [64] phi (byte*) mulf_init::sqr2_lo#2 = (byte*) mulf_init::sqr2_lo#1 [phi:mulf_init::@4->mulf_init::@3#2] -- register_copy 
  //SEG135 [64] phi (byte) mulf_init::x_255#2 = (byte) mulf_init::x_255#1 [phi:mulf_init::@4->mulf_init::@3#3] -- register_copy 
  //SEG136 mulf_init::@3
  b3:
  //SEG137 [65] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[512]) 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
  //SEG138 [66] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[512]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2) -- _deref_pbuz1=pbuc1_derefidx_vbuxx 
    lda mulf_sqr1_hi,x
    sta (sqr2_hi),y
  //SEG139 [67] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2 -- pbuz1=_inc_pbuz1 
    inc sqr2_hi
    bne !+
    inc sqr2_hi+1
  !:
  //SEG140 [68] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2 -- vbuxx=vbuxx_plus_vbuz1 
    txa
    clc
    adc dir
    tax
  //SEG141 [69] if((byte) mulf_init::x_255#1!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mulf_init::@12 -- vbuxx_neq_0_then_la1 
    cpx #0
    bne b4
  //SEG142 [70] phi from mulf_init::@3 to mulf_init::@4 [phi:mulf_init::@3->mulf_init::@4]
  //SEG143 [70] phi (byte) mulf_init::dir#3 = (byte/signed byte/word/signed word/dword/signed dword) 1 [phi:mulf_init::@3->mulf_init::@4#0] -- vbuz1=vbuc1 
    lda #1
    sta dir
  //SEG144 mulf_init::@4
  b4:
  //SEG145 [71] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2 -- pbuz1=_inc_pbuz1 
    inc sqr2_lo
    bne !+
    inc sqr2_lo+1
  !:
  //SEG146 [72] if((byte*) mulf_init::sqr2_lo#1!=(const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511) goto mulf_init::@3 -- pbuz1_neq_pbuc1_then_la1 
    lda sqr2_lo+1
    cmp #>mulf_sqr2_lo+$1ff
    bne b3
    lda sqr2_lo
    cmp #<mulf_sqr2_lo+$1ff
    bne b3
  //SEG147 mulf_init::@8
  //SEG148 [73] *((const byte[512]) mulf_sqr2_lo#0+(word/signed word/dword/signed dword) 511) ← *((const byte[512]) mulf_sqr1_lo#0+(word/signed word/dword/signed dword) 256) -- _deref_pbuc1=_deref_pbuc2 
    // Set the very last value g(511) = f(256)
    lda mulf_sqr1_lo+$100
    sta mulf_sqr2_lo+$1ff
  //SEG149 [74] *((const byte[512]) mulf_sqr2_hi#0+(word/signed word/dword/signed dword) 511) ← *((const byte[512]) mulf_sqr1_hi#0+(word/signed word/dword/signed dword) 256) -- _deref_pbuc1=_deref_pbuc2 
    lda mulf_sqr1_hi+$100
    sta mulf_sqr2_hi+$1ff
  //SEG150 mulf_init::@return
  //SEG151 [75] return 
    rts
  //SEG152 [76] phi from mulf_init::@3 to mulf_init::@12 [phi:mulf_init::@3->mulf_init::@12]
  //SEG153 mulf_init::@12
  //SEG154 [70] phi from mulf_init::@12 to mulf_init::@4 [phi:mulf_init::@12->mulf_init::@4]
  //SEG155 [70] phi (byte) mulf_init::dir#3 = (byte) mulf_init::dir#2 [phi:mulf_init::@12->mulf_init::@4#0] -- register_copy 
}
  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

