mirror of https://gitlab.com/camelot/kickc.git
816 lines
36 KiB
Plaintext
816 lines
36 KiB
Plaintext
Inlined call call __init
|
|
|
|
CONTROL FLOW GRAPH SSA
|
|
|
|
void print_uint(unsigned int w)
|
|
print_uint: scope:[print_uint] from main
|
|
print_char_cursor#25 = phi( main/print_char_cursor#27 )
|
|
print_uint::w#1 = phi( main/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#13 = phi( print_uint/print_char_cursor#5 )
|
|
print_char_cursor#0 = print_char_cursor#13
|
|
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#14 = phi( print_uint::@1/print_char_cursor#5 )
|
|
print_char_cursor#1 = print_char_cursor#14
|
|
to:print_uint::@return
|
|
print_uint::@return: scope:[print_uint] from print_uint::@2
|
|
print_char_cursor#15 = phi( print_uint::@2/print_char_cursor#1 )
|
|
print_char_cursor#2 = print_char_cursor#15
|
|
return
|
|
to:@return
|
|
|
|
void print_uchar(char b)
|
|
print_uchar: scope:[print_uchar] from print_uint print_uint::@1
|
|
print_char_cursor#26 = phi( print_uint/print_char_cursor#25, print_uint::@1/print_char_cursor#0 )
|
|
print_uchar::b#2 = phi( print_uint/print_uchar::b#0, print_uint::@1/print_uchar::b#1 )
|
|
print_uchar::$0 = print_uchar::b#2 >> 4
|
|
print_char::ch#0 = print_hextab[print_uchar::$0]
|
|
call print_char
|
|
to:print_uchar::@1
|
|
print_uchar::@1: scope:[print_uchar] from print_uchar
|
|
print_uchar::b#3 = phi( print_uchar/print_uchar::b#2 )
|
|
print_char_cursor#16 = phi( print_uchar/print_char_cursor#7 )
|
|
print_char_cursor#3 = print_char_cursor#16
|
|
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#17 = phi( print_uchar::@1/print_char_cursor#7 )
|
|
print_char_cursor#4 = print_char_cursor#17
|
|
to:print_uchar::@return
|
|
print_uchar::@return: scope:[print_uchar] from print_uchar::@2
|
|
print_char_cursor#18 = phi( print_uchar::@2/print_char_cursor#4 )
|
|
print_char_cursor#5 = print_char_cursor#18
|
|
return
|
|
to:@return
|
|
|
|
void print_char(char ch)
|
|
print_char: scope:[print_char] from print_uchar print_uchar::@1
|
|
print_char_cursor#19 = phi( print_uchar/print_char_cursor#26, print_uchar::@1/print_char_cursor#3 )
|
|
print_char::ch#2 = phi( print_uchar/print_char::ch#0, print_uchar::@1/print_char::ch#1 )
|
|
*print_char_cursor#19 = print_char::ch#2
|
|
print_char_cursor#6 = ++ 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#6 )
|
|
print_char_cursor#7 = print_char_cursor#20
|
|
return
|
|
to:@return
|
|
|
|
void main()
|
|
main: scope:[main] from __start::@1
|
|
print_char_cursor#27 = phi( __start::@1/print_char_cursor#28 )
|
|
main::file#0 = (struct fileentry *) 0
|
|
main::uSize#0 = 0
|
|
main::file#1 = (struct fileentry *)$4000
|
|
main::$4 = (char **)main::file#1
|
|
main::$2 = main::$4 + OFFSET_STRUCT_FILEENTRY_BUFEDIT
|
|
*main::$2 = (char *)4
|
|
main::$5 = (char **)main::file#1
|
|
main::$3 = main::$5 + OFFSET_STRUCT_FILEENTRY_BUFEDIT
|
|
main::$0 = *main::$3 + $1e
|
|
main::ptrw#0 = (unsigned int *)main::$0
|
|
main::uSize#1 = *main::ptrw#0
|
|
print_uint::w#0 = main::uSize#1
|
|
call print_uint
|
|
to:main::@1
|
|
main::@1: scope:[main] from main
|
|
print_char_cursor#21 = phi( main/print_char_cursor#2 )
|
|
print_char_cursor#8 = print_char_cursor#21
|
|
to:main::@return
|
|
main::@return: scope:[main] from main::@1
|
|
print_char_cursor#22 = phi( main::@1/print_char_cursor#8 )
|
|
print_char_cursor#9 = print_char_cursor#22
|
|
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#0 = print_screen#0
|
|
print_char_cursor#10 = print_line_cursor#0
|
|
to:__start::@1
|
|
__start::@1: scope:[__start] from __start::__init1
|
|
print_line_cursor#4 = phi( __start::__init1/print_line_cursor#0 )
|
|
print_screen#4 = phi( __start::__init1/print_screen#0 )
|
|
print_char_cursor#28 = phi( __start::__init1/print_char_cursor#10 )
|
|
call main
|
|
to:__start::@2
|
|
__start::@2: scope:[__start] from __start::@1
|
|
print_line_cursor#3 = phi( __start::@1/print_line_cursor#4 )
|
|
print_screen#3 = phi( __start::@1/print_screen#4 )
|
|
print_char_cursor#23 = phi( __start::@1/print_char_cursor#9 )
|
|
print_char_cursor#11 = print_char_cursor#23
|
|
to:__start::@return
|
|
__start::@return: scope:[__start] from __start::@2
|
|
print_char_cursor#24 = phi( __start::@2/print_char_cursor#11 )
|
|
print_line_cursor#2 = phi( __start::@2/print_line_cursor#3 )
|
|
print_screen#2 = phi( __start::@2/print_screen#3 )
|
|
print_screen#1 = print_screen#2
|
|
print_line_cursor#1 = print_line_cursor#2
|
|
print_char_cursor#12 = print_char_cursor#24
|
|
return
|
|
to:@return
|
|
|
|
SYMBOL TABLE SSA
|
|
__constant char OFFSET_STRUCT_FILEENTRY_BUFEDIT = 0
|
|
__constant char RADIX::BINARY = 2
|
|
__constant char RADIX::DECIMAL = $a
|
|
__constant char RADIX::HEXADECIMAL = $10
|
|
__constant char RADIX::OCTAL = 8
|
|
void __start()
|
|
void main()
|
|
char *main::$0
|
|
char **main::$2
|
|
char **main::$3
|
|
char **main::$4
|
|
char **main::$5
|
|
struct fileentry *main::file
|
|
struct fileentry *main::file#0
|
|
struct fileentry *main::file#1
|
|
unsigned int *main::ptrw
|
|
unsigned int *main::ptrw#0
|
|
unsigned int main::uSize
|
|
unsigned int main::uSize#0
|
|
unsigned int main::uSize#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#3
|
|
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
|
|
__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#2
|
|
char *print_line_cursor#3
|
|
char *print_line_cursor#4
|
|
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
|
|
|
|
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) $1e in main::$0 = *main::$3 + $1e
|
|
Successful SSA optimization PassNAddNumberTypeConversions
|
|
Simplifying constant integer cast 4
|
|
Simplifying constant integer cast $f
|
|
Simplifying constant pointer cast (struct fileentry *) 16384
|
|
Simplifying constant pointer cast (char *) 4
|
|
Simplifying constant integer cast $1e
|
|
Simplifying constant pointer cast (char *) 1024
|
|
Successful SSA optimization PassNCastSimplification
|
|
Finalized unsigned number type (char) 4
|
|
Finalized unsigned number type (char) $f
|
|
Finalized unsigned number type (char) $1e
|
|
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
|
Inferred type updated to char in print_uchar::$2 = print_uchar::b#3 & $f
|
|
Alias print_uchar::b#0 = print_uint::$0
|
|
Alias print_uint::w#1 = print_uint::w#2
|
|
Alias print_char_cursor#0 = print_char_cursor#13
|
|
Alias print_uchar::b#1 = print_uint::$2
|
|
Alias print_char_cursor#1 = print_char_cursor#14 print_char_cursor#15 print_char_cursor#2
|
|
Alias print_uchar::b#2 = print_uchar::b#3
|
|
Alias print_char_cursor#16 = print_char_cursor#3
|
|
Alias print_char_cursor#17 = print_char_cursor#4 print_char_cursor#18 print_char_cursor#5
|
|
Alias print_char_cursor#20 = print_char_cursor#6 print_char_cursor#7
|
|
Alias print_char_cursor#21 = print_char_cursor#8 print_char_cursor#22 print_char_cursor#9
|
|
Alias print_screen#0 = print_line_cursor#0 print_char_cursor#10 print_char_cursor#28 print_screen#4 print_line_cursor#4 print_screen#3 print_line_cursor#3 print_screen#2 print_line_cursor#2 print_screen#1 print_line_cursor#1
|
|
Alias print_char_cursor#11 = print_char_cursor#23 print_char_cursor#24 print_char_cursor#12
|
|
Successful SSA optimization Pass2AliasElimination
|
|
Identical Phi Values print_uint::w#1 print_uint::w#0
|
|
Identical Phi Values print_char_cursor#25 print_char_cursor#27
|
|
Identical Phi Values print_char_cursor#0 print_char_cursor#17
|
|
Identical Phi Values print_char_cursor#1 print_char_cursor#17
|
|
Identical Phi Values print_char_cursor#16 print_char_cursor#20
|
|
Identical Phi Values print_char_cursor#17 print_char_cursor#20
|
|
Identical Phi Values print_char_cursor#27 print_screen#0
|
|
Identical Phi Values print_char_cursor#21 print_char_cursor#1
|
|
Identical Phi Values print_char_cursor#11 print_char_cursor#21
|
|
Successful SSA optimization Pass2IdenticalPhiElimination
|
|
Constant main::file#0 = (struct fileentry *) 0
|
|
Constant main::uSize#0 = 0
|
|
Constant main::file#1 = (struct fileentry *) 16384
|
|
Constant print_screen#0 = (char *) 1024
|
|
Successful SSA optimization Pass2ConstantIdentification
|
|
Constant main::$4 = (char **)main::file#1
|
|
Constant main::$5 = (char **)main::file#1
|
|
Successful SSA optimization Pass2ConstantIdentification
|
|
Converting *(pointer+n) to pointer[n] [28] *main::$2 = (char *) 4 -- main::$4[OFFSET_STRUCT_FILEENTRY_BUFEDIT]
|
|
Converting *(pointer+n) to pointer[n] [31] main::$0 = *main::$3 + $1e -- main::$5[OFFSET_STRUCT_FILEENTRY_BUFEDIT]
|
|
Converting *(pointer+n) to pointer[n] [33] main::uSize#1 = *main::ptrw#0 -- ((unsigned int *)main::$5[OFFSET_STRUCT_FILEENTRY_BUFEDIT])[$1e]
|
|
Successful SSA optimization Pass2InlineDerefIdx
|
|
Simplifying expression containing zero main::$4 in [27] main::$2 = main::$4 + OFFSET_STRUCT_FILEENTRY_BUFEDIT
|
|
Simplifying expression containing zero main::$4 in [28] main::$4[OFFSET_STRUCT_FILEENTRY_BUFEDIT] = (char *) 4
|
|
Simplifying expression containing zero main::$5 in [30] main::$3 = main::$5 + OFFSET_STRUCT_FILEENTRY_BUFEDIT
|
|
Simplifying expression containing zero main::$5 in [31] main::$0 = main::$5[OFFSET_STRUCT_FILEENTRY_BUFEDIT] + $1e
|
|
Simplifying expression containing zero main::$5 in [33] main::uSize#1 = ((unsigned int *)main::$5[OFFSET_STRUCT_FILEENTRY_BUFEDIT])[$1e]
|
|
Successful SSA optimization PassNSimplifyExpressionWithZero
|
|
Eliminating unused variable main::$2 and assignment [17] main::$2 = main::$4
|
|
Eliminating unused variable main::$3 and assignment [19] main::$3 = main::$5
|
|
Eliminating unused variable main::ptrw#0 and assignment [21] main::ptrw#0 = (unsigned int *)main::$0
|
|
Eliminating unused constant main::file#0
|
|
Eliminating unused constant main::uSize#0
|
|
Eliminating unused constant OFFSET_STRUCT_FILEENTRY_BUFEDIT
|
|
Successful SSA optimization PassNEliminateUnusedVars
|
|
Eliminating unused variable main::$0 and assignment [18] main::$0 = *main::$5 + $1e
|
|
Successful SSA optimization PassNEliminateUnusedVars
|
|
Removing unused procedure __start
|
|
Removing unused procedure block __start
|
|
Removing unused procedure block __start::__init1
|
|
Removing unused procedure block __start::@1
|
|
Removing unused procedure block __start::@2
|
|
Removing unused procedure block __start::@return
|
|
Successful SSA optimization PassNEliminateEmptyStart
|
|
Constant inlined main::$5 = (char **)main::file#1
|
|
Constant inlined main::$4 = (char **)main::file#1
|
|
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
|
|
Adding NOP phi() at start of main::@1
|
|
Adding NOP phi() at start of print_uint::@2
|
|
Adding NOP phi() at start of print_uchar::@2
|
|
CALL GRAPH
|
|
Calls in [main] to print_uint:3
|
|
Calls in [print_uint] to print_uchar:8 print_uchar:12
|
|
Calls in [print_uchar] to print_char:20 print_char:25
|
|
|
|
Created 4 initial phi equivalence classes
|
|
Coalesced [7] print_uchar::b#4 = print_uchar::b#0
|
|
Coalesced [10] print_uchar::b#5 = print_uchar::b#1
|
|
Coalesced [11] print_char_cursor#29 = print_char_cursor#20
|
|
Coalesced [18] print_char::ch#3 = print_char::ch#0
|
|
Coalesced [19] print_char_cursor#30 = print_char_cursor#26
|
|
Coalesced [23] print_char::ch#4 = print_char::ch#1
|
|
Coalesced (already) [24] print_char_cursor#31 = print_char_cursor#20
|
|
Coalesced down to 3 phi equivalence classes
|
|
Culled Empty Block label main::@1
|
|
Culled Empty Block label print_uint::@2
|
|
Culled Empty Block label print_uchar::@2
|
|
|
|
FINAL CONTROL FLOW GRAPH
|
|
|
|
void main()
|
|
main: scope:[main] from
|
|
[0] *((char **)main::file#1) = (char *) 4
|
|
[1] main::uSize#1 = ((unsigned int *)*((char **)main::file#1))[$1e]
|
|
[2] print_uint::w#0 = main::uSize#1
|
|
[3] call print_uint
|
|
to:main::@return
|
|
main::@return: scope:[main] from main
|
|
[4] return
|
|
to:@return
|
|
|
|
void print_uint(unsigned int w)
|
|
print_uint: scope:[print_uint] from main
|
|
[5] print_uchar::b#0 = byte1 print_uint::w#0
|
|
[6] call print_uchar
|
|
to:print_uint::@1
|
|
print_uint::@1: scope:[print_uint] from print_uint
|
|
[7] print_uchar::b#1 = byte0 print_uint::w#0
|
|
[8] call print_uchar
|
|
to:print_uint::@return
|
|
print_uint::@return: scope:[print_uint] from print_uint::@1
|
|
[9] return
|
|
to:@return
|
|
|
|
void print_uchar(char b)
|
|
print_uchar: scope:[print_uchar] from print_uint print_uint::@1
|
|
[10] print_char_cursor#26 = phi( print_uint/print_screen#0, print_uint::@1/print_char_cursor#20 )
|
|
[10] print_uchar::b#2 = phi( print_uint/print_uchar::b#0, print_uint::@1/print_uchar::b#1 )
|
|
[11] print_uchar::$0 = print_uchar::b#2 >> 4
|
|
[12] print_char::ch#0 = print_hextab[print_uchar::$0]
|
|
[13] call print_char
|
|
to:print_uchar::@1
|
|
print_uchar::@1: scope:[print_uchar] from print_uchar
|
|
[14] print_uchar::$2 = print_uchar::b#2 & $f
|
|
[15] print_char::ch#1 = print_hextab[print_uchar::$2]
|
|
[16] call print_char
|
|
to:print_uchar::@return
|
|
print_uchar::@return: scope:[print_uchar] from print_uchar::@1
|
|
[17] return
|
|
to:@return
|
|
|
|
void print_char(char ch)
|
|
print_char: scope:[print_char] from print_uchar print_uchar::@1
|
|
[18] print_char_cursor#19 = phi( print_uchar/print_char_cursor#26, print_uchar::@1/print_char_cursor#20 )
|
|
[18] print_char::ch#2 = phi( print_uchar/print_char::ch#0, print_uchar::@1/print_char::ch#1 )
|
|
[19] *print_char_cursor#19 = print_char::ch#2
|
|
[20] print_char_cursor#20 = ++ print_char_cursor#19
|
|
to:print_char::@return
|
|
print_char::@return: scope:[print_char] from print_char
|
|
[21] return
|
|
to:@return
|
|
|
|
|
|
VARIABLE REGISTER WEIGHTS
|
|
void main()
|
|
struct fileentry *main::file
|
|
unsigned int *main::ptrw
|
|
unsigned int main::uSize
|
|
unsigned int main::uSize#1 // 4.0
|
|
void print_char(char ch)
|
|
char print_char::ch
|
|
char print_char::ch#0 // 202.0
|
|
char print_char::ch#1 // 202.0
|
|
char print_char::ch#2 // 1203.0
|
|
char *print_char_cursor
|
|
char *print_char_cursor#19 // 1102.0
|
|
char *print_char_cursor#20 // 123.66666666666667
|
|
char *print_char_cursor#26 // 37.33333333333333
|
|
char *print_line_cursor
|
|
char *print_screen
|
|
void print_uchar(char b)
|
|
char print_uchar::$0 // 202.0
|
|
char print_uchar::$2 // 202.0
|
|
char print_uchar::b
|
|
char print_uchar::b#0 // 22.0
|
|
char print_uchar::b#1 // 22.0
|
|
char print_uchar::b#2 // 56.0
|
|
void print_uint(unsigned int w)
|
|
unsigned int print_uint::w
|
|
unsigned int print_uint::w#0 // 8.0
|
|
|
|
Initial phi equivalence classes
|
|
[ 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#19 print_char_cursor#26 print_char_cursor#20 ]
|
|
Added variable main::uSize#1 to live range equivalence class [ main::uSize#1 ]
|
|
Added variable print_uint::w#0 to live range equivalence class [ print_uint::w#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
|
|
[ 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#19 print_char_cursor#26 print_char_cursor#20 ]
|
|
[ main::uSize#1 ]
|
|
[ print_uint::w#0 ]
|
|
[ print_uchar::$0 ]
|
|
[ print_uchar::$2 ]
|
|
Allocated zp[1]:2 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
|
|
Allocated zp[2]:3 [ print_char_cursor#19 print_char_cursor#26 print_char_cursor#20 ]
|
|
Allocated zp[1]:5 [ print_uchar::$0 ]
|
|
Allocated zp[1]:6 [ print_uchar::$2 ]
|
|
Allocated zp[1]:7 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
|
|
Allocated zp[2]:8 [ print_uint::w#0 ]
|
|
Allocated zp[2]:10 [ main::uSize#1 ]
|
|
REGISTER UPLIFT POTENTIAL REGISTERS
|
|
Statement [0] *((char **)main::file#1) = (char *) 4 [ ] ( [ ] { { print_uint::w#0 = main::uSize#1 } } ) always clobbers reg byte a
|
|
Statement [1] main::uSize#1 = ((unsigned int *)*((char **)main::file#1))[$1e] [ main::uSize#1 ] ( [ main::uSize#1 ] { { print_uint::w#0 = main::uSize#1 } } ) always clobbers reg byte a reg byte y
|
|
Statement [2] print_uint::w#0 = main::uSize#1 [ print_uint::w#0 ] ( [ print_uint::w#0 ] { { print_uint::w#0 = main::uSize#1 } } ) always clobbers reg byte a
|
|
Statement [11] print_uchar::$0 = print_uchar::b#2 >> 4 [ print_uchar::b#2 print_char_cursor#26 print_uchar::$0 ] ( print_uint:3::print_uchar:6 [ print_uint::w#0 print_uchar::b#2 print_char_cursor#26 print_uchar::$0 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } { print_char_cursor#19 = print_char_cursor#26 } } print_uint:3::print_uchar:8 [ print_uchar::b#2 print_char_cursor#26 print_uchar::$0 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#19 = print_char_cursor#26 print_char_cursor#20 } { print_char::ch#0 = print_char::ch#2 } } ) always clobbers reg byte a
|
|
Removing always clobbered register reg byte a as potential for zp[1]:7 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
|
|
Statement [14] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#20 print_uchar::$2 ] ( print_uint:3::print_uchar:6 [ print_uint::w#0 print_char_cursor#20 print_uchar::$2 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#19 = print_char_cursor#20 } } print_uint:3::print_uchar:8 [ print_char_cursor#20 print_uchar::$2 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#19 = print_char_cursor#26 print_char_cursor#20 } { print_char::ch#1 = print_char::ch#2 } } ) always clobbers reg byte a
|
|
Statement [19] *print_char_cursor#19 = print_char::ch#2 [ print_char_cursor#19 ] ( print_uint:3::print_uchar:6::print_char:13 [ print_uint::w#0 print_uchar::b#2 print_char_cursor#19 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } { print_char_cursor#19 = print_char_cursor#26 } } print_uint:3::print_uchar:8::print_char:13 [ print_uchar::b#2 print_char_cursor#19 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#19 = print_char_cursor#26 print_char_cursor#20 } { print_char::ch#0 = print_char::ch#2 } } print_uint:3::print_uchar:6::print_char:16 [ print_uint::w#0 print_char_cursor#19 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#19 = print_char_cursor#20 } } print_uint:3::print_uchar:8::print_char:16 [ print_char_cursor#19 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#19 = print_char_cursor#26 print_char_cursor#20 } { print_char::ch#1 = print_char::ch#2 } } ) always clobbers reg byte y
|
|
Removing always clobbered register reg byte y as potential for zp[1]:7 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
|
|
Statement [0] *((char **)main::file#1) = (char *) 4 [ ] ( [ ] { { print_uint::w#0 = main::uSize#1 } } ) always clobbers reg byte a
|
|
Statement [1] main::uSize#1 = ((unsigned int *)*((char **)main::file#1))[$1e] [ main::uSize#1 ] ( [ main::uSize#1 ] { { print_uint::w#0 = main::uSize#1 } } ) always clobbers reg byte a reg byte y
|
|
Statement [2] print_uint::w#0 = main::uSize#1 [ print_uint::w#0 ] ( [ print_uint::w#0 ] { { print_uint::w#0 = main::uSize#1 } } ) always clobbers reg byte a
|
|
Statement [11] print_uchar::$0 = print_uchar::b#2 >> 4 [ print_uchar::b#2 print_char_cursor#26 print_uchar::$0 ] ( print_uint:3::print_uchar:6 [ print_uint::w#0 print_uchar::b#2 print_char_cursor#26 print_uchar::$0 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } { print_char_cursor#19 = print_char_cursor#26 } } print_uint:3::print_uchar:8 [ print_uchar::b#2 print_char_cursor#26 print_uchar::$0 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#19 = print_char_cursor#26 print_char_cursor#20 } { print_char::ch#0 = print_char::ch#2 } } ) always clobbers reg byte a
|
|
Statement [14] print_uchar::$2 = print_uchar::b#2 & $f [ print_char_cursor#20 print_uchar::$2 ] ( print_uint:3::print_uchar:6 [ print_uint::w#0 print_char_cursor#20 print_uchar::$2 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#19 = print_char_cursor#20 } } print_uint:3::print_uchar:8 [ print_char_cursor#20 print_uchar::$2 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#19 = print_char_cursor#26 print_char_cursor#20 } { print_char::ch#1 = print_char::ch#2 } } ) always clobbers reg byte a
|
|
Statement [19] *print_char_cursor#19 = print_char::ch#2 [ print_char_cursor#19 ] ( print_uint:3::print_uchar:6::print_char:13 [ print_uint::w#0 print_uchar::b#2 print_char_cursor#19 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#0 = print_char::ch#2 } { print_char_cursor#19 = print_char_cursor#26 } } print_uint:3::print_uchar:8::print_char:13 [ print_uchar::b#2 print_char_cursor#19 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#19 = print_char_cursor#26 print_char_cursor#20 } { print_char::ch#0 = print_char::ch#2 } } print_uint:3::print_uchar:6::print_char:16 [ print_uint::w#0 print_char_cursor#19 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#0 = print_uchar::b#2 } { print_char::ch#1 = print_char::ch#2 } { print_char_cursor#19 = print_char_cursor#20 } } print_uint:3::print_uchar:8::print_char:16 [ print_char_cursor#19 ] { { print_uint::w#0 = main::uSize#1 } { print_uchar::b#1 = print_uchar::b#2 } { print_char_cursor#19 = print_char_cursor#26 print_char_cursor#20 } { print_char::ch#1 = print_char::ch#2 } } ) always clobbers reg byte y
|
|
Potential registers zp[1]:7 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ] : zp[1]:7 , reg byte x ,
|
|
Potential registers zp[1]:2 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y ,
|
|
Potential registers zp[2]:3 [ print_char_cursor#19 print_char_cursor#26 print_char_cursor#20 ] : zp[2]:3 ,
|
|
Potential registers zp[2]:10 [ main::uSize#1 ] : zp[2]:10 ,
|
|
Potential registers zp[2]:8 [ print_uint::w#0 ] : zp[2]:8 ,
|
|
Potential registers zp[1]:5 [ print_uchar::$0 ] : zp[1]:5 , reg byte a , reg byte x , reg byte y ,
|
|
Potential registers zp[1]:6 [ print_uchar::$2 ] : zp[1]:6 , reg byte a , reg byte x , reg byte y ,
|
|
|
|
REGISTER UPLIFT SCOPES
|
|
Uplift Scope [print_char] 1,607: zp[1]:2 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
|
|
Uplift Scope [] 1,263: zp[2]:3 [ print_char_cursor#19 print_char_cursor#26 print_char_cursor#20 ]
|
|
Uplift Scope [print_uchar] 202: zp[1]:5 [ print_uchar::$0 ] 202: zp[1]:6 [ print_uchar::$2 ] 100: zp[1]:7 [ print_uchar::b#2 print_uchar::b#0 print_uchar::b#1 ]
|
|
Uplift Scope [print_uint] 8: zp[2]:8 [ print_uint::w#0 ]
|
|
Uplift Scope [main] 4: zp[2]:10 [ main::uSize#1 ]
|
|
Uplift Scope [RADIX]
|
|
Uplift Scope [fileentry]
|
|
|
|
Uplifting [print_char] best 209 combination reg byte a [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
|
|
Uplifting [] best 209 combination zp[2]:3 [ print_char_cursor#19 print_char_cursor#26 print_char_cursor#20 ]
|
|
Uplifting [print_uchar] best 191 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 [print_uint] best 191 combination zp[2]:8 [ print_uint::w#0 ]
|
|
Uplifting [main] best 191 combination zp[2]:10 [ main::uSize#1 ]
|
|
Uplifting [RADIX] best 191 combination
|
|
Uplifting [fileentry] best 191 combination
|
|
Coalescing zero page register [ zp[2]:10 [ main::uSize#1 ] ] with [ zp[2]:8 [ print_uint::w#0 ] ] - score: 1
|
|
Allocated (was zp[2]:3) zp[2]:2 [ print_char_cursor#19 print_char_cursor#26 print_char_cursor#20 ]
|
|
Allocated (was zp[2]:10) zp[2]:4 [ main::uSize#1 print_uint::w#0 ]
|
|
|
|
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="struct-ptr-26.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
|
|
.segment Code
|
|
// main
|
|
main: {
|
|
.label file = $4000
|
|
.label uSize = 4
|
|
// [0] *((char **)main::file#1) = (char *) 4 -- _deref_qbuc1=pbuc2
|
|
lda #<4
|
|
sta file
|
|
lda #>4
|
|
sta file+1
|
|
// [1] main::uSize#1 = ((unsigned int *)*((char **)main::file#1))[$1e] -- vwuz1=(_deref_qwuc1)_derefidx_vbuc2
|
|
ldy #$1e
|
|
lda file
|
|
sta.z $fe
|
|
lda file+1
|
|
sta.z $ff
|
|
lda ($fe),y
|
|
sta.z uSize
|
|
iny
|
|
lda ($fe),y
|
|
sta.z uSize+1
|
|
// [2] print_uint::w#0 = main::uSize#1
|
|
// [3] call print_uint
|
|
jsr print_uint
|
|
jmp __breturn
|
|
// main::@return
|
|
__breturn:
|
|
// [4] return
|
|
rts
|
|
}
|
|
// print_uint
|
|
// Print a unsigned int as HEX
|
|
// void print_uint(__zp(4) unsigned int w)
|
|
print_uint: {
|
|
.label w = 4
|
|
// [5] print_uchar::b#0 = byte1 print_uint::w#0 -- vbuxx=_byte1_vwuz1
|
|
ldx.z w+1
|
|
// [6] call print_uchar
|
|
// [10] phi from print_uint to print_uchar [phi:print_uint->print_uchar]
|
|
print_uchar_from_print_uint:
|
|
// [10] phi print_char_cursor#26 = print_screen#0 [phi:print_uint->print_uchar#0] -- pbuz1=pbuc1
|
|
lda #<print_screen
|
|
sta.z print_char_cursor
|
|
lda #>print_screen
|
|
sta.z print_char_cursor+1
|
|
// [10] 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:
|
|
// [7] print_uchar::b#1 = byte0 print_uint::w#0 -- vbuxx=_byte0_vwuz1
|
|
ldx.z w
|
|
// [8] call print_uchar
|
|
// [10] phi from print_uint::@1 to print_uchar [phi:print_uint::@1->print_uchar]
|
|
print_uchar_from___b1:
|
|
// [10] phi print_char_cursor#26 = print_char_cursor#20 [phi:print_uint::@1->print_uchar#0] -- register_copy
|
|
// [10] 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:
|
|
// [9] return
|
|
rts
|
|
}
|
|
// print_uchar
|
|
// Print a char as HEX
|
|
// void print_uchar(__register(X) char b)
|
|
print_uchar: {
|
|
// [11] print_uchar::$0 = print_uchar::b#2 >> 4 -- vbuaa=vbuxx_ror_4
|
|
txa
|
|
lsr
|
|
lsr
|
|
lsr
|
|
lsr
|
|
// [12] print_char::ch#0 = print_hextab[print_uchar::$0] -- vbuaa=pbuc1_derefidx_vbuaa
|
|
tay
|
|
lda print_hextab,y
|
|
// [13] call print_char
|
|
// Table of hexadecimal digits
|
|
// [18] phi from print_uchar to print_char [phi:print_uchar->print_char]
|
|
print_char_from_print_uchar:
|
|
// [18] phi print_char_cursor#19 = print_char_cursor#26 [phi:print_uchar->print_char#0] -- register_copy
|
|
// [18] 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:
|
|
// [14] print_uchar::$2 = print_uchar::b#2 & $f -- vbuxx=vbuxx_band_vbuc1
|
|
lda #$f
|
|
axs #0
|
|
// [15] print_char::ch#1 = print_hextab[print_uchar::$2] -- vbuaa=pbuc1_derefidx_vbuxx
|
|
lda print_hextab,x
|
|
// [16] call print_char
|
|
// [18] phi from print_uchar::@1 to print_char [phi:print_uchar::@1->print_char]
|
|
print_char_from___b1:
|
|
// [18] phi print_char_cursor#19 = print_char_cursor#20 [phi:print_uchar::@1->print_char#0] -- register_copy
|
|
// [18] 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:
|
|
// [17] return
|
|
rts
|
|
}
|
|
// print_char
|
|
// Print a single char
|
|
// void print_char(__register(A) char ch)
|
|
print_char: {
|
|
// [19] *print_char_cursor#19 = print_char::ch#2 -- _deref_pbuz1=vbuaa
|
|
ldy #0
|
|
sta (print_char_cursor),y
|
|
// [20] print_char_cursor#20 = ++ print_char_cursor#19 -- pbuz1=_inc_pbuz1
|
|
inc.z print_char_cursor
|
|
bne !+
|
|
inc.z print_char_cursor+1
|
|
!:
|
|
jmp __breturn
|
|
// print_char::@return
|
|
__breturn:
|
|
// [21] return
|
|
rts
|
|
}
|
|
// File Data
|
|
.segment Data
|
|
print_hextab: .text "0123456789abcdef"
|
|
|
|
ASSEMBLER OPTIMIZATIONS
|
|
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 __breturn:
|
|
Removing instruction print_uchar_from_print_uint:
|
|
Removing instruction __b1:
|
|
Removing instruction print_uchar_from___b1:
|
|
Removing instruction __breturn:
|
|
Removing instruction print_char_from_print_uchar:
|
|
Removing instruction __b1:
|
|
Removing instruction print_char_from___b1:
|
|
Removing instruction __breturn:
|
|
Removing instruction __breturn:
|
|
Succesful ASM optimization Pass5UnusedLabelElimination
|
|
|
|
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()
|
|
struct fileentry *main::file
|
|
__constant struct fileentry *main::file#1 = (struct fileentry *) 16384 // file
|
|
unsigned int *main::ptrw
|
|
unsigned int main::uSize
|
|
unsigned int main::uSize#1 // uSize zp[2]:4 4.0
|
|
void print_char(char ch)
|
|
char print_char::ch
|
|
char print_char::ch#0 // reg byte a 202.0
|
|
char print_char::ch#1 // reg byte a 202.0
|
|
char print_char::ch#2 // reg byte a 1203.0
|
|
char *print_char_cursor
|
|
char *print_char_cursor#19 // print_char_cursor zp[2]:2 1102.0
|
|
char *print_char_cursor#20 // print_char_cursor zp[2]:2 123.66666666666667
|
|
char *print_char_cursor#26 // print_char_cursor zp[2]:2 37.33333333333333
|
|
__constant const char print_hextab[] = "0123456789abcdef"z
|
|
char *print_line_cursor
|
|
char *print_screen
|
|
__constant char *print_screen#0 = (char *) 1024 // print_screen
|
|
void print_uchar(char b)
|
|
char print_uchar::$0 // reg byte a 202.0
|
|
char print_uchar::$2 // reg byte x 202.0
|
|
char print_uchar::b
|
|
char print_uchar::b#0 // reg byte x 22.0
|
|
char print_uchar::b#1 // reg byte x 22.0
|
|
char print_uchar::b#2 // reg byte x 56.0
|
|
void print_uint(unsigned int w)
|
|
unsigned int print_uint::w
|
|
unsigned int print_uint::w#0 // w zp[2]:4 8.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]:2 [ print_char_cursor#19 print_char_cursor#26 print_char_cursor#20 ]
|
|
zp[2]:4 [ main::uSize#1 print_uint::w#0 ]
|
|
reg byte a [ print_uchar::$0 ]
|
|
reg byte x [ print_uchar::$2 ]
|
|
|
|
|
|
FINAL ASSEMBLER
|
|
Score: 161
|
|
|
|
// 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="struct-ptr-26.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
|
|
.segment Code
|
|
// main
|
|
main: {
|
|
.label file = $4000
|
|
.label uSize = 4
|
|
// file->bufEdit = (BYTE*)4
|
|
// [0] *((char **)main::file#1) = (char *) 4 -- _deref_qbuc1=pbuc2
|
|
lda #<4
|
|
sta file
|
|
lda #>4
|
|
sta file+1
|
|
// uSize = *ptrw
|
|
// [1] main::uSize#1 = ((unsigned int *)*((char **)main::file#1))[$1e] -- vwuz1=(_deref_qwuc1)_derefidx_vbuc2
|
|
ldy #$1e
|
|
lda file
|
|
sta.z $fe
|
|
lda file+1
|
|
sta.z $ff
|
|
lda ($fe),y
|
|
sta.z uSize
|
|
iny
|
|
lda ($fe),y
|
|
sta.z uSize+1
|
|
// print_uint(uSize)
|
|
// [2] print_uint::w#0 = main::uSize#1
|
|
// [3] call print_uint
|
|
jsr print_uint
|
|
// main::@return
|
|
// }
|
|
// [4] return
|
|
rts
|
|
}
|
|
// print_uint
|
|
// Print a unsigned int as HEX
|
|
// void print_uint(__zp(4) unsigned int w)
|
|
print_uint: {
|
|
.label w = 4
|
|
// print_uchar(BYTE1(w))
|
|
// [5] print_uchar::b#0 = byte1 print_uint::w#0 -- vbuxx=_byte1_vwuz1
|
|
ldx.z w+1
|
|
// [6] call print_uchar
|
|
// [10] phi from print_uint to print_uchar [phi:print_uint->print_uchar]
|
|
// [10] phi print_char_cursor#26 = print_screen#0 [phi:print_uint->print_uchar#0] -- pbuz1=pbuc1
|
|
lda #<print_screen
|
|
sta.z print_char_cursor
|
|
lda #>print_screen
|
|
sta.z print_char_cursor+1
|
|
// [10] 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))
|
|
// [7] print_uchar::b#1 = byte0 print_uint::w#0 -- vbuxx=_byte0_vwuz1
|
|
ldx.z w
|
|
// [8] call print_uchar
|
|
// [10] phi from print_uint::@1 to print_uchar [phi:print_uint::@1->print_uchar]
|
|
// [10] phi print_char_cursor#26 = print_char_cursor#20 [phi:print_uint::@1->print_uchar#0] -- register_copy
|
|
// [10] phi print_uchar::b#2 = print_uchar::b#1 [phi:print_uint::@1->print_uchar#1] -- register_copy
|
|
jsr print_uchar
|
|
// print_uint::@return
|
|
// }
|
|
// [9] return
|
|
rts
|
|
}
|
|
// print_uchar
|
|
// Print a char as HEX
|
|
// void print_uchar(__register(X) char b)
|
|
print_uchar: {
|
|
// b>>4
|
|
// [11] print_uchar::$0 = print_uchar::b#2 >> 4 -- vbuaa=vbuxx_ror_4
|
|
txa
|
|
lsr
|
|
lsr
|
|
lsr
|
|
lsr
|
|
// print_char(print_hextab[b>>4])
|
|
// [12] print_char::ch#0 = print_hextab[print_uchar::$0] -- vbuaa=pbuc1_derefidx_vbuaa
|
|
tay
|
|
lda print_hextab,y
|
|
// [13] call print_char
|
|
// Table of hexadecimal digits
|
|
// [18] phi from print_uchar to print_char [phi:print_uchar->print_char]
|
|
// [18] phi print_char_cursor#19 = print_char_cursor#26 [phi:print_uchar->print_char#0] -- register_copy
|
|
// [18] 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
|
|
// [14] print_uchar::$2 = print_uchar::b#2 & $f -- vbuxx=vbuxx_band_vbuc1
|
|
lda #$f
|
|
axs #0
|
|
// print_char(print_hextab[b&0xf])
|
|
// [15] print_char::ch#1 = print_hextab[print_uchar::$2] -- vbuaa=pbuc1_derefidx_vbuxx
|
|
lda print_hextab,x
|
|
// [16] call print_char
|
|
// [18] phi from print_uchar::@1 to print_char [phi:print_uchar::@1->print_char]
|
|
// [18] phi print_char_cursor#19 = print_char_cursor#20 [phi:print_uchar::@1->print_char#0] -- register_copy
|
|
// [18] phi print_char::ch#2 = print_char::ch#1 [phi:print_uchar::@1->print_char#1] -- register_copy
|
|
jsr print_char
|
|
// print_uchar::@return
|
|
// }
|
|
// [17] return
|
|
rts
|
|
}
|
|
// print_char
|
|
// Print a single char
|
|
// void print_char(__register(A) char ch)
|
|
print_char: {
|
|
// *(print_char_cursor++) = ch
|
|
// [19] *print_char_cursor#19 = print_char::ch#2 -- _deref_pbuz1=vbuaa
|
|
ldy #0
|
|
sta (print_char_cursor),y
|
|
// *(print_char_cursor++) = ch;
|
|
// [20] print_char_cursor#20 = ++ print_char_cursor#19 -- pbuz1=_inc_pbuz1
|
|
inc.z print_char_cursor
|
|
bne !+
|
|
inc.z print_char_cursor+1
|
|
!:
|
|
// print_char::@return
|
|
// }
|
|
// [21] return
|
|
rts
|
|
}
|
|
// File Data
|
|
.segment Data
|
|
print_hextab: .text "0123456789abcdef"
|
|
|