1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-06-03 07:29:37 +00:00
kickc/src/test/ref/multiplexer-irq/simple-multiplexer-irq.log
2024-01-02 19:21:16 +01:00

3348 lines
165 KiB
Plaintext

Resolved forward reference plex_irq to __interrupt(rom_min_c64) void plex_irq()
Inlined call vicSelectGfxBank::$0 = call toDd00(vicSelectGfxBank::gfx)
Inlined call call plexSetScreen(plexInit::screen)
Inlined call call plexFreePrepare
Inlined call call plexFreeAdd(plexShowSprite::ypos)
Inlined call plex_irq::$2 = call plexFreeNextYpos
Inlined call call __init
Eliminating unused variable with no statement plexShowSprite::$0
CONTROL FLOW GRAPH SSA
void plexInit(char *screen)
plexInit: scope:[plexInit] from init
plexInit::screen#1 = phi( init/plexInit::screen#0 )
plexInit::plexSetScreen1_screen#0 = plexInit::screen#1
to:plexInit::plexSetScreen1
plexInit::plexSetScreen1: scope:[plexInit] from plexInit
plexInit::plexSetScreen1_screen#1 = phi( plexInit/plexInit::plexSetScreen1_screen#0 )
plexInit::plexSetScreen1_$0 = plexInit::plexSetScreen1_screen#1 + $3f8
PLEX_SCREEN_PTR = plexInit::plexSetScreen1_$0
to:plexInit::@2
plexInit::@2: scope:[plexInit] from plexInit::plexSetScreen1
plexInit::i#0 = 0
to:plexInit::@1
plexInit::@1: scope:[plexInit] from plexInit::@1 plexInit::@2
plexInit::i#2 = phi( plexInit::@1/plexInit::i#1, plexInit::@2/plexInit::i#0 )
PLEX_SORTED_IDX[plexInit::i#2] = plexInit::i#2
plexInit::i#1 = plexInit::i#2 + rangenext(0,PLEX_COUNT-1)
plexInit::$1 = plexInit::i#1 != rangelast(0,PLEX_COUNT-1)
if(plexInit::$1) goto plexInit::@1
to:plexInit::@return
plexInit::@return: scope:[plexInit] from plexInit::@1
return
to:@return
void plexSort()
plexSort: scope:[plexSort] from loop::@5
plexSort::m#0 = 0
to:plexSort::@1
plexSort::@1: scope:[plexSort] from plexSort plexSort::@2
plexSort::m#2 = phi( plexSort/plexSort::m#0, plexSort::@2/plexSort::m#1 )
plexSort::$1 = plexSort::m#2 + 1
plexSort::nxt_idx#0 = PLEX_SORTED_IDX[plexSort::$1]
plexSort::nxt_y#0 = PLEX_YPOS[plexSort::nxt_idx#0]
plexSort::$2 = plexSort::nxt_y#0 < PLEX_YPOS[PLEX_SORTED_IDX[plexSort::m#2]]
plexSort::$3 = ! plexSort::$2
if(plexSort::$3) goto plexSort::@2
to:plexSort::@5
plexSort::@2: scope:[plexSort] from plexSort::@1 plexSort::@4
plexSort::m#3 = phi( plexSort::@1/plexSort::m#2, plexSort::@4/plexSort::m#5 )
plexSort::m#1 = plexSort::m#3 + rangenext(0,PLEX_COUNT-2)
plexSort::$8 = plexSort::m#1 != rangelast(0,PLEX_COUNT-2)
if(plexSort::$8) goto plexSort::@1
to:plexSort::@6
plexSort::@5: scope:[plexSort] from plexSort::@1
plexSort::nxt_idx#3 = phi( plexSort::@1/plexSort::nxt_idx#0 )
plexSort::nxt_y#2 = phi( plexSort::@1/plexSort::nxt_y#0 )
plexSort::m#4 = phi( plexSort::@1/plexSort::m#2 )
plexSort::s#0 = plexSort::m#4
to:plexSort::@3
plexSort::@3: scope:[plexSort] from plexSort::@3 plexSort::@5
plexSort::m#6 = phi( plexSort::@3/plexSort::m#6, plexSort::@5/plexSort::m#4 )
plexSort::nxt_idx#2 = phi( plexSort::@3/plexSort::nxt_idx#2, plexSort::@5/plexSort::nxt_idx#3 )
plexSort::nxt_y#1 = phi( plexSort::@3/plexSort::nxt_y#1, plexSort::@5/plexSort::nxt_y#2 )
plexSort::s#3 = phi( plexSort::@3/plexSort::s#1, plexSort::@5/plexSort::s#0 )
plexSort::$4 = plexSort::s#3 + 1
PLEX_SORTED_IDX[plexSort::$4] = PLEX_SORTED_IDX[plexSort::s#3]
plexSort::s#1 = -- plexSort::s#3
plexSort::$5 = plexSort::s#1 != $ff
plexSort::$6 = plexSort::nxt_y#1 < PLEX_YPOS[PLEX_SORTED_IDX[plexSort::s#1]]
plexSort::$7 = plexSort::$5 && plexSort::$6
if(plexSort::$7) goto plexSort::@3
to:plexSort::@4
plexSort::@4: scope:[plexSort] from plexSort::@3
plexSort::m#5 = phi( plexSort::@3/plexSort::m#6 )
plexSort::nxt_idx#1 = phi( plexSort::@3/plexSort::nxt_idx#2 )
plexSort::s#4 = phi( plexSort::@3/plexSort::s#1 )
plexSort::s#2 = ++ plexSort::s#4
PLEX_SORTED_IDX[plexSort::s#2] = plexSort::nxt_idx#1
to:plexSort::@2
plexSort::@6: scope:[plexSort] from plexSort::@2
plex_show_idx = 0
plex_sprite_idx = 0
plex_sprite_msb = 1
to:plexSort::plexFreePrepare1
plexSort::plexFreePrepare1: scope:[plexSort] from plexSort::@6
plexSort::plexFreePrepare1_s#0 = 0
to:plexSort::plexFreePrepare1_@1
plexSort::plexFreePrepare1_@1: scope:[plexSort] from plexSort::plexFreePrepare1 plexSort::plexFreePrepare1_@1
plexSort::plexFreePrepare1_s#2 = phi( plexSort::plexFreePrepare1/plexSort::plexFreePrepare1_s#0, plexSort::plexFreePrepare1_@1/plexSort::plexFreePrepare1_s#1 )
PLEX_FREE_YPOS[plexSort::plexFreePrepare1_s#2] = 0
plexSort::plexFreePrepare1_s#1 = plexSort::plexFreePrepare1_s#2 + rangenext(0,7)
plexSort::plexFreePrepare1_$0 = plexSort::plexFreePrepare1_s#1 != rangelast(0,7)
if(plexSort::plexFreePrepare1_$0) goto plexSort::plexFreePrepare1_@1
to:plexSort::plexFreePrepare1_@2
plexSort::plexFreePrepare1_@2: scope:[plexSort] from plexSort::plexFreePrepare1_@1
plex_free_next = 0
to:plexSort::@return
plexSort::@return: scope:[plexSort] from plexSort::plexFreePrepare1_@2
return
to:@return
void plexShowSprite()
plexShowSprite: scope:[plexShowSprite] from plex_irq::@3
plexShowSprite::plex_sprite_idx2#0 = plex_sprite_idx * 2
plexShowSprite::ypos#0 = PLEX_YPOS[PLEX_SORTED_IDX[plex_show_idx]]
SPRITES_YPOS[plexShowSprite::plex_sprite_idx2#0] = plexShowSprite::ypos#0
plexShowSprite::plexFreeAdd1_ypos#0 = plexShowSprite::ypos#0
to:plexShowSprite::plexFreeAdd1
plexShowSprite::plexFreeAdd1: scope:[plexShowSprite] from plexShowSprite
plexShowSprite::plex_sprite_idx2#2 = phi( plexShowSprite/plexShowSprite::plex_sprite_idx2#0 )
plexShowSprite::plexFreeAdd1_ypos#1 = phi( plexShowSprite/plexShowSprite::plexFreeAdd1_ypos#0 )
plexShowSprite::plexFreeAdd1_$0 = plexShowSprite::plexFreeAdd1_ypos#1 + $16
PLEX_FREE_YPOS[plex_free_next] = plexShowSprite::plexFreeAdd1_$0
plexShowSprite::plexFreeAdd1_$1 = plex_free_next + 1
plexShowSprite::plexFreeAdd1_$2 = plexShowSprite::plexFreeAdd1_$1 & 7
plex_free_next = plexShowSprite::plexFreeAdd1_$2
to:plexShowSprite::@5
plexShowSprite::@5: scope:[plexShowSprite] from plexShowSprite::plexFreeAdd1
plexShowSprite::plex_sprite_idx2#1 = phi( plexShowSprite::plexFreeAdd1/plexShowSprite::plex_sprite_idx2#2 )
PLEX_SCREEN_PTR[plex_sprite_idx] = PLEX_PTR[PLEX_SORTED_IDX[plex_show_idx]]
plexShowSprite::xpos_idx#0 = PLEX_SORTED_IDX[plex_show_idx]
plexShowSprite::$9 = plexShowSprite::xpos_idx#0 * SIZEOF_UNSIGNED_INT
SPRITES_XPOS[plexShowSprite::plex_sprite_idx2#1] = (char)PLEX_XPOS[plexShowSprite::$9]
plexShowSprite::$10 = plexShowSprite::xpos_idx#0 * SIZEOF_UNSIGNED_INT
plexShowSprite::$2 = byte1 PLEX_XPOS[plexShowSprite::$10]
plexShowSprite::$3 = plexShowSprite::$2 != 0
if(plexShowSprite::$3) goto plexShowSprite::@1
to:plexShowSprite::@3
plexShowSprite::@1: scope:[plexShowSprite] from plexShowSprite::@5
*SPRITES_XMSB = *SPRITES_XMSB | plex_sprite_msb
to:plexShowSprite::@2
plexShowSprite::@3: scope:[plexShowSprite] from plexShowSprite::@5
plexShowSprite::$8 = $ff ^ plex_sprite_msb
*SPRITES_XMSB = *SPRITES_XMSB & plexShowSprite::$8
to:plexShowSprite::@2
plexShowSprite::@2: scope:[plexShowSprite] from plexShowSprite::@1 plexShowSprite::@3
plexShowSprite::$4 = plex_sprite_idx + 1
plexShowSprite::$5 = plexShowSprite::$4 & 7
plex_sprite_idx = plexShowSprite::$5
plex_show_idx = ++ plex_show_idx
plex_sprite_msb = plex_sprite_msb << 1
plexShowSprite::$6 = plex_sprite_msb == 0
plexShowSprite::$7 = ! plexShowSprite::$6
if(plexShowSprite::$7) goto plexShowSprite::@return
to:plexShowSprite::@4
plexShowSprite::@4: scope:[plexShowSprite] from plexShowSprite::@2
plex_sprite_msb = 1
to:plexShowSprite::@return
plexShowSprite::@return: scope:[plexShowSprite] from plexShowSprite::@2 plexShowSprite::@4
return
to:@return
void main()
main: scope:[main] from __start::@1
asm { sei }
call init
to:main::@1
main::@1: scope:[main] from main
call loop
to:main::@2
main::@2: scope:[main] from main::@1
to:main::@return
main::@return: scope:[main] from main::@2
return
to:@return
void init()
init: scope:[init] from main
*D011 = VICII_DEN|VICII_RSEL|3
plexInit::screen#0 = SCREEN
call plexInit
to:init::@5
init::@5: scope:[init] from init
init::xp#0 = $20
init::sx#0 = 0
to:init::@1
init::@1: scope:[init] from init::@1 init::@5
init::xp#2 = phi( init::@1/init::xp#1, init::@5/init::xp#0 )
init::sx#2 = phi( init::@1/init::sx#1, init::@5/init::sx#0 )
PLEX_PTR[init::sx#2] = (char)SPRITE/$40
init::$3 = init::sx#2 * SIZEOF_UNSIGNED_INT
PLEX_XPOS[init::$3] = init::xp#2
init::xp#1 = init::xp#2 + 9
init::sx#1 = init::sx#2 + rangenext(0,PLEX_COUNT-1)
init::$1 = init::sx#1 != rangelast(0,PLEX_COUNT-1)
if(init::$1) goto init::@1
to:init::@2
init::@2: scope:[init] from init::@1
*SPRITES_ENABLE = $ff
init::ss#0 = 0
to:init::@3
init::@3: scope:[init] from init::@2 init::@3
init::ss#2 = phi( init::@2/init::ss#0, init::@3/init::ss#1 )
SPRITES_COLOR[init::ss#2] = GREEN
init::ss#1 = init::ss#2 + rangenext(0,7)
init::$2 = init::ss#1 != rangelast(0,7)
if(init::$2) goto init::@3
to:init::@4
init::@4: scope:[init] from init::@3
asm { sei }
*((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL
*IRQ_ENABLE = IRQ_RASTER
*IRQ_STATUS = IRQ_RASTER
*KERNEL_IRQ = &plex_irq
*VICII_CONTROL1 = *VICII_CONTROL1 & $7f
*RASTER = 0
asm { cli }
to:init::@return
init::@return: scope:[init] from init::@4
return
to:@return
__interrupt(rom_min_c64) void plex_irq()
plex_irq: scope:[plex_irq] from
asm { sei }
*BORDER_COLOR = WHITE
plex_irq::rasterY#0 = 0
to:plex_irq::@3
plex_irq::@3: scope:[plex_irq] from plex_irq plex_irq::@6
call plexShowSprite
to:plex_irq::@7
plex_irq::@7: scope:[plex_irq] from plex_irq::@3
to:plex_irq::plexFreeNextYpos1
plex_irq::plexFreeNextYpos1: scope:[plex_irq] from plex_irq::@7
plex_irq::plexFreeNextYpos1_return#0 = PLEX_FREE_YPOS[plex_free_next]
to:plex_irq::plexFreeNextYpos1_@return
plex_irq::plexFreeNextYpos1_@return: scope:[plex_irq] from plex_irq::plexFreeNextYpos1
plex_irq::plexFreeNextYpos1_return#2 = phi( plex_irq::plexFreeNextYpos1/plex_irq::plexFreeNextYpos1_return#0 )
plex_irq::plexFreeNextYpos1_return#1 = plex_irq::plexFreeNextYpos1_return#2
to:plex_irq::@6
plex_irq::@6: scope:[plex_irq] from plex_irq::plexFreeNextYpos1_@return
plex_irq::plexFreeNextYpos1_return#3 = phi( plex_irq::plexFreeNextYpos1_@return/plex_irq::plexFreeNextYpos1_return#1 )
plex_irq::$2 = plex_irq::plexFreeNextYpos1_return#3
plex_irq::rasterY#1 = plex_irq::$2
plex_irq::$3 = plex_show_idx < PLEX_COUNT
plex_irq::$4 = *RASTER + 2
plex_irq::$5 = plex_irq::rasterY#1 < plex_irq::$4
plex_irq::$6 = plex_irq::$3 && plex_irq::$5
if(plex_irq::$6) goto plex_irq::@3
to:plex_irq::@4
plex_irq::@4: scope:[plex_irq] from plex_irq::@6
plex_irq::rasterY#3 = phi( plex_irq::@6/plex_irq::rasterY#1 )
*IRQ_STATUS = IRQ_RASTER
plex_irq::$0 = plex_show_idx < PLEX_COUNT
if(plex_irq::$0) goto plex_irq::@1
to:plex_irq::@5
plex_irq::@1: scope:[plex_irq] from plex_irq::@4
plex_irq::rasterY#2 = phi( plex_irq::@4/plex_irq::rasterY#3 )
*RASTER = plex_irq::rasterY#2
to:plex_irq::@2
plex_irq::@5: scope:[plex_irq] from plex_irq::@4
*RASTER = 0
framedone = true
to:plex_irq::@2
plex_irq::@2: scope:[plex_irq] from plex_irq::@1 plex_irq::@5
*BORDER_COLOR = 0
asm { cli }
to:plex_irq::@return
plex_irq::@return: scope:[plex_irq] from plex_irq::@2
return
to:@return
void loop()
loop: scope:[loop] from main::@1
loop::sin_idx#0 = 0
to:loop::@1
loop::@1: scope:[loop] from loop loop::@6
loop::sin_idx#6 = phi( loop/loop::sin_idx#0, loop::@6/loop::sin_idx#7 )
if(true) goto loop::@2
to:loop::@return
loop::@2: scope:[loop] from loop::@1 loop::@2
loop::sin_idx#4 = phi( loop::@1/loop::sin_idx#6, loop::@2/loop::sin_idx#4 )
loop::$0 = ! framedone
if(loop::$0) goto loop::@2
to:loop::@3
loop::@3: scope:[loop] from loop::@2
loop::sin_idx#2 = phi( loop::@2/loop::sin_idx#4 )
*BORDER_COLOR = RED
loop::y_idx#0 = loop::sin_idx#2
loop::sy#0 = 0
to:loop::@4
loop::@4: scope:[loop] from loop::@3 loop::@4
loop::sin_idx#5 = phi( loop::@3/loop::sin_idx#2, loop::@4/loop::sin_idx#5 )
loop::sy#2 = phi( loop::@3/loop::sy#0, loop::@4/loop::sy#1 )
loop::y_idx#2 = phi( loop::@3/loop::y_idx#0, loop::@4/loop::y_idx#1 )
PLEX_YPOS[loop::sy#2] = YSIN[loop::y_idx#2]
loop::y_idx#1 = loop::y_idx#2 + 8
loop::sy#1 = loop::sy#2 + rangenext(0,PLEX_COUNT-1)
loop::$1 = loop::sy#1 != rangelast(0,PLEX_COUNT-1)
if(loop::$1) goto loop::@4
to:loop::@5
loop::@5: scope:[loop] from loop::@4
loop::sin_idx#3 = phi( loop::@4/loop::sin_idx#5 )
loop::sin_idx#1 = loop::sin_idx#3 + 1
*BORDER_COLOR = ++ *BORDER_COLOR
call plexSort
to:loop::@6
loop::@6: scope:[loop] from loop::@5
loop::sin_idx#7 = phi( loop::@5/loop::sin_idx#1 )
*BORDER_COLOR = GREEN
framedone = false
to:loop::@1
loop::@return: scope:[loop] from loop::@1
return
to:@return
void __start()
__start: scope:[__start] from
to:__start::__init1
__start::__init1: scope:[__start] from __start
PLEX_SCREEN_PTR = (char *)$400+$3f8
plex_show_idx = 0
plex_sprite_idx = 0
plex_sprite_msb = 1
plex_free_next = 0
framedone = true
to:__start::@1
__start::@1: scope:[__start] from __start::__init1
call main
to:__start::@2
__start::@2: scope:[__start] from __start::@1
to:__start::@return
__start::@return: scope:[__start] from __start::@2
return
to:@return
SYMBOL TABLE SSA
__constant char * const BORDER_COLOR = (char *)$d020
__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 const char GREEN = 5
__constant char * const IRQ_ENABLE = (char *)$d01a
__constant const char IRQ_RASTER = 1
__constant char * const IRQ_STATUS = (char *)$d019
__constant void (** const KERNEL_IRQ)() = (void (**)())$314
__constant char OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d
__constant const char PLEX_COUNT = $20
__constant char PLEX_FREE_YPOS[8] = { fill( 8, 0) }
__constant char PLEX_PTR[PLEX_COUNT] = { fill( PLEX_COUNT, 0) }
__loadstore char * volatile PLEX_SCREEN_PTR
__constant char PLEX_SORTED_IDX[PLEX_COUNT] = { fill( PLEX_COUNT, 0) }
__constant unsigned int PLEX_XPOS[PLEX_COUNT] = { fill( PLEX_COUNT, 0) }
__constant char PLEX_YPOS[PLEX_COUNT] = { fill( PLEX_COUNT, 0) }
__constant char * const RASTER = (char *)$d012
__constant const char RED = 2
__constant char *SCREEN = (char *)$400
__constant char SIZEOF_UNSIGNED_INT = 2
__constant char SPRITE[$40] = kickasm {{ .var pic = LoadPicture("balloon.png", List().add($000000, $ffffff))
.for (var y=0; y<21; y++)
.for (var x=0;x<3; x++)
.byte pic.getSinglecolorByte(x,y)
}}
__constant char * const SPRITES_COLOR = (char *)$d027
__constant char * const SPRITES_ENABLE = (char *)$d015
__constant char * const SPRITES_XMSB = (char *)$d010
__constant char * const SPRITES_XPOS = (char *)$d000
__constant char * const SPRITES_YPOS = (char *)$d001
__constant char * const VICII_CONTROL1 = (char *)$d011
__constant const char VICII_DEN = $10
__constant const char VICII_RSEL = 8
__constant const char WHITE = 1
__constant char YSIN[$100] = kickasm {{ .fill $100, round(139.5+89.5*sin(toRadians(360*i/256)))
}}
void __start()
__loadstore volatile bool framedone
void init()
bool init::$1
bool init::$2
char init::$3
char init::ss
char init::ss#0
char init::ss#1
char init::ss#2
char init::sx
char init::sx#0
char init::sx#1
char init::sx#2
unsigned int init::xp
unsigned int init::xp#0
unsigned int init::xp#1
unsigned int init::xp#2
void loop()
bool loop::$0
bool loop::$1
char loop::sin_idx
char loop::sin_idx#0
char loop::sin_idx#1
char loop::sin_idx#2
char loop::sin_idx#3
char loop::sin_idx#4
char loop::sin_idx#5
char loop::sin_idx#6
char loop::sin_idx#7
char loop::sy
char loop::sy#0
char loop::sy#1
char loop::sy#2
char loop::y_idx
char loop::y_idx#0
char loop::y_idx#1
char loop::y_idx#2
void main()
void plexInit(char *screen)
bool plexInit::$1
char plexInit::i
char plexInit::i#0
char plexInit::i#1
char plexInit::i#2
char *plexInit::plexSetScreen1_$0
char *plexInit::plexSetScreen1_screen
char *plexInit::plexSetScreen1_screen#0
char *plexInit::plexSetScreen1_screen#1
char *plexInit::screen
char *plexInit::screen#0
char *plexInit::screen#1
void plexShowSprite()
char plexShowSprite::$10
char plexShowSprite::$2
bool plexShowSprite::$3
number plexShowSprite::$4
number plexShowSprite::$5
bool plexShowSprite::$6
bool plexShowSprite::$7
number plexShowSprite::$8
char plexShowSprite::$9
number plexShowSprite::plexFreeAdd1_$0
number plexShowSprite::plexFreeAdd1_$1
number plexShowSprite::plexFreeAdd1_$2
char plexShowSprite::plexFreeAdd1_ypos
char plexShowSprite::plexFreeAdd1_ypos#0
char plexShowSprite::plexFreeAdd1_ypos#1
char plexShowSprite::plex_sprite_idx2
char plexShowSprite::plex_sprite_idx2#0
char plexShowSprite::plex_sprite_idx2#1
char plexShowSprite::plex_sprite_idx2#2
char plexShowSprite::xpos_idx
char plexShowSprite::xpos_idx#0
char plexShowSprite::ypos
char plexShowSprite::ypos#0
void plexSort()
number plexSort::$1
bool plexSort::$2
bool plexSort::$3
number plexSort::$4
bool plexSort::$5
bool plexSort::$6
bool plexSort::$7
bool plexSort::$8
char plexSort::m
char plexSort::m#0
char plexSort::m#1
char plexSort::m#2
char plexSort::m#3
char plexSort::m#4
char plexSort::m#5
char plexSort::m#6
char plexSort::nxt_idx
char plexSort::nxt_idx#0
char plexSort::nxt_idx#1
char plexSort::nxt_idx#2
char plexSort::nxt_idx#3
char plexSort::nxt_y
char plexSort::nxt_y#0
char plexSort::nxt_y#1
char plexSort::nxt_y#2
bool plexSort::plexFreePrepare1_$0
char plexSort::plexFreePrepare1_s
char plexSort::plexFreePrepare1_s#0
char plexSort::plexFreePrepare1_s#1
char plexSort::plexFreePrepare1_s#2
char plexSort::s
char plexSort::s#0
char plexSort::s#1
char plexSort::s#2
char plexSort::s#3
char plexSort::s#4
__loadstore volatile char plex_free_next
__interrupt(rom_min_c64) void plex_irq()
bool plex_irq::$0
char plex_irq::$2
bool plex_irq::$3
number plex_irq::$4
bool plex_irq::$5
bool plex_irq::$6
char plex_irq::plexFreeNextYpos1_return
char plex_irq::plexFreeNextYpos1_return#0
char plex_irq::plexFreeNextYpos1_return#1
char plex_irq::plexFreeNextYpos1_return#2
char plex_irq::plexFreeNextYpos1_return#3
char plex_irq::rasterY
char plex_irq::rasterY#0
char plex_irq::rasterY#1
char plex_irq::rasterY#2
char plex_irq::rasterY#3
__loadstore volatile char plex_show_idx
__loadstore volatile char plex_sprite_idx
__loadstore volatile char plex_sprite_msb
Adding number conversion cast (unumber) $3f8 in plexInit::plexSetScreen1_$0 = plexInit::plexSetScreen1_screen#1 + $3f8
Adding number conversion cast (unumber) 1 in plexInit::i#1 = plexInit::i#2 + rangenext(0,PLEX_COUNT-1)
Adding number conversion cast (unumber) 1 in plexSort::$1 = plexSort::m#2 + 1
Adding number conversion cast (unumber) plexSort::$1 in plexSort::$1 = plexSort::m#2 + (unumber)1
Adding number conversion cast (unumber) 2 in plexSort::m#1 = plexSort::m#3 + rangenext(0,PLEX_COUNT-2)
Adding number conversion cast (unumber) 1 in plexSort::$4 = plexSort::s#3 + 1
Adding number conversion cast (unumber) plexSort::$4 in plexSort::$4 = plexSort::s#3 + (unumber)1
Adding number conversion cast (unumber) $ff in plexSort::$5 = plexSort::s#1 != $ff
Adding number conversion cast (unumber) 0 in plex_show_idx = 0
Adding number conversion cast (unumber) 0 in plex_sprite_idx = 0
Adding number conversion cast (unumber) 1 in plex_sprite_msb = 1
Adding number conversion cast (unumber) 0 in PLEX_FREE_YPOS[plexSort::plexFreePrepare1_s#2] = 0
Adding number conversion cast (unumber) 0 in plex_free_next = 0
Adding number conversion cast (unumber) 2 in plexShowSprite::plex_sprite_idx2#0 = plex_sprite_idx * 2
Adding number conversion cast (unumber) $16 in plexShowSprite::plexFreeAdd1_$0 = plexShowSprite::plexFreeAdd1_ypos#1 + $16
Adding number conversion cast (unumber) plexShowSprite::plexFreeAdd1_$0 in plexShowSprite::plexFreeAdd1_$0 = plexShowSprite::plexFreeAdd1_ypos#1 + (unumber)$16
Adding number conversion cast (unumber) 1 in plexShowSprite::plexFreeAdd1_$1 = plex_free_next + 1
Adding number conversion cast (unumber) plexShowSprite::plexFreeAdd1_$1 in plexShowSprite::plexFreeAdd1_$1 = plex_free_next + (unumber)1
Adding number conversion cast (unumber) 7 in plexShowSprite::plexFreeAdd1_$2 = plexShowSprite::plexFreeAdd1_$1 & 7
Adding number conversion cast (unumber) plexShowSprite::plexFreeAdd1_$2 in plexShowSprite::plexFreeAdd1_$2 = plexShowSprite::plexFreeAdd1_$1 & (unumber)7
Adding number conversion cast (unumber) 0 in plexShowSprite::$3 = plexShowSprite::$2 != 0
Adding number conversion cast (unumber) $ff in plexShowSprite::$8 = $ff ^ plex_sprite_msb
Adding number conversion cast (unumber) plexShowSprite::$8 in plexShowSprite::$8 = (unumber)$ff ^ plex_sprite_msb
Adding number conversion cast (unumber) 1 in plexShowSprite::$4 = plex_sprite_idx + 1
Adding number conversion cast (unumber) plexShowSprite::$4 in plexShowSprite::$4 = plex_sprite_idx + (unumber)1
Adding number conversion cast (unumber) 7 in plexShowSprite::$5 = plexShowSprite::$4 & 7
Adding number conversion cast (unumber) plexShowSprite::$5 in plexShowSprite::$5 = plexShowSprite::$4 & (unumber)7
Adding number conversion cast (unumber) 1 in plex_sprite_msb = plex_sprite_msb << 1
Adding number conversion cast (unumber) 0 in plexShowSprite::$6 = plex_sprite_msb == 0
Adding number conversion cast (unumber) 1 in plex_sprite_msb = 1
Adding number conversion cast (unumber) VICII_DEN|VICII_RSEL|3 in *D011 = VICII_DEN|VICII_RSEL|3
Adding number conversion cast (unumber) 3 in *D011 = ((unumber)) VICII_DEN|VICII_RSEL|3
Adding number conversion cast (unumber) $40 in PLEX_PTR[init::sx#2] = (char)SPRITE/$40
Adding number conversion cast (unumber) 9 in init::xp#1 = init::xp#2 + 9
Adding number conversion cast (unumber) 1 in init::sx#1 = init::sx#2 + rangenext(0,PLEX_COUNT-1)
Adding number conversion cast (unumber) $ff in *SPRITES_ENABLE = $ff
Adding number conversion cast (unumber) $7f in *VICII_CONTROL1 = *VICII_CONTROL1 & $7f
Adding number conversion cast (unumber) 0 in *RASTER = 0
Adding number conversion cast (unumber) 2 in plex_irq::$4 = *RASTER + 2
Adding number conversion cast (unumber) plex_irq::$4 in plex_irq::$4 = *RASTER + (unumber)2
Adding number conversion cast (unumber) 0 in *RASTER = 0
Adding number conversion cast (unumber) 0 in *BORDER_COLOR = 0
Adding number conversion cast (unumber) 8 in loop::y_idx#1 = loop::y_idx#2 + 8
Adding number conversion cast (unumber) 1 in loop::sy#1 = loop::sy#2 + rangenext(0,PLEX_COUNT-1)
Adding number conversion cast (unumber) 1 in loop::sin_idx#1 = loop::sin_idx#3 + 1
Adding number conversion cast (unumber) $3f8 in PLEX_SCREEN_PTR = (char *)$400+$3f8
Successful SSA optimization PassNAddNumberTypeConversions
Inlining cast plex_show_idx = (unumber)0
Inlining cast plex_sprite_idx = (unumber)0
Inlining cast plex_sprite_msb = (unumber)1
Inlining cast PLEX_FREE_YPOS[plexSort::plexFreePrepare1_s#2] = (unumber)0
Inlining cast plex_free_next = (unumber)0
Inlining cast plex_sprite_msb = (unumber)1
Inlining cast *D011 = (unumber)VICII_DEN|VICII_RSEL|(unumber)3
Inlining cast *SPRITES_ENABLE = (unumber)$ff
Inlining cast *RASTER = (unumber)0
Inlining cast *RASTER = (unumber)0
Inlining cast *BORDER_COLOR = (unumber)0
Successful SSA optimization Pass2InlineCast
Simplifying constant pointer cast (char *) 53248
Simplifying constant pointer cast (char *) 53249
Simplifying constant pointer cast (char *) 53264
Simplifying constant pointer cast (char *) 53287
Simplifying constant pointer cast (char *) 53269
Simplifying constant pointer cast (char *) 53266
Simplifying constant pointer cast (char *) 53280
Simplifying constant pointer cast (char *) 53265
Simplifying constant pointer cast (char *) 53265
Simplifying constant pointer cast (char *) 53273
Simplifying constant pointer cast (char *) 53274
Simplifying constant pointer cast (struct MOS6526_CIA *) 56320
Simplifying constant pointer cast (void (**)()) 788
Simplifying constant pointer cast (char *) 1024
Simplifying constant integer cast $3f8
Simplifying constant integer cast 1
Simplifying constant integer cast 1
Simplifying constant integer cast 2
Simplifying constant integer cast 1
Simplifying constant integer cast $ff
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 2
Simplifying constant integer cast $16
Simplifying constant integer cast 1
Simplifying constant integer cast 7
Simplifying constant integer cast 0
Simplifying constant integer cast $ff
Simplifying constant integer cast 1
Simplifying constant integer cast 7
Simplifying constant integer cast 1
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast VICII_DEN|VICII_RSEL|(unumber)3
Simplifying constant integer cast 3
Simplifying constant integer cast $40
Simplifying constant integer cast 9
Simplifying constant integer cast 1
Simplifying constant integer cast $ff
Simplifying constant integer cast $7f
Simplifying constant integer cast 0
Simplifying constant integer cast 2
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 8
Simplifying constant integer cast 1
Simplifying constant integer cast 1
Simplifying constant pointer cast (char *) 1024
Simplifying constant integer cast $3f8
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (unsigned int) $3f8
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 2
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) $ff
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 2
Finalized unsigned number type (char) $16
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 7
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) $ff
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 7
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 3
Finalized unsigned number type (char) $40
Finalized unsigned number type (char) 9
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) $ff
Finalized unsigned number type (char) $7f
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 2
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 1
Finalized unsigned number type (unsigned int) $3f8
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inferred type updated to char in plexSort::$1 = plexSort::m#2 + 1
Inferred type updated to char in plexSort::$4 = plexSort::s#3 + 1
Inferred type updated to char in plexShowSprite::plexFreeAdd1_$0 = plexShowSprite::plexFreeAdd1_ypos#1 + $16
Inferred type updated to char in plexShowSprite::plexFreeAdd1_$1 = plex_free_next + 1
Inferred type updated to char in plexShowSprite::plexFreeAdd1_$2 = plexShowSprite::plexFreeAdd1_$1 & 7
Inferred type updated to char in plexShowSprite::$8 = $ff ^ plex_sprite_msb
Inferred type updated to char in plexShowSprite::$4 = plex_sprite_idx + 1
Inferred type updated to char in plexShowSprite::$5 = plexShowSprite::$4 & 7
Inferred type updated to char in plex_irq::$4 = *RASTER + 2
Inversing boolean not [18] plexSort::$3 = plexSort::nxt_y#0 >= PLEX_YPOS[PLEX_SORTED_IDX[plexSort::m#2]] from [17] plexSort::$2 = plexSort::nxt_y#0 < PLEX_YPOS[PLEX_SORTED_IDX[plexSort::m#2]]
Inversing boolean not [76] plexShowSprite::$7 = plex_sprite_msb != 0 from [75] plexShowSprite::$6 = plex_sprite_msb == 0
Successful SSA optimization Pass2UnaryNotSimplification
Alias candidate removed (volatile)PLEX_SCREEN_PTR = plexInit::plexSetScreen1_$0
Alias candidate removed (volatile)plex_free_next = plexShowSprite::plexFreeAdd1_$2
Alias candidate removed (volatile)plex_sprite_idx = plexShowSprite::$5
Alias plexInit::plexSetScreen1_screen#0 = plexInit::screen#1 plexInit::plexSetScreen1_screen#1
Alias plexSort::m#2 = plexSort::m#4 plexSort::s#0
Alias plexSort::nxt_y#0 = plexSort::nxt_y#2
Alias plexSort::nxt_idx#0 = plexSort::nxt_idx#3
Alias plexSort::s#1 = plexSort::s#4
Alias plexSort::nxt_idx#1 = plexSort::nxt_idx#2
Alias plexSort::m#5 = plexSort::m#6
Alias plexShowSprite::plexFreeAdd1_ypos#0 = plexShowSprite::ypos#0 plexShowSprite::plexFreeAdd1_ypos#1
Alias plexShowSprite::plex_sprite_idx2#0 = plexShowSprite::plex_sprite_idx2#2 plexShowSprite::plex_sprite_idx2#1
Alias plex_irq::plexFreeNextYpos1_return#0 = plex_irq::plexFreeNextYpos1_return#2 plex_irq::plexFreeNextYpos1_return#1 plex_irq::plexFreeNextYpos1_return#3 plex_irq::$2 plex_irq::rasterY#1 plex_irq::rasterY#3 plex_irq::rasterY#2
Alias loop::sin_idx#2 = loop::sin_idx#4 loop::y_idx#0
Alias loop::sin_idx#3 = loop::sin_idx#5
Alias loop::sin_idx#1 = loop::sin_idx#7
Successful SSA optimization Pass2AliasElimination
Alias candidate removed (volatile)PLEX_SCREEN_PTR = plexInit::plexSetScreen1_$0
Alias candidate removed (volatile)plex_free_next = plexShowSprite::plexFreeAdd1_$2
Alias candidate removed (volatile)plex_sprite_idx = plexShowSprite::$5
Identical Phi Values plexInit::plexSetScreen1_screen#0 plexInit::screen#0
Identical Phi Values plexSort::nxt_y#1 plexSort::nxt_y#0
Identical Phi Values plexSort::nxt_idx#1 plexSort::nxt_idx#0
Identical Phi Values plexSort::m#5 plexSort::m#2
Identical Phi Values loop::sin_idx#2 loop::sin_idx#6
Identical Phi Values loop::sin_idx#3 loop::sin_idx#2
Successful SSA optimization Pass2IdenticalPhiElimination
Identical Phi Values plexSort::m#3 plexSort::m#2
Successful SSA optimization Pass2IdenticalPhiElimination
Identified duplicate assignment right side [63] plexShowSprite::$10 = plexShowSprite::xpos_idx#0 * SIZEOF_UNSIGNED_INT
Successful SSA optimization Pass2DuplicateRValueIdentification
Simple Condition plexInit::$1 [8] if(plexInit::i#1!=rangelast(0,PLEX_COUNT-1)) goto plexInit::@1
Simple Condition plexSort::$3 [16] if(plexSort::nxt_y#0>=PLEX_YPOS[PLEX_SORTED_IDX[plexSort::m#2]]) goto plexSort::@2
Simple Condition plexSort::$8 [20] if(plexSort::m#1!=rangelast(0,PLEX_COUNT-2)) goto plexSort::@1
Simple Condition plexSort::plexFreePrepare1_$0 [39] if(plexSort::plexFreePrepare1_s#1!=rangelast(0,7)) goto plexSort::plexFreePrepare1_@1
Simple Condition plexShowSprite::$3 [57] if(plexShowSprite::$2!=0) goto plexShowSprite::@1
Simple Condition plexShowSprite::$7 [67] if(plex_sprite_msb!=0) goto plexShowSprite::@return
Simple Condition init::$1 [86] if(init::sx#1!=rangelast(0,PLEX_COUNT-1)) goto init::@1
Simple Condition init::$2 [93] if(init::ss#1!=rangelast(0,7)) goto init::@3
Simple Condition plex_irq::$0 [115] if(plex_show_idx<PLEX_COUNT) goto plex_irq::@1
Simple Condition loop::$1 [135] if(loop::sy#1!=rangelast(0,PLEX_COUNT-1)) goto loop::@4
Successful SSA optimization Pass2ConditionalJumpSimplification
Rewriting && if()-condition to two if()s [27] plexSort::$7 = plexSort::$5 && plexSort::$6
Rewriting && if()-condition to two if()s [111] plex_irq::$6 = plex_irq::$3 && plex_irq::$5
Rewriting ! if()-condition to reversed if() [126] loop::$0 = ! framedone
Successful SSA optimization Pass2ConditionalAndOrRewriting
Constant plexInit::i#0 = 0
Constant plexSort::m#0 = 0
Constant plexSort::plexFreePrepare1_s#0 = 0
Constant plexInit::screen#0 = SCREEN
Constant init::xp#0 = $20
Constant init::sx#0 = 0
Constant init::ss#0 = 0
Constant plex_irq::rasterY#0 = 0
Constant loop::sin_idx#0 = 0
Constant loop::sy#0 = 0
Successful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination [124] if(true) goto loop::@2
Successful SSA optimization Pass2ConstantIfs
Resolved ranged next value [6] plexInit::i#1 = ++ plexInit::i#2 to ++
Resolved ranged comparison value [8] if(plexInit::i#1!=rangelast(0,PLEX_COUNT-1)) goto plexInit::@1 to PLEX_COUNT-1+1
Resolved ranged next value [18] plexSort::m#1 = ++ plexSort::m#2 to ++
Resolved ranged comparison value [20] if(plexSort::m#1!=rangelast(0,PLEX_COUNT-2)) goto plexSort::@1 to PLEX_COUNT-2+1
Resolved ranged next value [37] plexSort::plexFreePrepare1_s#1 = ++ plexSort::plexFreePrepare1_s#2 to ++
Resolved ranged comparison value [39] if(plexSort::plexFreePrepare1_s#1!=rangelast(0,7)) goto plexSort::plexFreePrepare1_@1 to 8
Resolved ranged next value [84] init::sx#1 = ++ init::sx#2 to ++
Resolved ranged comparison value [86] if(init::sx#1!=rangelast(0,PLEX_COUNT-1)) goto init::@1 to PLEX_COUNT-1+1
Resolved ranged next value [91] init::ss#1 = ++ init::ss#2 to ++
Resolved ranged comparison value [93] if(init::ss#1!=rangelast(0,7)) goto init::@3 to 8
Resolved ranged next value [133] loop::sy#1 = ++ loop::sy#2 to ++
Resolved ranged comparison value [135] if(loop::sy#1!=rangelast(0,PLEX_COUNT-1)) goto loop::@4 to PLEX_COUNT-1+1
Removing unused block loop::@return
Successful SSA optimization Pass2EliminateUnusedBlocks
Eliminating unused constant plex_irq::rasterY#0
Successful SSA optimization PassNEliminateUnusedVars
Adding number conversion cast (unumber) PLEX_COUNT-1+1 in if(plexInit::i#1!=PLEX_COUNT-1+1) goto plexInit::@1
Adding number conversion cast (unumber) 1 in if(plexInit::i#1!=(unumber)PLEX_COUNT-1+1) goto plexInit::@1
Adding number conversion cast (unumber) PLEX_COUNT-2+1 in if(plexSort::m#1!=PLEX_COUNT-2+1) goto plexSort::@1
Adding number conversion cast (unumber) 1 in if(plexSort::m#1!=(unumber)PLEX_COUNT-2+1) goto plexSort::@1
Adding number conversion cast (unumber) 8 in if(plexSort::plexFreePrepare1_s#1!=8) goto plexSort::plexFreePrepare1_@1
Adding number conversion cast (unumber) PLEX_COUNT-1+1 in if(init::sx#1!=PLEX_COUNT-1+1) goto init::@1
Adding number conversion cast (unumber) 1 in if(init::sx#1!=(unumber)PLEX_COUNT-1+1) goto init::@1
Adding number conversion cast (unumber) 8 in if(init::ss#1!=8) goto init::@3
Adding number conversion cast (unumber) PLEX_COUNT-1+1 in if(loop::sy#1!=PLEX_COUNT-1+1) goto loop::@4
Adding number conversion cast (unumber) 1 in if(loop::sy#1!=(unumber)PLEX_COUNT-1+1) goto loop::@4
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant integer cast PLEX_COUNT-1+(unumber)1
Simplifying constant integer cast 1
Simplifying constant integer cast PLEX_COUNT-2+(unumber)1
Simplifying constant integer cast 1
Simplifying constant integer cast 8
Simplifying constant integer cast PLEX_COUNT-1+(unumber)1
Simplifying constant integer cast 1
Simplifying constant integer cast 8
Simplifying constant integer cast PLEX_COUNT-1+(unumber)1
Simplifying constant integer cast 1
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 1
Successful SSA optimization PassNFinalizeNumberTypeConversions
Alias candidate removed (volatile)PLEX_SCREEN_PTR = plexInit::plexSetScreen1_$0
Alias candidate removed (volatile)plex_free_next = plexShowSprite::plexFreeAdd1_$2
Alias candidate removed (volatile)plex_sprite_idx = plexShowSprite::$5
Alias plexShowSprite::$10 = plexShowSprite::$9
Successful SSA optimization Pass2AliasElimination
Alias candidate removed (volatile)PLEX_SCREEN_PTR = plexInit::plexSetScreen1_$0
Alias candidate removed (volatile)plex_free_next = plexShowSprite::plexFreeAdd1_$2
Alias candidate removed (volatile)plex_sprite_idx = plexShowSprite::$5
Simple Condition plexSort::$5 [20] if(plexSort::s#1!=$ff) goto plexSort::@7
Simple Condition plexSort::$6 [32] if(plexSort::nxt_y#0<PLEX_YPOS[PLEX_SORTED_IDX[plexSort::s#1]]) goto plexSort::@3
Simple Condition plex_irq::$3 [92] if(plex_show_idx<PLEX_COUNT) goto plex_irq::@8
Simple Condition plex_irq::$5 [101] if(plex_irq::plexFreeNextYpos1_return#0<plex_irq::$4) goto plex_irq::@3
Successful SSA optimization Pass2ConditionalJumpSimplification
Negating conditional jump and destination [20] if(plexSort::s#1==$ff) goto plexSort::@4
Negating conditional jump and destination [92] if(plex_show_idx>=PLEX_COUNT) goto plex_irq::@4
Successful SSA optimization Pass2ConditionalJumpSequenceImprovement
Constant right-side identified [0] plexInit::plexSetScreen1_$0 = plexInit::screen#0 + $3f8
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant plexInit::plexSetScreen1_$0 = plexInit::screen#0+$3f8
Successful SSA optimization Pass2ConstantIdentification
Alias candidate removed (volatile)plex_free_next = plexShowSprite::plexFreeAdd1_$2
Alias candidate removed (volatile)plex_sprite_idx = plexShowSprite::$5
Rewriting multiplication to use shift [30] plexShowSprite::plex_sprite_idx2#0 = plex_sprite_idx * 2
Rewriting multiplication to use shift [40] plexShowSprite::$10 = plexShowSprite::xpos_idx#0 * SIZEOF_UNSIGNED_INT
Rewriting multiplication to use shift [63] init::$3 = init::sx#2 * SIZEOF_UNSIGNED_INT
Successful SSA optimization Pass2MultiplyToShiftRewriting
Inlining constant with var siblings plexInit::i#0
Inlining constant with var siblings plexSort::m#0
Inlining constant with var siblings plexSort::plexFreePrepare1_s#0
Inlining constant with var siblings init::xp#0
Inlining constant with var siblings init::sx#0
Inlining constant with var siblings init::ss#0
Inlining constant with var siblings loop::sin_idx#0
Inlining constant with var siblings loop::sy#0
Constant inlined plexInit::screen#0 = SCREEN
Constant inlined init::xp#0 = $20
Constant inlined plexInit::plexSetScreen1_$0 = SCREEN+$3f8
Constant inlined loop::sy#0 = 0
Constant inlined init::sx#0 = 0
Constant inlined plexSort::plexFreePrepare1_s#0 = 0
Constant inlined init::ss#0 = 0
Constant inlined plexInit::i#0 = 0
Constant inlined plexSort::m#0 = 0
Constant inlined loop::sin_idx#0 = 0
Successful SSA optimization Pass2ConstantInlining
Consolidated array index constant in assignment (PLEX_SORTED_IDX+1)[plexSort::$1]
Consolidated array index constant in assignment (PLEX_SORTED_IDX+1)[plexSort::$4]
Successful SSA optimization Pass2ConstantAdditionElimination
Alias candidate removed (volatile)plex_free_next = plexShowSprite::plexFreeAdd1_$2
Alias candidate removed (volatile)plex_sprite_idx = plexShowSprite::$5
Alias plexSort::m#2 = plexSort::$1
Alias plexSort::s#3 = plexSort::$4
Successful SSA optimization Pass2AliasElimination
Alias candidate removed (volatile)plex_free_next = plexShowSprite::plexFreeAdd1_$2
Alias candidate removed (volatile)plex_sprite_idx = plexShowSprite::$5
Eliminating unused constant SIZEOF_UNSIGNED_INT
Successful SSA optimization PassNEliminateUnusedVars
Alias candidate removed (volatile)plex_free_next = plexShowSprite::plexFreeAdd1_$2
Alias candidate removed (volatile)plex_sprite_idx = plexShowSprite::$5
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) $40
Finalized unsigned number type (unsigned int) $100
Successful SSA optimization PassNFinalizeNumberTypeConversions
Alias candidate removed (volatile)plex_free_next = plexShowSprite::plexFreeAdd1_$2
Alias candidate removed (volatile)plex_sprite_idx = plexShowSprite::$5
Alias candidate removed (volatile)plex_free_next = plexShowSprite::plexFreeAdd1_$2
Alias candidate removed (volatile)plex_sprite_idx = plexShowSprite::$5
Added new block during phi lifting plexInit::@3(between plexInit::@1 and plexInit::@1)
Added new block during phi lifting plexSort::@8(between plexSort::@2 and plexSort::@1)
Added new block during phi lifting plexSort::@9(between plexSort::@7 and plexSort::@3)
Added new block during phi lifting plexSort::@10(between plexSort::plexFreePrepare1_@1 and plexSort::plexFreePrepare1_@1)
Added new block during phi lifting init::@6(between init::@1 and init::@1)
Added new block during phi lifting init::@7(between init::@3 and init::@3)
Added new block during phi lifting loop::@7(between loop::@4 and loop::@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 plex_irq::@3
Adding NOP phi() at start of plex_irq::@7
Adding NOP phi() at start of plex_irq::plexFreeNextYpos1_@return
Adding NOP phi() at start of main::@1
Adding NOP phi() at start of main::@2
Adding NOP phi() at start of init::@5
Adding NOP phi() at start of loop
Adding NOP phi() at start of plexInit
Adding NOP phi() at start of plexInit::@2
Adding NOP phi() at start of plexSort
Adding NOP phi() at start of plexSort::plexFreePrepare1
CALL GRAPH
Calls in [__start] to main:8
Calls in [plex_irq] to plexShowSprite:14
Calls in [main] to init:30 loop:32
Calls in [init] to plexInit:61
Calls in [loop] to plexSort:99
Created 10 initial phi equivalence classes
Coalesced [84] init::ss#3 = init::ss#1
Coalesced [85] init::sx#3 = init::sx#1
Coalesced [86] init::xp#3 = init::xp#1
Not coalescing [91] loop::y_idx#3 = loop::sin_idx#6
Coalesced [102] loop::sin_idx#8 = loop::sin_idx#1
Coalesced [103] loop::y_idx#4 = loop::y_idx#1
Coalesced [104] loop::sy#3 = loop::sy#1
Coalesced [113] plexInit::i#3 = plexInit::i#1
Not coalescing [119] plexSort::s#6 = plexSort::m#2
Coalesced [139] plexSort::plexFreePrepare1_s#3 = plexSort::plexFreePrepare1_s#1
Coalesced [140] plexSort::m#7 = plexSort::m#1
Coalesced [141] plexSort::s#5 = plexSort::s#1
Coalesced down to 10 phi equivalence classes
Culled Empty Block label __start::@2
Culled Empty Block label plex_irq::@7
Culled Empty Block label plex_irq::plexFreeNextYpos1_@return
Culled Empty Block label main::@2
Culled Empty Block label init::@5
Culled Empty Block label init::@7
Culled Empty Block label init::@6
Culled Empty Block label loop::@7
Culled Empty Block label plexInit::@2
Culled Empty Block label plexInit::@3
Culled Empty Block label plexSort::@10
Culled Empty Block label plexSort::@8
Culled Empty Block label plexSort::@9
Renumbering block plex_irq::@8 to plex_irq::@7
Adding NOP phi() at start of __start
Adding NOP phi() at start of __start::@1
Adding NOP phi() at start of plex_irq::@3
Adding NOP phi() at start of main::@1
Adding NOP phi() at start of loop
Adding NOP phi() at start of plexInit
Adding NOP phi() at start of plexSort
Adding NOP phi() at start of plexSort::plexFreePrepare1
FINAL CONTROL FLOW GRAPH
void __start()
__start: scope:[__start] from
[0] phi()
to:__start::__init1
__start::__init1: scope:[__start] from __start
[1] PLEX_SCREEN_PTR = (char *) 1024+$3f8
[2] plex_show_idx = 0
[3] plex_sprite_idx = 0
[4] plex_sprite_msb = 1
[5] plex_free_next = 0
[6] framedone = true
to:__start::@1
__start::@1: scope:[__start] from __start::__init1
[7] phi()
[8] call main
to:__start::@return
__start::@return: scope:[__start] from __start::@1
[9] return
to:@return
__interrupt(rom_min_c64) void plex_irq()
plex_irq: scope:[plex_irq] from
asm { sei }
[11] *BORDER_COLOR = WHITE
to:plex_irq::@3
plex_irq::@3: scope:[plex_irq] from plex_irq plex_irq::@7
[12] phi()
[13] call plexShowSprite
to:plex_irq::plexFreeNextYpos1
plex_irq::plexFreeNextYpos1: scope:[plex_irq] from plex_irq::@3
[14] plex_irq::plexFreeNextYpos1_return#0 = PLEX_FREE_YPOS[plex_free_next]
to:plex_irq::@6
plex_irq::@6: scope:[plex_irq] from plex_irq::plexFreeNextYpos1
[15] plex_irq::$4 = *RASTER + 2
[16] if(plex_show_idx>=PLEX_COUNT) goto plex_irq::@4
to:plex_irq::@7
plex_irq::@7: scope:[plex_irq] from plex_irq::@6
[17] if(plex_irq::plexFreeNextYpos1_return#0<plex_irq::$4) goto plex_irq::@3
to:plex_irq::@4
plex_irq::@4: scope:[plex_irq] from plex_irq::@6 plex_irq::@7
[18] *IRQ_STATUS = IRQ_RASTER
[19] if(plex_show_idx<PLEX_COUNT) goto plex_irq::@1
to:plex_irq::@5
plex_irq::@5: scope:[plex_irq] from plex_irq::@4
[20] *RASTER = 0
[21] framedone = true
to:plex_irq::@2
plex_irq::@2: scope:[plex_irq] from plex_irq::@1 plex_irq::@5
[22] *BORDER_COLOR = 0
asm { cli }
to:plex_irq::@return
plex_irq::@return: scope:[plex_irq] from plex_irq::@2
[24] return
to:@return
plex_irq::@1: scope:[plex_irq] from plex_irq::@4
[25] *RASTER = plex_irq::plexFreeNextYpos1_return#0
to:plex_irq::@2
void main()
main: scope:[main] from __start::@1
asm { sei }
[27] call init
to:main::@1
main::@1: scope:[main] from main
[28] phi()
[29] call loop
to:main::@return
main::@return: scope:[main] from main::@1
[30] return
to:@return
void plexShowSprite()
plexShowSprite: scope:[plexShowSprite] from plex_irq::@3
[31] plexShowSprite::plex_sprite_idx2#0 = plex_sprite_idx << 1
[32] plexShowSprite::plexFreeAdd1_ypos#0 = PLEX_YPOS[PLEX_SORTED_IDX[plex_show_idx]]
[33] SPRITES_YPOS[plexShowSprite::plex_sprite_idx2#0] = plexShowSprite::plexFreeAdd1_ypos#0
to:plexShowSprite::plexFreeAdd1
plexShowSprite::plexFreeAdd1: scope:[plexShowSprite] from plexShowSprite
[34] plexShowSprite::plexFreeAdd1_$0 = plexShowSprite::plexFreeAdd1_ypos#0 + $16
[35] PLEX_FREE_YPOS[plex_free_next] = plexShowSprite::plexFreeAdd1_$0
[36] plexShowSprite::plexFreeAdd1_$1 = plex_free_next + 1
[37] plexShowSprite::plexFreeAdd1_$2 = plexShowSprite::plexFreeAdd1_$1 & 7
[38] plex_free_next = plexShowSprite::plexFreeAdd1_$2
to:plexShowSprite::@5
plexShowSprite::@5: scope:[plexShowSprite] from plexShowSprite::plexFreeAdd1
[39] PLEX_SCREEN_PTR[plex_sprite_idx] = PLEX_PTR[PLEX_SORTED_IDX[plex_show_idx]]
[40] plexShowSprite::xpos_idx#0 = PLEX_SORTED_IDX[plex_show_idx]
[41] plexShowSprite::$10 = plexShowSprite::xpos_idx#0 << 1
[42] SPRITES_XPOS[plexShowSprite::plex_sprite_idx2#0] = (char)PLEX_XPOS[plexShowSprite::$10]
[43] plexShowSprite::$2 = byte1 PLEX_XPOS[plexShowSprite::$10]
[44] if(plexShowSprite::$2!=0) goto plexShowSprite::@1
to:plexShowSprite::@3
plexShowSprite::@3: scope:[plexShowSprite] from plexShowSprite::@5
[45] plexShowSprite::$8 = $ff ^ plex_sprite_msb
[46] *SPRITES_XMSB = *SPRITES_XMSB & plexShowSprite::$8
to:plexShowSprite::@2
plexShowSprite::@2: scope:[plexShowSprite] from plexShowSprite::@1 plexShowSprite::@3
[47] plexShowSprite::$4 = plex_sprite_idx + 1
[48] plexShowSprite::$5 = plexShowSprite::$4 & 7
[49] plex_sprite_idx = plexShowSprite::$5
[50] plex_show_idx = ++ plex_show_idx
[51] plex_sprite_msb = plex_sprite_msb << 1
[52] if(plex_sprite_msb!=0) goto plexShowSprite::@return
to:plexShowSprite::@4
plexShowSprite::@4: scope:[plexShowSprite] from plexShowSprite::@2
[53] plex_sprite_msb = 1
to:plexShowSprite::@return
plexShowSprite::@return: scope:[plexShowSprite] from plexShowSprite::@2 plexShowSprite::@4
[54] return
to:@return
plexShowSprite::@1: scope:[plexShowSprite] from plexShowSprite::@5
[55] *SPRITES_XMSB = *SPRITES_XMSB | plex_sprite_msb
to:plexShowSprite::@2
void init()
init: scope:[init] from main
[56] *D011 = VICII_DEN|VICII_RSEL|3
[57] call plexInit
to:init::@1
init::@1: scope:[init] from init init::@1
[58] init::xp#2 = phi( init::@1/init::xp#1, init/$20 )
[58] init::sx#2 = phi( init::@1/init::sx#1, init/0 )
[59] PLEX_PTR[init::sx#2] = (char)SPRITE/$40
[60] init::$3 = init::sx#2 << 1
[61] PLEX_XPOS[init::$3] = init::xp#2
[62] init::xp#1 = init::xp#2 + 9
[63] init::sx#1 = ++ init::sx#2
[64] if(init::sx#1!=PLEX_COUNT-1+1) goto init::@1
to:init::@2
init::@2: scope:[init] from init::@1
[65] *SPRITES_ENABLE = $ff
to:init::@3
init::@3: scope:[init] from init::@2 init::@3
[66] init::ss#2 = phi( init::@2/0, init::@3/init::ss#1 )
[67] SPRITES_COLOR[init::ss#2] = GREEN
[68] init::ss#1 = ++ init::ss#2
[69] if(init::ss#1!=8) goto init::@3
to:init::@4
init::@4: scope:[init] from init::@3
asm { sei }
[71] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL
[72] *IRQ_ENABLE = IRQ_RASTER
[73] *IRQ_STATUS = IRQ_RASTER
[74] *KERNEL_IRQ = &plex_irq
[75] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f
[76] *RASTER = 0
asm { cli }
to:init::@return
init::@return: scope:[init] from init::@4
[78] return
to:@return
void loop()
loop: scope:[loop] from main::@1
[79] phi()
to:loop::@1
loop::@1: scope:[loop] from loop loop::@6
[80] loop::sin_idx#6 = phi( loop/0, loop::@6/loop::sin_idx#1 )
to:loop::@2
loop::@2: scope:[loop] from loop::@1 loop::@2
[81] if(framedone) goto loop::@3
to:loop::@2
loop::@3: scope:[loop] from loop::@2
[82] *BORDER_COLOR = RED
[83] loop::y_idx#3 = loop::sin_idx#6
to:loop::@4
loop::@4: scope:[loop] from loop::@3 loop::@4
[84] loop::sy#2 = phi( loop::@3/0, loop::@4/loop::sy#1 )
[84] loop::y_idx#2 = phi( loop::@3/loop::y_idx#3, loop::@4/loop::y_idx#1 )
[85] PLEX_YPOS[loop::sy#2] = YSIN[loop::y_idx#2]
[86] loop::y_idx#1 = loop::y_idx#2 + 8
[87] loop::sy#1 = ++ loop::sy#2
[88] if(loop::sy#1!=PLEX_COUNT-1+1) goto loop::@4
to:loop::@5
loop::@5: scope:[loop] from loop::@4
[89] loop::sin_idx#1 = loop::sin_idx#6 + 1
[90] *BORDER_COLOR = ++ *BORDER_COLOR
[91] call plexSort
to:loop::@6
loop::@6: scope:[loop] from loop::@5
[92] *BORDER_COLOR = GREEN
[93] framedone = false
to:loop::@1
void plexInit(char *screen)
plexInit: scope:[plexInit] from init
[94] phi()
to:plexInit::plexSetScreen1
plexInit::plexSetScreen1: scope:[plexInit] from plexInit
[95] PLEX_SCREEN_PTR = SCREEN+$3f8
to:plexInit::@1
plexInit::@1: scope:[plexInit] from plexInit::@1 plexInit::plexSetScreen1
[96] plexInit::i#2 = phi( plexInit::@1/plexInit::i#1, plexInit::plexSetScreen1/0 )
[97] PLEX_SORTED_IDX[plexInit::i#2] = plexInit::i#2
[98] plexInit::i#1 = ++ plexInit::i#2
[99] if(plexInit::i#1!=PLEX_COUNT-1+1) goto plexInit::@1
to:plexInit::@return
plexInit::@return: scope:[plexInit] from plexInit::@1
[100] return
to:@return
void plexSort()
plexSort: scope:[plexSort] from loop::@5
[101] phi()
to:plexSort::@1
plexSort::@1: scope:[plexSort] from plexSort plexSort::@2
[102] plexSort::m#2 = phi( plexSort/0, plexSort::@2/plexSort::m#1 )
[103] plexSort::nxt_idx#0 = (PLEX_SORTED_IDX+1)[plexSort::m#2]
[104] plexSort::nxt_y#0 = PLEX_YPOS[plexSort::nxt_idx#0]
[105] if(plexSort::nxt_y#0>=PLEX_YPOS[PLEX_SORTED_IDX[plexSort::m#2]]) goto plexSort::@2
to:plexSort::@5
plexSort::@5: scope:[plexSort] from plexSort::@1
[106] plexSort::s#6 = plexSort::m#2
to:plexSort::@3
plexSort::@3: scope:[plexSort] from plexSort::@5 plexSort::@7
[107] plexSort::s#3 = phi( plexSort::@7/plexSort::s#1, plexSort::@5/plexSort::s#6 )
[108] (PLEX_SORTED_IDX+1)[plexSort::s#3] = PLEX_SORTED_IDX[plexSort::s#3]
[109] plexSort::s#1 = -- plexSort::s#3
[110] if(plexSort::s#1==$ff) goto plexSort::@4
to:plexSort::@7
plexSort::@7: scope:[plexSort] from plexSort::@3
[111] if(plexSort::nxt_y#0<PLEX_YPOS[PLEX_SORTED_IDX[plexSort::s#1]]) goto plexSort::@3
to:plexSort::@4
plexSort::@4: scope:[plexSort] from plexSort::@3 plexSort::@7
[112] plexSort::s#2 = ++ plexSort::s#1
[113] PLEX_SORTED_IDX[plexSort::s#2] = plexSort::nxt_idx#0
to:plexSort::@2
plexSort::@2: scope:[plexSort] from plexSort::@1 plexSort::@4
[114] plexSort::m#1 = ++ plexSort::m#2
[115] if(plexSort::m#1!=PLEX_COUNT-2+1) goto plexSort::@1
to:plexSort::@6
plexSort::@6: scope:[plexSort] from plexSort::@2
[116] plex_show_idx = 0
[117] plex_sprite_idx = 0
[118] plex_sprite_msb = 1
to:plexSort::plexFreePrepare1
plexSort::plexFreePrepare1: scope:[plexSort] from plexSort::@6
[119] phi()
to:plexSort::plexFreePrepare1_@1
plexSort::plexFreePrepare1_@1: scope:[plexSort] from plexSort::plexFreePrepare1 plexSort::plexFreePrepare1_@1
[120] plexSort::plexFreePrepare1_s#2 = phi( plexSort::plexFreePrepare1/0, plexSort::plexFreePrepare1_@1/plexSort::plexFreePrepare1_s#1 )
[121] PLEX_FREE_YPOS[plexSort::plexFreePrepare1_s#2] = 0
[122] plexSort::plexFreePrepare1_s#1 = ++ plexSort::plexFreePrepare1_s#2
[123] if(plexSort::plexFreePrepare1_s#1!=8) goto plexSort::plexFreePrepare1_@1
to:plexSort::plexFreePrepare1_@2
plexSort::plexFreePrepare1_@2: scope:[plexSort] from plexSort::plexFreePrepare1_@1
[124] plex_free_next = 0
to:plexSort::@return
plexSort::@return: scope:[plexSort] from plexSort::plexFreePrepare1_@2
[125] return
to:@return
VARIABLE REGISTER WEIGHTS
__loadstore char * volatile PLEX_SCREEN_PTR // 33.45454545454545
void __start()
__loadstore volatile bool framedone // 1222.8888888888887
void init()
char init::$3 // 2002.0
char init::ss
char init::ss#1 // 1501.5
char init::ss#2 // 1501.5
char init::sx
char init::sx#1 // 1501.5
char init::sx#2 // 800.8
unsigned int init::xp
unsigned int init::xp#1 // 667.3333333333334
unsigned int init::xp#2 // 750.75
void loop()
char loop::sin_idx
char loop::sin_idx#1 // 400.4
char loop::sin_idx#6 // 333.6666666666667
char loop::sy
char loop::sy#1 // 15001.5
char loop::sy#2 // 10001.0
char loop::y_idx
char loop::y_idx#1 // 6667.333333333333
char loop::y_idx#2 // 15502.0
char loop::y_idx#3 // 2002.0
void main()
void plexInit(char *screen)
char plexInit::i
char plexInit::i#1 // 15001.5
char plexInit::i#2 // 20002.0
char *plexInit::plexSetScreen1_screen
char *plexInit::screen
void plexShowSprite()
char plexShowSprite::$10 // 101.0
char plexShowSprite::$2 // 202.0
char plexShowSprite::$4 // 202.0
char plexShowSprite::$5 // 202.0
char plexShowSprite::$8 // 202.0
char plexShowSprite::plexFreeAdd1_$0 // 202.0
char plexShowSprite::plexFreeAdd1_$1 // 202.0
char plexShowSprite::plexFreeAdd1_$2 // 202.0
char plexShowSprite::plexFreeAdd1_ypos
char plexShowSprite::plexFreeAdd1_ypos#0 // 151.5
char plexShowSprite::plex_sprite_idx2
char plexShowSprite::plex_sprite_idx2#0 // 27.545454545454547
char plexShowSprite::xpos_idx
char plexShowSprite::xpos_idx#0 // 202.0
char plexShowSprite::ypos
void plexSort()
char plexSort::m
char plexSort::m#1 // 1500001.5
char plexSort::m#2 // 416667.0833333334
char plexSort::nxt_idx
char plexSort::nxt_idx#0 // 300000.30000000005
char plexSort::nxt_y
char plexSort::nxt_y#0 // 1500000.375
char plexSort::plexFreePrepare1_s
char plexSort::plexFreePrepare1_s#1 // 1500001.5
char plexSort::plexFreePrepare1_s#2 // 1500001.5
char plexSort::s
char plexSort::s#1 // 1.3666668333333332E7
char plexSort::s#2 // 2000002.0
char plexSort::s#3 // 2.05000025E7
char plexSort::s#6 // 2000002.0
__loadstore volatile char plex_free_next // 332.80645161290323
__interrupt(rom_min_c64) void plex_irq()
char plex_irq::$4 // 11.0
char plex_irq::plexFreeNextYpos1_return
char plex_irq::plexFreeNextYpos1_return#0 // 4.0
char plex_irq::rasterY
__loadstore volatile char plex_show_idx // 309.44117647058823
__loadstore volatile char plex_sprite_idx // 335.7096774193549
__loadstore volatile char plex_sprite_msb // 321.4848484848485
Initial phi equivalence classes
[ init::sx#2 init::sx#1 ]
[ init::xp#2 init::xp#1 ]
[ init::ss#2 init::ss#1 ]
[ loop::sin_idx#6 loop::sin_idx#1 ]
[ loop::y_idx#2 loop::y_idx#3 loop::y_idx#1 ]
[ loop::sy#2 loop::sy#1 ]
[ plexInit::i#2 plexInit::i#1 ]
[ plexSort::m#2 plexSort::m#1 ]
[ plexSort::s#3 plexSort::s#1 plexSort::s#6 ]
[ plexSort::plexFreePrepare1_s#2 plexSort::plexFreePrepare1_s#1 ]
Added variable PLEX_SCREEN_PTR to live range equivalence class [ PLEX_SCREEN_PTR ]
Added variable plex_show_idx to live range equivalence class [ plex_show_idx ]
Added variable plex_sprite_idx to live range equivalence class [ plex_sprite_idx ]
Added variable plex_sprite_msb to live range equivalence class [ plex_sprite_msb ]
Added variable plex_free_next to live range equivalence class [ plex_free_next ]
Added variable framedone to live range equivalence class [ framedone ]
Added variable plex_irq::plexFreeNextYpos1_return#0 to live range equivalence class [ plex_irq::plexFreeNextYpos1_return#0 ]
Added variable plex_irq::$4 to live range equivalence class [ plex_irq::$4 ]
Added variable plexShowSprite::plex_sprite_idx2#0 to live range equivalence class [ plexShowSprite::plex_sprite_idx2#0 ]
Added variable plexShowSprite::plexFreeAdd1_ypos#0 to live range equivalence class [ plexShowSprite::plexFreeAdd1_ypos#0 ]
Added variable plexShowSprite::plexFreeAdd1_$0 to live range equivalence class [ plexShowSprite::plexFreeAdd1_$0 ]
Added variable plexShowSprite::plexFreeAdd1_$1 to live range equivalence class [ plexShowSprite::plexFreeAdd1_$1 ]
Added variable plexShowSprite::plexFreeAdd1_$2 to live range equivalence class [ plexShowSprite::plexFreeAdd1_$2 ]
Added variable plexShowSprite::xpos_idx#0 to live range equivalence class [ plexShowSprite::xpos_idx#0 ]
Added variable plexShowSprite::$10 to live range equivalence class [ plexShowSprite::$10 ]
Added variable plexShowSprite::$2 to live range equivalence class [ plexShowSprite::$2 ]
Added variable plexShowSprite::$8 to live range equivalence class [ plexShowSprite::$8 ]
Added variable plexShowSprite::$4 to live range equivalence class [ plexShowSprite::$4 ]
Added variable plexShowSprite::$5 to live range equivalence class [ plexShowSprite::$5 ]
Added variable init::$3 to live range equivalence class [ init::$3 ]
Added variable plexSort::nxt_idx#0 to live range equivalence class [ plexSort::nxt_idx#0 ]
Added variable plexSort::nxt_y#0 to live range equivalence class [ plexSort::nxt_y#0 ]
Added variable plexSort::s#2 to live range equivalence class [ plexSort::s#2 ]
Complete equivalence classes
[ init::sx#2 init::sx#1 ]
[ init::xp#2 init::xp#1 ]
[ init::ss#2 init::ss#1 ]
[ loop::sin_idx#6 loop::sin_idx#1 ]
[ loop::y_idx#2 loop::y_idx#3 loop::y_idx#1 ]
[ loop::sy#2 loop::sy#1 ]
[ plexInit::i#2 plexInit::i#1 ]
[ plexSort::m#2 plexSort::m#1 ]
[ plexSort::s#3 plexSort::s#1 plexSort::s#6 ]
[ plexSort::plexFreePrepare1_s#2 plexSort::plexFreePrepare1_s#1 ]
[ PLEX_SCREEN_PTR ]
[ plex_show_idx ]
[ plex_sprite_idx ]
[ plex_sprite_msb ]
[ plex_free_next ]
[ framedone ]
[ plex_irq::plexFreeNextYpos1_return#0 ]
[ plex_irq::$4 ]
[ plexShowSprite::plex_sprite_idx2#0 ]
[ plexShowSprite::plexFreeAdd1_ypos#0 ]
[ plexShowSprite::plexFreeAdd1_$0 ]
[ plexShowSprite::plexFreeAdd1_$1 ]
[ plexShowSprite::plexFreeAdd1_$2 ]
[ plexShowSprite::xpos_idx#0 ]
[ plexShowSprite::$10 ]
[ plexShowSprite::$2 ]
[ plexShowSprite::$8 ]
[ plexShowSprite::$4 ]
[ plexShowSprite::$5 ]
[ init::$3 ]
[ plexSort::nxt_idx#0 ]
[ plexSort::nxt_y#0 ]
[ plexSort::s#2 ]
Allocated zp[1]:2 [ plexSort::s#3 plexSort::s#1 plexSort::s#6 ]
Allocated zp[1]:3 [ plexSort::plexFreePrepare1_s#2 plexSort::plexFreePrepare1_s#1 ]
Allocated zp[1]:4 [ plexSort::s#2 ]
Allocated zp[1]:5 [ plexSort::m#2 plexSort::m#1 ]
Allocated zp[1]:6 [ plexSort::nxt_y#0 ]
Allocated zp[1]:7 [ plexSort::nxt_idx#0 ]
Allocated zp[1]:8 [ plexInit::i#2 plexInit::i#1 ]
Allocated zp[1]:9 [ loop::sy#2 loop::sy#1 ]
Allocated zp[1]:10 [ loop::y_idx#2 loop::y_idx#3 loop::y_idx#1 ]
Allocated zp[1]:11 [ init::ss#2 init::ss#1 ]
Allocated zp[1]:12 [ init::sx#2 init::sx#1 ]
Allocated zp[1]:13 [ init::$3 ]
Allocated zp[2]:14 [ init::xp#2 init::xp#1 ]
Allocated zp[1]:16 [ framedone ]
Allocated zp[1]:17 [ loop::sin_idx#6 loop::sin_idx#1 ]
Allocated zp[1]:18 [ plex_sprite_idx ]
Allocated zp[1]:19 [ plex_free_next ]
Allocated zp[1]:20 [ plex_sprite_msb ]
Allocated zp[1]:21 [ plex_show_idx ]
Allocated zp[1]:22 [ plexShowSprite::plexFreeAdd1_$0 ]
Allocated zp[1]:23 [ plexShowSprite::plexFreeAdd1_$1 ]
Allocated zp[1]:24 [ plexShowSprite::plexFreeAdd1_$2 ]
Allocated zp[1]:25 [ plexShowSprite::xpos_idx#0 ]
Allocated zp[1]:26 [ plexShowSprite::$2 ]
Allocated zp[1]:27 [ plexShowSprite::$8 ]
Allocated zp[1]:28 [ plexShowSprite::$4 ]
Allocated zp[1]:29 [ plexShowSprite::$5 ]
Allocated zp[1]:30 [ plexShowSprite::plexFreeAdd1_ypos#0 ]
Allocated zp[1]:31 [ plexShowSprite::$10 ]
Allocated zp[2]:32 [ PLEX_SCREEN_PTR ]
Allocated zp[1]:34 [ plexShowSprite::plex_sprite_idx2#0 ]
Allocated zp[1]:35 [ plex_irq::$4 ]
Allocated zp[1]:36 [ plex_irq::plexFreeNextYpos1_return#0 ]
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [1] PLEX_SCREEN_PTR = (char *) 1024+$3f8 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [2] plex_show_idx = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [3] plex_sprite_idx = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [4] plex_sprite_msb = 1 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [5] plex_free_next = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [6] framedone = true [ framedone ] ( [ framedone ] { } ) always clobbers reg byte a
Statement [11] *BORDER_COLOR = WHITE [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] { } ) always clobbers reg byte a
Statement [14] plex_irq::plexFreeNextYpos1_return#0 = PLEX_FREE_YPOS[plex_free_next] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plex_irq::plexFreeNextYpos1_return#0 ] ( [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plex_irq::plexFreeNextYpos1_return#0 ] { } ) always clobbers reg byte y
Statement [16] if(plex_show_idx>=PLEX_COUNT) goto plex_irq::@4 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plex_irq::plexFreeNextYpos1_return#0 plex_irq::$4 ] ( [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plex_irq::plexFreeNextYpos1_return#0 plex_irq::$4 ] { } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:36 [ plex_irq::plexFreeNextYpos1_return#0 ]
Removing always clobbered register reg byte a as potential for zp[1]:35 [ plex_irq::$4 ]
Statement [18] *IRQ_STATUS = IRQ_RASTER [ plex_show_idx plex_irq::plexFreeNextYpos1_return#0 ] ( [ plex_show_idx plex_irq::plexFreeNextYpos1_return#0 ] { } ) always clobbers reg byte a
Statement [19] if(plex_show_idx<PLEX_COUNT) goto plex_irq::@1 [ plex_irq::plexFreeNextYpos1_return#0 ] ( [ plex_irq::plexFreeNextYpos1_return#0 ] { } ) always clobbers reg byte a
Statement [20] *RASTER = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [21] framedone = true [ ] ( [ ] { } ) always clobbers reg byte a
Statement [22] *BORDER_COLOR = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [31] plexShowSprite::plex_sprite_idx2#0 = plex_sprite_idx << 1 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] { } ) always clobbers reg byte a
Statement [32] plexShowSprite::plexFreeAdd1_ypos#0 = PLEX_YPOS[PLEX_SORTED_IDX[plex_show_idx]] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::plexFreeAdd1_ypos#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::plexFreeAdd1_ypos#0 ] { } ) always clobbers reg byte x reg byte y
Removing always clobbered register reg byte x as potential for zp[1]:34 [ plexShowSprite::plex_sprite_idx2#0 ]
Removing always clobbered register reg byte y as potential for zp[1]:34 [ plexShowSprite::plex_sprite_idx2#0 ]
Statement [35] PLEX_FREE_YPOS[plex_free_next] = plexShowSprite::plexFreeAdd1_$0 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] { } ) always clobbers reg byte y
Statement [39] PLEX_SCREEN_PTR[plex_sprite_idx] = PLEX_PTR[PLEX_SORTED_IDX[plex_show_idx]] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] { } ) always clobbers reg byte a reg byte x reg byte y
Removing always clobbered register reg byte a as potential for zp[1]:34 [ plexShowSprite::plex_sprite_idx2#0 ]
Statement [40] plexShowSprite::xpos_idx#0 = PLEX_SORTED_IDX[plex_show_idx] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] { } ) always clobbers reg byte y
Statement [41] plexShowSprite::$10 = plexShowSprite::xpos_idx#0 << 1 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$10 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$10 ] { } ) always clobbers reg byte a
Statement [42] SPRITES_XPOS[plexShowSprite::plex_sprite_idx2#0] = (char)PLEX_XPOS[plexShowSprite::$10] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$10 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$10 ] { } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:31 [ plexShowSprite::$10 ]
Statement [43] plexShowSprite::$2 = byte1 PLEX_XPOS[plexShowSprite::$10] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$2 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$2 ] { } ) always clobbers reg byte a
Statement [45] plexShowSprite::$8 = $ff ^ plex_sprite_msb [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$8 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$8 ] { } ) always clobbers reg byte a
Statement [46] *SPRITES_XMSB = *SPRITES_XMSB & plexShowSprite::$8 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] { } ) always clobbers reg byte a
Statement [52] if(plex_sprite_msb!=0) goto plexShowSprite::@return [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] { } ) always clobbers reg byte a
Statement [53] plex_sprite_msb = 1 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] { } ) always clobbers reg byte a
Statement [55] *SPRITES_XMSB = *SPRITES_XMSB | plex_sprite_msb [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] { } ) always clobbers reg byte a
Statement [56] *D011 = VICII_DEN|VICII_RSEL|3 [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [59] PLEX_PTR[init::sx#2] = (char)SPRITE/$40 [ init::sx#2 init::xp#2 ] ( main:8::init:27 [ framedone init::sx#2 init::xp#2 ] { } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:12 [ init::sx#2 init::sx#1 ]
Statement [60] init::$3 = init::sx#2 << 1 [ init::sx#2 init::xp#2 init::$3 ] ( main:8::init:27 [ framedone init::sx#2 init::xp#2 init::$3 ] { } ) always clobbers reg byte a
Statement [61] PLEX_XPOS[init::$3] = init::xp#2 [ init::sx#2 init::xp#2 ] ( main:8::init:27 [ framedone init::sx#2 init::xp#2 ] { } ) always clobbers reg byte a
Statement [62] init::xp#1 = init::xp#2 + 9 [ init::sx#2 init::xp#1 ] ( main:8::init:27 [ framedone init::sx#2 init::xp#1 ] { } ) always clobbers reg byte a
Statement [65] *SPRITES_ENABLE = $ff [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [67] SPRITES_COLOR[init::ss#2] = GREEN [ init::ss#2 ] ( main:8::init:27 [ framedone init::ss#2 ] { } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:11 [ init::ss#2 init::ss#1 ]
Statement [71] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [72] *IRQ_ENABLE = IRQ_RASTER [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [73] *IRQ_STATUS = IRQ_RASTER [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [74] *KERNEL_IRQ = &plex_irq [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [75] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [76] *RASTER = 0 [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [81] if(framedone) goto loop::@3 [ framedone loop::sin_idx#6 ] ( main:8::loop:29 [ framedone loop::sin_idx#6 ] { } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:17 [ loop::sin_idx#6 loop::sin_idx#1 ]
Statement [82] *BORDER_COLOR = RED [ loop::sin_idx#6 ] ( main:8::loop:29 [ loop::sin_idx#6 ] { } ) always clobbers reg byte a
Statement [85] PLEX_YPOS[loop::sy#2] = YSIN[loop::y_idx#2] [ loop::sin_idx#6 loop::y_idx#2 loop::sy#2 ] ( main:8::loop:29 [ loop::sin_idx#6 loop::y_idx#2 loop::sy#2 ] { } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:10 [ loop::y_idx#2 loop::y_idx#3 loop::y_idx#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:9 [ loop::sy#2 loop::sy#1 ]
Statement [86] loop::y_idx#1 = loop::y_idx#2 + 8 [ loop::sin_idx#6 loop::sy#2 loop::y_idx#1 ] ( main:8::loop:29 [ loop::sin_idx#6 loop::sy#2 loop::y_idx#1 ] { } ) always clobbers reg byte a
Statement [92] *BORDER_COLOR = GREEN [ loop::sin_idx#1 ] ( main:8::loop:29 [ loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [93] framedone = false [ framedone loop::sin_idx#1 ] ( main:8::loop:29 [ framedone loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [95] PLEX_SCREEN_PTR = SCREEN+$3f8 [ ] ( main:8::init:27::plexInit:57 [ framedone ] { } ) always clobbers reg byte a
Statement [108] (PLEX_SORTED_IDX+1)[plexSort::s#3] = PLEX_SORTED_IDX[plexSort::s#3] [ plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 plexSort::s#3 ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 plexSort::s#3 ] { } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:5 [ plexSort::m#2 plexSort::m#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:7 [ plexSort::nxt_idx#0 ]
Removing always clobbered register reg byte a as potential for zp[1]:6 [ plexSort::nxt_y#0 ]
Removing always clobbered register reg byte a as potential for zp[1]:2 [ plexSort::s#3 plexSort::s#1 plexSort::s#6 ]
Statement [111] if(plexSort::nxt_y#0<PLEX_YPOS[PLEX_SORTED_IDX[plexSort::s#1]]) goto plexSort::@3 [ plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 plexSort::s#1 ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 plexSort::s#1 ] { } ) always clobbers reg byte a
Statement [113] PLEX_SORTED_IDX[plexSort::s#2] = plexSort::nxt_idx#0 [ plexSort::m#2 ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 plexSort::m#2 ] { } ) always clobbers reg byte a
Statement [116] plex_show_idx = 0 [ ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [117] plex_sprite_idx = 0 [ ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [118] plex_sprite_msb = 1 [ ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [121] PLEX_FREE_YPOS[plexSort::plexFreePrepare1_s#2] = 0 [ plexSort::plexFreePrepare1_s#2 ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 plexSort::plexFreePrepare1_s#2 ] { } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:3 [ plexSort::plexFreePrepare1_s#2 plexSort::plexFreePrepare1_s#1 ]
Statement [124] plex_free_next = 0 [ ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [1] PLEX_SCREEN_PTR = (char *) 1024+$3f8 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [2] plex_show_idx = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [3] plex_sprite_idx = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [4] plex_sprite_msb = 1 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [5] plex_free_next = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [6] framedone = true [ framedone ] ( [ framedone ] { } ) always clobbers reg byte a
Statement [11] *BORDER_COLOR = WHITE [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] { } ) always clobbers reg byte a
Statement [14] plex_irq::plexFreeNextYpos1_return#0 = PLEX_FREE_YPOS[plex_free_next] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plex_irq::plexFreeNextYpos1_return#0 ] ( [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plex_irq::plexFreeNextYpos1_return#0 ] { } ) always clobbers reg byte y
Statement [16] if(plex_show_idx>=PLEX_COUNT) goto plex_irq::@4 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plex_irq::plexFreeNextYpos1_return#0 plex_irq::$4 ] ( [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plex_irq::plexFreeNextYpos1_return#0 plex_irq::$4 ] { } ) always clobbers reg byte a
Statement [18] *IRQ_STATUS = IRQ_RASTER [ plex_show_idx plex_irq::plexFreeNextYpos1_return#0 ] ( [ plex_show_idx plex_irq::plexFreeNextYpos1_return#0 ] { } ) always clobbers reg byte a
Statement [19] if(plex_show_idx<PLEX_COUNT) goto plex_irq::@1 [ plex_irq::plexFreeNextYpos1_return#0 ] ( [ plex_irq::plexFreeNextYpos1_return#0 ] { } ) always clobbers reg byte a
Statement [20] *RASTER = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [21] framedone = true [ ] ( [ ] { } ) always clobbers reg byte a
Statement [22] *BORDER_COLOR = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [31] plexShowSprite::plex_sprite_idx2#0 = plex_sprite_idx << 1 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] { } ) always clobbers reg byte a
Statement [32] plexShowSprite::plexFreeAdd1_ypos#0 = PLEX_YPOS[PLEX_SORTED_IDX[plex_show_idx]] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::plexFreeAdd1_ypos#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::plexFreeAdd1_ypos#0 ] { } ) always clobbers reg byte x reg byte y
Statement [33] SPRITES_YPOS[plexShowSprite::plex_sprite_idx2#0] = plexShowSprite::plexFreeAdd1_ypos#0 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::plexFreeAdd1_ypos#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::plexFreeAdd1_ypos#0 ] { } ) always clobbers reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:30 [ plexShowSprite::plexFreeAdd1_ypos#0 ]
Statement [35] PLEX_FREE_YPOS[plex_free_next] = plexShowSprite::plexFreeAdd1_$0 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] { } ) always clobbers reg byte y
Statement [39] PLEX_SCREEN_PTR[plex_sprite_idx] = PLEX_PTR[PLEX_SORTED_IDX[plex_show_idx]] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] { } ) always clobbers reg byte a reg byte x reg byte y
Statement [40] plexShowSprite::xpos_idx#0 = PLEX_SORTED_IDX[plex_show_idx] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] { } ) always clobbers reg byte y
Statement [41] plexShowSprite::$10 = plexShowSprite::xpos_idx#0 << 1 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$10 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$10 ] { } ) always clobbers reg byte a
Statement [42] SPRITES_XPOS[plexShowSprite::plex_sprite_idx2#0] = (char)PLEX_XPOS[plexShowSprite::$10] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$10 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$10 ] { } ) always clobbers reg byte a
Statement [43] plexShowSprite::$2 = byte1 PLEX_XPOS[plexShowSprite::$10] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$2 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$2 ] { } ) always clobbers reg byte a
Statement [45] plexShowSprite::$8 = $ff ^ plex_sprite_msb [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$8 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$8 ] { } ) always clobbers reg byte a
Statement [46] *SPRITES_XMSB = *SPRITES_XMSB & plexShowSprite::$8 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] { } ) always clobbers reg byte a
Statement [52] if(plex_sprite_msb!=0) goto plexShowSprite::@return [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] { } ) always clobbers reg byte a
Statement [53] plex_sprite_msb = 1 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] { } ) always clobbers reg byte a
Statement [55] *SPRITES_XMSB = *SPRITES_XMSB | plex_sprite_msb [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] { } ) always clobbers reg byte a
Statement [56] *D011 = VICII_DEN|VICII_RSEL|3 [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [59] PLEX_PTR[init::sx#2] = (char)SPRITE/$40 [ init::sx#2 init::xp#2 ] ( main:8::init:27 [ framedone init::sx#2 init::xp#2 ] { } ) always clobbers reg byte a
Statement [60] init::$3 = init::sx#2 << 1 [ init::sx#2 init::xp#2 init::$3 ] ( main:8::init:27 [ framedone init::sx#2 init::xp#2 init::$3 ] { } ) always clobbers reg byte a
Statement [61] PLEX_XPOS[init::$3] = init::xp#2 [ init::sx#2 init::xp#2 ] ( main:8::init:27 [ framedone init::sx#2 init::xp#2 ] { } ) always clobbers reg byte a
Statement [62] init::xp#1 = init::xp#2 + 9 [ init::sx#2 init::xp#1 ] ( main:8::init:27 [ framedone init::sx#2 init::xp#1 ] { } ) always clobbers reg byte a
Statement [65] *SPRITES_ENABLE = $ff [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [67] SPRITES_COLOR[init::ss#2] = GREEN [ init::ss#2 ] ( main:8::init:27 [ framedone init::ss#2 ] { } ) always clobbers reg byte a
Statement [71] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [72] *IRQ_ENABLE = IRQ_RASTER [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [73] *IRQ_STATUS = IRQ_RASTER [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [74] *KERNEL_IRQ = &plex_irq [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [75] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [76] *RASTER = 0 [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [81] if(framedone) goto loop::@3 [ framedone loop::sin_idx#6 ] ( main:8::loop:29 [ framedone loop::sin_idx#6 ] { } ) always clobbers reg byte a
Statement [82] *BORDER_COLOR = RED [ loop::sin_idx#6 ] ( main:8::loop:29 [ loop::sin_idx#6 ] { } ) always clobbers reg byte a
Statement [85] PLEX_YPOS[loop::sy#2] = YSIN[loop::y_idx#2] [ loop::sin_idx#6 loop::y_idx#2 loop::sy#2 ] ( main:8::loop:29 [ loop::sin_idx#6 loop::y_idx#2 loop::sy#2 ] { } ) always clobbers reg byte a
Statement [86] loop::y_idx#1 = loop::y_idx#2 + 8 [ loop::sin_idx#6 loop::sy#2 loop::y_idx#1 ] ( main:8::loop:29 [ loop::sin_idx#6 loop::sy#2 loop::y_idx#1 ] { } ) always clobbers reg byte a
Statement [92] *BORDER_COLOR = GREEN [ loop::sin_idx#1 ] ( main:8::loop:29 [ loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [93] framedone = false [ framedone loop::sin_idx#1 ] ( main:8::loop:29 [ framedone loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [95] PLEX_SCREEN_PTR = SCREEN+$3f8 [ ] ( main:8::init:27::plexInit:57 [ framedone ] { } ) always clobbers reg byte a
Statement [105] if(plexSort::nxt_y#0>=PLEX_YPOS[PLEX_SORTED_IDX[plexSort::m#2]]) goto plexSort::@2 [ plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 ] { } ) always clobbers reg byte a
Statement [108] (PLEX_SORTED_IDX+1)[plexSort::s#3] = PLEX_SORTED_IDX[plexSort::s#3] [ plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 plexSort::s#3 ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 plexSort::s#3 ] { } ) always clobbers reg byte a
Statement [111] if(plexSort::nxt_y#0<PLEX_YPOS[PLEX_SORTED_IDX[plexSort::s#1]]) goto plexSort::@3 [ plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 plexSort::s#1 ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 plexSort::s#1 ] { } ) always clobbers reg byte a
Statement [113] PLEX_SORTED_IDX[plexSort::s#2] = plexSort::nxt_idx#0 [ plexSort::m#2 ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 plexSort::m#2 ] { } ) always clobbers reg byte a
Statement [116] plex_show_idx = 0 [ ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [117] plex_sprite_idx = 0 [ ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [118] plex_sprite_msb = 1 [ ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [121] PLEX_FREE_YPOS[plexSort::plexFreePrepare1_s#2] = 0 [ plexSort::plexFreePrepare1_s#2 ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 plexSort::plexFreePrepare1_s#2 ] { } ) always clobbers reg byte a
Statement [124] plex_free_next = 0 [ ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [1] PLEX_SCREEN_PTR = (char *) 1024+$3f8 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [2] plex_show_idx = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [3] plex_sprite_idx = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [4] plex_sprite_msb = 1 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [5] plex_free_next = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [6] framedone = true [ framedone ] ( [ framedone ] { } ) always clobbers reg byte a
Statement [11] *BORDER_COLOR = WHITE [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] { } ) always clobbers reg byte a
Statement [14] plex_irq::plexFreeNextYpos1_return#0 = PLEX_FREE_YPOS[plex_free_next] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plex_irq::plexFreeNextYpos1_return#0 ] ( [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plex_irq::plexFreeNextYpos1_return#0 ] { } ) always clobbers reg byte y
Statement [16] if(plex_show_idx>=PLEX_COUNT) goto plex_irq::@4 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plex_irq::plexFreeNextYpos1_return#0 plex_irq::$4 ] ( [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plex_irq::plexFreeNextYpos1_return#0 plex_irq::$4 ] { } ) always clobbers reg byte a
Statement [18] *IRQ_STATUS = IRQ_RASTER [ plex_show_idx plex_irq::plexFreeNextYpos1_return#0 ] ( [ plex_show_idx plex_irq::plexFreeNextYpos1_return#0 ] { } ) always clobbers reg byte a
Statement [19] if(plex_show_idx<PLEX_COUNT) goto plex_irq::@1 [ plex_irq::plexFreeNextYpos1_return#0 ] ( [ plex_irq::plexFreeNextYpos1_return#0 ] { } ) always clobbers reg byte a
Statement [20] *RASTER = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [21] framedone = true [ ] ( [ ] { } ) always clobbers reg byte a
Statement [22] *BORDER_COLOR = 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [31] plexShowSprite::plex_sprite_idx2#0 = plex_sprite_idx << 1 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] { } ) always clobbers reg byte a
Statement [32] plexShowSprite::plexFreeAdd1_ypos#0 = PLEX_YPOS[PLEX_SORTED_IDX[plex_show_idx]] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::plexFreeAdd1_ypos#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::plexFreeAdd1_ypos#0 ] { } ) always clobbers reg byte x reg byte y
Statement [33] SPRITES_YPOS[plexShowSprite::plex_sprite_idx2#0] = plexShowSprite::plexFreeAdd1_ypos#0 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::plexFreeAdd1_ypos#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::plexFreeAdd1_ypos#0 ] { } ) always clobbers reg byte y
Statement [35] PLEX_FREE_YPOS[plex_free_next] = plexShowSprite::plexFreeAdd1_$0 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] { } ) always clobbers reg byte y
Statement [39] PLEX_SCREEN_PTR[plex_sprite_idx] = PLEX_PTR[PLEX_SORTED_IDX[plex_show_idx]] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 ] { } ) always clobbers reg byte a reg byte x reg byte y
Statement [40] plexShowSprite::xpos_idx#0 = PLEX_SORTED_IDX[plex_show_idx] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::xpos_idx#0 ] { } ) always clobbers reg byte y
Statement [41] plexShowSprite::$10 = plexShowSprite::xpos_idx#0 << 1 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$10 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::plex_sprite_idx2#0 plexShowSprite::$10 ] { } ) always clobbers reg byte a
Statement [42] SPRITES_XPOS[plexShowSprite::plex_sprite_idx2#0] = (char)PLEX_XPOS[plexShowSprite::$10] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$10 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$10 ] { } ) always clobbers reg byte a
Statement [43] plexShowSprite::$2 = byte1 PLEX_XPOS[plexShowSprite::$10] [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$2 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$2 ] { } ) always clobbers reg byte a
Statement [45] plexShowSprite::$8 = $ff ^ plex_sprite_msb [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$8 ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next plexShowSprite::$8 ] { } ) always clobbers reg byte a
Statement [46] *SPRITES_XMSB = *SPRITES_XMSB & plexShowSprite::$8 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] { } ) always clobbers reg byte a
Statement [52] if(plex_sprite_msb!=0) goto plexShowSprite::@return [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] { } ) always clobbers reg byte a
Statement [53] plex_sprite_msb = 1 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] { } ) always clobbers reg byte a
Statement [55] *SPRITES_XMSB = *SPRITES_XMSB | plex_sprite_msb [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] ( plexShowSprite:13 [ PLEX_SCREEN_PTR plex_show_idx plex_sprite_idx plex_sprite_msb plex_free_next ] { } ) always clobbers reg byte a
Statement [56] *D011 = VICII_DEN|VICII_RSEL|3 [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [59] PLEX_PTR[init::sx#2] = (char)SPRITE/$40 [ init::sx#2 init::xp#2 ] ( main:8::init:27 [ framedone init::sx#2 init::xp#2 ] { } ) always clobbers reg byte a
Statement [60] init::$3 = init::sx#2 << 1 [ init::sx#2 init::xp#2 init::$3 ] ( main:8::init:27 [ framedone init::sx#2 init::xp#2 init::$3 ] { } ) always clobbers reg byte a
Statement [61] PLEX_XPOS[init::$3] = init::xp#2 [ init::sx#2 init::xp#2 ] ( main:8::init:27 [ framedone init::sx#2 init::xp#2 ] { } ) always clobbers reg byte a
Statement [62] init::xp#1 = init::xp#2 + 9 [ init::sx#2 init::xp#1 ] ( main:8::init:27 [ framedone init::sx#2 init::xp#1 ] { } ) always clobbers reg byte a
Statement [65] *SPRITES_ENABLE = $ff [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [67] SPRITES_COLOR[init::ss#2] = GREEN [ init::ss#2 ] ( main:8::init:27 [ framedone init::ss#2 ] { } ) always clobbers reg byte a
Statement [71] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [72] *IRQ_ENABLE = IRQ_RASTER [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [73] *IRQ_STATUS = IRQ_RASTER [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [74] *KERNEL_IRQ = &plex_irq [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [75] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [76] *RASTER = 0 [ ] ( main:8::init:27 [ framedone ] { } ) always clobbers reg byte a
Statement [81] if(framedone) goto loop::@3 [ framedone loop::sin_idx#6 ] ( main:8::loop:29 [ framedone loop::sin_idx#6 ] { } ) always clobbers reg byte a
Statement [82] *BORDER_COLOR = RED [ loop::sin_idx#6 ] ( main:8::loop:29 [ loop::sin_idx#6 ] { } ) always clobbers reg byte a
Statement [85] PLEX_YPOS[loop::sy#2] = YSIN[loop::y_idx#2] [ loop::sin_idx#6 loop::y_idx#2 loop::sy#2 ] ( main:8::loop:29 [ loop::sin_idx#6 loop::y_idx#2 loop::sy#2 ] { } ) always clobbers reg byte a
Statement [86] loop::y_idx#1 = loop::y_idx#2 + 8 [ loop::sin_idx#6 loop::sy#2 loop::y_idx#1 ] ( main:8::loop:29 [ loop::sin_idx#6 loop::sy#2 loop::y_idx#1 ] { } ) always clobbers reg byte a
Statement [92] *BORDER_COLOR = GREEN [ loop::sin_idx#1 ] ( main:8::loop:29 [ loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [93] framedone = false [ framedone loop::sin_idx#1 ] ( main:8::loop:29 [ framedone loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [95] PLEX_SCREEN_PTR = SCREEN+$3f8 [ ] ( main:8::init:27::plexInit:57 [ framedone ] { } ) always clobbers reg byte a
Statement [105] if(plexSort::nxt_y#0>=PLEX_YPOS[PLEX_SORTED_IDX[plexSort::m#2]]) goto plexSort::@2 [ plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 ] { } ) always clobbers reg byte a
Statement [108] (PLEX_SORTED_IDX+1)[plexSort::s#3] = PLEX_SORTED_IDX[plexSort::s#3] [ plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 plexSort::s#3 ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 plexSort::s#3 ] { } ) always clobbers reg byte a
Statement [111] if(plexSort::nxt_y#0<PLEX_YPOS[PLEX_SORTED_IDX[plexSort::s#1]]) goto plexSort::@3 [ plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 plexSort::s#1 ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 plexSort::m#2 plexSort::nxt_idx#0 plexSort::nxt_y#0 plexSort::s#1 ] { } ) always clobbers reg byte a
Statement [113] PLEX_SORTED_IDX[plexSort::s#2] = plexSort::nxt_idx#0 [ plexSort::m#2 ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 plexSort::m#2 ] { } ) always clobbers reg byte a
Statement [116] plex_show_idx = 0 [ ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [117] plex_sprite_idx = 0 [ ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [118] plex_sprite_msb = 1 [ ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 ] { } ) always clobbers reg byte a
Statement [121] PLEX_FREE_YPOS[plexSort::plexFreePrepare1_s#2] = 0 [ plexSort::plexFreePrepare1_s#2 ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 plexSort::plexFreePrepare1_s#2 ] { } ) always clobbers reg byte a
Statement [124] plex_free_next = 0 [ ] ( main:8::loop:29::plexSort:91 [ loop::sin_idx#1 ] { } ) always clobbers reg byte a
Potential registers zp[1]:12 [ init::sx#2 init::sx#1 ] : zp[1]:12 , reg byte x , reg byte y ,
Potential registers zp[2]:14 [ init::xp#2 init::xp#1 ] : zp[2]:14 ,
Potential registers zp[1]:11 [ init::ss#2 init::ss#1 ] : zp[1]:11 , reg byte x , reg byte y ,
Potential registers zp[1]:17 [ loop::sin_idx#6 loop::sin_idx#1 ] : zp[1]:17 , reg byte x , reg byte y ,
Potential registers zp[1]:10 [ loop::y_idx#2 loop::y_idx#3 loop::y_idx#1 ] : zp[1]:10 , reg byte x , reg byte y ,
Potential registers zp[1]:9 [ loop::sy#2 loop::sy#1 ] : zp[1]:9 , reg byte x , reg byte y ,
Potential registers zp[1]:8 [ plexInit::i#2 plexInit::i#1 ] : zp[1]:8 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:5 [ plexSort::m#2 plexSort::m#1 ] : zp[1]:5 , reg byte x , reg byte y ,
Potential registers zp[1]:2 [ plexSort::s#3 plexSort::s#1 plexSort::s#6 ] : zp[1]:2 , reg byte x , reg byte y ,
Potential registers zp[1]:3 [ plexSort::plexFreePrepare1_s#2 plexSort::plexFreePrepare1_s#1 ] : zp[1]:3 , reg byte x , reg byte y ,
Potential registers zp[2]:32 [ PLEX_SCREEN_PTR ] : zp[2]:32 ,
Potential registers zp[1]:21 [ plex_show_idx ] : zp[1]:21 ,
Potential registers zp[1]:18 [ plex_sprite_idx ] : zp[1]:18 ,
Potential registers zp[1]:20 [ plex_sprite_msb ] : zp[1]:20 ,
Potential registers zp[1]:19 [ plex_free_next ] : zp[1]:19 ,
Potential registers zp[1]:16 [ framedone ] : zp[1]:16 ,
Potential registers zp[1]:36 [ plex_irq::plexFreeNextYpos1_return#0 ] : zp[1]:36 , reg byte x , reg byte y ,
Potential registers zp[1]:35 [ plex_irq::$4 ] : zp[1]:35 , reg byte x , reg byte y ,
Potential registers zp[1]:34 [ plexShowSprite::plex_sprite_idx2#0 ] : zp[1]:34 ,
Potential registers zp[1]:30 [ plexShowSprite::plexFreeAdd1_ypos#0 ] : zp[1]:30 , reg byte a , reg byte x ,
Potential registers zp[1]:22 [ plexShowSprite::plexFreeAdd1_$0 ] : zp[1]:22 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:23 [ plexShowSprite::plexFreeAdd1_$1 ] : zp[1]:23 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:24 [ plexShowSprite::plexFreeAdd1_$2 ] : zp[1]:24 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:25 [ plexShowSprite::xpos_idx#0 ] : zp[1]:25 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:31 [ plexShowSprite::$10 ] : zp[1]:31 , reg byte x , reg byte y ,
Potential registers zp[1]:26 [ plexShowSprite::$2 ] : zp[1]:26 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:27 [ plexShowSprite::$8 ] : zp[1]:27 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:28 [ plexShowSprite::$4 ] : zp[1]:28 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:29 [ plexShowSprite::$5 ] : zp[1]:29 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:13 [ init::$3 ] : zp[1]:13 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:7 [ plexSort::nxt_idx#0 ] : zp[1]:7 , reg byte x , reg byte y ,
Potential registers zp[1]:6 [ plexSort::nxt_y#0 ] : zp[1]:6 , reg byte x , reg byte y ,
Potential registers zp[1]:4 [ plexSort::s#2 ] : zp[1]:4 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [plexSort] 36,166,672.83: zp[1]:2 [ plexSort::s#3 plexSort::s#1 plexSort::s#6 ] 3,000,003: zp[1]:3 [ plexSort::plexFreePrepare1_s#2 plexSort::plexFreePrepare1_s#1 ] 2,000,002: zp[1]:4 [ plexSort::s#2 ] 1,916,668.58: zp[1]:5 [ plexSort::m#2 plexSort::m#1 ] 1,500,000.38: zp[1]:6 [ plexSort::nxt_y#0 ] 300,000.3: zp[1]:7 [ plexSort::nxt_idx#0 ]
Uplift Scope [loop] 25,002.5: zp[1]:9 [ loop::sy#2 loop::sy#1 ] 24,171.33: zp[1]:10 [ loop::y_idx#2 loop::y_idx#3 loop::y_idx#1 ] 734.07: zp[1]:17 [ loop::sin_idx#6 loop::sin_idx#1 ]
Uplift Scope [plexInit] 35,003.5: zp[1]:8 [ plexInit::i#2 plexInit::i#1 ]
Uplift Scope [init] 3,003: zp[1]:11 [ init::ss#2 init::ss#1 ] 2,302.3: zp[1]:12 [ init::sx#2 init::sx#1 ] 2,002: zp[1]:13 [ init::$3 ] 1,418.08: zp[2]:14 [ init::xp#2 init::xp#1 ]
Uplift Scope [] 1,222.89: zp[1]:16 [ framedone ] 335.71: zp[1]:18 [ plex_sprite_idx ] 332.81: zp[1]:19 [ plex_free_next ] 321.48: zp[1]:20 [ plex_sprite_msb ] 309.44: zp[1]:21 [ plex_show_idx ] 33.45: zp[2]:32 [ PLEX_SCREEN_PTR ]
Uplift Scope [plexShowSprite] 202: zp[1]:22 [ plexShowSprite::plexFreeAdd1_$0 ] 202: zp[1]:23 [ plexShowSprite::plexFreeAdd1_$1 ] 202: zp[1]:24 [ plexShowSprite::plexFreeAdd1_$2 ] 202: zp[1]:25 [ plexShowSprite::xpos_idx#0 ] 202: zp[1]:26 [ plexShowSprite::$2 ] 202: zp[1]:27 [ plexShowSprite::$8 ] 202: zp[1]:28 [ plexShowSprite::$4 ] 202: zp[1]:29 [ plexShowSprite::$5 ] 151.5: zp[1]:30 [ plexShowSprite::plexFreeAdd1_ypos#0 ] 101: zp[1]:31 [ plexShowSprite::$10 ] 27.55: zp[1]:34 [ plexShowSprite::plex_sprite_idx2#0 ]
Uplift Scope [plex_irq] 11: zp[1]:35 [ plex_irq::$4 ] 4: zp[1]:36 [ plex_irq::plexFreeNextYpos1_return#0 ]
Uplift Scope [MOS6526_CIA]
Uplift Scope [MOS6569_VICII]
Uplift Scope [MOS6581_SID]
Uplift Scope [main]
Uplift Scope [__start]
Uplifting [plexSort] best 60310 combination reg byte x [ plexSort::s#3 plexSort::s#1 plexSort::s#6 ] reg byte x [ plexSort::plexFreePrepare1_s#2 plexSort::plexFreePrepare1_s#1 ] zp[1]:4 [ plexSort::s#2 ] zp[1]:5 [ plexSort::m#2 plexSort::m#1 ] zp[1]:6 [ plexSort::nxt_y#0 ] zp[1]:7 [ plexSort::nxt_idx#0 ]
Limited combination testing to 10 combinations of 972 possible.
Uplifting [loop] best 58380 combination reg byte y [ loop::sy#2 loop::sy#1 ] reg byte x [ loop::y_idx#2 loop::y_idx#3 loop::y_idx#1 ] zp[1]:17 [ loop::sin_idx#6 loop::sin_idx#1 ]
Limited combination testing to 10 combinations of 27 possible.
Uplifting [plexInit] best 58260 combination reg byte x [ plexInit::i#2 plexInit::i#1 ]
Uplifting [init] best 58010 combination reg byte x [ init::ss#2 init::ss#1 ] reg byte x [ init::sx#2 init::sx#1 ] zp[1]:13 [ init::$3 ] zp[2]:14 [ init::xp#2 init::xp#1 ]
Limited combination testing to 10 combinations of 36 possible.
Uplifting [] best 58010 combination zp[1]:16 [ framedone ] zp[1]:18 [ plex_sprite_idx ] zp[1]:19 [ plex_free_next ] zp[1]:20 [ plex_sprite_msb ] zp[1]:21 [ plex_show_idx ] zp[2]:32 [ PLEX_SCREEN_PTR ]
Uplifting [plexShowSprite] best 58000 combination reg byte a [ plexShowSprite::plexFreeAdd1_$0 ] reg byte x [ plexShowSprite::plexFreeAdd1_$1 ] zp[1]:24 [ plexShowSprite::plexFreeAdd1_$2 ] zp[1]:25 [ plexShowSprite::xpos_idx#0 ] zp[1]:26 [ plexShowSprite::$2 ] zp[1]:27 [ plexShowSprite::$8 ] zp[1]:28 [ plexShowSprite::$4 ] zp[1]:29 [ plexShowSprite::$5 ] zp[1]:30 [ plexShowSprite::plexFreeAdd1_ypos#0 ] zp[1]:31 [ plexShowSprite::$10 ] zp[1]:34 [ plexShowSprite::plex_sprite_idx2#0 ]
Limited combination testing to 10 combinations of 589824 possible.
Uplifting [plex_irq] best 57937 combination zp[1]:35 [ plex_irq::$4 ] reg byte x [ plex_irq::plexFreeNextYpos1_return#0 ]
Uplifting [MOS6526_CIA] best 57937 combination
Uplifting [MOS6569_VICII] best 57937 combination
Uplifting [MOS6581_SID] best 57937 combination
Uplifting [main] best 57937 combination
Uplifting [__start] best 57937 combination
Attempting to uplift remaining variables inzp[1]:4 [ plexSort::s#2 ]
Uplifting [plexSort] best 57337 combination reg byte x [ plexSort::s#2 ]
Attempting to uplift remaining variables inzp[1]:5 [ plexSort::m#2 plexSort::m#1 ]
Uplifting [plexSort] best 57337 combination zp[1]:5 [ plexSort::m#2 plexSort::m#1 ]
Attempting to uplift remaining variables inzp[1]:6 [ plexSort::nxt_y#0 ]
Uplifting [plexSort] best 57337 combination zp[1]:6 [ plexSort::nxt_y#0 ]
Attempting to uplift remaining variables inzp[1]:7 [ plexSort::nxt_idx#0 ]
Uplifting [plexSort] best 57337 combination zp[1]:7 [ plexSort::nxt_idx#0 ]
Attempting to uplift remaining variables inzp[1]:13 [ init::$3 ]
Uplifting [init] best 57297 combination reg byte a [ init::$3 ]
Attempting to uplift remaining variables inzp[1]:16 [ framedone ]
Uplifting [] best 57297 combination zp[1]:16 [ framedone ]
Attempting to uplift remaining variables inzp[1]:17 [ loop::sin_idx#6 loop::sin_idx#1 ]
Uplifting [loop] best 57297 combination zp[1]:17 [ loop::sin_idx#6 loop::sin_idx#1 ]
Attempting to uplift remaining variables inzp[1]:18 [ plex_sprite_idx ]
Uplifting [] best 57297 combination zp[1]:18 [ plex_sprite_idx ]
Attempting to uplift remaining variables inzp[1]:19 [ plex_free_next ]
Uplifting [] best 57297 combination zp[1]:19 [ plex_free_next ]
Attempting to uplift remaining variables inzp[1]:20 [ plex_sprite_msb ]
Uplifting [] best 57297 combination zp[1]:20 [ plex_sprite_msb ]
Attempting to uplift remaining variables inzp[1]:21 [ plex_show_idx ]
Uplifting [] best 57297 combination zp[1]:21 [ plex_show_idx ]
Attempting to uplift remaining variables inzp[1]:24 [ plexShowSprite::plexFreeAdd1_$2 ]
Uplifting [plexShowSprite] best 57293 combination reg byte a [ plexShowSprite::plexFreeAdd1_$2 ]
Attempting to uplift remaining variables inzp[1]:25 [ plexShowSprite::xpos_idx#0 ]
Uplifting [plexShowSprite] best 57287 combination reg byte a [ plexShowSprite::xpos_idx#0 ]
Attempting to uplift remaining variables inzp[1]:26 [ plexShowSprite::$2 ]
Uplifting [plexShowSprite] best 57283 combination reg byte a [ plexShowSprite::$2 ]
Attempting to uplift remaining variables inzp[1]:27 [ plexShowSprite::$8 ]
Uplifting [plexShowSprite] best 57277 combination reg byte a [ plexShowSprite::$8 ]
Attempting to uplift remaining variables inzp[1]:28 [ plexShowSprite::$4 ]
Uplifting [plexShowSprite] best 57271 combination reg byte x [ plexShowSprite::$4 ]
Attempting to uplift remaining variables inzp[1]:29 [ plexShowSprite::$5 ]
Uplifting [plexShowSprite] best 57267 combination reg byte a [ plexShowSprite::$5 ]
Attempting to uplift remaining variables inzp[1]:30 [ plexShowSprite::plexFreeAdd1_ypos#0 ]
Uplifting [plexShowSprite] best 57258 combination reg byte a [ plexShowSprite::plexFreeAdd1_ypos#0 ]
Attempting to uplift remaining variables inzp[1]:31 [ plexShowSprite::$10 ]
Uplifting [plexShowSprite] best 57251 combination reg byte x [ plexShowSprite::$10 ]
Attempting to uplift remaining variables inzp[1]:34 [ plexShowSprite::plex_sprite_idx2#0 ]
Uplifting [plexShowSprite] best 57251 combination zp[1]:34 [ plexShowSprite::plex_sprite_idx2#0 ]
Attempting to uplift remaining variables inzp[1]:35 [ plex_irq::$4 ]
Uplifting [plex_irq] best 57251 combination zp[1]:35 [ plex_irq::$4 ]
Allocated (was zp[1]:5) zp[1]:2 [ plexSort::m#2 plexSort::m#1 ]
Allocated (was zp[1]:6) zp[1]:3 [ plexSort::nxt_y#0 ]
Allocated (was zp[1]:7) zp[1]:4 [ plexSort::nxt_idx#0 ]
Allocated (was zp[2]:14) zp[2]:5 [ init::xp#2 init::xp#1 ]
Allocated (was zp[1]:16) zp[1]:7 [ framedone ]
Allocated (was zp[1]:17) zp[1]:8 [ loop::sin_idx#6 loop::sin_idx#1 ]
Allocated (was zp[1]:18) zp[1]:9 [ plex_sprite_idx ]
Allocated (was zp[1]:19) zp[1]:10 [ plex_free_next ]
Allocated (was zp[1]:20) zp[1]:11 [ plex_sprite_msb ]
Allocated (was zp[1]:21) zp[1]:12 [ plex_show_idx ]
Allocated (was zp[2]:32) zp[2]:13 [ PLEX_SCREEN_PTR ]
Allocated (was zp[1]:34) zp[1]:15 [ plexShowSprite::plex_sprite_idx2#0 ]
Allocated (was zp[1]:35) zp[1]:16 [ plex_irq::$4 ]
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
// A simple usage of the flexible sprite multiplexer routine
/// @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="simple-multiplexer-irq.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#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
.const WHITE = 1
.const RED = 2
.const GREEN = 5
// The number of sprites in the multiplexer
.const PLEX_COUNT = $20
.const OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d
/// Sprite X position register for sprite #0
.label SPRITES_XPOS = $d000
/// Sprite Y position register for sprite #0
.label SPRITES_YPOS = $d001
/// Sprite X position MSB register
.label SPRITES_XMSB = $d010
/// Sprite colors register for sprite #0
.label SPRITES_COLOR = $d027
/// Sprite enable register
.label SPRITES_ENABLE = $d015
/// $D012 RASTER Raster counter
.label RASTER = $d012
/// $D020 Border Color
.label BORDER_COLOR = $d020
/// $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
/// VIC II IRQ Status Register
.label IRQ_STATUS = $d019
/// VIC II IRQ Enable Register
.label IRQ_ENABLE = $d01a
/// The CIA#1: keyboard matrix, joystick #1/#2
.label CIA1 = $dc00
/// The vector used when the KERNAL serves IRQ interrupts
.label KERNEL_IRQ = $314
// Location of screen & sprites
.label SCREEN = $400
// The address of the sprite pointers on the current screen (screen+0x3f8).
.label PLEX_SCREEN_PTR = $d
// The index in the PLEX tables of the next sprite to show
.label plex_show_idx = $c
// The index the next sprite to use for showing (sprites are used round-robin)
.label plex_sprite_idx = 9
// The MSB bit of the next sprite to use for showing
.label plex_sprite_msb = $b
// The index of the sprite that is free next. Since sprites are used round-robin this moves forward each time a sprite is shown.
.label plex_free_next = $a
.label framedone = 7
.segment Code
// __start
__start: {
jmp __init1
// __start::__init1
__init1:
// [1] PLEX_SCREEN_PTR = (char *) 1024+$3f8 -- pbuz1=pbuc1
lda #<$400+$3f8
sta.z PLEX_SCREEN_PTR
lda #>$400+$3f8
sta.z PLEX_SCREEN_PTR+1
// [2] plex_show_idx = 0 -- vbuz1=vbuc1
lda #0
sta.z plex_show_idx
// [3] plex_sprite_idx = 0 -- vbuz1=vbuc1
lda #0
sta.z plex_sprite_idx
// [4] plex_sprite_msb = 1 -- vbuz1=vbuc1
lda #1
sta.z plex_sprite_msb
// [5] plex_free_next = 0 -- vbuz1=vbuc1
lda #0
sta.z plex_free_next
// [6] framedone = true -- vboz1=vboc1
lda #1
sta.z framedone
// [7] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1]
__b1_from___init1:
jmp __b1
// __start::@1
__b1:
// [8] call main
jsr main
jmp __breturn
// __start::@return
__breturn:
// [9] return
rts
}
// plex_irq
plex_irq: {
.label __4 = $10
// interrupt(isr_rom_min_c64_entry) -- isr_rom_min_c64_entry
// asm { sei }
sei
// [11] *BORDER_COLOR = WHITE -- _deref_pbuc1=vbuc2
lda #WHITE
sta BORDER_COLOR
// [12] phi from plex_irq plex_irq::@7 to plex_irq::@3 [phi:plex_irq/plex_irq::@7->plex_irq::@3]
__b3_from_plex_irq:
__b3_from___b7:
jmp __b3
// plex_irq::@3
__b3:
// [13] call plexShowSprite
jsr plexShowSprite
jmp plexFreeNextYpos1
// plex_irq::plexFreeNextYpos1
plexFreeNextYpos1:
// [14] plex_irq::plexFreeNextYpos1_return#0 = PLEX_FREE_YPOS[plex_free_next] -- vbuxx=pbuc1_derefidx_vbuz1
ldy.z plex_free_next
ldx PLEX_FREE_YPOS,y
jmp __b6
// plex_irq::@6
__b6:
// [15] plex_irq::$4 = *RASTER + 2 -- vbuz1=_deref_pbuc1_plus_2
lda RASTER
clc
adc #2
sta.z __4
// [16] if(plex_show_idx>=PLEX_COUNT) goto plex_irq::@4 -- vbuz1_ge_vbuc1_then_la1
lda.z plex_show_idx
cmp #PLEX_COUNT
bcs __b4
jmp __b7
// plex_irq::@7
__b7:
// [17] if(plex_irq::plexFreeNextYpos1_return#0<plex_irq::$4) goto plex_irq::@3 -- vbuxx_lt_vbuz1_then_la1
cpx.z __4
bcc __b3_from___b7
jmp __b4
// plex_irq::@4
__b4:
// [18] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2
lda #IRQ_RASTER
sta IRQ_STATUS
// [19] if(plex_show_idx<PLEX_COUNT) goto plex_irq::@1 -- vbuz1_lt_vbuc1_then_la1
lda.z plex_show_idx
cmp #PLEX_COUNT
bcc __b1
jmp __b5
// plex_irq::@5
__b5:
// [20] *RASTER = 0 -- _deref_pbuc1=vbuc2
lda #0
sta RASTER
// [21] framedone = true -- vboz1=vboc1
lda #1
sta.z framedone
jmp __b2
// plex_irq::@2
__b2:
// [22] *BORDER_COLOR = 0 -- _deref_pbuc1=vbuc2
lda #0
sta BORDER_COLOR
// asm { cli }
cli
jmp __breturn
// plex_irq::@return
__breturn:
// [24] return
// interrupt(isr_rom_min_c64_exit) -- isr_rom_min_c64_exit
jmp $ea81
// plex_irq::@1
__b1:
// [25] *RASTER = plex_irq::plexFreeNextYpos1_return#0 -- _deref_pbuc1=vbuxx
stx RASTER
jmp __b2
}
// main
main: {
// asm { sei }
sei
// [27] call init
jsr init
// [28] phi from main to main::@1 [phi:main->main::@1]
__b1_from_main:
jmp __b1
// main::@1
__b1:
// [29] call loop
// [79] phi from main::@1 to loop [phi:main::@1->loop]
loop_from___b1:
jsr loop
jmp __breturn
// main::@return
__breturn:
// [30] return
rts
}
// plexShowSprite
// Show the next sprite.
// plexSort() prepares showing the sprites
plexShowSprite: {
.label plex_sprite_idx2 = $f
// [31] plexShowSprite::plex_sprite_idx2#0 = plex_sprite_idx << 1 -- vbuz1=vbuz2_rol_1
lda.z plex_sprite_idx
asl
sta.z plex_sprite_idx2
// [32] plexShowSprite::plexFreeAdd1_ypos#0 = PLEX_YPOS[PLEX_SORTED_IDX[plex_show_idx]] -- vbuaa=pbuc1_derefidx_(pbuc2_derefidx_vbuz1)
ldx.z plex_show_idx
ldy PLEX_SORTED_IDX,x
lda PLEX_YPOS,y
// [33] SPRITES_YPOS[plexShowSprite::plex_sprite_idx2#0] = plexShowSprite::plexFreeAdd1_ypos#0 -- pbuc1_derefidx_vbuz1=vbuaa
ldy.z plex_sprite_idx2
sta SPRITES_YPOS,y
jmp plexFreeAdd1
// plexShowSprite::plexFreeAdd1
plexFreeAdd1:
// [34] plexShowSprite::plexFreeAdd1_$0 = plexShowSprite::plexFreeAdd1_ypos#0 + $16 -- vbuaa=vbuaa_plus_vbuc1
clc
adc #$16
// [35] PLEX_FREE_YPOS[plex_free_next] = plexShowSprite::plexFreeAdd1_$0 -- pbuc1_derefidx_vbuz1=vbuaa
ldy.z plex_free_next
sta PLEX_FREE_YPOS,y
// [36] plexShowSprite::plexFreeAdd1_$1 = plex_free_next + 1 -- vbuxx=vbuz1_plus_1
ldx.z plex_free_next
inx
// [37] plexShowSprite::plexFreeAdd1_$2 = plexShowSprite::plexFreeAdd1_$1 & 7 -- vbuaa=vbuxx_band_vbuc1
txa
and #7
// [38] plex_free_next = plexShowSprite::plexFreeAdd1_$2 -- vbuz1=vbuaa
sta.z plex_free_next
jmp __b5
// plexShowSprite::@5
__b5:
// [39] PLEX_SCREEN_PTR[plex_sprite_idx] = PLEX_PTR[PLEX_SORTED_IDX[plex_show_idx]] -- pbuz1_derefidx_vbuz2=pbuc1_derefidx_(pbuc2_derefidx_vbuz3)
ldx.z plex_show_idx
ldy PLEX_SORTED_IDX,x
lda PLEX_PTR,y
ldy.z plex_sprite_idx
sta (PLEX_SCREEN_PTR),y
// [40] plexShowSprite::xpos_idx#0 = PLEX_SORTED_IDX[plex_show_idx] -- vbuaa=pbuc1_derefidx_vbuz1
ldy.z plex_show_idx
lda PLEX_SORTED_IDX,y
// [41] plexShowSprite::$10 = plexShowSprite::xpos_idx#0 << 1 -- vbuxx=vbuaa_rol_1
asl
tax
// [42] SPRITES_XPOS[plexShowSprite::plex_sprite_idx2#0] = (char)PLEX_XPOS[plexShowSprite::$10] -- pbuc1_derefidx_vbuz1=_byte_pwuc2_derefidx_vbuxx
ldy.z plex_sprite_idx2
lda PLEX_XPOS,x
sta SPRITES_XPOS,y
// [43] plexShowSprite::$2 = byte1 PLEX_XPOS[plexShowSprite::$10] -- vbuaa=_byte1_pwuc1_derefidx_vbuxx
lda PLEX_XPOS+1,x
// [44] if(plexShowSprite::$2!=0) goto plexShowSprite::@1 -- vbuaa_neq_0_then_la1
cmp #0
bne __b1
jmp __b3
// plexShowSprite::@3
__b3:
// [45] plexShowSprite::$8 = $ff ^ plex_sprite_msb -- vbuaa=vbuc1_bxor_vbuz1
lda #$ff
eor.z plex_sprite_msb
// [46] *SPRITES_XMSB = *SPRITES_XMSB & plexShowSprite::$8 -- _deref_pbuc1=_deref_pbuc1_band_vbuaa
and SPRITES_XMSB
sta SPRITES_XMSB
jmp __b2
// plexShowSprite::@2
__b2:
// [47] plexShowSprite::$4 = plex_sprite_idx + 1 -- vbuxx=vbuz1_plus_1
ldx.z plex_sprite_idx
inx
// [48] plexShowSprite::$5 = plexShowSprite::$4 & 7 -- vbuaa=vbuxx_band_vbuc1
txa
and #7
// [49] plex_sprite_idx = plexShowSprite::$5 -- vbuz1=vbuaa
sta.z plex_sprite_idx
// [50] plex_show_idx = ++ plex_show_idx -- vbuz1=_inc_vbuz1
inc.z plex_show_idx
// [51] plex_sprite_msb = plex_sprite_msb << 1 -- vbuz1=vbuz1_rol_1
asl.z plex_sprite_msb
// [52] if(plex_sprite_msb!=0) goto plexShowSprite::@return -- vbuz1_neq_0_then_la1
lda.z plex_sprite_msb
bne __breturn
jmp __b4
// plexShowSprite::@4
__b4:
// [53] plex_sprite_msb = 1 -- vbuz1=vbuc1
lda #1
sta.z plex_sprite_msb
jmp __breturn
// plexShowSprite::@return
__breturn:
// [54] return
rts
// plexShowSprite::@1
__b1:
// [55] *SPRITES_XMSB = *SPRITES_XMSB | plex_sprite_msb -- _deref_pbuc1=_deref_pbuc1_bor_vbuz1
lda SPRITES_XMSB
ora.z plex_sprite_msb
sta SPRITES_XMSB
jmp __b2
}
// init
// Initialize the program
init: {
// Set the x-positions & pointers
.label xp = 5
// [56] *D011 = VICII_DEN|VICII_RSEL|3 -- _deref_pbuc1=vbuc2
lda #VICII_DEN|VICII_RSEL|3
sta D011
// [57] call plexInit
// Initialize the multiplexer
// [94] phi from init to plexInit [phi:init->plexInit]
plexInit_from_init:
jsr plexInit
// [58] phi from init to init::@1 [phi:init->init::@1]
__b1_from_init:
// [58] phi init::xp#2 = $20 [phi:init->init::@1#0] -- vwuz1=vwuc1
lda #<$20
sta.z xp
lda #>$20
sta.z xp+1
// [58] phi init::sx#2 = 0 [phi:init->init::@1#1] -- vbuxx=vbuc1
ldx #0
jmp __b1
// [58] phi from init::@1 to init::@1 [phi:init::@1->init::@1]
__b1_from___b1:
// [58] phi init::xp#2 = init::xp#1 [phi:init::@1->init::@1#0] -- register_copy
// [58] phi init::sx#2 = init::sx#1 [phi:init::@1->init::@1#1] -- register_copy
jmp __b1
// init::@1
__b1:
// [59] PLEX_PTR[init::sx#2] = (char)SPRITE/$40 -- pbuc1_derefidx_vbuxx=vbuc2
lda #$ff&SPRITE/$40
sta PLEX_PTR,x
// [60] init::$3 = init::sx#2 << 1 -- vbuaa=vbuxx_rol_1
txa
asl
// [61] PLEX_XPOS[init::$3] = init::xp#2 -- pwuc1_derefidx_vbuaa=vwuz1
tay
lda.z xp
sta PLEX_XPOS,y
lda.z xp+1
sta PLEX_XPOS+1,y
// [62] init::xp#1 = init::xp#2 + 9 -- vwuz1=vwuz1_plus_vbuc1
lda #9
clc
adc.z xp
sta.z xp
bcc !+
inc.z xp+1
!:
// [63] init::sx#1 = ++ init::sx#2 -- vbuxx=_inc_vbuxx
inx
// [64] if(init::sx#1!=PLEX_COUNT-1+1) goto init::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #PLEX_COUNT-1+1
bne __b1_from___b1
jmp __b2
// init::@2
__b2:
// [65] *SPRITES_ENABLE = $ff -- _deref_pbuc1=vbuc2
// Enable & initialize sprites
lda #$ff
sta SPRITES_ENABLE
// [66] phi from init::@2 to init::@3 [phi:init::@2->init::@3]
__b3_from___b2:
// [66] phi init::ss#2 = 0 [phi:init::@2->init::@3#0] -- vbuxx=vbuc1
ldx #0
jmp __b3
// [66] phi from init::@3 to init::@3 [phi:init::@3->init::@3]
__b3_from___b3:
// [66] phi init::ss#2 = init::ss#1 [phi:init::@3->init::@3#0] -- register_copy
jmp __b3
// init::@3
__b3:
// [67] SPRITES_COLOR[init::ss#2] = GREEN -- pbuc1_derefidx_vbuxx=vbuc2
lda #GREEN
sta SPRITES_COLOR,x
// [68] init::ss#1 = ++ init::ss#2 -- vbuxx=_inc_vbuxx
inx
// [69] if(init::ss#1!=8) goto init::@3 -- vbuxx_neq_vbuc1_then_la1
cpx #8
bne __b3_from___b3
jmp __b4
// init::@4
__b4:
// asm { sei }
// enable the interrupt
sei
// [71] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL -- _deref_pbuc1=vbuc2
lda #CIA_INTERRUPT_CLEAR_ALL
sta CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT
// [72] *IRQ_ENABLE = IRQ_RASTER -- _deref_pbuc1=vbuc2
lda #IRQ_RASTER
sta IRQ_ENABLE
// [73] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2
lda #IRQ_RASTER
sta IRQ_STATUS
// [74] *KERNEL_IRQ = &plex_irq -- _deref_qprc1=pprc2
lda #<plex_irq
sta KERNEL_IRQ
lda #>plex_irq
sta KERNEL_IRQ+1
// [75] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2
lda #$7f
and VICII_CONTROL1
sta VICII_CONTROL1
// [76] *RASTER = 0 -- _deref_pbuc1=vbuc2
lda #0
sta RASTER
// asm { cli }
cli
jmp __breturn
// init::@return
__breturn:
// [78] return
rts
}
// loop
// The raster loop
loop: {
// The current index into the y-sine
.label sin_idx = 8
// [80] phi from loop to loop::@1 [phi:loop->loop::@1]
__b1_from_loop:
// [80] phi loop::sin_idx#6 = 0 [phi:loop->loop::@1#0] -- vbuz1=vbuc1
lda #0
sta.z sin_idx
jmp __b1
// loop::@1
__b1:
jmp __b2
// loop::@2
__b2:
// [81] if(framedone) goto loop::@3 -- vboz1_then_la1
lda.z framedone
cmp #0
bne __b3
jmp __b2
// loop::@3
__b3:
// [82] *BORDER_COLOR = RED -- _deref_pbuc1=vbuc2
lda #RED
sta BORDER_COLOR
// [83] loop::y_idx#3 = loop::sin_idx#6 -- vbuxx=vbuz1
ldx.z sin_idx
// [84] phi from loop::@3 to loop::@4 [phi:loop::@3->loop::@4]
__b4_from___b3:
// [84] phi loop::sy#2 = 0 [phi:loop::@3->loop::@4#0] -- vbuyy=vbuc1
ldy #0
// [84] phi loop::y_idx#2 = loop::y_idx#3 [phi:loop::@3->loop::@4#1] -- register_copy
jmp __b4
// [84] phi from loop::@4 to loop::@4 [phi:loop::@4->loop::@4]
__b4_from___b4:
// [84] phi loop::sy#2 = loop::sy#1 [phi:loop::@4->loop::@4#0] -- register_copy
// [84] phi loop::y_idx#2 = loop::y_idx#1 [phi:loop::@4->loop::@4#1] -- register_copy
jmp __b4
// loop::@4
__b4:
// [85] PLEX_YPOS[loop::sy#2] = YSIN[loop::y_idx#2] -- pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuxx
lda YSIN,x
sta PLEX_YPOS,y
// [86] loop::y_idx#1 = loop::y_idx#2 + 8 -- vbuxx=vbuxx_plus_vbuc1
txa
axs #-[8]
// [87] loop::sy#1 = ++ loop::sy#2 -- vbuyy=_inc_vbuyy
iny
// [88] if(loop::sy#1!=PLEX_COUNT-1+1) goto loop::@4 -- vbuyy_neq_vbuc1_then_la1
cpy #PLEX_COUNT-1+1
bne __b4_from___b4
jmp __b5
// loop::@5
__b5:
// [89] loop::sin_idx#1 = loop::sin_idx#6 + 1 -- vbuz1=vbuz1_plus_1
inc.z sin_idx
// [90] *BORDER_COLOR = ++ *BORDER_COLOR -- _deref_pbuc1=_inc__deref_pbuc1
inc BORDER_COLOR
// [91] call plexSort
// [101] phi from loop::@5 to plexSort [phi:loop::@5->plexSort]
plexSort_from___b5:
jsr plexSort
jmp __b6
// loop::@6
__b6:
// [92] *BORDER_COLOR = GREEN -- _deref_pbuc1=vbuc2
lda #GREEN
sta BORDER_COLOR
// [93] framedone = false -- vboz1=vboc1
lda #0
sta.z framedone
// [80] phi from loop::@6 to loop::@1 [phi:loop::@6->loop::@1]
__b1_from___b6:
// [80] phi loop::sin_idx#6 = loop::sin_idx#1 [phi:loop::@6->loop::@1#0] -- register_copy
jmp __b1
}
// plexInit
// Initialize the multiplexer data structures
// void plexInit(char *screen)
plexInit: {
jmp plexSetScreen1
// plexInit::plexSetScreen1
plexSetScreen1:
// [95] PLEX_SCREEN_PTR = SCREEN+$3f8 -- pbuz1=pbuc1
lda #<SCREEN+$3f8
sta.z PLEX_SCREEN_PTR
lda #>SCREEN+$3f8
sta.z PLEX_SCREEN_PTR+1
// [96] phi from plexInit::plexSetScreen1 to plexInit::@1 [phi:plexInit::plexSetScreen1->plexInit::@1]
__b1_from_plexSetScreen1:
// [96] phi plexInit::i#2 = 0 [phi:plexInit::plexSetScreen1->plexInit::@1#0] -- vbuxx=vbuc1
ldx #0
jmp __b1
// [96] phi from plexInit::@1 to plexInit::@1 [phi:plexInit::@1->plexInit::@1]
__b1_from___b1:
// [96] phi plexInit::i#2 = plexInit::i#1 [phi:plexInit::@1->plexInit::@1#0] -- register_copy
jmp __b1
// plexInit::@1
__b1:
// [97] PLEX_SORTED_IDX[plexInit::i#2] = plexInit::i#2 -- pbuc1_derefidx_vbuxx=vbuxx
txa
sta PLEX_SORTED_IDX,x
// [98] plexInit::i#1 = ++ plexInit::i#2 -- vbuxx=_inc_vbuxx
inx
// [99] if(plexInit::i#1!=PLEX_COUNT-1+1) goto plexInit::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #PLEX_COUNT-1+1
bne __b1_from___b1
jmp __breturn
// plexInit::@return
__breturn:
// [100] return
rts
}
// plexSort
// Ensure that the indices in PLEX_SORTED_IDX is sorted based on the y-positions in PLEX_YPOS
// Assumes that the positions are nearly sorted already (as each sprite just moves a bit)
// Uses an insertion sort:
// 1. Moves a marker (m) from the start to end of the array. Every time the marker moves forward all elements before the marker are sorted correctly.
// 2a. If the next element after the marker is larger that the current element
// the marker can be moved forwards (as the sorting is correct).
// 2b. If the next element after the marker is smaller than the current element:
// elements before the marker are shifted right one at a time until encountering one smaller than the current one.
// It is then inserted at the spot. Now the marker can move forward.
plexSort: {
.label nxt_idx = 4
.label nxt_y = 3
.label m = 2
// [102] phi from plexSort to plexSort::@1 [phi:plexSort->plexSort::@1]
__b1_from_plexSort:
// [102] phi plexSort::m#2 = 0 [phi:plexSort->plexSort::@1#0] -- vbuz1=vbuc1
lda #0
sta.z m
jmp __b1
// [102] phi from plexSort::@2 to plexSort::@1 [phi:plexSort::@2->plexSort::@1]
__b1_from___b2:
// [102] phi plexSort::m#2 = plexSort::m#1 [phi:plexSort::@2->plexSort::@1#0] -- register_copy
jmp __b1
// plexSort::@1
__b1:
// [103] plexSort::nxt_idx#0 = (PLEX_SORTED_IDX+1)[plexSort::m#2] -- vbuz1=pbuc1_derefidx_vbuz2
ldy.z m
lda PLEX_SORTED_IDX+1,y
sta.z nxt_idx
// [104] plexSort::nxt_y#0 = PLEX_YPOS[plexSort::nxt_idx#0] -- vbuz1=pbuc1_derefidx_vbuz2
ldy.z nxt_idx
lda PLEX_YPOS,y
sta.z nxt_y
// [105] if(plexSort::nxt_y#0>=PLEX_YPOS[PLEX_SORTED_IDX[plexSort::m#2]]) goto plexSort::@2 -- vbuz1_ge_pbuc1_derefidx_(pbuc2_derefidx_vbuz2)_then_la1
lda.z nxt_y
ldx.z m
ldy PLEX_SORTED_IDX,x
cmp PLEX_YPOS,y
bcs __b2
jmp __b5
// plexSort::@5
__b5:
// [106] plexSort::s#6 = plexSort::m#2 -- vbuxx=vbuz1
ldx.z m
// [107] phi from plexSort::@5 plexSort::@7 to plexSort::@3 [phi:plexSort::@5/plexSort::@7->plexSort::@3]
__b3_from___b5:
__b3_from___b7:
// [107] phi plexSort::s#3 = plexSort::s#6 [phi:plexSort::@5/plexSort::@7->plexSort::@3#0] -- register_copy
jmp __b3
// plexSort::@3
__b3:
// [108] (PLEX_SORTED_IDX+1)[plexSort::s#3] = PLEX_SORTED_IDX[plexSort::s#3] -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda PLEX_SORTED_IDX,x
sta PLEX_SORTED_IDX+1,x
// [109] plexSort::s#1 = -- plexSort::s#3 -- vbuxx=_dec_vbuxx
dex
// [110] if(plexSort::s#1==$ff) goto plexSort::@4 -- vbuxx_eq_vbuc1_then_la1
cpx #$ff
beq __b4
jmp __b7
// plexSort::@7
__b7:
// [111] if(plexSort::nxt_y#0<PLEX_YPOS[PLEX_SORTED_IDX[plexSort::s#1]]) goto plexSort::@3 -- vbuz1_lt_pbuc1_derefidx_(pbuc2_derefidx_vbuxx)_then_la1
lda.z nxt_y
ldy PLEX_SORTED_IDX,x
cmp PLEX_YPOS,y
bcc __b3_from___b7
jmp __b4
// plexSort::@4
__b4:
// [112] plexSort::s#2 = ++ plexSort::s#1 -- vbuxx=_inc_vbuxx
inx
// [113] PLEX_SORTED_IDX[plexSort::s#2] = plexSort::nxt_idx#0 -- pbuc1_derefidx_vbuxx=vbuz1
lda.z nxt_idx
sta PLEX_SORTED_IDX,x
jmp __b2
// plexSort::@2
__b2:
// [114] plexSort::m#1 = ++ plexSort::m#2 -- vbuz1=_inc_vbuz1
inc.z m
// [115] if(plexSort::m#1!=PLEX_COUNT-2+1) goto plexSort::@1 -- vbuz1_neq_vbuc1_then_la1
lda #PLEX_COUNT-2+1
cmp.z m
bne __b1_from___b2
jmp __b6
// plexSort::@6
__b6:
// [116] plex_show_idx = 0 -- vbuz1=vbuc1
// Prepare for showing the sprites
lda #0
sta.z plex_show_idx
// [117] plex_sprite_idx = 0 -- vbuz1=vbuc1
lda #0
sta.z plex_sprite_idx
// [118] plex_sprite_msb = 1 -- vbuz1=vbuc1
lda #1
sta.z plex_sprite_msb
// [119] phi from plexSort::@6 to plexSort::plexFreePrepare1 [phi:plexSort::@6->plexSort::plexFreePrepare1]
plexFreePrepare1_from___b6:
jmp plexFreePrepare1
// plexSort::plexFreePrepare1
plexFreePrepare1:
// [120] phi from plexSort::plexFreePrepare1 to plexSort::plexFreePrepare1_@1 [phi:plexSort::plexFreePrepare1->plexSort::plexFreePrepare1_@1]
plexFreePrepare1___b1_from_plexFreePrepare1:
// [120] phi plexSort::plexFreePrepare1_s#2 = 0 [phi:plexSort::plexFreePrepare1->plexSort::plexFreePrepare1_@1#0] -- vbuxx=vbuc1
ldx #0
jmp plexFreePrepare1___b1
// [120] phi from plexSort::plexFreePrepare1_@1 to plexSort::plexFreePrepare1_@1 [phi:plexSort::plexFreePrepare1_@1->plexSort::plexFreePrepare1_@1]
plexFreePrepare1___b1_from_plexFreePrepare1___b1:
// [120] phi plexSort::plexFreePrepare1_s#2 = plexSort::plexFreePrepare1_s#1 [phi:plexSort::plexFreePrepare1_@1->plexSort::plexFreePrepare1_@1#0] -- register_copy
jmp plexFreePrepare1___b1
// plexSort::plexFreePrepare1_@1
plexFreePrepare1___b1:
// [121] PLEX_FREE_YPOS[plexSort::plexFreePrepare1_s#2] = 0 -- pbuc1_derefidx_vbuxx=vbuc2
lda #0
sta PLEX_FREE_YPOS,x
// [122] plexSort::plexFreePrepare1_s#1 = ++ plexSort::plexFreePrepare1_s#2 -- vbuxx=_inc_vbuxx
inx
// [123] if(plexSort::plexFreePrepare1_s#1!=8) goto plexSort::plexFreePrepare1_@1 -- vbuxx_neq_vbuc1_then_la1
cpx #8
bne plexFreePrepare1___b1_from_plexFreePrepare1___b1
jmp plexFreePrepare1___b2
// plexSort::plexFreePrepare1_@2
plexFreePrepare1___b2:
// [124] plex_free_next = 0 -- vbuz1=vbuc1
lda #0
sta.z plex_free_next
jmp __breturn
// plexSort::@return
__breturn:
// [125] return
rts
}
// File Data
.segment Data
// The x-positions of the multiplexer sprites (0x000-0x1ff)
PLEX_XPOS: .fill 2*PLEX_COUNT, 0
// The y-positions of the multiplexer sprites.
PLEX_YPOS: .fill PLEX_COUNT, 0
// The sprite pointers for the multiplexed sprites
PLEX_PTR: .fill PLEX_COUNT, 0
// Indexes of the plex-sprites sorted by sprite y-position. Each call to plexSort() will fix the sorting if changes to the Y-positions have ruined it.
PLEX_SORTED_IDX: .fill PLEX_COUNT, 0
// Contains the Y-position where each sprite is free again. PLEX_FREE_YPOS[s] holds the Y-position where sprite s is free to use again.
PLEX_FREE_YPOS: .fill 8, 0
.align $40
SPRITE:
.var pic = LoadPicture("balloon.png", List().add($000000, $ffffff))
.for (var y=0; y<21; y++)
.for (var x=0;x<3; x++)
.byte pic.getSinglecolorByte(x,y)
.align $100
YSIN:
.fill $100, round(139.5+89.5*sin(toRadians(360*i/256)))
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __init1
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b3
Removing instruction jmp plexFreeNextYpos1
Removing instruction jmp __b6
Removing instruction jmp __b7
Removing instruction jmp __b4
Removing instruction jmp __b5
Removing instruction jmp __b2
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp plexFreeAdd1
Removing instruction jmp __b5
Removing instruction jmp __b3
Removing instruction jmp __b2
Removing instruction jmp __b4
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b2
Removing instruction jmp __b3
Removing instruction jmp __b4
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b2
Removing instruction jmp __b4
Removing instruction jmp __b5
Removing instruction jmp __b6
Removing instruction jmp plexSetScreen1
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b5
Removing instruction jmp __b3
Removing instruction jmp __b7
Removing instruction jmp __b4
Removing instruction jmp __b2
Removing instruction jmp __b6
Removing instruction jmp plexFreePrepare1
Removing instruction jmp plexFreePrepare1___b1
Removing instruction jmp plexFreePrepare1___b2
Removing instruction jmp __breturn
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda #0
Removing instruction lda #IRQ_RASTER
Replacing instruction ldy.z nxt_idx with TAY
Removing instruction lda.z nxt_y
Removing instruction lda #0
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Replacing label __b3_from___b7 with __b3
Replacing label __b1_from___b1 with __b1
Replacing label __b3_from___b3 with __b3
Replacing label __b4_from___b4 with __b4
Replacing label __b1 with __b2
Replacing label __b1_from___b1 with __b1
Replacing label __b3_from___b7 with __b3
Replacing label __b1_from___b2 with __b1
Replacing label plexFreePrepare1___b1_from_plexFreePrepare1___b1 with plexFreePrepare1___b1
Removing instruction __b1_from___init1:
Removing instruction __b3_from_plex_irq:
Removing instruction __b3_from___b7:
Removing instruction __b1_from_main:
Removing instruction loop_from___b1:
Removing instruction __b1_from___b1:
Removing instruction __b3_from___b3:
Removing instruction __b1:
Removing instruction __b4_from___b4:
Removing instruction __b1_from___b1:
Removing instruction __b1_from___b2:
Removing instruction __b3_from___b5:
Removing instruction __b3_from___b7:
Removing instruction plexFreePrepare1_from___b6:
Removing instruction plexFreePrepare1___b1_from_plexFreePrepare1:
Removing instruction plexFreePrepare1___b1_from_plexFreePrepare1___b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction __init1:
Removing instruction __b1:
Removing instruction __breturn:
Removing instruction plexFreeNextYpos1:
Removing instruction __b6:
Removing instruction __b7:
Removing instruction __b5:
Removing instruction __breturn:
Removing instruction __b1:
Removing instruction __breturn:
Removing instruction plexFreeAdd1:
Removing instruction __b5:
Removing instruction __b3:
Removing instruction __b4:
Removing instruction plexInit_from_init:
Removing instruction __b1_from_init:
Removing instruction __b2:
Removing instruction __b3_from___b2:
Removing instruction __b4:
Removing instruction __breturn:
Removing instruction __b1_from_loop:
Removing instruction __b4_from___b3:
Removing instruction __b5:
Removing instruction plexSort_from___b5:
Removing instruction __b6:
Removing instruction __b1_from___b6:
Removing instruction plexSetScreen1:
Removing instruction __b1_from_plexSetScreen1:
Removing instruction __breturn:
Removing instruction __b1_from_plexSort:
Removing instruction __b5:
Removing instruction __b7:
Removing instruction __b6:
Removing instruction plexFreePrepare1:
Removing instruction plexFreePrepare1___b2:
Removing instruction __breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Removing instruction jmp __b1
Removing instruction jmp __b3
Removing instruction jmp __b4
Removing instruction jmp __b1
Removing instruction jmp __b1
Removing instruction jmp plexFreePrepare1___b1
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction ldx.z m
Removing instruction lda #0
Succesful ASM optimization Pass5UnnecesaryLoadElimination
FINAL SYMBOL TABLE
__constant char * const BORDER_COLOR = (char *) 53280
__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 const char GREEN = 5
__constant char * const IRQ_ENABLE = (char *) 53274
__constant const char IRQ_RASTER = 1
__constant char * const IRQ_STATUS = (char *) 53273
__constant void (** const KERNEL_IRQ)() = (void (**)()) 788
__constant char OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d
__constant const char PLEX_COUNT = $20
__constant char PLEX_FREE_YPOS[8] = { fill( 8, 0) }
__constant char PLEX_PTR[PLEX_COUNT] = { fill( PLEX_COUNT, 0) }
__loadstore char * volatile PLEX_SCREEN_PTR // zp[2]:13 33.45454545454545
__constant char PLEX_SORTED_IDX[PLEX_COUNT] = { fill( PLEX_COUNT, 0) }
__constant unsigned int PLEX_XPOS[PLEX_COUNT] = { fill( PLEX_COUNT, 0) }
__constant char PLEX_YPOS[PLEX_COUNT] = { fill( PLEX_COUNT, 0) }
__constant char * const RASTER = (char *) 53266
__constant const char RED = 2
__constant char *SCREEN = (char *) 1024
__constant char SPRITE[$40] = kickasm {{ .var pic = LoadPicture("balloon.png", List().add($000000, $ffffff))
.for (var y=0; y<21; y++)
.for (var x=0;x<3; x++)
.byte pic.getSinglecolorByte(x,y)
}}
__constant char * const SPRITES_COLOR = (char *) 53287
__constant char * const SPRITES_ENABLE = (char *) 53269
__constant char * const SPRITES_XMSB = (char *) 53264
__constant char * const SPRITES_XPOS = (char *) 53248
__constant char * const SPRITES_YPOS = (char *) 53249
__constant char * const VICII_CONTROL1 = (char *) 53265
__constant const char VICII_DEN = $10
__constant const char VICII_RSEL = 8
__constant const char WHITE = 1
__constant char YSIN[$100] = kickasm {{ .fill $100, round(139.5+89.5*sin(toRadians(360*i/256)))
}}
void __start()
__loadstore volatile bool framedone // zp[1]:7 1222.8888888888887
void init()
char init::$3 // reg byte a 2002.0
char init::ss
char init::ss#1 // reg byte x 1501.5
char init::ss#2 // reg byte x 1501.5
char init::sx
char init::sx#1 // reg byte x 1501.5
char init::sx#2 // reg byte x 800.8
unsigned int init::xp
unsigned int init::xp#1 // xp zp[2]:5 667.3333333333334
unsigned int init::xp#2 // xp zp[2]:5 750.75
void loop()
char loop::sin_idx
char loop::sin_idx#1 // sin_idx zp[1]:8 400.4
char loop::sin_idx#6 // sin_idx zp[1]:8 333.6666666666667
char loop::sy
char loop::sy#1 // reg byte y 15001.5
char loop::sy#2 // reg byte y 10001.0
char loop::y_idx
char loop::y_idx#1 // reg byte x 6667.333333333333
char loop::y_idx#2 // reg byte x 15502.0
char loop::y_idx#3 // reg byte x 2002.0
void main()
void plexInit(char *screen)
char plexInit::i
char plexInit::i#1 // reg byte x 15001.5
char plexInit::i#2 // reg byte x 20002.0
char *plexInit::plexSetScreen1_screen
char *plexInit::screen
void plexShowSprite()
char plexShowSprite::$10 // reg byte x 101.0
char plexShowSprite::$2 // reg byte a 202.0
char plexShowSprite::$4 // reg byte x 202.0
char plexShowSprite::$5 // reg byte a 202.0
char plexShowSprite::$8 // reg byte a 202.0
char plexShowSprite::plexFreeAdd1_$0 // reg byte a 202.0
char plexShowSprite::plexFreeAdd1_$1 // reg byte x 202.0
char plexShowSprite::plexFreeAdd1_$2 // reg byte a 202.0
char plexShowSprite::plexFreeAdd1_ypos
char plexShowSprite::plexFreeAdd1_ypos#0 // reg byte a 151.5
char plexShowSprite::plex_sprite_idx2
char plexShowSprite::plex_sprite_idx2#0 // plex_sprite_idx2 zp[1]:15 27.545454545454547
char plexShowSprite::xpos_idx
char plexShowSprite::xpos_idx#0 // reg byte a 202.0
char plexShowSprite::ypos
void plexSort()
char plexSort::m
char plexSort::m#1 // m zp[1]:2 1500001.5
char plexSort::m#2 // m zp[1]:2 416667.0833333334
char plexSort::nxt_idx
char plexSort::nxt_idx#0 // nxt_idx zp[1]:4 300000.30000000005
char plexSort::nxt_y
char plexSort::nxt_y#0 // nxt_y zp[1]:3 1500000.375
char plexSort::plexFreePrepare1_s
char plexSort::plexFreePrepare1_s#1 // reg byte x 1500001.5
char plexSort::plexFreePrepare1_s#2 // reg byte x 1500001.5
char plexSort::s
char plexSort::s#1 // reg byte x 1.3666668333333332E7
char plexSort::s#2 // reg byte x 2000002.0
char plexSort::s#3 // reg byte x 2.05000025E7
char plexSort::s#6 // reg byte x 2000002.0
__loadstore volatile char plex_free_next // zp[1]:10 332.80645161290323
__interrupt(rom_min_c64) void plex_irq()
char plex_irq::$4 // zp[1]:16 11.0
char plex_irq::plexFreeNextYpos1_return
char plex_irq::plexFreeNextYpos1_return#0 // reg byte x 4.0
char plex_irq::rasterY
__loadstore volatile char plex_show_idx // zp[1]:12 309.44117647058823
__loadstore volatile char plex_sprite_idx // zp[1]:9 335.7096774193549
__loadstore volatile char plex_sprite_msb // zp[1]:11 321.4848484848485
reg byte x [ init::sx#2 init::sx#1 ]
zp[2]:5 [ init::xp#2 init::xp#1 ]
reg byte x [ init::ss#2 init::ss#1 ]
zp[1]:8 [ loop::sin_idx#6 loop::sin_idx#1 ]
reg byte x [ loop::y_idx#2 loop::y_idx#3 loop::y_idx#1 ]
reg byte y [ loop::sy#2 loop::sy#1 ]
reg byte x [ plexInit::i#2 plexInit::i#1 ]
zp[1]:2 [ plexSort::m#2 plexSort::m#1 ]
reg byte x [ plexSort::s#3 plexSort::s#1 plexSort::s#6 ]
reg byte x [ plexSort::plexFreePrepare1_s#2 plexSort::plexFreePrepare1_s#1 ]
zp[2]:13 [ PLEX_SCREEN_PTR ]
zp[1]:12 [ plex_show_idx ]
zp[1]:9 [ plex_sprite_idx ]
zp[1]:11 [ plex_sprite_msb ]
zp[1]:10 [ plex_free_next ]
zp[1]:7 [ framedone ]
reg byte x [ plex_irq::plexFreeNextYpos1_return#0 ]
zp[1]:16 [ plex_irq::$4 ]
zp[1]:15 [ plexShowSprite::plex_sprite_idx2#0 ]
reg byte a [ plexShowSprite::plexFreeAdd1_ypos#0 ]
reg byte a [ plexShowSprite::plexFreeAdd1_$0 ]
reg byte x [ plexShowSprite::plexFreeAdd1_$1 ]
reg byte a [ plexShowSprite::plexFreeAdd1_$2 ]
reg byte a [ plexShowSprite::xpos_idx#0 ]
reg byte x [ plexShowSprite::$10 ]
reg byte a [ plexShowSprite::$2 ]
reg byte a [ plexShowSprite::$8 ]
reg byte x [ plexShowSprite::$4 ]
reg byte a [ plexShowSprite::$5 ]
reg byte a [ init::$3 ]
zp[1]:4 [ plexSort::nxt_idx#0 ]
zp[1]:3 [ plexSort::nxt_y#0 ]
reg byte x [ plexSort::s#2 ]
FINAL ASSEMBLER
Score: 43652
// File Comments
// A simple usage of the flexible sprite multiplexer routine
/// @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="simple-multiplexer-irq.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#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
.const WHITE = 1
.const RED = 2
.const GREEN = 5
// The number of sprites in the multiplexer
.const PLEX_COUNT = $20
.const OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d
/// Sprite X position register for sprite #0
.label SPRITES_XPOS = $d000
/// Sprite Y position register for sprite #0
.label SPRITES_YPOS = $d001
/// Sprite X position MSB register
.label SPRITES_XMSB = $d010
/// Sprite colors register for sprite #0
.label SPRITES_COLOR = $d027
/// Sprite enable register
.label SPRITES_ENABLE = $d015
/// $D012 RASTER Raster counter
.label RASTER = $d012
/// $D020 Border Color
.label BORDER_COLOR = $d020
/// $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
/// VIC II IRQ Status Register
.label IRQ_STATUS = $d019
/// VIC II IRQ Enable Register
.label IRQ_ENABLE = $d01a
/// The CIA#1: keyboard matrix, joystick #1/#2
.label CIA1 = $dc00
/// The vector used when the KERNAL serves IRQ interrupts
.label KERNEL_IRQ = $314
// Location of screen & sprites
.label SCREEN = $400
// The address of the sprite pointers on the current screen (screen+0x3f8).
.label PLEX_SCREEN_PTR = $d
// The index in the PLEX tables of the next sprite to show
.label plex_show_idx = $c
// The index the next sprite to use for showing (sprites are used round-robin)
.label plex_sprite_idx = 9
// The MSB bit of the next sprite to use for showing
.label plex_sprite_msb = $b
// The index of the sprite that is free next. Since sprites are used round-robin this moves forward each time a sprite is shown.
.label plex_free_next = $a
.label framedone = 7
.segment Code
// __start
__start: {
// __start::__init1
// char* volatile PLEX_SCREEN_PTR = (char*)0x400+0x3f8
// [1] PLEX_SCREEN_PTR = (char *) 1024+$3f8 -- pbuz1=pbuc1
lda #<$400+$3f8
sta.z PLEX_SCREEN_PTR
lda #>$400+$3f8
sta.z PLEX_SCREEN_PTR+1
// volatile char plex_show_idx=0
// [2] plex_show_idx = 0 -- vbuz1=vbuc1
lda #0
sta.z plex_show_idx
// volatile char plex_sprite_idx=0
// [3] plex_sprite_idx = 0 -- vbuz1=vbuc1
sta.z plex_sprite_idx
// volatile char plex_sprite_msb=1
// [4] plex_sprite_msb = 1 -- vbuz1=vbuc1
lda #1
sta.z plex_sprite_msb
// volatile char plex_free_next = 0
// [5] plex_free_next = 0 -- vbuz1=vbuc1
lda #0
sta.z plex_free_next
// volatile bool framedone = true
// [6] framedone = true -- vboz1=vboc1
lda #1
sta.z framedone
// [7] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1]
// __start::@1
// [8] call main
jsr main
// __start::@return
// [9] return
rts
}
// plex_irq
plex_irq: {
.label __4 = $10
// interrupt(isr_rom_min_c64_entry) -- isr_rom_min_c64_entry
// asm
// asm { sei }
sei
// *BORDER_COLOR = WHITE
// [11] *BORDER_COLOR = WHITE -- _deref_pbuc1=vbuc2
lda #WHITE
sta BORDER_COLOR
// [12] phi from plex_irq plex_irq::@7 to plex_irq::@3 [phi:plex_irq/plex_irq::@7->plex_irq::@3]
// plex_irq::@3
__b3:
// plexShowSprite()
// [13] call plexShowSprite
jsr plexShowSprite
// plex_irq::plexFreeNextYpos1
// return PLEX_FREE_YPOS[plex_free_next];
// [14] plex_irq::plexFreeNextYpos1_return#0 = PLEX_FREE_YPOS[plex_free_next] -- vbuxx=pbuc1_derefidx_vbuz1
ldy.z plex_free_next
ldx PLEX_FREE_YPOS,y
// plex_irq::@6
// *RASTER+2
// [15] plex_irq::$4 = *RASTER + 2 -- vbuz1=_deref_pbuc1_plus_2
lda RASTER
clc
adc #2
sta.z __4
// while (plex_show_idx < PLEX_COUNT && rasterY < *RASTER+2)
// [16] if(plex_show_idx>=PLEX_COUNT) goto plex_irq::@4 -- vbuz1_ge_vbuc1_then_la1
lda.z plex_show_idx
cmp #PLEX_COUNT
bcs __b4
// plex_irq::@7
// [17] if(plex_irq::plexFreeNextYpos1_return#0<plex_irq::$4) goto plex_irq::@3 -- vbuxx_lt_vbuz1_then_la1
cpx.z __4
bcc __b3
// plex_irq::@4
__b4:
// *IRQ_STATUS = IRQ_RASTER
// [18] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2
lda #IRQ_RASTER
sta IRQ_STATUS
// if (plex_show_idx<PLEX_COUNT)
// [19] if(plex_show_idx<PLEX_COUNT) goto plex_irq::@1 -- vbuz1_lt_vbuc1_then_la1
lda.z plex_show_idx
cmp #PLEX_COUNT
bcc __b1
// plex_irq::@5
// *RASTER = 0x0
// [20] *RASTER = 0 -- _deref_pbuc1=vbuc2
lda #0
sta RASTER
// framedone = true
// [21] framedone = true -- vboz1=vboc1
lda #1
sta.z framedone
// plex_irq::@2
__b2:
// *BORDER_COLOR = 0
// [22] *BORDER_COLOR = 0 -- _deref_pbuc1=vbuc2
lda #0
sta BORDER_COLOR
// asm
// asm { cli }
cli
// plex_irq::@return
// }
// [24] return
// interrupt(isr_rom_min_c64_exit) -- isr_rom_min_c64_exit
jmp $ea81
// plex_irq::@1
__b1:
// *RASTER = rasterY
// [25] *RASTER = plex_irq::plexFreeNextYpos1_return#0 -- _deref_pbuc1=vbuxx
stx RASTER
jmp __b2
}
// main
main: {
// asm
// asm { sei }
sei
// init()
// [27] call init
jsr init
// [28] phi from main to main::@1 [phi:main->main::@1]
// main::@1
// loop()
// [29] call loop
// [79] phi from main::@1 to loop [phi:main::@1->loop]
jsr loop
// main::@return
// }
// [30] return
rts
}
// plexShowSprite
// Show the next sprite.
// plexSort() prepares showing the sprites
plexShowSprite: {
.label plex_sprite_idx2 = $f
// char plex_sprite_idx2 = plex_sprite_idx*2
// [31] plexShowSprite::plex_sprite_idx2#0 = plex_sprite_idx << 1 -- vbuz1=vbuz2_rol_1
lda.z plex_sprite_idx
asl
sta.z plex_sprite_idx2
// char ypos = PLEX_YPOS[PLEX_SORTED_IDX[plex_show_idx]]
// [32] plexShowSprite::plexFreeAdd1_ypos#0 = PLEX_YPOS[PLEX_SORTED_IDX[plex_show_idx]] -- vbuaa=pbuc1_derefidx_(pbuc2_derefidx_vbuz1)
ldx.z plex_show_idx
ldy PLEX_SORTED_IDX,x
lda PLEX_YPOS,y
// SPRITES_YPOS[plex_sprite_idx2] = ypos
// [33] SPRITES_YPOS[plexShowSprite::plex_sprite_idx2#0] = plexShowSprite::plexFreeAdd1_ypos#0 -- pbuc1_derefidx_vbuz1=vbuaa
ldy.z plex_sprite_idx2
sta SPRITES_YPOS,y
// plexShowSprite::plexFreeAdd1
// ypos+22
// [34] plexShowSprite::plexFreeAdd1_$0 = plexShowSprite::plexFreeAdd1_ypos#0 + $16 -- vbuaa=vbuaa_plus_vbuc1
clc
adc #$16
// PLEX_FREE_YPOS[plex_free_next] = ypos+22
// [35] PLEX_FREE_YPOS[plex_free_next] = plexShowSprite::plexFreeAdd1_$0 -- pbuc1_derefidx_vbuz1=vbuaa
ldy.z plex_free_next
sta PLEX_FREE_YPOS,y
// plex_free_next+1
// [36] plexShowSprite::plexFreeAdd1_$1 = plex_free_next + 1 -- vbuxx=vbuz1_plus_1
ldx.z plex_free_next
inx
// (plex_free_next+1)&7
// [37] plexShowSprite::plexFreeAdd1_$2 = plexShowSprite::plexFreeAdd1_$1 & 7 -- vbuaa=vbuxx_band_vbuc1
txa
and #7
// plex_free_next = (plex_free_next+1)&7
// [38] plex_free_next = plexShowSprite::plexFreeAdd1_$2 -- vbuz1=vbuaa
sta.z plex_free_next
// plexShowSprite::@5
// PLEX_SCREEN_PTR[plex_sprite_idx] = PLEX_PTR[PLEX_SORTED_IDX[plex_show_idx]]
// [39] PLEX_SCREEN_PTR[plex_sprite_idx] = PLEX_PTR[PLEX_SORTED_IDX[plex_show_idx]] -- pbuz1_derefidx_vbuz2=pbuc1_derefidx_(pbuc2_derefidx_vbuz3)
ldx.z plex_show_idx
ldy PLEX_SORTED_IDX,x
lda PLEX_PTR,y
ldy.z plex_sprite_idx
sta (PLEX_SCREEN_PTR),y
// char xpos_idx = PLEX_SORTED_IDX[plex_show_idx]
// [40] plexShowSprite::xpos_idx#0 = PLEX_SORTED_IDX[plex_show_idx] -- vbuaa=pbuc1_derefidx_vbuz1
ldy.z plex_show_idx
lda PLEX_SORTED_IDX,y
// SPRITES_XPOS[plex_sprite_idx2] = (char)PLEX_XPOS[xpos_idx]
// [41] plexShowSprite::$10 = plexShowSprite::xpos_idx#0 << 1 -- vbuxx=vbuaa_rol_1
asl
tax
// [42] SPRITES_XPOS[plexShowSprite::plex_sprite_idx2#0] = (char)PLEX_XPOS[plexShowSprite::$10] -- pbuc1_derefidx_vbuz1=_byte_pwuc2_derefidx_vbuxx
ldy.z plex_sprite_idx2
lda PLEX_XPOS,x
sta SPRITES_XPOS,y
// BYTE1(PLEX_XPOS[xpos_idx])
// [43] plexShowSprite::$2 = byte1 PLEX_XPOS[plexShowSprite::$10] -- vbuaa=_byte1_pwuc1_derefidx_vbuxx
lda PLEX_XPOS+1,x
// if(BYTE1(PLEX_XPOS[xpos_idx])!=0)
// [44] if(plexShowSprite::$2!=0) goto plexShowSprite::@1 -- vbuaa_neq_0_then_la1
cmp #0
bne __b1
// plexShowSprite::@3
// 0xff^plex_sprite_msb
// [45] plexShowSprite::$8 = $ff ^ plex_sprite_msb -- vbuaa=vbuc1_bxor_vbuz1
lda #$ff
eor.z plex_sprite_msb
// *SPRITES_XMSB &= (0xff^plex_sprite_msb)
// [46] *SPRITES_XMSB = *SPRITES_XMSB & plexShowSprite::$8 -- _deref_pbuc1=_deref_pbuc1_band_vbuaa
and SPRITES_XMSB
sta SPRITES_XMSB
// plexShowSprite::@2
__b2:
// plex_sprite_idx+1
// [47] plexShowSprite::$4 = plex_sprite_idx + 1 -- vbuxx=vbuz1_plus_1
ldx.z plex_sprite_idx
inx
// (plex_sprite_idx+1)&7
// [48] plexShowSprite::$5 = plexShowSprite::$4 & 7 -- vbuaa=vbuxx_band_vbuc1
txa
and #7
// plex_sprite_idx = (plex_sprite_idx+1)&7
// [49] plex_sprite_idx = plexShowSprite::$5 -- vbuz1=vbuaa
sta.z plex_sprite_idx
// plex_show_idx++;
// [50] plex_show_idx = ++ plex_show_idx -- vbuz1=_inc_vbuz1
inc.z plex_show_idx
// plex_sprite_msb <<=1
// [51] plex_sprite_msb = plex_sprite_msb << 1 -- vbuz1=vbuz1_rol_1
asl.z plex_sprite_msb
// if(plex_sprite_msb==0)
// [52] if(plex_sprite_msb!=0) goto plexShowSprite::@return -- vbuz1_neq_0_then_la1
lda.z plex_sprite_msb
bne __breturn
// plexShowSprite::@4
// plex_sprite_msb = 1
// [53] plex_sprite_msb = 1 -- vbuz1=vbuc1
lda #1
sta.z plex_sprite_msb
// plexShowSprite::@return
__breturn:
// }
// [54] return
rts
// plexShowSprite::@1
__b1:
// *SPRITES_XMSB |= plex_sprite_msb
// [55] *SPRITES_XMSB = *SPRITES_XMSB | plex_sprite_msb -- _deref_pbuc1=_deref_pbuc1_bor_vbuz1
lda SPRITES_XMSB
ora.z plex_sprite_msb
sta SPRITES_XMSB
jmp __b2
}
// init
// Initialize the program
init: {
// Set the x-positions & pointers
.label xp = 5
// *D011 = VICII_DEN | VICII_RSEL | 3
// [56] *D011 = VICII_DEN|VICII_RSEL|3 -- _deref_pbuc1=vbuc2
lda #VICII_DEN|VICII_RSEL|3
sta D011
// plexInit(SCREEN)
// [57] call plexInit
// Initialize the multiplexer
// [94] phi from init to plexInit [phi:init->plexInit]
jsr plexInit
// [58] phi from init to init::@1 [phi:init->init::@1]
// [58] phi init::xp#2 = $20 [phi:init->init::@1#0] -- vwuz1=vwuc1
lda #<$20
sta.z xp
lda #>$20
sta.z xp+1
// [58] phi init::sx#2 = 0 [phi:init->init::@1#1] -- vbuxx=vbuc1
ldx #0
// [58] phi from init::@1 to init::@1 [phi:init::@1->init::@1]
// [58] phi init::xp#2 = init::xp#1 [phi:init::@1->init::@1#0] -- register_copy
// [58] phi init::sx#2 = init::sx#1 [phi:init::@1->init::@1#1] -- register_copy
// init::@1
__b1:
// PLEX_PTR[sx] = (char)(SPRITE/0x40)
// [59] PLEX_PTR[init::sx#2] = (char)SPRITE/$40 -- pbuc1_derefidx_vbuxx=vbuc2
lda #$ff&SPRITE/$40
sta PLEX_PTR,x
// PLEX_XPOS[sx] = xp
// [60] init::$3 = init::sx#2 << 1 -- vbuaa=vbuxx_rol_1
txa
asl
// [61] PLEX_XPOS[init::$3] = init::xp#2 -- pwuc1_derefidx_vbuaa=vwuz1
tay
lda.z xp
sta PLEX_XPOS,y
lda.z xp+1
sta PLEX_XPOS+1,y
// xp += 9
// [62] init::xp#1 = init::xp#2 + 9 -- vwuz1=vwuz1_plus_vbuc1
lda #9
clc
adc.z xp
sta.z xp
bcc !+
inc.z xp+1
!:
// for(char sx: 0..PLEX_COUNT-1)
// [63] init::sx#1 = ++ init::sx#2 -- vbuxx=_inc_vbuxx
inx
// [64] if(init::sx#1!=PLEX_COUNT-1+1) goto init::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #PLEX_COUNT-1+1
bne __b1
// init::@2
// *SPRITES_ENABLE = 0xff
// [65] *SPRITES_ENABLE = $ff -- _deref_pbuc1=vbuc2
// Enable & initialize sprites
lda #$ff
sta SPRITES_ENABLE
// [66] phi from init::@2 to init::@3 [phi:init::@2->init::@3]
// [66] phi init::ss#2 = 0 [phi:init::@2->init::@3#0] -- vbuxx=vbuc1
ldx #0
// [66] phi from init::@3 to init::@3 [phi:init::@3->init::@3]
// [66] phi init::ss#2 = init::ss#1 [phi:init::@3->init::@3#0] -- register_copy
// init::@3
__b3:
// SPRITES_COLOR[ss] = GREEN
// [67] SPRITES_COLOR[init::ss#2] = GREEN -- pbuc1_derefidx_vbuxx=vbuc2
lda #GREEN
sta SPRITES_COLOR,x
// for(char ss: 0..7)
// [68] init::ss#1 = ++ init::ss#2 -- vbuxx=_inc_vbuxx
inx
// [69] if(init::ss#1!=8) goto init::@3 -- vbuxx_neq_vbuc1_then_la1
cpx #8
bne __b3
// init::@4
// asm
// asm { sei }
// enable the interrupt
sei
// CIA1->INTERRUPT = CIA_INTERRUPT_CLEAR_ALL
// [71] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR_ALL -- _deref_pbuc1=vbuc2
lda #CIA_INTERRUPT_CLEAR_ALL
sta CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT
// *IRQ_ENABLE = IRQ_RASTER
// [72] *IRQ_ENABLE = IRQ_RASTER -- _deref_pbuc1=vbuc2
lda #IRQ_RASTER
sta IRQ_ENABLE
// *IRQ_STATUS = IRQ_RASTER
// [73] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2
sta IRQ_STATUS
// *KERNEL_IRQ = &plex_irq
// [74] *KERNEL_IRQ = &plex_irq -- _deref_qprc1=pprc2
lda #<plex_irq
sta KERNEL_IRQ
lda #>plex_irq
sta KERNEL_IRQ+1
// *VICII_CONTROL1 &= 0x7f
// [75] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2
lda #$7f
and VICII_CONTROL1
sta VICII_CONTROL1
// *RASTER = 0x0
// [76] *RASTER = 0 -- _deref_pbuc1=vbuc2
lda #0
sta RASTER
// asm
// asm { cli }
cli
// init::@return
// }
// [78] return
rts
}
// loop
// The raster loop
loop: {
// The current index into the y-sine
.label sin_idx = 8
// [80] phi from loop to loop::@1 [phi:loop->loop::@1]
// [80] phi loop::sin_idx#6 = 0 [phi:loop->loop::@1#0] -- vbuz1=vbuc1
lda #0
sta.z sin_idx
// loop::@1
// loop::@2
__b2:
// while(!framedone)
// [81] if(framedone) goto loop::@3 -- vboz1_then_la1
lda.z framedone
cmp #0
bne __b3
jmp __b2
// loop::@3
__b3:
// *BORDER_COLOR = RED
// [82] *BORDER_COLOR = RED -- _deref_pbuc1=vbuc2
lda #RED
sta BORDER_COLOR
// [83] loop::y_idx#3 = loop::sin_idx#6 -- vbuxx=vbuz1
ldx.z sin_idx
// [84] phi from loop::@3 to loop::@4 [phi:loop::@3->loop::@4]
// [84] phi loop::sy#2 = 0 [phi:loop::@3->loop::@4#0] -- vbuyy=vbuc1
ldy #0
// [84] phi loop::y_idx#2 = loop::y_idx#3 [phi:loop::@3->loop::@4#1] -- register_copy
// [84] phi from loop::@4 to loop::@4 [phi:loop::@4->loop::@4]
// [84] phi loop::sy#2 = loop::sy#1 [phi:loop::@4->loop::@4#0] -- register_copy
// [84] phi loop::y_idx#2 = loop::y_idx#1 [phi:loop::@4->loop::@4#1] -- register_copy
// loop::@4
__b4:
// PLEX_YPOS[sy] = YSIN[y_idx]
// [85] PLEX_YPOS[loop::sy#2] = YSIN[loop::y_idx#2] -- pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuxx
lda YSIN,x
sta PLEX_YPOS,y
// y_idx += 8
// [86] loop::y_idx#1 = loop::y_idx#2 + 8 -- vbuxx=vbuxx_plus_vbuc1
txa
axs #-[8]
// for(char sy: 0..PLEX_COUNT-1)
// [87] loop::sy#1 = ++ loop::sy#2 -- vbuyy=_inc_vbuyy
iny
// [88] if(loop::sy#1!=PLEX_COUNT-1+1) goto loop::@4 -- vbuyy_neq_vbuc1_then_la1
cpy #PLEX_COUNT-1+1
bne __b4
// loop::@5
// sin_idx +=1
// [89] loop::sin_idx#1 = loop::sin_idx#6 + 1 -- vbuz1=vbuz1_plus_1
inc.z sin_idx
// (*BORDER_COLOR)++;
// [90] *BORDER_COLOR = ++ *BORDER_COLOR -- _deref_pbuc1=_inc__deref_pbuc1
inc BORDER_COLOR
// plexSort()
// [91] call plexSort
// [101] phi from loop::@5 to plexSort [phi:loop::@5->plexSort]
jsr plexSort
// loop::@6
// *BORDER_COLOR = GREEN
// [92] *BORDER_COLOR = GREEN -- _deref_pbuc1=vbuc2
lda #GREEN
sta BORDER_COLOR
// framedone = false
// [93] framedone = false -- vboz1=vboc1
lda #0
sta.z framedone
// [80] phi from loop::@6 to loop::@1 [phi:loop::@6->loop::@1]
// [80] phi loop::sin_idx#6 = loop::sin_idx#1 [phi:loop::@6->loop::@1#0] -- register_copy
jmp __b2
}
// plexInit
// Initialize the multiplexer data structures
// void plexInit(char *screen)
plexInit: {
// plexInit::plexSetScreen1
// PLEX_SCREEN_PTR = screen+0x3f8
// [95] PLEX_SCREEN_PTR = SCREEN+$3f8 -- pbuz1=pbuc1
lda #<SCREEN+$3f8
sta.z PLEX_SCREEN_PTR
lda #>SCREEN+$3f8
sta.z PLEX_SCREEN_PTR+1
// [96] phi from plexInit::plexSetScreen1 to plexInit::@1 [phi:plexInit::plexSetScreen1->plexInit::@1]
// [96] phi plexInit::i#2 = 0 [phi:plexInit::plexSetScreen1->plexInit::@1#0] -- vbuxx=vbuc1
ldx #0
// [96] phi from plexInit::@1 to plexInit::@1 [phi:plexInit::@1->plexInit::@1]
// [96] phi plexInit::i#2 = plexInit::i#1 [phi:plexInit::@1->plexInit::@1#0] -- register_copy
// plexInit::@1
__b1:
// PLEX_SORTED_IDX[i] = i
// [97] PLEX_SORTED_IDX[plexInit::i#2] = plexInit::i#2 -- pbuc1_derefidx_vbuxx=vbuxx
txa
sta PLEX_SORTED_IDX,x
// for(char i: 0..PLEX_COUNT-1)
// [98] plexInit::i#1 = ++ plexInit::i#2 -- vbuxx=_inc_vbuxx
inx
// [99] if(plexInit::i#1!=PLEX_COUNT-1+1) goto plexInit::@1 -- vbuxx_neq_vbuc1_then_la1
cpx #PLEX_COUNT-1+1
bne __b1
// plexInit::@return
// }
// [100] return
rts
}
// plexSort
// Ensure that the indices in PLEX_SORTED_IDX is sorted based on the y-positions in PLEX_YPOS
// Assumes that the positions are nearly sorted already (as each sprite just moves a bit)
// Uses an insertion sort:
// 1. Moves a marker (m) from the start to end of the array. Every time the marker moves forward all elements before the marker are sorted correctly.
// 2a. If the next element after the marker is larger that the current element
// the marker can be moved forwards (as the sorting is correct).
// 2b. If the next element after the marker is smaller than the current element:
// elements before the marker are shifted right one at a time until encountering one smaller than the current one.
// It is then inserted at the spot. Now the marker can move forward.
plexSort: {
.label nxt_idx = 4
.label nxt_y = 3
.label m = 2
// [102] phi from plexSort to plexSort::@1 [phi:plexSort->plexSort::@1]
// [102] phi plexSort::m#2 = 0 [phi:plexSort->plexSort::@1#0] -- vbuz1=vbuc1
lda #0
sta.z m
// [102] phi from plexSort::@2 to plexSort::@1 [phi:plexSort::@2->plexSort::@1]
// [102] phi plexSort::m#2 = plexSort::m#1 [phi:plexSort::@2->plexSort::@1#0] -- register_copy
// plexSort::@1
__b1:
// char nxt_idx = PLEX_SORTED_IDX[m+1]
// [103] plexSort::nxt_idx#0 = (PLEX_SORTED_IDX+1)[plexSort::m#2] -- vbuz1=pbuc1_derefidx_vbuz2
ldy.z m
lda PLEX_SORTED_IDX+1,y
sta.z nxt_idx
// char nxt_y = PLEX_YPOS[nxt_idx]
// [104] plexSort::nxt_y#0 = PLEX_YPOS[plexSort::nxt_idx#0] -- vbuz1=pbuc1_derefidx_vbuz2
tay
lda PLEX_YPOS,y
sta.z nxt_y
// if(nxt_y<PLEX_YPOS[PLEX_SORTED_IDX[m]])
// [105] if(plexSort::nxt_y#0>=PLEX_YPOS[PLEX_SORTED_IDX[plexSort::m#2]]) goto plexSort::@2 -- vbuz1_ge_pbuc1_derefidx_(pbuc2_derefidx_vbuz2)_then_la1
ldx.z m
ldy PLEX_SORTED_IDX,x
cmp PLEX_YPOS,y
bcs __b2
// plexSort::@5
// [106] plexSort::s#6 = plexSort::m#2 -- vbuxx=vbuz1
// [107] phi from plexSort::@5 plexSort::@7 to plexSort::@3 [phi:plexSort::@5/plexSort::@7->plexSort::@3]
// [107] phi plexSort::s#3 = plexSort::s#6 [phi:plexSort::@5/plexSort::@7->plexSort::@3#0] -- register_copy
// plexSort::@3
__b3:
// PLEX_SORTED_IDX[s+1] = PLEX_SORTED_IDX[s]
// [108] (PLEX_SORTED_IDX+1)[plexSort::s#3] = PLEX_SORTED_IDX[plexSort::s#3] -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx
lda PLEX_SORTED_IDX,x
sta PLEX_SORTED_IDX+1,x
// s--;
// [109] plexSort::s#1 = -- plexSort::s#3 -- vbuxx=_dec_vbuxx
dex
// while((s!=0xff) && (nxt_y<PLEX_YPOS[PLEX_SORTED_IDX[s]]))
// [110] if(plexSort::s#1==$ff) goto plexSort::@4 -- vbuxx_eq_vbuc1_then_la1
cpx #$ff
beq __b4
// plexSort::@7
// [111] if(plexSort::nxt_y#0<PLEX_YPOS[PLEX_SORTED_IDX[plexSort::s#1]]) goto plexSort::@3 -- vbuz1_lt_pbuc1_derefidx_(pbuc2_derefidx_vbuxx)_then_la1
lda.z nxt_y
ldy PLEX_SORTED_IDX,x
cmp PLEX_YPOS,y
bcc __b3
// plexSort::@4
__b4:
// s++;
// [112] plexSort::s#2 = ++ plexSort::s#1 -- vbuxx=_inc_vbuxx
inx
// PLEX_SORTED_IDX[s] = nxt_idx
// [113] PLEX_SORTED_IDX[plexSort::s#2] = plexSort::nxt_idx#0 -- pbuc1_derefidx_vbuxx=vbuz1
lda.z nxt_idx
sta PLEX_SORTED_IDX,x
// plexSort::@2
__b2:
// for(char m: 0..PLEX_COUNT-2)
// [114] plexSort::m#1 = ++ plexSort::m#2 -- vbuz1=_inc_vbuz1
inc.z m
// [115] if(plexSort::m#1!=PLEX_COUNT-2+1) goto plexSort::@1 -- vbuz1_neq_vbuc1_then_la1
lda #PLEX_COUNT-2+1
cmp.z m
bne __b1
// plexSort::@6
// plex_show_idx = 0
// [116] plex_show_idx = 0 -- vbuz1=vbuc1
// Prepare for showing the sprites
lda #0
sta.z plex_show_idx
// plex_sprite_idx = 0
// [117] plex_sprite_idx = 0 -- vbuz1=vbuc1
sta.z plex_sprite_idx
// plex_sprite_msb = 1
// [118] plex_sprite_msb = 1 -- vbuz1=vbuc1
lda #1
sta.z plex_sprite_msb
// [119] phi from plexSort::@6 to plexSort::plexFreePrepare1 [phi:plexSort::@6->plexSort::plexFreePrepare1]
// plexSort::plexFreePrepare1
// [120] phi from plexSort::plexFreePrepare1 to plexSort::plexFreePrepare1_@1 [phi:plexSort::plexFreePrepare1->plexSort::plexFreePrepare1_@1]
// [120] phi plexSort::plexFreePrepare1_s#2 = 0 [phi:plexSort::plexFreePrepare1->plexSort::plexFreePrepare1_@1#0] -- vbuxx=vbuc1
ldx #0
// [120] phi from plexSort::plexFreePrepare1_@1 to plexSort::plexFreePrepare1_@1 [phi:plexSort::plexFreePrepare1_@1->plexSort::plexFreePrepare1_@1]
// [120] phi plexSort::plexFreePrepare1_s#2 = plexSort::plexFreePrepare1_s#1 [phi:plexSort::plexFreePrepare1_@1->plexSort::plexFreePrepare1_@1#0] -- register_copy
// plexSort::plexFreePrepare1_@1
plexFreePrepare1___b1:
// PLEX_FREE_YPOS[s] = 0
// [121] PLEX_FREE_YPOS[plexSort::plexFreePrepare1_s#2] = 0 -- pbuc1_derefidx_vbuxx=vbuc2
lda #0
sta PLEX_FREE_YPOS,x
// for( char s: 0..7)
// [122] plexSort::plexFreePrepare1_s#1 = ++ plexSort::plexFreePrepare1_s#2 -- vbuxx=_inc_vbuxx
inx
// [123] if(plexSort::plexFreePrepare1_s#1!=8) goto plexSort::plexFreePrepare1_@1 -- vbuxx_neq_vbuc1_then_la1
cpx #8
bne plexFreePrepare1___b1
// plexSort::plexFreePrepare1_@2
// plex_free_next = 0
// [124] plex_free_next = 0 -- vbuz1=vbuc1
sta.z plex_free_next
// plexSort::@return
// }
// [125] return
rts
}
// File Data
.segment Data
// The x-positions of the multiplexer sprites (0x000-0x1ff)
PLEX_XPOS: .fill 2*PLEX_COUNT, 0
// The y-positions of the multiplexer sprites.
PLEX_YPOS: .fill PLEX_COUNT, 0
// The sprite pointers for the multiplexed sprites
PLEX_PTR: .fill PLEX_COUNT, 0
// Indexes of the plex-sprites sorted by sprite y-position. Each call to plexSort() will fix the sorting if changes to the Y-positions have ruined it.
PLEX_SORTED_IDX: .fill PLEX_COUNT, 0
// Contains the Y-position where each sprite is free again. PLEX_FREE_YPOS[s] holds the Y-position where sprite s is free to use again.
PLEX_FREE_YPOS: .fill 8, 0
.align $40
SPRITE:
.var pic = LoadPicture("balloon.png", List().add($000000, $ffffff))
.for (var y=0; y<21; y++)
.for (var x=0;x<3; x++)
.byte pic.getSinglecolorByte(x,y)
.align $100
YSIN:
.fill $100, round(139.5+89.5*sin(toRadians(360*i/256)))