mirror of https://gitlab.com/camelot/kickc.git
2555 lines
124 KiB
Plaintext
2555 lines
124 KiB
Plaintext
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
|
|
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
|
|
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
|
|
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_sqr1_lo+$200
|
|
bne __b2
|
|
// [15] phi from mulf_init::@1 to mulf_init::@5 [phi:mulf_init::@1->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
|
|
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
|
|
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_sqr2_lo+$1ff
|
|
bne __b6
|
|
jmp __b7
|
|
// mulf_init::@7
|
|
__b7:
|
|
// [17] *(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+$100) -- _deref_pbuc1=_deref_pbuc2
|
|
// Set the very last value g(511) = f(256)
|
|
lda mulf_sqr1_lo+$100
|
|
sta mulf_sqr2_lo+$1ff
|
|
// [18] *(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+$100) -- _deref_pbuc1=_deref_pbuc2
|
|
lda mulf_sqr1_hi+$100
|
|
sta mulf_sqr2_hi+$1ff
|
|
jmp __breturn
|
|
// mulf_init::@return
|
|
__breturn:
|
|
// [19] return
|
|
rts
|
|
// mulf_init::@6
|
|
__b6:
|
|
// [20] *mulf_init::sqr2_lo#2 = mulf_sqr1_lo[mulf_init::x_255#2] -- _deref_pbuz1=pbuc1_derefidx_vbuxx
|
|
lda mulf_sqr1_lo,x
|
|
ldy #0
|
|
sta (sqr2_lo),y
|
|
// [21] *mulf_init::sqr2_hi#2 = mulf_sqr1_hi[mulf_init::x_255#2] -- _deref_pbuz1=pbuc1_derefidx_vbuxx
|
|
lda mulf_sqr1_hi,x
|
|
ldy #0
|
|
sta (sqr2_hi),y
|
|
// [22] mulf_init::sqr2_hi#1 = ++ mulf_init::sqr2_hi#2 -- pbuz1=_inc_pbuz1
|
|
inc.z sqr2_hi
|
|
bne !+
|
|
inc.z sqr2_hi+1
|
|
!:
|
|
// [23] mulf_init::x_255#1 = mulf_init::x_255#2 + mulf_init::dir#2 -- vbuxx=vbuxx_plus_vbuz1
|
|
txa
|
|
clc
|
|
adc.z dir
|
|
tax
|
|
// [24] if(mulf_init::x_255#1!=0) goto mulf_init::@9 -- vbuxx_neq_0_then_la1
|
|
cpx #0
|
|
bne __b9_from___b6
|
|
// [26] phi from mulf_init::@6 to mulf_init::@8 [phi:mulf_init::@6->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
|
|
lda #>main.a
|
|
sta.z memA+1
|
|
// [42] *mulf16u::memB = main::b -- _deref_pwuc1=vwuc2
|
|
lda #<main.b
|
|
sta.z memB
|
|
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_lo: .fill $200, 0
|
|
// >f(x) = >(( x * x )/4)
|
|
.align $100
|
|
mulf_sqr1_hi: .fill $200, 0
|
|
// <g(x) = <((( x - 255) * ( x - 255 ))/4)
|
|
.align $100
|
|
mulf_sqr2_lo: .fill $200, 0
|
|
// >g(x) = >((( x - 255) * ( x - 255 ))/4)
|
|
.align $100
|
|
mulf_sqr2_hi: .fill $200, 0
|
|
|
|
ASSEMBLER OPTIMIZATIONS
|
|
Removing instruction jmp __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
|
|
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
|
|
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
|
|
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_sqr1_lo+$200
|
|
bne __b2
|
|
// [15] phi from mulf_init::@1 to mulf_init::@5 [phi:mulf_init::@1->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
|
|
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
|
|
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_sqr2_lo+$1ff
|
|
bne __b6
|
|
// mulf_init::@7
|
|
// *(mulf_sqr2_lo+511) = *(mulf_sqr1_lo+256)
|
|
// [17] *(mulf_sqr2_lo+$1ff) = *(mulf_sqr1_lo+$100) -- _deref_pbuc1=_deref_pbuc2
|
|
// Set the very last value g(511) = f(256)
|
|
lda mulf_sqr1_lo+$100
|
|
sta mulf_sqr2_lo+$1ff
|
|
// *(mulf_sqr2_hi+511) = *(mulf_sqr1_hi+256)
|
|
// [18] *(mulf_sqr2_hi+$1ff) = *(mulf_sqr1_hi+$100) -- _deref_pbuc1=_deref_pbuc2
|
|
lda mulf_sqr1_hi+$100
|
|
sta mulf_sqr2_hi+$1ff
|
|
// mulf_init::@return
|
|
// }
|
|
// [19] return
|
|
rts
|
|
// mulf_init::@6
|
|
__b6:
|
|
// *sqr2_lo = mulf_sqr1_lo[x_255]
|
|
// [20] *mulf_init::sqr2_lo#2 = mulf_sqr1_lo[mulf_init::x_255#2] -- _deref_pbuz1=pbuc1_derefidx_vbuxx
|
|
lda mulf_sqr1_lo,x
|
|
ldy #0
|
|
sta (sqr2_lo),y
|
|
// *sqr2_hi++ = mulf_sqr1_hi[x_255]
|
|
// [21] *mulf_init::sqr2_hi#2 = mulf_sqr1_hi[mulf_init::x_255#2] -- _deref_pbuz1=pbuc1_derefidx_vbuxx
|
|
lda mulf_sqr1_hi,x
|
|
sta (sqr2_hi),y
|
|
// *sqr2_hi++ = mulf_sqr1_hi[x_255];
|
|
// [22] mulf_init::sqr2_hi#1 = ++ mulf_init::sqr2_hi#2 -- pbuz1=_inc_pbuz1
|
|
inc.z sqr2_hi
|
|
bne !+
|
|
inc.z sqr2_hi+1
|
|
!:
|
|
// x_255 = x_255 + dir
|
|
// [23] mulf_init::x_255#1 = mulf_init::x_255#2 + mulf_init::dir#2 -- vbuxx=vbuxx_plus_vbuz1
|
|
txa
|
|
clc
|
|
adc.z dir
|
|
tax
|
|
// if(x_255==0)
|
|
// [24] if(mulf_init::x_255#1!=0) goto mulf_init::@9 -- vbuxx_neq_0_then_la1
|
|
cpx #0
|
|
bne __b8
|
|
// [26] phi from mulf_init::@6 to mulf_init::@8 [phi:mulf_init::@6->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
|
|
lda #>main.a
|
|
sta.z memA+1
|
|
// *memB = b
|
|
// [42] *mulf16u::memB = main::b -- _deref_pwuc1=vwuc2
|
|
lda #<main.b
|
|
sta.z memB
|
|
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_lo: .fill $200, 0
|
|
// >f(x) = >(( x * x )/4)
|
|
.align $100
|
|
mulf_sqr1_hi: .fill $200, 0
|
|
// <g(x) = <((( x - 255) * ( x - 255 ))/4)
|
|
.align $100
|
|
mulf_sqr2_lo: .fill $200, 0
|
|
// >g(x) = >((( x - 255) * ( x - 255 ))/4)
|
|
.align $100
|
|
mulf_sqr2_hi: .fill $200, 0
|
|
|