1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-08-07 22:25:13 +00:00
Files
kickc/src/test/ref/examples/chargen/chargen-analysis.log

5322 lines
272 KiB
Plaintext

Identified constant variable (byte*) SCREEN
Inlined call (byte~) vicSelectGfxBank::$0 ← call toDd00 (byte*) vicSelectGfxBank::gfx
CONTROL FLOW GRAPH SSA
@begin: scope:[] from
(byte*) PROCPORT#0 ← ((byte*)) (byte/signed byte/word/signed word/dword/signed dword) 1
(byte*) CHARGEN#0 ← ((byte*)) (word/dword/signed dword) $d000
(byte*) CIA1_PORT_A#0 ← ((byte*)) (word/dword/signed dword) $dc00
(byte*) CIA1_PORT_B#0 ← ((byte*)) (word/dword/signed dword) $dc01
to:@9
mul8u: scope:[mul8u] from plot_chargen::@1
(byte) mul8u::a#5 ← phi( plot_chargen::@1/(byte) mul8u::a#1 )
(byte) mul8u::b#1 ← phi( plot_chargen::@1/(byte) mul8u::b#0 )
(word) mul8u::res#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(word) mul8u::mb#0 ← ((word)) (byte) mul8u::b#1
to:mul8u::@1
mul8u::@1: scope:[mul8u] from mul8u mul8u::@4
(word) mul8u::mb#5 ← phi( mul8u/(word) mul8u::mb#0 mul8u::@4/(word) mul8u::mb#1 )
(word) mul8u::res#4 ← phi( mul8u/(word) mul8u::res#0 mul8u::@4/(word) mul8u::res#6 )
(byte) mul8u::a#2 ← phi( mul8u/(byte) mul8u::a#5 mul8u::@4/(byte) mul8u::a#0 )
(bool~) mul8u::$0 ← (byte) mul8u::a#2 != (byte/signed byte/word/signed word/dword/signed dword) 0
if((bool~) mul8u::$0) goto mul8u::@2
to:mul8u::@3
mul8u::@2: scope:[mul8u] from mul8u::@1
(word) mul8u::res#5 ← phi( mul8u::@1/(word) mul8u::res#4 )
(word) mul8u::mb#4 ← phi( mul8u::@1/(word) mul8u::mb#5 )
(byte) mul8u::a#3 ← phi( mul8u::@1/(byte) mul8u::a#2 )
(byte~) mul8u::$1 ← (byte) mul8u::a#3 & (byte/signed byte/word/signed word/dword/signed dword) 1
(bool~) mul8u::$2 ← (byte~) mul8u::$1 != (byte/signed byte/word/signed word/dword/signed dword) 0
(bool~) mul8u::$3 ← ! (bool~) mul8u::$2
if((bool~) mul8u::$3) goto mul8u::@4
to:mul8u::@7
mul8u::@3: scope:[mul8u] from mul8u::@1
(word) mul8u::res#2 ← phi( mul8u::@1/(word) mul8u::res#4 )
(word) mul8u::return#0 ← (word) mul8u::res#2
to:mul8u::@return
mul8u::@4: scope:[mul8u] from mul8u::@2 mul8u::@7
(word) mul8u::res#6 ← phi( mul8u::@2/(word) mul8u::res#5 mul8u::@7/(word) mul8u::res#1 )
(word) mul8u::mb#2 ← phi( mul8u::@2/(word) mul8u::mb#4 mul8u::@7/(word) mul8u::mb#3 )
(byte) mul8u::a#4 ← phi( mul8u::@2/(byte) mul8u::a#3 mul8u::@7/(byte) mul8u::a#6 )
(byte~) mul8u::$5 ← (byte) mul8u::a#4 >> (byte/signed byte/word/signed word/dword/signed dword) 1
(byte) mul8u::a#0 ← (byte~) mul8u::$5
(word~) mul8u::$6 ← (word) mul8u::mb#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
(word) mul8u::mb#1 ← (word~) mul8u::$6
to:mul8u::@1
mul8u::@7: scope:[mul8u] from mul8u::@2
(byte) mul8u::a#6 ← phi( mul8u::@2/(byte) mul8u::a#3 )
(word) mul8u::mb#3 ← phi( mul8u::@2/(word) mul8u::mb#4 )
(word) mul8u::res#3 ← phi( mul8u::@2/(word) mul8u::res#5 )
(word~) mul8u::$4 ← (word) mul8u::res#3 + (word) mul8u::mb#3
(word) mul8u::res#1 ← (word~) mul8u::$4
to:mul8u::@4
mul8u::@return: scope:[mul8u] from mul8u::@3
(word) mul8u::return#3 ← phi( mul8u::@3/(word) mul8u::return#0 )
(word) mul8u::return#1 ← (word) mul8u::return#3
return
to:@return
@9: scope:[] from @begin
(byte) KEY_F7#0 ← (byte/signed byte/word/signed word/dword/signed dword) 3
(byte) KEY_F1#0 ← (byte/signed byte/word/signed word/dword/signed dword) 4
(byte) KEY_F3#0 ← (byte/signed byte/word/signed word/dword/signed dword) 5
(byte) KEY_F5#0 ← (byte/signed byte/word/signed word/dword/signed dword) 6
(byte) KEY_3#0 ← (byte/signed byte/word/signed word/dword/signed dword) 8
(byte) KEY_W#0 ← (byte/signed byte/word/signed word/dword/signed dword) 9
(byte) KEY_A#0 ← (byte/signed byte/word/signed word/dword/signed dword) $a
(byte) KEY_4#0 ← (byte/signed byte/word/signed word/dword/signed dword) $b
(byte) KEY_Z#0 ← (byte/signed byte/word/signed word/dword/signed dword) $c
(byte) KEY_S#0 ← (byte/signed byte/word/signed word/dword/signed dword) $d
(byte) KEY_E#0 ← (byte/signed byte/word/signed word/dword/signed dword) $e
(byte) KEY_LSHIFT#0 ← (byte/signed byte/word/signed word/dword/signed dword) $f
(byte) KEY_5#0 ← (byte/signed byte/word/signed word/dword/signed dword) $10
(byte) KEY_R#0 ← (byte/signed byte/word/signed word/dword/signed dword) $11
(byte) KEY_D#0 ← (byte/signed byte/word/signed word/dword/signed dword) $12
(byte) KEY_6#0 ← (byte/signed byte/word/signed word/dword/signed dword) $13
(byte) KEY_C#0 ← (byte/signed byte/word/signed word/dword/signed dword) $14
(byte) KEY_F#0 ← (byte/signed byte/word/signed word/dword/signed dword) $15
(byte) KEY_T#0 ← (byte/signed byte/word/signed word/dword/signed dword) $16
(byte) KEY_X#0 ← (byte/signed byte/word/signed word/dword/signed dword) $17
(byte) KEY_7#0 ← (byte/signed byte/word/signed word/dword/signed dword) $18
(byte) KEY_Y#0 ← (byte/signed byte/word/signed word/dword/signed dword) $19
(byte) KEY_G#0 ← (byte/signed byte/word/signed word/dword/signed dword) $1a
(byte) KEY_8#0 ← (byte/signed byte/word/signed word/dword/signed dword) $1b
(byte) KEY_B#0 ← (byte/signed byte/word/signed word/dword/signed dword) $1c
(byte) KEY_H#0 ← (byte/signed byte/word/signed word/dword/signed dword) $1d
(byte) KEY_U#0 ← (byte/signed byte/word/signed word/dword/signed dword) $1e
(byte) KEY_V#0 ← (byte/signed byte/word/signed word/dword/signed dword) $1f
(byte) KEY_9#0 ← (byte/signed byte/word/signed word/dword/signed dword) $20
(byte) KEY_I#0 ← (byte/signed byte/word/signed word/dword/signed dword) $21
(byte) KEY_J#0 ← (byte/signed byte/word/signed word/dword/signed dword) $22
(byte) KEY_0#0 ← (byte/signed byte/word/signed word/dword/signed dword) $23
(byte) KEY_M#0 ← (byte/signed byte/word/signed word/dword/signed dword) $24
(byte) KEY_K#0 ← (byte/signed byte/word/signed word/dword/signed dword) $25
(byte) KEY_O#0 ← (byte/signed byte/word/signed word/dword/signed dword) $26
(byte) KEY_N#0 ← (byte/signed byte/word/signed word/dword/signed dword) $27
(byte) KEY_PLUS#0 ← (byte/signed byte/word/signed word/dword/signed dword) $28
(byte) KEY_P#0 ← (byte/signed byte/word/signed word/dword/signed dword) $29
(byte) KEY_L#0 ← (byte/signed byte/word/signed word/dword/signed dword) $2a
(byte) KEY_MINUS#0 ← (byte/signed byte/word/signed word/dword/signed dword) $2b
(byte) KEY_DOT#0 ← (byte/signed byte/word/signed word/dword/signed dword) $2c
(byte) KEY_COLON#0 ← (byte/signed byte/word/signed word/dword/signed dword) $2d
(byte) KEY_AT#0 ← (byte/signed byte/word/signed word/dword/signed dword) $2e
(byte) KEY_COMMA#0 ← (byte/signed byte/word/signed word/dword/signed dword) $2f
(byte) KEY_POUND#0 ← (byte/signed byte/word/signed word/dword/signed dword) $30
(byte) KEY_ASTERISK#0 ← (byte/signed byte/word/signed word/dword/signed dword) $31
(byte) KEY_SEMICOLON#0 ← (byte/signed byte/word/signed word/dword/signed dword) $32
(byte) KEY_EQUALS#0 ← (byte/signed byte/word/signed word/dword/signed dword) $35
(byte) KEY_ARROW_UP#0 ← (byte/signed byte/word/signed word/dword/signed dword) $36
(byte) KEY_SLASH#0 ← (byte/signed byte/word/signed word/dword/signed dword) $37
(byte) KEY_1#0 ← (byte/signed byte/word/signed word/dword/signed dword) $38
(byte) KEY_ARROW_LEFT#0 ← (byte/signed byte/word/signed word/dword/signed dword) $39
(byte) KEY_2#0 ← (byte/signed byte/word/signed word/dword/signed dword) $3b
(byte) KEY_SPACE#0 ← (byte/signed byte/word/signed word/dword/signed dword) $3c
(byte) KEY_Q#0 ← (byte/signed byte/word/signed word/dword/signed dword) $3e
(byte[]) keyboard_char_keycodes#0 ← { (byte) KEY_AT#0, (byte) KEY_A#0, (byte) KEY_B#0, (byte) KEY_C#0, (byte) KEY_D#0, (byte) KEY_E#0, (byte) KEY_F#0, (byte) KEY_G#0, (byte) KEY_H#0, (byte) KEY_I#0, (byte) KEY_J#0, (byte) KEY_K#0, (byte) KEY_L#0, (byte) KEY_M#0, (byte) KEY_N#0, (byte) KEY_O#0, (byte) KEY_P#0, (byte) KEY_Q#0, (byte) KEY_R#0, (byte) KEY_S#0, (byte) KEY_T#0, (byte) KEY_U#0, (byte) KEY_V#0, (byte) KEY_W#0, (byte) KEY_X#0, (byte) KEY_Y#0, (byte) KEY_Z#0, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte) KEY_POUND#0, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte) KEY_ARROW_UP#0, (byte) KEY_ARROW_LEFT#0, (byte) KEY_SPACE#0, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte) KEY_ASTERISK#0, (byte) KEY_PLUS#0, (byte) KEY_COMMA#0, (byte) KEY_MINUS#0, (byte) KEY_DOT#0, (byte) KEY_SLASH#0, (byte) KEY_0#0, (byte) KEY_1#0, (byte) KEY_2#0, (byte) KEY_3#0, (byte) KEY_4#0, (byte) KEY_5#0, (byte) KEY_6#0, (byte) KEY_7#0, (byte) KEY_8#0, (byte) KEY_9#0, (byte) KEY_COLON#0, (byte) KEY_SEMICOLON#0, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte) KEY_EQUALS#0, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f }
(byte[8]) keyboard_matrix_row_bitmask#0 ← { (byte/word/signed word/dword/signed dword) $fe, (byte/word/signed word/dword/signed dword) $fd, (byte/word/signed word/dword/signed dword) $fb, (byte/word/signed word/dword/signed dword) $f7, (byte/word/signed word/dword/signed dword) $ef, (byte/word/signed word/dword/signed dword) $df, (byte/word/signed word/dword/signed dword) $bf, (byte/signed byte/word/signed word/dword/signed dword) $7f }
(byte[8]) keyboard_matrix_col_bitmask#0 ← { (byte/signed byte/word/signed word/dword/signed dword) 1, (byte/signed byte/word/signed word/dword/signed dword) 2, (byte/signed byte/word/signed word/dword/signed dword) 4, (byte/signed byte/word/signed word/dword/signed dword) 8, (byte/signed byte/word/signed word/dword/signed dword) $10, (byte/signed byte/word/signed word/dword/signed dword) $20, (byte/signed byte/word/signed word/dword/signed dword) $40, (byte/word/signed word/dword/signed dword) $80 }
to:@16
keyboard_matrix_read: scope:[keyboard_matrix_read] from keyboard_key_pressed
(byte) keyboard_matrix_read::rowid#1 ← phi( keyboard_key_pressed/(byte) keyboard_matrix_read::rowid#0 )
*((byte*) CIA1_PORT_A#0) ← *((byte[8]) keyboard_matrix_row_bitmask#0 + (byte) keyboard_matrix_read::rowid#1)
(byte~) keyboard_matrix_read::$0 ← ~ *((byte*) CIA1_PORT_B#0)
(byte) keyboard_matrix_read::row_pressed_bits#0 ← (byte~) keyboard_matrix_read::$0
(byte) keyboard_matrix_read::return#0 ← (byte) keyboard_matrix_read::row_pressed_bits#0
to:keyboard_matrix_read::@return
keyboard_matrix_read::@return: scope:[keyboard_matrix_read] from keyboard_matrix_read
(byte) keyboard_matrix_read::return#3 ← phi( keyboard_matrix_read/(byte) keyboard_matrix_read::return#0 )
(byte) keyboard_matrix_read::return#1 ← (byte) keyboard_matrix_read::return#3
return
to:@return
keyboard_key_pressed: scope:[keyboard_key_pressed] from main::@15 main::@5 main::@6 main::@7 main::@8 main::@9
(byte) keyboard_key_pressed::key#6 ← phi( main::@15/(byte) keyboard_key_pressed::key#5 main::@5/(byte) keyboard_key_pressed::key#0 main::@6/(byte) keyboard_key_pressed::key#1 main::@7/(byte) keyboard_key_pressed::key#2 main::@8/(byte) keyboard_key_pressed::key#3 main::@9/(byte) keyboard_key_pressed::key#4 )
(byte~) keyboard_key_pressed::$0 ← (byte) keyboard_key_pressed::key#6 & (byte/signed byte/word/signed word/dword/signed dword) 7
(byte) keyboard_key_pressed::colidx#0 ← (byte~) keyboard_key_pressed::$0
(byte~) keyboard_key_pressed::$1 ← (byte) keyboard_key_pressed::key#6 >> (byte/signed byte/word/signed word/dword/signed dword) 3
(byte) keyboard_key_pressed::rowidx#0 ← (byte~) keyboard_key_pressed::$1
(byte) keyboard_matrix_read::rowid#0 ← (byte) keyboard_key_pressed::rowidx#0
call keyboard_matrix_read
(byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#1
to:keyboard_key_pressed::@2
keyboard_key_pressed::@2: scope:[keyboard_key_pressed] from keyboard_key_pressed
(byte) keyboard_key_pressed::colidx#1 ← phi( keyboard_key_pressed/(byte) keyboard_key_pressed::colidx#0 )
(byte) keyboard_matrix_read::return#4 ← phi( keyboard_key_pressed/(byte) keyboard_matrix_read::return#2 )
(byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#4
(byte~) keyboard_key_pressed::$3 ← (byte~) keyboard_key_pressed::$2 & *((byte[8]) keyboard_matrix_col_bitmask#0 + (byte) keyboard_key_pressed::colidx#1)
(byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$3
to:keyboard_key_pressed::@return
keyboard_key_pressed::@return: scope:[keyboard_key_pressed] from keyboard_key_pressed::@2
(byte) keyboard_key_pressed::return#8 ← phi( keyboard_key_pressed::@2/(byte) keyboard_key_pressed::return#0 )
(byte) keyboard_key_pressed::return#1 ← (byte) keyboard_key_pressed::return#8
return
to:@return
keyboard_get_keycode: scope:[keyboard_get_keycode] from main::@12
(byte) keyboard_get_keycode::ch#1 ← phi( main::@12/(byte) keyboard_get_keycode::ch#0 )
(byte) keyboard_get_keycode::return#0 ← *((byte[]) keyboard_char_keycodes#0 + (byte) keyboard_get_keycode::ch#1)
to:keyboard_get_keycode::@return
keyboard_get_keycode::@return: scope:[keyboard_get_keycode] from keyboard_get_keycode
(byte) keyboard_get_keycode::return#3 ← phi( keyboard_get_keycode/(byte) keyboard_get_keycode::return#0 )
(byte) keyboard_get_keycode::return#1 ← (byte) keyboard_get_keycode::return#3
return
to:@return
@16: scope:[] from @9
(byte*) SCREEN#0 ← ((byte*)) (word/signed word/dword/signed dword) $400
to:@19
main: scope:[main] from @19
(byte*) main::sc#0 ← (byte*) SCREEN#0
to:main::@1
main::@1: scope:[main] from main main::@1
(byte*) main::sc#2 ← phi( main/(byte*) main::sc#0 main::@1/(byte*) main::sc#1 )
*((byte*) main::sc#2) ← (byte) ' '
(byte*) main::sc#1 ← ++ (byte*) main::sc#2
(byte*~) main::$11 ← (byte*) SCREEN#0 + (word/signed word/dword/signed dword) $3e8
(bool~) main::$12 ← (byte*) main::sc#1 < (byte*~) main::$11
if((bool~) main::$12) goto main::@1
to:main::@2
main::@2: scope:[main] from main::@1
(byte*~) main::$0 ← (byte*) SCREEN#0 + (byte/signed byte/word/signed word/dword/signed dword) 1
(byte*) print_str_at::str#0 ← (const string) main::str
(byte*) print_str_at::at#0 ← (byte*~) main::$0
call print_str_at
to:main::@25
main::@25: scope:[main] from main::@2
(byte*~) main::$2 ← (byte*) SCREEN#0 + (byte/signed byte/word/signed word/dword/signed dword) 1
(byte*~) main::$3 ← (byte*~) main::$2 + (byte/signed byte/word/signed word/dword/signed dword) $a
(byte*) print_str_at::str#1 ← (const string) main::str1
(byte*) print_str_at::at#1 ← (byte*~) main::$3
call print_str_at
to:main::@26
main::@26: scope:[main] from main::@25
(byte*~) main::$5 ← (byte*) SCREEN#0 + (byte/signed byte/word/signed word/dword/signed dword) 1
(byte*~) main::$6 ← (byte*~) main::$5 + (byte/signed byte/word/signed word/dword/signed dword) $14
(byte*) print_str_at::str#2 ← (const string) main::str2
(byte*) print_str_at::at#2 ← (byte*~) main::$6
call print_str_at
to:main::@27
main::@27: scope:[main] from main::@26
(byte*~) main::$8 ← (byte*) SCREEN#0 + (byte/signed byte/word/signed word/dword/signed dword) 1
(byte*~) main::$9 ← (byte*~) main::$8 + (byte/signed byte/word/signed word/dword/signed dword) $1e
(byte*) print_str_at::str#3 ← (const string) main::str3
(byte*) print_str_at::at#3 ← (byte*~) main::$9
call print_str_at
to:main::@28
main::@28: scope:[main] from main::@27
(byte) main::i#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@3
main::@3: scope:[main] from main::@28 main::@29
(byte) main::i#2 ← phi( main::@28/(byte) main::i#0 main::@29/(byte) main::i#1 )
(byte) plot_chargen::pos#0 ← (byte) main::i#2
(byte) plot_chargen::ch#0 ← (byte/signed byte/word/signed word/dword/signed dword) $20
(byte) plot_chargen::shift#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
call plot_chargen
to:main::@29
main::@29: scope:[main] from main::@3
(byte) main::i#3 ← phi( main::@3/(byte) main::i#2 )
(byte) main::i#1 ← (byte) main::i#3 + rangenext(0,3)
(bool~) main::$14 ← (byte) main::i#1 != rangelast(0,3)
if((bool~) main::$14) goto main::@3
to:main::@4
main::@4: scope:[main] from main::@29
(byte) main::cur_pos#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte) main::shift#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@5
main::@5: scope:[main] from main::@17 main::@4
(byte) main::cur_pos#25 ← phi( main::@17/(byte) main::cur_pos#26 main::@4/(byte) main::cur_pos#0 )
(byte) keyboard_key_pressed::key#0 ← (byte) KEY_F1#0
call keyboard_key_pressed
(byte) keyboard_key_pressed::return#2 ← (byte) keyboard_key_pressed::return#1
to:main::@30
main::@30: scope:[main] from main::@5
(byte) main::cur_pos#24 ← phi( main::@5/(byte) main::cur_pos#25 )
(byte) keyboard_key_pressed::return#9 ← phi( main::@5/(byte) keyboard_key_pressed::return#2 )
(byte~) main::$15 ← (byte) keyboard_key_pressed::return#9
(bool~) main::$16 ← (byte~) main::$15 != (byte/signed byte/word/signed word/dword/signed dword) 0
(bool~) main::$17 ← ! (bool~) main::$16
if((bool~) main::$17) goto main::@6
to:main::@19
main::@6: scope:[main] from main::@19 main::@30
(byte) main::cur_pos#23 ← phi( main::@19/(byte) main::cur_pos#1 main::@30/(byte) main::cur_pos#24 )
(byte) keyboard_key_pressed::key#1 ← (byte) KEY_F3#0
call keyboard_key_pressed
(byte) keyboard_key_pressed::return#3 ← (byte) keyboard_key_pressed::return#1
to:main::@31
main::@31: scope:[main] from main::@6
(byte) main::cur_pos#22 ← phi( main::@6/(byte) main::cur_pos#23 )
(byte) keyboard_key_pressed::return#10 ← phi( main::@6/(byte) keyboard_key_pressed::return#3 )
(byte~) main::$18 ← (byte) keyboard_key_pressed::return#10
(bool~) main::$19 ← (byte~) main::$18 != (byte/signed byte/word/signed word/dword/signed dword) 0
(bool~) main::$20 ← ! (bool~) main::$19
if((bool~) main::$20) goto main::@7
to:main::@20
main::@19: scope:[main] from main::@30
(byte) main::cur_pos#1 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@6
main::@7: scope:[main] from main::@20 main::@31
(byte) main::cur_pos#21 ← phi( main::@20/(byte) main::cur_pos#2 main::@31/(byte) main::cur_pos#22 )
(byte) keyboard_key_pressed::key#2 ← (byte) KEY_F5#0
call keyboard_key_pressed
(byte) keyboard_key_pressed::return#4 ← (byte) keyboard_key_pressed::return#1
to:main::@32
main::@32: scope:[main] from main::@7
(byte) main::cur_pos#20 ← phi( main::@7/(byte) main::cur_pos#21 )
(byte) keyboard_key_pressed::return#11 ← phi( main::@7/(byte) keyboard_key_pressed::return#4 )
(byte~) main::$21 ← (byte) keyboard_key_pressed::return#11
(bool~) main::$22 ← (byte~) main::$21 != (byte/signed byte/word/signed word/dword/signed dword) 0
(bool~) main::$23 ← ! (bool~) main::$22
if((bool~) main::$23) goto main::@8
to:main::@21
main::@20: scope:[main] from main::@31
(byte) main::cur_pos#2 ← (byte/signed byte/word/signed word/dword/signed dword) 1
to:main::@7
main::@8: scope:[main] from main::@21 main::@32
(byte) main::cur_pos#19 ← phi( main::@21/(byte) main::cur_pos#3 main::@32/(byte) main::cur_pos#20 )
(byte) keyboard_key_pressed::key#3 ← (byte) KEY_F7#0
call keyboard_key_pressed
(byte) keyboard_key_pressed::return#5 ← (byte) keyboard_key_pressed::return#1
to:main::@33
main::@33: scope:[main] from main::@8
(byte) main::cur_pos#18 ← phi( main::@8/(byte) main::cur_pos#19 )
(byte) keyboard_key_pressed::return#12 ← phi( main::@8/(byte) keyboard_key_pressed::return#5 )
(byte~) main::$24 ← (byte) keyboard_key_pressed::return#12
(bool~) main::$25 ← (byte~) main::$24 != (byte/signed byte/word/signed word/dword/signed dword) 0
(bool~) main::$26 ← ! (bool~) main::$25
if((bool~) main::$26) goto main::@9
to:main::@22
main::@21: scope:[main] from main::@32
(byte) main::cur_pos#3 ← (byte/signed byte/word/signed word/dword/signed dword) 2
to:main::@8
main::@9: scope:[main] from main::@22 main::@33
(byte) main::cur_pos#17 ← phi( main::@22/(byte) main::cur_pos#4 main::@33/(byte) main::cur_pos#18 )
(byte) keyboard_key_pressed::key#4 ← (byte) KEY_LSHIFT#0
call keyboard_key_pressed
(byte) keyboard_key_pressed::return#6 ← (byte) keyboard_key_pressed::return#1
to:main::@34
main::@34: scope:[main] from main::@9
(byte) main::cur_pos#16 ← phi( main::@9/(byte) main::cur_pos#17 )
(byte) keyboard_key_pressed::return#13 ← phi( main::@9/(byte) keyboard_key_pressed::return#6 )
(byte~) main::$27 ← (byte) keyboard_key_pressed::return#13
(bool~) main::$28 ← (byte~) main::$27 != (byte/signed byte/word/signed word/dword/signed dword) 0
if((bool~) main::$28) goto main::@10
to:main::@23
main::@22: scope:[main] from main::@33
(byte) main::cur_pos#4 ← (byte/signed byte/word/signed word/dword/signed dword) 3
to:main::@9
main::@10: scope:[main] from main::@34
(byte) main::cur_pos#13 ← phi( main::@34/(byte) main::cur_pos#16 )
(byte) main::shift#1 ← (byte/signed byte/word/signed word/dword/signed dword) 1
to:main::@11
main::@23: scope:[main] from main::@34
(byte) main::cur_pos#14 ← phi( main::@34/(byte) main::cur_pos#16 )
(byte) main::shift#2 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@11
main::@11: scope:[main] from main::@10 main::@23
(byte) main::shift#9 ← phi( main::@10/(byte) main::shift#1 main::@23/(byte) main::shift#2 )
(byte) main::cur_pos#11 ← phi( main::@10/(byte) main::cur_pos#13 main::@23/(byte) main::cur_pos#14 )
(byte) main::ch#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:main::@12
main::@12: scope:[main] from main::@11 main::@14
(byte) main::shift#7 ← phi( main::@11/(byte) main::shift#9 main::@14/(byte) main::shift#10 )
(byte) main::cur_pos#9 ← phi( main::@11/(byte) main::cur_pos#11 main::@14/(byte) main::cur_pos#12 )
(byte) main::ch#2 ← phi( main::@11/(byte) main::ch#0 main::@14/(byte) main::ch#1 )
(byte) main::pressed#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
(byte) keyboard_get_keycode::ch#0 ← (byte) main::ch#2
call keyboard_get_keycode
(byte) keyboard_get_keycode::return#2 ← (byte) keyboard_get_keycode::return#1
to:main::@35
main::@35: scope:[main] from main::@12
(byte) main::shift#5 ← phi( main::@12/(byte) main::shift#7 )
(byte) main::cur_pos#7 ← phi( main::@12/(byte) main::cur_pos#9 )
(byte) main::ch#7 ← phi( main::@12/(byte) main::ch#2 )
(byte) main::pressed#3 ← phi( main::@12/(byte) main::pressed#0 )
(byte) keyboard_get_keycode::return#4 ← phi( main::@12/(byte) keyboard_get_keycode::return#2 )
(byte~) main::$29 ← (byte) keyboard_get_keycode::return#4
(byte) main::key#0 ← (byte~) main::$29
(bool~) main::$30 ← (byte) main::key#0 != (byte/signed byte/word/signed word/dword/signed dword) $3f
(bool~) main::$31 ← ! (bool~) main::$30
if((bool~) main::$31) goto main::@13
to:main::@15
main::@13: scope:[main] from main::@35 main::@36
(byte) main::shift#4 ← phi( main::@35/(byte) main::shift#5 main::@36/(byte) main::shift#6 )
(byte) main::cur_pos#6 ← phi( main::@35/(byte) main::cur_pos#7 main::@36/(byte) main::cur_pos#8 )
(byte) main::ch#5 ← phi( main::@35/(byte) main::ch#7 main::@36/(byte) main::ch#8 )
(byte) main::pressed#2 ← phi( main::@35/(byte) main::pressed#3 main::@36/(byte) main::pressed#1 )
(bool~) main::$33 ← (byte) main::pressed#2 != (byte/signed byte/word/signed word/dword/signed dword) 0
(bool~) main::$34 ← ! (bool~) main::$33
if((bool~) main::$34) goto main::@14
to:main::@16
main::@15: scope:[main] from main::@35
(byte) main::shift#8 ← phi( main::@35/(byte) main::shift#5 )
(byte) main::cur_pos#10 ← phi( main::@35/(byte) main::cur_pos#7 )
(byte) main::ch#9 ← phi( main::@35/(byte) main::ch#7 )
(byte) main::key#1 ← phi( main::@35/(byte) main::key#0 )
(byte) keyboard_key_pressed::key#5 ← (byte) main::key#1
call keyboard_key_pressed
(byte) keyboard_key_pressed::return#7 ← (byte) keyboard_key_pressed::return#1
to:main::@36
main::@36: scope:[main] from main::@15
(byte) main::shift#6 ← phi( main::@15/(byte) main::shift#8 )
(byte) main::cur_pos#8 ← phi( main::@15/(byte) main::cur_pos#10 )
(byte) main::ch#8 ← phi( main::@15/(byte) main::ch#9 )
(byte) keyboard_key_pressed::return#14 ← phi( main::@15/(byte) keyboard_key_pressed::return#7 )
(byte~) main::$32 ← (byte) keyboard_key_pressed::return#14
(byte) main::pressed#1 ← (byte~) main::$32
to:main::@13
main::@14: scope:[main] from main::@13 main::@37
(byte) main::shift#10 ← phi( main::@13/(byte) main::shift#4 main::@37/(byte) main::shift#11 )
(byte) main::cur_pos#12 ← phi( main::@13/(byte) main::cur_pos#6 main::@37/(byte) main::cur_pos#15 )
(byte) main::ch#3 ← phi( main::@13/(byte) main::ch#5 main::@37/(byte) main::ch#6 )
(byte) main::ch#1 ← (byte) main::ch#3 + rangenext(0,$3f)
(bool~) main::$36 ← (byte) main::ch#1 != rangelast(0,$3f)
if((bool~) main::$36) goto main::@12
to:main::@17
main::@16: scope:[main] from main::@13
(byte) main::shift#3 ← phi( main::@13/(byte) main::shift#4 )
(byte) main::ch#4 ← phi( main::@13/(byte) main::ch#5 )
(byte) main::cur_pos#5 ← phi( main::@13/(byte) main::cur_pos#6 )
(byte) plot_chargen::pos#1 ← (byte) main::cur_pos#5
(byte) plot_chargen::ch#1 ← (byte) main::ch#4
(byte) plot_chargen::shift#1 ← (byte) main::shift#3
call plot_chargen
to:main::@37
main::@37: scope:[main] from main::@16
(byte) main::shift#11 ← phi( main::@16/(byte) main::shift#3 )
(byte) main::cur_pos#15 ← phi( main::@16/(byte) main::cur_pos#5 )
(byte) main::ch#6 ← phi( main::@16/(byte) main::ch#4 )
to:main::@14
main::@17: scope:[main] from main::@14
(byte) main::cur_pos#26 ← phi( main::@14/(byte) main::cur_pos#12 )
if(true) goto main::@5
to:main::@return
main::@return: scope:[main] from main::@17
return
to:@return
print_str_at: scope:[print_str_at] from main::@2 main::@25 main::@26 main::@27
(byte*) print_str_at::at#7 ← phi( main::@2/(byte*) print_str_at::at#0 main::@25/(byte*) print_str_at::at#1 main::@26/(byte*) print_str_at::at#2 main::@27/(byte*) print_str_at::at#3 )
(byte*) print_str_at::str#7 ← phi( main::@2/(byte*) print_str_at::str#0 main::@25/(byte*) print_str_at::str#1 main::@26/(byte*) print_str_at::str#2 main::@27/(byte*) print_str_at::str#3 )
to:print_str_at::@1
print_str_at::@1: scope:[print_str_at] from print_str_at print_str_at::@2
(byte*) print_str_at::at#6 ← phi( print_str_at/(byte*) print_str_at::at#7 print_str_at::@2/(byte*) print_str_at::at#4 )
(byte*) print_str_at::str#5 ← phi( print_str_at/(byte*) print_str_at::str#7 print_str_at::@2/(byte*) print_str_at::str#4 )
(bool~) print_str_at::$0 ← *((byte*) print_str_at::str#5) != (byte) '@'
if((bool~) print_str_at::$0) goto print_str_at::@2
to:print_str_at::@return
print_str_at::@2: scope:[print_str_at] from print_str_at::@1
(byte*) print_str_at::at#5 ← phi( print_str_at::@1/(byte*) print_str_at::at#6 )
(byte*) print_str_at::str#6 ← phi( print_str_at::@1/(byte*) print_str_at::str#5 )
*((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#6)
(byte*) print_str_at::at#4 ← ++ (byte*) print_str_at::at#5
(byte*) print_str_at::str#4 ← ++ (byte*) print_str_at::str#6
to:print_str_at::@1
print_str_at::@return: scope:[print_str_at] from print_str_at::@1
return
to:@return
plot_chargen: scope:[plot_chargen] from main::@16 main::@3
(byte) plot_chargen::pos#3 ← phi( main::@16/(byte) plot_chargen::pos#1 main::@3/(byte) plot_chargen::pos#0 )
(byte) plot_chargen::shift#2 ← phi( main::@16/(byte) plot_chargen::shift#1 main::@3/(byte) plot_chargen::shift#0 )
(byte) plot_chargen::ch#2 ← phi( main::@16/(byte) plot_chargen::ch#1 main::@3/(byte) plot_chargen::ch#0 )
asm { sei }
(word~) plot_chargen::$0 ← ((word)) (byte) plot_chargen::ch#2
(word/signed dword/dword~) plot_chargen::$1 ← (word~) plot_chargen::$0 * (byte/signed byte/word/signed word/dword/signed dword) 8
(byte*~) plot_chargen::$2 ← (byte*) CHARGEN#0 + (word/signed dword/dword~) plot_chargen::$1
(byte*) plot_chargen::chargen#0 ← (byte*~) plot_chargen::$2
(bool~) plot_chargen::$3 ← (byte) plot_chargen::shift#2 != (byte/signed byte/word/signed word/dword/signed dword) 0
(bool~) plot_chargen::$4 ← ! (bool~) plot_chargen::$3
if((bool~) plot_chargen::$4) goto plot_chargen::@1
to:plot_chargen::@2
plot_chargen::@1: scope:[plot_chargen] from plot_chargen plot_chargen::@2
(byte*) plot_chargen::chargen#6 ← phi( plot_chargen/(byte*) plot_chargen::chargen#0 plot_chargen::@2/(byte*) plot_chargen::chargen#1 )
(byte) plot_chargen::pos#2 ← phi( plot_chargen/(byte) plot_chargen::pos#3 plot_chargen::@2/(byte) plot_chargen::pos#4 )
*((byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $32
(byte*~) plot_chargen::$5 ← (byte*) SCREEN#0 + (byte/signed byte/word/signed word/dword/signed dword) $28
(byte*~) plot_chargen::$6 ← (byte*~) plot_chargen::$5 + (byte/signed byte/word/signed word/dword/signed dword) 1
(byte) mul8u::a#1 ← (byte) plot_chargen::pos#2
(byte) mul8u::b#0 ← (byte/signed byte/word/signed word/dword/signed dword) $a
call mul8u
(word) mul8u::return#2 ← (word) mul8u::return#1
to:plot_chargen::@9
plot_chargen::@9: scope:[plot_chargen] from plot_chargen::@1
(byte*) plot_chargen::chargen#5 ← phi( plot_chargen::@1/(byte*) plot_chargen::chargen#6 )
(word) mul8u::return#4 ← phi( plot_chargen::@1/(word) mul8u::return#2 )
(word~) plot_chargen::$7 ← (word) mul8u::return#4
(byte*~) plot_chargen::$8 ← (byte*~) plot_chargen::$6 + (word~) plot_chargen::$7
(byte*) plot_chargen::sc#0 ← (byte*~) plot_chargen::$8
(byte) plot_chargen::y#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:plot_chargen::@3
plot_chargen::@2: scope:[plot_chargen] from plot_chargen
(byte) plot_chargen::pos#4 ← phi( plot_chargen/(byte) plot_chargen::pos#3 )
(byte*) plot_chargen::chargen#2 ← phi( plot_chargen/(byte*) plot_chargen::chargen#0 )
(byte*~) plot_chargen::$9 ← (byte*) plot_chargen::chargen#2 + (word/signed word/dword/signed dword) $800
(byte*) plot_chargen::chargen#1 ← (byte*~) plot_chargen::$9
to:plot_chargen::@1
plot_chargen::@3: scope:[plot_chargen] from plot_chargen::@7 plot_chargen::@9
(byte*) plot_chargen::sc#7 ← phi( plot_chargen::@7/(byte*) plot_chargen::sc#2 plot_chargen::@9/(byte*) plot_chargen::sc#0 )
(byte) plot_chargen::y#2 ← phi( plot_chargen::@7/(byte) plot_chargen::y#1 plot_chargen::@9/(byte) plot_chargen::y#0 )
(byte*) plot_chargen::chargen#3 ← phi( plot_chargen::@7/(byte*) plot_chargen::chargen#4 plot_chargen::@9/(byte*) plot_chargen::chargen#5 )
(byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#3 + (byte) plot_chargen::y#2)
(byte) plot_chargen::x#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
to:plot_chargen::@4
plot_chargen::@4: scope:[plot_chargen] from plot_chargen::@3 plot_chargen::@5
(byte*) plot_chargen::chargen#8 ← phi( plot_chargen::@3/(byte*) plot_chargen::chargen#3 plot_chargen::@5/(byte*) plot_chargen::chargen#7 )
(byte) plot_chargen::y#5 ← phi( plot_chargen::@3/(byte) plot_chargen::y#2 plot_chargen::@5/(byte) plot_chargen::y#4 )
(byte) plot_chargen::x#3 ← phi( plot_chargen::@3/(byte) plot_chargen::x#0 plot_chargen::@5/(byte) plot_chargen::x#1 )
(byte*) plot_chargen::sc#5 ← phi( plot_chargen::@3/(byte*) plot_chargen::sc#7 plot_chargen::@5/(byte*) plot_chargen::sc#1 )
(byte) plot_chargen::bits#2 ← phi( plot_chargen::@3/(byte) plot_chargen::bits#0 plot_chargen::@5/(byte) plot_chargen::bits#1 )
(byte) plot_chargen::c#0 ← (byte) '.'
(byte~) plot_chargen::$10 ← (byte) plot_chargen::bits#2 & (byte/word/signed word/dword/signed dword) $80
(bool~) plot_chargen::$11 ← (byte~) plot_chargen::$10 != (byte/signed byte/word/signed word/dword/signed dword) 0
(bool~) plot_chargen::$12 ← ! (bool~) plot_chargen::$11
if((bool~) plot_chargen::$12) goto plot_chargen::@5
to:plot_chargen::@6
plot_chargen::@5: scope:[plot_chargen] from plot_chargen::@4 plot_chargen::@6
(byte*) plot_chargen::chargen#7 ← phi( plot_chargen::@4/(byte*) plot_chargen::chargen#8 plot_chargen::@6/(byte*) plot_chargen::chargen#9 )
(byte) plot_chargen::y#4 ← phi( plot_chargen::@4/(byte) plot_chargen::y#5 plot_chargen::@6/(byte) plot_chargen::y#6 )
(byte) plot_chargen::x#2 ← phi( plot_chargen::@4/(byte) plot_chargen::x#3 plot_chargen::@6/(byte) plot_chargen::x#4 )
(byte) plot_chargen::bits#3 ← phi( plot_chargen::@4/(byte) plot_chargen::bits#2 plot_chargen::@6/(byte) plot_chargen::bits#4 )
(byte*) plot_chargen::sc#3 ← phi( plot_chargen::@4/(byte*) plot_chargen::sc#5 plot_chargen::@6/(byte*) plot_chargen::sc#6 )
(byte) plot_chargen::c#2 ← phi( plot_chargen::@4/(byte) plot_chargen::c#0 plot_chargen::@6/(byte) plot_chargen::c#1 )
*((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2
(byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3
(byte/signed word/word/dword/signed dword~) plot_chargen::$13 ← (byte) plot_chargen::bits#3 * (byte/signed byte/word/signed word/dword/signed dword) 2
(byte) plot_chargen::bits#1 ← (byte/signed word/word/dword/signed dword~) plot_chargen::$13
(byte) plot_chargen::x#1 ← (byte) plot_chargen::x#2 + rangenext(0,7)
(bool~) plot_chargen::$14 ← (byte) plot_chargen::x#1 != rangelast(0,7)
if((bool~) plot_chargen::$14) goto plot_chargen::@4
to:plot_chargen::@7
plot_chargen::@6: scope:[plot_chargen] from plot_chargen::@4
(byte*) plot_chargen::chargen#9 ← phi( plot_chargen::@4/(byte*) plot_chargen::chargen#8 )
(byte) plot_chargen::y#6 ← phi( plot_chargen::@4/(byte) plot_chargen::y#5 )
(byte) plot_chargen::x#4 ← phi( plot_chargen::@4/(byte) plot_chargen::x#3 )
(byte) plot_chargen::bits#4 ← phi( plot_chargen::@4/(byte) plot_chargen::bits#2 )
(byte*) plot_chargen::sc#6 ← phi( plot_chargen::@4/(byte*) plot_chargen::sc#5 )
(byte) plot_chargen::c#1 ← (byte) '*'
to:plot_chargen::@5
plot_chargen::@7: scope:[plot_chargen] from plot_chargen::@5
(byte*) plot_chargen::chargen#4 ← phi( plot_chargen::@5/(byte*) plot_chargen::chargen#7 )
(byte) plot_chargen::y#3 ← phi( plot_chargen::@5/(byte) plot_chargen::y#4 )
(byte*) plot_chargen::sc#4 ← phi( plot_chargen::@5/(byte*) plot_chargen::sc#1 )
(byte*~) plot_chargen::$15 ← (byte*) plot_chargen::sc#4 + (byte/signed byte/word/signed word/dword/signed dword) $20
(byte*) plot_chargen::sc#2 ← (byte*~) plot_chargen::$15
(byte) plot_chargen::y#1 ← (byte) plot_chargen::y#3 + rangenext(0,7)
(bool~) plot_chargen::$16 ← (byte) plot_chargen::y#1 != rangelast(0,7)
if((bool~) plot_chargen::$16) goto plot_chargen::@3
to:plot_chargen::@8
plot_chargen::@8: scope:[plot_chargen] from plot_chargen::@7
*((byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $37
asm { cli }
to:plot_chargen::@return
plot_chargen::@return: scope:[plot_chargen] from plot_chargen::@8
return
to:@return
@19: scope:[] from @16
call main
to:@20
@20: scope:[] from @19
to:@end
@end: scope:[] from @20
SYMBOL TABLE SSA
(label) @16
(label) @19
(label) @20
(label) @9
(label) @begin
(label) @end
(byte*) CHARGEN
(byte*) CHARGEN#0
(byte*) CIA1_PORT_A
(byte*) CIA1_PORT_A#0
(byte*) CIA1_PORT_B
(byte*) CIA1_PORT_B#0
(byte) KEY_0
(byte) KEY_0#0
(byte) KEY_1
(byte) KEY_1#0
(byte) KEY_2
(byte) KEY_2#0
(byte) KEY_3
(byte) KEY_3#0
(byte) KEY_4
(byte) KEY_4#0
(byte) KEY_5
(byte) KEY_5#0
(byte) KEY_6
(byte) KEY_6#0
(byte) KEY_7
(byte) KEY_7#0
(byte) KEY_8
(byte) KEY_8#0
(byte) KEY_9
(byte) KEY_9#0
(byte) KEY_A
(byte) KEY_A#0
(byte) KEY_ARROW_LEFT
(byte) KEY_ARROW_LEFT#0
(byte) KEY_ARROW_UP
(byte) KEY_ARROW_UP#0
(byte) KEY_ASTERISK
(byte) KEY_ASTERISK#0
(byte) KEY_AT
(byte) KEY_AT#0
(byte) KEY_B
(byte) KEY_B#0
(byte) KEY_C
(byte) KEY_C#0
(byte) KEY_COLON
(byte) KEY_COLON#0
(byte) KEY_COMMA
(byte) KEY_COMMA#0
(byte) KEY_D
(byte) KEY_D#0
(byte) KEY_DOT
(byte) KEY_DOT#0
(byte) KEY_E
(byte) KEY_E#0
(byte) KEY_EQUALS
(byte) KEY_EQUALS#0
(byte) KEY_F
(byte) KEY_F#0
(byte) KEY_F1
(byte) KEY_F1#0
(byte) KEY_F3
(byte) KEY_F3#0
(byte) KEY_F5
(byte) KEY_F5#0
(byte) KEY_F7
(byte) KEY_F7#0
(byte) KEY_G
(byte) KEY_G#0
(byte) KEY_H
(byte) KEY_H#0
(byte) KEY_I
(byte) KEY_I#0
(byte) KEY_J
(byte) KEY_J#0
(byte) KEY_K
(byte) KEY_K#0
(byte) KEY_L
(byte) KEY_L#0
(byte) KEY_LSHIFT
(byte) KEY_LSHIFT#0
(byte) KEY_M
(byte) KEY_M#0
(byte) KEY_MINUS
(byte) KEY_MINUS#0
(byte) KEY_N
(byte) KEY_N#0
(byte) KEY_O
(byte) KEY_O#0
(byte) KEY_P
(byte) KEY_P#0
(byte) KEY_PLUS
(byte) KEY_PLUS#0
(byte) KEY_POUND
(byte) KEY_POUND#0
(byte) KEY_Q
(byte) KEY_Q#0
(byte) KEY_R
(byte) KEY_R#0
(byte) KEY_S
(byte) KEY_S#0
(byte) KEY_SEMICOLON
(byte) KEY_SEMICOLON#0
(byte) KEY_SLASH
(byte) KEY_SLASH#0
(byte) KEY_SPACE
(byte) KEY_SPACE#0
(byte) KEY_T
(byte) KEY_T#0
(byte) KEY_U
(byte) KEY_U#0
(byte) KEY_V
(byte) KEY_V#0
(byte) KEY_W
(byte) KEY_W#0
(byte) KEY_X
(byte) KEY_X#0
(byte) KEY_Y
(byte) KEY_Y#0
(byte) KEY_Z
(byte) KEY_Z#0
(byte*) PROCPORT
(byte*) PROCPORT#0
(byte*) SCREEN
(byte*) SCREEN#0
(byte[]) keyboard_char_keycodes
(byte[]) keyboard_char_keycodes#0
(byte()) keyboard_get_keycode((byte) keyboard_get_keycode::ch)
(label) keyboard_get_keycode::@return
(byte) keyboard_get_keycode::ch
(byte) keyboard_get_keycode::ch#0
(byte) keyboard_get_keycode::ch#1
(byte) keyboard_get_keycode::return
(byte) keyboard_get_keycode::return#0
(byte) keyboard_get_keycode::return#1
(byte) keyboard_get_keycode::return#2
(byte) keyboard_get_keycode::return#3
(byte) keyboard_get_keycode::return#4
(byte()) keyboard_key_pressed((byte) keyboard_key_pressed::key)
(byte~) keyboard_key_pressed::$0
(byte~) keyboard_key_pressed::$1
(byte~) keyboard_key_pressed::$2
(byte~) keyboard_key_pressed::$3
(label) keyboard_key_pressed::@2
(label) keyboard_key_pressed::@return
(byte) keyboard_key_pressed::colidx
(byte) keyboard_key_pressed::colidx#0
(byte) keyboard_key_pressed::colidx#1
(byte) keyboard_key_pressed::key
(byte) keyboard_key_pressed::key#0
(byte) keyboard_key_pressed::key#1
(byte) keyboard_key_pressed::key#2
(byte) keyboard_key_pressed::key#3
(byte) keyboard_key_pressed::key#4
(byte) keyboard_key_pressed::key#5
(byte) keyboard_key_pressed::key#6
(byte) keyboard_key_pressed::return
(byte) keyboard_key_pressed::return#0
(byte) keyboard_key_pressed::return#1
(byte) keyboard_key_pressed::return#10
(byte) keyboard_key_pressed::return#11
(byte) keyboard_key_pressed::return#12
(byte) keyboard_key_pressed::return#13
(byte) keyboard_key_pressed::return#14
(byte) keyboard_key_pressed::return#2
(byte) keyboard_key_pressed::return#3
(byte) keyboard_key_pressed::return#4
(byte) keyboard_key_pressed::return#5
(byte) keyboard_key_pressed::return#6
(byte) keyboard_key_pressed::return#7
(byte) keyboard_key_pressed::return#8
(byte) keyboard_key_pressed::return#9
(byte) keyboard_key_pressed::rowidx
(byte) keyboard_key_pressed::rowidx#0
(byte[8]) keyboard_matrix_col_bitmask
(byte[8]) keyboard_matrix_col_bitmask#0
(byte()) keyboard_matrix_read((byte) keyboard_matrix_read::rowid)
(byte~) keyboard_matrix_read::$0
(label) keyboard_matrix_read::@return
(byte) keyboard_matrix_read::return
(byte) keyboard_matrix_read::return#0
(byte) keyboard_matrix_read::return#1
(byte) keyboard_matrix_read::return#2
(byte) keyboard_matrix_read::return#3
(byte) keyboard_matrix_read::return#4
(byte) keyboard_matrix_read::row_pressed_bits
(byte) keyboard_matrix_read::row_pressed_bits#0
(byte) keyboard_matrix_read::rowid
(byte) keyboard_matrix_read::rowid#0
(byte) keyboard_matrix_read::rowid#1
(byte[8]) keyboard_matrix_row_bitmask
(byte[8]) keyboard_matrix_row_bitmask#0
(void()) main()
(byte*~) main::$0
(byte*~) main::$11
(bool~) main::$12
(bool~) main::$14
(byte~) main::$15
(bool~) main::$16
(bool~) main::$17
(byte~) main::$18
(bool~) main::$19
(byte*~) main::$2
(bool~) main::$20
(byte~) main::$21
(bool~) main::$22
(bool~) main::$23
(byte~) main::$24
(bool~) main::$25
(bool~) main::$26
(byte~) main::$27
(bool~) main::$28
(byte~) main::$29
(byte*~) main::$3
(bool~) main::$30
(bool~) main::$31
(byte~) main::$32
(bool~) main::$33
(bool~) main::$34
(bool~) main::$36
(byte*~) main::$5
(byte*~) main::$6
(byte*~) main::$8
(byte*~) main::$9
(label) main::@1
(label) main::@10
(label) main::@11
(label) main::@12
(label) main::@13
(label) main::@14
(label) main::@15
(label) main::@16
(label) main::@17
(label) main::@19
(label) main::@2
(label) main::@20
(label) main::@21
(label) main::@22
(label) main::@23
(label) main::@25
(label) main::@26
(label) main::@27
(label) main::@28
(label) main::@29
(label) main::@3
(label) main::@30
(label) main::@31
(label) main::@32
(label) main::@33
(label) main::@34
(label) main::@35
(label) main::@36
(label) main::@37
(label) main::@4
(label) main::@5
(label) main::@6
(label) main::@7
(label) main::@8
(label) main::@9
(label) main::@return
(byte) main::ch
(byte) main::ch#0
(byte) main::ch#1
(byte) main::ch#2
(byte) main::ch#3
(byte) main::ch#4
(byte) main::ch#5
(byte) main::ch#6
(byte) main::ch#7
(byte) main::ch#8
(byte) main::ch#9
(byte) main::cur_pos
(byte) main::cur_pos#0
(byte) main::cur_pos#1
(byte) main::cur_pos#10
(byte) main::cur_pos#11
(byte) main::cur_pos#12
(byte) main::cur_pos#13
(byte) main::cur_pos#14
(byte) main::cur_pos#15
(byte) main::cur_pos#16
(byte) main::cur_pos#17
(byte) main::cur_pos#18
(byte) main::cur_pos#19
(byte) main::cur_pos#2
(byte) main::cur_pos#20
(byte) main::cur_pos#21
(byte) main::cur_pos#22
(byte) main::cur_pos#23
(byte) main::cur_pos#24
(byte) main::cur_pos#25
(byte) main::cur_pos#26
(byte) main::cur_pos#3
(byte) main::cur_pos#4
(byte) main::cur_pos#5
(byte) main::cur_pos#6
(byte) main::cur_pos#7
(byte) main::cur_pos#8
(byte) main::cur_pos#9
(byte) main::i
(byte) main::i#0
(byte) main::i#1
(byte) main::i#2
(byte) main::i#3
(byte) main::key
(byte) main::key#0
(byte) main::key#1
(byte) main::pressed
(byte) main::pressed#0
(byte) main::pressed#1
(byte) main::pressed#2
(byte) main::pressed#3
(byte*) main::sc
(byte*) main::sc#0
(byte*) main::sc#1
(byte*) main::sc#2
(byte) main::shift
(byte) main::shift#0
(byte) main::shift#1
(byte) main::shift#10
(byte) main::shift#11
(byte) main::shift#2
(byte) main::shift#3
(byte) main::shift#4
(byte) main::shift#5
(byte) main::shift#6
(byte) main::shift#7
(byte) main::shift#8
(byte) main::shift#9
(const string) main::str = (string) "f1@"
(const string) main::str1 = (string) "f3@"
(const string) main::str2 = (string) "f5@"
(const string) main::str3 = (string) "f7@"
(word()) mul8u((byte) mul8u::a , (byte) mul8u::b)
(bool~) mul8u::$0
(byte~) mul8u::$1
(bool~) mul8u::$2
(bool~) mul8u::$3
(word~) mul8u::$4
(byte~) mul8u::$5
(word~) mul8u::$6
(label) mul8u::@1
(label) mul8u::@2
(label) mul8u::@3
(label) mul8u::@4
(label) mul8u::@7
(label) mul8u::@return
(byte) mul8u::a
(byte) mul8u::a#0
(byte) mul8u::a#1
(byte) mul8u::a#2
(byte) mul8u::a#3
(byte) mul8u::a#4
(byte) mul8u::a#5
(byte) mul8u::a#6
(byte) mul8u::b
(byte) mul8u::b#0
(byte) mul8u::b#1
(word) mul8u::mb
(word) mul8u::mb#0
(word) mul8u::mb#1
(word) mul8u::mb#2
(word) mul8u::mb#3
(word) mul8u::mb#4
(word) mul8u::mb#5
(word) mul8u::res
(word) mul8u::res#0
(word) mul8u::res#1
(word) mul8u::res#2
(word) mul8u::res#3
(word) mul8u::res#4
(word) mul8u::res#5
(word) mul8u::res#6
(word) mul8u::return
(word) mul8u::return#0
(word) mul8u::return#1
(word) mul8u::return#2
(word) mul8u::return#3
(word) mul8u::return#4
(void()) plot_chargen((byte) plot_chargen::pos , (byte) plot_chargen::ch , (byte) plot_chargen::shift)
(word~) plot_chargen::$0
(word/signed dword/dword~) plot_chargen::$1
(byte~) plot_chargen::$10
(bool~) plot_chargen::$11
(bool~) plot_chargen::$12
(byte/signed word/word/dword/signed dword~) plot_chargen::$13
(bool~) plot_chargen::$14
(byte*~) plot_chargen::$15
(bool~) plot_chargen::$16
(byte*~) plot_chargen::$2
(bool~) plot_chargen::$3
(bool~) plot_chargen::$4
(byte*~) plot_chargen::$5
(byte*~) plot_chargen::$6
(word~) plot_chargen::$7
(byte*~) plot_chargen::$8
(byte*~) plot_chargen::$9
(label) plot_chargen::@1
(label) plot_chargen::@2
(label) plot_chargen::@3
(label) plot_chargen::@4
(label) plot_chargen::@5
(label) plot_chargen::@6
(label) plot_chargen::@7
(label) plot_chargen::@8
(label) plot_chargen::@9
(label) plot_chargen::@return
(byte) plot_chargen::bits
(byte) plot_chargen::bits#0
(byte) plot_chargen::bits#1
(byte) plot_chargen::bits#2
(byte) plot_chargen::bits#3
(byte) plot_chargen::bits#4
(byte) plot_chargen::c
(byte) plot_chargen::c#0
(byte) plot_chargen::c#1
(byte) plot_chargen::c#2
(byte) plot_chargen::ch
(byte) plot_chargen::ch#0
(byte) plot_chargen::ch#1
(byte) plot_chargen::ch#2
(byte*) plot_chargen::chargen
(byte*) plot_chargen::chargen#0
(byte*) plot_chargen::chargen#1
(byte*) plot_chargen::chargen#2
(byte*) plot_chargen::chargen#3
(byte*) plot_chargen::chargen#4
(byte*) plot_chargen::chargen#5
(byte*) plot_chargen::chargen#6
(byte*) plot_chargen::chargen#7
(byte*) plot_chargen::chargen#8
(byte*) plot_chargen::chargen#9
(byte) plot_chargen::pos
(byte) plot_chargen::pos#0
(byte) plot_chargen::pos#1
(byte) plot_chargen::pos#2
(byte) plot_chargen::pos#3
(byte) plot_chargen::pos#4
(byte*) plot_chargen::sc
(byte*) plot_chargen::sc#0
(byte*) plot_chargen::sc#1
(byte*) plot_chargen::sc#2
(byte*) plot_chargen::sc#3
(byte*) plot_chargen::sc#4
(byte*) plot_chargen::sc#5
(byte*) plot_chargen::sc#6
(byte*) plot_chargen::sc#7
(byte) plot_chargen::shift
(byte) plot_chargen::shift#0
(byte) plot_chargen::shift#1
(byte) plot_chargen::shift#2
(byte) plot_chargen::x
(byte) plot_chargen::x#0
(byte) plot_chargen::x#1
(byte) plot_chargen::x#2
(byte) plot_chargen::x#3
(byte) plot_chargen::x#4
(byte) plot_chargen::y
(byte) plot_chargen::y#0
(byte) plot_chargen::y#1
(byte) plot_chargen::y#2
(byte) plot_chargen::y#3
(byte) plot_chargen::y#4
(byte) plot_chargen::y#5
(byte) plot_chargen::y#6
(void()) print_str_at((byte*) print_str_at::str , (byte*) print_str_at::at)
(bool~) print_str_at::$0
(label) print_str_at::@1
(label) print_str_at::@2
(label) print_str_at::@return
(byte*) print_str_at::at
(byte*) print_str_at::at#0
(byte*) print_str_at::at#1
(byte*) print_str_at::at#2
(byte*) print_str_at::at#3
(byte*) print_str_at::at#4
(byte*) print_str_at::at#5
(byte*) print_str_at::at#6
(byte*) print_str_at::at#7
(byte*) print_str_at::str
(byte*) print_str_at::str#0
(byte*) print_str_at::str#1
(byte*) print_str_at::str#2
(byte*) print_str_at::str#3
(byte*) print_str_at::str#4
(byte*) print_str_at::str#5
(byte*) print_str_at::str#6
(byte*) print_str_at::str#7
Culled Empty Block (label) @20
Successful SSA optimization Pass2CullEmptyBlocks
Inversing boolean not [13] (bool~) mul8u::$3 ← (byte~) mul8u::$1 == (byte/signed byte/word/signed word/dword/signed dword) 0 from [12] (bool~) mul8u::$2 ← (byte~) mul8u::$1 != (byte/signed byte/word/signed word/dword/signed dword) 0
Inversing boolean not [160] (bool~) main::$17 ← (byte~) main::$15 == (byte/signed byte/word/signed word/dword/signed dword) 0 from [159] (bool~) main::$16 ← (byte~) main::$15 != (byte/signed byte/word/signed word/dword/signed dword) 0
Inversing boolean not [169] (bool~) main::$20 ← (byte~) main::$18 == (byte/signed byte/word/signed word/dword/signed dword) 0 from [168] (bool~) main::$19 ← (byte~) main::$18 != (byte/signed byte/word/signed word/dword/signed dword) 0
Inversing boolean not [179] (bool~) main::$23 ← (byte~) main::$21 == (byte/signed byte/word/signed word/dword/signed dword) 0 from [178] (bool~) main::$22 ← (byte~) main::$21 != (byte/signed byte/word/signed word/dword/signed dword) 0
Inversing boolean not [189] (bool~) main::$26 ← (byte~) main::$24 == (byte/signed byte/word/signed word/dword/signed dword) 0 from [188] (bool~) main::$25 ← (byte~) main::$24 != (byte/signed byte/word/signed word/dword/signed dword) 0
Inversing boolean not [216] (bool~) main::$31 ← (byte) main::key#0 == (byte/signed byte/word/signed word/dword/signed dword) $3f from [215] (bool~) main::$30 ← (byte) main::key#0 != (byte/signed byte/word/signed word/dword/signed dword) $3f
Inversing boolean not [220] (bool~) main::$34 ← (byte) main::pressed#2 == (byte/signed byte/word/signed word/dword/signed dword) 0 from [219] (bool~) main::$33 ← (byte) main::pressed#2 != (byte/signed byte/word/signed word/dword/signed dword) 0
Inversing boolean not [258] (bool~) plot_chargen::$4 ← (byte) plot_chargen::shift#2 == (byte/signed byte/word/signed word/dword/signed dword) 0 from [257] (bool~) plot_chargen::$3 ← (byte) plot_chargen::shift#2 != (byte/signed byte/word/signed word/dword/signed dword) 0
Inversing boolean not [283] (bool~) plot_chargen::$12 ← (byte~) plot_chargen::$10 == (byte/signed byte/word/signed word/dword/signed dword) 0 from [282] (bool~) plot_chargen::$11 ← (byte~) plot_chargen::$10 != (byte/signed byte/word/signed word/dword/signed dword) 0
Successful SSA optimization Pass2UnaryNotSimplification
Alias (byte) mul8u::a#2 = (byte) mul8u::a#3 (byte) mul8u::a#6
Alias (word) mul8u::mb#3 = (word) mul8u::mb#4 (word) mul8u::mb#5
Alias (word) mul8u::res#2 = (word) mul8u::res#5 (word) mul8u::res#4 (word) mul8u::return#0 (word) mul8u::res#3 (word) mul8u::return#3 (word) mul8u::return#1
Alias (byte) mul8u::a#0 = (byte~) mul8u::$5
Alias (word) mul8u::mb#1 = (word~) mul8u::$6
Alias (word) mul8u::res#1 = (word~) mul8u::$4
Alias (byte) keyboard_matrix_read::return#0 = (byte) keyboard_matrix_read::row_pressed_bits#0 (byte~) keyboard_matrix_read::$0 (byte) keyboard_matrix_read::return#3 (byte) keyboard_matrix_read::return#1
Alias (byte) keyboard_key_pressed::colidx#0 = (byte~) keyboard_key_pressed::$0 (byte) keyboard_key_pressed::colidx#1
Alias (byte) keyboard_key_pressed::rowidx#0 = (byte~) keyboard_key_pressed::$1
Alias (byte) keyboard_matrix_read::return#2 = (byte) keyboard_matrix_read::return#4
Alias (byte) keyboard_key_pressed::return#0 = (byte~) keyboard_key_pressed::$3 (byte) keyboard_key_pressed::return#8 (byte) keyboard_key_pressed::return#1
Alias (byte) keyboard_get_keycode::return#0 = (byte) keyboard_get_keycode::return#3 (byte) keyboard_get_keycode::return#1
Alias (byte*) print_str_at::at#0 = (byte*~) main::$0
Alias (byte*) print_str_at::at#1 = (byte*~) main::$3
Alias (byte*) print_str_at::at#2 = (byte*~) main::$6
Alias (byte*) print_str_at::at#3 = (byte*~) main::$9
Alias (byte) main::i#2 = (byte) main::i#3
Alias (byte) keyboard_key_pressed::return#2 = (byte) keyboard_key_pressed::return#9
Alias (byte) main::cur_pos#24 = (byte) main::cur_pos#25
Alias (byte) keyboard_key_pressed::return#10 = (byte) keyboard_key_pressed::return#3
Alias (byte) main::cur_pos#22 = (byte) main::cur_pos#23
Alias (byte) keyboard_key_pressed::return#11 = (byte) keyboard_key_pressed::return#4
Alias (byte) main::cur_pos#20 = (byte) main::cur_pos#21
Alias (byte) keyboard_key_pressed::return#12 = (byte) keyboard_key_pressed::return#5
Alias (byte) main::cur_pos#18 = (byte) main::cur_pos#19
Alias (byte) keyboard_key_pressed::return#13 = (byte) keyboard_key_pressed::return#6
Alias (byte) main::cur_pos#13 = (byte) main::cur_pos#16 (byte) main::cur_pos#17 (byte) main::cur_pos#14
Alias (byte) keyboard_get_keycode::return#2 = (byte) keyboard_get_keycode::return#4
Alias (byte) main::pressed#0 = (byte) main::pressed#3
Alias (byte) main::ch#2 = (byte) main::ch#7 (byte) main::ch#9 (byte) main::ch#8
Alias (byte) main::cur_pos#10 = (byte) main::cur_pos#7 (byte) main::cur_pos#9 (byte) main::cur_pos#8
Alias (byte) main::shift#5 = (byte) main::shift#7 (byte) main::shift#8 (byte) main::shift#6
Alias (byte) main::key#0 = (byte~) main::$29 (byte) main::key#1
Alias (byte) keyboard_key_pressed::return#14 = (byte) keyboard_key_pressed::return#7
Alias (byte) main::pressed#1 = (byte~) main::$32
Alias (byte) main::cur_pos#15 = (byte) main::cur_pos#5 (byte) main::cur_pos#6
Alias (byte) main::ch#4 = (byte) main::ch#5 (byte) main::ch#6
Alias (byte) main::shift#11 = (byte) main::shift#3 (byte) main::shift#4
Alias (byte) main::cur_pos#12 = (byte) main::cur_pos#26
Alias (byte*) print_str_at::str#5 = (byte*) print_str_at::str#6
Alias (byte*) print_str_at::at#5 = (byte*) print_str_at::at#6
Alias (byte*) plot_chargen::chargen#0 = (byte*~) plot_chargen::$2 (byte*) plot_chargen::chargen#2
Alias (word) mul8u::return#2 = (word) mul8u::return#4
Alias (byte*) plot_chargen::chargen#5 = (byte*) plot_chargen::chargen#6
Alias (byte*) plot_chargen::sc#0 = (byte*~) plot_chargen::$8
Alias (byte) plot_chargen::pos#3 = (byte) plot_chargen::pos#4
Alias (byte*) plot_chargen::chargen#1 = (byte*~) plot_chargen::$9
Alias (byte) plot_chargen::bits#1 = (byte/signed word/word/dword/signed dword~) plot_chargen::$13
Alias (byte*) plot_chargen::sc#5 = (byte*) plot_chargen::sc#6
Alias (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#4
Alias (byte) plot_chargen::x#3 = (byte) plot_chargen::x#4
Alias (byte) plot_chargen::y#5 = (byte) plot_chargen::y#6
Alias (byte*) plot_chargen::chargen#8 = (byte*) plot_chargen::chargen#9
Alias (byte*) plot_chargen::sc#1 = (byte*) plot_chargen::sc#4
Alias (byte) plot_chargen::y#3 = (byte) plot_chargen::y#4
Alias (byte*) plot_chargen::chargen#4 = (byte*) plot_chargen::chargen#7
Alias (byte*) plot_chargen::sc#2 = (byte*~) plot_chargen::$15
Successful SSA optimization Pass2AliasElimination
Alias (byte) mul8u::a#2 = (byte) mul8u::a#4
Alias (word) mul8u::mb#2 = (word) mul8u::mb#3
Alias (byte) main::cur_pos#11 = (byte) main::cur_pos#13
Alias (byte) main::ch#2 = (byte) main::ch#4 (byte) main::ch#3
Alias (byte) main::cur_pos#10 = (byte) main::cur_pos#15 (byte) main::cur_pos#12
Alias (byte) main::shift#10 = (byte) main::shift#11 (byte) main::shift#5
Alias (byte) plot_chargen::pos#2 = (byte) plot_chargen::pos#3
Alias (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#5
Alias (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#3
Alias (byte) plot_chargen::x#2 = (byte) plot_chargen::x#3
Alias (byte) plot_chargen::y#3 = (byte) plot_chargen::y#5
Alias (byte*) plot_chargen::chargen#4 = (byte*) plot_chargen::chargen#8
Successful SSA optimization Pass2AliasElimination
Self Phi Eliminated (byte) main::cur_pos#10
Self Phi Eliminated (byte) main::shift#10
Self Phi Eliminated (byte) plot_chargen::y#3
Self Phi Eliminated (byte*) plot_chargen::chargen#4
Successful SSA optimization Pass2SelfPhiElimination
Redundant Phi (byte) mul8u::b#1 (byte) mul8u::b#0
Redundant Phi (byte) mul8u::a#5 (byte) mul8u::a#1
Redundant Phi (byte) keyboard_matrix_read::rowid#1 (byte) keyboard_matrix_read::rowid#0
Redundant Phi (byte) keyboard_get_keycode::ch#1 (byte) keyboard_get_keycode::ch#0
Redundant Phi (byte) main::cur_pos#10 (byte) main::cur_pos#11
Redundant Phi (byte) main::shift#10 (byte) main::shift#9
Redundant Phi (byte) plot_chargen::y#3 (byte) plot_chargen::y#2
Redundant Phi (byte*) plot_chargen::chargen#4 (byte*) plot_chargen::chargen#3
Successful SSA optimization Pass2RedundantPhiElimination
Simple Condition (bool~) mul8u::$0 [9] if((byte) mul8u::a#2!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mul8u::@2
Simple Condition (bool~) mul8u::$3 [14] if((byte~) mul8u::$1==(byte/signed byte/word/signed word/dword/signed dword) 0) goto mul8u::@4
Simple Condition (bool~) main::$12 [121] if((byte*) main::sc#1<(byte*~) main::$11) goto main::@1
Simple Condition (bool~) main::$14 [150] if((byte) main::i#1!=rangelast(0,3)) goto main::@3
Simple Condition (bool~) main::$17 [161] if((byte~) main::$15==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@6
Simple Condition (bool~) main::$20 [170] if((byte~) main::$18==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@7
Simple Condition (bool~) main::$23 [180] if((byte~) main::$21==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@8
Simple Condition (bool~) main::$26 [190] if((byte~) main::$24==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@9
Simple Condition (bool~) main::$28 [199] if((byte~) main::$27!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@10
Simple Condition (bool~) main::$31 [217] if((byte) main::key#0==(byte/signed byte/word/signed word/dword/signed dword) $3f) goto main::@13
Simple Condition (bool~) main::$34 [221] if((byte) main::pressed#2==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@14
Simple Condition (bool~) main::$36 [232] if((byte) main::ch#1!=rangelast(0,$3f)) goto main::@12
Simple Condition (bool~) print_str_at::$0 [245] if(*((byte*) print_str_at::str#5)!=(byte) '@') goto print_str_at::@2
Simple Condition (bool~) plot_chargen::$4 [259] if((byte) plot_chargen::shift#2==(byte/signed byte/word/signed word/dword/signed dword) 0) goto plot_chargen::@1
Simple Condition (bool~) plot_chargen::$12 [284] if((byte~) plot_chargen::$10==(byte/signed byte/word/signed word/dword/signed dword) 0) goto plot_chargen::@5
Simple Condition (bool~) plot_chargen::$14 [292] if((byte) plot_chargen::x#1!=rangelast(0,7)) goto plot_chargen::@4
Simple Condition (bool~) plot_chargen::$16 [300] if((byte) plot_chargen::y#1!=rangelast(0,7)) goto plot_chargen::@3
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte*) PROCPORT#0 = ((byte*))1
Constant (const byte*) CHARGEN#0 = ((byte*))$d000
Constant (const byte*) CIA1_PORT_A#0 = ((byte*))$dc00
Constant (const byte*) CIA1_PORT_B#0 = ((byte*))$dc01
Constant (const word) mul8u::res#0 = 0
Constant (const byte) KEY_F7#0 = 3
Constant (const byte) KEY_F1#0 = 4
Constant (const byte) KEY_F3#0 = 5
Constant (const byte) KEY_F5#0 = 6
Constant (const byte) KEY_3#0 = 8
Constant (const byte) KEY_W#0 = 9
Constant (const byte) KEY_A#0 = $a
Constant (const byte) KEY_4#0 = $b
Constant (const byte) KEY_Z#0 = $c
Constant (const byte) KEY_S#0 = $d
Constant (const byte) KEY_E#0 = $e
Constant (const byte) KEY_LSHIFT#0 = $f
Constant (const byte) KEY_5#0 = $10
Constant (const byte) KEY_R#0 = $11
Constant (const byte) KEY_D#0 = $12
Constant (const byte) KEY_6#0 = $13
Constant (const byte) KEY_C#0 = $14
Constant (const byte) KEY_F#0 = $15
Constant (const byte) KEY_T#0 = $16
Constant (const byte) KEY_X#0 = $17
Constant (const byte) KEY_7#0 = $18
Constant (const byte) KEY_Y#0 = $19
Constant (const byte) KEY_G#0 = $1a
Constant (const byte) KEY_8#0 = $1b
Constant (const byte) KEY_B#0 = $1c
Constant (const byte) KEY_H#0 = $1d
Constant (const byte) KEY_U#0 = $1e
Constant (const byte) KEY_V#0 = $1f
Constant (const byte) KEY_9#0 = $20
Constant (const byte) KEY_I#0 = $21
Constant (const byte) KEY_J#0 = $22
Constant (const byte) KEY_0#0 = $23
Constant (const byte) KEY_M#0 = $24
Constant (const byte) KEY_K#0 = $25
Constant (const byte) KEY_O#0 = $26
Constant (const byte) KEY_N#0 = $27
Constant (const byte) KEY_PLUS#0 = $28
Constant (const byte) KEY_P#0 = $29
Constant (const byte) KEY_L#0 = $2a
Constant (const byte) KEY_MINUS#0 = $2b
Constant (const byte) KEY_DOT#0 = $2c
Constant (const byte) KEY_COLON#0 = $2d
Constant (const byte) KEY_AT#0 = $2e
Constant (const byte) KEY_COMMA#0 = $2f
Constant (const byte) KEY_POUND#0 = $30
Constant (const byte) KEY_ASTERISK#0 = $31
Constant (const byte) KEY_SEMICOLON#0 = $32
Constant (const byte) KEY_EQUALS#0 = $35
Constant (const byte) KEY_ARROW_UP#0 = $36
Constant (const byte) KEY_SLASH#0 = $37
Constant (const byte) KEY_1#0 = $38
Constant (const byte) KEY_ARROW_LEFT#0 = $39
Constant (const byte) KEY_2#0 = $3b
Constant (const byte) KEY_SPACE#0 = $3c
Constant (const byte) KEY_Q#0 = $3e
Constant (const byte[8]) keyboard_matrix_row_bitmask#0 = { $fe, $fd, $fb, $f7, $ef, $df, $bf, $7f }
Constant (const byte[8]) keyboard_matrix_col_bitmask#0 = { 1, 2, 4, 8, $10, $20, $40, $80 }
Constant (const byte*) SCREEN#0 = ((byte*))$400
Constant (const byte*) print_str_at::str#0 = main::str
Constant (const byte*) print_str_at::str#1 = main::str1
Constant (const byte*) print_str_at::str#2 = main::str2
Constant (const byte*) print_str_at::str#3 = main::str3
Constant (const byte) main::i#0 = 0
Constant (const byte) plot_chargen::ch#0 = $20
Constant (const byte) plot_chargen::shift#0 = 0
Constant (const byte) main::cur_pos#0 = 0
Constant (const byte) main::shift#0 = 0
Constant (const byte) main::cur_pos#1 = 0
Constant (const byte) main::cur_pos#2 = 1
Constant (const byte) main::cur_pos#3 = 2
Constant (const byte) main::cur_pos#4 = 3
Constant (const byte) main::shift#1 = 1
Constant (const byte) main::shift#2 = 0
Constant (const byte) main::ch#0 = 0
Constant (const byte) main::pressed#0 = 0
Constant (const byte) mul8u::b#0 = $a
Constant (const byte) plot_chargen::y#0 = 0
Constant (const byte) plot_chargen::x#0 = 0
Constant (const byte) plot_chargen::c#0 = '.'
Constant (const byte) plot_chargen::c#1 = '*'
Successful SSA optimization Pass2ConstantIdentification
Constant (const word) mul8u::mb#0 = ((word))mul8u::b#0
Constant (const byte[]) keyboard_char_keycodes#0 = { KEY_AT#0, KEY_A#0, KEY_B#0, KEY_C#0, KEY_D#0, KEY_E#0, KEY_F#0, KEY_G#0, KEY_H#0, KEY_I#0, KEY_J#0, KEY_K#0, KEY_L#0, KEY_M#0, KEY_N#0, KEY_O#0, KEY_P#0, KEY_Q#0, KEY_R#0, KEY_S#0, KEY_T#0, KEY_U#0, KEY_V#0, KEY_W#0, KEY_X#0, KEY_Y#0, KEY_Z#0, $3f, KEY_POUND#0, $3f, KEY_ARROW_UP#0, KEY_ARROW_LEFT#0, KEY_SPACE#0, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, $3f, KEY_ASTERISK#0, KEY_PLUS#0, KEY_COMMA#0, KEY_MINUS#0, KEY_DOT#0, KEY_SLASH#0, KEY_0#0, KEY_1#0, KEY_2#0, KEY_3#0, KEY_4#0, KEY_5#0, KEY_6#0, KEY_7#0, KEY_8#0, KEY_9#0, KEY_COLON#0, KEY_SEMICOLON#0, $3f, KEY_EQUALS#0, $3f, $3f }
Constant (const byte*) main::sc#0 = SCREEN#0
Constant (const byte*) main::$11 = SCREEN#0+$3e8
Constant (const byte*) print_str_at::at#0 = SCREEN#0+1
Constant (const byte*) main::$2 = SCREEN#0+1
Constant (const byte*) main::$5 = SCREEN#0+1
Constant (const byte*) main::$8 = SCREEN#0+1
Constant (const byte) keyboard_key_pressed::key#0 = KEY_F1#0
Constant (const byte) keyboard_key_pressed::key#1 = KEY_F3#0
Constant (const byte) keyboard_key_pressed::key#2 = KEY_F5#0
Constant (const byte) keyboard_key_pressed::key#3 = KEY_F7#0
Constant (const byte) keyboard_key_pressed::key#4 = KEY_LSHIFT#0
Constant (const byte*) plot_chargen::$5 = SCREEN#0+$28
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte*) print_str_at::at#1 = main::$2+$a
Constant (const byte*) print_str_at::at#2 = main::$5+$14
Constant (const byte*) print_str_at::at#3 = main::$8+$1e
Constant (const byte*) plot_chargen::$6 = plot_chargen::$5+1
Successful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination [80] if(true) goto main::@5
Successful SSA optimization Pass2ConstantIfs
Successful SSA optimization PassNEliminateUnusedVars
Removing unused block main::@return
Successful SSA optimization Pass2EliminateUnusedBlocks
Resolved ranged next value main::i#1 ← ++ main::i#2 to ++
Resolved ranged comparison value if(main::i#1!=rangelast(0,3)) goto main::@3 to (byte/signed byte/word/signed word/dword/signed dword) 4
Resolved ranged next value main::ch#1 ← ++ main::ch#2 to ++
Resolved ranged comparison value if(main::ch#1!=rangelast(0,$3f)) goto main::@12 to (byte/signed byte/word/signed word/dword/signed dword) $40
Resolved ranged next value plot_chargen::x#1 ← ++ plot_chargen::x#2 to ++
Resolved ranged comparison value if(plot_chargen::x#1!=rangelast(0,7)) goto plot_chargen::@4 to (byte/signed byte/word/signed word/dword/signed dword) 8
Resolved ranged next value plot_chargen::y#1 ← ++ plot_chargen::y#2 to ++
Resolved ranged comparison value if(plot_chargen::y#1!=rangelast(0,7)) goto plot_chargen::@3 to (byte/signed byte/word/signed word/dword/signed dword) 8
Rewriting multiplication to use shift (word/signed dword/dword~) plot_chargen::$1 ← (word~) plot_chargen::$0 * (byte/signed byte/word/signed word/dword/signed dword) 8
Rewriting multiplication to use shift (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 * (byte/signed byte/word/signed word/dword/signed dword) 2
Successful SSA optimization Pass2MultiplyToShiftRewriting
Culled Empty Block (label) mul8u::@3
Culled Empty Block (label) @9
Culled Empty Block (label) @16
Culled Empty Block (label) main::@28
Culled Empty Block (label) main::@4
Culled Empty Block (label) main::@10
Culled Empty Block (label) main::@37
Culled Empty Block (label) main::@17
Successful SSA optimization Pass2CullEmptyBlocks
Self Phi Eliminated (byte*) plot_chargen::chargen#3
Successful SSA optimization Pass2SelfPhiElimination
Redundant Phi (byte*) plot_chargen::chargen#3 (byte*) plot_chargen::chargen#5
Successful SSA optimization Pass2RedundantPhiElimination
Inferred type updated to word in [90] (word/signed dword/dword~) plot_chargen::$1 ← (word~) plot_chargen::$0 << (byte/signed byte/word/signed word/dword/signed dword) 3
Inlining constant with var siblings (const word) mul8u::res#0
Inlining constant with var siblings (const word) mul8u::mb#0
Inlining constant with var siblings (const byte) keyboard_key_pressed::key#0
Inlining constant with var siblings (const byte) keyboard_key_pressed::key#1
Inlining constant with var siblings (const byte) keyboard_key_pressed::key#2
Inlining constant with var siblings (const byte) keyboard_key_pressed::key#3
Inlining constant with var siblings (const byte) keyboard_key_pressed::key#4
Inlining constant with var siblings (const byte) main::i#0
Inlining constant with var siblings (const byte) main::cur_pos#0
Inlining constant with var siblings (const byte) main::cur_pos#1
Inlining constant with var siblings (const byte) main::cur_pos#2
Inlining constant with var siblings (const byte) main::cur_pos#3
Inlining constant with var siblings (const byte) main::cur_pos#4
Inlining constant with var siblings (const byte) main::shift#1
Inlining constant with var siblings (const byte) main::shift#2
Inlining constant with var siblings (const byte) main::ch#0
Inlining constant with var siblings (const byte) main::pressed#0
Inlining constant with var siblings (const byte*) main::sc#0
Inlining constant with var siblings (const byte*) print_str_at::str#0
Inlining constant with var siblings (const byte*) print_str_at::str#1
Inlining constant with var siblings (const byte*) print_str_at::str#2
Inlining constant with var siblings (const byte*) print_str_at::str#3
Inlining constant with var siblings (const byte*) print_str_at::at#0
Inlining constant with var siblings (const byte*) print_str_at::at#1
Inlining constant with var siblings (const byte*) print_str_at::at#2
Inlining constant with var siblings (const byte*) print_str_at::at#3
Inlining constant with var siblings (const byte) plot_chargen::ch#0
Inlining constant with var siblings (const byte) plot_chargen::shift#0
Inlining constant with var siblings (const byte) plot_chargen::y#0
Inlining constant with var siblings (const byte) plot_chargen::x#0
Inlining constant with var siblings (const byte) plot_chargen::c#0
Inlining constant with var siblings (const byte) plot_chargen::c#1
Constant inlined print_str_at::str#1 = (const string) main::str1
Constant inlined main::shift#1 = (byte/signed byte/word/signed word/dword/signed dword) 1
Constant inlined print_str_at::str#2 = (const string) main::str2
Constant inlined print_str_at::at#3 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1+(byte/signed byte/word/signed word/dword/signed dword) $1e
Constant inlined print_str_at::str#3 = (const string) main::str3
Constant inlined print_str_at::at#2 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1+(byte/signed byte/word/signed word/dword/signed dword) $14
Constant inlined plot_chargen::c#0 = (byte) '.'
Constant inlined print_str_at::at#1 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1+(byte/signed byte/word/signed word/dword/signed dword) $a
Constant inlined plot_chargen::c#1 = (byte) '*'
Constant inlined print_str_at::at#0 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1
Constant inlined print_str_at::str#0 = (const string) main::str
Constant inlined main::$11 = (const byte*) SCREEN#0+(word/signed word/dword/signed dword) $3e8
Constant inlined main::shift#2 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined main::i#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined plot_chargen::$6 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28+(byte/signed byte/word/signed word/dword/signed dword) 1
Constant inlined plot_chargen::$5 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28
Constant inlined plot_chargen::shift#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined main::ch#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined keyboard_key_pressed::key#0 = (const byte) KEY_F1#0
Constant inlined plot_chargen::ch#0 = (byte/signed byte/word/signed word/dword/signed dword) $20
Constant inlined keyboard_key_pressed::key#1 = (const byte) KEY_F3#0
Constant inlined keyboard_key_pressed::key#4 = (const byte) KEY_LSHIFT#0
Constant inlined mul8u::mb#0 = ((word))(const byte) mul8u::b#0
Constant inlined keyboard_key_pressed::key#2 = (const byte) KEY_F5#0
Constant inlined keyboard_key_pressed::key#3 = (const byte) KEY_F7#0
Constant inlined main::sc#0 = (const byte*) SCREEN#0
Constant inlined main::cur_pos#3 = (byte/signed byte/word/signed word/dword/signed dword) 2
Constant inlined mul8u::res#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined main::cur_pos#4 = (byte/signed byte/word/signed word/dword/signed dword) 3
Constant inlined main::cur_pos#1 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined main::$2 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1
Constant inlined main::cur_pos#2 = (byte/signed byte/word/signed word/dword/signed dword) 1
Constant inlined main::cur_pos#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined main::$5 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1
Constant inlined plot_chargen::y#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined main::$8 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1
Constant inlined main::pressed#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Constant inlined plot_chargen::x#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
Successful SSA optimization Pass2ConstantInlining
Added new block during phi lifting main::@38(between main::@1 and main::@1)
Added new block during phi lifting main::@39(between main::@29 and main::@3)
Added new block during phi lifting main::@40(between main::@14 and main::@5)
Added new block during phi lifting main::@41(between main::@30 and main::@6)
Added new block during phi lifting main::@42(between main::@31 and main::@7)
Added new block during phi lifting main::@43(between main::@32 and main::@8)
Added new block during phi lifting main::@44(between main::@33 and main::@9)
Added new block during phi lifting main::@45(between main::@14 and main::@12)
Added new block during phi lifting plot_chargen::@10(between plot_chargen and plot_chargen::@1)
Added new block during phi lifting plot_chargen::@11(between plot_chargen::@7 and plot_chargen::@3)
Added new block during phi lifting plot_chargen::@12(between plot_chargen::@5 and plot_chargen::@4)
Added new block during phi lifting mul8u::@10(between mul8u::@2 and mul8u::@4)
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @19
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of main::@25
Adding NOP phi() at start of main::@26
Adding NOP phi() at start of main::@27
Adding NOP phi() at start of main::@19
Adding NOP phi() at start of main::@20
Adding NOP phi() at start of main::@21
Adding NOP phi() at start of main::@22
Adding NOP phi() at start of main::@23
Adding NOP phi() at start of plot_chargen::@6
CALL GRAPH
Calls in [] to main:2
Calls in [main] to print_str_at:10 print_str_at:12 print_str_at:14 print_str_at:16 plot_chargen:20 keyboard_key_pressed:24 keyboard_key_pressed:30 keyboard_key_pressed:36 keyboard_key_pressed:42 keyboard_key_pressed:48 keyboard_get_keycode:56 keyboard_key_pressed:62 plot_chargen:74
Calls in [plot_chargen] to mul8u:96
Calls in [keyboard_key_pressed] to keyboard_matrix_read:146
Created 29 initial phi equivalence classes
Coalesced [19] plot_chargen::pos#6 ← plot_chargen::pos#0
Coalesced [61] keyboard_key_pressed::key#7 ← keyboard_key_pressed::key#5
Coalesced [65] main::pressed#4 ← main::pressed#1
Coalesced [71] plot_chargen::ch#3 ← plot_chargen::ch#1
Coalesced [72] plot_chargen::shift#3 ← plot_chargen::shift#1
Coalesced [73] plot_chargen::pos#5 ← plot_chargen::pos#1
Coalesced [77] main::cur_pos#27 ← main::cur_pos#11
Coalesced [78] main::ch#10 ← main::ch#1
Coalesced [79] main::cur_pos#31 ← main::cur_pos#18
Coalesced [80] main::cur_pos#30 ← main::cur_pos#20
Coalesced [81] main::cur_pos#29 ← main::cur_pos#22
Coalesced (already) [82] main::cur_pos#28 ← main::cur_pos#24
Coalesced [83] main::i#4 ← main::i#1
Coalesced [84] main::sc#3 ← main::sc#1
Coalesced [92] plot_chargen::chargen#11 ← plot_chargen::chargen#1
Coalesced [100] plot_chargen::sc#9 ← plot_chargen::sc#0
Coalesced [103] plot_chargen::bits#5 ← plot_chargen::bits#0
Coalesced [104] plot_chargen::sc#10 ← plot_chargen::sc#7
Coalesced [121] plot_chargen::y#7 ← plot_chargen::y#1
Coalesced [122] plot_chargen::sc#8 ← plot_chargen::sc#2
Coalesced [123] plot_chargen::bits#6 ← plot_chargen::bits#1
Coalesced [124] plot_chargen::sc#11 ← plot_chargen::sc#1
Coalesced [125] plot_chargen::x#5 ← plot_chargen::x#1
Coalesced [126] plot_chargen::chargen#10 ← plot_chargen::chargen#0
Coalesced [127] mul8u::a#7 ← mul8u::a#1
Coalesced [134] mul8u::res#9 ← mul8u::res#1
Coalesced [138] mul8u::a#8 ← mul8u::a#0
Coalesced [139] mul8u::res#7 ← mul8u::res#6
Coalesced [140] mul8u::mb#6 ← mul8u::mb#1
Coalesced (already) [141] mul8u::res#8 ← mul8u::res#2
Coalesced [157] print_str_at::str#8 ← print_str_at::str#7
Coalesced [158] print_str_at::at#8 ← print_str_at::at#7
Coalesced [165] print_str_at::str#9 ← print_str_at::str#4
Coalesced [166] print_str_at::at#9 ← print_str_at::at#4
Coalesced down to 21 phi equivalence classes
Culled Empty Block (label) main::@19
Culled Empty Block (label) main::@20
Culled Empty Block (label) main::@21
Culled Empty Block (label) main::@22
Culled Empty Block (label) main::@40
Culled Empty Block (label) main::@45
Culled Empty Block (label) main::@39
Culled Empty Block (label) main::@38
Culled Empty Block (label) plot_chargen::@11
Culled Empty Block (label) plot_chargen::@12
Culled Empty Block (label) plot_chargen::@10
Culled Empty Block (label) mul8u::@10
Renumbering block @19 to @1
Renumbering block mul8u::@4 to mul8u::@3
Renumbering block mul8u::@7 to mul8u::@4
Renumbering block keyboard_key_pressed::@2 to keyboard_key_pressed::@1
Renumbering block main::@5 to main::@4
Renumbering block main::@6 to main::@5
Renumbering block main::@7 to main::@6
Renumbering block main::@8 to main::@7
Renumbering block main::@9 to main::@8
Renumbering block main::@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::@23 to main::@15
Renumbering block main::@25 to main::@16
Renumbering block main::@26 to main::@17
Renumbering block main::@27 to main::@18
Renumbering block main::@29 to main::@19
Renumbering block main::@30 to main::@20
Renumbering block main::@31 to main::@21
Renumbering block main::@32 to main::@22
Renumbering block main::@33 to main::@23
Renumbering block main::@34 to main::@24
Renumbering block main::@35 to main::@25
Renumbering block main::@36 to main::@26
Renumbering block main::@41 to main::@27
Renumbering block main::@42 to main::@28
Renumbering block main::@43 to main::@29
Renumbering block main::@44 to main::@30
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of main::@16
Adding NOP phi() at start of main::@17
Adding NOP phi() at start of main::@18
Adding NOP phi() at start of main::@15
Adding NOP phi() at start of main::@30
Adding NOP phi() at start of main::@29
Adding NOP phi() at start of main::@28
Adding NOP phi() at start of main::@27
Adding NOP phi() at start of plot_chargen::@6
Adding NOP phi() at start of mul8u
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
[1] phi()
[2] call main
to:@end
@end: scope:[] from @1
[3] phi()
main: scope:[main] from @1
[4] phi()
to:main::@1
main::@1: scope:[main] from main main::@1
[5] (byte*) main::sc#2 ← phi( main/(const byte*) SCREEN#0 main::@1/(byte*) main::sc#1 )
[6] *((byte*) main::sc#2) ← (byte) ' '
[7] (byte*) main::sc#1 ← ++ (byte*) main::sc#2
[8] if((byte*) main::sc#1<(const byte*) SCREEN#0+(word/signed word/dword/signed dword) $3e8) goto main::@1
to:main::@2
main::@2: scope:[main] from main::@1
[9] phi()
[10] call print_str_at
to:main::@16
main::@16: scope:[main] from main::@2
[11] phi()
[12] call print_str_at
to:main::@17
main::@17: scope:[main] from main::@16
[13] phi()
[14] call print_str_at
to:main::@18
main::@18: scope:[main] from main::@17
[15] phi()
[16] call print_str_at
to:main::@3
main::@3: scope:[main] from main::@18 main::@19
[17] (byte) main::i#2 ← phi( main::@18/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@19/(byte) main::i#1 )
[18] (byte) plot_chargen::pos#0 ← (byte) main::i#2
[19] call plot_chargen
to:main::@19
main::@19: scope:[main] from main::@3
[20] (byte) main::i#1 ← ++ (byte) main::i#2
[21] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 4) goto main::@3
to:main::@4
main::@4: scope:[main] from main::@12 main::@19
[22] (byte) main::cur_pos#24 ← phi( main::@12/(byte) main::cur_pos#11 main::@19/(byte/signed byte/word/signed word/dword/signed dword) 0 )
[23] call keyboard_key_pressed
[24] (byte) keyboard_key_pressed::return#2 ← (byte) keyboard_key_pressed::return#0
to:main::@20
main::@20: scope:[main] from main::@4
[25] (byte~) main::$15 ← (byte) keyboard_key_pressed::return#2
[26] if((byte~) main::$15==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@27
to:main::@5
main::@5: scope:[main] from main::@20 main::@27
[27] (byte) main::cur_pos#22 ← phi( main::@20/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@27/(byte) main::cur_pos#24 )
[28] call keyboard_key_pressed
[29] (byte) keyboard_key_pressed::return#10 ← (byte) keyboard_key_pressed::return#0
to:main::@21
main::@21: scope:[main] from main::@5
[30] (byte~) main::$18 ← (byte) keyboard_key_pressed::return#10
[31] if((byte~) main::$18==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@28
to:main::@6
main::@6: scope:[main] from main::@21 main::@28
[32] (byte) main::cur_pos#20 ← phi( main::@21/(byte/signed byte/word/signed word/dword/signed dword) 1 main::@28/(byte) main::cur_pos#22 )
[33] call keyboard_key_pressed
[34] (byte) keyboard_key_pressed::return#11 ← (byte) keyboard_key_pressed::return#0
to:main::@22
main::@22: scope:[main] from main::@6
[35] (byte~) main::$21 ← (byte) keyboard_key_pressed::return#11
[36] if((byte~) main::$21==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@29
to:main::@7
main::@7: scope:[main] from main::@22 main::@29
[37] (byte) main::cur_pos#18 ← phi( main::@22/(byte/signed byte/word/signed word/dword/signed dword) 2 main::@29/(byte) main::cur_pos#20 )
[38] call keyboard_key_pressed
[39] (byte) keyboard_key_pressed::return#12 ← (byte) keyboard_key_pressed::return#0
to:main::@23
main::@23: scope:[main] from main::@7
[40] (byte~) main::$24 ← (byte) keyboard_key_pressed::return#12
[41] if((byte~) main::$24==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@30
to:main::@8
main::@8: scope:[main] from main::@23 main::@30
[42] (byte) main::cur_pos#11 ← phi( main::@23/(byte/signed byte/word/signed word/dword/signed dword) 3 main::@30/(byte) main::cur_pos#18 )
[43] call keyboard_key_pressed
[44] (byte) keyboard_key_pressed::return#13 ← (byte) keyboard_key_pressed::return#0
to:main::@24
main::@24: scope:[main] from main::@8
[45] (byte~) main::$27 ← (byte) keyboard_key_pressed::return#13
[46] if((byte~) main::$27!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@9
to:main::@15
main::@15: scope:[main] from main::@24
[47] phi()
to:main::@9
main::@9: scope:[main] from main::@15 main::@24
[48] (byte) main::shift#9 ← phi( main::@24/(byte/signed byte/word/signed word/dword/signed dword) 1 main::@15/(byte/signed byte/word/signed word/dword/signed dword) 0 )
to:main::@10
main::@10: scope:[main] from main::@12 main::@9
[49] (byte) main::ch#2 ← phi( main::@9/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@12/(byte) main::ch#1 )
[50] (byte) keyboard_get_keycode::ch#0 ← (byte) main::ch#2
[51] call keyboard_get_keycode
[52] (byte) keyboard_get_keycode::return#2 ← (byte) keyboard_get_keycode::return#0
to:main::@25
main::@25: scope:[main] from main::@10
[53] (byte) main::key#0 ← (byte) keyboard_get_keycode::return#2
[54] if((byte) main::key#0==(byte/signed byte/word/signed word/dword/signed dword) $3f) goto main::@11
to:main::@13
main::@13: scope:[main] from main::@25
[55] (byte) keyboard_key_pressed::key#5 ← (byte) main::key#0
[56] call keyboard_key_pressed
[57] (byte) keyboard_key_pressed::return#14 ← (byte) keyboard_key_pressed::return#0
to:main::@26
main::@26: scope:[main] from main::@13
[58] (byte) main::pressed#1 ← (byte) keyboard_key_pressed::return#14
to:main::@11
main::@11: scope:[main] from main::@25 main::@26
[59] (byte) main::pressed#2 ← phi( main::@25/(byte/signed byte/word/signed word/dword/signed dword) 0 main::@26/(byte) main::pressed#1 )
[60] if((byte) main::pressed#2==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@12
to:main::@14
main::@14: scope:[main] from main::@11
[61] (byte) plot_chargen::pos#1 ← (byte) main::cur_pos#11
[62] (byte) plot_chargen::ch#1 ← (byte) main::ch#2
[63] (byte) plot_chargen::shift#1 ← (byte) main::shift#9
[64] call plot_chargen
to:main::@12
main::@12: scope:[main] from main::@11 main::@14
[65] (byte) main::ch#1 ← ++ (byte) main::ch#2
[66] if((byte) main::ch#1!=(byte/signed byte/word/signed word/dword/signed dword) $40) goto main::@10
to:main::@4
main::@30: scope:[main] from main::@23
[67] phi()
to:main::@8
main::@29: scope:[main] from main::@22
[68] phi()
to:main::@7
main::@28: scope:[main] from main::@21
[69] phi()
to:main::@6
main::@27: scope:[main] from main::@20
[70] phi()
to:main::@5
plot_chargen: scope:[plot_chargen] from main::@14 main::@3
[71] (byte) plot_chargen::pos#2 ← phi( main::@14/(byte) plot_chargen::pos#1 main::@3/(byte) plot_chargen::pos#0 )
[71] (byte) plot_chargen::shift#2 ← phi( main::@14/(byte) plot_chargen::shift#1 main::@3/(byte/signed byte/word/signed word/dword/signed dword) 0 )
[71] (byte) plot_chargen::ch#2 ← phi( main::@14/(byte) plot_chargen::ch#1 main::@3/(byte/signed byte/word/signed word/dword/signed dword) $20 )
asm { sei }
[73] (word~) plot_chargen::$0 ← ((word)) (byte) plot_chargen::ch#2
[74] (word~) plot_chargen::$1 ← (word~) plot_chargen::$0 << (byte/signed byte/word/signed word/dword/signed dword) 3
[75] (byte*) plot_chargen::chargen#0 ← (const byte*) CHARGEN#0 + (word~) plot_chargen::$1
[76] if((byte) plot_chargen::shift#2==(byte/signed byte/word/signed word/dword/signed dword) 0) goto plot_chargen::@1
to:plot_chargen::@2
plot_chargen::@2: scope:[plot_chargen] from plot_chargen
[77] (byte*) plot_chargen::chargen#1 ← (byte*) plot_chargen::chargen#0 + (word/signed word/dword/signed dword) $800
to:plot_chargen::@1
plot_chargen::@1: scope:[plot_chargen] from plot_chargen plot_chargen::@2
[78] (byte*) plot_chargen::chargen#5 ← phi( plot_chargen/(byte*) plot_chargen::chargen#0 plot_chargen::@2/(byte*) plot_chargen::chargen#1 )
[79] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $32
[80] (byte) mul8u::a#1 ← (byte) plot_chargen::pos#2
[81] call mul8u
[82] (word) mul8u::return#2 ← (word) mul8u::res#2
to:plot_chargen::@9
plot_chargen::@9: scope:[plot_chargen] from plot_chargen::@1
[83] (word~) plot_chargen::$7 ← (word) mul8u::return#2
[84] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28+(byte/signed byte/word/signed word/dword/signed dword) 1 + (word~) plot_chargen::$7
to:plot_chargen::@3
plot_chargen::@3: scope:[plot_chargen] from plot_chargen::@7 plot_chargen::@9
[85] (byte*) plot_chargen::sc#7 ← phi( plot_chargen::@7/(byte*) plot_chargen::sc#2 plot_chargen::@9/(byte*) plot_chargen::sc#0 )
[85] (byte) plot_chargen::y#2 ← phi( plot_chargen::@7/(byte) plot_chargen::y#1 plot_chargen::@9/(byte/signed byte/word/signed word/dword/signed dword) 0 )
[86] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#5 + (byte) plot_chargen::y#2)
to:plot_chargen::@4
plot_chargen::@4: scope:[plot_chargen] from plot_chargen::@3 plot_chargen::@5
[87] (byte) plot_chargen::x#2 ← phi( plot_chargen::@3/(byte/signed byte/word/signed word/dword/signed dword) 0 plot_chargen::@5/(byte) plot_chargen::x#1 )
[87] (byte*) plot_chargen::sc#3 ← phi( plot_chargen::@3/(byte*) plot_chargen::sc#7 plot_chargen::@5/(byte*) plot_chargen::sc#1 )
[87] (byte) plot_chargen::bits#2 ← phi( plot_chargen::@3/(byte) plot_chargen::bits#0 plot_chargen::@5/(byte) plot_chargen::bits#1 )
[88] (byte~) plot_chargen::$10 ← (byte) plot_chargen::bits#2 & (byte/word/signed word/dword/signed dword) $80
[89] if((byte~) plot_chargen::$10==(byte/signed byte/word/signed word/dword/signed dword) 0) goto plot_chargen::@5
to:plot_chargen::@6
plot_chargen::@6: scope:[plot_chargen] from plot_chargen::@4
[90] phi()
to:plot_chargen::@5
plot_chargen::@5: scope:[plot_chargen] from plot_chargen::@4 plot_chargen::@6
[91] (byte) plot_chargen::c#2 ← phi( plot_chargen::@4/(byte) '.' plot_chargen::@6/(byte) '*' )
[92] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2
[93] (byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3
[94] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
[95] (byte) plot_chargen::x#1 ← ++ (byte) plot_chargen::x#2
[96] if((byte) plot_chargen::x#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto plot_chargen::@4
to:plot_chargen::@7
plot_chargen::@7: scope:[plot_chargen] from plot_chargen::@5
[97] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte/signed byte/word/signed word/dword/signed dword) $20
[98] (byte) plot_chargen::y#1 ← ++ (byte) plot_chargen::y#2
[99] if((byte) plot_chargen::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto plot_chargen::@3
to:plot_chargen::@8
plot_chargen::@8: scope:[plot_chargen] from plot_chargen::@7
[100] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $37
asm { cli }
to:plot_chargen::@return
plot_chargen::@return: scope:[plot_chargen] from plot_chargen::@8
[102] return
to:@return
mul8u: scope:[mul8u] from plot_chargen::@1
[103] phi()
to:mul8u::@1
mul8u::@1: scope:[mul8u] from mul8u mul8u::@3
[104] (word) mul8u::mb#2 ← phi( mul8u/((word))(const byte) mul8u::b#0 mul8u::@3/(word) mul8u::mb#1 )
[104] (word) mul8u::res#2 ← phi( mul8u/(byte/signed byte/word/signed word/dword/signed dword) 0 mul8u::@3/(word) mul8u::res#6 )
[104] (byte) mul8u::a#2 ← phi( mul8u/(byte) mul8u::a#1 mul8u::@3/(byte) mul8u::a#0 )
[105] if((byte) mul8u::a#2!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mul8u::@2
to:mul8u::@return
mul8u::@return: scope:[mul8u] from mul8u::@1
[106] return
to:@return
mul8u::@2: scope:[mul8u] from mul8u::@1
[107] (byte~) mul8u::$1 ← (byte) mul8u::a#2 & (byte/signed byte/word/signed word/dword/signed dword) 1
[108] if((byte~) mul8u::$1==(byte/signed byte/word/signed word/dword/signed dword) 0) goto mul8u::@3
to:mul8u::@4
mul8u::@4: scope:[mul8u] from mul8u::@2
[109] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2
to:mul8u::@3
mul8u::@3: scope:[mul8u] from mul8u::@2 mul8u::@4
[110] (word) mul8u::res#6 ← phi( mul8u::@2/(word) mul8u::res#2 mul8u::@4/(word) mul8u::res#1 )
[111] (byte) mul8u::a#0 ← (byte) mul8u::a#2 >> (byte/signed byte/word/signed word/dword/signed dword) 1
[112] (word) mul8u::mb#1 ← (word) mul8u::mb#2 << (byte/signed byte/word/signed word/dword/signed dword) 1
to:mul8u::@1
keyboard_key_pressed: scope:[keyboard_key_pressed] from main::@13 main::@4 main::@5 main::@6 main::@7 main::@8
[113] (byte) keyboard_key_pressed::key#6 ← phi( main::@13/(byte) keyboard_key_pressed::key#5 main::@4/(const byte) KEY_F1#0 main::@5/(const byte) KEY_F3#0 main::@6/(const byte) KEY_F5#0 main::@7/(const byte) KEY_F7#0 main::@8/(const byte) KEY_LSHIFT#0 )
[114] (byte) keyboard_key_pressed::colidx#0 ← (byte) keyboard_key_pressed::key#6 & (byte/signed byte/word/signed word/dword/signed dword) 7
[115] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte/signed byte/word/signed word/dword/signed dword) 3
[116] (byte) keyboard_matrix_read::rowid#0 ← (byte) keyboard_key_pressed::rowidx#0
[117] call keyboard_matrix_read
[118] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0
to:keyboard_key_pressed::@1
keyboard_key_pressed::@1: scope:[keyboard_key_pressed] from keyboard_key_pressed
[119] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2
[120] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte[8]) keyboard_matrix_col_bitmask#0 + (byte) keyboard_key_pressed::colidx#0)
to:keyboard_key_pressed::@return
keyboard_key_pressed::@return: scope:[keyboard_key_pressed] from keyboard_key_pressed::@1
[121] return
to:@return
keyboard_matrix_read: scope:[keyboard_matrix_read] from keyboard_key_pressed
[122] *((const byte*) CIA1_PORT_A#0) ← *((const byte[8]) keyboard_matrix_row_bitmask#0 + (byte) keyboard_matrix_read::rowid#0)
[123] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B#0)
to:keyboard_matrix_read::@return
keyboard_matrix_read::@return: scope:[keyboard_matrix_read] from keyboard_matrix_read
[124] return
to:@return
keyboard_get_keycode: scope:[keyboard_get_keycode] from main::@10
[125] (byte) keyboard_get_keycode::return#0 ← *((const byte[]) keyboard_char_keycodes#0 + (byte) keyboard_get_keycode::ch#0)
to:keyboard_get_keycode::@return
keyboard_get_keycode::@return: scope:[keyboard_get_keycode] from keyboard_get_keycode
[126] return
to:@return
print_str_at: scope:[print_str_at] from main::@16 main::@17 main::@18 main::@2
[127] (byte*) print_str_at::at#7 ← phi( main::@2/(const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1 main::@16/(const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1+(byte/signed byte/word/signed word/dword/signed dword) $a main::@17/(const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1+(byte/signed byte/word/signed word/dword/signed dword) $14 main::@18/(const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1+(byte/signed byte/word/signed word/dword/signed dword) $1e )
[127] (byte*) print_str_at::str#7 ← phi( main::@2/(const string) main::str main::@16/(const string) main::str1 main::@17/(const string) main::str2 main::@18/(const string) main::str3 )
to:print_str_at::@1
print_str_at::@1: scope:[print_str_at] from print_str_at print_str_at::@2
[128] (byte*) print_str_at::at#5 ← phi( print_str_at/(byte*) print_str_at::at#7 print_str_at::@2/(byte*) print_str_at::at#4 )
[128] (byte*) print_str_at::str#5 ← phi( print_str_at/(byte*) print_str_at::str#7 print_str_at::@2/(byte*) print_str_at::str#4 )
[129] if(*((byte*) print_str_at::str#5)!=(byte) '@') goto print_str_at::@2
to:print_str_at::@return
print_str_at::@return: scope:[print_str_at] from print_str_at::@1
[130] return
to:@return
print_str_at::@2: scope:[print_str_at] from print_str_at::@1
[131] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5)
[132] (byte*) print_str_at::at#4 ← ++ (byte*) print_str_at::at#5
[133] (byte*) print_str_at::str#4 ← ++ (byte*) print_str_at::str#5
to:print_str_at::@1
VARIABLE REGISTER WEIGHTS
(byte*) CHARGEN
(byte*) CIA1_PORT_A
(byte*) CIA1_PORT_B
(byte) KEY_0
(byte) KEY_1
(byte) KEY_2
(byte) KEY_3
(byte) KEY_4
(byte) KEY_5
(byte) KEY_6
(byte) KEY_7
(byte) KEY_8
(byte) KEY_9
(byte) KEY_A
(byte) KEY_ARROW_LEFT
(byte) KEY_ARROW_UP
(byte) KEY_ASTERISK
(byte) KEY_AT
(byte) KEY_B
(byte) KEY_C
(byte) KEY_COLON
(byte) KEY_COMMA
(byte) KEY_D
(byte) KEY_DOT
(byte) KEY_E
(byte) KEY_EQUALS
(byte) KEY_F
(byte) KEY_F1
(byte) KEY_F3
(byte) KEY_F5
(byte) KEY_F7
(byte) KEY_G
(byte) KEY_H
(byte) KEY_I
(byte) KEY_J
(byte) KEY_K
(byte) KEY_L
(byte) KEY_LSHIFT
(byte) KEY_M
(byte) KEY_MINUS
(byte) KEY_N
(byte) KEY_O
(byte) KEY_P
(byte) KEY_PLUS
(byte) KEY_POUND
(byte) KEY_Q
(byte) KEY_R
(byte) KEY_S
(byte) KEY_SEMICOLON
(byte) KEY_SLASH
(byte) KEY_SPACE
(byte) KEY_T
(byte) KEY_U
(byte) KEY_V
(byte) KEY_W
(byte) KEY_X
(byte) KEY_Y
(byte) KEY_Z
(byte*) PROCPORT
(byte*) SCREEN
(byte[]) keyboard_char_keycodes
(byte()) keyboard_get_keycode((byte) keyboard_get_keycode::ch)
(byte) keyboard_get_keycode::ch
(byte) keyboard_get_keycode::ch#0 103.0
(byte) keyboard_get_keycode::return
(byte) keyboard_get_keycode::return#0 34.33333333333333
(byte) keyboard_get_keycode::return#2 202.0
(byte()) keyboard_key_pressed((byte) keyboard_key_pressed::key)
(byte~) keyboard_key_pressed::$2 4.0
(byte) keyboard_key_pressed::colidx
(byte) keyboard_key_pressed::colidx#0 0.6666666666666666
(byte) keyboard_key_pressed::key
(byte) keyboard_key_pressed::key#5 202.0
(byte) keyboard_key_pressed::key#6 52.5
(byte) keyboard_key_pressed::return
(byte) keyboard_key_pressed::return#0 19.75
(byte) keyboard_key_pressed::return#10 22.0
(byte) keyboard_key_pressed::return#11 22.0
(byte) keyboard_key_pressed::return#12 22.0
(byte) keyboard_key_pressed::return#13 22.0
(byte) keyboard_key_pressed::return#14 202.0
(byte) keyboard_key_pressed::return#2 22.0
(byte) keyboard_key_pressed::rowidx
(byte) keyboard_key_pressed::rowidx#0 4.0
(byte[8]) keyboard_matrix_col_bitmask
(byte()) keyboard_matrix_read((byte) keyboard_matrix_read::rowid)
(byte) keyboard_matrix_read::return
(byte) keyboard_matrix_read::return#0 1.3333333333333333
(byte) keyboard_matrix_read::return#2 4.0
(byte) keyboard_matrix_read::row_pressed_bits
(byte) keyboard_matrix_read::rowid
(byte) keyboard_matrix_read::rowid#0 4.0
(byte[8]) keyboard_matrix_row_bitmask
(void()) main()
(byte~) main::$15 22.0
(byte~) main::$18 22.0
(byte~) main::$21 22.0
(byte~) main::$24 22.0
(byte~) main::$27 22.0
(byte) main::ch
(byte) main::ch#1 151.5
(byte) main::ch#2 25.25
(byte) main::cur_pos
(byte) main::cur_pos#11 8.52
(byte) main::cur_pos#18 3.6666666666666665
(byte) main::cur_pos#20 3.6666666666666665
(byte) main::cur_pos#22 3.6666666666666665
(byte) main::cur_pos#24 18.666666666666664
(byte) main::i
(byte) main::i#1 16.5
(byte) main::i#2 11.0
(byte) main::key
(byte) main::key#0 151.5
(byte) main::pressed
(byte) main::pressed#1 202.0
(byte) main::pressed#2 202.0
(byte*) main::sc
(byte*) main::sc#1 16.5
(byte*) main::sc#2 16.5
(byte) main::shift
(byte) main::shift#9 5.315789473684211
(word()) mul8u((byte) mul8u::a , (byte) mul8u::b)
(byte~) mul8u::$1 2002.0
(byte) mul8u::a
(byte) mul8u::a#0 1001.0
(byte) mul8u::a#1 2.0
(byte) mul8u::a#2 667.6666666666667
(byte) mul8u::b
(word) mul8u::mb
(word) mul8u::mb#1 2002.0
(word) mul8u::mb#2 429.0
(word) mul8u::res
(word) mul8u::res#1 2002.0
(word) mul8u::res#2 500.83333333333337
(word) mul8u::res#6 1001.0
(word) mul8u::return
(word) mul8u::return#2 4.0
(void()) plot_chargen((byte) plot_chargen::pos , (byte) plot_chargen::ch , (byte) plot_chargen::shift)
(word~) plot_chargen::$0 4.0
(word~) plot_chargen::$1 4.0
(byte~) plot_chargen::$10 20002.0
(word~) plot_chargen::$7 4.0
(byte) plot_chargen::bits
(byte) plot_chargen::bits#0 2002.0
(byte) plot_chargen::bits#1 6667.333333333333
(byte) plot_chargen::bits#2 4429.142857142857
(byte) plot_chargen::c
(byte) plot_chargen::c#2 10001.0
(byte) plot_chargen::ch
(byte) plot_chargen::ch#1 101.0
(byte) plot_chargen::ch#2 51.5
(byte*) plot_chargen::chargen
(byte*) plot_chargen::chargen#0 3.0
(byte*) plot_chargen::chargen#1 4.0
(byte*) plot_chargen::chargen#5 45.68181818181818
(byte) plot_chargen::pos
(byte) plot_chargen::pos#0 22.0
(byte) plot_chargen::pos#1 67.33333333333333
(byte) plot_chargen::pos#2 12.666666666666664
(byte*) plot_chargen::sc
(byte*) plot_chargen::sc#0 4.0
(byte*) plot_chargen::sc#1 5250.75
(byte*) plot_chargen::sc#2 667.3333333333334
(byte*) plot_chargen::sc#3 5167.333333333333
(byte*) plot_chargen::sc#7 1002.0
(byte) plot_chargen::shift
(byte) plot_chargen::shift#1 202.0
(byte) plot_chargen::shift#2 20.599999999999998
(byte) plot_chargen::x
(byte) plot_chargen::x#1 15001.5
(byte) plot_chargen::x#2 2500.25
(byte) plot_chargen::y
(byte) plot_chargen::y#1 1501.5
(byte) plot_chargen::y#2 231.0
(void()) print_str_at((byte*) print_str_at::str , (byte*) print_str_at::at)
(byte*) print_str_at::at
(byte*) print_str_at::at#4 11.0
(byte*) print_str_at::at#5 11.666666666666666
(byte*) print_str_at::at#7 2.0
(byte*) print_str_at::str
(byte*) print_str_at::str#4 22.0
(byte*) print_str_at::str#5 11.5
(byte*) print_str_at::str#7 2.0
Initial phi equivalence classes
[ main::sc#2 main::sc#1 ]
[ main::i#2 main::i#1 ]
[ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ]
[ main::shift#9 ]
[ main::ch#2 main::ch#1 ]
[ main::pressed#2 main::pressed#1 ]
[ plot_chargen::ch#2 plot_chargen::ch#1 ]
[ plot_chargen::shift#2 plot_chargen::shift#1 ]
[ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ]
[ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 ]
[ plot_chargen::y#2 plot_chargen::y#1 ]
[ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ]
[ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 ]
[ plot_chargen::x#2 plot_chargen::x#1 ]
[ plot_chargen::c#2 ]
[ mul8u::a#2 mul8u::a#1 mul8u::a#0 ]
[ mul8u::res#2 mul8u::res#6 mul8u::res#1 ]
[ mul8u::mb#2 mul8u::mb#1 ]
[ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ]
[ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ]
[ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ]
Added variable keyboard_key_pressed::return#2 to zero page equivalence class [ keyboard_key_pressed::return#2 ]
Added variable main::$15 to zero page equivalence class [ main::$15 ]
Added variable keyboard_key_pressed::return#10 to zero page equivalence class [ keyboard_key_pressed::return#10 ]
Added variable main::$18 to zero page equivalence class [ main::$18 ]
Added variable keyboard_key_pressed::return#11 to zero page equivalence class [ keyboard_key_pressed::return#11 ]
Added variable main::$21 to zero page equivalence class [ main::$21 ]
Added variable keyboard_key_pressed::return#12 to zero page equivalence class [ keyboard_key_pressed::return#12 ]
Added variable main::$24 to zero page equivalence class [ main::$24 ]
Added variable keyboard_key_pressed::return#13 to zero page equivalence class [ keyboard_key_pressed::return#13 ]
Added variable main::$27 to zero page equivalence class [ main::$27 ]
Added variable keyboard_get_keycode::ch#0 to zero page equivalence class [ keyboard_get_keycode::ch#0 ]
Added variable keyboard_get_keycode::return#2 to zero page equivalence class [ keyboard_get_keycode::return#2 ]
Added variable main::key#0 to zero page equivalence class [ main::key#0 ]
Added variable keyboard_key_pressed::return#14 to zero page equivalence class [ keyboard_key_pressed::return#14 ]
Added variable plot_chargen::$0 to zero page equivalence class [ plot_chargen::$0 ]
Added variable plot_chargen::$1 to zero page equivalence class [ plot_chargen::$1 ]
Added variable mul8u::return#2 to zero page equivalence class [ mul8u::return#2 ]
Added variable plot_chargen::$7 to zero page equivalence class [ plot_chargen::$7 ]
Added variable plot_chargen::$10 to zero page equivalence class [ plot_chargen::$10 ]
Added variable mul8u::$1 to zero page equivalence class [ mul8u::$1 ]
Added variable keyboard_key_pressed::colidx#0 to zero page equivalence class [ keyboard_key_pressed::colidx#0 ]
Added variable keyboard_key_pressed::rowidx#0 to zero page equivalence class [ keyboard_key_pressed::rowidx#0 ]
Added variable keyboard_matrix_read::rowid#0 to zero page equivalence class [ keyboard_matrix_read::rowid#0 ]
Added variable keyboard_matrix_read::return#2 to zero page equivalence class [ keyboard_matrix_read::return#2 ]
Added variable keyboard_key_pressed::$2 to zero page equivalence class [ keyboard_key_pressed::$2 ]
Added variable keyboard_key_pressed::return#0 to zero page equivalence class [ keyboard_key_pressed::return#0 ]
Added variable keyboard_matrix_read::return#0 to zero page equivalence class [ keyboard_matrix_read::return#0 ]
Added variable keyboard_get_keycode::return#0 to zero page equivalence class [ keyboard_get_keycode::return#0 ]
Complete equivalence classes
[ main::sc#2 main::sc#1 ]
[ main::i#2 main::i#1 ]
[ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ]
[ main::shift#9 ]
[ main::ch#2 main::ch#1 ]
[ main::pressed#2 main::pressed#1 ]
[ plot_chargen::ch#2 plot_chargen::ch#1 ]
[ plot_chargen::shift#2 plot_chargen::shift#1 ]
[ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ]
[ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 ]
[ plot_chargen::y#2 plot_chargen::y#1 ]
[ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ]
[ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 ]
[ plot_chargen::x#2 plot_chargen::x#1 ]
[ plot_chargen::c#2 ]
[ mul8u::a#2 mul8u::a#1 mul8u::a#0 ]
[ mul8u::res#2 mul8u::res#6 mul8u::res#1 ]
[ mul8u::mb#2 mul8u::mb#1 ]
[ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ]
[ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ]
[ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ]
[ keyboard_key_pressed::return#2 ]
[ main::$15 ]
[ keyboard_key_pressed::return#10 ]
[ main::$18 ]
[ keyboard_key_pressed::return#11 ]
[ main::$21 ]
[ keyboard_key_pressed::return#12 ]
[ main::$24 ]
[ keyboard_key_pressed::return#13 ]
[ main::$27 ]
[ keyboard_get_keycode::ch#0 ]
[ keyboard_get_keycode::return#2 ]
[ main::key#0 ]
[ keyboard_key_pressed::return#14 ]
[ plot_chargen::$0 ]
[ plot_chargen::$1 ]
[ mul8u::return#2 ]
[ plot_chargen::$7 ]
[ plot_chargen::$10 ]
[ mul8u::$1 ]
[ keyboard_key_pressed::colidx#0 ]
[ keyboard_key_pressed::rowidx#0 ]
[ keyboard_matrix_read::rowid#0 ]
[ keyboard_matrix_read::return#2 ]
[ keyboard_key_pressed::$2 ]
[ keyboard_key_pressed::return#0 ]
[ keyboard_matrix_read::return#0 ]
[ keyboard_get_keycode::return#0 ]
Allocated zp ZP_WORD:2 [ main::sc#2 main::sc#1 ]
Allocated zp ZP_BYTE:4 [ main::i#2 main::i#1 ]
Allocated zp ZP_BYTE:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ]
Allocated zp ZP_BYTE:6 [ main::shift#9 ]
Allocated zp ZP_BYTE:7 [ main::ch#2 main::ch#1 ]
Allocated zp ZP_BYTE:8 [ main::pressed#2 main::pressed#1 ]
Allocated zp ZP_BYTE:9 [ plot_chargen::ch#2 plot_chargen::ch#1 ]
Allocated zp ZP_BYTE:10 [ plot_chargen::shift#2 plot_chargen::shift#1 ]
Allocated zp ZP_BYTE:11 [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ]
Allocated zp ZP_WORD:12 [ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 ]
Allocated zp ZP_BYTE:14 [ plot_chargen::y#2 plot_chargen::y#1 ]
Allocated zp ZP_BYTE:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ]
Allocated zp ZP_WORD:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 ]
Allocated zp ZP_BYTE:18 [ plot_chargen::x#2 plot_chargen::x#1 ]
Allocated zp ZP_BYTE:19 [ plot_chargen::c#2 ]
Allocated zp ZP_BYTE:20 [ mul8u::a#2 mul8u::a#1 mul8u::a#0 ]
Allocated zp ZP_WORD:21 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ]
Allocated zp ZP_WORD:23 [ mul8u::mb#2 mul8u::mb#1 ]
Allocated zp ZP_BYTE:25 [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ]
Allocated zp ZP_WORD:26 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ]
Allocated zp ZP_WORD:28 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ]
Allocated zp ZP_BYTE:30 [ keyboard_key_pressed::return#2 ]
Allocated zp ZP_BYTE:31 [ main::$15 ]
Allocated zp ZP_BYTE:32 [ keyboard_key_pressed::return#10 ]
Allocated zp ZP_BYTE:33 [ main::$18 ]
Allocated zp ZP_BYTE:34 [ keyboard_key_pressed::return#11 ]
Allocated zp ZP_BYTE:35 [ main::$21 ]
Allocated zp ZP_BYTE:36 [ keyboard_key_pressed::return#12 ]
Allocated zp ZP_BYTE:37 [ main::$24 ]
Allocated zp ZP_BYTE:38 [ keyboard_key_pressed::return#13 ]
Allocated zp ZP_BYTE:39 [ main::$27 ]
Allocated zp ZP_BYTE:40 [ keyboard_get_keycode::ch#0 ]
Allocated zp ZP_BYTE:41 [ keyboard_get_keycode::return#2 ]
Allocated zp ZP_BYTE:42 [ main::key#0 ]
Allocated zp ZP_BYTE:43 [ keyboard_key_pressed::return#14 ]
Allocated zp ZP_WORD:44 [ plot_chargen::$0 ]
Allocated zp ZP_WORD:46 [ plot_chargen::$1 ]
Allocated zp ZP_WORD:48 [ mul8u::return#2 ]
Allocated zp ZP_WORD:50 [ plot_chargen::$7 ]
Allocated zp ZP_BYTE:52 [ plot_chargen::$10 ]
Allocated zp ZP_BYTE:53 [ mul8u::$1 ]
Allocated zp ZP_BYTE:54 [ keyboard_key_pressed::colidx#0 ]
Allocated zp ZP_BYTE:55 [ keyboard_key_pressed::rowidx#0 ]
Allocated zp ZP_BYTE:56 [ keyboard_matrix_read::rowid#0 ]
Allocated zp ZP_BYTE:57 [ keyboard_matrix_read::return#2 ]
Allocated zp ZP_BYTE:58 [ keyboard_key_pressed::$2 ]
Allocated zp ZP_BYTE:59 [ keyboard_key_pressed::return#0 ]
Allocated zp ZP_BYTE:60 [ keyboard_matrix_read::return#0 ]
Allocated zp ZP_BYTE:61 [ keyboard_get_keycode::return#0 ]
INITIAL ASM
//SEG0 File Comments
// Allows analysis of the CHARGEN ROM font
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
//SEG2 Global Constants & labels
// Processor Port Register controlling RAM/ROM configuration and the datasette
.label PROCPORT = 1
// The address of the CHARGEN character set
.label CHARGEN = $d000
// CIA#1 Port A: keyboard matrix columns and joystick #2
.label CIA1_PORT_A = $dc00
// CIA#1 Port B: keyboard matrix rows and joystick #1.
.label CIA1_PORT_B = $dc01
.const KEY_F7 = 3
.const KEY_F1 = 4
.const KEY_F3 = 5
.const KEY_F5 = 6
.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_LSHIFT = $f
.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
.label SCREEN = $400
//SEG3 @begin
bbegin:
//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
//SEG5 @1
b1:
//SEG6 [2] call main
//SEG7 [4] phi from @1 to main [phi:@1->main]
main_from_b1:
jsr main
//SEG8 [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
//SEG9 @end
bend:
//SEG10 main
main: {
.label _15 = $1f
.label _18 = $21
.label _21 = $23
.label _24 = $25
.label _27 = $27
.label sc = 2
.label i = 4
.label key = $2a
.label pressed = 8
.label ch = 7
.label cur_pos = 5
.label shift = 6
//SEG11 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG12 [5] phi (byte*) main::sc#2 = (const byte*) SCREEN#0 [phi:main->main::@1#0] -- pbuz1=pbuc1
lda #<SCREEN
sta sc
lda #>SCREEN
sta sc+1
jmp b1
// Clear screen
//SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
b1_from_b1:
//SEG14 [5] phi (byte*) main::sc#2 = (byte*) main::sc#1 [phi:main::@1->main::@1#0] -- register_copy
jmp b1
//SEG15 main::@1
b1:
//SEG16 [6] *((byte*) main::sc#2) ← (byte) ' ' -- _deref_pbuz1=vbuc1
lda #' '
ldy #0
sta (sc),y
//SEG17 [7] (byte*) main::sc#1 ← ++ (byte*) main::sc#2 -- pbuz1=_inc_pbuz1
inc sc
bne !+
inc sc+1
!:
//SEG18 [8] if((byte*) main::sc#1<(const byte*) SCREEN#0+(word/signed word/dword/signed dword) $3e8) goto main::@1 -- pbuz1_lt_pbuc1_then_la1
lda sc+1
cmp #>SCREEN+$3e8
bcc b1_from_b1
bne !+
lda sc
cmp #<SCREEN+$3e8
bcc b1_from_b1
!:
//SEG19 [9] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
jmp b2
//SEG20 main::@2
b2:
//SEG21 [10] call print_str_at
//SEG22 [127] phi from main::@2 to print_str_at [phi:main::@2->print_str_at]
print_str_at_from_b2:
//SEG23 [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@2->print_str_at#0] -- pbuz1=pbuc1
lda #<SCREEN+1
sta print_str_at.at
lda #>SCREEN+1
sta print_str_at.at+1
//SEG24 [127] phi (byte*) print_str_at::str#7 = (const string) main::str [phi:main::@2->print_str_at#1] -- pbuz1=pbuc1
lda #<str
sta print_str_at.str
lda #>str
sta print_str_at.str+1
jsr print_str_at
//SEG25 [11] phi from main::@2 to main::@16 [phi:main::@2->main::@16]
b16_from_b2:
jmp b16
//SEG26 main::@16
b16:
//SEG27 [12] call print_str_at
//SEG28 [127] phi from main::@16 to print_str_at [phi:main::@16->print_str_at]
print_str_at_from_b16:
//SEG29 [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1+(byte/signed byte/word/signed word/dword/signed dword) $a [phi:main::@16->print_str_at#0] -- pbuz1=pbuc1
lda #<SCREEN+1+$a
sta print_str_at.at
lda #>SCREEN+1+$a
sta print_str_at.at+1
//SEG30 [127] phi (byte*) print_str_at::str#7 = (const string) main::str1 [phi:main::@16->print_str_at#1] -- pbuz1=pbuc1
lda #<str1
sta print_str_at.str
lda #>str1
sta print_str_at.str+1
jsr print_str_at
//SEG31 [13] phi from main::@16 to main::@17 [phi:main::@16->main::@17]
b17_from_b16:
jmp b17
//SEG32 main::@17
b17:
//SEG33 [14] call print_str_at
//SEG34 [127] phi from main::@17 to print_str_at [phi:main::@17->print_str_at]
print_str_at_from_b17:
//SEG35 [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1+(byte/signed byte/word/signed word/dword/signed dword) $14 [phi:main::@17->print_str_at#0] -- pbuz1=pbuc1
lda #<SCREEN+1+$14
sta print_str_at.at
lda #>SCREEN+1+$14
sta print_str_at.at+1
//SEG36 [127] phi (byte*) print_str_at::str#7 = (const string) main::str2 [phi:main::@17->print_str_at#1] -- pbuz1=pbuc1
lda #<str2
sta print_str_at.str
lda #>str2
sta print_str_at.str+1
jsr print_str_at
//SEG37 [15] phi from main::@17 to main::@18 [phi:main::@17->main::@18]
b18_from_b17:
jmp b18
//SEG38 main::@18
b18:
//SEG39 [16] call print_str_at
//SEG40 [127] phi from main::@18 to print_str_at [phi:main::@18->print_str_at]
print_str_at_from_b18:
//SEG41 [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1+(byte/signed byte/word/signed word/dword/signed dword) $1e [phi:main::@18->print_str_at#0] -- pbuz1=pbuc1
lda #<SCREEN+1+$1e
sta print_str_at.at
lda #>SCREEN+1+$1e
sta print_str_at.at+1
//SEG42 [127] phi (byte*) print_str_at::str#7 = (const string) main::str3 [phi:main::@18->print_str_at#1] -- pbuz1=pbuc1
lda #<str3
sta print_str_at.str
lda #>str3
sta print_str_at.str+1
jsr print_str_at
//SEG43 [17] phi from main::@18 to main::@3 [phi:main::@18->main::@3]
b3_from_b18:
//SEG44 [17] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@18->main::@3#0] -- vbuz1=vbuc1
lda #0
sta i
jmp b3
//SEG45 [17] phi from main::@19 to main::@3 [phi:main::@19->main::@3]
b3_from_b19:
//SEG46 [17] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@19->main::@3#0] -- register_copy
jmp b3
//SEG47 main::@3
b3:
//SEG48 [18] (byte) plot_chargen::pos#0 ← (byte) main::i#2 -- vbuz1=vbuz2
lda i
sta plot_chargen.pos
//SEG49 [19] call plot_chargen
//SEG50 [71] phi from main::@3 to plot_chargen [phi:main::@3->plot_chargen]
plot_chargen_from_b3:
//SEG51 [71] phi (byte) plot_chargen::pos#2 = (byte) plot_chargen::pos#0 [phi:main::@3->plot_chargen#0] -- register_copy
//SEG52 [71] phi (byte) plot_chargen::shift#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@3->plot_chargen#1] -- vbuz1=vbuc1
lda #0
sta plot_chargen.shift
//SEG53 [71] phi (byte) plot_chargen::ch#2 = (byte/signed byte/word/signed word/dword/signed dword) $20 [phi:main::@3->plot_chargen#2] -- vbuz1=vbuc1
lda #$20
sta plot_chargen.ch
jsr plot_chargen
jmp b19
//SEG54 main::@19
b19:
//SEG55 [20] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1
inc i
//SEG56 [21] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 4) goto main::@3 -- vbuz1_neq_vbuc1_then_la1
lda #4
cmp i
bne b3_from_b19
//SEG57 [22] phi from main::@19 to main::@4 [phi:main::@19->main::@4]
b4_from_b19:
//SEG58 [22] phi (byte) main::cur_pos#24 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@19->main::@4#0] -- vbuz1=vbuc1
lda #0
sta cur_pos
jmp b4
//SEG59 main::@4
b4:
//SEG60 [23] call keyboard_key_pressed
//SEG61 [113] phi from main::@4 to keyboard_key_pressed [phi:main::@4->keyboard_key_pressed]
keyboard_key_pressed_from_b4:
//SEG62 [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F1#0 [phi:main::@4->keyboard_key_pressed#0] -- vbuz1=vbuc1
lda #KEY_F1
sta keyboard_key_pressed.key
jsr keyboard_key_pressed
//SEG63 [24] (byte) keyboard_key_pressed::return#2 ← (byte) keyboard_key_pressed::return#0 -- vbuz1=vbuz2
lda keyboard_key_pressed.return
sta keyboard_key_pressed.return_2
jmp b20
//SEG64 main::@20
b20:
//SEG65 [25] (byte~) main::$15 ← (byte) keyboard_key_pressed::return#2 -- vbuz1=vbuz2
lda keyboard_key_pressed.return_2
sta _15
//SEG66 [26] if((byte~) main::$15==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@27 -- vbuz1_eq_0_then_la1
lda _15
cmp #0
beq b27_from_b20
//SEG67 [27] phi from main::@20 to main::@5 [phi:main::@20->main::@5]
b5_from_b20:
//SEG68 [27] phi (byte) main::cur_pos#22 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@20->main::@5#0] -- vbuz1=vbuc1
lda #0
sta cur_pos
jmp b5
//SEG69 main::@5
b5:
//SEG70 [28] call keyboard_key_pressed
//SEG71 [113] phi from main::@5 to keyboard_key_pressed [phi:main::@5->keyboard_key_pressed]
keyboard_key_pressed_from_b5:
//SEG72 [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F3#0 [phi:main::@5->keyboard_key_pressed#0] -- vbuz1=vbuc1
lda #KEY_F3
sta keyboard_key_pressed.key
jsr keyboard_key_pressed
//SEG73 [29] (byte) keyboard_key_pressed::return#10 ← (byte) keyboard_key_pressed::return#0 -- vbuz1=vbuz2
lda keyboard_key_pressed.return
sta keyboard_key_pressed.return_10
jmp b21
//SEG74 main::@21
b21:
//SEG75 [30] (byte~) main::$18 ← (byte) keyboard_key_pressed::return#10 -- vbuz1=vbuz2
lda keyboard_key_pressed.return_10
sta _18
//SEG76 [31] if((byte~) main::$18==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@28 -- vbuz1_eq_0_then_la1
lda _18
cmp #0
beq b28_from_b21
//SEG77 [32] phi from main::@21 to main::@6 [phi:main::@21->main::@6]
b6_from_b21:
//SEG78 [32] phi (byte) main::cur_pos#20 = (byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@21->main::@6#0] -- vbuz1=vbuc1
lda #1
sta cur_pos
jmp b6
//SEG79 main::@6
b6:
//SEG80 [33] call keyboard_key_pressed
//SEG81 [113] phi from main::@6 to keyboard_key_pressed [phi:main::@6->keyboard_key_pressed]
keyboard_key_pressed_from_b6:
//SEG82 [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F5#0 [phi:main::@6->keyboard_key_pressed#0] -- vbuz1=vbuc1
lda #KEY_F5
sta keyboard_key_pressed.key
jsr keyboard_key_pressed
//SEG83 [34] (byte) keyboard_key_pressed::return#11 ← (byte) keyboard_key_pressed::return#0 -- vbuz1=vbuz2
lda keyboard_key_pressed.return
sta keyboard_key_pressed.return_11
jmp b22
//SEG84 main::@22
b22:
//SEG85 [35] (byte~) main::$21 ← (byte) keyboard_key_pressed::return#11 -- vbuz1=vbuz2
lda keyboard_key_pressed.return_11
sta _21
//SEG86 [36] if((byte~) main::$21==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@29 -- vbuz1_eq_0_then_la1
lda _21
cmp #0
beq b29_from_b22
//SEG87 [37] phi from main::@22 to main::@7 [phi:main::@22->main::@7]
b7_from_b22:
//SEG88 [37] phi (byte) main::cur_pos#18 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:main::@22->main::@7#0] -- vbuz1=vbuc1
lda #2
sta cur_pos
jmp b7
//SEG89 main::@7
b7:
//SEG90 [38] call keyboard_key_pressed
//SEG91 [113] phi from main::@7 to keyboard_key_pressed [phi:main::@7->keyboard_key_pressed]
keyboard_key_pressed_from_b7:
//SEG92 [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F7#0 [phi:main::@7->keyboard_key_pressed#0] -- vbuz1=vbuc1
lda #KEY_F7
sta keyboard_key_pressed.key
jsr keyboard_key_pressed
//SEG93 [39] (byte) keyboard_key_pressed::return#12 ← (byte) keyboard_key_pressed::return#0 -- vbuz1=vbuz2
lda keyboard_key_pressed.return
sta keyboard_key_pressed.return_12
jmp b23
//SEG94 main::@23
b23:
//SEG95 [40] (byte~) main::$24 ← (byte) keyboard_key_pressed::return#12 -- vbuz1=vbuz2
lda keyboard_key_pressed.return_12
sta _24
//SEG96 [41] if((byte~) main::$24==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@30 -- vbuz1_eq_0_then_la1
lda _24
cmp #0
beq b30_from_b23
//SEG97 [42] phi from main::@23 to main::@8 [phi:main::@23->main::@8]
b8_from_b23:
//SEG98 [42] phi (byte) main::cur_pos#11 = (byte/signed byte/word/signed word/dword/signed dword) 3 [phi:main::@23->main::@8#0] -- vbuz1=vbuc1
lda #3
sta cur_pos
jmp b8
//SEG99 main::@8
b8:
//SEG100 [43] call keyboard_key_pressed
//SEG101 [113] phi from main::@8 to keyboard_key_pressed [phi:main::@8->keyboard_key_pressed]
keyboard_key_pressed_from_b8:
//SEG102 [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_LSHIFT#0 [phi:main::@8->keyboard_key_pressed#0] -- vbuz1=vbuc1
lda #KEY_LSHIFT
sta keyboard_key_pressed.key
jsr keyboard_key_pressed
//SEG103 [44] (byte) keyboard_key_pressed::return#13 ← (byte) keyboard_key_pressed::return#0 -- vbuz1=vbuz2
lda keyboard_key_pressed.return
sta keyboard_key_pressed.return_13
jmp b24
//SEG104 main::@24
b24:
//SEG105 [45] (byte~) main::$27 ← (byte) keyboard_key_pressed::return#13 -- vbuz1=vbuz2
lda keyboard_key_pressed.return_13
sta _27
//SEG106 [46] if((byte~) main::$27!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@9 -- vbuz1_neq_0_then_la1
lda _27
cmp #0
bne b9_from_b24
//SEG107 [47] phi from main::@24 to main::@15 [phi:main::@24->main::@15]
b15_from_b24:
jmp b15
//SEG108 main::@15
b15:
//SEG109 [48] phi from main::@15 to main::@9 [phi:main::@15->main::@9]
b9_from_b15:
//SEG110 [48] phi (byte) main::shift#9 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@15->main::@9#0] -- vbuz1=vbuc1
lda #0
sta shift
jmp b9
//SEG111 [48] phi from main::@24 to main::@9 [phi:main::@24->main::@9]
b9_from_b24:
//SEG112 [48] phi (byte) main::shift#9 = (byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@24->main::@9#0] -- vbuz1=vbuc1
lda #1
sta shift
jmp b9
//SEG113 main::@9
b9:
//SEG114 [49] phi from main::@9 to main::@10 [phi:main::@9->main::@10]
b10_from_b9:
//SEG115 [49] phi (byte) main::ch#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@9->main::@10#0] -- vbuz1=vbuc1
lda #0
sta ch
jmp b10
// Check for key presses - and plot char if found
//SEG116 [49] phi from main::@12 to main::@10 [phi:main::@12->main::@10]
b10_from_b12:
//SEG117 [49] phi (byte) main::ch#2 = (byte) main::ch#1 [phi:main::@12->main::@10#0] -- register_copy
jmp b10
//SEG118 main::@10
b10:
//SEG119 [50] (byte) keyboard_get_keycode::ch#0 ← (byte) main::ch#2 -- vbuz1=vbuz2
lda ch
sta keyboard_get_keycode.ch
//SEG120 [51] call keyboard_get_keycode
jsr keyboard_get_keycode
//SEG121 [52] (byte) keyboard_get_keycode::return#2 ← (byte) keyboard_get_keycode::return#0 -- vbuz1=vbuz2
lda keyboard_get_keycode.return
sta keyboard_get_keycode.return_2
jmp b25
//SEG122 main::@25
b25:
//SEG123 [53] (byte) main::key#0 ← (byte) keyboard_get_keycode::return#2 -- vbuz1=vbuz2
lda keyboard_get_keycode.return_2
sta key
//SEG124 [54] if((byte) main::key#0==(byte/signed byte/word/signed word/dword/signed dword) $3f) goto main::@11 -- vbuz1_eq_vbuc1_then_la1
lda #$3f
cmp key
beq b11_from_b25
jmp b13
//SEG125 main::@13
b13:
//SEG126 [55] (byte) keyboard_key_pressed::key#5 ← (byte) main::key#0 -- vbuz1=vbuz2
lda key
sta keyboard_key_pressed.key
//SEG127 [56] call keyboard_key_pressed
//SEG128 [113] phi from main::@13 to keyboard_key_pressed [phi:main::@13->keyboard_key_pressed]
keyboard_key_pressed_from_b13:
//SEG129 [113] phi (byte) keyboard_key_pressed::key#6 = (byte) keyboard_key_pressed::key#5 [phi:main::@13->keyboard_key_pressed#0] -- register_copy
jsr keyboard_key_pressed
//SEG130 [57] (byte) keyboard_key_pressed::return#14 ← (byte) keyboard_key_pressed::return#0 -- vbuz1=vbuz2
lda keyboard_key_pressed.return
sta keyboard_key_pressed.return_14
jmp b26
//SEG131 main::@26
b26:
//SEG132 [58] (byte) main::pressed#1 ← (byte) keyboard_key_pressed::return#14 -- vbuz1=vbuz2
lda keyboard_key_pressed.return_14
sta pressed
//SEG133 [59] phi from main::@26 to main::@11 [phi:main::@26->main::@11]
b11_from_b26:
//SEG134 [59] phi (byte) main::pressed#2 = (byte) main::pressed#1 [phi:main::@26->main::@11#0] -- register_copy
jmp b11
//SEG135 [59] phi from main::@25 to main::@11 [phi:main::@25->main::@11]
b11_from_b25:
//SEG136 [59] phi (byte) main::pressed#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@25->main::@11#0] -- vbuz1=vbuc1
lda #0
sta pressed
jmp b11
//SEG137 main::@11
b11:
//SEG138 [60] if((byte) main::pressed#2==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@12 -- vbuz1_eq_0_then_la1
lda pressed
cmp #0
beq b12
jmp b14
//SEG139 main::@14
b14:
//SEG140 [61] (byte) plot_chargen::pos#1 ← (byte) main::cur_pos#11 -- vbuz1=vbuz2
lda cur_pos
sta plot_chargen.pos
//SEG141 [62] (byte) plot_chargen::ch#1 ← (byte) main::ch#2 -- vbuz1=vbuz2
lda ch
sta plot_chargen.ch
//SEG142 [63] (byte) plot_chargen::shift#1 ← (byte) main::shift#9 -- vbuz1=vbuz2
lda shift
sta plot_chargen.shift
//SEG143 [64] call plot_chargen
//SEG144 [71] phi from main::@14 to plot_chargen [phi:main::@14->plot_chargen]
plot_chargen_from_b14:
//SEG145 [71] phi (byte) plot_chargen::pos#2 = (byte) plot_chargen::pos#1 [phi:main::@14->plot_chargen#0] -- register_copy
//SEG146 [71] phi (byte) plot_chargen::shift#2 = (byte) plot_chargen::shift#1 [phi:main::@14->plot_chargen#1] -- register_copy
//SEG147 [71] phi (byte) plot_chargen::ch#2 = (byte) plot_chargen::ch#1 [phi:main::@14->plot_chargen#2] -- register_copy
jsr plot_chargen
jmp b12
//SEG148 main::@12
b12:
//SEG149 [65] (byte) main::ch#1 ← ++ (byte) main::ch#2 -- vbuz1=_inc_vbuz1
inc ch
//SEG150 [66] if((byte) main::ch#1!=(byte/signed byte/word/signed word/dword/signed dword) $40) goto main::@10 -- vbuz1_neq_vbuc1_then_la1
lda #$40
cmp ch
bne b10_from_b12
//SEG151 [22] phi from main::@12 to main::@4 [phi:main::@12->main::@4]
b4_from_b12:
//SEG152 [22] phi (byte) main::cur_pos#24 = (byte) main::cur_pos#11 [phi:main::@12->main::@4#0] -- register_copy
jmp b4
//SEG153 [67] phi from main::@23 to main::@30 [phi:main::@23->main::@30]
b30_from_b23:
jmp b30
//SEG154 main::@30
b30:
//SEG155 [42] phi from main::@30 to main::@8 [phi:main::@30->main::@8]
b8_from_b30:
//SEG156 [42] phi (byte) main::cur_pos#11 = (byte) main::cur_pos#18 [phi:main::@30->main::@8#0] -- register_copy
jmp b8
//SEG157 [68] phi from main::@22 to main::@29 [phi:main::@22->main::@29]
b29_from_b22:
jmp b29
//SEG158 main::@29
b29:
//SEG159 [37] phi from main::@29 to main::@7 [phi:main::@29->main::@7]
b7_from_b29:
//SEG160 [37] phi (byte) main::cur_pos#18 = (byte) main::cur_pos#20 [phi:main::@29->main::@7#0] -- register_copy
jmp b7
//SEG161 [69] phi from main::@21 to main::@28 [phi:main::@21->main::@28]
b28_from_b21:
jmp b28
//SEG162 main::@28
b28:
//SEG163 [32] phi from main::@28 to main::@6 [phi:main::@28->main::@6]
b6_from_b28:
//SEG164 [32] phi (byte) main::cur_pos#20 = (byte) main::cur_pos#22 [phi:main::@28->main::@6#0] -- register_copy
jmp b6
//SEG165 [70] phi from main::@20 to main::@27 [phi:main::@20->main::@27]
b27_from_b20:
jmp b27
//SEG166 main::@27
b27:
//SEG167 [27] phi from main::@27 to main::@5 [phi:main::@27->main::@5]
b5_from_b27:
//SEG168 [27] phi (byte) main::cur_pos#22 = (byte) main::cur_pos#24 [phi:main::@27->main::@5#0] -- register_copy
jmp b5
str: .text "f1@"
str1: .text "f3@"
str2: .text "f5@"
str3: .text "f7@"
}
//SEG169 plot_chargen
// Render 8x8 char (ch) as pixels on char canvas #pos
// plot_chargen(byte zeropage($b) pos, byte zeropage(9) ch, byte zeropage($a) shift)
plot_chargen: {
.label _0 = $2c
.label _1 = $2e
.label _7 = $32
.label _10 = $34
.label pos = $b
.label ch = 9
.label shift = $a
.label chargen = $c
.label sc = $10
.label bits = $f
.label x = $12
.label y = $e
.label c = $13
//SEG170 asm { sei }
sei
//SEG171 [73] (word~) plot_chargen::$0 ← ((word)) (byte) plot_chargen::ch#2 -- vwuz1=_word_vbuz2
lda ch
sta _0
lda #0
sta _0+1
//SEG172 [74] (word~) plot_chargen::$1 ← (word~) plot_chargen::$0 << (byte/signed byte/word/signed word/dword/signed dword) 3 -- vwuz1=vwuz2_rol_3
lda _0
asl
sta _1
lda _0+1
rol
sta _1+1
asl _1
rol _1+1
asl _1
rol _1+1
//SEG173 [75] (byte*) plot_chargen::chargen#0 ← (const byte*) CHARGEN#0 + (word~) plot_chargen::$1 -- pbuz1=pbuc1_plus_vwuz2
lda _1
clc
adc #<CHARGEN
sta chargen
lda _1+1
adc #>CHARGEN
sta chargen+1
//SEG174 [76] if((byte) plot_chargen::shift#2==(byte/signed byte/word/signed word/dword/signed dword) 0) goto plot_chargen::@1 -- vbuz1_eq_0_then_la1
lda shift
cmp #0
beq b1_from_plot_chargen
jmp b2
//SEG175 plot_chargen::@2
b2:
//SEG176 [77] (byte*) plot_chargen::chargen#1 ← (byte*) plot_chargen::chargen#0 + (word/signed word/dword/signed dword) $800 -- pbuz1=pbuz1_plus_vwuc1
clc
lda chargen
adc #<$800
sta chargen
lda chargen+1
adc #>$800
sta chargen+1
//SEG177 [78] phi from plot_chargen plot_chargen::@2 to plot_chargen::@1 [phi:plot_chargen/plot_chargen::@2->plot_chargen::@1]
b1_from_plot_chargen:
b1_from_b2:
//SEG178 [78] phi (byte*) plot_chargen::chargen#5 = (byte*) plot_chargen::chargen#0 [phi:plot_chargen/plot_chargen::@2->plot_chargen::@1#0] -- register_copy
jmp b1
//SEG179 plot_chargen::@1
b1:
//SEG180 [79] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $32 -- _deref_pbuc1=vbuc2
lda #$32
sta PROCPORT
//SEG181 [80] (byte) mul8u::a#1 ← (byte) plot_chargen::pos#2 -- vbuz1=vbuz2
lda pos
sta mul8u.a
//SEG182 [81] call mul8u
//SEG183 [103] phi from plot_chargen::@1 to mul8u [phi:plot_chargen::@1->mul8u]
mul8u_from_b1:
jsr mul8u
//SEG184 [82] (word) mul8u::return#2 ← (word) mul8u::res#2 -- vwuz1=vwuz2
lda mul8u.res
sta mul8u.return
lda mul8u.res+1
sta mul8u.return+1
jmp b9
//SEG185 plot_chargen::@9
b9:
//SEG186 [83] (word~) plot_chargen::$7 ← (word) mul8u::return#2 -- vwuz1=vwuz2
lda mul8u.return
sta _7
lda mul8u.return+1
sta _7+1
//SEG187 [84] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28+(byte/signed byte/word/signed word/dword/signed dword) 1 + (word~) plot_chargen::$7 -- pbuz1=pbuc1_plus_vwuz2
lda _7
clc
adc #<SCREEN+$28+1
sta sc
lda _7+1
adc #>SCREEN+$28+1
sta sc+1
//SEG188 [85] phi from plot_chargen::@9 to plot_chargen::@3 [phi:plot_chargen::@9->plot_chargen::@3]
b3_from_b9:
//SEG189 [85] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#0 [phi:plot_chargen::@9->plot_chargen::@3#0] -- register_copy
//SEG190 [85] phi (byte) plot_chargen::y#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:plot_chargen::@9->plot_chargen::@3#1] -- vbuz1=vbuc1
lda #0
sta y
jmp b3
//SEG191 [85] phi from plot_chargen::@7 to plot_chargen::@3 [phi:plot_chargen::@7->plot_chargen::@3]
b3_from_b7:
//SEG192 [85] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#2 [phi:plot_chargen::@7->plot_chargen::@3#0] -- register_copy
//SEG193 [85] phi (byte) plot_chargen::y#2 = (byte) plot_chargen::y#1 [phi:plot_chargen::@7->plot_chargen::@3#1] -- register_copy
jmp b3
//SEG194 plot_chargen::@3
b3:
//SEG195 [86] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#5 + (byte) plot_chargen::y#2) -- vbuz1=pbuz2_derefidx_vbuz3
ldy y
lda (chargen),y
sta bits
//SEG196 [87] phi from plot_chargen::@3 to plot_chargen::@4 [phi:plot_chargen::@3->plot_chargen::@4]
b4_from_b3:
//SEG197 [87] phi (byte) plot_chargen::x#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:plot_chargen::@3->plot_chargen::@4#0] -- vbuz1=vbuc1
lda #0
sta x
//SEG198 [87] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#7 [phi:plot_chargen::@3->plot_chargen::@4#1] -- register_copy
//SEG199 [87] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#0 [phi:plot_chargen::@3->plot_chargen::@4#2] -- register_copy
jmp b4
//SEG200 [87] phi from plot_chargen::@5 to plot_chargen::@4 [phi:plot_chargen::@5->plot_chargen::@4]
b4_from_b5:
//SEG201 [87] phi (byte) plot_chargen::x#2 = (byte) plot_chargen::x#1 [phi:plot_chargen::@5->plot_chargen::@4#0] -- register_copy
//SEG202 [87] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#1 [phi:plot_chargen::@5->plot_chargen::@4#1] -- register_copy
//SEG203 [87] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#1 [phi:plot_chargen::@5->plot_chargen::@4#2] -- register_copy
jmp b4
//SEG204 plot_chargen::@4
b4:
//SEG205 [88] (byte~) plot_chargen::$10 ← (byte) plot_chargen::bits#2 & (byte/word/signed word/dword/signed dword) $80 -- vbuz1=vbuz2_band_vbuc1
lda #$80
and bits
sta _10
//SEG206 [89] if((byte~) plot_chargen::$10==(byte/signed byte/word/signed word/dword/signed dword) 0) goto plot_chargen::@5 -- vbuz1_eq_0_then_la1
lda _10
cmp #0
beq b5_from_b4
//SEG207 [90] phi from plot_chargen::@4 to plot_chargen::@6 [phi:plot_chargen::@4->plot_chargen::@6]
b6_from_b4:
jmp b6
//SEG208 plot_chargen::@6
b6:
//SEG209 [91] phi from plot_chargen::@6 to plot_chargen::@5 [phi:plot_chargen::@6->plot_chargen::@5]
b5_from_b6:
//SEG210 [91] phi (byte) plot_chargen::c#2 = (byte) '*' [phi:plot_chargen::@6->plot_chargen::@5#0] -- vbuz1=vbuc1
lda #'*'
sta c
jmp b5
//SEG211 [91] phi from plot_chargen::@4 to plot_chargen::@5 [phi:plot_chargen::@4->plot_chargen::@5]
b5_from_b4:
//SEG212 [91] phi (byte) plot_chargen::c#2 = (byte) '.' [phi:plot_chargen::@4->plot_chargen::@5#0] -- vbuz1=vbuc1
lda #'.'
sta c
jmp b5
//SEG213 plot_chargen::@5
b5:
//SEG214 [92] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 -- _deref_pbuz1=vbuz2
lda c
ldy #0
sta (sc),y
//SEG215 [93] (byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3 -- pbuz1=_inc_pbuz1
inc sc
bne !+
inc sc+1
!:
//SEG216 [94] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuz1=vbuz1_rol_1
asl bits
//SEG217 [95] (byte) plot_chargen::x#1 ← ++ (byte) plot_chargen::x#2 -- vbuz1=_inc_vbuz1
inc x
//SEG218 [96] if((byte) plot_chargen::x#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto plot_chargen::@4 -- vbuz1_neq_vbuc1_then_la1
lda #8
cmp x
bne b4_from_b5
jmp b7
//SEG219 plot_chargen::@7
b7:
//SEG220 [97] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte/signed byte/word/signed word/dword/signed dword) $20 -- pbuz1=pbuz1_plus_vbuc1
lda #$20
clc
adc sc
sta sc
bcc !+
inc sc+1
!:
//SEG221 [98] (byte) plot_chargen::y#1 ← ++ (byte) plot_chargen::y#2 -- vbuz1=_inc_vbuz1
inc y
//SEG222 [99] if((byte) plot_chargen::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto plot_chargen::@3 -- vbuz1_neq_vbuc1_then_la1
lda #8
cmp y
bne b3_from_b7
jmp b8
//SEG223 plot_chargen::@8
b8:
//SEG224 [100] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $37 -- _deref_pbuc1=vbuc2
lda #$37
sta PROCPORT
//SEG225 asm { cli }
cli
jmp breturn
//SEG226 plot_chargen::@return
breturn:
//SEG227 [102] return
rts
}
//SEG228 mul8u
// Perform binary multiplication of two unsigned 8-bit bytes into a 16-bit unsigned word
// mul8u(byte zeropage($14) a)
mul8u: {
.const b = $a
.label _1 = $35
.label a = $14
.label mb = $17
.label res = $15
.label return = $30
//SEG229 [104] phi from mul8u to mul8u::@1 [phi:mul8u->mul8u::@1]
b1_from_mul8u:
//SEG230 [104] phi (word) mul8u::mb#2 = ((word))(const byte) mul8u::b#0 [phi:mul8u->mul8u::@1#0] -- vwuz1=vbuc1
lda #b
sta mb
lda #0
sta mb+1
//SEG231 [104] phi (word) mul8u::res#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:mul8u->mul8u::@1#1] -- vwuz1=vbuc1
lda #0
sta res
lda #0
sta res+1
//SEG232 [104] phi (byte) mul8u::a#2 = (byte) mul8u::a#1 [phi:mul8u->mul8u::@1#2] -- register_copy
jmp b1
//SEG233 mul8u::@1
b1:
//SEG234 [105] if((byte) mul8u::a#2!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mul8u::@2 -- vbuz1_neq_0_then_la1
lda a
cmp #0
bne b2
jmp breturn
//SEG235 mul8u::@return
breturn:
//SEG236 [106] return
rts
//SEG237 mul8u::@2
b2:
//SEG238 [107] (byte~) mul8u::$1 ← (byte) mul8u::a#2 & (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuz1=vbuz2_band_vbuc1
lda #1
and a
sta _1
//SEG239 [108] if((byte~) mul8u::$1==(byte/signed byte/word/signed word/dword/signed dword) 0) goto mul8u::@3 -- vbuz1_eq_0_then_la1
lda _1
cmp #0
beq b3_from_b2
jmp b4
//SEG240 mul8u::@4
b4:
//SEG241 [109] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 -- vwuz1=vwuz1_plus_vwuz2
lda res
clc
adc mb
sta res
lda res+1
adc mb+1
sta res+1
//SEG242 [110] phi from mul8u::@2 mul8u::@4 to mul8u::@3 [phi:mul8u::@2/mul8u::@4->mul8u::@3]
b3_from_b2:
b3_from_b4:
//SEG243 [110] phi (word) mul8u::res#6 = (word) mul8u::res#2 [phi:mul8u::@2/mul8u::@4->mul8u::@3#0] -- register_copy
jmp b3
//SEG244 mul8u::@3
b3:
//SEG245 [111] (byte) mul8u::a#0 ← (byte) mul8u::a#2 >> (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuz1=vbuz1_ror_1
lsr a
//SEG246 [112] (word) mul8u::mb#1 ← (word) mul8u::mb#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vwuz1=vwuz1_rol_1
asl mb
rol mb+1
//SEG247 [104] phi from mul8u::@3 to mul8u::@1 [phi:mul8u::@3->mul8u::@1]
b1_from_b3:
//SEG248 [104] phi (word) mul8u::mb#2 = (word) mul8u::mb#1 [phi:mul8u::@3->mul8u::@1#0] -- register_copy
//SEG249 [104] phi (word) mul8u::res#2 = (word) mul8u::res#6 [phi:mul8u::@3->mul8u::@1#1] -- register_copy
//SEG250 [104] phi (byte) mul8u::a#2 = (byte) mul8u::a#0 [phi:mul8u::@3->mul8u::@1#2] -- register_copy
jmp b1
}
//SEG251 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
// keyboard_key_pressed(byte zeropage($19) key)
keyboard_key_pressed: {
.label _2 = $3a
.label colidx = $36
.label rowidx = $37
.label return = $3b
.label return_2 = $1e
.label key = $19
.label return_10 = $20
.label return_11 = $22
.label return_12 = $24
.label return_13 = $26
.label return_14 = $2b
//SEG252 [114] (byte) keyboard_key_pressed::colidx#0 ← (byte) keyboard_key_pressed::key#6 & (byte/signed byte/word/signed word/dword/signed dword) 7 -- vbuz1=vbuz2_band_vbuc1
lda #7
and key
sta colidx
//SEG253 [115] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte/signed byte/word/signed word/dword/signed dword) 3 -- vbuz1=vbuz2_ror_3
lda key
lsr
lsr
lsr
sta rowidx
//SEG254 [116] (byte) keyboard_matrix_read::rowid#0 ← (byte) keyboard_key_pressed::rowidx#0 -- vbuz1=vbuz2
lda rowidx
sta keyboard_matrix_read.rowid
//SEG255 [117] call keyboard_matrix_read
jsr keyboard_matrix_read
//SEG256 [118] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0 -- vbuz1=vbuz2
lda keyboard_matrix_read.return
sta keyboard_matrix_read.return_2
jmp b1
//SEG257 keyboard_key_pressed::@1
b1:
//SEG258 [119] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2 -- vbuz1=vbuz2
lda keyboard_matrix_read.return_2
sta _2
//SEG259 [120] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte[8]) keyboard_matrix_col_bitmask#0 + (byte) keyboard_key_pressed::colidx#0) -- vbuz1=vbuz2_band_pbuc1_derefidx_vbuz3
lda _2
ldy colidx
and keyboard_matrix_col_bitmask,y
sta return
jmp breturn
//SEG260 keyboard_key_pressed::@return
breturn:
//SEG261 [121] return
rts
}
//SEG262 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 kill the normal interrupt or sei/cli around calls to the keyboard matrix reader.
// keyboard_matrix_read(byte zeropage($38) rowid)
keyboard_matrix_read: {
.label return = $3c
.label rowid = $38
.label return_2 = $39
//SEG263 [122] *((const byte*) CIA1_PORT_A#0) ← *((const byte[8]) keyboard_matrix_row_bitmask#0 + (byte) keyboard_matrix_read::rowid#0) -- _deref_pbuc1=pbuc2_derefidx_vbuz1
ldy rowid
lda keyboard_matrix_row_bitmask,y
sta CIA1_PORT_A
//SEG264 [123] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B#0) -- vbuz1=_bnot__deref_pbuc1
lda CIA1_PORT_B
eor #$ff
sta return
jmp breturn
//SEG265 keyboard_matrix_read::@return
breturn:
//SEG266 [124] return
rts
}
//SEG267 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) .
// keyboard_get_keycode(byte zeropage($28) ch)
keyboard_get_keycode: {
.label return = $3d
.label ch = $28
.label return_2 = $29
//SEG268 [125] (byte) keyboard_get_keycode::return#0 ← *((const byte[]) keyboard_char_keycodes#0 + (byte) keyboard_get_keycode::ch#0) -- vbuz1=pbuc1_derefidx_vbuz2
ldy ch
lda keyboard_char_keycodes,y
sta return
jmp breturn
//SEG269 keyboard_get_keycode::@return
breturn:
//SEG270 [126] return
rts
}
//SEG271 print_str_at
// Print a string at a specific screen position
// print_str_at(byte* zeropage($1a) str, byte* zeropage($1c) at)
print_str_at: {
.label at = $1c
.label str = $1a
//SEG272 [128] phi from print_str_at print_str_at::@2 to print_str_at::@1 [phi:print_str_at/print_str_at::@2->print_str_at::@1]
b1_from_print_str_at:
b1_from_b2:
//SEG273 [128] phi (byte*) print_str_at::at#5 = (byte*) print_str_at::at#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#0] -- register_copy
//SEG274 [128] phi (byte*) print_str_at::str#5 = (byte*) print_str_at::str#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#1] -- register_copy
jmp b1
//SEG275 print_str_at::@1
b1:
//SEG276 [129] if(*((byte*) print_str_at::str#5)!=(byte) '@') goto print_str_at::@2 -- _deref_pbuz1_neq_vbuc1_then_la1
ldy #0
lda (str),y
cmp #'@'
bne b2
jmp breturn
//SEG277 print_str_at::@return
breturn:
//SEG278 [130] return
rts
//SEG279 print_str_at::@2
b2:
//SEG280 [131] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) -- _deref_pbuz1=_deref_pbuz2
ldy #0
lda (str),y
ldy #0
sta (at),y
//SEG281 [132] (byte*) print_str_at::at#4 ← ++ (byte*) print_str_at::at#5 -- pbuz1=_inc_pbuz1
inc at
bne !+
inc at+1
!:
//SEG282 [133] (byte*) print_str_at::str#4 ← ++ (byte*) print_str_at::str#5 -- pbuz1=_inc_pbuz1
inc str
bne !+
inc str+1
!:
jmp b1_from_b2
}
// 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
// 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
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [6] *((byte*) main::sc#2) ← (byte) ' ' [ main::sc#2 ] ( main:2 [ main::sc#2 ] ) always clobbers reg byte a reg byte y
Statement [8] if((byte*) main::sc#1<(const byte*) SCREEN#0+(word/signed word/dword/signed dword) $3e8) goto main::@1 [ main::sc#1 ] ( main:2 [ main::sc#1 ] ) always clobbers reg byte a
Statement [73] (word~) plot_chargen::$0 ← ((word)) (byte) plot_chargen::ch#2 [ plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$0 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$0 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$0 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:4 [ main::i#2 main::i#1 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:10 [ plot_chargen::shift#2 plot_chargen::shift#1 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:11 [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:6 [ main::shift#9 ]
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:7 [ main::ch#2 main::ch#1 ]
Statement [74] (word~) plot_chargen::$1 ← (word~) plot_chargen::$0 << (byte/signed byte/word/signed word/dword/signed dword) 3 [ plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$1 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$1 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$1 ] ) always clobbers reg byte a
Statement [75] (byte*) plot_chargen::chargen#0 ← (const byte*) CHARGEN#0 + (word~) plot_chargen::$1 [ plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::chargen#0 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::chargen#0 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::chargen#0 ] ) always clobbers reg byte a
Statement [77] (byte*) plot_chargen::chargen#1 ← (byte*) plot_chargen::chargen#0 + (word/signed word/dword/signed dword) $800 [ plot_chargen::pos#2 plot_chargen::chargen#1 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::pos#2 plot_chargen::chargen#1 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::pos#2 plot_chargen::chargen#1 ] ) always clobbers reg byte a
Statement [79] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $32 [ plot_chargen::pos#2 plot_chargen::chargen#5 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::pos#2 plot_chargen::chargen#5 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::pos#2 plot_chargen::chargen#5 ] ) always clobbers reg byte a
Statement [82] (word) mul8u::return#2 ← (word) mul8u::res#2 [ plot_chargen::chargen#5 mul8u::return#2 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::chargen#5 mul8u::return#2 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 mul8u::return#2 ] ) always clobbers reg byte a
Statement [83] (word~) plot_chargen::$7 ← (word) mul8u::return#2 [ plot_chargen::chargen#5 plot_chargen::$7 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::chargen#5 plot_chargen::$7 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::$7 ] ) always clobbers reg byte a
Statement [84] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28+(byte/signed byte/word/signed word/dword/signed dword) 1 + (word~) plot_chargen::$7 [ plot_chargen::chargen#5 plot_chargen::sc#0 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::chargen#5 plot_chargen::sc#0 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::sc#0 ] ) always clobbers reg byte a
Statement [86] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#5 + (byte) plot_chargen::y#2) [ plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:14 [ plot_chargen::y#2 plot_chargen::y#1 ]
Statement [92] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 [ plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:4 [ main::i#2 main::i#1 ]
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:14 [ plot_chargen::y#2 plot_chargen::y#1 ]
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ]
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:18 [ plot_chargen::x#2 plot_chargen::x#1 ]
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ]
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:6 [ main::shift#9 ]
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:7 [ main::ch#2 main::ch#1 ]
Statement [97] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte/signed byte/word/signed word/dword/signed dword) $20 [ plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#2 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#2 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#2 ] ) always clobbers reg byte a
Statement [100] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $37 [ ] ( main:2::plot_chargen:19 [ main::i#2 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 ] ) always clobbers reg byte a
Statement [109] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 [ mul8u::a#2 mul8u::mb#2 mul8u::res#1 ] ( main:2::plot_chargen:19::mul8u:81 [ main::i#2 plot_chargen::chargen#5 mul8u::a#2 mul8u::mb#2 mul8u::res#1 ] main:2::plot_chargen:64::mul8u:81 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 mul8u::a#2 mul8u::mb#2 mul8u::res#1 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:20 [ mul8u::a#2 mul8u::a#1 mul8u::a#0 ]
Statement [115] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte/signed byte/word/signed word/dword/signed dword) 3 [ keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] ( main:2::keyboard_key_pressed:23 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] main:2::keyboard_key_pressed:28 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] main:2::keyboard_key_pressed:33 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] main:2::keyboard_key_pressed:38 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] main:2::keyboard_key_pressed:43 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] main:2::keyboard_key_pressed:56 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:54 [ keyboard_key_pressed::colidx#0 ]
Statement [122] *((const byte*) CIA1_PORT_A#0) ← *((const byte[8]) keyboard_matrix_row_bitmask#0 + (byte) keyboard_matrix_read::rowid#0) [ ] ( main:2::keyboard_key_pressed:23::keyboard_matrix_read:117 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 ] main:2::keyboard_key_pressed:28::keyboard_matrix_read:117 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 ] main:2::keyboard_key_pressed:33::keyboard_matrix_read:117 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 ] main:2::keyboard_key_pressed:38::keyboard_matrix_read:117 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 ] main:2::keyboard_key_pressed:43::keyboard_matrix_read:117 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 ] main:2::keyboard_key_pressed:56::keyboard_matrix_read:117 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 ] ) always clobbers reg byte a
Statement [123] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B#0) [ keyboard_matrix_read::return#0 ] ( main:2::keyboard_key_pressed:23::keyboard_matrix_read:117 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] main:2::keyboard_key_pressed:28::keyboard_matrix_read:117 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] main:2::keyboard_key_pressed:33::keyboard_matrix_read:117 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] main:2::keyboard_key_pressed:38::keyboard_matrix_read:117 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] main:2::keyboard_key_pressed:43::keyboard_matrix_read:117 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] main:2::keyboard_key_pressed:56::keyboard_matrix_read:117 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] ) always clobbers reg byte a
Statement [129] if(*((byte*) print_str_at::str#5)!=(byte) '@') goto print_str_at::@2 [ print_str_at::str#5 print_str_at::at#5 ] ( main:2::print_str_at:10 [ print_str_at::str#5 print_str_at::at#5 ] main:2::print_str_at:12 [ print_str_at::str#5 print_str_at::at#5 ] main:2::print_str_at:14 [ print_str_at::str#5 print_str_at::at#5 ] main:2::print_str_at:16 [ print_str_at::str#5 print_str_at::at#5 ] ) always clobbers reg byte a reg byte y
Statement [131] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) [ print_str_at::str#5 print_str_at::at#5 ] ( main:2::print_str_at:10 [ print_str_at::str#5 print_str_at::at#5 ] main:2::print_str_at:12 [ print_str_at::str#5 print_str_at::at#5 ] main:2::print_str_at:14 [ print_str_at::str#5 print_str_at::at#5 ] main:2::print_str_at:16 [ print_str_at::str#5 print_str_at::at#5 ] ) always clobbers reg byte a reg byte y
Statement [6] *((byte*) main::sc#2) ← (byte) ' ' [ main::sc#2 ] ( main:2 [ main::sc#2 ] ) always clobbers reg byte a reg byte y
Statement [8] if((byte*) main::sc#1<(const byte*) SCREEN#0+(word/signed word/dword/signed dword) $3e8) goto main::@1 [ main::sc#1 ] ( main:2 [ main::sc#1 ] ) always clobbers reg byte a
Statement [73] (word~) plot_chargen::$0 ← ((word)) (byte) plot_chargen::ch#2 [ plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$0 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$0 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$0 ] ) always clobbers reg byte a
Statement [74] (word~) plot_chargen::$1 ← (word~) plot_chargen::$0 << (byte/signed byte/word/signed word/dword/signed dword) 3 [ plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$1 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$1 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::$1 ] ) always clobbers reg byte a
Statement [75] (byte*) plot_chargen::chargen#0 ← (const byte*) CHARGEN#0 + (word~) plot_chargen::$1 [ plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::chargen#0 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::chargen#0 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::shift#2 plot_chargen::pos#2 plot_chargen::chargen#0 ] ) always clobbers reg byte a
Statement [77] (byte*) plot_chargen::chargen#1 ← (byte*) plot_chargen::chargen#0 + (word/signed word/dword/signed dword) $800 [ plot_chargen::pos#2 plot_chargen::chargen#1 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::pos#2 plot_chargen::chargen#1 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::pos#2 plot_chargen::chargen#1 ] ) always clobbers reg byte a
Statement [79] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $32 [ plot_chargen::pos#2 plot_chargen::chargen#5 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::pos#2 plot_chargen::chargen#5 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::pos#2 plot_chargen::chargen#5 ] ) always clobbers reg byte a
Statement [82] (word) mul8u::return#2 ← (word) mul8u::res#2 [ plot_chargen::chargen#5 mul8u::return#2 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::chargen#5 mul8u::return#2 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 mul8u::return#2 ] ) always clobbers reg byte a
Statement [83] (word~) plot_chargen::$7 ← (word) mul8u::return#2 [ plot_chargen::chargen#5 plot_chargen::$7 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::chargen#5 plot_chargen::$7 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::$7 ] ) always clobbers reg byte a
Statement [84] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28+(byte/signed byte/word/signed word/dword/signed dword) 1 + (word~) plot_chargen::$7 [ plot_chargen::chargen#5 plot_chargen::sc#0 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::chargen#5 plot_chargen::sc#0 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::sc#0 ] ) always clobbers reg byte a
Statement [86] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#5 + (byte) plot_chargen::y#2) [ plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#7 plot_chargen::bits#0 ] ) always clobbers reg byte a reg byte y
Statement [92] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 [ plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::bits#2 plot_chargen::sc#3 plot_chargen::x#2 ] ) always clobbers reg byte y
Statement [97] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte/signed byte/word/signed word/dword/signed dword) $20 [ plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#2 ] ( main:2::plot_chargen:19 [ main::i#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#2 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 plot_chargen::y#2 plot_chargen::sc#2 ] ) always clobbers reg byte a
Statement [100] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $37 [ ] ( main:2::plot_chargen:19 [ main::i#2 ] main:2::plot_chargen:64 [ main::cur_pos#11 main::shift#9 main::ch#2 ] ) always clobbers reg byte a
Statement [107] (byte~) mul8u::$1 ← (byte) mul8u::a#2 & (byte/signed byte/word/signed word/dword/signed dword) 1 [ mul8u::res#2 mul8u::a#2 mul8u::mb#2 mul8u::$1 ] ( main:2::plot_chargen:19::mul8u:81 [ main::i#2 plot_chargen::chargen#5 mul8u::res#2 mul8u::a#2 mul8u::mb#2 mul8u::$1 ] main:2::plot_chargen:64::mul8u:81 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 mul8u::res#2 mul8u::a#2 mul8u::mb#2 mul8u::$1 ] ) always clobbers reg byte a
Statement [109] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 [ mul8u::a#2 mul8u::mb#2 mul8u::res#1 ] ( main:2::plot_chargen:19::mul8u:81 [ main::i#2 plot_chargen::chargen#5 mul8u::a#2 mul8u::mb#2 mul8u::res#1 ] main:2::plot_chargen:64::mul8u:81 [ main::cur_pos#11 main::shift#9 main::ch#2 plot_chargen::chargen#5 mul8u::a#2 mul8u::mb#2 mul8u::res#1 ] ) always clobbers reg byte a
Statement [115] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte/signed byte/word/signed word/dword/signed dword) 3 [ keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] ( main:2::keyboard_key_pressed:23 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] main:2::keyboard_key_pressed:28 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] main:2::keyboard_key_pressed:33 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] main:2::keyboard_key_pressed:38 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] main:2::keyboard_key_pressed:43 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] main:2::keyboard_key_pressed:56 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 keyboard_key_pressed::rowidx#0 ] ) always clobbers reg byte a
Statement [122] *((const byte*) CIA1_PORT_A#0) ← *((const byte[8]) keyboard_matrix_row_bitmask#0 + (byte) keyboard_matrix_read::rowid#0) [ ] ( main:2::keyboard_key_pressed:23::keyboard_matrix_read:117 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 ] main:2::keyboard_key_pressed:28::keyboard_matrix_read:117 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 ] main:2::keyboard_key_pressed:33::keyboard_matrix_read:117 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 ] main:2::keyboard_key_pressed:38::keyboard_matrix_read:117 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 ] main:2::keyboard_key_pressed:43::keyboard_matrix_read:117 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 ] main:2::keyboard_key_pressed:56::keyboard_matrix_read:117 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 ] ) always clobbers reg byte a
Statement [123] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B#0) [ keyboard_matrix_read::return#0 ] ( main:2::keyboard_key_pressed:23::keyboard_matrix_read:117 [ main::cur_pos#24 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] main:2::keyboard_key_pressed:28::keyboard_matrix_read:117 [ main::cur_pos#22 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] main:2::keyboard_key_pressed:33::keyboard_matrix_read:117 [ main::cur_pos#20 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] main:2::keyboard_key_pressed:38::keyboard_matrix_read:117 [ main::cur_pos#18 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] main:2::keyboard_key_pressed:43::keyboard_matrix_read:117 [ main::cur_pos#11 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] main:2::keyboard_key_pressed:56::keyboard_matrix_read:117 [ main::cur_pos#11 main::shift#9 main::ch#2 keyboard_key_pressed::colidx#0 keyboard_matrix_read::return#0 ] ) always clobbers reg byte a
Statement [129] if(*((byte*) print_str_at::str#5)!=(byte) '@') goto print_str_at::@2 [ print_str_at::str#5 print_str_at::at#5 ] ( main:2::print_str_at:10 [ print_str_at::str#5 print_str_at::at#5 ] main:2::print_str_at:12 [ print_str_at::str#5 print_str_at::at#5 ] main:2::print_str_at:14 [ print_str_at::str#5 print_str_at::at#5 ] main:2::print_str_at:16 [ print_str_at::str#5 print_str_at::at#5 ] ) always clobbers reg byte a reg byte y
Statement [131] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) [ print_str_at::str#5 print_str_at::at#5 ] ( main:2::print_str_at:10 [ print_str_at::str#5 print_str_at::at#5 ] main:2::print_str_at:12 [ print_str_at::str#5 print_str_at::at#5 ] main:2::print_str_at:14 [ print_str_at::str#5 print_str_at::at#5 ] main:2::print_str_at:16 [ print_str_at::str#5 print_str_at::at#5 ] ) always clobbers reg byte a reg byte y
Potential registers zp ZP_WORD:2 [ main::sc#2 main::sc#1 ] : zp ZP_WORD:2 ,
Potential registers zp ZP_BYTE:4 [ main::i#2 main::i#1 ] : zp ZP_BYTE:4 , reg byte x ,
Potential registers zp ZP_BYTE:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ] : zp ZP_BYTE:5 , reg byte x ,
Potential registers zp ZP_BYTE:6 [ main::shift#9 ] : zp ZP_BYTE:6 , reg byte x ,
Potential registers zp ZP_BYTE:7 [ main::ch#2 main::ch#1 ] : zp ZP_BYTE:7 , reg byte x ,
Potential registers zp ZP_BYTE:8 [ main::pressed#2 main::pressed#1 ] : zp ZP_BYTE:8 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:9 [ plot_chargen::ch#2 plot_chargen::ch#1 ] : zp ZP_BYTE:9 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:10 [ plot_chargen::shift#2 plot_chargen::shift#1 ] : zp ZP_BYTE:10 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:11 [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ] : zp ZP_BYTE:11 , reg byte x , reg byte y ,
Potential registers zp ZP_WORD:12 [ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 ] : zp ZP_WORD:12 ,
Potential registers zp ZP_BYTE:14 [ plot_chargen::y#2 plot_chargen::y#1 ] : zp ZP_BYTE:14 , reg byte x ,
Potential registers zp ZP_BYTE:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] : zp ZP_BYTE:15 , reg byte a , reg byte x ,
Potential registers zp ZP_WORD:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 ] : zp ZP_WORD:16 ,
Potential registers zp ZP_BYTE:18 [ plot_chargen::x#2 plot_chargen::x#1 ] : zp ZP_BYTE:18 , reg byte a , reg byte x ,
Potential registers zp ZP_BYTE:19 [ plot_chargen::c#2 ] : zp ZP_BYTE:19 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:20 [ mul8u::a#2 mul8u::a#1 mul8u::a#0 ] : zp ZP_BYTE:20 , reg byte x , reg byte y ,
Potential registers zp ZP_WORD:21 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] : zp ZP_WORD:21 ,
Potential registers zp ZP_WORD:23 [ mul8u::mb#2 mul8u::mb#1 ] : zp ZP_WORD:23 ,
Potential registers zp ZP_BYTE:25 [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ] : zp ZP_BYTE:25 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_WORD:26 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] : zp ZP_WORD:26 ,
Potential registers zp ZP_WORD:28 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ] : zp ZP_WORD:28 ,
Potential registers zp ZP_BYTE:30 [ keyboard_key_pressed::return#2 ] : zp ZP_BYTE:30 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:31 [ main::$15 ] : zp ZP_BYTE:31 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:32 [ keyboard_key_pressed::return#10 ] : zp ZP_BYTE:32 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:33 [ main::$18 ] : zp ZP_BYTE:33 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:34 [ keyboard_key_pressed::return#11 ] : zp ZP_BYTE:34 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:35 [ main::$21 ] : zp ZP_BYTE:35 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:36 [ keyboard_key_pressed::return#12 ] : zp ZP_BYTE:36 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:37 [ main::$24 ] : zp ZP_BYTE:37 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:38 [ keyboard_key_pressed::return#13 ] : zp ZP_BYTE:38 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:39 [ main::$27 ] : zp ZP_BYTE:39 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:40 [ keyboard_get_keycode::ch#0 ] : zp ZP_BYTE:40 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:41 [ keyboard_get_keycode::return#2 ] : zp ZP_BYTE:41 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:42 [ main::key#0 ] : zp ZP_BYTE:42 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:43 [ keyboard_key_pressed::return#14 ] : zp ZP_BYTE:43 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_WORD:44 [ plot_chargen::$0 ] : zp ZP_WORD:44 ,
Potential registers zp ZP_WORD:46 [ plot_chargen::$1 ] : zp ZP_WORD:46 ,
Potential registers zp ZP_WORD:48 [ mul8u::return#2 ] : zp ZP_WORD:48 ,
Potential registers zp ZP_WORD:50 [ plot_chargen::$7 ] : zp ZP_WORD:50 ,
Potential registers zp ZP_BYTE:52 [ plot_chargen::$10 ] : zp ZP_BYTE:52 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:53 [ mul8u::$1 ] : zp ZP_BYTE:53 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:54 [ keyboard_key_pressed::colidx#0 ] : zp ZP_BYTE:54 , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:55 [ keyboard_key_pressed::rowidx#0 ] : zp ZP_BYTE:55 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:56 [ keyboard_matrix_read::rowid#0 ] : zp ZP_BYTE:56 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:57 [ keyboard_matrix_read::return#2 ] : zp ZP_BYTE:57 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:58 [ keyboard_key_pressed::$2 ] : zp ZP_BYTE:58 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:59 [ keyboard_key_pressed::return#0 ] : zp ZP_BYTE:59 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:60 [ keyboard_matrix_read::return#0 ] : zp ZP_BYTE:60 , reg byte a , reg byte x , reg byte y ,
Potential registers zp ZP_BYTE:61 [ keyboard_get_keycode::return#0 ] : zp ZP_BYTE:61 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [plot_chargen] 20,002: zp ZP_BYTE:52 [ plot_chargen::$10 ] 17,501.75: zp ZP_BYTE:18 [ plot_chargen::x#2 plot_chargen::x#1 ] 13,098.48: zp ZP_BYTE:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] 12,091.42: zp ZP_WORD:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 ] 10,001: zp ZP_BYTE:19 [ plot_chargen::c#2 ] 1,732.5: zp ZP_BYTE:14 [ plot_chargen::y#2 plot_chargen::y#1 ] 222.6: zp ZP_BYTE:10 [ plot_chargen::shift#2 plot_chargen::shift#1 ] 152.5: zp ZP_BYTE:9 [ plot_chargen::ch#2 plot_chargen::ch#1 ] 102: zp ZP_BYTE:11 [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ] 52.68: zp ZP_WORD:12 [ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 ] 4: zp ZP_WORD:44 [ plot_chargen::$0 ] 4: zp ZP_WORD:46 [ plot_chargen::$1 ] 4: zp ZP_WORD:50 [ plot_chargen::$7 ]
Uplift Scope [mul8u] 3,503.83: zp ZP_WORD:21 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] 2,431: zp ZP_WORD:23 [ mul8u::mb#2 mul8u::mb#1 ] 2,002: zp ZP_BYTE:53 [ mul8u::$1 ] 1,670.67: zp ZP_BYTE:20 [ mul8u::a#2 mul8u::a#1 mul8u::a#0 ] 4: zp ZP_WORD:48 [ mul8u::return#2 ]
Uplift Scope [main] 404: zp ZP_BYTE:8 [ main::pressed#2 main::pressed#1 ] 176.75: zp ZP_BYTE:7 [ main::ch#2 main::ch#1 ] 151.5: zp ZP_BYTE:42 [ main::key#0 ] 38.19: zp ZP_BYTE:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ] 33: zp ZP_WORD:2 [ main::sc#2 main::sc#1 ] 27.5: zp ZP_BYTE:4 [ main::i#2 main::i#1 ] 22: zp ZP_BYTE:31 [ main::$15 ] 22: zp ZP_BYTE:33 [ main::$18 ] 22: zp ZP_BYTE:35 [ main::$21 ] 22: zp ZP_BYTE:37 [ main::$24 ] 22: zp ZP_BYTE:39 [ main::$27 ] 5.32: zp ZP_BYTE:6 [ main::shift#9 ]
Uplift Scope [keyboard_key_pressed] 254.5: zp ZP_BYTE:25 [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ] 202: zp ZP_BYTE:43 [ keyboard_key_pressed::return#14 ] 22: zp ZP_BYTE:30 [ keyboard_key_pressed::return#2 ] 22: zp ZP_BYTE:32 [ keyboard_key_pressed::return#10 ] 22: zp ZP_BYTE:34 [ keyboard_key_pressed::return#11 ] 22: zp ZP_BYTE:36 [ keyboard_key_pressed::return#12 ] 22: zp ZP_BYTE:38 [ keyboard_key_pressed::return#13 ] 19.75: zp ZP_BYTE:59 [ keyboard_key_pressed::return#0 ] 4: zp ZP_BYTE:55 [ keyboard_key_pressed::rowidx#0 ] 4: zp ZP_BYTE:58 [ keyboard_key_pressed::$2 ] 0.67: zp ZP_BYTE:54 [ keyboard_key_pressed::colidx#0 ]
Uplift Scope [keyboard_get_keycode] 202: zp ZP_BYTE:41 [ keyboard_get_keycode::return#2 ] 103: zp ZP_BYTE:40 [ keyboard_get_keycode::ch#0 ] 34.33: zp ZP_BYTE:61 [ keyboard_get_keycode::return#0 ]
Uplift Scope [print_str_at] 35.5: zp ZP_WORD:26 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] 24.67: zp ZP_WORD:28 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ]
Uplift Scope [keyboard_matrix_read] 4: zp ZP_BYTE:56 [ keyboard_matrix_read::rowid#0 ] 4: zp ZP_BYTE:57 [ keyboard_matrix_read::return#2 ] 1.33: zp ZP_BYTE:60 [ keyboard_matrix_read::return#0 ]
Uplift Scope []
Uplifting [plot_chargen] best 819629 combination reg byte a [ plot_chargen::$10 ] reg byte x [ plot_chargen::x#2 plot_chargen::x#1 ] zp ZP_BYTE:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ] zp ZP_WORD:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 ] reg byte a [ plot_chargen::c#2 ] zp ZP_BYTE:14 [ plot_chargen::y#2 plot_chargen::y#1 ] zp ZP_BYTE:10 [ plot_chargen::shift#2 plot_chargen::shift#1 ] zp ZP_BYTE:9 [ plot_chargen::ch#2 plot_chargen::ch#1 ] zp ZP_BYTE:11 [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ] zp ZP_WORD:12 [ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 ] zp ZP_WORD:44 [ plot_chargen::$0 ] zp ZP_WORD:46 [ plot_chargen::$1 ] zp ZP_WORD:50 [ plot_chargen::$7 ]
Limited combination testing to 100 combinations of 10368 possible.
Uplifting [mul8u] best 810626 combination zp ZP_WORD:21 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] zp ZP_WORD:23 [ mul8u::mb#2 mul8u::mb#1 ] reg byte a [ mul8u::$1 ] reg byte x [ mul8u::a#2 mul8u::a#1 mul8u::a#0 ] zp ZP_WORD:48 [ mul8u::return#2 ]
Uplifting [main] best 808826 combination reg byte a [ main::pressed#2 main::pressed#1 ] zp ZP_BYTE:7 [ main::ch#2 main::ch#1 ] reg byte a [ main::key#0 ] zp ZP_BYTE:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ] zp ZP_WORD:2 [ main::sc#2 main::sc#1 ] zp ZP_BYTE:4 [ main::i#2 main::i#1 ] zp ZP_BYTE:31 [ main::$15 ] zp ZP_BYTE:33 [ main::$18 ] zp ZP_BYTE:35 [ main::$21 ] zp ZP_BYTE:37 [ main::$24 ] zp ZP_BYTE:39 [ main::$27 ] zp ZP_BYTE:6 [ main::shift#9 ]
Limited combination testing to 100 combinations of 262144 possible.
Uplifting [keyboard_key_pressed] best 807987 combination reg byte x [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ] reg byte a [ keyboard_key_pressed::return#14 ] reg byte a [ keyboard_key_pressed::return#2 ] reg byte a [ keyboard_key_pressed::return#10 ] zp ZP_BYTE:34 [ keyboard_key_pressed::return#11 ] zp ZP_BYTE:36 [ keyboard_key_pressed::return#12 ] zp ZP_BYTE:38 [ keyboard_key_pressed::return#13 ] zp ZP_BYTE:59 [ keyboard_key_pressed::return#0 ] zp ZP_BYTE:55 [ keyboard_key_pressed::rowidx#0 ] zp ZP_BYTE:58 [ keyboard_key_pressed::$2 ] zp ZP_BYTE:54 [ keyboard_key_pressed::colidx#0 ]
Limited combination testing to 100 combinations of 3145728 possible.
Uplifting [keyboard_get_keycode] best 806781 combination reg byte a [ keyboard_get_keycode::return#2 ] reg byte x [ keyboard_get_keycode::ch#0 ] reg byte a [ keyboard_get_keycode::return#0 ]
Uplifting [print_str_at] best 806781 combination zp ZP_WORD:26 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] zp ZP_WORD:28 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ]
Uplifting [keyboard_matrix_read] best 806763 combination reg byte x [ keyboard_matrix_read::rowid#0 ] reg byte a [ keyboard_matrix_read::return#2 ] reg byte a [ keyboard_matrix_read::return#0 ]
Uplifting [] best 806763 combination
Attempting to uplift remaining variables inzp ZP_BYTE:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ]
Uplifting [plot_chargen] best 806763 combination zp ZP_BYTE:15 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ]
Attempting to uplift remaining variables inzp ZP_BYTE:14 [ plot_chargen::y#2 plot_chargen::y#1 ]
Uplifting [plot_chargen] best 806763 combination zp ZP_BYTE:14 [ plot_chargen::y#2 plot_chargen::y#1 ]
Attempting to uplift remaining variables inzp ZP_BYTE:10 [ plot_chargen::shift#2 plot_chargen::shift#1 ]
Uplifting [plot_chargen] best 806457 combination reg byte x [ plot_chargen::shift#2 plot_chargen::shift#1 ]
Attempting to uplift remaining variables inzp ZP_BYTE:7 [ main::ch#2 main::ch#1 ]
Uplifting [main] best 806457 combination zp ZP_BYTE:7 [ main::ch#2 main::ch#1 ]
Attempting to uplift remaining variables inzp ZP_BYTE:9 [ plot_chargen::ch#2 plot_chargen::ch#1 ]
Uplifting [plot_chargen] best 806151 combination reg byte a [ plot_chargen::ch#2 plot_chargen::ch#1 ]
Attempting to uplift remaining variables inzp ZP_BYTE:11 [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ]
Uplifting [plot_chargen] best 805822 combination reg byte y [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ]
Attempting to uplift remaining variables inzp ZP_BYTE:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ]
Uplifting [main] best 805822 combination zp ZP_BYTE:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ]
Attempting to uplift remaining variables inzp ZP_BYTE:4 [ main::i#2 main::i#1 ]
Uplifting [main] best 805822 combination zp ZP_BYTE:4 [ main::i#2 main::i#1 ]
Attempting to uplift remaining variables inzp ZP_BYTE:31 [ main::$15 ]
Uplifting [main] best 805762 combination reg byte a [ main::$15 ]
Attempting to uplift remaining variables inzp ZP_BYTE:33 [ main::$18 ]
Uplifting [main] best 805702 combination reg byte a [ main::$18 ]
Attempting to uplift remaining variables inzp ZP_BYTE:34 [ keyboard_key_pressed::return#11 ]
Uplifting [keyboard_key_pressed] best 805642 combination reg byte a [ keyboard_key_pressed::return#11 ]
Attempting to uplift remaining variables inzp ZP_BYTE:35 [ main::$21 ]
Uplifting [main] best 805582 combination reg byte a [ main::$21 ]
Attempting to uplift remaining variables inzp ZP_BYTE:36 [ keyboard_key_pressed::return#12 ]
Uplifting [keyboard_key_pressed] best 805522 combination reg byte a [ keyboard_key_pressed::return#12 ]
Attempting to uplift remaining variables inzp ZP_BYTE:37 [ main::$24 ]
Uplifting [main] best 805462 combination reg byte a [ main::$24 ]
Attempting to uplift remaining variables inzp ZP_BYTE:38 [ keyboard_key_pressed::return#13 ]
Uplifting [keyboard_key_pressed] best 805402 combination reg byte a [ keyboard_key_pressed::return#13 ]
Attempting to uplift remaining variables inzp ZP_BYTE:39 [ main::$27 ]
Uplifting [main] best 805342 combination reg byte a [ main::$27 ]
Attempting to uplift remaining variables inzp ZP_BYTE:59 [ keyboard_key_pressed::return#0 ]
Uplifting [keyboard_key_pressed] best 804889 combination reg byte a [ keyboard_key_pressed::return#0 ]
Attempting to uplift remaining variables inzp ZP_BYTE:6 [ main::shift#9 ]
Uplifting [main] best 804889 combination zp ZP_BYTE:6 [ main::shift#9 ]
Attempting to uplift remaining variables inzp ZP_BYTE:55 [ keyboard_key_pressed::rowidx#0 ]
Uplifting [keyboard_key_pressed] best 804885 combination reg byte a [ keyboard_key_pressed::rowidx#0 ]
Attempting to uplift remaining variables inzp ZP_BYTE:58 [ keyboard_key_pressed::$2 ]
Uplifting [keyboard_key_pressed] best 804879 combination reg byte a [ keyboard_key_pressed::$2 ]
Attempting to uplift remaining variables inzp ZP_BYTE:54 [ keyboard_key_pressed::colidx#0 ]
Uplifting [keyboard_key_pressed] best 804877 combination reg byte y [ keyboard_key_pressed::colidx#0 ]
Coalescing zero page register with common assignment [ zp ZP_WORD:12 [ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 ] ] with [ zp ZP_WORD:46 [ plot_chargen::$1 ] ] - score: 1
Coalescing zero page register with common assignment [ zp ZP_WORD:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 ] ] with [ zp ZP_WORD:50 [ plot_chargen::$7 ] ] - score: 1
Coalescing zero page register with common assignment [ zp ZP_WORD:21 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 ] ] with [ zp ZP_WORD:48 [ mul8u::return#2 ] ] - score: 1
Coalescing zero page register with common assignment [ zp ZP_WORD:12 [ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 plot_chargen::$1 ] ] with [ zp ZP_WORD:44 [ plot_chargen::$0 ] ] - score: 1
Coalescing zero page register with common assignment [ zp ZP_WORD:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 plot_chargen::$7 ] ] with [ zp ZP_WORD:21 [ mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 ] ] - score: 1
Coalescing zero page register [ zp ZP_WORD:2 [ main::sc#2 main::sc#1 ] ] with [ zp ZP_WORD:12 [ plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 plot_chargen::$1 plot_chargen::$0 ] ]
Coalescing zero page register [ zp ZP_WORD:2 [ main::sc#2 main::sc#1 plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 plot_chargen::$1 plot_chargen::$0 ] ] with [ zp ZP_WORD:26 [ print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ] ]
Coalescing zero page register [ zp ZP_BYTE:4 [ main::i#2 main::i#1 ] ] with [ zp ZP_BYTE:5 [ main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ] ]
Coalescing zero page register [ zp ZP_WORD:16 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 plot_chargen::$7 mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 ] ] with [ zp ZP_WORD:28 [ print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ] ]
Allocated (was zp ZP_BYTE:6) zp ZP_BYTE:5 [ main::shift#9 ]
Allocated (was zp ZP_BYTE:7) zp ZP_BYTE:6 [ main::ch#2 main::ch#1 ]
Allocated (was zp ZP_BYTE:14) zp ZP_BYTE:7 [ plot_chargen::y#2 plot_chargen::y#1 ]
Allocated (was zp ZP_BYTE:15) zp ZP_BYTE:8 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ]
Allocated (was zp ZP_WORD:16) zp ZP_WORD:9 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 plot_chargen::$7 mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ]
Allocated (was zp ZP_WORD:23) zp ZP_WORD:11 [ mul8u::mb#2 mul8u::mb#1 ]
ASSEMBLER BEFORE OPTIMIZATION
//SEG0 File Comments
// Allows analysis of the CHARGEN ROM font
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
//SEG2 Global Constants & labels
// Processor Port Register controlling RAM/ROM configuration and the datasette
.label PROCPORT = 1
// The address of the CHARGEN character set
.label CHARGEN = $d000
// CIA#1 Port A: keyboard matrix columns and joystick #2
.label CIA1_PORT_A = $dc00
// CIA#1 Port B: keyboard matrix rows and joystick #1.
.label CIA1_PORT_B = $dc01
.const KEY_F7 = 3
.const KEY_F1 = 4
.const KEY_F3 = 5
.const KEY_F5 = 6
.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_LSHIFT = $f
.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
.label SCREEN = $400
//SEG3 @begin
bbegin:
//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
b1_from_bbegin:
jmp b1
//SEG5 @1
b1:
//SEG6 [2] call main
//SEG7 [4] phi from @1 to main [phi:@1->main]
main_from_b1:
jsr main
//SEG8 [3] phi from @1 to @end [phi:@1->@end]
bend_from_b1:
jmp bend
//SEG9 @end
bend:
//SEG10 main
main: {
.label sc = 2
.label i = 4
.label ch = 6
.label cur_pos = 4
.label shift = 5
//SEG11 [5] phi from main to main::@1 [phi:main->main::@1]
b1_from_main:
//SEG12 [5] phi (byte*) main::sc#2 = (const byte*) SCREEN#0 [phi:main->main::@1#0] -- pbuz1=pbuc1
lda #<SCREEN
sta sc
lda #>SCREEN
sta sc+1
jmp b1
// Clear screen
//SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
b1_from_b1:
//SEG14 [5] phi (byte*) main::sc#2 = (byte*) main::sc#1 [phi:main::@1->main::@1#0] -- register_copy
jmp b1
//SEG15 main::@1
b1:
//SEG16 [6] *((byte*) main::sc#2) ← (byte) ' ' -- _deref_pbuz1=vbuc1
lda #' '
ldy #0
sta (sc),y
//SEG17 [7] (byte*) main::sc#1 ← ++ (byte*) main::sc#2 -- pbuz1=_inc_pbuz1
inc sc
bne !+
inc sc+1
!:
//SEG18 [8] if((byte*) main::sc#1<(const byte*) SCREEN#0+(word/signed word/dword/signed dword) $3e8) goto main::@1 -- pbuz1_lt_pbuc1_then_la1
lda sc+1
cmp #>SCREEN+$3e8
bcc b1_from_b1
bne !+
lda sc
cmp #<SCREEN+$3e8
bcc b1_from_b1
!:
//SEG19 [9] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
b2_from_b1:
jmp b2
//SEG20 main::@2
b2:
//SEG21 [10] call print_str_at
//SEG22 [127] phi from main::@2 to print_str_at [phi:main::@2->print_str_at]
print_str_at_from_b2:
//SEG23 [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@2->print_str_at#0] -- pbuz1=pbuc1
lda #<SCREEN+1
sta print_str_at.at
lda #>SCREEN+1
sta print_str_at.at+1
//SEG24 [127] phi (byte*) print_str_at::str#7 = (const string) main::str [phi:main::@2->print_str_at#1] -- pbuz1=pbuc1
lda #<str
sta print_str_at.str
lda #>str
sta print_str_at.str+1
jsr print_str_at
//SEG25 [11] phi from main::@2 to main::@16 [phi:main::@2->main::@16]
b16_from_b2:
jmp b16
//SEG26 main::@16
b16:
//SEG27 [12] call print_str_at
//SEG28 [127] phi from main::@16 to print_str_at [phi:main::@16->print_str_at]
print_str_at_from_b16:
//SEG29 [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1+(byte/signed byte/word/signed word/dword/signed dword) $a [phi:main::@16->print_str_at#0] -- pbuz1=pbuc1
lda #<SCREEN+1+$a
sta print_str_at.at
lda #>SCREEN+1+$a
sta print_str_at.at+1
//SEG30 [127] phi (byte*) print_str_at::str#7 = (const string) main::str1 [phi:main::@16->print_str_at#1] -- pbuz1=pbuc1
lda #<str1
sta print_str_at.str
lda #>str1
sta print_str_at.str+1
jsr print_str_at
//SEG31 [13] phi from main::@16 to main::@17 [phi:main::@16->main::@17]
b17_from_b16:
jmp b17
//SEG32 main::@17
b17:
//SEG33 [14] call print_str_at
//SEG34 [127] phi from main::@17 to print_str_at [phi:main::@17->print_str_at]
print_str_at_from_b17:
//SEG35 [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1+(byte/signed byte/word/signed word/dword/signed dword) $14 [phi:main::@17->print_str_at#0] -- pbuz1=pbuc1
lda #<SCREEN+1+$14
sta print_str_at.at
lda #>SCREEN+1+$14
sta print_str_at.at+1
//SEG36 [127] phi (byte*) print_str_at::str#7 = (const string) main::str2 [phi:main::@17->print_str_at#1] -- pbuz1=pbuc1
lda #<str2
sta print_str_at.str
lda #>str2
sta print_str_at.str+1
jsr print_str_at
//SEG37 [15] phi from main::@17 to main::@18 [phi:main::@17->main::@18]
b18_from_b17:
jmp b18
//SEG38 main::@18
b18:
//SEG39 [16] call print_str_at
//SEG40 [127] phi from main::@18 to print_str_at [phi:main::@18->print_str_at]
print_str_at_from_b18:
//SEG41 [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1+(byte/signed byte/word/signed word/dword/signed dword) $1e [phi:main::@18->print_str_at#0] -- pbuz1=pbuc1
lda #<SCREEN+1+$1e
sta print_str_at.at
lda #>SCREEN+1+$1e
sta print_str_at.at+1
//SEG42 [127] phi (byte*) print_str_at::str#7 = (const string) main::str3 [phi:main::@18->print_str_at#1] -- pbuz1=pbuc1
lda #<str3
sta print_str_at.str
lda #>str3
sta print_str_at.str+1
jsr print_str_at
//SEG43 [17] phi from main::@18 to main::@3 [phi:main::@18->main::@3]
b3_from_b18:
//SEG44 [17] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@18->main::@3#0] -- vbuz1=vbuc1
lda #0
sta i
jmp b3
//SEG45 [17] phi from main::@19 to main::@3 [phi:main::@19->main::@3]
b3_from_b19:
//SEG46 [17] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@19->main::@3#0] -- register_copy
jmp b3
//SEG47 main::@3
b3:
//SEG48 [18] (byte) plot_chargen::pos#0 ← (byte) main::i#2 -- vbuyy=vbuz1
ldy i
//SEG49 [19] call plot_chargen
//SEG50 [71] phi from main::@3 to plot_chargen [phi:main::@3->plot_chargen]
plot_chargen_from_b3:
//SEG51 [71] phi (byte) plot_chargen::pos#2 = (byte) plot_chargen::pos#0 [phi:main::@3->plot_chargen#0] -- register_copy
//SEG52 [71] phi (byte) plot_chargen::shift#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@3->plot_chargen#1] -- vbuxx=vbuc1
ldx #0
//SEG53 [71] phi (byte) plot_chargen::ch#2 = (byte/signed byte/word/signed word/dword/signed dword) $20 [phi:main::@3->plot_chargen#2] -- vbuaa=vbuc1
lda #$20
jsr plot_chargen
jmp b19
//SEG54 main::@19
b19:
//SEG55 [20] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1
inc i
//SEG56 [21] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 4) goto main::@3 -- vbuz1_neq_vbuc1_then_la1
lda #4
cmp i
bne b3_from_b19
//SEG57 [22] phi from main::@19 to main::@4 [phi:main::@19->main::@4]
b4_from_b19:
//SEG58 [22] phi (byte) main::cur_pos#24 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@19->main::@4#0] -- vbuz1=vbuc1
lda #0
sta cur_pos
jmp b4
//SEG59 main::@4
b4:
//SEG60 [23] call keyboard_key_pressed
//SEG61 [113] phi from main::@4 to keyboard_key_pressed [phi:main::@4->keyboard_key_pressed]
keyboard_key_pressed_from_b4:
//SEG62 [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F1#0 [phi:main::@4->keyboard_key_pressed#0] -- vbuxx=vbuc1
ldx #KEY_F1
jsr keyboard_key_pressed
//SEG63 [24] (byte) keyboard_key_pressed::return#2 ← (byte) keyboard_key_pressed::return#0
jmp b20
//SEG64 main::@20
b20:
//SEG65 [25] (byte~) main::$15 ← (byte) keyboard_key_pressed::return#2
//SEG66 [26] if((byte~) main::$15==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@27 -- vbuaa_eq_0_then_la1
cmp #0
beq b27_from_b20
//SEG67 [27] phi from main::@20 to main::@5 [phi:main::@20->main::@5]
b5_from_b20:
//SEG68 [27] phi (byte) main::cur_pos#22 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@20->main::@5#0] -- vbuz1=vbuc1
lda #0
sta cur_pos
jmp b5
//SEG69 main::@5
b5:
//SEG70 [28] call keyboard_key_pressed
//SEG71 [113] phi from main::@5 to keyboard_key_pressed [phi:main::@5->keyboard_key_pressed]
keyboard_key_pressed_from_b5:
//SEG72 [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F3#0 [phi:main::@5->keyboard_key_pressed#0] -- vbuxx=vbuc1
ldx #KEY_F3
jsr keyboard_key_pressed
//SEG73 [29] (byte) keyboard_key_pressed::return#10 ← (byte) keyboard_key_pressed::return#0
jmp b21
//SEG74 main::@21
b21:
//SEG75 [30] (byte~) main::$18 ← (byte) keyboard_key_pressed::return#10
//SEG76 [31] if((byte~) main::$18==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@28 -- vbuaa_eq_0_then_la1
cmp #0
beq b28_from_b21
//SEG77 [32] phi from main::@21 to main::@6 [phi:main::@21->main::@6]
b6_from_b21:
//SEG78 [32] phi (byte) main::cur_pos#20 = (byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@21->main::@6#0] -- vbuz1=vbuc1
lda #1
sta cur_pos
jmp b6
//SEG79 main::@6
b6:
//SEG80 [33] call keyboard_key_pressed
//SEG81 [113] phi from main::@6 to keyboard_key_pressed [phi:main::@6->keyboard_key_pressed]
keyboard_key_pressed_from_b6:
//SEG82 [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F5#0 [phi:main::@6->keyboard_key_pressed#0] -- vbuxx=vbuc1
ldx #KEY_F5
jsr keyboard_key_pressed
//SEG83 [34] (byte) keyboard_key_pressed::return#11 ← (byte) keyboard_key_pressed::return#0
jmp b22
//SEG84 main::@22
b22:
//SEG85 [35] (byte~) main::$21 ← (byte) keyboard_key_pressed::return#11
//SEG86 [36] if((byte~) main::$21==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@29 -- vbuaa_eq_0_then_la1
cmp #0
beq b29_from_b22
//SEG87 [37] phi from main::@22 to main::@7 [phi:main::@22->main::@7]
b7_from_b22:
//SEG88 [37] phi (byte) main::cur_pos#18 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:main::@22->main::@7#0] -- vbuz1=vbuc1
lda #2
sta cur_pos
jmp b7
//SEG89 main::@7
b7:
//SEG90 [38] call keyboard_key_pressed
//SEG91 [113] phi from main::@7 to keyboard_key_pressed [phi:main::@7->keyboard_key_pressed]
keyboard_key_pressed_from_b7:
//SEG92 [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F7#0 [phi:main::@7->keyboard_key_pressed#0] -- vbuxx=vbuc1
ldx #KEY_F7
jsr keyboard_key_pressed
//SEG93 [39] (byte) keyboard_key_pressed::return#12 ← (byte) keyboard_key_pressed::return#0
jmp b23
//SEG94 main::@23
b23:
//SEG95 [40] (byte~) main::$24 ← (byte) keyboard_key_pressed::return#12
//SEG96 [41] if((byte~) main::$24==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@30 -- vbuaa_eq_0_then_la1
cmp #0
beq b30_from_b23
//SEG97 [42] phi from main::@23 to main::@8 [phi:main::@23->main::@8]
b8_from_b23:
//SEG98 [42] phi (byte) main::cur_pos#11 = (byte/signed byte/word/signed word/dword/signed dword) 3 [phi:main::@23->main::@8#0] -- vbuz1=vbuc1
lda #3
sta cur_pos
jmp b8
//SEG99 main::@8
b8:
//SEG100 [43] call keyboard_key_pressed
//SEG101 [113] phi from main::@8 to keyboard_key_pressed [phi:main::@8->keyboard_key_pressed]
keyboard_key_pressed_from_b8:
//SEG102 [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_LSHIFT#0 [phi:main::@8->keyboard_key_pressed#0] -- vbuxx=vbuc1
ldx #KEY_LSHIFT
jsr keyboard_key_pressed
//SEG103 [44] (byte) keyboard_key_pressed::return#13 ← (byte) keyboard_key_pressed::return#0
jmp b24
//SEG104 main::@24
b24:
//SEG105 [45] (byte~) main::$27 ← (byte) keyboard_key_pressed::return#13
//SEG106 [46] if((byte~) main::$27!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@9 -- vbuaa_neq_0_then_la1
cmp #0
bne b9_from_b24
//SEG107 [47] phi from main::@24 to main::@15 [phi:main::@24->main::@15]
b15_from_b24:
jmp b15
//SEG108 main::@15
b15:
//SEG109 [48] phi from main::@15 to main::@9 [phi:main::@15->main::@9]
b9_from_b15:
//SEG110 [48] phi (byte) main::shift#9 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@15->main::@9#0] -- vbuz1=vbuc1
lda #0
sta shift
jmp b9
//SEG111 [48] phi from main::@24 to main::@9 [phi:main::@24->main::@9]
b9_from_b24:
//SEG112 [48] phi (byte) main::shift#9 = (byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@24->main::@9#0] -- vbuz1=vbuc1
lda #1
sta shift
jmp b9
//SEG113 main::@9
b9:
//SEG114 [49] phi from main::@9 to main::@10 [phi:main::@9->main::@10]
b10_from_b9:
//SEG115 [49] phi (byte) main::ch#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@9->main::@10#0] -- vbuz1=vbuc1
lda #0
sta ch
jmp b10
// Check for key presses - and plot char if found
//SEG116 [49] phi from main::@12 to main::@10 [phi:main::@12->main::@10]
b10_from_b12:
//SEG117 [49] phi (byte) main::ch#2 = (byte) main::ch#1 [phi:main::@12->main::@10#0] -- register_copy
jmp b10
//SEG118 main::@10
b10:
//SEG119 [50] (byte) keyboard_get_keycode::ch#0 ← (byte) main::ch#2 -- vbuxx=vbuz1
ldx ch
//SEG120 [51] call keyboard_get_keycode
jsr keyboard_get_keycode
//SEG121 [52] (byte) keyboard_get_keycode::return#2 ← (byte) keyboard_get_keycode::return#0
jmp b25
//SEG122 main::@25
b25:
//SEG123 [53] (byte) main::key#0 ← (byte) keyboard_get_keycode::return#2
//SEG124 [54] if((byte) main::key#0==(byte/signed byte/word/signed word/dword/signed dword) $3f) goto main::@11 -- vbuaa_eq_vbuc1_then_la1
cmp #$3f
beq b11_from_b25
jmp b13
//SEG125 main::@13
b13:
//SEG126 [55] (byte) keyboard_key_pressed::key#5 ← (byte) main::key#0 -- vbuxx=vbuaa
tax
//SEG127 [56] call keyboard_key_pressed
//SEG128 [113] phi from main::@13 to keyboard_key_pressed [phi:main::@13->keyboard_key_pressed]
keyboard_key_pressed_from_b13:
//SEG129 [113] phi (byte) keyboard_key_pressed::key#6 = (byte) keyboard_key_pressed::key#5 [phi:main::@13->keyboard_key_pressed#0] -- register_copy
jsr keyboard_key_pressed
//SEG130 [57] (byte) keyboard_key_pressed::return#14 ← (byte) keyboard_key_pressed::return#0
jmp b26
//SEG131 main::@26
b26:
//SEG132 [58] (byte) main::pressed#1 ← (byte) keyboard_key_pressed::return#14
//SEG133 [59] phi from main::@26 to main::@11 [phi:main::@26->main::@11]
b11_from_b26:
//SEG134 [59] phi (byte) main::pressed#2 = (byte) main::pressed#1 [phi:main::@26->main::@11#0] -- register_copy
jmp b11
//SEG135 [59] phi from main::@25 to main::@11 [phi:main::@25->main::@11]
b11_from_b25:
//SEG136 [59] phi (byte) main::pressed#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@25->main::@11#0] -- vbuaa=vbuc1
lda #0
jmp b11
//SEG137 main::@11
b11:
//SEG138 [60] if((byte) main::pressed#2==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@12 -- vbuaa_eq_0_then_la1
cmp #0
beq b12
jmp b14
//SEG139 main::@14
b14:
//SEG140 [61] (byte) plot_chargen::pos#1 ← (byte) main::cur_pos#11 -- vbuyy=vbuz1
ldy cur_pos
//SEG141 [62] (byte) plot_chargen::ch#1 ← (byte) main::ch#2 -- vbuaa=vbuz1
lda ch
//SEG142 [63] (byte) plot_chargen::shift#1 ← (byte) main::shift#9 -- vbuxx=vbuz1
ldx shift
//SEG143 [64] call plot_chargen
//SEG144 [71] phi from main::@14 to plot_chargen [phi:main::@14->plot_chargen]
plot_chargen_from_b14:
//SEG145 [71] phi (byte) plot_chargen::pos#2 = (byte) plot_chargen::pos#1 [phi:main::@14->plot_chargen#0] -- register_copy
//SEG146 [71] phi (byte) plot_chargen::shift#2 = (byte) plot_chargen::shift#1 [phi:main::@14->plot_chargen#1] -- register_copy
//SEG147 [71] phi (byte) plot_chargen::ch#2 = (byte) plot_chargen::ch#1 [phi:main::@14->plot_chargen#2] -- register_copy
jsr plot_chargen
jmp b12
//SEG148 main::@12
b12:
//SEG149 [65] (byte) main::ch#1 ← ++ (byte) main::ch#2 -- vbuz1=_inc_vbuz1
inc ch
//SEG150 [66] if((byte) main::ch#1!=(byte/signed byte/word/signed word/dword/signed dword) $40) goto main::@10 -- vbuz1_neq_vbuc1_then_la1
lda #$40
cmp ch
bne b10_from_b12
//SEG151 [22] phi from main::@12 to main::@4 [phi:main::@12->main::@4]
b4_from_b12:
//SEG152 [22] phi (byte) main::cur_pos#24 = (byte) main::cur_pos#11 [phi:main::@12->main::@4#0] -- register_copy
jmp b4
//SEG153 [67] phi from main::@23 to main::@30 [phi:main::@23->main::@30]
b30_from_b23:
jmp b30
//SEG154 main::@30
b30:
//SEG155 [42] phi from main::@30 to main::@8 [phi:main::@30->main::@8]
b8_from_b30:
//SEG156 [42] phi (byte) main::cur_pos#11 = (byte) main::cur_pos#18 [phi:main::@30->main::@8#0] -- register_copy
jmp b8
//SEG157 [68] phi from main::@22 to main::@29 [phi:main::@22->main::@29]
b29_from_b22:
jmp b29
//SEG158 main::@29
b29:
//SEG159 [37] phi from main::@29 to main::@7 [phi:main::@29->main::@7]
b7_from_b29:
//SEG160 [37] phi (byte) main::cur_pos#18 = (byte) main::cur_pos#20 [phi:main::@29->main::@7#0] -- register_copy
jmp b7
//SEG161 [69] phi from main::@21 to main::@28 [phi:main::@21->main::@28]
b28_from_b21:
jmp b28
//SEG162 main::@28
b28:
//SEG163 [32] phi from main::@28 to main::@6 [phi:main::@28->main::@6]
b6_from_b28:
//SEG164 [32] phi (byte) main::cur_pos#20 = (byte) main::cur_pos#22 [phi:main::@28->main::@6#0] -- register_copy
jmp b6
//SEG165 [70] phi from main::@20 to main::@27 [phi:main::@20->main::@27]
b27_from_b20:
jmp b27
//SEG166 main::@27
b27:
//SEG167 [27] phi from main::@27 to main::@5 [phi:main::@27->main::@5]
b5_from_b27:
//SEG168 [27] phi (byte) main::cur_pos#22 = (byte) main::cur_pos#24 [phi:main::@27->main::@5#0] -- register_copy
jmp b5
str: .text "f1@"
str1: .text "f3@"
str2: .text "f5@"
str3: .text "f7@"
}
//SEG169 plot_chargen
// Render 8x8 char (ch) as pixels on char canvas #pos
// plot_chargen(byte register(Y) pos, byte register(A) ch, byte register(X) shift)
plot_chargen: {
.label _0 = 2
.label _1 = 2
.label _7 = 9
.label chargen = 2
.label sc = 9
.label bits = 8
.label y = 7
//SEG170 asm { sei }
sei
//SEG171 [73] (word~) plot_chargen::$0 ← ((word)) (byte) plot_chargen::ch#2 -- vwuz1=_word_vbuaa
sta _0
lda #0
sta _0+1
//SEG172 [74] (word~) plot_chargen::$1 ← (word~) plot_chargen::$0 << (byte/signed byte/word/signed word/dword/signed dword) 3 -- vwuz1=vwuz1_rol_3
asl _1
rol _1+1
asl _1
rol _1+1
asl _1
rol _1+1
//SEG173 [75] (byte*) plot_chargen::chargen#0 ← (const byte*) CHARGEN#0 + (word~) plot_chargen::$1 -- pbuz1=pbuc1_plus_vwuz1
clc
lda chargen
adc #<CHARGEN
sta chargen
lda chargen+1
adc #>CHARGEN
sta chargen+1
//SEG174 [76] if((byte) plot_chargen::shift#2==(byte/signed byte/word/signed word/dword/signed dword) 0) goto plot_chargen::@1 -- vbuxx_eq_0_then_la1
cpx #0
beq b1_from_plot_chargen
jmp b2
//SEG175 plot_chargen::@2
b2:
//SEG176 [77] (byte*) plot_chargen::chargen#1 ← (byte*) plot_chargen::chargen#0 + (word/signed word/dword/signed dword) $800 -- pbuz1=pbuz1_plus_vwuc1
clc
lda chargen
adc #<$800
sta chargen
lda chargen+1
adc #>$800
sta chargen+1
//SEG177 [78] phi from plot_chargen plot_chargen::@2 to plot_chargen::@1 [phi:plot_chargen/plot_chargen::@2->plot_chargen::@1]
b1_from_plot_chargen:
b1_from_b2:
//SEG178 [78] phi (byte*) plot_chargen::chargen#5 = (byte*) plot_chargen::chargen#0 [phi:plot_chargen/plot_chargen::@2->plot_chargen::@1#0] -- register_copy
jmp b1
//SEG179 plot_chargen::@1
b1:
//SEG180 [79] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $32 -- _deref_pbuc1=vbuc2
lda #$32
sta PROCPORT
//SEG181 [80] (byte) mul8u::a#1 ← (byte) plot_chargen::pos#2 -- vbuxx=vbuyy
tya
tax
//SEG182 [81] call mul8u
//SEG183 [103] phi from plot_chargen::@1 to mul8u [phi:plot_chargen::@1->mul8u]
mul8u_from_b1:
jsr mul8u
//SEG184 [82] (word) mul8u::return#2 ← (word) mul8u::res#2
jmp b9
//SEG185 plot_chargen::@9
b9:
//SEG186 [83] (word~) plot_chargen::$7 ← (word) mul8u::return#2
//SEG187 [84] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28+(byte/signed byte/word/signed word/dword/signed dword) 1 + (word~) plot_chargen::$7 -- pbuz1=pbuc1_plus_vwuz1
clc
lda sc
adc #<SCREEN+$28+1
sta sc
lda sc+1
adc #>SCREEN+$28+1
sta sc+1
//SEG188 [85] phi from plot_chargen::@9 to plot_chargen::@3 [phi:plot_chargen::@9->plot_chargen::@3]
b3_from_b9:
//SEG189 [85] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#0 [phi:plot_chargen::@9->plot_chargen::@3#0] -- register_copy
//SEG190 [85] phi (byte) plot_chargen::y#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:plot_chargen::@9->plot_chargen::@3#1] -- vbuz1=vbuc1
lda #0
sta y
jmp b3
//SEG191 [85] phi from plot_chargen::@7 to plot_chargen::@3 [phi:plot_chargen::@7->plot_chargen::@3]
b3_from_b7:
//SEG192 [85] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#2 [phi:plot_chargen::@7->plot_chargen::@3#0] -- register_copy
//SEG193 [85] phi (byte) plot_chargen::y#2 = (byte) plot_chargen::y#1 [phi:plot_chargen::@7->plot_chargen::@3#1] -- register_copy
jmp b3
//SEG194 plot_chargen::@3
b3:
//SEG195 [86] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#5 + (byte) plot_chargen::y#2) -- vbuz1=pbuz2_derefidx_vbuz3
ldy y
lda (chargen),y
sta bits
//SEG196 [87] phi from plot_chargen::@3 to plot_chargen::@4 [phi:plot_chargen::@3->plot_chargen::@4]
b4_from_b3:
//SEG197 [87] phi (byte) plot_chargen::x#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:plot_chargen::@3->plot_chargen::@4#0] -- vbuxx=vbuc1
ldx #0
//SEG198 [87] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#7 [phi:plot_chargen::@3->plot_chargen::@4#1] -- register_copy
//SEG199 [87] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#0 [phi:plot_chargen::@3->plot_chargen::@4#2] -- register_copy
jmp b4
//SEG200 [87] phi from plot_chargen::@5 to plot_chargen::@4 [phi:plot_chargen::@5->plot_chargen::@4]
b4_from_b5:
//SEG201 [87] phi (byte) plot_chargen::x#2 = (byte) plot_chargen::x#1 [phi:plot_chargen::@5->plot_chargen::@4#0] -- register_copy
//SEG202 [87] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#1 [phi:plot_chargen::@5->plot_chargen::@4#1] -- register_copy
//SEG203 [87] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#1 [phi:plot_chargen::@5->plot_chargen::@4#2] -- register_copy
jmp b4
//SEG204 plot_chargen::@4
b4:
//SEG205 [88] (byte~) plot_chargen::$10 ← (byte) plot_chargen::bits#2 & (byte/word/signed word/dword/signed dword) $80 -- vbuaa=vbuz1_band_vbuc1
lda #$80
and bits
//SEG206 [89] if((byte~) plot_chargen::$10==(byte/signed byte/word/signed word/dword/signed dword) 0) goto plot_chargen::@5 -- vbuaa_eq_0_then_la1
cmp #0
beq b5_from_b4
//SEG207 [90] phi from plot_chargen::@4 to plot_chargen::@6 [phi:plot_chargen::@4->plot_chargen::@6]
b6_from_b4:
jmp b6
//SEG208 plot_chargen::@6
b6:
//SEG209 [91] phi from plot_chargen::@6 to plot_chargen::@5 [phi:plot_chargen::@6->plot_chargen::@5]
b5_from_b6:
//SEG210 [91] phi (byte) plot_chargen::c#2 = (byte) '*' [phi:plot_chargen::@6->plot_chargen::@5#0] -- vbuaa=vbuc1
lda #'*'
jmp b5
//SEG211 [91] phi from plot_chargen::@4 to plot_chargen::@5 [phi:plot_chargen::@4->plot_chargen::@5]
b5_from_b4:
//SEG212 [91] phi (byte) plot_chargen::c#2 = (byte) '.' [phi:plot_chargen::@4->plot_chargen::@5#0] -- vbuaa=vbuc1
lda #'.'
jmp b5
//SEG213 plot_chargen::@5
b5:
//SEG214 [92] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 -- _deref_pbuz1=vbuaa
ldy #0
sta (sc),y
//SEG215 [93] (byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3 -- pbuz1=_inc_pbuz1
inc sc
bne !+
inc sc+1
!:
//SEG216 [94] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuz1=vbuz1_rol_1
asl bits
//SEG217 [95] (byte) plot_chargen::x#1 ← ++ (byte) plot_chargen::x#2 -- vbuxx=_inc_vbuxx
inx
//SEG218 [96] if((byte) plot_chargen::x#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto plot_chargen::@4 -- vbuxx_neq_vbuc1_then_la1
cpx #8
bne b4_from_b5
jmp b7
//SEG219 plot_chargen::@7
b7:
//SEG220 [97] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte/signed byte/word/signed word/dword/signed dword) $20 -- pbuz1=pbuz1_plus_vbuc1
lda #$20
clc
adc sc
sta sc
bcc !+
inc sc+1
!:
//SEG221 [98] (byte) plot_chargen::y#1 ← ++ (byte) plot_chargen::y#2 -- vbuz1=_inc_vbuz1
inc y
//SEG222 [99] if((byte) plot_chargen::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto plot_chargen::@3 -- vbuz1_neq_vbuc1_then_la1
lda #8
cmp y
bne b3_from_b7
jmp b8
//SEG223 plot_chargen::@8
b8:
//SEG224 [100] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $37 -- _deref_pbuc1=vbuc2
lda #$37
sta PROCPORT
//SEG225 asm { cli }
cli
jmp breturn
//SEG226 plot_chargen::@return
breturn:
//SEG227 [102] return
rts
}
//SEG228 mul8u
// Perform binary multiplication of two unsigned 8-bit bytes into a 16-bit unsigned word
// mul8u(byte register(X) a)
mul8u: {
.const b = $a
.label mb = $b
.label res = 9
.label return = 9
//SEG229 [104] phi from mul8u to mul8u::@1 [phi:mul8u->mul8u::@1]
b1_from_mul8u:
//SEG230 [104] phi (word) mul8u::mb#2 = ((word))(const byte) mul8u::b#0 [phi:mul8u->mul8u::@1#0] -- vwuz1=vbuc1
lda #b
sta mb
lda #0
sta mb+1
//SEG231 [104] phi (word) mul8u::res#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:mul8u->mul8u::@1#1] -- vwuz1=vbuc1
lda #0
sta res
lda #0
sta res+1
//SEG232 [104] phi (byte) mul8u::a#2 = (byte) mul8u::a#1 [phi:mul8u->mul8u::@1#2] -- register_copy
jmp b1
//SEG233 mul8u::@1
b1:
//SEG234 [105] if((byte) mul8u::a#2!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mul8u::@2 -- vbuxx_neq_0_then_la1
cpx #0
bne b2
jmp breturn
//SEG235 mul8u::@return
breturn:
//SEG236 [106] return
rts
//SEG237 mul8u::@2
b2:
//SEG238 [107] (byte~) mul8u::$1 ← (byte) mul8u::a#2 & (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuxx_band_vbuc1
txa
and #1
//SEG239 [108] if((byte~) mul8u::$1==(byte/signed byte/word/signed word/dword/signed dword) 0) goto mul8u::@3 -- vbuaa_eq_0_then_la1
cmp #0
beq b3_from_b2
jmp b4
//SEG240 mul8u::@4
b4:
//SEG241 [109] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 -- vwuz1=vwuz1_plus_vwuz2
lda res
clc
adc mb
sta res
lda res+1
adc mb+1
sta res+1
//SEG242 [110] phi from mul8u::@2 mul8u::@4 to mul8u::@3 [phi:mul8u::@2/mul8u::@4->mul8u::@3]
b3_from_b2:
b3_from_b4:
//SEG243 [110] phi (word) mul8u::res#6 = (word) mul8u::res#2 [phi:mul8u::@2/mul8u::@4->mul8u::@3#0] -- register_copy
jmp b3
//SEG244 mul8u::@3
b3:
//SEG245 [111] (byte) mul8u::a#0 ← (byte) mul8u::a#2 >> (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuxx=vbuxx_ror_1
txa
lsr
tax
//SEG246 [112] (word) mul8u::mb#1 ← (word) mul8u::mb#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vwuz1=vwuz1_rol_1
asl mb
rol mb+1
//SEG247 [104] phi from mul8u::@3 to mul8u::@1 [phi:mul8u::@3->mul8u::@1]
b1_from_b3:
//SEG248 [104] phi (word) mul8u::mb#2 = (word) mul8u::mb#1 [phi:mul8u::@3->mul8u::@1#0] -- register_copy
//SEG249 [104] phi (word) mul8u::res#2 = (word) mul8u::res#6 [phi:mul8u::@3->mul8u::@1#1] -- register_copy
//SEG250 [104] phi (byte) mul8u::a#2 = (byte) mul8u::a#0 [phi:mul8u::@3->mul8u::@1#2] -- register_copy
jmp b1
}
//SEG251 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
// keyboard_key_pressed(byte register(X) key)
keyboard_key_pressed: {
//SEG252 [114] (byte) keyboard_key_pressed::colidx#0 ← (byte) keyboard_key_pressed::key#6 & (byte/signed byte/word/signed word/dword/signed dword) 7 -- vbuyy=vbuxx_band_vbuc1
txa
and #7
tay
//SEG253 [115] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte/signed byte/word/signed word/dword/signed dword) 3 -- vbuaa=vbuxx_ror_3
txa
lsr
lsr
lsr
//SEG254 [116] (byte) keyboard_matrix_read::rowid#0 ← (byte) keyboard_key_pressed::rowidx#0 -- vbuxx=vbuaa
tax
//SEG255 [117] call keyboard_matrix_read
jsr keyboard_matrix_read
//SEG256 [118] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0
jmp b1
//SEG257 keyboard_key_pressed::@1
b1:
//SEG258 [119] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2
//SEG259 [120] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte[8]) keyboard_matrix_col_bitmask#0 + (byte) keyboard_key_pressed::colidx#0) -- vbuaa=vbuaa_band_pbuc1_derefidx_vbuyy
and keyboard_matrix_col_bitmask,y
jmp breturn
//SEG260 keyboard_key_pressed::@return
breturn:
//SEG261 [121] return
rts
}
//SEG262 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 kill the normal interrupt or sei/cli around calls to the keyboard matrix reader.
// keyboard_matrix_read(byte register(X) rowid)
keyboard_matrix_read: {
//SEG263 [122] *((const byte*) CIA1_PORT_A#0) ← *((const byte[8]) keyboard_matrix_row_bitmask#0 + (byte) keyboard_matrix_read::rowid#0) -- _deref_pbuc1=pbuc2_derefidx_vbuxx
lda keyboard_matrix_row_bitmask,x
sta CIA1_PORT_A
//SEG264 [123] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B#0) -- vbuaa=_bnot__deref_pbuc1
lda CIA1_PORT_B
eor #$ff
jmp breturn
//SEG265 keyboard_matrix_read::@return
breturn:
//SEG266 [124] return
rts
}
//SEG267 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) .
// keyboard_get_keycode(byte register(X) ch)
keyboard_get_keycode: {
//SEG268 [125] (byte) keyboard_get_keycode::return#0 ← *((const byte[]) keyboard_char_keycodes#0 + (byte) keyboard_get_keycode::ch#0) -- vbuaa=pbuc1_derefidx_vbuxx
lda keyboard_char_keycodes,x
jmp breturn
//SEG269 keyboard_get_keycode::@return
breturn:
//SEG270 [126] return
rts
}
//SEG271 print_str_at
// Print a string at a specific screen position
// print_str_at(byte* zeropage(2) str, byte* zeropage(9) at)
print_str_at: {
.label at = 9
.label str = 2
//SEG272 [128] phi from print_str_at print_str_at::@2 to print_str_at::@1 [phi:print_str_at/print_str_at::@2->print_str_at::@1]
b1_from_print_str_at:
b1_from_b2:
//SEG273 [128] phi (byte*) print_str_at::at#5 = (byte*) print_str_at::at#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#0] -- register_copy
//SEG274 [128] phi (byte*) print_str_at::str#5 = (byte*) print_str_at::str#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#1] -- register_copy
jmp b1
//SEG275 print_str_at::@1
b1:
//SEG276 [129] if(*((byte*) print_str_at::str#5)!=(byte) '@') goto print_str_at::@2 -- _deref_pbuz1_neq_vbuc1_then_la1
ldy #0
lda (str),y
cmp #'@'
bne b2
jmp breturn
//SEG277 print_str_at::@return
breturn:
//SEG278 [130] return
rts
//SEG279 print_str_at::@2
b2:
//SEG280 [131] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) -- _deref_pbuz1=_deref_pbuz2
ldy #0
lda (str),y
ldy #0
sta (at),y
//SEG281 [132] (byte*) print_str_at::at#4 ← ++ (byte*) print_str_at::at#5 -- pbuz1=_inc_pbuz1
inc at
bne !+
inc at+1
!:
//SEG282 [133] (byte*) print_str_at::str#4 ← ++ (byte*) print_str_at::str#5 -- pbuz1=_inc_pbuz1
inc str
bne !+
inc str+1
!:
jmp b1_from_b2
}
// 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
// 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
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b1
Removing instruction jmp bend
Removing instruction jmp b1
Removing instruction jmp b2
Removing instruction jmp b16
Removing instruction jmp b17
Removing instruction jmp b18
Removing instruction jmp b3
Removing instruction jmp b19
Removing instruction jmp b4
Removing instruction jmp b20
Removing instruction jmp b5
Removing instruction jmp b21
Removing instruction jmp b6
Removing instruction jmp b22
Removing instruction jmp b7
Removing instruction jmp b23
Removing instruction jmp b8
Removing instruction jmp b24
Removing instruction jmp b15
Removing instruction jmp b9
Removing instruction jmp b10
Removing instruction jmp b25
Removing instruction jmp b13
Removing instruction jmp b26
Removing instruction jmp b11
Removing instruction jmp b14
Removing instruction jmp b12
Removing instruction jmp b30
Removing instruction jmp b29
Removing instruction jmp b28
Removing instruction jmp b27
Removing instruction jmp b2
Removing instruction jmp b1
Removing instruction jmp b9
Removing instruction jmp b3
Removing instruction jmp b4
Removing instruction jmp b6
Removing instruction jmp b5
Removing instruction jmp b7
Removing instruction jmp b8
Removing instruction jmp breturn
Removing instruction jmp b1
Removing instruction jmp breturn
Removing instruction jmp b4
Removing instruction jmp b3
Removing instruction jmp b1
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
Removing instruction lda #0
Removing instruction ldy #0
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Replacing label b1_from_b1 with b1
Replacing label b1_from_b1 with b1
Replacing label b3_from_b19 with b3
Replacing label b27_from_b20 with b27
Replacing label b28_from_b21 with b28
Replacing label b29_from_b22 with b29
Replacing label b30_from_b23 with b30
Replacing label b10_from_b12 with b10
Replacing label b1_from_plot_chargen with b1
Replacing label b4_from_b5 with b4
Replacing label b3_from_b7 with b3
Replacing label b3_from_b2 with b3
Replacing label b1_from_b2 with b1
Removing instruction b1_from_bbegin:
Removing instruction b1:
Removing instruction main_from_b1:
Removing instruction bend_from_b1:
Removing instruction b1_from_b1:
Removing instruction b2_from_b1:
Removing instruction print_str_at_from_b2:
Removing instruction b16_from_b2:
Removing instruction print_str_at_from_b16:
Removing instruction b17_from_b16:
Removing instruction print_str_at_from_b17:
Removing instruction b18_from_b17:
Removing instruction print_str_at_from_b18:
Removing instruction b3_from_b19:
Removing instruction keyboard_key_pressed_from_b4:
Removing instruction keyboard_key_pressed_from_b5:
Removing instruction keyboard_key_pressed_from_b6:
Removing instruction keyboard_key_pressed_from_b7:
Removing instruction keyboard_key_pressed_from_b8:
Removing instruction b15_from_b24:
Removing instruction b9_from_b15:
Removing instruction b10_from_b9:
Removing instruction b10_from_b12:
Removing instruction b11_from_b26:
Removing instruction b30_from_b23:
Removing instruction b8_from_b30:
Removing instruction b29_from_b22:
Removing instruction b7_from_b29:
Removing instruction b28_from_b21:
Removing instruction b6_from_b28:
Removing instruction b27_from_b20:
Removing instruction b5_from_b27:
Removing instruction b1_from_plot_chargen:
Removing instruction b1_from_b2:
Removing instruction b3_from_b7:
Removing instruction b4_from_b5:
Removing instruction b6_from_b4:
Removing instruction b5_from_b6:
Removing instruction b3_from_b2:
Removing instruction b3_from_b4:
Removing instruction b1_from_print_str_at:
Removing instruction b1_from_b2:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction bend:
Removing instruction b1_from_main:
Removing instruction b2:
Removing instruction b16:
Removing instruction b17:
Removing instruction b18:
Removing instruction b3_from_b18:
Removing instruction plot_chargen_from_b3:
Removing instruction b19:
Removing instruction b4_from_b19:
Removing instruction b20:
Removing instruction b5_from_b20:
Removing instruction b21:
Removing instruction b6_from_b21:
Removing instruction b22:
Removing instruction b7_from_b22:
Removing instruction b23:
Removing instruction b8_from_b23:
Removing instruction b24:
Removing instruction b15:
Removing instruction b25:
Removing instruction b13:
Removing instruction keyboard_key_pressed_from_b13:
Removing instruction b26:
Removing instruction b14:
Removing instruction plot_chargen_from_b14:
Removing instruction b4_from_b12:
Removing instruction b2:
Removing instruction mul8u_from_b1:
Removing instruction b9:
Removing instruction b3_from_b9:
Removing instruction b4_from_b3:
Removing instruction b6:
Removing instruction b7:
Removing instruction b8:
Removing instruction breturn:
Removing instruction b1_from_mul8u:
Removing instruction breturn:
Removing instruction b4:
Removing instruction b1_from_b3:
Removing instruction b1:
Removing instruction breturn:
Removing instruction breturn:
Removing instruction breturn:
Removing instruction breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Updating BasicUpstart to call main directly
Removing instruction jsr main
Succesful ASM optimization Pass5SkipBegin
Skipping double jump to b5 in beq b27
Skipping double jump to b6 in beq b28
Skipping double jump to b7 in beq b29
Skipping double jump to b8 in beq b30
Succesful ASM optimization Pass5DoubleJumpElimination
Relabelling long label b9_from_b24 to b2
Relabelling long label b11_from_b25 to b13
Relabelling long label b5_from_b4 to b2
Succesful ASM optimization Pass5RelabelLongLabels
Removing instruction jmp b1
Removing instruction jmp b3
Removing instruction jmp b10
Removing instruction jmp b3
Removing instruction jmp b4
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction bbegin:
Removing instruction b30:
Removing instruction b29:
Removing instruction b28:
Removing instruction b27:
Succesful ASM optimization Pass5UnusedLabelElimination
Removing unreachable instruction jmp b8
Removing unreachable instruction jmp b7
Removing unreachable instruction jmp b6
Removing unreachable instruction jmp b5
Succesful ASM optimization Pass5UnreachableCodeElimination
FINAL SYMBOL TABLE
(label) @1
(label) @begin
(label) @end
(byte*) CHARGEN
(const byte*) CHARGEN#0 CHARGEN = ((byte*))(word/dword/signed dword) $d000
(byte*) CIA1_PORT_A
(const byte*) CIA1_PORT_A#0 CIA1_PORT_A = ((byte*))(word/dword/signed dword) $dc00
(byte*) CIA1_PORT_B
(const byte*) CIA1_PORT_B#0 CIA1_PORT_B = ((byte*))(word/dword/signed dword) $dc01
(byte) KEY_0
(const byte) KEY_0#0 KEY_0 = (byte/signed byte/word/signed word/dword/signed dword) $23
(byte) KEY_1
(const byte) KEY_1#0 KEY_1 = (byte/signed byte/word/signed word/dword/signed dword) $38
(byte) KEY_2
(const byte) KEY_2#0 KEY_2 = (byte/signed byte/word/signed word/dword/signed dword) $3b
(byte) KEY_3
(const byte) KEY_3#0 KEY_3 = (byte/signed byte/word/signed word/dword/signed dword) 8
(byte) KEY_4
(const byte) KEY_4#0 KEY_4 = (byte/signed byte/word/signed word/dword/signed dword) $b
(byte) KEY_5
(const byte) KEY_5#0 KEY_5 = (byte/signed byte/word/signed word/dword/signed dword) $10
(byte) KEY_6
(const byte) KEY_6#0 KEY_6 = (byte/signed byte/word/signed word/dword/signed dword) $13
(byte) KEY_7
(const byte) KEY_7#0 KEY_7 = (byte/signed byte/word/signed word/dword/signed dword) $18
(byte) KEY_8
(const byte) KEY_8#0 KEY_8 = (byte/signed byte/word/signed word/dword/signed dword) $1b
(byte) KEY_9
(const byte) KEY_9#0 KEY_9 = (byte/signed byte/word/signed word/dword/signed dword) $20
(byte) KEY_A
(const byte) KEY_A#0 KEY_A = (byte/signed byte/word/signed word/dword/signed dword) $a
(byte) KEY_ARROW_LEFT
(const byte) KEY_ARROW_LEFT#0 KEY_ARROW_LEFT = (byte/signed byte/word/signed word/dword/signed dword) $39
(byte) KEY_ARROW_UP
(const byte) KEY_ARROW_UP#0 KEY_ARROW_UP = (byte/signed byte/word/signed word/dword/signed dword) $36
(byte) KEY_ASTERISK
(const byte) KEY_ASTERISK#0 KEY_ASTERISK = (byte/signed byte/word/signed word/dword/signed dword) $31
(byte) KEY_AT
(const byte) KEY_AT#0 KEY_AT = (byte/signed byte/word/signed word/dword/signed dword) $2e
(byte) KEY_B
(const byte) KEY_B#0 KEY_B = (byte/signed byte/word/signed word/dword/signed dword) $1c
(byte) KEY_C
(const byte) KEY_C#0 KEY_C = (byte/signed byte/word/signed word/dword/signed dword) $14
(byte) KEY_COLON
(const byte) KEY_COLON#0 KEY_COLON = (byte/signed byte/word/signed word/dword/signed dword) $2d
(byte) KEY_COMMA
(const byte) KEY_COMMA#0 KEY_COMMA = (byte/signed byte/word/signed word/dword/signed dword) $2f
(byte) KEY_D
(const byte) KEY_D#0 KEY_D = (byte/signed byte/word/signed word/dword/signed dword) $12
(byte) KEY_DOT
(const byte) KEY_DOT#0 KEY_DOT = (byte/signed byte/word/signed word/dword/signed dword) $2c
(byte) KEY_E
(const byte) KEY_E#0 KEY_E = (byte/signed byte/word/signed word/dword/signed dword) $e
(byte) KEY_EQUALS
(const byte) KEY_EQUALS#0 KEY_EQUALS = (byte/signed byte/word/signed word/dword/signed dword) $35
(byte) KEY_F
(const byte) KEY_F#0 KEY_F = (byte/signed byte/word/signed word/dword/signed dword) $15
(byte) KEY_F1
(const byte) KEY_F1#0 KEY_F1 = (byte/signed byte/word/signed word/dword/signed dword) 4
(byte) KEY_F3
(const byte) KEY_F3#0 KEY_F3 = (byte/signed byte/word/signed word/dword/signed dword) 5
(byte) KEY_F5
(const byte) KEY_F5#0 KEY_F5 = (byte/signed byte/word/signed word/dword/signed dword) 6
(byte) KEY_F7
(const byte) KEY_F7#0 KEY_F7 = (byte/signed byte/word/signed word/dword/signed dword) 3
(byte) KEY_G
(const byte) KEY_G#0 KEY_G = (byte/signed byte/word/signed word/dword/signed dword) $1a
(byte) KEY_H
(const byte) KEY_H#0 KEY_H = (byte/signed byte/word/signed word/dword/signed dword) $1d
(byte) KEY_I
(const byte) KEY_I#0 KEY_I = (byte/signed byte/word/signed word/dword/signed dword) $21
(byte) KEY_J
(const byte) KEY_J#0 KEY_J = (byte/signed byte/word/signed word/dword/signed dword) $22
(byte) KEY_K
(const byte) KEY_K#0 KEY_K = (byte/signed byte/word/signed word/dword/signed dword) $25
(byte) KEY_L
(const byte) KEY_L#0 KEY_L = (byte/signed byte/word/signed word/dword/signed dword) $2a
(byte) KEY_LSHIFT
(const byte) KEY_LSHIFT#0 KEY_LSHIFT = (byte/signed byte/word/signed word/dword/signed dword) $f
(byte) KEY_M
(const byte) KEY_M#0 KEY_M = (byte/signed byte/word/signed word/dword/signed dword) $24
(byte) KEY_MINUS
(const byte) KEY_MINUS#0 KEY_MINUS = (byte/signed byte/word/signed word/dword/signed dword) $2b
(byte) KEY_N
(const byte) KEY_N#0 KEY_N = (byte/signed byte/word/signed word/dword/signed dword) $27
(byte) KEY_O
(const byte) KEY_O#0 KEY_O = (byte/signed byte/word/signed word/dword/signed dword) $26
(byte) KEY_P
(const byte) KEY_P#0 KEY_P = (byte/signed byte/word/signed word/dword/signed dword) $29
(byte) KEY_PLUS
(const byte) KEY_PLUS#0 KEY_PLUS = (byte/signed byte/word/signed word/dword/signed dword) $28
(byte) KEY_POUND
(const byte) KEY_POUND#0 KEY_POUND = (byte/signed byte/word/signed word/dword/signed dword) $30
(byte) KEY_Q
(const byte) KEY_Q#0 KEY_Q = (byte/signed byte/word/signed word/dword/signed dword) $3e
(byte) KEY_R
(const byte) KEY_R#0 KEY_R = (byte/signed byte/word/signed word/dword/signed dword) $11
(byte) KEY_S
(const byte) KEY_S#0 KEY_S = (byte/signed byte/word/signed word/dword/signed dword) $d
(byte) KEY_SEMICOLON
(const byte) KEY_SEMICOLON#0 KEY_SEMICOLON = (byte/signed byte/word/signed word/dword/signed dword) $32
(byte) KEY_SLASH
(const byte) KEY_SLASH#0 KEY_SLASH = (byte/signed byte/word/signed word/dword/signed dword) $37
(byte) KEY_SPACE
(const byte) KEY_SPACE#0 KEY_SPACE = (byte/signed byte/word/signed word/dword/signed dword) $3c
(byte) KEY_T
(const byte) KEY_T#0 KEY_T = (byte/signed byte/word/signed word/dword/signed dword) $16
(byte) KEY_U
(const byte) KEY_U#0 KEY_U = (byte/signed byte/word/signed word/dword/signed dword) $1e
(byte) KEY_V
(const byte) KEY_V#0 KEY_V = (byte/signed byte/word/signed word/dword/signed dword) $1f
(byte) KEY_W
(const byte) KEY_W#0 KEY_W = (byte/signed byte/word/signed word/dword/signed dword) 9
(byte) KEY_X
(const byte) KEY_X#0 KEY_X = (byte/signed byte/word/signed word/dword/signed dword) $17
(byte) KEY_Y
(const byte) KEY_Y#0 KEY_Y = (byte/signed byte/word/signed word/dword/signed dword) $19
(byte) KEY_Z
(const byte) KEY_Z#0 KEY_Z = (byte/signed byte/word/signed word/dword/signed dword) $c
(byte*) PROCPORT
(const byte*) PROCPORT#0 PROCPORT = ((byte*))(byte/signed byte/word/signed word/dword/signed dword) 1
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) $400
(byte[]) keyboard_char_keycodes
(const byte[]) keyboard_char_keycodes#0 keyboard_char_keycodes = { (const byte) KEY_AT#0, (const byte) KEY_A#0, (const byte) KEY_B#0, (const byte) KEY_C#0, (const byte) KEY_D#0, (const byte) KEY_E#0, (const byte) KEY_F#0, (const byte) KEY_G#0, (const byte) KEY_H#0, (const byte) KEY_I#0, (const byte) KEY_J#0, (const byte) KEY_K#0, (const byte) KEY_L#0, (const byte) KEY_M#0, (const byte) KEY_N#0, (const byte) KEY_O#0, (const byte) KEY_P#0, (const byte) KEY_Q#0, (const byte) KEY_R#0, (const byte) KEY_S#0, (const byte) KEY_T#0, (const byte) KEY_U#0, (const byte) KEY_V#0, (const byte) KEY_W#0, (const byte) KEY_X#0, (const byte) KEY_Y#0, (const byte) KEY_Z#0, (byte/signed byte/word/signed word/dword/signed dword) $3f, (const byte) KEY_POUND#0, (byte/signed byte/word/signed word/dword/signed dword) $3f, (const byte) KEY_ARROW_UP#0, (const byte) KEY_ARROW_LEFT#0, (const byte) KEY_SPACE#0, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f, (const byte) KEY_ASTERISK#0, (const byte) KEY_PLUS#0, (const byte) KEY_COMMA#0, (const byte) KEY_MINUS#0, (const byte) KEY_DOT#0, (const byte) KEY_SLASH#0, (const byte) KEY_0#0, (const byte) KEY_1#0, (const byte) KEY_2#0, (const byte) KEY_3#0, (const byte) KEY_4#0, (const byte) KEY_5#0, (const byte) KEY_6#0, (const byte) KEY_7#0, (const byte) KEY_8#0, (const byte) KEY_9#0, (const byte) KEY_COLON#0, (const byte) KEY_SEMICOLON#0, (byte/signed byte/word/signed word/dword/signed dword) $3f, (const byte) KEY_EQUALS#0, (byte/signed byte/word/signed word/dword/signed dword) $3f, (byte/signed byte/word/signed word/dword/signed dword) $3f }
(byte()) keyboard_get_keycode((byte) keyboard_get_keycode::ch)
(label) keyboard_get_keycode::@return
(byte) keyboard_get_keycode::ch
(byte) keyboard_get_keycode::ch#0 reg byte x 103.0
(byte) keyboard_get_keycode::return
(byte) keyboard_get_keycode::return#0 reg byte a 34.33333333333333
(byte) keyboard_get_keycode::return#2 reg byte a 202.0
(byte()) keyboard_key_pressed((byte) keyboard_key_pressed::key)
(byte~) keyboard_key_pressed::$2 reg byte a 4.0
(label) keyboard_key_pressed::@1
(label) keyboard_key_pressed::@return
(byte) keyboard_key_pressed::colidx
(byte) keyboard_key_pressed::colidx#0 reg byte y 0.6666666666666666
(byte) keyboard_key_pressed::key
(byte) keyboard_key_pressed::key#5 reg byte x 202.0
(byte) keyboard_key_pressed::key#6 reg byte x 52.5
(byte) keyboard_key_pressed::return
(byte) keyboard_key_pressed::return#0 reg byte a 19.75
(byte) keyboard_key_pressed::return#10 reg byte a 22.0
(byte) keyboard_key_pressed::return#11 reg byte a 22.0
(byte) keyboard_key_pressed::return#12 reg byte a 22.0
(byte) keyboard_key_pressed::return#13 reg byte a 22.0
(byte) keyboard_key_pressed::return#14 reg byte a 202.0
(byte) keyboard_key_pressed::return#2 reg byte a 22.0
(byte) keyboard_key_pressed::rowidx
(byte) keyboard_key_pressed::rowidx#0 reg byte a 4.0
(byte[8]) keyboard_matrix_col_bitmask
(const byte[8]) keyboard_matrix_col_bitmask#0 keyboard_matrix_col_bitmask = { (byte/signed byte/word/signed word/dword/signed dword) 1, (byte/signed byte/word/signed word/dword/signed dword) 2, (byte/signed byte/word/signed word/dword/signed dword) 4, (byte/signed byte/word/signed word/dword/signed dword) 8, (byte/signed byte/word/signed word/dword/signed dword) $10, (byte/signed byte/word/signed word/dword/signed dword) $20, (byte/signed byte/word/signed word/dword/signed dword) $40, (byte/word/signed word/dword/signed dword) $80 }
(byte()) keyboard_matrix_read((byte) keyboard_matrix_read::rowid)
(label) keyboard_matrix_read::@return
(byte) keyboard_matrix_read::return
(byte) keyboard_matrix_read::return#0 reg byte a 1.3333333333333333
(byte) keyboard_matrix_read::return#2 reg byte a 4.0
(byte) keyboard_matrix_read::row_pressed_bits
(byte) keyboard_matrix_read::rowid
(byte) keyboard_matrix_read::rowid#0 reg byte x 4.0
(byte[8]) keyboard_matrix_row_bitmask
(const byte[8]) keyboard_matrix_row_bitmask#0 keyboard_matrix_row_bitmask = { (byte/word/signed word/dword/signed dword) $fe, (byte/word/signed word/dword/signed dword) $fd, (byte/word/signed word/dword/signed dword) $fb, (byte/word/signed word/dword/signed dword) $f7, (byte/word/signed word/dword/signed dword) $ef, (byte/word/signed word/dword/signed dword) $df, (byte/word/signed word/dword/signed dword) $bf, (byte/signed byte/word/signed word/dword/signed dword) $7f }
(void()) main()
(byte~) main::$15 reg byte a 22.0
(byte~) main::$18 reg byte a 22.0
(byte~) main::$21 reg byte a 22.0
(byte~) main::$24 reg byte a 22.0
(byte~) main::$27 reg byte a 22.0
(label) main::@1
(label) main::@10
(label) main::@11
(label) main::@12
(label) main::@13
(label) main::@14
(label) main::@15
(label) main::@16
(label) main::@17
(label) main::@18
(label) main::@19
(label) main::@2
(label) main::@20
(label) main::@21
(label) main::@22
(label) main::@23
(label) main::@24
(label) main::@25
(label) main::@26
(label) main::@27
(label) main::@28
(label) main::@29
(label) main::@3
(label) main::@30
(label) main::@4
(label) main::@5
(label) main::@6
(label) main::@7
(label) main::@8
(label) main::@9
(byte) main::ch
(byte) main::ch#1 ch zp ZP_BYTE:6 151.5
(byte) main::ch#2 ch zp ZP_BYTE:6 25.25
(byte) main::cur_pos
(byte) main::cur_pos#11 cur_pos zp ZP_BYTE:4 8.52
(byte) main::cur_pos#18 cur_pos zp ZP_BYTE:4 3.6666666666666665
(byte) main::cur_pos#20 cur_pos zp ZP_BYTE:4 3.6666666666666665
(byte) main::cur_pos#22 cur_pos zp ZP_BYTE:4 3.6666666666666665
(byte) main::cur_pos#24 cur_pos zp ZP_BYTE:4 18.666666666666664
(byte) main::i
(byte) main::i#1 i zp ZP_BYTE:4 16.5
(byte) main::i#2 i zp ZP_BYTE:4 11.0
(byte) main::key
(byte) main::key#0 reg byte a 151.5
(byte) main::pressed
(byte) main::pressed#1 reg byte a 202.0
(byte) main::pressed#2 reg byte a 202.0
(byte*) main::sc
(byte*) main::sc#1 sc zp ZP_WORD:2 16.5
(byte*) main::sc#2 sc zp ZP_WORD:2 16.5
(byte) main::shift
(byte) main::shift#9 shift zp ZP_BYTE:5 5.315789473684211
(const string) main::str str = (string) "f1@"
(const string) main::str1 str1 = (string) "f3@"
(const string) main::str2 str2 = (string) "f5@"
(const string) main::str3 str3 = (string) "f7@"
(word()) mul8u((byte) mul8u::a , (byte) mul8u::b)
(byte~) mul8u::$1 reg byte a 2002.0
(label) mul8u::@1
(label) mul8u::@2
(label) mul8u::@3
(label) mul8u::@4
(label) mul8u::@return
(byte) mul8u::a
(byte) mul8u::a#0 reg byte x 1001.0
(byte) mul8u::a#1 reg byte x 2.0
(byte) mul8u::a#2 reg byte x 667.6666666666667
(byte) mul8u::b
(const byte) mul8u::b#0 b = (byte/signed byte/word/signed word/dword/signed dword) $a
(word) mul8u::mb
(word) mul8u::mb#1 mb zp ZP_WORD:11 2002.0
(word) mul8u::mb#2 mb zp ZP_WORD:11 429.0
(word) mul8u::res
(word) mul8u::res#1 res zp ZP_WORD:9 2002.0
(word) mul8u::res#2 res zp ZP_WORD:9 500.83333333333337
(word) mul8u::res#6 res zp ZP_WORD:9 1001.0
(word) mul8u::return
(word) mul8u::return#2 return zp ZP_WORD:9 4.0
(void()) plot_chargen((byte) plot_chargen::pos , (byte) plot_chargen::ch , (byte) plot_chargen::shift)
(word~) plot_chargen::$0 $0 zp ZP_WORD:2 4.0
(word~) plot_chargen::$1 $1 zp ZP_WORD:2 4.0
(byte~) plot_chargen::$10 reg byte a 20002.0
(word~) plot_chargen::$7 $7 zp ZP_WORD:9 4.0
(label) plot_chargen::@1
(label) plot_chargen::@2
(label) plot_chargen::@3
(label) plot_chargen::@4
(label) plot_chargen::@5
(label) plot_chargen::@6
(label) plot_chargen::@7
(label) plot_chargen::@8
(label) plot_chargen::@9
(label) plot_chargen::@return
(byte) plot_chargen::bits
(byte) plot_chargen::bits#0 bits zp ZP_BYTE:8 2002.0
(byte) plot_chargen::bits#1 bits zp ZP_BYTE:8 6667.333333333333
(byte) plot_chargen::bits#2 bits zp ZP_BYTE:8 4429.142857142857
(byte) plot_chargen::c
(byte) plot_chargen::c#2 reg byte a 10001.0
(byte) plot_chargen::ch
(byte) plot_chargen::ch#1 reg byte a 101.0
(byte) plot_chargen::ch#2 reg byte a 51.5
(byte*) plot_chargen::chargen
(byte*) plot_chargen::chargen#0 chargen zp ZP_WORD:2 3.0
(byte*) plot_chargen::chargen#1 chargen zp ZP_WORD:2 4.0
(byte*) plot_chargen::chargen#5 chargen zp ZP_WORD:2 45.68181818181818
(byte) plot_chargen::pos
(byte) plot_chargen::pos#0 reg byte y 22.0
(byte) plot_chargen::pos#1 reg byte y 67.33333333333333
(byte) plot_chargen::pos#2 reg byte y 12.666666666666664
(byte*) plot_chargen::sc
(byte*) plot_chargen::sc#0 sc zp ZP_WORD:9 4.0
(byte*) plot_chargen::sc#1 sc zp ZP_WORD:9 5250.75
(byte*) plot_chargen::sc#2 sc zp ZP_WORD:9 667.3333333333334
(byte*) plot_chargen::sc#3 sc zp ZP_WORD:9 5167.333333333333
(byte*) plot_chargen::sc#7 sc zp ZP_WORD:9 1002.0
(byte) plot_chargen::shift
(byte) plot_chargen::shift#1 reg byte x 202.0
(byte) plot_chargen::shift#2 reg byte x 20.599999999999998
(byte) plot_chargen::x
(byte) plot_chargen::x#1 reg byte x 15001.5
(byte) plot_chargen::x#2 reg byte x 2500.25
(byte) plot_chargen::y
(byte) plot_chargen::y#1 y zp ZP_BYTE:7 1501.5
(byte) plot_chargen::y#2 y zp ZP_BYTE:7 231.0
(void()) print_str_at((byte*) print_str_at::str , (byte*) print_str_at::at)
(label) print_str_at::@1
(label) print_str_at::@2
(label) print_str_at::@return
(byte*) print_str_at::at
(byte*) print_str_at::at#4 at zp ZP_WORD:9 11.0
(byte*) print_str_at::at#5 at zp ZP_WORD:9 11.666666666666666
(byte*) print_str_at::at#7 at zp ZP_WORD:9 2.0
(byte*) print_str_at::str
(byte*) print_str_at::str#4 str zp ZP_WORD:2 22.0
(byte*) print_str_at::str#5 str zp ZP_WORD:2 11.5
(byte*) print_str_at::str#7 str zp ZP_WORD:2 2.0
zp ZP_WORD:2 [ main::sc#2 main::sc#1 plot_chargen::chargen#5 plot_chargen::chargen#0 plot_chargen::chargen#1 plot_chargen::$1 plot_chargen::$0 print_str_at::str#5 print_str_at::str#7 print_str_at::str#4 ]
zp ZP_BYTE:4 [ main::i#2 main::i#1 main::cur_pos#18 main::cur_pos#20 main::cur_pos#22 main::cur_pos#24 main::cur_pos#11 ]
zp ZP_BYTE:5 [ main::shift#9 ]
zp ZP_BYTE:6 [ main::ch#2 main::ch#1 ]
reg byte a [ main::pressed#2 main::pressed#1 ]
reg byte a [ plot_chargen::ch#2 plot_chargen::ch#1 ]
reg byte x [ plot_chargen::shift#2 plot_chargen::shift#1 ]
reg byte y [ plot_chargen::pos#2 plot_chargen::pos#1 plot_chargen::pos#0 ]
zp ZP_BYTE:7 [ plot_chargen::y#2 plot_chargen::y#1 ]
zp ZP_BYTE:8 [ plot_chargen::bits#2 plot_chargen::bits#0 plot_chargen::bits#1 ]
zp ZP_WORD:9 [ plot_chargen::sc#3 plot_chargen::sc#7 plot_chargen::sc#2 plot_chargen::sc#0 plot_chargen::sc#1 plot_chargen::$7 mul8u::res#2 mul8u::res#6 mul8u::res#1 mul8u::return#2 print_str_at::at#5 print_str_at::at#7 print_str_at::at#4 ]
reg byte x [ plot_chargen::x#2 plot_chargen::x#1 ]
reg byte a [ plot_chargen::c#2 ]
reg byte x [ mul8u::a#2 mul8u::a#1 mul8u::a#0 ]
zp ZP_WORD:11 [ mul8u::mb#2 mul8u::mb#1 ]
reg byte x [ keyboard_key_pressed::key#6 keyboard_key_pressed::key#5 ]
reg byte a [ keyboard_key_pressed::return#2 ]
reg byte a [ main::$15 ]
reg byte a [ keyboard_key_pressed::return#10 ]
reg byte a [ main::$18 ]
reg byte a [ keyboard_key_pressed::return#11 ]
reg byte a [ main::$21 ]
reg byte a [ keyboard_key_pressed::return#12 ]
reg byte a [ main::$24 ]
reg byte a [ keyboard_key_pressed::return#13 ]
reg byte a [ main::$27 ]
reg byte x [ keyboard_get_keycode::ch#0 ]
reg byte a [ keyboard_get_keycode::return#2 ]
reg byte a [ main::key#0 ]
reg byte a [ keyboard_key_pressed::return#14 ]
reg byte a [ plot_chargen::$10 ]
reg byte a [ mul8u::$1 ]
reg byte y [ keyboard_key_pressed::colidx#0 ]
reg byte a [ keyboard_key_pressed::rowidx#0 ]
reg byte x [ keyboard_matrix_read::rowid#0 ]
reg byte a [ keyboard_matrix_read::return#2 ]
reg byte a [ keyboard_key_pressed::$2 ]
reg byte a [ keyboard_key_pressed::return#0 ]
reg byte a [ keyboard_matrix_read::return#0 ]
reg byte a [ keyboard_get_keycode::return#0 ]
FINAL ASSEMBLER
Score: 626893
//SEG0 File Comments
// Allows analysis of the CHARGEN ROM font
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG2 Global Constants & labels
// Processor Port Register controlling RAM/ROM configuration and the datasette
.label PROCPORT = 1
// The address of the CHARGEN character set
.label CHARGEN = $d000
// CIA#1 Port A: keyboard matrix columns and joystick #2
.label CIA1_PORT_A = $dc00
// CIA#1 Port B: keyboard matrix rows and joystick #1.
.label CIA1_PORT_B = $dc01
.const KEY_F7 = 3
.const KEY_F1 = 4
.const KEY_F3 = 5
.const KEY_F5 = 6
.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_LSHIFT = $f
.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
.label SCREEN = $400
//SEG3 @begin
//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
//SEG5 @1
//SEG6 [2] call main
//SEG7 [4] phi from @1 to main [phi:@1->main]
//SEG8 [3] phi from @1 to @end [phi:@1->@end]
//SEG9 @end
//SEG10 main
main: {
.label sc = 2
.label i = 4
.label ch = 6
.label cur_pos = 4
.label shift = 5
//SEG11 [5] phi from main to main::@1 [phi:main->main::@1]
//SEG12 [5] phi (byte*) main::sc#2 = (const byte*) SCREEN#0 [phi:main->main::@1#0] -- pbuz1=pbuc1
lda #<SCREEN
sta sc
lda #>SCREEN
sta sc+1
// Clear screen
//SEG13 [5] phi from main::@1 to main::@1 [phi:main::@1->main::@1]
//SEG14 [5] phi (byte*) main::sc#2 = (byte*) main::sc#1 [phi:main::@1->main::@1#0] -- register_copy
//SEG15 main::@1
b1:
//SEG16 [6] *((byte*) main::sc#2) ← (byte) ' ' -- _deref_pbuz1=vbuc1
lda #' '
ldy #0
sta (sc),y
//SEG17 [7] (byte*) main::sc#1 ← ++ (byte*) main::sc#2 -- pbuz1=_inc_pbuz1
inc sc
bne !+
inc sc+1
!:
//SEG18 [8] if((byte*) main::sc#1<(const byte*) SCREEN#0+(word/signed word/dword/signed dword) $3e8) goto main::@1 -- pbuz1_lt_pbuc1_then_la1
lda sc+1
cmp #>SCREEN+$3e8
bcc b1
bne !+
lda sc
cmp #<SCREEN+$3e8
bcc b1
!:
//SEG19 [9] phi from main::@1 to main::@2 [phi:main::@1->main::@2]
//SEG20 main::@2
//SEG21 [10] call print_str_at
//SEG22 [127] phi from main::@2 to print_str_at [phi:main::@2->print_str_at]
//SEG23 [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@2->print_str_at#0] -- pbuz1=pbuc1
lda #<SCREEN+1
sta print_str_at.at
lda #>SCREEN+1
sta print_str_at.at+1
//SEG24 [127] phi (byte*) print_str_at::str#7 = (const string) main::str [phi:main::@2->print_str_at#1] -- pbuz1=pbuc1
lda #<str
sta print_str_at.str
lda #>str
sta print_str_at.str+1
jsr print_str_at
//SEG25 [11] phi from main::@2 to main::@16 [phi:main::@2->main::@16]
//SEG26 main::@16
//SEG27 [12] call print_str_at
//SEG28 [127] phi from main::@16 to print_str_at [phi:main::@16->print_str_at]
//SEG29 [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1+(byte/signed byte/word/signed word/dword/signed dword) $a [phi:main::@16->print_str_at#0] -- pbuz1=pbuc1
lda #<SCREEN+1+$a
sta print_str_at.at
lda #>SCREEN+1+$a
sta print_str_at.at+1
//SEG30 [127] phi (byte*) print_str_at::str#7 = (const string) main::str1 [phi:main::@16->print_str_at#1] -- pbuz1=pbuc1
lda #<str1
sta print_str_at.str
lda #>str1
sta print_str_at.str+1
jsr print_str_at
//SEG31 [13] phi from main::@16 to main::@17 [phi:main::@16->main::@17]
//SEG32 main::@17
//SEG33 [14] call print_str_at
//SEG34 [127] phi from main::@17 to print_str_at [phi:main::@17->print_str_at]
//SEG35 [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1+(byte/signed byte/word/signed word/dword/signed dword) $14 [phi:main::@17->print_str_at#0] -- pbuz1=pbuc1
lda #<SCREEN+1+$14
sta print_str_at.at
lda #>SCREEN+1+$14
sta print_str_at.at+1
//SEG36 [127] phi (byte*) print_str_at::str#7 = (const string) main::str2 [phi:main::@17->print_str_at#1] -- pbuz1=pbuc1
lda #<str2
sta print_str_at.str
lda #>str2
sta print_str_at.str+1
jsr print_str_at
//SEG37 [15] phi from main::@17 to main::@18 [phi:main::@17->main::@18]
//SEG38 main::@18
//SEG39 [16] call print_str_at
//SEG40 [127] phi from main::@18 to print_str_at [phi:main::@18->print_str_at]
//SEG41 [127] phi (byte*) print_str_at::at#7 = (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1+(byte/signed byte/word/signed word/dword/signed dword) $1e [phi:main::@18->print_str_at#0] -- pbuz1=pbuc1
lda #<SCREEN+1+$1e
sta print_str_at.at
lda #>SCREEN+1+$1e
sta print_str_at.at+1
//SEG42 [127] phi (byte*) print_str_at::str#7 = (const string) main::str3 [phi:main::@18->print_str_at#1] -- pbuz1=pbuc1
lda #<str3
sta print_str_at.str
lda #>str3
sta print_str_at.str+1
jsr print_str_at
//SEG43 [17] phi from main::@18 to main::@3 [phi:main::@18->main::@3]
//SEG44 [17] phi (byte) main::i#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@18->main::@3#0] -- vbuz1=vbuc1
lda #0
sta i
//SEG45 [17] phi from main::@19 to main::@3 [phi:main::@19->main::@3]
//SEG46 [17] phi (byte) main::i#2 = (byte) main::i#1 [phi:main::@19->main::@3#0] -- register_copy
//SEG47 main::@3
b3:
//SEG48 [18] (byte) plot_chargen::pos#0 ← (byte) main::i#2 -- vbuyy=vbuz1
ldy i
//SEG49 [19] call plot_chargen
//SEG50 [71] phi from main::@3 to plot_chargen [phi:main::@3->plot_chargen]
//SEG51 [71] phi (byte) plot_chargen::pos#2 = (byte) plot_chargen::pos#0 [phi:main::@3->plot_chargen#0] -- register_copy
//SEG52 [71] phi (byte) plot_chargen::shift#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@3->plot_chargen#1] -- vbuxx=vbuc1
ldx #0
//SEG53 [71] phi (byte) plot_chargen::ch#2 = (byte/signed byte/word/signed word/dword/signed dword) $20 [phi:main::@3->plot_chargen#2] -- vbuaa=vbuc1
lda #$20
jsr plot_chargen
//SEG54 main::@19
//SEG55 [20] (byte) main::i#1 ← ++ (byte) main::i#2 -- vbuz1=_inc_vbuz1
inc i
//SEG56 [21] if((byte) main::i#1!=(byte/signed byte/word/signed word/dword/signed dword) 4) goto main::@3 -- vbuz1_neq_vbuc1_then_la1
lda #4
cmp i
bne b3
//SEG57 [22] phi from main::@19 to main::@4 [phi:main::@19->main::@4]
//SEG58 [22] phi (byte) main::cur_pos#24 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@19->main::@4#0] -- vbuz1=vbuc1
lda #0
sta cur_pos
//SEG59 main::@4
b4:
//SEG60 [23] call keyboard_key_pressed
//SEG61 [113] phi from main::@4 to keyboard_key_pressed [phi:main::@4->keyboard_key_pressed]
//SEG62 [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F1#0 [phi:main::@4->keyboard_key_pressed#0] -- vbuxx=vbuc1
ldx #KEY_F1
jsr keyboard_key_pressed
//SEG63 [24] (byte) keyboard_key_pressed::return#2 ← (byte) keyboard_key_pressed::return#0
//SEG64 main::@20
//SEG65 [25] (byte~) main::$15 ← (byte) keyboard_key_pressed::return#2
//SEG66 [26] if((byte~) main::$15==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@27 -- vbuaa_eq_0_then_la1
cmp #0
beq b5
//SEG67 [27] phi from main::@20 to main::@5 [phi:main::@20->main::@5]
//SEG68 [27] phi (byte) main::cur_pos#22 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@20->main::@5#0] -- vbuz1=vbuc1
lda #0
sta cur_pos
//SEG69 main::@5
b5:
//SEG70 [28] call keyboard_key_pressed
//SEG71 [113] phi from main::@5 to keyboard_key_pressed [phi:main::@5->keyboard_key_pressed]
//SEG72 [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F3#0 [phi:main::@5->keyboard_key_pressed#0] -- vbuxx=vbuc1
ldx #KEY_F3
jsr keyboard_key_pressed
//SEG73 [29] (byte) keyboard_key_pressed::return#10 ← (byte) keyboard_key_pressed::return#0
//SEG74 main::@21
//SEG75 [30] (byte~) main::$18 ← (byte) keyboard_key_pressed::return#10
//SEG76 [31] if((byte~) main::$18==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@28 -- vbuaa_eq_0_then_la1
cmp #0
beq b6
//SEG77 [32] phi from main::@21 to main::@6 [phi:main::@21->main::@6]
//SEG78 [32] phi (byte) main::cur_pos#20 = (byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@21->main::@6#0] -- vbuz1=vbuc1
lda #1
sta cur_pos
//SEG79 main::@6
b6:
//SEG80 [33] call keyboard_key_pressed
//SEG81 [113] phi from main::@6 to keyboard_key_pressed [phi:main::@6->keyboard_key_pressed]
//SEG82 [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F5#0 [phi:main::@6->keyboard_key_pressed#0] -- vbuxx=vbuc1
ldx #KEY_F5
jsr keyboard_key_pressed
//SEG83 [34] (byte) keyboard_key_pressed::return#11 ← (byte) keyboard_key_pressed::return#0
//SEG84 main::@22
//SEG85 [35] (byte~) main::$21 ← (byte) keyboard_key_pressed::return#11
//SEG86 [36] if((byte~) main::$21==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@29 -- vbuaa_eq_0_then_la1
cmp #0
beq b7
//SEG87 [37] phi from main::@22 to main::@7 [phi:main::@22->main::@7]
//SEG88 [37] phi (byte) main::cur_pos#18 = (byte/signed byte/word/signed word/dword/signed dword) 2 [phi:main::@22->main::@7#0] -- vbuz1=vbuc1
lda #2
sta cur_pos
//SEG89 main::@7
b7:
//SEG90 [38] call keyboard_key_pressed
//SEG91 [113] phi from main::@7 to keyboard_key_pressed [phi:main::@7->keyboard_key_pressed]
//SEG92 [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_F7#0 [phi:main::@7->keyboard_key_pressed#0] -- vbuxx=vbuc1
ldx #KEY_F7
jsr keyboard_key_pressed
//SEG93 [39] (byte) keyboard_key_pressed::return#12 ← (byte) keyboard_key_pressed::return#0
//SEG94 main::@23
//SEG95 [40] (byte~) main::$24 ← (byte) keyboard_key_pressed::return#12
//SEG96 [41] if((byte~) main::$24==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@30 -- vbuaa_eq_0_then_la1
cmp #0
beq b8
//SEG97 [42] phi from main::@23 to main::@8 [phi:main::@23->main::@8]
//SEG98 [42] phi (byte) main::cur_pos#11 = (byte/signed byte/word/signed word/dword/signed dword) 3 [phi:main::@23->main::@8#0] -- vbuz1=vbuc1
lda #3
sta cur_pos
//SEG99 main::@8
b8:
//SEG100 [43] call keyboard_key_pressed
//SEG101 [113] phi from main::@8 to keyboard_key_pressed [phi:main::@8->keyboard_key_pressed]
//SEG102 [113] phi (byte) keyboard_key_pressed::key#6 = (const byte) KEY_LSHIFT#0 [phi:main::@8->keyboard_key_pressed#0] -- vbuxx=vbuc1
ldx #KEY_LSHIFT
jsr keyboard_key_pressed
//SEG103 [44] (byte) keyboard_key_pressed::return#13 ← (byte) keyboard_key_pressed::return#0
//SEG104 main::@24
//SEG105 [45] (byte~) main::$27 ← (byte) keyboard_key_pressed::return#13
//SEG106 [46] if((byte~) main::$27!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@9 -- vbuaa_neq_0_then_la1
cmp #0
bne b2
//SEG107 [47] phi from main::@24 to main::@15 [phi:main::@24->main::@15]
//SEG108 main::@15
//SEG109 [48] phi from main::@15 to main::@9 [phi:main::@15->main::@9]
//SEG110 [48] phi (byte) main::shift#9 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@15->main::@9#0] -- vbuz1=vbuc1
lda #0
sta shift
jmp b9
//SEG111 [48] phi from main::@24 to main::@9 [phi:main::@24->main::@9]
b2:
//SEG112 [48] phi (byte) main::shift#9 = (byte/signed byte/word/signed word/dword/signed dword) 1 [phi:main::@24->main::@9#0] -- vbuz1=vbuc1
lda #1
sta shift
//SEG113 main::@9
b9:
//SEG114 [49] phi from main::@9 to main::@10 [phi:main::@9->main::@10]
//SEG115 [49] phi (byte) main::ch#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@9->main::@10#0] -- vbuz1=vbuc1
lda #0
sta ch
// Check for key presses - and plot char if found
//SEG116 [49] phi from main::@12 to main::@10 [phi:main::@12->main::@10]
//SEG117 [49] phi (byte) main::ch#2 = (byte) main::ch#1 [phi:main::@12->main::@10#0] -- register_copy
//SEG118 main::@10
b10:
//SEG119 [50] (byte) keyboard_get_keycode::ch#0 ← (byte) main::ch#2 -- vbuxx=vbuz1
ldx ch
//SEG120 [51] call keyboard_get_keycode
jsr keyboard_get_keycode
//SEG121 [52] (byte) keyboard_get_keycode::return#2 ← (byte) keyboard_get_keycode::return#0
//SEG122 main::@25
//SEG123 [53] (byte) main::key#0 ← (byte) keyboard_get_keycode::return#2
//SEG124 [54] if((byte) main::key#0==(byte/signed byte/word/signed word/dword/signed dword) $3f) goto main::@11 -- vbuaa_eq_vbuc1_then_la1
cmp #$3f
beq b13
//SEG125 main::@13
//SEG126 [55] (byte) keyboard_key_pressed::key#5 ← (byte) main::key#0 -- vbuxx=vbuaa
tax
//SEG127 [56] call keyboard_key_pressed
//SEG128 [113] phi from main::@13 to keyboard_key_pressed [phi:main::@13->keyboard_key_pressed]
//SEG129 [113] phi (byte) keyboard_key_pressed::key#6 = (byte) keyboard_key_pressed::key#5 [phi:main::@13->keyboard_key_pressed#0] -- register_copy
jsr keyboard_key_pressed
//SEG130 [57] (byte) keyboard_key_pressed::return#14 ← (byte) keyboard_key_pressed::return#0
//SEG131 main::@26
//SEG132 [58] (byte) main::pressed#1 ← (byte) keyboard_key_pressed::return#14
//SEG133 [59] phi from main::@26 to main::@11 [phi:main::@26->main::@11]
//SEG134 [59] phi (byte) main::pressed#2 = (byte) main::pressed#1 [phi:main::@26->main::@11#0] -- register_copy
jmp b11
//SEG135 [59] phi from main::@25 to main::@11 [phi:main::@25->main::@11]
b13:
//SEG136 [59] phi (byte) main::pressed#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:main::@25->main::@11#0] -- vbuaa=vbuc1
lda #0
//SEG137 main::@11
b11:
//SEG138 [60] if((byte) main::pressed#2==(byte/signed byte/word/signed word/dword/signed dword) 0) goto main::@12 -- vbuaa_eq_0_then_la1
cmp #0
beq b12
//SEG139 main::@14
//SEG140 [61] (byte) plot_chargen::pos#1 ← (byte) main::cur_pos#11 -- vbuyy=vbuz1
ldy cur_pos
//SEG141 [62] (byte) plot_chargen::ch#1 ← (byte) main::ch#2 -- vbuaa=vbuz1
lda ch
//SEG142 [63] (byte) plot_chargen::shift#1 ← (byte) main::shift#9 -- vbuxx=vbuz1
ldx shift
//SEG143 [64] call plot_chargen
//SEG144 [71] phi from main::@14 to plot_chargen [phi:main::@14->plot_chargen]
//SEG145 [71] phi (byte) plot_chargen::pos#2 = (byte) plot_chargen::pos#1 [phi:main::@14->plot_chargen#0] -- register_copy
//SEG146 [71] phi (byte) plot_chargen::shift#2 = (byte) plot_chargen::shift#1 [phi:main::@14->plot_chargen#1] -- register_copy
//SEG147 [71] phi (byte) plot_chargen::ch#2 = (byte) plot_chargen::ch#1 [phi:main::@14->plot_chargen#2] -- register_copy
jsr plot_chargen
//SEG148 main::@12
b12:
//SEG149 [65] (byte) main::ch#1 ← ++ (byte) main::ch#2 -- vbuz1=_inc_vbuz1
inc ch
//SEG150 [66] if((byte) main::ch#1!=(byte/signed byte/word/signed word/dword/signed dword) $40) goto main::@10 -- vbuz1_neq_vbuc1_then_la1
lda #$40
cmp ch
bne b10
//SEG151 [22] phi from main::@12 to main::@4 [phi:main::@12->main::@4]
//SEG152 [22] phi (byte) main::cur_pos#24 = (byte) main::cur_pos#11 [phi:main::@12->main::@4#0] -- register_copy
jmp b4
//SEG153 [67] phi from main::@23 to main::@30 [phi:main::@23->main::@30]
//SEG154 main::@30
//SEG155 [42] phi from main::@30 to main::@8 [phi:main::@30->main::@8]
//SEG156 [42] phi (byte) main::cur_pos#11 = (byte) main::cur_pos#18 [phi:main::@30->main::@8#0] -- register_copy
//SEG157 [68] phi from main::@22 to main::@29 [phi:main::@22->main::@29]
//SEG158 main::@29
//SEG159 [37] phi from main::@29 to main::@7 [phi:main::@29->main::@7]
//SEG160 [37] phi (byte) main::cur_pos#18 = (byte) main::cur_pos#20 [phi:main::@29->main::@7#0] -- register_copy
//SEG161 [69] phi from main::@21 to main::@28 [phi:main::@21->main::@28]
//SEG162 main::@28
//SEG163 [32] phi from main::@28 to main::@6 [phi:main::@28->main::@6]
//SEG164 [32] phi (byte) main::cur_pos#20 = (byte) main::cur_pos#22 [phi:main::@28->main::@6#0] -- register_copy
//SEG165 [70] phi from main::@20 to main::@27 [phi:main::@20->main::@27]
//SEG166 main::@27
//SEG167 [27] phi from main::@27 to main::@5 [phi:main::@27->main::@5]
//SEG168 [27] phi (byte) main::cur_pos#22 = (byte) main::cur_pos#24 [phi:main::@27->main::@5#0] -- register_copy
str: .text "f1@"
str1: .text "f3@"
str2: .text "f5@"
str3: .text "f7@"
}
//SEG169 plot_chargen
// Render 8x8 char (ch) as pixels on char canvas #pos
// plot_chargen(byte register(Y) pos, byte register(A) ch, byte register(X) shift)
plot_chargen: {
.label _0 = 2
.label _1 = 2
.label _7 = 9
.label chargen = 2
.label sc = 9
.label bits = 8
.label y = 7
//SEG170 asm { sei }
sei
//SEG171 [73] (word~) plot_chargen::$0 ← ((word)) (byte) plot_chargen::ch#2 -- vwuz1=_word_vbuaa
sta _0
lda #0
sta _0+1
//SEG172 [74] (word~) plot_chargen::$1 ← (word~) plot_chargen::$0 << (byte/signed byte/word/signed word/dword/signed dword) 3 -- vwuz1=vwuz1_rol_3
asl _1
rol _1+1
asl _1
rol _1+1
asl _1
rol _1+1
//SEG173 [75] (byte*) plot_chargen::chargen#0 ← (const byte*) CHARGEN#0 + (word~) plot_chargen::$1 -- pbuz1=pbuc1_plus_vwuz1
clc
lda chargen
adc #<CHARGEN
sta chargen
lda chargen+1
adc #>CHARGEN
sta chargen+1
//SEG174 [76] if((byte) plot_chargen::shift#2==(byte/signed byte/word/signed word/dword/signed dword) 0) goto plot_chargen::@1 -- vbuxx_eq_0_then_la1
cpx #0
beq b1
//SEG175 plot_chargen::@2
//SEG176 [77] (byte*) plot_chargen::chargen#1 ← (byte*) plot_chargen::chargen#0 + (word/signed word/dword/signed dword) $800 -- pbuz1=pbuz1_plus_vwuc1
clc
lda chargen
adc #<$800
sta chargen
lda chargen+1
adc #>$800
sta chargen+1
//SEG177 [78] phi from plot_chargen plot_chargen::@2 to plot_chargen::@1 [phi:plot_chargen/plot_chargen::@2->plot_chargen::@1]
//SEG178 [78] phi (byte*) plot_chargen::chargen#5 = (byte*) plot_chargen::chargen#0 [phi:plot_chargen/plot_chargen::@2->plot_chargen::@1#0] -- register_copy
//SEG179 plot_chargen::@1
b1:
//SEG180 [79] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $32 -- _deref_pbuc1=vbuc2
lda #$32
sta PROCPORT
//SEG181 [80] (byte) mul8u::a#1 ← (byte) plot_chargen::pos#2 -- vbuxx=vbuyy
tya
tax
//SEG182 [81] call mul8u
//SEG183 [103] phi from plot_chargen::@1 to mul8u [phi:plot_chargen::@1->mul8u]
jsr mul8u
//SEG184 [82] (word) mul8u::return#2 ← (word) mul8u::res#2
//SEG185 plot_chargen::@9
//SEG186 [83] (word~) plot_chargen::$7 ← (word) mul8u::return#2
//SEG187 [84] (byte*) plot_chargen::sc#0 ← (const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28+(byte/signed byte/word/signed word/dword/signed dword) 1 + (word~) plot_chargen::$7 -- pbuz1=pbuc1_plus_vwuz1
clc
lda sc
adc #<SCREEN+$28+1
sta sc
lda sc+1
adc #>SCREEN+$28+1
sta sc+1
//SEG188 [85] phi from plot_chargen::@9 to plot_chargen::@3 [phi:plot_chargen::@9->plot_chargen::@3]
//SEG189 [85] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#0 [phi:plot_chargen::@9->plot_chargen::@3#0] -- register_copy
//SEG190 [85] phi (byte) plot_chargen::y#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:plot_chargen::@9->plot_chargen::@3#1] -- vbuz1=vbuc1
lda #0
sta y
//SEG191 [85] phi from plot_chargen::@7 to plot_chargen::@3 [phi:plot_chargen::@7->plot_chargen::@3]
//SEG192 [85] phi (byte*) plot_chargen::sc#7 = (byte*) plot_chargen::sc#2 [phi:plot_chargen::@7->plot_chargen::@3#0] -- register_copy
//SEG193 [85] phi (byte) plot_chargen::y#2 = (byte) plot_chargen::y#1 [phi:plot_chargen::@7->plot_chargen::@3#1] -- register_copy
//SEG194 plot_chargen::@3
b3:
//SEG195 [86] (byte) plot_chargen::bits#0 ← *((byte*) plot_chargen::chargen#5 + (byte) plot_chargen::y#2) -- vbuz1=pbuz2_derefidx_vbuz3
ldy y
lda (chargen),y
sta bits
//SEG196 [87] phi from plot_chargen::@3 to plot_chargen::@4 [phi:plot_chargen::@3->plot_chargen::@4]
//SEG197 [87] phi (byte) plot_chargen::x#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:plot_chargen::@3->plot_chargen::@4#0] -- vbuxx=vbuc1
ldx #0
//SEG198 [87] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#7 [phi:plot_chargen::@3->plot_chargen::@4#1] -- register_copy
//SEG199 [87] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#0 [phi:plot_chargen::@3->plot_chargen::@4#2] -- register_copy
//SEG200 [87] phi from plot_chargen::@5 to plot_chargen::@4 [phi:plot_chargen::@5->plot_chargen::@4]
//SEG201 [87] phi (byte) plot_chargen::x#2 = (byte) plot_chargen::x#1 [phi:plot_chargen::@5->plot_chargen::@4#0] -- register_copy
//SEG202 [87] phi (byte*) plot_chargen::sc#3 = (byte*) plot_chargen::sc#1 [phi:plot_chargen::@5->plot_chargen::@4#1] -- register_copy
//SEG203 [87] phi (byte) plot_chargen::bits#2 = (byte) plot_chargen::bits#1 [phi:plot_chargen::@5->plot_chargen::@4#2] -- register_copy
//SEG204 plot_chargen::@4
b4:
//SEG205 [88] (byte~) plot_chargen::$10 ← (byte) plot_chargen::bits#2 & (byte/word/signed word/dword/signed dword) $80 -- vbuaa=vbuz1_band_vbuc1
lda #$80
and bits
//SEG206 [89] if((byte~) plot_chargen::$10==(byte/signed byte/word/signed word/dword/signed dword) 0) goto plot_chargen::@5 -- vbuaa_eq_0_then_la1
cmp #0
beq b2
//SEG207 [90] phi from plot_chargen::@4 to plot_chargen::@6 [phi:plot_chargen::@4->plot_chargen::@6]
//SEG208 plot_chargen::@6
//SEG209 [91] phi from plot_chargen::@6 to plot_chargen::@5 [phi:plot_chargen::@6->plot_chargen::@5]
//SEG210 [91] phi (byte) plot_chargen::c#2 = (byte) '*' [phi:plot_chargen::@6->plot_chargen::@5#0] -- vbuaa=vbuc1
lda #'*'
jmp b5
//SEG211 [91] phi from plot_chargen::@4 to plot_chargen::@5 [phi:plot_chargen::@4->plot_chargen::@5]
b2:
//SEG212 [91] phi (byte) plot_chargen::c#2 = (byte) '.' [phi:plot_chargen::@4->plot_chargen::@5#0] -- vbuaa=vbuc1
lda #'.'
//SEG213 plot_chargen::@5
b5:
//SEG214 [92] *((byte*) plot_chargen::sc#3) ← (byte) plot_chargen::c#2 -- _deref_pbuz1=vbuaa
ldy #0
sta (sc),y
//SEG215 [93] (byte*) plot_chargen::sc#1 ← ++ (byte*) plot_chargen::sc#3 -- pbuz1=_inc_pbuz1
inc sc
bne !+
inc sc+1
!:
//SEG216 [94] (byte) plot_chargen::bits#1 ← (byte) plot_chargen::bits#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuz1=vbuz1_rol_1
asl bits
//SEG217 [95] (byte) plot_chargen::x#1 ← ++ (byte) plot_chargen::x#2 -- vbuxx=_inc_vbuxx
inx
//SEG218 [96] if((byte) plot_chargen::x#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto plot_chargen::@4 -- vbuxx_neq_vbuc1_then_la1
cpx #8
bne b4
//SEG219 plot_chargen::@7
//SEG220 [97] (byte*) plot_chargen::sc#2 ← (byte*) plot_chargen::sc#1 + (byte/signed byte/word/signed word/dword/signed dword) $20 -- pbuz1=pbuz1_plus_vbuc1
lda #$20
clc
adc sc
sta sc
bcc !+
inc sc+1
!:
//SEG221 [98] (byte) plot_chargen::y#1 ← ++ (byte) plot_chargen::y#2 -- vbuz1=_inc_vbuz1
inc y
//SEG222 [99] if((byte) plot_chargen::y#1!=(byte/signed byte/word/signed word/dword/signed dword) 8) goto plot_chargen::@3 -- vbuz1_neq_vbuc1_then_la1
lda #8
cmp y
bne b3
//SEG223 plot_chargen::@8
//SEG224 [100] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word/dword/signed dword) $37 -- _deref_pbuc1=vbuc2
lda #$37
sta PROCPORT
//SEG225 asm { cli }
cli
//SEG226 plot_chargen::@return
//SEG227 [102] return
rts
}
//SEG228 mul8u
// Perform binary multiplication of two unsigned 8-bit bytes into a 16-bit unsigned word
// mul8u(byte register(X) a)
mul8u: {
.const b = $a
.label mb = $b
.label res = 9
.label return = 9
//SEG229 [104] phi from mul8u to mul8u::@1 [phi:mul8u->mul8u::@1]
//SEG230 [104] phi (word) mul8u::mb#2 = ((word))(const byte) mul8u::b#0 [phi:mul8u->mul8u::@1#0] -- vwuz1=vbuc1
lda #b
sta mb
lda #0
sta mb+1
//SEG231 [104] phi (word) mul8u::res#2 = (byte/signed byte/word/signed word/dword/signed dword) 0 [phi:mul8u->mul8u::@1#1] -- vwuz1=vbuc1
sta res
sta res+1
//SEG232 [104] phi (byte) mul8u::a#2 = (byte) mul8u::a#1 [phi:mul8u->mul8u::@1#2] -- register_copy
//SEG233 mul8u::@1
b1:
//SEG234 [105] if((byte) mul8u::a#2!=(byte/signed byte/word/signed word/dword/signed dword) 0) goto mul8u::@2 -- vbuxx_neq_0_then_la1
cpx #0
bne b2
//SEG235 mul8u::@return
//SEG236 [106] return
rts
//SEG237 mul8u::@2
b2:
//SEG238 [107] (byte~) mul8u::$1 ← (byte) mul8u::a#2 & (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuaa=vbuxx_band_vbuc1
txa
and #1
//SEG239 [108] if((byte~) mul8u::$1==(byte/signed byte/word/signed word/dword/signed dword) 0) goto mul8u::@3 -- vbuaa_eq_0_then_la1
cmp #0
beq b3
//SEG240 mul8u::@4
//SEG241 [109] (word) mul8u::res#1 ← (word) mul8u::res#2 + (word) mul8u::mb#2 -- vwuz1=vwuz1_plus_vwuz2
lda res
clc
adc mb
sta res
lda res+1
adc mb+1
sta res+1
//SEG242 [110] phi from mul8u::@2 mul8u::@4 to mul8u::@3 [phi:mul8u::@2/mul8u::@4->mul8u::@3]
//SEG243 [110] phi (word) mul8u::res#6 = (word) mul8u::res#2 [phi:mul8u::@2/mul8u::@4->mul8u::@3#0] -- register_copy
//SEG244 mul8u::@3
b3:
//SEG245 [111] (byte) mul8u::a#0 ← (byte) mul8u::a#2 >> (byte/signed byte/word/signed word/dword/signed dword) 1 -- vbuxx=vbuxx_ror_1
txa
lsr
tax
//SEG246 [112] (word) mul8u::mb#1 ← (word) mul8u::mb#2 << (byte/signed byte/word/signed word/dword/signed dword) 1 -- vwuz1=vwuz1_rol_1
asl mb
rol mb+1
//SEG247 [104] phi from mul8u::@3 to mul8u::@1 [phi:mul8u::@3->mul8u::@1]
//SEG248 [104] phi (word) mul8u::mb#2 = (word) mul8u::mb#1 [phi:mul8u::@3->mul8u::@1#0] -- register_copy
//SEG249 [104] phi (word) mul8u::res#2 = (word) mul8u::res#6 [phi:mul8u::@3->mul8u::@1#1] -- register_copy
//SEG250 [104] phi (byte) mul8u::a#2 = (byte) mul8u::a#0 [phi:mul8u::@3->mul8u::@1#2] -- register_copy
jmp b1
}
//SEG251 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
// keyboard_key_pressed(byte register(X) key)
keyboard_key_pressed: {
//SEG252 [114] (byte) keyboard_key_pressed::colidx#0 ← (byte) keyboard_key_pressed::key#6 & (byte/signed byte/word/signed word/dword/signed dword) 7 -- vbuyy=vbuxx_band_vbuc1
txa
and #7
tay
//SEG253 [115] (byte) keyboard_key_pressed::rowidx#0 ← (byte) keyboard_key_pressed::key#6 >> (byte/signed byte/word/signed word/dword/signed dword) 3 -- vbuaa=vbuxx_ror_3
txa
lsr
lsr
lsr
//SEG254 [116] (byte) keyboard_matrix_read::rowid#0 ← (byte) keyboard_key_pressed::rowidx#0 -- vbuxx=vbuaa
tax
//SEG255 [117] call keyboard_matrix_read
jsr keyboard_matrix_read
//SEG256 [118] (byte) keyboard_matrix_read::return#2 ← (byte) keyboard_matrix_read::return#0
//SEG257 keyboard_key_pressed::@1
//SEG258 [119] (byte~) keyboard_key_pressed::$2 ← (byte) keyboard_matrix_read::return#2
//SEG259 [120] (byte) keyboard_key_pressed::return#0 ← (byte~) keyboard_key_pressed::$2 & *((const byte[8]) keyboard_matrix_col_bitmask#0 + (byte) keyboard_key_pressed::colidx#0) -- vbuaa=vbuaa_band_pbuc1_derefidx_vbuyy
and keyboard_matrix_col_bitmask,y
//SEG260 keyboard_key_pressed::@return
//SEG261 [121] return
rts
}
//SEG262 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 kill the normal interrupt or sei/cli around calls to the keyboard matrix reader.
// keyboard_matrix_read(byte register(X) rowid)
keyboard_matrix_read: {
//SEG263 [122] *((const byte*) CIA1_PORT_A#0) ← *((const byte[8]) keyboard_matrix_row_bitmask#0 + (byte) keyboard_matrix_read::rowid#0) -- _deref_pbuc1=pbuc2_derefidx_vbuxx
lda keyboard_matrix_row_bitmask,x
sta CIA1_PORT_A
//SEG264 [123] (byte) keyboard_matrix_read::return#0 ← ~ *((const byte*) CIA1_PORT_B#0) -- vbuaa=_bnot__deref_pbuc1
lda CIA1_PORT_B
eor #$ff
//SEG265 keyboard_matrix_read::@return
//SEG266 [124] return
rts
}
//SEG267 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) .
// keyboard_get_keycode(byte register(X) ch)
keyboard_get_keycode: {
//SEG268 [125] (byte) keyboard_get_keycode::return#0 ← *((const byte[]) keyboard_char_keycodes#0 + (byte) keyboard_get_keycode::ch#0) -- vbuaa=pbuc1_derefidx_vbuxx
lda keyboard_char_keycodes,x
//SEG269 keyboard_get_keycode::@return
//SEG270 [126] return
rts
}
//SEG271 print_str_at
// Print a string at a specific screen position
// print_str_at(byte* zeropage(2) str, byte* zeropage(9) at)
print_str_at: {
.label at = 9
.label str = 2
//SEG272 [128] phi from print_str_at print_str_at::@2 to print_str_at::@1 [phi:print_str_at/print_str_at::@2->print_str_at::@1]
//SEG273 [128] phi (byte*) print_str_at::at#5 = (byte*) print_str_at::at#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#0] -- register_copy
//SEG274 [128] phi (byte*) print_str_at::str#5 = (byte*) print_str_at::str#7 [phi:print_str_at/print_str_at::@2->print_str_at::@1#1] -- register_copy
//SEG275 print_str_at::@1
b1:
//SEG276 [129] if(*((byte*) print_str_at::str#5)!=(byte) '@') goto print_str_at::@2 -- _deref_pbuz1_neq_vbuc1_then_la1
ldy #0
lda (str),y
cmp #'@'
bne b2
//SEG277 print_str_at::@return
//SEG278 [130] return
rts
//SEG279 print_str_at::@2
b2:
//SEG280 [131] *((byte*) print_str_at::at#5) ← *((byte*) print_str_at::str#5) -- _deref_pbuz1=_deref_pbuz2
ldy #0
lda (str),y
sta (at),y
//SEG281 [132] (byte*) print_str_at::at#4 ← ++ (byte*) print_str_at::at#5 -- pbuz1=_inc_pbuz1
inc at
bne !+
inc at+1
!:
//SEG282 [133] (byte*) print_str_at::str#4 ← ++ (byte*) print_str_at::str#5 -- pbuz1=_inc_pbuz1
inc str
bne !+
inc str+1
!:
jmp b1
}
// 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
// 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