kickc/src/test/ref/sinus-basic.log

2534 lines
103 KiB
Plaintext

Inlined call call prepareMEM(setFAC::w)
Inlined call call prepareMEM((unsigned int)setMEMtoFAC::mem)
Inlined call call prepareMEM((unsigned int)setFACtoMEM::mem)
Inlined call call prepareMEM((unsigned int)setARGtoMEM::mem)
Inlined call call prepareMEM((unsigned int)addMEMtoFAC::mem)
Inlined call call prepareMEM((unsigned int)subFACfromMEM::mem)
Inlined call call prepareMEM((unsigned int)divMEMbyFAC::mem)
Inlined call call prepareMEM((unsigned int)mulFACbyMEM::mem)
Inlined call call prepareMEM((unsigned int)pwrMEMbyFAC::mem)
Inlined call call __init
Eliminating unused variable with no statement getFAC::$0
CONTROL FLOW GRAPH SSA
void print_ln()
print_ln: scope:[print_ln] from main::@14
print_char_cursor#31 = phi( main::@14/print_char_cursor#10 )
print_line_cursor#14 = phi( main::@14/print_line_cursor#15 )
to:print_ln::@1
print_ln::@1: scope:[print_ln] from print_ln print_ln::@1
print_char_cursor#16 = phi( print_ln/print_char_cursor#31, print_ln::@1/print_char_cursor#16 )
print_line_cursor#7 = phi( print_ln/print_line_cursor#14, print_ln::@1/print_line_cursor#0 )
print_ln::$0 = print_line_cursor#7 + $28
print_line_cursor#0 = print_ln::$0
print_ln::$1 = print_line_cursor#0 < print_char_cursor#16
if(print_ln::$1) goto print_ln::@1
to:print_ln::@2
print_ln::@2: scope:[print_ln] from print_ln::@1
print_line_cursor#8 = phi( print_ln::@1/print_line_cursor#0 )
print_char_cursor#0 = print_line_cursor#8
to:print_ln::@return
print_ln::@return: scope:[print_ln] from print_ln::@2
print_char_cursor#17 = phi( print_ln::@2/print_char_cursor#0 )
print_line_cursor#9 = phi( print_ln::@2/print_line_cursor#8 )
print_line_cursor#1 = print_line_cursor#9
print_char_cursor#1 = print_char_cursor#17
return
to:@return
void print_uint(unsigned int w)
print_uint: scope:[print_uint] from main::@13
print_char_cursor#32 = phi( main::@13/print_char_cursor#34 )
print_uint::w#1 = phi( main::@13/print_uint::w#0 )
print_uint::$0 = byte1 print_uint::w#1
print_uchar::b#0 = print_uint::$0
call print_uchar
to:print_uint::@1
print_uint::@1: scope:[print_uint] from print_uint
print_uint::w#2 = phi( print_uint/print_uint::w#1 )
print_char_cursor#18 = phi( print_uint/print_char_cursor#7 )
print_char_cursor#2 = print_char_cursor#18
print_uint::$2 = byte0 print_uint::w#2
print_uchar::b#1 = print_uint::$2
call print_uchar
to:print_uint::@2
print_uint::@2: scope:[print_uint] from print_uint::@1
print_char_cursor#19 = phi( print_uint::@1/print_char_cursor#7 )
print_char_cursor#3 = print_char_cursor#19
to:print_uint::@return
print_uint::@return: scope:[print_uint] from print_uint::@2
print_char_cursor#20 = phi( print_uint::@2/print_char_cursor#3 )
print_char_cursor#4 = print_char_cursor#20
return
to:@return
void print_uchar(char b)
print_uchar: scope:[print_uchar] from print_uint print_uint::@1
print_char_cursor#33 = phi( print_uint/print_char_cursor#32, print_uint::@1/print_char_cursor#2 )
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#21 = phi( print_uchar/print_char_cursor#9 )
print_char_cursor#5 = print_char_cursor#21
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#22 = phi( print_uchar::@1/print_char_cursor#9 )
print_char_cursor#6 = print_char_cursor#22
to:print_uchar::@return
print_uchar::@return: scope:[print_uchar] from print_uchar::@2
print_char_cursor#23 = phi( print_uchar::@2/print_char_cursor#6 )
print_char_cursor#7 = print_char_cursor#23
return
to:@return
void print_char(char ch)
print_char: scope:[print_char] from print_uchar print_uchar::@1
print_char_cursor#24 = phi( print_uchar/print_char_cursor#33, print_uchar::@1/print_char_cursor#5 )
print_char::ch#2 = phi( print_uchar/print_char::ch#0, print_uchar::@1/print_char::ch#1 )
*print_char_cursor#24 = print_char::ch#2
print_char_cursor#8 = ++ print_char_cursor#24
to:print_char::@return
print_char::@return: scope:[print_char] from print_char
print_char_cursor#25 = phi( print_char/print_char_cursor#8 )
print_char_cursor#9 = print_char_cursor#25
return
to:@return
void setFAC(unsigned int w)
setFAC: scope:[setFAC] from main main::@1 main::@7
setFAC::w#3 = phi( main/setFAC::w#0, main::@1/setFAC::w#1, main::@7/setFAC::w#2 )
setFAC::prepareMEM1_mem#0 = setFAC::w#3
to:setFAC::prepareMEM1
setFAC::prepareMEM1: scope:[setFAC] from setFAC
setFAC::prepareMEM1_mem#1 = phi( setFAC/setFAC::prepareMEM1_mem#0 )
setFAC::prepareMEM1_$0 = byte0 setFAC::prepareMEM1_mem#1
*memLo = setFAC::prepareMEM1_$0
setFAC::prepareMEM1_$1 = byte1 setFAC::prepareMEM1_mem#1
*memHi = setFAC::prepareMEM1_$1
to:setFAC::@1
setFAC::@1: scope:[setFAC] from setFAC::prepareMEM1
asm { ldymemLo ldamemHi jsr$b391 }
to:setFAC::@return
setFAC::@return: scope:[setFAC] from setFAC::@1
return
to:@return
unsigned int getFAC()
getFAC: scope:[getFAC] from main::@12
asm { jsr$b1aa stymemLo stamemHi }
getFAC::w#0 = *memHi w= *memLo
getFAC::return#0 = getFAC::w#0
to:getFAC::@return
getFAC::@return: scope:[getFAC] from getFAC
getFAC::return#3 = phi( getFAC/getFAC::return#0 )
getFAC::return#1 = getFAC::return#3
return
to:@return
void setMEMtoFAC(char *mem)
setMEMtoFAC: scope:[setMEMtoFAC] from main::@3 main::@6
setMEMtoFAC::mem#2 = phi( main::@3/setMEMtoFAC::mem#0, main::@6/setMEMtoFAC::mem#1 )
setMEMtoFAC::prepareMEM1_mem#0 = (unsigned int)setMEMtoFAC::mem#2
to:setMEMtoFAC::prepareMEM1
setMEMtoFAC::prepareMEM1: scope:[setMEMtoFAC] from setMEMtoFAC
setMEMtoFAC::prepareMEM1_mem#1 = phi( setMEMtoFAC/setMEMtoFAC::prepareMEM1_mem#0 )
setMEMtoFAC::prepareMEM1_$0 = byte0 setMEMtoFAC::prepareMEM1_mem#1
*memLo = setMEMtoFAC::prepareMEM1_$0
setMEMtoFAC::prepareMEM1_$1 = byte1 setMEMtoFAC::prepareMEM1_mem#1
*memHi = setMEMtoFAC::prepareMEM1_$1
to:setMEMtoFAC::@1
setMEMtoFAC::@1: scope:[setMEMtoFAC] from setMEMtoFAC::prepareMEM1
asm { ldxmemLo ldymemHi jsr$bbd4 }
to:setMEMtoFAC::@return
setMEMtoFAC::@return: scope:[setMEMtoFAC] from setMEMtoFAC::@1
return
to:@return
void addMEMtoFAC(char *mem)
addMEMtoFAC: scope:[addMEMtoFAC] from main::@11
addMEMtoFAC::mem#1 = phi( main::@11/addMEMtoFAC::mem#0 )
addMEMtoFAC::prepareMEM1_mem#0 = (unsigned int)addMEMtoFAC::mem#1
to:addMEMtoFAC::prepareMEM1
addMEMtoFAC::prepareMEM1: scope:[addMEMtoFAC] from addMEMtoFAC
addMEMtoFAC::prepareMEM1_mem#1 = phi( addMEMtoFAC/addMEMtoFAC::prepareMEM1_mem#0 )
addMEMtoFAC::prepareMEM1_$0 = byte0 addMEMtoFAC::prepareMEM1_mem#1
*memLo = addMEMtoFAC::prepareMEM1_$0
addMEMtoFAC::prepareMEM1_$1 = byte1 addMEMtoFAC::prepareMEM1_mem#1
*memHi = addMEMtoFAC::prepareMEM1_$1
to:addMEMtoFAC::@1
addMEMtoFAC::@1: scope:[addMEMtoFAC] from addMEMtoFAC::prepareMEM1
asm { ldamemLo ldymemHi jsr$b867 }
to:addMEMtoFAC::@return
addMEMtoFAC::@return: scope:[addMEMtoFAC] from addMEMtoFAC::@1
return
to:@return
void divMEMbyFAC(char *mem)
divMEMbyFAC: scope:[divMEMbyFAC] from main::@8
divMEMbyFAC::mem#1 = phi( main::@8/divMEMbyFAC::mem#0 )
divMEMbyFAC::prepareMEM1_mem#0 = (unsigned int)divMEMbyFAC::mem#1
to:divMEMbyFAC::prepareMEM1
divMEMbyFAC::prepareMEM1: scope:[divMEMbyFAC] from divMEMbyFAC
divMEMbyFAC::prepareMEM1_mem#1 = phi( divMEMbyFAC/divMEMbyFAC::prepareMEM1_mem#0 )
divMEMbyFAC::prepareMEM1_$0 = byte0 divMEMbyFAC::prepareMEM1_mem#1
*memLo = divMEMbyFAC::prepareMEM1_$0
divMEMbyFAC::prepareMEM1_$1 = byte1 divMEMbyFAC::prepareMEM1_mem#1
*memHi = divMEMbyFAC::prepareMEM1_$1
to:divMEMbyFAC::@1
divMEMbyFAC::@1: scope:[divMEMbyFAC] from divMEMbyFAC::prepareMEM1
asm { ldamemLo ldymemHi jsr$bb0f }
to:divMEMbyFAC::@return
divMEMbyFAC::@return: scope:[divMEMbyFAC] from divMEMbyFAC::@1
return
to:@return
void mulFACbyMEM(char *mem)
mulFACbyMEM: scope:[mulFACbyMEM] from main::@10 main::@5
mulFACbyMEM::mem#2 = phi( main::@10/mulFACbyMEM::mem#1, main::@5/mulFACbyMEM::mem#0 )
mulFACbyMEM::prepareMEM1_mem#0 = (unsigned int)mulFACbyMEM::mem#2
to:mulFACbyMEM::prepareMEM1
mulFACbyMEM::prepareMEM1: scope:[mulFACbyMEM] from mulFACbyMEM
mulFACbyMEM::prepareMEM1_mem#1 = phi( mulFACbyMEM/mulFACbyMEM::prepareMEM1_mem#0 )
mulFACbyMEM::prepareMEM1_$0 = byte0 mulFACbyMEM::prepareMEM1_mem#1
*memLo = mulFACbyMEM::prepareMEM1_$0
mulFACbyMEM::prepareMEM1_$1 = byte1 mulFACbyMEM::prepareMEM1_mem#1
*memHi = mulFACbyMEM::prepareMEM1_$1
to:mulFACbyMEM::@1
mulFACbyMEM::@1: scope:[mulFACbyMEM] from mulFACbyMEM::prepareMEM1
asm { ldamemLo ldymemHi jsr$ba28 }
to:mulFACbyMEM::@return
mulFACbyMEM::@return: scope:[mulFACbyMEM] from mulFACbyMEM::@1
return
to:@return
void sinFAC()
sinFAC: scope:[sinFAC] from main::@9
asm { jsr$e26b }
to:sinFAC::@return
sinFAC::@return: scope:[sinFAC] from sinFAC
return
to:@return
void divFACby10()
divFACby10: scope:[divFACby10] from main::@2
asm { jsr$bafe }
to:divFACby10::@return
divFACby10::@return: scope:[divFACby10] from divFACby10
return
to:@return
void main()
main: scope:[main] from __start::@1
print_line_cursor#30 = phi( __start::@1/print_line_cursor#16 )
print_char_cursor#48 = phi( __start::@1/print_char_cursor#35 )
setFAC::w#0 = $4fb
call setFAC
to:main::@2
main::@2: scope:[main] from main
print_line_cursor#29 = phi( main/print_line_cursor#30 )
print_char_cursor#47 = phi( main/print_char_cursor#48 )
call divFACby10
to:main::@3
main::@3: scope:[main] from main::@2
print_line_cursor#28 = phi( main::@2/print_line_cursor#29 )
print_char_cursor#46 = phi( main::@2/print_char_cursor#47 )
setMEMtoFAC::mem#0 = main::f_127
call setMEMtoFAC
to:main::@4
main::@4: scope:[main] from main::@3
print_line_cursor#27 = phi( main::@3/print_line_cursor#28 )
print_char_cursor#45 = phi( main::@3/print_char_cursor#46 )
main::i#0 = 1
to:main::@1
main::@1: scope:[main] from main::@15 main::@4
print_line_cursor#26 = phi( main::@15/print_line_cursor#2, main::@4/print_line_cursor#27 )
print_char_cursor#44 = phi( main::@15/print_char_cursor#11, main::@4/print_char_cursor#45 )
main::i#2 = phi( main::@15/main::i#1, main::@4/main::i#0 )
setFAC::w#1 = (unsigned int)main::i#2
call setFAC
to:main::@5
main::@5: scope:[main] from main::@1
main::i#13 = phi( main::@1/main::i#2 )
print_line_cursor#25 = phi( main::@1/print_line_cursor#26 )
print_char_cursor#43 = phi( main::@1/print_char_cursor#44 )
mulFACbyMEM::mem#0 = main::f_2pi
call mulFACbyMEM
to:main::@6
main::@6: scope:[main] from main::@5
main::i#12 = phi( main::@5/main::i#13 )
print_line_cursor#24 = phi( main::@5/print_line_cursor#25 )
print_char_cursor#42 = phi( main::@5/print_char_cursor#43 )
setMEMtoFAC::mem#1 = main::f_i
call setMEMtoFAC
to:main::@7
main::@7: scope:[main] from main::@6
main::i#11 = phi( main::@6/main::i#12 )
print_line_cursor#23 = phi( main::@6/print_line_cursor#24 )
print_char_cursor#41 = phi( main::@6/print_char_cursor#42 )
setFAC::w#2 = $19
call setFAC
to:main::@8
main::@8: scope:[main] from main::@7
main::i#10 = phi( main::@7/main::i#11 )
print_line_cursor#22 = phi( main::@7/print_line_cursor#23 )
print_char_cursor#40 = phi( main::@7/print_char_cursor#41 )
divMEMbyFAC::mem#0 = main::f_i
call divMEMbyFAC
to:main::@9
main::@9: scope:[main] from main::@8
main::i#9 = phi( main::@8/main::i#10 )
print_line_cursor#21 = phi( main::@8/print_line_cursor#22 )
print_char_cursor#39 = phi( main::@8/print_char_cursor#40 )
call sinFAC
to:main::@10
main::@10: scope:[main] from main::@9
main::i#8 = phi( main::@9/main::i#9 )
print_line_cursor#20 = phi( main::@9/print_line_cursor#21 )
print_char_cursor#38 = phi( main::@9/print_char_cursor#39 )
mulFACbyMEM::mem#1 = main::f_127
call mulFACbyMEM
to:main::@11
main::@11: scope:[main] from main::@10
main::i#7 = phi( main::@10/main::i#8 )
print_line_cursor#19 = phi( main::@10/print_line_cursor#20 )
print_char_cursor#37 = phi( main::@10/print_char_cursor#38 )
addMEMtoFAC::mem#0 = main::f_127
call addMEMtoFAC
to:main::@12
main::@12: scope:[main] from main::@11
main::i#6 = phi( main::@11/main::i#7 )
print_line_cursor#18 = phi( main::@11/print_line_cursor#19 )
print_char_cursor#36 = phi( main::@11/print_char_cursor#37 )
call getFAC
getFAC::return#2 = getFAC::return#1
to:main::@13
main::@13: scope:[main] from main::@12
main::i#5 = phi( main::@12/main::i#6 )
print_line_cursor#17 = phi( main::@12/print_line_cursor#18 )
print_char_cursor#34 = phi( main::@12/print_char_cursor#36 )
getFAC::return#4 = phi( main::@12/getFAC::return#2 )
main::$11 = getFAC::return#4
print_uint::w#0 = main::$11
call print_uint
to:main::@14
main::@14: scope:[main] from main::@13
main::i#4 = phi( main::@13/main::i#5 )
print_line_cursor#15 = phi( main::@13/print_line_cursor#17 )
print_char_cursor#26 = phi( main::@13/print_char_cursor#4 )
print_char_cursor#10 = print_char_cursor#26
call print_ln
to:main::@15
main::@15: scope:[main] from main::@14
main::i#3 = phi( main::@14/main::i#4 )
print_char_cursor#27 = phi( main::@14/print_char_cursor#1 )
print_line_cursor#10 = phi( main::@14/print_line_cursor#1 )
print_line_cursor#2 = print_line_cursor#10
print_char_cursor#11 = print_char_cursor#27
main::i#1 = main::i#3 + rangenext(1,$19)
main::$14 = main::i#1 != rangelast(1,$19)
if(main::$14) goto main::@1
to:main::@return
main::@return: scope:[main] from main::@15
print_line_cursor#11 = phi( main::@15/print_line_cursor#2 )
print_char_cursor#28 = phi( main::@15/print_char_cursor#11 )
print_char_cursor#12 = print_char_cursor#28
print_line_cursor#3 = print_line_cursor#11
return
to:@return
void __start()
__start: scope:[__start] from
to:__start::__init1
__start::__init1: scope:[__start] from __start
print_screen#0 = (char *)$400
print_line_cursor#4 = print_screen#0
print_char_cursor#13 = print_line_cursor#4
to:__start::@1
__start::@1: scope:[__start] from __start::__init1
print_screen#4 = phi( __start::__init1/print_screen#0 )
print_line_cursor#16 = phi( __start::__init1/print_line_cursor#4 )
print_char_cursor#35 = phi( __start::__init1/print_char_cursor#13 )
call main
to:__start::@2
__start::@2: scope:[__start] from __start::@1
print_screen#3 = phi( __start::@1/print_screen#4 )
print_line_cursor#12 = phi( __start::@1/print_line_cursor#3 )
print_char_cursor#29 = phi( __start::@1/print_char_cursor#12 )
print_char_cursor#14 = print_char_cursor#29
print_line_cursor#5 = print_line_cursor#12
to:__start::@return
__start::@return: scope:[__start] from __start::@2
print_char_cursor#30 = phi( __start::@2/print_char_cursor#14 )
print_line_cursor#13 = phi( __start::@2/print_line_cursor#5 )
print_screen#2 = phi( __start::@2/print_screen#3 )
print_screen#1 = print_screen#2
print_line_cursor#6 = print_line_cursor#13
print_char_cursor#15 = print_char_cursor#30
return
to:@return
SYMBOL TABLE SSA
__constant char RADIX::BINARY = 2
__constant char RADIX::DECIMAL = $a
__constant char RADIX::HEXADECIMAL = $10
__constant char RADIX::OCTAL = 8
void __start()
void addMEMtoFAC(char *mem)
char *addMEMtoFAC::mem
char *addMEMtoFAC::mem#0
char *addMEMtoFAC::mem#1
char addMEMtoFAC::prepareMEM1_$0
char addMEMtoFAC::prepareMEM1_$1
unsigned int addMEMtoFAC::prepareMEM1_mem
unsigned int addMEMtoFAC::prepareMEM1_mem#0
unsigned int addMEMtoFAC::prepareMEM1_mem#1
void divFACby10()
void divMEMbyFAC(char *mem)
char *divMEMbyFAC::mem
char *divMEMbyFAC::mem#0
char *divMEMbyFAC::mem#1
char divMEMbyFAC::prepareMEM1_$0
char divMEMbyFAC::prepareMEM1_$1
unsigned int divMEMbyFAC::prepareMEM1_mem
unsigned int divMEMbyFAC::prepareMEM1_mem#0
unsigned int divMEMbyFAC::prepareMEM1_mem#1
unsigned int getFAC()
unsigned int getFAC::return
unsigned int getFAC::return#0
unsigned int getFAC::return#1
unsigned int getFAC::return#2
unsigned int getFAC::return#3
unsigned int getFAC::return#4
unsigned int getFAC::w
unsigned int getFAC::w#0
void main()
unsigned int main::$11
bool main::$14
__constant char main::f_127[] = { 0, 0, 0, 0, 0 }
__constant char * const main::f_2pi = (char *)$e2e5
__constant char main::f_i[] = { 0, 0, 0, 0, 0 }
char main::i
char main::i#0
char main::i#1
char main::i#10
char main::i#11
char main::i#12
char main::i#13
char main::i#2
char main::i#3
char main::i#4
char main::i#5
char main::i#6
char main::i#7
char main::i#8
char main::i#9
__constant char * const memHi = (char *)$ff
__constant char * const memLo = (char *)$fe
void mulFACbyMEM(char *mem)
char *mulFACbyMEM::mem
char *mulFACbyMEM::mem#0
char *mulFACbyMEM::mem#1
char *mulFACbyMEM::mem#2
char mulFACbyMEM::prepareMEM1_$0
char mulFACbyMEM::prepareMEM1_$1
unsigned int mulFACbyMEM::prepareMEM1_mem
unsigned int mulFACbyMEM::prepareMEM1_mem#0
unsigned int mulFACbyMEM::prepareMEM1_mem#1
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#46
char *print_char_cursor#47
char *print_char_cursor#48
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#20
char *print_line_cursor#21
char *print_line_cursor#22
char *print_line_cursor#23
char *print_line_cursor#24
char *print_line_cursor#25
char *print_line_cursor#26
char *print_line_cursor#27
char *print_line_cursor#28
char *print_line_cursor#29
char *print_line_cursor#3
char *print_line_cursor#30
char *print_line_cursor#4
char *print_line_cursor#5
char *print_line_cursor#6
char *print_line_cursor#7
char *print_line_cursor#8
char *print_line_cursor#9
void print_ln()
char *print_ln::$0
bool print_ln::$1
char *print_screen
char *print_screen#0
char *print_screen#1
char *print_screen#2
char *print_screen#3
char *print_screen#4
void print_uchar(char b)
char print_uchar::$0
number print_uchar::$2
char print_uchar::b
char print_uchar::b#0
char print_uchar::b#1
char print_uchar::b#2
char print_uchar::b#3
void print_uint(unsigned int w)
char print_uint::$0
char print_uint::$2
unsigned int print_uint::w
unsigned int print_uint::w#0
unsigned int print_uint::w#1
unsigned int print_uint::w#2
void setFAC(unsigned int w)
char setFAC::prepareMEM1_$0
char setFAC::prepareMEM1_$1
unsigned int setFAC::prepareMEM1_mem
unsigned int setFAC::prepareMEM1_mem#0
unsigned int setFAC::prepareMEM1_mem#1
unsigned int setFAC::w
unsigned int setFAC::w#0
unsigned int setFAC::w#1
unsigned int setFAC::w#2
unsigned int setFAC::w#3
void setMEMtoFAC(char *mem)
char *setMEMtoFAC::mem
char *setMEMtoFAC::mem#0
char *setMEMtoFAC::mem#1
char *setMEMtoFAC::mem#2
char setMEMtoFAC::prepareMEM1_$0
char setMEMtoFAC::prepareMEM1_$1
unsigned int setMEMtoFAC::prepareMEM1_mem
unsigned int setMEMtoFAC::prepareMEM1_mem#0
unsigned int setMEMtoFAC::prepareMEM1_mem#1
void sinFAC()
Adding number conversion cast (unumber) $28 in print_ln::$0 = print_line_cursor#7 + $28
Adding number conversion cast (unumber) 4 in print_uchar::$0 = print_uchar::b#2 >> 4
Adding number conversion cast (unumber) $f in print_uchar::$2 = print_uchar::b#3 & $f
Adding number conversion cast (unumber) print_uchar::$2 in print_uchar::$2 = print_uchar::b#3 & (unumber)$f
Adding number conversion cast (unumber) $4fb in setFAC::w#0 = $4fb
Adding number conversion cast (unumber) $19 in setFAC::w#2 = $19
Successful SSA optimization PassNAddNumberTypeConversions
Inlining cast setFAC::w#0 = (unumber)$4fb
Inlining cast setFAC::w#2 = (unumber)$19
Successful SSA optimization Pass2InlineCast
Simplifying constant pointer cast (char *) 254
Simplifying constant pointer cast (char *) 255
Simplifying constant pointer cast (char *) 58085
Simplifying constant integer cast $28
Simplifying constant integer cast 4
Simplifying constant integer cast $f
Simplifying constant integer cast $4fb
Simplifying constant integer cast $19
Simplifying constant pointer cast (char *) 1024
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (char) $28
Finalized unsigned number type (char) 4
Finalized unsigned number type (char) $f
Finalized unsigned number type (unsigned int) $4fb
Finalized unsigned number type (char) $19
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inferred type updated to char in print_uchar::$2 = print_uchar::b#3 & $f
Alias print_line_cursor#0 = print_ln::$0 print_line_cursor#8 print_char_cursor#0 print_line_cursor#9 print_char_cursor#17 print_line_cursor#1 print_char_cursor#1
Alias print_uchar::b#0 = print_uint::$0
Alias print_uint::w#1 = print_uint::w#2
Alias print_char_cursor#18 = print_char_cursor#2
Alias print_uchar::b#1 = print_uint::$2
Alias print_char_cursor#19 = print_char_cursor#3 print_char_cursor#20 print_char_cursor#4
Alias print_uchar::b#2 = print_uchar::b#3
Alias print_char_cursor#21 = print_char_cursor#5
Alias print_char_cursor#22 = print_char_cursor#6 print_char_cursor#23 print_char_cursor#7
Alias print_char_cursor#25 = print_char_cursor#8 print_char_cursor#9
Alias setFAC::prepareMEM1_mem#0 = setFAC::w#3 setFAC::prepareMEM1_mem#1
Alias getFAC::return#0 = getFAC::w#0 getFAC::return#3 getFAC::return#1
Alias setMEMtoFAC::prepareMEM1_mem#0 = setMEMtoFAC::prepareMEM1_mem#1
Alias addMEMtoFAC::prepareMEM1_mem#0 = addMEMtoFAC::prepareMEM1_mem#1
Alias divMEMbyFAC::prepareMEM1_mem#0 = divMEMbyFAC::prepareMEM1_mem#1
Alias mulFACbyMEM::prepareMEM1_mem#0 = mulFACbyMEM::prepareMEM1_mem#1
Alias print_char_cursor#45 = print_char_cursor#47 print_char_cursor#48 print_char_cursor#46
Alias print_line_cursor#27 = print_line_cursor#29 print_line_cursor#30 print_line_cursor#28
Alias print_char_cursor#34 = print_char_cursor#43 print_char_cursor#44 print_char_cursor#42 print_char_cursor#41 print_char_cursor#40 print_char_cursor#39 print_char_cursor#38 print_char_cursor#37 print_char_cursor#36
Alias print_line_cursor#15 = print_line_cursor#25 print_line_cursor#26 print_line_cursor#24 print_line_cursor#23 print_line_cursor#22 print_line_cursor#21 print_line_cursor#20 print_line_cursor#19 print_line_cursor#18 print_line_cursor#17
Alias main::i#10 = main::i#13 main::i#2 main::i#12 main::i#11 main::i#9 main::i#8 main::i#7 main::i#6 main::i#5 main::i#4 main::i#3
Alias getFAC::return#2 = getFAC::return#4
Alias print_uint::w#0 = main::$11
Alias print_char_cursor#10 = print_char_cursor#26
Alias print_line_cursor#10 = print_line_cursor#2 print_line_cursor#11 print_line_cursor#3
Alias print_char_cursor#11 = print_char_cursor#27 print_char_cursor#28 print_char_cursor#12
Alias print_screen#0 = print_line_cursor#4 print_char_cursor#13 print_char_cursor#35 print_line_cursor#16 print_screen#4 print_screen#3 print_screen#2 print_screen#1
Alias print_char_cursor#14 = print_char_cursor#29 print_char_cursor#30 print_char_cursor#15
Alias print_line_cursor#12 = print_line_cursor#5 print_line_cursor#13 print_line_cursor#6
Successful SSA optimization Pass2AliasElimination
Identical Phi Values print_line_cursor#14 print_line_cursor#15
Identical Phi Values print_char_cursor#31 print_char_cursor#10
Identical Phi Values print_char_cursor#16 print_char_cursor#31
Identical Phi Values print_uint::w#1 print_uint::w#0
Identical Phi Values print_char_cursor#32 print_char_cursor#34
Identical Phi Values print_char_cursor#18 print_char_cursor#22
Identical Phi Values print_char_cursor#19 print_char_cursor#22
Identical Phi Values print_char_cursor#21 print_char_cursor#25
Identical Phi Values print_char_cursor#22 print_char_cursor#25
Identical Phi Values addMEMtoFAC::mem#1 addMEMtoFAC::mem#0
Identical Phi Values divMEMbyFAC::mem#1 divMEMbyFAC::mem#0
Identical Phi Values print_char_cursor#45 print_screen#0
Identical Phi Values print_line_cursor#27 print_screen#0
Identical Phi Values print_char_cursor#10 print_char_cursor#19
Identical Phi Values print_line_cursor#10 print_line_cursor#0
Identical Phi Values print_char_cursor#11 print_line_cursor#0
Identical Phi Values print_char_cursor#14 print_char_cursor#11
Identical Phi Values print_line_cursor#12 print_line_cursor#10
Successful SSA optimization Pass2IdenticalPhiElimination
Simple Condition print_ln::$1 [4] if(print_line_cursor#0<print_char_cursor#25) goto print_ln::@1
Simple Condition main::$14 [106] if(main::i#1!=rangelast(1,$19)) goto main::@1
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant setFAC::w#0 = $4fb
Constant setMEMtoFAC::mem#0 = main::f_127
Constant main::i#0 = 1
Constant mulFACbyMEM::mem#0 = main::f_2pi
Constant setMEMtoFAC::mem#1 = main::f_i
Constant setFAC::w#2 = $19
Constant divMEMbyFAC::mem#0 = main::f_i
Constant mulFACbyMEM::mem#1 = main::f_127
Constant addMEMtoFAC::mem#0 = main::f_127
Constant print_screen#0 = (char *) 1024
Successful SSA optimization Pass2ConstantIdentification
Constant addMEMtoFAC::prepareMEM1_mem#0 = (unsigned int)addMEMtoFAC::mem#0
Constant divMEMbyFAC::prepareMEM1_mem#0 = (unsigned int)divMEMbyFAC::mem#0
Successful SSA optimization Pass2ConstantIdentification
Resolved ranged next value [104] main::i#1 = ++ main::i#10 to ++
Resolved ranged comparison value [106] if(main::i#1!=rangelast(1,$19)) goto main::@1 to $1a
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
Adding number conversion cast (unumber) $1a in [82] if(main::i#1!=$1a) goto main::@1
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant integer cast $1a
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (char) $1a
Successful SSA optimization PassNFinalizeNumberTypeConversions
Constant right-side identified [39] addMEMtoFAC::prepareMEM1_$0 = byte0 addMEMtoFAC::prepareMEM1_mem#0
Constant right-side identified [41] addMEMtoFAC::prepareMEM1_$1 = byte1 addMEMtoFAC::prepareMEM1_mem#0
Constant right-side identified [45] divMEMbyFAC::prepareMEM1_$0 = byte0 divMEMbyFAC::prepareMEM1_mem#0
Constant right-side identified [47] divMEMbyFAC::prepareMEM1_$1 = byte1 divMEMbyFAC::prepareMEM1_mem#0
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant addMEMtoFAC::prepareMEM1_$0 = byte0 addMEMtoFAC::prepareMEM1_mem#0
Constant addMEMtoFAC::prepareMEM1_$1 = byte1 addMEMtoFAC::prepareMEM1_mem#0
Constant divMEMbyFAC::prepareMEM1_$0 = byte0 divMEMbyFAC::prepareMEM1_mem#0
Constant divMEMbyFAC::prepareMEM1_$1 = byte1 divMEMbyFAC::prepareMEM1_mem#0
Successful SSA optimization Pass2ConstantIdentification
Inlining Noop Cast [32] setMEMtoFAC::prepareMEM1_mem#0 = (unsigned int)setMEMtoFAC::mem#2 keeping setMEMtoFAC::mem#2
Inlining Noop Cast [48] mulFACbyMEM::prepareMEM1_mem#0 = (unsigned int)mulFACbyMEM::mem#2 keeping mulFACbyMEM::mem#2
Successful SSA optimization Pass2NopCastInlining
Inlining constant with var siblings setFAC::w#0
Inlining constant with var siblings setFAC::w#2
Inlining constant with var siblings setMEMtoFAC::mem#0
Inlining constant with var siblings setMEMtoFAC::mem#1
Inlining constant with var siblings mulFACbyMEM::mem#0
Inlining constant with var siblings mulFACbyMEM::mem#1
Inlining constant with var siblings main::i#0
Constant inlined addMEMtoFAC::mem#0 = main::f_127
Constant inlined setFAC::w#2 = $19
Constant inlined divMEMbyFAC::prepareMEM1_$0 = byte0 divMEMbyFAC::prepareMEM1_mem#0
Constant inlined divMEMbyFAC::mem#0 = main::f_i
Constant inlined divMEMbyFAC::prepareMEM1_$1 = byte1 divMEMbyFAC::prepareMEM1_mem#0
Constant inlined addMEMtoFAC::prepareMEM1_$0 = byte0 addMEMtoFAC::prepareMEM1_mem#0
Constant inlined main::i#0 = 1
Constant inlined setMEMtoFAC::mem#1 = main::f_i
Constant inlined mulFACbyMEM::mem#0 = main::f_2pi
Constant inlined setMEMtoFAC::mem#0 = main::f_127
Constant inlined mulFACbyMEM::mem#1 = main::f_127
Constant inlined addMEMtoFAC::prepareMEM1_$1 = byte1 addMEMtoFAC::prepareMEM1_mem#0
Constant inlined setFAC::w#0 = $4fb
Successful SSA optimization Pass2ConstantInlining
Finalized unsigned number type (char) 2
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) $a
Finalized unsigned number type (char) $10
Successful SSA optimization PassNFinalizeNumberTypeConversions
Added new block during phi lifting print_ln::@3(between print_ln::@1 and print_ln::@1)
Added new block during phi lifting main::@16(between main::@15 and main::@1)
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of main::@3
Adding NOP phi() at start of main::@4
Adding NOP phi() at start of main::@5
Adding NOP phi() at start of main::@6
Adding NOP phi() at start of main::@7
Adding NOP phi() at start of main::@8
Adding NOP phi() at start of main::@9
Adding NOP phi() at start of main::@10
Adding NOP phi() at start of main::@11
Adding NOP phi() at start of main::@12
Adding NOP phi() at start of main::@14
Adding NOP phi() at start of divMEMbyFAC
Adding NOP phi() at start of addMEMtoFAC
Adding NOP phi() at start of print_uint::@2
Adding NOP phi() at start of print_ln::@2
Adding NOP phi() at start of print_uchar::@2
CALL GRAPH
Calls in [main] to setFAC:1 divFACby10:3 setMEMtoFAC:5 setFAC:10 mulFACbyMEM:12 setMEMtoFAC:14 setFAC:16 divMEMbyFAC:18 sinFAC:20 mulFACbyMEM:22 addMEMtoFAC:24 getFAC:26 print_uint:29 print_ln:31
Calls in [print_uint] to print_uchar:79 print_uchar:83
Calls in [print_uchar] to print_char:98 print_char:103
Created 11 initial phi equivalence classes
Coalesced [9] setFAC::prepareMEM1_mem#2 = setFAC::w#1
Coalesced [35] main::i#14 = main::i#1
Not coalescing [36] print_char_cursor#53 = print_line_cursor#0
Coalesced [37] print_line_cursor#33 = print_line_cursor#0
Coalesced [77] print_uchar::b#4 = print_uchar::b#0
Coalesced [78] print_char_cursor#49 = print_char_cursor#34
Coalesced [81] print_uchar::b#5 = print_uchar::b#1
Coalesced [82] print_char_cursor#50 = print_char_cursor#25
Coalesced [86] print_line_cursor#31 = print_line_cursor#15
Coalesced (already) [92] print_line_cursor#32 = print_line_cursor#0
Coalesced [96] print_char::ch#3 = print_char::ch#0
Coalesced [97] print_char_cursor#51 = print_char_cursor#33
Coalesced [101] print_char::ch#4 = print_char::ch#1
Coalesced (already) [102] print_char_cursor#52 = print_char_cursor#25
Coalesced down to 8 phi equivalence classes
Culled Empty Block label main::@4
Culled Empty Block label print_uint::@2
Culled Empty Block label print_ln::@2
Culled Empty Block label print_ln::@3
Culled Empty Block label print_uchar::@2
Renumbering block main::@5 to main::@4
Renumbering block main::@6 to main::@5
Renumbering block main::@7 to main::@6
Renumbering block main::@8 to main::@7
Renumbering block main::@9 to main::@8
Renumbering block main::@10 to main::@9
Renumbering block main::@11 to main::@10
Renumbering block main::@12 to main::@11
Renumbering block main::@13 to main::@12
Renumbering block main::@14 to main::@13
Renumbering block main::@15 to main::@14
Renumbering block main::@16 to main::@15
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of main::@3
Adding NOP phi() at start of main::@4
Adding NOP phi() at start of main::@5
Adding NOP phi() at start of main::@6
Adding NOP phi() at start of main::@7
Adding NOP phi() at start of main::@8
Adding NOP phi() at start of main::@9
Adding NOP phi() at start of main::@10
Adding NOP phi() at start of main::@11
Adding NOP phi() at start of main::@13
Adding NOP phi() at start of divMEMbyFAC
Adding NOP phi() at start of addMEMtoFAC
Adding NOP phi() at start of print_ln
FINAL CONTROL FLOW GRAPH
void main()
main: scope:[main] from
[0] phi()
[1] call setFAC
to:main::@2
main::@2: scope:[main] from main
[2] phi()
[3] call divFACby10
to:main::@3
main::@3: scope:[main] from main::@2
[4] phi()
[5] call setMEMtoFAC
to:main::@1
main::@1: scope:[main] from main::@15 main::@3
[6] print_line_cursor#15 = phi( main::@15/print_line_cursor#0, main::@3/print_screen#0 )
[6] print_char_cursor#34 = phi( main::@15/print_char_cursor#53, main::@3/print_screen#0 )
[6] main::i#10 = phi( main::@15/main::i#1, main::@3/1 )
[7] setFAC::w#1 = (unsigned int)main::i#10
[8] call setFAC
to:main::@4
main::@4: scope:[main] from main::@1
[9] phi()
[10] call mulFACbyMEM
to:main::@5
main::@5: scope:[main] from main::@4
[11] phi()
[12] call setMEMtoFAC
to:main::@6
main::@6: scope:[main] from main::@5
[13] phi()
[14] call setFAC
to:main::@7
main::@7: scope:[main] from main::@6
[15] phi()
[16] call divMEMbyFAC
to:main::@8
main::@8: scope:[main] from main::@7
[17] phi()
[18] call sinFAC
to:main::@9
main::@9: scope:[main] from main::@8
[19] phi()
[20] call mulFACbyMEM
to:main::@10
main::@10: scope:[main] from main::@9
[21] phi()
[22] call addMEMtoFAC
to:main::@11
main::@11: scope:[main] from main::@10
[23] phi()
[24] call getFAC
[25] getFAC::return#2 = getFAC::return#0
to:main::@12
main::@12: scope:[main] from main::@11
[26] print_uint::w#0 = getFAC::return#2
[27] call print_uint
to:main::@13
main::@13: scope:[main] from main::@12
[28] phi()
[29] call print_ln
to:main::@14
main::@14: scope:[main] from main::@13
[30] main::i#1 = ++ main::i#10
[31] if(main::i#1!=$1a) goto main::@15
to:main::@return
main::@return: scope:[main] from main::@14
[32] return
to:@return
main::@15: scope:[main] from main::@14
[33] print_char_cursor#53 = print_line_cursor#0
to:main::@1
void setFAC(unsigned int w)
setFAC: scope:[setFAC] from main main::@1 main::@6
[34] setFAC::prepareMEM1_mem#0 = phi( main/$4fb, main::@1/setFAC::w#1, main::@6/$19 )
to:setFAC::prepareMEM1
setFAC::prepareMEM1: scope:[setFAC] from setFAC
[35] setFAC::prepareMEM1_$0 = byte0 setFAC::prepareMEM1_mem#0
[36] *memLo = setFAC::prepareMEM1_$0
[37] setFAC::prepareMEM1_$1 = byte1 setFAC::prepareMEM1_mem#0
[38] *memHi = setFAC::prepareMEM1_$1
to:setFAC::@1
setFAC::@1: scope:[setFAC] from setFAC::prepareMEM1
asm { ldymemLo ldamemHi jsr$b391 }
to:setFAC::@return
setFAC::@return: scope:[setFAC] from setFAC::@1
[40] return
to:@return
void divFACby10()
divFACby10: scope:[divFACby10] from main::@2
asm { jsr$bafe }
to:divFACby10::@return
divFACby10::@return: scope:[divFACby10] from divFACby10
[42] return
to:@return
void setMEMtoFAC(char *mem)
setMEMtoFAC: scope:[setMEMtoFAC] from main::@3 main::@5
[43] setMEMtoFAC::mem#2 = phi( main::@3/main::f_127, main::@5/main::f_i )
to:setMEMtoFAC::prepareMEM1
setMEMtoFAC::prepareMEM1: scope:[setMEMtoFAC] from setMEMtoFAC
[44] setMEMtoFAC::prepareMEM1_$0 = byte0 (unsigned int)setMEMtoFAC::mem#2
[45] *memLo = setMEMtoFAC::prepareMEM1_$0
[46] setMEMtoFAC::prepareMEM1_$1 = byte1 (unsigned int)setMEMtoFAC::mem#2
[47] *memHi = setMEMtoFAC::prepareMEM1_$1
to:setMEMtoFAC::@1
setMEMtoFAC::@1: scope:[setMEMtoFAC] from setMEMtoFAC::prepareMEM1
asm { ldxmemLo ldymemHi jsr$bbd4 }
to:setMEMtoFAC::@return
setMEMtoFAC::@return: scope:[setMEMtoFAC] from setMEMtoFAC::@1
[49] return
to:@return
void mulFACbyMEM(char *mem)
mulFACbyMEM: scope:[mulFACbyMEM] from main::@4 main::@9
[50] mulFACbyMEM::mem#2 = phi( main::@9/main::f_127, main::@4/main::f_2pi )
to:mulFACbyMEM::prepareMEM1
mulFACbyMEM::prepareMEM1: scope:[mulFACbyMEM] from mulFACbyMEM
[51] mulFACbyMEM::prepareMEM1_$0 = byte0 (unsigned int)mulFACbyMEM::mem#2
[52] *memLo = mulFACbyMEM::prepareMEM1_$0
[53] mulFACbyMEM::prepareMEM1_$1 = byte1 (unsigned int)mulFACbyMEM::mem#2
[54] *memHi = mulFACbyMEM::prepareMEM1_$1
to:mulFACbyMEM::@1
mulFACbyMEM::@1: scope:[mulFACbyMEM] from mulFACbyMEM::prepareMEM1
asm { ldamemLo ldymemHi jsr$ba28 }
to:mulFACbyMEM::@return
mulFACbyMEM::@return: scope:[mulFACbyMEM] from mulFACbyMEM::@1
[56] return
to:@return
void divMEMbyFAC(char *mem)
divMEMbyFAC: scope:[divMEMbyFAC] from main::@7
[57] phi()
to:divMEMbyFAC::prepareMEM1
divMEMbyFAC::prepareMEM1: scope:[divMEMbyFAC] from divMEMbyFAC
[58] *memLo = byte0 divMEMbyFAC::prepareMEM1_mem#0
[59] *memHi = byte1 divMEMbyFAC::prepareMEM1_mem#0
to:divMEMbyFAC::@1
divMEMbyFAC::@1: scope:[divMEMbyFAC] from divMEMbyFAC::prepareMEM1
asm { ldamemLo ldymemHi jsr$bb0f }
to:divMEMbyFAC::@return
divMEMbyFAC::@return: scope:[divMEMbyFAC] from divMEMbyFAC::@1
[61] return
to:@return
void sinFAC()
sinFAC: scope:[sinFAC] from main::@8
asm { jsr$e26b }
to:sinFAC::@return
sinFAC::@return: scope:[sinFAC] from sinFAC
[63] return
to:@return
void addMEMtoFAC(char *mem)
addMEMtoFAC: scope:[addMEMtoFAC] from main::@10
[64] phi()
to:addMEMtoFAC::prepareMEM1
addMEMtoFAC::prepareMEM1: scope:[addMEMtoFAC] from addMEMtoFAC
[65] *memLo = byte0 addMEMtoFAC::prepareMEM1_mem#0
[66] *memHi = byte1 addMEMtoFAC::prepareMEM1_mem#0
to:addMEMtoFAC::@1
addMEMtoFAC::@1: scope:[addMEMtoFAC] from addMEMtoFAC::prepareMEM1
asm { ldamemLo ldymemHi jsr$b867 }
to:addMEMtoFAC::@return
addMEMtoFAC::@return: scope:[addMEMtoFAC] from addMEMtoFAC::@1
[68] return
to:@return
unsigned int getFAC()
getFAC: scope:[getFAC] from main::@11
asm { jsr$b1aa stymemLo stamemHi }
[70] getFAC::return#0 = *memHi w= *memLo
to:getFAC::@return
getFAC::@return: scope:[getFAC] from getFAC
[71] return
to:@return
void print_uint(unsigned int w)
print_uint: scope:[print_uint] from main::@12
[72] print_uchar::b#0 = byte1 print_uint::w#0
[73] call print_uchar
to:print_uint::@1
print_uint::@1: scope:[print_uint] from print_uint
[74] print_uchar::b#1 = byte0 print_uint::w#0
[75] call print_uchar
to:print_uint::@return
print_uint::@return: scope:[print_uint] from print_uint::@1
[76] return
to:@return
void print_ln()
print_ln: scope:[print_ln] from main::@13
[77] phi()
to:print_ln::@1
print_ln::@1: scope:[print_ln] from print_ln print_ln::@1
[78] print_line_cursor#7 = phi( print_ln/print_line_cursor#15, print_ln::@1/print_line_cursor#0 )
[79] print_line_cursor#0 = print_line_cursor#7 + $28
[80] if(print_line_cursor#0<print_char_cursor#25) goto print_ln::@1
to:print_ln::@return
print_ln::@return: scope:[print_ln] from print_ln::@1
[81] return
to:@return
void print_uchar(char b)
print_uchar: scope:[print_uchar] from print_uint print_uint::@1
[82] print_char_cursor#33 = phi( print_uint/print_char_cursor#34, print_uint::@1/print_char_cursor#25 )
[82] print_uchar::b#2 = phi( print_uint/print_uchar::b#0, print_uint::@1/print_uchar::b#1 )
[83] print_uchar::$0 = print_uchar::b#2 >> 4
[84] print_char::ch#0 = print_hextab[print_uchar::$0]
[85] call print_char
to:print_uchar::@1
print_uchar::@1: scope:[print_uchar] from print_uchar
[86] print_uchar::$2 = print_uchar::b#2 & $f
[87] print_char::ch#1 = print_hextab[print_uchar::$2]
[88] call print_char
to:print_uchar::@return
print_uchar::@return: scope:[print_uchar] from print_uchar::@1
[89] return
to:@return
void print_char(char ch)
print_char: scope:[print_char] from print_uchar print_uchar::@1
[90] print_char_cursor#24 = phi( print_uchar/print_char_cursor#33, print_uchar::@1/print_char_cursor#25 )
[90] print_char::ch#2 = phi( print_uchar/print_char::ch#0, print_uchar::@1/print_char::ch#1 )
[91] *print_char_cursor#24 = print_char::ch#2
[92] print_char_cursor#25 = ++ print_char_cursor#24
to:print_char::@return
print_char::@return: scope:[print_char] from print_char
[93] return
to:@return
VARIABLE REGISTER WEIGHTS
void addMEMtoFAC(char *mem)
char *addMEMtoFAC::mem
unsigned int addMEMtoFAC::prepareMEM1_mem
void divFACby10()
void divMEMbyFAC(char *mem)
char *divMEMbyFAC::mem
unsigned int divMEMbyFAC::prepareMEM1_mem
unsigned int getFAC()
unsigned int getFAC::return
unsigned int getFAC::return#0 // 37.33333333333333
unsigned int getFAC::return#2 // 22.0
unsigned int getFAC::w
void main()
char main::i
char main::i#1 // 11.0
char main::i#10 // 0.9166666666666666
void mulFACbyMEM(char *mem)
char *mulFACbyMEM::mem
char *mulFACbyMEM::mem#2
char mulFACbyMEM::prepareMEM1_$0 // 202.0
char mulFACbyMEM::prepareMEM1_$1 // 202.0
unsigned int mulFACbyMEM::prepareMEM1_mem
void print_char(char ch)
char print_char::ch
char print_char::ch#0 // 2002.0
char print_char::ch#1 // 2002.0
char print_char::ch#2 // 12003.0
char *print_char_cursor
char *print_char_cursor#24 // 11002.0
char *print_char_cursor#25 // 1241.4117647058824
char *print_char_cursor#33 // 401.0
char *print_char_cursor#34 // 5.090909090909091
char *print_char_cursor#53 // 22.0
char *print_line_cursor
char *print_line_cursor#0 // 4289.285714285714
char *print_line_cursor#15 // 4.666666666666666
char *print_line_cursor#7 // 20103.0
void print_ln()
char *print_screen
void print_uchar(char b)
char print_uchar::$0 // 2002.0
char print_uchar::$2 // 2002.0
char print_uchar::b
char print_uchar::b#0 // 202.0
char print_uchar::b#1 // 202.0
char print_uchar::b#2 // 551.0
void print_uint(unsigned int w)
unsigned int print_uint::w
unsigned int print_uint::w#0 // 71.0
void setFAC(unsigned int w)
char setFAC::prepareMEM1_$0 // 202.0
char setFAC::prepareMEM1_$1 // 202.0
unsigned int setFAC::prepareMEM1_mem
unsigned int setFAC::prepareMEM1_mem#0 // 71.0
unsigned int setFAC::w
unsigned int setFAC::w#1 // 22.0
void setMEMtoFAC(char *mem)
char *setMEMtoFAC::mem
char *setMEMtoFAC::mem#2
char setMEMtoFAC::prepareMEM1_$0 // 202.0
char setMEMtoFAC::prepareMEM1_$1 // 202.0
unsigned int setMEMtoFAC::prepareMEM1_mem
void sinFAC()
Initial phi equivalence classes
[ main::i#10 main::i#1 ]
[ setFAC::prepareMEM1_mem#0 setFAC::w#1 ]
[ setMEMtoFAC::mem#2 ]
[ mulFACbyMEM::mem#2 ]
[ print_line_cursor#7 print_line_cursor#15 print_line_cursor#0 ]
[ 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#24 print_char_cursor#33 print_char_cursor#34 print_char_cursor#53 print_char_cursor#25 ]
Added variable getFAC::return#2 to live range equivalence class [ getFAC::return#2 ]
Added variable print_uint::w#0 to live range equivalence class [ print_uint::w#0 ]
Added variable setFAC::prepareMEM1_$0 to live range equivalence class [ setFAC::prepareMEM1_$0 ]
Added variable setFAC::prepareMEM1_$1 to live range equivalence class [ setFAC::prepareMEM1_$1 ]
Added variable setMEMtoFAC::prepareMEM1_$0 to live range equivalence class [ setMEMtoFAC::prepareMEM1_$0 ]
Added variable setMEMtoFAC::prepareMEM1_$1 to live range equivalence class [ setMEMtoFAC::prepareMEM1_$1 ]
Added variable mulFACbyMEM::prepareMEM1_$0 to live range equivalence class [ mulFACbyMEM::prepareMEM1_$0 ]
Added variable mulFACbyMEM::prepareMEM1_$1 to live range equivalence class [ mulFACbyMEM::prepareMEM1_$1 ]
Added variable getFAC::return#0 to live range equivalence class [ getFAC::return#0 ]
Added variable print_uchar::$0 to live range equivalence class [ print_uchar::$0 ]
Added variable print_uchar::$2 to live range equivalence class [ print_uchar::$2 ]
Complete equivalence classes
[ main::i#10 main::i#1 ]
[ setFAC::prepareMEM1_mem#0 setFAC::w#1 ]
[ setMEMtoFAC::mem#2 ]
[ mulFACbyMEM::mem#2 ]
[ print_line_cursor#7 print_line_cursor#15 print_line_cursor#0 ]
[ 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#24 print_char_cursor#33 print_char_cursor#34 print_char_cursor#53 print_char_cursor#25 ]
[ getFAC::return#2 ]
[ print_uint::w#0 ]
[ setFAC::prepareMEM1_$0 ]
[ setFAC::prepareMEM1_$1 ]
[ setMEMtoFAC::prepareMEM1_$0 ]
[ setMEMtoFAC::prepareMEM1_$1 ]
[ mulFACbyMEM::prepareMEM1_$0 ]
[ mulFACbyMEM::prepareMEM1_$1 ]
[ getFAC::return#0 ]
[ print_uchar::$0 ]
[ print_uchar::$2 ]
Allocated zp[2]:2 [ print_line_cursor#7 print_line_cursor#15 print_line_cursor#0 ]
Allocated zp[1]:4 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
Allocated zp[2]:5 [ print_char_cursor#24 print_char_cursor#33 print_char_cursor#34 print_char_cursor#53 print_char_cursor#25 ]
Allocated zp[1]:7 [ print_uchar::$0 ]
Allocated zp[1]:8 [ print_uchar::$2 ]
Allocated zp[1]:9 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Allocated zp[1]:10 [ setFAC::prepareMEM1_$0 ]
Allocated zp[1]:11 [ setFAC::prepareMEM1_$1 ]
Allocated zp[1]:12 [ setMEMtoFAC::prepareMEM1_$0 ]
Allocated zp[1]:13 [ setMEMtoFAC::prepareMEM1_$1 ]
Allocated zp[1]:14 [ mulFACbyMEM::prepareMEM1_$0 ]
Allocated zp[1]:15 [ mulFACbyMEM::prepareMEM1_$1 ]
Allocated zp[2]:16 [ setFAC::prepareMEM1_mem#0 setFAC::w#1 ]
Allocated zp[2]:18 [ print_uint::w#0 ]
Allocated zp[2]:20 [ getFAC::return#0 ]
Allocated zp[2]:22 [ getFAC::return#2 ]
Allocated zp[1]:24 [ main::i#10 main::i#1 ]
Allocated zp[2]:25 [ setMEMtoFAC::mem#2 ]
Allocated zp[2]:27 [ mulFACbyMEM::mem#2 ]
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [7] setFAC::w#1 = (unsigned int)main::i#10 [ main::i#10 print_char_cursor#34 print_line_cursor#15 setFAC::w#1 ] ( [ main::i#10 print_char_cursor#34 print_line_cursor#15 setFAC::w#1 ] { { setFAC::prepareMEM1_mem#0 = setFAC::w#1 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:24 [ main::i#10 main::i#1 ]
Statement [25] getFAC::return#2 = getFAC::return#0 [ main::i#10 print_char_cursor#34 print_line_cursor#15 getFAC::return#2 ] ( [ main::i#10 print_char_cursor#34 print_line_cursor#15 getFAC::return#2 ] { { getFAC::return#0 = getFAC::return#2 } } ) always clobbers reg byte a
Statement [26] print_uint::w#0 = getFAC::return#2 [ main::i#10 print_char_cursor#34 print_line_cursor#15 print_uint::w#0 ] ( [ main::i#10 print_char_cursor#34 print_line_cursor#15 print_uint::w#0 ] { { print_uint::w#0 = getFAC::return#2 } } ) always clobbers reg byte a
Statement [33] print_char_cursor#53 = print_line_cursor#0 [ main::i#1 print_char_cursor#53 print_line_cursor#0 ] ( [ main::i#1 print_char_cursor#53 print_line_cursor#0 ] { } ) always clobbers reg byte a
Statement asm { ldymemLo ldamemHi jsr$b391 } always clobbers reg byte a reg byte x reg byte y
Removing always clobbered register reg byte x as potential for zp[1]:24 [ main::i#10 main::i#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:24 [ main::i#10 main::i#1 ]
Statement asm { jsr$bafe } always clobbers reg byte a reg byte x reg byte y
Statement asm { ldxmemLo ldymemHi jsr$bbd4 } always clobbers reg byte a reg byte x reg byte y
Statement asm { ldamemLo ldymemHi jsr$ba28 } always clobbers reg byte a reg byte x reg byte y
Statement [58] *memLo = byte0 divMEMbyFAC::prepareMEM1_mem#0 [ ] ( divMEMbyFAC:16 [ main::i#10 print_char_cursor#34 print_line_cursor#15 ] { } ) always clobbers reg byte a
Statement [59] *memHi = byte1 divMEMbyFAC::prepareMEM1_mem#0 [ ] ( divMEMbyFAC:16 [ main::i#10 print_char_cursor#34 print_line_cursor#15 ] { } ) always clobbers reg byte a
Statement asm { ldamemLo ldymemHi jsr$bb0f } always clobbers reg byte a reg byte x reg byte y
Statement asm { jsr$e26b } always clobbers reg byte a reg byte x reg byte y
Statement [65] *memLo = byte0 addMEMtoFAC::prepareMEM1_mem#0 [ ] ( addMEMtoFAC:22 [ main::i#10 print_char_cursor#34 print_line_cursor#15 ] { } ) always clobbers reg byte a
Statement [66] *memHi = byte1 addMEMtoFAC::prepareMEM1_mem#0 [ ] ( addMEMtoFAC:22 [ main::i#10 print_char_cursor#34 print_line_cursor#15 ] { } ) always clobbers reg byte a
Statement asm { ldamemLo ldymemHi jsr$b867 } always clobbers reg byte a reg byte x reg byte y
Statement asm { jsr$b1aa stymemLo stamemHi } always clobbers reg byte a reg byte x reg byte y
Statement [70] getFAC::return#0 = *memHi w= *memLo [ getFAC::return#0 ] ( getFAC:24 [ main::i#10 print_char_cursor#34 print_line_cursor#15 getFAC::return#0 ] { { getFAC::return#0 = getFAC::return#2 } } ) always clobbers reg byte a
Statement [79] print_line_cursor#0 = print_line_cursor#7 + $28 [ print_line_cursor#0 print_char_cursor#25 ] ( print_ln:29 [ main::i#10 print_line_cursor#0 print_char_cursor#25 ] { } ) always clobbers reg byte a
Statement [80] if(print_line_cursor#0<print_char_cursor#25) goto print_ln::@1 [ print_line_cursor#0 print_char_cursor#25 ] ( print_ln:29 [ main::i#10 print_line_cursor#0 print_char_cursor#25 ] { } ) always clobbers reg byte a
Statement [83] print_uchar::$0 = print_uchar::b#2 >> 4 [ print_uchar::b#2 print_char_cursor#33 print_uchar::$0 ] ( print_uint:27::print_uchar:73 [ main::i#10 print_line_cursor#15 print_uint::w#0 print_uchar::b#2 print_char_cursor#33 print_uchar::$0 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#24 = print_char_cursor#33 print_char_cursor#34 } { print_char::ch#0 = print_char::ch#2 } } print_uint:27::print_uchar:75 [ main::i#10 print_line_cursor#15 print_uchar::b#2 print_char_cursor#33 print_uchar::$0 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#24 = print_char_cursor#33 print_char_cursor#25 } { 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]:9 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Statement [86] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#25 print_uchar::$2 ] ( print_uint:27::print_uchar:73 [ main::i#10 print_line_cursor#15 print_uint::w#0 print_char_cursor#25 print_uchar::$2 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#33 = print_char_cursor#34 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#24 = print_char_cursor#25 } } print_uint:27::print_uchar:75 [ main::i#10 print_line_cursor#15 print_char_cursor#25 print_uchar::$2 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#24 = print_char_cursor#33 print_char_cursor#25 } { print_char::ch#1 = print_char::ch#2 } } ) always clobbers reg byte a
Statement [91] *print_char_cursor#24 = print_char::ch#2 [ print_char_cursor#24 ] ( print_uint:27::print_uchar:73::print_char:85 [ main::i#10 print_line_cursor#15 print_uint::w#0 print_uchar::b#2 print_char_cursor#24 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#24 = print_char_cursor#33 print_char_cursor#34 } { print_char::ch#0 = print_char::ch#2 } } print_uint:27::print_uchar:75::print_char:85 [ main::i#10 print_line_cursor#15 print_uchar::b#2 print_char_cursor#24 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#24 = print_char_cursor#33 print_char_cursor#25 } { print_char::ch#0 = print_char::ch#2 } } print_uint:27::print_uchar:73::print_char:88 [ main::i#10 print_line_cursor#15 print_uint::w#0 print_char_cursor#24 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#33 = print_char_cursor#34 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#24 = print_char_cursor#25 } } print_uint:27::print_uchar:75::print_char:88 [ main::i#10 print_line_cursor#15 print_char_cursor#24 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#24 = print_char_cursor#33 print_char_cursor#25 } { 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]:9 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Statement [7] setFAC::w#1 = (unsigned int)main::i#10 [ main::i#10 print_char_cursor#34 print_line_cursor#15 setFAC::w#1 ] ( [ main::i#10 print_char_cursor#34 print_line_cursor#15 setFAC::w#1 ] { { setFAC::prepareMEM1_mem#0 = setFAC::w#1 } } ) always clobbers reg byte a
Statement [25] getFAC::return#2 = getFAC::return#0 [ main::i#10 print_char_cursor#34 print_line_cursor#15 getFAC::return#2 ] ( [ main::i#10 print_char_cursor#34 print_line_cursor#15 getFAC::return#2 ] { { getFAC::return#0 = getFAC::return#2 } } ) always clobbers reg byte a
Statement [26] print_uint::w#0 = getFAC::return#2 [ main::i#10 print_char_cursor#34 print_line_cursor#15 print_uint::w#0 ] ( [ main::i#10 print_char_cursor#34 print_line_cursor#15 print_uint::w#0 ] { { print_uint::w#0 = getFAC::return#2 } } ) always clobbers reg byte a
Statement [31] if(main::i#1!=$1a) goto main::@15 [ main::i#1 print_line_cursor#0 ] ( [ main::i#1 print_line_cursor#0 ] { } ) always clobbers reg byte a
Statement [33] print_char_cursor#53 = print_line_cursor#0 [ main::i#1 print_char_cursor#53 print_line_cursor#0 ] ( [ main::i#1 print_char_cursor#53 print_line_cursor#0 ] { } ) always clobbers reg byte a
Statement asm { ldymemLo ldamemHi jsr$b391 } always clobbers reg byte a reg byte x reg byte y
Statement asm { jsr$bafe } always clobbers reg byte a reg byte x reg byte y
Statement asm { ldxmemLo ldymemHi jsr$bbd4 } always clobbers reg byte a reg byte x reg byte y
Statement asm { ldamemLo ldymemHi jsr$ba28 } always clobbers reg byte a reg byte x reg byte y
Statement [58] *memLo = byte0 divMEMbyFAC::prepareMEM1_mem#0 [ ] ( divMEMbyFAC:16 [ main::i#10 print_char_cursor#34 print_line_cursor#15 ] { } ) always clobbers reg byte a
Statement [59] *memHi = byte1 divMEMbyFAC::prepareMEM1_mem#0 [ ] ( divMEMbyFAC:16 [ main::i#10 print_char_cursor#34 print_line_cursor#15 ] { } ) always clobbers reg byte a
Statement asm { ldamemLo ldymemHi jsr$bb0f } always clobbers reg byte a reg byte x reg byte y
Statement asm { jsr$e26b } always clobbers reg byte a reg byte x reg byte y
Statement [65] *memLo = byte0 addMEMtoFAC::prepareMEM1_mem#0 [ ] ( addMEMtoFAC:22 [ main::i#10 print_char_cursor#34 print_line_cursor#15 ] { } ) always clobbers reg byte a
Statement [66] *memHi = byte1 addMEMtoFAC::prepareMEM1_mem#0 [ ] ( addMEMtoFAC:22 [ main::i#10 print_char_cursor#34 print_line_cursor#15 ] { } ) always clobbers reg byte a
Statement asm { ldamemLo ldymemHi jsr$b867 } always clobbers reg byte a reg byte x reg byte y
Statement asm { jsr$b1aa stymemLo stamemHi } always clobbers reg byte a reg byte x reg byte y
Statement [70] getFAC::return#0 = *memHi w= *memLo [ getFAC::return#0 ] ( getFAC:24 [ main::i#10 print_char_cursor#34 print_line_cursor#15 getFAC::return#0 ] { { getFAC::return#0 = getFAC::return#2 } } ) always clobbers reg byte a
Statement [79] print_line_cursor#0 = print_line_cursor#7 + $28 [ print_line_cursor#0 print_char_cursor#25 ] ( print_ln:29 [ main::i#10 print_line_cursor#0 print_char_cursor#25 ] { } ) always clobbers reg byte a
Statement [80] if(print_line_cursor#0<print_char_cursor#25) goto print_ln::@1 [ print_line_cursor#0 print_char_cursor#25 ] ( print_ln:29 [ main::i#10 print_line_cursor#0 print_char_cursor#25 ] { } ) always clobbers reg byte a
Statement [83] print_uchar::$0 = print_uchar::b#2 >> 4 [ print_uchar::b#2 print_char_cursor#33 print_uchar::$0 ] ( print_uint:27::print_uchar:73 [ main::i#10 print_line_cursor#15 print_uint::w#0 print_uchar::b#2 print_char_cursor#33 print_uchar::$0 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#24 = print_char_cursor#33 print_char_cursor#34 } { print_char::ch#0 = print_char::ch#2 } } print_uint:27::print_uchar:75 [ main::i#10 print_line_cursor#15 print_uchar::b#2 print_char_cursor#33 print_uchar::$0 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#24 = print_char_cursor#33 print_char_cursor#25 } { print_char::ch#0 = print_char::ch#2 } } ) always clobbers reg byte a
Statement [86] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#25 print_uchar::$2 ] ( print_uint:27::print_uchar:73 [ main::i#10 print_line_cursor#15 print_uint::w#0 print_char_cursor#25 print_uchar::$2 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#33 = print_char_cursor#34 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#24 = print_char_cursor#25 } } print_uint:27::print_uchar:75 [ main::i#10 print_line_cursor#15 print_char_cursor#25 print_uchar::$2 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#24 = print_char_cursor#33 print_char_cursor#25 } { print_char::ch#1 = print_char::ch#2 } } ) always clobbers reg byte a
Statement [91] *print_char_cursor#24 = print_char::ch#2 [ print_char_cursor#24 ] ( print_uint:27::print_uchar:73::print_char:85 [ main::i#10 print_line_cursor#15 print_uint::w#0 print_uchar::b#2 print_char_cursor#24 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#24 = print_char_cursor#33 print_char_cursor#34 } { print_char::ch#0 = print_char::ch#2 } } print_uint:27::print_uchar:75::print_char:85 [ main::i#10 print_line_cursor#15 print_uchar::b#2 print_char_cursor#24 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#24 = print_char_cursor#33 print_char_cursor#25 } { print_char::ch#0 = print_char::ch#2 } } print_uint:27::print_uchar:73::print_char:88 [ main::i#10 print_line_cursor#15 print_uint::w#0 print_char_cursor#24 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#0 = print_uchar::b#2 } { print_char_cursor#33 = print_char_cursor#34 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#24 = print_char_cursor#25 } } print_uint:27::print_uchar:75::print_char:88 [ main::i#10 print_line_cursor#15 print_char_cursor#24 ] { { print_uint::w#0 = getFAC::return#2 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#24 = print_char_cursor#33 print_char_cursor#25 } { print_char::ch#1 = print_char::ch#2 } } ) always clobbers reg byte y
Potential registers zp[1]:24 [ main::i#10 main::i#1 ] : zp[1]:24 ,
Potential registers zp[2]:16 [ setFAC::prepareMEM1_mem#0 setFAC::w#1 ] : zp[2]:16 ,
Potential registers zp[2]:25 [ setMEMtoFAC::mem#2 ] : zp[2]:25 ,
Potential registers zp[2]:27 [ mulFACbyMEM::mem#2 ] : zp[2]:27 ,
Potential registers zp[2]:2 [ print_line_cursor#7 print_line_cursor#15 print_line_cursor#0 ] : zp[2]:2 ,
Potential registers zp[1]:9 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] : zp[1]:9 , reg byte x ,
Potential registers zp[1]:4 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ] : zp[1]:4 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[2]:5 [ print_char_cursor#24 print_char_cursor#33 print_char_cursor#34 print_char_cursor#53 print_char_cursor#25 ] : zp[2]:5 ,
Potential registers zp[2]:22 [ getFAC::return#2 ] : zp[2]:22 ,
Potential registers zp[2]:18 [ print_uint::w#0 ] : zp[2]:18 ,
Potential registers zp[1]:10 [ setFAC::prepareMEM1_$0 ] : zp[1]:10 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:11 [ setFAC::prepareMEM1_$1 ] : zp[1]:11 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:12 [ setMEMtoFAC::prepareMEM1_$0 ] : zp[1]:12 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:13 [ setMEMtoFAC::prepareMEM1_$1 ] : zp[1]:13 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:14 [ mulFACbyMEM::prepareMEM1_$0 ] : zp[1]:14 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:15 [ mulFACbyMEM::prepareMEM1_$1 ] : zp[1]:15 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[2]:20 [ getFAC::return#0 ] : zp[2]:20 ,
Potential registers zp[1]:7 [ print_uchar::$0 ] : zp[1]:7 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:8 [ print_uchar::$2 ] : zp[1]:8 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [] 24,396.95: zp[2]:2 [ print_line_cursor#7 print_line_cursor#15 print_line_cursor#0 ] 12,671.5: zp[2]:5 [ print_char_cursor#24 print_char_cursor#33 print_char_cursor#34 print_char_cursor#53 print_char_cursor#25 ]
Uplift Scope [print_char] 16,007: zp[1]:4 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
Uplift Scope [print_uchar] 2,002: zp[1]:7 [ print_uchar::$0 ] 2,002: zp[1]:8 [ print_uchar::$2 ] 955: zp[1]:9 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
Uplift Scope [setFAC] 202: zp[1]:10 [ setFAC::prepareMEM1_$0 ] 202: zp[1]:11 [ setFAC::prepareMEM1_$1 ] 93: zp[2]:16 [ setFAC::prepareMEM1_mem#0 setFAC::w#1 ]
Uplift Scope [setMEMtoFAC] 202: zp[1]:12 [ setMEMtoFAC::prepareMEM1_$0 ] 202: zp[1]:13 [ setMEMtoFAC::prepareMEM1_$1 ] 0: zp[2]:25 [ setMEMtoFAC::mem#2 ]
Uplift Scope [mulFACbyMEM] 202: zp[1]:14 [ mulFACbyMEM::prepareMEM1_$0 ] 202: zp[1]:15 [ mulFACbyMEM::prepareMEM1_$1 ] 0: zp[2]:27 [ mulFACbyMEM::mem#2 ]
Uplift Scope [print_uint] 71: zp[2]:18 [ print_uint::w#0 ]
Uplift Scope [getFAC] 37.33: zp[2]:20 [ getFAC::return#0 ] 22: zp[2]:22 [ getFAC::return#2 ]
Uplift Scope [main] 11.92: zp[1]:24 [ main::i#10 main::i#1 ]
Uplift Scope [print_ln]
Uplift Scope [RADIX]
Uplift Scope [addMEMtoFAC]
Uplift Scope [divMEMbyFAC]
Uplift Scope [sinFAC]
Uplift Scope [divFACby10]
Uplifting [] best 6433 combination zp[2]:2 [ print_line_cursor#7 print_line_cursor#15 print_line_cursor#0 ] zp[2]:5 [ print_char_cursor#24 print_char_cursor#33 print_char_cursor#34 print_char_cursor#53 print_char_cursor#25 ]
Uplifting [print_char] best 6424 combination reg byte a [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
Uplifting [print_uchar] best 6406 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 [setFAC] best 6394 combination reg byte a [ setFAC::prepareMEM1_$0 ] reg byte a [ setFAC::prepareMEM1_$1 ] zp[2]:16 [ setFAC::prepareMEM1_mem#0 setFAC::w#1 ]
Uplifting [setMEMtoFAC] best 6382 combination reg byte a [ setMEMtoFAC::prepareMEM1_$0 ] reg byte a [ setMEMtoFAC::prepareMEM1_$1 ] zp[2]:25 [ setMEMtoFAC::mem#2 ]
Uplifting [mulFACbyMEM] best 6370 combination reg byte a [ mulFACbyMEM::prepareMEM1_$0 ] reg byte a [ mulFACbyMEM::prepareMEM1_$1 ] zp[2]:27 [ mulFACbyMEM::mem#2 ]
Uplifting [print_uint] best 6370 combination zp[2]:18 [ print_uint::w#0 ]
Uplifting [getFAC] best 6370 combination zp[2]:20 [ getFAC::return#0 ] zp[2]:22 [ getFAC::return#2 ]
Uplifting [main] best 6370 combination zp[1]:24 [ main::i#10 main::i#1 ]
Uplifting [print_ln] best 6370 combination
Uplifting [RADIX] best 6370 combination
Uplifting [addMEMtoFAC] best 6370 combination
Uplifting [divMEMbyFAC] best 6370 combination
Uplifting [sinFAC] best 6370 combination
Uplifting [divFACby10] best 6370 combination
Attempting to uplift remaining variables inzp[1]:24 [ main::i#10 main::i#1 ]
Uplifting [main] best 6370 combination zp[1]:24 [ main::i#10 main::i#1 ]
Coalescing zero page register [ zp[2]:22 [ getFAC::return#2 ] ] with [ zp[2]:18 [ print_uint::w#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:22 [ getFAC::return#2 print_uint::w#0 ] ] with [ zp[2]:20 [ getFAC::return#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:25 [ setMEMtoFAC::mem#2 ] ] with [ zp[2]:16 [ setFAC::prepareMEM1_mem#0 setFAC::w#1 ] ]
Coalescing zero page register [ zp[2]:22 [ getFAC::return#2 print_uint::w#0 getFAC::return#0 ] ] with [ zp[2]:27 [ mulFACbyMEM::mem#2 ] ]
Coalescing zero page register [ zp[2]:22 [ getFAC::return#2 print_uint::w#0 getFAC::return#0 mulFACbyMEM::mem#2 ] ] with [ zp[2]:25 [ setMEMtoFAC::mem#2 setFAC::prepareMEM1_mem#0 setFAC::w#1 ] ]
Allocated (was zp[2]:5) zp[2]:4 [ print_char_cursor#24 print_char_cursor#33 print_char_cursor#34 print_char_cursor#53 print_char_cursor#25 ]
Allocated (was zp[2]:22) zp[2]:6 [ getFAC::return#2 print_uint::w#0 getFAC::return#0 mulFACbyMEM::mem#2 setMEMtoFAC::mem#2 setFAC::prepareMEM1_mem#0 setFAC::w#1 ]
Allocated (was zp[1]:24) zp[1]:8 [ main::i#10 main::i#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="sinus-basic.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
// Zeropage addresses used to hold lo/hi-bytes of addresses of float numbers in MEM
.label memLo = $fe
.label memHi = $ff
.label print_screen = $400
.label print_line_cursor = 2
.label print_char_cursor = 4
.segment Code
// main
main: {
.label f_2pi = $e2e5
.label i = 8
// [1] call setFAC
// [34] phi from main to setFAC [phi:main->setFAC]
setFAC_from_main:
// [34] phi setFAC::prepareMEM1_mem#0 = $4fb [phi:main->setFAC#0] -- vwuz1=vwuc1
lda #<$4fb
sta.z setFAC.prepareMEM1_mem
lda #>$4fb
sta.z setFAC.prepareMEM1_mem+1
jsr setFAC
// [2] phi from main to main::@2 [phi:main->main::@2]
__b2_from_main:
jmp __b2
// main::@2
__b2:
// [3] call divFACby10
jsr divFACby10
// [4] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
__b3_from___b2:
jmp __b3
// main::@3
__b3:
// [5] call setMEMtoFAC
// [43] phi from main::@3 to setMEMtoFAC [phi:main::@3->setMEMtoFAC]
setMEMtoFAC_from___b3:
// [43] phi setMEMtoFAC::mem#2 = main::f_127 [phi:main::@3->setMEMtoFAC#0] -- pbuz1=pbuc1
lda #<f_127
sta.z setMEMtoFAC.mem
lda #>f_127
sta.z setMEMtoFAC.mem+1
jsr setMEMtoFAC
// [6] phi from main::@3 to main::@1 [phi:main::@3->main::@1]
__b1_from___b3:
// [6] phi print_line_cursor#15 = print_screen#0 [phi:main::@3->main::@1#0] -- pbuz1=pbuc1
lda #<print_screen
sta.z print_line_cursor
lda #>print_screen
sta.z print_line_cursor+1
// [6] phi print_char_cursor#34 = print_screen#0 [phi:main::@3->main::@1#1] -- pbuz1=pbuc1
lda #<print_screen
sta.z print_char_cursor
lda #>print_screen
sta.z print_char_cursor+1
// [6] phi main::i#10 = 1 [phi:main::@3->main::@1#2] -- vbuz1=vbuc1
lda #1
sta.z i
jmp __b1
// main::@1
__b1:
// [7] setFAC::w#1 = (unsigned int)main::i#10 -- vwuz1=_word_vbuz2
lda.z i
sta.z setFAC.w
lda #0
sta.z setFAC.w+1
// [8] call setFAC
// [34] phi from main::@1 to setFAC [phi:main::@1->setFAC]
setFAC_from___b1:
// [34] phi setFAC::prepareMEM1_mem#0 = setFAC::w#1 [phi:main::@1->setFAC#0] -- register_copy
jsr setFAC
// [9] phi from main::@1 to main::@4 [phi:main::@1->main::@4]
__b4_from___b1:
jmp __b4
// main::@4
__b4:
// [10] call mulFACbyMEM
// [50] phi from main::@4 to mulFACbyMEM [phi:main::@4->mulFACbyMEM]
mulFACbyMEM_from___b4:
// [50] phi mulFACbyMEM::mem#2 = main::f_2pi [phi:main::@4->mulFACbyMEM#0] -- pbuz1=pbuc1
lda #<f_2pi
sta.z mulFACbyMEM.mem
lda #>f_2pi
sta.z mulFACbyMEM.mem+1
jsr mulFACbyMEM
// [11] phi from main::@4 to main::@5 [phi:main::@4->main::@5]
__b5_from___b4:
jmp __b5
// main::@5
__b5:
// [12] call setMEMtoFAC
// [43] phi from main::@5 to setMEMtoFAC [phi:main::@5->setMEMtoFAC]
setMEMtoFAC_from___b5:
// [43] phi setMEMtoFAC::mem#2 = main::f_i [phi:main::@5->setMEMtoFAC#0] -- pbuz1=pbuc1
lda #<f_i
sta.z setMEMtoFAC.mem
lda #>f_i
sta.z setMEMtoFAC.mem+1
jsr setMEMtoFAC
// [13] phi from main::@5 to main::@6 [phi:main::@5->main::@6]
__b6_from___b5:
jmp __b6
// main::@6
__b6:
// [14] call setFAC
// [34] phi from main::@6 to setFAC [phi:main::@6->setFAC]
setFAC_from___b6:
// [34] phi setFAC::prepareMEM1_mem#0 = $19 [phi:main::@6->setFAC#0] -- vwuz1=vbuc1
lda #<$19
sta.z setFAC.prepareMEM1_mem
lda #>$19
sta.z setFAC.prepareMEM1_mem+1
jsr setFAC
// [15] phi from main::@6 to main::@7 [phi:main::@6->main::@7]
__b7_from___b6:
jmp __b7
// main::@7
__b7:
// [16] call divMEMbyFAC
// [57] phi from main::@7 to divMEMbyFAC [phi:main::@7->divMEMbyFAC]
divMEMbyFAC_from___b7:
jsr divMEMbyFAC
// [17] phi from main::@7 to main::@8 [phi:main::@7->main::@8]
__b8_from___b7:
jmp __b8
// main::@8
__b8:
// [18] call sinFAC
jsr sinFAC
// [19] phi from main::@8 to main::@9 [phi:main::@8->main::@9]
__b9_from___b8:
jmp __b9
// main::@9
__b9:
// [20] call mulFACbyMEM
// [50] phi from main::@9 to mulFACbyMEM [phi:main::@9->mulFACbyMEM]
mulFACbyMEM_from___b9:
// [50] phi mulFACbyMEM::mem#2 = main::f_127 [phi:main::@9->mulFACbyMEM#0] -- pbuz1=pbuc1
lda #<f_127
sta.z mulFACbyMEM.mem
lda #>f_127
sta.z mulFACbyMEM.mem+1
jsr mulFACbyMEM
// [21] phi from main::@9 to main::@10 [phi:main::@9->main::@10]
__b10_from___b9:
jmp __b10
// main::@10
__b10:
// [22] call addMEMtoFAC
// [64] phi from main::@10 to addMEMtoFAC [phi:main::@10->addMEMtoFAC]
addMEMtoFAC_from___b10:
jsr addMEMtoFAC
// [23] phi from main::@10 to main::@11 [phi:main::@10->main::@11]
__b11_from___b10:
jmp __b11
// main::@11
__b11:
// [24] call getFAC
jsr getFAC
// [25] getFAC::return#2 = getFAC::return#0
jmp __b12
// main::@12
__b12:
// [26] print_uint::w#0 = getFAC::return#2
// [27] call print_uint
jsr print_uint
// [28] phi from main::@12 to main::@13 [phi:main::@12->main::@13]
__b13_from___b12:
jmp __b13
// main::@13
__b13:
// [29] call print_ln
// [77] phi from main::@13 to print_ln [phi:main::@13->print_ln]
print_ln_from___b13:
jsr print_ln
jmp __b14
// main::@14
__b14:
// [30] main::i#1 = ++ main::i#10 -- vbuz1=_inc_vbuz1
inc.z i
// [31] if(main::i#1!=$1a) goto main::@15 -- vbuz1_neq_vbuc1_then_la1
lda #$1a
cmp.z i
bne __b15
jmp __breturn
// main::@return
__breturn:
// [32] return
rts
// main::@15
__b15:
// [33] print_char_cursor#53 = print_line_cursor#0 -- pbuz1=pbuz2
lda.z print_line_cursor
sta.z print_char_cursor
lda.z print_line_cursor+1
sta.z print_char_cursor+1
// [6] phi from main::@15 to main::@1 [phi:main::@15->main::@1]
__b1_from___b15:
// [6] phi print_line_cursor#15 = print_line_cursor#0 [phi:main::@15->main::@1#0] -- register_copy
// [6] phi print_char_cursor#34 = print_char_cursor#53 [phi:main::@15->main::@1#1] -- register_copy
// [6] phi main::i#10 = main::i#1 [phi:main::@15->main::@1#2] -- register_copy
jmp __b1
.segment Data
f_i: .byte 0, 0, 0, 0, 0
f_127: .byte 0, 0, 0, 0, 0
}
.segment Code
// setFAC
// FAC = unsigned int
// Set the FAC (floating point accumulator) to the integer value of a 16bit unsigned int
// void setFAC(__zp(6) unsigned int w)
setFAC: {
.label prepareMEM1_mem = 6
.label w = 6
jmp prepareMEM1
// setFAC::prepareMEM1
prepareMEM1:
// [35] setFAC::prepareMEM1_$0 = byte0 setFAC::prepareMEM1_mem#0 -- vbuaa=_byte0_vwuz1
lda.z prepareMEM1_mem
// [36] *memLo = setFAC::prepareMEM1_$0 -- _deref_pbuc1=vbuaa
sta.z memLo
// [37] setFAC::prepareMEM1_$1 = byte1 setFAC::prepareMEM1_mem#0 -- vbuaa=_byte1_vwuz1
lda.z prepareMEM1_mem+1
// [38] *memHi = setFAC::prepareMEM1_$1 -- _deref_pbuc1=vbuaa
sta.z memHi
jmp __b1
// setFAC::@1
__b1:
// asm { ldymemLo ldamemHi jsr$b391 }
// Load unsigned int register Y,A into FAC (floating point accumulator)
ldy memLo
lda memHi
jsr $b391
jmp __breturn
// setFAC::@return
__breturn:
// [40] return
rts
}
// divFACby10
// FAC = FAC/10
// Set FAC to FAC divided by 10
divFACby10: {
// asm { jsr$bafe }
jsr $bafe
jmp __breturn
// divFACby10::@return
__breturn:
// [42] return
rts
}
// setMEMtoFAC
// MEM = FAC
// Stores the value of the FAC to memory
// Stores 5 chars (means it is necessary to allocate 5 chars to avoid clobbering other data using eg. char[] mem = {0, 0, 0, 0, 0};)
// void setMEMtoFAC(__zp(6) char *mem)
setMEMtoFAC: {
.label mem = 6
jmp prepareMEM1
// setMEMtoFAC::prepareMEM1
prepareMEM1:
// [44] setMEMtoFAC::prepareMEM1_$0 = byte0 (unsigned int)setMEMtoFAC::mem#2 -- vbuaa=_byte0_vwuz1
lda.z mem
// [45] *memLo = setMEMtoFAC::prepareMEM1_$0 -- _deref_pbuc1=vbuaa
sta.z memLo
// [46] setMEMtoFAC::prepareMEM1_$1 = byte1 (unsigned int)setMEMtoFAC::mem#2 -- vbuaa=_byte1_vwuz1
lda.z mem+1
// [47] *memHi = setMEMtoFAC::prepareMEM1_$1 -- _deref_pbuc1=vbuaa
sta.z memHi
jmp __b1
// setMEMtoFAC::@1
__b1:
// asm { ldxmemLo ldymemHi jsr$bbd4 }
ldx memLo
ldy memHi
jsr $bbd4
jmp __breturn
// setMEMtoFAC::@return
__breturn:
// [49] return
rts
}
// mulFACbyMEM
// FAC = MEM*FAC
// Set FAC to MEM (float saved in memory) multiplied by FAC (float accumulator)
// Reads 5 chars from memory
// void mulFACbyMEM(__zp(6) char *mem)
mulFACbyMEM: {
.label mem = 6
jmp prepareMEM1
// mulFACbyMEM::prepareMEM1
prepareMEM1:
// [51] mulFACbyMEM::prepareMEM1_$0 = byte0 (unsigned int)mulFACbyMEM::mem#2 -- vbuaa=_byte0_vwuz1
lda.z mem
// [52] *memLo = mulFACbyMEM::prepareMEM1_$0 -- _deref_pbuc1=vbuaa
sta.z memLo
// [53] mulFACbyMEM::prepareMEM1_$1 = byte1 (unsigned int)mulFACbyMEM::mem#2 -- vbuaa=_byte1_vwuz1
lda.z mem+1
// [54] *memHi = mulFACbyMEM::prepareMEM1_$1 -- _deref_pbuc1=vbuaa
sta.z memHi
jmp __b1
// mulFACbyMEM::@1
__b1:
// asm { ldamemLo ldymemHi jsr$ba28 }
lda memLo
ldy memHi
jsr $ba28
jmp __breturn
// mulFACbyMEM::@return
__breturn:
// [56] return
rts
}
// divMEMbyFAC
// FAC = MEM/FAC
// Set FAC to MEM (float saved in memory) divided by FAC (float accumulator)
// Reads 5 chars from memory
// void divMEMbyFAC(char *mem)
divMEMbyFAC: {
.const prepareMEM1_mem = main.f_i
jmp prepareMEM1
// divMEMbyFAC::prepareMEM1
prepareMEM1:
// [58] *memLo = byte0 divMEMbyFAC::prepareMEM1_mem#0 -- _deref_pbuc1=vbuc2
lda #<prepareMEM1_mem
sta.z memLo
// [59] *memHi = byte1 divMEMbyFAC::prepareMEM1_mem#0 -- _deref_pbuc1=vbuc2
lda #>prepareMEM1_mem
sta.z memHi
jmp __b1
// divMEMbyFAC::@1
__b1:
// asm { ldamemLo ldymemHi jsr$bb0f }
lda memLo
ldy memHi
jsr $bb0f
jmp __breturn
// divMEMbyFAC::@return
__breturn:
// [61] return
rts
}
// sinFAC
// FAC = sin(FAC)
// Set FAC to sine of the FAC - sin(FAC)
// Sine is calculated on radians (0-2*PI)
sinFAC: {
// asm { jsr$e26b }
jsr $e26b
jmp __breturn
// sinFAC::@return
__breturn:
// [63] return
rts
}
// addMEMtoFAC
// FAC = MEM+FAC
// Set FAC to MEM (float saved in memory) plus FAC (float accumulator)
// Reads 5 chars from memory
// void addMEMtoFAC(char *mem)
addMEMtoFAC: {
.const prepareMEM1_mem = main.f_127
jmp prepareMEM1
// addMEMtoFAC::prepareMEM1
prepareMEM1:
// [65] *memLo = byte0 addMEMtoFAC::prepareMEM1_mem#0 -- _deref_pbuc1=vbuc2
lda #<prepareMEM1_mem
sta.z memLo
// [66] *memHi = byte1 addMEMtoFAC::prepareMEM1_mem#0 -- _deref_pbuc1=vbuc2
lda #>prepareMEM1_mem
sta.z memHi
jmp __b1
// addMEMtoFAC::@1
__b1:
// asm { ldamemLo ldymemHi jsr$b867 }
lda memLo
ldy memHi
jsr $b867
jmp __breturn
// addMEMtoFAC::@return
__breturn:
// [68] return
rts
}
// getFAC
// unsigned int = FAC
// Get the value of the FAC (floating point accumulator) as an integer 16bit unsigned int
// Destroys the value in the FAC in the process
getFAC: {
.label return = 6
// asm { jsr$b1aa stymemLo stamemHi }
// Load FAC (floating point accumulator) integer part into unsigned int register Y,A
jsr $b1aa
sty memLo
sta memHi
// [70] getFAC::return#0 = *memHi w= *memLo -- vwuz1=_deref_pbuc1_word__deref_pbuc2
lda.z memHi
sta.z return+1
lda.z memLo
sta.z return
jmp __breturn
// getFAC::@return
__breturn:
// [71] return
rts
}
// print_uint
// Print a unsigned int as HEX
// void print_uint(__zp(6) unsigned int w)
print_uint: {
.label w = 6
// [72] print_uchar::b#0 = byte1 print_uint::w#0 -- vbuxx=_byte1_vwuz1
ldx.z w+1
// [73] call print_uchar
// [82] phi from print_uint to print_uchar [phi:print_uint->print_uchar]
print_uchar_from_print_uint:
// [82] phi print_char_cursor#33 = print_char_cursor#34 [phi:print_uint->print_uchar#0] -- register_copy
// [82] 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:
// [74] print_uchar::b#1 = byte0 print_uint::w#0 -- vbuxx=_byte0_vwuz1
ldx.z w
// [75] call print_uchar
// [82] phi from print_uint::@1 to print_uchar [phi:print_uint::@1->print_uchar]
print_uchar_from___b1:
// [82] phi print_char_cursor#33 = print_char_cursor#25 [phi:print_uint::@1->print_uchar#0] -- register_copy
// [82] 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:
// [76] return
rts
}
// print_ln
// Print a newline
print_ln: {
// [78] phi from print_ln print_ln::@1 to print_ln::@1 [phi:print_ln/print_ln::@1->print_ln::@1]
__b1_from_print_ln:
__b1_from___b1:
// [78] phi print_line_cursor#7 = print_line_cursor#15 [phi:print_ln/print_ln::@1->print_ln::@1#0] -- register_copy
jmp __b1
// print_ln::@1
__b1:
// [79] print_line_cursor#0 = print_line_cursor#7 + $28 -- pbuz1=pbuz1_plus_vbuc1
lda #$28
clc
adc.z print_line_cursor
sta.z print_line_cursor
bcc !+
inc.z print_line_cursor+1
!:
// [80] if(print_line_cursor#0<print_char_cursor#25) goto print_ln::@1 -- pbuz1_lt_pbuz2_then_la1
lda.z print_line_cursor+1
cmp.z print_char_cursor+1
bcc __b1_from___b1
bne !+
lda.z print_line_cursor
cmp.z print_char_cursor
bcc __b1_from___b1
!:
jmp __breturn
// print_ln::@return
__breturn:
// [81] return
rts
}
// print_uchar
// Print a char as HEX
// void print_uchar(__register(X) char b)
print_uchar: {
// [83] print_uchar::$0 = print_uchar::b#2 >> 4 -- vbuaa=vbuxx_ror_4
txa
lsr
lsr
lsr
lsr
// [84] print_char::ch#0 = print_hextab[print_uchar::$0] -- vbuaa=pbuc1_derefidx_vbuaa
tay
lda print_hextab,y
// [85] call print_char
// Table of hexadecimal digits
// [90] phi from print_uchar to print_char [phi:print_uchar->print_char]
print_char_from_print_uchar:
// [90] phi print_char_cursor#24 = print_char_cursor#33 [phi:print_uchar->print_char#0] -- register_copy
// [90] 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:
// [86] print_uchar::$2 = print_uchar::b#2 & $f -- vbuxx=vbuxx_band_vbuc1
lda #$f
axs #0
// [87] print_char::ch#1 = print_hextab[print_uchar::$2] -- vbuaa=pbuc1_derefidx_vbuxx
lda print_hextab,x
// [88] call print_char
// [90] phi from print_uchar::@1 to print_char [phi:print_uchar::@1->print_char]
print_char_from___b1:
// [90] phi print_char_cursor#24 = print_char_cursor#25 [phi:print_uchar::@1->print_char#0] -- register_copy
// [90] 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:
// [89] return
rts
}
// print_char
// Print a single char
// void print_char(__register(A) char ch)
print_char: {
// [91] *print_char_cursor#24 = print_char::ch#2 -- _deref_pbuz1=vbuaa
ldy #0
sta (print_char_cursor),y
// [92] print_char_cursor#25 = ++ print_char_cursor#24 -- pbuz1=_inc_pbuz1
inc.z print_char_cursor
bne !+
inc.z print_char_cursor+1
!:
jmp __breturn
// print_char::@return
__breturn:
// [93] return
rts
}
// File Data
.segment Data
print_hextab: .text "0123456789abcdef"
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __b2
Removing instruction jmp __b3
Removing instruction jmp __b1
Removing instruction jmp __b4
Removing instruction jmp __b5
Removing instruction jmp __b6
Removing instruction jmp __b7
Removing instruction jmp __b8
Removing instruction jmp __b9
Removing instruction jmp __b10
Removing instruction jmp __b11
Removing instruction jmp __b12
Removing instruction jmp __b13
Removing instruction jmp __b14
Removing instruction jmp __breturn
Removing instruction jmp prepareMEM1
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __breturn
Removing instruction jmp prepareMEM1
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp prepareMEM1
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp prepareMEM1
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __breturn
Removing instruction jmp prepareMEM1
Removing instruction jmp __b1
Removing instruction jmp __breturn
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
Removing instruction lda.z memHi
Replacing instruction lda.z memLo with TYA
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Replacing label __b1_from___b1 with __b1
Replacing label __b1_from___b1 with __b1
Removing instruction __b2_from_main:
Removing instruction __b3_from___b2:
Removing instruction setMEMtoFAC_from___b3:
Removing instruction __b4_from___b1:
Removing instruction mulFACbyMEM_from___b4:
Removing instruction __b5_from___b4:
Removing instruction setMEMtoFAC_from___b5:
Removing instruction __b6_from___b5:
Removing instruction setFAC_from___b6:
Removing instruction __b7_from___b6:
Removing instruction divMEMbyFAC_from___b7:
Removing instruction __b8_from___b7:
Removing instruction __b9_from___b8:
Removing instruction mulFACbyMEM_from___b9:
Removing instruction __b10_from___b9:
Removing instruction addMEMtoFAC_from___b10:
Removing instruction __b11_from___b10:
Removing instruction __b13_from___b12:
Removing instruction print_ln_from___b13:
Removing instruction __b1_from_print_ln:
Removing instruction __b1_from___b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction setFAC_from_main:
Removing instruction __b2:
Removing instruction __b3:
Removing instruction __b1_from___b3:
Removing instruction setFAC_from___b1:
Removing instruction __b4:
Removing instruction __b5:
Removing instruction __b6:
Removing instruction __b7:
Removing instruction __b8:
Removing instruction __b9:
Removing instruction __b10:
Removing instruction __b11:
Removing instruction __b12:
Removing instruction __b13:
Removing instruction __b14:
Removing instruction __breturn:
Removing instruction __b1_from___b15:
Removing instruction prepareMEM1:
Removing instruction __b1:
Removing instruction __breturn:
Removing instruction __breturn:
Removing instruction prepareMEM1:
Removing instruction __b1:
Removing instruction __breturn:
Removing instruction prepareMEM1:
Removing instruction __b1:
Removing instruction __breturn:
Removing instruction prepareMEM1:
Removing instruction __b1:
Removing instruction __breturn:
Removing instruction __breturn:
Removing instruction prepareMEM1:
Removing instruction __b1:
Removing instruction __breturn:
Removing instruction __breturn:
Removing instruction print_uchar_from_print_uint:
Removing instruction __b1:
Removing instruction print_uchar_from___b1:
Removing instruction __breturn:
Removing instruction __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 lda memHi
Replacing instruction ldy memHi with TAY
Succesful ASM optimization Pass5UnnecesaryLoadElimination
FINAL SYMBOL TABLE
__constant char RADIX::BINARY = 2
__constant char RADIX::DECIMAL = $a
__constant char RADIX::HEXADECIMAL = $10
__constant char RADIX::OCTAL = 8
void addMEMtoFAC(char *mem)
char *addMEMtoFAC::mem
unsigned int addMEMtoFAC::prepareMEM1_mem
__constant unsigned int addMEMtoFAC::prepareMEM1_mem#0 = (unsigned int)main::f_127 // prepareMEM1_mem
void divFACby10()
void divMEMbyFAC(char *mem)
char *divMEMbyFAC::mem
unsigned int divMEMbyFAC::prepareMEM1_mem
__constant unsigned int divMEMbyFAC::prepareMEM1_mem#0 = (unsigned int)main::f_i // prepareMEM1_mem
unsigned int getFAC()
unsigned int getFAC::return
unsigned int getFAC::return#0 // return zp[2]:6 37.33333333333333
unsigned int getFAC::return#2 // return zp[2]:6 22.0
unsigned int getFAC::w
void main()
__constant char main::f_127[] = { 0, 0, 0, 0, 0 }
__constant char * const main::f_2pi = (char *) 58085
__constant char main::f_i[] = { 0, 0, 0, 0, 0 }
char main::i
char main::i#1 // i zp[1]:8 11.0
char main::i#10 // i zp[1]:8 0.9166666666666666
__constant char * const memHi = (char *) 255
__constant char * const memLo = (char *) 254
void mulFACbyMEM(char *mem)
char *mulFACbyMEM::mem
char *mulFACbyMEM::mem#2 // mem zp[2]:6
char mulFACbyMEM::prepareMEM1_$0 // reg byte a 202.0
char mulFACbyMEM::prepareMEM1_$1 // reg byte a 202.0
unsigned int mulFACbyMEM::prepareMEM1_mem
void print_char(char ch)
char print_char::ch
char print_char::ch#0 // reg byte a 2002.0
char print_char::ch#1 // reg byte a 2002.0
char print_char::ch#2 // reg byte a 12003.0
char *print_char_cursor
char *print_char_cursor#24 // print_char_cursor zp[2]:4 11002.0
char *print_char_cursor#25 // print_char_cursor zp[2]:4 1241.4117647058824
char *print_char_cursor#33 // print_char_cursor zp[2]:4 401.0
char *print_char_cursor#34 // print_char_cursor zp[2]:4 5.090909090909091
char *print_char_cursor#53 // print_char_cursor zp[2]:4 22.0
__constant const char print_hextab[] = "0123456789abcdef"z
char *print_line_cursor
char *print_line_cursor#0 // print_line_cursor zp[2]:2 4289.285714285714
char *print_line_cursor#15 // print_line_cursor zp[2]:2 4.666666666666666
char *print_line_cursor#7 // print_line_cursor zp[2]:2 20103.0
void print_ln()
char *print_screen
__constant char *print_screen#0 = (char *) 1024 // print_screen
void print_uchar(char b)
char print_uchar::$0 // reg byte a 2002.0
char print_uchar::$2 // reg byte x 2002.0
char print_uchar::b
char print_uchar::b#0 // reg byte x 202.0
char print_uchar::b#1 // reg byte x 202.0
char print_uchar::b#2 // reg byte x 551.0
void print_uint(unsigned int w)
unsigned int print_uint::w
unsigned int print_uint::w#0 // w zp[2]:6 71.0
void setFAC(unsigned int w)
char setFAC::prepareMEM1_$0 // reg byte a 202.0
char setFAC::prepareMEM1_$1 // reg byte a 202.0
unsigned int setFAC::prepareMEM1_mem
unsigned int setFAC::prepareMEM1_mem#0 // prepareMEM1_mem zp[2]:6 71.0
unsigned int setFAC::w
unsigned int setFAC::w#1 // w zp[2]:6 22.0
void setMEMtoFAC(char *mem)
char *setMEMtoFAC::mem
char *setMEMtoFAC::mem#2 // mem zp[2]:6
char setMEMtoFAC::prepareMEM1_$0 // reg byte a 202.0
char setMEMtoFAC::prepareMEM1_$1 // reg byte a 202.0
unsigned int setMEMtoFAC::prepareMEM1_mem
void sinFAC()
zp[1]:8 [ main::i#10 main::i#1 ]
zp[2]:2 [ print_line_cursor#7 print_line_cursor#15 print_line_cursor#0 ]
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]:4 [ print_char_cursor#24 print_char_cursor#33 print_char_cursor#34 print_char_cursor#53 print_char_cursor#25 ]
zp[2]:6 [ getFAC::return#2 print_uint::w#0 getFAC::return#0 mulFACbyMEM::mem#2 setMEMtoFAC::mem#2 setFAC::prepareMEM1_mem#0 setFAC::w#1 ]
reg byte a [ setFAC::prepareMEM1_$0 ]
reg byte a [ setFAC::prepareMEM1_$1 ]
reg byte a [ setMEMtoFAC::prepareMEM1_$0 ]
reg byte a [ setMEMtoFAC::prepareMEM1_$1 ]
reg byte a [ mulFACbyMEM::prepareMEM1_$0 ]
reg byte a [ mulFACbyMEM::prepareMEM1_$1 ]
reg byte a [ print_uchar::$0 ]
reg byte x [ print_uchar::$2 ]
FINAL ASSEMBLER
Score: 4947
// 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="sinus-basic.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
// Zeropage addresses used to hold lo/hi-bytes of addresses of float numbers in MEM
.label memLo = $fe
.label memHi = $ff
.label print_screen = $400
.label print_line_cursor = 2
.label print_char_cursor = 4
.segment Code
// main
main: {
.label f_2pi = $e2e5
.label i = 8
// setFAC(1275)
// [1] call setFAC
// [34] phi from main to setFAC [phi:main->setFAC]
// [34] phi setFAC::prepareMEM1_mem#0 = $4fb [phi:main->setFAC#0] -- vwuz1=vwuc1
lda #<$4fb
sta.z setFAC.prepareMEM1_mem
lda #>$4fb
sta.z setFAC.prepareMEM1_mem+1
jsr setFAC
// [2] phi from main to main::@2 [phi:main->main::@2]
// main::@2
// divFACby10()
// [3] call divFACby10
jsr divFACby10
// [4] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
// main::@3
// setMEMtoFAC(f_127)
// [5] call setMEMtoFAC
// [43] phi from main::@3 to setMEMtoFAC [phi:main::@3->setMEMtoFAC]
// [43] phi setMEMtoFAC::mem#2 = main::f_127 [phi:main::@3->setMEMtoFAC#0] -- pbuz1=pbuc1
lda #<f_127
sta.z setMEMtoFAC.mem
lda #>f_127
sta.z setMEMtoFAC.mem+1
jsr setMEMtoFAC
// [6] phi from main::@3 to main::@1 [phi:main::@3->main::@1]
// [6] phi print_line_cursor#15 = print_screen#0 [phi:main::@3->main::@1#0] -- pbuz1=pbuc1
lda #<print_screen
sta.z print_line_cursor
lda #>print_screen
sta.z print_line_cursor+1
// [6] phi print_char_cursor#34 = print_screen#0 [phi:main::@3->main::@1#1] -- pbuz1=pbuc1
lda #<print_screen
sta.z print_char_cursor
lda #>print_screen
sta.z print_char_cursor+1
// [6] phi main::i#10 = 1 [phi:main::@3->main::@1#2] -- vbuz1=vbuc1
lda #1
sta.z i
// main::@1
__b1:
// setFAC((word)i)
// [7] setFAC::w#1 = (unsigned int)main::i#10 -- vwuz1=_word_vbuz2
lda.z i
sta.z setFAC.w
lda #0
sta.z setFAC.w+1
// [8] call setFAC
// [34] phi from main::@1 to setFAC [phi:main::@1->setFAC]
// [34] phi setFAC::prepareMEM1_mem#0 = setFAC::w#1 [phi:main::@1->setFAC#0] -- register_copy
jsr setFAC
// [9] phi from main::@1 to main::@4 [phi:main::@1->main::@4]
// main::@4
// mulFACbyMEM(f_2pi)
// [10] call mulFACbyMEM
// [50] phi from main::@4 to mulFACbyMEM [phi:main::@4->mulFACbyMEM]
// [50] phi mulFACbyMEM::mem#2 = main::f_2pi [phi:main::@4->mulFACbyMEM#0] -- pbuz1=pbuc1
lda #<f_2pi
sta.z mulFACbyMEM.mem
lda #>f_2pi
sta.z mulFACbyMEM.mem+1
jsr mulFACbyMEM
// [11] phi from main::@4 to main::@5 [phi:main::@4->main::@5]
// main::@5
// setMEMtoFAC(f_i)
// [12] call setMEMtoFAC
// [43] phi from main::@5 to setMEMtoFAC [phi:main::@5->setMEMtoFAC]
// [43] phi setMEMtoFAC::mem#2 = main::f_i [phi:main::@5->setMEMtoFAC#0] -- pbuz1=pbuc1
lda #<f_i
sta.z setMEMtoFAC.mem
lda #>f_i
sta.z setMEMtoFAC.mem+1
jsr setMEMtoFAC
// [13] phi from main::@5 to main::@6 [phi:main::@5->main::@6]
// main::@6
// setFAC(25)
// [14] call setFAC
// [34] phi from main::@6 to setFAC [phi:main::@6->setFAC]
// [34] phi setFAC::prepareMEM1_mem#0 = $19 [phi:main::@6->setFAC#0] -- vwuz1=vbuc1
lda #<$19
sta.z setFAC.prepareMEM1_mem
lda #>$19
sta.z setFAC.prepareMEM1_mem+1
jsr setFAC
// [15] phi from main::@6 to main::@7 [phi:main::@6->main::@7]
// main::@7
// divMEMbyFAC(f_i)
// [16] call divMEMbyFAC
// [57] phi from main::@7 to divMEMbyFAC [phi:main::@7->divMEMbyFAC]
jsr divMEMbyFAC
// [17] phi from main::@7 to main::@8 [phi:main::@7->main::@8]
// main::@8
// sinFAC()
// [18] call sinFAC
jsr sinFAC
// [19] phi from main::@8 to main::@9 [phi:main::@8->main::@9]
// main::@9
// mulFACbyMEM(f_127)
// [20] call mulFACbyMEM
// [50] phi from main::@9 to mulFACbyMEM [phi:main::@9->mulFACbyMEM]
// [50] phi mulFACbyMEM::mem#2 = main::f_127 [phi:main::@9->mulFACbyMEM#0] -- pbuz1=pbuc1
lda #<f_127
sta.z mulFACbyMEM.mem
lda #>f_127
sta.z mulFACbyMEM.mem+1
jsr mulFACbyMEM
// [21] phi from main::@9 to main::@10 [phi:main::@9->main::@10]
// main::@10
// addMEMtoFAC(f_127)
// [22] call addMEMtoFAC
// [64] phi from main::@10 to addMEMtoFAC [phi:main::@10->addMEMtoFAC]
jsr addMEMtoFAC
// [23] phi from main::@10 to main::@11 [phi:main::@10->main::@11]
// main::@11
// getFAC()
// [24] call getFAC
jsr getFAC
// [25] getFAC::return#2 = getFAC::return#0
// main::@12
// print_uint(getFAC())
// [26] print_uint::w#0 = getFAC::return#2
// [27] call print_uint
jsr print_uint
// [28] phi from main::@12 to main::@13 [phi:main::@12->main::@13]
// main::@13
// print_ln()
// [29] call print_ln
// [77] phi from main::@13 to print_ln [phi:main::@13->print_ln]
jsr print_ln
// main::@14
// for(byte i : 1..25)
// [30] main::i#1 = ++ main::i#10 -- vbuz1=_inc_vbuz1
inc.z i
// [31] if(main::i#1!=$1a) goto main::@15 -- vbuz1_neq_vbuc1_then_la1
lda #$1a
cmp.z i
bne __b15
// main::@return
// }
// [32] return
rts
// main::@15
__b15:
// [33] print_char_cursor#53 = print_line_cursor#0 -- pbuz1=pbuz2
lda.z print_line_cursor
sta.z print_char_cursor
lda.z print_line_cursor+1
sta.z print_char_cursor+1
// [6] phi from main::@15 to main::@1 [phi:main::@15->main::@1]
// [6] phi print_line_cursor#15 = print_line_cursor#0 [phi:main::@15->main::@1#0] -- register_copy
// [6] phi print_char_cursor#34 = print_char_cursor#53 [phi:main::@15->main::@1#1] -- register_copy
// [6] phi main::i#10 = main::i#1 [phi:main::@15->main::@1#2] -- register_copy
jmp __b1
.segment Data
f_i: .byte 0, 0, 0, 0, 0
f_127: .byte 0, 0, 0, 0, 0
}
.segment Code
// setFAC
// FAC = unsigned int
// Set the FAC (floating point accumulator) to the integer value of a 16bit unsigned int
// void setFAC(__zp(6) unsigned int w)
setFAC: {
.label prepareMEM1_mem = 6
.label w = 6
// setFAC::prepareMEM1
// BYTE0(mem)
// [35] setFAC::prepareMEM1_$0 = byte0 setFAC::prepareMEM1_mem#0 -- vbuaa=_byte0_vwuz1
lda.z prepareMEM1_mem
// *memLo = BYTE0(mem)
// [36] *memLo = setFAC::prepareMEM1_$0 -- _deref_pbuc1=vbuaa
sta.z memLo
// BYTE1(mem)
// [37] setFAC::prepareMEM1_$1 = byte1 setFAC::prepareMEM1_mem#0 -- vbuaa=_byte1_vwuz1
lda.z prepareMEM1_mem+1
// *memHi = BYTE1(mem)
// [38] *memHi = setFAC::prepareMEM1_$1 -- _deref_pbuc1=vbuaa
sta.z memHi
// setFAC::@1
// asm
// asm { ldymemLo ldamemHi jsr$b391 }
// Load unsigned int register Y,A into FAC (floating point accumulator)
ldy memLo
jsr $b391
// setFAC::@return
// }
// [40] return
rts
}
// divFACby10
// FAC = FAC/10
// Set FAC to FAC divided by 10
divFACby10: {
// asm
// asm { jsr$bafe }
jsr $bafe
// divFACby10::@return
// }
// [42] return
rts
}
// setMEMtoFAC
// MEM = FAC
// Stores the value of the FAC to memory
// Stores 5 chars (means it is necessary to allocate 5 chars to avoid clobbering other data using eg. char[] mem = {0, 0, 0, 0, 0};)
// void setMEMtoFAC(__zp(6) char *mem)
setMEMtoFAC: {
.label mem = 6
// setMEMtoFAC::prepareMEM1
// BYTE0(mem)
// [44] setMEMtoFAC::prepareMEM1_$0 = byte0 (unsigned int)setMEMtoFAC::mem#2 -- vbuaa=_byte0_vwuz1
lda.z mem
// *memLo = BYTE0(mem)
// [45] *memLo = setMEMtoFAC::prepareMEM1_$0 -- _deref_pbuc1=vbuaa
sta.z memLo
// BYTE1(mem)
// [46] setMEMtoFAC::prepareMEM1_$1 = byte1 (unsigned int)setMEMtoFAC::mem#2 -- vbuaa=_byte1_vwuz1
lda.z mem+1
// *memHi = BYTE1(mem)
// [47] *memHi = setMEMtoFAC::prepareMEM1_$1 -- _deref_pbuc1=vbuaa
sta.z memHi
// setMEMtoFAC::@1
// asm
// asm { ldxmemLo ldymemHi jsr$bbd4 }
ldx memLo
tay
jsr $bbd4
// setMEMtoFAC::@return
// }
// [49] return
rts
}
// mulFACbyMEM
// FAC = MEM*FAC
// Set FAC to MEM (float saved in memory) multiplied by FAC (float accumulator)
// Reads 5 chars from memory
// void mulFACbyMEM(__zp(6) char *mem)
mulFACbyMEM: {
.label mem = 6
// mulFACbyMEM::prepareMEM1
// BYTE0(mem)
// [51] mulFACbyMEM::prepareMEM1_$0 = byte0 (unsigned int)mulFACbyMEM::mem#2 -- vbuaa=_byte0_vwuz1
lda.z mem
// *memLo = BYTE0(mem)
// [52] *memLo = mulFACbyMEM::prepareMEM1_$0 -- _deref_pbuc1=vbuaa
sta.z memLo
// BYTE1(mem)
// [53] mulFACbyMEM::prepareMEM1_$1 = byte1 (unsigned int)mulFACbyMEM::mem#2 -- vbuaa=_byte1_vwuz1
lda.z mem+1
// *memHi = BYTE1(mem)
// [54] *memHi = mulFACbyMEM::prepareMEM1_$1 -- _deref_pbuc1=vbuaa
sta.z memHi
// mulFACbyMEM::@1
// asm
// asm { ldamemLo ldymemHi jsr$ba28 }
lda memLo
ldy memHi
jsr $ba28
// mulFACbyMEM::@return
// }
// [56] return
rts
}
// divMEMbyFAC
// FAC = MEM/FAC
// Set FAC to MEM (float saved in memory) divided by FAC (float accumulator)
// Reads 5 chars from memory
// void divMEMbyFAC(char *mem)
divMEMbyFAC: {
.const prepareMEM1_mem = main.f_i
// divMEMbyFAC::prepareMEM1
// *memLo = BYTE0(mem)
// [58] *memLo = byte0 divMEMbyFAC::prepareMEM1_mem#0 -- _deref_pbuc1=vbuc2
lda #<prepareMEM1_mem
sta.z memLo
// *memHi = BYTE1(mem)
// [59] *memHi = byte1 divMEMbyFAC::prepareMEM1_mem#0 -- _deref_pbuc1=vbuc2
lda #>prepareMEM1_mem
sta.z memHi
// divMEMbyFAC::@1
// asm
// asm { ldamemLo ldymemHi jsr$bb0f }
lda memLo
ldy memHi
jsr $bb0f
// divMEMbyFAC::@return
// }
// [61] return
rts
}
// sinFAC
// FAC = sin(FAC)
// Set FAC to sine of the FAC - sin(FAC)
// Sine is calculated on radians (0-2*PI)
sinFAC: {
// asm
// asm { jsr$e26b }
jsr $e26b
// sinFAC::@return
// }
// [63] return
rts
}
// addMEMtoFAC
// FAC = MEM+FAC
// Set FAC to MEM (float saved in memory) plus FAC (float accumulator)
// Reads 5 chars from memory
// void addMEMtoFAC(char *mem)
addMEMtoFAC: {
.const prepareMEM1_mem = main.f_127
// addMEMtoFAC::prepareMEM1
// *memLo = BYTE0(mem)
// [65] *memLo = byte0 addMEMtoFAC::prepareMEM1_mem#0 -- _deref_pbuc1=vbuc2
lda #<prepareMEM1_mem
sta.z memLo
// *memHi = BYTE1(mem)
// [66] *memHi = byte1 addMEMtoFAC::prepareMEM1_mem#0 -- _deref_pbuc1=vbuc2
lda #>prepareMEM1_mem
sta.z memHi
// addMEMtoFAC::@1
// asm
// asm { ldamemLo ldymemHi jsr$b867 }
lda memLo
ldy memHi
jsr $b867
// addMEMtoFAC::@return
// }
// [68] return
rts
}
// getFAC
// unsigned int = FAC
// Get the value of the FAC (floating point accumulator) as an integer 16bit unsigned int
// Destroys the value in the FAC in the process
getFAC: {
.label return = 6
// asm
// asm { jsr$b1aa stymemLo stamemHi }
// Load FAC (floating point accumulator) integer part into unsigned int register Y,A
jsr $b1aa
sty memLo
sta memHi
// unsigned int w = MAKEWORD( *memHi, *memLo )
// [70] getFAC::return#0 = *memHi w= *memLo -- vwuz1=_deref_pbuc1_word__deref_pbuc2
sta.z return+1
tya
sta.z return
// getFAC::@return
// }
// [71] return
rts
}
// print_uint
// Print a unsigned int as HEX
// void print_uint(__zp(6) unsigned int w)
print_uint: {
.label w = 6
// print_uchar(BYTE1(w))
// [72] print_uchar::b#0 = byte1 print_uint::w#0 -- vbuxx=_byte1_vwuz1
ldx.z w+1
// [73] call print_uchar
// [82] phi from print_uint to print_uchar [phi:print_uint->print_uchar]
// [82] phi print_char_cursor#33 = print_char_cursor#34 [phi:print_uint->print_uchar#0] -- register_copy
// [82] 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))
// [74] print_uchar::b#1 = byte0 print_uint::w#0 -- vbuxx=_byte0_vwuz1
ldx.z w
// [75] call print_uchar
// [82] phi from print_uint::@1 to print_uchar [phi:print_uint::@1->print_uchar]
// [82] phi print_char_cursor#33 = print_char_cursor#25 [phi:print_uint::@1->print_uchar#0] -- register_copy
// [82] phi print_uchar::b#2 = print_uchar::b#1 [phi:print_uint::@1->print_uchar#1] -- register_copy
jsr print_uchar
// print_uint::@return
// }
// [76] return
rts
}
// print_ln
// Print a newline
print_ln: {
// [78] phi from print_ln print_ln::@1 to print_ln::@1 [phi:print_ln/print_ln::@1->print_ln::@1]
// [78] phi print_line_cursor#7 = print_line_cursor#15 [phi:print_ln/print_ln::@1->print_ln::@1#0] -- register_copy
// print_ln::@1
__b1:
// print_line_cursor + 0x28
// [79] print_line_cursor#0 = print_line_cursor#7 + $28 -- pbuz1=pbuz1_plus_vbuc1
lda #$28
clc
adc.z print_line_cursor
sta.z print_line_cursor
bcc !+
inc.z print_line_cursor+1
!:
// while (print_line_cursor<print_char_cursor)
// [80] if(print_line_cursor#0<print_char_cursor#25) goto print_ln::@1 -- pbuz1_lt_pbuz2_then_la1
lda.z print_line_cursor+1
cmp.z print_char_cursor+1
bcc __b1
bne !+
lda.z print_line_cursor
cmp.z print_char_cursor
bcc __b1
!:
// print_ln::@return
// }
// [81] return
rts
}
// print_uchar
// Print a char as HEX
// void print_uchar(__register(X) char b)
print_uchar: {
// b>>4
// [83] print_uchar::$0 = print_uchar::b#2 >> 4 -- vbuaa=vbuxx_ror_4
txa
lsr
lsr
lsr
lsr
// print_char(print_hextab[b>>4])
// [84] print_char::ch#0 = print_hextab[print_uchar::$0] -- vbuaa=pbuc1_derefidx_vbuaa
tay
lda print_hextab,y
// [85] call print_char
// Table of hexadecimal digits
// [90] phi from print_uchar to print_char [phi:print_uchar->print_char]
// [90] phi print_char_cursor#24 = print_char_cursor#33 [phi:print_uchar->print_char#0] -- register_copy
// [90] 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
// [86] print_uchar::$2 = print_uchar::b#2 & $f -- vbuxx=vbuxx_band_vbuc1
lda #$f
axs #0
// print_char(print_hextab[b&0xf])
// [87] print_char::ch#1 = print_hextab[print_uchar::$2] -- vbuaa=pbuc1_derefidx_vbuxx
lda print_hextab,x
// [88] call print_char
// [90] phi from print_uchar::@1 to print_char [phi:print_uchar::@1->print_char]
// [90] phi print_char_cursor#24 = print_char_cursor#25 [phi:print_uchar::@1->print_char#0] -- register_copy
// [90] phi print_char::ch#2 = print_char::ch#1 [phi:print_uchar::@1->print_char#1] -- register_copy
jsr print_char
// print_uchar::@return
// }
// [89] return
rts
}
// print_char
// Print a single char
// void print_char(__register(A) char ch)
print_char: {
// *(print_char_cursor++) = ch
// [91] *print_char_cursor#24 = print_char::ch#2 -- _deref_pbuz1=vbuaa
ldy #0
sta (print_char_cursor),y
// *(print_char_cursor++) = ch;
// [92] print_char_cursor#25 = ++ print_char_cursor#24 -- pbuz1=_inc_pbuz1
inc.z print_char_cursor
bne !+
inc.z print_char_cursor+1
!:
// print_char::@return
// }
// [93] return
rts
}
// File Data
.segment Data
print_hextab: .text "0123456789abcdef"