Resolved forward reference frame_cnt to frame_cnt Resolved forward reference frame_cnt to frame_cnt Resolved forward reference frame_cnt to frame_cnt Resolved forward reference irq to __interrupt(hardware_clobber) void irq() Inlined call vicSelectGfxBank::$0 = call toDd00(vicSelectGfxBank::gfx) Inlined call main::$2 = call toD018(SCREEN, BITMAP) Inlined call call __init Eliminating unused variable with no statement bitmap_clear::$1 Eliminating unused variable with no statement memset::$2 CONTROL FLOW GRAPH SSA void bitmap_init(char *gfx , char *screen) bitmap_init: scope:[bitmap_init] from main bitmap_init::screen#1 = phi( main/bitmap_init::screen#0 ) bitmap_init::gfx#1 = phi( main/bitmap_init::gfx#0 ) bitmap_gfx#0 = bitmap_init::gfx#1 bitmap_screen#0 = bitmap_init::screen#1 bitmap_init::bits#0 = $80 bitmap_init::x#0 = 0 to:bitmap_init::@1 bitmap_init::@1: scope:[bitmap_init] from bitmap_init bitmap_init::@2 bitmap_screen#29 = phi( bitmap_init/bitmap_screen#0, bitmap_init::@2/bitmap_screen#25 ) bitmap_gfx#30 = phi( bitmap_init/bitmap_gfx#0, bitmap_init::@2/bitmap_gfx#26 ) bitmap_init::gfx#4 = phi( bitmap_init/bitmap_init::gfx#1, bitmap_init::@2/bitmap_init::gfx#3 ) bitmap_init::x#2 = phi( bitmap_init/bitmap_init::x#0, bitmap_init::@2/bitmap_init::x#1 ) bitmap_init::bits#3 = phi( bitmap_init/bitmap_init::bits#0, bitmap_init::@2/bitmap_init::bits#4 ) bitmap_plot_bit[bitmap_init::x#2] = bitmap_init::bits#3 bitmap_init::bits#1 = bitmap_init::bits#3 >> 1 bitmap_init::$0 = bitmap_init::bits#1 == 0 bitmap_init::$1 = ! bitmap_init::$0 if(bitmap_init::$1) goto bitmap_init::@2 to:bitmap_init::@3 bitmap_init::@2: scope:[bitmap_init] from bitmap_init::@1 bitmap_init::@3 bitmap_screen#25 = phi( bitmap_init::@1/bitmap_screen#29, bitmap_init::@3/bitmap_screen#30 ) bitmap_gfx#26 = phi( bitmap_init::@1/bitmap_gfx#30, bitmap_init::@3/bitmap_gfx#31 ) bitmap_init::gfx#3 = phi( bitmap_init::@1/bitmap_init::gfx#4, bitmap_init::@3/bitmap_init::gfx#5 ) bitmap_init::bits#4 = phi( bitmap_init::@1/bitmap_init::bits#1, bitmap_init::@3/bitmap_init::bits#2 ) bitmap_init::x#3 = phi( bitmap_init::@1/bitmap_init::x#2, bitmap_init::@3/bitmap_init::x#4 ) bitmap_init::x#1 = bitmap_init::x#3 + rangenext(0,$ff) bitmap_init::$2 = bitmap_init::x#1 != rangelast(0,$ff) if(bitmap_init::$2) goto bitmap_init::@1 to:bitmap_init::@4 bitmap_init::@3: scope:[bitmap_init] from bitmap_init::@1 bitmap_screen#30 = phi( bitmap_init::@1/bitmap_screen#29 ) bitmap_gfx#31 = phi( bitmap_init::@1/bitmap_gfx#30 ) bitmap_init::gfx#5 = phi( bitmap_init::@1/bitmap_init::gfx#4 ) bitmap_init::x#4 = phi( bitmap_init::@1/bitmap_init::x#2 ) bitmap_init::bits#2 = $80 to:bitmap_init::@2 bitmap_init::@4: scope:[bitmap_init] from bitmap_init::@2 bitmap_screen#21 = phi( bitmap_init::@2/bitmap_screen#25 ) bitmap_gfx#22 = phi( bitmap_init::@2/bitmap_gfx#26 ) bitmap_init::gfx#2 = phi( bitmap_init::@2/bitmap_init::gfx#3 ) bitmap_init::yoffs#0 = bitmap_init::gfx#2 bitmap_init::y#0 = 0 to:bitmap_init::@5 bitmap_init::@5: scope:[bitmap_init] from bitmap_init::@4 bitmap_init::@6 bitmap_screen#17 = phi( bitmap_init::@4/bitmap_screen#21, bitmap_init::@6/bitmap_screen#13 ) bitmap_gfx#18 = phi( bitmap_init::@4/bitmap_gfx#22, bitmap_init::@6/bitmap_gfx#13 ) bitmap_init::yoffs#2 = phi( bitmap_init::@4/bitmap_init::yoffs#0, bitmap_init::@6/bitmap_init::yoffs#4 ) bitmap_init::y#2 = phi( bitmap_init::@4/bitmap_init::y#0, bitmap_init::@6/bitmap_init::y#1 ) bitmap_init::$3 = bitmap_init::y#2 & 7 bitmap_init::$4 = byte0 bitmap_init::yoffs#2 bitmap_init::$5 = bitmap_init::$3 | bitmap_init::$4 bitmap_plot_ylo[bitmap_init::y#2] = bitmap_init::$5 bitmap_init::$6 = byte1 bitmap_init::yoffs#2 bitmap_plot_yhi[bitmap_init::y#2] = bitmap_init::$6 bitmap_init::$7 = bitmap_init::y#2 & 7 bitmap_init::$8 = bitmap_init::$7 == 7 bitmap_init::$9 = ! bitmap_init::$8 if(bitmap_init::$9) goto bitmap_init::@6 to:bitmap_init::@7 bitmap_init::@6: scope:[bitmap_init] from bitmap_init::@5 bitmap_init::@7 bitmap_screen#13 = phi( bitmap_init::@5/bitmap_screen#17, bitmap_init::@7/bitmap_screen#18 ) bitmap_gfx#13 = phi( bitmap_init::@5/bitmap_gfx#18, bitmap_init::@7/bitmap_gfx#19 ) bitmap_init::yoffs#4 = phi( bitmap_init::@5/bitmap_init::yoffs#2, bitmap_init::@7/bitmap_init::yoffs#1 ) bitmap_init::y#3 = phi( bitmap_init::@5/bitmap_init::y#2, bitmap_init::@7/bitmap_init::y#4 ) bitmap_init::y#1 = bitmap_init::y#3 + rangenext(0,$ff) bitmap_init::$11 = bitmap_init::y#1 != rangelast(0,$ff) if(bitmap_init::$11) goto bitmap_init::@5 to:bitmap_init::@return bitmap_init::@7: scope:[bitmap_init] from bitmap_init::@5 bitmap_screen#18 = phi( bitmap_init::@5/bitmap_screen#17 ) bitmap_gfx#19 = phi( bitmap_init::@5/bitmap_gfx#18 ) bitmap_init::y#4 = phi( bitmap_init::@5/bitmap_init::y#2 ) bitmap_init::yoffs#3 = phi( bitmap_init::@5/bitmap_init::yoffs#2 ) bitmap_init::$10 = bitmap_init::yoffs#3 + $28*8 bitmap_init::yoffs#1 = bitmap_init::$10 to:bitmap_init::@6 bitmap_init::@return: scope:[bitmap_init] from bitmap_init::@6 bitmap_screen#7 = phi( bitmap_init::@6/bitmap_screen#13 ) bitmap_gfx#7 = phi( bitmap_init::@6/bitmap_gfx#13 ) bitmap_gfx#1 = bitmap_gfx#7 bitmap_screen#1 = bitmap_screen#7 return to:@return void bitmap_clear(char bgcol , char fgcol) bitmap_clear: scope:[bitmap_clear] from main::@8 bitmap_gfx#14 = phi( main::@8/bitmap_gfx#2 ) bitmap_screen#8 = phi( main::@8/bitmap_screen#2 ) bitmap_clear::bgcol#1 = phi( main::@8/bitmap_clear::bgcol#0 ) bitmap_clear::fgcol#1 = phi( main::@8/bitmap_clear::fgcol#0 ) bitmap_clear::$0 = bitmap_clear::fgcol#1 * $10 bitmap_clear::col#0 = bitmap_clear::$0 + bitmap_clear::bgcol#1 memset::str#0 = (void *)bitmap_screen#8 memset::c#0 = bitmap_clear::col#0 memset::num#0 = $3e8 call memset memset::return#0 = memset::return#3 to:bitmap_clear::@1 bitmap_clear::@1: scope:[bitmap_clear] from bitmap_clear bitmap_gfx#8 = phi( bitmap_clear/bitmap_gfx#14 ) memset::str#1 = (void *)bitmap_gfx#8 memset::c#1 = 0 memset::num#1 = $1f40 call memset memset::return#1 = memset::return#3 to:bitmap_clear::@2 bitmap_clear::@2: scope:[bitmap_clear] from bitmap_clear::@1 to:bitmap_clear::@return bitmap_clear::@return: scope:[bitmap_clear] from bitmap_clear::@2 return to:@return void bitmap_plot(unsigned int x , char y) bitmap_plot: scope:[bitmap_plot] from main::@2 bitmap_plot::x#1 = phi( main::@2/bitmap_plot::x#0 ) bitmap_plot::y#1 = phi( main::@2/bitmap_plot::y#0 ) bitmap_plot::$0 = bitmap_plot_yhi[bitmap_plot::y#1] w= bitmap_plot_ylo[bitmap_plot::y#1] bitmap_plot::plotter#0 = (char *)bitmap_plot::$0 bitmap_plot::$1 = bitmap_plot::x#1 & $fff8 bitmap_plot::plotter#1 = bitmap_plot::plotter#0 + bitmap_plot::$1 bitmap_plot::$2 = byte0 bitmap_plot::x#1 *bitmap_plot::plotter#1 = *bitmap_plot::plotter#1 | bitmap_plot_bit[bitmap_plot::$2] to:bitmap_plot::@return bitmap_plot::@return: scope:[bitmap_plot] from bitmap_plot return to:@return void * memset(void *str , char c , unsigned int num) memset: scope:[memset] from bitmap_clear bitmap_clear::@1 memset::c#5 = phi( bitmap_clear/memset::c#0, bitmap_clear::@1/memset::c#1 ) memset::str#4 = phi( bitmap_clear/memset::str#0, bitmap_clear::@1/memset::str#1 ) memset::num#2 = phi( bitmap_clear/memset::num#0, bitmap_clear::@1/memset::num#1 ) memset::$0 = memset::num#2 > 0 memset::$1 = ! memset::$0 if(memset::$1) goto memset::@1 to:memset::@2 memset::@1: scope:[memset] from memset memset::@3 memset::str#2 = phi( memset/memset::str#4, memset::@3/memset::str#5 ) memset::return#2 = memset::str#2 to:memset::@return memset::@2: scope:[memset] from memset memset::c#4 = phi( memset/memset::c#5 ) memset::num#3 = phi( memset/memset::num#2 ) memset::str#3 = phi( memset/memset::str#4 ) memset::$4 = (char *)memset::str#3 memset::end#0 = memset::$4 + memset::num#3 memset::dst#0 = ((char *)) memset::str#3 to:memset::@3 memset::@3: scope:[memset] from memset::@2 memset::@4 memset::c#3 = phi( memset::@2/memset::c#4, memset::@4/memset::c#2 ) memset::str#5 = phi( memset::@2/memset::str#3, memset::@4/memset::str#6 ) memset::end#1 = phi( memset::@2/memset::end#0, memset::@4/memset::end#2 ) memset::dst#2 = phi( memset::@2/memset::dst#0, memset::@4/memset::dst#1 ) memset::$3 = memset::dst#2 != memset::end#1 if(memset::$3) goto memset::@4 to:memset::@1 memset::@4: scope:[memset] from memset::@3 memset::str#6 = phi( memset::@3/memset::str#5 ) memset::end#2 = phi( memset::@3/memset::end#1 ) memset::dst#3 = phi( memset::@3/memset::dst#2 ) memset::c#2 = phi( memset::@3/memset::c#3 ) *memset::dst#3 = memset::c#2 memset::dst#1 = ++ memset::dst#3 to:memset::@3 memset::@return: scope:[memset] from memset::@1 memset::return#4 = phi( memset::@1/memset::return#2 ) memset::return#3 = memset::return#4 return to:@return void main() main: scope:[main] from __start::@1 bitmap_screen#14 = phi( __start::@1/bitmap_screen#16 ) bitmap_gfx#15 = phi( __start::@1/bitmap_gfx#17 ) bitmap_init::gfx#0 = BITMAP bitmap_init::screen#0 = SCREEN call bitmap_init to:main::@8 main::@8: scope:[main] from main bitmap_screen#9 = phi( main/bitmap_screen#1 ) bitmap_gfx#9 = phi( main/bitmap_gfx#1 ) bitmap_gfx#2 = bitmap_gfx#9 bitmap_screen#2 = bitmap_screen#9 bitmap_clear::bgcol#0 = BLACK bitmap_clear::fgcol#0 = WHITE call bitmap_clear to:main::@9 main::@9: scope:[main] from main::@8 bitmap_screen#33 = phi( main::@8/bitmap_screen#2 ) bitmap_gfx#34 = phi( main::@8/bitmap_gfx#2 ) *D011 = VICII_BMM|VICII_DEN|VICII_RSEL|3 main::toD0181_screen#0 = SCREEN main::toD0181_gfx#0 = BITMAP to:main::toD0181 main::toD0181: scope:[main] from main::@9 bitmap_screen#31 = phi( main::@9/bitmap_screen#33 ) bitmap_gfx#32 = phi( main::@9/bitmap_gfx#34 ) main::toD0181_gfx#1 = phi( main::@9/main::toD0181_gfx#0 ) main::toD0181_screen#1 = phi( main::@9/main::toD0181_screen#0 ) main::toD0181_$7 = (unsigned int)main::toD0181_screen#1 main::toD0181_$0 = main::toD0181_$7 & $3fff main::toD0181_$1 = main::toD0181_$0 * 4 main::toD0181_$2 = byte1 main::toD0181_$1 main::toD0181_$3 = byte1 (unsigned int)main::toD0181_gfx#1 main::toD0181_$4 = main::toD0181_$3 / 4 main::toD0181_$5 = main::toD0181_$4 & $f main::toD0181_$6 = main::toD0181_$2 | main::toD0181_$5 main::toD0181_return#0 = main::toD0181_$6 to:main::toD0181_@return main::toD0181_@return: scope:[main] from main::toD0181 bitmap_screen#26 = phi( main::toD0181/bitmap_screen#31 ) bitmap_gfx#27 = phi( main::toD0181/bitmap_gfx#32 ) main::toD0181_return#2 = phi( main::toD0181/main::toD0181_return#0 ) main::toD0181_return#1 = main::toD0181_return#2 to:main::@7 main::@7: scope:[main] from main::toD0181_@return bitmap_screen#22 = phi( main::toD0181_@return/bitmap_screen#26 ) bitmap_gfx#23 = phi( main::toD0181_@return/bitmap_gfx#27 ) main::toD0181_return#3 = phi( main::toD0181_@return/main::toD0181_return#1 ) main::$2 = main::toD0181_return#3 *D018 = main::$2 call init_irq to:main::@10 main::@10: scope:[main] from main::@7 bitmap_screen#19 = phi( main::@7/bitmap_screen#22 ) bitmap_gfx#20 = phi( main::@7/bitmap_gfx#23 ) main::x#0 = 0 main::y#0 = 0 main::vx#0 = 1 main::vy#0 = 1 to:main::@1 main::@1: scope:[main] from main::@10 main::@4 main::vy#6 = phi( main::@10/main::vy#0, main::@4/main::vy#8 ) main::vx#5 = phi( main::@10/main::vx#0, main::@4/main::vx#6 ) bitmap_screen#15 = phi( main::@10/bitmap_screen#19, main::@4/bitmap_screen#20 ) bitmap_gfx#16 = phi( main::@10/bitmap_gfx#20, main::@4/bitmap_gfx#21 ) main::y#5 = phi( main::@10/main::y#0, main::@4/main::y#7 ) main::x#4 = phi( main::@10/main::x#0, main::@4/main::x#5 ) if(true) goto main::@2 to:main::@return main::@2: scope:[main] from main::@1 bitmap_screen#32 = phi( main::@1/bitmap_screen#15 ) bitmap_gfx#33 = phi( main::@1/bitmap_gfx#16 ) main::vy#4 = phi( main::@1/main::vy#6 ) main::vx#4 = phi( main::@1/main::vx#5 ) main::y#2 = phi( main::@1/main::y#5 ) main::x#2 = phi( main::@1/main::x#4 ) bitmap_plot::x#0 = main::x#2 bitmap_plot::y#0 = main::y#2 call bitmap_plot to:main::@11 main::@11: scope:[main] from main::@2 bitmap_screen#27 = phi( main::@2/bitmap_screen#32 ) bitmap_gfx#28 = phi( main::@2/bitmap_gfx#33 ) main::vy#2 = phi( main::@2/main::vy#4 ) main::y#3 = phi( main::@2/main::y#2 ) main::vx#2 = phi( main::@2/main::vx#4 ) main::x#3 = phi( main::@2/main::x#2 ) main::x#1 = main::x#3 + main::vx#2 main::y#1 = main::y#3 + main::vy#2 main::$5 = main::x#1 == $13f main::$6 = main::x#1 == 0 main::$7 = main::$5 || main::$6 main::$8 = ! main::$7 if(main::$8) goto main::@3 to:main::@5 main::@3: scope:[main] from main::@11 main::@5 main::vx#7 = phi( main::@11/main::vx#2, main::@5/main::vx#1 ) bitmap_screen#23 = phi( main::@11/bitmap_screen#27, main::@5/bitmap_screen#28 ) bitmap_gfx#24 = phi( main::@11/bitmap_gfx#28, main::@5/bitmap_gfx#29 ) main::x#6 = phi( main::@11/main::x#1, main::@5/main::x#8 ) main::vy#5 = phi( main::@11/main::vy#2, main::@5/main::vy#7 ) main::y#4 = phi( main::@11/main::y#1, main::@5/main::y#6 ) main::$10 = main::y#4 == $c7 main::$11 = main::y#4 == 0 main::$12 = main::$10 || main::$11 main::$13 = ! main::$12 if(main::$13) goto main::@4 to:main::@6 main::@5: scope:[main] from main::@11 bitmap_screen#28 = phi( main::@11/bitmap_screen#27 ) bitmap_gfx#29 = phi( main::@11/bitmap_gfx#28 ) main::x#8 = phi( main::@11/main::x#1 ) main::vy#7 = phi( main::@11/main::vy#2 ) main::y#6 = phi( main::@11/main::y#1 ) main::vx#3 = phi( main::@11/main::vx#2 ) main::$9 = - main::vx#3 main::vx#1 = main::$9 to:main::@3 main::@4: scope:[main] from main::@3 main::@6 main::vy#8 = phi( main::@3/main::vy#5, main::@6/main::vy#1 ) main::vx#6 = phi( main::@3/main::vx#7, main::@6/main::vx#8 ) bitmap_screen#20 = phi( main::@3/bitmap_screen#23, main::@6/bitmap_screen#24 ) bitmap_gfx#21 = phi( main::@3/bitmap_gfx#24, main::@6/bitmap_gfx#25 ) main::y#7 = phi( main::@3/main::y#4, main::@6/main::y#8 ) main::x#5 = phi( main::@3/main::x#6, main::@6/main::x#7 ) plots_per_frame[frame_cnt] = ++ plots_per_frame[frame_cnt] to:main::@1 main::@6: scope:[main] from main::@3 main::vx#8 = phi( main::@3/main::vx#7 ) bitmap_screen#24 = phi( main::@3/bitmap_screen#23 ) bitmap_gfx#25 = phi( main::@3/bitmap_gfx#24 ) main::y#8 = phi( main::@3/main::y#4 ) main::x#7 = phi( main::@3/main::x#6 ) main::vy#3 = phi( main::@3/main::vy#5 ) main::$14 = - main::vy#3 main::vy#1 = main::$14 to:main::@4 main::@return: scope:[main] from main::@1 bitmap_screen#10 = phi( main::@1/bitmap_screen#15 ) bitmap_gfx#10 = phi( main::@1/bitmap_gfx#16 ) bitmap_gfx#3 = bitmap_gfx#10 bitmap_screen#3 = bitmap_screen#10 return to:@return void init_irq() init_irq: scope:[init_irq] from main::@7 asm { sei } *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK *PROCPORT = PROCPORT_RAM_IO *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL *VICII_CONTROL1 = *VICII_CONTROL1 | $80 *RASTER = 0 *IRQ_ENABLE = IRQ_RASTER *HARDWARE_IRQ = &irq asm { cli } to:init_irq::@return init_irq::@return: scope:[init_irq] from init_irq return to:@return __interrupt(hardware_clobber) void irq() irq: scope:[irq] from *BG_COLOR = WHITE irq::$1 = 0 != frame_cnt irq::$0 = ! irq::$1 if(irq::$0) goto irq::@1 to:irq::@2 irq::@1: scope:[irq] from irq irq::@2 *BG_COLOR = BLACK *IRQ_STATUS = IRQ_RASTER to:irq::@return irq::@2: scope:[irq] from irq frame_cnt = ++ frame_cnt to:irq::@1 irq::@return: scope:[irq] from irq::@1 return to:@return void __start() __start: scope:[__start] from to:__start::__init1 __start::__init1: scope:[__start] from __start bitmap_screen#4 = (char *) 0 bitmap_gfx#4 = (char *) 0 frame_cnt = 1 to:__start::@1 __start::@1: scope:[__start] from __start::__init1 bitmap_screen#16 = phi( __start::__init1/bitmap_screen#4 ) bitmap_gfx#17 = phi( __start::__init1/bitmap_gfx#4 ) call main to:__start::@2 __start::@2: scope:[__start] from __start::@1 bitmap_screen#11 = phi( __start::@1/bitmap_screen#3 ) bitmap_gfx#11 = phi( __start::@1/bitmap_gfx#3 ) bitmap_gfx#5 = bitmap_gfx#11 bitmap_screen#5 = bitmap_screen#11 to:__start::@return __start::@return: scope:[__start] from __start::@2 bitmap_gfx#12 = phi( __start::@2/bitmap_gfx#5 ) bitmap_screen#12 = phi( __start::@2/bitmap_screen#5 ) bitmap_screen#6 = bitmap_screen#12 bitmap_gfx#6 = bitmap_gfx#12 return to:@return SYMBOL TABLE SSA __constant char * const BG_COLOR = (char *)$d021 __constant char *BITMAP = (char *)$2000 __constant const char BLACK = 0 __constant struct MOS6526_CIA * const CIA1 = (struct MOS6526_CIA *)$dc00 __constant const char CIA_INTERRUPT_CLEAR_ALL = $7f __constant char * const D011 = (char *)$d011 __constant char * const D018 = (char *)$d018 __constant void (** const HARDWARE_IRQ)() = (void (**)())$fffe __constant char * const IRQ_ENABLE = (char *)$d01a __constant const char IRQ_RASTER = 1 __constant char * const IRQ_STATUS = (char *)$d019 __constant char OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d __constant char * const PROCPORT = (char *)1 __constant char * const PROCPORT_DDR = (char *)0 __constant const char PROCPORT_DDR_MEMORY_MASK = 7 __constant const char PROCPORT_RAM_IO = 5 __constant char * const RASTER = (char *)$d012 __constant char *SCREEN = (char *)$400 __constant const char VICII_BMM = $20 __constant char * const VICII_CONTROL1 = (char *)$d011 __constant const char VICII_DEN = $10 __constant const char VICII_RSEL = 8 __constant const char WHITE = 1 void __start() void bitmap_clear(char bgcol , char fgcol) number bitmap_clear::$0 char bitmap_clear::bgcol char bitmap_clear::bgcol#0 char bitmap_clear::bgcol#1 char bitmap_clear::col char bitmap_clear::col#0 char bitmap_clear::fgcol char bitmap_clear::fgcol#0 char bitmap_clear::fgcol#1 char *bitmap_gfx char *bitmap_gfx#0 char *bitmap_gfx#1 char *bitmap_gfx#10 char *bitmap_gfx#11 char *bitmap_gfx#12 char *bitmap_gfx#13 char *bitmap_gfx#14 char *bitmap_gfx#15 char *bitmap_gfx#16 char *bitmap_gfx#17 char *bitmap_gfx#18 char *bitmap_gfx#19 char *bitmap_gfx#2 char *bitmap_gfx#20 char *bitmap_gfx#21 char *bitmap_gfx#22 char *bitmap_gfx#23 char *bitmap_gfx#24 char *bitmap_gfx#25 char *bitmap_gfx#26 char *bitmap_gfx#27 char *bitmap_gfx#28 char *bitmap_gfx#29 char *bitmap_gfx#3 char *bitmap_gfx#30 char *bitmap_gfx#31 char *bitmap_gfx#32 char *bitmap_gfx#33 char *bitmap_gfx#34 char *bitmap_gfx#4 char *bitmap_gfx#5 char *bitmap_gfx#6 char *bitmap_gfx#7 char *bitmap_gfx#8 char *bitmap_gfx#9 void bitmap_init(char *gfx , char *screen) bool bitmap_init::$0 bool bitmap_init::$1 char *bitmap_init::$10 bool bitmap_init::$11 bool bitmap_init::$2 number bitmap_init::$3 char bitmap_init::$4 number bitmap_init::$5 char bitmap_init::$6 number bitmap_init::$7 bool bitmap_init::$8 bool bitmap_init::$9 char bitmap_init::bits char bitmap_init::bits#0 char bitmap_init::bits#1 char bitmap_init::bits#2 char bitmap_init::bits#3 char bitmap_init::bits#4 char *bitmap_init::gfx char *bitmap_init::gfx#0 char *bitmap_init::gfx#1 char *bitmap_init::gfx#2 char *bitmap_init::gfx#3 char *bitmap_init::gfx#4 char *bitmap_init::gfx#5 char *bitmap_init::screen char *bitmap_init::screen#0 char *bitmap_init::screen#1 char bitmap_init::x char bitmap_init::x#0 char bitmap_init::x#1 char bitmap_init::x#2 char bitmap_init::x#3 char bitmap_init::x#4 char bitmap_init::y char bitmap_init::y#0 char bitmap_init::y#1 char bitmap_init::y#2 char bitmap_init::y#3 char bitmap_init::y#4 char *bitmap_init::yoffs char *bitmap_init::yoffs#0 char *bitmap_init::yoffs#1 char *bitmap_init::yoffs#2 char *bitmap_init::yoffs#3 char *bitmap_init::yoffs#4 void bitmap_plot(unsigned int x , char y) unsigned int bitmap_plot::$0 number bitmap_plot::$1 char bitmap_plot::$2 char *bitmap_plot::plotter char *bitmap_plot::plotter#0 char *bitmap_plot::plotter#1 unsigned int bitmap_plot::x unsigned int bitmap_plot::x#0 unsigned int bitmap_plot::x#1 char bitmap_plot::y char bitmap_plot::y#0 char bitmap_plot::y#1 __constant const char bitmap_plot_bit[$100] = { fill( $100, 0) } __constant const char bitmap_plot_yhi[$100] = { fill( $100, 0) } __constant const char bitmap_plot_ylo[$100] = { fill( $100, 0) } char *bitmap_screen char *bitmap_screen#0 char *bitmap_screen#1 char *bitmap_screen#10 char *bitmap_screen#11 char *bitmap_screen#12 char *bitmap_screen#13 char *bitmap_screen#14 char *bitmap_screen#15 char *bitmap_screen#16 char *bitmap_screen#17 char *bitmap_screen#18 char *bitmap_screen#19 char *bitmap_screen#2 char *bitmap_screen#20 char *bitmap_screen#21 char *bitmap_screen#22 char *bitmap_screen#23 char *bitmap_screen#24 char *bitmap_screen#25 char *bitmap_screen#26 char *bitmap_screen#27 char *bitmap_screen#28 char *bitmap_screen#29 char *bitmap_screen#3 char *bitmap_screen#30 char *bitmap_screen#31 char *bitmap_screen#32 char *bitmap_screen#33 char *bitmap_screen#4 char *bitmap_screen#5 char *bitmap_screen#6 char *bitmap_screen#7 char *bitmap_screen#8 char *bitmap_screen#9 __loadstore volatile char frame_cnt void init_irq() __interrupt(hardware_clobber) void irq() bool irq::$0 bool irq::$1 void main() bool main::$10 bool main::$11 bool main::$12 bool main::$13 char main::$14 char main::$2 bool main::$5 bool main::$6 bool main::$7 bool main::$8 unsigned int main::$9 number main::toD0181_$0 number main::toD0181_$1 char main::toD0181_$2 char main::toD0181_$3 number main::toD0181_$4 number main::toD0181_$5 number main::toD0181_$6 unsigned int main::toD0181_$7 char *main::toD0181_gfx char *main::toD0181_gfx#0 char *main::toD0181_gfx#1 char main::toD0181_return char main::toD0181_return#0 char main::toD0181_return#1 char main::toD0181_return#2 char main::toD0181_return#3 char *main::toD0181_screen char *main::toD0181_screen#0 char *main::toD0181_screen#1 unsigned int main::vx unsigned int main::vx#0 unsigned int main::vx#1 unsigned int main::vx#2 unsigned int main::vx#3 unsigned int main::vx#4 unsigned int main::vx#5 unsigned int main::vx#6 unsigned int main::vx#7 unsigned int main::vx#8 char main::vy char main::vy#0 char main::vy#1 char main::vy#2 char main::vy#3 char main::vy#4 char main::vy#5 char main::vy#6 char main::vy#7 char main::vy#8 unsigned int main::x unsigned int main::x#0 unsigned int main::x#1 unsigned int main::x#2 unsigned int main::x#3 unsigned int main::x#4 unsigned int main::x#5 unsigned int main::x#6 unsigned int main::x#7 unsigned int main::x#8 char main::y char main::y#0 char main::y#1 char main::y#2 char main::y#3 char main::y#4 char main::y#5 char main::y#6 char main::y#7 char main::y#8 void * memset(void *str , char c , unsigned int num) bool memset::$0 bool memset::$1 bool memset::$3 char *memset::$4 char memset::c char memset::c#0 char memset::c#1 char memset::c#2 char memset::c#3 char memset::c#4 char memset::c#5 char *memset::dst char *memset::dst#0 char *memset::dst#1 char *memset::dst#2 char *memset::dst#3 char *memset::end char *memset::end#0 char *memset::end#1 char *memset::end#2 unsigned int memset::num unsigned int memset::num#0 unsigned int memset::num#1 unsigned int memset::num#2 unsigned int memset::num#3 void *memset::return void *memset::return#0 void *memset::return#1 void *memset::return#2 void *memset::return#3 void *memset::return#4 void *memset::str void *memset::str#0 void *memset::str#1 void *memset::str#2 void *memset::str#3 void *memset::str#4 void *memset::str#5 void *memset::str#6 __constant char plots_per_frame[$100] = { fill( $100, 0) } Adding number conversion cast (unumber) 1 in bitmap_init::bits#1 = bitmap_init::bits#3 >> 1 Adding number conversion cast (unumber) 0 in bitmap_init::$0 = bitmap_init::bits#1 == 0 Adding number conversion cast (unumber) $80 in bitmap_init::bits#2 = $80 Adding number conversion cast (unumber) 7 in bitmap_init::$3 = bitmap_init::y#2 & 7 Adding number conversion cast (unumber) bitmap_init::$3 in bitmap_init::$3 = bitmap_init::y#2 & (unumber)7 Adding number conversion cast (unumber) bitmap_init::$5 in bitmap_init::$5 = bitmap_init::$3 | bitmap_init::$4 Adding number conversion cast (unumber) 7 in bitmap_init::$7 = bitmap_init::y#2 & 7 Adding number conversion cast (unumber) bitmap_init::$7 in bitmap_init::$7 = bitmap_init::y#2 & (unumber)7 Adding number conversion cast (unumber) 7 in bitmap_init::$8 = bitmap_init::$7 == 7 Adding number conversion cast (unumber) $28*8 in bitmap_init::$10 = bitmap_init::yoffs#3 + $28*8 Adding number conversion cast (unumber) $10 in bitmap_clear::$0 = bitmap_clear::fgcol#1 * $10 Adding number conversion cast (unumber) bitmap_clear::$0 in bitmap_clear::$0 = bitmap_clear::fgcol#1 * (unumber)$10 Adding number conversion cast (unumber) 0 in memset::c#1 = 0 Adding number conversion cast (unumber) $fff8 in bitmap_plot::$1 = bitmap_plot::x#1 & $fff8 Adding number conversion cast (unumber) bitmap_plot::$1 in bitmap_plot::$1 = bitmap_plot::x#1 & (unumber)$fff8 Adding number conversion cast (unumber) 0 in memset::$0 = memset::num#2 > 0 Adding number conversion cast (unumber) VICII_BMM|VICII_DEN|VICII_RSEL|3 in *D011 = VICII_BMM|VICII_DEN|VICII_RSEL|3 Adding number conversion cast (unumber) 3 in *D011 = ((unumber)) VICII_BMM|VICII_DEN|VICII_RSEL|3 Adding number conversion cast (unumber) $3fff in main::toD0181_$0 = main::toD0181_$7 & $3fff Adding number conversion cast (unumber) main::toD0181_$0 in main::toD0181_$0 = main::toD0181_$7 & (unumber)$3fff Adding number conversion cast (unumber) 4 in main::toD0181_$1 = main::toD0181_$0 * 4 Adding number conversion cast (unumber) main::toD0181_$1 in main::toD0181_$1 = main::toD0181_$0 * (unumber)4 Adding number conversion cast (unumber) 4 in main::toD0181_$4 = main::toD0181_$3 / 4 Adding number conversion cast (unumber) main::toD0181_$4 in main::toD0181_$4 = main::toD0181_$3 / (unumber)4 Adding number conversion cast (unumber) $f in main::toD0181_$5 = main::toD0181_$4 & $f Adding number conversion cast (unumber) main::toD0181_$5 in main::toD0181_$5 = main::toD0181_$4 & (unumber)$f Adding number conversion cast (unumber) main::toD0181_$6 in main::toD0181_$6 = main::toD0181_$2 | main::toD0181_$5 Adding number conversion cast (unumber) $13f in main::$5 = main::x#1 == $13f Adding number conversion cast (unumber) 0 in main::$6 = main::x#1 == 0 Adding number conversion cast (unumber) $c7 in main::$10 = main::y#4 == $c7 Adding number conversion cast (unumber) 0 in main::$11 = main::y#4 == 0 Adding number conversion cast (unumber) $80 in *VICII_CONTROL1 = *VICII_CONTROL1 | $80 Adding number conversion cast (unumber) 0 in *RASTER = 0 Adding number conversion cast (unumber) 0 in irq::$1 = 0 != frame_cnt Successful SSA optimization PassNAddNumberTypeConversions Inlining cast bitmap_init::bits#2 = (unumber)$80 Inlining cast memset::c#1 = (unumber)0 Inlining cast memset::dst#0 = (char *)memset::str#3 Inlining cast *D011 = (unumber)VICII_BMM|VICII_DEN|VICII_RSEL|(unumber)3 Inlining cast *RASTER = (unumber)0 Successful SSA optimization Pass2InlineCast Simplifying constant pointer cast (char *) 53266 Simplifying constant pointer cast (char *) 53281 Simplifying constant pointer cast (char *) 53265 Simplifying constant pointer cast (char *) 53265 Simplifying constant pointer cast (char *) 53272 Simplifying constant pointer cast (char *) 53273 Simplifying constant pointer cast (char *) 53274 Simplifying constant pointer cast (char *) 0 Simplifying constant pointer cast (char *) 1 Simplifying constant pointer cast (struct MOS6526_CIA *) 56320 Simplifying constant pointer cast (void (**)()) 65534 Simplifying constant pointer cast (char *) 8192 Simplifying constant pointer cast (char *) 1024 Simplifying constant integer cast 1 Simplifying constant integer cast 0 Simplifying constant integer cast $80 Simplifying constant integer cast 7 Simplifying constant integer cast 7 Simplifying constant integer cast 7 Simplifying constant integer cast $10 Simplifying constant integer cast 0 Simplifying constant integer cast $fff8 Simplifying constant integer cast 0 Simplifying constant integer cast VICII_BMM|VICII_DEN|VICII_RSEL|(unumber)3 Simplifying constant integer cast 3 Simplifying constant integer cast $3fff Simplifying constant integer cast 4 Simplifying constant integer cast 4 Simplifying constant integer cast $f Simplifying constant integer cast $13f Simplifying constant integer cast 0 Simplifying constant integer cast $c7 Simplifying constant integer cast 0 Simplifying constant integer cast $80 Simplifying constant integer cast 0 Simplifying constant integer cast 0 Successful SSA optimization PassNCastSimplification Finalized unsigned number type (char) 1 Finalized unsigned number type (char) 0 Finalized unsigned number type (char) $80 Finalized unsigned number type (char) 7 Finalized unsigned number type (char) 7 Finalized unsigned number type (char) 7 Finalized unsigned number type (char) $10 Finalized unsigned number type (char) 0 Finalized unsigned number type (unsigned int) $fff8 Finalized unsigned number type (char) 0 Finalized unsigned number type (char) 3 Finalized unsigned number type (unsigned int) $3fff Finalized unsigned number type (char) 4 Finalized unsigned number type (char) 4 Finalized unsigned number type (char) $f Finalized unsigned number type (unsigned int) $13f Finalized unsigned number type (char) 0 Finalized unsigned number type (char) $c7 Finalized unsigned number type (char) 0 Finalized unsigned number type (char) $80 Finalized unsigned number type (char) 0 Finalized unsigned number type (char) 0 Successful SSA optimization PassNFinalizeNumberTypeConversions Inferred type updated to char in bitmap_init::$3 = bitmap_init::y#2 & 7 Inferred type updated to char in bitmap_init::$5 = bitmap_init::$3 | bitmap_init::$4 Inferred type updated to char in bitmap_init::$7 = bitmap_init::y#2 & 7 Inferred type updated to char in bitmap_clear::$0 = bitmap_clear::fgcol#1 * $10 Inferred type updated to unsigned int in bitmap_plot::$1 = bitmap_plot::x#1 & $fff8 Inferred type updated to unsigned int in main::toD0181_$0 = main::toD0181_$7 & $3fff Inferred type updated to unsigned int in main::toD0181_$1 = main::toD0181_$0 * 4 Inferred type updated to char in main::toD0181_$4 = main::toD0181_$3 / 4 Inferred type updated to char in main::toD0181_$5 = main::toD0181_$4 & $f Inferred type updated to char in main::toD0181_$6 = main::toD0181_$2 | main::toD0181_$5 Inversing boolean not [9] bitmap_init::$1 = bitmap_init::bits#1 != 0 from [8] bitmap_init::$0 = bitmap_init::bits#1 == 0 Inversing boolean not [29] bitmap_init::$9 = bitmap_init::$7 != 7 from [28] bitmap_init::$8 = bitmap_init::$7 == 7 Inversing boolean not [67] memset::$1 = memset::num#2 <= 0 from [66] memset::$0 = memset::num#2 > 0 Inversing boolean not [163] irq::$0 = 0 == frame_cnt from [162] irq::$1 = 0 != frame_cnt Successful SSA optimization Pass2UnaryNotSimplification Alias bitmap_init::x#2 = bitmap_init::x#4 Alias bitmap_init::gfx#4 = bitmap_init::gfx#5 Alias bitmap_gfx#30 = bitmap_gfx#31 Alias bitmap_screen#29 = bitmap_screen#30 Alias bitmap_init::gfx#2 = bitmap_init::gfx#3 bitmap_init::yoffs#0 Alias bitmap_gfx#22 = bitmap_gfx#26 Alias bitmap_screen#21 = bitmap_screen#25 Alias bitmap_init::yoffs#2 = bitmap_init::yoffs#3 Alias bitmap_init::y#2 = bitmap_init::y#4 Alias bitmap_gfx#18 = bitmap_gfx#19 Alias bitmap_screen#17 = bitmap_screen#18 Alias bitmap_init::yoffs#1 = bitmap_init::$10 Alias bitmap_gfx#1 = bitmap_gfx#7 bitmap_gfx#13 Alias bitmap_screen#1 = bitmap_screen#7 bitmap_screen#13 Alias bitmap_gfx#14 = bitmap_gfx#8 Alias memset::return#2 = memset::str#2 memset::return#4 memset::return#3 Alias memset::str#3 = memset::str#4 Alias memset::num#2 = memset::num#3 Alias memset::c#4 = memset::c#5 Alias memset::c#2 = memset::c#3 Alias memset::dst#2 = memset::dst#3 Alias memset::end#1 = memset::end#2 Alias memset::str#5 = memset::str#6 Alias bitmap_gfx#2 = bitmap_gfx#9 bitmap_gfx#34 bitmap_gfx#32 bitmap_gfx#27 bitmap_gfx#23 bitmap_gfx#20 Alias bitmap_screen#19 = bitmap_screen#2 bitmap_screen#9 bitmap_screen#33 bitmap_screen#31 bitmap_screen#26 bitmap_screen#22 Alias main::toD0181_screen#0 = main::toD0181_screen#1 Alias main::toD0181_gfx#0 = main::toD0181_gfx#1 Alias main::toD0181_return#0 = main::toD0181_$6 main::toD0181_return#2 main::toD0181_return#1 main::toD0181_return#3 main::$2 Alias main::x#2 = main::x#4 main::x#3 Alias main::y#2 = main::y#5 main::y#3 Alias main::vx#2 = main::vx#4 main::vx#5 main::vx#3 Alias main::vy#2 = main::vy#4 main::vy#6 main::vy#7 Alias bitmap_gfx#10 = bitmap_gfx#33 bitmap_gfx#16 bitmap_gfx#28 bitmap_gfx#29 bitmap_gfx#3 Alias bitmap_screen#10 = bitmap_screen#32 bitmap_screen#15 bitmap_screen#27 bitmap_screen#28 bitmap_screen#3 Alias main::y#1 = main::y#6 Alias main::x#1 = main::x#8 Alias main::vx#1 = main::$9 Alias main::vy#3 = main::vy#5 Alias main::x#6 = main::x#7 Alias main::y#4 = main::y#8 Alias bitmap_gfx#24 = bitmap_gfx#25 Alias bitmap_screen#23 = bitmap_screen#24 Alias main::vx#7 = main::vx#8 Alias main::vy#1 = main::$14 Alias bitmap_gfx#17 = bitmap_gfx#4 Alias bitmap_screen#16 = bitmap_screen#4 Alias bitmap_gfx#11 = bitmap_gfx#5 bitmap_gfx#12 bitmap_gfx#6 Alias bitmap_screen#11 = bitmap_screen#5 bitmap_screen#12 bitmap_screen#6 Successful SSA optimization Pass2AliasElimination Alias bitmap_init::x#2 = bitmap_init::x#3 Alias bitmap_init::gfx#2 = bitmap_init::gfx#4 Alias bitmap_gfx#22 = bitmap_gfx#30 Alias bitmap_screen#21 = bitmap_screen#29 Alias bitmap_init::y#2 = bitmap_init::y#3 Alias bitmap_gfx#1 = bitmap_gfx#18 Alias bitmap_screen#1 = bitmap_screen#17 Alias main::y#1 = main::y#4 main::y#7 Alias main::vy#2 = main::vy#3 Alias main::x#1 = main::x#6 main::x#5 Alias bitmap_gfx#10 = bitmap_gfx#24 bitmap_gfx#21 Alias bitmap_screen#10 = bitmap_screen#23 bitmap_screen#20 Alias main::vx#6 = main::vx#7 Successful SSA optimization Pass2AliasElimination Identical Phi Values bitmap_init::gfx#1 bitmap_init::gfx#0 Identical Phi Values bitmap_init::screen#1 bitmap_init::screen#0 Identical Phi Values bitmap_init::gfx#2 bitmap_init::gfx#1 Identical Phi Values bitmap_gfx#22 bitmap_gfx#0 Identical Phi Values bitmap_screen#21 bitmap_screen#0 Identical Phi Values bitmap_gfx#1 bitmap_gfx#22 Identical Phi Values bitmap_screen#1 bitmap_screen#21 Identical Phi Values bitmap_clear::fgcol#1 bitmap_clear::fgcol#0 Identical Phi Values bitmap_clear::bgcol#1 bitmap_clear::bgcol#0 Identical Phi Values bitmap_screen#8 bitmap_screen#19 Identical Phi Values bitmap_gfx#14 bitmap_gfx#2 Identical Phi Values bitmap_plot::y#1 bitmap_plot::y#0 Identical Phi Values bitmap_plot::x#1 bitmap_plot::x#0 Identical Phi Values memset::end#1 memset::end#0 Identical Phi Values memset::str#5 memset::str#3 Identical Phi Values memset::c#2 memset::c#4 Identical Phi Values bitmap_gfx#15 bitmap_gfx#17 Identical Phi Values bitmap_screen#14 bitmap_screen#16 Identical Phi Values bitmap_gfx#2 bitmap_gfx#1 Identical Phi Values bitmap_screen#19 bitmap_screen#1 Identical Phi Values bitmap_gfx#10 bitmap_gfx#2 Identical Phi Values bitmap_screen#10 bitmap_screen#19 Identical Phi Values bitmap_gfx#11 bitmap_gfx#10 Identical Phi Values bitmap_screen#11 bitmap_screen#10 Successful SSA optimization Pass2IdenticalPhiElimination Identical Phi Values memset::return#2 memset::str#3 Successful SSA optimization Pass2IdenticalPhiElimination Identified duplicate assignment right side [27] bitmap_init::$7 = bitmap_init::y#2 & 7 Successful SSA optimization Pass2DuplicateRValueIdentification Simple Condition bitmap_init::$1 [9] if(bitmap_init::bits#1!=0) goto bitmap_init::@2 Simple Condition bitmap_init::$2 [13] if(bitmap_init::x#1!=rangelast(0,$ff)) goto bitmap_init::@1 Simple Condition bitmap_init::$9 [25] if(bitmap_init::$7!=7) goto bitmap_init::@6 Simple Condition bitmap_init::$11 [29] if(bitmap_init::y#1!=rangelast(0,$ff)) goto bitmap_init::@5 Simple Condition memset::$1 [56] if(memset::num#2<=0) goto memset::@1 Simple Condition memset::$3 [63] if(memset::dst#2!=memset::end#0) goto memset::@4 Simple Condition irq::$0 [127] if(0==frame_cnt) goto irq::@1 Successful SSA optimization Pass2ConditionalJumpSimplification Rewriting ! if()-condition to reversed if() [102] main::$8 = ! main::$7 Rewriting || if()-condition to two if()s [101] main::$7 = main::$5 || main::$6 Rewriting ! if()-condition to reversed if() [108] main::$13 = ! main::$12 Rewriting || if()-condition to two if()s [107] main::$12 = main::$10 || main::$11 Successful SSA optimization Pass2ConditionalAndOrRewriting Constant bitmap_init::bits#0 = $80 Constant bitmap_init::x#0 = 0 Constant bitmap_init::bits#2 = $80 Constant bitmap_init::y#0 = 0 Constant memset::num#0 = $3e8 Constant memset::c#1 = 0 Constant memset::num#1 = $1f40 Constant bitmap_init::gfx#0 = BITMAP Constant bitmap_init::screen#0 = SCREEN Constant bitmap_clear::bgcol#0 = BLACK Constant bitmap_clear::fgcol#0 = WHITE Constant main::toD0181_screen#0 = SCREEN Constant main::toD0181_gfx#0 = BITMAP Constant main::x#0 = 0 Constant main::y#0 = 0 Constant main::vx#0 = 1 Constant main::vy#0 = 1 Constant bitmap_screen#16 = (char *) 0 Constant bitmap_gfx#17 = (char *) 0 Successful SSA optimization Pass2ConstantIdentification Constant bitmap_gfx#0 = bitmap_init::gfx#0 Constant bitmap_screen#0 = bitmap_init::screen#0 Constant main::toD0181_$7 = (unsigned int)main::toD0181_screen#0 Successful SSA optimization Pass2ConstantIdentification Constant memset::str#0 = (void *)bitmap_screen#0 Constant memset::str#1 = (void *)bitmap_gfx#0 Successful SSA optimization Pass2ConstantIdentification Constant value identified (unsigned int)main::toD0181_gfx#0 in [82] main::toD0181_$3 = byte1 (unsigned int)main::toD0181_gfx#0 Successful SSA optimization Pass2ConstantValues if() condition always true - replacing block destination [93] if(true) goto main::@2 Successful SSA optimization Pass2ConstantIfs Resolved ranged next value [11] bitmap_init::x#1 = ++ bitmap_init::x#2 to ++ Resolved ranged comparison value [13] if(bitmap_init::x#1!=rangelast(0,$ff)) goto bitmap_init::@1 to 0 Resolved ranged next value [27] bitmap_init::y#1 = ++ bitmap_init::y#2 to ++ Resolved ranged comparison value [29] if(bitmap_init::y#1!=rangelast(0,$ff)) goto bitmap_init::@5 to 0 Simplifying expression containing zero bitmap_clear::$0 in [34] bitmap_clear::col#0 = bitmap_clear::$0 + bitmap_clear::bgcol#0 Successful SSA optimization PassNSimplifyExpressionWithZero Removing unused block main::@return Successful SSA optimization Pass2EliminateUnusedBlocks Eliminating unused variable memset::return#0 and assignment [25] memset::return#0 = memset::str#3 Eliminating unused variable memset::return#1 and assignment [27] memset::return#1 = memset::str#3 Eliminating unused constant bitmap_clear::bgcol#0 Eliminating unused constant bitmap_screen#16 Eliminating unused constant bitmap_gfx#17 Successful SSA optimization PassNEliminateUnusedVars Adding number conversion cast (unumber) 0 in if(bitmap_init::x#1!=0) goto bitmap_init::@1 Adding number conversion cast (unumber) 0 in if(bitmap_init::y#1!=0) goto bitmap_init::@5 Successful SSA optimization PassNAddNumberTypeConversions Simplifying constant integer cast 0 Simplifying constant integer cast 0 Successful SSA optimization PassNCastSimplification Finalized unsigned number type (char) 0 Finalized unsigned number type (char) 0 Successful SSA optimization PassNFinalizeNumberTypeConversions Alias bitmap_init::$7 = bitmap_init::$3 Alias bitmap_clear::col#0 = bitmap_clear::$0 Successful SSA optimization Pass2AliasElimination Simple Condition main::$5 [62] if(main::x#1==$13f) goto main::@5 Simple Condition main::$10 [66] if(main::y#1==$c7) goto main::@6 Simple Condition main::$6 [71] if(main::x#1==0) goto main::@5 Simple Condition main::$11 [72] if(main::y#1==0) goto main::@6 Successful SSA optimization Pass2ConditionalJumpSimplification Negating conditional jump and destination [71] if(main::x#1!=0) goto main::@3 Negating conditional jump and destination [72] if(main::y#1!=0) goto main::@4 Successful SSA optimization Pass2ConditionalJumpSequenceImprovement Constant right-side identified [20] bitmap_clear::col#0 = bitmap_clear::fgcol#0 * $10 Constant right-side identified [45] main::toD0181_$0 = main::toD0181_$7 & $3fff Constant right-side identified [48] main::toD0181_$3 = byte1 (unsigned int)main::toD0181_gfx#0 Successful SSA optimization Pass2ConstantRValueConsolidation Constant bitmap_clear::col#0 = bitmap_clear::fgcol#0*$10 Constant main::toD0181_$0 = main::toD0181_$7&$3fff Constant main::toD0181_$3 = byte1 (unsigned int)main::toD0181_gfx#0 Successful SSA optimization Pass2ConstantIdentification Constant memset::c#0 = bitmap_clear::col#0 Successful SSA optimization Pass2ConstantIdentification Constant right-side identified [43] main::toD0181_$1 = main::toD0181_$0 * 4 Constant right-side identified [45] main::toD0181_$4 = main::toD0181_$3 / 4 Successful SSA optimization Pass2ConstantRValueConsolidation Constant main::toD0181_$1 = main::toD0181_$0*4 Constant main::toD0181_$4 = main::toD0181_$3/4 Successful SSA optimization Pass2ConstantIdentification Constant right-side identified [43] main::toD0181_$2 = byte1 main::toD0181_$1 Constant right-side identified [44] main::toD0181_$5 = main::toD0181_$4 & $f Successful SSA optimization Pass2ConstantRValueConsolidation Constant main::toD0181_$2 = byte1 main::toD0181_$1 Constant main::toD0181_$5 = main::toD0181_$4&$f Successful SSA optimization Pass2ConstantIdentification Constant right-side identified [43] main::toD0181_return#0 = main::toD0181_$2 | main::toD0181_$5 Successful SSA optimization Pass2ConstantRValueConsolidation Constant main::toD0181_return#0 = main::toD0181_$2|main::toD0181_$5 Successful SSA optimization Pass2ConstantIdentification Inlining Noop Cast [24] bitmap_plot::plotter#0 = (char *)bitmap_plot::$0 keeping bitmap_plot::plotter#0 Successful SSA optimization Pass2NopCastInlining Inlining Noop Cast [32] memset::$4 = (char *)memset::str#3 keeping memset::str#3 Inlining Noop Cast [34] memset::dst#0 = (char *)memset::str#3 keeping memset::str#3 Successful SSA optimization Pass2NopCastInlining Inlining constant with var siblings bitmap_init::bits#0 Inlining constant with var siblings bitmap_init::x#0 Inlining constant with var siblings bitmap_init::bits#2 Inlining constant with var siblings bitmap_init::y#0 Inlining constant with var siblings memset::num#0 Inlining constant with var siblings memset::c#1 Inlining constant with var siblings memset::num#1 Inlining constant with var siblings memset::str#0 Inlining constant with var siblings memset::str#1 Inlining constant with var siblings memset::c#0 Inlining constant with var siblings main::x#0 Inlining constant with var siblings main::y#0 Inlining constant with var siblings main::vx#0 Inlining constant with var siblings main::vy#0 Constant inlined bitmap_init::screen#0 = SCREEN Constant inlined main::toD0181_screen#0 = SCREEN Constant inlined main::toD0181_gfx#0 = BITMAP Constant inlined bitmap_init::gfx#0 = BITMAP Constant inlined memset::num#1 = $1f40 Constant inlined bitmap_init::bits#0 = $80 Constant inlined memset::num#0 = $3e8 Constant inlined bitmap_init::bits#2 = $80 Constant inlined memset::str#1 = (void *)BITMAP Constant inlined memset::str#0 = (void *)SCREEN Constant inlined main::toD0181_$7 = (unsigned int)SCREEN Constant inlined main::toD0181_$2 = byte1 (unsigned int)SCREEN&$3fff*4 Constant inlined main::toD0181_$1 = (unsigned int)SCREEN&$3fff*4 Constant inlined main::toD0181_$0 = (unsigned int)SCREEN&$3fff Constant inlined main::x#0 = 0 Constant inlined bitmap_clear::fgcol#0 = WHITE Constant inlined bitmap_gfx#0 = BITMAP Constant inlined main::y#0 = 0 Constant inlined main::toD0181_$5 = byte1 (unsigned int)BITMAP/4&$f Constant inlined main::toD0181_$4 = byte1 (unsigned int)BITMAP/4 Constant inlined main::toD0181_$3 = byte1 (unsigned int)BITMAP Constant inlined main::vy#0 = 1 Constant inlined main::vx#0 = 1 Constant inlined bitmap_screen#0 = SCREEN Constant inlined bitmap_init::y#0 = 0 Constant inlined memset::c#0 = bitmap_clear::col#0 Constant inlined bitmap_init::x#0 = 0 Constant inlined memset::c#1 = 0 Successful SSA optimization Pass2ConstantInlining Finalized unsigned number type (unsigned int) $100 Finalized unsigned number type (unsigned int) $100 Finalized unsigned number type (unsigned int) $100 Finalized unsigned number type (unsigned int) $100 Finalized unsigned number type (unsigned int) $100 Finalized unsigned number type (unsigned int) $100 Finalized unsigned number type (unsigned int) $100 Finalized unsigned number type (unsigned int) $100 Finalized unsigned number type (char) $28 Finalized unsigned number type (char) 8 Successful SSA optimization PassNFinalizeNumberTypeConversions Added new block during phi lifting bitmap_init::@8(between bitmap_init::@2 and bitmap_init::@1) Added new block during phi lifting bitmap_init::@9(between bitmap_init::@1 and bitmap_init::@2) Added new block during phi lifting bitmap_init::@10(between bitmap_init::@6 and bitmap_init::@5) Added new block during phi lifting bitmap_init::@11(between bitmap_init::@5 and bitmap_init::@6) Added new block during phi lifting main::@14(between main::@12 and main::@3) Added new block during phi lifting main::@15(between main::@13 and main::@4) Adding NOP phi() at start of __start Adding NOP phi() at start of __start::@1 Adding NOP phi() at start of __start::@2 Adding NOP phi() at start of main Adding NOP phi() at start of main::@8 Adding NOP phi() at start of main::toD0181 Adding NOP phi() at start of main::toD0181_@return Adding NOP phi() at start of main::@10 Adding NOP phi() at start of bitmap_init Adding NOP phi() at start of bitmap_init::@3 Adding NOP phi() at start of bitmap_init::@4 Adding NOP phi() at start of bitmap_clear Adding NOP phi() at start of bitmap_clear::@1 Adding NOP phi() at start of bitmap_clear::@2 Adding NOP phi() at start of memset::@1 CALL GRAPH Calls in [__start] to main:3 Calls in [main] to bitmap_init:13 bitmap_clear:15 init_irq:20 bitmap_plot:25 Calls in [bitmap_clear] to memset:76 memset:78 Created 16 initial phi equivalence classes Coalesced [31] main::vx#11 = main::vx#1 Coalesced [36] main::vy#11 = main::vy#1 Coalesced [39] main::x#9 = main::x#1 Coalesced [40] main::y#9 = main::y#1 Coalesced [41] main::vx#9 = main::vx#6 Coalesced [42] main::vy#9 = main::vy#8 Coalesced (already) [43] main::vy#10 = main::vy#2 Coalesced (already) [44] main::vx#10 = main::vx#2 Coalesced [64] bitmap_init::yoffs#7 = bitmap_init::yoffs#1 Coalesced [69] bitmap_init::y#5 = bitmap_init::y#1 Coalesced [70] bitmap_init::yoffs#5 = bitmap_init::yoffs#4 Coalesced (already) [71] bitmap_init::yoffs#6 = bitmap_init::yoffs#2 Coalesced [72] bitmap_init::bits#5 = bitmap_init::bits#4 Coalesced [73] bitmap_init::x#5 = bitmap_init::x#1 Coalesced [74] bitmap_init::bits#6 = bitmap_init::bits#1 Coalesced [107] memset::dst#5 = memset::dst#1 Coalesced down to 12 phi equivalence classes Culled Empty Block label __start::@2 Culled Empty Block label main::toD0181_@return Culled Empty Block label main::@10 Culled Empty Block label main::@15 Culled Empty Block label main::@14 Culled Empty Block label bitmap_init::@3 Culled Empty Block label bitmap_init::@4 Culled Empty Block label bitmap_init::@10 Culled Empty Block label bitmap_init::@11 Culled Empty Block label bitmap_init::@8 Culled Empty Block label bitmap_clear::@2 Culled Empty Block label memset::@1 Renumbering block bitmap_init::@5 to bitmap_init::@3 Renumbering block bitmap_init::@6 to bitmap_init::@4 Renumbering block bitmap_init::@7 to bitmap_init::@5 Renumbering block bitmap_init::@9 to bitmap_init::@6 Renumbering block memset::@2 to memset::@1 Renumbering block memset::@3 to memset::@2 Renumbering block memset::@4 to memset::@3 Renumbering block main::@11 to main::@10 Renumbering block main::@12 to main::@11 Renumbering block main::@13 to main::@12 Adding NOP phi() at start of __start Adding NOP phi() at start of __start::@1 Adding NOP phi() at start of main Adding NOP phi() at start of main::@8 Adding NOP phi() at start of main::toD0181 Adding NOP phi() at start of bitmap_init Adding NOP phi() at start of bitmap_init::@6 Adding NOP phi() at start of bitmap_clear Adding NOP phi() at start of bitmap_clear::@1 FINAL CONTROL FLOW GRAPH void __start() __start: scope:[__start] from [0] phi() to:__start::__init1 __start::__init1: scope:[__start] from __start [1] frame_cnt = 1 to:__start::@1 __start::@1: scope:[__start] from __start::__init1 [2] phi() [3] call main to:__start::@return __start::@return: scope:[__start] from __start::@1 [4] return to:@return __interrupt(hardware_clobber) void irq() irq: scope:[irq] from [5] *BG_COLOR = WHITE [6] if(0==frame_cnt) goto irq::@1 to:irq::@2 irq::@2: scope:[irq] from irq [7] frame_cnt = ++ frame_cnt to:irq::@1 irq::@1: scope:[irq] from irq irq::@2 [8] *BG_COLOR = BLACK [9] *IRQ_STATUS = IRQ_RASTER to:irq::@return irq::@return: scope:[irq] from irq::@1 [10] return to:@return void main() main: scope:[main] from __start::@1 [11] phi() [12] call bitmap_init to:main::@8 main::@8: scope:[main] from main [13] phi() [14] call bitmap_clear to:main::@9 main::@9: scope:[main] from main::@8 [15] *D011 = VICII_BMM|VICII_DEN|VICII_RSEL|3 to:main::toD0181 main::toD0181: scope:[main] from main::@9 [16] phi() to:main::@7 main::@7: scope:[main] from main::toD0181 [17] *D018 = main::toD0181_return#0 [18] call init_irq to:main::@1 main::@1: scope:[main] from main::@4 main::@7 [19] main::vy#2 = phi( main::@7/1, main::@4/main::vy#8 ) [19] main::vx#2 = phi( main::@7/1, main::@4/main::vx#6 ) [19] main::y#2 = phi( main::@7/0, main::@4/main::y#1 ) [19] main::x#2 = phi( main::@7/0, main::@4/main::x#1 ) to:main::@2 main::@2: scope:[main] from main::@1 [20] bitmap_plot::x#0 = main::x#2 [21] bitmap_plot::y#0 = main::y#2 [22] call bitmap_plot to:main::@10 main::@10: scope:[main] from main::@2 [23] main::x#1 = main::x#2 + main::vx#2 [24] main::y#1 = main::y#2 + main::vy#2 [25] if(main::x#1==$13f) goto main::@5 to:main::@11 main::@11: scope:[main] from main::@10 [26] if(main::x#1!=0) goto main::@3 to:main::@5 main::@5: scope:[main] from main::@10 main::@11 [27] main::vx#1 = - main::vx#2 to:main::@3 main::@3: scope:[main] from main::@11 main::@5 [28] main::vx#6 = phi( main::@11/main::vx#2, main::@5/main::vx#1 ) [29] if(main::y#1==$c7) goto main::@6 to:main::@12 main::@12: scope:[main] from main::@3 [30] if(main::y#1!=0) goto main::@4 to:main::@6 main::@6: scope:[main] from main::@12 main::@3 [31] main::vy#1 = - main::vy#2 to:main::@4 main::@4: scope:[main] from main::@12 main::@6 [32] main::vy#8 = phi( main::@12/main::vy#2, main::@6/main::vy#1 ) [33] plots_per_frame[frame_cnt] = ++ plots_per_frame[frame_cnt] to:main::@1 void bitmap_init(char *gfx , char *screen) bitmap_init: scope:[bitmap_init] from main [34] phi() to:bitmap_init::@1 bitmap_init::@1: scope:[bitmap_init] from bitmap_init bitmap_init::@2 [35] bitmap_init::x#2 = phi( bitmap_init/0, bitmap_init::@2/bitmap_init::x#1 ) [35] bitmap_init::bits#3 = phi( bitmap_init/$80, bitmap_init::@2/bitmap_init::bits#4 ) [36] bitmap_plot_bit[bitmap_init::x#2] = bitmap_init::bits#3 [37] bitmap_init::bits#1 = bitmap_init::bits#3 >> 1 [38] if(bitmap_init::bits#1!=0) goto bitmap_init::@6 to:bitmap_init::@2 bitmap_init::@6: scope:[bitmap_init] from bitmap_init::@1 [39] phi() to:bitmap_init::@2 bitmap_init::@2: scope:[bitmap_init] from bitmap_init::@1 bitmap_init::@6 [40] bitmap_init::bits#4 = phi( bitmap_init::@6/bitmap_init::bits#1, bitmap_init::@1/$80 ) [41] bitmap_init::x#1 = ++ bitmap_init::x#2 [42] if(bitmap_init::x#1!=0) goto bitmap_init::@1 to:bitmap_init::@3 bitmap_init::@3: scope:[bitmap_init] from bitmap_init::@2 bitmap_init::@4 [43] bitmap_init::yoffs#2 = phi( bitmap_init::@2/BITMAP, bitmap_init::@4/bitmap_init::yoffs#4 ) [43] bitmap_init::y#2 = phi( bitmap_init::@2/0, bitmap_init::@4/bitmap_init::y#1 ) [44] bitmap_init::$7 = bitmap_init::y#2 & 7 [45] bitmap_init::$4 = byte0 bitmap_init::yoffs#2 [46] bitmap_init::$5 = bitmap_init::$7 | bitmap_init::$4 [47] bitmap_plot_ylo[bitmap_init::y#2] = bitmap_init::$5 [48] bitmap_init::$6 = byte1 bitmap_init::yoffs#2 [49] bitmap_plot_yhi[bitmap_init::y#2] = bitmap_init::$6 [50] if(bitmap_init::$7!=7) goto bitmap_init::@4 to:bitmap_init::@5 bitmap_init::@5: scope:[bitmap_init] from bitmap_init::@3 [51] bitmap_init::yoffs#1 = bitmap_init::yoffs#2 + (unsigned int)$28*8 to:bitmap_init::@4 bitmap_init::@4: scope:[bitmap_init] from bitmap_init::@3 bitmap_init::@5 [52] bitmap_init::yoffs#4 = phi( bitmap_init::@3/bitmap_init::yoffs#2, bitmap_init::@5/bitmap_init::yoffs#1 ) [53] bitmap_init::y#1 = ++ bitmap_init::y#2 [54] if(bitmap_init::y#1!=0) goto bitmap_init::@3 to:bitmap_init::@return bitmap_init::@return: scope:[bitmap_init] from bitmap_init::@4 [55] return to:@return void bitmap_clear(char bgcol , char fgcol) bitmap_clear: scope:[bitmap_clear] from main::@8 [56] phi() [57] call memset to:bitmap_clear::@1 bitmap_clear::@1: scope:[bitmap_clear] from bitmap_clear [58] phi() [59] call memset to:bitmap_clear::@return bitmap_clear::@return: scope:[bitmap_clear] from bitmap_clear::@1 [60] return to:@return void init_irq() init_irq: scope:[init_irq] from main::@7 asm { sei } [62] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [63] *PROCPORT = PROCPORT_RAM_IO [64] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL [65] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 [66] *RASTER = 0 [67] *IRQ_ENABLE = IRQ_RASTER [68] *HARDWARE_IRQ = &irq asm { cli } to:init_irq::@return init_irq::@return: scope:[init_irq] from init_irq [70] return to:@return void bitmap_plot(unsigned int x , char y) bitmap_plot: scope:[bitmap_plot] from main::@2 [71] bitmap_plot::plotter#0 = bitmap_plot_yhi[bitmap_plot::y#0] w= bitmap_plot_ylo[bitmap_plot::y#0] [72] bitmap_plot::$1 = bitmap_plot::x#0 & $fff8 [73] bitmap_plot::plotter#1 = (char *)bitmap_plot::plotter#0 + bitmap_plot::$1 [74] bitmap_plot::$2 = byte0 bitmap_plot::x#0 [75] *bitmap_plot::plotter#1 = *bitmap_plot::plotter#1 | bitmap_plot_bit[bitmap_plot::$2] to:bitmap_plot::@return bitmap_plot::@return: scope:[bitmap_plot] from bitmap_plot [76] return to:@return void * memset(void *str , char c , unsigned int num) memset: scope:[memset] from bitmap_clear bitmap_clear::@1 [77] memset::c#4 = phi( bitmap_clear/bitmap_clear::col#0, bitmap_clear::@1/0 ) [77] memset::str#3 = phi( bitmap_clear/(void *)SCREEN, bitmap_clear::@1/(void *)BITMAP ) [77] memset::num#2 = phi( bitmap_clear/$3e8, bitmap_clear::@1/$1f40 ) [78] if(memset::num#2<=0) goto memset::@return to:memset::@1 memset::@1: scope:[memset] from memset [79] memset::end#0 = (char *)memset::str#3 + memset::num#2 [80] memset::dst#4 = (char *)memset::str#3 to:memset::@2 memset::@2: scope:[memset] from memset::@1 memset::@3 [81] memset::dst#2 = phi( memset::@1/memset::dst#4, memset::@3/memset::dst#1 ) [82] if(memset::dst#2!=memset::end#0) goto memset::@3 to:memset::@return memset::@return: scope:[memset] from memset memset::@2 [83] return to:@return memset::@3: scope:[memset] from memset::@2 [84] *memset::dst#2 = memset::c#4 [85] memset::dst#1 = ++ memset::dst#2 to:memset::@2 VARIABLE REGISTER WEIGHTS void __start() void bitmap_clear(char bgcol , char fgcol) char bitmap_clear::bgcol char bitmap_clear::col char bitmap_clear::fgcol char *bitmap_gfx void bitmap_init(char *gfx , char *screen) char bitmap_init::$4 // 2002.0 char bitmap_init::$5 // 2002.0 char bitmap_init::$6 // 2002.0 char bitmap_init::$7 // 500.5 char bitmap_init::bits char bitmap_init::bits#1 // 1001.0 char bitmap_init::bits#3 // 1501.5 char bitmap_init::bits#4 // 667.3333333333334 char *bitmap_init::gfx char *bitmap_init::screen char bitmap_init::x char bitmap_init::x#1 // 1501.5 char bitmap_init::x#2 // 500.5 char bitmap_init::y char bitmap_init::y#1 // 1501.5 char bitmap_init::y#2 // 500.5 char *bitmap_init::yoffs char *bitmap_init::yoffs#1 // 2002.0 char *bitmap_init::yoffs#2 // 625.625 char *bitmap_init::yoffs#4 // 1001.0 void bitmap_plot(unsigned int x , char y) unsigned int bitmap_plot::$1 // 2002.0 char bitmap_plot::$2 // 2002.0 char *bitmap_plot::plotter unsigned int bitmap_plot::plotter#0 // 500.5 char *bitmap_plot::plotter#1 // 1501.5 unsigned int bitmap_plot::x unsigned int bitmap_plot::x#0 // 420.59999999999997 char bitmap_plot::y char bitmap_plot::y#0 // 2103.0 char *bitmap_screen __loadstore volatile char frame_cnt // 7.777777777777779 void init_irq() __interrupt(hardware_clobber) void irq() void main() char *main::toD0181_gfx char main::toD0181_return char *main::toD0181_screen unsigned int main::vx unsigned int main::vx#1 // 202.0 unsigned int main::vx#2 // 50.5 unsigned int main::vx#6 // 50.5 char main::vy char main::vy#1 // 202.0 char main::vy#2 // 33.666666666666664 char main::vy#8 // 151.5 unsigned int main::x unsigned int main::x#1 // 36.72727272727273 unsigned int main::x#2 // 75.75 char main::y char main::y#1 // 40.4 char main::y#2 // 60.599999999999994 void * memset(void *str , char c , unsigned int num) char memset::c char memset::c#4 // 1250.125 char *memset::dst char *memset::dst#1 // 20002.0 char *memset::dst#2 // 13668.333333333332 char *memset::dst#4 // 2002.0 char *memset::end char *memset::end#0 // 1833.6666666666665 unsigned int memset::num unsigned int memset::num#2 // 1001.0 void *memset::return void *memset::str void *memset::str#3 Initial phi equivalence classes [ main::x#2 main::x#1 ] [ main::y#2 main::y#1 ] [ main::vx#2 main::vx#6 main::vx#1 ] [ main::vy#2 main::vy#8 main::vy#1 ] [ bitmap_init::bits#3 bitmap_init::bits#4 bitmap_init::bits#1 ] [ bitmap_init::x#2 bitmap_init::x#1 ] [ bitmap_init::y#2 bitmap_init::y#1 ] [ bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 ] [ memset::num#2 ] [ memset::str#3 ] [ memset::c#4 ] [ memset::dst#2 memset::dst#4 memset::dst#1 ] Added variable frame_cnt to live range equivalence class [ frame_cnt ] Added variable bitmap_plot::x#0 to live range equivalence class [ bitmap_plot::x#0 ] Added variable bitmap_plot::y#0 to live range equivalence class [ bitmap_plot::y#0 ] Added variable bitmap_init::$7 to live range equivalence class [ bitmap_init::$7 ] Added variable bitmap_init::$4 to live range equivalence class [ bitmap_init::$4 ] Added variable bitmap_init::$5 to live range equivalence class [ bitmap_init::$5 ] Added variable bitmap_init::$6 to live range equivalence class [ bitmap_init::$6 ] Added variable bitmap_plot::plotter#0 to live range equivalence class [ bitmap_plot::plotter#0 ] Added variable bitmap_plot::$1 to live range equivalence class [ bitmap_plot::$1 ] Added variable bitmap_plot::plotter#1 to live range equivalence class [ bitmap_plot::plotter#1 ] Added variable bitmap_plot::$2 to live range equivalence class [ bitmap_plot::$2 ] Added variable memset::end#0 to live range equivalence class [ memset::end#0 ] Complete equivalence classes [ main::x#2 main::x#1 ] [ main::y#2 main::y#1 ] [ main::vx#2 main::vx#6 main::vx#1 ] [ main::vy#2 main::vy#8 main::vy#1 ] [ bitmap_init::bits#3 bitmap_init::bits#4 bitmap_init::bits#1 ] [ bitmap_init::x#2 bitmap_init::x#1 ] [ bitmap_init::y#2 bitmap_init::y#1 ] [ bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 ] [ memset::num#2 ] [ memset::str#3 ] [ memset::c#4 ] [ memset::dst#2 memset::dst#4 memset::dst#1 ] [ frame_cnt ] [ bitmap_plot::x#0 ] [ bitmap_plot::y#0 ] [ bitmap_init::$7 ] [ bitmap_init::$4 ] [ bitmap_init::$5 ] [ bitmap_init::$6 ] [ bitmap_plot::plotter#0 ] [ bitmap_plot::$1 ] [ bitmap_plot::plotter#1 ] [ bitmap_plot::$2 ] [ memset::end#0 ] Allocated zp[2]:2 [ memset::dst#2 memset::dst#4 memset::dst#1 ] Allocated zp[2]:4 [ bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 ] Allocated zp[1]:6 [ bitmap_init::bits#3 bitmap_init::bits#4 bitmap_init::bits#1 ] Allocated zp[1]:7 [ bitmap_plot::y#0 ] Allocated zp[1]:8 [ bitmap_init::x#2 bitmap_init::x#1 ] Allocated zp[1]:9 [ bitmap_init::y#2 bitmap_init::y#1 ] Allocated zp[1]:10 [ bitmap_init::$4 ] Allocated zp[1]:11 [ bitmap_init::$5 ] Allocated zp[1]:12 [ bitmap_init::$6 ] Allocated zp[2]:13 [ bitmap_plot::$1 ] Allocated zp[1]:15 [ bitmap_plot::$2 ] Allocated zp[2]:16 [ memset::end#0 ] Allocated zp[2]:18 [ bitmap_plot::plotter#1 ] Allocated zp[1]:20 [ memset::c#4 ] Allocated zp[2]:21 [ memset::num#2 ] Allocated zp[1]:23 [ bitmap_init::$7 ] Allocated zp[2]:24 [ bitmap_plot::plotter#0 ] Allocated zp[2]:26 [ bitmap_plot::x#0 ] Allocated zp[1]:28 [ main::vy#2 main::vy#8 main::vy#1 ] Allocated zp[2]:29 [ main::vx#2 main::vx#6 main::vx#1 ] Allocated zp[2]:31 [ main::x#2 main::x#1 ] Allocated zp[1]:33 [ main::y#2 main::y#1 ] Allocated zp[1]:34 [ frame_cnt ] Allocated zp[2]:35 [ memset::str#3 ] REGISTER UPLIFT POTENTIAL REGISTERS Statement [1] frame_cnt = 1 [ frame_cnt ] ( [ frame_cnt ] { } ) always clobbers reg byte a Statement [5] *BG_COLOR = WHITE [ frame_cnt ] ( [ frame_cnt ] { } ) always clobbers reg byte a Statement [6] if(0==frame_cnt) goto irq::@1 [ frame_cnt ] ( [ frame_cnt ] { } ) always clobbers reg byte a Statement [8] *BG_COLOR = BLACK [ ] ( [ ] { } ) always clobbers reg byte a Statement [9] *IRQ_STATUS = IRQ_RASTER [ ] ( [ ] { } ) always clobbers reg byte a Statement [10] return [ ] ( [ ] { } ) always clobbers reg byte a reg byte x reg byte y Statement [15] *D011 = VICII_BMM|VICII_DEN|VICII_RSEL|3 [ frame_cnt ] ( main:3 [ frame_cnt ] { } ) always clobbers reg byte a Statement [17] *D018 = main::toD0181_return#0 [ frame_cnt ] ( main:3 [ frame_cnt ] { } ) always clobbers reg byte a Statement [20] bitmap_plot::x#0 = main::x#2 [ frame_cnt main::x#2 main::y#2 main::vx#2 main::vy#2 bitmap_plot::x#0 ] ( main:3 [ frame_cnt main::x#2 main::y#2 main::vx#2 main::vy#2 bitmap_plot::x#0 ] { { bitmap_plot::x#0 = main::x#2 } { bitmap_plot::y#0 = main::y#2 } } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:33 [ main::y#2 main::y#1 ] Removing always clobbered register reg byte a as potential for zp[1]:28 [ main::vy#2 main::vy#8 main::vy#1 ] Statement [23] main::x#1 = main::x#2 + main::vx#2 [ frame_cnt main::y#2 main::vx#2 main::vy#2 main::x#1 ] ( main:3 [ frame_cnt main::y#2 main::vx#2 main::vy#2 main::x#1 ] { } ) always clobbers reg byte a Statement [24] main::y#1 = main::y#2 + main::vy#2 [ frame_cnt main::vx#2 main::vy#2 main::x#1 main::y#1 ] ( main:3 [ frame_cnt main::vx#2 main::vy#2 main::x#1 main::y#1 ] { } ) always clobbers reg byte a Statement [25] if(main::x#1==$13f) goto main::@5 [ frame_cnt main::vx#2 main::vy#2 main::x#1 main::y#1 ] ( main:3 [ frame_cnt main::vx#2 main::vy#2 main::x#1 main::y#1 ] { } ) always clobbers reg byte a Statement [26] if(main::x#1!=0) goto main::@3 [ frame_cnt main::vx#2 main::vy#2 main::x#1 main::y#1 ] ( main:3 [ frame_cnt main::vx#2 main::vy#2 main::x#1 main::y#1 ] { } ) always clobbers reg byte a Statement [27] main::vx#1 = - main::vx#2 [ frame_cnt main::vy#2 main::x#1 main::y#1 main::vx#1 ] ( main:3 [ frame_cnt main::vy#2 main::x#1 main::y#1 main::vx#1 ] { } ) always clobbers reg byte a Statement [31] main::vy#1 = - main::vy#2 [ frame_cnt main::x#1 main::y#1 main::vx#6 main::vy#1 ] ( main:3 [ frame_cnt main::x#1 main::y#1 main::vx#6 main::vy#1 ] { } ) always clobbers reg byte a Statement [33] plots_per_frame[frame_cnt] = ++ plots_per_frame[frame_cnt] [ frame_cnt main::x#1 main::y#1 main::vx#6 main::vy#8 ] ( main:3 [ frame_cnt main::x#1 main::y#1 main::vx#6 main::vy#8 ] { } ) always clobbers reg byte x Removing always clobbered register reg byte x as potential for zp[1]:33 [ main::y#2 main::y#1 ] Removing always clobbered register reg byte x as potential for zp[1]:28 [ main::vy#2 main::vy#8 main::vy#1 ] Statement [51] bitmap_init::yoffs#1 = bitmap_init::yoffs#2 + (unsigned int)$28*8 [ bitmap_init::y#2 bitmap_init::yoffs#1 ] ( main:3::bitmap_init:12 [ frame_cnt bitmap_init::y#2 bitmap_init::yoffs#1 ] { } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:9 [ bitmap_init::y#2 bitmap_init::y#1 ] Statement [62] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:3::init_irq:18 [ frame_cnt ] { } ) always clobbers reg byte a Statement [63] *PROCPORT = PROCPORT_RAM_IO [ ] ( main:3::init_irq:18 [ frame_cnt ] { } ) always clobbers reg byte a Statement [64] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL [ ] ( main:3::init_irq:18 [ frame_cnt ] { } ) always clobbers reg byte a Statement [65] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 [ ] ( main:3::init_irq:18 [ frame_cnt ] { } ) always clobbers reg byte a Statement [66] *RASTER = 0 [ ] ( main:3::init_irq:18 [ frame_cnt ] { } ) always clobbers reg byte a Statement [67] *IRQ_ENABLE = IRQ_RASTER [ ] ( main:3::init_irq:18 [ frame_cnt ] { } ) always clobbers reg byte a Statement [68] *HARDWARE_IRQ = &irq [ ] ( main:3::init_irq:18 [ frame_cnt ] { } ) always clobbers reg byte a Statement [71] bitmap_plot::plotter#0 = bitmap_plot_yhi[bitmap_plot::y#0] w= bitmap_plot_ylo[bitmap_plot::y#0] [ bitmap_plot::x#0 bitmap_plot::plotter#0 ] ( main:3::bitmap_plot:22 [ frame_cnt main::x#2 main::y#2 main::vx#2 main::vy#2 bitmap_plot::x#0 bitmap_plot::plotter#0 ] { { bitmap_plot::x#0 = main::x#2 } { bitmap_plot::y#0 = main::y#2 } } ) always clobbers reg byte a Statement [72] bitmap_plot::$1 = bitmap_plot::x#0 & $fff8 [ bitmap_plot::x#0 bitmap_plot::plotter#0 bitmap_plot::$1 ] ( main:3::bitmap_plot:22 [ frame_cnt main::x#2 main::y#2 main::vx#2 main::vy#2 bitmap_plot::x#0 bitmap_plot::plotter#0 bitmap_plot::$1 ] { { bitmap_plot::x#0 = main::x#2 } { bitmap_plot::y#0 = main::y#2 } } ) always clobbers reg byte a Statement [73] bitmap_plot::plotter#1 = (char *)bitmap_plot::plotter#0 + bitmap_plot::$1 [ bitmap_plot::x#0 bitmap_plot::plotter#1 ] ( main:3::bitmap_plot:22 [ frame_cnt main::x#2 main::y#2 main::vx#2 main::vy#2 bitmap_plot::x#0 bitmap_plot::plotter#1 ] { { bitmap_plot::x#0 = main::x#2 } { bitmap_plot::y#0 = main::y#2 } } ) always clobbers reg byte a Statement [75] *bitmap_plot::plotter#1 = *bitmap_plot::plotter#1 | bitmap_plot_bit[bitmap_plot::$2] [ ] ( main:3::bitmap_plot:22 [ frame_cnt main::x#2 main::y#2 main::vx#2 main::vy#2 ] { { bitmap_plot::x#0 = main::x#2 } { bitmap_plot::y#0 = main::y#2 } } ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte y as potential for zp[1]:33 [ main::y#2 main::y#1 ] Removing always clobbered register reg byte y as potential for zp[1]:28 [ main::vy#2 main::vy#8 main::vy#1 ] Statement [78] if(memset::num#2<=0) goto memset::@return [ memset::num#2 memset::str#3 memset::c#4 ] ( main:3::bitmap_clear:14::memset:57 [ frame_cnt memset::num#2 memset::str#3 memset::c#4 ] { } main:3::bitmap_clear:14::memset:59 [ frame_cnt memset::num#2 memset::str#3 memset::c#4 ] { } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:20 [ memset::c#4 ] Statement [79] memset::end#0 = (char *)memset::str#3 + memset::num#2 [ memset::str#3 memset::c#4 memset::end#0 ] ( main:3::bitmap_clear:14::memset:57 [ frame_cnt memset::str#3 memset::c#4 memset::end#0 ] { } main:3::bitmap_clear:14::memset:59 [ frame_cnt memset::str#3 memset::c#4 memset::end#0 ] { } ) always clobbers reg byte a Statement [80] memset::dst#4 = (char *)memset::str#3 [ memset::c#4 memset::end#0 memset::dst#4 ] ( main:3::bitmap_clear:14::memset:57 [ frame_cnt memset::c#4 memset::end#0 memset::dst#4 ] { } main:3::bitmap_clear:14::memset:59 [ frame_cnt memset::c#4 memset::end#0 memset::dst#4 ] { } ) always clobbers reg byte a Statement [82] if(memset::dst#2!=memset::end#0) goto memset::@3 [ memset::c#4 memset::end#0 memset::dst#2 ] ( main:3::bitmap_clear:14::memset:57 [ frame_cnt memset::c#4 memset::end#0 memset::dst#2 ] { } main:3::bitmap_clear:14::memset:59 [ frame_cnt memset::c#4 memset::end#0 memset::dst#2 ] { } ) always clobbers reg byte a Statement [84] *memset::dst#2 = memset::c#4 [ memset::c#4 memset::end#0 memset::dst#2 ] ( main:3::bitmap_clear:14::memset:57 [ frame_cnt memset::c#4 memset::end#0 memset::dst#2 ] { } main:3::bitmap_clear:14::memset:59 [ frame_cnt memset::c#4 memset::end#0 memset::dst#2 ] { } ) always clobbers reg byte a reg byte y Removing always clobbered register reg byte y as potential for zp[1]:20 [ memset::c#4 ] Statement [1] frame_cnt = 1 [ frame_cnt ] ( [ frame_cnt ] { } ) always clobbers reg byte a Statement [5] *BG_COLOR = WHITE [ frame_cnt ] ( [ frame_cnt ] { } ) always clobbers reg byte a Statement [6] if(0==frame_cnt) goto irq::@1 [ frame_cnt ] ( [ frame_cnt ] { } ) always clobbers reg byte a Statement [8] *BG_COLOR = BLACK [ ] ( [ ] { } ) always clobbers reg byte a Statement [9] *IRQ_STATUS = IRQ_RASTER [ ] ( [ ] { } ) always clobbers reg byte a Statement [10] return [ ] ( [ ] { } ) always clobbers reg byte a reg byte x reg byte y Statement [15] *D011 = VICII_BMM|VICII_DEN|VICII_RSEL|3 [ frame_cnt ] ( main:3 [ frame_cnt ] { } ) always clobbers reg byte a Statement [17] *D018 = main::toD0181_return#0 [ frame_cnt ] ( main:3 [ frame_cnt ] { } ) always clobbers reg byte a Statement [20] bitmap_plot::x#0 = main::x#2 [ frame_cnt main::x#2 main::y#2 main::vx#2 main::vy#2 bitmap_plot::x#0 ] ( main:3 [ frame_cnt main::x#2 main::y#2 main::vx#2 main::vy#2 bitmap_plot::x#0 ] { { bitmap_plot::x#0 = main::x#2 } { bitmap_plot::y#0 = main::y#2 } } ) always clobbers reg byte a Statement [23] main::x#1 = main::x#2 + main::vx#2 [ frame_cnt main::y#2 main::vx#2 main::vy#2 main::x#1 ] ( main:3 [ frame_cnt main::y#2 main::vx#2 main::vy#2 main::x#1 ] { } ) always clobbers reg byte a Statement [24] main::y#1 = main::y#2 + main::vy#2 [ frame_cnt main::vx#2 main::vy#2 main::x#1 main::y#1 ] ( main:3 [ frame_cnt main::vx#2 main::vy#2 main::x#1 main::y#1 ] { } ) always clobbers reg byte a Statement [25] if(main::x#1==$13f) goto main::@5 [ frame_cnt main::vx#2 main::vy#2 main::x#1 main::y#1 ] ( main:3 [ frame_cnt main::vx#2 main::vy#2 main::x#1 main::y#1 ] { } ) always clobbers reg byte a Statement [26] if(main::x#1!=0) goto main::@3 [ frame_cnt main::vx#2 main::vy#2 main::x#1 main::y#1 ] ( main:3 [ frame_cnt main::vx#2 main::vy#2 main::x#1 main::y#1 ] { } ) always clobbers reg byte a Statement [27] main::vx#1 = - main::vx#2 [ frame_cnt main::vy#2 main::x#1 main::y#1 main::vx#1 ] ( main:3 [ frame_cnt main::vy#2 main::x#1 main::y#1 main::vx#1 ] { } ) always clobbers reg byte a Statement [29] if(main::y#1==$c7) goto main::@6 [ frame_cnt main::vy#2 main::x#1 main::y#1 main::vx#6 ] ( main:3 [ frame_cnt main::vy#2 main::x#1 main::y#1 main::vx#6 ] { } ) always clobbers reg byte a Statement [30] if(main::y#1!=0) goto main::@4 [ frame_cnt main::vy#2 main::x#1 main::y#1 main::vx#6 ] ( main:3 [ frame_cnt main::vy#2 main::x#1 main::y#1 main::vx#6 ] { } ) always clobbers reg byte a Statement [31] main::vy#1 = - main::vy#2 [ frame_cnt main::x#1 main::y#1 main::vx#6 main::vy#1 ] ( main:3 [ frame_cnt main::x#1 main::y#1 main::vx#6 main::vy#1 ] { } ) always clobbers reg byte a Statement [33] plots_per_frame[frame_cnt] = ++ plots_per_frame[frame_cnt] [ frame_cnt main::x#1 main::y#1 main::vx#6 main::vy#8 ] ( main:3 [ frame_cnt main::x#1 main::y#1 main::vx#6 main::vy#8 ] { } ) always clobbers reg byte x Statement [44] bitmap_init::$7 = bitmap_init::y#2 & 7 [ bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$7 ] ( main:3::bitmap_init:12 [ frame_cnt bitmap_init::y#2 bitmap_init::yoffs#2 bitmap_init::$7 ] { } ) always clobbers reg byte a Statement [51] bitmap_init::yoffs#1 = bitmap_init::yoffs#2 + (unsigned int)$28*8 [ bitmap_init::y#2 bitmap_init::yoffs#1 ] ( main:3::bitmap_init:12 [ frame_cnt bitmap_init::y#2 bitmap_init::yoffs#1 ] { } ) always clobbers reg byte a Statement [62] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:3::init_irq:18 [ frame_cnt ] { } ) always clobbers reg byte a Statement [63] *PROCPORT = PROCPORT_RAM_IO [ ] ( main:3::init_irq:18 [ frame_cnt ] { } ) always clobbers reg byte a Statement [64] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL [ ] ( main:3::init_irq:18 [ frame_cnt ] { } ) always clobbers reg byte a Statement [65] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 [ ] ( main:3::init_irq:18 [ frame_cnt ] { } ) always clobbers reg byte a Statement [66] *RASTER = 0 [ ] ( main:3::init_irq:18 [ frame_cnt ] { } ) always clobbers reg byte a Statement [67] *IRQ_ENABLE = IRQ_RASTER [ ] ( main:3::init_irq:18 [ frame_cnt ] { } ) always clobbers reg byte a Statement [68] *HARDWARE_IRQ = &irq [ ] ( main:3::init_irq:18 [ frame_cnt ] { } ) always clobbers reg byte a Statement [71] bitmap_plot::plotter#0 = bitmap_plot_yhi[bitmap_plot::y#0] w= bitmap_plot_ylo[bitmap_plot::y#0] [ bitmap_plot::x#0 bitmap_plot::plotter#0 ] ( main:3::bitmap_plot:22 [ frame_cnt main::x#2 main::y#2 main::vx#2 main::vy#2 bitmap_plot::x#0 bitmap_plot::plotter#0 ] { { bitmap_plot::x#0 = main::x#2 } { bitmap_plot::y#0 = main::y#2 } } ) always clobbers reg byte a Statement [72] bitmap_plot::$1 = bitmap_plot::x#0 & $fff8 [ bitmap_plot::x#0 bitmap_plot::plotter#0 bitmap_plot::$1 ] ( main:3::bitmap_plot:22 [ frame_cnt main::x#2 main::y#2 main::vx#2 main::vy#2 bitmap_plot::x#0 bitmap_plot::plotter#0 bitmap_plot::$1 ] { { bitmap_plot::x#0 = main::x#2 } { bitmap_plot::y#0 = main::y#2 } } ) always clobbers reg byte a Statement [73] bitmap_plot::plotter#1 = (char *)bitmap_plot::plotter#0 + bitmap_plot::$1 [ bitmap_plot::x#0 bitmap_plot::plotter#1 ] ( main:3::bitmap_plot:22 [ frame_cnt main::x#2 main::y#2 main::vx#2 main::vy#2 bitmap_plot::x#0 bitmap_plot::plotter#1 ] { { bitmap_plot::x#0 = main::x#2 } { bitmap_plot::y#0 = main::y#2 } } ) always clobbers reg byte a Statement [75] *bitmap_plot::plotter#1 = *bitmap_plot::plotter#1 | bitmap_plot_bit[bitmap_plot::$2] [ ] ( main:3::bitmap_plot:22 [ frame_cnt main::x#2 main::y#2 main::vx#2 main::vy#2 ] { { bitmap_plot::x#0 = main::x#2 } { bitmap_plot::y#0 = main::y#2 } } ) always clobbers reg byte a reg byte y Statement [78] if(memset::num#2<=0) goto memset::@return [ memset::num#2 memset::str#3 memset::c#4 ] ( main:3::bitmap_clear:14::memset:57 [ frame_cnt memset::num#2 memset::str#3 memset::c#4 ] { } main:3::bitmap_clear:14::memset:59 [ frame_cnt memset::num#2 memset::str#3 memset::c#4 ] { } ) always clobbers reg byte a Statement [79] memset::end#0 = (char *)memset::str#3 + memset::num#2 [ memset::str#3 memset::c#4 memset::end#0 ] ( main:3::bitmap_clear:14::memset:57 [ frame_cnt memset::str#3 memset::c#4 memset::end#0 ] { } main:3::bitmap_clear:14::memset:59 [ frame_cnt memset::str#3 memset::c#4 memset::end#0 ] { } ) always clobbers reg byte a Statement [80] memset::dst#4 = (char *)memset::str#3 [ memset::c#4 memset::end#0 memset::dst#4 ] ( main:3::bitmap_clear:14::memset:57 [ frame_cnt memset::c#4 memset::end#0 memset::dst#4 ] { } main:3::bitmap_clear:14::memset:59 [ frame_cnt memset::c#4 memset::end#0 memset::dst#4 ] { } ) always clobbers reg byte a Statement [82] if(memset::dst#2!=memset::end#0) goto memset::@3 [ memset::c#4 memset::end#0 memset::dst#2 ] ( main:3::bitmap_clear:14::memset:57 [ frame_cnt memset::c#4 memset::end#0 memset::dst#2 ] { } main:3::bitmap_clear:14::memset:59 [ frame_cnt memset::c#4 memset::end#0 memset::dst#2 ] { } ) always clobbers reg byte a Statement [84] *memset::dst#2 = memset::c#4 [ memset::c#4 memset::end#0 memset::dst#2 ] ( main:3::bitmap_clear:14::memset:57 [ frame_cnt memset::c#4 memset::end#0 memset::dst#2 ] { } main:3::bitmap_clear:14::memset:59 [ frame_cnt memset::c#4 memset::end#0 memset::dst#2 ] { } ) always clobbers reg byte a reg byte y Potential registers zp[2]:31 [ main::x#2 main::x#1 ] : zp[2]:31 , Potential registers zp[1]:33 [ main::y#2 main::y#1 ] : zp[1]:33 , Potential registers zp[2]:29 [ main::vx#2 main::vx#6 main::vx#1 ] : zp[2]:29 , Potential registers zp[1]:28 [ main::vy#2 main::vy#8 main::vy#1 ] : zp[1]:28 , Potential registers zp[1]:6 [ bitmap_init::bits#3 bitmap_init::bits#4 bitmap_init::bits#1 ] : zp[1]:6 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:8 [ bitmap_init::x#2 bitmap_init::x#1 ] : zp[1]:8 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:9 [ bitmap_init::y#2 bitmap_init::y#1 ] : zp[1]:9 , reg byte x , reg byte y , Potential registers zp[2]:4 [ bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 ] : zp[2]:4 , Potential registers zp[2]:21 [ memset::num#2 ] : zp[2]:21 , Potential registers zp[2]:35 [ memset::str#3 ] : zp[2]:35 , Potential registers zp[1]:20 [ memset::c#4 ] : zp[1]:20 , reg byte x , Potential registers zp[2]:2 [ memset::dst#2 memset::dst#4 memset::dst#1 ] : zp[2]:2 , Potential registers zp[1]:34 [ frame_cnt ] : zp[1]:34 , Potential registers zp[2]:26 [ bitmap_plot::x#0 ] : zp[2]:26 , Potential registers zp[1]:7 [ bitmap_plot::y#0 ] : zp[1]:7 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:23 [ bitmap_init::$7 ] : zp[1]:23 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:10 [ bitmap_init::$4 ] : zp[1]:10 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:11 [ bitmap_init::$5 ] : zp[1]:11 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:12 [ bitmap_init::$6 ] : zp[1]:12 , reg byte a , reg byte x , reg byte y , Potential registers zp[2]:24 [ bitmap_plot::plotter#0 ] : zp[2]:24 , Potential registers zp[2]:13 [ bitmap_plot::$1 ] : zp[2]:13 , Potential registers zp[2]:18 [ bitmap_plot::plotter#1 ] : zp[2]:18 , Potential registers zp[1]:15 [ bitmap_plot::$2 ] : zp[1]:15 , reg byte a , reg byte x , reg byte y , Potential registers zp[2]:16 [ memset::end#0 ] : zp[2]:16 , REGISTER UPLIFT SCOPES Uplift Scope [memset] 35,672.33: zp[2]:2 [ memset::dst#2 memset::dst#4 memset::dst#1 ] 1,833.67: zp[2]:16 [ memset::end#0 ] 1,250.12: zp[1]:20 [ memset::c#4 ] 1,001: zp[2]:21 [ memset::num#2 ] 0: zp[2]:35 [ memset::str#3 ] Uplift Scope [bitmap_init] 3,628.62: zp[2]:4 [ bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 ] 3,169.83: zp[1]:6 [ bitmap_init::bits#3 bitmap_init::bits#4 bitmap_init::bits#1 ] 2,002: zp[1]:8 [ bitmap_init::x#2 bitmap_init::x#1 ] 2,002: zp[1]:9 [ bitmap_init::y#2 bitmap_init::y#1 ] 2,002: zp[1]:10 [ bitmap_init::$4 ] 2,002: zp[1]:11 [ bitmap_init::$5 ] 2,002: zp[1]:12 [ bitmap_init::$6 ] 500.5: zp[1]:23 [ bitmap_init::$7 ] Uplift Scope [bitmap_plot] 2,103: zp[1]:7 [ bitmap_plot::y#0 ] 2,002: zp[2]:13 [ bitmap_plot::$1 ] 2,002: zp[1]:15 [ bitmap_plot::$2 ] 1,501.5: zp[2]:18 [ bitmap_plot::plotter#1 ] 500.5: zp[2]:24 [ bitmap_plot::plotter#0 ] 420.6: zp[2]:26 [ bitmap_plot::x#0 ] Uplift Scope [main] 387.17: zp[1]:28 [ main::vy#2 main::vy#8 main::vy#1 ] 303: zp[2]:29 [ main::vx#2 main::vx#6 main::vx#1 ] 112.48: zp[2]:31 [ main::x#2 main::x#1 ] 101: zp[1]:33 [ main::y#2 main::y#1 ] Uplift Scope [] 7.78: zp[1]:34 [ frame_cnt ] Uplift Scope [MOS6526_CIA] Uplift Scope [MOS6569_VICII] Uplift Scope [MOS6581_SID] Uplift Scope [bitmap_clear] Uplift Scope [init_irq] Uplift Scope [irq] Uplift Scope [__start] Uplifting [memset] best 4868 combination zp[2]:2 [ memset::dst#2 memset::dst#4 memset::dst#1 ] zp[2]:16 [ memset::end#0 ] reg byte x [ memset::c#4 ] zp[2]:21 [ memset::num#2 ] zp[2]:35 [ memset::str#3 ] Uplifting [bitmap_init] best 4418 combination zp[2]:4 [ bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 ] reg byte a [ bitmap_init::bits#3 bitmap_init::bits#4 bitmap_init::bits#1 ] reg byte x [ bitmap_init::x#2 bitmap_init::x#1 ] reg byte x [ bitmap_init::y#2 bitmap_init::y#1 ] reg byte a [ bitmap_init::$4 ] zp[1]:11 [ bitmap_init::$5 ] zp[1]:12 [ bitmap_init::$6 ] zp[1]:23 [ bitmap_init::$7 ] Limited combination testing to 100 combinations of 12288 possible. Uplifting [bitmap_plot] best 4379 combination reg byte x [ bitmap_plot::y#0 ] zp[2]:13 [ bitmap_plot::$1 ] reg byte x [ bitmap_plot::$2 ] zp[2]:18 [ bitmap_plot::plotter#1 ] zp[2]:24 [ bitmap_plot::plotter#0 ] zp[2]:26 [ bitmap_plot::x#0 ] Uplifting [main] best 4379 combination zp[1]:28 [ main::vy#2 main::vy#8 main::vy#1 ] zp[2]:29 [ main::vx#2 main::vx#6 main::vx#1 ] zp[2]:31 [ main::x#2 main::x#1 ] zp[1]:33 [ main::y#2 main::y#1 ] Uplifting [] best 4379 combination zp[1]:34 [ frame_cnt ] Uplifting [MOS6526_CIA] best 4379 combination Uplifting [MOS6569_VICII] best 4379 combination Uplifting [MOS6581_SID] best 4379 combination Uplifting [bitmap_clear] best 4379 combination Uplifting [init_irq] best 4379 combination Uplifting [irq] best 4379 combination Uplifting [__start] best 4379 combination Attempting to uplift remaining variables inzp[1]:11 [ bitmap_init::$5 ] Uplifting [bitmap_init] best 4319 combination reg byte a [ bitmap_init::$5 ] Attempting to uplift remaining variables inzp[1]:12 [ bitmap_init::$6 ] Uplifting [bitmap_init] best 4259 combination reg byte a [ bitmap_init::$6 ] Attempting to uplift remaining variables inzp[1]:23 [ bitmap_init::$7 ] Uplifting [bitmap_init] best 4259 combination zp[1]:23 [ bitmap_init::$7 ] Attempting to uplift remaining variables inzp[1]:28 [ main::vy#2 main::vy#8 main::vy#1 ] Uplifting [main] best 4259 combination zp[1]:28 [ main::vy#2 main::vy#8 main::vy#1 ] Attempting to uplift remaining variables inzp[1]:33 [ main::y#2 main::y#1 ] Uplifting [main] best 4259 combination zp[1]:33 [ main::y#2 main::y#1 ] Attempting to uplift remaining variables inzp[1]:34 [ frame_cnt ] Uplifting [] best 4259 combination zp[1]:34 [ frame_cnt ] Coalescing zero page register [ zp[2]:31 [ main::x#2 main::x#1 ] ] with [ zp[2]:26 [ bitmap_plot::x#0 ] ] - score: 1 Coalescing zero page register [ zp[2]:21 [ memset::num#2 ] ] with [ zp[2]:16 [ memset::end#0 ] ] - score: 1 Coalescing zero page register [ zp[2]:35 [ memset::str#3 ] ] with [ zp[2]:2 [ memset::dst#2 memset::dst#4 memset::dst#1 ] ] - score: 1 Coalescing zero page register [ zp[2]:24 [ bitmap_plot::plotter#0 ] ] with [ zp[2]:18 [ bitmap_plot::plotter#1 ] ] - score: 1 Coalescing zero page register [ zp[2]:21 [ memset::num#2 memset::end#0 ] ] with [ zp[2]:4 [ bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 ] ] Coalescing zero page register [ zp[2]:24 [ bitmap_plot::plotter#0 bitmap_plot::plotter#1 ] ] with [ zp[2]:35 [ memset::str#3 memset::dst#2 memset::dst#4 memset::dst#1 ] ] Coalescing zero page register [ zp[2]:13 [ bitmap_plot::$1 ] ] with [ zp[2]:21 [ memset::num#2 memset::end#0 bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 ] ] Allocated (was zp[2]:24) zp[2]:2 [ bitmap_plot::plotter#0 bitmap_plot::plotter#1 memset::str#3 memset::dst#2 memset::dst#4 memset::dst#1 ] Allocated (was zp[2]:13) zp[2]:4 [ bitmap_plot::$1 memset::num#2 memset::end#0 bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 ] Allocated (was zp[2]:31) zp[2]:6 [ main::x#2 main::x#1 bitmap_plot::x#0 ] Allocated (was zp[1]:23) zp[1]:8 [ bitmap_init::$7 ] Allocated (was zp[1]:28) zp[1]:9 [ main::vy#2 main::vy#8 main::vy#1 ] Allocated (was zp[2]:29) zp[2]:10 [ main::vx#2 main::vx#6 main::vx#1 ] Allocated (was zp[1]:33) zp[1]:12 [ main::y#2 main::y#1 ] Allocated (was zp[1]:34) zp[1]:13 [ frame_cnt ] Interrupt procedure irq clobbers AnzP ASSEMBLER BEFORE OPTIMIZATION // File Comments // Tests the simple bitmap plotter - and counts plots per frame in an IRQ // Plots simple plots /// @file /// Commodore 64 Registers and Constants /// @file /// The MOS 6526 Complex Interface Adapter (CIA) /// /// http://archive.6502.org/datasheets/mos_6526_cia_recreated.pdf // Upstart // Commodore 64 PRG executable file .file [name="bitmap-plot-0.prg", type="prg", segments="Program"] .segmentdef Program [segments="Basic, Code, Data"] .segmentdef Basic [start=$0801] .segmentdef Code [start=$80d] .segmentdef Data [startAfter="Code"] .segment Basic :BasicUpstart(__start) // Global Constants & labels /// Value that disables all CIA interrupts when stored to the CIA Interrupt registers .const CIA_INTERRUPT_CLEAR_ALL = $7f /// $D011 Control Register #1 Bit#5: BMM Turn Bitmap Mode on/off .const VICII_BMM = $20 /// $D011 Control Register #1 Bit#4: DEN Switch VIC-II output on/off .const VICII_DEN = $10 /// $D011 Control Register #1 Bit#3: RSEL Switch betweem 25 or 24 visible rows /// RSEL| Display window height | First line | Last line /// ----+--------------------------+-------------+---------- /// 0 | 24 text lines/192 pixels | 55 ($37) | 246 ($f6) /// 1 | 25 text lines/200 pixels | 51 ($33) | 250 ($fa) .const VICII_RSEL = 8 /// VICII IRQ Status/Enable Raster // @see #IRQ_ENABLE #IRQ_STATUS /// 0 | RST| Reaching a certain raster line. The line is specified by writing /// | | to register 0xd012 and bit 7 of $d011 and internally stored by /// | | the VIC for the raster compare. The test for reaching the /// | | interrupt raster line is done in cycle 0 of every line (for line /// | | 0, in cycle 1). .const IRQ_RASTER = 1 /// Mask for PROCESSOR_PORT_DDR which allows only memory configuration to be written .const PROCPORT_DDR_MEMORY_MASK = 7 /// RAM in 0xA000, 0xE000 I/O in 0xD000 .const PROCPORT_RAM_IO = 5 /// The colors of the C64 .const BLACK = 0 .const WHITE = 1 .const OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d /// $D012 RASTER Raster counter .label RASTER = $d012 /// $D021 Background Color 0 .label BG_COLOR = $d021 /// $D011 Control Register #1 /// - Bit#0-#2: YSCROLL Screen Soft Scroll Vertical /// - Bit#3: RSEL Switch betweem 25 or 24 visible rows /// RSEL| Display window height | First line | Last line /// ----+--------------------------+-------------+---------- /// 0 | 24 text lines/192 pixels | 55 ($37) | 246 ($f6) /// 1 | 25 text lines/200 pixels | 51 ($33) | 250 ($fa) /// - Bit#4: DEN Switch VIC-II output on/off /// - Bit#5: BMM Turn Bitmap Mode on/off /// - Bit#6: ECM Turn Extended Color Mode on/off /// - Bit#7: RST8 9th Bit for $D012 Rasterline counter /// Initial Value: %10011011 .label VICII_CONTROL1 = $d011 /// $D011 Control Register #1 /// @see #VICII_CONTROL1 .label D011 = $d011 /// $D018 VIC-II base addresses // @see #VICII_MEMORY .label D018 = $d018 /// VIC II IRQ Status Register .label IRQ_STATUS = $d019 /// VIC II IRQ Enable Register .label IRQ_ENABLE = $d01a /// Processor port data direction register .label PROCPORT_DDR = 0 /// Processor Port Register controlling RAM/ROM configuration and the datasette .label PROCPORT = 1 /// The CIA#1: keyboard matrix, joystick #1/#2 .label CIA1 = $dc00 /// The vector used when the HARDWARE serves IRQ interrupts .label HARDWARE_IRQ = $fffe .label BITMAP = $2000 .label SCREEN = $400 // Counts frames - updated by the IRQ .label frame_cnt = $d .segment Code // __start __start: { jmp __init1 // __start::__init1 __init1: // [1] frame_cnt = 1 -- vbuz1=vbuc1 lda #1 sta.z frame_cnt // [2] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1] __b1_from___init1: jmp __b1 // __start::@1 __b1: // [3] call main // [11] phi from __start::@1 to main [phi:__start::@1->main] main_from___b1: jsr main jmp __breturn // __start::@return __breturn: // [4] return rts } // irq // Interrupt Routine counting frames irq: { // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry sta rega+1 // [5] *BG_COLOR = WHITE -- _deref_pbuc1=vbuc2 lda #WHITE sta BG_COLOR // [6] if(0==frame_cnt) goto irq::@1 -- 0_eq_vbuz1_then_la1 lda.z frame_cnt beq __b1 jmp __b2 // irq::@2 __b2: // [7] frame_cnt = ++ frame_cnt -- vbuz1=_inc_vbuz1 inc.z frame_cnt jmp __b1 // irq::@1 __b1: // [8] *BG_COLOR = BLACK -- _deref_pbuc1=vbuc2 lda #BLACK sta BG_COLOR // [9] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 // Acknowledge the IRQ lda #IRQ_RASTER sta IRQ_STATUS jmp __breturn // irq::@return __breturn: // [10] return // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit rega: lda #0 rti } // main main: { .const toD0181_return = (>(SCREEN&$3fff)*4)|(>BITMAP)/4&$f .label x = 6 .label y = $c .label vx = $a .label vy = 9 // [12] call bitmap_init // [34] phi from main to bitmap_init [phi:main->bitmap_init] bitmap_init_from_main: jsr bitmap_init // [13] phi from main to main::@8 [phi:main->main::@8] __b8_from_main: jmp __b8 // main::@8 __b8: // [14] call bitmap_clear // [56] phi from main::@8 to bitmap_clear [phi:main::@8->bitmap_clear] bitmap_clear_from___b8: jsr bitmap_clear jmp __b9 // main::@9 __b9: // [15] *D011 = VICII_BMM|VICII_DEN|VICII_RSEL|3 -- _deref_pbuc1=vbuc2 lda #VICII_BMM|VICII_DEN|VICII_RSEL|3 sta D011 // [16] phi from main::@9 to main::toD0181 [phi:main::@9->main::toD0181] toD0181_from___b9: jmp toD0181 // main::toD0181 toD0181: jmp __b7 // main::@7 __b7: // [17] *D018 = main::toD0181_return#0 -- _deref_pbuc1=vbuc2 lda #toD0181_return sta D018 // [18] call init_irq jsr init_irq // [19] phi from main::@7 to main::@1 [phi:main::@7->main::@1] __b1_from___b7: // [19] phi main::vy#2 = 1 [phi:main::@7->main::@1#0] -- vbuz1=vbuc1 lda #1 sta.z vy // [19] phi main::vx#2 = 1 [phi:main::@7->main::@1#1] -- vwuz1=vwuc1 lda #<1 sta.z vx lda #>1 sta.z vx+1 // [19] phi main::y#2 = 0 [phi:main::@7->main::@1#2] -- vbuz1=vbuc1 lda #0 sta.z y // [19] phi main::x#2 = 0 [phi:main::@7->main::@1#3] -- vwuz1=vwuc1 lda #<0 sta.z x lda #>0 sta.z x+1 jmp __b1 // main::@1 __b1: jmp __b2 // main::@2 __b2: // [20] bitmap_plot::x#0 = main::x#2 // [21] bitmap_plot::y#0 = main::y#2 -- vbuxx=vbuz1 ldx.z y // [22] call bitmap_plot jsr bitmap_plot jmp __b10 // main::@10 __b10: // [23] main::x#1 = main::x#2 + main::vx#2 -- vwuz1=vwuz1_plus_vwuz2 clc lda.z x adc.z vx sta.z x lda.z x+1 adc.z vx+1 sta.z x+1 // [24] main::y#1 = main::y#2 + main::vy#2 -- vbuz1=vbuz1_plus_vbuz2 lda.z y clc adc.z vy sta.z y // [25] if(main::x#1==$13f) goto main::@5 -- vwuz1_eq_vwuc1_then_la1 lda.z x cmp #<$13f bne !+ lda.z x+1 cmp #>$13f beq __b5 !: jmp __b11 // main::@11 __b11: // [26] if(main::x#1!=0) goto main::@3 -- vwuz1_neq_0_then_la1 lda.z x ora.z x+1 bne __b3_from___b11 jmp __b5 // main::@5 __b5: // [27] main::vx#1 = - main::vx#2 -- vwuz1=_neg_vwuz1 sec lda #0 sbc.z vx sta.z vx lda #0 sbc.z vx+1 sta.z vx+1 // [28] phi from main::@11 main::@5 to main::@3 [phi:main::@11/main::@5->main::@3] __b3_from___b11: __b3_from___b5: // [28] phi main::vx#6 = main::vx#2 [phi:main::@11/main::@5->main::@3#0] -- register_copy jmp __b3 // main::@3 __b3: // [29] if(main::y#1==$c7) goto main::@6 -- vbuz1_eq_vbuc1_then_la1 lda #$c7 cmp.z y beq __b6 jmp __b12 // main::@12 __b12: // [30] if(main::y#1!=0) goto main::@4 -- vbuz1_neq_0_then_la1 lda.z y bne __b4_from___b12 jmp __b6 // main::@6 __b6: // [31] main::vy#1 = - main::vy#2 -- vbuz1=_neg_vbuz1 lda.z vy eor #$ff clc adc #1 sta.z vy // [32] phi from main::@12 main::@6 to main::@4 [phi:main::@12/main::@6->main::@4] __b4_from___b12: __b4_from___b6: // [32] phi main::vy#8 = main::vy#2 [phi:main::@12/main::@6->main::@4#0] -- register_copy jmp __b4 // main::@4 __b4: // [33] plots_per_frame[frame_cnt] = ++ plots_per_frame[frame_cnt] -- pbuc1_derefidx_vbuz1=_inc_pbuc1_derefidx_vbuz1 ldx.z frame_cnt inc plots_per_frame,x // [19] phi from main::@4 to main::@1 [phi:main::@4->main::@1] __b1_from___b4: // [19] phi main::vy#2 = main::vy#8 [phi:main::@4->main::@1#0] -- register_copy // [19] phi main::vx#2 = main::vx#6 [phi:main::@4->main::@1#1] -- register_copy // [19] phi main::y#2 = main::y#1 [phi:main::@4->main::@1#2] -- register_copy // [19] phi main::x#2 = main::x#1 [phi:main::@4->main::@1#3] -- register_copy jmp __b1 } // bitmap_init // Initialize bitmap plotting tables // void bitmap_init(char *gfx, char *screen) bitmap_init: { .label __7 = 8 .label yoffs = 4 // [35] phi from bitmap_init to bitmap_init::@1 [phi:bitmap_init->bitmap_init::@1] __b1_from_bitmap_init: // [35] phi bitmap_init::x#2 = 0 [phi:bitmap_init->bitmap_init::@1#0] -- vbuxx=vbuc1 ldx #0 // [35] phi bitmap_init::bits#3 = $80 [phi:bitmap_init->bitmap_init::@1#1] -- vbuaa=vbuc1 lda #$80 jmp __b1 // [35] phi from bitmap_init::@2 to bitmap_init::@1 [phi:bitmap_init::@2->bitmap_init::@1] __b1_from___b2: // [35] phi bitmap_init::x#2 = bitmap_init::x#1 [phi:bitmap_init::@2->bitmap_init::@1#0] -- register_copy // [35] phi bitmap_init::bits#3 = bitmap_init::bits#4 [phi:bitmap_init::@2->bitmap_init::@1#1] -- register_copy jmp __b1 // bitmap_init::@1 __b1: // [36] bitmap_plot_bit[bitmap_init::x#2] = bitmap_init::bits#3 -- pbuc1_derefidx_vbuxx=vbuaa sta bitmap_plot_bit,x // [37] bitmap_init::bits#1 = bitmap_init::bits#3 >> 1 -- vbuaa=vbuaa_ror_1 lsr // [38] if(bitmap_init::bits#1!=0) goto bitmap_init::@6 -- vbuaa_neq_0_then_la1 cmp #0 bne __b6_from___b1 // [40] phi from bitmap_init::@1 to bitmap_init::@2 [phi:bitmap_init::@1->bitmap_init::@2] __b2_from___b1: // [40] phi bitmap_init::bits#4 = $80 [phi:bitmap_init::@1->bitmap_init::@2#0] -- vbuaa=vbuc1 lda #$80 jmp __b2 // [39] phi from bitmap_init::@1 to bitmap_init::@6 [phi:bitmap_init::@1->bitmap_init::@6] __b6_from___b1: jmp __b6 // bitmap_init::@6 __b6: // [40] phi from bitmap_init::@6 to bitmap_init::@2 [phi:bitmap_init::@6->bitmap_init::@2] __b2_from___b6: // [40] phi bitmap_init::bits#4 = bitmap_init::bits#1 [phi:bitmap_init::@6->bitmap_init::@2#0] -- register_copy jmp __b2 // bitmap_init::@2 __b2: // [41] bitmap_init::x#1 = ++ bitmap_init::x#2 -- vbuxx=_inc_vbuxx inx // [42] if(bitmap_init::x#1!=0) goto bitmap_init::@1 -- vbuxx_neq_0_then_la1 cpx #0 bne __b1_from___b2 // [43] phi from bitmap_init::@2 to bitmap_init::@3 [phi:bitmap_init::@2->bitmap_init::@3] __b3_from___b2: // [43] phi bitmap_init::yoffs#2 = BITMAP [phi:bitmap_init::@2->bitmap_init::@3#0] -- pbuz1=pbuc1 lda #BITMAP sta.z yoffs+1 // [43] phi bitmap_init::y#2 = 0 [phi:bitmap_init::@2->bitmap_init::@3#1] -- vbuxx=vbuc1 ldx #0 jmp __b3 // [43] phi from bitmap_init::@4 to bitmap_init::@3 [phi:bitmap_init::@4->bitmap_init::@3] __b3_from___b4: // [43] phi bitmap_init::yoffs#2 = bitmap_init::yoffs#4 [phi:bitmap_init::@4->bitmap_init::@3#0] -- register_copy // [43] phi bitmap_init::y#2 = bitmap_init::y#1 [phi:bitmap_init::@4->bitmap_init::@3#1] -- register_copy jmp __b3 // bitmap_init::@3 __b3: // [44] bitmap_init::$7 = bitmap_init::y#2 & 7 -- vbuz1=vbuxx_band_vbuc1 lda #7 sax.z __7 // [45] bitmap_init::$4 = byte0 bitmap_init::yoffs#2 -- vbuaa=_byte0_pbuz1 lda.z yoffs // [46] bitmap_init::$5 = bitmap_init::$7 | bitmap_init::$4 -- vbuaa=vbuz1_bor_vbuaa ora.z __7 // [47] bitmap_plot_ylo[bitmap_init::y#2] = bitmap_init::$5 -- pbuc1_derefidx_vbuxx=vbuaa sta bitmap_plot_ylo,x // [48] bitmap_init::$6 = byte1 bitmap_init::yoffs#2 -- vbuaa=_byte1_pbuz1 lda.z yoffs+1 // [49] bitmap_plot_yhi[bitmap_init::y#2] = bitmap_init::$6 -- pbuc1_derefidx_vbuxx=vbuaa sta bitmap_plot_yhi,x // [50] if(bitmap_init::$7!=7) goto bitmap_init::@4 -- vbuz1_neq_vbuc1_then_la1 lda #7 cmp.z __7 bne __b4_from___b3 jmp __b5 // bitmap_init::@5 __b5: // [51] bitmap_init::yoffs#1 = bitmap_init::yoffs#2 + (unsigned int)$28*8 -- pbuz1=pbuz1_plus_vwuc1 lda.z yoffs clc adc #<$28*8 sta.z yoffs lda.z yoffs+1 adc #>$28*8 sta.z yoffs+1 // [52] phi from bitmap_init::@3 bitmap_init::@5 to bitmap_init::@4 [phi:bitmap_init::@3/bitmap_init::@5->bitmap_init::@4] __b4_from___b3: __b4_from___b5: // [52] phi bitmap_init::yoffs#4 = bitmap_init::yoffs#2 [phi:bitmap_init::@3/bitmap_init::@5->bitmap_init::@4#0] -- register_copy jmp __b4 // bitmap_init::@4 __b4: // [53] bitmap_init::y#1 = ++ bitmap_init::y#2 -- vbuxx=_inc_vbuxx inx // [54] if(bitmap_init::y#1!=0) goto bitmap_init::@3 -- vbuxx_neq_0_then_la1 cpx #0 bne __b3_from___b4 jmp __breturn // bitmap_init::@return __breturn: // [55] return rts } // bitmap_clear // Clear all graphics on the bitmap // bgcol - the background color to fill the screen with // fgcol - the foreground color to fill the screen with // void bitmap_clear(char bgcol, char fgcol) bitmap_clear: { .const col = WHITE*$10 // [57] call memset // [77] phi from bitmap_clear to memset [phi:bitmap_clear->memset] memset_from_bitmap_clear: // [77] phi memset::c#4 = bitmap_clear::col#0 [phi:bitmap_clear->memset#0] -- vbuxx=vbuc1 ldx #col // [77] phi memset::str#3 = (void *)SCREEN [phi:bitmap_clear->memset#1] -- pvoz1=pvoc1 lda #SCREEN sta.z memset.str+1 // [77] phi memset::num#2 = $3e8 [phi:bitmap_clear->memset#2] -- vwuz1=vwuc1 lda #<$3e8 sta.z memset.num lda #>$3e8 sta.z memset.num+1 jsr memset // [58] phi from bitmap_clear to bitmap_clear::@1 [phi:bitmap_clear->bitmap_clear::@1] __b1_from_bitmap_clear: jmp __b1 // bitmap_clear::@1 __b1: // [59] call memset // [77] phi from bitmap_clear::@1 to memset [phi:bitmap_clear::@1->memset] memset_from___b1: // [77] phi memset::c#4 = 0 [phi:bitmap_clear::@1->memset#0] -- vbuxx=vbuc1 ldx #0 // [77] phi memset::str#3 = (void *)BITMAP [phi:bitmap_clear::@1->memset#1] -- pvoz1=pvoc1 lda #BITMAP sta.z memset.str+1 // [77] phi memset::num#2 = $1f40 [phi:bitmap_clear::@1->memset#2] -- vwuz1=vwuc1 lda #<$1f40 sta.z memset.num lda #>$1f40 sta.z memset.num+1 jsr memset jmp __breturn // bitmap_clear::@return __breturn: // [60] return rts } // init_irq // Setup the IRQ init_irq: { // asm { sei } sei // [62] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 // Disable kernal & basic lda #PROCPORT_DDR_MEMORY_MASK sta.z PROCPORT_DDR // [63] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 lda #PROCPORT_RAM_IO sta.z PROCPORT // [64] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL -- _deref_pbuc1=vbuc2 // Disable CIA 1 Timer IRQ lda #CIA_INTERRUPT_CLEAR_ALL sta CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT // [65] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 // Set raster line to $100 lda #$80 ora VICII_CONTROL1 sta VICII_CONTROL1 // [66] *RASTER = 0 -- _deref_pbuc1=vbuc2 lda #0 sta RASTER // [67] *IRQ_ENABLE = IRQ_RASTER -- _deref_pbuc1=vbuc2 // Enable Raster Interrupt lda #IRQ_RASTER sta IRQ_ENABLE // [68] *HARDWARE_IRQ = &irq -- _deref_qprc1=pprc2 // Set the IRQ routine lda #irq sta HARDWARE_IRQ+1 // asm { cli } cli jmp __breturn // init_irq::@return __breturn: // [70] return rts } // bitmap_plot // Plot a single dot in the bitmap // void bitmap_plot(__zp(6) unsigned int x, __register(X) char y) bitmap_plot: { .label __1 = 4 .label plotter = 2 .label x = 6 // [71] bitmap_plot::plotter#0 = bitmap_plot_yhi[bitmap_plot::y#0] w= bitmap_plot_ylo[bitmap_plot::y#0] -- vwuz1=pbuc1_derefidx_vbuxx_word_pbuc2_derefidx_vbuxx lda bitmap_plot_yhi,x sta.z plotter+1 lda bitmap_plot_ylo,x sta.z plotter // [72] bitmap_plot::$1 = bitmap_plot::x#0 & $fff8 -- vwuz1=vwuz2_band_vwuc1 lda.z x and #<$fff8 sta.z __1 lda.z x+1 and #>$fff8 sta.z __1+1 // [73] bitmap_plot::plotter#1 = (char *)bitmap_plot::plotter#0 + bitmap_plot::$1 -- pbuz1=pbuz1_plus_vwuz2 clc lda.z plotter adc.z __1 sta.z plotter lda.z plotter+1 adc.z __1+1 sta.z plotter+1 // [74] bitmap_plot::$2 = byte0 bitmap_plot::x#0 -- vbuxx=_byte0_vwuz1 ldx.z x // [75] *bitmap_plot::plotter#1 = *bitmap_plot::plotter#1 | bitmap_plot_bit[bitmap_plot::$2] -- _deref_pbuz1=_deref_pbuz1_bor_pbuc1_derefidx_vbuxx lda bitmap_plot_bit,x ldy #0 ora (plotter),y sta (plotter),y jmp __breturn // bitmap_plot::@return __breturn: // [76] return rts } // memset // Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str. // void * memset(__zp(2) void *str, __register(X) char c, __zp(4) unsigned int num) memset: { .label end = 4 .label dst = 2 .label num = 4 .label str = 2 // [78] if(memset::num#2<=0) goto memset::@return -- vwuz1_le_0_then_la1 lda.z num bne !+ lda.z num+1 beq __breturn !: jmp __b1 // memset::@1 __b1: // [79] memset::end#0 = (char *)memset::str#3 + memset::num#2 -- pbuz1=pbuz2_plus_vwuz1 clc lda.z end adc.z str sta.z end lda.z end+1 adc.z str+1 sta.z end+1 // [80] memset::dst#4 = (char *)memset::str#3 // [81] phi from memset::@1 memset::@3 to memset::@2 [phi:memset::@1/memset::@3->memset::@2] __b2_from___b1: __b2_from___b3: // [81] phi memset::dst#2 = memset::dst#4 [phi:memset::@1/memset::@3->memset::@2#0] -- register_copy jmp __b2 // memset::@2 __b2: // [82] if(memset::dst#2!=memset::end#0) goto memset::@3 -- pbuz1_neq_pbuz2_then_la1 lda.z dst+1 cmp.z end+1 bne __b3 lda.z dst cmp.z end bne __b3 jmp __breturn // memset::@return __breturn: // [83] return rts // memset::@3 __b3: // [84] *memset::dst#2 = memset::c#4 -- _deref_pbuz1=vbuxx txa ldy #0 sta (dst),y // [85] memset::dst#1 = ++ memset::dst#2 -- pbuz1=_inc_pbuz1 inc.z dst bne !+ inc.z dst+1 !: jmp __b2_from___b3 } // File Data .segment Data // Tables for the plotter - initialized by calling bitmap_init(); bitmap_plot_ylo: .fill $100, 0 bitmap_plot_yhi: .fill $100, 0 bitmap_plot_bit: .fill $100, 0 plots_per_frame: .fill $100, 0 ASSEMBLER OPTIMIZATIONS Removing instruction jmp __init1 Removing instruction jmp __b1 Removing instruction jmp __breturn Removing instruction jmp __b2 Removing instruction jmp __b1 Removing instruction jmp __breturn Removing instruction jmp __b8 Removing instruction jmp __b9 Removing instruction jmp toD0181 Removing instruction jmp __b7 Removing instruction jmp __b1 Removing instruction jmp __b2 Removing instruction jmp __b10 Removing instruction jmp __b11 Removing instruction jmp __b5 Removing instruction jmp __b3 Removing instruction jmp __b12 Removing instruction jmp __b6 Removing instruction jmp __b4 Removing instruction jmp __b1 Removing instruction jmp __b6 Removing instruction jmp __b2 Removing instruction jmp __b3 Removing instruction jmp __b5 Removing instruction jmp __b4 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 __b2 Removing instruction jmp __breturn Succesful ASM optimization Pass5NextJumpElimination Removing instruction lda #<1 Removing instruction lda #0 Removing instruction lda #<0 Removing instruction lda #>0 Succesful ASM optimization Pass5UnnecesaryLoadElimination Replacing label __b3_from___b11 with __b3 Replacing label __b4_from___b12 with __b4 Replacing label __b1 with __b2 Replacing label __b6_from___b1 with __b2 Replacing label __b1_from___b2 with __b1 Replacing label __b4_from___b3 with __b4 Replacing label __b3_from___b4 with __b3 Replacing label __b2_from___b3 with __b2 Removing instruction __b1_from___init1: Removing instruction main_from___b1: Removing instruction __breturn: Removing instruction __b8_from_main: Removing instruction bitmap_clear_from___b8: Removing instruction toD0181_from___b9: Removing instruction toD0181: Removing instruction __b1: Removing instruction __b3_from___b11: Removing instruction __b3_from___b5: Removing instruction __b4_from___b12: Removing instruction __b4_from___b6: Removing instruction __b1_from___b2: Removing instruction __b6_from___b1: Removing instruction __b6: Removing instruction __b2_from___b6: Removing instruction __b3_from___b4: Removing instruction __b4_from___b3: Removing instruction __b4_from___b5: Removing instruction __b1_from_bitmap_clear: Removing instruction memset_from___b1: Removing instruction __b2_from___b1: Removing instruction __b2_from___b3: Succesful ASM optimization Pass5RedundantLabelElimination Removing instruction __init1: Removing instruction __b1: Removing instruction __breturn: Removing instruction __b2: Removing instruction bitmap_init_from_main: Removing instruction __b8: Removing instruction __b9: Removing instruction __b7: Removing instruction __b1_from___b7: Removing instruction __b10: Removing instruction __b11: Removing instruction __b12: Removing instruction __b1_from___b4: Removing instruction __b1_from_bitmap_init: Removing instruction __b2_from___b1: Removing instruction __b3_from___b2: Removing instruction __b5: Removing instruction __breturn: Removing instruction memset_from_bitmap_clear: Removing instruction __b1: Removing instruction __breturn: Removing instruction __breturn: Removing instruction __breturn: Removing instruction __b1: Succesful ASM optimization Pass5UnusedLabelElimination Removing instruction jmp __b1 Removing instruction jmp __b2 Removing instruction jmp __b3 Succesful ASM optimization Pass5NextJumpElimination FINAL SYMBOL TABLE __constant char * const BG_COLOR = (char *) 53281 __constant char *BITMAP = (char *) 8192 __constant const char BLACK = 0 __constant struct MOS6526_CIA * const CIA1 = (struct MOS6526_CIA *) 56320 __constant const char CIA_INTERRUPT_CLEAR_ALL = $7f __constant char * const D011 = (char *) 53265 __constant char * const D018 = (char *) 53272 __constant void (** const HARDWARE_IRQ)() = (void (**)()) 65534 __constant char * const IRQ_ENABLE = (char *) 53274 __constant const char IRQ_RASTER = 1 __constant char * const IRQ_STATUS = (char *) 53273 __constant char OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d __constant char * const PROCPORT = (char *) 1 __constant char * const PROCPORT_DDR = (char *) 0 __constant const char PROCPORT_DDR_MEMORY_MASK = 7 __constant const char PROCPORT_RAM_IO = 5 __constant char * const RASTER = (char *) 53266 __constant char *SCREEN = (char *) 1024 __constant const char VICII_BMM = $20 __constant char * const VICII_CONTROL1 = (char *) 53265 __constant const char VICII_DEN = $10 __constant const char VICII_RSEL = 8 __constant const char WHITE = 1 void __start() void bitmap_clear(char bgcol , char fgcol) char bitmap_clear::bgcol char bitmap_clear::col __constant char bitmap_clear::col#0 = WHITE*$10 // col char bitmap_clear::fgcol char *bitmap_gfx void bitmap_init(char *gfx , char *screen) char bitmap_init::$4 // reg byte a 2002.0 char bitmap_init::$5 // reg byte a 2002.0 char bitmap_init::$6 // reg byte a 2002.0 char bitmap_init::$7 // zp[1]:8 500.5 char bitmap_init::bits char bitmap_init::bits#1 // reg byte a 1001.0 char bitmap_init::bits#3 // reg byte a 1501.5 char bitmap_init::bits#4 // reg byte a 667.3333333333334 char *bitmap_init::gfx char *bitmap_init::screen char bitmap_init::x char bitmap_init::x#1 // reg byte x 1501.5 char bitmap_init::x#2 // reg byte x 500.5 char bitmap_init::y char bitmap_init::y#1 // reg byte x 1501.5 char bitmap_init::y#2 // reg byte x 500.5 char *bitmap_init::yoffs char *bitmap_init::yoffs#1 // yoffs zp[2]:4 2002.0 char *bitmap_init::yoffs#2 // yoffs zp[2]:4 625.625 char *bitmap_init::yoffs#4 // yoffs zp[2]:4 1001.0 void bitmap_plot(unsigned int x , char y) unsigned int bitmap_plot::$1 // zp[2]:4 2002.0 char bitmap_plot::$2 // reg byte x 2002.0 char *bitmap_plot::plotter unsigned int bitmap_plot::plotter#0 // plotter zp[2]:2 500.5 char *bitmap_plot::plotter#1 // plotter zp[2]:2 1501.5 unsigned int bitmap_plot::x unsigned int bitmap_plot::x#0 // x zp[2]:6 420.59999999999997 char bitmap_plot::y char bitmap_plot::y#0 // reg byte x 2103.0 __constant const char bitmap_plot_bit[$100] = { fill( $100, 0) } __constant const char bitmap_plot_yhi[$100] = { fill( $100, 0) } __constant const char bitmap_plot_ylo[$100] = { fill( $100, 0) } char *bitmap_screen __loadstore volatile char frame_cnt // zp[1]:13 7.777777777777779 void init_irq() __interrupt(hardware_clobber) void irq() void main() char *main::toD0181_gfx char main::toD0181_return __constant char main::toD0181_return#0 = byte1 (unsigned int)SCREEN&$3fff*4|byte1 (unsigned int)BITMAP/4&$f // toD0181_return char *main::toD0181_screen unsigned int main::vx unsigned int main::vx#1 // vx zp[2]:10 202.0 unsigned int main::vx#2 // vx zp[2]:10 50.5 unsigned int main::vx#6 // vx zp[2]:10 50.5 char main::vy char main::vy#1 // vy zp[1]:9 202.0 char main::vy#2 // vy zp[1]:9 33.666666666666664 char main::vy#8 // vy zp[1]:9 151.5 unsigned int main::x unsigned int main::x#1 // x zp[2]:6 36.72727272727273 unsigned int main::x#2 // x zp[2]:6 75.75 char main::y char main::y#1 // y zp[1]:12 40.4 char main::y#2 // y zp[1]:12 60.599999999999994 void * memset(void *str , char c , unsigned int num) char memset::c char memset::c#4 // reg byte x 1250.125 char *memset::dst char *memset::dst#1 // dst zp[2]:2 20002.0 char *memset::dst#2 // dst zp[2]:2 13668.333333333332 char *memset::dst#4 // dst zp[2]:2 2002.0 char *memset::end char *memset::end#0 // end zp[2]:4 1833.6666666666665 unsigned int memset::num unsigned int memset::num#2 // num zp[2]:4 1001.0 void *memset::return void *memset::str void *memset::str#3 // str zp[2]:2 __constant char plots_per_frame[$100] = { fill( $100, 0) } zp[2]:6 [ main::x#2 main::x#1 bitmap_plot::x#0 ] zp[1]:12 [ main::y#2 main::y#1 ] zp[2]:10 [ main::vx#2 main::vx#6 main::vx#1 ] zp[1]:9 [ main::vy#2 main::vy#8 main::vy#1 ] reg byte a [ bitmap_init::bits#3 bitmap_init::bits#4 bitmap_init::bits#1 ] reg byte x [ bitmap_init::x#2 bitmap_init::x#1 ] reg byte x [ bitmap_init::y#2 bitmap_init::y#1 ] reg byte x [ memset::c#4 ] zp[1]:13 [ frame_cnt ] reg byte x [ bitmap_plot::y#0 ] zp[1]:8 [ bitmap_init::$7 ] reg byte a [ bitmap_init::$4 ] reg byte a [ bitmap_init::$5 ] reg byte a [ bitmap_init::$6 ] zp[2]:2 [ bitmap_plot::plotter#0 bitmap_plot::plotter#1 memset::str#3 memset::dst#2 memset::dst#4 memset::dst#1 ] zp[2]:4 [ bitmap_plot::$1 memset::num#2 memset::end#0 bitmap_init::yoffs#2 bitmap_init::yoffs#4 bitmap_init::yoffs#1 ] reg byte x [ bitmap_plot::$2 ] FINAL ASSEMBLER Score: 3198 // File Comments // Tests the simple bitmap plotter - and counts plots per frame in an IRQ // Plots simple plots /// @file /// Commodore 64 Registers and Constants /// @file /// The MOS 6526 Complex Interface Adapter (CIA) /// /// http://archive.6502.org/datasheets/mos_6526_cia_recreated.pdf // Upstart // Commodore 64 PRG executable file .file [name="bitmap-plot-0.prg", type="prg", segments="Program"] .segmentdef Program [segments="Basic, Code, Data"] .segmentdef Basic [start=$0801] .segmentdef Code [start=$80d] .segmentdef Data [startAfter="Code"] .segment Basic :BasicUpstart(__start) // Global Constants & labels /// Value that disables all CIA interrupts when stored to the CIA Interrupt registers .const CIA_INTERRUPT_CLEAR_ALL = $7f /// $D011 Control Register #1 Bit#5: BMM Turn Bitmap Mode on/off .const VICII_BMM = $20 /// $D011 Control Register #1 Bit#4: DEN Switch VIC-II output on/off .const VICII_DEN = $10 /// $D011 Control Register #1 Bit#3: RSEL Switch betweem 25 or 24 visible rows /// RSEL| Display window height | First line | Last line /// ----+--------------------------+-------------+---------- /// 0 | 24 text lines/192 pixels | 55 ($37) | 246 ($f6) /// 1 | 25 text lines/200 pixels | 51 ($33) | 250 ($fa) .const VICII_RSEL = 8 /// VICII IRQ Status/Enable Raster // @see #IRQ_ENABLE #IRQ_STATUS /// 0 | RST| Reaching a certain raster line. The line is specified by writing /// | | to register 0xd012 and bit 7 of $d011 and internally stored by /// | | the VIC for the raster compare. The test for reaching the /// | | interrupt raster line is done in cycle 0 of every line (for line /// | | 0, in cycle 1). .const IRQ_RASTER = 1 /// Mask for PROCESSOR_PORT_DDR which allows only memory configuration to be written .const PROCPORT_DDR_MEMORY_MASK = 7 /// RAM in 0xA000, 0xE000 I/O in 0xD000 .const PROCPORT_RAM_IO = 5 /// The colors of the C64 .const BLACK = 0 .const WHITE = 1 .const OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d /// $D012 RASTER Raster counter .label RASTER = $d012 /// $D021 Background Color 0 .label BG_COLOR = $d021 /// $D011 Control Register #1 /// - Bit#0-#2: YSCROLL Screen Soft Scroll Vertical /// - Bit#3: RSEL Switch betweem 25 or 24 visible rows /// RSEL| Display window height | First line | Last line /// ----+--------------------------+-------------+---------- /// 0 | 24 text lines/192 pixels | 55 ($37) | 246 ($f6) /// 1 | 25 text lines/200 pixels | 51 ($33) | 250 ($fa) /// - Bit#4: DEN Switch VIC-II output on/off /// - Bit#5: BMM Turn Bitmap Mode on/off /// - Bit#6: ECM Turn Extended Color Mode on/off /// - Bit#7: RST8 9th Bit for $D012 Rasterline counter /// Initial Value: %10011011 .label VICII_CONTROL1 = $d011 /// $D011 Control Register #1 /// @see #VICII_CONTROL1 .label D011 = $d011 /// $D018 VIC-II base addresses // @see #VICII_MEMORY .label D018 = $d018 /// VIC II IRQ Status Register .label IRQ_STATUS = $d019 /// VIC II IRQ Enable Register .label IRQ_ENABLE = $d01a /// Processor port data direction register .label PROCPORT_DDR = 0 /// Processor Port Register controlling RAM/ROM configuration and the datasette .label PROCPORT = 1 /// The CIA#1: keyboard matrix, joystick #1/#2 .label CIA1 = $dc00 /// The vector used when the HARDWARE serves IRQ interrupts .label HARDWARE_IRQ = $fffe .label BITMAP = $2000 .label SCREEN = $400 // Counts frames - updated by the IRQ .label frame_cnt = $d .segment Code // __start __start: { // __start::__init1 // volatile byte frame_cnt = 1 // [1] frame_cnt = 1 -- vbuz1=vbuc1 lda #1 sta.z frame_cnt // [2] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1] // __start::@1 // [3] call main // [11] phi from __start::@1 to main [phi:__start::@1->main] jsr main // __start::@return // [4] return rts } // irq // Interrupt Routine counting frames irq: { // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry sta rega+1 // *BG_COLOR = WHITE // [5] *BG_COLOR = WHITE -- _deref_pbuc1=vbuc2 lda #WHITE sta BG_COLOR // if(frame_cnt) // [6] if(0==frame_cnt) goto irq::@1 -- 0_eq_vbuz1_then_la1 lda.z frame_cnt beq __b1 // irq::@2 // frame_cnt++; // [7] frame_cnt = ++ frame_cnt -- vbuz1=_inc_vbuz1 inc.z frame_cnt // irq::@1 __b1: // *BG_COLOR = BLACK // [8] *BG_COLOR = BLACK -- _deref_pbuc1=vbuc2 lda #BLACK sta BG_COLOR // *IRQ_STATUS = IRQ_RASTER // [9] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 // Acknowledge the IRQ lda #IRQ_RASTER sta IRQ_STATUS // irq::@return // } // [10] return // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit rega: lda #0 rti } // main main: { .const toD0181_return = (>(SCREEN&$3fff)*4)|(>BITMAP)/4&$f .label x = 6 .label y = $c .label vx = $a .label vy = 9 // bitmap_init(BITMAP, SCREEN) // [12] call bitmap_init // [34] phi from main to bitmap_init [phi:main->bitmap_init] jsr bitmap_init // [13] phi from main to main::@8 [phi:main->main::@8] // main::@8 // bitmap_clear(BLACK, WHITE) // [14] call bitmap_clear // [56] phi from main::@8 to bitmap_clear [phi:main::@8->bitmap_clear] jsr bitmap_clear // main::@9 // *D011 = VICII_BMM|VICII_DEN|VICII_RSEL|3 // [15] *D011 = VICII_BMM|VICII_DEN|VICII_RSEL|3 -- _deref_pbuc1=vbuc2 lda #VICII_BMM|VICII_DEN|VICII_RSEL|3 sta D011 // [16] phi from main::@9 to main::toD0181 [phi:main::@9->main::toD0181] // main::toD0181 // main::@7 // *D018 = toD018(SCREEN, BITMAP) // [17] *D018 = main::toD0181_return#0 -- _deref_pbuc1=vbuc2 lda #toD0181_return sta D018 // init_irq() // [18] call init_irq jsr init_irq // [19] phi from main::@7 to main::@1 [phi:main::@7->main::@1] // [19] phi main::vy#2 = 1 [phi:main::@7->main::@1#0] -- vbuz1=vbuc1 lda #1 sta.z vy // [19] phi main::vx#2 = 1 [phi:main::@7->main::@1#1] -- vwuz1=vwuc1 sta.z vx lda #>1 sta.z vx+1 // [19] phi main::y#2 = 0 [phi:main::@7->main::@1#2] -- vbuz1=vbuc1 sta.z y // [19] phi main::x#2 = 0 [phi:main::@7->main::@1#3] -- vwuz1=vwuc1 sta.z x sta.z x+1 // main::@1 // main::@2 __b2: // bitmap_plot(x, y) // [20] bitmap_plot::x#0 = main::x#2 // [21] bitmap_plot::y#0 = main::y#2 -- vbuxx=vbuz1 ldx.z y // [22] call bitmap_plot jsr bitmap_plot // main::@10 // x += vx // [23] main::x#1 = main::x#2 + main::vx#2 -- vwuz1=vwuz1_plus_vwuz2 clc lda.z x adc.z vx sta.z x lda.z x+1 adc.z vx+1 sta.z x+1 // y += vy // [24] main::y#1 = main::y#2 + main::vy#2 -- vbuz1=vbuz1_plus_vbuz2 lda.z y clc adc.z vy sta.z y // if(x==319 || x==0) // [25] if(main::x#1==$13f) goto main::@5 -- vwuz1_eq_vwuc1_then_la1 lda.z x cmp #<$13f bne !+ lda.z x+1 cmp #>$13f beq __b5 !: // main::@11 // [26] if(main::x#1!=0) goto main::@3 -- vwuz1_neq_0_then_la1 lda.z x ora.z x+1 bne __b3 // main::@5 __b5: // vx = -vx // [27] main::vx#1 = - main::vx#2 -- vwuz1=_neg_vwuz1 sec lda #0 sbc.z vx sta.z vx lda #0 sbc.z vx+1 sta.z vx+1 // [28] phi from main::@11 main::@5 to main::@3 [phi:main::@11/main::@5->main::@3] // [28] phi main::vx#6 = main::vx#2 [phi:main::@11/main::@5->main::@3#0] -- register_copy // main::@3 __b3: // if(y==199 || y==0) // [29] if(main::y#1==$c7) goto main::@6 -- vbuz1_eq_vbuc1_then_la1 lda #$c7 cmp.z y beq __b6 // main::@12 // [30] if(main::y#1!=0) goto main::@4 -- vbuz1_neq_0_then_la1 lda.z y bne __b4 // main::@6 __b6: // vy = -vy // [31] main::vy#1 = - main::vy#2 -- vbuz1=_neg_vbuz1 lda.z vy eor #$ff clc adc #1 sta.z vy // [32] phi from main::@12 main::@6 to main::@4 [phi:main::@12/main::@6->main::@4] // [32] phi main::vy#8 = main::vy#2 [phi:main::@12/main::@6->main::@4#0] -- register_copy // main::@4 __b4: // plots_per_frame[frame_cnt]++; // [33] plots_per_frame[frame_cnt] = ++ plots_per_frame[frame_cnt] -- pbuc1_derefidx_vbuz1=_inc_pbuc1_derefidx_vbuz1 ldx.z frame_cnt inc plots_per_frame,x // [19] phi from main::@4 to main::@1 [phi:main::@4->main::@1] // [19] phi main::vy#2 = main::vy#8 [phi:main::@4->main::@1#0] -- register_copy // [19] phi main::vx#2 = main::vx#6 [phi:main::@4->main::@1#1] -- register_copy // [19] phi main::y#2 = main::y#1 [phi:main::@4->main::@1#2] -- register_copy // [19] phi main::x#2 = main::x#1 [phi:main::@4->main::@1#3] -- register_copy jmp __b2 } // bitmap_init // Initialize bitmap plotting tables // void bitmap_init(char *gfx, char *screen) bitmap_init: { .label __7 = 8 .label yoffs = 4 // [35] phi from bitmap_init to bitmap_init::@1 [phi:bitmap_init->bitmap_init::@1] // [35] phi bitmap_init::x#2 = 0 [phi:bitmap_init->bitmap_init::@1#0] -- vbuxx=vbuc1 ldx #0 // [35] phi bitmap_init::bits#3 = $80 [phi:bitmap_init->bitmap_init::@1#1] -- vbuaa=vbuc1 lda #$80 // [35] phi from bitmap_init::@2 to bitmap_init::@1 [phi:bitmap_init::@2->bitmap_init::@1] // [35] phi bitmap_init::x#2 = bitmap_init::x#1 [phi:bitmap_init::@2->bitmap_init::@1#0] -- register_copy // [35] phi bitmap_init::bits#3 = bitmap_init::bits#4 [phi:bitmap_init::@2->bitmap_init::@1#1] -- register_copy // bitmap_init::@1 __b1: // bitmap_plot_bit[x] = bits // [36] bitmap_plot_bit[bitmap_init::x#2] = bitmap_init::bits#3 -- pbuc1_derefidx_vbuxx=vbuaa sta bitmap_plot_bit,x // bits >>= 1 // [37] bitmap_init::bits#1 = bitmap_init::bits#3 >> 1 -- vbuaa=vbuaa_ror_1 lsr // if(bits==0) // [38] if(bitmap_init::bits#1!=0) goto bitmap_init::@6 -- vbuaa_neq_0_then_la1 cmp #0 bne __b2 // [40] phi from bitmap_init::@1 to bitmap_init::@2 [phi:bitmap_init::@1->bitmap_init::@2] // [40] phi bitmap_init::bits#4 = $80 [phi:bitmap_init::@1->bitmap_init::@2#0] -- vbuaa=vbuc1 lda #$80 // [39] phi from bitmap_init::@1 to bitmap_init::@6 [phi:bitmap_init::@1->bitmap_init::@6] // bitmap_init::@6 // [40] phi from bitmap_init::@6 to bitmap_init::@2 [phi:bitmap_init::@6->bitmap_init::@2] // [40] phi bitmap_init::bits#4 = bitmap_init::bits#1 [phi:bitmap_init::@6->bitmap_init::@2#0] -- register_copy // bitmap_init::@2 __b2: // for(char x : 0..255) // [41] bitmap_init::x#1 = ++ bitmap_init::x#2 -- vbuxx=_inc_vbuxx inx // [42] if(bitmap_init::x#1!=0) goto bitmap_init::@1 -- vbuxx_neq_0_then_la1 cpx #0 bne __b1 // [43] phi from bitmap_init::@2 to bitmap_init::@3 [phi:bitmap_init::@2->bitmap_init::@3] // [43] phi bitmap_init::yoffs#2 = BITMAP [phi:bitmap_init::@2->bitmap_init::@3#0] -- pbuz1=pbuc1 lda #BITMAP sta.z yoffs+1 // [43] phi bitmap_init::y#2 = 0 [phi:bitmap_init::@2->bitmap_init::@3#1] -- vbuxx=vbuc1 ldx #0 // [43] phi from bitmap_init::@4 to bitmap_init::@3 [phi:bitmap_init::@4->bitmap_init::@3] // [43] phi bitmap_init::yoffs#2 = bitmap_init::yoffs#4 [phi:bitmap_init::@4->bitmap_init::@3#0] -- register_copy // [43] phi bitmap_init::y#2 = bitmap_init::y#1 [phi:bitmap_init::@4->bitmap_init::@3#1] -- register_copy // bitmap_init::@3 __b3: // y&0x7 // [44] bitmap_init::$7 = bitmap_init::y#2 & 7 -- vbuz1=vbuxx_band_vbuc1 lda #7 sax.z __7 // BYTE0(yoffs) // [45] bitmap_init::$4 = byte0 bitmap_init::yoffs#2 -- vbuaa=_byte0_pbuz1 lda.z yoffs // y&0x7 | BYTE0(yoffs) // [46] bitmap_init::$5 = bitmap_init::$7 | bitmap_init::$4 -- vbuaa=vbuz1_bor_vbuaa ora.z __7 // bitmap_plot_ylo[y] = y&0x7 | BYTE0(yoffs) // [47] bitmap_plot_ylo[bitmap_init::y#2] = bitmap_init::$5 -- pbuc1_derefidx_vbuxx=vbuaa sta bitmap_plot_ylo,x // BYTE1(yoffs) // [48] bitmap_init::$6 = byte1 bitmap_init::yoffs#2 -- vbuaa=_byte1_pbuz1 lda.z yoffs+1 // bitmap_plot_yhi[y] = BYTE1(yoffs) // [49] bitmap_plot_yhi[bitmap_init::y#2] = bitmap_init::$6 -- pbuc1_derefidx_vbuxx=vbuaa sta bitmap_plot_yhi,x // if((y&0x7)==7) // [50] if(bitmap_init::$7!=7) goto bitmap_init::@4 -- vbuz1_neq_vbuc1_then_la1 lda #7 cmp.z __7 bne __b4 // bitmap_init::@5 // yoffs = yoffs + 40*8 // [51] bitmap_init::yoffs#1 = bitmap_init::yoffs#2 + (unsigned int)$28*8 -- pbuz1=pbuz1_plus_vwuc1 lda.z yoffs clc adc #<$28*8 sta.z yoffs lda.z yoffs+1 adc #>$28*8 sta.z yoffs+1 // [52] phi from bitmap_init::@3 bitmap_init::@5 to bitmap_init::@4 [phi:bitmap_init::@3/bitmap_init::@5->bitmap_init::@4] // [52] phi bitmap_init::yoffs#4 = bitmap_init::yoffs#2 [phi:bitmap_init::@3/bitmap_init::@5->bitmap_init::@4#0] -- register_copy // bitmap_init::@4 __b4: // for(char y : 0..255) // [53] bitmap_init::y#1 = ++ bitmap_init::y#2 -- vbuxx=_inc_vbuxx inx // [54] if(bitmap_init::y#1!=0) goto bitmap_init::@3 -- vbuxx_neq_0_then_la1 cpx #0 bne __b3 // bitmap_init::@return // } // [55] return rts } // bitmap_clear // Clear all graphics on the bitmap // bgcol - the background color to fill the screen with // fgcol - the foreground color to fill the screen with // void bitmap_clear(char bgcol, char fgcol) bitmap_clear: { .const col = WHITE*$10 // memset(bitmap_screen, col, 1000uw) // [57] call memset // [77] phi from bitmap_clear to memset [phi:bitmap_clear->memset] // [77] phi memset::c#4 = bitmap_clear::col#0 [phi:bitmap_clear->memset#0] -- vbuxx=vbuc1 ldx #col // [77] phi memset::str#3 = (void *)SCREEN [phi:bitmap_clear->memset#1] -- pvoz1=pvoc1 lda #SCREEN sta.z memset.str+1 // [77] phi memset::num#2 = $3e8 [phi:bitmap_clear->memset#2] -- vwuz1=vwuc1 lda #<$3e8 sta.z memset.num lda #>$3e8 sta.z memset.num+1 jsr memset // [58] phi from bitmap_clear to bitmap_clear::@1 [phi:bitmap_clear->bitmap_clear::@1] // bitmap_clear::@1 // memset(bitmap_gfx, 0, 8000uw) // [59] call memset // [77] phi from bitmap_clear::@1 to memset [phi:bitmap_clear::@1->memset] // [77] phi memset::c#4 = 0 [phi:bitmap_clear::@1->memset#0] -- vbuxx=vbuc1 ldx #0 // [77] phi memset::str#3 = (void *)BITMAP [phi:bitmap_clear::@1->memset#1] -- pvoz1=pvoc1 lda #BITMAP sta.z memset.str+1 // [77] phi memset::num#2 = $1f40 [phi:bitmap_clear::@1->memset#2] -- vwuz1=vwuc1 lda #<$1f40 sta.z memset.num lda #>$1f40 sta.z memset.num+1 jsr memset // bitmap_clear::@return // } // [60] return rts } // init_irq // Setup the IRQ init_irq: { // asm // asm { sei } sei // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK // [62] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 // Disable kernal & basic lda #PROCPORT_DDR_MEMORY_MASK sta.z PROCPORT_DDR // *PROCPORT = PROCPORT_RAM_IO // [63] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 lda #PROCPORT_RAM_IO sta.z PROCPORT // CIA1->INTERRUPT = CIA_INTERRUPT_CLEAR_ALL // [64] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL -- _deref_pbuc1=vbuc2 // Disable CIA 1 Timer IRQ lda #CIA_INTERRUPT_CLEAR_ALL sta CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT // *VICII_CONTROL1 |=$80 // [65] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 // Set raster line to $100 lda #$80 ora VICII_CONTROL1 sta VICII_CONTROL1 // *RASTER = $00 // [66] *RASTER = 0 -- _deref_pbuc1=vbuc2 lda #0 sta RASTER // *IRQ_ENABLE = IRQ_RASTER // [67] *IRQ_ENABLE = IRQ_RASTER -- _deref_pbuc1=vbuc2 // Enable Raster Interrupt lda #IRQ_RASTER sta IRQ_ENABLE // *HARDWARE_IRQ = &irq // [68] *HARDWARE_IRQ = &irq -- _deref_qprc1=pprc2 // Set the IRQ routine lda #irq sta HARDWARE_IRQ+1 // asm // asm { cli } cli // init_irq::@return // } // [70] return rts } // bitmap_plot // Plot a single dot in the bitmap // void bitmap_plot(__zp(6) unsigned int x, __register(X) char y) bitmap_plot: { .label __1 = 4 .label plotter = 2 .label x = 6 // MAKEWORD( bitmap_plot_yhi[y], bitmap_plot_ylo[y] ) // [71] bitmap_plot::plotter#0 = bitmap_plot_yhi[bitmap_plot::y#0] w= bitmap_plot_ylo[bitmap_plot::y#0] -- vwuz1=pbuc1_derefidx_vbuxx_word_pbuc2_derefidx_vbuxx lda bitmap_plot_yhi,x sta.z plotter+1 lda bitmap_plot_ylo,x sta.z plotter // x & 0xfff8 // [72] bitmap_plot::$1 = bitmap_plot::x#0 & $fff8 -- vwuz1=vwuz2_band_vwuc1 lda.z x and #<$fff8 sta.z __1 lda.z x+1 and #>$fff8 sta.z __1+1 // plotter += ( x & 0xfff8 ) // [73] bitmap_plot::plotter#1 = (char *)bitmap_plot::plotter#0 + bitmap_plot::$1 -- pbuz1=pbuz1_plus_vwuz2 clc lda.z plotter adc.z __1 sta.z plotter lda.z plotter+1 adc.z __1+1 sta.z plotter+1 // BYTE0(x) // [74] bitmap_plot::$2 = byte0 bitmap_plot::x#0 -- vbuxx=_byte0_vwuz1 ldx.z x // *plotter |= bitmap_plot_bit[BYTE0(x)] // [75] *bitmap_plot::plotter#1 = *bitmap_plot::plotter#1 | bitmap_plot_bit[bitmap_plot::$2] -- _deref_pbuz1=_deref_pbuz1_bor_pbuc1_derefidx_vbuxx lda bitmap_plot_bit,x ldy #0 ora (plotter),y sta (plotter),y // bitmap_plot::@return // } // [76] return rts } // memset // Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str. // void * memset(__zp(2) void *str, __register(X) char c, __zp(4) unsigned int num) memset: { .label end = 4 .label dst = 2 .label num = 4 .label str = 2 // if(num>0) // [78] if(memset::num#2<=0) goto memset::@return -- vwuz1_le_0_then_la1 lda.z num bne !+ lda.z num+1 beq __breturn !: // memset::@1 // char* end = (char*)str + num // [79] memset::end#0 = (char *)memset::str#3 + memset::num#2 -- pbuz1=pbuz2_plus_vwuz1 clc lda.z end adc.z str sta.z end lda.z end+1 adc.z str+1 sta.z end+1 // [80] memset::dst#4 = (char *)memset::str#3 // [81] phi from memset::@1 memset::@3 to memset::@2 [phi:memset::@1/memset::@3->memset::@2] // [81] phi memset::dst#2 = memset::dst#4 [phi:memset::@1/memset::@3->memset::@2#0] -- register_copy // memset::@2 __b2: // for(char* dst = str; dst!=end; dst++) // [82] if(memset::dst#2!=memset::end#0) goto memset::@3 -- pbuz1_neq_pbuz2_then_la1 lda.z dst+1 cmp.z end+1 bne __b3 lda.z dst cmp.z end bne __b3 // memset::@return __breturn: // } // [83] return rts // memset::@3 __b3: // *dst = c // [84] *memset::dst#2 = memset::c#4 -- _deref_pbuz1=vbuxx txa ldy #0 sta (dst),y // for(char* dst = str; dst!=end; dst++) // [85] memset::dst#1 = ++ memset::dst#2 -- pbuz1=_inc_pbuz1 inc.z dst bne !+ inc.z dst+1 !: jmp __b2 } // File Data .segment Data // Tables for the plotter - initialized by calling bitmap_init(); bitmap_plot_ylo: .fill $100, 0 bitmap_plot_yhi: .fill $100, 0 bitmap_plot_bit: .fill $100, 0 plots_per_frame: .fill $100, 0