Inlined call vicSelectGfxBank::$0 = call toDd00(vicSelectGfxBank::gfx) Inlined call call __init Eliminating unused variable with no statement keyboard_matrix_read::$0 Eliminating unused variable with no statement keyboard_key_pressed::$0 Eliminating unused variable with no statement keyboard_key_pressed::$1 Eliminating unused variable with no statement main::$3 Eliminating unused variable with no statement main::$11 CONTROL FLOW GRAPH SSA void keyboard_init() keyboard_init: scope:[keyboard_init] from main::@3 *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_A_DDR) = $ff *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B_DDR) = 0 to:keyboard_init::@return keyboard_init::@return: scope:[keyboard_init] from keyboard_init return to:@return char keyboard_matrix_read(char rowid) keyboard_matrix_read: scope:[keyboard_matrix_read] from keyboard_key_pressed main::@7 keyboard_matrix_read::rowid#2 = phi( keyboard_key_pressed/keyboard_matrix_read::rowid#0, main::@7/keyboard_matrix_read::rowid#1 ) *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_A) = keyboard_matrix_row_bitmask[keyboard_matrix_read::rowid#2] keyboard_matrix_read::row_pressed_bits#0 = ~ *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B) keyboard_matrix_read::return#0 = keyboard_matrix_read::row_pressed_bits#0 to:keyboard_matrix_read::@return keyboard_matrix_read::@return: scope:[keyboard_matrix_read] from keyboard_matrix_read keyboard_matrix_read::return#4 = phi( keyboard_matrix_read/keyboard_matrix_read::return#0 ) keyboard_matrix_read::return#1 = keyboard_matrix_read::return#4 return to:@return char keyboard_key_pressed(char key) keyboard_key_pressed: scope:[keyboard_key_pressed] from main::@16 keyboard_key_pressed::key#1 = phi( main::@16/keyboard_key_pressed::key#0 ) keyboard_key_pressed::colidx#0 = keyboard_key_pressed::key#1 & 7 keyboard_key_pressed::rowidx#0 = keyboard_key_pressed::key#1 >> 3 keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 call keyboard_matrix_read keyboard_matrix_read::return#2 = keyboard_matrix_read::return#1 to:keyboard_key_pressed::@1 keyboard_key_pressed::@1: scope:[keyboard_key_pressed] from keyboard_key_pressed keyboard_key_pressed::colidx#1 = phi( keyboard_key_pressed/keyboard_key_pressed::colidx#0 ) keyboard_matrix_read::return#5 = phi( keyboard_key_pressed/keyboard_matrix_read::return#2 ) keyboard_key_pressed::$2 = keyboard_matrix_read::return#5 keyboard_key_pressed::$3 = keyboard_key_pressed::$2 & keyboard_matrix_col_bitmask[keyboard_key_pressed::colidx#1] keyboard_key_pressed::return#0 = keyboard_key_pressed::$3 to:keyboard_key_pressed::@return keyboard_key_pressed::@return: scope:[keyboard_key_pressed] from keyboard_key_pressed::@1 keyboard_key_pressed::return#3 = phi( keyboard_key_pressed::@1/keyboard_key_pressed::return#0 ) keyboard_key_pressed::return#1 = keyboard_key_pressed::return#3 return to:@return char keyboard_get_keycode(char ch) keyboard_get_keycode: scope:[keyboard_get_keycode] from main::@14 keyboard_get_keycode::ch#1 = phi( main::@14/keyboard_get_keycode::ch#0 ) keyboard_get_keycode::return#0 = keyboard_char_keycodes[keyboard_get_keycode::ch#1] to:keyboard_get_keycode::@return keyboard_get_keycode::@return: scope:[keyboard_get_keycode] from keyboard_get_keycode keyboard_get_keycode::return#3 = phi( keyboard_get_keycode/keyboard_get_keycode::return#0 ) keyboard_get_keycode::return#1 = keyboard_get_keycode::return#3 return to:@return void main() main: scope:[main] from __start::@1 main::sc#0 = (char *)$400 to:main::@1 main::@1: scope:[main] from main main::@2 main::sc#2 = phi( main/main::sc#0, main::@2/main::sc#1 ) main::$1 = main::sc#2 < $400+$3e8 if(main::$1) goto main::@2 to:main::@3 main::@2: scope:[main] from main::@1 main::sc#3 = phi( main::@1/main::sc#2 ) *main::sc#3 = ' ' main::sc#1 = ++ main::sc#3 to:main::@1 main::@3: scope:[main] from main::@1 call keyboard_init to:main::@19 main::@19: scope:[main] from main::@3 to:main::@4 main::@4: scope:[main] from main::@18 main::@19 if(true) goto main::@5 to:main::@return main::@5: scope:[main] from main::@4 main::@5 main::$2 = *RASTER != $ff if(main::$2) goto main::@5 to:main::@6 main::@6: scope:[main] from main::@5 main::screen#0 = (char *)$400 main::row#0 = 0 to:main::@7 main::@7: scope:[main] from main::@12 main::@6 main::screen#16 = phi( main::@12/main::screen#1, main::@6/main::screen#0 ) main::row#2 = phi( main::@12/main::row#1, main::@6/main::row#0 ) keyboard_matrix_read::rowid#1 = main::row#2 call keyboard_matrix_read keyboard_matrix_read::return#3 = keyboard_matrix_read::return#1 to:main::@20 main::@20: scope:[main] from main::@7 main::row#8 = phi( main::@7/main::row#2 ) main::screen#13 = phi( main::@7/main::screen#16 ) keyboard_matrix_read::return#6 = phi( main::@7/keyboard_matrix_read::return#3 ) main::row_pressed_bits#0 = keyboard_matrix_read::return#6 main::col#0 = 0 to:main::@8 main::@8: scope:[main] from main::@10 main::@20 main::row#7 = phi( main::@10/main::row#4, main::@20/main::row#8 ) main::col#5 = phi( main::@10/main::col#1, main::@20/main::col#0 ) main::screen#9 = phi( main::@10/main::screen#10, main::@20/main::screen#13 ) main::row_pressed_bits#2 = phi( main::@10/main::row_pressed_bits#1, main::@20/main::row_pressed_bits#0 ) main::$4 = main::row_pressed_bits#2 & $80 main::$5 = main::$4 != 0 if(main::$5) goto main::@9 to:main::@11 main::@9: scope:[main] from main::@8 main::row#6 = phi( main::@8/main::row#7 ) main::row_pressed_bits#5 = phi( main::@8/main::row_pressed_bits#2 ) main::col#2 = phi( main::@8/main::col#5 ) main::screen#3 = phi( main::@8/main::screen#9 ) main::screen#3[main::col#2] = '1' to:main::@10 main::@11: scope:[main] from main::@8 main::row#5 = phi( main::@8/main::row#7 ) main::row_pressed_bits#4 = phi( main::@8/main::row_pressed_bits#2 ) main::col#3 = phi( main::@8/main::col#5 ) main::screen#4 = phi( main::@8/main::screen#9 ) main::screen#4[main::col#3] = '0' to:main::@10 main::@10: scope:[main] from main::@11 main::@9 main::row#4 = phi( main::@11/main::row#5, main::@9/main::row#6 ) main::screen#10 = phi( main::@11/main::screen#4, main::@9/main::screen#3 ) main::col#4 = phi( main::@11/main::col#3, main::@9/main::col#2 ) main::row_pressed_bits#3 = phi( main::@11/main::row_pressed_bits#4, main::@9/main::row_pressed_bits#5 ) main::$6 = main::row_pressed_bits#3 * 2 main::row_pressed_bits#1 = main::$6 main::col#1 = main::col#4 + rangenext(0,7) main::$7 = main::col#1 != rangelast(0,7) if(main::$7) goto main::@8 to:main::@12 main::@12: scope:[main] from main::@10 main::row#3 = phi( main::@10/main::row#4 ) main::screen#5 = phi( main::@10/main::screen#10 ) main::$8 = main::screen#5 + $28 main::screen#1 = main::$8 main::row#1 = main::row#3 + rangenext(0,7) main::$9 = main::row#1 != rangelast(0,7) if(main::$9) goto main::@7 to:main::@13 main::@13: scope:[main] from main::@12 main::screen#6 = phi( main::@12/main::screen#1 ) main::$10 = main::screen#6 + $28 main::screen#2 = main::$10 main::i#0 = 0 main::ch#0 = 0 to:main::@14 main::@14: scope:[main] from main::@13 main::@15 main::i#9 = phi( main::@13/main::i#0, main::@15/main::i#6 ) main::screen#17 = phi( main::@13/main::screen#2, main::@15/main::screen#12 ) main::ch#2 = phi( main::@13/main::ch#0, main::@15/main::ch#1 ) keyboard_get_keycode::ch#0 = main::ch#2 call keyboard_get_keycode keyboard_get_keycode::return#2 = keyboard_get_keycode::return#1 to:main::@21 main::@21: scope:[main] from main::@14 main::i#7 = phi( main::@14/main::i#9 ) main::screen#14 = phi( main::@14/main::screen#17 ) main::ch#5 = phi( main::@14/main::ch#2 ) keyboard_get_keycode::return#4 = phi( main::@14/keyboard_get_keycode::return#2 ) main::key#0 = keyboard_get_keycode::return#4 main::$12 = main::key#0 != $3f main::$13 = ! main::$12 if(main::$13) goto main::@15 to:main::@16 main::@15: scope:[main] from main::@17 main::@21 main::@22 main::i#6 = phi( main::@17/main::i#1, main::@21/main::i#7, main::@22/main::i#5 ) main::screen#12 = phi( main::@17/main::screen#7, main::@21/main::screen#14, main::@22/main::screen#11 ) main::ch#3 = phi( main::@17/main::ch#4, main::@21/main::ch#5, main::@22/main::ch#6 ) main::ch#1 = main::ch#3 + rangenext(0,$3f) main::$17 = main::ch#1 != rangelast(0,$3f) if(main::$17) goto main::@14 to:main::@18 main::@16: scope:[main] from main::@21 main::i#8 = phi( main::@21/main::i#7 ) main::screen#15 = phi( main::@21/main::screen#14 ) main::ch#7 = phi( main::@21/main::ch#5 ) main::key#1 = phi( main::@21/main::key#0 ) keyboard_key_pressed::key#0 = main::key#1 call keyboard_key_pressed keyboard_key_pressed::return#2 = keyboard_key_pressed::return#1 to:main::@22 main::@22: scope:[main] from main::@16 main::i#5 = phi( main::@16/main::i#8 ) main::screen#11 = phi( main::@16/main::screen#15 ) main::ch#6 = phi( main::@16/main::ch#7 ) keyboard_key_pressed::return#4 = phi( main::@16/keyboard_key_pressed::return#2 ) main::$14 = keyboard_key_pressed::return#4 main::$15 = main::$14 != 0 main::$16 = ! main::$15 if(main::$16) goto main::@15 to:main::@17 main::@17: scope:[main] from main::@22 main::i#3 = phi( main::@22/main::i#5 ) main::screen#7 = phi( main::@22/main::screen#11 ) main::ch#4 = phi( main::@22/main::ch#6 ) main::screen#7[main::i#3] = main::ch#4 main::i#1 = ++ main::i#3 to:main::@15 main::@18: scope:[main] from main::@15 main::@18 main::i#4 = phi( main::@15/main::i#6, main::@18/main::i#2 ) main::screen#8 = phi( main::@15/main::screen#12, main::@18/main::screen#8 ) main::screen#8[main::i#4] = ' ' main::i#2 = ++ main::i#4 main::$18 = main::i#2 < 5 if(main::$18) goto main::@18 to:main::@4 main::@return: scope:[main] from main::@4 return to:@return void __start() __start: scope:[__start] from to:__start::__init1 __start::__init1: scope:[__start] from __start to:__start::@1 __start::@1: scope:[__start] from __start::__init1 call main to:__start::@2 __start::@2: scope:[__start] from __start::@1 to:__start::@return __start::@return: scope:[__start] from __start::@2 return to:@return SYMBOL TABLE SSA __constant struct MOS6526_CIA * const CIA1 = (struct MOS6526_CIA *)$dc00 __constant const char KEY_0 = $23 __constant const char KEY_1 = $38 __constant const char KEY_2 = $3b __constant const char KEY_3 = 8 __constant const char KEY_4 = $b __constant const char KEY_5 = $10 __constant const char KEY_6 = $13 __constant const char KEY_7 = $18 __constant const char KEY_8 = $1b __constant const char KEY_9 = $20 __constant const char KEY_A = $a __constant const char KEY_ARROW_LEFT = $39 __constant const char KEY_ARROW_UP = $36 __constant const char KEY_ASTERISK = $31 __constant const char KEY_AT = $2e __constant const char KEY_B = $1c __constant const char KEY_C = $14 __constant const char KEY_COLON = $2d __constant const char KEY_COMMA = $2f __constant const char KEY_D = $12 __constant const char KEY_DOT = $2c __constant const char KEY_E = $e __constant const char KEY_EQUALS = $35 __constant const char KEY_F = $15 __constant const char KEY_G = $1a __constant const char KEY_H = $1d __constant const char KEY_I = $21 __constant const char KEY_J = $22 __constant const char KEY_K = $25 __constant const char KEY_L = $2a __constant const char KEY_M = $24 __constant const char KEY_MINUS = $2b __constant const char KEY_N = $27 __constant const char KEY_O = $26 __constant const char KEY_P = $29 __constant const char KEY_PLUS = $28 __constant const char KEY_POUND = $30 __constant const char KEY_Q = $3e __constant const char KEY_R = $11 __constant const char KEY_S = $d __constant const char KEY_SEMICOLON = $32 __constant const char KEY_SLASH = $37 __constant const char KEY_SPACE = $3c __constant const char KEY_T = $16 __constant const char KEY_U = $1e __constant const char KEY_V = $1f __constant const char KEY_W = 9 __constant const char KEY_X = $17 __constant const char KEY_Y = $19 __constant const char KEY_Z = $c __constant char OFFSET_STRUCT_MOS6526_CIA_PORT_A = 0 __constant char OFFSET_STRUCT_MOS6526_CIA_PORT_A_DDR = 2 __constant char OFFSET_STRUCT_MOS6526_CIA_PORT_B = 1 __constant char OFFSET_STRUCT_MOS6526_CIA_PORT_B_DDR = 3 __constant char * const RASTER = (char *)$d012 void __start() __constant const char keyboard_char_keycodes[] = { KEY_AT, KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, $3f, KEY_POUND, $3f, KEY_ARROW_UP, KEY_ARROW_LEFT, KEY_SPACE, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, KEY_ASTERISK, KEY_PLUS, KEY_COMMA, KEY_MINUS, KEY_DOT, KEY_SLASH, KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_COLON, KEY_SEMICOLON, $3f, KEY_EQUALS, $3f, $3f } char keyboard_get_keycode(char ch) char keyboard_get_keycode::ch char keyboard_get_keycode::ch#0 char keyboard_get_keycode::ch#1 char keyboard_get_keycode::return char keyboard_get_keycode::return#0 char keyboard_get_keycode::return#1 char keyboard_get_keycode::return#2 char keyboard_get_keycode::return#3 char keyboard_get_keycode::return#4 void keyboard_init() char keyboard_key_pressed(char key) char keyboard_key_pressed::$2 char keyboard_key_pressed::$3 char keyboard_key_pressed::colidx char keyboard_key_pressed::colidx#0 char keyboard_key_pressed::colidx#1 char keyboard_key_pressed::key char keyboard_key_pressed::key#0 char keyboard_key_pressed::key#1 char keyboard_key_pressed::return char keyboard_key_pressed::return#0 char keyboard_key_pressed::return#1 char keyboard_key_pressed::return#2 char keyboard_key_pressed::return#3 char keyboard_key_pressed::return#4 char keyboard_key_pressed::rowidx char keyboard_key_pressed::rowidx#0 __constant char keyboard_matrix_col_bitmask[8] = { 1, 2, 4, 8, $10, $20, $40, $80 } char keyboard_matrix_read(char rowid) char keyboard_matrix_read::return char keyboard_matrix_read::return#0 char keyboard_matrix_read::return#1 char keyboard_matrix_read::return#2 char keyboard_matrix_read::return#3 char keyboard_matrix_read::return#4 char keyboard_matrix_read::return#5 char keyboard_matrix_read::return#6 char keyboard_matrix_read::row_pressed_bits char keyboard_matrix_read::row_pressed_bits#0 char keyboard_matrix_read::rowid char keyboard_matrix_read::rowid#0 char keyboard_matrix_read::rowid#1 char keyboard_matrix_read::rowid#2 __constant char keyboard_matrix_row_bitmask[8] = { $fe, $fd, $fb, $f7, $ef, $df, $bf, $7f } void main() bool main::$1 char *main::$10 bool main::$12 bool main::$13 char main::$14 bool main::$15 bool main::$16 bool main::$17 bool main::$18 bool main::$2 number main::$4 bool main::$5 number main::$6 bool main::$7 char *main::$8 bool main::$9 char main::ch char main::ch#0 char main::ch#1 char main::ch#2 char main::ch#3 char main::ch#4 char main::ch#5 char main::ch#6 char main::ch#7 char main::col char main::col#0 char main::col#1 char main::col#2 char main::col#3 char main::col#4 char main::col#5 char main::i char main::i#0 char main::i#1 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 char main::key char main::key#0 char main::key#1 char main::row char main::row#0 char main::row#1 char main::row#2 char main::row#3 char main::row#4 char main::row#5 char main::row#6 char main::row#7 char main::row#8 char main::row_pressed_bits char main::row_pressed_bits#0 char main::row_pressed_bits#1 char main::row_pressed_bits#2 char main::row_pressed_bits#3 char main::row_pressed_bits#4 char main::row_pressed_bits#5 char *main::sc char *main::sc#0 char *main::sc#1 char *main::sc#2 char *main::sc#3 char *main::screen char *main::screen#0 char *main::screen#1 char *main::screen#10 char *main::screen#11 char *main::screen#12 char *main::screen#13 char *main::screen#14 char *main::screen#15 char *main::screen#16 char *main::screen#17 char *main::screen#2 char *main::screen#3 char *main::screen#4 char *main::screen#5 char *main::screen#6 char *main::screen#7 char *main::screen#8 char *main::screen#9 Adding number conversion cast (unumber) $ff in *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_A_DDR) = $ff Adding number conversion cast (unumber) 0 in *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B_DDR) = 0 Adding number conversion cast (unumber) 7 in keyboard_key_pressed::colidx#0 = keyboard_key_pressed::key#1 & 7 Adding number conversion cast (unumber) 3 in keyboard_key_pressed::rowidx#0 = keyboard_key_pressed::key#1 >> 3 Adding number conversion cast (unumber) $400+$3e8 in main::$1 = main::sc#2 < $400+$3e8 Adding number conversion cast (unumber) $ff in main::$2 = *RASTER != $ff Adding number conversion cast (unumber) $80 in main::$4 = main::row_pressed_bits#2 & $80 Adding number conversion cast (unumber) main::$4 in main::$4 = main::row_pressed_bits#2 & (unumber)$80 Adding number conversion cast (unumber) 0 in main::$5 = main::$4 != 0 Adding number conversion cast (unumber) 2 in main::$6 = main::row_pressed_bits#3 * 2 Adding number conversion cast (unumber) main::$6 in main::$6 = main::row_pressed_bits#3 * (unumber)2 Adding number conversion cast (unumber) $28 in main::$8 = main::screen#5 + $28 Adding number conversion cast (unumber) $28 in main::$10 = main::screen#6 + $28 Adding number conversion cast (unumber) $3f in main::$12 = main::key#0 != $3f Adding number conversion cast (unumber) 0 in main::$15 = main::$14 != 0 Adding number conversion cast (unumber) 5 in main::$18 = main::i#2 < 5 Successful SSA optimization PassNAddNumberTypeConversions Inlining cast *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_A_DDR) = (unumber)$ff Inlining cast *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B_DDR) = (unumber)0 Successful SSA optimization Pass2InlineCast Simplifying constant pointer cast (char *) 53266 Simplifying constant pointer cast (struct MOS6526_CIA *) 56320 Simplifying constant integer cast $ff Simplifying constant integer cast 0 Simplifying constant integer cast 7 Simplifying constant integer cast 3 Simplifying constant pointer cast (char *) 1024 Simplifying constant integer cast $ff Simplifying constant pointer cast (char *) 1024 Simplifying constant integer cast $80 Simplifying constant integer cast 0 Simplifying constant integer cast 2 Simplifying constant integer cast $28 Simplifying constant integer cast $28 Simplifying constant integer cast $3f Simplifying constant integer cast 0 Simplifying constant integer cast 5 Successful SSA optimization PassNCastSimplification Finalized unsigned number type (char) $ff Finalized unsigned number type (char) 0 Finalized unsigned number type (char) 7 Finalized unsigned number type (char) 3 Finalized unsigned number type (char) $ff Finalized unsigned number type (char) $80 Finalized unsigned number type (char) 0 Finalized unsigned number type (char) 2 Finalized unsigned number type (char) $28 Finalized unsigned number type (char) $28 Finalized unsigned number type (char) $3f Finalized unsigned number type (char) 0 Finalized unsigned number type (char) 5 Successful SSA optimization PassNFinalizeNumberTypeConversions Inferred type updated to char in main::$4 = main::row_pressed_bits#2 & $80 Inferred type updated to char in main::$6 = main::row_pressed_bits#3 * 2 Inversing boolean not [80] main::$13 = main::key#0 == $3f from [79] main::$12 = main::key#0 != $3f Inversing boolean not [93] main::$16 = main::$14 == 0 from [92] main::$15 = main::$14 != 0 Successful SSA optimization Pass2UnaryNotSimplification Alias keyboard_matrix_read::return#0 = keyboard_matrix_read::row_pressed_bits#0 keyboard_matrix_read::return#4 keyboard_matrix_read::return#1 Alias keyboard_matrix_read::return#2 = keyboard_matrix_read::return#5 Alias keyboard_key_pressed::colidx#0 = keyboard_key_pressed::colidx#1 Alias keyboard_key_pressed::return#0 = keyboard_key_pressed::$3 keyboard_key_pressed::return#3 keyboard_key_pressed::return#1 Alias keyboard_get_keycode::return#0 = keyboard_get_keycode::return#3 keyboard_get_keycode::return#1 Alias main::sc#2 = main::sc#3 Alias keyboard_matrix_read::return#3 = keyboard_matrix_read::return#6 Alias main::screen#13 = main::screen#16 Alias main::row#2 = main::row#8 Alias main::screen#3 = main::screen#9 main::screen#4 Alias main::col#2 = main::col#5 main::col#3 Alias main::row_pressed_bits#2 = main::row_pressed_bits#5 main::row_pressed_bits#4 Alias main::row#5 = main::row#6 main::row#7 Alias main::row_pressed_bits#1 = main::$6 Alias main::screen#10 = main::screen#5 Alias main::row#3 = main::row#4 Alias main::screen#1 = main::$8 main::screen#6 Alias main::screen#2 = main::$10 Alias keyboard_get_keycode::return#2 = keyboard_get_keycode::return#4 Alias main::ch#2 = main::ch#5 main::ch#7 main::ch#6 main::ch#4 Alias main::screen#11 = main::screen#14 main::screen#17 main::screen#15 main::screen#7 Alias main::i#3 = main::i#7 main::i#9 main::i#8 main::i#5 Alias main::key#0 = main::key#1 Alias keyboard_key_pressed::return#2 = keyboard_key_pressed::return#4 Successful SSA optimization Pass2AliasElimination Alias main::row_pressed_bits#2 = main::row_pressed_bits#3 Alias main::col#2 = main::col#4 Alias main::screen#10 = main::screen#3 Alias main::row#3 = main::row#5 Alias main::ch#2 = main::ch#3 Alias main::screen#11 = main::screen#12 Successful SSA optimization Pass2AliasElimination Identical Phi Values keyboard_key_pressed::key#1 keyboard_key_pressed::key#0 Identical Phi Values keyboard_get_keycode::ch#1 keyboard_get_keycode::ch#0 Identical Phi Values main::screen#10 main::screen#13 Identical Phi Values main::row#3 main::row#2 Identical Phi Values main::screen#11 main::screen#2 Identical Phi Values main::screen#8 main::screen#11 Successful SSA optimization Pass2IdenticalPhiElimination Simple Condition main::$1 [22] if(main::sc#2<(unsigned int)$400+$3e8) goto main::@2 Simple Condition main::$2 [28] if(*RASTER!=$ff) goto main::@5 Simple Condition main::$5 [40] if(main::$4!=0) goto main::@9 Simple Condition main::$7 [46] if(main::col#1!=rangelast(0,7)) goto main::@8 Simple Condition main::$9 [50] if(main::row#1!=rangelast(0,7)) goto main::@7 Simple Condition main::$13 [60] if(main::key#0==$3f) goto main::@15 Simple Condition main::$17 [64] if(main::ch#1!=rangelast(0,$3f)) goto main::@14 Simple Condition main::$16 [70] if(main::$14==0) goto main::@15 Simple Condition main::$18 [77] if(main::i#2<5) goto main::@18 Successful SSA optimization Pass2ConditionalJumpSimplification Constant main::sc#0 = (char *) 1024 Constant main::screen#0 = (char *) 1024 Constant main::row#0 = 0 Constant main::col#0 = 0 Constant main::i#0 = 0 Constant main::ch#0 = 0 Successful SSA optimization Pass2ConstantIdentification if() condition always true - replacing block destination [26] if(true) goto main::@5 Successful SSA optimization Pass2ConstantIfs Resolved ranged next value [44] main::col#1 = ++ main::col#2 to ++ Resolved ranged comparison value [46] if(main::col#1!=rangelast(0,7)) goto main::@8 to 8 Resolved ranged next value [48] main::row#1 = ++ main::row#2 to ++ Resolved ranged comparison value [50] if(main::row#1!=rangelast(0,7)) goto main::@7 to 8 Resolved ranged next value [62] main::ch#1 = ++ main::ch#2 to ++ Resolved ranged comparison value [64] if(main::ch#1!=rangelast(0,$3f)) goto main::@14 to $40 Simplifying expression containing zero (char *)CIA1 in [4] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_A) = keyboard_matrix_row_bitmask[keyboard_matrix_read::rowid#2] Successful SSA optimization PassNSimplifyExpressionWithZero Removing unused block main::@return Successful SSA optimization Pass2EliminateUnusedBlocks Eliminating unused constant OFFSET_STRUCT_MOS6526_CIA_PORT_A 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 Adding number conversion cast (unumber) 8 in [35] if(main::col#1!=8) goto main::@8 Adding number conversion cast (unumber) 8 in [38] if(main::row#1!=8) goto main::@7 Adding number conversion cast (unumber) $40 in [48] if(main::ch#1!=$40) goto main::@14 Successful SSA optimization PassNAddNumberTypeConversions Simplifying constant integer cast 8 Simplifying constant integer cast 8 Simplifying constant integer cast $40 Successful SSA optimization PassNCastSimplification Finalized unsigned number type (char) 8 Finalized unsigned number type (char) 8 Finalized unsigned number type (char) $40 Successful SSA optimization PassNFinalizeNumberTypeConversions Rewriting multiplication to use shift [33] main::row_pressed_bits#1 = main::row_pressed_bits#2 * 2 Successful SSA optimization Pass2MultiplyToShiftRewriting Inlining constant with var siblings main::sc#0 Inlining constant with var siblings main::screen#0 Inlining constant with var siblings main::row#0 Inlining constant with var siblings main::col#0 Inlining constant with var siblings main::i#0 Inlining constant with var siblings main::ch#0 Constant inlined main::screen#0 = (char *) 1024 Constant inlined main::i#0 = 0 Constant inlined main::sc#0 = (char *) 1024 Constant inlined main::col#0 = 0 Constant inlined main::row#0 = 0 Constant inlined main::ch#0 = 0 Successful SSA optimization Pass2ConstantInlining Finalized unsigned number type (char) 8 Finalized unsigned number type (char) 8 Finalized unsigned number type (unsigned int) $400 Finalized unsigned number type (unsigned int) $3e8 Successful SSA optimization PassNFinalizeNumberTypeConversions Simplifying constant integer cast $400+$3e8 Successful SSA optimization PassNCastSimplification Added new block during phi lifting main::@23(between main::@12 and main::@7) Added new block during phi lifting main::@24(between main::@10 and main::@8) Added new block during phi lifting main::@25(between main::@15 and main::@14) Added new block during phi lifting main::@26(between main::@21 and main::@15) Added new block during phi lifting main::@27(between main::@22 and main::@15) Added new block during phi lifting main::@28(between main::@15 and main::@18) Added new block during phi lifting main::@29(between main::@18 and main::@18) Adding NOP phi() at start of main Adding NOP phi() at start of main::@3 Adding NOP phi() at start of main::@19 Adding NOP phi() at start of main::@4 Adding NOP phi() at start of main::@6 CALL GRAPH Calls in [main] to keyboard_init:4 keyboard_matrix_read:12 keyboard_get_keycode:29 keyboard_key_pressed:34 Calls in [keyboard_key_pressed] to keyboard_matrix_read:75 Created 10 initial phi equivalence classes Coalesced [11] keyboard_matrix_read::rowid#4 = keyboard_matrix_read::rowid#1 Coalesced [15] main::row_pressed_bits#7 = main::row_pressed_bits#0 Coalesced [40] main::i#11 = main::i#1 Coalesced [44] main::i#14 = main::i#6 Coalesced [49] main::i#15 = main::i#2 Coalesced [50] main::ch#8 = main::ch#1 Coalesced [51] main::i#10 = main::i#6 Coalesced (already) [52] main::i#13 = main::i#3 Coalesced (already) [53] main::i#12 = main::i#3 Coalesced [54] main::row#9 = main::row#1 Coalesced [55] main::screen#18 = main::screen#1 Coalesced [56] main::row_pressed_bits#6 = main::row_pressed_bits#1 Coalesced [57] main::col#6 = main::col#1 Coalesced [61] main::sc#4 = main::sc#1 Coalesced [74] keyboard_matrix_read::rowid#3 = keyboard_matrix_read::rowid#0 Coalesced down to 8 phi equivalence classes Culled Empty Block label main::@19 Culled Empty Block label main::@4 Culled Empty Block label main::@6 Culled Empty Block label main::@28 Culled Empty Block label main::@29 Culled Empty Block label main::@25 Culled Empty Block label main::@27 Culled Empty Block label main::@26 Culled Empty Block label main::@23 Culled Empty Block label main::@24 Renumbering block main::@5 to main::@4 Renumbering block main::@7 to main::@5 Renumbering block main::@8 to main::@6 Renumbering block main::@9 to main::@7 Renumbering block main::@10 to main::@8 Renumbering block main::@11 to main::@9 Renumbering block main::@12 to main::@10 Renumbering block main::@13 to main::@11 Renumbering block main::@14 to main::@12 Renumbering block main::@15 to main::@13 Renumbering block main::@16 to main::@14 Renumbering block main::@17 to main::@15 Renumbering block main::@18 to main::@16 Renumbering block main::@20 to main::@17 Renumbering block main::@21 to main::@18 Renumbering block main::@22 to main::@19 Adding NOP phi() at start of main Adding NOP phi() at start of main::@3 FINAL CONTROL FLOW GRAPH void main() main: scope:[main] from [0] phi() to:main::@1 main::@1: scope:[main] from main main::@2 [1] main::sc#2 = phi( main/(char *) 1024, main::@2/main::sc#1 ) [2] if(main::sc#2<$400+$3e8) goto main::@2 to:main::@3 main::@3: scope:[main] from main::@1 [3] phi() [4] call keyboard_init to:main::@4 main::@4: scope:[main] from main::@16 main::@3 main::@4 [5] if(*RASTER!=$ff) goto main::@4 to:main::@5 main::@5: scope:[main] from main::@10 main::@4 [6] main::screen#13 = phi( main::@10/main::screen#1, main::@4/(char *) 1024 ) [6] main::row#2 = phi( main::@10/main::row#1, main::@4/0 ) [7] keyboard_matrix_read::rowid#1 = main::row#2 [8] call keyboard_matrix_read [9] keyboard_matrix_read::return#3 = keyboard_matrix_read::return#0 to:main::@17 main::@17: scope:[main] from main::@5 [10] main::row_pressed_bits#0 = keyboard_matrix_read::return#3 to:main::@6 main::@6: scope:[main] from main::@17 main::@8 [11] main::col#2 = phi( main::@8/main::col#1, main::@17/0 ) [11] main::row_pressed_bits#2 = phi( main::@8/main::row_pressed_bits#1, main::@17/main::row_pressed_bits#0 ) [12] main::$4 = main::row_pressed_bits#2 & $80 [13] if(main::$4!=0) goto main::@7 to:main::@9 main::@9: scope:[main] from main::@6 [14] main::screen#13[main::col#2] = '0' to:main::@8 main::@8: scope:[main] from main::@7 main::@9 [15] main::row_pressed_bits#1 = main::row_pressed_bits#2 << 1 [16] main::col#1 = ++ main::col#2 [17] if(main::col#1!=8) goto main::@6 to:main::@10 main::@10: scope:[main] from main::@8 [18] main::screen#1 = main::screen#13 + $28 [19] main::row#1 = ++ main::row#2 [20] if(main::row#1!=8) goto main::@5 to:main::@11 main::@11: scope:[main] from main::@10 [21] main::screen#2 = main::screen#1 + $28 to:main::@12 main::@12: scope:[main] from main::@11 main::@13 [22] main::i#3 = phi( main::@11/0, main::@13/main::i#6 ) [22] main::ch#2 = phi( main::@11/0, main::@13/main::ch#1 ) [23] keyboard_get_keycode::ch#0 = main::ch#2 [24] call keyboard_get_keycode [25] keyboard_get_keycode::return#2 = keyboard_get_keycode::return#0 to:main::@18 main::@18: scope:[main] from main::@12 [26] main::key#0 = keyboard_get_keycode::return#2 [27] if(main::key#0==$3f) goto main::@13 to:main::@14 main::@14: scope:[main] from main::@18 [28] keyboard_key_pressed::key#0 = main::key#0 [29] call keyboard_key_pressed [30] keyboard_key_pressed::return#2 = keyboard_key_pressed::return#0 to:main::@19 main::@19: scope:[main] from main::@14 [31] main::$14 = keyboard_key_pressed::return#2 [32] if(main::$14==0) goto main::@13 to:main::@15 main::@15: scope:[main] from main::@19 [33] main::screen#2[main::i#3] = main::ch#2 [34] main::i#1 = ++ main::i#3 to:main::@13 main::@13: scope:[main] from main::@15 main::@18 main::@19 [35] main::i#6 = phi( main::@15/main::i#1, main::@18/main::i#3, main::@19/main::i#3 ) [36] main::ch#1 = ++ main::ch#2 [37] if(main::ch#1!=$40) goto main::@12 to:main::@16 main::@16: scope:[main] from main::@13 main::@16 [38] main::i#4 = phi( main::@13/main::i#6, main::@16/main::i#2 ) [39] main::screen#2[main::i#4] = ' ' [40] main::i#2 = ++ main::i#4 [41] if(main::i#2<5) goto main::@16 to:main::@4 main::@7: scope:[main] from main::@6 [42] main::screen#13[main::col#2] = '1' to:main::@8 main::@2: scope:[main] from main::@1 [43] *main::sc#2 = ' ' [44] main::sc#1 = ++ main::sc#2 to:main::@1 void keyboard_init() keyboard_init: scope:[keyboard_init] from main::@3 [45] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_A_DDR) = $ff [46] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B_DDR) = 0 to:keyboard_init::@return keyboard_init::@return: scope:[keyboard_init] from keyboard_init [47] return to:@return char keyboard_matrix_read(char rowid) keyboard_matrix_read: scope:[keyboard_matrix_read] from keyboard_key_pressed main::@5 [48] keyboard_matrix_read::rowid#2 = phi( keyboard_key_pressed/keyboard_matrix_read::rowid#0, main::@5/keyboard_matrix_read::rowid#1 ) [49] *((char *)CIA1) = keyboard_matrix_row_bitmask[keyboard_matrix_read::rowid#2] [50] keyboard_matrix_read::return#0 = ~ *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B) to:keyboard_matrix_read::@return keyboard_matrix_read::@return: scope:[keyboard_matrix_read] from keyboard_matrix_read [51] return to:@return char keyboard_get_keycode(char ch) keyboard_get_keycode: scope:[keyboard_get_keycode] from main::@12 [52] keyboard_get_keycode::return#0 = keyboard_char_keycodes[keyboard_get_keycode::ch#0] to:keyboard_get_keycode::@return keyboard_get_keycode::@return: scope:[keyboard_get_keycode] from keyboard_get_keycode [53] return to:@return char keyboard_key_pressed(char key) keyboard_key_pressed: scope:[keyboard_key_pressed] from main::@14 [54] keyboard_key_pressed::colidx#0 = keyboard_key_pressed::key#0 & 7 [55] keyboard_key_pressed::rowidx#0 = keyboard_key_pressed::key#0 >> 3 [56] keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 [57] call keyboard_matrix_read [58] keyboard_matrix_read::return#2 = keyboard_matrix_read::return#0 to:keyboard_key_pressed::@1 keyboard_key_pressed::@1: scope:[keyboard_key_pressed] from keyboard_key_pressed [59] keyboard_key_pressed::$2 = keyboard_matrix_read::return#2 [60] keyboard_key_pressed::return#0 = keyboard_key_pressed::$2 & keyboard_matrix_col_bitmask[keyboard_key_pressed::colidx#0] to:keyboard_key_pressed::@return keyboard_key_pressed::@return: scope:[keyboard_key_pressed] from keyboard_key_pressed::@1 [61] return to:@return VARIABLE REGISTER WEIGHTS char keyboard_get_keycode(char ch) char keyboard_get_keycode::ch char keyboard_get_keycode::ch#0 // 1102.0 char keyboard_get_keycode::return char keyboard_get_keycode::return#0 // 367.33333333333337 char keyboard_get_keycode::return#2 // 202.0 void keyboard_init() char keyboard_key_pressed(char key) char keyboard_key_pressed::$2 // 2002.0 char keyboard_key_pressed::colidx char keyboard_key_pressed::colidx#0 // 333.6666666666667 char keyboard_key_pressed::key char keyboard_key_pressed::key#0 // 1051.5 char keyboard_key_pressed::return char keyboard_key_pressed::return#0 // 367.33333333333337 char keyboard_key_pressed::return#2 // 202.0 char keyboard_key_pressed::rowidx char keyboard_key_pressed::rowidx#0 // 2002.0 char keyboard_matrix_read(char rowid) char keyboard_matrix_read::return char keyboard_matrix_read::return#0 // 2775.75 char keyboard_matrix_read::return#2 // 2002.0 char keyboard_matrix_read::return#3 // 202.0 char keyboard_matrix_read::row_pressed_bits char keyboard_matrix_read::rowid char keyboard_matrix_read::rowid#0 // 2002.0 char keyboard_matrix_read::rowid#1 // 202.0 char keyboard_matrix_read::rowid#2 // 11103.0 void main() char main::$14 // 202.0 char main::$4 // 2002.0 char main::ch char main::ch#1 // 151.5 char main::ch#2 // 28.857142857142858 char main::col char main::col#1 // 1501.5 char main::col#2 // 667.3333333333334 char main::i char main::i#1 // 202.0 char main::i#2 // 151.5 char main::i#3 // 42.08333333333333 char main::i#4 // 202.0 char main::i#6 // 168.33333333333331 char main::key char main::key#0 // 151.5 char main::row char main::row#1 // 151.5 char main::row#2 // 21.642857142857142 char main::row_pressed_bits char main::row_pressed_bits#0 // 202.0 char main::row_pressed_bits#1 // 667.3333333333334 char main::row_pressed_bits#2 // 620.8 char *main::sc char *main::sc#1 // 22.0 char *main::sc#2 // 14.666666666666666 char *main::screen char *main::screen#1 // 71.0 char *main::screen#13 // 169.53846153846155 char *main::screen#2 // 10.142857142857142 Initial phi equivalence classes [ main::sc#2 main::sc#1 ] [ main::row#2 main::row#1 ] [ main::screen#13 main::screen#1 ] [ main::row_pressed_bits#2 main::row_pressed_bits#1 main::row_pressed_bits#0 ] [ main::col#2 main::col#1 ] [ main::ch#2 main::ch#1 ] [ main::i#4 main::i#3 main::i#6 main::i#1 main::i#2 ] [ keyboard_matrix_read::rowid#2 keyboard_matrix_read::rowid#0 keyboard_matrix_read::rowid#1 ] Added variable keyboard_matrix_read::return#3 to live range equivalence class [ keyboard_matrix_read::return#3 ] Added variable main::$4 to live range equivalence class [ main::$4 ] Added variable main::screen#2 to live range equivalence class [ main::screen#2 ] Added variable keyboard_get_keycode::ch#0 to live range equivalence class [ keyboard_get_keycode::ch#0 ] Added variable keyboard_get_keycode::return#2 to live range equivalence class [ keyboard_get_keycode::return#2 ] Added variable main::key#0 to live range equivalence class [ main::key#0 ] Added variable keyboard_key_pressed::key#0 to live range equivalence class [ keyboard_key_pressed::key#0 ] Added variable keyboard_key_pressed::return#2 to live range equivalence class [ keyboard_key_pressed::return#2 ] Added variable main::$14 to live range equivalence class [ main::$14 ] Added variable keyboard_matrix_read::return#0 to live range equivalence class [ keyboard_matrix_read::return#0 ] Added variable keyboard_get_keycode::return#0 to live range equivalence class [ keyboard_get_keycode::return#0 ] Added variable keyboard_key_pressed::colidx#0 to live range equivalence class [ keyboard_key_pressed::colidx#0 ] Added variable keyboard_key_pressed::rowidx#0 to live range equivalence class [ keyboard_key_pressed::rowidx#0 ] Added variable keyboard_matrix_read::return#2 to live range equivalence class [ keyboard_matrix_read::return#2 ] Added variable keyboard_key_pressed::$2 to live range equivalence class [ keyboard_key_pressed::$2 ] Added variable keyboard_key_pressed::return#0 to live range equivalence class [ keyboard_key_pressed::return#0 ] Complete equivalence classes [ main::sc#2 main::sc#1 ] [ main::row#2 main::row#1 ] [ main::screen#13 main::screen#1 ] [ main::row_pressed_bits#2 main::row_pressed_bits#1 main::row_pressed_bits#0 ] [ main::col#2 main::col#1 ] [ main::ch#2 main::ch#1 ] [ main::i#4 main::i#3 main::i#6 main::i#1 main::i#2 ] [ keyboard_matrix_read::rowid#2 keyboard_matrix_read::rowid#0 keyboard_matrix_read::rowid#1 ] [ keyboard_matrix_read::return#3 ] [ main::$4 ] [ main::screen#2 ] [ keyboard_get_keycode::ch#0 ] [ keyboard_get_keycode::return#2 ] [ main::key#0 ] [ keyboard_key_pressed::key#0 ] [ keyboard_key_pressed::return#2 ] [ main::$14 ] [ keyboard_matrix_read::return#0 ] [ keyboard_get_keycode::return#0 ] [ keyboard_key_pressed::colidx#0 ] [ keyboard_key_pressed::rowidx#0 ] [ keyboard_matrix_read::return#2 ] [ keyboard_key_pressed::$2 ] [ keyboard_key_pressed::return#0 ] Allocated zp[1]:2 [ keyboard_matrix_read::rowid#2 keyboard_matrix_read::rowid#0 keyboard_matrix_read::rowid#1 ] Allocated zp[1]:3 [ keyboard_matrix_read::return#0 ] Allocated zp[1]:4 [ main::col#2 main::col#1 ] Allocated zp[1]:5 [ main::$4 ] Allocated zp[1]:6 [ keyboard_key_pressed::rowidx#0 ] Allocated zp[1]:7 [ keyboard_matrix_read::return#2 ] Allocated zp[1]:8 [ keyboard_key_pressed::$2 ] Allocated zp[1]:9 [ main::row_pressed_bits#2 main::row_pressed_bits#1 main::row_pressed_bits#0 ] Allocated zp[1]:10 [ keyboard_get_keycode::ch#0 ] Allocated zp[1]:11 [ keyboard_key_pressed::key#0 ] Allocated zp[1]:12 [ main::i#4 main::i#3 main::i#6 main::i#1 main::i#2 ] Allocated zp[1]:13 [ keyboard_get_keycode::return#0 ] Allocated zp[1]:14 [ keyboard_key_pressed::return#0 ] Allocated zp[1]:15 [ keyboard_key_pressed::colidx#0 ] Allocated zp[2]:16 [ main::screen#13 main::screen#1 ] Allocated zp[1]:18 [ keyboard_matrix_read::return#3 ] Allocated zp[1]:19 [ keyboard_get_keycode::return#2 ] Allocated zp[1]:20 [ keyboard_key_pressed::return#2 ] Allocated zp[1]:21 [ main::$14 ] Allocated zp[1]:22 [ main::ch#2 main::ch#1 ] Allocated zp[1]:23 [ main::row#2 main::row#1 ] Allocated zp[1]:24 [ main::key#0 ] Allocated zp[2]:25 [ main::sc#2 main::sc#1 ] Allocated zp[2]:27 [ main::screen#2 ] REGISTER UPLIFT POTENTIAL REGISTERS Statement [2] if(main::sc#2<$400+$3e8) goto main::@2 [ main::sc#2 ] ( [ main::sc#2 ] { } ) always clobbers reg byte a Statement [5] if(*RASTER!=$ff) goto main::@4 [ ] ( [ ] { } ) always clobbers reg byte a Statement [14] main::screen#13[main::col#2] = '0' [ main::row#2 main::screen#13 main::row_pressed_bits#2 main::col#2 ] ( [ main::row#2 main::screen#13 main::row_pressed_bits#2 main::col#2 ] { } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:23 [ main::row#2 main::row#1 ] Removing always clobbered register reg byte a as potential for zp[1]:9 [ main::row_pressed_bits#2 main::row_pressed_bits#1 main::row_pressed_bits#0 ] Removing always clobbered register reg byte a as potential for zp[1]:4 [ main::col#2 main::col#1 ] Statement [18] main::screen#1 = main::screen#13 + $28 [ main::row#2 main::screen#1 ] ( [ main::row#2 main::screen#1 ] { } ) always clobbers reg byte a Statement [21] main::screen#2 = main::screen#1 + $28 [ main::screen#2 ] ( [ main::screen#2 ] { } ) always clobbers reg byte a Statement [39] main::screen#2[main::i#4] = ' ' [ main::screen#2 main::i#4 ] ( [ main::screen#2 main::i#4 ] { } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:12 [ main::i#4 main::i#3 main::i#6 main::i#1 main::i#2 ] Statement [42] main::screen#13[main::col#2] = '1' [ main::row#2 main::screen#13 main::row_pressed_bits#2 main::col#2 ] ( [ main::row#2 main::screen#13 main::row_pressed_bits#2 main::col#2 ] { } ) always clobbers reg byte a Statement [43] *main::sc#2 = ' ' [ main::sc#2 ] ( [ main::sc#2 ] { } ) always clobbers reg byte a reg byte y Statement [45] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_A_DDR) = $ff [ ] ( keyboard_init:4 [ ] { } ) always clobbers reg byte a Statement [46] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B_DDR) = 0 [ ] ( keyboard_init:4 [ ] { } ) always clobbers reg byte a Statement [49] *((char *)CIA1) = keyboard_matrix_row_bitmask[keyboard_matrix_read::rowid#2] [ ] ( keyboard_matrix_read:8 [ main::row#2 main::screen#13 ] { { keyboard_matrix_read::rowid#1 = keyboard_matrix_read::rowid#2 main::row#2 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#3 } } keyboard_key_pressed:29::keyboard_matrix_read:57 [ main::screen#2 main::ch#2 main::i#3 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::key#0 = main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_matrix_read::rowid#2 keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:22 [ main::ch#2 main::ch#1 ] Removing always clobbered register reg byte a as potential for zp[1]:15 [ keyboard_key_pressed::colidx#0 ] Statement [50] keyboard_matrix_read::return#0 = ~ *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B) [ keyboard_matrix_read::return#0 ] ( keyboard_matrix_read:8 [ main::row#2 main::screen#13 keyboard_matrix_read::return#0 ] { { keyboard_matrix_read::rowid#1 = keyboard_matrix_read::rowid#2 main::row#2 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#3 } } keyboard_key_pressed:29::keyboard_matrix_read:57 [ main::screen#2 main::ch#2 main::i#3 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::key#0 = main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_matrix_read::rowid#2 keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a Statement [55] keyboard_key_pressed::rowidx#0 = keyboard_key_pressed::key#0 >> 3 [ keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] ( keyboard_key_pressed:29 [ main::screen#2 main::ch#2 main::i#3 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::key#0 = main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_matrix_read::rowid#2 keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a Statement [2] if(main::sc#2<$400+$3e8) goto main::@2 [ main::sc#2 ] ( [ main::sc#2 ] { } ) always clobbers reg byte a Statement [5] if(*RASTER!=$ff) goto main::@4 [ ] ( [ ] { } ) always clobbers reg byte a Statement [12] main::$4 = main::row_pressed_bits#2 & $80 [ main::row#2 main::screen#13 main::row_pressed_bits#2 main::col#2 main::$4 ] ( [ main::row#2 main::screen#13 main::row_pressed_bits#2 main::col#2 main::$4 ] { } ) always clobbers reg byte a Statement [14] main::screen#13[main::col#2] = '0' [ main::row#2 main::screen#13 main::row_pressed_bits#2 main::col#2 ] ( [ main::row#2 main::screen#13 main::row_pressed_bits#2 main::col#2 ] { } ) always clobbers reg byte a Statement [18] main::screen#1 = main::screen#13 + $28 [ main::row#2 main::screen#1 ] ( [ main::row#2 main::screen#1 ] { } ) always clobbers reg byte a Statement [21] main::screen#2 = main::screen#1 + $28 [ main::screen#2 ] ( [ main::screen#2 ] { } ) always clobbers reg byte a Statement [33] main::screen#2[main::i#3] = main::ch#2 [ main::screen#2 main::ch#2 main::i#3 ] ( [ main::screen#2 main::ch#2 main::i#3 ] { } ) always clobbers reg byte a Statement [39] main::screen#2[main::i#4] = ' ' [ main::screen#2 main::i#4 ] ( [ main::screen#2 main::i#4 ] { } ) always clobbers reg byte a Statement [42] main::screen#13[main::col#2] = '1' [ main::row#2 main::screen#13 main::row_pressed_bits#2 main::col#2 ] ( [ main::row#2 main::screen#13 main::row_pressed_bits#2 main::col#2 ] { } ) always clobbers reg byte a Statement [43] *main::sc#2 = ' ' [ main::sc#2 ] ( [ main::sc#2 ] { } ) always clobbers reg byte a reg byte y Statement [45] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_A_DDR) = $ff [ ] ( keyboard_init:4 [ ] { } ) always clobbers reg byte a Statement [46] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B_DDR) = 0 [ ] ( keyboard_init:4 [ ] { } ) always clobbers reg byte a Statement [49] *((char *)CIA1) = keyboard_matrix_row_bitmask[keyboard_matrix_read::rowid#2] [ ] ( keyboard_matrix_read:8 [ main::row#2 main::screen#13 ] { { keyboard_matrix_read::rowid#1 = keyboard_matrix_read::rowid#2 main::row#2 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#3 } } keyboard_key_pressed:29::keyboard_matrix_read:57 [ main::screen#2 main::ch#2 main::i#3 keyboard_key_pressed::colidx#0 ] { { keyboard_key_pressed::key#0 = main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_matrix_read::rowid#2 keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a Statement [50] keyboard_matrix_read::return#0 = ~ *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B) [ keyboard_matrix_read::return#0 ] ( keyboard_matrix_read:8 [ main::row#2 main::screen#13 keyboard_matrix_read::return#0 ] { { keyboard_matrix_read::rowid#1 = keyboard_matrix_read::rowid#2 main::row#2 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#3 } } keyboard_key_pressed:29::keyboard_matrix_read:57 [ main::screen#2 main::ch#2 main::i#3 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] { { keyboard_key_pressed::key#0 = main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_matrix_read::rowid#2 keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a Statement [55] keyboard_key_pressed::rowidx#0 = keyboard_key_pressed::key#0 >> 3 [ keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] ( keyboard_key_pressed:29 [ main::screen#2 main::ch#2 main::i#3 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] { { keyboard_key_pressed::key#0 = main::key#0 } { keyboard_key_pressed::return#0 = keyboard_key_pressed::return#2 } { keyboard_matrix_read::rowid#0 = keyboard_matrix_read::rowid#2 keyboard_key_pressed::rowidx#0 } { keyboard_matrix_read::return#0 = keyboard_matrix_read::return#2 } } ) always clobbers reg byte a Potential registers zp[2]:25 [ main::sc#2 main::sc#1 ] : zp[2]:25 , Potential registers zp[1]:23 [ main::row#2 main::row#1 ] : zp[1]:23 , reg byte x , reg byte y , Potential registers zp[2]:16 [ main::screen#13 main::screen#1 ] : zp[2]:16 , Potential registers zp[1]:9 [ main::row_pressed_bits#2 main::row_pressed_bits#1 main::row_pressed_bits#0 ] : zp[1]:9 , reg byte x , reg byte y , Potential registers zp[1]:4 [ main::col#2 main::col#1 ] : zp[1]:4 , reg byte x , reg byte y , Potential registers zp[1]:22 [ main::ch#2 main::ch#1 ] : zp[1]:22 , reg byte x , reg byte y , Potential registers zp[1]:12 [ main::i#4 main::i#3 main::i#6 main::i#1 main::i#2 ] : zp[1]:12 , reg byte x , reg byte y , Potential registers zp[1]:2 [ keyboard_matrix_read::rowid#2 keyboard_matrix_read::rowid#0 keyboard_matrix_read::rowid#1 ] : zp[1]:2 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:18 [ keyboard_matrix_read::return#3 ] : zp[1]:18 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:5 [ main::$4 ] : zp[1]:5 , reg byte a , reg byte x , reg byte y , Potential registers zp[2]:27 [ main::screen#2 ] : zp[2]:27 , Potential registers zp[1]:10 [ keyboard_get_keycode::ch#0 ] : zp[1]:10 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:19 [ keyboard_get_keycode::return#2 ] : zp[1]:19 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:24 [ main::key#0 ] : zp[1]:24 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:11 [ keyboard_key_pressed::key#0 ] : zp[1]:11 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:20 [ keyboard_key_pressed::return#2 ] : zp[1]:20 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:21 [ main::$14 ] : zp[1]:21 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:3 [ keyboard_matrix_read::return#0 ] : zp[1]:3 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:13 [ keyboard_get_keycode::return#0 ] : zp[1]:13 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:15 [ keyboard_key_pressed::colidx#0 ] : zp[1]:15 , reg byte x , reg byte y , Potential registers zp[1]:6 [ keyboard_key_pressed::rowidx#0 ] : zp[1]:6 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:7 [ keyboard_matrix_read::return#2 ] : zp[1]:7 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:8 [ keyboard_key_pressed::$2 ] : zp[1]:8 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:14 [ keyboard_key_pressed::return#0 ] : zp[1]:14 , reg byte a , reg byte x , reg byte y , REGISTER UPLIFT SCOPES Uplift Scope [keyboard_matrix_read] 13,307: zp[1]:2 [ keyboard_matrix_read::rowid#2 keyboard_matrix_read::rowid#0 keyboard_matrix_read::rowid#1 ] 2,775.75: zp[1]:3 [ keyboard_matrix_read::return#0 ] 2,002: zp[1]:7 [ keyboard_matrix_read::return#2 ] 202: zp[1]:18 [ keyboard_matrix_read::return#3 ] Uplift Scope [main] 2,168.83: zp[1]:4 [ main::col#2 main::col#1 ] 2,002: zp[1]:5 [ main::$4 ] 1,490.13: zp[1]:9 [ main::row_pressed_bits#2 main::row_pressed_bits#1 main::row_pressed_bits#0 ] 765.92: zp[1]:12 [ main::i#4 main::i#3 main::i#6 main::i#1 main::i#2 ] 240.54: zp[2]:16 [ main::screen#13 main::screen#1 ] 202: zp[1]:21 [ main::$14 ] 180.36: zp[1]:22 [ main::ch#2 main::ch#1 ] 173.14: zp[1]:23 [ main::row#2 main::row#1 ] 151.5: zp[1]:24 [ main::key#0 ] 36.67: zp[2]:25 [ main::sc#2 main::sc#1 ] 10.14: zp[2]:27 [ main::screen#2 ] Uplift Scope [keyboard_key_pressed] 2,002: zp[1]:6 [ keyboard_key_pressed::rowidx#0 ] 2,002: zp[1]:8 [ keyboard_key_pressed::$2 ] 1,051.5: zp[1]:11 [ keyboard_key_pressed::key#0 ] 367.33: zp[1]:14 [ keyboard_key_pressed::return#0 ] 333.67: zp[1]:15 [ keyboard_key_pressed::colidx#0 ] 202: zp[1]:20 [ keyboard_key_pressed::return#2 ] Uplift Scope [keyboard_get_keycode] 1,102: zp[1]:10 [ keyboard_get_keycode::ch#0 ] 367.33: zp[1]:13 [ keyboard_get_keycode::return#0 ] 202: zp[1]:19 [ keyboard_get_keycode::return#2 ] Uplift Scope [keyboard_init] Uplift Scope [MOS6526_CIA] Uplift Scope [MOS6569_VICII] Uplift Scope [MOS6581_SID] Uplift Scope [] Uplifting [keyboard_matrix_read] best 99128 combination reg byte x [ keyboard_matrix_read::rowid#2 keyboard_matrix_read::rowid#0 keyboard_matrix_read::rowid#1 ] reg byte a [ keyboard_matrix_read::return#0 ] reg byte a [ keyboard_matrix_read::return#2 ] reg byte a [ keyboard_matrix_read::return#3 ] Limited combination testing to 100 combinations of 256 possible. Uplifting [main] best 80028 combination reg byte y [ main::col#2 main::col#1 ] reg byte a [ main::$4 ] reg byte x [ main::row_pressed_bits#2 main::row_pressed_bits#1 main::row_pressed_bits#0 ] zp[1]:12 [ main::i#4 main::i#3 main::i#6 main::i#1 main::i#2 ] zp[2]:16 [ main::screen#13 main::screen#1 ] zp[1]:21 [ main::$14 ] zp[1]:22 [ main::ch#2 main::ch#1 ] zp[1]:23 [ main::row#2 main::row#1 ] zp[1]:24 [ main::key#0 ] zp[2]:25 [ main::sc#2 main::sc#1 ] zp[2]:27 [ main::screen#2 ] Limited combination testing to 100 combinations of 15552 possible. Uplifting [keyboard_key_pressed] best 79417 combination reg byte a [ keyboard_key_pressed::rowidx#0 ] zp[1]:8 [ keyboard_key_pressed::$2 ] reg byte x [ keyboard_key_pressed::key#0 ] reg byte a [ keyboard_key_pressed::return#0 ] zp[1]:15 [ keyboard_key_pressed::colidx#0 ] zp[1]:20 [ keyboard_key_pressed::return#2 ] Limited combination testing to 100 combinations of 3072 possible. Uplifting [keyboard_get_keycode] best 78211 combination reg byte x [ keyboard_get_keycode::ch#0 ] reg byte a [ keyboard_get_keycode::return#0 ] reg byte a [ keyboard_get_keycode::return#2 ] Uplifting [keyboard_init] best 78211 combination Uplifting [MOS6526_CIA] best 78211 combination Uplifting [MOS6569_VICII] best 78211 combination Uplifting [MOS6581_SID] best 78211 combination Uplifting [] best 78211 combination Attempting to uplift remaining variables inzp[1]:8 [ keyboard_key_pressed::$2 ] Uplifting [keyboard_key_pressed] best 78205 combination reg byte a [ keyboard_key_pressed::$2 ] Attempting to uplift remaining variables inzp[1]:12 [ main::i#4 main::i#3 main::i#6 main::i#1 main::i#2 ] Uplifting [main] best 78205 combination zp[1]:12 [ main::i#4 main::i#3 main::i#6 main::i#1 main::i#2 ] Attempting to uplift remaining variables inzp[1]:15 [ keyboard_key_pressed::colidx#0 ] Uplifting [keyboard_key_pressed] best 78203 combination reg byte y [ keyboard_key_pressed::colidx#0 ] Attempting to uplift remaining variables inzp[1]:20 [ keyboard_key_pressed::return#2 ] Uplifting [keyboard_key_pressed] best 77603 combination reg byte a [ keyboard_key_pressed::return#2 ] Attempting to uplift remaining variables inzp[1]:21 [ main::$14 ] Uplifting [main] best 77203 combination reg byte a [ main::$14 ] Attempting to uplift remaining variables inzp[1]:22 [ main::ch#2 main::ch#1 ] Uplifting [main] best 77203 combination zp[1]:22 [ main::ch#2 main::ch#1 ] Attempting to uplift remaining variables inzp[1]:23 [ main::row#2 main::row#1 ] Uplifting [main] best 77203 combination zp[1]:23 [ main::row#2 main::row#1 ] Attempting to uplift remaining variables inzp[1]:24 [ main::key#0 ] Uplifting [main] best 76503 combination reg byte a [ main::key#0 ] Coalescing zero page register [ zp[2]:16 [ main::screen#13 main::screen#1 ] ] with [ zp[2]:27 [ main::screen#2 ] ] - score: 1 Allocated (was zp[1]:12) zp[1]:2 [ main::i#4 main::i#3 main::i#6 main::i#1 main::i#2 ] Allocated (was zp[2]:16) zp[2]:3 [ main::screen#13 main::screen#1 main::screen#2 ] Allocated (was zp[1]:22) zp[1]:5 [ main::ch#2 main::ch#1 ] Allocated (was zp[1]:23) zp[1]:6 [ main::row#2 main::row#1 ] Allocated (was zp[2]:25) zp[2]:7 [ main::sc#2 main::sc#1 ] ASSEMBLER BEFORE OPTIMIZATION // File Comments // Test keyboard input - in the keyboard matrix and mapping screen codes to key codes // Upstart // Commodore 64 PRG executable file .file [name="test-keyboard.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 .const KEY_3 = 8 .const KEY_W = 9 .const KEY_A = $a .const KEY_4 = $b .const KEY_Z = $c .const KEY_S = $d .const KEY_E = $e .const KEY_5 = $10 .const KEY_R = $11 .const KEY_D = $12 .const KEY_6 = $13 .const KEY_C = $14 .const KEY_F = $15 .const KEY_T = $16 .const KEY_X = $17 .const KEY_7 = $18 .const KEY_Y = $19 .const KEY_G = $1a .const KEY_8 = $1b .const KEY_B = $1c .const KEY_H = $1d .const KEY_U = $1e .const KEY_V = $1f .const KEY_9 = $20 .const KEY_I = $21 .const KEY_J = $22 .const KEY_0 = $23 .const KEY_M = $24 .const KEY_K = $25 .const KEY_O = $26 .const KEY_N = $27 .const KEY_PLUS = $28 .const KEY_P = $29 .const KEY_L = $2a .const KEY_MINUS = $2b .const KEY_DOT = $2c .const KEY_COLON = $2d .const KEY_AT = $2e .const KEY_COMMA = $2f .const KEY_POUND = $30 .const KEY_ASTERISK = $31 .const KEY_SEMICOLON = $32 .const KEY_EQUALS = $35 .const KEY_ARROW_UP = $36 .const KEY_SLASH = $37 .const KEY_1 = $38 .const KEY_ARROW_LEFT = $39 .const KEY_2 = $3b .const KEY_SPACE = $3c .const KEY_Q = $3e .const OFFSET_STRUCT_MOS6526_CIA_PORT_A_DDR = 2 .const OFFSET_STRUCT_MOS6526_CIA_PORT_B_DDR = 3 .const OFFSET_STRUCT_MOS6526_CIA_PORT_B = 1 /// $D012 RASTER Raster counter .label RASTER = $d012 /// The CIA#1: keyboard matrix, joystick #1/#2 .label CIA1 = $dc00 .segment Code // main main: { .label sc = 7 .label screen = 3 .label row = 6 .label ch = 5 // Checks all specific chars $00-$3f .label i = 2 // [1] phi from main to main::@1 [phi:main->main::@1] __b1_from_main: // [1] phi main::sc#2 = (char *) 1024 [phi:main->main::@1#0] -- pbuz1=pbuc1 lda #<$400 sta.z sc lda #>$400 sta.z sc+1 jmp __b1 // Clear screen // main::@1 __b1: // [2] if(main::sc#2<$400+$3e8) goto main::@2 -- pbuz1_lt_vwuc1_then_la1 lda.z sc+1 cmp #>$400+$3e8 bcc __b2 bne !+ lda.z sc cmp #<$400+$3e8 bcc __b2 !: // [3] phi from main::@1 to main::@3 [phi:main::@1->main::@3] __b3_from___b1: jmp __b3 // main::@3 __b3: // [4] call keyboard_init // Init keyboard jsr keyboard_init jmp __b4 // main::@4 __b4: // [5] if(*RASTER!=$ff) goto main::@4 -- _deref_pbuc1_neq_vbuc2_then_la1 lda #$ff cmp RASTER bne __b4 // [6] phi from main::@4 to main::@5 [phi:main::@4->main::@5] __b5_from___b4: // [6] phi main::screen#13 = (char *) 1024 [phi:main::@4->main::@5#0] -- pbuz1=pbuc1 lda #<$400 sta.z screen lda #>$400 sta.z screen+1 // [6] phi main::row#2 = 0 [phi:main::@4->main::@5#1] -- vbuz1=vbuc1 lda #0 sta.z row jmp __b5 // Read & print keyboard matrix // [6] phi from main::@10 to main::@5 [phi:main::@10->main::@5] __b5_from___b10: // [6] phi main::screen#13 = main::screen#1 [phi:main::@10->main::@5#0] -- register_copy // [6] phi main::row#2 = main::row#1 [phi:main::@10->main::@5#1] -- register_copy jmp __b5 // main::@5 __b5: // [7] keyboard_matrix_read::rowid#1 = main::row#2 -- vbuxx=vbuz1 ldx.z row // [8] call keyboard_matrix_read // [48] phi from main::@5 to keyboard_matrix_read [phi:main::@5->keyboard_matrix_read] keyboard_matrix_read_from___b5: // [48] phi keyboard_matrix_read::rowid#2 = keyboard_matrix_read::rowid#1 [phi:main::@5->keyboard_matrix_read#0] -- register_copy jsr keyboard_matrix_read // [9] keyboard_matrix_read::return#3 = keyboard_matrix_read::return#0 jmp __b17 // main::@17 __b17: // [10] main::row_pressed_bits#0 = keyboard_matrix_read::return#3 -- vbuxx=vbuaa tax // [11] phi from main::@17 to main::@6 [phi:main::@17->main::@6] __b6_from___b17: // [11] phi main::col#2 = 0 [phi:main::@17->main::@6#0] -- vbuyy=vbuc1 ldy #0 // [11] phi main::row_pressed_bits#2 = main::row_pressed_bits#0 [phi:main::@17->main::@6#1] -- register_copy jmp __b6 // [11] phi from main::@8 to main::@6 [phi:main::@8->main::@6] __b6_from___b8: // [11] phi main::col#2 = main::col#1 [phi:main::@8->main::@6#0] -- register_copy // [11] phi main::row_pressed_bits#2 = main::row_pressed_bits#1 [phi:main::@8->main::@6#1] -- register_copy jmp __b6 // main::@6 __b6: // [12] main::$4 = main::row_pressed_bits#2 & $80 -- vbuaa=vbuxx_band_vbuc1 txa and #$80 // [13] if(main::$4!=0) goto main::@7 -- vbuaa_neq_0_then_la1 cmp #0 bne __b7 jmp __b9 // main::@9 __b9: // [14] main::screen#13[main::col#2] = '0' -- pbuz1_derefidx_vbuyy=vbuc1 lda #'0' sta (screen),y jmp __b8 // main::@8 __b8: // [15] main::row_pressed_bits#1 = main::row_pressed_bits#2 << 1 -- vbuxx=vbuxx_rol_1 txa asl tax // [16] main::col#1 = ++ main::col#2 -- vbuyy=_inc_vbuyy iny // [17] if(main::col#1!=8) goto main::@6 -- vbuyy_neq_vbuc1_then_la1 cpy #8 bne __b6_from___b8 jmp __b10 // main::@10 __b10: // [18] main::screen#1 = main::screen#13 + $28 -- pbuz1=pbuz1_plus_vbuc1 lda #$28 clc adc.z screen sta.z screen bcc !+ inc.z screen+1 !: // [19] main::row#1 = ++ main::row#2 -- vbuz1=_inc_vbuz1 inc.z row // [20] if(main::row#1!=8) goto main::@5 -- vbuz1_neq_vbuc1_then_la1 lda #8 cmp.z row bne __b5_from___b10 jmp __b11 // main::@11 __b11: // [21] main::screen#2 = main::screen#1 + $28 -- pbuz1=pbuz1_plus_vbuc1 lda #$28 clc adc.z screen sta.z screen bcc !+ inc.z screen+1 !: // [22] phi from main::@11 to main::@12 [phi:main::@11->main::@12] __b12_from___b11: // [22] phi main::i#3 = 0 [phi:main::@11->main::@12#0] -- vbuz1=vbuc1 lda #0 sta.z i // [22] phi main::ch#2 = 0 [phi:main::@11->main::@12#1] -- vbuz1=vbuc1 lda #0 sta.z ch jmp __b12 // [22] phi from main::@13 to main::@12 [phi:main::@13->main::@12] __b12_from___b13: // [22] phi main::i#3 = main::i#6 [phi:main::@13->main::@12#0] -- register_copy // [22] phi main::ch#2 = main::ch#1 [phi:main::@13->main::@12#1] -- register_copy jmp __b12 // main::@12 __b12: // [23] keyboard_get_keycode::ch#0 = main::ch#2 -- vbuxx=vbuz1 ldx.z ch // [24] call keyboard_get_keycode jsr keyboard_get_keycode // [25] keyboard_get_keycode::return#2 = keyboard_get_keycode::return#0 jmp __b18 // main::@18 __b18: // [26] main::key#0 = keyboard_get_keycode::return#2 // [27] if(main::key#0==$3f) goto main::@13 -- vbuaa_eq_vbuc1_then_la1 cmp #$3f beq __b13_from___b18 jmp __b14 // main::@14 __b14: // [28] keyboard_key_pressed::key#0 = main::key#0 -- vbuxx=vbuaa tax // [29] call keyboard_key_pressed jsr keyboard_key_pressed // [30] keyboard_key_pressed::return#2 = keyboard_key_pressed::return#0 jmp __b19 // main::@19 __b19: // [31] main::$14 = keyboard_key_pressed::return#2 // [32] if(main::$14==0) goto main::@13 -- vbuaa_eq_0_then_la1 cmp #0 beq __b13_from___b19 jmp __b15 // main::@15 __b15: // [33] main::screen#2[main::i#3] = main::ch#2 -- pbuz1_derefidx_vbuz2=vbuz3 lda.z ch ldy.z i sta (screen),y // [34] main::i#1 = ++ main::i#3 -- vbuz1=_inc_vbuz1 inc.z i // [35] phi from main::@15 main::@18 main::@19 to main::@13 [phi:main::@15/main::@18/main::@19->main::@13] __b13_from___b15: __b13_from___b18: __b13_from___b19: // [35] phi main::i#6 = main::i#1 [phi:main::@15/main::@18/main::@19->main::@13#0] -- register_copy jmp __b13 // main::@13 __b13: // [36] main::ch#1 = ++ main::ch#2 -- vbuz1=_inc_vbuz1 inc.z ch // [37] if(main::ch#1!=$40) goto main::@12 -- vbuz1_neq_vbuc1_then_la1 lda #$40 cmp.z ch bne __b12_from___b13 // [38] phi from main::@13 main::@16 to main::@16 [phi:main::@13/main::@16->main::@16] __b16_from___b13: __b16_from___b16: // [38] phi main::i#4 = main::i#6 [phi:main::@13/main::@16->main::@16#0] -- register_copy jmp __b16 // Add some spaces // main::@16 __b16: // [39] main::screen#2[main::i#4] = ' ' -- pbuz1_derefidx_vbuz2=vbuc1 lda #' ' ldy.z i sta (screen),y // [40] main::i#2 = ++ main::i#4 -- vbuz1=_inc_vbuz1 inc.z i // [41] if(main::i#2<5) goto main::@16 -- vbuz1_lt_vbuc1_then_la1 lda.z i cmp #5 bcc __b16_from___b16 jmp __b4 // main::@7 __b7: // [42] main::screen#13[main::col#2] = '1' -- pbuz1_derefidx_vbuyy=vbuc1 lda #'1' sta (screen),y jmp __b8 // main::@2 __b2: // [43] *main::sc#2 = ' ' -- _deref_pbuz1=vbuc1 lda #' ' ldy #0 sta (sc),y // [44] main::sc#1 = ++ main::sc#2 -- pbuz1=_inc_pbuz1 inc.z sc bne !+ inc.z sc+1 !: // [1] phi from main::@2 to main::@1 [phi:main::@2->main::@1] __b1_from___b2: // [1] phi main::sc#2 = main::sc#1 [phi:main::@2->main::@1#0] -- register_copy jmp __b1 } // keyboard_init // Initialize keyboard reading by setting CIA#1 Data Direction Registers keyboard_init: { // [45] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_A_DDR) = $ff -- _deref_pbuc1=vbuc2 // Keyboard Matrix Columns Write Mode lda #$ff sta CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_A_DDR // [46] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B_DDR) = 0 -- _deref_pbuc1=vbuc2 // Keyboard Matrix Columns Read Mode lda #0 sta CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B_DDR jmp __breturn // keyboard_init::@return __breturn: // [47] return rts } // keyboard_matrix_read // Read a single row of the keyboard matrix // The row ID (0-7) of the keyboard matrix row to read. See the C64 key matrix for row IDs. // Returns the keys pressed on the row as bits according to the C64 key matrix. // Notice: If the C64 normal interrupt is still running it will occasionally interrupt right between the read & write // leading to erroneous readings. You must disable the normal interrupt or sei/cli around calls to the keyboard matrix reader. // __register(A) char keyboard_matrix_read(__register(X) char rowid) keyboard_matrix_read: { // [49] *((char *)CIA1) = keyboard_matrix_row_bitmask[keyboard_matrix_read::rowid#2] -- _deref_pbuc1=pbuc2_derefidx_vbuxx lda keyboard_matrix_row_bitmask,x sta CIA1 // [50] keyboard_matrix_read::return#0 = ~ *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B) -- vbuaa=_bnot__deref_pbuc1 lda CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B eor #$ff jmp __breturn // keyboard_matrix_read::@return __breturn: // [51] return rts } // keyboard_get_keycode // Get the keycode corresponding to a specific screen code character // ch is the character to get the key code for ($00-$3f) // Returns the key code corresponding to the passed character. Only characters with a non-shifted key are handled. // If there is no non-shifted key representing the char $3f is returned (representing RUN/STOP) . // __register(A) char keyboard_get_keycode(__register(X) char ch) keyboard_get_keycode: { // [52] keyboard_get_keycode::return#0 = keyboard_char_keycodes[keyboard_get_keycode::ch#0] -- vbuaa=pbuc1_derefidx_vbuxx lda keyboard_char_keycodes,x jmp __breturn // keyboard_get_keycode::@return __breturn: // [53] return rts } // keyboard_key_pressed // Determines whether a specific key is currently pressed by accessing the matrix directly // The key is a keyboard code defined from the keyboard matrix by %00rrrccc, where rrr is the row ID (0-7) and ccc is the column ID (0-7) // All keys exist as as KEY_XXX constants. // Returns zero if the key is not pressed and a non-zero value if the key is currently pressed // __register(A) char keyboard_key_pressed(__register(X) char key) keyboard_key_pressed: { // [54] keyboard_key_pressed::colidx#0 = keyboard_key_pressed::key#0 & 7 -- vbuyy=vbuxx_band_vbuc1 txa and #7 tay // [55] keyboard_key_pressed::rowidx#0 = keyboard_key_pressed::key#0 >> 3 -- vbuaa=vbuxx_ror_3 txa lsr lsr lsr // [56] keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 -- vbuxx=vbuaa tax // [57] call keyboard_matrix_read // [48] phi from keyboard_key_pressed to keyboard_matrix_read [phi:keyboard_key_pressed->keyboard_matrix_read] keyboard_matrix_read_from_keyboard_key_pressed: // [48] phi keyboard_matrix_read::rowid#2 = keyboard_matrix_read::rowid#0 [phi:keyboard_key_pressed->keyboard_matrix_read#0] -- register_copy jsr keyboard_matrix_read // [58] keyboard_matrix_read::return#2 = keyboard_matrix_read::return#0 jmp __b1 // keyboard_key_pressed::@1 __b1: // [59] keyboard_key_pressed::$2 = keyboard_matrix_read::return#2 // [60] keyboard_key_pressed::return#0 = keyboard_key_pressed::$2 & keyboard_matrix_col_bitmask[keyboard_key_pressed::colidx#0] -- vbuaa=vbuaa_band_pbuc1_derefidx_vbuyy and keyboard_matrix_col_bitmask,y jmp __breturn // keyboard_key_pressed::@return __breturn: // [61] return rts } // File Data .segment Data // Keycodes for each screen code character from $00-$3f. // Chars that do not have an unmodified keycode return $3f (representing RUN/STOP). keyboard_char_keycodes: .byte KEY_AT, KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, $3f, KEY_POUND, $3f, KEY_ARROW_UP, KEY_ARROW_LEFT, KEY_SPACE, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, KEY_ASTERISK, KEY_PLUS, KEY_COMMA, KEY_MINUS, KEY_DOT, KEY_SLASH, KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_COLON, KEY_SEMICOLON, $3f, KEY_EQUALS, $3f, $3f // Keyboard row bitmask as expected by CIA#1 Port A when reading a specific keyboard matrix row (rows are numbered 0-7) keyboard_matrix_row_bitmask: .byte $fe, $fd, $fb, $f7, $ef, $df, $bf, $7f // Keyboard matrix column bitmasks for a specific keybooard matrix column when reading the keyboard. (columns are numbered 0-7) keyboard_matrix_col_bitmask: .byte 1, 2, 4, 8, $10, $20, $40, $80 ASSEMBLER OPTIMIZATIONS Removing instruction jmp __b1 Removing instruction jmp __b3 Removing instruction jmp __b4 Removing instruction jmp __b5 Removing instruction jmp __b17 Removing instruction jmp __b6 Removing instruction jmp __b9 Removing instruction jmp __b8 Removing instruction jmp __b10 Removing instruction jmp __b11 Removing instruction jmp __b12 Removing instruction jmp __b18 Removing instruction jmp __b14 Removing instruction jmp __b19 Removing instruction jmp __b15 Removing instruction jmp __b13 Removing instruction jmp __b16 Removing instruction jmp __breturn Removing instruction jmp __breturn Removing instruction jmp __breturn Removing instruction jmp __b1 Removing instruction jmp __breturn Succesful ASM optimization Pass5NextJumpElimination Removing instruction lda #0 Succesful ASM optimization Pass5UnnecesaryLoadElimination Replacing label __b6_from___b8 with __b6 Replacing label __b5_from___b10 with __b5 Replacing label __b13_from___b18 with __b13 Replacing label __b13_from___b19 with __b13 Replacing label __b12_from___b13 with __b12 Removing instruction __b3_from___b1: Removing instruction __b5_from___b10: Removing instruction __b6_from___b8: Removing instruction __b12_from___b13: Removing instruction __b13_from___b15: Removing instruction __b13_from___b18: Removing instruction __b13_from___b19: Removing instruction __b16_from___b13: Succesful ASM optimization Pass5RedundantLabelElimination Removing instruction __b1_from_main: Removing instruction __b3: Removing instruction __b5_from___b4: Removing instruction keyboard_matrix_read_from___b5: Removing instruction __b17: Removing instruction __b6_from___b17: Removing instruction __b9: Removing instruction __b10: Removing instruction __b11: Removing instruction __b12_from___b11: Removing instruction __b18: Removing instruction __b14: Removing instruction __b19: Removing instruction __b15: Removing instruction __b16: Removing instruction __b1_from___b2: Removing instruction __breturn: Removing instruction __breturn: Removing instruction __breturn: Removing instruction keyboard_matrix_read_from_keyboard_key_pressed: Removing instruction __b1: Removing instruction __breturn: Succesful ASM optimization Pass5UnusedLabelElimination Relabelling long label __b16_from___b16 to __b3 Succesful ASM optimization Pass5RelabelLongLabels Removing instruction jmp __b5 Removing instruction jmp __b6 Removing instruction jmp __b12 Succesful ASM optimization Pass5NextJumpElimination Fixing long branch [82] bcc __b2 to bcs Fixing long branch [88] bcc __b2 to bcs FINAL SYMBOL TABLE __constant struct MOS6526_CIA * const CIA1 = (struct MOS6526_CIA *) 56320 __constant const char KEY_0 = $23 __constant const char KEY_1 = $38 __constant const char KEY_2 = $3b __constant const char KEY_3 = 8 __constant const char KEY_4 = $b __constant const char KEY_5 = $10 __constant const char KEY_6 = $13 __constant const char KEY_7 = $18 __constant const char KEY_8 = $1b __constant const char KEY_9 = $20 __constant const char KEY_A = $a __constant const char KEY_ARROW_LEFT = $39 __constant const char KEY_ARROW_UP = $36 __constant const char KEY_ASTERISK = $31 __constant const char KEY_AT = $2e __constant const char KEY_B = $1c __constant const char KEY_C = $14 __constant const char KEY_COLON = $2d __constant const char KEY_COMMA = $2f __constant const char KEY_D = $12 __constant const char KEY_DOT = $2c __constant const char KEY_E = $e __constant const char KEY_EQUALS = $35 __constant const char KEY_F = $15 __constant const char KEY_G = $1a __constant const char KEY_H = $1d __constant const char KEY_I = $21 __constant const char KEY_J = $22 __constant const char KEY_K = $25 __constant const char KEY_L = $2a __constant const char KEY_M = $24 __constant const char KEY_MINUS = $2b __constant const char KEY_N = $27 __constant const char KEY_O = $26 __constant const char KEY_P = $29 __constant const char KEY_PLUS = $28 __constant const char KEY_POUND = $30 __constant const char KEY_Q = $3e __constant const char KEY_R = $11 __constant const char KEY_S = $d __constant const char KEY_SEMICOLON = $32 __constant const char KEY_SLASH = $37 __constant const char KEY_SPACE = $3c __constant const char KEY_T = $16 __constant const char KEY_U = $1e __constant const char KEY_V = $1f __constant const char KEY_W = 9 __constant const char KEY_X = $17 __constant const char KEY_Y = $19 __constant const char KEY_Z = $c __constant char OFFSET_STRUCT_MOS6526_CIA_PORT_A_DDR = 2 __constant char OFFSET_STRUCT_MOS6526_CIA_PORT_B = 1 __constant char OFFSET_STRUCT_MOS6526_CIA_PORT_B_DDR = 3 __constant char * const RASTER = (char *) 53266 __constant const char keyboard_char_keycodes[] = { KEY_AT, KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, $3f, KEY_POUND, $3f, KEY_ARROW_UP, KEY_ARROW_LEFT, KEY_SPACE, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, KEY_ASTERISK, KEY_PLUS, KEY_COMMA, KEY_MINUS, KEY_DOT, KEY_SLASH, KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_COLON, KEY_SEMICOLON, $3f, KEY_EQUALS, $3f, $3f } char keyboard_get_keycode(char ch) char keyboard_get_keycode::ch char keyboard_get_keycode::ch#0 // reg byte x 1102.0 char keyboard_get_keycode::return char keyboard_get_keycode::return#0 // reg byte a 367.33333333333337 char keyboard_get_keycode::return#2 // reg byte a 202.0 void keyboard_init() char keyboard_key_pressed(char key) char keyboard_key_pressed::$2 // reg byte a 2002.0 char keyboard_key_pressed::colidx char keyboard_key_pressed::colidx#0 // reg byte y 333.6666666666667 char keyboard_key_pressed::key char keyboard_key_pressed::key#0 // reg byte x 1051.5 char keyboard_key_pressed::return char keyboard_key_pressed::return#0 // reg byte a 367.33333333333337 char keyboard_key_pressed::return#2 // reg byte a 202.0 char keyboard_key_pressed::rowidx char keyboard_key_pressed::rowidx#0 // reg byte a 2002.0 __constant char keyboard_matrix_col_bitmask[8] = { 1, 2, 4, 8, $10, $20, $40, $80 } char keyboard_matrix_read(char rowid) char keyboard_matrix_read::return char keyboard_matrix_read::return#0 // reg byte a 2775.75 char keyboard_matrix_read::return#2 // reg byte a 2002.0 char keyboard_matrix_read::return#3 // reg byte a 202.0 char keyboard_matrix_read::row_pressed_bits char keyboard_matrix_read::rowid char keyboard_matrix_read::rowid#0 // reg byte x 2002.0 char keyboard_matrix_read::rowid#1 // reg byte x 202.0 char keyboard_matrix_read::rowid#2 // reg byte x 11103.0 __constant char keyboard_matrix_row_bitmask[8] = { $fe, $fd, $fb, $f7, $ef, $df, $bf, $7f } void main() char main::$14 // reg byte a 202.0 char main::$4 // reg byte a 2002.0 char main::ch char main::ch#1 // ch zp[1]:5 151.5 char main::ch#2 // ch zp[1]:5 28.857142857142858 char main::col char main::col#1 // reg byte y 1501.5 char main::col#2 // reg byte y 667.3333333333334 char main::i char main::i#1 // i zp[1]:2 202.0 char main::i#2 // i zp[1]:2 151.5 char main::i#3 // i zp[1]:2 42.08333333333333 char main::i#4 // i zp[1]:2 202.0 char main::i#6 // i zp[1]:2 168.33333333333331 char main::key char main::key#0 // reg byte a 151.5 char main::row char main::row#1 // row zp[1]:6 151.5 char main::row#2 // row zp[1]:6 21.642857142857142 char main::row_pressed_bits char main::row_pressed_bits#0 // reg byte x 202.0 char main::row_pressed_bits#1 // reg byte x 667.3333333333334 char main::row_pressed_bits#2 // reg byte x 620.8 char *main::sc char *main::sc#1 // sc zp[2]:7 22.0 char *main::sc#2 // sc zp[2]:7 14.666666666666666 char *main::screen char *main::screen#1 // screen zp[2]:3 71.0 char *main::screen#13 // screen zp[2]:3 169.53846153846155 char *main::screen#2 // screen zp[2]:3 10.142857142857142 zp[2]:7 [ main::sc#2 main::sc#1 ] zp[1]:6 [ main::row#2 main::row#1 ] zp[2]:3 [ main::screen#13 main::screen#1 main::screen#2 ] reg byte x [ main::row_pressed_bits#2 main::row_pressed_bits#1 main::row_pressed_bits#0 ] reg byte y [ main::col#2 main::col#1 ] zp[1]:5 [ main::ch#2 main::ch#1 ] zp[1]:2 [ main::i#4 main::i#3 main::i#6 main::i#1 main::i#2 ] reg byte x [ keyboard_matrix_read::rowid#2 keyboard_matrix_read::rowid#0 keyboard_matrix_read::rowid#1 ] reg byte a [ keyboard_matrix_read::return#3 ] reg byte a [ main::$4 ] reg byte x [ keyboard_get_keycode::ch#0 ] reg byte a [ keyboard_get_keycode::return#2 ] reg byte a [ main::key#0 ] reg byte x [ keyboard_key_pressed::key#0 ] reg byte a [ keyboard_key_pressed::return#2 ] reg byte a [ main::$14 ] reg byte a [ keyboard_matrix_read::return#0 ] reg byte a [ keyboard_get_keycode::return#0 ] reg byte y [ keyboard_key_pressed::colidx#0 ] reg byte a [ keyboard_key_pressed::rowidx#0 ] reg byte a [ keyboard_matrix_read::return#2 ] reg byte a [ keyboard_key_pressed::$2 ] reg byte a [ keyboard_key_pressed::return#0 ] FINAL ASSEMBLER Score: 57707 // File Comments // Test keyboard input - in the keyboard matrix and mapping screen codes to key codes // Upstart // Commodore 64 PRG executable file .file [name="test-keyboard.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 .const KEY_3 = 8 .const KEY_W = 9 .const KEY_A = $a .const KEY_4 = $b .const KEY_Z = $c .const KEY_S = $d .const KEY_E = $e .const KEY_5 = $10 .const KEY_R = $11 .const KEY_D = $12 .const KEY_6 = $13 .const KEY_C = $14 .const KEY_F = $15 .const KEY_T = $16 .const KEY_X = $17 .const KEY_7 = $18 .const KEY_Y = $19 .const KEY_G = $1a .const KEY_8 = $1b .const KEY_B = $1c .const KEY_H = $1d .const KEY_U = $1e .const KEY_V = $1f .const KEY_9 = $20 .const KEY_I = $21 .const KEY_J = $22 .const KEY_0 = $23 .const KEY_M = $24 .const KEY_K = $25 .const KEY_O = $26 .const KEY_N = $27 .const KEY_PLUS = $28 .const KEY_P = $29 .const KEY_L = $2a .const KEY_MINUS = $2b .const KEY_DOT = $2c .const KEY_COLON = $2d .const KEY_AT = $2e .const KEY_COMMA = $2f .const KEY_POUND = $30 .const KEY_ASTERISK = $31 .const KEY_SEMICOLON = $32 .const KEY_EQUALS = $35 .const KEY_ARROW_UP = $36 .const KEY_SLASH = $37 .const KEY_1 = $38 .const KEY_ARROW_LEFT = $39 .const KEY_2 = $3b .const KEY_SPACE = $3c .const KEY_Q = $3e .const OFFSET_STRUCT_MOS6526_CIA_PORT_A_DDR = 2 .const OFFSET_STRUCT_MOS6526_CIA_PORT_B_DDR = 3 .const OFFSET_STRUCT_MOS6526_CIA_PORT_B = 1 /// $D012 RASTER Raster counter .label RASTER = $d012 /// The CIA#1: keyboard matrix, joystick #1/#2 .label CIA1 = $dc00 .segment Code // main main: { .label sc = 7 .label screen = 3 .label row = 6 .label ch = 5 // Checks all specific chars $00-$3f .label i = 2 // [1] phi from main to main::@1 [phi:main->main::@1] // [1] phi main::sc#2 = (char *) 1024 [phi:main->main::@1#0] -- pbuz1=pbuc1 lda #<$400 sta.z sc lda #>$400 sta.z sc+1 // Clear screen // main::@1 __b1: // for(byte* sc = (char*)$400; sc<$400+1000;sc++) // [2] if(main::sc#2<$400+$3e8) goto main::@2 -- pbuz1_lt_vwuc1_then_la1 lda.z sc+1 cmp #>$400+$3e8 bcs !__b2+ jmp __b2 !__b2: bne !+ lda.z sc cmp #<$400+$3e8 bcs !__b2+ jmp __b2 !__b2: !: // [3] phi from main::@1 to main::@3 [phi:main::@1->main::@3] // main::@3 // keyboard_init() // [4] call keyboard_init // Init keyboard jsr keyboard_init // main::@4 __b4: // while (*RASTER!=$ff) // [5] if(*RASTER!=$ff) goto main::@4 -- _deref_pbuc1_neq_vbuc2_then_la1 lda #$ff cmp RASTER bne __b4 // [6] phi from main::@4 to main::@5 [phi:main::@4->main::@5] // [6] phi main::screen#13 = (char *) 1024 [phi:main::@4->main::@5#0] -- pbuz1=pbuc1 lda #<$400 sta.z screen lda #>$400 sta.z screen+1 // [6] phi main::row#2 = 0 [phi:main::@4->main::@5#1] -- vbuz1=vbuc1 lda #0 sta.z row // Read & print keyboard matrix // [6] phi from main::@10 to main::@5 [phi:main::@10->main::@5] // [6] phi main::screen#13 = main::screen#1 [phi:main::@10->main::@5#0] -- register_copy // [6] phi main::row#2 = main::row#1 [phi:main::@10->main::@5#1] -- register_copy // main::@5 __b5: // byte row_pressed_bits = keyboard_matrix_read(row) // [7] keyboard_matrix_read::rowid#1 = main::row#2 -- vbuxx=vbuz1 ldx.z row // [8] call keyboard_matrix_read // [48] phi from main::@5 to keyboard_matrix_read [phi:main::@5->keyboard_matrix_read] // [48] phi keyboard_matrix_read::rowid#2 = keyboard_matrix_read::rowid#1 [phi:main::@5->keyboard_matrix_read#0] -- register_copy jsr keyboard_matrix_read // byte row_pressed_bits = keyboard_matrix_read(row) // [9] keyboard_matrix_read::return#3 = keyboard_matrix_read::return#0 // main::@17 // [10] main::row_pressed_bits#0 = keyboard_matrix_read::return#3 -- vbuxx=vbuaa tax // [11] phi from main::@17 to main::@6 [phi:main::@17->main::@6] // [11] phi main::col#2 = 0 [phi:main::@17->main::@6#0] -- vbuyy=vbuc1 ldy #0 // [11] phi main::row_pressed_bits#2 = main::row_pressed_bits#0 [phi:main::@17->main::@6#1] -- register_copy // [11] phi from main::@8 to main::@6 [phi:main::@8->main::@6] // [11] phi main::col#2 = main::col#1 [phi:main::@8->main::@6#0] -- register_copy // [11] phi main::row_pressed_bits#2 = main::row_pressed_bits#1 [phi:main::@8->main::@6#1] -- register_copy // main::@6 __b6: // row_pressed_bits & $80 // [12] main::$4 = main::row_pressed_bits#2 & $80 -- vbuaa=vbuxx_band_vbuc1 txa and #$80 // if( (row_pressed_bits & $80) != 0) // [13] if(main::$4!=0) goto main::@7 -- vbuaa_neq_0_then_la1 cmp #0 bne __b7 // main::@9 // screen[col] = '0' // [14] main::screen#13[main::col#2] = '0' -- pbuz1_derefidx_vbuyy=vbuc1 lda #'0' sta (screen),y // main::@8 __b8: // row_pressed_bits = row_pressed_bits * 2 // [15] main::row_pressed_bits#1 = main::row_pressed_bits#2 << 1 -- vbuxx=vbuxx_rol_1 txa asl tax // for(byte col : 0..7) // [16] main::col#1 = ++ main::col#2 -- vbuyy=_inc_vbuyy iny // [17] if(main::col#1!=8) goto main::@6 -- vbuyy_neq_vbuc1_then_la1 cpy #8 bne __b6 // main::@10 // screen = screen + 40 // [18] main::screen#1 = main::screen#13 + $28 -- pbuz1=pbuz1_plus_vbuc1 lda #$28 clc adc.z screen sta.z screen bcc !+ inc.z screen+1 !: // for(byte row : 0..7) // [19] main::row#1 = ++ main::row#2 -- vbuz1=_inc_vbuz1 inc.z row // [20] if(main::row#1!=8) goto main::@5 -- vbuz1_neq_vbuc1_then_la1 lda #8 cmp.z row bne __b5 // main::@11 // screen = screen + 40 // [21] main::screen#2 = main::screen#1 + $28 -- pbuz1=pbuz1_plus_vbuc1 lda #$28 clc adc.z screen sta.z screen bcc !+ inc.z screen+1 !: // [22] phi from main::@11 to main::@12 [phi:main::@11->main::@12] // [22] phi main::i#3 = 0 [phi:main::@11->main::@12#0] -- vbuz1=vbuc1 lda #0 sta.z i // [22] phi main::ch#2 = 0 [phi:main::@11->main::@12#1] -- vbuz1=vbuc1 sta.z ch // [22] phi from main::@13 to main::@12 [phi:main::@13->main::@12] // [22] phi main::i#3 = main::i#6 [phi:main::@13->main::@12#0] -- register_copy // [22] phi main::ch#2 = main::ch#1 [phi:main::@13->main::@12#1] -- register_copy // main::@12 __b12: // byte key = keyboard_get_keycode(ch) // [23] keyboard_get_keycode::ch#0 = main::ch#2 -- vbuxx=vbuz1 ldx.z ch // [24] call keyboard_get_keycode jsr keyboard_get_keycode // [25] keyboard_get_keycode::return#2 = keyboard_get_keycode::return#0 // main::@18 // [26] main::key#0 = keyboard_get_keycode::return#2 // if(key!=$3f) // [27] if(main::key#0==$3f) goto main::@13 -- vbuaa_eq_vbuc1_then_la1 cmp #$3f beq __b13 // main::@14 // keyboard_key_pressed(key) // [28] keyboard_key_pressed::key#0 = main::key#0 -- vbuxx=vbuaa tax // [29] call keyboard_key_pressed jsr keyboard_key_pressed // [30] keyboard_key_pressed::return#2 = keyboard_key_pressed::return#0 // main::@19 // [31] main::$14 = keyboard_key_pressed::return#2 // if(keyboard_key_pressed(key)!=0) // [32] if(main::$14==0) goto main::@13 -- vbuaa_eq_0_then_la1 cmp #0 beq __b13 // main::@15 // screen[i++] = ch // [33] main::screen#2[main::i#3] = main::ch#2 -- pbuz1_derefidx_vbuz2=vbuz3 lda.z ch ldy.z i sta (screen),y // screen[i++] = ch; // [34] main::i#1 = ++ main::i#3 -- vbuz1=_inc_vbuz1 inc.z i // [35] phi from main::@15 main::@18 main::@19 to main::@13 [phi:main::@15/main::@18/main::@19->main::@13] // [35] phi main::i#6 = main::i#1 [phi:main::@15/main::@18/main::@19->main::@13#0] -- register_copy // main::@13 __b13: // for( byte ch : 0..$3f ) // [36] main::ch#1 = ++ main::ch#2 -- vbuz1=_inc_vbuz1 inc.z ch // [37] if(main::ch#1!=$40) goto main::@12 -- vbuz1_neq_vbuc1_then_la1 lda #$40 cmp.z ch bne __b12 // [38] phi from main::@13 main::@16 to main::@16 [phi:main::@13/main::@16->main::@16] __b3: // [38] phi main::i#4 = main::i#6 [phi:main::@13/main::@16->main::@16#0] -- register_copy // Add some spaces // main::@16 // screen[i++] = ' ' // [39] main::screen#2[main::i#4] = ' ' -- pbuz1_derefidx_vbuz2=vbuc1 lda #' ' ldy.z i sta (screen),y // screen[i++] = ' '; // [40] main::i#2 = ++ main::i#4 -- vbuz1=_inc_vbuz1 inc.z i // while (i<5) // [41] if(main::i#2<5) goto main::@16 -- vbuz1_lt_vbuc1_then_la1 lda.z i cmp #5 bcc __b3 jmp __b4 // main::@7 __b7: // screen[col] = '1' // [42] main::screen#13[main::col#2] = '1' -- pbuz1_derefidx_vbuyy=vbuc1 lda #'1' sta (screen),y jmp __b8 // main::@2 __b2: // *sc = ' ' // [43] *main::sc#2 = ' ' -- _deref_pbuz1=vbuc1 lda #' ' ldy #0 sta (sc),y // for(byte* sc = (char*)$400; sc<$400+1000;sc++) // [44] main::sc#1 = ++ main::sc#2 -- pbuz1=_inc_pbuz1 inc.z sc bne !+ inc.z sc+1 !: // [1] phi from main::@2 to main::@1 [phi:main::@2->main::@1] // [1] phi main::sc#2 = main::sc#1 [phi:main::@2->main::@1#0] -- register_copy jmp __b1 } // keyboard_init // Initialize keyboard reading by setting CIA#1 Data Direction Registers keyboard_init: { // CIA1->PORT_A_DDR = 0xff // [45] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_A_DDR) = $ff -- _deref_pbuc1=vbuc2 // Keyboard Matrix Columns Write Mode lda #$ff sta CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_A_DDR // CIA1->PORT_B_DDR = 0x00 // [46] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B_DDR) = 0 -- _deref_pbuc1=vbuc2 // Keyboard Matrix Columns Read Mode lda #0 sta CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B_DDR // keyboard_init::@return // } // [47] return rts } // keyboard_matrix_read // Read a single row of the keyboard matrix // The row ID (0-7) of the keyboard matrix row to read. See the C64 key matrix for row IDs. // Returns the keys pressed on the row as bits according to the C64 key matrix. // Notice: If the C64 normal interrupt is still running it will occasionally interrupt right between the read & write // leading to erroneous readings. You must disable the normal interrupt or sei/cli around calls to the keyboard matrix reader. // __register(A) char keyboard_matrix_read(__register(X) char rowid) keyboard_matrix_read: { // CIA1->PORT_A = keyboard_matrix_row_bitmask[rowid] // [49] *((char *)CIA1) = keyboard_matrix_row_bitmask[keyboard_matrix_read::rowid#2] -- _deref_pbuc1=pbuc2_derefidx_vbuxx lda keyboard_matrix_row_bitmask,x sta CIA1 // char row_pressed_bits = ~CIA1->PORT_B // [50] keyboard_matrix_read::return#0 = ~ *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B) -- vbuaa=_bnot__deref_pbuc1 lda CIA1+OFFSET_STRUCT_MOS6526_CIA_PORT_B eor #$ff // keyboard_matrix_read::@return // } // [51] return rts } // keyboard_get_keycode // Get the keycode corresponding to a specific screen code character // ch is the character to get the key code for ($00-$3f) // Returns the key code corresponding to the passed character. Only characters with a non-shifted key are handled. // If there is no non-shifted key representing the char $3f is returned (representing RUN/STOP) . // __register(A) char keyboard_get_keycode(__register(X) char ch) keyboard_get_keycode: { // return keyboard_char_keycodes[ch]; // [52] keyboard_get_keycode::return#0 = keyboard_char_keycodes[keyboard_get_keycode::ch#0] -- vbuaa=pbuc1_derefidx_vbuxx lda keyboard_char_keycodes,x // keyboard_get_keycode::@return // } // [53] return rts } // keyboard_key_pressed // Determines whether a specific key is currently pressed by accessing the matrix directly // The key is a keyboard code defined from the keyboard matrix by %00rrrccc, where rrr is the row ID (0-7) and ccc is the column ID (0-7) // All keys exist as as KEY_XXX constants. // Returns zero if the key is not pressed and a non-zero value if the key is currently pressed // __register(A) char keyboard_key_pressed(__register(X) char key) keyboard_key_pressed: { // char colidx = key&7 // [54] keyboard_key_pressed::colidx#0 = keyboard_key_pressed::key#0 & 7 -- vbuyy=vbuxx_band_vbuc1 txa and #7 tay // char rowidx = key>>3 // [55] keyboard_key_pressed::rowidx#0 = keyboard_key_pressed::key#0 >> 3 -- vbuaa=vbuxx_ror_3 txa lsr lsr lsr // keyboard_matrix_read(rowidx) // [56] keyboard_matrix_read::rowid#0 = keyboard_key_pressed::rowidx#0 -- vbuxx=vbuaa tax // [57] call keyboard_matrix_read // [48] phi from keyboard_key_pressed to keyboard_matrix_read [phi:keyboard_key_pressed->keyboard_matrix_read] // [48] phi keyboard_matrix_read::rowid#2 = keyboard_matrix_read::rowid#0 [phi:keyboard_key_pressed->keyboard_matrix_read#0] -- register_copy jsr keyboard_matrix_read // keyboard_matrix_read(rowidx) // [58] keyboard_matrix_read::return#2 = keyboard_matrix_read::return#0 // keyboard_key_pressed::@1 // [59] keyboard_key_pressed::$2 = keyboard_matrix_read::return#2 // keyboard_matrix_read(rowidx) & keyboard_matrix_col_bitmask[colidx] // [60] keyboard_key_pressed::return#0 = keyboard_key_pressed::$2 & keyboard_matrix_col_bitmask[keyboard_key_pressed::colidx#0] -- vbuaa=vbuaa_band_pbuc1_derefidx_vbuyy and keyboard_matrix_col_bitmask,y // keyboard_key_pressed::@return // } // [61] return rts } // File Data .segment Data // Keycodes for each screen code character from $00-$3f. // Chars that do not have an unmodified keycode return $3f (representing RUN/STOP). keyboard_char_keycodes: .byte KEY_AT, KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, $3f, KEY_POUND, $3f, KEY_ARROW_UP, KEY_ARROW_LEFT, KEY_SPACE, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, KEY_ASTERISK, KEY_PLUS, KEY_COMMA, KEY_MINUS, KEY_DOT, KEY_SLASH, KEY_0, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_COLON, KEY_SEMICOLON, $3f, KEY_EQUALS, $3f, $3f // Keyboard row bitmask as expected by CIA#1 Port A when reading a specific keyboard matrix row (rows are numbered 0-7) keyboard_matrix_row_bitmask: .byte $fe, $fd, $fb, $f7, $ef, $df, $bf, $7f // Keyboard matrix column bitmasks for a specific keybooard matrix column when reading the keyboard. (columns are numbered 0-7) keyboard_matrix_col_bitmask: .byte 1, 2, 4, 8, $10, $20, $40, $80