kickc/src/test/ref/bitmap-plot-0.log

3048 lines
128 KiB
Plaintext

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
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
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
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
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
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
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
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
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