Inlined call call __init Eliminating unused variable with no statement main::$3 CONTROL FLOW GRAPH SSA void print_uint(unsigned int w) print_uint: scope:[print_uint] from print_ulong print_ulong::@1 print_char_cursor#36 = phi( print_ulong/print_char_cursor#37, print_ulong::@1/print_char_cursor#3 ) print_uint::w#2 = phi( print_ulong/print_uint::w#0, print_ulong::@1/print_uint::w#1 ) print_uint::$0 = byte1 print_uint::w#2 print_uchar::b#0 = print_uint::$0 call print_uchar to:print_uint::@1 print_uint::@1: scope:[print_uint] from print_uint print_uint::w#3 = phi( print_uint/print_uint::w#2 ) print_char_cursor#19 = phi( print_uint/print_char_cursor#8 ) print_char_cursor#0 = print_char_cursor#19 print_uint::$2 = byte0 print_uint::w#3 print_uchar::b#1 = print_uint::$2 call print_uchar to:print_uint::@2 print_uint::@2: scope:[print_uint] from print_uint::@1 print_char_cursor#20 = phi( print_uint::@1/print_char_cursor#8 ) print_char_cursor#1 = print_char_cursor#20 to:print_uint::@return print_uint::@return: scope:[print_uint] from print_uint::@2 print_char_cursor#21 = phi( print_uint::@2/print_char_cursor#1 ) print_char_cursor#2 = print_char_cursor#21 return to:@return void print_ulong(unsigned long dw) print_ulong: scope:[print_ulong] from main::@5 print_char_cursor#37 = phi( main::@5/print_char_cursor#39 ) print_ulong::dw#1 = phi( main::@5/print_ulong::dw#0 ) print_ulong::$0 = word1 print_ulong::dw#1 print_uint::w#0 = print_ulong::$0 call print_uint to:print_ulong::@1 print_ulong::@1: scope:[print_ulong] from print_ulong print_ulong::dw#2 = phi( print_ulong/print_ulong::dw#1 ) print_char_cursor#22 = phi( print_ulong/print_char_cursor#2 ) print_char_cursor#3 = print_char_cursor#22 print_ulong::$2 = word0 print_ulong::dw#2 print_uint::w#1 = print_ulong::$2 call print_uint to:print_ulong::@2 print_ulong::@2: scope:[print_ulong] from print_ulong::@1 print_char_cursor#23 = phi( print_ulong::@1/print_char_cursor#2 ) print_char_cursor#4 = print_char_cursor#23 to:print_ulong::@return print_ulong::@return: scope:[print_ulong] from print_ulong::@2 print_char_cursor#24 = phi( print_ulong::@2/print_char_cursor#4 ) print_char_cursor#5 = print_char_cursor#24 return to:@return void print_uchar(char b) print_uchar: scope:[print_uchar] from print_uint print_uint::@1 print_char_cursor#38 = phi( print_uint/print_char_cursor#36, print_uint::@1/print_char_cursor#0 ) print_uchar::b#2 = phi( print_uint/print_uchar::b#0, print_uint::@1/print_uchar::b#1 ) print_uchar::$0 = print_uchar::b#2 >> 4 print_char::ch#0 = print_hextab[print_uchar::$0] call print_char to:print_uchar::@1 print_uchar::@1: scope:[print_uchar] from print_uchar print_uchar::b#3 = phi( print_uchar/print_uchar::b#2 ) print_char_cursor#25 = phi( print_uchar/print_char_cursor#10 ) print_char_cursor#6 = print_char_cursor#25 print_uchar::$2 = print_uchar::b#3 & $f print_char::ch#1 = print_hextab[print_uchar::$2] call print_char to:print_uchar::@2 print_uchar::@2: scope:[print_uchar] from print_uchar::@1 print_char_cursor#26 = phi( print_uchar::@1/print_char_cursor#10 ) print_char_cursor#7 = print_char_cursor#26 to:print_uchar::@return print_uchar::@return: scope:[print_uchar] from print_uchar::@2 print_char_cursor#27 = phi( print_uchar::@2/print_char_cursor#7 ) print_char_cursor#8 = print_char_cursor#27 return to:@return void print_char(char ch) print_char: scope:[print_char] from print_uchar print_uchar::@1 print_char_cursor#28 = phi( print_uchar/print_char_cursor#38, print_uchar::@1/print_char_cursor#6 ) print_char::ch#2 = phi( print_uchar/print_char::ch#0, print_uchar::@1/print_char::ch#1 ) *print_char_cursor#28 = print_char::ch#2 print_char_cursor#9 = ++ print_char_cursor#28 to:print_char::@return print_char::@return: scope:[print_char] from print_char print_char_cursor#29 = phi( print_char/print_char_cursor#9 ) print_char_cursor#10 = print_char_cursor#29 return to:@return void print_set_screen(char *screen) print_set_screen: scope:[print_set_screen] from main::@6 print_set_screen::screen#1 = phi( main::@6/print_set_screen::screen#0 ) print_screen#0 = print_set_screen::screen#1 print_line_cursor#0 = print_screen#0 print_char_cursor#11 = print_line_cursor#0 to:print_set_screen::@return print_set_screen::@return: scope:[print_set_screen] from print_set_screen print_char_cursor#30 = phi( print_set_screen/print_char_cursor#11 ) print_line_cursor#7 = phi( print_set_screen/print_line_cursor#0 ) print_screen#7 = phi( print_set_screen/print_screen#0 ) print_screen#1 = print_screen#7 print_line_cursor#1 = print_line_cursor#7 print_char_cursor#12 = print_char_cursor#30 return to:@return void main() main: scope:[main] from __start::@1 print_line_cursor#17 = phi( __start::@1/print_line_cursor#14 ) print_screen#17 = phi( __start::@1/print_screen#14 ) print_char_cursor#44 = phi( __start::@1/print_char_cursor#41 ) call mulf_init to:main::@4 main::@4: scope:[main] from main print_line_cursor#15 = phi( main/print_line_cursor#17 ) print_screen#15 = phi( main/print_screen#17 ) print_char_cursor#42 = phi( main/print_char_cursor#44 ) asm { sei } to:main::@1 main::@1: scope:[main] from main::@4 main::@7 print_line_cursor#13 = phi( main::@4/print_line_cursor#15, main::@7/print_line_cursor#2 ) print_screen#13 = phi( main::@4/print_screen#15, main::@7/print_screen#2 ) print_char_cursor#40 = phi( main::@4/print_char_cursor#42, main::@7/print_char_cursor#14 ) if(true) goto main::@2 to:main::@return main::@2: scope:[main] from main::@1 main::@2 print_line_cursor#19 = phi( main::@1/print_line_cursor#13, main::@2/print_line_cursor#19 ) print_screen#19 = phi( main::@1/print_screen#13, main::@2/print_screen#19 ) print_char_cursor#45 = phi( main::@1/print_char_cursor#40, main::@2/print_char_cursor#45 ) main::$1 = *RASTER != $ff if(main::$1) goto main::@2 to:main::@3 main::@3: scope:[main] from main::@2 print_line_cursor#18 = phi( main::@2/print_line_cursor#19 ) print_screen#18 = phi( main::@2/print_screen#19 ) print_char_cursor#43 = phi( main::@2/print_char_cursor#45 ) *BORDER_COLOR = ++ *BORDER_COLOR mulf16u::a#0 = main::a mulf16u::b#0 = main::b call mulf16u mulf16u::return#0 = mulf16u::return#2 to:main::@5 main::@5: scope:[main] from main::@3 print_line_cursor#16 = phi( main::@3/print_line_cursor#18 ) print_screen#16 = phi( main::@3/print_screen#18 ) print_char_cursor#39 = phi( main::@3/print_char_cursor#43 ) mulf16u::return#3 = phi( main::@3/mulf16u::return#0 ) main::r#0 = mulf16u::return#3 *BORDER_COLOR = -- *BORDER_COLOR print_ulong::dw#0 = main::r#0 call print_ulong to:main::@6 main::@6: scope:[main] from main::@5 print_line_cursor#12 = phi( main::@5/print_line_cursor#16 ) print_screen#12 = phi( main::@5/print_screen#16 ) print_char_cursor#31 = phi( main::@5/print_char_cursor#5 ) print_char_cursor#13 = print_char_cursor#31 print_set_screen::screen#0 = SCREEN call print_set_screen to:main::@7 main::@7: scope:[main] from main::@6 print_char_cursor#32 = phi( main::@6/print_char_cursor#12 ) print_line_cursor#8 = phi( main::@6/print_line_cursor#1 ) print_screen#8 = phi( main::@6/print_screen#1 ) print_screen#2 = print_screen#8 print_line_cursor#2 = print_line_cursor#8 print_char_cursor#14 = print_char_cursor#32 to:main::@1 main::@return: scope:[main] from main::@1 print_line_cursor#9 = phi( main::@1/print_line_cursor#13 ) print_screen#9 = phi( main::@1/print_screen#13 ) print_char_cursor#33 = phi( main::@1/print_char_cursor#40 ) print_char_cursor#15 = print_char_cursor#33 print_screen#3 = print_screen#9 print_line_cursor#3 = print_line_cursor#9 return to:@return void mulf_init() mulf_init: scope:[mulf_init] from main mulf_init::sqr#0 = 0 mulf_init::x_2#0 = 0 mulf_init::c#0 = 0 mulf_init::sqr1_hi#0 = mulf_sqr1_hi+1 mulf_init::sqr1_lo#0 = mulf_sqr1_lo+1 to:mulf_init::@1 mulf_init::@1: scope:[mulf_init] from mulf_init mulf_init::@4 mulf_init::x_2#5 = phi( mulf_init/mulf_init::x_2#0, mulf_init::@4/mulf_init::x_2#2 ) mulf_init::sqr1_hi#5 = phi( mulf_init/mulf_init::sqr1_hi#0, mulf_init::@4/mulf_init::sqr1_hi#1 ) mulf_init::sqr#6 = phi( mulf_init/mulf_init::sqr#0, mulf_init::@4/mulf_init::sqr#1 ) mulf_init::c#3 = phi( mulf_init/mulf_init::c#0, mulf_init::@4/mulf_init::c#4 ) mulf_init::sqr1_lo#2 = phi( mulf_init/mulf_init::sqr1_lo#0, mulf_init::@4/mulf_init::sqr1_lo#1 ) mulf_init::$0 = mulf_init::sqr1_lo#2 != mulf_sqr1_lo+$200 if(mulf_init::$0) goto mulf_init::@2 to:mulf_init::@3 mulf_init::@2: scope:[mulf_init] from mulf_init::@1 mulf_init::x_2#4 = phi( mulf_init::@1/mulf_init::x_2#5 ) mulf_init::sqr1_hi#3 = phi( mulf_init::@1/mulf_init::sqr1_hi#5 ) mulf_init::sqr1_lo#4 = phi( mulf_init::@1/mulf_init::sqr1_lo#2 ) mulf_init::sqr#5 = phi( mulf_init::@1/mulf_init::sqr#6 ) mulf_init::c#2 = phi( mulf_init::@1/mulf_init::c#3 ) mulf_init::c#1 = ++ mulf_init::c#2 mulf_init::$1 = mulf_init::c#1 & 1 mulf_init::$2 = mulf_init::$1 == 0 mulf_init::$3 = ! mulf_init::$2 if(mulf_init::$3) goto mulf_init::@4 to:mulf_init::@5 mulf_init::@3: scope:[mulf_init] from mulf_init::@1 mulf_init::x_255#0 = (char)-1 mulf_init::dir#0 = $ff mulf_init::sqr2_hi#0 = mulf_sqr2_hi mulf_init::sqr2_lo#0 = mulf_sqr2_lo to:mulf_init::@6 mulf_init::@4: scope:[mulf_init] from mulf_init::@2 mulf_init::@5 mulf_init::c#4 = phi( mulf_init::@2/mulf_init::c#1, mulf_init::@5/mulf_init::c#5 ) mulf_init::x_2#2 = phi( mulf_init::@2/mulf_init::x_2#4, mulf_init::@5/mulf_init::x_2#1 ) mulf_init::sqr1_hi#2 = phi( mulf_init::@2/mulf_init::sqr1_hi#3, mulf_init::@5/mulf_init::sqr1_hi#4 ) mulf_init::sqr1_lo#3 = phi( mulf_init::@2/mulf_init::sqr1_lo#4, mulf_init::@5/mulf_init::sqr1_lo#5 ) mulf_init::sqr#3 = phi( mulf_init::@2/mulf_init::sqr#5, mulf_init::@5/mulf_init::sqr#2 ) mulf_init::$4 = byte0 mulf_init::sqr#3 *mulf_init::sqr1_lo#3 = mulf_init::$4 mulf_init::$5 = byte1 mulf_init::sqr#3 *mulf_init::sqr1_hi#2 = mulf_init::$5 mulf_init::sqr1_hi#1 = ++ mulf_init::sqr1_hi#2 mulf_init::$6 = mulf_init::sqr#3 + mulf_init::x_2#2 mulf_init::sqr#1 = mulf_init::$6 mulf_init::sqr1_lo#1 = ++ mulf_init::sqr1_lo#3 to:mulf_init::@1 mulf_init::@5: scope:[mulf_init] from mulf_init::@2 mulf_init::c#5 = phi( mulf_init::@2/mulf_init::c#1 ) mulf_init::sqr1_hi#4 = phi( mulf_init::@2/mulf_init::sqr1_hi#3 ) mulf_init::sqr1_lo#5 = phi( mulf_init::@2/mulf_init::sqr1_lo#4 ) mulf_init::sqr#4 = phi( mulf_init::@2/mulf_init::sqr#5 ) mulf_init::x_2#3 = phi( mulf_init::@2/mulf_init::x_2#4 ) mulf_init::x_2#1 = ++ mulf_init::x_2#3 mulf_init::sqr#2 = ++ mulf_init::sqr#4 to:mulf_init::@4 mulf_init::@6: scope:[mulf_init] from mulf_init::@3 mulf_init::@9 mulf_init::dir#3 = phi( mulf_init::@3/mulf_init::dir#0, mulf_init::@9/mulf_init::dir#4 ) mulf_init::sqr2_hi#3 = phi( mulf_init::@3/mulf_init::sqr2_hi#0, mulf_init::@9/mulf_init::sqr2_hi#4 ) mulf_init::x_255#3 = phi( mulf_init::@3/mulf_init::x_255#0, mulf_init::@9/mulf_init::x_255#4 ) mulf_init::sqr2_lo#2 = phi( mulf_init::@3/mulf_init::sqr2_lo#0, mulf_init::@9/mulf_init::sqr2_lo#1 ) mulf_init::$7 = mulf_init::sqr2_lo#2 != mulf_sqr2_lo+$1ff if(mulf_init::$7) goto mulf_init::@7 to:mulf_init::@8 mulf_init::@7: scope:[mulf_init] from mulf_init::@6 mulf_init::dir#2 = phi( mulf_init::@6/mulf_init::dir#3 ) mulf_init::sqr2_hi#2 = phi( mulf_init::@6/mulf_init::sqr2_hi#3 ) mulf_init::sqr2_lo#3 = phi( mulf_init::@6/mulf_init::sqr2_lo#2 ) mulf_init::x_255#2 = phi( mulf_init::@6/mulf_init::x_255#3 ) *mulf_init::sqr2_lo#3 = mulf_sqr1_lo[mulf_init::x_255#2] *mulf_init::sqr2_hi#2 = mulf_sqr1_hi[mulf_init::x_255#2] mulf_init::sqr2_hi#1 = ++ mulf_init::sqr2_hi#2 mulf_init::$8 = mulf_init::x_255#2 + mulf_init::dir#2 mulf_init::x_255#1 = mulf_init::$8 mulf_init::$9 = mulf_init::x_255#1 == 0 mulf_init::$10 = ! mulf_init::$9 if(mulf_init::$10) goto mulf_init::@9 to:mulf_init::@10 mulf_init::@8: scope:[mulf_init] from mulf_init::@6 *(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+$100) *(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+$100) to:mulf_init::@return mulf_init::@9: scope:[mulf_init] from mulf_init::@10 mulf_init::@7 mulf_init::dir#4 = phi( mulf_init::@10/mulf_init::dir#1, mulf_init::@7/mulf_init::dir#2 ) mulf_init::sqr2_hi#4 = phi( mulf_init::@10/mulf_init::sqr2_hi#5, mulf_init::@7/mulf_init::sqr2_hi#1 ) mulf_init::x_255#4 = phi( mulf_init::@10/mulf_init::x_255#5, mulf_init::@7/mulf_init::x_255#1 ) mulf_init::sqr2_lo#4 = phi( mulf_init::@10/mulf_init::sqr2_lo#5, mulf_init::@7/mulf_init::sqr2_lo#3 ) mulf_init::sqr2_lo#1 = ++ mulf_init::sqr2_lo#4 to:mulf_init::@6 mulf_init::@10: scope:[mulf_init] from mulf_init::@7 mulf_init::sqr2_hi#5 = phi( mulf_init::@7/mulf_init::sqr2_hi#1 ) mulf_init::x_255#5 = phi( mulf_init::@7/mulf_init::x_255#1 ) mulf_init::sqr2_lo#5 = phi( mulf_init::@7/mulf_init::sqr2_lo#3 ) mulf_init::dir#1 = 1 to:mulf_init::@9 mulf_init::@return: scope:[mulf_init] from mulf_init::@8 return to:@return unsigned long mulf16u(unsigned int a , unsigned int b) mulf16u: scope:[mulf16u] from main::@3 mulf16u::b#1 = phi( main::@3/mulf16u::b#0 ) mulf16u::a#1 = phi( main::@3/mulf16u::a#0 ) *mulf16u::memA = mulf16u::a#1 *mulf16u::memB = 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 !: } mulf16u::return#1 = *mulf16u::memR to:mulf16u::@return mulf16u::@return: scope:[mulf16u] from mulf16u mulf16u::return#4 = phi( mulf16u/mulf16u::return#1 ) mulf16u::return#2 = mulf16u::return#4 return to:@return void __start() __start: scope:[__start] from to:__start::__init1 __start::__init1: scope:[__start] from __start print_screen#4 = (char *)$400 print_line_cursor#4 = print_screen#4 print_char_cursor#16 = print_line_cursor#4 to:__start::@1 __start::@1: scope:[__start] from __start::__init1 print_line_cursor#14 = phi( __start::__init1/print_line_cursor#4 ) print_screen#14 = phi( __start::__init1/print_screen#4 ) print_char_cursor#41 = phi( __start::__init1/print_char_cursor#16 ) call main to:__start::@2 __start::@2: scope:[__start] from __start::@1 print_line_cursor#10 = phi( __start::@1/print_line_cursor#3 ) print_screen#10 = phi( __start::@1/print_screen#3 ) print_char_cursor#34 = phi( __start::@1/print_char_cursor#15 ) print_char_cursor#17 = print_char_cursor#34 print_screen#5 = print_screen#10 print_line_cursor#5 = print_line_cursor#10 to:__start::@return __start::@return: scope:[__start] from __start::@2 print_char_cursor#35 = phi( __start::@2/print_char_cursor#17 ) print_line_cursor#11 = phi( __start::@2/print_line_cursor#5 ) print_screen#11 = phi( __start::@2/print_screen#5 ) print_screen#6 = print_screen#11 print_line_cursor#6 = print_line_cursor#11 print_char_cursor#18 = print_char_cursor#35 return to:@return SYMBOL TABLE SSA __constant char *BORDER_COLOR = (char *)$d020 __constant char RADIX::BINARY = 2 __constant char RADIX::DECIMAL = $a __constant char RADIX::HEXADECIMAL = $10 __constant char RADIX::OCTAL = 8 __constant char *RASTER = (char *)$d012 __constant char *SCREEN = (char *)$400 void __start() void main() bool main::$1 __constant unsigned int main::a = $4d2 __constant unsigned int main::b = $929 unsigned long main::r unsigned long main::r#0 unsigned long mulf16u(unsigned int a , unsigned int b) unsigned int mulf16u::a unsigned int mulf16u::a#0 unsigned int mulf16u::a#1 unsigned int mulf16u::b unsigned int mulf16u::b#0 unsigned int mulf16u::b#1 __constant unsigned int * const mulf16u::memA = (unsigned int *)$f8 __constant unsigned int * const mulf16u::memB = (unsigned int *)$fa __constant unsigned long * const mulf16u::memR = (unsigned long *)$fc unsigned long mulf16u::return unsigned long mulf16u::return#0 unsigned long mulf16u::return#1 unsigned long mulf16u::return#2 unsigned long mulf16u::return#3 unsigned long mulf16u::return#4 void mulf_init() bool mulf_init::$0 number mulf_init::$1 bool mulf_init::$10 bool mulf_init::$2 bool mulf_init::$3 char mulf_init::$4 char mulf_init::$5 unsigned int mulf_init::$6 bool mulf_init::$7 char mulf_init::$8 bool mulf_init::$9 char mulf_init::c char mulf_init::c#0 char mulf_init::c#1 char mulf_init::c#2 char mulf_init::c#3 char mulf_init::c#4 char mulf_init::c#5 char mulf_init::dir char mulf_init::dir#0 char mulf_init::dir#1 char mulf_init::dir#2 char mulf_init::dir#3 char mulf_init::dir#4 unsigned int mulf_init::sqr unsigned int mulf_init::sqr#0 unsigned int mulf_init::sqr#1 unsigned int mulf_init::sqr#2 unsigned int mulf_init::sqr#3 unsigned int mulf_init::sqr#4 unsigned int mulf_init::sqr#5 unsigned int mulf_init::sqr#6 char *mulf_init::sqr1_hi char *mulf_init::sqr1_hi#0 char *mulf_init::sqr1_hi#1 char *mulf_init::sqr1_hi#2 char *mulf_init::sqr1_hi#3 char *mulf_init::sqr1_hi#4 char *mulf_init::sqr1_hi#5 char *mulf_init::sqr1_lo char *mulf_init::sqr1_lo#0 char *mulf_init::sqr1_lo#1 char *mulf_init::sqr1_lo#2 char *mulf_init::sqr1_lo#3 char *mulf_init::sqr1_lo#4 char *mulf_init::sqr1_lo#5 char *mulf_init::sqr2_hi char *mulf_init::sqr2_hi#0 char *mulf_init::sqr2_hi#1 char *mulf_init::sqr2_hi#2 char *mulf_init::sqr2_hi#3 char *mulf_init::sqr2_hi#4 char *mulf_init::sqr2_hi#5 char *mulf_init::sqr2_lo char *mulf_init::sqr2_lo#0 char *mulf_init::sqr2_lo#1 char *mulf_init::sqr2_lo#2 char *mulf_init::sqr2_lo#3 char *mulf_init::sqr2_lo#4 char *mulf_init::sqr2_lo#5 char mulf_init::x_2 char mulf_init::x_2#0 char mulf_init::x_2#1 char mulf_init::x_2#2 char mulf_init::x_2#3 char mulf_init::x_2#4 char mulf_init::x_2#5 char mulf_init::x_255 char mulf_init::x_255#0 char mulf_init::x_255#1 char mulf_init::x_255#2 char mulf_init::x_255#3 char mulf_init::x_255#4 char mulf_init::x_255#5 __constant char mulf_sqr1_hi[$200] = { fill( $200, 0) } __constant char mulf_sqr1_lo[$200] = { fill( $200, 0) } __constant char mulf_sqr2_hi[$200] = { fill( $200, 0) } __constant char mulf_sqr2_lo[$200] = { fill( $200, 0) } void print_char(char ch) char print_char::ch char print_char::ch#0 char print_char::ch#1 char print_char::ch#2 char *print_char_cursor char *print_char_cursor#0 char *print_char_cursor#1 char *print_char_cursor#10 char *print_char_cursor#11 char *print_char_cursor#12 char *print_char_cursor#13 char *print_char_cursor#14 char *print_char_cursor#15 char *print_char_cursor#16 char *print_char_cursor#17 char *print_char_cursor#18 char *print_char_cursor#19 char *print_char_cursor#2 char *print_char_cursor#20 char *print_char_cursor#21 char *print_char_cursor#22 char *print_char_cursor#23 char *print_char_cursor#24 char *print_char_cursor#25 char *print_char_cursor#26 char *print_char_cursor#27 char *print_char_cursor#28 char *print_char_cursor#29 char *print_char_cursor#3 char *print_char_cursor#30 char *print_char_cursor#31 char *print_char_cursor#32 char *print_char_cursor#33 char *print_char_cursor#34 char *print_char_cursor#35 char *print_char_cursor#36 char *print_char_cursor#37 char *print_char_cursor#38 char *print_char_cursor#39 char *print_char_cursor#4 char *print_char_cursor#40 char *print_char_cursor#41 char *print_char_cursor#42 char *print_char_cursor#43 char *print_char_cursor#44 char *print_char_cursor#45 char *print_char_cursor#5 char *print_char_cursor#6 char *print_char_cursor#7 char *print_char_cursor#8 char *print_char_cursor#9 __constant const char print_hextab[] = "0123456789abcdef"z char *print_line_cursor char *print_line_cursor#0 char *print_line_cursor#1 char *print_line_cursor#10 char *print_line_cursor#11 char *print_line_cursor#12 char *print_line_cursor#13 char *print_line_cursor#14 char *print_line_cursor#15 char *print_line_cursor#16 char *print_line_cursor#17 char *print_line_cursor#18 char *print_line_cursor#19 char *print_line_cursor#2 char *print_line_cursor#3 char *print_line_cursor#4 char *print_line_cursor#5 char *print_line_cursor#6 char *print_line_cursor#7 char *print_line_cursor#8 char *print_line_cursor#9 char *print_screen char *print_screen#0 char *print_screen#1 char *print_screen#10 char *print_screen#11 char *print_screen#12 char *print_screen#13 char *print_screen#14 char *print_screen#15 char *print_screen#16 char *print_screen#17 char *print_screen#18 char *print_screen#19 char *print_screen#2 char *print_screen#3 char *print_screen#4 char *print_screen#5 char *print_screen#6 char *print_screen#7 char *print_screen#8 char *print_screen#9 void print_set_screen(char *screen) char *print_set_screen::screen char *print_set_screen::screen#0 char *print_set_screen::screen#1 void print_uchar(char b) char print_uchar::$0 number print_uchar::$2 char print_uchar::b char print_uchar::b#0 char print_uchar::b#1 char print_uchar::b#2 char print_uchar::b#3 void print_uint(unsigned int w) char print_uint::$0 char print_uint::$2 unsigned int print_uint::w unsigned int print_uint::w#0 unsigned int print_uint::w#1 unsigned int print_uint::w#2 unsigned int print_uint::w#3 void print_ulong(unsigned long dw) unsigned int print_ulong::$0 unsigned int print_ulong::$2 unsigned long print_ulong::dw unsigned long print_ulong::dw#0 unsigned long print_ulong::dw#1 unsigned long print_ulong::dw#2 Adding number conversion cast (unumber) 4 in print_uchar::$0 = print_uchar::b#2 >> 4 Adding number conversion cast (unumber) $f in print_uchar::$2 = print_uchar::b#3 & $f Adding number conversion cast (unumber) print_uchar::$2 in print_uchar::$2 = print_uchar::b#3 & (unumber)$f Adding number conversion cast (unumber) $ff in main::$1 = *RASTER != $ff Adding number conversion cast (unumber) 1 in mulf_init::sqr1_hi#0 = mulf_sqr1_hi+1 Adding number conversion cast (unumber) 1 in mulf_init::sqr1_lo#0 = mulf_sqr1_lo+1 Adding number conversion cast (unumber) $200 in mulf_init::$0 = mulf_init::sqr1_lo#2 != mulf_sqr1_lo+$200 Adding number conversion cast (unumber) 1 in mulf_init::$1 = mulf_init::c#1 & 1 Adding number conversion cast (unumber) mulf_init::$1 in mulf_init::$1 = mulf_init::c#1 & (unumber)1 Adding number conversion cast (unumber) 0 in mulf_init::$2 = mulf_init::$1 == 0 Adding number conversion cast (unumber) $1ff in mulf_init::$7 = mulf_init::sqr2_lo#2 != mulf_sqr2_lo+$1ff Adding number conversion cast (unumber) 0 in mulf_init::$9 = mulf_init::x_255#1 == 0 Adding number conversion cast (unumber) $100 in *(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+$100) Adding number conversion cast (unumber) $1ff in *(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+(unumber)$100) Adding number conversion cast (unumber) $100 in *(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+$100) Adding number conversion cast (unumber) $1ff in *(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+(unumber)$100) Adding number conversion cast (unumber) 1 in mulf_init::dir#1 = 1 Successful SSA optimization PassNAddNumberTypeConversions Inlining cast mulf_init::dir#1 = (unumber)1 Successful SSA optimization Pass2InlineCast Simplifying constant pointer cast (unsigned int *) 248 Simplifying constant pointer cast (unsigned int *) 250 Simplifying constant pointer cast (unsigned long *) 252 Simplifying constant pointer cast (char *) 53266 Simplifying constant pointer cast (char *) 53280 Simplifying constant pointer cast (char *) 1024 Simplifying constant integer cast 4 Simplifying constant integer cast $f Simplifying constant integer cast $ff Simplifying constant integer cast 1 Simplifying constant integer cast 1 Simplifying constant integer cast $200 Simplifying constant integer cast 1 Simplifying constant integer cast 0 Simplifying constant integer cast -1 Simplifying constant integer cast $1ff Simplifying constant integer cast 0 Simplifying constant integer cast $100 Simplifying constant integer cast $1ff Simplifying constant integer cast $100 Simplifying constant integer cast $1ff Simplifying constant integer cast 1 Simplifying constant pointer cast (char *) 1024 Successful SSA optimization PassNCastSimplification Finalized unsigned number type (char) 4 Finalized unsigned number type (char) $f Finalized unsigned number type (char) $ff Finalized unsigned number type (char) 1 Finalized unsigned number type (char) 1 Finalized unsigned number type (unsigned int) $200 Finalized unsigned number type (char) 1 Finalized unsigned number type (char) 0 Finalized unsigned number type (unsigned int) $1ff Finalized unsigned number type (char) 0 Finalized unsigned number type (unsigned int) $100 Finalized unsigned number type (unsigned int) $1ff Finalized unsigned number type (unsigned int) $100 Finalized unsigned number type (unsigned int) $1ff Finalized unsigned number type (char) 1 Successful SSA optimization PassNFinalizeNumberTypeConversions Inferred type updated to char in print_uchar::$2 = print_uchar::b#3 & $f Inferred type updated to char in mulf_init::$1 = mulf_init::c#1 & 1 Inversing boolean not [102] mulf_init::$3 = mulf_init::$1 != 0 from [101] mulf_init::$2 = mulf_init::$1 == 0 Inversing boolean not [130] mulf_init::$10 = mulf_init::x_255#1 != 0 from [129] mulf_init::$9 = mulf_init::x_255#1 == 0 Successful SSA optimization Pass2UnaryNotSimplification Alias print_uchar::b#0 = print_uint::$0 Alias print_uint::w#2 = print_uint::w#3 Alias print_char_cursor#0 = print_char_cursor#19 Alias print_uchar::b#1 = print_uint::$2 Alias print_char_cursor#1 = print_char_cursor#20 print_char_cursor#21 print_char_cursor#2 Alias print_uint::w#0 = print_ulong::$0 Alias print_ulong::dw#1 = print_ulong::dw#2 Alias print_char_cursor#22 = print_char_cursor#3 Alias print_uint::w#1 = print_ulong::$2 Alias print_char_cursor#23 = print_char_cursor#4 print_char_cursor#24 print_char_cursor#5 Alias print_uchar::b#2 = print_uchar::b#3 Alias print_char_cursor#25 = print_char_cursor#6 Alias print_char_cursor#26 = print_char_cursor#7 print_char_cursor#27 print_char_cursor#8 Alias print_char_cursor#10 = print_char_cursor#29 print_char_cursor#9 Alias print_screen#0 = print_line_cursor#0 print_char_cursor#11 print_screen#7 print_line_cursor#7 print_char_cursor#30 print_screen#1 print_line_cursor#1 print_char_cursor#12 Alias print_char_cursor#42 = print_char_cursor#44 Alias print_screen#15 = print_screen#17 Alias print_line_cursor#15 = print_line_cursor#17 Alias print_char_cursor#39 = print_char_cursor#43 print_char_cursor#45 Alias print_screen#12 = print_screen#18 print_screen#19 print_screen#16 Alias print_line_cursor#12 = print_line_cursor#18 print_line_cursor#19 print_line_cursor#16 Alias mulf16u::return#0 = mulf16u::return#3 Alias print_char_cursor#13 = print_char_cursor#31 Alias print_screen#2 = print_screen#8 Alias print_line_cursor#2 = print_line_cursor#8 Alias print_char_cursor#14 = print_char_cursor#32 Alias print_char_cursor#15 = print_char_cursor#33 print_char_cursor#40 Alias print_screen#13 = print_screen#9 print_screen#3 Alias print_line_cursor#13 = print_line_cursor#9 print_line_cursor#3 Alias mulf_init::c#2 = mulf_init::c#3 Alias mulf_init::sqr#4 = mulf_init::sqr#5 mulf_init::sqr#6 Alias mulf_init::sqr1_lo#2 = mulf_init::sqr1_lo#4 mulf_init::sqr1_lo#5 Alias mulf_init::sqr1_hi#3 = mulf_init::sqr1_hi#5 mulf_init::sqr1_hi#4 Alias mulf_init::x_2#3 = mulf_init::x_2#4 mulf_init::x_2#5 Alias mulf_init::sqr#1 = mulf_init::$6 Alias mulf_init::c#1 = mulf_init::c#5 Alias mulf_init::x_255#2 = mulf_init::x_255#3 Alias mulf_init::sqr2_lo#2 = mulf_init::sqr2_lo#3 mulf_init::sqr2_lo#5 Alias mulf_init::sqr2_hi#2 = mulf_init::sqr2_hi#3 Alias mulf_init::dir#2 = mulf_init::dir#3 Alias mulf_init::x_255#1 = mulf_init::$8 mulf_init::x_255#5 Alias mulf_init::sqr2_hi#1 = mulf_init::sqr2_hi#5 Alias mulf16u::return#1 = mulf16u::return#4 mulf16u::return#2 Alias print_char_cursor#16 = print_line_cursor#4 print_screen#4 print_char_cursor#41 print_screen#14 print_line_cursor#14 Alias print_char_cursor#17 = print_char_cursor#34 print_char_cursor#35 print_char_cursor#18 Alias print_screen#10 = print_screen#5 print_screen#11 print_screen#6 Alias print_line_cursor#10 = print_line_cursor#5 print_line_cursor#11 print_line_cursor#6 Successful SSA optimization Pass2AliasElimination Alias mulf_init::sqr1_lo#2 = mulf_init::sqr1_lo#3 Alias mulf_init::sqr1_hi#2 = mulf_init::sqr1_hi#3 Alias mulf_init::c#1 = mulf_init::c#4 Alias mulf_init::sqr2_lo#2 = mulf_init::sqr2_lo#4 Alias mulf_init::x_255#1 = mulf_init::x_255#4 Alias mulf_init::sqr2_hi#1 = mulf_init::sqr2_hi#4 Successful SSA optimization Pass2AliasElimination Identical Phi Values print_char_cursor#0 print_char_cursor#26 Identical Phi Values print_char_cursor#1 print_char_cursor#26 Identical Phi Values print_ulong::dw#1 print_ulong::dw#0 Identical Phi Values print_char_cursor#37 print_char_cursor#39 Identical Phi Values print_char_cursor#22 print_char_cursor#1 Identical Phi Values print_char_cursor#23 print_char_cursor#1 Identical Phi Values print_char_cursor#25 print_char_cursor#10 Identical Phi Values print_char_cursor#26 print_char_cursor#10 Identical Phi Values print_set_screen::screen#1 print_set_screen::screen#0 Identical Phi Values print_char_cursor#42 print_char_cursor#16 Identical Phi Values print_screen#15 print_char_cursor#16 Identical Phi Values print_line_cursor#15 print_char_cursor#16 Identical Phi Values print_char_cursor#39 print_char_cursor#15 Identical Phi Values print_screen#12 print_screen#13 Identical Phi Values print_line_cursor#12 print_line_cursor#13 Identical Phi Values print_char_cursor#13 print_char_cursor#23 Identical Phi Values print_screen#2 print_screen#0 Identical Phi Values print_line_cursor#2 print_screen#0 Identical Phi Values print_char_cursor#14 print_screen#0 Identical Phi Values mulf16u::a#1 mulf16u::a#0 Identical Phi Values mulf16u::b#1 mulf16u::b#0 Identical Phi Values print_char_cursor#17 print_char_cursor#15 Identical Phi Values print_screen#10 print_screen#13 Identical Phi Values print_line_cursor#10 print_line_cursor#13 Successful SSA optimization Pass2IdenticalPhiElimination Simple Condition main::$1 [40] if(*RASTER!=$ff) goto main::@2 Simple Condition mulf_init::$0 [62] if(mulf_init::sqr1_lo#2!=mulf_sqr1_lo+$200) goto mulf_init::@2 Simple Condition mulf_init::$3 [66] if(mulf_init::$1!=0) goto mulf_init::@4 Simple Condition mulf_init::$7 [83] if(mulf_init::sqr2_lo#2!=mulf_sqr2_lo+$1ff) goto mulf_init::@7 Simple Condition mulf_init::$10 [89] if(mulf_init::x_255#1!=0) goto mulf_init::@9 Successful SSA optimization Pass2ConditionalJumpSimplification Constant mulf16u::a#0 = main::a Constant mulf16u::b#0 = main::b Constant print_set_screen::screen#0 = SCREEN Constant mulf_init::sqr#0 = 0 Constant mulf_init::x_2#0 = 0 Constant mulf_init::c#0 = 0 Constant mulf_init::sqr1_hi#0 = mulf_sqr1_hi+1 Constant mulf_init::sqr1_lo#0 = mulf_sqr1_lo+1 Constant mulf_init::x_255#0 = -1 Constant mulf_init::dir#0 = $ff Constant mulf_init::sqr2_hi#0 = mulf_sqr2_hi Constant mulf_init::sqr2_lo#0 = mulf_sqr2_lo Constant mulf_init::dir#1 = 1 Constant print_char_cursor#16 = (char *) 1024 Successful SSA optimization Pass2ConstantIdentification Constant print_screen#0 = print_set_screen::screen#0 Successful SSA optimization Pass2ConstantIdentification if() condition always true - replacing block destination [37] if(true) goto main::@2 Successful SSA optimization Pass2ConstantIfs Removing unused block main::@return Successful SSA optimization Pass2EliminateUnusedBlocks Eliminating unused variable - keeping the phi block print_screen#13 Eliminating unused variable - keeping the phi block print_line_cursor#13 Successful SSA optimization PassNEliminateUnusedVars Removing unused procedure __start Removing unused procedure block __start Removing unused procedure block __start::__init1 Removing unused procedure block __start::@1 Removing unused procedure block __start::@2 Removing unused procedure block __start::@return Successful SSA optimization PassNEliminateEmptyStart Inlining constant with var siblings mulf_init::sqr#0 Inlining constant with var siblings mulf_init::x_2#0 Inlining constant with var siblings mulf_init::c#0 Inlining constant with var siblings mulf_init::sqr1_hi#0 Inlining constant with var siblings mulf_init::sqr1_lo#0 Inlining constant with var siblings mulf_init::x_255#0 Inlining constant with var siblings mulf_init::dir#0 Inlining constant with var siblings mulf_init::sqr2_hi#0 Inlining constant with var siblings mulf_init::sqr2_lo#0 Inlining constant with var siblings mulf_init::dir#1 Inlining constant with var siblings print_char_cursor#16 Constant inlined mulf_init::c#0 = 0 Constant inlined mulf_init::sqr2_lo#0 = mulf_sqr2_lo Constant inlined mulf_init::sqr#0 = 0 Constant inlined mulf16u::b#0 = main::b Constant inlined mulf_init::sqr2_hi#0 = mulf_sqr2_hi Constant inlined mulf16u::a#0 = main::a Constant inlined print_screen#0 = SCREEN Constant inlined mulf_init::dir#1 = 1 Constant inlined mulf_init::dir#0 = $ff Constant inlined mulf_init::sqr1_hi#0 = mulf_sqr1_hi+1 Constant inlined print_set_screen::screen#0 = SCREEN Constant inlined mulf_init::sqr1_lo#0 = mulf_sqr1_lo+1 Constant inlined mulf_init::x_255#0 = -1 Constant inlined print_char_cursor#16 = (char *) 1024 Constant inlined mulf_init::x_2#0 = 0 Successful SSA optimization Pass2ConstantInlining Removing call to empty/unused procedure [35] call print_set_screen Removing unused procedure print_set_screen Removing unused procedure block print_set_screen Removing unused procedure block print_set_screen::@return Successful SSA optimization PassNEliminateEmptyProcedure Finalized unsigned number type (char) 2 Finalized unsigned number type (char) 8 Finalized unsigned number type (char) $a Finalized unsigned number type (char) $10 Finalized unsigned number type (unsigned int) $200 Finalized unsigned number type (unsigned int) $200 Finalized unsigned number type (unsigned int) $200 Finalized unsigned number type (unsigned int) $200 Finalized unsigned number type (unsigned int) $200 Finalized unsigned number type (unsigned int) $200 Finalized unsigned number type (unsigned int) $200 Finalized unsigned number type (unsigned int) $200 Successful SSA optimization PassNFinalizeNumberTypeConversions Added new block during phi lifting mulf_init::@11(between mulf_init::@2 and mulf_init::@4) Added new block during phi lifting mulf_init::@12(between mulf_init::@7 and mulf_init::@9) Adding NOP phi() at start of main Adding NOP phi() at start of main::@6 Adding NOP phi() at start of main::@7 Adding NOP phi() at start of mulf_init Adding NOP phi() at start of mulf_init::@3 Adding NOP phi() at start of mulf_init::@10 Adding NOP phi() at start of print_ulong::@2 Adding NOP phi() at start of print_uint::@2 Adding NOP phi() at start of print_uchar::@2 CALL GRAPH Calls in [main] to mulf_init:1 mulf16u:6 print_ulong:11 Calls in [print_ulong] to print_uint:66 print_uint:70 Calls in [print_uint] to print_uchar:77 print_uchar:81 Calls in [print_uchar] to print_char:89 print_char:94 Created 19 initial phi equivalence classes Coalesced [31] mulf_init::sqr2_lo#6 = mulf_init::sqr2_lo#1 Coalesced [32] mulf_init::x_255#6 = mulf_init::x_255#1 Coalesced [33] mulf_init::sqr2_hi#6 = mulf_init::sqr2_hi#1 Coalesced [34] mulf_init::dir#5 = mulf_init::dir#4 Coalesced (already) [35] mulf_init::dir#6 = mulf_init::dir#2 Coalesced [41] mulf_init::sqr#9 = mulf_init::sqr#2 Coalesced [42] mulf_init::x_2#8 = mulf_init::x_2#1 Coalesced [51] mulf_init::sqr1_lo#6 = mulf_init::sqr1_lo#1 Coalesced [52] mulf_init::c#6 = mulf_init::c#1 Coalesced [53] mulf_init::sqr#7 = mulf_init::sqr#1 Coalesced [54] mulf_init::sqr1_hi#6 = mulf_init::sqr1_hi#1 Coalesced [55] mulf_init::x_2#6 = mulf_init::x_2#2 Coalesced [56] mulf_init::sqr#8 = mulf_init::sqr#4 Coalesced (already) [57] mulf_init::x_2#7 = mulf_init::x_2#3 Coalesced [64] print_uint::w#4 = print_uint::w#0 Coalesced [65] print_char_cursor#46 = print_char_cursor#15 Coalesced [68] print_uint::w#5 = print_uint::w#1 Coalesced [69] print_char_cursor#47 = print_char_cursor#10 Coalesced [75] print_uchar::b#4 = print_uchar::b#0 Coalesced [76] print_char_cursor#48 = print_char_cursor#36 Coalesced [79] print_uchar::b#5 = print_uchar::b#1 Coalesced (already) [80] print_char_cursor#49 = print_char_cursor#10 Coalesced [87] print_char::ch#3 = print_char::ch#0 Coalesced [88] print_char_cursor#50 = print_char_cursor#38 Coalesced [92] print_char::ch#4 = print_char::ch#1 Coalesced (already) [93] print_char_cursor#51 = print_char_cursor#10 Coalesced down to 13 phi equivalence classes Culled Empty Block label main::@6 Culled Empty Block label main::@7 Culled Empty Block label mulf_init::@3 Culled Empty Block label mulf_init::@10 Culled Empty Block label mulf_init::@11 Culled Empty Block label print_ulong::@2 Culled Empty Block label print_uint::@2 Culled Empty Block label print_uchar::@2 Renumbering block mulf_init::@4 to mulf_init::@3 Renumbering block mulf_init::@5 to mulf_init::@4 Renumbering block mulf_init::@6 to mulf_init::@5 Renumbering block mulf_init::@7 to mulf_init::@6 Renumbering block mulf_init::@8 to mulf_init::@7 Renumbering block mulf_init::@9 to mulf_init::@8 Renumbering block mulf_init::@12 to mulf_init::@9 Adding NOP phi() at start of main Adding NOP phi() at start of mulf_init Adding NOP phi() at start of mulf_init::@9 FINAL CONTROL FLOW GRAPH void main() main: scope:[main] from [0] phi() [1] call mulf_init to:main::@4 main::@4: scope:[main] from main asm { sei } to:main::@1 main::@1: scope:[main] from main::@4 main::@5 [3] print_char_cursor#15 = phi( main::@4/(char *) 1024, main::@5/SCREEN ) to:main::@2 main::@2: scope:[main] from main::@1 main::@2 [4] if(*RASTER!=$ff) goto main::@2 to:main::@3 main::@3: scope:[main] from main::@2 [5] *BORDER_COLOR = ++ *BORDER_COLOR [6] call mulf16u [7] mulf16u::return#0 = mulf16u::return#1 to:main::@5 main::@5: scope:[main] from main::@3 [8] main::r#0 = mulf16u::return#0 [9] *BORDER_COLOR = -- *BORDER_COLOR [10] print_ulong::dw#0 = main::r#0 [11] call print_ulong to:main::@1 void mulf_init() mulf_init: scope:[mulf_init] from main [12] phi() to:mulf_init::@1 mulf_init::@1: scope:[mulf_init] from mulf_init mulf_init::@3 [13] mulf_init::x_2#3 = phi( mulf_init/0, mulf_init::@3/mulf_init::x_2#2 ) [13] mulf_init::sqr1_hi#2 = phi( mulf_init/mulf_sqr1_hi+1, mulf_init::@3/mulf_init::sqr1_hi#1 ) [13] mulf_init::sqr#4 = phi( mulf_init/0, mulf_init::@3/mulf_init::sqr#1 ) [13] mulf_init::c#2 = phi( mulf_init/0, mulf_init::@3/mulf_init::c#1 ) [13] mulf_init::sqr1_lo#2 = phi( mulf_init/mulf_sqr1_lo+1, mulf_init::@3/mulf_init::sqr1_lo#1 ) [14] if(mulf_init::sqr1_lo#2!=mulf_sqr1_lo+$200) goto mulf_init::@2 to:mulf_init::@5 mulf_init::@5: scope:[mulf_init] from mulf_init::@1 mulf_init::@8 [15] mulf_init::dir#2 = phi( mulf_init::@1/$ff, mulf_init::@8/mulf_init::dir#4 ) [15] mulf_init::sqr2_hi#2 = phi( mulf_init::@1/mulf_sqr2_hi, mulf_init::@8/mulf_init::sqr2_hi#1 ) [15] mulf_init::x_255#2 = phi( mulf_init::@1/-1, mulf_init::@8/mulf_init::x_255#1 ) [15] mulf_init::sqr2_lo#2 = phi( mulf_init::@1/mulf_sqr2_lo, mulf_init::@8/mulf_init::sqr2_lo#1 ) [16] if(mulf_init::sqr2_lo#2!=mulf_sqr2_lo+$1ff) goto mulf_init::@6 to:mulf_init::@7 mulf_init::@7: scope:[mulf_init] from mulf_init::@5 [17] *(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+$100) [18] *(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+$100) to:mulf_init::@return mulf_init::@return: scope:[mulf_init] from mulf_init::@7 [19] return to:@return mulf_init::@6: scope:[mulf_init] from mulf_init::@5 [20] *mulf_init::sqr2_lo#2 = mulf_sqr1_lo[mulf_init::x_255#2] [21] *mulf_init::sqr2_hi#2 = mulf_sqr1_hi[mulf_init::x_255#2] [22] mulf_init::sqr2_hi#1 = ++ mulf_init::sqr2_hi#2 [23] mulf_init::x_255#1 = mulf_init::x_255#2 + mulf_init::dir#2 [24] if(mulf_init::x_255#1!=0) goto mulf_init::@9 to:mulf_init::@8 mulf_init::@9: scope:[mulf_init] from mulf_init::@6 [25] phi() to:mulf_init::@8 mulf_init::@8: scope:[mulf_init] from mulf_init::@6 mulf_init::@9 [26] mulf_init::dir#4 = phi( mulf_init::@6/1, mulf_init::@9/mulf_init::dir#2 ) [27] mulf_init::sqr2_lo#1 = ++ mulf_init::sqr2_lo#2 to:mulf_init::@5 mulf_init::@2: scope:[mulf_init] from mulf_init::@1 [28] mulf_init::c#1 = ++ mulf_init::c#2 [29] mulf_init::$1 = mulf_init::c#1 & 1 [30] if(mulf_init::$1!=0) goto mulf_init::@3 to:mulf_init::@4 mulf_init::@4: scope:[mulf_init] from mulf_init::@2 [31] mulf_init::x_2#1 = ++ mulf_init::x_2#3 [32] mulf_init::sqr#2 = ++ mulf_init::sqr#4 to:mulf_init::@3 mulf_init::@3: scope:[mulf_init] from mulf_init::@2 mulf_init::@4 [33] mulf_init::x_2#2 = phi( mulf_init::@2/mulf_init::x_2#3, mulf_init::@4/mulf_init::x_2#1 ) [33] mulf_init::sqr#3 = phi( mulf_init::@2/mulf_init::sqr#4, mulf_init::@4/mulf_init::sqr#2 ) [34] mulf_init::$4 = byte0 mulf_init::sqr#3 [35] *mulf_init::sqr1_lo#2 = mulf_init::$4 [36] mulf_init::$5 = byte1 mulf_init::sqr#3 [37] *mulf_init::sqr1_hi#2 = mulf_init::$5 [38] mulf_init::sqr1_hi#1 = ++ mulf_init::sqr1_hi#2 [39] mulf_init::sqr#1 = mulf_init::sqr#3 + mulf_init::x_2#2 [40] mulf_init::sqr1_lo#1 = ++ mulf_init::sqr1_lo#2 to:mulf_init::@1 unsigned long mulf16u(unsigned int a , unsigned int b) mulf16u: scope:[mulf16u] from main::@3 [41] *mulf16u::memA = main::a [42] *mulf16u::memB = main::b 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 !: } [44] mulf16u::return#1 = *mulf16u::memR to:mulf16u::@return mulf16u::@return: scope:[mulf16u] from mulf16u [45] return to:@return void print_ulong(unsigned long dw) print_ulong: scope:[print_ulong] from main::@5 [46] print_uint::w#0 = word1 print_ulong::dw#0 [47] call print_uint to:print_ulong::@1 print_ulong::@1: scope:[print_ulong] from print_ulong [48] print_uint::w#1 = word0 print_ulong::dw#0 [49] call print_uint to:print_ulong::@return print_ulong::@return: scope:[print_ulong] from print_ulong::@1 [50] return to:@return void print_uint(unsigned int w) print_uint: scope:[print_uint] from print_ulong print_ulong::@1 [51] print_char_cursor#36 = phi( print_ulong/print_char_cursor#15, print_ulong::@1/print_char_cursor#10 ) [51] print_uint::w#2 = phi( print_ulong/print_uint::w#0, print_ulong::@1/print_uint::w#1 ) [52] print_uchar::b#0 = byte1 print_uint::w#2 [53] call print_uchar to:print_uint::@1 print_uint::@1: scope:[print_uint] from print_uint [54] print_uchar::b#1 = byte0 print_uint::w#2 [55] call print_uchar to:print_uint::@return print_uint::@return: scope:[print_uint] from print_uint::@1 [56] return to:@return void print_uchar(char b) print_uchar: scope:[print_uchar] from print_uint print_uint::@1 [57] print_char_cursor#38 = phi( print_uint/print_char_cursor#36, print_uint::@1/print_char_cursor#10 ) [57] print_uchar::b#2 = phi( print_uint/print_uchar::b#0, print_uint::@1/print_uchar::b#1 ) [58] print_uchar::$0 = print_uchar::b#2 >> 4 [59] print_char::ch#0 = print_hextab[print_uchar::$0] [60] call print_char to:print_uchar::@1 print_uchar::@1: scope:[print_uchar] from print_uchar [61] print_uchar::$2 = print_uchar::b#2 & $f [62] print_char::ch#1 = print_hextab[print_uchar::$2] [63] call print_char to:print_uchar::@return print_uchar::@return: scope:[print_uchar] from print_uchar::@1 [64] return to:@return void print_char(char ch) print_char: scope:[print_char] from print_uchar print_uchar::@1 [65] print_char_cursor#28 = phi( print_uchar/print_char_cursor#38, print_uchar::@1/print_char_cursor#10 ) [65] print_char::ch#2 = phi( print_uchar/print_char::ch#0, print_uchar::@1/print_char::ch#1 ) [66] *print_char_cursor#28 = print_char::ch#2 [67] print_char_cursor#10 = ++ print_char_cursor#28 to:print_char::@return print_char::@return: scope:[print_char] from print_char [68] return to:@return VARIABLE REGISTER WEIGHTS void main() unsigned long main::r unsigned long main::r#0 // 11.0 unsigned long mulf16u(unsigned int a , unsigned int b) unsigned int mulf16u::a unsigned int mulf16u::b unsigned long mulf16u::return unsigned long mulf16u::return#0 // 22.0 unsigned long mulf16u::return#1 // 37.33333333333333 void mulf_init() char mulf_init::$1 // 202.0 char mulf_init::$4 // 202.0 char mulf_init::$5 // 202.0 char mulf_init::c char mulf_init::c#1 // 23.307692307692307 char mulf_init::c#2 // 101.0 char mulf_init::dir char mulf_init::dir#2 // 37.875 char mulf_init::dir#4 // 101.0 unsigned int mulf_init::sqr unsigned int mulf_init::sqr#1 // 101.0 unsigned int mulf_init::sqr#2 // 202.0 unsigned int mulf_init::sqr#3 // 84.16666666666666 unsigned int mulf_init::sqr#4 // 50.5 char *mulf_init::sqr1_hi char *mulf_init::sqr1_hi#1 // 67.33333333333333 char *mulf_init::sqr1_hi#2 // 25.25 char *mulf_init::sqr1_lo char *mulf_init::sqr1_lo#1 // 202.0 char *mulf_init::sqr1_lo#2 // 28.857142857142858 char *mulf_init::sqr2_hi char *mulf_init::sqr2_hi#1 // 33.666666666666664 char *mulf_init::sqr2_hi#2 // 75.75 char *mulf_init::sqr2_lo char *mulf_init::sqr2_lo#1 // 202.0 char *mulf_init::sqr2_lo#2 // 44.888888888888886 char mulf_init::x_2 char mulf_init::x_2#1 // 101.0 char mulf_init::x_2#2 // 50.5 char mulf_init::x_2#3 // 60.599999999999994 char mulf_init::x_255 char mulf_init::x_255#1 // 60.599999999999994 char mulf_init::x_255#2 // 80.8 void print_char(char ch) char print_char::ch char print_char::ch#0 // 20002.0 char print_char::ch#1 // 20002.0 char print_char::ch#2 // 120003.0 char *print_char_cursor char *print_char_cursor#10 // 8546.461538461539 char *print_char_cursor#15 // 11.222222222222221 char *print_char_cursor#28 // 110002.0 char *print_char_cursor#36 // 601.5 char *print_char_cursor#38 // 4001.0 char *print_line_cursor char *print_screen void print_uchar(char b) char print_uchar::$0 // 20002.0 char print_uchar::$2 // 20002.0 char print_uchar::b char print_uchar::b#0 // 2002.0 char print_uchar::b#1 // 2002.0 char print_uchar::b#2 // 5501.0 void print_uint(unsigned int w) unsigned int print_uint::w unsigned int print_uint::w#0 // 202.0 unsigned int print_uint::w#1 // 202.0 unsigned int print_uint::w#2 // 734.6666666666667 void print_ulong(unsigned long dw) unsigned long print_ulong::dw unsigned long print_ulong::dw#0 // 71.0 Initial phi equivalence classes [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] [ mulf_init::c#2 mulf_init::c#1 ] [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] [ mulf_init::x_255#2 mulf_init::x_255#1 ] [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] [ mulf_init::dir#2 mulf_init::dir#4 ] [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] [ print_uint::w#2 print_uint::w#0 print_uint::w#1 ] [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ] [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 ] Added variable mulf16u::return#0 to live range equivalence class [ mulf16u::return#0 ] Added variable main::r#0 to live range equivalence class [ main::r#0 ] Added variable print_ulong::dw#0 to live range equivalence class [ print_ulong::dw#0 ] Added variable mulf_init::$1 to live range equivalence class [ mulf_init::$1 ] Added variable mulf_init::$4 to live range equivalence class [ mulf_init::$4 ] Added variable mulf_init::$5 to live range equivalence class [ mulf_init::$5 ] Added variable mulf16u::return#1 to live range equivalence class [ mulf16u::return#1 ] Added variable print_uchar::$0 to live range equivalence class [ print_uchar::$0 ] Added variable print_uchar::$2 to live range equivalence class [ print_uchar::$2 ] Complete equivalence classes [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] [ mulf_init::c#2 mulf_init::c#1 ] [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] [ mulf_init::x_255#2 mulf_init::x_255#1 ] [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] [ mulf_init::dir#2 mulf_init::dir#4 ] [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] [ print_uint::w#2 print_uint::w#0 print_uint::w#1 ] [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ] [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 ] [ mulf16u::return#0 ] [ main::r#0 ] [ print_ulong::dw#0 ] [ mulf_init::$1 ] [ mulf_init::$4 ] [ mulf_init::$5 ] [ mulf16u::return#1 ] [ print_uchar::$0 ] [ print_uchar::$2 ] Allocated zp[1]:2 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ] Allocated zp[2]:3 [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 ] Allocated zp[1]:5 [ print_uchar::$0 ] Allocated zp[1]:6 [ print_uchar::$2 ] Allocated zp[1]:7 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] Allocated zp[2]:8 [ print_uint::w#2 print_uint::w#0 print_uint::w#1 ] Allocated zp[2]:10 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] Allocated zp[2]:12 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] Allocated zp[2]:14 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] Allocated zp[1]:16 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] Allocated zp[1]:17 [ mulf_init::$1 ] Allocated zp[1]:18 [ mulf_init::$4 ] Allocated zp[1]:19 [ mulf_init::$5 ] Allocated zp[1]:20 [ mulf_init::x_255#2 mulf_init::x_255#1 ] Allocated zp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ] Allocated zp[1]:22 [ mulf_init::c#2 mulf_init::c#1 ] Allocated zp[2]:23 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] Allocated zp[2]:25 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] Allocated zp[4]:27 [ print_ulong::dw#0 ] Allocated zp[4]:31 [ mulf16u::return#1 ] Allocated zp[4]:35 [ mulf16u::return#0 ] Allocated zp[4]:39 [ main::r#0 ] REGISTER UPLIFT POTENTIAL REGISTERS Statement [4] if(*RASTER!=$ff) goto main::@2 [ print_char_cursor#15 ] ( [ print_char_cursor#15 ] { } ) always clobbers reg byte a Statement [7] mulf16u::return#0 = mulf16u::return#1 [ print_char_cursor#15 mulf16u::return#0 ] ( [ print_char_cursor#15 mulf16u::return#0 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) always clobbers reg byte a Statement [8] main::r#0 = mulf16u::return#0 [ print_char_cursor#15 main::r#0 ] ( [ print_char_cursor#15 main::r#0 ] { { print_ulong::dw#0 = main::r#0 } } ) always clobbers reg byte a Statement [10] print_ulong::dw#0 = main::r#0 [ print_char_cursor#15 print_ulong::dw#0 ] ( [ print_char_cursor#15 print_ulong::dw#0 ] { { print_ulong::dw#0 = main::r#0 } } ) always clobbers reg byte a Statement [14] if(mulf_init::sqr1_lo#2!=mulf_sqr1_lo+$200) goto mulf_init::@2 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ( mulf_init:1 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] { } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:22 [ mulf_init::c#2 mulf_init::c#1 ] Removing always clobbered register reg byte a as potential for zp[1]:16 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] Statement [16] if(mulf_init::sqr2_lo#2!=mulf_sqr2_lo+$1ff) goto mulf_init::@6 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( mulf_init:1 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] { } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:20 [ mulf_init::x_255#2 mulf_init::x_255#1 ] Removing always clobbered register reg byte a as potential for zp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ] Statement [17] *(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+$100) [ ] ( mulf_init:1 [ ] { } ) always clobbers reg byte a Statement [18] *(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+$100) [ ] ( mulf_init:1 [ ] { } ) always clobbers reg byte a Statement [20] *mulf_init::sqr2_lo#2 = mulf_sqr1_lo[mulf_init::x_255#2] [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( mulf_init:1 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] { } ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte y as potential for zp[1]:20 [ mulf_init::x_255#2 mulf_init::x_255#1 ] Removing always clobbered register reg byte y as potential for zp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ] Statement [21] *mulf_init::sqr2_hi#2 = mulf_sqr1_hi[mulf_init::x_255#2] [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( mulf_init:1 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] { } ) always clobbers reg byte a reg byte y Statement [23] mulf_init::x_255#1 = mulf_init::x_255#2 + mulf_init::dir#2 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] ( mulf_init:1 [ 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 [29] mulf_init::$1 = mulf_init::c#1 & 1 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$1 ] ( mulf_init:1 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$1 ] { } ) always clobbers reg byte a Statement [35] *mulf_init::sqr1_lo#2 = mulf_init::$4 [ 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:1 [ 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[1]:22 [ mulf_init::c#2 mulf_init::c#1 ] Removing always clobbered register reg byte y as potential for zp[1]:16 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] Statement [37] *mulf_init::sqr1_hi#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:1 [ 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 [39] mulf_init::sqr#1 = mulf_init::sqr#3 + 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 ] ( mulf_init:1 [ 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 [41] *mulf16u::memA = main::a [ ] ( mulf16u:6 [ print_char_cursor#15 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) always clobbers reg byte a Statement [42] *mulf16u::memB = main::b [ ] ( mulf16u:6 [ print_char_cursor#15 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) 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 [44] mulf16u::return#1 = *mulf16u::memR [ mulf16u::return#1 ] ( mulf16u:6 [ print_char_cursor#15 mulf16u::return#1 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) always clobbers reg byte a Statement [46] print_uint::w#0 = word1 print_ulong::dw#0 [ print_char_cursor#15 print_ulong::dw#0 print_uint::w#0 ] ( print_ulong:11 [ print_char_cursor#15 print_ulong::dw#0 print_uint::w#0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } } ) always clobbers reg byte a Statement [48] print_uint::w#1 = word0 print_ulong::dw#0 [ print_uint::w#1 print_char_cursor#10 ] ( print_ulong:11 [ print_uint::w#1 print_char_cursor#10 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 } } ) always clobbers reg byte a Statement [58] print_uchar::$0 = print_uchar::b#2 >> 4 [ print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] ( print_ulong:11::print_uint:47::print_uchar:53 [ print_ulong::dw#0 print_uint::w#2 print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:53 [ print_uint::w#2 print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55 [ print_ulong::dw#0 print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55 [ print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:7 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] Statement [61] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#10 print_uchar::$2 ] ( print_ulong:11::print_uint:47::print_uchar:53 [ print_ulong::dw#0 print_uint::w#2 print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#10 = print_char_cursor#28 } } print_ulong:11::print_uint:49::print_uchar:53 [ print_uint::w#2 print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55 [ print_ulong::dw#0 print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55 [ print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } ) always clobbers reg byte a Statement [66] *print_char_cursor#28 = print_char::ch#2 [ print_char_cursor#28 ] ( print_ulong:11::print_uint:47::print_uchar:53::print_char:60 [ print_ulong::dw#0 print_uint::w#2 print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:53::print_char:60 [ print_uint::w#2 print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55::print_char:60 [ print_ulong::dw#0 print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55::print_char:60 [ print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:53::print_char:63 [ print_ulong::dw#0 print_uint::w#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#10 = print_char_cursor#28 } } print_ulong:11::print_uint:49::print_uchar:53::print_char:63 [ print_uint::w#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55::print_char:63 [ print_ulong::dw#0 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55::print_char:63 [ print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } ) always clobbers reg byte y Removing always clobbered register reg byte y as potential for zp[1]:7 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] Statement [4] if(*RASTER!=$ff) goto main::@2 [ print_char_cursor#15 ] ( [ print_char_cursor#15 ] { } ) always clobbers reg byte a Statement [7] mulf16u::return#0 = mulf16u::return#1 [ print_char_cursor#15 mulf16u::return#0 ] ( [ print_char_cursor#15 mulf16u::return#0 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) always clobbers reg byte a Statement [8] main::r#0 = mulf16u::return#0 [ print_char_cursor#15 main::r#0 ] ( [ print_char_cursor#15 main::r#0 ] { { print_ulong::dw#0 = main::r#0 } } ) always clobbers reg byte a Statement [10] print_ulong::dw#0 = main::r#0 [ print_char_cursor#15 print_ulong::dw#0 ] ( [ print_char_cursor#15 print_ulong::dw#0 ] { { print_ulong::dw#0 = main::r#0 } } ) always clobbers reg byte a Statement [14] if(mulf_init::sqr1_lo#2!=mulf_sqr1_lo+$200) goto mulf_init::@2 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ( mulf_init:1 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] { } ) always clobbers reg byte a Statement [16] if(mulf_init::sqr2_lo#2!=mulf_sqr2_lo+$1ff) goto mulf_init::@6 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( mulf_init:1 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] { } ) always clobbers reg byte a Statement [17] *(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+$100) [ ] ( mulf_init:1 [ ] { } ) always clobbers reg byte a Statement [18] *(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+$100) [ ] ( mulf_init:1 [ ] { } ) always clobbers reg byte a Statement [20] *mulf_init::sqr2_lo#2 = mulf_sqr1_lo[mulf_init::x_255#2] [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( mulf_init:1 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] { } ) always clobbers reg byte a reg byte y Statement [21] *mulf_init::sqr2_hi#2 = mulf_sqr1_hi[mulf_init::x_255#2] [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( mulf_init:1 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] { } ) always clobbers reg byte a reg byte y Statement [23] mulf_init::x_255#1 = mulf_init::x_255#2 + mulf_init::dir#2 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] ( mulf_init:1 [ 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 [29] mulf_init::$1 = mulf_init::c#1 & 1 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$1 ] ( mulf_init:1 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$1 ] { } ) always clobbers reg byte a Statement [35] *mulf_init::sqr1_lo#2 = mulf_init::$4 [ 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:1 [ 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 [37] *mulf_init::sqr1_hi#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:1 [ 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 [39] mulf_init::sqr#1 = mulf_init::sqr#3 + 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 ] ( mulf_init:1 [ 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 [41] *mulf16u::memA = main::a [ ] ( mulf16u:6 [ print_char_cursor#15 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) always clobbers reg byte a Statement [42] *mulf16u::memB = main::b [ ] ( mulf16u:6 [ print_char_cursor#15 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) 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 [44] mulf16u::return#1 = *mulf16u::memR [ mulf16u::return#1 ] ( mulf16u:6 [ print_char_cursor#15 mulf16u::return#1 ] { { mulf16u::return#0 = mulf16u::return#1 } } ) always clobbers reg byte a Statement [46] print_uint::w#0 = word1 print_ulong::dw#0 [ print_char_cursor#15 print_ulong::dw#0 print_uint::w#0 ] ( print_ulong:11 [ print_char_cursor#15 print_ulong::dw#0 print_uint::w#0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } } ) always clobbers reg byte a Statement [48] print_uint::w#1 = word0 print_ulong::dw#0 [ print_uint::w#1 print_char_cursor#10 ] ( print_ulong:11 [ print_uint::w#1 print_char_cursor#10 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 } } ) always clobbers reg byte a Statement [58] print_uchar::$0 = print_uchar::b#2 >> 4 [ print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] ( print_ulong:11::print_uint:47::print_uchar:53 [ print_ulong::dw#0 print_uint::w#2 print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:53 [ print_uint::w#2 print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55 [ print_ulong::dw#0 print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55 [ print_uchar::b#2 print_char_cursor#38 print_uchar::$0 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } ) always clobbers reg byte a Statement [61] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#10 print_uchar::$2 ] ( print_ulong:11::print_uint:47::print_uchar:53 [ print_ulong::dw#0 print_uint::w#2 print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#10 = print_char_cursor#28 } } print_ulong:11::print_uint:49::print_uchar:53 [ print_uint::w#2 print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55 [ print_ulong::dw#0 print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55 [ print_char_cursor#10 print_uchar::$2 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } ) always clobbers reg byte a Statement [66] *print_char_cursor#28 = print_char::ch#2 [ print_char_cursor#28 ] ( print_ulong:11::print_uint:47::print_uchar:53::print_char:60 [ print_ulong::dw#0 print_uint::w#2 print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:53::print_char:60 [ print_uint::w#2 print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55::print_char:60 [ print_ulong::dw#0 print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55::print_char:60 [ print_uchar::b#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:53::print_char:63 [ print_ulong::dw#0 print_uint::w#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 print_char_cursor#38 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#10 = print_char_cursor#28 } } print_ulong:11::print_uint:49::print_uchar:53::print_char:63 [ print_uint::w#2 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:47::print_uchar:55::print_char:63 [ print_ulong::dw#0 print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#0 = print_uint::w#2 } { print_char_cursor#15 = print_char_cursor#36 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#10 = print_char_cursor#38 print_char_cursor#28 } { print_char::ch#1 = print_char::ch#2 } } print_ulong:11::print_uint:49::print_uchar:55::print_char:63 [ print_char_cursor#28 ] { { print_ulong::dw#0 = main::r#0 } { print_uint::w#1 = print_uint::w#2 } { print_char_cursor#10 = print_char_cursor#36 print_char_cursor#38 print_char_cursor#28 } { print_uchar::b#1 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } } ) always clobbers reg byte y Potential registers zp[2]:14 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] : zp[2]:14 , Potential registers zp[1]:22 [ mulf_init::c#2 mulf_init::c#1 ] : zp[1]:22 , reg byte x , Potential registers zp[2]:25 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] : zp[2]:25 , Potential registers zp[1]:16 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] : zp[1]:16 , reg byte x , Potential registers zp[2]:12 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] : zp[2]:12 , Potential registers zp[1]:20 [ mulf_init::x_255#2 mulf_init::x_255#1 ] : zp[1]:20 , reg byte x , Potential registers zp[2]:23 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] : zp[2]:23 , Potential registers zp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ] : zp[1]:21 , reg byte x , Potential registers zp[2]:10 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] : zp[2]:10 , Potential registers zp[2]:8 [ print_uint::w#2 print_uint::w#0 print_uint::w#1 ] : zp[2]:8 , Potential registers zp[1]:7 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] : zp[1]:7 , reg byte x , Potential registers zp[1]:2 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y , Potential registers zp[2]:3 [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 ] : zp[2]:3 , Potential registers zp[4]:35 [ mulf16u::return#0 ] : zp[4]:35 , Potential registers zp[4]:39 [ main::r#0 ] : zp[4]:39 , Potential registers zp[4]:27 [ print_ulong::dw#0 ] : zp[4]:27 , Potential registers zp[1]:17 [ mulf_init::$1 ] : zp[1]:17 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:18 [ mulf_init::$4 ] : zp[1]:18 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:19 [ mulf_init::$5 ] : zp[1]:19 , reg byte a , reg byte x , reg byte y , Potential registers zp[4]:31 [ mulf16u::return#1 ] : zp[4]:31 , Potential registers zp[1]:5 [ print_uchar::$0 ] : zp[1]:5 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:6 [ print_uchar::$2 ] : zp[1]:6 , reg byte a , reg byte x , reg byte y , REGISTER UPLIFT SCOPES Uplift Scope [print_char] 160,007: zp[1]:2 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ] Uplift Scope [] 123,162.18: zp[2]:3 [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 ] Uplift Scope [print_uchar] 20,002: zp[1]:5 [ print_uchar::$0 ] 20,002: zp[1]:6 [ print_uchar::$2 ] 9,505: zp[1]:7 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] Uplift Scope [mulf_init] 437.67: zp[2]:10 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] 246.89: zp[2]:12 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] 230.86: zp[2]:14 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] 212.1: zp[1]:16 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] 202: zp[1]:17 [ mulf_init::$1 ] 202: zp[1]:18 [ mulf_init::$4 ] 202: zp[1]:19 [ mulf_init::$5 ] 141.4: zp[1]:20 [ mulf_init::x_255#2 mulf_init::x_255#1 ] 138.88: zp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ] 124.31: zp[1]:22 [ mulf_init::c#2 mulf_init::c#1 ] 109.42: zp[2]:23 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] 92.58: zp[2]:25 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] Uplift Scope [print_uint] 1,138.67: zp[2]:8 [ print_uint::w#2 print_uint::w#0 print_uint::w#1 ] Uplift Scope [print_ulong] 71: zp[4]:27 [ print_ulong::dw#0 ] Uplift Scope [mulf16u] 37.33: zp[4]:31 [ mulf16u::return#1 ] 22: zp[4]:35 [ mulf16u::return#0 ] Uplift Scope [main] 11: zp[4]:39 [ main::r#0 ] Uplift Scope [RADIX] Uplifting [print_char] best 6155 combination reg byte a [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ] Uplifting [] best 6155 combination zp[2]:3 [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 ] Uplifting [print_uchar] best 6137 combination reg byte a [ print_uchar::$0 ] reg byte x [ print_uchar::$2 ] reg byte x [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] Uplifting [mulf_init] best 5907 combination zp[2]:10 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] zp[2]:12 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] zp[2]:14 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] reg byte x [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] reg byte a [ mulf_init::$1 ] reg byte a [ mulf_init::$4 ] reg byte a [ mulf_init::$5 ] zp[1]:20 [ mulf_init::x_255#2 mulf_init::x_255#1 ] zp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ] zp[1]:22 [ mulf_init::c#2 mulf_init::c#1 ] zp[2]:23 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] zp[2]:25 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] Limited combination testing to 100 combinations of 1024 possible. Uplifting [print_uint] best 5907 combination zp[2]:8 [ print_uint::w#2 print_uint::w#0 print_uint::w#1 ] Uplifting [print_ulong] best 5907 combination zp[4]:27 [ print_ulong::dw#0 ] Uplifting [mulf16u] best 5907 combination zp[4]:31 [ mulf16u::return#1 ] zp[4]:35 [ mulf16u::return#0 ] Uplifting [main] best 5907 combination zp[4]:39 [ main::r#0 ] Uplifting [RADIX] best 5907 combination Attempting to uplift remaining variables inzp[1]:20 [ mulf_init::x_255#2 mulf_init::x_255#1 ] Uplifting [mulf_init] best 5787 combination reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ] Attempting to uplift remaining variables inzp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ] Uplifting [mulf_init] best 5787 combination zp[1]:21 [ mulf_init::dir#2 mulf_init::dir#4 ] Attempting to uplift remaining variables inzp[1]:22 [ mulf_init::c#2 mulf_init::c#1 ] Uplifting [mulf_init] best 5787 combination zp[1]:22 [ mulf_init::c#2 mulf_init::c#1 ] Coalescing zero page register [ zp[4]:35 [ mulf16u::return#0 ] ] with [ zp[4]:39 [ main::r#0 ] ] - score: 1 Coalescing zero page register [ zp[4]:35 [ mulf16u::return#0 main::r#0 ] ] with [ zp[4]:31 [ mulf16u::return#1 ] ] - score: 1 Coalescing zero page register [ zp[4]:35 [ mulf16u::return#0 main::r#0 mulf16u::return#1 ] ] with [ zp[4]:27 [ print_ulong::dw#0 ] ] - score: 1 Coalescing zero page register [ zp[2]:8 [ print_uint::w#2 print_uint::w#0 print_uint::w#1 ] ] with [ zp[2]:14 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] ] Coalescing zero page register [ zp[2]:3 [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 ] ] with [ zp[2]:25 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] ] Allocated (was zp[2]:3) zp[2]:2 [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] Allocated (was zp[2]:8) zp[2]:4 [ print_uint::w#2 print_uint::w#0 print_uint::w#1 mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] Allocated (was zp[2]:10) zp[2]:6 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] Allocated (was zp[2]:12) zp[2]:8 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] Allocated (was zp[4]:35) zp[4]:10 [ mulf16u::return#0 main::r#0 mulf16u::return#1 print_ulong::dw#0 ] Allocated (was zp[1]:21) zp[1]:14 [ mulf_init::dir#2 mulf_init::dir#4 ] Allocated (was zp[1]:22) zp[1]:15 [ mulf_init::c#2 mulf_init::c#1 ] Allocated (was zp[2]:23) zp[2]:16 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] ASSEMBLER BEFORE OPTIMIZATION // File Comments /// @file /// A lightweight library for printing on the C64. /// /// Printing with this library is done by calling print_ function for each element // Upstart // Commodore 64 PRG executable file .file [name="min-fmul-16.prg", type="prg", segments="Program"] .segmentdef Program [segments="Basic, Code, Data"] .segmentdef Basic [start=$0801] .segmentdef Code [start=$80d] .segmentdef Data [startAfter="Code"] .segment Basic :BasicUpstart(main) // Global Constants & labels .label RASTER = $d012 .label BORDER_COLOR = $d020 .label SCREEN = $400 .label print_char_cursor = 2 .segment Code // main main: { .label a = $4d2 .label b = $929 .label r = $a // [1] call mulf_init // [12] phi from main to mulf_init [phi:main->mulf_init] mulf_init_from_main: jsr mulf_init jmp __b4 // main::@4 __b4: // asm { sei } sei // [3] phi from main::@4 to main::@1 [phi:main::@4->main::@1] __b1_from___b4: // [3] phi print_char_cursor#15 = (char *) 1024 [phi:main::@4->main::@1#0] -- pbuz1=pbuc1 lda #<$400 sta.z print_char_cursor lda #>$400 sta.z print_char_cursor+1 jmp __b1 // main::@1 __b1: jmp __b2 // main::@2 __b2: // [4] if(*RASTER!=$ff) goto main::@2 -- _deref_pbuc1_neq_vbuc2_then_la1 lda #$ff cmp RASTER bne __b2 jmp __b3 // main::@3 __b3: // [5] *BORDER_COLOR = ++ *BORDER_COLOR -- _deref_pbuc1=_inc__deref_pbuc1 inc BORDER_COLOR // [6] call mulf16u jsr mulf16u // [7] mulf16u::return#0 = mulf16u::return#1 jmp __b5 // main::@5 __b5: // [8] main::r#0 = mulf16u::return#0 // [9] *BORDER_COLOR = -- *BORDER_COLOR -- _deref_pbuc1=_dec__deref_pbuc1 dec BORDER_COLOR // [10] print_ulong::dw#0 = main::r#0 // [11] call print_ulong jsr print_ulong // [3] phi from main::@5 to main::@1 [phi:main::@5->main::@1] __b1_from___b5: // [3] phi print_char_cursor#15 = SCREEN [phi:main::@5->main::@1#0] -- pbuz1=pbuc1 lda #SCREEN sta.z print_char_cursor+1 jmp __b1 } // mulf_init // Initialize the mulf_sqr multiplication tables with f(x)=int(x*x/4) mulf_init: { // x/2 .label c = $f // Counter used for determining x%2==0 .label sqr1_hi = 2 // Fill mulf_sqr1 = f(x) = int(x*x/4): If f(x) = x*x/4 then f(x+1) = f(x) + x/2 + 1/4 .label sqr = 6 .label sqr1_lo = 4 // Decrease or increase x_255 - initially we decrease .label sqr2_hi = $10 .label sqr2_lo = 8 //Start with g(0)=f(255) .label dir = $e // [13] phi from mulf_init to mulf_init::@1 [phi:mulf_init->mulf_init::@1] __b1_from_mulf_init: // [13] phi mulf_init::x_2#3 = 0 [phi:mulf_init->mulf_init::@1#0] -- vbuxx=vbuc1 ldx #0 // [13] phi mulf_init::sqr1_hi#2 = mulf_sqr1_hi+1 [phi:mulf_init->mulf_init::@1#1] -- pbuz1=pbuc1 lda #mulf_sqr1_hi+1 sta.z sqr1_hi+1 // [13] phi mulf_init::sqr#4 = 0 [phi:mulf_init->mulf_init::@1#2] -- vwuz1=vwuc1 lda #<0 sta.z sqr lda #>0 sta.z sqr+1 // [13] phi mulf_init::c#2 = 0 [phi:mulf_init->mulf_init::@1#3] -- vbuz1=vbuc1 lda #0 sta.z c // [13] phi mulf_init::sqr1_lo#2 = mulf_sqr1_lo+1 [phi:mulf_init->mulf_init::@1#4] -- pbuz1=pbuc1 lda #mulf_sqr1_lo+1 sta.z sqr1_lo+1 jmp __b1 // mulf_init::@1 __b1: // [14] if(mulf_init::sqr1_lo#2!=mulf_sqr1_lo+$200) goto mulf_init::@2 -- pbuz1_neq_pbuc1_then_la1 lda.z sqr1_lo+1 cmp #>mulf_sqr1_lo+$200 bne __b2 lda.z sqr1_lo cmp #mulf_init::@5] __b5_from___b1: // [15] phi mulf_init::dir#2 = $ff [phi:mulf_init::@1->mulf_init::@5#0] -- vbuz1=vbuc1 lda #$ff sta.z dir // [15] phi mulf_init::sqr2_hi#2 = mulf_sqr2_hi [phi:mulf_init::@1->mulf_init::@5#1] -- pbuz1=pbuc1 lda #mulf_sqr2_hi sta.z sqr2_hi+1 // [15] phi mulf_init::x_255#2 = -1 [phi:mulf_init::@1->mulf_init::@5#2] -- vbuxx=vbuc1 ldx #-1 // [15] phi mulf_init::sqr2_lo#2 = mulf_sqr2_lo [phi:mulf_init::@1->mulf_init::@5#3] -- pbuz1=pbuc1 lda #mulf_sqr2_lo sta.z sqr2_lo+1 jmp __b5 // mulf_init::@5 __b5: // [16] if(mulf_init::sqr2_lo#2!=mulf_sqr2_lo+$1ff) goto mulf_init::@6 -- pbuz1_neq_pbuc1_then_la1 lda.z sqr2_lo+1 cmp #>mulf_sqr2_lo+$1ff bne __b6 lda.z sqr2_lo cmp #mulf_init::@8] __b8_from___b6: // [26] phi mulf_init::dir#4 = 1 [phi:mulf_init::@6->mulf_init::@8#0] -- vbuz1=vbuc1 lda #1 sta.z dir jmp __b8 // [25] phi from mulf_init::@6 to mulf_init::@9 [phi:mulf_init::@6->mulf_init::@9] __b9_from___b6: jmp __b9 // mulf_init::@9 __b9: // [26] phi from mulf_init::@9 to mulf_init::@8 [phi:mulf_init::@9->mulf_init::@8] __b8_from___b9: // [26] phi mulf_init::dir#4 = mulf_init::dir#2 [phi:mulf_init::@9->mulf_init::@8#0] -- register_copy jmp __b8 // mulf_init::@8 __b8: // [27] mulf_init::sqr2_lo#1 = ++ mulf_init::sqr2_lo#2 -- pbuz1=_inc_pbuz1 inc.z sqr2_lo bne !+ inc.z sqr2_lo+1 !: // [15] phi from mulf_init::@8 to mulf_init::@5 [phi:mulf_init::@8->mulf_init::@5] __b5_from___b8: // [15] phi mulf_init::dir#2 = mulf_init::dir#4 [phi:mulf_init::@8->mulf_init::@5#0] -- register_copy // [15] phi mulf_init::sqr2_hi#2 = mulf_init::sqr2_hi#1 [phi:mulf_init::@8->mulf_init::@5#1] -- register_copy // [15] phi mulf_init::x_255#2 = mulf_init::x_255#1 [phi:mulf_init::@8->mulf_init::@5#2] -- register_copy // [15] phi mulf_init::sqr2_lo#2 = mulf_init::sqr2_lo#1 [phi:mulf_init::@8->mulf_init::@5#3] -- register_copy jmp __b5 // mulf_init::@2 __b2: // [28] mulf_init::c#1 = ++ mulf_init::c#2 -- vbuz1=_inc_vbuz1 inc.z c // [29] mulf_init::$1 = mulf_init::c#1 & 1 -- vbuaa=vbuz1_band_vbuc1 lda #1 and.z c // [30] if(mulf_init::$1!=0) goto mulf_init::@3 -- vbuaa_neq_0_then_la1 cmp #0 bne __b3_from___b2 jmp __b4 // mulf_init::@4 __b4: // [31] mulf_init::x_2#1 = ++ mulf_init::x_2#3 -- vbuxx=_inc_vbuxx inx // [32] mulf_init::sqr#2 = ++ mulf_init::sqr#4 -- vwuz1=_inc_vwuz1 inc.z sqr bne !+ inc.z sqr+1 !: // [33] phi from mulf_init::@2 mulf_init::@4 to mulf_init::@3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3] __b3_from___b2: __b3_from___b4: // [33] phi mulf_init::x_2#2 = mulf_init::x_2#3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#0] -- register_copy // [33] phi mulf_init::sqr#3 = mulf_init::sqr#4 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#1] -- register_copy jmp __b3 // mulf_init::@3 __b3: // [34] mulf_init::$4 = byte0 mulf_init::sqr#3 -- vbuaa=_byte0_vwuz1 lda.z sqr // [35] *mulf_init::sqr1_lo#2 = mulf_init::$4 -- _deref_pbuz1=vbuaa ldy #0 sta (sqr1_lo),y // [36] mulf_init::$5 = byte1 mulf_init::sqr#3 -- vbuaa=_byte1_vwuz1 lda.z sqr+1 // [37] *mulf_init::sqr1_hi#2 = mulf_init::$5 -- _deref_pbuz1=vbuaa ldy #0 sta (sqr1_hi),y // [38] mulf_init::sqr1_hi#1 = ++ mulf_init::sqr1_hi#2 -- pbuz1=_inc_pbuz1 inc.z sqr1_hi bne !+ inc.z sqr1_hi+1 !: // [39] mulf_init::sqr#1 = mulf_init::sqr#3 + mulf_init::x_2#2 -- vwuz1=vwuz1_plus_vbuxx txa clc adc.z sqr sta.z sqr bcc !+ inc.z sqr+1 !: // [40] mulf_init::sqr1_lo#1 = ++ mulf_init::sqr1_lo#2 -- pbuz1=_inc_pbuz1 inc.z sqr1_lo bne !+ inc.z sqr1_lo+1 !: // [13] phi from mulf_init::@3 to mulf_init::@1 [phi:mulf_init::@3->mulf_init::@1] __b1_from___b3: // [13] phi mulf_init::x_2#3 = mulf_init::x_2#2 [phi:mulf_init::@3->mulf_init::@1#0] -- register_copy // [13] phi mulf_init::sqr1_hi#2 = mulf_init::sqr1_hi#1 [phi:mulf_init::@3->mulf_init::@1#1] -- register_copy // [13] phi mulf_init::sqr#4 = mulf_init::sqr#1 [phi:mulf_init::@3->mulf_init::@1#2] -- register_copy // [13] phi mulf_init::c#2 = mulf_init::c#1 [phi:mulf_init::@3->mulf_init::@1#3] -- register_copy // [13] phi mulf_init::sqr1_lo#2 = mulf_init::sqr1_lo#1 [phi:mulf_init::@3->mulf_init::@1#4] -- register_copy jmp __b1 } // mulf16u // Fast multiply two unsigned words to a double word result // Done in assembler to utilize fast addition A+X // __zp($a) unsigned long mulf16u(unsigned int a, unsigned int b) mulf16u: { .label memA = $f8 .label memB = $fa .label memR = $fc .label return = $a // [41] *mulf16u::memA = main::a -- _deref_pwuc1=vwuc2 lda #main.a sta.z memA+1 // [42] *mulf16u::memB = main::b -- _deref_pwuc1=vwuc2 lda #main.b sta.z memB+1 // asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: } lda memA sta sm1a+1 sta sm3a+1 sta sm5a+1 sta sm7a+1 eor #$ff sta sm2a+1 sta sm4a+1 sta sm6a+1 sta sm8a+1 lda memA+1 sta sm1b+1 sta sm3b+1 sta sm5b+1 sta sm7b+1 eor #$ff sta sm2b+1 sta sm4b+1 sta sm6b+1 sta sm8b+1 ldx memB sec sm1a: lda mulf_sqr1_lo,x sm2a: sbc mulf_sqr2_lo,x sta memR+0 sm3a: lda mulf_sqr1_hi,x sm4a: sbc mulf_sqr2_hi,x sta _AA+1 sec sm1b: lda mulf_sqr1_lo,x sm2b: sbc mulf_sqr2_lo,x sta _cc+1 sm3b: lda mulf_sqr1_hi,x sm4b: sbc mulf_sqr2_hi,x sta _CC+1 ldx memB+1 sec sm5a: lda mulf_sqr1_lo,x sm6a: sbc mulf_sqr2_lo,x sta _bb+1 sm7a: lda mulf_sqr1_hi,x sm8a: sbc mulf_sqr2_hi,x sta _BB+1 sec sm5b: lda mulf_sqr1_lo,x sm6b: sbc mulf_sqr2_lo,x sta _dd+1 sm7b: lda mulf_sqr1_hi,x sm8b: sbc mulf_sqr2_hi,x sta memR+3 clc _AA: lda #0 _bb: adc #0 sta memR+1 _BB: lda #0 _CC: adc #0 sta memR+2 bcc !+ inc memR+3 clc !: _cc: lda #0 adc memR+1 sta memR+1 _dd: lda #0 adc memR+2 sta memR+2 bcc !+ inc memR+3 !: // [44] mulf16u::return#1 = *mulf16u::memR -- vduz1=_deref_pduc1 lda.z memR sta.z return lda.z memR+1 sta.z return+1 lda.z memR+2 sta.z return+2 lda.z memR+3 sta.z return+3 jmp __breturn // mulf16u::@return __breturn: // [45] return rts } // print_ulong // Print a unsigned long as HEX // void print_ulong(__zp($a) unsigned long dw) print_ulong: { .label dw = $a // [46] print_uint::w#0 = word1 print_ulong::dw#0 -- vwuz1=_word1_vduz2 lda.z dw+2 sta.z print_uint.w lda.z dw+3 sta.z print_uint.w+1 // [47] call print_uint // [51] phi from print_ulong to print_uint [phi:print_ulong->print_uint] print_uint_from_print_ulong: // [51] phi print_char_cursor#36 = print_char_cursor#15 [phi:print_ulong->print_uint#0] -- register_copy // [51] phi print_uint::w#2 = print_uint::w#0 [phi:print_ulong->print_uint#1] -- register_copy jsr print_uint jmp __b1 // print_ulong::@1 __b1: // [48] print_uint::w#1 = word0 print_ulong::dw#0 -- vwuz1=_word0_vduz2 lda.z dw sta.z print_uint.w lda.z dw+1 sta.z print_uint.w+1 // [49] call print_uint // [51] phi from print_ulong::@1 to print_uint [phi:print_ulong::@1->print_uint] print_uint_from___b1: // [51] phi print_char_cursor#36 = print_char_cursor#10 [phi:print_ulong::@1->print_uint#0] -- register_copy // [51] phi print_uint::w#2 = print_uint::w#1 [phi:print_ulong::@1->print_uint#1] -- register_copy jsr print_uint jmp __breturn // print_ulong::@return __breturn: // [50] return rts } // print_uint // Print a unsigned int as HEX // void print_uint(__zp(4) unsigned int w) print_uint: { .label w = 4 // [52] print_uchar::b#0 = byte1 print_uint::w#2 -- vbuxx=_byte1_vwuz1 ldx.z w+1 // [53] call print_uchar // [57] phi from print_uint to print_uchar [phi:print_uint->print_uchar] print_uchar_from_print_uint: // [57] phi print_char_cursor#38 = print_char_cursor#36 [phi:print_uint->print_uchar#0] -- register_copy // [57] phi print_uchar::b#2 = print_uchar::b#0 [phi:print_uint->print_uchar#1] -- register_copy jsr print_uchar jmp __b1 // print_uint::@1 __b1: // [54] print_uchar::b#1 = byte0 print_uint::w#2 -- vbuxx=_byte0_vwuz1 ldx.z w // [55] call print_uchar // [57] phi from print_uint::@1 to print_uchar [phi:print_uint::@1->print_uchar] print_uchar_from___b1: // [57] phi print_char_cursor#38 = print_char_cursor#10 [phi:print_uint::@1->print_uchar#0] -- register_copy // [57] phi print_uchar::b#2 = print_uchar::b#1 [phi:print_uint::@1->print_uchar#1] -- register_copy jsr print_uchar jmp __breturn // print_uint::@return __breturn: // [56] return rts } // print_uchar // Print a char as HEX // void print_uchar(__register(X) char b) print_uchar: { // [58] print_uchar::$0 = print_uchar::b#2 >> 4 -- vbuaa=vbuxx_ror_4 txa lsr lsr lsr lsr // [59] print_char::ch#0 = print_hextab[print_uchar::$0] -- vbuaa=pbuc1_derefidx_vbuaa tay lda print_hextab,y // [60] call print_char // Table of hexadecimal digits // [65] phi from print_uchar to print_char [phi:print_uchar->print_char] print_char_from_print_uchar: // [65] phi print_char_cursor#28 = print_char_cursor#38 [phi:print_uchar->print_char#0] -- register_copy // [65] phi print_char::ch#2 = print_char::ch#0 [phi:print_uchar->print_char#1] -- register_copy jsr print_char jmp __b1 // print_uchar::@1 __b1: // [61] print_uchar::$2 = print_uchar::b#2 & $f -- vbuxx=vbuxx_band_vbuc1 lda #$f axs #0 // [62] print_char::ch#1 = print_hextab[print_uchar::$2] -- vbuaa=pbuc1_derefidx_vbuxx lda print_hextab,x // [63] call print_char // [65] phi from print_uchar::@1 to print_char [phi:print_uchar::@1->print_char] print_char_from___b1: // [65] phi print_char_cursor#28 = print_char_cursor#10 [phi:print_uchar::@1->print_char#0] -- register_copy // [65] phi print_char::ch#2 = print_char::ch#1 [phi:print_uchar::@1->print_char#1] -- register_copy jsr print_char jmp __breturn // print_uchar::@return __breturn: // [64] return rts } // print_char // Print a single char // void print_char(__register(A) char ch) print_char: { // [66] *print_char_cursor#28 = print_char::ch#2 -- _deref_pbuz1=vbuaa ldy #0 sta (print_char_cursor),y // [67] print_char_cursor#10 = ++ print_char_cursor#28 -- pbuz1=_inc_pbuz1 inc.z print_char_cursor bne !+ inc.z print_char_cursor+1 !: jmp __breturn // print_char::@return __breturn: // [68] return rts } // File Data .segment Data print_hextab: .text "0123456789abcdef" // mulf_sqr tables will contain f(x)=int(x*x/4) and g(x) = f(x-255). // f(x) = >(( x * x )/4) .align $100 mulf_sqr1_hi: .fill $200, 0 // g(x) = >((( x - 255) * ( x - 255 ))/4) .align $100 mulf_sqr2_hi: .fill $200, 0 ASSEMBLER OPTIMIZATIONS Removing instruction jmp __b4 Removing instruction jmp __b1 Removing instruction jmp __b2 Removing instruction jmp __b3 Removing instruction jmp __b5 Removing instruction jmp __b1 Removing instruction jmp __b5 Removing instruction jmp __b7 Removing instruction jmp __breturn Removing instruction jmp __b9 Removing instruction jmp __b8 Removing instruction jmp __b4 Removing instruction jmp __b3 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 Succesful ASM optimization Pass5NextJumpElimination Replacing instruction lda #<0 with TXA Removing instruction lda #>0 Removing instruction lda #0 Removing instruction ldy #0 Removing instruction ldy #0 Succesful ASM optimization Pass5UnnecesaryLoadElimination Replacing label __b1 with __b2 Replacing label __b9_from___b6 with __b8 Replacing label __b3_from___b2 with __b3 Removing instruction __b1: Removing instruction __b9_from___b6: Removing instruction __b9: Removing instruction __b8_from___b9: Removing instruction __b3_from___b2: Removing instruction __b3_from___b4: Succesful ASM optimization Pass5RedundantLabelElimination Removing instruction mulf_init_from_main: Removing instruction __b4: Removing instruction __b1_from___b4: Removing instruction __b3: Removing instruction __b5: Removing instruction __b1_from___b5: Removing instruction __b1_from_mulf_init: Removing instruction __b5_from___b1: Removing instruction __b7: Removing instruction __breturn: Removing instruction __b8_from___b6: Removing instruction __b5_from___b8: Removing instruction __b4: Removing instruction __b1_from___b3: Removing instruction __breturn: Removing instruction print_uint_from_print_ulong: Removing instruction __b1: Removing instruction print_uint_from___b1: Removing instruction __breturn: Removing instruction print_uchar_from_print_uint: Removing instruction __b1: Removing instruction print_uchar_from___b1: Removing instruction __breturn: Removing instruction print_char_from_print_uchar: Removing instruction __b1: Removing instruction print_char_from___b1: Removing instruction __breturn: Removing instruction __breturn: Succesful ASM optimization Pass5UnusedLabelElimination Removing instruction jmp __b8 Succesful ASM optimization Pass5NextJumpElimination FINAL SYMBOL TABLE __constant char *BORDER_COLOR = (char *) 53280 __constant char RADIX::BINARY = 2 __constant char RADIX::DECIMAL = $a __constant char RADIX::HEXADECIMAL = $10 __constant char RADIX::OCTAL = 8 __constant char *RASTER = (char *) 53266 __constant char *SCREEN = (char *) 1024 void main() __constant unsigned int main::a = $4d2 __constant unsigned int main::b = $929 unsigned long main::r unsigned long main::r#0 // r zp[4]:10 11.0 unsigned long mulf16u(unsigned int a , unsigned int b) unsigned int mulf16u::a unsigned int mulf16u::b __constant unsigned int * const mulf16u::memA = (unsigned int *) 248 __constant unsigned int * const mulf16u::memB = (unsigned int *) 250 __constant unsigned long * const mulf16u::memR = (unsigned long *) 252 unsigned long mulf16u::return unsigned long mulf16u::return#0 // return zp[4]:10 22.0 unsigned long mulf16u::return#1 // return zp[4]:10 37.33333333333333 void mulf_init() char mulf_init::$1 // reg byte a 202.0 char mulf_init::$4 // reg byte a 202.0 char mulf_init::$5 // reg byte a 202.0 char mulf_init::c char mulf_init::c#1 // c zp[1]:15 23.307692307692307 char mulf_init::c#2 // c zp[1]:15 101.0 char mulf_init::dir char mulf_init::dir#2 // dir zp[1]:14 37.875 char mulf_init::dir#4 // dir zp[1]:14 101.0 unsigned int mulf_init::sqr unsigned int mulf_init::sqr#1 // sqr zp[2]:6 101.0 unsigned int mulf_init::sqr#2 // sqr zp[2]:6 202.0 unsigned int mulf_init::sqr#3 // sqr zp[2]:6 84.16666666666666 unsigned int mulf_init::sqr#4 // sqr zp[2]:6 50.5 char *mulf_init::sqr1_hi char *mulf_init::sqr1_hi#1 // sqr1_hi zp[2]:2 67.33333333333333 char *mulf_init::sqr1_hi#2 // sqr1_hi zp[2]:2 25.25 char *mulf_init::sqr1_lo char *mulf_init::sqr1_lo#1 // sqr1_lo zp[2]:4 202.0 char *mulf_init::sqr1_lo#2 // sqr1_lo zp[2]:4 28.857142857142858 char *mulf_init::sqr2_hi char *mulf_init::sqr2_hi#1 // sqr2_hi zp[2]:16 33.666666666666664 char *mulf_init::sqr2_hi#2 // sqr2_hi zp[2]:16 75.75 char *mulf_init::sqr2_lo char *mulf_init::sqr2_lo#1 // sqr2_lo zp[2]:8 202.0 char *mulf_init::sqr2_lo#2 // sqr2_lo zp[2]:8 44.888888888888886 char mulf_init::x_2 char mulf_init::x_2#1 // reg byte x 101.0 char mulf_init::x_2#2 // reg byte x 50.5 char mulf_init::x_2#3 // reg byte x 60.599999999999994 char mulf_init::x_255 char mulf_init::x_255#1 // reg byte x 60.599999999999994 char mulf_init::x_255#2 // reg byte x 80.8 __constant char mulf_sqr1_hi[$200] = { fill( $200, 0) } __constant char mulf_sqr1_lo[$200] = { fill( $200, 0) } __constant char mulf_sqr2_hi[$200] = { fill( $200, 0) } __constant char mulf_sqr2_lo[$200] = { fill( $200, 0) } void print_char(char ch) char print_char::ch char print_char::ch#0 // reg byte a 20002.0 char print_char::ch#1 // reg byte a 20002.0 char print_char::ch#2 // reg byte a 120003.0 char *print_char_cursor char *print_char_cursor#10 // print_char_cursor zp[2]:2 8546.461538461539 char *print_char_cursor#15 // print_char_cursor zp[2]:2 11.222222222222221 char *print_char_cursor#28 // print_char_cursor zp[2]:2 110002.0 char *print_char_cursor#36 // print_char_cursor zp[2]:2 601.5 char *print_char_cursor#38 // print_char_cursor zp[2]:2 4001.0 __constant const char print_hextab[] = "0123456789abcdef"z char *print_line_cursor char *print_screen void print_uchar(char b) char print_uchar::$0 // reg byte a 20002.0 char print_uchar::$2 // reg byte x 20002.0 char print_uchar::b char print_uchar::b#0 // reg byte x 2002.0 char print_uchar::b#1 // reg byte x 2002.0 char print_uchar::b#2 // reg byte x 5501.0 void print_uint(unsigned int w) unsigned int print_uint::w unsigned int print_uint::w#0 // w zp[2]:4 202.0 unsigned int print_uint::w#1 // w zp[2]:4 202.0 unsigned int print_uint::w#2 // w zp[2]:4 734.6666666666667 void print_ulong(unsigned long dw) unsigned long print_ulong::dw unsigned long print_ulong::dw#0 // dw zp[4]:10 71.0 zp[1]:15 [ mulf_init::c#2 mulf_init::c#1 ] reg byte x [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] zp[2]:8 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ] zp[2]:16 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] zp[1]:14 [ mulf_init::dir#2 mulf_init::dir#4 ] zp[2]:6 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] zp[2]:4 [ print_uint::w#2 print_uint::w#0 print_uint::w#1 mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] reg byte x [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] reg byte a [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ] zp[2]:2 [ print_char_cursor#28 print_char_cursor#38 print_char_cursor#36 print_char_cursor#15 print_char_cursor#10 mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] zp[4]:10 [ mulf16u::return#0 main::r#0 mulf16u::return#1 print_ulong::dw#0 ] reg byte a [ mulf_init::$1 ] reg byte a [ mulf_init::$4 ] reg byte a [ mulf_init::$5 ] reg byte a [ print_uchar::$0 ] reg byte x [ print_uchar::$2 ] FINAL ASSEMBLER Score: 4327 // File Comments /// @file /// A lightweight library for printing on the C64. /// /// Printing with this library is done by calling print_ function for each element // Upstart // Commodore 64 PRG executable file .file [name="min-fmul-16.prg", type="prg", segments="Program"] .segmentdef Program [segments="Basic, Code, Data"] .segmentdef Basic [start=$0801] .segmentdef Code [start=$80d] .segmentdef Data [startAfter="Code"] .segment Basic :BasicUpstart(main) // Global Constants & labels .label RASTER = $d012 .label BORDER_COLOR = $d020 .label SCREEN = $400 .label print_char_cursor = 2 .segment Code // main main: { .label a = $4d2 .label b = $929 .label r = $a // mulf_init() // [1] call mulf_init // [12] phi from main to mulf_init [phi:main->mulf_init] jsr mulf_init // main::@4 // asm // asm { sei } sei // [3] phi from main::@4 to main::@1 [phi:main::@4->main::@1] // [3] phi print_char_cursor#15 = (char *) 1024 [phi:main::@4->main::@1#0] -- pbuz1=pbuc1 lda #<$400 sta.z print_char_cursor lda #>$400 sta.z print_char_cursor+1 // main::@1 // main::@2 __b2: // while(*RASTER!=$ff) // [4] if(*RASTER!=$ff) goto main::@2 -- _deref_pbuc1_neq_vbuc2_then_la1 lda #$ff cmp RASTER bne __b2 // main::@3 // (*BORDER_COLOR)++; // [5] *BORDER_COLOR = ++ *BORDER_COLOR -- _deref_pbuc1=_inc__deref_pbuc1 inc BORDER_COLOR // dword r = mulf16u(a, b) // [6] call mulf16u jsr mulf16u // [7] mulf16u::return#0 = mulf16u::return#1 // main::@5 // [8] main::r#0 = mulf16u::return#0 // (*BORDER_COLOR)--; // [9] *BORDER_COLOR = -- *BORDER_COLOR -- _deref_pbuc1=_dec__deref_pbuc1 dec BORDER_COLOR // print_ulong(r) // [10] print_ulong::dw#0 = main::r#0 // [11] call print_ulong jsr print_ulong // [3] phi from main::@5 to main::@1 [phi:main::@5->main::@1] // [3] phi print_char_cursor#15 = SCREEN [phi:main::@5->main::@1#0] -- pbuz1=pbuc1 lda #SCREEN sta.z print_char_cursor+1 jmp __b2 } // mulf_init // Initialize the mulf_sqr multiplication tables with f(x)=int(x*x/4) mulf_init: { // x/2 .label c = $f // Counter used for determining x%2==0 .label sqr1_hi = 2 // Fill mulf_sqr1 = f(x) = int(x*x/4): If f(x) = x*x/4 then f(x+1) = f(x) + x/2 + 1/4 .label sqr = 6 .label sqr1_lo = 4 // Decrease or increase x_255 - initially we decrease .label sqr2_hi = $10 .label sqr2_lo = 8 //Start with g(0)=f(255) .label dir = $e // [13] phi from mulf_init to mulf_init::@1 [phi:mulf_init->mulf_init::@1] // [13] phi mulf_init::x_2#3 = 0 [phi:mulf_init->mulf_init::@1#0] -- vbuxx=vbuc1 ldx #0 // [13] phi mulf_init::sqr1_hi#2 = mulf_sqr1_hi+1 [phi:mulf_init->mulf_init::@1#1] -- pbuz1=pbuc1 lda #mulf_sqr1_hi+1 sta.z sqr1_hi+1 // [13] phi mulf_init::sqr#4 = 0 [phi:mulf_init->mulf_init::@1#2] -- vwuz1=vwuc1 txa sta.z sqr sta.z sqr+1 // [13] phi mulf_init::c#2 = 0 [phi:mulf_init->mulf_init::@1#3] -- vbuz1=vbuc1 sta.z c // [13] phi mulf_init::sqr1_lo#2 = mulf_sqr1_lo+1 [phi:mulf_init->mulf_init::@1#4] -- pbuz1=pbuc1 lda #mulf_sqr1_lo+1 sta.z sqr1_lo+1 // mulf_init::@1 __b1: // for(byte* sqr1_lo = mulf_sqr1_lo+1; sqr1_lo!=mulf_sqr1_lo+512; sqr1_lo++) // [14] if(mulf_init::sqr1_lo#2!=mulf_sqr1_lo+$200) goto mulf_init::@2 -- pbuz1_neq_pbuc1_then_la1 lda.z sqr1_lo+1 cmp #>mulf_sqr1_lo+$200 bne __b2 lda.z sqr1_lo cmp #mulf_init::@5] // [15] phi mulf_init::dir#2 = $ff [phi:mulf_init::@1->mulf_init::@5#0] -- vbuz1=vbuc1 lda #$ff sta.z dir // [15] phi mulf_init::sqr2_hi#2 = mulf_sqr2_hi [phi:mulf_init::@1->mulf_init::@5#1] -- pbuz1=pbuc1 lda #mulf_sqr2_hi sta.z sqr2_hi+1 // [15] phi mulf_init::x_255#2 = -1 [phi:mulf_init::@1->mulf_init::@5#2] -- vbuxx=vbuc1 ldx #-1 // [15] phi mulf_init::sqr2_lo#2 = mulf_sqr2_lo [phi:mulf_init::@1->mulf_init::@5#3] -- pbuz1=pbuc1 lda #mulf_sqr2_lo sta.z sqr2_lo+1 // mulf_init::@5 __b5: // for(byte* sqr2_lo = mulf_sqr2_lo; sqr2_lo!=mulf_sqr2_lo+511; sqr2_lo++) // [16] if(mulf_init::sqr2_lo#2!=mulf_sqr2_lo+$1ff) goto mulf_init::@6 -- pbuz1_neq_pbuc1_then_la1 lda.z sqr2_lo+1 cmp #>mulf_sqr2_lo+$1ff bne __b6 lda.z sqr2_lo cmp #mulf_init::@8] // [26] phi mulf_init::dir#4 = 1 [phi:mulf_init::@6->mulf_init::@8#0] -- vbuz1=vbuc1 lda #1 sta.z dir // [25] phi from mulf_init::@6 to mulf_init::@9 [phi:mulf_init::@6->mulf_init::@9] // mulf_init::@9 // [26] phi from mulf_init::@9 to mulf_init::@8 [phi:mulf_init::@9->mulf_init::@8] // [26] phi mulf_init::dir#4 = mulf_init::dir#2 [phi:mulf_init::@9->mulf_init::@8#0] -- register_copy // mulf_init::@8 __b8: // for(byte* sqr2_lo = mulf_sqr2_lo; sqr2_lo!=mulf_sqr2_lo+511; sqr2_lo++) // [27] mulf_init::sqr2_lo#1 = ++ mulf_init::sqr2_lo#2 -- pbuz1=_inc_pbuz1 inc.z sqr2_lo bne !+ inc.z sqr2_lo+1 !: // [15] phi from mulf_init::@8 to mulf_init::@5 [phi:mulf_init::@8->mulf_init::@5] // [15] phi mulf_init::dir#2 = mulf_init::dir#4 [phi:mulf_init::@8->mulf_init::@5#0] -- register_copy // [15] phi mulf_init::sqr2_hi#2 = mulf_init::sqr2_hi#1 [phi:mulf_init::@8->mulf_init::@5#1] -- register_copy // [15] phi mulf_init::x_255#2 = mulf_init::x_255#1 [phi:mulf_init::@8->mulf_init::@5#2] -- register_copy // [15] phi mulf_init::sqr2_lo#2 = mulf_init::sqr2_lo#1 [phi:mulf_init::@8->mulf_init::@5#3] -- register_copy jmp __b5 // mulf_init::@2 __b2: // if((++c&1)==0) // [28] mulf_init::c#1 = ++ mulf_init::c#2 -- vbuz1=_inc_vbuz1 inc.z c // ++c&1 // [29] mulf_init::$1 = mulf_init::c#1 & 1 -- vbuaa=vbuz1_band_vbuc1 lda #1 and.z c // if((++c&1)==0) // [30] if(mulf_init::$1!=0) goto mulf_init::@3 -- vbuaa_neq_0_then_la1 cmp #0 bne __b3 // mulf_init::@4 // x_2++; // [31] mulf_init::x_2#1 = ++ mulf_init::x_2#3 -- vbuxx=_inc_vbuxx inx // sqr++; // [32] mulf_init::sqr#2 = ++ mulf_init::sqr#4 -- vwuz1=_inc_vwuz1 inc.z sqr bne !+ inc.z sqr+1 !: // [33] phi from mulf_init::@2 mulf_init::@4 to mulf_init::@3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3] // [33] phi mulf_init::x_2#2 = mulf_init::x_2#3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#0] -- register_copy // [33] phi mulf_init::sqr#3 = mulf_init::sqr#4 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#1] -- register_copy // mulf_init::@3 __b3: // BYTE0(sqr) // [34] mulf_init::$4 = byte0 mulf_init::sqr#3 -- vbuaa=_byte0_vwuz1 lda.z sqr // *sqr1_lo = BYTE0(sqr) // [35] *mulf_init::sqr1_lo#2 = mulf_init::$4 -- _deref_pbuz1=vbuaa ldy #0 sta (sqr1_lo),y // BYTE1(sqr) // [36] mulf_init::$5 = byte1 mulf_init::sqr#3 -- vbuaa=_byte1_vwuz1 lda.z sqr+1 // *sqr1_hi++ = BYTE1(sqr) // [37] *mulf_init::sqr1_hi#2 = mulf_init::$5 -- _deref_pbuz1=vbuaa sta (sqr1_hi),y // *sqr1_hi++ = BYTE1(sqr); // [38] mulf_init::sqr1_hi#1 = ++ mulf_init::sqr1_hi#2 -- pbuz1=_inc_pbuz1 inc.z sqr1_hi bne !+ inc.z sqr1_hi+1 !: // sqr = sqr + x_2 // [39] mulf_init::sqr#1 = mulf_init::sqr#3 + mulf_init::x_2#2 -- vwuz1=vwuz1_plus_vbuxx txa clc adc.z sqr sta.z sqr bcc !+ inc.z sqr+1 !: // for(byte* sqr1_lo = mulf_sqr1_lo+1; sqr1_lo!=mulf_sqr1_lo+512; sqr1_lo++) // [40] mulf_init::sqr1_lo#1 = ++ mulf_init::sqr1_lo#2 -- pbuz1=_inc_pbuz1 inc.z sqr1_lo bne !+ inc.z sqr1_lo+1 !: // [13] phi from mulf_init::@3 to mulf_init::@1 [phi:mulf_init::@3->mulf_init::@1] // [13] phi mulf_init::x_2#3 = mulf_init::x_2#2 [phi:mulf_init::@3->mulf_init::@1#0] -- register_copy // [13] phi mulf_init::sqr1_hi#2 = mulf_init::sqr1_hi#1 [phi:mulf_init::@3->mulf_init::@1#1] -- register_copy // [13] phi mulf_init::sqr#4 = mulf_init::sqr#1 [phi:mulf_init::@3->mulf_init::@1#2] -- register_copy // [13] phi mulf_init::c#2 = mulf_init::c#1 [phi:mulf_init::@3->mulf_init::@1#3] -- register_copy // [13] phi mulf_init::sqr1_lo#2 = mulf_init::sqr1_lo#1 [phi:mulf_init::@3->mulf_init::@1#4] -- register_copy jmp __b1 } // mulf16u // Fast multiply two unsigned words to a double word result // Done in assembler to utilize fast addition A+X // __zp($a) unsigned long mulf16u(unsigned int a, unsigned int b) mulf16u: { .label memA = $f8 .label memB = $fa .label memR = $fc .label return = $a // *memA = a // [41] *mulf16u::memA = main::a -- _deref_pwuc1=vwuc2 lda #main.a sta.z memA+1 // *memB = b // [42] *mulf16u::memB = main::b -- _deref_pwuc1=vwuc2 lda #main.b sta.z memB+1 // asm // asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: } lda memA sta sm1a+1 sta sm3a+1 sta sm5a+1 sta sm7a+1 eor #$ff sta sm2a+1 sta sm4a+1 sta sm6a+1 sta sm8a+1 lda memA+1 sta sm1b+1 sta sm3b+1 sta sm5b+1 sta sm7b+1 eor #$ff sta sm2b+1 sta sm4b+1 sta sm6b+1 sta sm8b+1 ldx memB sec sm1a: lda mulf_sqr1_lo,x sm2a: sbc mulf_sqr2_lo,x sta memR+0 sm3a: lda mulf_sqr1_hi,x sm4a: sbc mulf_sqr2_hi,x sta _AA+1 sec sm1b: lda mulf_sqr1_lo,x sm2b: sbc mulf_sqr2_lo,x sta _cc+1 sm3b: lda mulf_sqr1_hi,x sm4b: sbc mulf_sqr2_hi,x sta _CC+1 ldx memB+1 sec sm5a: lda mulf_sqr1_lo,x sm6a: sbc mulf_sqr2_lo,x sta _bb+1 sm7a: lda mulf_sqr1_hi,x sm8a: sbc mulf_sqr2_hi,x sta _BB+1 sec sm5b: lda mulf_sqr1_lo,x sm6b: sbc mulf_sqr2_lo,x sta _dd+1 sm7b: lda mulf_sqr1_hi,x sm8b: sbc mulf_sqr2_hi,x sta memR+3 clc _AA: lda #0 _bb: adc #0 sta memR+1 _BB: lda #0 _CC: adc #0 sta memR+2 bcc !+ inc memR+3 clc !: _cc: lda #0 adc memR+1 sta memR+1 _dd: lda #0 adc memR+2 sta memR+2 bcc !+ inc memR+3 !: // return *memR; // [44] mulf16u::return#1 = *mulf16u::memR -- vduz1=_deref_pduc1 lda.z memR sta.z return lda.z memR+1 sta.z return+1 lda.z memR+2 sta.z return+2 lda.z memR+3 sta.z return+3 // mulf16u::@return // } // [45] return rts } // print_ulong // Print a unsigned long as HEX // void print_ulong(__zp($a) unsigned long dw) print_ulong: { .label dw = $a // print_uint(WORD1(dw)) // [46] print_uint::w#0 = word1 print_ulong::dw#0 -- vwuz1=_word1_vduz2 lda.z dw+2 sta.z print_uint.w lda.z dw+3 sta.z print_uint.w+1 // [47] call print_uint // [51] phi from print_ulong to print_uint [phi:print_ulong->print_uint] // [51] phi print_char_cursor#36 = print_char_cursor#15 [phi:print_ulong->print_uint#0] -- register_copy // [51] phi print_uint::w#2 = print_uint::w#0 [phi:print_ulong->print_uint#1] -- register_copy jsr print_uint // print_ulong::@1 // print_uint(WORD0(dw)) // [48] print_uint::w#1 = word0 print_ulong::dw#0 -- vwuz1=_word0_vduz2 lda.z dw sta.z print_uint.w lda.z dw+1 sta.z print_uint.w+1 // [49] call print_uint // [51] phi from print_ulong::@1 to print_uint [phi:print_ulong::@1->print_uint] // [51] phi print_char_cursor#36 = print_char_cursor#10 [phi:print_ulong::@1->print_uint#0] -- register_copy // [51] phi print_uint::w#2 = print_uint::w#1 [phi:print_ulong::@1->print_uint#1] -- register_copy jsr print_uint // print_ulong::@return // } // [50] return rts } // print_uint // Print a unsigned int as HEX // void print_uint(__zp(4) unsigned int w) print_uint: { .label w = 4 // print_uchar(BYTE1(w)) // [52] print_uchar::b#0 = byte1 print_uint::w#2 -- vbuxx=_byte1_vwuz1 ldx.z w+1 // [53] call print_uchar // [57] phi from print_uint to print_uchar [phi:print_uint->print_uchar] // [57] phi print_char_cursor#38 = print_char_cursor#36 [phi:print_uint->print_uchar#0] -- register_copy // [57] phi print_uchar::b#2 = print_uchar::b#0 [phi:print_uint->print_uchar#1] -- register_copy jsr print_uchar // print_uint::@1 // print_uchar(BYTE0(w)) // [54] print_uchar::b#1 = byte0 print_uint::w#2 -- vbuxx=_byte0_vwuz1 ldx.z w // [55] call print_uchar // [57] phi from print_uint::@1 to print_uchar [phi:print_uint::@1->print_uchar] // [57] phi print_char_cursor#38 = print_char_cursor#10 [phi:print_uint::@1->print_uchar#0] -- register_copy // [57] phi print_uchar::b#2 = print_uchar::b#1 [phi:print_uint::@1->print_uchar#1] -- register_copy jsr print_uchar // print_uint::@return // } // [56] return rts } // print_uchar // Print a char as HEX // void print_uchar(__register(X) char b) print_uchar: { // b>>4 // [58] print_uchar::$0 = print_uchar::b#2 >> 4 -- vbuaa=vbuxx_ror_4 txa lsr lsr lsr lsr // print_char(print_hextab[b>>4]) // [59] print_char::ch#0 = print_hextab[print_uchar::$0] -- vbuaa=pbuc1_derefidx_vbuaa tay lda print_hextab,y // [60] call print_char // Table of hexadecimal digits // [65] phi from print_uchar to print_char [phi:print_uchar->print_char] // [65] phi print_char_cursor#28 = print_char_cursor#38 [phi:print_uchar->print_char#0] -- register_copy // [65] phi print_char::ch#2 = print_char::ch#0 [phi:print_uchar->print_char#1] -- register_copy jsr print_char // print_uchar::@1 // b&0xf // [61] print_uchar::$2 = print_uchar::b#2 & $f -- vbuxx=vbuxx_band_vbuc1 lda #$f axs #0 // print_char(print_hextab[b&0xf]) // [62] print_char::ch#1 = print_hextab[print_uchar::$2] -- vbuaa=pbuc1_derefidx_vbuxx lda print_hextab,x // [63] call print_char // [65] phi from print_uchar::@1 to print_char [phi:print_uchar::@1->print_char] // [65] phi print_char_cursor#28 = print_char_cursor#10 [phi:print_uchar::@1->print_char#0] -- register_copy // [65] phi print_char::ch#2 = print_char::ch#1 [phi:print_uchar::@1->print_char#1] -- register_copy jsr print_char // print_uchar::@return // } // [64] return rts } // print_char // Print a single char // void print_char(__register(A) char ch) print_char: { // *(print_char_cursor++) = ch // [66] *print_char_cursor#28 = print_char::ch#2 -- _deref_pbuz1=vbuaa ldy #0 sta (print_char_cursor),y // *(print_char_cursor++) = ch; // [67] print_char_cursor#10 = ++ print_char_cursor#28 -- pbuz1=_inc_pbuz1 inc.z print_char_cursor bne !+ inc.z print_char_cursor+1 !: // print_char::@return // } // [68] return rts } // File Data .segment Data print_hextab: .text "0123456789abcdef" // mulf_sqr tables will contain f(x)=int(x*x/4) and g(x) = f(x-255). // f(x) = >(( x * x )/4) .align $100 mulf_sqr1_hi: .fill $200, 0 // g(x) = >((( x - 255) * ( x - 255 ))/4) .align $100 mulf_sqr2_hi: .fill $200, 0