Inlined call call __init Eliminating unused variable with no statement memset::$2 CONTROL FLOW GRAPH SSA void print_str(char *str) print_str: scope:[print_str] from main::@1 print_char_cursor#34 = phi( main::@1/print_char_cursor#32 ) print_str::str#5 = phi( main::@1/print_str::str#1 ) to:print_str::@1 print_str::@1: scope:[print_str] from print_str print_str::@3 print_char_cursor#29 = phi( print_str/print_char_cursor#34, print_str::@3/print_char_cursor#0 ) print_str::str#2 = phi( print_str/print_str::str#5, print_str::@3/print_str::str#0 ) print_str::$1 = 0 != *print_str::str#2 if(print_str::$1) goto print_str::@2 to:print_str::@return print_str::@2: scope:[print_str] from print_str::@1 print_char_cursor#28 = phi( print_str::@1/print_char_cursor#29 ) print_str::str#3 = phi( print_str::@1/print_str::str#2 ) print_char::ch#0 = *print_str::str#3 call print_char to:print_str::@3 print_str::@3: scope:[print_str] from print_str::@2 print_str::str#4 = phi( print_str::@2/print_str::str#3 ) print_char_cursor#15 = phi( print_str::@2/print_char_cursor#5 ) print_char_cursor#0 = print_char_cursor#15 print_str::str#0 = ++ print_str::str#4 to:print_str::@1 print_str::@return: scope:[print_str] from print_str::@1 print_char_cursor#16 = phi( print_str::@1/print_char_cursor#29 ) print_char_cursor#1 = print_char_cursor#16 return to:@return void print_ln() print_ln: scope:[print_ln] from main::@3 print_char_cursor#30 = phi( main::@3/print_char_cursor#9 ) print_line_cursor#19 = phi( main::@3/print_line_cursor#21 ) to:print_ln::@1 print_ln::@1: scope:[print_ln] from print_ln print_ln::@1 print_char_cursor#17 = phi( print_ln/print_char_cursor#30, print_ln::@1/print_char_cursor#17 ) print_line_cursor#10 = phi( print_ln/print_line_cursor#19, print_ln::@1/print_line_cursor#0 ) print_ln::$0 = print_line_cursor#10 + $28 print_line_cursor#0 = print_ln::$0 print_ln::$1 = print_line_cursor#0 < print_char_cursor#17 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#11 = phi( print_ln::@1/print_line_cursor#0 ) print_char_cursor#2 = print_line_cursor#11 to:print_ln::@return print_ln::@return: scope:[print_ln] from print_ln::@2 print_char_cursor#18 = phi( print_ln::@2/print_char_cursor#2 ) print_line_cursor#12 = phi( print_ln::@2/print_line_cursor#11 ) print_line_cursor#1 = print_line_cursor#12 print_char_cursor#3 = print_char_cursor#18 return to:@return void print_char(char ch) print_char: scope:[print_char] from print_str::@2 print_char_cursor#19 = phi( print_str::@2/print_char_cursor#28 ) print_char::ch#1 = phi( print_str::@2/print_char::ch#0 ) *print_char_cursor#19 = print_char::ch#1 print_char_cursor#4 = ++ print_char_cursor#19 to:print_char::@return print_char::@return: scope:[print_char] from print_char print_char_cursor#20 = phi( print_char/print_char_cursor#4 ) print_char_cursor#5 = print_char_cursor#20 return to:@return void print_cls() print_cls: scope:[print_cls] from main print_screen#2 = phi( main/print_screen#5 ) memset::str#0 = (void *)print_screen#2 memset::c#0 = ' ' memset::num#0 = $3e8 call memset memset::return#0 = memset::return#2 to:print_cls::@1 print_cls::@1: scope:[print_cls] from print_cls print_screen#3 = phi( print_cls/print_screen#2 ) print_line_cursor#2 = print_screen#3 print_char_cursor#6 = print_line_cursor#2 to:print_cls::@return print_cls::@return: scope:[print_cls] from print_cls::@1 print_char_cursor#21 = phi( print_cls::@1/print_char_cursor#6 ) print_line_cursor#13 = phi( print_cls::@1/print_line_cursor#2 ) print_line_cursor#3 = print_line_cursor#13 print_char_cursor#7 = print_char_cursor#21 return to:@return void * memset(void *str , char c , unsigned int num) memset: scope:[memset] from print_cls memset::c#4 = phi( print_cls/memset::c#0 ) memset::str#3 = phi( print_cls/memset::str#0 ) memset::num#1 = phi( print_cls/memset::num#0 ) memset::$0 = memset::num#1 > 0 memset::$1 = ! memset::$0 if(memset::$1) goto memset::@1 to:memset::@2 memset::@1: scope:[memset] from memset memset::@3 memset::str#1 = phi( memset/memset::str#3, memset::@3/memset::str#4 ) memset::return#1 = memset::str#1 to:memset::@return memset::@2: scope:[memset] from memset memset::c#3 = phi( memset/memset::c#4 ) memset::num#2 = phi( memset/memset::num#1 ) memset::str#2 = phi( memset/memset::str#3 ) memset::$4 = (char *)memset::str#2 memset::end#0 = memset::$4 + memset::num#2 memset::dst#0 = ((char *)) memset::str#2 to:memset::@3 memset::@3: scope:[memset] from memset::@2 memset::@4 memset::c#2 = phi( memset::@2/memset::c#3, memset::@4/memset::c#1 ) memset::str#4 = phi( memset::@2/memset::str#2, memset::@4/memset::str#5 ) memset::end#1 = phi( memset::@2/memset::end#0, memset::@4/memset::end#2 ) memset::dst#2 = phi( memset::@2/memset::dst#0, memset::@4/memset::dst#1 ) memset::$3 = memset::dst#2 != memset::end#1 if(memset::$3) goto memset::@4 to:memset::@1 memset::@4: scope:[memset] from memset::@3 memset::str#5 = phi( memset::@3/memset::str#4 ) memset::end#2 = phi( memset::@3/memset::end#1 ) memset::dst#3 = phi( memset::@3/memset::dst#2 ) memset::c#1 = phi( memset::@3/memset::c#2 ) *memset::dst#3 = memset::c#1 memset::dst#1 = ++ memset::dst#3 to:memset::@3 memset::@return: scope:[memset] from memset::@1 memset::return#3 = phi( memset::@1/memset::return#1 ) memset::return#2 = memset::return#3 return to:@return void main() main: scope:[main] from __start::@1 print_char_cursor#31 = phi( __start::@1/print_char_cursor#33 ) print_line_cursor#20 = phi( __start::@1/print_line_cursor#22 ) print_screen#5 = phi( __start::@1/print_screen#7 ) call print_cls to:main::@2 main::@2: scope:[main] from main print_char_cursor#22 = phi( main/print_char_cursor#7 ) print_line_cursor#14 = phi( main/print_line_cursor#3 ) print_line_cursor#4 = print_line_cursor#14 print_char_cursor#8 = print_char_cursor#22 main::i#0 = 0 to:main::@1 main::@1: scope:[main] from main::@2 main::@4 main::i#4 = phi( main::@2/main::i#0, main::@4/main::i#1 ) print_line_cursor#23 = phi( main::@2/print_line_cursor#4, main::@4/print_line_cursor#5 ) print_char_cursor#32 = phi( main::@2/print_char_cursor#8, main::@4/print_char_cursor#10 ) print_str::str#1 = txt call print_str to:main::@3 main::@3: scope:[main] from main::@1 main::i#3 = phi( main::@1/main::i#4 ) print_line_cursor#21 = phi( main::@1/print_line_cursor#23 ) print_char_cursor#23 = phi( main::@1/print_char_cursor#1 ) print_char_cursor#9 = print_char_cursor#23 call print_ln to:main::@4 main::@4: scope:[main] from main::@3 main::i#2 = phi( main::@3/main::i#3 ) print_char_cursor#24 = phi( main::@3/print_char_cursor#3 ) print_line_cursor#15 = phi( main::@3/print_line_cursor#1 ) print_line_cursor#5 = print_line_cursor#15 print_char_cursor#10 = print_char_cursor#24 txt[1] = ++ txt[1] main::i#1 = main::i#2 + rangenext(0,$a) main::$4 = main::i#1 != rangelast(0,$a) if(main::$4) goto main::@1 to:main::@return main::@return: scope:[main] from main::@4 print_char_cursor#25 = phi( main::@4/print_char_cursor#10 ) print_line_cursor#16 = phi( main::@4/print_line_cursor#5 ) print_line_cursor#6 = print_line_cursor#16 print_char_cursor#11 = print_char_cursor#25 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#7 = print_screen#0 print_char_cursor#12 = print_line_cursor#7 to:__start::@1 __start::@1: scope:[__start] from __start::__init1 print_screen#7 = phi( __start::__init1/print_screen#0 ) print_char_cursor#33 = phi( __start::__init1/print_char_cursor#12 ) print_line_cursor#22 = phi( __start::__init1/print_line_cursor#7 ) call main to:__start::@2 __start::@2: scope:[__start] from __start::@1 print_screen#6 = phi( __start::@1/print_screen#7 ) print_char_cursor#26 = phi( __start::@1/print_char_cursor#11 ) print_line_cursor#17 = phi( __start::@1/print_line_cursor#6 ) print_line_cursor#8 = print_line_cursor#17 print_char_cursor#13 = print_char_cursor#26 to:__start::@return __start::@return: scope:[__start] from __start::@2 print_char_cursor#27 = phi( __start::@2/print_char_cursor#13 ) print_line_cursor#18 = phi( __start::@2/print_line_cursor#8 ) print_screen#4 = phi( __start::@2/print_screen#6 ) print_screen#1 = print_screen#4 print_line_cursor#9 = print_line_cursor#18 print_char_cursor#14 = print_char_cursor#27 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 main() bool main::$4 char main::i char main::i#0 char main::i#1 char main::i#2 char main::i#3 char main::i#4 void * memset(void *str , char c , unsigned int num) bool memset::$0 bool memset::$1 bool memset::$3 char *memset::$4 char memset::c char memset::c#0 char memset::c#1 char memset::c#2 char memset::c#3 char memset::c#4 char *memset::dst char *memset::dst#0 char *memset::dst#1 char *memset::dst#2 char *memset::dst#3 char *memset::end char *memset::end#0 char *memset::end#1 char *memset::end#2 unsigned int memset::num unsigned int memset::num#0 unsigned int memset::num#1 unsigned int memset::num#2 void *memset::return void *memset::return#0 void *memset::return#1 void *memset::return#2 void *memset::return#3 void *memset::str void *memset::str#0 void *memset::str#1 void *memset::str#2 void *memset::str#3 void *memset::str#4 void *memset::str#5 void print_char(char ch) char print_char::ch char print_char::ch#0 char print_char::ch#1 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#4 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 void print_cls() 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#3 char *print_line_cursor#4 char *print_line_cursor#5 char *print_line_cursor#6 char *print_line_cursor#7 char *print_line_cursor#8 char *print_line_cursor#9 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 char *print_screen#5 char *print_screen#6 char *print_screen#7 void print_str(char *str) bool print_str::$1 char *print_str::str char *print_str::str#0 char *print_str::str#1 char *print_str::str#2 char *print_str::str#3 char *print_str::str#4 char *print_str::str#5 __constant char txt[] = "camelot" Adding number conversion cast (unumber) 0 in print_str::$1 = 0 != *print_str::str#2 Adding number conversion cast (unumber) $28 in print_ln::$0 = print_line_cursor#10 + $28 Adding number conversion cast (unumber) $3e8 in memset::num#0 = $3e8 Adding number conversion cast (unumber) 0 in memset::$0 = memset::num#1 > 0 Adding number conversion cast (unumber) 1 in txt[1] = ++ txt[1] Adding number conversion cast (unumber) 1 in txt[1] = ++ txt[(unumber)1] Successful SSA optimization PassNAddNumberTypeConversions Inlining cast memset::num#0 = (unumber)$3e8 Inlining cast memset::dst#0 = (char *)memset::str#2 Successful SSA optimization Pass2InlineCast Simplifying constant integer cast 0 Simplifying constant integer cast $28 Simplifying constant integer cast $3e8 Simplifying constant integer cast 0 Simplifying constant integer cast 1 Simplifying constant integer cast 1 Simplifying constant pointer cast (char *) 1024 Successful SSA optimization PassNCastSimplification Finalized unsigned number type (char) 0 Finalized unsigned number type (char) $28 Finalized unsigned number type (unsigned int) $3e8 Finalized unsigned number type (char) 0 Finalized unsigned number type (char) 1 Finalized unsigned number type (char) 1 Successful SSA optimization PassNFinalizeNumberTypeConversions Inversing boolean not [46] memset::$1 = memset::num#1 <= 0 from [45] memset::$0 = memset::num#1 > 0 Successful SSA optimization Pass2UnaryNotSimplification Alias print_str::str#2 = print_str::str#3 print_str::str#4 Alias print_char_cursor#1 = print_char_cursor#28 print_char_cursor#29 print_char_cursor#16 Alias print_char_cursor#0 = print_char_cursor#15 Alias print_line_cursor#0 = print_ln::$0 print_line_cursor#11 print_char_cursor#2 print_line_cursor#12 print_char_cursor#18 print_line_cursor#1 print_char_cursor#3 Alias print_char_cursor#20 = print_char_cursor#4 print_char_cursor#5 Alias print_line_cursor#13 = print_screen#3 print_screen#2 print_line_cursor#2 print_char_cursor#6 print_char_cursor#21 print_line_cursor#3 print_char_cursor#7 Alias memset::return#1 = memset::str#1 memset::return#3 memset::return#2 Alias memset::str#2 = memset::str#3 Alias memset::num#1 = memset::num#2 Alias memset::c#3 = memset::c#4 Alias memset::c#1 = memset::c#2 Alias memset::dst#2 = memset::dst#3 Alias memset::end#1 = memset::end#2 Alias memset::str#4 = memset::str#5 Alias print_line_cursor#14 = print_line_cursor#4 Alias print_char_cursor#22 = print_char_cursor#8 Alias print_line_cursor#21 = print_line_cursor#23 Alias main::i#2 = main::i#3 main::i#4 Alias print_char_cursor#23 = print_char_cursor#9 Alias print_line_cursor#15 = print_line_cursor#5 print_line_cursor#16 print_line_cursor#6 Alias print_char_cursor#10 = print_char_cursor#24 print_char_cursor#25 print_char_cursor#11 Alias print_screen#0 = print_line_cursor#7 print_char_cursor#12 print_line_cursor#22 print_char_cursor#33 print_screen#7 print_screen#6 print_screen#4 print_screen#1 Alias print_line_cursor#17 = print_line_cursor#8 print_line_cursor#18 print_line_cursor#9 Alias print_char_cursor#13 = print_char_cursor#26 print_char_cursor#27 print_char_cursor#14 Successful SSA optimization Pass2AliasElimination Identical Phi Values print_str::str#5 print_str::str#1 Identical Phi Values print_char_cursor#34 print_char_cursor#32 Identical Phi Values print_char_cursor#0 print_char_cursor#20 Identical Phi Values print_line_cursor#19 print_line_cursor#21 Identical Phi Values print_char_cursor#30 print_char_cursor#23 Identical Phi Values print_char_cursor#17 print_char_cursor#30 Identical Phi Values print_char::ch#1 print_char::ch#0 Identical Phi Values print_char_cursor#19 print_char_cursor#1 Identical Phi Values print_line_cursor#13 print_screen#5 Identical Phi Values memset::num#1 memset::num#0 Identical Phi Values memset::str#2 memset::str#0 Identical Phi Values memset::c#3 memset::c#0 Identical Phi Values memset::end#1 memset::end#0 Identical Phi Values memset::str#4 memset::str#2 Identical Phi Values memset::c#1 memset::c#3 Identical Phi Values print_screen#5 print_screen#0 Identical Phi Values print_line_cursor#20 print_screen#0 Identical Phi Values print_char_cursor#31 print_screen#0 Identical Phi Values print_line_cursor#14 print_line_cursor#13 Identical Phi Values print_char_cursor#22 print_line_cursor#13 Identical Phi Values print_char_cursor#23 print_char_cursor#1 Identical Phi Values print_line_cursor#15 print_line_cursor#0 Identical Phi Values print_char_cursor#10 print_line_cursor#0 Identical Phi Values print_line_cursor#17 print_line_cursor#15 Identical Phi Values print_char_cursor#13 print_char_cursor#10 Successful SSA optimization Pass2IdenticalPhiElimination Identical Phi Values memset::return#1 memset::str#0 Successful SSA optimization Pass2IdenticalPhiElimination Simple Condition print_str::$1 [3] if(0!=*print_str::str#2) goto print_str::@2 Simple Condition print_ln::$1 [13] if(print_line_cursor#0print_cls] print_cls_from_main: jsr print_cls // [2] phi from main to main::@1 [phi:main->main::@1] __b1_from_main: // [2] phi main::i#2 = 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 ldx #0 // [2] phi print_line_cursor#21 = print_screen#0 [phi:main->main::@1#1] -- pbuz1=pbuc1 lda #print_screen sta.z print_line_cursor+1 // [2] phi print_char_cursor#32 = print_screen#0 [phi:main->main::@1#2] -- pbuz1=pbuc1 lda #print_screen sta.z print_char_cursor+1 jmp __b1 // main::@1 __b1: // [3] call print_str // [14] phi from main::@1 to print_str [phi:main::@1->print_str] print_str_from___b1: jsr print_str // [4] phi from main::@1 to main::@2 [phi:main::@1->main::@2] __b2_from___b1: jmp __b2 // main::@2 __b2: // [5] call print_ln // [21] phi from main::@2 to print_ln [phi:main::@2->print_ln] print_ln_from___b2: jsr print_ln jmp __b3 // main::@3 __b3: // [6] *(txt+1) = ++ *(txt+1) -- _deref_pbuc1=_inc__deref_pbuc1 inc txt+1 // [7] main::i#1 = ++ main::i#2 -- vbuxx=_inc_vbuxx inx // [8] if(main::i#1!=$b) goto main::@4 -- vbuxx_neq_vbuc1_then_la1 cpx #$b bne __b4 jmp __breturn // main::@return __breturn: // [9] return rts // main::@4 __b4: // [10] print_char_cursor#37 = 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 // [2] phi from main::@4 to main::@1 [phi:main::@4->main::@1] __b1_from___b4: // [2] phi main::i#2 = main::i#1 [phi:main::@4->main::@1#0] -- register_copy // [2] phi print_line_cursor#21 = print_line_cursor#0 [phi:main::@4->main::@1#1] -- register_copy // [2] phi print_char_cursor#32 = print_char_cursor#37 [phi:main::@4->main::@1#2] -- register_copy jmp __b1 } // print_cls // Clear the screen. Also resets current line/char cursor. print_cls: { // [12] call memset // [26] phi from print_cls to memset [phi:print_cls->memset] memset_from_print_cls: jsr memset jmp __breturn // print_cls::@return __breturn: // [13] return rts } // print_str // Print a zero-terminated string // void print_str(__zp(4) char *str) print_str: { .label str = 4 // [15] phi from print_str to print_str::@1 [phi:print_str->print_str::@1] __b1_from_print_str: // [15] phi print_char_cursor#1 = print_char_cursor#32 [phi:print_str->print_str::@1#0] -- register_copy // [15] phi print_str::str#2 = txt [phi:print_str->print_str::@1#1] -- pbuz1=pbuc1 lda #txt sta.z str+1 jmp __b1 // print_str::@1 __b1: // [16] if(0!=*print_str::str#2) goto print_str::@2 -- 0_neq__deref_pbuz1_then_la1 ldy #0 lda (str),y cmp #0 bne __b2 jmp __breturn // print_str::@return __breturn: // [17] return rts // print_str::@2 __b2: // [18] print_char::ch#0 = *print_str::str#2 -- vbuaa=_deref_pbuz1 ldy #0 lda (str),y // [19] call print_char jsr print_char jmp __b3 // print_str::@3 __b3: // [20] print_str::str#0 = ++ print_str::str#2 -- pbuz1=_inc_pbuz1 inc.z str bne !+ inc.z str+1 !: // [15] phi from print_str::@3 to print_str::@1 [phi:print_str::@3->print_str::@1] __b1_from___b3: // [15] phi print_char_cursor#1 = print_char_cursor#20 [phi:print_str::@3->print_str::@1#0] -- register_copy // [15] phi print_str::str#2 = print_str::str#0 [phi:print_str::@3->print_str::@1#1] -- register_copy jmp __b1 } // print_ln // Print a newline print_ln: { // [22] 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: // [22] phi print_line_cursor#10 = print_line_cursor#21 [phi:print_ln/print_ln::@1->print_ln::@1#0] -- register_copy jmp __b1 // print_ln::@1 __b1: // [23] print_line_cursor#0 = print_line_cursor#10 + $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 !: // [24] if(print_line_cursor#0memset::@1] __b1_from_memset: // [27] phi memset::dst#2 = (char *)memset::str#0 [phi:memset->memset::@1#0] -- pbuz1=pbuc1 lda #str sta.z dst+1 jmp __b1 // memset::@1 __b1: // [28] if(memset::dst#2!=memset::end#0) goto memset::@2 -- pbuz1_neq_pbuc1_then_la1 lda.z dst+1 cmp #>end bne __b2 lda.z dst cmp #memset::@1] __b1_from___b2: // [27] phi memset::dst#2 = memset::dst#1 [phi:memset::@2->memset::@1#0] -- register_copy jmp __b1 } // print_char // Print a single char // void print_char(__register(A) char ch) print_char: { // [32] *print_char_cursor#1 = print_char::ch#0 -- _deref_pbuz1=vbuaa ldy #0 sta (print_char_cursor),y // [33] print_char_cursor#20 = ++ print_char_cursor#1 -- pbuz1=_inc_pbuz1 inc.z print_char_cursor bne !+ inc.z print_char_cursor+1 !: jmp __breturn // print_char::@return __breturn: // [34] return rts } // File Data .segment Data txt: .text "camelot" .byte 0 ASSEMBLER OPTIMIZATIONS Removing instruction jmp __b1 Removing instruction jmp __b2 Removing instruction jmp __b3 Removing instruction jmp __breturn Removing instruction jmp __breturn Removing instruction jmp __b1 Removing instruction jmp __breturn Removing instruction jmp __b3 Removing instruction jmp __b1 Removing instruction jmp __breturn Removing instruction jmp __b1 Removing instruction jmp __breturn Removing instruction jmp __breturn Succesful ASM optimization Pass5NextJumpElimination Replacing label __b1_from___b1 with __b1 Replacing label __b1_from___b1 with __b1 Removing instruction print_str_from___b1: Removing instruction __b2_from___b1: Removing instruction print_ln_from___b2: Removing instruction __b1_from_print_ln: Removing instruction __b1_from___b1: Succesful ASM optimization Pass5RedundantLabelElimination Removing instruction print_cls_from_main: Removing instruction __b1_from_main: Removing instruction __b2: Removing instruction __b3: Removing instruction __breturn: Removing instruction __b1_from___b4: Removing instruction memset_from_print_cls: Removing instruction __breturn: Removing instruction __b1_from_print_str: Removing instruction __breturn: Removing instruction __b3: Removing instruction __b1_from___b3: Removing instruction __breturn: Removing instruction __b1_from_memset: Removing instruction __breturn: Removing instruction __b1_from___b2: Removing instruction __breturn: Succesful ASM optimization Pass5UnusedLabelElimination FINAL SYMBOL TABLE __constant char RADIX::BINARY = 2 __constant char RADIX::DECIMAL = $a __constant char RADIX::HEXADECIMAL = $10 __constant char RADIX::OCTAL = 8 void main() char main::i char main::i#1 // reg byte x 11.0 char main::i#2 // reg byte x 4.4 void * memset(void *str , char c , unsigned int num) char memset::c __constant char memset::c#0 = ' ' // c char *memset::dst char *memset::dst#1 // dst zp[2]:4 2002.0 char *memset::dst#2 // dst zp[2]:4 1334.6666666666667 char *memset::end __constant char *memset::end#0 = (char *)memset::str#0+memset::num#0 // end unsigned int memset::num __constant unsigned int memset::num#0 = $3e8 // num void *memset::return void *memset::str __constant void *memset::str#0 = (void *)print_screen#0 // str void print_char(char ch) char print_char::ch char print_char::ch#0 // reg byte a 110002.0 char *print_char_cursor char *print_char_cursor#1 // print_char_cursor zp[2]:2 20009.545454545456 char *print_char_cursor#20 // print_char_cursor zp[2]:2 27500.5 char *print_char_cursor#32 // print_char_cursor zp[2]:2 56.0 char *print_char_cursor#37 // print_char_cursor zp[2]:2 22.0 void print_cls() char *print_line_cursor char *print_line_cursor#0 // print_line_cursor zp[2]:6 3753.125 char *print_line_cursor#10 // print_line_cursor zp[2]:6 20103.0 char *print_line_cursor#21 // print_line_cursor zp[2]:6 28.0 void print_ln() char *print_screen __constant char *print_screen#0 = (char *) 1024 // print_screen void print_str(char *str) char *print_str::str char *print_str::str#0 // str zp[2]:4 20002.0 char *print_str::str#2 // str zp[2]:4 10001.0 __constant char txt[] = "camelot" reg byte x [ main::i#2 main::i#1 ] zp[2]:2 [ print_char_cursor#1 print_char_cursor#32 print_char_cursor#37 print_char_cursor#20 ] zp[2]:6 [ print_line_cursor#10 print_line_cursor#21 print_line_cursor#0 ] zp[2]:4 [ memset::dst#2 memset::dst#1 print_str::str#2 print_str::str#0 ] reg byte a [ print_char::ch#0 ] FINAL ASSEMBLER Score: 9880 // 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="incrementinarray.prg", type="prg", segments="Program"] .segmentdef Program [segments="Basic, Code, Data"] .segmentdef Basic [start=$0801] .segmentdef Code [start=$80d] .segmentdef Data [startAfter="Code"] .segment Basic :BasicUpstart(main) // Global Constants & labels .label print_screen = $400 .label print_char_cursor = 2 .label print_line_cursor = 6 .segment Code // main main: { // print_cls() // [1] call print_cls // [11] phi from main to print_cls [phi:main->print_cls] jsr print_cls // [2] phi from main to main::@1 [phi:main->main::@1] // [2] phi main::i#2 = 0 [phi:main->main::@1#0] -- vbuxx=vbuc1 ldx #0 // [2] phi print_line_cursor#21 = print_screen#0 [phi:main->main::@1#1] -- pbuz1=pbuc1 lda #print_screen sta.z print_line_cursor+1 // [2] phi print_char_cursor#32 = print_screen#0 [phi:main->main::@1#2] -- pbuz1=pbuc1 lda #print_screen sta.z print_char_cursor+1 // main::@1 __b1: // print_str(txt) // [3] call print_str // [14] phi from main::@1 to print_str [phi:main::@1->print_str] jsr print_str // [4] phi from main::@1 to main::@2 [phi:main::@1->main::@2] // main::@2 // print_ln() // [5] call print_ln // [21] phi from main::@2 to print_ln [phi:main::@2->print_ln] jsr print_ln // main::@3 // txt[1]++; // [6] *(txt+1) = ++ *(txt+1) -- _deref_pbuc1=_inc__deref_pbuc1 inc txt+1 // for ( byte i: 0..10) // [7] main::i#1 = ++ main::i#2 -- vbuxx=_inc_vbuxx inx // [8] if(main::i#1!=$b) goto main::@4 -- vbuxx_neq_vbuc1_then_la1 cpx #$b bne __b4 // main::@return // } // [9] return rts // main::@4 __b4: // [10] print_char_cursor#37 = 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 // [2] phi from main::@4 to main::@1 [phi:main::@4->main::@1] // [2] phi main::i#2 = main::i#1 [phi:main::@4->main::@1#0] -- register_copy // [2] phi print_line_cursor#21 = print_line_cursor#0 [phi:main::@4->main::@1#1] -- register_copy // [2] phi print_char_cursor#32 = print_char_cursor#37 [phi:main::@4->main::@1#2] -- register_copy jmp __b1 } // print_cls // Clear the screen. Also resets current line/char cursor. print_cls: { // memset(print_screen, ' ', 1000) // [12] call memset // [26] phi from print_cls to memset [phi:print_cls->memset] jsr memset // print_cls::@return // } // [13] return rts } // print_str // Print a zero-terminated string // void print_str(__zp(4) char *str) print_str: { .label str = 4 // [15] phi from print_str to print_str::@1 [phi:print_str->print_str::@1] // [15] phi print_char_cursor#1 = print_char_cursor#32 [phi:print_str->print_str::@1#0] -- register_copy // [15] phi print_str::str#2 = txt [phi:print_str->print_str::@1#1] -- pbuz1=pbuc1 lda #txt sta.z str+1 // print_str::@1 __b1: // while(*str) // [16] if(0!=*print_str::str#2) goto print_str::@2 -- 0_neq__deref_pbuz1_then_la1 ldy #0 lda (str),y cmp #0 bne __b2 // print_str::@return // } // [17] return rts // print_str::@2 __b2: // print_char(*(str++)) // [18] print_char::ch#0 = *print_str::str#2 -- vbuaa=_deref_pbuz1 ldy #0 lda (str),y // [19] call print_char jsr print_char // print_str::@3 // print_char(*(str++)); // [20] print_str::str#0 = ++ print_str::str#2 -- pbuz1=_inc_pbuz1 inc.z str bne !+ inc.z str+1 !: // [15] phi from print_str::@3 to print_str::@1 [phi:print_str::@3->print_str::@1] // [15] phi print_char_cursor#1 = print_char_cursor#20 [phi:print_str::@3->print_str::@1#0] -- register_copy // [15] phi print_str::str#2 = print_str::str#0 [phi:print_str::@3->print_str::@1#1] -- register_copy jmp __b1 } // print_ln // Print a newline print_ln: { // [22] phi from print_ln print_ln::@1 to print_ln::@1 [phi:print_ln/print_ln::@1->print_ln::@1] // [22] phi print_line_cursor#10 = print_line_cursor#21 [phi:print_ln/print_ln::@1->print_ln::@1#0] -- register_copy // print_ln::@1 __b1: // print_line_cursor + 0x28 // [23] print_line_cursor#0 = print_line_cursor#10 + $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_cursormemset::@1] // [27] phi memset::dst#2 = (char *)memset::str#0 [phi:memset->memset::@1#0] -- pbuz1=pbuc1 lda #str sta.z dst+1 // memset::@1 __b1: // for(char* dst = str; dst!=end; dst++) // [28] if(memset::dst#2!=memset::end#0) goto memset::@2 -- pbuz1_neq_pbuc1_then_la1 lda.z dst+1 cmp #>end bne __b2 lda.z dst cmp #memset::@1] // [27] phi memset::dst#2 = memset::dst#1 [phi:memset::@2->memset::@1#0] -- register_copy jmp __b1 } // print_char // Print a single char // void print_char(__register(A) char ch) print_char: { // *(print_char_cursor++) = ch // [32] *print_char_cursor#1 = print_char::ch#0 -- _deref_pbuz1=vbuaa ldy #0 sta (print_char_cursor),y // *(print_char_cursor++) = ch; // [33] print_char_cursor#20 = ++ print_char_cursor#1 -- pbuz1=_inc_pbuz1 inc.z print_char_cursor bne !+ inc.z print_char_cursor+1 !: // print_char::@return // } // [34] return rts } // File Data .segment Data txt: .text "camelot" .byte 0