mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-09-08 17:54:40 +00:00
3513 lines
162 KiB
Plaintext
3513 lines
162 KiB
Plaintext
Fixing pointer addition (word*~) bsearch16u::$7 ← (word*) bsearch16u::items + (byte~) bsearch16u::$6
|
|
Fixing pointer addition (word*~) bsearch16u::$15 ← (word*) bsearch16u::pivot + (number) 1
|
|
Fixing pointer addition (word*~) bsearch16u::$1 ← (word*) bsearch16u::items - (number) 1
|
|
Fixing pointer array-indexing *((word*) utoa::digit_values + (byte) utoa::digit)
|
|
Fixing pointer array-indexing *((dword*) ultoa::digit_values + (byte) ultoa::digit)
|
|
Warning! Adding boolean cast to non-boolean condition *((byte*) strcpy::src)
|
|
Warning! Adding boolean cast to non-boolean condition *((byte*) print_str_lines::str)
|
|
Warning! Adding boolean cast to non-boolean condition (byte) print_str_lines::ch
|
|
Warning! Adding boolean cast to non-boolean condition *((byte*) print_str::str)
|
|
Warning! Adding boolean cast to non-boolean condition *((byte*) print_str_at::str)
|
|
Warning! Adding boolean cast to non-boolean sub-expression (byte) print_str_lines::ch
|
|
Identified constant variable (byte*) HEAP_TOP
|
|
Identified constant variable (byte*) RASTER
|
|
Identified constant variable (byte*) BORDERCOL
|
|
Identified constant variable (byte*) SCREEN
|
|
Identified constant variable (word) main::a
|
|
Identified constant variable (word) main::b
|
|
Culled Empty Block (label) @1
|
|
Culled Empty Block (label) @2
|
|
Culled Empty Block (label) @3
|
|
Culled Empty Block (label) @4
|
|
Culled Empty Block (label) @5
|
|
Culled Empty Block (label) @6
|
|
Culled Empty Block (label) @7
|
|
Culled Empty Block (label) @8
|
|
Culled Empty Block (label) @9
|
|
Culled Empty Block (label) @10
|
|
Culled Empty Block (label) @11
|
|
Culled Empty Block (label) @13
|
|
Culled Empty Block (label) @14
|
|
Culled Empty Block (label) @15
|
|
Culled Empty Block (label) @16
|
|
Culled Empty Block (label) @17
|
|
Culled Empty Block (label) @18
|
|
Culled Empty Block (label) @19
|
|
Culled Empty Block (label) @20
|
|
Culled Empty Block (label) @21
|
|
Culled Empty Block (label) @22
|
|
Culled Empty Block (label) @23
|
|
Culled Empty Block (label) @24
|
|
Culled Empty Block (label) @25
|
|
Culled Empty Block (label) @26
|
|
Culled Empty Block (label) @27
|
|
Culled Empty Block (label) @28
|
|
Culled Empty Block (label) @30
|
|
Culled Empty Block (label) @31
|
|
Culled Empty Block (label) @32
|
|
Culled Empty Block (label) @33
|
|
Culled Empty Block (label) @34
|
|
Culled Empty Block (label) @35
|
|
Culled Empty Block (label) main::@2
|
|
Culled Empty Block (label) main::@11
|
|
Culled Empty Block (label) main::@3
|
|
Culled Empty Block (label) main::@12
|
|
Culled Empty Block (label) main::@5
|
|
Culled Empty Block (label) main::@7
|
|
Culled Empty Block (label) main::@8
|
|
Culled Empty Block (label) main::@9
|
|
Culled Empty Block (label) main::@10
|
|
Culled Empty Block (label) mulf_init::@5
|
|
Culled Empty Block (label) mulf_init::@6
|
|
Culled Empty Block (label) mulf_init::@8
|
|
Culled Empty Block (label) mulf_init::@13
|
|
Culled Empty Block (label) mulf_init::@14
|
|
Culled Empty Block (label) mulf_init::@16
|
|
Culled Empty Block (label) @38
|
|
Culled Empty Block (label) mulf16u::@1
|
|
|
|
CONTROL FLOW GRAPH SSA
|
|
@begin: scope:[] from
|
|
to:@12
|
|
@12: scope:[] from @begin
|
|
(byte*) print_screen#0 ← ((byte*)) (number) $400
|
|
(byte*) print_line_cursor#0 ← (byte*) print_screen#0
|
|
(byte*) print_char_cursor#0 ← (byte*) print_line_cursor#0
|
|
to:@29
|
|
print_word: scope:[print_word] from print_dword print_dword::@1
|
|
(byte*) print_char_cursor#34 ← phi( print_dword/(byte*) print_char_cursor#35 print_dword::@1/(byte*) print_char_cursor#4 )
|
|
(word) print_word::w#2 ← phi( print_dword/(word) print_word::w#0 print_dword::@1/(word) print_word::w#1 )
|
|
(byte~) print_word::$0 ← > (word) print_word::w#2
|
|
(byte) print_byte::b#0 ← (byte~) print_word::$0
|
|
call print_byte
|
|
to:print_word::@1
|
|
print_word::@1: scope:[print_word] from print_word
|
|
(word) print_word::w#3 ← phi( print_word/(word) print_word::w#2 )
|
|
(byte*) print_char_cursor#18 ← phi( print_word/(byte*) print_char_cursor#9 )
|
|
(byte*) print_char_cursor#1 ← (byte*) print_char_cursor#18
|
|
(byte~) print_word::$2 ← < (word) print_word::w#3
|
|
(byte) print_byte::b#1 ← (byte~) print_word::$2
|
|
call print_byte
|
|
to:print_word::@2
|
|
print_word::@2: scope:[print_word] from print_word::@1
|
|
(byte*) print_char_cursor#19 ← phi( print_word::@1/(byte*) print_char_cursor#9 )
|
|
(byte*) print_char_cursor#2 ← (byte*) print_char_cursor#19
|
|
to:print_word::@return
|
|
print_word::@return: scope:[print_word] from print_word::@2
|
|
(byte*) print_char_cursor#20 ← phi( print_word::@2/(byte*) print_char_cursor#2 )
|
|
(byte*) print_char_cursor#3 ← (byte*) print_char_cursor#20
|
|
return
|
|
to:@return
|
|
print_dword: scope:[print_dword] from main::@14
|
|
(byte*) print_char_cursor#35 ← phi( main::@14/(byte*) print_char_cursor#37 )
|
|
(dword) print_dword::dw#1 ← phi( main::@14/(dword) print_dword::dw#0 )
|
|
(word~) print_dword::$0 ← > (dword) print_dword::dw#1
|
|
(word) print_word::w#0 ← (word~) print_dword::$0
|
|
call print_word
|
|
to:print_dword::@1
|
|
print_dword::@1: scope:[print_dword] from print_dword
|
|
(dword) print_dword::dw#2 ← phi( print_dword/(dword) print_dword::dw#1 )
|
|
(byte*) print_char_cursor#21 ← phi( print_dword/(byte*) print_char_cursor#3 )
|
|
(byte*) print_char_cursor#4 ← (byte*) print_char_cursor#21
|
|
(word~) print_dword::$2 ← < (dword) print_dword::dw#2
|
|
(word) print_word::w#1 ← (word~) print_dword::$2
|
|
call print_word
|
|
to:print_dword::@2
|
|
print_dword::@2: scope:[print_dword] from print_dword::@1
|
|
(byte*) print_char_cursor#22 ← phi( print_dword::@1/(byte*) print_char_cursor#3 )
|
|
(byte*) print_char_cursor#5 ← (byte*) print_char_cursor#22
|
|
to:print_dword::@return
|
|
print_dword::@return: scope:[print_dword] from print_dword::@2
|
|
(byte*) print_char_cursor#23 ← phi( print_dword::@2/(byte*) print_char_cursor#5 )
|
|
(byte*) print_char_cursor#6 ← (byte*) print_char_cursor#23
|
|
return
|
|
to:@return
|
|
@29: scope:[] from @12
|
|
(byte*) print_line_cursor#19 ← phi( @12/(byte*) print_line_cursor#0 )
|
|
(byte*) print_screen#19 ← phi( @12/(byte*) print_screen#0 )
|
|
(byte*) print_char_cursor#46 ← phi( @12/(byte*) print_char_cursor#0 )
|
|
(byte[]) print_hextab#0 ← (const string) $0
|
|
to:@36
|
|
print_byte: scope:[print_byte] from print_word print_word::@1
|
|
(byte*) print_char_cursor#36 ← phi( print_word/(byte*) print_char_cursor#34 print_word::@1/(byte*) print_char_cursor#1 )
|
|
(byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 )
|
|
(byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (number) 4
|
|
(byte) print_char::ch#0 ← *((byte[]) print_hextab#0 + (byte~) print_byte::$0)
|
|
call print_char
|
|
to:print_byte::@1
|
|
print_byte::@1: scope:[print_byte] from print_byte
|
|
(byte) print_byte::b#3 ← phi( print_byte/(byte) print_byte::b#2 )
|
|
(byte*) print_char_cursor#24 ← phi( print_byte/(byte*) print_char_cursor#11 )
|
|
(byte*) print_char_cursor#7 ← (byte*) print_char_cursor#24
|
|
(number~) print_byte::$2 ← (byte) print_byte::b#3 & (number) $f
|
|
(byte) print_char::ch#1 ← *((byte[]) print_hextab#0 + (number~) print_byte::$2)
|
|
call print_char
|
|
to:print_byte::@2
|
|
print_byte::@2: scope:[print_byte] from print_byte::@1
|
|
(byte*) print_char_cursor#25 ← phi( print_byte::@1/(byte*) print_char_cursor#11 )
|
|
(byte*) print_char_cursor#8 ← (byte*) print_char_cursor#25
|
|
to:print_byte::@return
|
|
print_byte::@return: scope:[print_byte] from print_byte::@2
|
|
(byte*) print_char_cursor#26 ← phi( print_byte::@2/(byte*) print_char_cursor#8 )
|
|
(byte*) print_char_cursor#9 ← (byte*) print_char_cursor#26
|
|
return
|
|
to:@return
|
|
print_char: scope:[print_char] from print_byte print_byte::@1
|
|
(byte*) print_char_cursor#27 ← phi( print_byte/(byte*) print_char_cursor#36 print_byte::@1/(byte*) print_char_cursor#7 )
|
|
(byte) print_char::ch#2 ← phi( print_byte/(byte) print_char::ch#0 print_byte::@1/(byte) print_char::ch#1 )
|
|
*((byte*) print_char_cursor#27) ← (byte) print_char::ch#2
|
|
(byte*) print_char_cursor#10 ← ++ (byte*) print_char_cursor#27
|
|
to:print_char::@return
|
|
print_char::@return: scope:[print_char] from print_char
|
|
(byte*) print_char_cursor#28 ← phi( print_char/(byte*) print_char_cursor#10 )
|
|
(byte*) print_char_cursor#11 ← (byte*) print_char_cursor#28
|
|
return
|
|
to:@return
|
|
print_set_screen: scope:[print_set_screen] from main::@15
|
|
(byte*) print_set_screen::screen#1 ← phi( main::@15/(byte*) print_set_screen::screen#0 )
|
|
(byte*) print_screen#1 ← (byte*) print_set_screen::screen#1
|
|
(byte*) print_line_cursor#1 ← (byte*) print_screen#1
|
|
(byte*) print_char_cursor#12 ← (byte*) print_line_cursor#1
|
|
to:print_set_screen::@return
|
|
print_set_screen::@return: scope:[print_set_screen] from print_set_screen
|
|
(byte*) print_char_cursor#29 ← phi( print_set_screen/(byte*) print_char_cursor#12 )
|
|
(byte*) print_line_cursor#6 ← phi( print_set_screen/(byte*) print_line_cursor#1 )
|
|
(byte*) print_screen#6 ← phi( print_set_screen/(byte*) print_screen#1 )
|
|
(byte*) print_screen#2 ← (byte*) print_screen#6
|
|
(byte*) print_line_cursor#2 ← (byte*) print_line_cursor#6
|
|
(byte*) print_char_cursor#13 ← (byte*) print_char_cursor#29
|
|
return
|
|
to:@return
|
|
@36: scope:[] from @29
|
|
(byte*) print_line_cursor#18 ← phi( @29/(byte*) print_line_cursor#19 )
|
|
(byte*) print_screen#18 ← phi( @29/(byte*) print_screen#19 )
|
|
(byte*) print_char_cursor#45 ← phi( @29/(byte*) print_char_cursor#46 )
|
|
(byte*) RASTER#0 ← ((byte*)) (number) $d012
|
|
(byte*) BORDERCOL#0 ← ((byte*)) (number) $d020
|
|
(byte*) SCREEN#0 ← ((byte*)) (number) $400
|
|
to:@37
|
|
main: scope:[main] from @39
|
|
(byte*) print_line_cursor#16 ← phi( @39/(byte*) print_line_cursor#12 )
|
|
(byte*) print_screen#16 ← phi( @39/(byte*) print_screen#12 )
|
|
(byte*) print_char_cursor#43 ← phi( @39/(byte*) print_char_cursor#39 )
|
|
call mulf_init
|
|
to:main::@13
|
|
main::@13: scope:[main] from main
|
|
(byte*) print_line_cursor#13 ← phi( main/(byte*) print_line_cursor#16 )
|
|
(byte*) print_screen#13 ← phi( main/(byte*) print_screen#16 )
|
|
(byte*) print_char_cursor#40 ← phi( main/(byte*) print_char_cursor#43 )
|
|
(word) main::a#0 ← (number) $4d2
|
|
(word) main::b#0 ← (number) $929
|
|
asm { sei }
|
|
to:main::@1
|
|
main::@1: scope:[main] from main::@13 main::@16
|
|
(byte*) print_line_cursor#11 ← phi( main::@13/(byte*) print_line_cursor#13 main::@16/(byte*) print_line_cursor#3 )
|
|
(byte*) print_screen#11 ← phi( main::@13/(byte*) print_screen#13 main::@16/(byte*) print_screen#3 )
|
|
(byte*) print_char_cursor#38 ← phi( main::@13/(byte*) print_char_cursor#40 main::@16/(byte*) print_char_cursor#15 )
|
|
if(true) goto main::@4
|
|
to:main::@return
|
|
main::@4: scope:[main] from main::@1 main::@4
|
|
(byte*) print_line_cursor#20 ← phi( main::@1/(byte*) print_line_cursor#11 main::@4/(byte*) print_line_cursor#20 )
|
|
(byte*) print_screen#20 ← phi( main::@1/(byte*) print_screen#11 main::@4/(byte*) print_screen#20 )
|
|
(byte*) print_char_cursor#44 ← phi( main::@1/(byte*) print_char_cursor#38 main::@4/(byte*) print_char_cursor#44 )
|
|
(bool~) main::$1 ← *((byte*) RASTER#0) != (number) $ff
|
|
if((bool~) main::$1) goto main::@4
|
|
to:main::@6
|
|
main::@6: scope:[main] from main::@4
|
|
(byte*) print_line_cursor#17 ← phi( main::@4/(byte*) print_line_cursor#20 )
|
|
(byte*) print_screen#17 ← phi( main::@4/(byte*) print_screen#20 )
|
|
(byte*) print_char_cursor#41 ← phi( main::@4/(byte*) print_char_cursor#44 )
|
|
*((byte*) BORDERCOL#0) ← ++ *((byte*) BORDERCOL#0)
|
|
(word) mulf16u::a#0 ← (word) main::a#0
|
|
(word) mulf16u::b#0 ← (word) main::b#0
|
|
call mulf16u
|
|
(dword) mulf16u::return#0 ← (dword) mulf16u::return#2
|
|
to:main::@14
|
|
main::@14: scope:[main] from main::@6
|
|
(byte*) print_line_cursor#14 ← phi( main::@6/(byte*) print_line_cursor#17 )
|
|
(byte*) print_screen#14 ← phi( main::@6/(byte*) print_screen#17 )
|
|
(byte*) print_char_cursor#37 ← phi( main::@6/(byte*) print_char_cursor#41 )
|
|
(dword) mulf16u::return#3 ← phi( main::@6/(dword) mulf16u::return#0 )
|
|
(dword~) main::$3 ← (dword) mulf16u::return#3
|
|
(dword) main::r#0 ← (dword~) main::$3
|
|
*((byte*) BORDERCOL#0) ← -- *((byte*) BORDERCOL#0)
|
|
(dword) print_dword::dw#0 ← (dword) main::r#0
|
|
call print_dword
|
|
to:main::@15
|
|
main::@15: scope:[main] from main::@14
|
|
(byte*) print_line_cursor#10 ← phi( main::@14/(byte*) print_line_cursor#14 )
|
|
(byte*) print_screen#10 ← phi( main::@14/(byte*) print_screen#14 )
|
|
(byte*) print_char_cursor#30 ← phi( main::@14/(byte*) print_char_cursor#6 )
|
|
(byte*) print_char_cursor#14 ← (byte*) print_char_cursor#30
|
|
(byte*) print_set_screen::screen#0 ← (byte*) SCREEN#0
|
|
call print_set_screen
|
|
to:main::@16
|
|
main::@16: scope:[main] from main::@15
|
|
(byte*) print_char_cursor#31 ← phi( main::@15/(byte*) print_char_cursor#13 )
|
|
(byte*) print_line_cursor#7 ← phi( main::@15/(byte*) print_line_cursor#2 )
|
|
(byte*) print_screen#7 ← phi( main::@15/(byte*) print_screen#2 )
|
|
(byte*) print_screen#3 ← (byte*) print_screen#7
|
|
(byte*) print_line_cursor#3 ← (byte*) print_line_cursor#7
|
|
(byte*) print_char_cursor#15 ← (byte*) print_char_cursor#31
|
|
to:main::@1
|
|
main::@return: scope:[main] from main::@1
|
|
(byte*) print_line_cursor#8 ← phi( main::@1/(byte*) print_line_cursor#11 )
|
|
(byte*) print_screen#8 ← phi( main::@1/(byte*) print_screen#11 )
|
|
(byte*) print_char_cursor#32 ← phi( main::@1/(byte*) print_char_cursor#38 )
|
|
(byte*) print_char_cursor#16 ← (byte*) print_char_cursor#32
|
|
(byte*) print_screen#4 ← (byte*) print_screen#8
|
|
(byte*) print_line_cursor#4 ← (byte*) print_line_cursor#8
|
|
return
|
|
to:@return
|
|
@37: scope:[] from @36
|
|
(byte*) print_line_cursor#15 ← phi( @36/(byte*) print_line_cursor#18 )
|
|
(byte*) print_screen#15 ← phi( @36/(byte*) print_screen#18 )
|
|
(byte*) print_char_cursor#42 ← phi( @36/(byte*) print_char_cursor#45 )
|
|
(byte[$200]) mulf_sqr1_lo#0 ← { fill( $200, 0) }
|
|
(byte[$200]) mulf_sqr1_hi#0 ← { fill( $200, 0) }
|
|
(byte[$200]) mulf_sqr2_lo#0 ← { fill( $200, 0) }
|
|
(byte[$200]) mulf_sqr2_hi#0 ← { fill( $200, 0) }
|
|
to:@39
|
|
mulf_init: scope:[mulf_init] from main
|
|
(word) mulf_init::sqr#0 ← (number) 0
|
|
(byte) mulf_init::x_2#0 ← (number) 0
|
|
(byte) mulf_init::c#0 ← (number) 0
|
|
(byte*~) mulf_init::$0 ← (byte[$200]) mulf_sqr1_hi#0 + (number) 1
|
|
(byte*) mulf_init::sqr1_hi#0 ← (byte*~) mulf_init::$0
|
|
(byte*~) mulf_init::$6 ← (byte[$200]) mulf_sqr1_lo#0 + (number) 1
|
|
(byte*) mulf_init::sqr1_lo#0 ← (byte*~) mulf_init::$6
|
|
to:mulf_init::@1
|
|
mulf_init::@1: scope:[mulf_init] from mulf_init mulf_init::@4
|
|
(byte) mulf_init::x_2#5 ← phi( mulf_init/(byte) mulf_init::x_2#0 mulf_init::@4/(byte) mulf_init::x_2#2 )
|
|
(byte*) mulf_init::sqr1_hi#5 ← phi( mulf_init/(byte*) mulf_init::sqr1_hi#0 mulf_init::@4/(byte*) mulf_init::sqr1_hi#1 )
|
|
(word) mulf_init::sqr#6 ← phi( mulf_init/(word) mulf_init::sqr#0 mulf_init::@4/(word) mulf_init::sqr#1 )
|
|
(byte) mulf_init::c#3 ← phi( mulf_init/(byte) mulf_init::c#0 mulf_init::@4/(byte) mulf_init::c#4 )
|
|
(byte*) mulf_init::sqr1_lo#2 ← phi( mulf_init/(byte*) mulf_init::sqr1_lo#0 mulf_init::@4/(byte*) mulf_init::sqr1_lo#1 )
|
|
(byte*~) mulf_init::$7 ← (byte[$200]) mulf_sqr1_lo#0 + (number) $200
|
|
(bool~) mulf_init::$8 ← (byte*) mulf_init::sqr1_lo#2 != (byte*~) mulf_init::$7
|
|
if((bool~) mulf_init::$8) goto mulf_init::@2
|
|
to:mulf_init::@3
|
|
mulf_init::@2: scope:[mulf_init] from mulf_init::@1
|
|
(byte) mulf_init::x_2#4 ← phi( mulf_init::@1/(byte) mulf_init::x_2#5 )
|
|
(byte*) mulf_init::sqr1_hi#3 ← phi( mulf_init::@1/(byte*) mulf_init::sqr1_hi#5 )
|
|
(byte*) mulf_init::sqr1_lo#4 ← phi( mulf_init::@1/(byte*) mulf_init::sqr1_lo#2 )
|
|
(word) mulf_init::sqr#5 ← phi( mulf_init::@1/(word) mulf_init::sqr#6 )
|
|
(byte) mulf_init::c#2 ← phi( mulf_init::@1/(byte) mulf_init::c#3 )
|
|
(byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2
|
|
(number~) mulf_init::$9 ← (byte) mulf_init::c#1 & (number) 1
|
|
(bool~) mulf_init::$10 ← (number~) mulf_init::$9 == (number) 0
|
|
(bool~) mulf_init::$11 ← ! (bool~) mulf_init::$10
|
|
if((bool~) mulf_init::$11) goto mulf_init::@4
|
|
to:mulf_init::@7
|
|
mulf_init::@3: scope:[mulf_init] from mulf_init::@1
|
|
(byte~) mulf_init::$1 ← ((byte)) (number) -1
|
|
(byte) mulf_init::x_255#0 ← (byte~) mulf_init::$1
|
|
(byte) mulf_init::dir#0 ← (number) $ff
|
|
(byte*) mulf_init::sqr2_hi#0 ← (byte[$200]) mulf_sqr2_hi#0
|
|
(byte*) mulf_init::sqr2_lo#0 ← (byte[$200]) mulf_sqr2_lo#0
|
|
to:mulf_init::@9
|
|
mulf_init::@4: scope:[mulf_init] from mulf_init::@2 mulf_init::@7
|
|
(byte) mulf_init::c#4 ← phi( mulf_init::@2/(byte) mulf_init::c#1 mulf_init::@7/(byte) mulf_init::c#5 )
|
|
(byte) mulf_init::x_2#2 ← phi( mulf_init::@2/(byte) mulf_init::x_2#4 mulf_init::@7/(byte) mulf_init::x_2#1 )
|
|
(byte*) mulf_init::sqr1_hi#2 ← phi( mulf_init::@2/(byte*) mulf_init::sqr1_hi#3 mulf_init::@7/(byte*) mulf_init::sqr1_hi#4 )
|
|
(byte*) mulf_init::sqr1_lo#3 ← phi( mulf_init::@2/(byte*) mulf_init::sqr1_lo#4 mulf_init::@7/(byte*) mulf_init::sqr1_lo#5 )
|
|
(word) mulf_init::sqr#3 ← phi( mulf_init::@2/(word) mulf_init::sqr#5 mulf_init::@7/(word) mulf_init::sqr#2 )
|
|
(byte~) mulf_init::$12 ← < (word) mulf_init::sqr#3
|
|
*((byte*) mulf_init::sqr1_lo#3) ← (byte~) mulf_init::$12
|
|
(byte~) mulf_init::$13 ← > (word) mulf_init::sqr#3
|
|
*((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$13
|
|
(byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2
|
|
(word~) mulf_init::$14 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2
|
|
(word) mulf_init::sqr#1 ← (word~) mulf_init::$14
|
|
(byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#3
|
|
to:mulf_init::@1
|
|
mulf_init::@7: scope:[mulf_init] from mulf_init::@2
|
|
(byte) mulf_init::c#5 ← phi( mulf_init::@2/(byte) mulf_init::c#1 )
|
|
(byte*) mulf_init::sqr1_hi#4 ← phi( mulf_init::@2/(byte*) mulf_init::sqr1_hi#3 )
|
|
(byte*) mulf_init::sqr1_lo#5 ← phi( mulf_init::@2/(byte*) mulf_init::sqr1_lo#4 )
|
|
(word) mulf_init::sqr#4 ← phi( mulf_init::@2/(word) mulf_init::sqr#5 )
|
|
(byte) mulf_init::x_2#3 ← phi( mulf_init::@2/(byte) mulf_init::x_2#4 )
|
|
(byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3
|
|
(word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4
|
|
to:mulf_init::@4
|
|
mulf_init::@9: scope:[mulf_init] from mulf_init::@12 mulf_init::@3
|
|
(byte) mulf_init::dir#3 ← phi( mulf_init::@12/(byte) mulf_init::dir#4 mulf_init::@3/(byte) mulf_init::dir#0 )
|
|
(byte*) mulf_init::sqr2_hi#3 ← phi( mulf_init::@12/(byte*) mulf_init::sqr2_hi#4 mulf_init::@3/(byte*) mulf_init::sqr2_hi#0 )
|
|
(byte) mulf_init::x_255#3 ← phi( mulf_init::@12/(byte) mulf_init::x_255#4 mulf_init::@3/(byte) mulf_init::x_255#0 )
|
|
(byte*) mulf_init::sqr2_lo#2 ← phi( mulf_init::@12/(byte*) mulf_init::sqr2_lo#1 mulf_init::@3/(byte*) mulf_init::sqr2_lo#0 )
|
|
(byte*~) mulf_init::$15 ← (byte[$200]) mulf_sqr2_lo#0 + (number) $1ff
|
|
(bool~) mulf_init::$16 ← (byte*) mulf_init::sqr2_lo#2 != (byte*~) mulf_init::$15
|
|
if((bool~) mulf_init::$16) goto mulf_init::@10
|
|
to:mulf_init::@11
|
|
mulf_init::@10: scope:[mulf_init] from mulf_init::@9
|
|
(byte) mulf_init::dir#2 ← phi( mulf_init::@9/(byte) mulf_init::dir#3 )
|
|
(byte*) mulf_init::sqr2_hi#2 ← phi( mulf_init::@9/(byte*) mulf_init::sqr2_hi#3 )
|
|
(byte*) mulf_init::sqr2_lo#3 ← phi( mulf_init::@9/(byte*) mulf_init::sqr2_lo#2 )
|
|
(byte) mulf_init::x_255#2 ← phi( mulf_init::@9/(byte) mulf_init::x_255#3 )
|
|
*((byte*) mulf_init::sqr2_lo#3) ← *((byte[$200]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2)
|
|
*((byte*) mulf_init::sqr2_hi#2) ← *((byte[$200]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2)
|
|
(byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2
|
|
(byte~) mulf_init::$17 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2
|
|
(byte) mulf_init::x_255#1 ← (byte~) mulf_init::$17
|
|
(bool~) mulf_init::$18 ← (byte) mulf_init::x_255#1 == (number) 0
|
|
(bool~) mulf_init::$19 ← ! (bool~) mulf_init::$18
|
|
if((bool~) mulf_init::$19) goto mulf_init::@12
|
|
to:mulf_init::@15
|
|
mulf_init::@11: scope:[mulf_init] from mulf_init::@9
|
|
(byte*~) mulf_init::$2 ← (byte[$200]) mulf_sqr2_lo#0 + (number) $1ff
|
|
(byte*~) mulf_init::$3 ← (byte[$200]) mulf_sqr1_lo#0 + (number) $100
|
|
*((byte*~) mulf_init::$2) ← *((byte*~) mulf_init::$3)
|
|
(byte*~) mulf_init::$4 ← (byte[$200]) mulf_sqr2_hi#0 + (number) $1ff
|
|
(byte*~) mulf_init::$5 ← (byte[$200]) mulf_sqr1_hi#0 + (number) $100
|
|
*((byte*~) mulf_init::$4) ← *((byte*~) mulf_init::$5)
|
|
to:mulf_init::@return
|
|
mulf_init::@12: scope:[mulf_init] from mulf_init::@10 mulf_init::@15
|
|
(byte) mulf_init::dir#4 ← phi( mulf_init::@10/(byte) mulf_init::dir#2 mulf_init::@15/(byte) mulf_init::dir#1 )
|
|
(byte*) mulf_init::sqr2_hi#4 ← phi( mulf_init::@10/(byte*) mulf_init::sqr2_hi#1 mulf_init::@15/(byte*) mulf_init::sqr2_hi#5 )
|
|
(byte) mulf_init::x_255#4 ← phi( mulf_init::@10/(byte) mulf_init::x_255#1 mulf_init::@15/(byte) mulf_init::x_255#5 )
|
|
(byte*) mulf_init::sqr2_lo#4 ← phi( mulf_init::@10/(byte*) mulf_init::sqr2_lo#3 mulf_init::@15/(byte*) mulf_init::sqr2_lo#5 )
|
|
(byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#4
|
|
to:mulf_init::@9
|
|
mulf_init::@15: scope:[mulf_init] from mulf_init::@10
|
|
(byte*) mulf_init::sqr2_hi#5 ← phi( mulf_init::@10/(byte*) mulf_init::sqr2_hi#1 )
|
|
(byte) mulf_init::x_255#5 ← phi( mulf_init::@10/(byte) mulf_init::x_255#1 )
|
|
(byte*) mulf_init::sqr2_lo#5 ← phi( mulf_init::@10/(byte*) mulf_init::sqr2_lo#3 )
|
|
(byte) mulf_init::dir#1 ← (number) 1
|
|
to:mulf_init::@12
|
|
mulf_init::@return: scope:[mulf_init] from mulf_init::@11
|
|
return
|
|
to:@return
|
|
mulf16u: scope:[mulf16u] from main::@6
|
|
(word) mulf16u::b#1 ← phi( main::@6/(word) mulf16u::b#0 )
|
|
(word) mulf16u::a#1 ← phi( main::@6/(word) mulf16u::a#0 )
|
|
(word*) mulf16u::memA#0 ← ((word*)) (number) $f8
|
|
(word*) mulf16u::memB#0 ← ((word*)) (number) $fa
|
|
(dword*) mulf16u::memR#0 ← ((dword*)) (number) $fc
|
|
*((word*) mulf16u::memA#0) ← (word) mulf16u::a#1
|
|
*((word*) mulf16u::memB#0) ← (word) mulf16u::b#1
|
|
asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: }
|
|
(dword) mulf16u::return#1 ← *((dword*) mulf16u::memR#0)
|
|
to:mulf16u::@return
|
|
mulf16u::@return: scope:[mulf16u] from mulf16u
|
|
(dword) mulf16u::return#4 ← phi( mulf16u/(dword) mulf16u::return#1 )
|
|
(dword) mulf16u::return#2 ← (dword) mulf16u::return#4
|
|
return
|
|
to:@return
|
|
@39: scope:[] from @37
|
|
(byte*) print_line_cursor#12 ← phi( @37/(byte*) print_line_cursor#15 )
|
|
(byte*) print_screen#12 ← phi( @37/(byte*) print_screen#15 )
|
|
(byte*) print_char_cursor#39 ← phi( @37/(byte*) print_char_cursor#42 )
|
|
call main
|
|
to:@40
|
|
@40: scope:[] from @39
|
|
(byte*) print_line_cursor#9 ← phi( @39/(byte*) print_line_cursor#4 )
|
|
(byte*) print_screen#9 ← phi( @39/(byte*) print_screen#4 )
|
|
(byte*) print_char_cursor#33 ← phi( @39/(byte*) print_char_cursor#16 )
|
|
(byte*) print_char_cursor#17 ← (byte*) print_char_cursor#33
|
|
(byte*) print_screen#5 ← (byte*) print_screen#9
|
|
(byte*) print_line_cursor#5 ← (byte*) print_line_cursor#9
|
|
to:@end
|
|
@end: scope:[] from @40
|
|
|
|
SYMBOL TABLE SSA
|
|
(const string) $0 = (string) "0123456789abcdef"z
|
|
(label) @12
|
|
(label) @29
|
|
(label) @36
|
|
(label) @37
|
|
(label) @39
|
|
(label) @40
|
|
(label) @begin
|
|
(label) @end
|
|
(byte*) BORDERCOL
|
|
(byte*) BORDERCOL#0
|
|
(const byte) RADIX::BINARY = (number) 2
|
|
(const byte) RADIX::DECIMAL = (number) $a
|
|
(const byte) RADIX::HEXADECIMAL = (number) $10
|
|
(const byte) RADIX::OCTAL = (number) 8
|
|
(byte*) RASTER
|
|
(byte*) RASTER#0
|
|
(byte*) SCREEN
|
|
(byte*) SCREEN#0
|
|
(void()) main()
|
|
(bool~) main::$1
|
|
(dword~) main::$3
|
|
(label) main::@1
|
|
(label) main::@13
|
|
(label) main::@14
|
|
(label) main::@15
|
|
(label) main::@16
|
|
(label) main::@4
|
|
(label) main::@6
|
|
(label) main::@return
|
|
(word) main::a
|
|
(word) main::a#0
|
|
(word) main::b
|
|
(word) main::b#0
|
|
(dword) main::r
|
|
(dword) main::r#0
|
|
(dword()) mulf16u((word) mulf16u::a , (word) mulf16u::b)
|
|
(label) mulf16u::@return
|
|
(word) mulf16u::a
|
|
(word) mulf16u::a#0
|
|
(word) mulf16u::a#1
|
|
(word) mulf16u::b
|
|
(word) mulf16u::b#0
|
|
(word) mulf16u::b#1
|
|
(word*) mulf16u::memA
|
|
(word*) mulf16u::memA#0
|
|
(word*) mulf16u::memB
|
|
(word*) mulf16u::memB#0
|
|
(dword*) mulf16u::memR
|
|
(dword*) mulf16u::memR#0
|
|
(dword) mulf16u::return
|
|
(dword) mulf16u::return#0
|
|
(dword) mulf16u::return#1
|
|
(dword) mulf16u::return#2
|
|
(dword) mulf16u::return#3
|
|
(dword) mulf16u::return#4
|
|
(void()) mulf_init()
|
|
(byte*~) mulf_init::$0
|
|
(byte~) mulf_init::$1
|
|
(bool~) mulf_init::$10
|
|
(bool~) mulf_init::$11
|
|
(byte~) mulf_init::$12
|
|
(byte~) mulf_init::$13
|
|
(word~) mulf_init::$14
|
|
(byte*~) mulf_init::$15
|
|
(bool~) mulf_init::$16
|
|
(byte~) mulf_init::$17
|
|
(bool~) mulf_init::$18
|
|
(bool~) mulf_init::$19
|
|
(byte*~) mulf_init::$2
|
|
(byte*~) mulf_init::$3
|
|
(byte*~) mulf_init::$4
|
|
(byte*~) mulf_init::$5
|
|
(byte*~) mulf_init::$6
|
|
(byte*~) mulf_init::$7
|
|
(bool~) mulf_init::$8
|
|
(number~) mulf_init::$9
|
|
(label) mulf_init::@1
|
|
(label) mulf_init::@10
|
|
(label) mulf_init::@11
|
|
(label) mulf_init::@12
|
|
(label) mulf_init::@15
|
|
(label) mulf_init::@2
|
|
(label) mulf_init::@3
|
|
(label) mulf_init::@4
|
|
(label) mulf_init::@7
|
|
(label) mulf_init::@9
|
|
(label) mulf_init::@return
|
|
(byte) mulf_init::c
|
|
(byte) mulf_init::c#0
|
|
(byte) mulf_init::c#1
|
|
(byte) mulf_init::c#2
|
|
(byte) mulf_init::c#3
|
|
(byte) mulf_init::c#4
|
|
(byte) mulf_init::c#5
|
|
(byte) mulf_init::dir
|
|
(byte) mulf_init::dir#0
|
|
(byte) mulf_init::dir#1
|
|
(byte) mulf_init::dir#2
|
|
(byte) mulf_init::dir#3
|
|
(byte) mulf_init::dir#4
|
|
(word) mulf_init::sqr
|
|
(word) mulf_init::sqr#0
|
|
(word) mulf_init::sqr#1
|
|
(word) mulf_init::sqr#2
|
|
(word) mulf_init::sqr#3
|
|
(word) mulf_init::sqr#4
|
|
(word) mulf_init::sqr#5
|
|
(word) mulf_init::sqr#6
|
|
(byte*) mulf_init::sqr1_hi
|
|
(byte*) mulf_init::sqr1_hi#0
|
|
(byte*) mulf_init::sqr1_hi#1
|
|
(byte*) mulf_init::sqr1_hi#2
|
|
(byte*) mulf_init::sqr1_hi#3
|
|
(byte*) mulf_init::sqr1_hi#4
|
|
(byte*) mulf_init::sqr1_hi#5
|
|
(byte*) mulf_init::sqr1_lo
|
|
(byte*) mulf_init::sqr1_lo#0
|
|
(byte*) mulf_init::sqr1_lo#1
|
|
(byte*) mulf_init::sqr1_lo#2
|
|
(byte*) mulf_init::sqr1_lo#3
|
|
(byte*) mulf_init::sqr1_lo#4
|
|
(byte*) mulf_init::sqr1_lo#5
|
|
(byte*) mulf_init::sqr2_hi
|
|
(byte*) mulf_init::sqr2_hi#0
|
|
(byte*) mulf_init::sqr2_hi#1
|
|
(byte*) mulf_init::sqr2_hi#2
|
|
(byte*) mulf_init::sqr2_hi#3
|
|
(byte*) mulf_init::sqr2_hi#4
|
|
(byte*) mulf_init::sqr2_hi#5
|
|
(byte*) mulf_init::sqr2_lo
|
|
(byte*) mulf_init::sqr2_lo#0
|
|
(byte*) mulf_init::sqr2_lo#1
|
|
(byte*) mulf_init::sqr2_lo#2
|
|
(byte*) mulf_init::sqr2_lo#3
|
|
(byte*) mulf_init::sqr2_lo#4
|
|
(byte*) mulf_init::sqr2_lo#5
|
|
(byte) mulf_init::x_2
|
|
(byte) mulf_init::x_2#0
|
|
(byte) mulf_init::x_2#1
|
|
(byte) mulf_init::x_2#2
|
|
(byte) mulf_init::x_2#3
|
|
(byte) mulf_init::x_2#4
|
|
(byte) mulf_init::x_2#5
|
|
(byte) mulf_init::x_255
|
|
(byte) mulf_init::x_255#0
|
|
(byte) mulf_init::x_255#1
|
|
(byte) mulf_init::x_255#2
|
|
(byte) mulf_init::x_255#3
|
|
(byte) mulf_init::x_255#4
|
|
(byte) mulf_init::x_255#5
|
|
(byte[$200]) mulf_sqr1_hi
|
|
(byte[$200]) mulf_sqr1_hi#0
|
|
(byte[$200]) mulf_sqr1_lo
|
|
(byte[$200]) mulf_sqr1_lo#0
|
|
(byte[$200]) mulf_sqr2_hi
|
|
(byte[$200]) mulf_sqr2_hi#0
|
|
(byte[$200]) mulf_sqr2_lo
|
|
(byte[$200]) mulf_sqr2_lo#0
|
|
(void()) print_byte((byte) print_byte::b)
|
|
(byte~) print_byte::$0
|
|
(number~) print_byte::$2
|
|
(label) print_byte::@1
|
|
(label) print_byte::@2
|
|
(label) print_byte::@return
|
|
(byte) print_byte::b
|
|
(byte) print_byte::b#0
|
|
(byte) print_byte::b#1
|
|
(byte) print_byte::b#2
|
|
(byte) print_byte::b#3
|
|
(void()) print_char((byte) print_char::ch)
|
|
(label) print_char::@return
|
|
(byte) print_char::ch
|
|
(byte) print_char::ch#0
|
|
(byte) print_char::ch#1
|
|
(byte) print_char::ch#2
|
|
(byte*) print_char_cursor
|
|
(byte*) print_char_cursor#0
|
|
(byte*) print_char_cursor#1
|
|
(byte*) print_char_cursor#10
|
|
(byte*) print_char_cursor#11
|
|
(byte*) print_char_cursor#12
|
|
(byte*) print_char_cursor#13
|
|
(byte*) print_char_cursor#14
|
|
(byte*) print_char_cursor#15
|
|
(byte*) print_char_cursor#16
|
|
(byte*) print_char_cursor#17
|
|
(byte*) print_char_cursor#18
|
|
(byte*) print_char_cursor#19
|
|
(byte*) print_char_cursor#2
|
|
(byte*) print_char_cursor#20
|
|
(byte*) print_char_cursor#21
|
|
(byte*) print_char_cursor#22
|
|
(byte*) print_char_cursor#23
|
|
(byte*) print_char_cursor#24
|
|
(byte*) print_char_cursor#25
|
|
(byte*) print_char_cursor#26
|
|
(byte*) print_char_cursor#27
|
|
(byte*) print_char_cursor#28
|
|
(byte*) print_char_cursor#29
|
|
(byte*) print_char_cursor#3
|
|
(byte*) print_char_cursor#30
|
|
(byte*) print_char_cursor#31
|
|
(byte*) print_char_cursor#32
|
|
(byte*) print_char_cursor#33
|
|
(byte*) print_char_cursor#34
|
|
(byte*) print_char_cursor#35
|
|
(byte*) print_char_cursor#36
|
|
(byte*) print_char_cursor#37
|
|
(byte*) print_char_cursor#38
|
|
(byte*) print_char_cursor#39
|
|
(byte*) print_char_cursor#4
|
|
(byte*) print_char_cursor#40
|
|
(byte*) print_char_cursor#41
|
|
(byte*) print_char_cursor#42
|
|
(byte*) print_char_cursor#43
|
|
(byte*) print_char_cursor#44
|
|
(byte*) print_char_cursor#45
|
|
(byte*) print_char_cursor#46
|
|
(byte*) print_char_cursor#5
|
|
(byte*) print_char_cursor#6
|
|
(byte*) print_char_cursor#7
|
|
(byte*) print_char_cursor#8
|
|
(byte*) print_char_cursor#9
|
|
(void()) print_dword((dword) print_dword::dw)
|
|
(word~) print_dword::$0
|
|
(word~) print_dword::$2
|
|
(label) print_dword::@1
|
|
(label) print_dword::@2
|
|
(label) print_dword::@return
|
|
(dword) print_dword::dw
|
|
(dword) print_dword::dw#0
|
|
(dword) print_dword::dw#1
|
|
(dword) print_dword::dw#2
|
|
(byte[]) print_hextab
|
|
(byte[]) print_hextab#0
|
|
(byte*) print_line_cursor
|
|
(byte*) print_line_cursor#0
|
|
(byte*) print_line_cursor#1
|
|
(byte*) print_line_cursor#10
|
|
(byte*) print_line_cursor#11
|
|
(byte*) print_line_cursor#12
|
|
(byte*) print_line_cursor#13
|
|
(byte*) print_line_cursor#14
|
|
(byte*) print_line_cursor#15
|
|
(byte*) print_line_cursor#16
|
|
(byte*) print_line_cursor#17
|
|
(byte*) print_line_cursor#18
|
|
(byte*) print_line_cursor#19
|
|
(byte*) print_line_cursor#2
|
|
(byte*) print_line_cursor#20
|
|
(byte*) print_line_cursor#3
|
|
(byte*) print_line_cursor#4
|
|
(byte*) print_line_cursor#5
|
|
(byte*) print_line_cursor#6
|
|
(byte*) print_line_cursor#7
|
|
(byte*) print_line_cursor#8
|
|
(byte*) print_line_cursor#9
|
|
(byte*) print_screen
|
|
(byte*) print_screen#0
|
|
(byte*) print_screen#1
|
|
(byte*) print_screen#10
|
|
(byte*) print_screen#11
|
|
(byte*) print_screen#12
|
|
(byte*) print_screen#13
|
|
(byte*) print_screen#14
|
|
(byte*) print_screen#15
|
|
(byte*) print_screen#16
|
|
(byte*) print_screen#17
|
|
(byte*) print_screen#18
|
|
(byte*) print_screen#19
|
|
(byte*) print_screen#2
|
|
(byte*) print_screen#20
|
|
(byte*) print_screen#3
|
|
(byte*) print_screen#4
|
|
(byte*) print_screen#5
|
|
(byte*) print_screen#6
|
|
(byte*) print_screen#7
|
|
(byte*) print_screen#8
|
|
(byte*) print_screen#9
|
|
(void()) print_set_screen((byte*) print_set_screen::screen)
|
|
(label) print_set_screen::@return
|
|
(byte*) print_set_screen::screen
|
|
(byte*) print_set_screen::screen#0
|
|
(byte*) print_set_screen::screen#1
|
|
(void()) print_word((word) print_word::w)
|
|
(byte~) print_word::$0
|
|
(byte~) print_word::$2
|
|
(label) print_word::@1
|
|
(label) print_word::@2
|
|
(label) print_word::@return
|
|
(word) print_word::w
|
|
(word) print_word::w#0
|
|
(word) print_word::w#1
|
|
(word) print_word::w#2
|
|
(word) print_word::w#3
|
|
|
|
Adding number conversion cast (unumber) 4 in (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (number) 4
|
|
Adding number conversion cast (unumber) $f in (number~) print_byte::$2 ← (byte) print_byte::b#3 & (number) $f
|
|
Adding number conversion cast (unumber) print_byte::$2 in (number~) print_byte::$2 ← (byte) print_byte::b#3 & (unumber)(number) $f
|
|
Adding number conversion cast (unumber) $4d2 in (word) main::a#0 ← (number) $4d2
|
|
Adding number conversion cast (unumber) $929 in (word) main::b#0 ← (number) $929
|
|
Adding number conversion cast (unumber) $ff in (bool~) main::$1 ← *((byte*) RASTER#0) != (number) $ff
|
|
Adding number conversion cast (unumber) 0 in (word) mulf_init::sqr#0 ← (number) 0
|
|
Adding number conversion cast (unumber) 0 in (byte) mulf_init::x_2#0 ← (number) 0
|
|
Adding number conversion cast (unumber) 0 in (byte) mulf_init::c#0 ← (number) 0
|
|
Adding number conversion cast (unumber) 1 in (byte*~) mulf_init::$0 ← (byte[$200]) mulf_sqr1_hi#0 + (number) 1
|
|
Adding number conversion cast (unumber) 1 in (byte*~) mulf_init::$6 ← (byte[$200]) mulf_sqr1_lo#0 + (number) 1
|
|
Adding number conversion cast (unumber) $200 in (byte*~) mulf_init::$7 ← (byte[$200]) mulf_sqr1_lo#0 + (number) $200
|
|
Adding number conversion cast (unumber) 1 in (number~) mulf_init::$9 ← (byte) mulf_init::c#1 & (number) 1
|
|
Adding number conversion cast (unumber) mulf_init::$9 in (number~) mulf_init::$9 ← (byte) mulf_init::c#1 & (unumber)(number) 1
|
|
Adding number conversion cast (unumber) 0 in (bool~) mulf_init::$10 ← (unumber~) mulf_init::$9 == (number) 0
|
|
Adding number conversion cast (unumber) $ff in (byte) mulf_init::dir#0 ← (number) $ff
|
|
Adding number conversion cast (unumber) $1ff in (byte*~) mulf_init::$15 ← (byte[$200]) mulf_sqr2_lo#0 + (number) $1ff
|
|
Adding number conversion cast (unumber) 0 in (bool~) mulf_init::$18 ← (byte) mulf_init::x_255#1 == (number) 0
|
|
Adding number conversion cast (unumber) $1ff in (byte*~) mulf_init::$2 ← (byte[$200]) mulf_sqr2_lo#0 + (number) $1ff
|
|
Adding number conversion cast (unumber) $100 in (byte*~) mulf_init::$3 ← (byte[$200]) mulf_sqr1_lo#0 + (number) $100
|
|
Adding number conversion cast (unumber) $1ff in (byte*~) mulf_init::$4 ← (byte[$200]) mulf_sqr2_hi#0 + (number) $1ff
|
|
Adding number conversion cast (unumber) $100 in (byte*~) mulf_init::$5 ← (byte[$200]) mulf_sqr1_hi#0 + (number) $100
|
|
Adding number conversion cast (unumber) 1 in (byte) mulf_init::dir#1 ← (number) 1
|
|
Successful SSA optimization PassNAddNumberTypeConversions
|
|
Inlining cast (byte*) print_screen#0 ← (byte*)(number) $400
|
|
Inlining cast (byte*) RASTER#0 ← (byte*)(number) $d012
|
|
Inlining cast (byte*) BORDERCOL#0 ← (byte*)(number) $d020
|
|
Inlining cast (byte*) SCREEN#0 ← (byte*)(number) $400
|
|
Inlining cast (word) main::a#0 ← (unumber)(number) $4d2
|
|
Inlining cast (word) main::b#0 ← (unumber)(number) $929
|
|
Inlining cast (word) mulf_init::sqr#0 ← (unumber)(number) 0
|
|
Inlining cast (byte) mulf_init::x_2#0 ← (unumber)(number) 0
|
|
Inlining cast (byte) mulf_init::c#0 ← (unumber)(number) 0
|
|
Inlining cast (byte~) mulf_init::$1 ← (byte)(number) -1
|
|
Inlining cast (byte) mulf_init::dir#0 ← (unumber)(number) $ff
|
|
Inlining cast (byte) mulf_init::dir#1 ← (unumber)(number) 1
|
|
Inlining cast (word*) mulf16u::memA#0 ← (word*)(number) $f8
|
|
Inlining cast (word*) mulf16u::memB#0 ← (word*)(number) $fa
|
|
Inlining cast (dword*) mulf16u::memR#0 ← (dword*)(number) $fc
|
|
Successful SSA optimization Pass2InlineCast
|
|
Simplifying constant pointer cast (byte*) 1024
|
|
Simplifying constant integer cast 4
|
|
Simplifying constant integer cast $f
|
|
Simplifying constant pointer cast (byte*) 53266
|
|
Simplifying constant pointer cast (byte*) 53280
|
|
Simplifying constant pointer cast (byte*) 1024
|
|
Simplifying constant integer cast $4d2
|
|
Simplifying constant integer cast $929
|
|
Simplifying constant integer cast $ff
|
|
Simplifying constant integer cast 0
|
|
Simplifying constant integer cast 0
|
|
Simplifying constant integer cast 0
|
|
Simplifying constant integer cast 1
|
|
Simplifying constant integer cast 1
|
|
Simplifying constant integer cast $200
|
|
Simplifying constant integer cast 1
|
|
Simplifying constant integer cast 0
|
|
Simplifying constant integer cast -1
|
|
Simplifying constant integer cast $ff
|
|
Simplifying constant integer cast $1ff
|
|
Simplifying constant integer cast 0
|
|
Simplifying constant integer cast $1ff
|
|
Simplifying constant integer cast $100
|
|
Simplifying constant integer cast $1ff
|
|
Simplifying constant integer cast $100
|
|
Simplifying constant integer cast 1
|
|
Simplifying constant pointer cast (word*) 248
|
|
Simplifying constant pointer cast (word*) 250
|
|
Simplifying constant pointer cast (dword*) 252
|
|
Successful SSA optimization PassNCastSimplification
|
|
Finalized unsigned number type (byte) 4
|
|
Finalized unsigned number type (byte) $f
|
|
Finalized unsigned number type (word) $4d2
|
|
Finalized unsigned number type (word) $929
|
|
Finalized unsigned number type (byte) $ff
|
|
Finalized unsigned number type (byte) 0
|
|
Finalized unsigned number type (byte) 0
|
|
Finalized unsigned number type (byte) 0
|
|
Finalized unsigned number type (byte) 1
|
|
Finalized unsigned number type (byte) 1
|
|
Finalized unsigned number type (word) $200
|
|
Finalized unsigned number type (byte) 1
|
|
Finalized unsigned number type (byte) 0
|
|
Finalized unsigned number type (byte) $ff
|
|
Finalized unsigned number type (word) $1ff
|
|
Finalized unsigned number type (byte) 0
|
|
Finalized unsigned number type (word) $1ff
|
|
Finalized unsigned number type (word) $100
|
|
Finalized unsigned number type (word) $1ff
|
|
Finalized unsigned number type (word) $100
|
|
Finalized unsigned number type (byte) 1
|
|
Successful SSA optimization PassNFinalizeNumberTypeConversions
|
|
Inferred type updated to byte in (unumber~) print_byte::$2 ← (byte) print_byte::b#3 & (byte) $f
|
|
Inferred type updated to byte in (unumber~) mulf_init::$9 ← (byte) mulf_init::c#1 & (byte) 1
|
|
Inversing boolean not [122] (bool~) mulf_init::$11 ← (byte~) mulf_init::$9 != (byte) 0 from [121] (bool~) mulf_init::$10 ← (byte~) mulf_init::$9 == (byte) 0
|
|
Inversing boolean not [152] (bool~) mulf_init::$19 ← (byte) mulf_init::x_255#1 != (byte) 0 from [151] (bool~) mulf_init::$18 ← (byte) mulf_init::x_255#1 == (byte) 0
|
|
Successful SSA optimization Pass2UnaryNotSimplification
|
|
Alias (byte*) print_char_cursor#0 = (byte*) print_line_cursor#0 (byte*) print_screen#0 (byte*) print_char_cursor#46 (byte*) print_screen#19 (byte*) print_line_cursor#19 (byte*) print_char_cursor#45 (byte*) print_screen#18 (byte*) print_line_cursor#18 (byte*) print_char_cursor#42 (byte*) print_screen#15 (byte*) print_line_cursor#15 (byte*) print_char_cursor#39 (byte*) print_screen#12 (byte*) print_line_cursor#12
|
|
Alias (byte) print_byte::b#0 = (byte~) print_word::$0
|
|
Alias (word) print_word::w#2 = (word) print_word::w#3
|
|
Alias (byte*) print_char_cursor#1 = (byte*) print_char_cursor#18
|
|
Alias (byte) print_byte::b#1 = (byte~) print_word::$2
|
|
Alias (byte*) print_char_cursor#19 = (byte*) print_char_cursor#2 (byte*) print_char_cursor#20 (byte*) print_char_cursor#3
|
|
Alias (word) print_word::w#0 = (word~) print_dword::$0
|
|
Alias (dword) print_dword::dw#1 = (dword) print_dword::dw#2
|
|
Alias (byte*) print_char_cursor#21 = (byte*) print_char_cursor#4
|
|
Alias (word) print_word::w#1 = (word~) print_dword::$2
|
|
Alias (byte*) print_char_cursor#22 = (byte*) print_char_cursor#5 (byte*) print_char_cursor#23 (byte*) print_char_cursor#6
|
|
Alias (byte) print_byte::b#2 = (byte) print_byte::b#3
|
|
Alias (byte*) print_char_cursor#24 = (byte*) print_char_cursor#7
|
|
Alias (byte*) print_char_cursor#25 = (byte*) print_char_cursor#8 (byte*) print_char_cursor#26 (byte*) print_char_cursor#9
|
|
Alias (byte*) print_char_cursor#10 = (byte*) print_char_cursor#28 (byte*) print_char_cursor#11
|
|
Alias (byte*) print_screen#1 = (byte*) print_line_cursor#1 (byte*) print_char_cursor#12 (byte*) print_screen#6 (byte*) print_line_cursor#6 (byte*) print_char_cursor#29 (byte*) print_screen#2 (byte*) print_line_cursor#2 (byte*) print_char_cursor#13
|
|
Alias (byte*) print_char_cursor#40 = (byte*) print_char_cursor#43
|
|
Alias (byte*) print_screen#13 = (byte*) print_screen#16
|
|
Alias (byte*) print_line_cursor#13 = (byte*) print_line_cursor#16
|
|
Alias (byte*) print_char_cursor#37 = (byte*) print_char_cursor#41 (byte*) print_char_cursor#44
|
|
Alias (byte*) print_screen#10 = (byte*) print_screen#17 (byte*) print_screen#20 (byte*) print_screen#14
|
|
Alias (byte*) print_line_cursor#10 = (byte*) print_line_cursor#17 (byte*) print_line_cursor#20 (byte*) print_line_cursor#14
|
|
Alias (dword) mulf16u::return#0 = (dword) mulf16u::return#3
|
|
Alias (dword) main::r#0 = (dword~) main::$3
|
|
Alias (byte*) print_char_cursor#14 = (byte*) print_char_cursor#30
|
|
Alias (byte*) print_screen#3 = (byte*) print_screen#7
|
|
Alias (byte*) print_line_cursor#3 = (byte*) print_line_cursor#7
|
|
Alias (byte*) print_char_cursor#15 = (byte*) print_char_cursor#31
|
|
Alias (byte*) print_char_cursor#16 = (byte*) print_char_cursor#32 (byte*) print_char_cursor#38
|
|
Alias (byte*) print_screen#11 = (byte*) print_screen#8 (byte*) print_screen#4
|
|
Alias (byte*) print_line_cursor#11 = (byte*) print_line_cursor#8 (byte*) print_line_cursor#4
|
|
Alias (byte*) mulf_init::sqr1_hi#0 = (byte*~) mulf_init::$0
|
|
Alias (byte*) mulf_init::sqr1_lo#0 = (byte*~) mulf_init::$6
|
|
Alias (byte) mulf_init::c#2 = (byte) mulf_init::c#3
|
|
Alias (word) mulf_init::sqr#4 = (word) mulf_init::sqr#5 (word) mulf_init::sqr#6
|
|
Alias (byte*) mulf_init::sqr1_lo#2 = (byte*) mulf_init::sqr1_lo#4 (byte*) mulf_init::sqr1_lo#5
|
|
Alias (byte*) mulf_init::sqr1_hi#3 = (byte*) mulf_init::sqr1_hi#5 (byte*) mulf_init::sqr1_hi#4
|
|
Alias (byte) mulf_init::x_2#3 = (byte) mulf_init::x_2#4 (byte) mulf_init::x_2#5
|
|
Alias (byte) mulf_init::x_255#0 = (byte~) mulf_init::$1
|
|
Alias (word) mulf_init::sqr#1 = (word~) mulf_init::$14
|
|
Alias (byte) mulf_init::c#1 = (byte) mulf_init::c#5
|
|
Alias (byte) mulf_init::x_255#2 = (byte) mulf_init::x_255#3
|
|
Alias (byte*) mulf_init::sqr2_lo#2 = (byte*) mulf_init::sqr2_lo#3 (byte*) mulf_init::sqr2_lo#5
|
|
Alias (byte*) mulf_init::sqr2_hi#2 = (byte*) mulf_init::sqr2_hi#3
|
|
Alias (byte) mulf_init::dir#2 = (byte) mulf_init::dir#3
|
|
Alias (byte) mulf_init::x_255#1 = (byte~) mulf_init::$17 (byte) mulf_init::x_255#5
|
|
Alias (byte*) mulf_init::sqr2_hi#1 = (byte*) mulf_init::sqr2_hi#5
|
|
Alias (dword) mulf16u::return#1 = (dword) mulf16u::return#4 (dword) mulf16u::return#2
|
|
Alias (byte*) print_char_cursor#17 = (byte*) print_char_cursor#33
|
|
Alias (byte*) print_screen#5 = (byte*) print_screen#9
|
|
Alias (byte*) print_line_cursor#5 = (byte*) print_line_cursor#9
|
|
Successful SSA optimization Pass2AliasElimination
|
|
Alias (byte*) mulf_init::sqr1_lo#2 = (byte*) mulf_init::sqr1_lo#3
|
|
Alias (byte*) mulf_init::sqr1_hi#2 = (byte*) mulf_init::sqr1_hi#3
|
|
Alias (byte) mulf_init::c#1 = (byte) mulf_init::c#4
|
|
Alias (byte*) mulf_init::sqr2_lo#2 = (byte*) mulf_init::sqr2_lo#4
|
|
Alias (byte) mulf_init::x_255#1 = (byte) mulf_init::x_255#4
|
|
Alias (byte*) mulf_init::sqr2_hi#1 = (byte*) mulf_init::sqr2_hi#4
|
|
Successful SSA optimization Pass2AliasElimination
|
|
Identical Phi Values (byte*) print_char_cursor#1 (byte*) print_char_cursor#25
|
|
Identical Phi Values (byte*) print_char_cursor#19 (byte*) print_char_cursor#25
|
|
Identical Phi Values (dword) print_dword::dw#1 (dword) print_dword::dw#0
|
|
Identical Phi Values (byte*) print_char_cursor#35 (byte*) print_char_cursor#37
|
|
Identical Phi Values (byte*) print_char_cursor#21 (byte*) print_char_cursor#19
|
|
Identical Phi Values (byte*) print_char_cursor#22 (byte*) print_char_cursor#19
|
|
Identical Phi Values (byte*) print_char_cursor#24 (byte*) print_char_cursor#10
|
|
Identical Phi Values (byte*) print_char_cursor#25 (byte*) print_char_cursor#10
|
|
Identical Phi Values (byte*) print_set_screen::screen#1 (byte*) print_set_screen::screen#0
|
|
Identical Phi Values (byte*) print_char_cursor#40 (byte*) print_char_cursor#0
|
|
Identical Phi Values (byte*) print_screen#13 (byte*) print_char_cursor#0
|
|
Identical Phi Values (byte*) print_line_cursor#13 (byte*) print_char_cursor#0
|
|
Identical Phi Values (byte*) print_char_cursor#37 (byte*) print_char_cursor#16
|
|
Identical Phi Values (byte*) print_screen#10 (byte*) print_screen#11
|
|
Identical Phi Values (byte*) print_line_cursor#10 (byte*) print_line_cursor#11
|
|
Identical Phi Values (byte*) print_char_cursor#14 (byte*) print_char_cursor#22
|
|
Identical Phi Values (byte*) print_screen#3 (byte*) print_screen#1
|
|
Identical Phi Values (byte*) print_line_cursor#3 (byte*) print_screen#1
|
|
Identical Phi Values (byte*) print_char_cursor#15 (byte*) print_screen#1
|
|
Identical Phi Values (word) mulf16u::a#1 (word) mulf16u::a#0
|
|
Identical Phi Values (word) mulf16u::b#1 (word) mulf16u::b#0
|
|
Identical Phi Values (byte*) print_char_cursor#17 (byte*) print_char_cursor#16
|
|
Identical Phi Values (byte*) print_screen#5 (byte*) print_screen#11
|
|
Identical Phi Values (byte*) print_line_cursor#5 (byte*) print_line_cursor#11
|
|
Successful SSA optimization Pass2IdenticalPhiElimination
|
|
Simple Condition (bool~) main::$1 [76] if(*((byte*) RASTER#0)!=(byte) $ff) goto main::@4
|
|
Simple Condition (bool~) mulf_init::$8 [117] if((byte*) mulf_init::sqr1_lo#2!=(byte*~) mulf_init::$7) goto mulf_init::@2
|
|
Simple Condition (bool~) mulf_init::$11 [123] if((byte~) mulf_init::$9!=(byte) 0) goto mulf_init::@4
|
|
Simple Condition (bool~) mulf_init::$16 [144] if((byte*) mulf_init::sqr2_lo#2!=(byte*~) mulf_init::$15) goto mulf_init::@10
|
|
Simple Condition (bool~) mulf_init::$19 [153] if((byte) mulf_init::x_255#1!=(byte) 0) goto mulf_init::@12
|
|
Successful SSA optimization Pass2ConditionalJumpSimplification
|
|
Constant right-side identified [103] (byte[$200]) mulf_sqr1_lo#0 ← { fill( $200, 0) }
|
|
Constant right-side identified [104] (byte[$200]) mulf_sqr1_hi#0 ← { fill( $200, 0) }
|
|
Constant right-side identified [105] (byte[$200]) mulf_sqr2_lo#0 ← { fill( $200, 0) }
|
|
Constant right-side identified [106] (byte[$200]) mulf_sqr2_hi#0 ← { fill( $200, 0) }
|
|
Successful SSA optimization Pass2ConstantRValueConsolidation
|
|
Constant (const byte*) print_char_cursor#0 = (byte*) 1024
|
|
Constant (const byte[]) print_hextab#0 = $0
|
|
Constant (const byte*) RASTER#0 = (byte*) 53266
|
|
Constant (const byte*) BORDERCOL#0 = (byte*) 53280
|
|
Constant (const byte*) SCREEN#0 = (byte*) 1024
|
|
Constant (const word) main::a#0 = $4d2
|
|
Constant (const word) main::b#0 = $929
|
|
Constant (const byte[$200]) mulf_sqr1_lo#0 = { fill( $200, 0) }
|
|
Constant (const byte[$200]) mulf_sqr1_hi#0 = { fill( $200, 0) }
|
|
Constant (const byte[$200]) mulf_sqr2_lo#0 = { fill( $200, 0) }
|
|
Constant (const byte[$200]) mulf_sqr2_hi#0 = { fill( $200, 0) }
|
|
Constant (const word) mulf_init::sqr#0 = 0
|
|
Constant (const byte) mulf_init::x_2#0 = 0
|
|
Constant (const byte) mulf_init::c#0 = 0
|
|
Constant (const byte) mulf_init::x_255#0 = -1
|
|
Constant (const byte) mulf_init::dir#0 = $ff
|
|
Constant (const byte) mulf_init::dir#1 = 1
|
|
Constant (const word*) mulf16u::memA#0 = (word*) 248
|
|
Constant (const word*) mulf16u::memB#0 = (word*) 250
|
|
Constant (const dword*) mulf16u::memR#0 = (dword*) 252
|
|
Successful SSA optimization Pass2ConstantIdentification
|
|
Constant (const word) mulf16u::a#0 = main::a#0
|
|
Constant (const word) mulf16u::b#0 = main::b#0
|
|
Constant (const byte*) print_set_screen::screen#0 = SCREEN#0
|
|
Constant (const byte*) mulf_init::sqr2_hi#0 = mulf_sqr2_hi#0
|
|
Constant (const byte*) mulf_init::sqr2_lo#0 = mulf_sqr2_lo#0
|
|
Successful SSA optimization Pass2ConstantIdentification
|
|
Constant (const byte*) print_screen#1 = print_set_screen::screen#0
|
|
Successful SSA optimization Pass2ConstantIdentification
|
|
if() condition always true - replacing block destination [73] if(true) goto main::@4
|
|
Successful SSA optimization Pass2ConstantIfs
|
|
Eliminating unused variable - keeping the phi block (byte*) print_screen#11
|
|
Eliminating unused variable - keeping the phi block (byte*) print_line_cursor#11
|
|
Successful SSA optimization PassNEliminateUnusedVars
|
|
Removing unused block main::@return
|
|
Successful SSA optimization Pass2EliminateUnusedBlocks
|
|
Constant right-side identified [36] (byte*) mulf_init::sqr1_hi#0 ← (const byte[$200]) mulf_sqr1_hi#0 + (byte) 1
|
|
Constant right-side identified [37] (byte*) mulf_init::sqr1_lo#0 ← (const byte[$200]) mulf_sqr1_lo#0 + (byte) 1
|
|
Constant right-side identified [39] (byte*~) mulf_init::$7 ← (const byte[$200]) mulf_sqr1_lo#0 + (word) $200
|
|
Constant right-side identified [55] (byte*~) mulf_init::$15 ← (const byte[$200]) mulf_sqr2_lo#0 + (word) $1ff
|
|
Constant right-side identified [62] (byte*~) mulf_init::$2 ← (const byte[$200]) mulf_sqr2_lo#0 + (word) $1ff
|
|
Constant right-side identified [63] (byte*~) mulf_init::$3 ← (const byte[$200]) mulf_sqr1_lo#0 + (word) $100
|
|
Constant right-side identified [65] (byte*~) mulf_init::$4 ← (const byte[$200]) mulf_sqr2_hi#0 + (word) $1ff
|
|
Constant right-side identified [66] (byte*~) mulf_init::$5 ← (const byte[$200]) mulf_sqr1_hi#0 + (word) $100
|
|
Successful SSA optimization Pass2ConstantRValueConsolidation
|
|
Constant (const byte*) mulf_init::sqr1_hi#0 = mulf_sqr1_hi#0+1
|
|
Constant (const byte*) mulf_init::sqr1_lo#0 = mulf_sqr1_lo#0+1
|
|
Constant (const byte*) mulf_init::$7 = mulf_sqr1_lo#0+$200
|
|
Constant (const byte*) mulf_init::$15 = mulf_sqr2_lo#0+$1ff
|
|
Constant (const byte*) mulf_init::$2 = mulf_sqr2_lo#0+$1ff
|
|
Constant (const byte*) mulf_init::$3 = mulf_sqr1_lo#0+$100
|
|
Constant (const byte*) mulf_init::$4 = mulf_sqr2_hi#0+$1ff
|
|
Constant (const byte*) mulf_init::$5 = mulf_sqr1_hi#0+$100
|
|
Successful SSA optimization Pass2ConstantIdentification
|
|
Inlining constant with var siblings (const word) mulf_init::sqr#0
|
|
Inlining constant with var siblings (const byte) mulf_init::x_2#0
|
|
Inlining constant with var siblings (const byte) mulf_init::c#0
|
|
Inlining constant with var siblings (const byte) mulf_init::x_255#0
|
|
Inlining constant with var siblings (const byte) mulf_init::dir#0
|
|
Inlining constant with var siblings (const byte) mulf_init::dir#1
|
|
Inlining constant with var siblings (const byte*) mulf_init::sqr2_hi#0
|
|
Inlining constant with var siblings (const byte*) mulf_init::sqr2_lo#0
|
|
Inlining constant with var siblings (const byte*) mulf_init::sqr1_hi#0
|
|
Inlining constant with var siblings (const byte*) mulf_init::sqr1_lo#0
|
|
Inlining constant with var siblings (const byte*) print_char_cursor#0
|
|
Constant inlined mulf_init::c#0 = (byte) 0
|
|
Constant inlined mulf_init::sqr2_lo#0 = (const byte[$200]) mulf_sqr2_lo#0
|
|
Constant inlined mulf_init::sqr#0 = (byte) 0
|
|
Constant inlined mulf16u::b#0 = (const word) main::b#0
|
|
Constant inlined mulf_init::sqr2_hi#0 = (const byte[$200]) mulf_sqr2_hi#0
|
|
Constant inlined mulf16u::a#0 = (const word) main::a#0
|
|
Constant inlined print_screen#1 = (const byte*) SCREEN#0
|
|
Constant inlined mulf_init::$2 = (const byte[$200]) mulf_sqr2_lo#0+(word) $1ff
|
|
Constant inlined $0 = (const byte[]) print_hextab#0
|
|
Constant inlined mulf_init::$4 = (const byte[$200]) mulf_sqr2_hi#0+(word) $1ff
|
|
Constant inlined mulf_init::$3 = (const byte[$200]) mulf_sqr1_lo#0+(word) $100
|
|
Constant inlined mulf_init::$5 = (const byte[$200]) mulf_sqr1_hi#0+(word) $100
|
|
Constant inlined mulf_init::$7 = (const byte[$200]) mulf_sqr1_lo#0+(word) $200
|
|
Constant inlined mulf_init::dir#1 = (byte) 1
|
|
Constant inlined print_char_cursor#0 = (byte*) 1024
|
|
Constant inlined mulf_init::dir#0 = (byte) $ff
|
|
Constant inlined mulf_init::sqr1_hi#0 = (const byte[$200]) mulf_sqr1_hi#0+(byte) 1
|
|
Constant inlined print_set_screen::screen#0 = (const byte*) SCREEN#0
|
|
Constant inlined mulf_init::sqr1_lo#0 = (const byte[$200]) mulf_sqr1_lo#0+(byte) 1
|
|
Constant inlined mulf_init::$15 = (const byte[$200]) mulf_sqr2_lo#0+(word) $1ff
|
|
Constant inlined mulf_init::x_255#0 = (byte) -1
|
|
Constant inlined mulf_init::x_2#0 = (byte) 0
|
|
Successful SSA optimization Pass2ConstantInlining
|
|
Added new block during phi lifting mulf_init::@17(between mulf_init::@2 and mulf_init::@4)
|
|
Added new block during phi lifting mulf_init::@18(between mulf_init::@10 and mulf_init::@12)
|
|
Adding NOP phi() at start of @begin
|
|
Adding NOP phi() at start of @12
|
|
Adding NOP phi() at start of @29
|
|
Adding NOP phi() at start of @36
|
|
Adding NOP phi() at start of @37
|
|
Adding NOP phi() at start of @39
|
|
Adding NOP phi() at start of @40
|
|
Adding NOP phi() at start of @end
|
|
Adding NOP phi() at start of main
|
|
Adding NOP phi() at start of main::@15
|
|
Adding NOP phi() at start of main::@16
|
|
Adding NOP phi() at start of print_set_screen
|
|
Adding NOP phi() at start of print_dword::@2
|
|
Adding NOP phi() at start of print_word::@2
|
|
Adding NOP phi() at start of print_byte::@2
|
|
Adding NOP phi() at start of mulf_init
|
|
Adding NOP phi() at start of mulf_init::@3
|
|
Adding NOP phi() at start of mulf_init::@15
|
|
CALL GRAPH
|
|
Calls in [] to main:6
|
|
Calls in [main] to mulf_init:10 mulf16u:15 print_dword:20 print_set_screen:22
|
|
Calls in [print_dword] to print_word:29 print_word:33
|
|
Calls in [print_word] to print_byte:40 print_byte:44
|
|
Calls in [print_byte] to print_char:52 print_char:57
|
|
|
|
Created 19 initial phi equivalence classes
|
|
Coalesced [27] print_word::w#4 ← print_word::w#0
|
|
Coalesced [28] print_char_cursor#47 ← print_char_cursor#16
|
|
Coalesced [31] print_word::w#5 ← print_word::w#1
|
|
Coalesced [32] print_char_cursor#48 ← print_char_cursor#10
|
|
Coalesced [38] print_byte::b#4 ← print_byte::b#0
|
|
Coalesced [39] print_char_cursor#49 ← print_char_cursor#34
|
|
Coalesced [42] print_byte::b#5 ← print_byte::b#1
|
|
Coalesced (already) [43] print_char_cursor#50 ← print_char_cursor#10
|
|
Coalesced [50] print_char::ch#3 ← print_char::ch#0
|
|
Coalesced [51] print_char_cursor#51 ← print_char_cursor#36
|
|
Coalesced [55] print_char::ch#4 ← print_char::ch#1
|
|
Coalesced (already) [56] print_char_cursor#52 ← print_char_cursor#10
|
|
Coalesced [86] mulf_init::sqr2_lo#6 ← mulf_init::sqr2_lo#1
|
|
Coalesced [87] mulf_init::x_255#6 ← mulf_init::x_255#1
|
|
Coalesced [88] mulf_init::sqr2_hi#6 ← mulf_init::sqr2_hi#1
|
|
Coalesced [89] mulf_init::dir#5 ← mulf_init::dir#4
|
|
Coalesced (already) [90] mulf_init::dir#6 ← mulf_init::dir#2
|
|
Coalesced [96] mulf_init::sqr#9 ← mulf_init::sqr#2
|
|
Coalesced [97] mulf_init::x_2#8 ← mulf_init::x_2#1
|
|
Coalesced [106] mulf_init::sqr1_lo#6 ← mulf_init::sqr1_lo#1
|
|
Coalesced [107] mulf_init::c#6 ← mulf_init::c#1
|
|
Coalesced [108] mulf_init::sqr#7 ← mulf_init::sqr#1
|
|
Coalesced [109] mulf_init::sqr1_hi#6 ← mulf_init::sqr1_hi#1
|
|
Coalesced [110] mulf_init::x_2#6 ← mulf_init::x_2#2
|
|
Coalesced [111] mulf_init::sqr#8 ← mulf_init::sqr#4
|
|
Coalesced (already) [112] mulf_init::x_2#7 ← mulf_init::x_2#3
|
|
Coalesced down to 13 phi equivalence classes
|
|
Culled Empty Block (label) @12
|
|
Culled Empty Block (label) @29
|
|
Culled Empty Block (label) @36
|
|
Culled Empty Block (label) @37
|
|
Culled Empty Block (label) @40
|
|
Culled Empty Block (label) main::@16
|
|
Culled Empty Block (label) print_dword::@2
|
|
Culled Empty Block (label) print_word::@2
|
|
Culled Empty Block (label) print_byte::@2
|
|
Culled Empty Block (label) mulf_init::@3
|
|
Culled Empty Block (label) mulf_init::@15
|
|
Culled Empty Block (label) mulf_init::@17
|
|
Renumbering block @39 to @1
|
|
Renumbering block main::@4 to main::@2
|
|
Renumbering block main::@6 to main::@3
|
|
Renumbering block main::@13 to main::@4
|
|
Renumbering block main::@14 to main::@5
|
|
Renumbering block main::@15 to main::@6
|
|
Renumbering block mulf_init::@4 to mulf_init::@3
|
|
Renumbering block mulf_init::@7 to mulf_init::@4
|
|
Renumbering block mulf_init::@9 to mulf_init::@5
|
|
Renumbering block mulf_init::@10 to mulf_init::@6
|
|
Renumbering block mulf_init::@11 to mulf_init::@7
|
|
Renumbering block mulf_init::@12 to mulf_init::@8
|
|
Renumbering block mulf_init::@18 to mulf_init::@9
|
|
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::@6
|
|
Adding NOP phi() at start of print_set_screen
|
|
Adding NOP phi() at start of mulf_init
|
|
Adding NOP phi() at start of mulf_init::@9
|
|
|
|
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()
|
|
[5] call mulf_init
|
|
to:main::@4
|
|
main::@4: scope:[main] from main
|
|
asm { sei }
|
|
to:main::@1
|
|
main::@1: scope:[main] from main::@4 main::@6
|
|
[7] (byte*) print_char_cursor#16 ← phi( main::@4/(byte*) 1024 main::@6/(const byte*) SCREEN#0 )
|
|
to:main::@2
|
|
main::@2: scope:[main] from main::@1 main::@2
|
|
[8] if(*((const byte*) RASTER#0)!=(byte) $ff) goto main::@2
|
|
to:main::@3
|
|
main::@3: scope:[main] from main::@2
|
|
[9] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0)
|
|
[10] call mulf16u
|
|
[11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1
|
|
to:main::@5
|
|
main::@5: scope:[main] from main::@3
|
|
[12] (dword) main::r#0 ← (dword) mulf16u::return#0
|
|
[13] *((const byte*) BORDERCOL#0) ← -- *((const byte*) BORDERCOL#0)
|
|
[14] (dword) print_dword::dw#0 ← (dword) main::r#0
|
|
[15] call print_dword
|
|
to:main::@6
|
|
main::@6: scope:[main] from main::@5
|
|
[16] phi()
|
|
[17] call print_set_screen
|
|
to:main::@1
|
|
print_set_screen: scope:[print_set_screen] from main::@6
|
|
[18] phi()
|
|
to:print_set_screen::@return
|
|
print_set_screen::@return: scope:[print_set_screen] from print_set_screen
|
|
[19] return
|
|
to:@return
|
|
print_dword: scope:[print_dword] from main::@5
|
|
[20] (word) print_word::w#0 ← > (dword) print_dword::dw#0
|
|
[21] call print_word
|
|
to:print_dword::@1
|
|
print_dword::@1: scope:[print_dword] from print_dword
|
|
[22] (word) print_word::w#1 ← < (dword) print_dword::dw#0
|
|
[23] call print_word
|
|
to:print_dword::@return
|
|
print_dword::@return: scope:[print_dword] from print_dword::@1
|
|
[24] return
|
|
to:@return
|
|
print_word: scope:[print_word] from print_dword print_dword::@1
|
|
[25] (byte*) print_char_cursor#34 ← phi( print_dword/(byte*) print_char_cursor#16 print_dword::@1/(byte*) print_char_cursor#10 )
|
|
[25] (word) print_word::w#2 ← phi( print_dword/(word) print_word::w#0 print_dword::@1/(word) print_word::w#1 )
|
|
[26] (byte) print_byte::b#0 ← > (word) print_word::w#2
|
|
[27] call print_byte
|
|
to:print_word::@1
|
|
print_word::@1: scope:[print_word] from print_word
|
|
[28] (byte) print_byte::b#1 ← < (word) print_word::w#2
|
|
[29] call print_byte
|
|
to:print_word::@return
|
|
print_word::@return: scope:[print_word] from print_word::@1
|
|
[30] return
|
|
to:@return
|
|
print_byte: scope:[print_byte] from print_word print_word::@1
|
|
[31] (byte*) print_char_cursor#36 ← phi( print_word/(byte*) print_char_cursor#34 print_word::@1/(byte*) print_char_cursor#10 )
|
|
[31] (byte) print_byte::b#2 ← phi( print_word/(byte) print_byte::b#0 print_word::@1/(byte) print_byte::b#1 )
|
|
[32] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte) 4
|
|
[33] (byte) print_char::ch#0 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$0)
|
|
[34] call print_char
|
|
to:print_byte::@1
|
|
print_byte::@1: scope:[print_byte] from print_byte
|
|
[35] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte) $f
|
|
[36] (byte) print_char::ch#1 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$2)
|
|
[37] call print_char
|
|
to:print_byte::@return
|
|
print_byte::@return: scope:[print_byte] from print_byte::@1
|
|
[38] return
|
|
to:@return
|
|
print_char: scope:[print_char] from print_byte print_byte::@1
|
|
[39] (byte*) print_char_cursor#27 ← phi( print_byte/(byte*) print_char_cursor#36 print_byte::@1/(byte*) print_char_cursor#10 )
|
|
[39] (byte) print_char::ch#2 ← phi( print_byte/(byte) print_char::ch#0 print_byte::@1/(byte) print_char::ch#1 )
|
|
[40] *((byte*) print_char_cursor#27) ← (byte) print_char::ch#2
|
|
[41] (byte*) print_char_cursor#10 ← ++ (byte*) print_char_cursor#27
|
|
to:print_char::@return
|
|
print_char::@return: scope:[print_char] from print_char
|
|
[42] return
|
|
to:@return
|
|
mulf16u: scope:[mulf16u] from main::@3
|
|
[43] *((const word*) mulf16u::memA#0) ← (const word) main::a#0
|
|
[44] *((const word*) mulf16u::memB#0) ← (const word) main::b#0
|
|
asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: }
|
|
[46] (dword) mulf16u::return#1 ← *((const dword*) mulf16u::memR#0)
|
|
to:mulf16u::@return
|
|
mulf16u::@return: scope:[mulf16u] from mulf16u
|
|
[47] return
|
|
to:@return
|
|
mulf_init: scope:[mulf_init] from main
|
|
[48] phi()
|
|
to:mulf_init::@1
|
|
mulf_init::@1: scope:[mulf_init] from mulf_init mulf_init::@3
|
|
[49] (byte) mulf_init::x_2#3 ← phi( mulf_init/(byte) 0 mulf_init::@3/(byte) mulf_init::x_2#2 )
|
|
[49] (byte*) mulf_init::sqr1_hi#2 ← phi( mulf_init/(const byte[$200]) mulf_sqr1_hi#0+(byte) 1 mulf_init::@3/(byte*) mulf_init::sqr1_hi#1 )
|
|
[49] (word) mulf_init::sqr#4 ← phi( mulf_init/(byte) 0 mulf_init::@3/(word) mulf_init::sqr#1 )
|
|
[49] (byte) mulf_init::c#2 ← phi( mulf_init/(byte) 0 mulf_init::@3/(byte) mulf_init::c#1 )
|
|
[49] (byte*) mulf_init::sqr1_lo#2 ← phi( mulf_init/(const byte[$200]) mulf_sqr1_lo#0+(byte) 1 mulf_init::@3/(byte*) mulf_init::sqr1_lo#1 )
|
|
[50] if((byte*) mulf_init::sqr1_lo#2!=(const byte[$200]) mulf_sqr1_lo#0+(word) $200) goto mulf_init::@2
|
|
to:mulf_init::@5
|
|
mulf_init::@5: scope:[mulf_init] from mulf_init::@1 mulf_init::@8
|
|
[51] (byte) mulf_init::dir#2 ← phi( mulf_init::@8/(byte) mulf_init::dir#4 mulf_init::@1/(byte) $ff )
|
|
[51] (byte*) mulf_init::sqr2_hi#2 ← phi( mulf_init::@8/(byte*) mulf_init::sqr2_hi#1 mulf_init::@1/(const byte[$200]) mulf_sqr2_hi#0 )
|
|
[51] (byte) mulf_init::x_255#2 ← phi( mulf_init::@8/(byte) mulf_init::x_255#1 mulf_init::@1/(byte) -1 )
|
|
[51] (byte*) mulf_init::sqr2_lo#2 ← phi( mulf_init::@8/(byte*) mulf_init::sqr2_lo#1 mulf_init::@1/(const byte[$200]) mulf_sqr2_lo#0 )
|
|
[52] if((byte*) mulf_init::sqr2_lo#2!=(const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) goto mulf_init::@6
|
|
to:mulf_init::@7
|
|
mulf_init::@7: scope:[mulf_init] from mulf_init::@5
|
|
[53] *((const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_lo#0+(word) $100)
|
|
[54] *((const byte[$200]) mulf_sqr2_hi#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_hi#0+(word) $100)
|
|
to:mulf_init::@return
|
|
mulf_init::@return: scope:[mulf_init] from mulf_init::@7
|
|
[55] return
|
|
to:@return
|
|
mulf_init::@6: scope:[mulf_init] from mulf_init::@5
|
|
[56] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[$200]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2)
|
|
[57] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[$200]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2)
|
|
[58] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2
|
|
[59] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2
|
|
[60] if((byte) mulf_init::x_255#1!=(byte) 0) goto mulf_init::@9
|
|
to:mulf_init::@8
|
|
mulf_init::@9: scope:[mulf_init] from mulf_init::@6
|
|
[61] phi()
|
|
to:mulf_init::@8
|
|
mulf_init::@8: scope:[mulf_init] from mulf_init::@6 mulf_init::@9
|
|
[62] (byte) mulf_init::dir#4 ← phi( mulf_init::@9/(byte) mulf_init::dir#2 mulf_init::@6/(byte) 1 )
|
|
[63] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2
|
|
to:mulf_init::@5
|
|
mulf_init::@2: scope:[mulf_init] from mulf_init::@1
|
|
[64] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2
|
|
[65] (byte~) mulf_init::$9 ← (byte) mulf_init::c#1 & (byte) 1
|
|
[66] if((byte~) mulf_init::$9!=(byte) 0) goto mulf_init::@3
|
|
to:mulf_init::@4
|
|
mulf_init::@4: scope:[mulf_init] from mulf_init::@2
|
|
[67] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3
|
|
[68] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4
|
|
to:mulf_init::@3
|
|
mulf_init::@3: scope:[mulf_init] from mulf_init::@2 mulf_init::@4
|
|
[69] (byte) mulf_init::x_2#2 ← phi( mulf_init::@2/(byte) mulf_init::x_2#3 mulf_init::@4/(byte) mulf_init::x_2#1 )
|
|
[69] (word) mulf_init::sqr#3 ← phi( mulf_init::@2/(word) mulf_init::sqr#4 mulf_init::@4/(word) mulf_init::sqr#2 )
|
|
[70] (byte~) mulf_init::$12 ← < (word) mulf_init::sqr#3
|
|
[71] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$12
|
|
[72] (byte~) mulf_init::$13 ← > (word) mulf_init::sqr#3
|
|
[73] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$13
|
|
[74] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2
|
|
[75] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2
|
|
[76] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2
|
|
to:mulf_init::@1
|
|
|
|
|
|
VARIABLE REGISTER WEIGHTS
|
|
(byte*) BORDERCOL
|
|
(byte*) RASTER
|
|
(byte*) SCREEN
|
|
(void()) main()
|
|
(word) main::a
|
|
(word) main::b
|
|
(dword) main::r
|
|
(dword) main::r#0 11.0
|
|
(dword()) mulf16u((word) mulf16u::a , (word) mulf16u::b)
|
|
(word) mulf16u::a
|
|
(word) mulf16u::b
|
|
(word*) mulf16u::memA
|
|
(word*) mulf16u::memB
|
|
(dword*) mulf16u::memR
|
|
(dword) mulf16u::return
|
|
(dword) mulf16u::return#0 22.0
|
|
(dword) mulf16u::return#1 4.333333333333333
|
|
(void()) mulf_init()
|
|
(byte~) mulf_init::$12 22.0
|
|
(byte~) mulf_init::$13 22.0
|
|
(byte~) mulf_init::$9 22.0
|
|
(byte) mulf_init::c
|
|
(byte) mulf_init::c#1 2.5384615384615383
|
|
(byte) mulf_init::c#2 11.0
|
|
(byte) mulf_init::dir
|
|
(byte) mulf_init::dir#2 4.125
|
|
(byte) mulf_init::dir#4 11.0
|
|
(word) mulf_init::sqr
|
|
(word) mulf_init::sqr#1 11.0
|
|
(word) mulf_init::sqr#2 22.0
|
|
(word) mulf_init::sqr#3 9.166666666666666
|
|
(word) mulf_init::sqr#4 5.5
|
|
(byte*) mulf_init::sqr1_hi
|
|
(byte*) mulf_init::sqr1_hi#1 7.333333333333333
|
|
(byte*) mulf_init::sqr1_hi#2 2.75
|
|
(byte*) mulf_init::sqr1_lo
|
|
(byte*) mulf_init::sqr1_lo#1 22.0
|
|
(byte*) mulf_init::sqr1_lo#2 3.142857142857143
|
|
(byte*) mulf_init::sqr2_hi
|
|
(byte*) mulf_init::sqr2_hi#1 3.6666666666666665
|
|
(byte*) mulf_init::sqr2_hi#2 8.25
|
|
(byte*) mulf_init::sqr2_lo
|
|
(byte*) mulf_init::sqr2_lo#1 22.0
|
|
(byte*) mulf_init::sqr2_lo#2 4.888888888888889
|
|
(byte) mulf_init::x_2
|
|
(byte) mulf_init::x_2#1 11.0
|
|
(byte) mulf_init::x_2#2 5.5
|
|
(byte) mulf_init::x_2#3 6.6000000000000005
|
|
(byte) mulf_init::x_255
|
|
(byte) mulf_init::x_255#1 6.6000000000000005
|
|
(byte) mulf_init::x_255#2 8.8
|
|
(byte[$200]) mulf_sqr1_hi
|
|
(byte[$200]) mulf_sqr1_lo
|
|
(byte[$200]) mulf_sqr2_hi
|
|
(byte[$200]) mulf_sqr2_lo
|
|
(void()) print_byte((byte) print_byte::b)
|
|
(byte~) print_byte::$0 4.0
|
|
(byte~) print_byte::$2 4.0
|
|
(byte) print_byte::b
|
|
(byte) print_byte::b#0 4.0
|
|
(byte) print_byte::b#1 4.0
|
|
(byte) print_byte::b#2 2.0
|
|
(void()) print_char((byte) print_char::ch)
|
|
(byte) print_char::ch
|
|
(byte) print_char::ch#0 4.0
|
|
(byte) print_char::ch#1 4.0
|
|
(byte) print_char::ch#2 6.0
|
|
(byte*) print_char_cursor
|
|
(byte*) print_char_cursor#10 0.6153846153846154
|
|
(byte*) print_char_cursor#16 0.2222222222222222
|
|
(byte*) print_char_cursor#27 4.0
|
|
(byte*) print_char_cursor#34 3.0
|
|
(byte*) print_char_cursor#36 2.0
|
|
(void()) print_dword((dword) print_dword::dw)
|
|
(dword) print_dword::dw
|
|
(dword) print_dword::dw#0 5.0
|
|
(byte[]) print_hextab
|
|
(byte*) print_line_cursor
|
|
(byte*) print_screen
|
|
(void()) print_set_screen((byte*) print_set_screen::screen)
|
|
(byte*) print_set_screen::screen
|
|
(void()) print_word((word) print_word::w)
|
|
(word) print_word::w
|
|
(word) print_word::w#0 4.0
|
|
(word) print_word::w#1 4.0
|
|
(word) print_word::w#2 2.6666666666666665
|
|
|
|
Initial phi equivalence classes
|
|
[ print_word::w#2 print_word::w#0 print_word::w#1 ]
|
|
[ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
|
|
[ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
|
|
[ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ]
|
|
[ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ]
|
|
[ mulf_init::c#2 mulf_init::c#1 ]
|
|
[ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
|
|
[ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
|
|
[ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
|
|
[ mulf_init::x_255#2 mulf_init::x_255#1 ]
|
|
[ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
|
|
[ mulf_init::dir#2 mulf_init::dir#4 ]
|
|
[ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
|
|
Added variable mulf16u::return#0 to zero page equivalence class [ mulf16u::return#0 ]
|
|
Added variable main::r#0 to zero page equivalence class [ main::r#0 ]
|
|
Added variable print_dword::dw#0 to zero page equivalence class [ print_dword::dw#0 ]
|
|
Added variable print_byte::$0 to zero page equivalence class [ print_byte::$0 ]
|
|
Added variable print_byte::$2 to zero page equivalence class [ print_byte::$2 ]
|
|
Added variable mulf16u::return#1 to zero page equivalence class [ mulf16u::return#1 ]
|
|
Added variable mulf_init::$9 to zero page equivalence class [ mulf_init::$9 ]
|
|
Added variable mulf_init::$12 to zero page equivalence class [ mulf_init::$12 ]
|
|
Added variable mulf_init::$13 to zero page equivalence class [ mulf_init::$13 ]
|
|
Complete equivalence classes
|
|
[ print_word::w#2 print_word::w#0 print_word::w#1 ]
|
|
[ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
|
|
[ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
|
|
[ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ]
|
|
[ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ]
|
|
[ mulf_init::c#2 mulf_init::c#1 ]
|
|
[ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
|
|
[ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
|
|
[ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
|
|
[ mulf_init::x_255#2 mulf_init::x_255#1 ]
|
|
[ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
|
|
[ mulf_init::dir#2 mulf_init::dir#4 ]
|
|
[ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
|
|
[ mulf16u::return#0 ]
|
|
[ main::r#0 ]
|
|
[ print_dword::dw#0 ]
|
|
[ print_byte::$0 ]
|
|
[ print_byte::$2 ]
|
|
[ mulf16u::return#1 ]
|
|
[ mulf_init::$9 ]
|
|
[ mulf_init::$12 ]
|
|
[ mulf_init::$13 ]
|
|
Allocated zp ZP_WORD:2 [ print_word::w#2 print_word::w#0 print_word::w#1 ]
|
|
Allocated zp ZP_BYTE:4 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
|
|
Allocated zp ZP_BYTE:5 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
|
|
Allocated zp ZP_WORD:6 [ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ]
|
|
Allocated zp ZP_WORD:8 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ]
|
|
Allocated zp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ]
|
|
Allocated zp ZP_WORD:11 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
|
|
Allocated zp ZP_BYTE:13 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
|
|
Allocated zp ZP_WORD:14 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
|
|
Allocated zp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ]
|
|
Allocated zp ZP_WORD:17 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
|
|
Allocated zp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ]
|
|
Allocated zp ZP_WORD:20 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
|
|
Allocated zp ZP_DWORD:22 [ mulf16u::return#0 ]
|
|
Allocated zp ZP_DWORD:26 [ main::r#0 ]
|
|
Allocated zp ZP_DWORD:30 [ print_dword::dw#0 ]
|
|
Allocated zp ZP_BYTE:34 [ print_byte::$0 ]
|
|
Allocated zp ZP_BYTE:35 [ print_byte::$2 ]
|
|
Allocated zp ZP_DWORD:36 [ mulf16u::return#1 ]
|
|
Allocated zp ZP_BYTE:40 [ mulf_init::$9 ]
|
|
Allocated zp ZP_BYTE:41 [ mulf_init::$12 ]
|
|
Allocated zp ZP_BYTE:42 [ mulf_init::$13 ]
|
|
|
|
INITIAL ASM
|
|
Target platform is c64basic / MOS6502X
|
|
// File Comments
|
|
// Upstart
|
|
.pc = $801 "Basic"
|
|
:BasicUpstart(bbegin)
|
|
.pc = $80d "Program"
|
|
// Global Constants & labels
|
|
.label RASTER = $d012
|
|
.label BORDERCOL = $d020
|
|
.label SCREEN = $400
|
|
.label print_char_cursor = 6
|
|
// @begin
|
|
bbegin:
|
|
// [1] phi from @begin to @1 [phi:@begin->@1]
|
|
b1_from_bbegin:
|
|
jmp b1
|
|
// @1
|
|
b1:
|
|
// [2] call main
|
|
// [4] phi from @1 to main [phi:@1->main]
|
|
main_from_b1:
|
|
jsr main
|
|
// [3] phi from @1 to @end [phi:@1->@end]
|
|
bend_from_b1:
|
|
jmp bend
|
|
// @end
|
|
bend:
|
|
// main
|
|
main: {
|
|
.label a = $4d2
|
|
.label b = $929
|
|
.label r = $1a
|
|
// [5] call mulf_init
|
|
// [48] phi from main to mulf_init [phi:main->mulf_init]
|
|
mulf_init_from_main:
|
|
jsr mulf_init
|
|
jmp b4
|
|
// main::@4
|
|
b4:
|
|
// asm { sei }
|
|
sei
|
|
// [7] phi from main::@4 to main::@1 [phi:main::@4->main::@1]
|
|
b1_from_b4:
|
|
// [7] phi (byte*) print_char_cursor#16 = (byte*) 1024 [phi:main::@4->main::@1#0] -- pbuz1=pbuc1
|
|
lda #<$400
|
|
sta.z print_char_cursor
|
|
lda #>$400
|
|
sta.z print_char_cursor+1
|
|
jmp b1
|
|
// main::@1
|
|
b1:
|
|
jmp b2
|
|
// main::@2
|
|
b2:
|
|
// [8] if(*((const byte*) RASTER#0)!=(byte) $ff) goto main::@2 -- _deref_pbuc1_neq_vbuc2_then_la1
|
|
lda #$ff
|
|
cmp RASTER
|
|
bne b2
|
|
jmp b3
|
|
// main::@3
|
|
b3:
|
|
// [9] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1
|
|
inc BORDERCOL
|
|
// [10] call mulf16u
|
|
jsr mulf16u
|
|
// [11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1 -- vduz1=vduz2
|
|
lda.z mulf16u.return_1
|
|
sta.z mulf16u.return
|
|
lda.z mulf16u.return_1+1
|
|
sta.z mulf16u.return+1
|
|
lda.z mulf16u.return_1+2
|
|
sta.z mulf16u.return+2
|
|
lda.z mulf16u.return_1+3
|
|
sta.z mulf16u.return+3
|
|
jmp b5
|
|
// main::@5
|
|
b5:
|
|
// [12] (dword) main::r#0 ← (dword) mulf16u::return#0 -- vduz1=vduz2
|
|
lda.z mulf16u.return
|
|
sta.z r
|
|
lda.z mulf16u.return+1
|
|
sta.z r+1
|
|
lda.z mulf16u.return+2
|
|
sta.z r+2
|
|
lda.z mulf16u.return+3
|
|
sta.z r+3
|
|
// [13] *((const byte*) BORDERCOL#0) ← -- *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_dec__deref_pbuc1
|
|
dec BORDERCOL
|
|
// [14] (dword) print_dword::dw#0 ← (dword) main::r#0 -- vduz1=vduz2
|
|
lda.z r
|
|
sta.z print_dword.dw
|
|
lda.z r+1
|
|
sta.z print_dword.dw+1
|
|
lda.z r+2
|
|
sta.z print_dword.dw+2
|
|
lda.z r+3
|
|
sta.z print_dword.dw+3
|
|
// [15] call print_dword
|
|
jsr print_dword
|
|
// [16] phi from main::@5 to main::@6 [phi:main::@5->main::@6]
|
|
b6_from_b5:
|
|
jmp b6
|
|
// main::@6
|
|
b6:
|
|
// [17] call print_set_screen
|
|
// [18] phi from main::@6 to print_set_screen [phi:main::@6->print_set_screen]
|
|
print_set_screen_from_b6:
|
|
jsr print_set_screen
|
|
// [7] phi from main::@6 to main::@1 [phi:main::@6->main::@1]
|
|
b1_from_b6:
|
|
// [7] phi (byte*) print_char_cursor#16 = (const byte*) SCREEN#0 [phi:main::@6->main::@1#0] -- pbuz1=pbuc1
|
|
lda #<SCREEN
|
|
sta.z print_char_cursor
|
|
lda #>SCREEN
|
|
sta.z print_char_cursor+1
|
|
jmp b1
|
|
}
|
|
// print_set_screen
|
|
// Set the screen to print on. Also resets current line/char cursor.
|
|
print_set_screen: {
|
|
jmp breturn
|
|
// print_set_screen::@return
|
|
breturn:
|
|
// [19] return
|
|
rts
|
|
}
|
|
// print_dword
|
|
// Print a dword as HEX
|
|
// print_dword(dword zeropage($1e) dw)
|
|
print_dword: {
|
|
.label dw = $1e
|
|
// [20] (word) print_word::w#0 ← > (dword) print_dword::dw#0 -- vwuz1=_hi_vduz2
|
|
lda.z dw+2
|
|
sta.z print_word.w
|
|
lda.z dw+3
|
|
sta.z print_word.w+1
|
|
// [21] call print_word
|
|
// [25] phi from print_dword to print_word [phi:print_dword->print_word]
|
|
print_word_from_print_dword:
|
|
// [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#16 [phi:print_dword->print_word#0] -- register_copy
|
|
// [25] phi (word) print_word::w#2 = (word) print_word::w#0 [phi:print_dword->print_word#1] -- register_copy
|
|
jsr print_word
|
|
jmp b1
|
|
// print_dword::@1
|
|
b1:
|
|
// [22] (word) print_word::w#1 ← < (dword) print_dword::dw#0 -- vwuz1=_lo_vduz2
|
|
lda.z dw
|
|
sta.z print_word.w
|
|
lda.z dw+1
|
|
sta.z print_word.w+1
|
|
// [23] call print_word
|
|
// [25] phi from print_dword::@1 to print_word [phi:print_dword::@1->print_word]
|
|
print_word_from_b1:
|
|
// [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#10 [phi:print_dword::@1->print_word#0] -- register_copy
|
|
// [25] phi (word) print_word::w#2 = (word) print_word::w#1 [phi:print_dword::@1->print_word#1] -- register_copy
|
|
jsr print_word
|
|
jmp breturn
|
|
// print_dword::@return
|
|
breturn:
|
|
// [24] return
|
|
rts
|
|
}
|
|
// print_word
|
|
// Print a word as HEX
|
|
// print_word(word zeropage(2) w)
|
|
print_word: {
|
|
.label w = 2
|
|
// [26] (byte) print_byte::b#0 ← > (word) print_word::w#2 -- vbuz1=_hi_vwuz2
|
|
lda.z w+1
|
|
sta.z print_byte.b
|
|
// [27] call print_byte
|
|
// [31] phi from print_word to print_byte [phi:print_word->print_byte]
|
|
print_byte_from_print_word:
|
|
// [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#34 [phi:print_word->print_byte#0] -- register_copy
|
|
// [31] phi (byte) print_byte::b#2 = (byte) print_byte::b#0 [phi:print_word->print_byte#1] -- register_copy
|
|
jsr print_byte
|
|
jmp b1
|
|
// print_word::@1
|
|
b1:
|
|
// [28] (byte) print_byte::b#1 ← < (word) print_word::w#2 -- vbuz1=_lo_vwuz2
|
|
lda.z w
|
|
sta.z print_byte.b
|
|
// [29] call print_byte
|
|
// [31] phi from print_word::@1 to print_byte [phi:print_word::@1->print_byte]
|
|
print_byte_from_b1:
|
|
// [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#10 [phi:print_word::@1->print_byte#0] -- register_copy
|
|
// [31] phi (byte) print_byte::b#2 = (byte) print_byte::b#1 [phi:print_word::@1->print_byte#1] -- register_copy
|
|
jsr print_byte
|
|
jmp breturn
|
|
// print_word::@return
|
|
breturn:
|
|
// [30] return
|
|
rts
|
|
}
|
|
// print_byte
|
|
// Print a byte as HEX
|
|
// print_byte(byte zeropage(4) b)
|
|
print_byte: {
|
|
.label _0 = $22
|
|
.label _2 = $23
|
|
.label b = 4
|
|
// [32] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte) 4 -- vbuz1=vbuz2_ror_4
|
|
lda.z b
|
|
lsr
|
|
lsr
|
|
lsr
|
|
lsr
|
|
sta.z _0
|
|
// [33] (byte) print_char::ch#0 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$0) -- vbuz1=pbuc1_derefidx_vbuz2
|
|
ldy.z _0
|
|
lda print_hextab,y
|
|
sta.z print_char.ch
|
|
// [34] call print_char
|
|
// [39] phi from print_byte to print_char [phi:print_byte->print_char]
|
|
print_char_from_print_byte:
|
|
// [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#36 [phi:print_byte->print_char#0] -- register_copy
|
|
// [39] phi (byte) print_char::ch#2 = (byte) print_char::ch#0 [phi:print_byte->print_char#1] -- register_copy
|
|
jsr print_char
|
|
jmp b1
|
|
// print_byte::@1
|
|
b1:
|
|
// [35] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte) $f -- vbuz1=vbuz2_band_vbuc1
|
|
lda #$f
|
|
and.z b
|
|
sta.z _2
|
|
// [36] (byte) print_char::ch#1 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$2) -- vbuz1=pbuc1_derefidx_vbuz2
|
|
ldy.z _2
|
|
lda print_hextab,y
|
|
sta.z print_char.ch
|
|
// [37] call print_char
|
|
// [39] phi from print_byte::@1 to print_char [phi:print_byte::@1->print_char]
|
|
print_char_from_b1:
|
|
// [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#10 [phi:print_byte::@1->print_char#0] -- register_copy
|
|
// [39] phi (byte) print_char::ch#2 = (byte) print_char::ch#1 [phi:print_byte::@1->print_char#1] -- register_copy
|
|
jsr print_char
|
|
jmp breturn
|
|
// print_byte::@return
|
|
breturn:
|
|
// [38] return
|
|
rts
|
|
}
|
|
// print_char
|
|
// Print a single char
|
|
// print_char(byte zeropage(5) ch)
|
|
print_char: {
|
|
.label ch = 5
|
|
// [40] *((byte*) print_char_cursor#27) ← (byte) print_char::ch#2 -- _deref_pbuz1=vbuz2
|
|
lda.z ch
|
|
ldy #0
|
|
sta (print_char_cursor),y
|
|
// [41] (byte*) print_char_cursor#10 ← ++ (byte*) print_char_cursor#27 -- pbuz1=_inc_pbuz1
|
|
inc.z print_char_cursor
|
|
bne !+
|
|
inc.z print_char_cursor+1
|
|
!:
|
|
jmp breturn
|
|
// print_char::@return
|
|
breturn:
|
|
// [42] return
|
|
rts
|
|
}
|
|
// mulf16u
|
|
// Fast multiply two unsigned words to a double word result
|
|
// Done in assembler to utilize fast addition A+X
|
|
mulf16u: {
|
|
.label memA = $f8
|
|
.label memB = $fa
|
|
.label memR = $fc
|
|
.label return = $16
|
|
.label return_1 = $24
|
|
// [43] *((const word*) mulf16u::memA#0) ← (const word) main::a#0 -- _deref_pwuc1=vwuc2
|
|
lda #<main.a
|
|
sta memA
|
|
lda #>main.a
|
|
sta memA+1
|
|
// [44] *((const word*) mulf16u::memB#0) ← (const word) main::b#0 -- _deref_pwuc1=vwuc2
|
|
lda #<main.b
|
|
sta memB
|
|
lda #>main.b
|
|
sta memB+1
|
|
// asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: }
|
|
lda memA
|
|
sta sm1a+1
|
|
sta sm3a+1
|
|
sta sm5a+1
|
|
sta sm7a+1
|
|
eor #$ff
|
|
sta sm2a+1
|
|
sta sm4a+1
|
|
sta sm6a+1
|
|
sta sm8a+1
|
|
lda memA+1
|
|
sta sm1b+1
|
|
sta sm3b+1
|
|
sta sm5b+1
|
|
sta sm7b+1
|
|
eor #$ff
|
|
sta sm2b+1
|
|
sta sm4b+1
|
|
sta sm6b+1
|
|
sta sm8b+1
|
|
ldx memB
|
|
sec
|
|
sm1a:
|
|
lda mulf_sqr1_lo,x
|
|
sm2a:
|
|
sbc mulf_sqr2_lo,x
|
|
sta memR+0
|
|
sm3a:
|
|
lda mulf_sqr1_hi,x
|
|
sm4a:
|
|
sbc mulf_sqr2_hi,x
|
|
sta _AA+1
|
|
sec
|
|
sm1b:
|
|
lda mulf_sqr1_lo,x
|
|
sm2b:
|
|
sbc mulf_sqr2_lo,x
|
|
sta _cc+1
|
|
sm3b:
|
|
lda mulf_sqr1_hi,x
|
|
sm4b:
|
|
sbc mulf_sqr2_hi,x
|
|
sta _CC+1
|
|
ldx memB+1
|
|
sec
|
|
sm5a:
|
|
lda mulf_sqr1_lo,x
|
|
sm6a:
|
|
sbc mulf_sqr2_lo,x
|
|
sta _bb+1
|
|
sm7a:
|
|
lda mulf_sqr1_hi,x
|
|
sm8a:
|
|
sbc mulf_sqr2_hi,x
|
|
sta _BB+1
|
|
sec
|
|
sm5b:
|
|
lda mulf_sqr1_lo,x
|
|
sm6b:
|
|
sbc mulf_sqr2_lo,x
|
|
sta _dd+1
|
|
sm7b:
|
|
lda mulf_sqr1_hi,x
|
|
sm8b:
|
|
sbc mulf_sqr2_hi,x
|
|
sta memR+3
|
|
clc
|
|
_AA:
|
|
lda #0
|
|
_bb:
|
|
adc #0
|
|
sta memR+1
|
|
_BB:
|
|
lda #0
|
|
_CC:
|
|
adc #0
|
|
sta memR+2
|
|
bcc !+
|
|
inc memR+3
|
|
clc
|
|
!:
|
|
_cc:
|
|
lda #0
|
|
adc memR+1
|
|
sta memR+1
|
|
_dd:
|
|
lda #0
|
|
adc memR+2
|
|
sta memR+2
|
|
bcc !+
|
|
inc memR+3
|
|
!:
|
|
// [46] (dword) mulf16u::return#1 ← *((const dword*) mulf16u::memR#0) -- vduz1=_deref_pduc1
|
|
lda memR
|
|
sta.z return_1
|
|
lda memR+1
|
|
sta.z return_1+1
|
|
lda memR+2
|
|
sta.z return_1+2
|
|
lda memR+3
|
|
sta.z return_1+3
|
|
jmp breturn
|
|
// mulf16u::@return
|
|
breturn:
|
|
// [47] return
|
|
rts
|
|
}
|
|
// mulf_init
|
|
// Initialize the mulf_sqr multiplication tables with f(x)=int(x*x/4)
|
|
mulf_init: {
|
|
.label _9 = $28
|
|
.label _12 = $29
|
|
.label _13 = $2a
|
|
.label c = $a
|
|
.label sqr1_hi = $b
|
|
.label sqr = $14
|
|
.label sqr1_lo = 8
|
|
.label x_2 = $d
|
|
.label sqr2_hi = $11
|
|
.label x_255 = $10
|
|
.label sqr2_lo = $e
|
|
.label dir = $13
|
|
// [49] phi from mulf_init to mulf_init::@1 [phi:mulf_init->mulf_init::@1]
|
|
b1_from_mulf_init:
|
|
// [49] phi (byte) mulf_init::x_2#3 = (byte) 0 [phi:mulf_init->mulf_init::@1#0] -- vbuz1=vbuc1
|
|
lda #0
|
|
sta.z x_2
|
|
// [49] phi (byte*) mulf_init::sqr1_hi#2 = (const byte[$200]) mulf_sqr1_hi#0+(byte) 1 [phi:mulf_init->mulf_init::@1#1] -- pbuz1=pbuc1
|
|
lda #<mulf_sqr1_hi+1
|
|
sta.z sqr1_hi
|
|
lda #>mulf_sqr1_hi+1
|
|
sta.z sqr1_hi+1
|
|
// [49] phi (word) mulf_init::sqr#4 = (byte) 0 [phi:mulf_init->mulf_init::@1#2] -- vwuz1=vbuc1
|
|
lda #<0
|
|
sta.z sqr
|
|
lda #>0
|
|
sta.z sqr+1
|
|
// [49] phi (byte) mulf_init::c#2 = (byte) 0 [phi:mulf_init->mulf_init::@1#3] -- vbuz1=vbuc1
|
|
lda #0
|
|
sta.z c
|
|
// [49] phi (byte*) mulf_init::sqr1_lo#2 = (const byte[$200]) mulf_sqr1_lo#0+(byte) 1 [phi:mulf_init->mulf_init::@1#4] -- pbuz1=pbuc1
|
|
lda #<mulf_sqr1_lo+1
|
|
sta.z sqr1_lo
|
|
lda #>mulf_sqr1_lo+1
|
|
sta.z sqr1_lo+1
|
|
jmp b1
|
|
// mulf_init::@1
|
|
b1:
|
|
// [50] if((byte*) mulf_init::sqr1_lo#2!=(const byte[$200]) mulf_sqr1_lo#0+(word) $200) goto mulf_init::@2 -- pbuz1_neq_pbuc1_then_la1
|
|
lda.z sqr1_lo+1
|
|
cmp #>mulf_sqr1_lo+$200
|
|
bne b2
|
|
lda.z sqr1_lo
|
|
cmp #<mulf_sqr1_lo+$200
|
|
bne b2
|
|
// [51] phi from mulf_init::@1 to mulf_init::@5 [phi:mulf_init::@1->mulf_init::@5]
|
|
b5_from_b1:
|
|
// [51] phi (byte) mulf_init::dir#2 = (byte) $ff [phi:mulf_init::@1->mulf_init::@5#0] -- vbuz1=vbuc1
|
|
lda #$ff
|
|
sta.z dir
|
|
// [51] phi (byte*) mulf_init::sqr2_hi#2 = (const byte[$200]) mulf_sqr2_hi#0 [phi:mulf_init::@1->mulf_init::@5#1] -- pbuz1=pbuc1
|
|
lda #<mulf_sqr2_hi
|
|
sta.z sqr2_hi
|
|
lda #>mulf_sqr2_hi
|
|
sta.z sqr2_hi+1
|
|
// [51] phi (byte) mulf_init::x_255#2 = (byte) -1 [phi:mulf_init::@1->mulf_init::@5#2] -- vbuz1=vbuc1
|
|
lda #-1
|
|
sta.z x_255
|
|
// [51] phi (byte*) mulf_init::sqr2_lo#2 = (const byte[$200]) mulf_sqr2_lo#0 [phi:mulf_init::@1->mulf_init::@5#3] -- pbuz1=pbuc1
|
|
lda #<mulf_sqr2_lo
|
|
sta.z sqr2_lo
|
|
lda #>mulf_sqr2_lo
|
|
sta.z sqr2_lo+1
|
|
jmp b5
|
|
// mulf_init::@5
|
|
b5:
|
|
// [52] if((byte*) mulf_init::sqr2_lo#2!=(const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) goto mulf_init::@6 -- pbuz1_neq_pbuc1_then_la1
|
|
lda.z sqr2_lo+1
|
|
cmp #>mulf_sqr2_lo+$1ff
|
|
bne b6
|
|
lda.z sqr2_lo
|
|
cmp #<mulf_sqr2_lo+$1ff
|
|
bne b6
|
|
jmp b7
|
|
// mulf_init::@7
|
|
b7:
|
|
// [53] *((const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_lo#0+(word) $100) -- _deref_pbuc1=_deref_pbuc2
|
|
// Set the very last value g(511) = f(256)
|
|
lda mulf_sqr1_lo+$100
|
|
sta mulf_sqr2_lo+$1ff
|
|
// [54] *((const byte[$200]) mulf_sqr2_hi#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_hi#0+(word) $100) -- _deref_pbuc1=_deref_pbuc2
|
|
lda mulf_sqr1_hi+$100
|
|
sta mulf_sqr2_hi+$1ff
|
|
jmp breturn
|
|
// mulf_init::@return
|
|
breturn:
|
|
// [55] return
|
|
rts
|
|
// mulf_init::@6
|
|
b6:
|
|
// [56] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[$200]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2) -- _deref_pbuz1=pbuc1_derefidx_vbuz2
|
|
ldy.z x_255
|
|
lda mulf_sqr1_lo,y
|
|
ldy #0
|
|
sta (sqr2_lo),y
|
|
// [57] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[$200]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2) -- _deref_pbuz1=pbuc1_derefidx_vbuz2
|
|
ldy.z x_255
|
|
lda mulf_sqr1_hi,y
|
|
ldy #0
|
|
sta (sqr2_hi),y
|
|
// [58] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2 -- pbuz1=_inc_pbuz1
|
|
inc.z sqr2_hi
|
|
bne !+
|
|
inc.z sqr2_hi+1
|
|
!:
|
|
// [59] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2 -- vbuz1=vbuz1_plus_vbuz2
|
|
lda.z x_255
|
|
clc
|
|
adc.z dir
|
|
sta.z x_255
|
|
// [60] if((byte) mulf_init::x_255#1!=(byte) 0) goto mulf_init::@9 -- vbuz1_neq_0_then_la1
|
|
lda.z x_255
|
|
cmp #0
|
|
bne b9_from_b6
|
|
// [62] phi from mulf_init::@6 to mulf_init::@8 [phi:mulf_init::@6->mulf_init::@8]
|
|
b8_from_b6:
|
|
// [62] phi (byte) mulf_init::dir#4 = (byte) 1 [phi:mulf_init::@6->mulf_init::@8#0] -- vbuz1=vbuc1
|
|
lda #1
|
|
sta.z dir
|
|
jmp b8
|
|
// [61] phi from mulf_init::@6 to mulf_init::@9 [phi:mulf_init::@6->mulf_init::@9]
|
|
b9_from_b6:
|
|
jmp b9
|
|
// mulf_init::@9
|
|
b9:
|
|
// [62] phi from mulf_init::@9 to mulf_init::@8 [phi:mulf_init::@9->mulf_init::@8]
|
|
b8_from_b9:
|
|
// [62] phi (byte) mulf_init::dir#4 = (byte) mulf_init::dir#2 [phi:mulf_init::@9->mulf_init::@8#0] -- register_copy
|
|
jmp b8
|
|
// mulf_init::@8
|
|
b8:
|
|
// [63] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2 -- pbuz1=_inc_pbuz1
|
|
inc.z sqr2_lo
|
|
bne !+
|
|
inc.z sqr2_lo+1
|
|
!:
|
|
// [51] phi from mulf_init::@8 to mulf_init::@5 [phi:mulf_init::@8->mulf_init::@5]
|
|
b5_from_b8:
|
|
// [51] phi (byte) mulf_init::dir#2 = (byte) mulf_init::dir#4 [phi:mulf_init::@8->mulf_init::@5#0] -- register_copy
|
|
// [51] phi (byte*) mulf_init::sqr2_hi#2 = (byte*) mulf_init::sqr2_hi#1 [phi:mulf_init::@8->mulf_init::@5#1] -- register_copy
|
|
// [51] phi (byte) mulf_init::x_255#2 = (byte) mulf_init::x_255#1 [phi:mulf_init::@8->mulf_init::@5#2] -- register_copy
|
|
// [51] phi (byte*) mulf_init::sqr2_lo#2 = (byte*) mulf_init::sqr2_lo#1 [phi:mulf_init::@8->mulf_init::@5#3] -- register_copy
|
|
jmp b5
|
|
// mulf_init::@2
|
|
b2:
|
|
// [64] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2 -- vbuz1=_inc_vbuz1
|
|
inc.z c
|
|
// [65] (byte~) mulf_init::$9 ← (byte) mulf_init::c#1 & (byte) 1 -- vbuz1=vbuz2_band_vbuc1
|
|
lda #1
|
|
and.z c
|
|
sta.z _9
|
|
// [66] if((byte~) mulf_init::$9!=(byte) 0) goto mulf_init::@3 -- vbuz1_neq_0_then_la1
|
|
lda.z _9
|
|
cmp #0
|
|
bne b3_from_b2
|
|
jmp b4
|
|
// mulf_init::@4
|
|
b4:
|
|
// [67] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3 -- vbuz1=_inc_vbuz1
|
|
inc.z x_2
|
|
// [68] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4 -- vwuz1=_inc_vwuz1
|
|
inc.z sqr
|
|
bne !+
|
|
inc.z sqr+1
|
|
!:
|
|
// [69] phi from mulf_init::@2 mulf_init::@4 to mulf_init::@3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3]
|
|
b3_from_b2:
|
|
b3_from_b4:
|
|
// [69] phi (byte) mulf_init::x_2#2 = (byte) mulf_init::x_2#3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#0] -- register_copy
|
|
// [69] phi (word) mulf_init::sqr#3 = (word) mulf_init::sqr#4 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#1] -- register_copy
|
|
jmp b3
|
|
// mulf_init::@3
|
|
b3:
|
|
// [70] (byte~) mulf_init::$12 ← < (word) mulf_init::sqr#3 -- vbuz1=_lo_vwuz2
|
|
lda.z sqr
|
|
sta.z _12
|
|
// [71] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$12 -- _deref_pbuz1=vbuz2
|
|
lda.z _12
|
|
ldy #0
|
|
sta (sqr1_lo),y
|
|
// [72] (byte~) mulf_init::$13 ← > (word) mulf_init::sqr#3 -- vbuz1=_hi_vwuz2
|
|
lda.z sqr+1
|
|
sta.z _13
|
|
// [73] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$13 -- _deref_pbuz1=vbuz2
|
|
lda.z _13
|
|
ldy #0
|
|
sta (sqr1_hi),y
|
|
// [74] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2 -- pbuz1=_inc_pbuz1
|
|
inc.z sqr1_hi
|
|
bne !+
|
|
inc.z sqr1_hi+1
|
|
!:
|
|
// [75] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2 -- vwuz1=vwuz1_plus_vbuz2
|
|
lda.z x_2
|
|
clc
|
|
adc.z sqr
|
|
sta.z sqr
|
|
bcc !+
|
|
inc.z sqr+1
|
|
!:
|
|
// [76] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2 -- pbuz1=_inc_pbuz1
|
|
inc.z sqr1_lo
|
|
bne !+
|
|
inc.z sqr1_lo+1
|
|
!:
|
|
// [49] phi from mulf_init::@3 to mulf_init::@1 [phi:mulf_init::@3->mulf_init::@1]
|
|
b1_from_b3:
|
|
// [49] phi (byte) mulf_init::x_2#3 = (byte) mulf_init::x_2#2 [phi:mulf_init::@3->mulf_init::@1#0] -- register_copy
|
|
// [49] phi (byte*) mulf_init::sqr1_hi#2 = (byte*) mulf_init::sqr1_hi#1 [phi:mulf_init::@3->mulf_init::@1#1] -- register_copy
|
|
// [49] phi (word) mulf_init::sqr#4 = (word) mulf_init::sqr#1 [phi:mulf_init::@3->mulf_init::@1#2] -- register_copy
|
|
// [49] phi (byte) mulf_init::c#2 = (byte) mulf_init::c#1 [phi:mulf_init::@3->mulf_init::@1#3] -- register_copy
|
|
// [49] phi (byte*) mulf_init::sqr1_lo#2 = (byte*) mulf_init::sqr1_lo#1 [phi:mulf_init::@3->mulf_init::@1#4] -- register_copy
|
|
jmp b1
|
|
}
|
|
// File Data
|
|
print_hextab: .text "0123456789abcdef"
|
|
// mulf_sqr tables will contain f(x)=int(x*x/4) and g(x) = f(x-255).
|
|
// <f(x) = <(( x * x )/4)
|
|
.align $100
|
|
mulf_sqr1_lo: .fill $200, 0
|
|
// >f(x) = >(( x * x )/4)
|
|
.align $100
|
|
mulf_sqr1_hi: .fill $200, 0
|
|
// <g(x) = <((( x - 255) * ( x - 255 ))/4)
|
|
.align $100
|
|
mulf_sqr2_lo: .fill $200, 0
|
|
// >g(x) = >((( x - 255) * ( x - 255 ))/4)
|
|
.align $100
|
|
mulf_sqr2_hi: .fill $200, 0
|
|
|
|
REGISTER UPLIFT POTENTIAL REGISTERS
|
|
Statement [8] if(*((const byte*) RASTER#0)!=(byte) $ff) goto main::@2 [ print_char_cursor#16 ] ( main:2 [ print_char_cursor#16 ] ) always clobbers reg byte a
|
|
Statement [11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1 [ print_char_cursor#16 mulf16u::return#0 ] ( main:2 [ print_char_cursor#16 mulf16u::return#0 ] ) always clobbers reg byte a
|
|
Statement [12] (dword) main::r#0 ← (dword) mulf16u::return#0 [ print_char_cursor#16 main::r#0 ] ( main:2 [ print_char_cursor#16 main::r#0 ] ) always clobbers reg byte a
|
|
Statement [14] (dword) print_dword::dw#0 ← (dword) main::r#0 [ print_char_cursor#16 print_dword::dw#0 ] ( main:2 [ print_char_cursor#16 print_dword::dw#0 ] ) always clobbers reg byte a
|
|
Statement [20] (word) print_word::w#0 ← > (dword) print_dword::dw#0 [ print_char_cursor#16 print_dword::dw#0 print_word::w#0 ] ( main:2::print_dword:15 [ print_char_cursor#16 print_dword::dw#0 print_word::w#0 ] ) always clobbers reg byte a
|
|
Statement [22] (word) print_word::w#1 ← < (dword) print_dword::dw#0 [ print_word::w#1 print_char_cursor#10 ] ( main:2::print_dword:15 [ print_word::w#1 print_char_cursor#10 ] ) always clobbers reg byte a
|
|
Statement [26] (byte) print_byte::b#0 ← > (word) print_word::w#2 [ print_word::w#2 print_char_cursor#34 print_byte::b#0 ] ( main:2::print_dword:15::print_word:21 [ print_dword::dw#0 print_word::w#2 print_char_cursor#34 print_byte::b#0 ] main:2::print_dword:15::print_word:23 [ print_word::w#2 print_char_cursor#34 print_byte::b#0 ] ) always clobbers reg byte a
|
|
Statement [28] (byte) print_byte::b#1 ← < (word) print_word::w#2 [ print_char_cursor#10 print_byte::b#1 ] ( main:2::print_dword:15::print_word:21 [ print_dword::dw#0 print_char_cursor#10 print_byte::b#1 ] main:2::print_dword:15::print_word:23 [ print_char_cursor#10 print_byte::b#1 ] ) always clobbers reg byte a
|
|
Statement [32] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte) 4 [ print_byte::b#2 print_char_cursor#36 print_byte::$0 ] ( main:2::print_dword:15::print_word:21::print_byte:27 [ print_dword::dw#0 print_word::w#2 print_byte::b#2 print_char_cursor#36 print_byte::$0 ] main:2::print_dword:15::print_word:23::print_byte:27 [ print_word::w#2 print_byte::b#2 print_char_cursor#36 print_byte::$0 ] main:2::print_dword:15::print_word:21::print_byte:29 [ print_dword::dw#0 print_byte::b#2 print_char_cursor#36 print_byte::$0 ] main:2::print_dword:15::print_word:23::print_byte:29 [ print_byte::b#2 print_char_cursor#36 print_byte::$0 ] ) always clobbers reg byte a
|
|
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:4 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
|
|
Statement [35] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte) $f [ print_char_cursor#10 print_byte::$2 ] ( main:2::print_dword:15::print_word:21::print_byte:27 [ print_dword::dw#0 print_word::w#2 print_char_cursor#10 print_byte::$2 ] main:2::print_dword:15::print_word:23::print_byte:27 [ print_word::w#2 print_char_cursor#10 print_byte::$2 ] main:2::print_dword:15::print_word:21::print_byte:29 [ print_dword::dw#0 print_char_cursor#10 print_byte::$2 ] main:2::print_dword:15::print_word:23::print_byte:29 [ print_char_cursor#10 print_byte::$2 ] ) always clobbers reg byte a
|
|
Statement [40] *((byte*) print_char_cursor#27) ← (byte) print_char::ch#2 [ print_char_cursor#27 ] ( main:2::print_dword:15::print_word:21::print_byte:27::print_char:34 [ print_dword::dw#0 print_word::w#2 print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:27::print_char:34 [ print_word::w#2 print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:21::print_byte:29::print_char:34 [ print_dword::dw#0 print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:29::print_char:34 [ print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:21::print_byte:27::print_char:37 [ print_dword::dw#0 print_word::w#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:27::print_char:37 [ print_word::w#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:21::print_byte:29::print_char:37 [ print_dword::dw#0 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:29::print_char:37 [ print_char_cursor#27 ] ) always clobbers reg byte y
|
|
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:4 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
|
|
Statement [43] *((const word*) mulf16u::memA#0) ← (const word) main::a#0 [ ] ( main:2::mulf16u:10 [ print_char_cursor#16 ] ) always clobbers reg byte a
|
|
Statement [44] *((const word*) mulf16u::memB#0) ← (const word) main::b#0 [ ] ( main:2::mulf16u:10 [ print_char_cursor#16 ] ) always clobbers reg byte a
|
|
Statement asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: } always clobbers reg byte a reg byte x
|
|
Statement [46] (dword) mulf16u::return#1 ← *((const dword*) mulf16u::memR#0) [ mulf16u::return#1 ] ( main:2::mulf16u:10 [ print_char_cursor#16 mulf16u::return#1 ] ) always clobbers reg byte a
|
|
Statement [50] if((byte*) mulf_init::sqr1_lo#2!=(const byte[$200]) mulf_sqr1_lo#0+(word) $200) goto mulf_init::@2 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ) always clobbers reg byte a
|
|
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ]
|
|
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:13 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
|
|
Statement [52] if((byte*) mulf_init::sqr2_lo#2!=(const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) goto mulf_init::@6 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a
|
|
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ]
|
|
Removing always clobbered register reg byte a as potential for zp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ]
|
|
Statement [53] *((const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_lo#0+(word) $100) [ ] ( main:2::mulf_init:5 [ ] ) always clobbers reg byte a
|
|
Statement [54] *((const byte[$200]) mulf_sqr2_hi#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_hi#0+(word) $100) [ ] ( main:2::mulf_init:5 [ ] ) always clobbers reg byte a
|
|
Statement [56] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[$200]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2) [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a reg byte y
|
|
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ]
|
|
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ]
|
|
Statement [57] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[$200]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2) [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a reg byte y
|
|
Statement [59] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] ) always clobbers reg byte a
|
|
Statement [65] (byte~) mulf_init::$9 ← (byte) mulf_init::c#1 & (byte) 1 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$9 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$9 ] ) always clobbers reg byte a
|
|
Statement [70] (byte~) mulf_init::$12 ← < (word) mulf_init::sqr#3 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$12 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$12 ] ) always clobbers reg byte a
|
|
Statement [71] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$12 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ) always clobbers reg byte y
|
|
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ]
|
|
Removing always clobbered register reg byte y as potential for zp ZP_BYTE:13 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
|
|
Statement [72] (byte~) mulf_init::$13 ← > (word) mulf_init::sqr#3 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$13 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$13 ] ) always clobbers reg byte a
|
|
Statement [73] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$13 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ) always clobbers reg byte y
|
|
Statement [75] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ) always clobbers reg byte a
|
|
Statement [8] if(*((const byte*) RASTER#0)!=(byte) $ff) goto main::@2 [ print_char_cursor#16 ] ( main:2 [ print_char_cursor#16 ] ) always clobbers reg byte a
|
|
Statement [11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1 [ print_char_cursor#16 mulf16u::return#0 ] ( main:2 [ print_char_cursor#16 mulf16u::return#0 ] ) always clobbers reg byte a
|
|
Statement [12] (dword) main::r#0 ← (dword) mulf16u::return#0 [ print_char_cursor#16 main::r#0 ] ( main:2 [ print_char_cursor#16 main::r#0 ] ) always clobbers reg byte a
|
|
Statement [14] (dword) print_dword::dw#0 ← (dword) main::r#0 [ print_char_cursor#16 print_dword::dw#0 ] ( main:2 [ print_char_cursor#16 print_dword::dw#0 ] ) always clobbers reg byte a
|
|
Statement [20] (word) print_word::w#0 ← > (dword) print_dword::dw#0 [ print_char_cursor#16 print_dword::dw#0 print_word::w#0 ] ( main:2::print_dword:15 [ print_char_cursor#16 print_dword::dw#0 print_word::w#0 ] ) always clobbers reg byte a
|
|
Statement [22] (word) print_word::w#1 ← < (dword) print_dword::dw#0 [ print_word::w#1 print_char_cursor#10 ] ( main:2::print_dword:15 [ print_word::w#1 print_char_cursor#10 ] ) always clobbers reg byte a
|
|
Statement [26] (byte) print_byte::b#0 ← > (word) print_word::w#2 [ print_word::w#2 print_char_cursor#34 print_byte::b#0 ] ( main:2::print_dword:15::print_word:21 [ print_dword::dw#0 print_word::w#2 print_char_cursor#34 print_byte::b#0 ] main:2::print_dword:15::print_word:23 [ print_word::w#2 print_char_cursor#34 print_byte::b#0 ] ) always clobbers reg byte a
|
|
Statement [28] (byte) print_byte::b#1 ← < (word) print_word::w#2 [ print_char_cursor#10 print_byte::b#1 ] ( main:2::print_dword:15::print_word:21 [ print_dword::dw#0 print_char_cursor#10 print_byte::b#1 ] main:2::print_dword:15::print_word:23 [ print_char_cursor#10 print_byte::b#1 ] ) always clobbers reg byte a
|
|
Statement [32] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte) 4 [ print_byte::b#2 print_char_cursor#36 print_byte::$0 ] ( main:2::print_dword:15::print_word:21::print_byte:27 [ print_dword::dw#0 print_word::w#2 print_byte::b#2 print_char_cursor#36 print_byte::$0 ] main:2::print_dword:15::print_word:23::print_byte:27 [ print_word::w#2 print_byte::b#2 print_char_cursor#36 print_byte::$0 ] main:2::print_dword:15::print_word:21::print_byte:29 [ print_dword::dw#0 print_byte::b#2 print_char_cursor#36 print_byte::$0 ] main:2::print_dword:15::print_word:23::print_byte:29 [ print_byte::b#2 print_char_cursor#36 print_byte::$0 ] ) always clobbers reg byte a
|
|
Statement [35] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte) $f [ print_char_cursor#10 print_byte::$2 ] ( main:2::print_dword:15::print_word:21::print_byte:27 [ print_dword::dw#0 print_word::w#2 print_char_cursor#10 print_byte::$2 ] main:2::print_dword:15::print_word:23::print_byte:27 [ print_word::w#2 print_char_cursor#10 print_byte::$2 ] main:2::print_dword:15::print_word:21::print_byte:29 [ print_dword::dw#0 print_char_cursor#10 print_byte::$2 ] main:2::print_dword:15::print_word:23::print_byte:29 [ print_char_cursor#10 print_byte::$2 ] ) always clobbers reg byte a
|
|
Statement [40] *((byte*) print_char_cursor#27) ← (byte) print_char::ch#2 [ print_char_cursor#27 ] ( main:2::print_dword:15::print_word:21::print_byte:27::print_char:34 [ print_dword::dw#0 print_word::w#2 print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:27::print_char:34 [ print_word::w#2 print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:21::print_byte:29::print_char:34 [ print_dword::dw#0 print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:29::print_char:34 [ print_byte::b#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:21::print_byte:27::print_char:37 [ print_dword::dw#0 print_word::w#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:27::print_char:37 [ print_word::w#2 print_char_cursor#27 ] main:2::print_dword:15::print_word:21::print_byte:29::print_char:37 [ print_dword::dw#0 print_char_cursor#27 ] main:2::print_dword:15::print_word:23::print_byte:29::print_char:37 [ print_char_cursor#27 ] ) always clobbers reg byte y
|
|
Statement [43] *((const word*) mulf16u::memA#0) ← (const word) main::a#0 [ ] ( main:2::mulf16u:10 [ print_char_cursor#16 ] ) always clobbers reg byte a
|
|
Statement [44] *((const word*) mulf16u::memB#0) ← (const word) main::b#0 [ ] ( main:2::mulf16u:10 [ print_char_cursor#16 ] ) always clobbers reg byte a
|
|
Statement asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: } always clobbers reg byte a reg byte x
|
|
Statement [46] (dword) mulf16u::return#1 ← *((const dword*) mulf16u::memR#0) [ mulf16u::return#1 ] ( main:2::mulf16u:10 [ print_char_cursor#16 mulf16u::return#1 ] ) always clobbers reg byte a
|
|
Statement [50] if((byte*) mulf_init::sqr1_lo#2!=(const byte[$200]) mulf_sqr1_lo#0+(word) $200) goto mulf_init::@2 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::c#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 ] ) always clobbers reg byte a
|
|
Statement [52] if((byte*) mulf_init::sqr2_lo#2!=(const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) goto mulf_init::@6 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a
|
|
Statement [53] *((const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_lo#0+(word) $100) [ ] ( main:2::mulf_init:5 [ ] ) always clobbers reg byte a
|
|
Statement [54] *((const byte[$200]) mulf_sqr2_hi#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_hi#0+(word) $100) [ ] ( main:2::mulf_init:5 [ ] ) always clobbers reg byte a
|
|
Statement [56] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[$200]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2) [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a reg byte y
|
|
Statement [57] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[$200]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2) [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::x_255#2 mulf_init::sqr2_hi#2 mulf_init::dir#2 ] ) always clobbers reg byte a reg byte y
|
|
Statement [59] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] ( main:2::mulf_init:5 [ mulf_init::sqr2_lo#2 mulf_init::dir#2 mulf_init::x_255#1 mulf_init::sqr2_hi#1 ] ) always clobbers reg byte a
|
|
Statement [65] (byte~) mulf_init::$9 ← (byte) mulf_init::c#1 & (byte) 1 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$9 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr#4 mulf_init::sqr1_hi#2 mulf_init::x_2#3 mulf_init::c#1 mulf_init::$9 ] ) always clobbers reg byte a
|
|
Statement [70] (byte~) mulf_init::$12 ← < (word) mulf_init::sqr#3 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$12 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$12 ] ) always clobbers reg byte a
|
|
Statement [71] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$12 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ) always clobbers reg byte y
|
|
Statement [72] (byte~) mulf_init::$13 ← > (word) mulf_init::sqr#3 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$13 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 mulf_init::$13 ] ) always clobbers reg byte a
|
|
Statement [73] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$13 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_hi#2 mulf_init::c#1 mulf_init::x_2#2 mulf_init::sqr#3 ] ) always clobbers reg byte y
|
|
Statement [75] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ( main:2::mulf_init:5 [ mulf_init::sqr1_lo#2 mulf_init::c#1 mulf_init::sqr#1 mulf_init::sqr1_hi#1 mulf_init::x_2#2 ] ) always clobbers reg byte a
|
|
Potential registers zp ZP_WORD:2 [ print_word::w#2 print_word::w#0 print_word::w#1 ] : zp ZP_WORD:2 ,
|
|
Potential registers zp ZP_BYTE:4 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] : zp ZP_BYTE:4 , reg byte x ,
|
|
Potential registers zp ZP_BYTE:5 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ] : zp ZP_BYTE:5 , reg byte a , reg byte x , reg byte y ,
|
|
Potential registers zp ZP_WORD:6 [ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ] : zp ZP_WORD:6 ,
|
|
Potential registers zp ZP_WORD:8 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] : zp ZP_WORD:8 ,
|
|
Potential registers zp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ] : zp ZP_BYTE:10 , reg byte x ,
|
|
Potential registers zp ZP_WORD:11 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] : zp ZP_WORD:11 ,
|
|
Potential registers zp ZP_BYTE:13 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] : zp ZP_BYTE:13 , reg byte x ,
|
|
Potential registers zp ZP_WORD:14 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] : zp ZP_WORD:14 ,
|
|
Potential registers zp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ] : zp ZP_BYTE:16 , reg byte x ,
|
|
Potential registers zp ZP_WORD:17 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] : zp ZP_WORD:17 ,
|
|
Potential registers zp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ] : zp ZP_BYTE:19 , reg byte x ,
|
|
Potential registers zp ZP_WORD:20 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] : zp ZP_WORD:20 ,
|
|
Potential registers zp ZP_DWORD:22 [ mulf16u::return#0 ] : zp ZP_DWORD:22 ,
|
|
Potential registers zp ZP_DWORD:26 [ main::r#0 ] : zp ZP_DWORD:26 ,
|
|
Potential registers zp ZP_DWORD:30 [ print_dword::dw#0 ] : zp ZP_DWORD:30 ,
|
|
Potential registers zp ZP_BYTE:34 [ print_byte::$0 ] : zp ZP_BYTE:34 , reg byte a , reg byte x , reg byte y ,
|
|
Potential registers zp ZP_BYTE:35 [ print_byte::$2 ] : zp ZP_BYTE:35 , reg byte a , reg byte x , reg byte y ,
|
|
Potential registers zp ZP_DWORD:36 [ mulf16u::return#1 ] : zp ZP_DWORD:36 ,
|
|
Potential registers zp ZP_BYTE:40 [ mulf_init::$9 ] : zp ZP_BYTE:40 , reg byte a , reg byte x , reg byte y ,
|
|
Potential registers zp ZP_BYTE:41 [ mulf_init::$12 ] : zp ZP_BYTE:41 , reg byte a , reg byte x , reg byte y ,
|
|
Potential registers zp ZP_BYTE:42 [ mulf_init::$13 ] : zp ZP_BYTE:42 , reg byte a , reg byte x , reg byte y ,
|
|
|
|
REGISTER UPLIFT SCOPES
|
|
Uplift Scope [mulf_init] 47.67: zp ZP_WORD:20 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] 26.89: zp ZP_WORD:14 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] 25.14: zp ZP_WORD:8 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] 23.1: zp ZP_BYTE:13 [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] 22: zp ZP_BYTE:40 [ mulf_init::$9 ] 22: zp ZP_BYTE:41 [ mulf_init::$12 ] 22: zp ZP_BYTE:42 [ mulf_init::$13 ] 15.4: zp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ] 15.12: zp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ] 13.54: zp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ] 11.92: zp ZP_WORD:17 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] 10.08: zp ZP_WORD:11 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
|
|
Uplift Scope [mulf16u] 22: zp ZP_DWORD:22 [ mulf16u::return#0 ] 4.33: zp ZP_DWORD:36 [ mulf16u::return#1 ]
|
|
Uplift Scope [print_byte] 10: zp ZP_BYTE:4 [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] 4: zp ZP_BYTE:34 [ print_byte::$0 ] 4: zp ZP_BYTE:35 [ print_byte::$2 ]
|
|
Uplift Scope [print_char] 14: zp ZP_BYTE:5 [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
|
|
Uplift Scope [main] 11: zp ZP_DWORD:26 [ main::r#0 ]
|
|
Uplift Scope [print_word] 10.67: zp ZP_WORD:2 [ print_word::w#2 print_word::w#0 print_word::w#1 ]
|
|
Uplift Scope [] 9.84: zp ZP_WORD:6 [ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ]
|
|
Uplift Scope [print_dword] 5: zp ZP_DWORD:30 [ print_dword::dw#0 ]
|
|
Uplift Scope [RADIX]
|
|
Uplift Scope [print_set_screen]
|
|
|
|
Uplifting [mulf_init] best 6046 combination zp ZP_WORD:20 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ] zp ZP_WORD:14 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ] zp ZP_WORD:8 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] reg byte x [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ] reg byte a [ mulf_init::$9 ] reg byte a [ mulf_init::$12 ] reg byte a [ mulf_init::$13 ] zp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ] zp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ] zp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ] zp ZP_WORD:17 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ] zp ZP_WORD:11 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ]
|
|
Limited combination testing to 100 combinations of 1024 possible.
|
|
Uplifting [mulf16u] best 6046 combination zp ZP_DWORD:22 [ mulf16u::return#0 ] zp ZP_DWORD:36 [ mulf16u::return#1 ]
|
|
Uplifting [print_byte] best 6032 combination reg byte x [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ] reg byte a [ print_byte::$0 ] reg byte x [ print_byte::$2 ]
|
|
Uplifting [print_char] best 6023 combination reg byte a [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
|
|
Uplifting [main] best 6023 combination zp ZP_DWORD:26 [ main::r#0 ]
|
|
Uplifting [print_word] best 6023 combination zp ZP_WORD:2 [ print_word::w#2 print_word::w#0 print_word::w#1 ]
|
|
Uplifting [] best 6023 combination zp ZP_WORD:6 [ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ]
|
|
Uplifting [print_dword] best 6023 combination zp ZP_DWORD:30 [ print_dword::dw#0 ]
|
|
Uplifting [RADIX] best 6023 combination
|
|
Uplifting [print_set_screen] best 6023 combination
|
|
Attempting to uplift remaining variables inzp ZP_BYTE:16 [ mulf_init::x_255#2 mulf_init::x_255#1 ]
|
|
Uplifting [mulf_init] best 5883 combination reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ]
|
|
Attempting to uplift remaining variables inzp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ]
|
|
Uplifting [mulf_init] best 5883 combination zp ZP_BYTE:19 [ mulf_init::dir#2 mulf_init::dir#4 ]
|
|
Attempting to uplift remaining variables inzp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ]
|
|
Uplifting [mulf_init] best 5883 combination zp ZP_BYTE:10 [ mulf_init::c#2 mulf_init::c#1 ]
|
|
Coalescing zero page register [ zp ZP_DWORD:22 [ mulf16u::return#0 ] ] with [ zp ZP_DWORD:26 [ main::r#0 ] ] - score: 1
|
|
Coalescing zero page register [ zp ZP_DWORD:22 [ mulf16u::return#0 main::r#0 ] ] with [ zp ZP_DWORD:36 [ mulf16u::return#1 ] ] - score: 1
|
|
Coalescing zero page register [ zp ZP_DWORD:22 [ mulf16u::return#0 main::r#0 mulf16u::return#1 ] ] with [ zp ZP_DWORD:30 [ print_dword::dw#0 ] ] - score: 1
|
|
Coalescing zero page register [ zp ZP_WORD:8 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 ] ] with [ zp ZP_WORD:2 [ print_word::w#2 print_word::w#0 print_word::w#1 ] ]
|
|
Coalescing zero page register [ zp ZP_WORD:11 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 ] ] with [ zp ZP_WORD:6 [ print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ] ]
|
|
Allocated (was zp ZP_WORD:8) zp ZP_WORD:2 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 print_word::w#2 print_word::w#0 print_word::w#1 ]
|
|
Allocated (was zp ZP_BYTE:10) zp ZP_BYTE:4 [ mulf_init::c#2 mulf_init::c#1 ]
|
|
Allocated (was zp ZP_WORD:11) zp ZP_WORD:5 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ]
|
|
Allocated (was zp ZP_WORD:14) zp ZP_WORD:7 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
|
|
Allocated (was zp ZP_WORD:17) zp ZP_WORD:9 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
|
|
Allocated (was zp ZP_BYTE:19) zp ZP_BYTE:11 [ mulf_init::dir#2 mulf_init::dir#4 ]
|
|
Allocated (was zp ZP_WORD:20) zp ZP_WORD:12 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
|
|
Allocated (was zp ZP_DWORD:22) zp ZP_DWORD:14 [ mulf16u::return#0 main::r#0 mulf16u::return#1 print_dword::dw#0 ]
|
|
|
|
ASSEMBLER BEFORE OPTIMIZATION
|
|
// File Comments
|
|
// Upstart
|
|
.pc = $801 "Basic"
|
|
:BasicUpstart(bbegin)
|
|
.pc = $80d "Program"
|
|
// Global Constants & labels
|
|
.label RASTER = $d012
|
|
.label BORDERCOL = $d020
|
|
.label SCREEN = $400
|
|
.label print_char_cursor = 5
|
|
// @begin
|
|
bbegin:
|
|
// [1] phi from @begin to @1 [phi:@begin->@1]
|
|
b1_from_bbegin:
|
|
jmp b1
|
|
// @1
|
|
b1:
|
|
// [2] call main
|
|
// [4] phi from @1 to main [phi:@1->main]
|
|
main_from_b1:
|
|
jsr main
|
|
// [3] phi from @1 to @end [phi:@1->@end]
|
|
bend_from_b1:
|
|
jmp bend
|
|
// @end
|
|
bend:
|
|
// main
|
|
main: {
|
|
.label a = $4d2
|
|
.label b = $929
|
|
.label r = $e
|
|
// [5] call mulf_init
|
|
// [48] phi from main to mulf_init [phi:main->mulf_init]
|
|
mulf_init_from_main:
|
|
jsr mulf_init
|
|
jmp b4
|
|
// main::@4
|
|
b4:
|
|
// asm { sei }
|
|
sei
|
|
// [7] phi from main::@4 to main::@1 [phi:main::@4->main::@1]
|
|
b1_from_b4:
|
|
// [7] phi (byte*) print_char_cursor#16 = (byte*) 1024 [phi:main::@4->main::@1#0] -- pbuz1=pbuc1
|
|
lda #<$400
|
|
sta.z print_char_cursor
|
|
lda #>$400
|
|
sta.z print_char_cursor+1
|
|
jmp b1
|
|
// main::@1
|
|
b1:
|
|
jmp b2
|
|
// main::@2
|
|
b2:
|
|
// [8] if(*((const byte*) RASTER#0)!=(byte) $ff) goto main::@2 -- _deref_pbuc1_neq_vbuc2_then_la1
|
|
lda #$ff
|
|
cmp RASTER
|
|
bne b2
|
|
jmp b3
|
|
// main::@3
|
|
b3:
|
|
// [9] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1
|
|
inc BORDERCOL
|
|
// [10] call mulf16u
|
|
jsr mulf16u
|
|
// [11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1
|
|
jmp b5
|
|
// main::@5
|
|
b5:
|
|
// [12] (dword) main::r#0 ← (dword) mulf16u::return#0
|
|
// [13] *((const byte*) BORDERCOL#0) ← -- *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_dec__deref_pbuc1
|
|
dec BORDERCOL
|
|
// [14] (dword) print_dword::dw#0 ← (dword) main::r#0
|
|
// [15] call print_dword
|
|
jsr print_dword
|
|
// [16] phi from main::@5 to main::@6 [phi:main::@5->main::@6]
|
|
b6_from_b5:
|
|
jmp b6
|
|
// main::@6
|
|
b6:
|
|
// [17] call print_set_screen
|
|
// [18] phi from main::@6 to print_set_screen [phi:main::@6->print_set_screen]
|
|
print_set_screen_from_b6:
|
|
jsr print_set_screen
|
|
// [7] phi from main::@6 to main::@1 [phi:main::@6->main::@1]
|
|
b1_from_b6:
|
|
// [7] phi (byte*) print_char_cursor#16 = (const byte*) SCREEN#0 [phi:main::@6->main::@1#0] -- pbuz1=pbuc1
|
|
lda #<SCREEN
|
|
sta.z print_char_cursor
|
|
lda #>SCREEN
|
|
sta.z print_char_cursor+1
|
|
jmp b1
|
|
}
|
|
// print_set_screen
|
|
// Set the screen to print on. Also resets current line/char cursor.
|
|
print_set_screen: {
|
|
jmp breturn
|
|
// print_set_screen::@return
|
|
breturn:
|
|
// [19] return
|
|
rts
|
|
}
|
|
// print_dword
|
|
// Print a dword as HEX
|
|
// print_dword(dword zeropage($e) dw)
|
|
print_dword: {
|
|
.label dw = $e
|
|
// [20] (word) print_word::w#0 ← > (dword) print_dword::dw#0 -- vwuz1=_hi_vduz2
|
|
lda.z dw+2
|
|
sta.z print_word.w
|
|
lda.z dw+3
|
|
sta.z print_word.w+1
|
|
// [21] call print_word
|
|
// [25] phi from print_dword to print_word [phi:print_dword->print_word]
|
|
print_word_from_print_dword:
|
|
// [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#16 [phi:print_dword->print_word#0] -- register_copy
|
|
// [25] phi (word) print_word::w#2 = (word) print_word::w#0 [phi:print_dword->print_word#1] -- register_copy
|
|
jsr print_word
|
|
jmp b1
|
|
// print_dword::@1
|
|
b1:
|
|
// [22] (word) print_word::w#1 ← < (dword) print_dword::dw#0 -- vwuz1=_lo_vduz2
|
|
lda.z dw
|
|
sta.z print_word.w
|
|
lda.z dw+1
|
|
sta.z print_word.w+1
|
|
// [23] call print_word
|
|
// [25] phi from print_dword::@1 to print_word [phi:print_dword::@1->print_word]
|
|
print_word_from_b1:
|
|
// [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#10 [phi:print_dword::@1->print_word#0] -- register_copy
|
|
// [25] phi (word) print_word::w#2 = (word) print_word::w#1 [phi:print_dword::@1->print_word#1] -- register_copy
|
|
jsr print_word
|
|
jmp breturn
|
|
// print_dword::@return
|
|
breturn:
|
|
// [24] return
|
|
rts
|
|
}
|
|
// print_word
|
|
// Print a word as HEX
|
|
// print_word(word zeropage(2) w)
|
|
print_word: {
|
|
.label w = 2
|
|
// [26] (byte) print_byte::b#0 ← > (word) print_word::w#2 -- vbuxx=_hi_vwuz1
|
|
lda.z w+1
|
|
tax
|
|
// [27] call print_byte
|
|
// [31] phi from print_word to print_byte [phi:print_word->print_byte]
|
|
print_byte_from_print_word:
|
|
// [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#34 [phi:print_word->print_byte#0] -- register_copy
|
|
// [31] phi (byte) print_byte::b#2 = (byte) print_byte::b#0 [phi:print_word->print_byte#1] -- register_copy
|
|
jsr print_byte
|
|
jmp b1
|
|
// print_word::@1
|
|
b1:
|
|
// [28] (byte) print_byte::b#1 ← < (word) print_word::w#2 -- vbuxx=_lo_vwuz1
|
|
lda.z w
|
|
tax
|
|
// [29] call print_byte
|
|
// [31] phi from print_word::@1 to print_byte [phi:print_word::@1->print_byte]
|
|
print_byte_from_b1:
|
|
// [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#10 [phi:print_word::@1->print_byte#0] -- register_copy
|
|
// [31] phi (byte) print_byte::b#2 = (byte) print_byte::b#1 [phi:print_word::@1->print_byte#1] -- register_copy
|
|
jsr print_byte
|
|
jmp breturn
|
|
// print_word::@return
|
|
breturn:
|
|
// [30] return
|
|
rts
|
|
}
|
|
// print_byte
|
|
// Print a byte as HEX
|
|
// print_byte(byte register(X) b)
|
|
print_byte: {
|
|
// [32] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte) 4 -- vbuaa=vbuxx_ror_4
|
|
txa
|
|
lsr
|
|
lsr
|
|
lsr
|
|
lsr
|
|
// [33] (byte) print_char::ch#0 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$0) -- vbuaa=pbuc1_derefidx_vbuaa
|
|
tay
|
|
lda print_hextab,y
|
|
// [34] call print_char
|
|
// [39] phi from print_byte to print_char [phi:print_byte->print_char]
|
|
print_char_from_print_byte:
|
|
// [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#36 [phi:print_byte->print_char#0] -- register_copy
|
|
// [39] phi (byte) print_char::ch#2 = (byte) print_char::ch#0 [phi:print_byte->print_char#1] -- register_copy
|
|
jsr print_char
|
|
jmp b1
|
|
// print_byte::@1
|
|
b1:
|
|
// [35] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte) $f -- vbuxx=vbuxx_band_vbuc1
|
|
lda #$f
|
|
axs #0
|
|
// [36] (byte) print_char::ch#1 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$2) -- vbuaa=pbuc1_derefidx_vbuxx
|
|
lda print_hextab,x
|
|
// [37] call print_char
|
|
// [39] phi from print_byte::@1 to print_char [phi:print_byte::@1->print_char]
|
|
print_char_from_b1:
|
|
// [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#10 [phi:print_byte::@1->print_char#0] -- register_copy
|
|
// [39] phi (byte) print_char::ch#2 = (byte) print_char::ch#1 [phi:print_byte::@1->print_char#1] -- register_copy
|
|
jsr print_char
|
|
jmp breturn
|
|
// print_byte::@return
|
|
breturn:
|
|
// [38] return
|
|
rts
|
|
}
|
|
// print_char
|
|
// Print a single char
|
|
// print_char(byte register(A) ch)
|
|
print_char: {
|
|
// [40] *((byte*) print_char_cursor#27) ← (byte) print_char::ch#2 -- _deref_pbuz1=vbuaa
|
|
ldy #0
|
|
sta (print_char_cursor),y
|
|
// [41] (byte*) print_char_cursor#10 ← ++ (byte*) print_char_cursor#27 -- pbuz1=_inc_pbuz1
|
|
inc.z print_char_cursor
|
|
bne !+
|
|
inc.z print_char_cursor+1
|
|
!:
|
|
jmp breturn
|
|
// print_char::@return
|
|
breturn:
|
|
// [42] return
|
|
rts
|
|
}
|
|
// mulf16u
|
|
// Fast multiply two unsigned words to a double word result
|
|
// Done in assembler to utilize fast addition A+X
|
|
mulf16u: {
|
|
.label memA = $f8
|
|
.label memB = $fa
|
|
.label memR = $fc
|
|
.label return = $e
|
|
// [43] *((const word*) mulf16u::memA#0) ← (const word) main::a#0 -- _deref_pwuc1=vwuc2
|
|
lda #<main.a
|
|
sta memA
|
|
lda #>main.a
|
|
sta memA+1
|
|
// [44] *((const word*) mulf16u::memB#0) ← (const word) main::b#0 -- _deref_pwuc1=vwuc2
|
|
lda #<main.b
|
|
sta memB
|
|
lda #>main.b
|
|
sta memB+1
|
|
// asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: }
|
|
lda memA
|
|
sta sm1a+1
|
|
sta sm3a+1
|
|
sta sm5a+1
|
|
sta sm7a+1
|
|
eor #$ff
|
|
sta sm2a+1
|
|
sta sm4a+1
|
|
sta sm6a+1
|
|
sta sm8a+1
|
|
lda memA+1
|
|
sta sm1b+1
|
|
sta sm3b+1
|
|
sta sm5b+1
|
|
sta sm7b+1
|
|
eor #$ff
|
|
sta sm2b+1
|
|
sta sm4b+1
|
|
sta sm6b+1
|
|
sta sm8b+1
|
|
ldx memB
|
|
sec
|
|
sm1a:
|
|
lda mulf_sqr1_lo,x
|
|
sm2a:
|
|
sbc mulf_sqr2_lo,x
|
|
sta memR+0
|
|
sm3a:
|
|
lda mulf_sqr1_hi,x
|
|
sm4a:
|
|
sbc mulf_sqr2_hi,x
|
|
sta _AA+1
|
|
sec
|
|
sm1b:
|
|
lda mulf_sqr1_lo,x
|
|
sm2b:
|
|
sbc mulf_sqr2_lo,x
|
|
sta _cc+1
|
|
sm3b:
|
|
lda mulf_sqr1_hi,x
|
|
sm4b:
|
|
sbc mulf_sqr2_hi,x
|
|
sta _CC+1
|
|
ldx memB+1
|
|
sec
|
|
sm5a:
|
|
lda mulf_sqr1_lo,x
|
|
sm6a:
|
|
sbc mulf_sqr2_lo,x
|
|
sta _bb+1
|
|
sm7a:
|
|
lda mulf_sqr1_hi,x
|
|
sm8a:
|
|
sbc mulf_sqr2_hi,x
|
|
sta _BB+1
|
|
sec
|
|
sm5b:
|
|
lda mulf_sqr1_lo,x
|
|
sm6b:
|
|
sbc mulf_sqr2_lo,x
|
|
sta _dd+1
|
|
sm7b:
|
|
lda mulf_sqr1_hi,x
|
|
sm8b:
|
|
sbc mulf_sqr2_hi,x
|
|
sta memR+3
|
|
clc
|
|
_AA:
|
|
lda #0
|
|
_bb:
|
|
adc #0
|
|
sta memR+1
|
|
_BB:
|
|
lda #0
|
|
_CC:
|
|
adc #0
|
|
sta memR+2
|
|
bcc !+
|
|
inc memR+3
|
|
clc
|
|
!:
|
|
_cc:
|
|
lda #0
|
|
adc memR+1
|
|
sta memR+1
|
|
_dd:
|
|
lda #0
|
|
adc memR+2
|
|
sta memR+2
|
|
bcc !+
|
|
inc memR+3
|
|
!:
|
|
// [46] (dword) mulf16u::return#1 ← *((const dword*) mulf16u::memR#0) -- vduz1=_deref_pduc1
|
|
lda memR
|
|
sta.z return
|
|
lda memR+1
|
|
sta.z return+1
|
|
lda memR+2
|
|
sta.z return+2
|
|
lda memR+3
|
|
sta.z return+3
|
|
jmp breturn
|
|
// mulf16u::@return
|
|
breturn:
|
|
// [47] return
|
|
rts
|
|
}
|
|
// mulf_init
|
|
// Initialize the mulf_sqr multiplication tables with f(x)=int(x*x/4)
|
|
mulf_init: {
|
|
.label c = 4
|
|
.label sqr1_hi = 5
|
|
.label sqr = $c
|
|
.label sqr1_lo = 2
|
|
.label sqr2_hi = 9
|
|
.label sqr2_lo = 7
|
|
.label dir = $b
|
|
// [49] phi from mulf_init to mulf_init::@1 [phi:mulf_init->mulf_init::@1]
|
|
b1_from_mulf_init:
|
|
// [49] phi (byte) mulf_init::x_2#3 = (byte) 0 [phi:mulf_init->mulf_init::@1#0] -- vbuxx=vbuc1
|
|
ldx #0
|
|
// [49] phi (byte*) mulf_init::sqr1_hi#2 = (const byte[$200]) mulf_sqr1_hi#0+(byte) 1 [phi:mulf_init->mulf_init::@1#1] -- pbuz1=pbuc1
|
|
lda #<mulf_sqr1_hi+1
|
|
sta.z sqr1_hi
|
|
lda #>mulf_sqr1_hi+1
|
|
sta.z sqr1_hi+1
|
|
// [49] phi (word) mulf_init::sqr#4 = (byte) 0 [phi:mulf_init->mulf_init::@1#2] -- vwuz1=vbuc1
|
|
lda #<0
|
|
sta.z sqr
|
|
lda #>0
|
|
sta.z sqr+1
|
|
// [49] phi (byte) mulf_init::c#2 = (byte) 0 [phi:mulf_init->mulf_init::@1#3] -- vbuz1=vbuc1
|
|
lda #0
|
|
sta.z c
|
|
// [49] phi (byte*) mulf_init::sqr1_lo#2 = (const byte[$200]) mulf_sqr1_lo#0+(byte) 1 [phi:mulf_init->mulf_init::@1#4] -- pbuz1=pbuc1
|
|
lda #<mulf_sqr1_lo+1
|
|
sta.z sqr1_lo
|
|
lda #>mulf_sqr1_lo+1
|
|
sta.z sqr1_lo+1
|
|
jmp b1
|
|
// mulf_init::@1
|
|
b1:
|
|
// [50] if((byte*) mulf_init::sqr1_lo#2!=(const byte[$200]) mulf_sqr1_lo#0+(word) $200) goto mulf_init::@2 -- pbuz1_neq_pbuc1_then_la1
|
|
lda.z sqr1_lo+1
|
|
cmp #>mulf_sqr1_lo+$200
|
|
bne b2
|
|
lda.z sqr1_lo
|
|
cmp #<mulf_sqr1_lo+$200
|
|
bne b2
|
|
// [51] phi from mulf_init::@1 to mulf_init::@5 [phi:mulf_init::@1->mulf_init::@5]
|
|
b5_from_b1:
|
|
// [51] phi (byte) mulf_init::dir#2 = (byte) $ff [phi:mulf_init::@1->mulf_init::@5#0] -- vbuz1=vbuc1
|
|
lda #$ff
|
|
sta.z dir
|
|
// [51] phi (byte*) mulf_init::sqr2_hi#2 = (const byte[$200]) mulf_sqr2_hi#0 [phi:mulf_init::@1->mulf_init::@5#1] -- pbuz1=pbuc1
|
|
lda #<mulf_sqr2_hi
|
|
sta.z sqr2_hi
|
|
lda #>mulf_sqr2_hi
|
|
sta.z sqr2_hi+1
|
|
// [51] phi (byte) mulf_init::x_255#2 = (byte) -1 [phi:mulf_init::@1->mulf_init::@5#2] -- vbuxx=vbuc1
|
|
ldx #-1
|
|
// [51] phi (byte*) mulf_init::sqr2_lo#2 = (const byte[$200]) mulf_sqr2_lo#0 [phi:mulf_init::@1->mulf_init::@5#3] -- pbuz1=pbuc1
|
|
lda #<mulf_sqr2_lo
|
|
sta.z sqr2_lo
|
|
lda #>mulf_sqr2_lo
|
|
sta.z sqr2_lo+1
|
|
jmp b5
|
|
// mulf_init::@5
|
|
b5:
|
|
// [52] if((byte*) mulf_init::sqr2_lo#2!=(const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) goto mulf_init::@6 -- pbuz1_neq_pbuc1_then_la1
|
|
lda.z sqr2_lo+1
|
|
cmp #>mulf_sqr2_lo+$1ff
|
|
bne b6
|
|
lda.z sqr2_lo
|
|
cmp #<mulf_sqr2_lo+$1ff
|
|
bne b6
|
|
jmp b7
|
|
// mulf_init::@7
|
|
b7:
|
|
// [53] *((const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_lo#0+(word) $100) -- _deref_pbuc1=_deref_pbuc2
|
|
// Set the very last value g(511) = f(256)
|
|
lda mulf_sqr1_lo+$100
|
|
sta mulf_sqr2_lo+$1ff
|
|
// [54] *((const byte[$200]) mulf_sqr2_hi#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_hi#0+(word) $100) -- _deref_pbuc1=_deref_pbuc2
|
|
lda mulf_sqr1_hi+$100
|
|
sta mulf_sqr2_hi+$1ff
|
|
jmp breturn
|
|
// mulf_init::@return
|
|
breturn:
|
|
// [55] return
|
|
rts
|
|
// mulf_init::@6
|
|
b6:
|
|
// [56] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[$200]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2) -- _deref_pbuz1=pbuc1_derefidx_vbuxx
|
|
lda mulf_sqr1_lo,x
|
|
ldy #0
|
|
sta (sqr2_lo),y
|
|
// [57] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[$200]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2) -- _deref_pbuz1=pbuc1_derefidx_vbuxx
|
|
lda mulf_sqr1_hi,x
|
|
ldy #0
|
|
sta (sqr2_hi),y
|
|
// [58] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2 -- pbuz1=_inc_pbuz1
|
|
inc.z sqr2_hi
|
|
bne !+
|
|
inc.z sqr2_hi+1
|
|
!:
|
|
// [59] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2 -- vbuxx=vbuxx_plus_vbuz1
|
|
txa
|
|
clc
|
|
adc.z dir
|
|
tax
|
|
// [60] if((byte) mulf_init::x_255#1!=(byte) 0) goto mulf_init::@9 -- vbuxx_neq_0_then_la1
|
|
cpx #0
|
|
bne b9_from_b6
|
|
// [62] phi from mulf_init::@6 to mulf_init::@8 [phi:mulf_init::@6->mulf_init::@8]
|
|
b8_from_b6:
|
|
// [62] phi (byte) mulf_init::dir#4 = (byte) 1 [phi:mulf_init::@6->mulf_init::@8#0] -- vbuz1=vbuc1
|
|
lda #1
|
|
sta.z dir
|
|
jmp b8
|
|
// [61] phi from mulf_init::@6 to mulf_init::@9 [phi:mulf_init::@6->mulf_init::@9]
|
|
b9_from_b6:
|
|
jmp b9
|
|
// mulf_init::@9
|
|
b9:
|
|
// [62] phi from mulf_init::@9 to mulf_init::@8 [phi:mulf_init::@9->mulf_init::@8]
|
|
b8_from_b9:
|
|
// [62] phi (byte) mulf_init::dir#4 = (byte) mulf_init::dir#2 [phi:mulf_init::@9->mulf_init::@8#0] -- register_copy
|
|
jmp b8
|
|
// mulf_init::@8
|
|
b8:
|
|
// [63] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2 -- pbuz1=_inc_pbuz1
|
|
inc.z sqr2_lo
|
|
bne !+
|
|
inc.z sqr2_lo+1
|
|
!:
|
|
// [51] phi from mulf_init::@8 to mulf_init::@5 [phi:mulf_init::@8->mulf_init::@5]
|
|
b5_from_b8:
|
|
// [51] phi (byte) mulf_init::dir#2 = (byte) mulf_init::dir#4 [phi:mulf_init::@8->mulf_init::@5#0] -- register_copy
|
|
// [51] phi (byte*) mulf_init::sqr2_hi#2 = (byte*) mulf_init::sqr2_hi#1 [phi:mulf_init::@8->mulf_init::@5#1] -- register_copy
|
|
// [51] phi (byte) mulf_init::x_255#2 = (byte) mulf_init::x_255#1 [phi:mulf_init::@8->mulf_init::@5#2] -- register_copy
|
|
// [51] phi (byte*) mulf_init::sqr2_lo#2 = (byte*) mulf_init::sqr2_lo#1 [phi:mulf_init::@8->mulf_init::@5#3] -- register_copy
|
|
jmp b5
|
|
// mulf_init::@2
|
|
b2:
|
|
// [64] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2 -- vbuz1=_inc_vbuz1
|
|
inc.z c
|
|
// [65] (byte~) mulf_init::$9 ← (byte) mulf_init::c#1 & (byte) 1 -- vbuaa=vbuz1_band_vbuc1
|
|
lda #1
|
|
and.z c
|
|
// [66] if((byte~) mulf_init::$9!=(byte) 0) goto mulf_init::@3 -- vbuaa_neq_0_then_la1
|
|
cmp #0
|
|
bne b3_from_b2
|
|
jmp b4
|
|
// mulf_init::@4
|
|
b4:
|
|
// [67] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3 -- vbuxx=_inc_vbuxx
|
|
inx
|
|
// [68] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4 -- vwuz1=_inc_vwuz1
|
|
inc.z sqr
|
|
bne !+
|
|
inc.z sqr+1
|
|
!:
|
|
// [69] phi from mulf_init::@2 mulf_init::@4 to mulf_init::@3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3]
|
|
b3_from_b2:
|
|
b3_from_b4:
|
|
// [69] phi (byte) mulf_init::x_2#2 = (byte) mulf_init::x_2#3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#0] -- register_copy
|
|
// [69] phi (word) mulf_init::sqr#3 = (word) mulf_init::sqr#4 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#1] -- register_copy
|
|
jmp b3
|
|
// mulf_init::@3
|
|
b3:
|
|
// [70] (byte~) mulf_init::$12 ← < (word) mulf_init::sqr#3 -- vbuaa=_lo_vwuz1
|
|
lda.z sqr
|
|
// [71] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$12 -- _deref_pbuz1=vbuaa
|
|
ldy #0
|
|
sta (sqr1_lo),y
|
|
// [72] (byte~) mulf_init::$13 ← > (word) mulf_init::sqr#3 -- vbuaa=_hi_vwuz1
|
|
lda.z sqr+1
|
|
// [73] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$13 -- _deref_pbuz1=vbuaa
|
|
ldy #0
|
|
sta (sqr1_hi),y
|
|
// [74] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2 -- pbuz1=_inc_pbuz1
|
|
inc.z sqr1_hi
|
|
bne !+
|
|
inc.z sqr1_hi+1
|
|
!:
|
|
// [75] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2 -- vwuz1=vwuz1_plus_vbuxx
|
|
txa
|
|
clc
|
|
adc.z sqr
|
|
sta.z sqr
|
|
bcc !+
|
|
inc.z sqr+1
|
|
!:
|
|
// [76] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2 -- pbuz1=_inc_pbuz1
|
|
inc.z sqr1_lo
|
|
bne !+
|
|
inc.z sqr1_lo+1
|
|
!:
|
|
// [49] phi from mulf_init::@3 to mulf_init::@1 [phi:mulf_init::@3->mulf_init::@1]
|
|
b1_from_b3:
|
|
// [49] phi (byte) mulf_init::x_2#3 = (byte) mulf_init::x_2#2 [phi:mulf_init::@3->mulf_init::@1#0] -- register_copy
|
|
// [49] phi (byte*) mulf_init::sqr1_hi#2 = (byte*) mulf_init::sqr1_hi#1 [phi:mulf_init::@3->mulf_init::@1#1] -- register_copy
|
|
// [49] phi (word) mulf_init::sqr#4 = (word) mulf_init::sqr#1 [phi:mulf_init::@3->mulf_init::@1#2] -- register_copy
|
|
// [49] phi (byte) mulf_init::c#2 = (byte) mulf_init::c#1 [phi:mulf_init::@3->mulf_init::@1#3] -- register_copy
|
|
// [49] phi (byte*) mulf_init::sqr1_lo#2 = (byte*) mulf_init::sqr1_lo#1 [phi:mulf_init::@3->mulf_init::@1#4] -- register_copy
|
|
jmp b1
|
|
}
|
|
// File Data
|
|
print_hextab: .text "0123456789abcdef"
|
|
// mulf_sqr tables will contain f(x)=int(x*x/4) and g(x) = f(x-255).
|
|
// <f(x) = <(( x * x )/4)
|
|
.align $100
|
|
mulf_sqr1_lo: .fill $200, 0
|
|
// >f(x) = >(( x * x )/4)
|
|
.align $100
|
|
mulf_sqr1_hi: .fill $200, 0
|
|
// <g(x) = <((( x - 255) * ( x - 255 ))/4)
|
|
.align $100
|
|
mulf_sqr2_lo: .fill $200, 0
|
|
// >g(x) = >((( x - 255) * ( x - 255 ))/4)
|
|
.align $100
|
|
mulf_sqr2_hi: .fill $200, 0
|
|
|
|
ASSEMBLER OPTIMIZATIONS
|
|
Removing instruction jmp b1
|
|
Removing instruction jmp bend
|
|
Removing instruction jmp b4
|
|
Removing instruction jmp b1
|
|
Removing instruction jmp b2
|
|
Removing instruction jmp b3
|
|
Removing instruction jmp b5
|
|
Removing instruction jmp b6
|
|
Removing instruction jmp breturn
|
|
Removing instruction jmp b1
|
|
Removing instruction jmp breturn
|
|
Removing instruction jmp b1
|
|
Removing instruction jmp breturn
|
|
Removing instruction jmp b1
|
|
Removing instruction jmp breturn
|
|
Removing instruction jmp breturn
|
|
Removing instruction jmp breturn
|
|
Removing instruction jmp b1
|
|
Removing instruction jmp b5
|
|
Removing instruction jmp b7
|
|
Removing instruction jmp breturn
|
|
Removing instruction jmp b9
|
|
Removing instruction jmp b8
|
|
Removing instruction jmp b4
|
|
Removing instruction jmp b3
|
|
Succesful ASM optimization Pass5NextJumpElimination
|
|
Replacing instruction lda #<0 with TXA
|
|
Removing instruction lda #>0
|
|
Removing instruction lda #0
|
|
Removing instruction ldy #0
|
|
Removing instruction ldy #0
|
|
Succesful ASM optimization Pass5UnnecesaryLoadElimination
|
|
Replacing label b1 with b2
|
|
Replacing label b9_from_b6 with b8
|
|
Replacing label b3_from_b2 with b3
|
|
Removing instruction b1_from_bbegin:
|
|
Removing instruction b1:
|
|
Removing instruction main_from_b1:
|
|
Removing instruction bend_from_b1:
|
|
Removing instruction b1:
|
|
Removing instruction b6_from_b5:
|
|
Removing instruction print_set_screen_from_b6:
|
|
Removing instruction b9_from_b6:
|
|
Removing instruction b9:
|
|
Removing instruction b8_from_b9:
|
|
Removing instruction b3_from_b2:
|
|
Removing instruction b3_from_b4:
|
|
Succesful ASM optimization Pass5RedundantLabelElimination
|
|
Removing instruction bend:
|
|
Removing instruction mulf_init_from_main:
|
|
Removing instruction b4:
|
|
Removing instruction b1_from_b4:
|
|
Removing instruction b3:
|
|
Removing instruction b5:
|
|
Removing instruction b6:
|
|
Removing instruction b1_from_b6:
|
|
Removing instruction breturn:
|
|
Removing instruction print_word_from_print_dword:
|
|
Removing instruction b1:
|
|
Removing instruction print_word_from_b1:
|
|
Removing instruction breturn:
|
|
Removing instruction print_byte_from_print_word:
|
|
Removing instruction b1:
|
|
Removing instruction print_byte_from_b1:
|
|
Removing instruction breturn:
|
|
Removing instruction print_char_from_print_byte:
|
|
Removing instruction b1:
|
|
Removing instruction print_char_from_b1:
|
|
Removing instruction breturn:
|
|
Removing instruction breturn:
|
|
Removing instruction breturn:
|
|
Removing instruction b1_from_mulf_init:
|
|
Removing instruction b5_from_b1:
|
|
Removing instruction b7:
|
|
Removing instruction breturn:
|
|
Removing instruction b8_from_b6:
|
|
Removing instruction b5_from_b8:
|
|
Removing instruction b4:
|
|
Removing instruction b1_from_b3:
|
|
Succesful ASM optimization Pass5UnusedLabelElimination
|
|
Updating BasicUpstart to call main directly
|
|
Removing instruction jsr main
|
|
Succesful ASM optimization Pass5SkipBegin
|
|
Removing instruction jmp b8
|
|
Succesful ASM optimization Pass5NextJumpElimination
|
|
Removing instruction bbegin:
|
|
Succesful ASM optimization Pass5UnusedLabelElimination
|
|
|
|
FINAL SYMBOL TABLE
|
|
(label) @1
|
|
(label) @begin
|
|
(label) @end
|
|
(byte*) BORDERCOL
|
|
(const byte*) BORDERCOL#0 BORDERCOL = (byte*) 53280
|
|
(const byte) RADIX::BINARY BINARY = (number) 2
|
|
(const byte) RADIX::DECIMAL DECIMAL = (number) $a
|
|
(const byte) RADIX::HEXADECIMAL HEXADECIMAL = (number) $10
|
|
(const byte) RADIX::OCTAL OCTAL = (number) 8
|
|
(byte*) RASTER
|
|
(const byte*) RASTER#0 RASTER = (byte*) 53266
|
|
(byte*) SCREEN
|
|
(const byte*) SCREEN#0 SCREEN = (byte*) 1024
|
|
(void()) main()
|
|
(label) main::@1
|
|
(label) main::@2
|
|
(label) main::@3
|
|
(label) main::@4
|
|
(label) main::@5
|
|
(label) main::@6
|
|
(word) main::a
|
|
(const word) main::a#0 a = (word) $4d2
|
|
(word) main::b
|
|
(const word) main::b#0 b = (word) $929
|
|
(dword) main::r
|
|
(dword) main::r#0 r zp ZP_DWORD:14 11.0
|
|
(dword()) mulf16u((word) mulf16u::a , (word) mulf16u::b)
|
|
(label) mulf16u::@return
|
|
(word) mulf16u::a
|
|
(word) mulf16u::b
|
|
(word*) mulf16u::memA
|
|
(const word*) mulf16u::memA#0 memA = (word*) 248
|
|
(word*) mulf16u::memB
|
|
(const word*) mulf16u::memB#0 memB = (word*) 250
|
|
(dword*) mulf16u::memR
|
|
(const dword*) mulf16u::memR#0 memR = (dword*) 252
|
|
(dword) mulf16u::return
|
|
(dword) mulf16u::return#0 return zp ZP_DWORD:14 22.0
|
|
(dword) mulf16u::return#1 return zp ZP_DWORD:14 4.333333333333333
|
|
(void()) mulf_init()
|
|
(byte~) mulf_init::$12 reg byte a 22.0
|
|
(byte~) mulf_init::$13 reg byte a 22.0
|
|
(byte~) mulf_init::$9 reg byte a 22.0
|
|
(label) mulf_init::@1
|
|
(label) mulf_init::@2
|
|
(label) mulf_init::@3
|
|
(label) mulf_init::@4
|
|
(label) mulf_init::@5
|
|
(label) mulf_init::@6
|
|
(label) mulf_init::@7
|
|
(label) mulf_init::@8
|
|
(label) mulf_init::@9
|
|
(label) mulf_init::@return
|
|
(byte) mulf_init::c
|
|
(byte) mulf_init::c#1 c zp ZP_BYTE:4 2.5384615384615383
|
|
(byte) mulf_init::c#2 c zp ZP_BYTE:4 11.0
|
|
(byte) mulf_init::dir
|
|
(byte) mulf_init::dir#2 dir zp ZP_BYTE:11 4.125
|
|
(byte) mulf_init::dir#4 dir zp ZP_BYTE:11 11.0
|
|
(word) mulf_init::sqr
|
|
(word) mulf_init::sqr#1 sqr zp ZP_WORD:12 11.0
|
|
(word) mulf_init::sqr#2 sqr zp ZP_WORD:12 22.0
|
|
(word) mulf_init::sqr#3 sqr zp ZP_WORD:12 9.166666666666666
|
|
(word) mulf_init::sqr#4 sqr zp ZP_WORD:12 5.5
|
|
(byte*) mulf_init::sqr1_hi
|
|
(byte*) mulf_init::sqr1_hi#1 sqr1_hi zp ZP_WORD:5 7.333333333333333
|
|
(byte*) mulf_init::sqr1_hi#2 sqr1_hi zp ZP_WORD:5 2.75
|
|
(byte*) mulf_init::sqr1_lo
|
|
(byte*) mulf_init::sqr1_lo#1 sqr1_lo zp ZP_WORD:2 22.0
|
|
(byte*) mulf_init::sqr1_lo#2 sqr1_lo zp ZP_WORD:2 3.142857142857143
|
|
(byte*) mulf_init::sqr2_hi
|
|
(byte*) mulf_init::sqr2_hi#1 sqr2_hi zp ZP_WORD:9 3.6666666666666665
|
|
(byte*) mulf_init::sqr2_hi#2 sqr2_hi zp ZP_WORD:9 8.25
|
|
(byte*) mulf_init::sqr2_lo
|
|
(byte*) mulf_init::sqr2_lo#1 sqr2_lo zp ZP_WORD:7 22.0
|
|
(byte*) mulf_init::sqr2_lo#2 sqr2_lo zp ZP_WORD:7 4.888888888888889
|
|
(byte) mulf_init::x_2
|
|
(byte) mulf_init::x_2#1 reg byte x 11.0
|
|
(byte) mulf_init::x_2#2 reg byte x 5.5
|
|
(byte) mulf_init::x_2#3 reg byte x 6.6000000000000005
|
|
(byte) mulf_init::x_255
|
|
(byte) mulf_init::x_255#1 reg byte x 6.6000000000000005
|
|
(byte) mulf_init::x_255#2 reg byte x 8.8
|
|
(byte[$200]) mulf_sqr1_hi
|
|
(const byte[$200]) mulf_sqr1_hi#0 mulf_sqr1_hi = { fill( $200, 0) }
|
|
(byte[$200]) mulf_sqr1_lo
|
|
(const byte[$200]) mulf_sqr1_lo#0 mulf_sqr1_lo = { fill( $200, 0) }
|
|
(byte[$200]) mulf_sqr2_hi
|
|
(const byte[$200]) mulf_sqr2_hi#0 mulf_sqr2_hi = { fill( $200, 0) }
|
|
(byte[$200]) mulf_sqr2_lo
|
|
(const byte[$200]) mulf_sqr2_lo#0 mulf_sqr2_lo = { fill( $200, 0) }
|
|
(void()) print_byte((byte) print_byte::b)
|
|
(byte~) print_byte::$0 reg byte a 4.0
|
|
(byte~) print_byte::$2 reg byte x 4.0
|
|
(label) print_byte::@1
|
|
(label) print_byte::@return
|
|
(byte) print_byte::b
|
|
(byte) print_byte::b#0 reg byte x 4.0
|
|
(byte) print_byte::b#1 reg byte x 4.0
|
|
(byte) print_byte::b#2 reg byte x 2.0
|
|
(void()) print_char((byte) print_char::ch)
|
|
(label) print_char::@return
|
|
(byte) print_char::ch
|
|
(byte) print_char::ch#0 reg byte a 4.0
|
|
(byte) print_char::ch#1 reg byte a 4.0
|
|
(byte) print_char::ch#2 reg byte a 6.0
|
|
(byte*) print_char_cursor
|
|
(byte*) print_char_cursor#10 print_char_cursor zp ZP_WORD:5 0.6153846153846154
|
|
(byte*) print_char_cursor#16 print_char_cursor zp ZP_WORD:5 0.2222222222222222
|
|
(byte*) print_char_cursor#27 print_char_cursor zp ZP_WORD:5 4.0
|
|
(byte*) print_char_cursor#34 print_char_cursor zp ZP_WORD:5 3.0
|
|
(byte*) print_char_cursor#36 print_char_cursor zp ZP_WORD:5 2.0
|
|
(void()) print_dword((dword) print_dword::dw)
|
|
(label) print_dword::@1
|
|
(label) print_dword::@return
|
|
(dword) print_dword::dw
|
|
(dword) print_dword::dw#0 dw zp ZP_DWORD:14 5.0
|
|
(byte[]) print_hextab
|
|
(const byte[]) print_hextab#0 print_hextab = (string) "0123456789abcdef"z
|
|
(byte*) print_line_cursor
|
|
(byte*) print_screen
|
|
(void()) print_set_screen((byte*) print_set_screen::screen)
|
|
(label) print_set_screen::@return
|
|
(byte*) print_set_screen::screen
|
|
(void()) print_word((word) print_word::w)
|
|
(label) print_word::@1
|
|
(label) print_word::@return
|
|
(word) print_word::w
|
|
(word) print_word::w#0 w zp ZP_WORD:2 4.0
|
|
(word) print_word::w#1 w zp ZP_WORD:2 4.0
|
|
(word) print_word::w#2 w zp ZP_WORD:2 2.6666666666666665
|
|
|
|
reg byte x [ print_byte::b#2 print_byte::b#0 print_byte::b#1 ]
|
|
reg byte a [ print_char::ch#2 print_char::ch#0 print_char::ch#1 ]
|
|
zp ZP_WORD:2 [ mulf_init::sqr1_lo#2 mulf_init::sqr1_lo#1 print_word::w#2 print_word::w#0 print_word::w#1 ]
|
|
zp ZP_BYTE:4 [ mulf_init::c#2 mulf_init::c#1 ]
|
|
zp ZP_WORD:5 [ mulf_init::sqr1_hi#2 mulf_init::sqr1_hi#1 print_char_cursor#27 print_char_cursor#36 print_char_cursor#34 print_char_cursor#16 print_char_cursor#10 ]
|
|
reg byte x [ mulf_init::x_2#3 mulf_init::x_2#2 mulf_init::x_2#1 ]
|
|
zp ZP_WORD:7 [ mulf_init::sqr2_lo#2 mulf_init::sqr2_lo#1 ]
|
|
reg byte x [ mulf_init::x_255#2 mulf_init::x_255#1 ]
|
|
zp ZP_WORD:9 [ mulf_init::sqr2_hi#2 mulf_init::sqr2_hi#1 ]
|
|
zp ZP_BYTE:11 [ mulf_init::dir#2 mulf_init::dir#4 ]
|
|
zp ZP_WORD:12 [ mulf_init::sqr#3 mulf_init::sqr#4 mulf_init::sqr#1 mulf_init::sqr#2 ]
|
|
zp ZP_DWORD:14 [ mulf16u::return#0 main::r#0 mulf16u::return#1 print_dword::dw#0 ]
|
|
reg byte a [ print_byte::$0 ]
|
|
reg byte x [ print_byte::$2 ]
|
|
reg byte a [ mulf_init::$9 ]
|
|
reg byte a [ mulf_init::$12 ]
|
|
reg byte a [ mulf_init::$13 ]
|
|
|
|
|
|
FINAL ASSEMBLER
|
|
Score: 4351
|
|
|
|
// File Comments
|
|
// Upstart
|
|
.pc = $801 "Basic"
|
|
:BasicUpstart(main)
|
|
.pc = $80d "Program"
|
|
// Global Constants & labels
|
|
.label RASTER = $d012
|
|
.label BORDERCOL = $d020
|
|
.label SCREEN = $400
|
|
.label print_char_cursor = 5
|
|
// @begin
|
|
// [1] phi from @begin to @1 [phi:@begin->@1]
|
|
// @1
|
|
// [2] call main
|
|
// [4] phi from @1 to main [phi:@1->main]
|
|
// [3] phi from @1 to @end [phi:@1->@end]
|
|
// @end
|
|
// main
|
|
main: {
|
|
.label a = $4d2
|
|
.label b = $929
|
|
.label r = $e
|
|
// mulf_init()
|
|
// [5] call mulf_init
|
|
// [48] phi from main to mulf_init [phi:main->mulf_init]
|
|
jsr mulf_init
|
|
// main::@4
|
|
// asm
|
|
// asm { sei }
|
|
sei
|
|
// [7] phi from main::@4 to main::@1 [phi:main::@4->main::@1]
|
|
// [7] phi (byte*) print_char_cursor#16 = (byte*) 1024 [phi:main::@4->main::@1#0] -- pbuz1=pbuc1
|
|
lda #<$400
|
|
sta.z print_char_cursor
|
|
lda #>$400
|
|
sta.z print_char_cursor+1
|
|
// main::@1
|
|
// main::@2
|
|
b2:
|
|
// while(*RASTER!=$ff)
|
|
// [8] if(*((const byte*) RASTER#0)!=(byte) $ff) goto main::@2 -- _deref_pbuc1_neq_vbuc2_then_la1
|
|
lda #$ff
|
|
cmp RASTER
|
|
bne b2
|
|
// main::@3
|
|
// (*BORDERCOL)++;
|
|
// [9] *((const byte*) BORDERCOL#0) ← ++ *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_inc__deref_pbuc1
|
|
inc BORDERCOL
|
|
// mulf16u(a, b)
|
|
// [10] call mulf16u
|
|
jsr mulf16u
|
|
// [11] (dword) mulf16u::return#0 ← (dword) mulf16u::return#1
|
|
// main::@5
|
|
// r = mulf16u(a, b)
|
|
// [12] (dword) main::r#0 ← (dword) mulf16u::return#0
|
|
// (*BORDERCOL)--;
|
|
// [13] *((const byte*) BORDERCOL#0) ← -- *((const byte*) BORDERCOL#0) -- _deref_pbuc1=_dec__deref_pbuc1
|
|
dec BORDERCOL
|
|
// print_dword(r)
|
|
// [14] (dword) print_dword::dw#0 ← (dword) main::r#0
|
|
// [15] call print_dword
|
|
jsr print_dword
|
|
// [16] phi from main::@5 to main::@6 [phi:main::@5->main::@6]
|
|
// main::@6
|
|
// print_set_screen(SCREEN)
|
|
// [17] call print_set_screen
|
|
// [18] phi from main::@6 to print_set_screen [phi:main::@6->print_set_screen]
|
|
jsr print_set_screen
|
|
// [7] phi from main::@6 to main::@1 [phi:main::@6->main::@1]
|
|
// [7] phi (byte*) print_char_cursor#16 = (const byte*) SCREEN#0 [phi:main::@6->main::@1#0] -- pbuz1=pbuc1
|
|
lda #<SCREEN
|
|
sta.z print_char_cursor
|
|
lda #>SCREEN
|
|
sta.z print_char_cursor+1
|
|
jmp b2
|
|
}
|
|
// print_set_screen
|
|
// Set the screen to print on. Also resets current line/char cursor.
|
|
print_set_screen: {
|
|
// print_set_screen::@return
|
|
// }
|
|
// [19] return
|
|
rts
|
|
}
|
|
// print_dword
|
|
// Print a dword as HEX
|
|
// print_dword(dword zeropage($e) dw)
|
|
print_dword: {
|
|
.label dw = $e
|
|
// print_word(>dw)
|
|
// [20] (word) print_word::w#0 ← > (dword) print_dword::dw#0 -- vwuz1=_hi_vduz2
|
|
lda.z dw+2
|
|
sta.z print_word.w
|
|
lda.z dw+3
|
|
sta.z print_word.w+1
|
|
// [21] call print_word
|
|
// [25] phi from print_dword to print_word [phi:print_dword->print_word]
|
|
// [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#16 [phi:print_dword->print_word#0] -- register_copy
|
|
// [25] phi (word) print_word::w#2 = (word) print_word::w#0 [phi:print_dword->print_word#1] -- register_copy
|
|
jsr print_word
|
|
// print_dword::@1
|
|
// print_word(<dw)
|
|
// [22] (word) print_word::w#1 ← < (dword) print_dword::dw#0 -- vwuz1=_lo_vduz2
|
|
lda.z dw
|
|
sta.z print_word.w
|
|
lda.z dw+1
|
|
sta.z print_word.w+1
|
|
// [23] call print_word
|
|
// [25] phi from print_dword::@1 to print_word [phi:print_dword::@1->print_word]
|
|
// [25] phi (byte*) print_char_cursor#34 = (byte*) print_char_cursor#10 [phi:print_dword::@1->print_word#0] -- register_copy
|
|
// [25] phi (word) print_word::w#2 = (word) print_word::w#1 [phi:print_dword::@1->print_word#1] -- register_copy
|
|
jsr print_word
|
|
// print_dword::@return
|
|
// }
|
|
// [24] return
|
|
rts
|
|
}
|
|
// print_word
|
|
// Print a word as HEX
|
|
// print_word(word zeropage(2) w)
|
|
print_word: {
|
|
.label w = 2
|
|
// print_byte(>w)
|
|
// [26] (byte) print_byte::b#0 ← > (word) print_word::w#2 -- vbuxx=_hi_vwuz1
|
|
lda.z w+1
|
|
tax
|
|
// [27] call print_byte
|
|
// [31] phi from print_word to print_byte [phi:print_word->print_byte]
|
|
// [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#34 [phi:print_word->print_byte#0] -- register_copy
|
|
// [31] phi (byte) print_byte::b#2 = (byte) print_byte::b#0 [phi:print_word->print_byte#1] -- register_copy
|
|
jsr print_byte
|
|
// print_word::@1
|
|
// print_byte(<w)
|
|
// [28] (byte) print_byte::b#1 ← < (word) print_word::w#2 -- vbuxx=_lo_vwuz1
|
|
lda.z w
|
|
tax
|
|
// [29] call print_byte
|
|
// [31] phi from print_word::@1 to print_byte [phi:print_word::@1->print_byte]
|
|
// [31] phi (byte*) print_char_cursor#36 = (byte*) print_char_cursor#10 [phi:print_word::@1->print_byte#0] -- register_copy
|
|
// [31] phi (byte) print_byte::b#2 = (byte) print_byte::b#1 [phi:print_word::@1->print_byte#1] -- register_copy
|
|
jsr print_byte
|
|
// print_word::@return
|
|
// }
|
|
// [30] return
|
|
rts
|
|
}
|
|
// print_byte
|
|
// Print a byte as HEX
|
|
// print_byte(byte register(X) b)
|
|
print_byte: {
|
|
// b>>4
|
|
// [32] (byte~) print_byte::$0 ← (byte) print_byte::b#2 >> (byte) 4 -- vbuaa=vbuxx_ror_4
|
|
txa
|
|
lsr
|
|
lsr
|
|
lsr
|
|
lsr
|
|
// print_char(print_hextab[b>>4])
|
|
// [33] (byte) print_char::ch#0 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$0) -- vbuaa=pbuc1_derefidx_vbuaa
|
|
tay
|
|
lda print_hextab,y
|
|
// [34] call print_char
|
|
// [39] phi from print_byte to print_char [phi:print_byte->print_char]
|
|
// [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#36 [phi:print_byte->print_char#0] -- register_copy
|
|
// [39] phi (byte) print_char::ch#2 = (byte) print_char::ch#0 [phi:print_byte->print_char#1] -- register_copy
|
|
jsr print_char
|
|
// print_byte::@1
|
|
// b&$f
|
|
// [35] (byte~) print_byte::$2 ← (byte) print_byte::b#2 & (byte) $f -- vbuxx=vbuxx_band_vbuc1
|
|
lda #$f
|
|
axs #0
|
|
// print_char(print_hextab[b&$f])
|
|
// [36] (byte) print_char::ch#1 ← *((const byte[]) print_hextab#0 + (byte~) print_byte::$2) -- vbuaa=pbuc1_derefidx_vbuxx
|
|
lda print_hextab,x
|
|
// [37] call print_char
|
|
// [39] phi from print_byte::@1 to print_char [phi:print_byte::@1->print_char]
|
|
// [39] phi (byte*) print_char_cursor#27 = (byte*) print_char_cursor#10 [phi:print_byte::@1->print_char#0] -- register_copy
|
|
// [39] phi (byte) print_char::ch#2 = (byte) print_char::ch#1 [phi:print_byte::@1->print_char#1] -- register_copy
|
|
jsr print_char
|
|
// print_byte::@return
|
|
// }
|
|
// [38] return
|
|
rts
|
|
}
|
|
// print_char
|
|
// Print a single char
|
|
// print_char(byte register(A) ch)
|
|
print_char: {
|
|
// *(print_char_cursor++) = ch
|
|
// [40] *((byte*) print_char_cursor#27) ← (byte) print_char::ch#2 -- _deref_pbuz1=vbuaa
|
|
ldy #0
|
|
sta (print_char_cursor),y
|
|
// *(print_char_cursor++) = ch;
|
|
// [41] (byte*) print_char_cursor#10 ← ++ (byte*) print_char_cursor#27 -- pbuz1=_inc_pbuz1
|
|
inc.z print_char_cursor
|
|
bne !+
|
|
inc.z print_char_cursor+1
|
|
!:
|
|
// print_char::@return
|
|
// }
|
|
// [42] return
|
|
rts
|
|
}
|
|
// mulf16u
|
|
// Fast multiply two unsigned words to a double word result
|
|
// Done in assembler to utilize fast addition A+X
|
|
mulf16u: {
|
|
.label memA = $f8
|
|
.label memB = $fa
|
|
.label memR = $fc
|
|
.label return = $e
|
|
// *memA = a
|
|
// [43] *((const word*) mulf16u::memA#0) ← (const word) main::a#0 -- _deref_pwuc1=vwuc2
|
|
lda #<main.a
|
|
sta memA
|
|
lda #>main.a
|
|
sta memA+1
|
|
// *memB = b
|
|
// [44] *((const word*) mulf16u::memB#0) ← (const word) main::b#0 -- _deref_pwuc1=vwuc2
|
|
lda #<main.b
|
|
sta memB
|
|
lda #>main.b
|
|
sta memB+1
|
|
// asm
|
|
// asm { ldamemA stasm1a+1 stasm3a+1 stasm5a+1 stasm7a+1 eor#$ff stasm2a+1 stasm4a+1 stasm6a+1 stasm8a+1 ldamemA+1 stasm1b+1 stasm3b+1 stasm5b+1 stasm7b+1 eor#$ff stasm2b+1 stasm4b+1 stasm6b+1 stasm8b+1 ldxmemB sec sm1a: ldamulf_sqr1_lo,x sm2a: sbcmulf_sqr2_lo,x stamemR+0 sm3a: ldamulf_sqr1_hi,x sm4a: sbcmulf_sqr2_hi,x sta_AA+1 sec sm1b: ldamulf_sqr1_lo,x sm2b: sbcmulf_sqr2_lo,x sta_cc+1 sm3b: ldamulf_sqr1_hi,x sm4b: sbcmulf_sqr2_hi,x sta_CC+1 ldxmemB+1 sec sm5a: ldamulf_sqr1_lo,x sm6a: sbcmulf_sqr2_lo,x sta_bb+1 sm7a: ldamulf_sqr1_hi,x sm8a: sbcmulf_sqr2_hi,x sta_BB+1 sec sm5b: ldamulf_sqr1_lo,x sm6b: sbcmulf_sqr2_lo,x sta_dd+1 sm7b: ldamulf_sqr1_hi,x sm8b: sbcmulf_sqr2_hi,x stamemR+3 clc _AA: lda#0 _bb: adc#0 stamemR+1 _BB: lda#0 _CC: adc#0 stamemR+2 bcc!+ incmemR+3 clc !: _cc: lda#0 adcmemR+1 stamemR+1 _dd: lda#0 adcmemR+2 stamemR+2 bcc!+ incmemR+3 !: }
|
|
lda memA
|
|
sta sm1a+1
|
|
sta sm3a+1
|
|
sta sm5a+1
|
|
sta sm7a+1
|
|
eor #$ff
|
|
sta sm2a+1
|
|
sta sm4a+1
|
|
sta sm6a+1
|
|
sta sm8a+1
|
|
lda memA+1
|
|
sta sm1b+1
|
|
sta sm3b+1
|
|
sta sm5b+1
|
|
sta sm7b+1
|
|
eor #$ff
|
|
sta sm2b+1
|
|
sta sm4b+1
|
|
sta sm6b+1
|
|
sta sm8b+1
|
|
ldx memB
|
|
sec
|
|
sm1a:
|
|
lda mulf_sqr1_lo,x
|
|
sm2a:
|
|
sbc mulf_sqr2_lo,x
|
|
sta memR+0
|
|
sm3a:
|
|
lda mulf_sqr1_hi,x
|
|
sm4a:
|
|
sbc mulf_sqr2_hi,x
|
|
sta _AA+1
|
|
sec
|
|
sm1b:
|
|
lda mulf_sqr1_lo,x
|
|
sm2b:
|
|
sbc mulf_sqr2_lo,x
|
|
sta _cc+1
|
|
sm3b:
|
|
lda mulf_sqr1_hi,x
|
|
sm4b:
|
|
sbc mulf_sqr2_hi,x
|
|
sta _CC+1
|
|
ldx memB+1
|
|
sec
|
|
sm5a:
|
|
lda mulf_sqr1_lo,x
|
|
sm6a:
|
|
sbc mulf_sqr2_lo,x
|
|
sta _bb+1
|
|
sm7a:
|
|
lda mulf_sqr1_hi,x
|
|
sm8a:
|
|
sbc mulf_sqr2_hi,x
|
|
sta _BB+1
|
|
sec
|
|
sm5b:
|
|
lda mulf_sqr1_lo,x
|
|
sm6b:
|
|
sbc mulf_sqr2_lo,x
|
|
sta _dd+1
|
|
sm7b:
|
|
lda mulf_sqr1_hi,x
|
|
sm8b:
|
|
sbc mulf_sqr2_hi,x
|
|
sta memR+3
|
|
clc
|
|
_AA:
|
|
lda #0
|
|
_bb:
|
|
adc #0
|
|
sta memR+1
|
|
_BB:
|
|
lda #0
|
|
_CC:
|
|
adc #0
|
|
sta memR+2
|
|
bcc !+
|
|
inc memR+3
|
|
clc
|
|
!:
|
|
_cc:
|
|
lda #0
|
|
adc memR+1
|
|
sta memR+1
|
|
_dd:
|
|
lda #0
|
|
adc memR+2
|
|
sta memR+2
|
|
bcc !+
|
|
inc memR+3
|
|
!:
|
|
// return *memR;
|
|
// [46] (dword) mulf16u::return#1 ← *((const dword*) mulf16u::memR#0) -- vduz1=_deref_pduc1
|
|
lda memR
|
|
sta.z return
|
|
lda memR+1
|
|
sta.z return+1
|
|
lda memR+2
|
|
sta.z return+2
|
|
lda memR+3
|
|
sta.z return+3
|
|
// mulf16u::@return
|
|
// }
|
|
// [47] return
|
|
rts
|
|
}
|
|
// mulf_init
|
|
// Initialize the mulf_sqr multiplication tables with f(x)=int(x*x/4)
|
|
mulf_init: {
|
|
.label c = 4
|
|
.label sqr1_hi = 5
|
|
.label sqr = $c
|
|
.label sqr1_lo = 2
|
|
.label sqr2_hi = 9
|
|
.label sqr2_lo = 7
|
|
.label dir = $b
|
|
// [49] phi from mulf_init to mulf_init::@1 [phi:mulf_init->mulf_init::@1]
|
|
// [49] phi (byte) mulf_init::x_2#3 = (byte) 0 [phi:mulf_init->mulf_init::@1#0] -- vbuxx=vbuc1
|
|
ldx #0
|
|
// [49] phi (byte*) mulf_init::sqr1_hi#2 = (const byte[$200]) mulf_sqr1_hi#0+(byte) 1 [phi:mulf_init->mulf_init::@1#1] -- pbuz1=pbuc1
|
|
lda #<mulf_sqr1_hi+1
|
|
sta.z sqr1_hi
|
|
lda #>mulf_sqr1_hi+1
|
|
sta.z sqr1_hi+1
|
|
// [49] phi (word) mulf_init::sqr#4 = (byte) 0 [phi:mulf_init->mulf_init::@1#2] -- vwuz1=vbuc1
|
|
txa
|
|
sta.z sqr
|
|
sta.z sqr+1
|
|
// [49] phi (byte) mulf_init::c#2 = (byte) 0 [phi:mulf_init->mulf_init::@1#3] -- vbuz1=vbuc1
|
|
sta.z c
|
|
// [49] phi (byte*) mulf_init::sqr1_lo#2 = (const byte[$200]) mulf_sqr1_lo#0+(byte) 1 [phi:mulf_init->mulf_init::@1#4] -- pbuz1=pbuc1
|
|
lda #<mulf_sqr1_lo+1
|
|
sta.z sqr1_lo
|
|
lda #>mulf_sqr1_lo+1
|
|
sta.z sqr1_lo+1
|
|
// mulf_init::@1
|
|
b1:
|
|
// for(byte* sqr1_lo = mulf_sqr1_lo+1; sqr1_lo!=mulf_sqr1_lo+512; sqr1_lo++)
|
|
// [50] if((byte*) mulf_init::sqr1_lo#2!=(const byte[$200]) mulf_sqr1_lo#0+(word) $200) goto mulf_init::@2 -- pbuz1_neq_pbuc1_then_la1
|
|
lda.z sqr1_lo+1
|
|
cmp #>mulf_sqr1_lo+$200
|
|
bne b2
|
|
lda.z sqr1_lo
|
|
cmp #<mulf_sqr1_lo+$200
|
|
bne b2
|
|
// [51] phi from mulf_init::@1 to mulf_init::@5 [phi:mulf_init::@1->mulf_init::@5]
|
|
// [51] phi (byte) mulf_init::dir#2 = (byte) $ff [phi:mulf_init::@1->mulf_init::@5#0] -- vbuz1=vbuc1
|
|
lda #$ff
|
|
sta.z dir
|
|
// [51] phi (byte*) mulf_init::sqr2_hi#2 = (const byte[$200]) mulf_sqr2_hi#0 [phi:mulf_init::@1->mulf_init::@5#1] -- pbuz1=pbuc1
|
|
lda #<mulf_sqr2_hi
|
|
sta.z sqr2_hi
|
|
lda #>mulf_sqr2_hi
|
|
sta.z sqr2_hi+1
|
|
// [51] phi (byte) mulf_init::x_255#2 = (byte) -1 [phi:mulf_init::@1->mulf_init::@5#2] -- vbuxx=vbuc1
|
|
ldx #-1
|
|
// [51] phi (byte*) mulf_init::sqr2_lo#2 = (const byte[$200]) mulf_sqr2_lo#0 [phi:mulf_init::@1->mulf_init::@5#3] -- pbuz1=pbuc1
|
|
lda #<mulf_sqr2_lo
|
|
sta.z sqr2_lo
|
|
lda #>mulf_sqr2_lo
|
|
sta.z sqr2_lo+1
|
|
// mulf_init::@5
|
|
b5:
|
|
// for(byte* sqr2_lo = mulf_sqr2_lo; sqr2_lo!=mulf_sqr2_lo+511; sqr2_lo++)
|
|
// [52] if((byte*) mulf_init::sqr2_lo#2!=(const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) goto mulf_init::@6 -- pbuz1_neq_pbuc1_then_la1
|
|
lda.z sqr2_lo+1
|
|
cmp #>mulf_sqr2_lo+$1ff
|
|
bne b6
|
|
lda.z sqr2_lo
|
|
cmp #<mulf_sqr2_lo+$1ff
|
|
bne b6
|
|
// mulf_init::@7
|
|
// *(mulf_sqr2_lo+511) = *(mulf_sqr1_lo+256)
|
|
// [53] *((const byte[$200]) mulf_sqr2_lo#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_lo#0+(word) $100) -- _deref_pbuc1=_deref_pbuc2
|
|
// Set the very last value g(511) = f(256)
|
|
lda mulf_sqr1_lo+$100
|
|
sta mulf_sqr2_lo+$1ff
|
|
// *(mulf_sqr2_hi+511) = *(mulf_sqr1_hi+256)
|
|
// [54] *((const byte[$200]) mulf_sqr2_hi#0+(word) $1ff) ← *((const byte[$200]) mulf_sqr1_hi#0+(word) $100) -- _deref_pbuc1=_deref_pbuc2
|
|
lda mulf_sqr1_hi+$100
|
|
sta mulf_sqr2_hi+$1ff
|
|
// mulf_init::@return
|
|
// }
|
|
// [55] return
|
|
rts
|
|
// mulf_init::@6
|
|
b6:
|
|
// *sqr2_lo = mulf_sqr1_lo[x_255]
|
|
// [56] *((byte*) mulf_init::sqr2_lo#2) ← *((const byte[$200]) mulf_sqr1_lo#0 + (byte) mulf_init::x_255#2) -- _deref_pbuz1=pbuc1_derefidx_vbuxx
|
|
lda mulf_sqr1_lo,x
|
|
ldy #0
|
|
sta (sqr2_lo),y
|
|
// *sqr2_hi++ = mulf_sqr1_hi[x_255]
|
|
// [57] *((byte*) mulf_init::sqr2_hi#2) ← *((const byte[$200]) mulf_sqr1_hi#0 + (byte) mulf_init::x_255#2) -- _deref_pbuz1=pbuc1_derefidx_vbuxx
|
|
lda mulf_sqr1_hi,x
|
|
sta (sqr2_hi),y
|
|
// *sqr2_hi++ = mulf_sqr1_hi[x_255];
|
|
// [58] (byte*) mulf_init::sqr2_hi#1 ← ++ (byte*) mulf_init::sqr2_hi#2 -- pbuz1=_inc_pbuz1
|
|
inc.z sqr2_hi
|
|
bne !+
|
|
inc.z sqr2_hi+1
|
|
!:
|
|
// x_255 = x_255 + dir
|
|
// [59] (byte) mulf_init::x_255#1 ← (byte) mulf_init::x_255#2 + (byte) mulf_init::dir#2 -- vbuxx=vbuxx_plus_vbuz1
|
|
txa
|
|
clc
|
|
adc.z dir
|
|
tax
|
|
// if(x_255==0)
|
|
// [60] if((byte) mulf_init::x_255#1!=(byte) 0) goto mulf_init::@9 -- vbuxx_neq_0_then_la1
|
|
cpx #0
|
|
bne b8
|
|
// [62] phi from mulf_init::@6 to mulf_init::@8 [phi:mulf_init::@6->mulf_init::@8]
|
|
// [62] phi (byte) mulf_init::dir#4 = (byte) 1 [phi:mulf_init::@6->mulf_init::@8#0] -- vbuz1=vbuc1
|
|
lda #1
|
|
sta.z dir
|
|
// [61] phi from mulf_init::@6 to mulf_init::@9 [phi:mulf_init::@6->mulf_init::@9]
|
|
// mulf_init::@9
|
|
// [62] phi from mulf_init::@9 to mulf_init::@8 [phi:mulf_init::@9->mulf_init::@8]
|
|
// [62] phi (byte) mulf_init::dir#4 = (byte) mulf_init::dir#2 [phi:mulf_init::@9->mulf_init::@8#0] -- register_copy
|
|
// mulf_init::@8
|
|
b8:
|
|
// for(byte* sqr2_lo = mulf_sqr2_lo; sqr2_lo!=mulf_sqr2_lo+511; sqr2_lo++)
|
|
// [63] (byte*) mulf_init::sqr2_lo#1 ← ++ (byte*) mulf_init::sqr2_lo#2 -- pbuz1=_inc_pbuz1
|
|
inc.z sqr2_lo
|
|
bne !+
|
|
inc.z sqr2_lo+1
|
|
!:
|
|
// [51] phi from mulf_init::@8 to mulf_init::@5 [phi:mulf_init::@8->mulf_init::@5]
|
|
// [51] phi (byte) mulf_init::dir#2 = (byte) mulf_init::dir#4 [phi:mulf_init::@8->mulf_init::@5#0] -- register_copy
|
|
// [51] phi (byte*) mulf_init::sqr2_hi#2 = (byte*) mulf_init::sqr2_hi#1 [phi:mulf_init::@8->mulf_init::@5#1] -- register_copy
|
|
// [51] phi (byte) mulf_init::x_255#2 = (byte) mulf_init::x_255#1 [phi:mulf_init::@8->mulf_init::@5#2] -- register_copy
|
|
// [51] phi (byte*) mulf_init::sqr2_lo#2 = (byte*) mulf_init::sqr2_lo#1 [phi:mulf_init::@8->mulf_init::@5#3] -- register_copy
|
|
jmp b5
|
|
// mulf_init::@2
|
|
b2:
|
|
// if((++c&1)==0)
|
|
// [64] (byte) mulf_init::c#1 ← ++ (byte) mulf_init::c#2 -- vbuz1=_inc_vbuz1
|
|
inc.z c
|
|
// ++c&1
|
|
// [65] (byte~) mulf_init::$9 ← (byte) mulf_init::c#1 & (byte) 1 -- vbuaa=vbuz1_band_vbuc1
|
|
lda #1
|
|
and.z c
|
|
// if((++c&1)==0)
|
|
// [66] if((byte~) mulf_init::$9!=(byte) 0) goto mulf_init::@3 -- vbuaa_neq_0_then_la1
|
|
cmp #0
|
|
bne b3
|
|
// mulf_init::@4
|
|
// x_2++;
|
|
// [67] (byte) mulf_init::x_2#1 ← ++ (byte) mulf_init::x_2#3 -- vbuxx=_inc_vbuxx
|
|
inx
|
|
// sqr++;
|
|
// [68] (word) mulf_init::sqr#2 ← ++ (word) mulf_init::sqr#4 -- vwuz1=_inc_vwuz1
|
|
inc.z sqr
|
|
bne !+
|
|
inc.z sqr+1
|
|
!:
|
|
// [69] phi from mulf_init::@2 mulf_init::@4 to mulf_init::@3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3]
|
|
// [69] phi (byte) mulf_init::x_2#2 = (byte) mulf_init::x_2#3 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#0] -- register_copy
|
|
// [69] phi (word) mulf_init::sqr#3 = (word) mulf_init::sqr#4 [phi:mulf_init::@2/mulf_init::@4->mulf_init::@3#1] -- register_copy
|
|
// mulf_init::@3
|
|
b3:
|
|
// <sqr
|
|
// [70] (byte~) mulf_init::$12 ← < (word) mulf_init::sqr#3 -- vbuaa=_lo_vwuz1
|
|
lda.z sqr
|
|
// *sqr1_lo = <sqr
|
|
// [71] *((byte*) mulf_init::sqr1_lo#2) ← (byte~) mulf_init::$12 -- _deref_pbuz1=vbuaa
|
|
ldy #0
|
|
sta (sqr1_lo),y
|
|
// >sqr
|
|
// [72] (byte~) mulf_init::$13 ← > (word) mulf_init::sqr#3 -- vbuaa=_hi_vwuz1
|
|
lda.z sqr+1
|
|
// *sqr1_hi++ = >sqr
|
|
// [73] *((byte*) mulf_init::sqr1_hi#2) ← (byte~) mulf_init::$13 -- _deref_pbuz1=vbuaa
|
|
sta (sqr1_hi),y
|
|
// *sqr1_hi++ = >sqr;
|
|
// [74] (byte*) mulf_init::sqr1_hi#1 ← ++ (byte*) mulf_init::sqr1_hi#2 -- pbuz1=_inc_pbuz1
|
|
inc.z sqr1_hi
|
|
bne !+
|
|
inc.z sqr1_hi+1
|
|
!:
|
|
// sqr = sqr + x_2
|
|
// [75] (word) mulf_init::sqr#1 ← (word) mulf_init::sqr#3 + (byte) mulf_init::x_2#2 -- vwuz1=vwuz1_plus_vbuxx
|
|
txa
|
|
clc
|
|
adc.z sqr
|
|
sta.z sqr
|
|
bcc !+
|
|
inc.z sqr+1
|
|
!:
|
|
// for(byte* sqr1_lo = mulf_sqr1_lo+1; sqr1_lo!=mulf_sqr1_lo+512; sqr1_lo++)
|
|
// [76] (byte*) mulf_init::sqr1_lo#1 ← ++ (byte*) mulf_init::sqr1_lo#2 -- pbuz1=_inc_pbuz1
|
|
inc.z sqr1_lo
|
|
bne !+
|
|
inc.z sqr1_lo+1
|
|
!:
|
|
// [49] phi from mulf_init::@3 to mulf_init::@1 [phi:mulf_init::@3->mulf_init::@1]
|
|
// [49] phi (byte) mulf_init::x_2#3 = (byte) mulf_init::x_2#2 [phi:mulf_init::@3->mulf_init::@1#0] -- register_copy
|
|
// [49] phi (byte*) mulf_init::sqr1_hi#2 = (byte*) mulf_init::sqr1_hi#1 [phi:mulf_init::@3->mulf_init::@1#1] -- register_copy
|
|
// [49] phi (word) mulf_init::sqr#4 = (word) mulf_init::sqr#1 [phi:mulf_init::@3->mulf_init::@1#2] -- register_copy
|
|
// [49] phi (byte) mulf_init::c#2 = (byte) mulf_init::c#1 [phi:mulf_init::@3->mulf_init::@1#3] -- register_copy
|
|
// [49] phi (byte*) mulf_init::sqr1_lo#2 = (byte*) mulf_init::sqr1_lo#1 [phi:mulf_init::@3->mulf_init::@1#4] -- register_copy
|
|
jmp b1
|
|
}
|
|
// File Data
|
|
print_hextab: .text "0123456789abcdef"
|
|
// mulf_sqr tables will contain f(x)=int(x*x/4) and g(x) = f(x-255).
|
|
// <f(x) = <(( x * x )/4)
|
|
.align $100
|
|
mulf_sqr1_lo: .fill $200, 0
|
|
// >f(x) = >(( x * x )/4)
|
|
.align $100
|
|
mulf_sqr1_hi: .fill $200, 0
|
|
// <g(x) = <((( x - 255) * ( x - 255 ))/4)
|
|
.align $100
|
|
mulf_sqr2_lo: .fill $200, 0
|
|
// >g(x) = >((( x - 255) * ( x - 255 ))/4)
|
|
.align $100
|
|
mulf_sqr2_hi: .fill $200, 0
|
|
|