kickc/src/test/ref/test-keyboard.log

2076 lines
93 KiB
Plaintext

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