Loading link script "demo.ld"
Resolved forward reference irq_demo to __interrupt(hardware_clobber) void irq_demo()
Resolved forward reference sparkler_active to sparkler_active
Resolved forward reference IRQ_PART1_TOP_LINE to IRQ_PART1_TOP_LINE
Resolved forward reference irq_part1_top to __interrupt(hardware_clobber) void irq_part1_top()
Resolved forward reference sparkler_active to sparkler_active
Resolved forward reference sparkler_active to sparkler_active
Resolved forward reference irq_flipper_top to __interrupt(hardware_clobber) void irq_flipper_top()
Resolved forward reference irq_flipper_bottom to __interrupt(hardware_clobber) void irq_flipper_bottom()
Resolved forward reference PLEX_ID_UPDATERS_CRUNCHED to PLEX_ID_UPDATERS_CRUNCHED
Resolved forward reference irq_swing_top to __interrupt(hardware_clobber) void irq_swing_top()
Resolved forward reference plex_frame_id to plex_frame_id
Resolved forward reference plex_frame to plex_frame
Resolved forward reference plex_id_offset to plex_id_offset
Resolved forward reference p2_work_ready to p2_work_ready
Resolved forward reference p2_work_ready to p2_work_ready
Resolved forward reference p2_logo_reveal_done to p2_logo_reveal_done
Resolved forward reference p2_logo_revealing to p2_logo_revealing
Resolved forward reference p2_logo_revealing to p2_logo_revealing
Resolved forward reference p2_logo_swinging to p2_logo_swinging
Resolved forward reference p2_logo_reveal_done to p2_logo_reveal_done
Resolved forward reference p2_logo_revealing to p2_logo_revealing
Resolved forward reference p2_plex_scroller_moving to p2_plex_scroller_moving
Resolved forward reference p2_logo_swinging to p2_logo_swinging
Resolved forward reference p2_work_ready to p2_work_ready
Resolved forward reference p2_plex_scroller_moving to p2_plex_scroller_moving
Resolved forward reference irq_swing_vsp to __interrupt(hardware_clobber) void irq_swing_vsp()
Resolved forward reference irq_swing_plex to __interrupt(hardware_clobber) void irq_swing_plex()
Resolved forward reference sparkler_active to sparkler_active
Setting inferred volatile on symbol affected by address-of: byteboozer_decrunch::crunched in asm { ldycrunched ldxcrunched+1 jsrb2.Decrunch  }
Setting inferred volatile on symbol affected by address-of: raster_fine::line_offset in kickasm( uses raster_fine::line_offset uses RASTER_BADLINES) {{ jmp aligned
        .align $100
    aligned:
        ldy RASTER
        ldx line_offset
        inx
    rst:
        nop 
        nop 
        nop 
        nop
        dex                             // 2
        beq done                        // 2
        lda RASTER_BADLINES,y           // 4
        beq notbad                      // 3
    bad:
        nop                             // 2
        nop 
        nop 
        nop 
        nop
        dex                             
        beq done                        
        iny                             
        nop                             
        bit $ea                         
    notbad:
        .fill 18, NOP
        bit $ea
        iny                             
        jmp rst                         
    done:
     }}
Setting inferred volatile on symbol affected by address-of: update_frame_plex_id_offset::jmp_address in kickasm( uses update_frame_plex_id_offset::jmp_address) {{ lda jmp_address
        sta call+1
        lda jmp_address+1
        sta call+2
        call: jsr $0000
     }}
Setting inferred volatile on symbol affected by address-of: vsp_update_screen::x_offset in kickasm( uses vsp_update_screen::x_offset uses PART2_SCREEN uses COLS uses LOGO_DATA uses LOGO_DATA_COLORS) {{ ldx x_offset
        .for(var row=0;row<24;row++) {
            lda LOGO_DATA+80*row,x
            sta PART2_SCREEN+40*row,x
            lda LOGO_DATA_COLORS+80*row,x
            sta COLS+40*row,x
        }
     }}
Setting inferred volatile on symbol affected by address-of: vsp_update_screen::x_offset8 in kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+row*40*8+pix,y
                }
         }}
Inlined call vicSelectGfxBank::$0 = call toDd00(vicSelectGfxBank::gfx)
Inlined call call CLI
Inlined call call SEI
Inlined call part1_run::$1 = call toSpritePtr(P1_SPRITES)
Inlined call call CLI
Inlined call irq_part1_top::$0 = call toDd00(P1_SCREEN)
Inlined call irq_part1_top::$1 = call toD018(P1_SCREEN, P1_PIXELS)
Inlined call irq_flipper_bottom::$3 = call toD018(LOAD_SCREEN, LOAD_CHARSET)
Inlined call part2_init::$16 = call toSpritePtr(PART2_SPRITES)
Inlined call call SEI
Inlined call part2_run::$1 = call toDd00(PART2_SCREEN)
Inlined call part2_run::$2 = call toD018(PART2_SCREEN, PART2_BITMAP)
Inlined call call CLI
Inlined call plex_scroller_move::$7 = call toSpritePtr(PART2_SPRITES)
Inlined call call vsp_perform
Inlined call call SEI
Inlined call sparkler_anim::$2 = call toSpritePtr(P1_SPRITES)
Inlined call call __init
Eliminating unused variable with no statement memcpy::$0
Eliminating unused variable with no statement memset::$2
Eliminating unused variable with no statement flipper_fix_colors::$8
Eliminating unused variable with no statement flipper_fix_colors::$9
Eliminating unused variable with no statement flipper_fix_colors::$10
Eliminating unused variable with no statement plexBucketShow::$0
Eliminating unused variable with no statement irq_swing_plex::$8
Eliminating unused variable with no statement irq_swing_plex::$12
Eliminating unused variable with no statement irq_swing_plex::$14
Eliminating unused variable with no statement vsp_update_screen::$0
Calling convention STACK_CALL adding prepare/execute/finalize for call *musicPlay 
Calling convention STACK_CALL adding prepare/execute/finalize for call *musicInit 

CONTROL FLOW GRAPH SSA

void * memcpy(void *destination , void *source , unsigned int num)
memcpy: scope:[memcpy]  from part1_init::@7 part1_init::@8 part1_init::@9 part2_init::@14 part2_init::@15 part2_init::@3
  memcpy::num#6 = phi( part1_init::@7/memcpy::num#0, part1_init::@8/memcpy::num#1, part1_init::@9/memcpy::num#2, part2_init::@14/memcpy::num#3, part2_init::@15/memcpy::num#4, part2_init::@3/memcpy::num#5 )
  memcpy::destination#6 = phi( part1_init::@7/memcpy::destination#0, part1_init::@8/memcpy::destination#1, part1_init::@9/memcpy::destination#2, part2_init::@14/memcpy::destination#3, part2_init::@15/memcpy::destination#4, part2_init::@3/memcpy::destination#5 )
  memcpy::source#6 = phi( part1_init::@7/memcpy::source#0, part1_init::@8/memcpy::source#1, part1_init::@9/memcpy::source#2, part2_init::@14/memcpy::source#3, part2_init::@15/memcpy::source#4, part2_init::@3/memcpy::source#5 )
  memcpy::src#0 = ((char *)) memcpy::source#6
  memcpy::dst#0 = ((char *)) memcpy::destination#6
  memcpy::$2 = (char *)memcpy::source#6
  memcpy::src_end#0 = memcpy::$2 + memcpy::num#6
  to:memcpy::@1
memcpy::@1: scope:[memcpy]  from memcpy memcpy::@2
  memcpy::destination#8 = phi( memcpy/memcpy::destination#6, memcpy::@2/memcpy::destination#9 )
  memcpy::dst#3 = phi( memcpy/memcpy::dst#0, memcpy::@2/memcpy::dst#1 )
  memcpy::src_end#1 = phi( memcpy/memcpy::src_end#0, memcpy::@2/memcpy::src_end#2 )
  memcpy::src#2 = phi( memcpy/memcpy::src#0, memcpy::@2/memcpy::src#1 )
  memcpy::$1 = memcpy::src#2 != memcpy::src_end#1
  if(memcpy::$1) goto memcpy::@2
  to:memcpy::@3
memcpy::@2: scope:[memcpy]  from memcpy::@1
  memcpy::destination#9 = phi( memcpy::@1/memcpy::destination#8 )
  memcpy::src_end#2 = phi( memcpy::@1/memcpy::src_end#1 )
  memcpy::dst#2 = phi( memcpy::@1/memcpy::dst#3 )
  memcpy::src#3 = phi( memcpy::@1/memcpy::src#2 )
  *memcpy::dst#2 = *memcpy::src#3
  memcpy::dst#1 = ++ memcpy::dst#2
  memcpy::src#1 = ++ memcpy::src#3
  to:memcpy::@1
memcpy::@3: scope:[memcpy]  from memcpy::@1
  memcpy::destination#7 = phi( memcpy::@1/memcpy::destination#8 )
  memcpy::return#0 = memcpy::destination#7
  to:memcpy::@return
memcpy::@return: scope:[memcpy]  from memcpy::@3
  memcpy::return#8 = phi( memcpy::@3/memcpy::return#0 )
  memcpy::return#1 = memcpy::return#8
  return 
  to:@return

void * memset(void *str , char c , unsigned int num)
memset: scope:[memset]  from part1_init::@6 part2_init::@12 part2_init::@18 part2_init::@19 part2_init::@20
  memset::c#8 = phi( part1_init::@6/memset::c#0, part2_init::@12/memset::c#4, part2_init::@18/memset::c#1, part2_init::@19/memset::c#2, part2_init::@20/memset::c#3 )
  memset::str#7 = phi( part1_init::@6/memset::str#0, part2_init::@12/memset::str#4, part2_init::@18/memset::str#1, part2_init::@19/memset::str#2, part2_init::@20/memset::str#3 )
  memset::num#5 = phi( part1_init::@6/memset::num#0, part2_init::@12/memset::num#4, part2_init::@18/memset::num#1, part2_init::@19/memset::num#2, part2_init::@20/memset::num#3 )
  memset::$0 = memset::num#5 > 0
  memset::$1 = ! memset::$0
  if(memset::$1) goto memset::@1
  to:memset::@2
memset::@1: scope:[memset]  from memset memset::@3
  memset::str#5 = phi( memset/memset::str#7, memset::@3/memset::str#8 )
  memset::return#0 = memset::str#5
  to:memset::@return
memset::@2: scope:[memset]  from memset
  memset::c#7 = phi( memset/memset::c#8 )
  memset::num#6 = phi( memset/memset::num#5 )
  memset::str#6 = phi( memset/memset::str#7 )
  memset::$4 = (char *)memset::str#6
  memset::end#0 = memset::$4 + memset::num#6
  memset::dst#0 = ((char *)) memset::str#6
  to:memset::@3
memset::@3: scope:[memset]  from memset::@2 memset::@4
  memset::c#6 = phi( memset::@2/memset::c#7, memset::@4/memset::c#5 )
  memset::str#8 = phi( memset::@2/memset::str#6, memset::@4/memset::str#9 )
  memset::end#1 = phi( memset::@2/memset::end#0, memset::@4/memset::end#2 )
  memset::dst#2 = phi( memset::@2/memset::dst#0, memset::@4/memset::dst#1 )
  memset::$3 = memset::dst#2 != memset::end#1
  if(memset::$3) goto memset::@4
  to:memset::@1
memset::@4: scope:[memset]  from memset::@3
  memset::str#9 = phi( memset::@3/memset::str#8 )
  memset::end#2 = phi( memset::@3/memset::end#1 )
  memset::dst#3 = phi( memset::@3/memset::dst#2 )
  memset::c#5 = phi( memset::@3/memset::c#6 )
  *memset::dst#3 = memset::c#5
  memset::dst#1 = ++ memset::dst#3
  to:memset::@3
memset::@return: scope:[memset]  from memset::@1
  memset::return#7 = phi( memset::@1/memset::return#0 )
  memset::return#1 = memset::return#7
  return 
  to:@return

void demo_start()
demo_start: scope:[demo_start]  from main::@1 part1_loop::@6
  call demo_init
  to:demo_start::@1
demo_start::@1: scope:[demo_start]  from demo_start
  *VICII_CONTROL1 = *VICII_CONTROL1 & $7f
  *RASTER = 0
  *HARDWARE_IRQ = &irq_demo
  *IRQ_ENABLE = IRQ_RASTER
  to:demo_start::CLI1
demo_start::CLI1: scope:[demo_start]  from demo_start::@1
  asm { cli  }
  to:demo_start::@return
demo_start::@return: scope:[demo_start]  from demo_start::CLI1
  return 
  to:@return

void demo_work()
demo_work: scope:[demo_work]  from irq_demo part1_loop::@4 part2_loop::@2
  demo_frame_count = ++ demo_frame_count
  callexecute *musicPlay 
  to:demo_work::@1
demo_work::@1: scope:[demo_work]  from demo_work
  demo_work::$3 = 0 != sparkler_active
  demo_work::$1 = ! demo_work::$3
  if(demo_work::$1) goto demo_work::@return
  to:demo_work::@2
demo_work::@2: scope:[demo_work]  from demo_work::@1
  call sparkler_anim
  to:demo_work::@3
demo_work::@3: scope:[demo_work]  from demo_work::@2
  to:demo_work::@return
demo_work::@return: scope:[demo_work]  from demo_work::@1 demo_work::@3
  return 
  to:@return

void byteboozer_decrunch(char * volatile crunched)
byteboozer_decrunch: scope:[byteboozer_decrunch]  from main::@7 part1_init part1_init::@1 part1_init::@2 part1_init::@3 part1_init::@4 part2_init part2_init::@16 part2_init::@17
  asm { ldycrunched ldxcrunched+1 jsrb2.Decrunch  }
  to:byteboozer_decrunch::@return
byteboozer_decrunch::@return: scope:[byteboozer_decrunch]  from byteboozer_decrunch
  return 
  to:@return

void part1_init()
part1_init: scope:[part1_init]  from main::@9
  *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  *PROCPORT = PROCPORT_RAM_ALL
  byteboozer_decrunch::crunched = P1_PIXELS_CRUNCHED
  call byteboozer_decrunch
  to:part1_init::@1
part1_init::@1: scope:[part1_init]  from part1_init
  *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  *PROCPORT = PROCPORT_RAM_IO
  byteboozer_decrunch::crunched = P1_SCREEN_CRUNCHED
  call byteboozer_decrunch
  to:part1_init::@2
part1_init::@2: scope:[part1_init]  from part1_init::@1
  byteboozer_decrunch::crunched = P1_COLORS_CRUNCHED
  call byteboozer_decrunch
  to:part1_init::@3
part1_init::@3: scope:[part1_init]  from part1_init::@2
  byteboozer_decrunch::crunched = P1_SPRITES_CRUNCHED
  call byteboozer_decrunch
  to:part1_init::@4
part1_init::@4: scope:[part1_init]  from part1_init::@3
  byteboozer_decrunch::crunched = FLIPPER_EASING_CRUNCHED
  call byteboozer_decrunch
  to:part1_init::@5
part1_init::@5: scope:[part1_init]  from part1_init::@4
  call init_rasters
  to:part1_init::@6
part1_init::@6: scope:[part1_init]  from part1_init::@5
  memset::str#0 = (void *)PIXELS_EMPTY
  memset::c#0 = 0
  memset::num#0 = $800
  call memset
  memset::return#2 = memset::return#1
  to:part1_init::@7
part1_init::@7: scope:[part1_init]  from part1_init::@6
  *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  *PROCPORT = PROCPORT_RAM_CHARROM
  memcpy::destination#0 = (void *)LOAD_CHARSET
  memcpy::source#0 = (void *)CHARGEN
  memcpy::num#0 = $800
  call memcpy
  memcpy::return#2 = memcpy::return#1
  to:part1_init::@8
part1_init::@8: scope:[part1_init]  from part1_init::@7
  *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  *PROCPORT = PROCPORT_RAM_IO
  memcpy::destination#1 = (void *)LOAD_SCREEN
  memcpy::source#1 = (void *)DEFAULT_SCREEN
  memcpy::num#1 = $400
  call memcpy
  memcpy::return#3 = memcpy::return#1
  to:part1_init::@9
part1_init::@9: scope:[part1_init]  from part1_init::@8
  memcpy::destination#2 = (void *)LOAD_COLORS
  memcpy::source#2 = (void *)COLS
  memcpy::num#2 = $3e8
  call memcpy
  memcpy::return#4 = memcpy::return#1
  to:part1_init::@10
part1_init::@10: scope:[part1_init]  from part1_init::@9
  to:part1_init::@return
part1_init::@return: scope:[part1_init]  from part1_init::@10
  return 
  to:@return

void part1_run()
part1_run: scope:[part1_run]  from main::@3
  to:part1_run::SEI1
part1_run::SEI1: scope:[part1_run]  from part1_run
  asm { sei  }
  to:part1_run::@1
part1_run::@1: scope:[part1_run]  from part1_run::SEI1
  *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  *PROCPORT = PROCPORT_RAM_IO
  *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR
  asm { ldaCIA1_INTERRUPT  }
  *IRQ_STATUS = $f
  *VICII_CONTROL1 = *VICII_CONTROL1 | $80
  *RASTER = IRQ_PART1_TOP_LINE
  *HARDWARE_IRQ = &irq_part1_top
  *IRQ_ENABLE = IRQ_RASTER
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = 1
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR) = PINK
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1) = YELLOW
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2) = PURPLE
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = 1
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_X) = $16
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_Y) = $be
  part1_run::toSpritePtr1_sprite#0 = P1_SPRITES
  to:part1_run::toSpritePtr1
part1_run::toSpritePtr1: scope:[part1_run]  from part1_run::@1
  part1_run::toSpritePtr1_sprite#1 = phi( part1_run::@1/part1_run::toSpritePtr1_sprite#0 )
  part1_run::toSpritePtr1_$1 = (unsigned int)part1_run::toSpritePtr1_sprite#1
  part1_run::toSpritePtr1_$0 = part1_run::toSpritePtr1_$1 / $40
  part1_run::toSpritePtr1_return#0 = (char)part1_run::toSpritePtr1_$0
  to:part1_run::toSpritePtr1_@return
part1_run::toSpritePtr1_@return: scope:[part1_run]  from part1_run::toSpritePtr1
  part1_run::toSpritePtr1_return#2 = phi( part1_run::toSpritePtr1/part1_run::toSpritePtr1_return#0 )
  part1_run::toSpritePtr1_return#1 = part1_run::toSpritePtr1_return#2
  to:part1_run::@2
part1_run::@2: scope:[part1_run]  from part1_run::toSpritePtr1_@return
  part1_run::toSpritePtr1_return#3 = phi( part1_run::toSpritePtr1_@return/part1_run::toSpritePtr1_return#1 )
  part1_run::$1 = part1_run::toSpritePtr1_return#3
  P1_SCREEN_SPRITE_PTRS[0] = part1_run::$1
  to:part1_run::CLI1
part1_run::CLI1: scope:[part1_run]  from part1_run::@2
  asm { cli  }
  to:part1_run::@3
part1_run::@3: scope:[part1_run]  from part1_run::CLI1
  call part1_loop
  to:part1_run::@4
part1_run::@4: scope:[part1_run]  from part1_run::@3
  to:part1_run::@return
part1_run::@return: scope:[part1_run]  from part1_run::@4
  return 
  to:@return

void part1_loop()
part1_loop: scope:[part1_loop]  from part1_run::@3
  p1_work_ready = 0
  to:part1_loop::@1
part1_loop::@1: scope:[part1_loop]  from part1_loop part1_loop::@1 part1_loop::@5
  part1_loop::$0 = p1_work_ready == 0
  if(part1_loop::$0) goto part1_loop::@1
  to:part1_loop::@2
part1_loop::@2: scope:[part1_loop]  from part1_loop::@1
  call flipper_fix_colors
  to:part1_loop::@7
part1_loop::@7: scope:[part1_loop]  from part1_loop::@2
  part1_loop::$10 = 0 != sparkler_active
  part1_loop::$2 = ! part1_loop::$10
  part1_loop::$3 = demo_frame_count > 9*$32-3
  part1_loop::$4 = part1_loop::$2 && part1_loop::$3
  part1_loop::$5 = ! part1_loop::$4
  if(part1_loop::$5) goto part1_loop::@4
  to:part1_loop::@3
part1_loop::@4: scope:[part1_loop]  from part1_loop::@3 part1_loop::@7
  call demo_work
  to:part1_loop::@8
part1_loop::@8: scope:[part1_loop]  from part1_loop::@4
  part1_loop::$7 = demo_frame_count > $e*$32
  part1_loop::$8 = ! part1_loop::$7
  if(part1_loop::$8) goto part1_loop::@5
  to:part1_loop::@6
part1_loop::@3: scope:[part1_loop]  from part1_loop::@7
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 1
  sparkler_active = 1
  to:part1_loop::@4
part1_loop::@5: scope:[part1_loop]  from part1_loop::@8
  p1_work_ready = 0
  to:part1_loop::@1
part1_loop::@6: scope:[part1_loop]  from part1_loop::@8
  call demo_start
  to:part1_loop::@9
part1_loop::@9: scope:[part1_loop]  from part1_loop::@6
  to:part1_loop::@return
part1_loop::@return: scope:[part1_loop]  from part1_loop::@9
  return 
  to:@return

void init_rasters()
init_rasters: scope:[init_rasters]  from part1_init::@5
  init_rasters::i#0 = 0
  to:init_rasters::@1
init_rasters::@1: scope:[init_rasters]  from init_rasters init_rasters::@2
  init_rasters::i#2 = phi( init_rasters/init_rasters::i#0, init_rasters::@2/init_rasters::i#1 )
  init_rasters::$0 = sizeof  RASTER_BADLINES
  init_rasters::$1 = init_rasters::i#2 < init_rasters::$0
  if(init_rasters::$1) goto init_rasters::@2
  to:init_rasters::@3
init_rasters::@2: scope:[init_rasters]  from init_rasters::@1
  init_rasters::i#3 = phi( init_rasters::@1/init_rasters::i#2 )
  RASTER_BADLINES[init_rasters::i#3] = 0
  init_rasters::i#1 = ++ init_rasters::i#3
  to:init_rasters::@1
init_rasters::@3: scope:[init_rasters]  from init_rasters::@1
  init_rasters::b#0 = $32
  to:init_rasters::@4
init_rasters::@4: scope:[init_rasters]  from init_rasters::@3 init_rasters::@5
  init_rasters::b#2 = phi( init_rasters::@3/init_rasters::b#0, init_rasters::@5/init_rasters::b#1 )
  init_rasters::$2 = init_rasters::b#2 < $fa
  if(init_rasters::$2) goto init_rasters::@5
  to:init_rasters::@return
init_rasters::@5: scope:[init_rasters]  from init_rasters::@4
  init_rasters::b#3 = phi( init_rasters::@4/init_rasters::b#2 )
  RASTER_BADLINES[init_rasters::b#3] = 1
  init_rasters::b#1 = init_rasters::b#3 + 8
  to:init_rasters::@4
init_rasters::@return: scope:[init_rasters]  from init_rasters::@4
  return 
  to:@return

__interrupt(hardware_clobber) void irq_part1_top()
irq_part1_top: scope:[irq_part1_top]  from
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = BLACK
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLACK
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) | VICII_MCM
  irq_part1_top::toDd001_gfx#0 = P1_SCREEN
  to:irq_part1_top::toDd001
irq_part1_top::toDd001: scope:[irq_part1_top]  from irq_part1_top
  irq_part1_top::toDd001_gfx#1 = phi( irq_part1_top/irq_part1_top::toDd001_gfx#0 )
  irq_part1_top::toDd001_$0 = byte1  (unsigned int)irq_part1_top::toDd001_gfx#1
  irq_part1_top::toDd001_$1 = irq_part1_top::toDd001_$0 / $40
  irq_part1_top::toDd001_$2 = 3 ^ irq_part1_top::toDd001_$1
  irq_part1_top::toDd001_return#0 = irq_part1_top::toDd001_$2
  to:irq_part1_top::toDd001_@return
irq_part1_top::toDd001_@return: scope:[irq_part1_top]  from irq_part1_top::toDd001
  irq_part1_top::toDd001_return#2 = phi( irq_part1_top::toDd001/irq_part1_top::toDd001_return#0 )
  irq_part1_top::toDd001_return#1 = irq_part1_top::toDd001_return#2
  to:irq_part1_top::@4
irq_part1_top::@4: scope:[irq_part1_top]  from irq_part1_top::toDd001_@return
  irq_part1_top::toDd001_return#3 = phi( irq_part1_top::toDd001_@return/irq_part1_top::toDd001_return#1 )
  irq_part1_top::$0 = irq_part1_top::toDd001_return#3
  *((char *)CIA2+OFFSET_STRUCT_MOS6526_CIA_PORT_A) = irq_part1_top::$0
  irq_part1_top::toD0181_screen#0 = P1_SCREEN
  irq_part1_top::toD0181_gfx#0 = P1_PIXELS
  to:irq_part1_top::toD0181
irq_part1_top::toD0181: scope:[irq_part1_top]  from irq_part1_top::@4
  irq_part1_top::toD0181_gfx#1 = phi( irq_part1_top::@4/irq_part1_top::toD0181_gfx#0 )
  irq_part1_top::toD0181_screen#1 = phi( irq_part1_top::@4/irq_part1_top::toD0181_screen#0 )
  irq_part1_top::toD0181_$7 = (unsigned int)irq_part1_top::toD0181_screen#1
  irq_part1_top::toD0181_$0 = irq_part1_top::toD0181_$7 & $3fff
  irq_part1_top::toD0181_$1 = irq_part1_top::toD0181_$0 * 4
  irq_part1_top::toD0181_$2 = byte1  irq_part1_top::toD0181_$1
  irq_part1_top::toD0181_$3 = byte1  (unsigned int)irq_part1_top::toD0181_gfx#1
  irq_part1_top::toD0181_$4 = irq_part1_top::toD0181_$3 / 4
  irq_part1_top::toD0181_$5 = irq_part1_top::toD0181_$4 & $f
  irq_part1_top::toD0181_$6 = irq_part1_top::toD0181_$2 | irq_part1_top::toD0181_$5
  irq_part1_top::toD0181_return#0 = irq_part1_top::toD0181_$6
  to:irq_part1_top::toD0181_@return
irq_part1_top::toD0181_@return: scope:[irq_part1_top]  from irq_part1_top::toD0181
  irq_part1_top::toD0181_return#2 = phi( irq_part1_top::toD0181/irq_part1_top::toD0181_return#0 )
  irq_part1_top::toD0181_return#1 = irq_part1_top::toD0181_return#2
  to:irq_part1_top::@5
irq_part1_top::@5: scope:[irq_part1_top]  from irq_part1_top::toD0181_@return
  irq_part1_top::toD0181_return#3 = phi( irq_part1_top::toD0181_@return/irq_part1_top::toD0181_return#1 )
  irq_part1_top::$1 = irq_part1_top::toD0181_return#3
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = irq_part1_top::$1
  irq_part1_top::$2 = byte1  irq_flipper_top_line
  irq_part1_top::$5 = 0 != irq_part1_top::$2
  if(irq_part1_top::$5) goto irq_part1_top::@1
  to:irq_part1_top::@3
irq_part1_top::@1: scope:[irq_part1_top]  from irq_part1_top::@5
  *VICII_CONTROL1 = *VICII_CONTROL1 | $80
  to:irq_part1_top::@2
irq_part1_top::@3: scope:[irq_part1_top]  from irq_part1_top::@5
  *VICII_CONTROL1 = *VICII_CONTROL1 & $7f
  to:irq_part1_top::@2
irq_part1_top::@2: scope:[irq_part1_top]  from irq_part1_top::@1 irq_part1_top::@3
  irq_part1_top::$3 = byte0  irq_flipper_top_line
  irq_part1_top::$4 = irq_part1_top::$3 & $f8
  *RASTER = irq_part1_top::$4
  *HARDWARE_IRQ = &irq_flipper_top
  p1_work_ready = 1
  *IRQ_STATUS = IRQ_RASTER
  to:irq_part1_top::@return
irq_part1_top::@return: scope:[irq_part1_top]  from irq_part1_top::@2
  return 
  to:@return

__interrupt(hardware_clobber) void irq_flipper_top()
irq_flipper_top: scope:[irq_flipper_top]  from
  asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop  }
  irq_flipper_top::$0 = byte0  irq_flipper_top_line
  irq_flipper_top::$1 = irq_flipper_top::$0 & 7
  raster_fine::line_offset = irq_flipper_top::$1
  call raster_fine
  to:irq_flipper_top::@4
irq_flipper_top::@4: scope:[irq_flipper_top]  from irq_flipper_top
  asm { lda#$9a ldx#LIGHT_GREEN ldy#$1b staVICII_MEMORY stxBORDER_COLOR styVICII_CONTROL1 stxBG_COLOR lda#$c8 staVICII_CONTROL2  }
  irq_flipper_top::$3 = byte1  irq_flipper_bottom_line
  irq_flipper_top::$6 = 0 != irq_flipper_top::$3
  if(irq_flipper_top::$6) goto irq_flipper_top::@1
  to:irq_flipper_top::@3
irq_flipper_top::@1: scope:[irq_flipper_top]  from irq_flipper_top::@4
  *VICII_CONTROL1 = *VICII_CONTROL1 | $80
  to:irq_flipper_top::@2
irq_flipper_top::@3: scope:[irq_flipper_top]  from irq_flipper_top::@4
  *VICII_CONTROL1 = *VICII_CONTROL1 & $7f
  to:irq_flipper_top::@2
irq_flipper_top::@2: scope:[irq_flipper_top]  from irq_flipper_top::@1 irq_flipper_top::@3
  irq_flipper_top::$4 = byte0  irq_flipper_bottom_line
  irq_flipper_top::$5 = irq_flipper_top::$4 & $f8
  *RASTER = irq_flipper_top::$5
  *HARDWARE_IRQ = &irq_flipper_bottom
  *IRQ_STATUS = IRQ_RASTER
  to:irq_flipper_top::@return
irq_flipper_top::@return: scope:[irq_flipper_top]  from irq_flipper_top::@2
  return 
  to:@return

__interrupt(hardware_clobber) void irq_flipper_bottom()
irq_flipper_bottom: scope:[irq_flipper_bottom]  from
  asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop  }
  irq_flipper_bottom::$0 = byte0  irq_flipper_bottom_line
  irq_flipper_bottom::$1 = irq_flipper_bottom::$0 & 7
  raster_fine::line_offset = irq_flipper_bottom::$1
  call raster_fine
  to:irq_flipper_bottom::@11
irq_flipper_bottom::@11: scope:[irq_flipper_bottom]  from irq_flipper_bottom
  asm { nop nop nop nop  }
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = LIGHT_BLUE
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLUE
  irq_flipper_bottom::toD0181_screen#0 = LOAD_SCREEN
  irq_flipper_bottom::toD0181_gfx#0 = LOAD_CHARSET
  to:irq_flipper_bottom::toD0181
irq_flipper_bottom::toD0181: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@11
  irq_flipper_bottom::toD0181_gfx#1 = phi( irq_flipper_bottom::@11/irq_flipper_bottom::toD0181_gfx#0 )
  irq_flipper_bottom::toD0181_screen#1 = phi( irq_flipper_bottom::@11/irq_flipper_bottom::toD0181_screen#0 )
  irq_flipper_bottom::toD0181_$7 = (unsigned int)irq_flipper_bottom::toD0181_screen#1
  irq_flipper_bottom::toD0181_$0 = irq_flipper_bottom::toD0181_$7 & $3fff
  irq_flipper_bottom::toD0181_$1 = irq_flipper_bottom::toD0181_$0 * 4
  irq_flipper_bottom::toD0181_$2 = byte1  irq_flipper_bottom::toD0181_$1
  irq_flipper_bottom::toD0181_$3 = byte1  (unsigned int)irq_flipper_bottom::toD0181_gfx#1
  irq_flipper_bottom::toD0181_$4 = irq_flipper_bottom::toD0181_$3 / 4
  irq_flipper_bottom::toD0181_$5 = irq_flipper_bottom::toD0181_$4 & $f
  irq_flipper_bottom::toD0181_$6 = irq_flipper_bottom::toD0181_$2 | irq_flipper_bottom::toD0181_$5
  irq_flipper_bottom::toD0181_return#0 = irq_flipper_bottom::toD0181_$6
  to:irq_flipper_bottom::toD0181_@return
irq_flipper_bottom::toD0181_@return: scope:[irq_flipper_bottom]  from irq_flipper_bottom::toD0181
  irq_flipper_bottom::toD0181_return#2 = phi( irq_flipper_bottom::toD0181/irq_flipper_bottom::toD0181_return#0 )
  irq_flipper_bottom::toD0181_return#1 = irq_flipper_bottom::toD0181_return#2
  to:irq_flipper_bottom::@10
irq_flipper_bottom::@10: scope:[irq_flipper_bottom]  from irq_flipper_bottom::toD0181_@return
  irq_flipper_bottom::toD0181_return#3 = phi( irq_flipper_bottom::toD0181_@return/irq_flipper_bottom::toD0181_return#1 )
  irq_flipper_bottom::$3 = irq_flipper_bottom::toD0181_return#3
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = irq_flipper_bottom::$3
  irq_flipper_bottom::$13 = 0 != flipper_done
  irq_flipper_bottom::$4 = ! irq_flipper_bottom::$13
  irq_flipper_bottom::$5 = ! irq_flipper_bottom::$4
  if(irq_flipper_bottom::$5) goto irq_flipper_bottom::@1
  to:irq_flipper_bottom::@2
irq_flipper_bottom::@1: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@10 irq_flipper_bottom::@7 irq_flipper_bottom::@9
  *VICII_CONTROL1 = *VICII_CONTROL1 | $80
  *RASTER = IRQ_PART1_TOP_LINE
  *HARDWARE_IRQ = &irq_part1_top
  *IRQ_STATUS = IRQ_RASTER
  to:irq_flipper_bottom::@return
irq_flipper_bottom::@2: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@10
  irq_flipper_bottom::$12 = irq_flipper_idx * SIZEOF_UNSIGNED_INT
  irq_flipper_bottom::irq_flipper_line#0 = FLIPPER_EASING[irq_flipper_bottom::$12]
  irq_flipper_idx = ++ irq_flipper_idx
  irq_flipper_bottom::$6 = irq_flipper_bottom::irq_flipper_line#0 < 8
  if(irq_flipper_bottom::$6) goto irq_flipper_bottom::@4
  to:irq_flipper_bottom::@3
irq_flipper_bottom::@4: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@2
  irq_flipper_bottom::irq_flipper_line#5 = phi( irq_flipper_bottom::@2/irq_flipper_bottom::irq_flipper_line#0 )
  irq_flipper_top_line = 0
  to:irq_flipper_bottom::@5
irq_flipper_bottom::@3: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@2
  irq_flipper_bottom::irq_flipper_line#1 = phi( irq_flipper_bottom::@2/irq_flipper_bottom::irq_flipper_line#0 )
  irq_flipper_bottom::$7 = irq_flipper_bottom::irq_flipper_line#1 - 8
  irq_flipper_top_line = irq_flipper_bottom::$7
  to:irq_flipper_bottom::@5
irq_flipper_bottom::@5: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@3 irq_flipper_bottom::@4
  irq_flipper_bottom::irq_flipper_line#2 = phi( irq_flipper_bottom::@3/irq_flipper_bottom::irq_flipper_line#1, irq_flipper_bottom::@4/irq_flipper_bottom::irq_flipper_line#5 )
  irq_flipper_bottom::$8 = irq_flipper_bottom::irq_flipper_line#2 > $128
  if(irq_flipper_bottom::$8) goto irq_flipper_bottom::@6
  to:irq_flipper_bottom::@8
irq_flipper_bottom::@6: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@5
  irq_flipper_bottom::irq_flipper_line#6 = phi( irq_flipper_bottom::@5/irq_flipper_bottom::irq_flipper_line#2 )
  irq_flipper_bottom_line = $130
  to:irq_flipper_bottom::@7
irq_flipper_bottom::@8: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@5
  irq_flipper_bottom::irq_flipper_line#3 = phi( irq_flipper_bottom::@5/irq_flipper_bottom::irq_flipper_line#2 )
  irq_flipper_bottom::$9 = irq_flipper_bottom::irq_flipper_line#3 + 8
  irq_flipper_bottom_line = irq_flipper_bottom::$9
  to:irq_flipper_bottom::@7
irq_flipper_bottom::@7: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@6 irq_flipper_bottom::@8
  irq_flipper_bottom::irq_flipper_line#4 = phi( irq_flipper_bottom::@6/irq_flipper_bottom::irq_flipper_line#6, irq_flipper_bottom::@8/irq_flipper_bottom::irq_flipper_line#3 )
  irq_flipper_bottom::$10 = irq_flipper_bottom::irq_flipper_line#4 == $130
  irq_flipper_bottom::$11 = ! irq_flipper_bottom::$10
  if(irq_flipper_bottom::$11) goto irq_flipper_bottom::@1
  to:irq_flipper_bottom::@9
irq_flipper_bottom::@9: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@7
  flipper_done = 1
  to:irq_flipper_bottom::@1
irq_flipper_bottom::@return: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@1
  return 
  to:@return

void raster_fine(volatile char line_offset)
raster_fine: scope:[raster_fine]  from irq_flipper_bottom irq_flipper_top
  kickasm( uses raster_fine::line_offset uses RASTER_BADLINES) {{ jmp aligned
        .align $100
    aligned:
        ldy RASTER
        ldx line_offset
        inx
    rst:
        nop 
        nop 
        nop 
        nop
        dex                             // 2
        beq done                        // 2
        lda RASTER_BADLINES,y           // 4
        beq notbad                      // 3
    bad:
        nop                             // 2
        nop 
        nop 
        nop 
        nop
        dex                             
        beq done                        
        iny                             
        nop                             
        bit $ea                         
    notbad:
        .fill 18, NOP
        bit $ea
        iny                             
        jmp rst                         
    done:
     }}
  to:raster_fine::@return
raster_fine::@return: scope:[raster_fine]  from raster_fine
  return 
  to:@return

void flipper_fix_colors()
flipper_fix_colors: scope:[flipper_fix_colors]  from part1_loop::@2
  flipper_fix_colors::$0 = irq_flipper_top_line > $2e
  flipper_fix_colors::$1 = irq_flipper_top_line < $f6
  flipper_fix_colors::$2 = flipper_fix_colors::$0 && flipper_fix_colors::$1
  flipper_fix_colors::$3 = ! flipper_fix_colors::$2
  if(flipper_fix_colors::$3) goto flipper_fix_colors::@return
  to:flipper_fix_colors::@1
flipper_fix_colors::@1: scope:[flipper_fix_colors]  from flipper_fix_colors
  flipper_fix_colors::$4 = irq_flipper_top_line - $2e
  flipper_fix_colors::$5 = flipper_fix_colors::$4 / 8
  flipper_fix_colors::charline#0 = (char)flipper_fix_colors::$5
  flipper_fix_colors::$6 = flipper_fix_colors::charline#0 >= flipper_charline
  flipper_fix_colors::$7 = ! flipper_fix_colors::$6
  if(flipper_fix_colors::$7) goto flipper_fix_colors::@return
  to:flipper_fix_colors::@2
flipper_fix_colors::@2: scope:[flipper_fix_colors]  from flipper_fix_colors::@1
  flipper_fix_colors::$12 = (unsigned int)flipper_charline
  flipper_fix_colors::offset#0 = flipper_fix_colors::$12 * $28
  flipper_fix_colors::colors#0 = COLS + flipper_fix_colors::offset#0
  flipper_fix_colors::happy_cols#0 = P1_COLORS + flipper_fix_colors::offset#0
  flipper_fix_colors::i#0 = 0
  to:flipper_fix_colors::@3
flipper_fix_colors::@3: scope:[flipper_fix_colors]  from flipper_fix_colors::@2 flipper_fix_colors::@4
  flipper_fix_colors::colors#2 = phi( flipper_fix_colors::@2/flipper_fix_colors::colors#0, flipper_fix_colors::@4/flipper_fix_colors::colors#1 )
  flipper_fix_colors::happy_cols#2 = phi( flipper_fix_colors::@2/flipper_fix_colors::happy_cols#0, flipper_fix_colors::@4/flipper_fix_colors::happy_cols#1 )
  flipper_fix_colors::i#2 = phi( flipper_fix_colors::@2/flipper_fix_colors::i#0, flipper_fix_colors::@4/flipper_fix_colors::i#1 )
  flipper_fix_colors::$11 = flipper_fix_colors::i#2 < $28
  if(flipper_fix_colors::$11) goto flipper_fix_colors::@4
  to:flipper_fix_colors::@5
flipper_fix_colors::@4: scope:[flipper_fix_colors]  from flipper_fix_colors::@3
  flipper_fix_colors::colors#1 = phi( flipper_fix_colors::@3/flipper_fix_colors::colors#2 )
  flipper_fix_colors::i#3 = phi( flipper_fix_colors::@3/flipper_fix_colors::i#2 )
  flipper_fix_colors::happy_cols#1 = phi( flipper_fix_colors::@3/flipper_fix_colors::happy_cols#2 )
  flipper_fix_colors::colors#1[flipper_fix_colors::i#3] = flipper_fix_colors::happy_cols#1[flipper_fix_colors::i#3]
  flipper_fix_colors::i#1 = ++ flipper_fix_colors::i#3
  to:flipper_fix_colors::@3
flipper_fix_colors::@5: scope:[flipper_fix_colors]  from flipper_fix_colors::@3
  flipper_charline = ++ flipper_charline
  to:flipper_fix_colors::@return
flipper_fix_colors::@return: scope:[flipper_fix_colors]  from flipper_fix_colors flipper_fix_colors::@1 flipper_fix_colors::@5
  return 
  to:@return

void plexPrepareInit()
plexPrepareInit: scope:[plexPrepareInit]  from part2_init::@21
  plexPrepareInit::i#0 = 0
  to:plexPrepareInit::@1
plexPrepareInit::@1: scope:[plexPrepareInit]  from plexPrepareInit plexPrepareInit::@2
  plexPrepareInit::i#2 = phi( plexPrepareInit/plexPrepareInit::i#0, plexPrepareInit::@2/plexPrepareInit::i#1 )
  plexPrepareInit::$0 = plexPrepareInit::i#2 < $20
  if(plexPrepareInit::$0) goto plexPrepareInit::@2
  to:plexPrepareInit::@return
plexPrepareInit::@2: scope:[plexPrepareInit]  from plexPrepareInit::@1
  plexPrepareInit::i#3 = phi( plexPrepareInit::@1/plexPrepareInit::i#2 )
  PLEX_SORTED_IDX[plexPrepareInit::i#3] = plexPrepareInit::i#3
  plexPrepareInit::i#1 = ++ plexPrepareInit::i#3
  to:plexPrepareInit::@1
plexPrepareInit::@return: scope:[plexPrepareInit]  from plexPrepareInit::@1
  return 
  to:@return

void plexPrepareFrame(struct BucketSprite *frame)
plexPrepareFrame: scope:[plexPrepareFrame]  from part2_init::@6
  plexPrepareFrame::frame#6 = phi( part2_init::@6/plexPrepareFrame::frame#0 )
  plexPrepareFrame::m#0 = 0
  to:plexPrepareFrame::@1
plexPrepareFrame::@1: scope:[plexPrepareFrame]  from plexPrepareFrame plexPrepareFrame::@4
  plexPrepareFrame::frame#5 = phi( plexPrepareFrame/plexPrepareFrame::frame#6, plexPrepareFrame::@4/plexPrepareFrame::frame#7 )
  plexPrepareFrame::m#2 = phi( plexPrepareFrame/plexPrepareFrame::m#0, plexPrepareFrame::@4/plexPrepareFrame::m#1 )
  plexPrepareFrame::$2 = plexPrepareFrame::m#2 < $20-1
  if(plexPrepareFrame::$2) goto plexPrepareFrame::@2
  to:plexPrepareFrame::@3
plexPrepareFrame::@2: scope:[plexPrepareFrame]  from plexPrepareFrame::@1
  plexPrepareFrame::frame#8 = phi( plexPrepareFrame::@1/plexPrepareFrame::frame#5 )
  plexPrepareFrame::m#3 = phi( plexPrepareFrame::@1/plexPrepareFrame::m#2 )
  plexPrepareFrame::$3 = plexPrepareFrame::m#3 + 1
  plexPrepareFrame::nxt_idx#0 = PLEX_SORTED_IDX[plexPrepareFrame::$3]
  plexPrepareFrame::nxt_y#0 = PLEX_YPOS[plexPrepareFrame::nxt_idx#0]
  plexPrepareFrame::$4 = plexPrepareFrame::nxt_y#0 < PLEX_YPOS[PLEX_SORTED_IDX[plexPrepareFrame::m#3]]
  plexPrepareFrame::$5 = ! plexPrepareFrame::$4
  if(plexPrepareFrame::$5) goto plexPrepareFrame::@4
  to:plexPrepareFrame::@7
plexPrepareFrame::@3: scope:[plexPrepareFrame]  from plexPrepareFrame::@1
  plexPrepareFrame::frame#3 = phi( plexPrepareFrame::@1/plexPrepareFrame::frame#5 )
  plexPrepareFrame::i#0 = 0
  to:plexPrepareFrame::@8
plexPrepareFrame::@4: scope:[plexPrepareFrame]  from plexPrepareFrame::@2 plexPrepareFrame::@6
  plexPrepareFrame::frame#7 = phi( plexPrepareFrame::@2/plexPrepareFrame::frame#8, plexPrepareFrame::@6/plexPrepareFrame::frame#9 )
  plexPrepareFrame::m#4 = phi( plexPrepareFrame::@2/plexPrepareFrame::m#3, plexPrepareFrame::@6/plexPrepareFrame::m#6 )
  plexPrepareFrame::m#1 = ++ plexPrepareFrame::m#4
  to:plexPrepareFrame::@1
plexPrepareFrame::@7: scope:[plexPrepareFrame]  from plexPrepareFrame::@2
  plexPrepareFrame::frame#11 = phi( plexPrepareFrame::@2/plexPrepareFrame::frame#8 )
  plexPrepareFrame::nxt_idx#3 = phi( plexPrepareFrame::@2/plexPrepareFrame::nxt_idx#0 )
  plexPrepareFrame::nxt_y#2 = phi( plexPrepareFrame::@2/plexPrepareFrame::nxt_y#0 )
  plexPrepareFrame::m#5 = phi( plexPrepareFrame::@2/plexPrepareFrame::m#3 )
  plexPrepareFrame::s#0 = plexPrepareFrame::m#5
  to:plexPrepareFrame::@5
plexPrepareFrame::@5: scope:[plexPrepareFrame]  from plexPrepareFrame::@5 plexPrepareFrame::@7
  plexPrepareFrame::frame#10 = phi( plexPrepareFrame::@5/plexPrepareFrame::frame#10, plexPrepareFrame::@7/plexPrepareFrame::frame#11 )
  plexPrepareFrame::m#7 = phi( plexPrepareFrame::@5/plexPrepareFrame::m#7, plexPrepareFrame::@7/plexPrepareFrame::m#5 )
  plexPrepareFrame::nxt_idx#2 = phi( plexPrepareFrame::@5/plexPrepareFrame::nxt_idx#2, plexPrepareFrame::@7/plexPrepareFrame::nxt_idx#3 )
  plexPrepareFrame::nxt_y#1 = phi( plexPrepareFrame::@5/plexPrepareFrame::nxt_y#1, plexPrepareFrame::@7/plexPrepareFrame::nxt_y#2 )
  plexPrepareFrame::s#3 = phi( plexPrepareFrame::@5/plexPrepareFrame::s#1, plexPrepareFrame::@7/plexPrepareFrame::s#0 )
  plexPrepareFrame::$6 = plexPrepareFrame::s#3 + 1
  PLEX_SORTED_IDX[plexPrepareFrame::$6] = PLEX_SORTED_IDX[plexPrepareFrame::s#3]
  plexPrepareFrame::s#1 = -- plexPrepareFrame::s#3
  plexPrepareFrame::$7 = plexPrepareFrame::s#1 != $ff
  plexPrepareFrame::$8 = plexPrepareFrame::nxt_y#1 < PLEX_YPOS[PLEX_SORTED_IDX[plexPrepareFrame::s#1]]
  plexPrepareFrame::$9 = plexPrepareFrame::$7 && plexPrepareFrame::$8
  if(plexPrepareFrame::$9) goto plexPrepareFrame::@5
  to:plexPrepareFrame::@6
plexPrepareFrame::@6: scope:[plexPrepareFrame]  from plexPrepareFrame::@5
  plexPrepareFrame::frame#9 = phi( plexPrepareFrame::@5/plexPrepareFrame::frame#10 )
  plexPrepareFrame::m#6 = phi( plexPrepareFrame::@5/plexPrepareFrame::m#7 )
  plexPrepareFrame::nxt_idx#1 = phi( plexPrepareFrame::@5/plexPrepareFrame::nxt_idx#2 )
  plexPrepareFrame::s#4 = phi( plexPrepareFrame::@5/plexPrepareFrame::s#1 )
  plexPrepareFrame::s#2 = ++ plexPrepareFrame::s#4
  PLEX_SORTED_IDX[plexPrepareFrame::s#2] = plexPrepareFrame::nxt_idx#1
  to:plexPrepareFrame::@4
plexPrepareFrame::@8: scope:[plexPrepareFrame]  from plexPrepareFrame::@3 plexPrepareFrame::@9
  plexPrepareFrame::frame#2 = phi( plexPrepareFrame::@3/plexPrepareFrame::frame#3, plexPrepareFrame::@9/plexPrepareFrame::frame#4 )
  plexPrepareFrame::i#2 = phi( plexPrepareFrame::@3/plexPrepareFrame::i#0, plexPrepareFrame::@9/plexPrepareFrame::i#1 )
  plexPrepareFrame::$10 = plexPrepareFrame::i#2 < 8
  if(plexPrepareFrame::$10) goto plexPrepareFrame::@9
  to:plexPrepareFrame::@10
plexPrepareFrame::@9: scope:[plexPrepareFrame]  from plexPrepareFrame::@8
  plexPrepareFrame::frame#4 = phi( plexPrepareFrame::@8/plexPrepareFrame::frame#2 )
  plexPrepareFrame::i#3 = phi( plexPrepareFrame::@8/plexPrepareFrame::i#2 )
  plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::i#3] = BUCKET_YPOS[0]
  plexPrepareFrame::i#1 = ++ plexPrepareFrame::i#3
  to:plexPrepareFrame::@8
plexPrepareFrame::@10: scope:[plexPrepareFrame]  from plexPrepareFrame::@8
  plexPrepareFrame::frame#1 = phi( plexPrepareFrame::@8/plexPrepareFrame::frame#2 )
  plexPrepareFrame::real_sprite_id#0 = 0
  plexPrepareFrame::bucket_id#0 = 0
  plexPrepareFrame::bucket_ypos#0 = BUCKET_YPOS[plexPrepareFrame::bucket_id#0]
  plexPrepareFrame::bucket#0 = plexPrepareFrame::frame#1
  plexPrepareFrame::sprite#0 = plexPrepareFrame::frame#1
  plexPrepareFrame::i1#0 = 0
  to:plexPrepareFrame::@11
plexPrepareFrame::@11: scope:[plexPrepareFrame]  from plexPrepareFrame::@10 plexPrepareFrame::@14
  plexPrepareFrame::bucket_id#4 = phi( plexPrepareFrame::@10/plexPrepareFrame::bucket_id#0, plexPrepareFrame::@14/plexPrepareFrame::bucket_id#5 )
  plexPrepareFrame::sprite#8 = phi( plexPrepareFrame::@10/plexPrepareFrame::sprite#0, plexPrepareFrame::@14/plexPrepareFrame::sprite#1 )
  plexPrepareFrame::bucket#6 = phi( plexPrepareFrame::@10/plexPrepareFrame::bucket#0, plexPrepareFrame::@14/plexPrepareFrame::bucket#9 )
  plexPrepareFrame::bucket_ypos#5 = phi( plexPrepareFrame::@10/plexPrepareFrame::bucket_ypos#0, plexPrepareFrame::@14/plexPrepareFrame::bucket_ypos#1 )
  plexPrepareFrame::real_sprite_id#4 = phi( plexPrepareFrame::@10/plexPrepareFrame::real_sprite_id#0, plexPrepareFrame::@14/plexPrepareFrame::real_sprite_id#1 )
  plexPrepareFrame::i1#2 = phi( plexPrepareFrame::@10/plexPrepareFrame::i1#0, plexPrepareFrame::@14/plexPrepareFrame::i1#1 )
  plexPrepareFrame::$11 = plexPrepareFrame::i1#2 < $20
  if(plexPrepareFrame::$11) goto plexPrepareFrame::@12
  to:plexPrepareFrame::@13
plexPrepareFrame::@12: scope:[plexPrepareFrame]  from plexPrepareFrame::@11
  plexPrepareFrame::bucket#7 = phi( plexPrepareFrame::@11/plexPrepareFrame::bucket#6 )
  plexPrepareFrame::bucket_id#3 = phi( plexPrepareFrame::@11/plexPrepareFrame::bucket_id#4 )
  plexPrepareFrame::sprite#9 = phi( plexPrepareFrame::@11/plexPrepareFrame::sprite#8 )
  plexPrepareFrame::bucket_ypos#3 = phi( plexPrepareFrame::@11/plexPrepareFrame::bucket_ypos#5 )
  plexPrepareFrame::real_sprite_id#2 = phi( plexPrepareFrame::@11/plexPrepareFrame::real_sprite_id#4 )
  plexPrepareFrame::i1#3 = phi( plexPrepareFrame::@11/plexPrepareFrame::i1#2 )
  plexPrepareFrame::plex_id#0 = PLEX_SORTED_IDX[plexPrepareFrame::i1#3]
  plexPrepareFrame::ypos#0 = PLEX_YPOS[plexPrepareFrame::plex_id#0]
  plexPrepareFrame::$12 = plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::real_sprite_id#2] > plexPrepareFrame::bucket_ypos#3
  plexPrepareFrame::$13 = ! plexPrepareFrame::$12
  if(plexPrepareFrame::$13) goto plexPrepareFrame::@14
  to:plexPrepareFrame::@16
plexPrepareFrame::@13: scope:[plexPrepareFrame]  from plexPrepareFrame::@11
  plexPrepareFrame::sprite#3 = phi( plexPrepareFrame::@11/plexPrepareFrame::sprite#8 )
  plexPrepareFrame::bucket#3 = phi( plexPrepareFrame::@11/plexPrepareFrame::bucket#6 )
  plexPrepareFrame::$19 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
  plexPrepareFrame::bucket#1 = plexPrepareFrame::bucket#3 + plexPrepareFrame::$19
  plexPrepareFrame::$0 = plexPrepareFrame::sprite#3 != plexPrepareFrame::bucket#1
  plexPrepareFrame::$1 = ! plexPrepareFrame::$0
  if(plexPrepareFrame::$1) goto plexPrepareFrame::@return
  to:plexPrepareFrame::@18
plexPrepareFrame::@14: scope:[plexPrepareFrame]  from plexPrepareFrame::@12 plexPrepareFrame::@15
  plexPrepareFrame::bucket_id#5 = phi( plexPrepareFrame::@12/plexPrepareFrame::bucket_id#3, plexPrepareFrame::@15/plexPrepareFrame::bucket_id#6 )
  plexPrepareFrame::bucket#9 = phi( plexPrepareFrame::@12/plexPrepareFrame::bucket#7, plexPrepareFrame::@15/plexPrepareFrame::bucket#5 )
  plexPrepareFrame::i1#4 = phi( plexPrepareFrame::@12/plexPrepareFrame::i1#3, plexPrepareFrame::@15/plexPrepareFrame::i1#5 )
  plexPrepareFrame::real_sprite_id#3 = phi( plexPrepareFrame::@12/plexPrepareFrame::real_sprite_id#2, plexPrepareFrame::@15/plexPrepareFrame::real_sprite_id#5 )
  plexPrepareFrame::bucket_ypos#4 = phi( plexPrepareFrame::@12/plexPrepareFrame::bucket_ypos#3, plexPrepareFrame::@15/plexPrepareFrame::bucket_ypos#6 )
  plexPrepareFrame::plex_id#1 = phi( plexPrepareFrame::@12/plexPrepareFrame::plex_id#0, plexPrepareFrame::@15/plexPrepareFrame::plex_id#2 )
  plexPrepareFrame::ypos#1 = phi( plexPrepareFrame::@12/plexPrepareFrame::ypos#0, plexPrepareFrame::@15/plexPrepareFrame::ypos#2 )
  plexPrepareFrame::sprite#4 = phi( plexPrepareFrame::@12/plexPrepareFrame::sprite#9, plexPrepareFrame::@15/plexPrepareFrame::sprite#2 )
  plexPrepareFrame::$25 = (char *)plexPrepareFrame::sprite#4
  plexPrepareFrame::$21 = plexPrepareFrame::$25 + OFFSET_STRUCT_BUCKETSPRITE_YPOS
  *plexPrepareFrame::$21 = plexPrepareFrame::ypos#1
  plexPrepareFrame::$26 = (char *)plexPrepareFrame::sprite#4
  plexPrepareFrame::$22 = plexPrepareFrame::$26 + OFFSET_STRUCT_BUCKETSPRITE_PLEX_ID
  *plexPrepareFrame::$22 = plexPrepareFrame::plex_id#1
  plexPrepareFrame::bucket_ypos#1 = plexPrepareFrame::bucket_ypos#4 + 1
  plexPrepareFrame::$16 = plexPrepareFrame::ypos#1 + $16
  plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::real_sprite_id#3] = plexPrepareFrame::$16
  plexPrepareFrame::$17 = plexPrepareFrame::real_sprite_id#3 + 1
  plexPrepareFrame::$18 = plexPrepareFrame::$17 & 7
  plexPrepareFrame::real_sprite_id#1 = plexPrepareFrame::$18
  plexPrepareFrame::sprite#1 = plexPrepareFrame::sprite#4 + SIZEOF_STRUCT_BUCKETSPRITE
  plexPrepareFrame::i1#1 = ++ plexPrepareFrame::i1#4
  to:plexPrepareFrame::@11
plexPrepareFrame::@16: scope:[plexPrepareFrame]  from plexPrepareFrame::@12
  plexPrepareFrame::i1#6 = phi( plexPrepareFrame::@12/plexPrepareFrame::i1#3 )
  plexPrepareFrame::real_sprite_id#6 = phi( plexPrepareFrame::@12/plexPrepareFrame::real_sprite_id#2 )
  plexPrepareFrame::plex_id#3 = phi( plexPrepareFrame::@12/plexPrepareFrame::plex_id#0 )
  plexPrepareFrame::ypos#3 = phi( plexPrepareFrame::@12/plexPrepareFrame::ypos#0 )
  plexPrepareFrame::sprite#5 = phi( plexPrepareFrame::@12/plexPrepareFrame::sprite#9 )
  plexPrepareFrame::bucket#4 = phi( plexPrepareFrame::@12/plexPrepareFrame::bucket#7 )
  plexPrepareFrame::bucket_id#2 = phi( plexPrepareFrame::@12/plexPrepareFrame::bucket_id#3 )
  plexPrepareFrame::bucket_id#1 = ++ plexPrepareFrame::bucket_id#2
  plexPrepareFrame::bucket_ypos#2 = BUCKET_YPOS[plexPrepareFrame::bucket_id#1]
  plexPrepareFrame::$20 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
  plexPrepareFrame::bucket#2 = plexPrepareFrame::bucket#4 + plexPrepareFrame::$20
  plexPrepareFrame::$14 = plexPrepareFrame::sprite#5 != plexPrepareFrame::bucket#2
  plexPrepareFrame::$15 = ! plexPrepareFrame::$14
  if(plexPrepareFrame::$15) goto plexPrepareFrame::@15
  to:plexPrepareFrame::@17
plexPrepareFrame::@15: scope:[plexPrepareFrame]  from plexPrepareFrame::@16 plexPrepareFrame::@17
  plexPrepareFrame::bucket_id#6 = phi( plexPrepareFrame::@16/plexPrepareFrame::bucket_id#1, plexPrepareFrame::@17/plexPrepareFrame::bucket_id#7 )
  plexPrepareFrame::i1#5 = phi( plexPrepareFrame::@16/plexPrepareFrame::i1#6, plexPrepareFrame::@17/plexPrepareFrame::i1#7 )
  plexPrepareFrame::real_sprite_id#5 = phi( plexPrepareFrame::@16/plexPrepareFrame::real_sprite_id#6, plexPrepareFrame::@17/plexPrepareFrame::real_sprite_id#7 )
  plexPrepareFrame::bucket_ypos#6 = phi( plexPrepareFrame::@16/plexPrepareFrame::bucket_ypos#2, plexPrepareFrame::@17/plexPrepareFrame::bucket_ypos#7 )
  plexPrepareFrame::plex_id#2 = phi( plexPrepareFrame::@16/plexPrepareFrame::plex_id#3, plexPrepareFrame::@17/plexPrepareFrame::plex_id#4 )
  plexPrepareFrame::ypos#2 = phi( plexPrepareFrame::@16/plexPrepareFrame::ypos#3, plexPrepareFrame::@17/plexPrepareFrame::ypos#4 )
  plexPrepareFrame::bucket#5 = phi( plexPrepareFrame::@16/plexPrepareFrame::bucket#2, plexPrepareFrame::@17/plexPrepareFrame::bucket#8 )
  plexPrepareFrame::sprite#2 = plexPrepareFrame::bucket#5
  to:plexPrepareFrame::@14
plexPrepareFrame::@17: scope:[plexPrepareFrame]  from plexPrepareFrame::@16
  plexPrepareFrame::bucket_id#7 = phi( plexPrepareFrame::@16/plexPrepareFrame::bucket_id#1 )
  plexPrepareFrame::i1#7 = phi( plexPrepareFrame::@16/plexPrepareFrame::i1#6 )
  plexPrepareFrame::real_sprite_id#7 = phi( plexPrepareFrame::@16/plexPrepareFrame::real_sprite_id#6 )
  plexPrepareFrame::bucket_ypos#7 = phi( plexPrepareFrame::@16/plexPrepareFrame::bucket_ypos#2 )
  plexPrepareFrame::plex_id#4 = phi( plexPrepareFrame::@16/plexPrepareFrame::plex_id#3 )
  plexPrepareFrame::ypos#4 = phi( plexPrepareFrame::@16/plexPrepareFrame::ypos#3 )
  plexPrepareFrame::bucket#8 = phi( plexPrepareFrame::@16/plexPrepareFrame::bucket#2 )
  plexPrepareFrame::sprite#6 = phi( plexPrepareFrame::@16/plexPrepareFrame::sprite#5 )
  plexPrepareFrame::$27 = (char *)plexPrepareFrame::sprite#6
  plexPrepareFrame::$23 = plexPrepareFrame::$27 + OFFSET_STRUCT_BUCKETSPRITE_YPOS
  *plexPrepareFrame::$23 = 0
  to:plexPrepareFrame::@15
plexPrepareFrame::@18: scope:[plexPrepareFrame]  from plexPrepareFrame::@13
  plexPrepareFrame::sprite#7 = phi( plexPrepareFrame::@13/plexPrepareFrame::sprite#3 )
  plexPrepareFrame::$28 = (char *)plexPrepareFrame::sprite#7
  plexPrepareFrame::$24 = plexPrepareFrame::$28 + OFFSET_STRUCT_BUCKETSPRITE_YPOS
  *plexPrepareFrame::$24 = 0
  to:plexPrepareFrame::@return
plexPrepareFrame::@return: scope:[plexPrepareFrame]  from plexPrepareFrame::@13 plexPrepareFrame::@18
  return 
  to:@return

void plexFrameStart()
plexFrameStart: scope:[plexFrameStart]  from irq_swing_top
  plex_real_sprite_idx = 0
  to:plexFrameStart::@return
plexFrameStart::@return: scope:[plexFrameStart]  from plexFrameStart
  return 
  to:@return

void plexBucketShow(struct BucketSprite *bucket)
plexBucketShow: scope:[plexBucketShow]  from irq_swing_plex irq_swing_top::@1
  plexBucketShow::bucket#2 = phi( irq_swing_plex/plexBucketShow::bucket#1, irq_swing_top::@1/plexBucketShow::bucket#0 )
  plexBucketShow::bucket_ptr#0 = (char *)plexBucketShow::bucket#2
  plexBucketShow::real_idx#0 = plex_real_sprite_idx * 2
  plexBucketShow::i#0 = 0
  to:plexBucketShow::@1
plexBucketShow::@1: scope:[plexBucketShow]  from plexBucketShow plexBucketShow::@4
  plexBucketShow::real_idx#9 = phi( plexBucketShow/plexBucketShow::real_idx#0, plexBucketShow::@4/plexBucketShow::real_idx#3 )
  plexBucketShow::i#3 = phi( plexBucketShow/plexBucketShow::i#0, plexBucketShow::@4/plexBucketShow::i#2 )
  plexBucketShow::bucket_ptr#1 = phi( plexBucketShow/plexBucketShow::bucket_ptr#0, plexBucketShow::@4/plexBucketShow::bucket_ptr#3 )
  plexBucketShow::$6 = 0 != plexBucketShow::bucket_ptr#1[plexBucketShow::i#3]
  if(plexBucketShow::$6) goto plexBucketShow::@2
  to:plexBucketShow::@5
plexBucketShow::@2: scope:[plexBucketShow]  from plexBucketShow::@1
  plexBucketShow::real_idx#4 = phi( plexBucketShow::@1/plexBucketShow::real_idx#9 )
  plexBucketShow::i#4 = phi( plexBucketShow::@1/plexBucketShow::i#3 )
  plexBucketShow::bucket_ptr#2 = phi( plexBucketShow::@1/plexBucketShow::bucket_ptr#1 )
  SPRITES_YPOS[plexBucketShow::real_idx#4] = plexBucketShow::bucket_ptr#2[plexBucketShow::i#4]
  plexBucketShow::i#1 = ++ plexBucketShow::i#4
  plexBucketShow::plex_id#0 = plexBucketShow::bucket_ptr#2[plexBucketShow::i#1]
  SPRITES_XPOS[plexBucketShow::real_idx#4] = PLEX_XPOS[plexBucketShow::plex_id#0]
  plexBucketShow::real_idx#1 = plexBucketShow::real_idx#4 / 2
  plexBucketShow::$7 = 0 != PLEX_XPOS_MSB[plexBucketShow::plex_id#0]
  if(plexBucketShow::$7) goto plexBucketShow::@3
  to:plexBucketShow::@6
plexBucketShow::@3: scope:[plexBucketShow]  from plexBucketShow::@2
  plexBucketShow::bucket_ptr#4 = phi( plexBucketShow::@2/plexBucketShow::bucket_ptr#2 )
  plexBucketShow::i#6 = phi( plexBucketShow::@2/plexBucketShow::i#1 )
  plexBucketShow::plex_id#2 = phi( plexBucketShow::@2/plexBucketShow::plex_id#0 )
  plexBucketShow::real_idx#5 = phi( plexBucketShow::@2/plexBucketShow::real_idx#1 )
  *SPRITES_XMSB = *SPRITES_XMSB | plexBucketShow::MSB_SET_MASK_BY_ID[plexBucketShow::real_idx#5]
  to:plexBucketShow::@4
plexBucketShow::@6: scope:[plexBucketShow]  from plexBucketShow::@2
  plexBucketShow::bucket_ptr#5 = phi( plexBucketShow::@2/plexBucketShow::bucket_ptr#2 )
  plexBucketShow::i#7 = phi( plexBucketShow::@2/plexBucketShow::i#1 )
  plexBucketShow::plex_id#3 = phi( plexBucketShow::@2/plexBucketShow::plex_id#0 )
  plexBucketShow::real_idx#6 = phi( plexBucketShow::@2/plexBucketShow::real_idx#1 )
  *SPRITES_XMSB = *SPRITES_XMSB & plexBucketShow::MSB_CLEAR_MASK_BY_ID[plexBucketShow::real_idx#6]
  to:plexBucketShow::@4
plexBucketShow::@4: scope:[plexBucketShow]  from plexBucketShow::@3 plexBucketShow::@6
  plexBucketShow::bucket_ptr#3 = phi( plexBucketShow::@3/plexBucketShow::bucket_ptr#4, plexBucketShow::@6/plexBucketShow::bucket_ptr#5 )
  plexBucketShow::i#5 = phi( plexBucketShow::@3/plexBucketShow::i#6, plexBucketShow::@6/plexBucketShow::i#7 )
  plexBucketShow::real_idx#7 = phi( plexBucketShow::@3/plexBucketShow::real_idx#5, plexBucketShow::@6/plexBucketShow::real_idx#6 )
  plexBucketShow::plex_id#1 = phi( plexBucketShow::@3/plexBucketShow::plex_id#2, plexBucketShow::@6/plexBucketShow::plex_id#3 )
  SCREEN_SPRITE_PTRS[plexBucketShow::real_idx#7] = PLEX_PTR[plexBucketShow::plex_id#1]
  plexBucketShow::$2 = plexBucketShow::real_idx#7 + 1
  plexBucketShow::$3 = plexBucketShow::$2 & 7
  plexBucketShow::real_idx#2 = plexBucketShow::$3
  plexBucketShow::real_idx#3 = plexBucketShow::real_idx#2 * 2
  plexBucketShow::i#2 = ++ plexBucketShow::i#5
  plexBucketShow::$4 = plexBucketShow::i#2 == 8*SIZEOF_STRUCT_BUCKETSPRITE
  plexBucketShow::$5 = ! plexBucketShow::$4
  if(plexBucketShow::$5) goto plexBucketShow::@1
  to:plexBucketShow::@5
plexBucketShow::@5: scope:[plexBucketShow]  from plexBucketShow::@1 plexBucketShow::@4
  plexBucketShow::real_idx#8 = phi( plexBucketShow::@1/plexBucketShow::real_idx#9, plexBucketShow::@4/plexBucketShow::real_idx#3 )
  plexBucketShow::$1 = plexBucketShow::real_idx#8 / 2
  plex_real_sprite_idx = plexBucketShow::$1
  to:plexBucketShow::@return
plexBucketShow::@return: scope:[plexBucketShow]  from plexBucketShow::@5
  return 
  to:@return

void part2_init()
part2_init: scope:[part2_init]  from main::@11
  byteboozer_decrunch::crunched = SPRITES_CRUNCHED
  call byteboozer_decrunch
  to:part2_init::@14
part2_init::@14: scope:[part2_init]  from part2_init
  memcpy::destination#3 = (void *)LOGO_DATA_CRUNCHED2
  memcpy::source#3 = (void *)LOGO_DATA_CRUNCHED
  memcpy::num#3 = LOGO_DATA_CRUNCHED_SIZE
  call memcpy
  memcpy::return#5 = memcpy::return#1
  to:part2_init::@15
part2_init::@15: scope:[part2_init]  from part2_init::@14
  memcpy::destination#4 = (void *)PLEX_ID_UPDATERS_CRUNCHED2
  memcpy::source#4 = (void *)PLEX_ID_UPDATERS_CRUNCHED
  memcpy::num#4 = PLEX_ID_UPDATERS_CRUNCHED_SIZE
  call memcpy
  memcpy::return#6 = memcpy::return#1
  to:part2_init::@16
part2_init::@16: scope:[part2_init]  from part2_init::@15
  byteboozer_decrunch::crunched = PLEX_ID_UPDATERS_CRUNCHED2
  call byteboozer_decrunch
  to:part2_init::@17
part2_init::@17: scope:[part2_init]  from part2_init::@16
  byteboozer_decrunch::crunched = LOGO_DATA_CRUNCHED2
  call byteboozer_decrunch
  to:part2_init::@18
part2_init::@18: scope:[part2_init]  from part2_init::@17
  *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  *PROCPORT = PROCPORT_RAM_ALL
  memset::str#1 = (void *)PART2_BITMAP+$1f40
  memset::c#1 = 0
  memset::num#1 = $c0
  call memset
  memset::return#3 = memset::return#1
  to:part2_init::@19
part2_init::@19: scope:[part2_init]  from part2_init::@18
  *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  *PROCPORT = PROCPORT_RAM_IO
  memset::str#2 = (void *)COLS
  memset::c#2 = BLACK
  memset::num#2 = $400
  call memset
  memset::return#4 = memset::return#1
  to:part2_init::@20
part2_init::@20: scope:[part2_init]  from part2_init::@19
  memset::str#3 = (void *)PART2_SCREEN
  memset::c#3 = BLACK
  memset::num#3 = $3e8
  call memset
  memset::return#5 = memset::return#1
  to:part2_init::@21
part2_init::@21: scope:[part2_init]  from part2_init::@20
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR) = GREY
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1) = BROWN
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2) = BLUE
  call plexPrepareInit
  to:part2_init::@22
part2_init::@22: scope:[part2_init]  from part2_init::@21
  part2_init::frame#0 = BUCKET_SPRITES
  part2_init::frame_idx#0 = 0
  to:part2_init::@1
part2_init::@1: scope:[part2_init]  from part2_init::@22 part2_init::@24
  part2_init::frame#7 = phi( part2_init::@22/part2_init::frame#0, part2_init::@24/part2_init::frame#1 )
  part2_init::frame_idx#2 = phi( part2_init::@22/part2_init::frame_idx#0, part2_init::@24/part2_init::frame_idx#1 )
  part2_init::$12 = part2_init::frame_idx#2 < 8
  if(part2_init::$12) goto part2_init::@2
  to:part2_init::@3
part2_init::@2: scope:[part2_init]  from part2_init::@1
  part2_init::frame#5 = phi( part2_init::@1/part2_init::frame#7 )
  part2_init::frame_idx#3 = phi( part2_init::@1/part2_init::frame_idx#2 )
  part2_init::sin_idx#0 = part2_init::frame_idx#3
  part2_init::s#0 = 0
  to:part2_init::@4
part2_init::@3: scope:[part2_init]  from part2_init::@1
  part2_init::$9 = sizeof  BUCKET_SPRITES
  memcpy::destination#5 = (void *)ORIGINAL_BUCKET_SPRITES
  memcpy::source#5 = (void *)BUCKET_SPRITES
  memcpy::num#5 = part2_init::$9
  call memcpy
  memcpy::return#7 = memcpy::return#1
  to:part2_init::@23
part2_init::@23: scope:[part2_init]  from part2_init::@3
  part2_init::s1#0 = 0
  to:part2_init::@7
part2_init::@4: scope:[part2_init]  from part2_init::@2 part2_init::@5
  part2_init::frame_idx#6 = phi( part2_init::@2/part2_init::frame_idx#3, part2_init::@5/part2_init::frame_idx#7 )
  part2_init::frame#4 = phi( part2_init::@2/part2_init::frame#5, part2_init::@5/part2_init::frame#6 )
  part2_init::sin_idx#3 = phi( part2_init::@2/part2_init::sin_idx#0, part2_init::@5/part2_init::sin_idx#1 )
  part2_init::s#2 = phi( part2_init::@2/part2_init::s#0, part2_init::@5/part2_init::s#1 )
  part2_init::$13 = part2_init::s#2 < $20
  if(part2_init::$13) goto part2_init::@5
  to:part2_init::@6
part2_init::@5: scope:[part2_init]  from part2_init::@4
  part2_init::frame_idx#7 = phi( part2_init::@4/part2_init::frame_idx#6 )
  part2_init::frame#6 = phi( part2_init::@4/part2_init::frame#4 )
  part2_init::s#3 = phi( part2_init::@4/part2_init::s#2 )
  part2_init::sin_idx#2 = phi( part2_init::@4/part2_init::sin_idx#3 )
  PLEX_YPOS[part2_init::s#3] = SCROLL_YSIN[part2_init::sin_idx#2]
  part2_init::sin_idx#1 = part2_init::sin_idx#2 + 8
  part2_init::s#1 = ++ part2_init::s#3
  to:part2_init::@4
part2_init::@6: scope:[part2_init]  from part2_init::@4
  part2_init::frame_idx#5 = phi( part2_init::@4/part2_init::frame_idx#6 )
  part2_init::frame#2 = phi( part2_init::@4/part2_init::frame#4 )
  plexPrepareFrame::frame#0 = part2_init::frame#2
  call plexPrepareFrame
  to:part2_init::@24
part2_init::@24: scope:[part2_init]  from part2_init::@6
  part2_init::frame_idx#4 = phi( part2_init::@6/part2_init::frame_idx#5 )
  part2_init::frame#3 = phi( part2_init::@6/part2_init::frame#2 )
  part2_init::$19 = 8*9 * SIZEOF_STRUCT_BUCKETSPRITE
  part2_init::frame#1 = part2_init::frame#3 + part2_init::$19
  part2_init::frame_idx#1 = ++ part2_init::frame_idx#4
  to:part2_init::@1
part2_init::@7: scope:[part2_init]  from part2_init::@13 part2_init::@23
  part2_init::s1#2 = phi( part2_init::@13/part2_init::s1#1, part2_init::@23/part2_init::s1#0 )
  part2_init::$15 = part2_init::s1#2 < $20
  if(part2_init::$15) goto part2_init::@8
  to:part2_init::@9
part2_init::@8: scope:[part2_init]  from part2_init::@7
  part2_init::s1#6 = phi( part2_init::@7/part2_init::s1#2 )
  part2_init::toSpritePtr1_sprite#0 = PART2_SPRITES
  to:part2_init::toSpritePtr1
part2_init::toSpritePtr1: scope:[part2_init]  from part2_init::@8
  part2_init::s1#5 = phi( part2_init::@8/part2_init::s1#6 )
  part2_init::toSpritePtr1_sprite#1 = phi( part2_init::@8/part2_init::toSpritePtr1_sprite#0 )
  part2_init::toSpritePtr1_$1 = (unsigned int)part2_init::toSpritePtr1_sprite#1
  part2_init::toSpritePtr1_$0 = part2_init::toSpritePtr1_$1 / $40
  part2_init::toSpritePtr1_return#0 = (char)part2_init::toSpritePtr1_$0
  to:part2_init::toSpritePtr1_@return
part2_init::toSpritePtr1_@return: scope:[part2_init]  from part2_init::toSpritePtr1
  part2_init::s1#4 = phi( part2_init::toSpritePtr1/part2_init::s1#5 )
  part2_init::toSpritePtr1_return#2 = phi( part2_init::toSpritePtr1/part2_init::toSpritePtr1_return#0 )
  part2_init::toSpritePtr1_return#1 = part2_init::toSpritePtr1_return#2
  to:part2_init::@13
part2_init::@13: scope:[part2_init]  from part2_init::toSpritePtr1_@return
  part2_init::s1#3 = phi( part2_init::toSpritePtr1_@return/part2_init::s1#4 )
  part2_init::toSpritePtr1_return#3 = phi( part2_init::toSpritePtr1_@return/part2_init::toSpritePtr1_return#1 )
  part2_init::$16 = part2_init::toSpritePtr1_return#3
  part2_init::$17 = part2_init::$16 + ' '
  PLEX_PTR[part2_init::s1#3] = part2_init::$17
  part2_init::s1#1 = ++ part2_init::s1#3
  to:part2_init::@7
part2_init::@9: scope:[part2_init]  from part2_init::@7
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = 0
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_X) = 0
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 0
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = 0
  part2_init::s2#0 = 0
  to:part2_init::@10
part2_init::@10: scope:[part2_init]  from part2_init::@11 part2_init::@9
  part2_init::s2#2 = phi( part2_init::@11/part2_init::s2#1, part2_init::@9/part2_init::s2#0 )
  part2_init::$18 = part2_init::s2#2 < 8
  if(part2_init::$18) goto part2_init::@11
  to:part2_init::@12
part2_init::@11: scope:[part2_init]  from part2_init::@10
  part2_init::s2#3 = phi( part2_init::@10/part2_init::s2#2 )
  SPRITES_COLOR[part2_init::s2#3] = WHITE
  part2_init::s2#1 = ++ part2_init::s2#3
  to:part2_init::@10
part2_init::@12: scope:[part2_init]  from part2_init::@10
  memset::str#4 = (void *)PART2_SCREEN+$3e8
  memset::c#4 = BLACK
  memset::num#4 = $18
  call memset
  memset::return#6 = memset::return#1
  to:part2_init::@25
part2_init::@25: scope:[part2_init]  from part2_init::@12
  to:part2_init::@return
part2_init::@return: scope:[part2_init]  from part2_init::@25
  return 
  to:@return

void part2_run()
part2_run: scope:[part2_run]  from main::@5
  to:part2_run::SEI1
part2_run::SEI1: scope:[part2_run]  from part2_run
  asm { sei  }
  to:part2_run::@1
part2_run::@1: scope:[part2_run]  from part2_run::SEI1
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = BLACK
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLACK
  part2_run::toDd001_gfx#0 = PART2_SCREEN
  to:part2_run::toDd001
part2_run::toDd001: scope:[part2_run]  from part2_run::@1
  part2_run::toDd001_gfx#1 = phi( part2_run::@1/part2_run::toDd001_gfx#0 )
  part2_run::toDd001_$0 = byte1  (unsigned int)part2_run::toDd001_gfx#1
  part2_run::toDd001_$1 = part2_run::toDd001_$0 / $40
  part2_run::toDd001_$2 = 3 ^ part2_run::toDd001_$1
  part2_run::toDd001_return#0 = part2_run::toDd001_$2
  to:part2_run::toDd001_@return
part2_run::toDd001_@return: scope:[part2_run]  from part2_run::toDd001
  part2_run::toDd001_return#2 = phi( part2_run::toDd001/part2_run::toDd001_return#0 )
  part2_run::toDd001_return#1 = part2_run::toDd001_return#2
  to:part2_run::@2
part2_run::@2: scope:[part2_run]  from part2_run::toDd001_@return
  part2_run::toDd001_return#3 = phi( part2_run::toDd001_@return/part2_run::toDd001_return#1 )
  part2_run::$1 = part2_run::toDd001_return#3
  *((char *)CIA2+OFFSET_STRUCT_MOS6526_CIA_PORT_A) = part2_run::$1
  part2_run::toD0181_screen#0 = PART2_SCREEN
  part2_run::toD0181_gfx#0 = PART2_BITMAP
  to:part2_run::toD0181
part2_run::toD0181: scope:[part2_run]  from part2_run::@2
  part2_run::toD0181_gfx#1 = phi( part2_run::@2/part2_run::toD0181_gfx#0 )
  part2_run::toD0181_screen#1 = phi( part2_run::@2/part2_run::toD0181_screen#0 )
  part2_run::toD0181_$7 = (unsigned int)part2_run::toD0181_screen#1
  part2_run::toD0181_$0 = part2_run::toD0181_$7 & $3fff
  part2_run::toD0181_$1 = part2_run::toD0181_$0 * 4
  part2_run::toD0181_$2 = byte1  part2_run::toD0181_$1
  part2_run::toD0181_$3 = byte1  (unsigned int)part2_run::toD0181_gfx#1
  part2_run::toD0181_$4 = part2_run::toD0181_$3 / 4
  part2_run::toD0181_$5 = part2_run::toD0181_$4 & $f
  part2_run::toD0181_$6 = part2_run::toD0181_$2 | part2_run::toD0181_$5
  part2_run::toD0181_return#0 = part2_run::toD0181_$6
  to:part2_run::toD0181_@return
part2_run::toD0181_@return: scope:[part2_run]  from part2_run::toD0181
  part2_run::toD0181_return#2 = phi( part2_run::toD0181/part2_run::toD0181_return#0 )
  part2_run::toD0181_return#1 = part2_run::toD0181_return#2
  to:part2_run::@3
part2_run::@3: scope:[part2_run]  from part2_run::toD0181_@return
  part2_run::toD0181_return#3 = phi( part2_run::toD0181_@return/part2_run::toD0181_return#1 )
  part2_run::$2 = part2_run::toD0181_return#3
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = part2_run::$2
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM
  *SPRITES_ENABLE = $ff
  *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR
  asm { ldaCIA1_INTERRUPT  }
  *IRQ_STATUS = $f
  *VICII_CONTROL1 = *VICII_CONTROL1 & $7f
  *RASTER = BUCKET_YPOS[0]
  *IRQ_ENABLE = IRQ_RASTER
  *HARDWARE_IRQ = &irq_swing_top
  to:part2_run::CLI1
part2_run::CLI1: scope:[part2_run]  from part2_run::@3
  asm { cli  }
  to:part2_run::@4
part2_run::@4: scope:[part2_run]  from part2_run::CLI1
  plex_frame_id = 0
  plex_frame = BUCKET_SPRITES
  plex_id_offset = 0
  call part2_loop
  to:part2_run::@5
part2_run::@5: scope:[part2_run]  from part2_run::@4
  to:part2_run::@return
part2_run::@return: scope:[part2_run]  from part2_run::@5
  return 
  to:@return

void part2_loop()
part2_loop: scope:[part2_loop]  from part2_run::@4
  p2_work_ready = 0
  to:part2_loop::@1
part2_loop::@1: scope:[part2_loop]  from part2_loop part2_loop::@1 part2_loop::@7
  part2_loop::$0 = p2_work_ready == 0
  if(part2_loop::$0) goto part2_loop::@1
  to:part2_loop::@2
part2_loop::@2: scope:[part2_loop]  from part2_loop::@1
  call demo_work
  to:part2_loop::@11
part2_loop::@11: scope:[part2_loop]  from part2_loop::@2
  part2_loop::$17 = 0 != p2_logo_reveal_done
  part2_loop::$2 = ! part2_loop::$17
  part2_loop::$3 = p2_logo_revealing && part2_loop::$2
  part2_loop::$4 = ! part2_loop::$3
  if(part2_loop::$4) goto part2_loop::@4
  to:part2_loop::@3
part2_loop::@4: scope:[part2_loop]  from part2_loop::@11 part2_loop::@12
  part2_loop::$18 = 0 != p2_logo_revealing
  part2_loop::$6 = ! part2_loop::$18
  part2_loop::$7 = demo_frame_count > $12*$32+$19
  part2_loop::$8 = part2_loop::$6 && part2_loop::$7
  part2_loop::$9 = ! part2_loop::$8
  if(part2_loop::$9) goto part2_loop::@5
  to:part2_loop::@8
part2_loop::@3: scope:[part2_loop]  from part2_loop::@11
  call p2_logo_reveal
  to:part2_loop::@12
part2_loop::@12: scope:[part2_loop]  from part2_loop::@3
  to:part2_loop::@4
part2_loop::@5: scope:[part2_loop]  from part2_loop::@4 part2_loop::@8
  part2_loop::$19 = 0 != p2_logo_swinging
  part2_loop::$10 = ! part2_loop::$19
  part2_loop::$11 = part2_loop::$10 && p2_logo_reveal_done
  part2_loop::$12 = ! part2_loop::$11
  if(part2_loop::$12) goto part2_loop::@6
  to:part2_loop::@9
part2_loop::@8: scope:[part2_loop]  from part2_loop::@4
  p2_logo_revealing = 1
  to:part2_loop::@5
part2_loop::@6: scope:[part2_loop]  from part2_loop::@5 part2_loop::@9
  part2_loop::$20 = 0 != p2_plex_scroller_moving
  part2_loop::$13 = ! part2_loop::$20
  part2_loop::$14 = demo_frame_count > $1a*$32
  part2_loop::$15 = part2_loop::$13 && part2_loop::$14
  part2_loop::$16 = ! part2_loop::$15
  if(part2_loop::$16) goto part2_loop::@7
  to:part2_loop::@10
part2_loop::@9: scope:[part2_loop]  from part2_loop::@5
  p2_logo_swinging = 1
  to:part2_loop::@6
part2_loop::@7: scope:[part2_loop]  from part2_loop::@10 part2_loop::@6
  p2_work_ready = 0
  to:part2_loop::@1
part2_loop::@10: scope:[part2_loop]  from part2_loop::@6
  p2_plex_scroller_moving = 1
  to:part2_loop::@7
part2_loop::@return: scope:[part2_loop]  from
  return 
  to:@return

void p2_logo_reveal()
p2_logo_reveal: scope:[p2_logo_reveal]  from part2_loop::@3
  p2_logo_reveal::$0 = p2_logo_reveal_idx >= $28
  if(p2_logo_reveal::$0) goto p2_logo_reveal::@1
  to:p2_logo_reveal::@2
p2_logo_reveal::@1: scope:[p2_logo_reveal]  from p2_logo_reveal
  p2_logo_reveal_done = 1
  to:p2_logo_reveal::@return
p2_logo_reveal::@2: scope:[p2_logo_reveal]  from p2_logo_reveal
  vsp_update_screen::x_offset = p2_logo_reveal_idx
  call vsp_update_screen
  to:p2_logo_reveal::@3
p2_logo_reveal::@3: scope:[p2_logo_reveal]  from p2_logo_reveal::@2
  p2_logo_reveal_idx = ++ p2_logo_reveal_idx
  to:p2_logo_reveal::@return
p2_logo_reveal::@return: scope:[p2_logo_reveal]  from p2_logo_reveal::@1 p2_logo_reveal::@3
  return 
  to:@return

void plex_scroller_move()
plex_scroller_move: scope:[plex_scroller_move]  from irq_swing_plex::@16
  plex_scroller_move::x_idx#0 = x_movement_idx
  plex_scroller_move::s#0 = 0
  to:plex_scroller_move::@1
plex_scroller_move::@1: scope:[plex_scroller_move]  from plex_scroller_move plex_scroller_move::@4
  plex_scroller_move::x_idx#4 = phi( plex_scroller_move/plex_scroller_move::x_idx#0, plex_scroller_move::@4/plex_scroller_move::x_idx#1 )
  plex_scroller_move::s#2 = phi( plex_scroller_move/plex_scroller_move::s#0, plex_scroller_move::@4/plex_scroller_move::s#1 )
  plex_scroller_move::$0 = plex_scroller_move::s#2 < $20
  if(plex_scroller_move::$0) goto plex_scroller_move::@2
  to:plex_scroller_move::@3
plex_scroller_move::@2: scope:[plex_scroller_move]  from plex_scroller_move::@1
  plex_scroller_move::s#3 = phi( plex_scroller_move::@1/plex_scroller_move::s#2 )
  plex_scroller_move::x_idx#2 = phi( plex_scroller_move::@1/plex_scroller_move::x_idx#4 )
  PLEX_XPOS[plex_scroller_move::s#3] = XMOVEMENT[plex_scroller_move::x_idx#2]
  PLEX_XPOS_MSB[plex_scroller_move::s#3] = XMOVEMENT_HI[plex_scroller_move::x_idx#2]
  plex_scroller_move::$1 = plex_scroller_move::x_idx#2 == 0
  plex_scroller_move::$2 = ! plex_scroller_move::$1
  if(plex_scroller_move::$2) goto plex_scroller_move::@4
  to:plex_scroller_move::@8
plex_scroller_move::@3: scope:[plex_scroller_move]  from plex_scroller_move::@1
  x_movement_idx = ++ x_movement_idx
  to:plex_scroller_move::@return
plex_scroller_move::@4: scope:[plex_scroller_move]  from plex_scroller_move::@10 plex_scroller_move::@2
  plex_scroller_move::s#4 = phi( plex_scroller_move::@10/plex_scroller_move::s#5, plex_scroller_move::@2/plex_scroller_move::s#3 )
  plex_scroller_move::x_idx#3 = phi( plex_scroller_move::@10/plex_scroller_move::x_idx#5, plex_scroller_move::@2/plex_scroller_move::x_idx#2 )
  plex_scroller_move::x_idx#1 = plex_scroller_move::x_idx#3 + 8
  plex_scroller_move::s#1 = ++ plex_scroller_move::s#4
  to:plex_scroller_move::@1
plex_scroller_move::@8: scope:[plex_scroller_move]  from plex_scroller_move::@2
  plex_scroller_move::x_idx#11 = phi( plex_scroller_move::@2/plex_scroller_move::x_idx#2 )
  plex_scroller_move::s#11 = phi( plex_scroller_move::@2/plex_scroller_move::s#3 )
  plex_scroller_move::$3 = *scroll_text_next == 0
  plex_scroller_move::$4 = ! plex_scroller_move::$3
  if(plex_scroller_move::$4) goto plex_scroller_move::@5
  to:plex_scroller_move::@9
plex_scroller_move::@5: scope:[plex_scroller_move]  from plex_scroller_move::@8 plex_scroller_move::@9
  plex_scroller_move::x_idx#9 = phi( plex_scroller_move::@8/plex_scroller_move::x_idx#11, plex_scroller_move::@9/plex_scroller_move::x_idx#12 )
  plex_scroller_move::s#9 = phi( plex_scroller_move::@8/plex_scroller_move::s#11, plex_scroller_move::@9/plex_scroller_move::s#12 )
  plex_scroller_move::letter#0 = *scroll_text_next
  scroll_text_next = ++ scroll_text_next
  plex_scroller_move::$5 = plex_scroller_move::letter#0 == $ff
  plex_scroller_move::$6 = ! plex_scroller_move::$5
  if(plex_scroller_move::$6) goto plex_scroller_move::@6
  to:plex_scroller_move::@7
plex_scroller_move::@9: scope:[plex_scroller_move]  from plex_scroller_move::@8
  plex_scroller_move::x_idx#12 = phi( plex_scroller_move::@8/plex_scroller_move::x_idx#11 )
  plex_scroller_move::s#12 = phi( plex_scroller_move::@8/plex_scroller_move::s#11 )
  scroll_text_next = SCROLL_TEXT
  to:plex_scroller_move::@5
plex_scroller_move::@6: scope:[plex_scroller_move]  from plex_scroller_move::@5 plex_scroller_move::@7
  plex_scroller_move::x_idx#8 = phi( plex_scroller_move::@5/plex_scroller_move::x_idx#9, plex_scroller_move::@7/plex_scroller_move::x_idx#10 )
  plex_scroller_move::s#8 = phi( plex_scroller_move::@5/plex_scroller_move::s#9, plex_scroller_move::@7/plex_scroller_move::s#10 )
  plex_scroller_move::letter#5 = phi( plex_scroller_move::@5/plex_scroller_move::letter#0, plex_scroller_move::@7/plex_scroller_move::letter#1 )
  plex_scroller_move::toSpritePtr1_sprite#0 = PART2_SPRITES
  to:plex_scroller_move::toSpritePtr1
plex_scroller_move::toSpritePtr1: scope:[plex_scroller_move]  from plex_scroller_move::@6
  plex_scroller_move::x_idx#7 = phi( plex_scroller_move::@6/plex_scroller_move::x_idx#8 )
  plex_scroller_move::s#7 = phi( plex_scroller_move::@6/plex_scroller_move::s#8 )
  plex_scroller_move::letter#4 = phi( plex_scroller_move::@6/plex_scroller_move::letter#5 )
  plex_scroller_move::toSpritePtr1_sprite#1 = phi( plex_scroller_move::@6/plex_scroller_move::toSpritePtr1_sprite#0 )
  plex_scroller_move::toSpritePtr1_$1 = (unsigned int)plex_scroller_move::toSpritePtr1_sprite#1
  plex_scroller_move::toSpritePtr1_$0 = plex_scroller_move::toSpritePtr1_$1 / $40
  plex_scroller_move::toSpritePtr1_return#0 = (char)plex_scroller_move::toSpritePtr1_$0
  to:plex_scroller_move::toSpritePtr1_@return
plex_scroller_move::toSpritePtr1_@return: scope:[plex_scroller_move]  from plex_scroller_move::toSpritePtr1
  plex_scroller_move::x_idx#6 = phi( plex_scroller_move::toSpritePtr1/plex_scroller_move::x_idx#7 )
  plex_scroller_move::s#6 = phi( plex_scroller_move::toSpritePtr1/plex_scroller_move::s#7 )
  plex_scroller_move::letter#3 = phi( plex_scroller_move::toSpritePtr1/plex_scroller_move::letter#4 )
  plex_scroller_move::toSpritePtr1_return#2 = phi( plex_scroller_move::toSpritePtr1/plex_scroller_move::toSpritePtr1_return#0 )
  plex_scroller_move::toSpritePtr1_return#1 = plex_scroller_move::toSpritePtr1_return#2
  to:plex_scroller_move::@10
plex_scroller_move::@10: scope:[plex_scroller_move]  from plex_scroller_move::toSpritePtr1_@return
  plex_scroller_move::x_idx#5 = phi( plex_scroller_move::toSpritePtr1_@return/plex_scroller_move::x_idx#6 )
  plex_scroller_move::s#5 = phi( plex_scroller_move::toSpritePtr1_@return/plex_scroller_move::s#6 )
  plex_scroller_move::letter#2 = phi( plex_scroller_move::toSpritePtr1_@return/plex_scroller_move::letter#3 )
  plex_scroller_move::toSpritePtr1_return#3 = phi( plex_scroller_move::toSpritePtr1_@return/plex_scroller_move::toSpritePtr1_return#1 )
  plex_scroller_move::$7 = plex_scroller_move::toSpritePtr1_return#3
  plex_scroller_move::$8 = plex_scroller_move::$7 + plex_scroller_move::letter#2
  PLEX_PTR[plex_scroller_move::s#5] = plex_scroller_move::$8
  to:plex_scroller_move::@4
plex_scroller_move::@7: scope:[plex_scroller_move]  from plex_scroller_move::@5
  plex_scroller_move::x_idx#10 = phi( plex_scroller_move::@5/plex_scroller_move::x_idx#9 )
  plex_scroller_move::s#10 = phi( plex_scroller_move::@5/plex_scroller_move::s#9 )
  plex_scroller_move::letter#1 = 0
  to:plex_scroller_move::@6
plex_scroller_move::@return: scope:[plex_scroller_move]  from plex_scroller_move::@3
  return 
  to:@return

__interrupt(hardware_clobber) void irq_swing_top()
irq_swing_top: scope:[irq_swing_top]  from
  call plexFrameStart
  to:irq_swing_top::@1
irq_swing_top::@1: scope:[irq_swing_top]  from irq_swing_top
  plex_bucket = plex_frame
  plex_bucket_id = 0
  plexBucketShow::bucket#0 = plex_bucket
  call plexBucketShow
  to:irq_swing_top::@2
irq_swing_top::@2: scope:[irq_swing_top]  from irq_swing_top::@1
  irq_swing_top::$2 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
  plex_bucket = plex_bucket + irq_swing_top::$2
  plex_bucket_id = ++ plex_bucket_id
  *IRQ_STATUS = IRQ_RASTER
  *HARDWARE_IRQ = &irq_swing_vsp
  *RASTER = IRQ_SWING_VSP_LINE
  to:irq_swing_top::@return
irq_swing_top::@return: scope:[irq_swing_top]  from irq_swing_top::@2
  return 
  to:@return

__interrupt(hardware_clobber) void irq_swing_vsp()
irq_swing_vsp: scope:[irq_swing_vsp]  from
  to:irq_swing_vsp::vsp_perform1
irq_swing_vsp::vsp_perform1: scope:[irq_swing_vsp]  from irq_swing_vsp
  kickasm( uses vsp_scroll uses HARDWARE_IRQ uses RASTER uses IRQ_STATUS uses IRQ_RASTER uses VICII_CONTROL1) {{ // Stabilize the raster by using the double IRQ method
        // Acknowledge the IRQ
        lda #IRQ_RASTER
        sta IRQ_STATUS
        // Set-up IRQ for the next line
        inc RASTER
        // Point IRQ to almost stable code
        lda #<stable
        sta HARDWARE_IRQ
        lda #>stable
        sta HARDWARE_IRQ+1
        tsx       // Save stack pointer
        cli       // Reenable interrupts
        // Wait for new IRQ using NOP's to ensure minimal jitter when it hits
        .fill 15, NOP
        .align $100
    stable:
        txs             // Restore stack pointer
        ldx #9          // Wait till the raster has almost crossed to the next line (48 cycles)
        !: dex
        bne !-
        nop
        lda RASTER
        cmp RASTER
        bne !+          // And correct the last cycle of potential jitter
        !:
        // Raster is now completely stable! (Line $2f cycle 7)
        // Perform VSP by waiting an exact number of cycles and then enabling the display
        // See http://www.zimmers.net/cbmpics/cbm/c64/vic-ii.txt (Section 3.14.6. DMA delay)
        ldx #8          // Wait 45 cycles to get the VSP timing right
        !: dex
        bne !-
        nop
        nop
        lda vsp_scroll
        lsr         //  Put bit 0 into carry 
        bcc dma1    // Spend 2 or 3 cycles depending on the carry (bit 0)
    dma1:
        sta dma2+1  // Update the branch
        clv
    dma2:
        bvc dma2    // This branch is updated with vsp_scroll/2 - changing the number of NOP's executed
        // 20 NOP's - enabling vsp scroll from 0-40
        .fill 20, NOP
        ldx #$18
        lda #$1b  // TODO: To control Y-scrolling this must be flexible!
        // The STX $d011 must be line $30 cycle $10 for vsp_scroll==0
        stx VICII_CONTROL1 // Enable the display - starts DMA
        sta VICII_CONTROL1
     }}
  to:irq_swing_vsp::@1
irq_swing_vsp::@1: scope:[irq_swing_vsp]  from irq_swing_vsp::vsp_perform1
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM
  irq_swing_vsp::$1 = vsp_fine_scroll | VICII_MCM
  *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) = irq_swing_vsp::$1
  *IRQ_STATUS = IRQ_RASTER
  *HARDWARE_IRQ = &irq_swing_plex
  *RASTER = BUCKET_YPOS[1]
  to:irq_swing_vsp::@return
irq_swing_vsp::@return: scope:[irq_swing_vsp]  from irq_swing_vsp::@1
  return 
  to:@return

__interrupt(hardware_clobber) void irq_swing_plex()
irq_swing_plex: scope:[irq_swing_plex]  from
  plexBucketShow::bucket#1 = plex_bucket
  call plexBucketShow
  to:irq_swing_plex::@18
irq_swing_plex::@18: scope:[irq_swing_plex]  from irq_swing_plex
  irq_swing_plex::$23 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
  plex_bucket = plex_bucket + irq_swing_plex::$23
  plex_bucket_id = ++ plex_bucket_id
  irq_swing_plex::$1 = plex_bucket_id < 9
  if(irq_swing_plex::$1) goto irq_swing_plex::@1
  to:irq_swing_plex::@3
irq_swing_plex::@1: scope:[irq_swing_plex]  from irq_swing_plex::@18
  *HARDWARE_IRQ = &irq_swing_plex
  *RASTER = BUCKET_YPOS[plex_bucket_id]
  to:irq_swing_plex::@2
irq_swing_plex::@3: scope:[irq_swing_plex]  from irq_swing_plex::@18
  *HARDWARE_IRQ = &irq_swing_top
  *RASTER = BUCKET_YPOS[0]
  plex_frame_id = plex_frame_id + irq_swing_plex::YMOVE
  irq_swing_plex::$24 = (unsigned int)irq_swing_plex::YMOVE*9*8 * SIZEOF_STRUCT_BUCKETSPRITE
  plex_frame = plex_frame + irq_swing_plex::$24
  irq_swing_plex::$2 = plex_frame_id >= 8
  irq_swing_plex::$3 = ! irq_swing_plex::$2
  if(irq_swing_plex::$3) goto irq_swing_plex::@5
  to:irq_swing_plex::@4
irq_swing_plex::@5: scope:[irq_swing_plex]  from irq_swing_plex::@3 irq_swing_plex::@4
  update_frame_plex_id_offset::plex_frame_id#0 = plex_frame_id
  call update_frame_plex_id_offset
  to:irq_swing_plex::@19
irq_swing_plex::@19: scope:[irq_swing_plex]  from irq_swing_plex::@5
  irq_swing_plex::$29 = 0 != p2_logo_swinging
  irq_swing_plex::$5 = ! irq_swing_plex::$29
  if(irq_swing_plex::$5) goto irq_swing_plex::@6
  to:irq_swing_plex::@13
irq_swing_plex::@4: scope:[irq_swing_plex]  from irq_swing_plex::@3
  irq_swing_plex::$25 = 9*8*8 * SIZEOF_STRUCT_BUCKETSPRITE
  plex_frame = plex_frame - irq_swing_plex::$25
  plex_frame_id = plex_frame_id - 8
  plex_id_offset = -- plex_id_offset
  to:irq_swing_plex::@5
irq_swing_plex::@6: scope:[irq_swing_plex]  from irq_swing_plex::@19 irq_swing_plex::@8
  irq_swing_plex::$30 = 0 != p2_plex_scroller_moving
  irq_swing_plex::$17 = ! irq_swing_plex::$30
  if(irq_swing_plex::$17) goto irq_swing_plex::@9
  to:irq_swing_plex::@16
irq_swing_plex::@13: scope:[irq_swing_plex]  from irq_swing_plex::@19
  irq_swing_plex::$27 = (unsigned int)vsp_sin_idx
  irq_swing_plex::$26 = irq_swing_plex::$27 * SIZEOF_UNSIGNED_INT
  irq_swing_plex::scroll#0 = VSP_SINTABLE[irq_swing_plex::$26]
  vsp_sin_idx = ++ vsp_sin_idx
  irq_swing_plex::$28 = (char)irq_swing_plex::scroll#0
  irq_swing_plex::$6 = irq_swing_plex::$28 & 7
  vsp_fine_scroll = irq_swing_plex::$6
  irq_swing_plex::$7 = irq_swing_plex::scroll#0 / 8
  irq_swing_plex::new_coarse_scroll#0 = (char)irq_swing_plex::$7
  irq_swing_plex::coarse_scroll_diff#0 = vsp_coarse_scroll - irq_swing_plex::new_coarse_scroll#0
  irq_swing_plex::$9 = irq_swing_plex::coarse_scroll_diff#0 == 1
  if(irq_swing_plex::$9) goto irq_swing_plex::@7
  to:irq_swing_plex::@14
irq_swing_plex::@7: scope:[irq_swing_plex]  from irq_swing_plex::@13
  irq_swing_plex::new_coarse_scroll#5 = phi( irq_swing_plex::@13/irq_swing_plex::new_coarse_scroll#0 )
  irq_swing_plex::x_offset1#0 = $50 - vsp_coarse_scroll
  vsp_update_screen::x_offset = irq_swing_plex::x_offset1#0
  call vsp_update_screen
  to:irq_swing_plex::@20
irq_swing_plex::@20: scope:[irq_swing_plex]  from irq_swing_plex::@7
  irq_swing_plex::new_coarse_scroll#3 = phi( irq_swing_plex::@7/irq_swing_plex::new_coarse_scroll#5 )
  to:irq_swing_plex::@8
irq_swing_plex::@14: scope:[irq_swing_plex]  from irq_swing_plex::@13
  irq_swing_plex::new_coarse_scroll#2 = phi( irq_swing_plex::@13/irq_swing_plex::new_coarse_scroll#0 )
  irq_swing_plex::coarse_scroll_diff#1 = phi( irq_swing_plex::@13/irq_swing_plex::coarse_scroll_diff#0 )
  irq_swing_plex::$10 = irq_swing_plex::coarse_scroll_diff#1 == $ff
  irq_swing_plex::$11 = ! irq_swing_plex::$10
  if(irq_swing_plex::$11) goto irq_swing_plex::@8
  to:irq_swing_plex::@15
irq_swing_plex::@15: scope:[irq_swing_plex]  from irq_swing_plex::@14
  irq_swing_plex::new_coarse_scroll#6 = phi( irq_swing_plex::@14/irq_swing_plex::new_coarse_scroll#2 )
  irq_swing_plex::x_offset#0 = $27 - vsp_coarse_scroll
  vsp_update_screen::x_offset = irq_swing_plex::x_offset#0
  call vsp_update_screen
  to:irq_swing_plex::@21
irq_swing_plex::@21: scope:[irq_swing_plex]  from irq_swing_plex::@15
  irq_swing_plex::new_coarse_scroll#4 = phi( irq_swing_plex::@15/irq_swing_plex::new_coarse_scroll#6 )
  irq_swing_plex::x_offset#1 = phi( irq_swing_plex::@15/irq_swing_plex::x_offset#0 )
  (PART2_SCREEN+$18*$28)[irq_swing_plex::x_offset#1] = 0
  (COLS+$18*$28)[irq_swing_plex::x_offset#1] = 0
  to:irq_swing_plex::@8
irq_swing_plex::@8: scope:[irq_swing_plex]  from irq_swing_plex::@14 irq_swing_plex::@20 irq_swing_plex::@21
  irq_swing_plex::new_coarse_scroll#1 = phi( irq_swing_plex::@14/irq_swing_plex::new_coarse_scroll#2, irq_swing_plex::@20/irq_swing_plex::new_coarse_scroll#3, irq_swing_plex::@21/irq_swing_plex::new_coarse_scroll#4 )
  vsp_coarse_scroll = irq_swing_plex::new_coarse_scroll#1
  irq_swing_plex::$16 = $28 - vsp_coarse_scroll
  vsp_scroll = irq_swing_plex::$16
  to:irq_swing_plex::@6
irq_swing_plex::@9: scope:[irq_swing_plex]  from irq_swing_plex::@11 irq_swing_plex::@6
  p2_work_ready = 1
  to:irq_swing_plex::@2
irq_swing_plex::@16: scope:[irq_swing_plex]  from irq_swing_plex::@6
  call plex_scroller_move
  to:irq_swing_plex::@22
irq_swing_plex::@22: scope:[irq_swing_plex]  from irq_swing_plex::@16
  sprite_color_idx = ++ sprite_color_idx
  irq_swing_plex::$19 = sizeof  SPRITE_COLOR_SEQUENCE
  irq_swing_plex::$20 = sprite_color_idx == irq_swing_plex::$19
  irq_swing_plex::$21 = ! irq_swing_plex::$20
  if(irq_swing_plex::$21) goto irq_swing_plex::@10
  to:irq_swing_plex::@17
irq_swing_plex::@10: scope:[irq_swing_plex]  from irq_swing_plex::@17 irq_swing_plex::@22
  irq_swing_plex::s#0 = 0
  to:irq_swing_plex::@11
irq_swing_plex::@17: scope:[irq_swing_plex]  from irq_swing_plex::@22
  sprite_color_idx = 0
  to:irq_swing_plex::@10
irq_swing_plex::@11: scope:[irq_swing_plex]  from irq_swing_plex::@10 irq_swing_plex::@12
  irq_swing_plex::s#2 = phi( irq_swing_plex::@10/irq_swing_plex::s#0, irq_swing_plex::@12/irq_swing_plex::s#1 )
  irq_swing_plex::$22 = irq_swing_plex::s#2 < 8
  if(irq_swing_plex::$22) goto irq_swing_plex::@12
  to:irq_swing_plex::@9
irq_swing_plex::@12: scope:[irq_swing_plex]  from irq_swing_plex::@11
  irq_swing_plex::s#3 = phi( irq_swing_plex::@11/irq_swing_plex::s#2 )
  SPRITES_COLOR[irq_swing_plex::s#3] = SPRITE_COLOR_SEQUENCE[sprite_color_idx]
  irq_swing_plex::s#1 = ++ irq_swing_plex::s#3
  to:irq_swing_plex::@11
irq_swing_plex::@2: scope:[irq_swing_plex]  from irq_swing_plex::@1 irq_swing_plex::@9
  *IRQ_STATUS = IRQ_RASTER
  to:irq_swing_plex::@return
irq_swing_plex::@return: scope:[irq_swing_plex]  from irq_swing_plex::@2
  return 
  to:@return

void update_frame_plex_id_offset(char plex_frame_id)
update_frame_plex_id_offset: scope:[update_frame_plex_id_offset]  from irq_swing_plex::@5
  update_frame_plex_id_offset::plex_frame_id#1 = phi( irq_swing_plex::@5/update_frame_plex_id_offset::plex_frame_id#0 )
  update_frame_plex_id_offset::$0 = update_frame_plex_id_offset::plex_frame_id#1 * SIZEOF_UNSIGNED_INT
  update_frame_plex_id_offset::jmp_address = update_frame_plex_id_offset::jmp_table[update_frame_plex_id_offset::$0]
  kickasm( uses update_frame_plex_id_offset::jmp_address) {{ lda jmp_address
        sta call+1
        lda jmp_address+1
        sta call+2
        call: jsr $0000
     }}
  to:update_frame_plex_id_offset::@return
update_frame_plex_id_offset::@return: scope:[update_frame_plex_id_offset]  from update_frame_plex_id_offset
  return 
  to:@return

void vsp_update_screen(volatile char x_offset)
vsp_update_screen: scope:[vsp_update_screen]  from irq_swing_plex::@15 irq_swing_plex::@7 p2_logo_reveal::@2
  kickasm( uses vsp_update_screen::x_offset uses PART2_SCREEN uses COLS uses LOGO_DATA uses LOGO_DATA_COLORS) {{ ldx x_offset
        .for(var row=0;row<24;row++) {
            lda LOGO_DATA+80*row,x
            sta PART2_SCREEN+40*row,x
            lda LOGO_DATA_COLORS+80*row,x
            sta COLS+40*row,x
        }
     }}
  *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  *PROCPORT = PROCPORT_RAM_ALL
  vsp_update_screen::$5 = (unsigned int)vsp_update_screen::x_offset
  vsp_update_screen::x_offset8 = vsp_update_screen::$5 * 8
  vsp_update_screen::$1 = byte1  vsp_update_screen::x_offset8
  vsp_update_screen::$2 = vsp_update_screen::$1 == 0
  if(vsp_update_screen::$2) goto vsp_update_screen::@1
  to:vsp_update_screen::@4
vsp_update_screen::@1: scope:[vsp_update_screen]  from vsp_update_screen
  kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+row*40*8+pix,y
                }
         }}
  to:vsp_update_screen::@3
vsp_update_screen::@4: scope:[vsp_update_screen]  from vsp_update_screen
  vsp_update_screen::$3 = byte1  vsp_update_screen::x_offset8
  vsp_update_screen::$4 = vsp_update_screen::$3 == 1
  if(vsp_update_screen::$4) goto vsp_update_screen::@2
  to:vsp_update_screen::@5
vsp_update_screen::@2: scope:[vsp_update_screen]  from vsp_update_screen::@4
  kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+$100+row*40*8+pix,y
                }
         }}
  to:vsp_update_screen::@3
vsp_update_screen::@5: scope:[vsp_update_screen]  from vsp_update_screen::@4
  kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+$200+row*40*8+pix,y
                }
         }}
  to:vsp_update_screen::@3
vsp_update_screen::@3: scope:[vsp_update_screen]  from vsp_update_screen::@1 vsp_update_screen::@2 vsp_update_screen::@5
  *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  *PROCPORT = PROCPORT_RAM_IO
  to:vsp_update_screen::@return
vsp_update_screen::@return: scope:[vsp_update_screen]  from vsp_update_screen::@3
  return 
  to:@return

void main()
main: scope:[main]  from __start::@1
  call demo_init
  to:main::@7
main::@7: scope:[main]  from main
  byteboozer_decrunch::crunched = DEMO_MUSIC_CRUNCHED
  call byteboozer_decrunch
  to:main::@8
main::@8: scope:[main]  from main::@7
  asm { lda#0  }
  callexecute *musicInit 
  to:main::@1
main::@1: scope:[main]  from main::@8
  call demo_start
  to:main::@9
main::@9: scope:[main]  from main::@1
  call part1_init
  to:main::@10
main::@10: scope:[main]  from main::@9
  to:main::@2
main::@2: scope:[main]  from main::@10 main::@2
  main::$8 = demo_frame_count < 5*$32
  if(main::$8) goto main::@2
  to:main::@3
main::@3: scope:[main]  from main::@2
  call part1_run
  to:main::@11
main::@11: scope:[main]  from main::@3
  call part2_init
  to:main::@12
main::@12: scope:[main]  from main::@11
  to:main::@4
main::@4: scope:[main]  from main::@12 main::@4
  main::$9 = demo_frame_count < $10*$32
  if(main::$9) goto main::@4
  to:main::@5
main::@5: scope:[main]  from main::@4
  sparkler_active = 0
  call part2_run
  to:main::@13
main::@13: scope:[main]  from main::@5
  to:main::@6
main::@6: scope:[main]  from main::@13 main::@6
  to:main::@6
main::@return: scope:[main]  from
  return 
  to:@return

void demo_init()
demo_init: scope:[demo_init]  from demo_start main
  to:demo_init::SEI1
demo_init::SEI1: scope:[demo_init]  from demo_init
  asm { sei  }
  to:demo_init::@1
demo_init::@1: scope:[demo_init]  from demo_init::SEI1
  *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  *PROCPORT = PROCPORT_RAM_IO
  *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR
  asm { ldaCIA1_INTERRUPT  }
  *IRQ_STATUS = $f
  to:demo_init::@return
demo_init::@return: scope:[demo_init]  from demo_init::@1
  return 
  to:@return

void sparkler_anim()
sparkler_anim: scope:[sparkler_anim]  from demo_work::@2
  sparkler_idx = ++ sparkler_idx
  sparkler_anim::$0 = sparkler_idx == $1e
  sparkler_anim::$1 = ! sparkler_anim::$0
  if(sparkler_anim::$1) goto sparkler_anim::@1
  to:sparkler_anim::@2
sparkler_anim::@1: scope:[sparkler_anim]  from sparkler_anim sparkler_anim::@2
  sparkler_anim::toSpritePtr1_sprite#0 = P1_SPRITES
  to:sparkler_anim::toSpritePtr1
sparkler_anim::toSpritePtr1: scope:[sparkler_anim]  from sparkler_anim::@1
  sparkler_anim::toSpritePtr1_sprite#1 = phi( sparkler_anim::@1/sparkler_anim::toSpritePtr1_sprite#0 )
  sparkler_anim::toSpritePtr1_$1 = (unsigned int)sparkler_anim::toSpritePtr1_sprite#1
  sparkler_anim::toSpritePtr1_$0 = sparkler_anim::toSpritePtr1_$1 / $40
  sparkler_anim::toSpritePtr1_return#0 = (char)sparkler_anim::toSpritePtr1_$0
  to:sparkler_anim::toSpritePtr1_@return
sparkler_anim::toSpritePtr1_@return: scope:[sparkler_anim]  from sparkler_anim::toSpritePtr1
  sparkler_anim::toSpritePtr1_return#2 = phi( sparkler_anim::toSpritePtr1/sparkler_anim::toSpritePtr1_return#0 )
  sparkler_anim::toSpritePtr1_return#1 = sparkler_anim::toSpritePtr1_return#2
  to:sparkler_anim::@3
sparkler_anim::@3: scope:[sparkler_anim]  from sparkler_anim::toSpritePtr1_@return
  sparkler_anim::toSpritePtr1_return#3 = phi( sparkler_anim::toSpritePtr1_@return/sparkler_anim::toSpritePtr1_return#1 )
  sparkler_anim::$2 = sparkler_anim::toSpritePtr1_return#3
  sparkler_anim::$3 = sparkler_idx / 2
  sparkler_anim::$4 = sparkler_anim::$2 + sparkler_anim::$3
  P1_SCREEN_SPRITE_PTRS[0] = sparkler_anim::$4
  to:sparkler_anim::@return
sparkler_anim::@2: scope:[sparkler_anim]  from sparkler_anim
  sparkler_idx = 0
  to:sparkler_anim::@1
sparkler_anim::@return: scope:[sparkler_anim]  from sparkler_anim::@3
  return 
  to:@return

__interrupt(hardware_clobber) void irq_demo()
irq_demo: scope:[irq_demo]  from
  *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  irq_demo::port_value#0 = *PROCPORT
  *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  *PROCPORT = PROCPORT_RAM_IO
  call demo_work
  to:irq_demo::@1
irq_demo::@1: scope:[irq_demo]  from irq_demo
  irq_demo::port_value#1 = phi( irq_demo/irq_demo::port_value#0 )
  *IRQ_STATUS = IRQ_RASTER
  *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  *PROCPORT = irq_demo::port_value#1
  to:irq_demo::@return
irq_demo::@return: scope:[irq_demo]  from irq_demo::@1
  return 
  to:@return

void __start()
__start: scope:[__start]  from
  to:__start::__init1
__start::__init1: scope:[__start]  from __start
  p1_work_ready = 0
  irq_flipper_top_line = 0
  irq_flipper_bottom_line = 8
  flipper_done = 0
  irq_flipper_idx = 0
  flipper_charline = 0
  vsp_scroll = 0
  plex_real_sprite_idx = 0
  p2_work_ready = 0
  p2_logo_revealing = 0
  p2_logo_reveal_done = 0
  p2_logo_swinging = 0
  p2_plex_scroller_moving = 0
  p2_logo_reveal_idx = 0
  x_movement_idx = 0
  scroll_text_next = SCROLL_TEXT
  plex_frame_id = 0
  plex_frame = BUCKET_SPRITES
  plex_id_offset = 0
  plex_bucket = BUCKET_SPRITES
  plex_bucket_id = 0
  vsp_fine_scroll = 0
  vsp_coarse_scroll = 0
  vsp_sin_idx = $40
  sprite_color_idx = 0
  demo_frame_count = 0
  sparkler_active = 0
  sparkler_idx = 0
  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 BG_COLOR = (char *)$d021
__constant const char BLACK = 0
__constant const char BLUE = 6
__constant char * const BORDER_COLOR = (char *)$d020
__constant const char BROWN = 9
__constant struct BucketSprite BUCKET_SPRITES[8*9*8] = { fill( 8*9*8, 0) }
__constant char BUCKET_YPOS[9] = { $10, $48, $58, $72, $8e, $aa, $c0, $d0, $de }
__constant char BYTEBOOZER[] = kickasm {{ .const B2_ZP_BASE = $fc
    #import "byteboozer_decrunch.asm"
 }}
__constant char * const CHARGEN = (char *)$d000
__constant struct MOS6526_CIA * const CIA1 = (struct MOS6526_CIA *)$dc00
__constant char * const CIA1_INTERRUPT = (char *)$dc0d
__constant struct MOS6526_CIA * const CIA2 = (struct MOS6526_CIA *)$dd00
__constant const char CIA_INTERRUPT_CLEAR = $7f
__constant char * const COLS = (char *)$d800
__constant const char CYAN = 3
__constant char * const DEFAULT_SCREEN = (char *)$400
__constant char * const DEMO_MUSIC = (char *)$ac00
__constant char DEMO_MUSIC_CRUNCHED[] = kickasm(  uses DEMO_MUSIC) {{ .modify B2() {
        .pc = DEMO_MUSIC "MUSIC"
        .const music = LoadSid("do-it-again-$AC00-$FA-8580.sid")
        .fill music.size, music.getData(i)
    }
 }}
__constant unsigned int * const FLIPPER_EASING = (unsigned int *)$a400
__constant char FLIPPER_EASING_CRUNCHED[] = kickasm {{ .modify B2() {
        .pc = FLIPPER_EASING "FLIPPER_EASING"
        .fillword $130, round($98+$98*cos(PI+PI*i/$130))
    }
 }}
__constant const char GREEN = 5
__constant const char GREY = $c
__constant void (** const HARDWARE_IRQ)() = (void (**)())$fffe
__constant char * const IRQ_ENABLE = (char *)$d01a
__constant const char IRQ_PART1_TOP_LINE = $36
__constant const char IRQ_RASTER = 1
__constant char * const IRQ_STATUS = (char *)$d019
__constant const char IRQ_SWING_VSP_LINE = $2d
__constant const char LIGHT_BLUE = $e
__constant const char LIGHT_GREEN = $d
__constant char * const LOAD_CHARSET = (char *)$f000
__constant char * const LOAD_COLORS = (char *)$f800
__constant char * const LOAD_SCREEN = (char *)$e400
__constant char * const LOGO_DATA = (char *)$5400
__constant char * const LOGO_DATA_BITMAP = LOGO_DATA_COLORS+LOGO_HEIGHT*LOGO_WIDTH
__constant char * const LOGO_DATA_COLORS = LOGO_DATA_SCREEN+LOGO_HEIGHT*LOGO_WIDTH
__constant char LOGO_DATA_CRUNCHED[] = kickasm(  uses LOGO_HEIGHT uses LOGO_WIDTH) {{ .modify B2() {
            .pc = LOGO_DATA "LOGO DATA"
            #import "mcbitmap.asm"
            .var mcBmmData2 = getMcBitmapData(LoadPicture("logo-bitmap-640.png"))    
            // Screen data
            .for (var y=0; y<LOGO_HEIGHT; y++)
                .for (var x=0; x<LOGO_WIDTH; x++)
                    .byte getMcScreenData(x, y, mcBmmData2)
            // Color Data
            .for (var y=0; y<LOGO_HEIGHT; y++)
                .for (var x=0; x<LOGO_WIDTH; x++)
                    .byte getMcColorData(x, y, mcBmmData2)
            // Bitmap Data (row by row)
            .for (var y=0; y<LOGO_HEIGHT; y++)
                .for (var i=0; i<8; i++)
                    .for (var x=0; x<LOGO_WIDTH; x++)
                        .byte getMcPixelData(x, y, i, mcBmmData2)
        }
 }}
__constant char * const LOGO_DATA_CRUNCHED2 = (char *)$8800
__constant const unsigned int LOGO_DATA_CRUNCHED_SIZE = $222d
__constant char * const LOGO_DATA_SCREEN = LOGO_DATA
__constant const char LOGO_HEIGHT = $19
__constant const char LOGO_WIDTH = $50
__constant char OFFSET_STRUCT_BUCKETSPRITE_PLEX_ID = 1
__constant char OFFSET_STRUCT_BUCKETSPRITE_YPOS = 0
__constant char OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d
__constant char OFFSET_STRUCT_MOS6526_CIA_PORT_A = 0
__constant char OFFSET_STRUCT_MOS6569_VICII_BG_COLOR = $21
__constant char OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR = $20
__constant char OFFSET_STRUCT_MOS6569_VICII_CONTROL1 = $11
__constant char OFFSET_STRUCT_MOS6569_VICII_CONTROL2 = $16
__constant char OFFSET_STRUCT_MOS6569_VICII_MEMORY = $18
__constant char OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR = $27
__constant char OFFSET_STRUCT_MOS6569_VICII_SPRITE0_X = 0
__constant char OFFSET_STRUCT_MOS6569_VICII_SPRITE0_Y = 1
__constant char OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE = $15
__constant char OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC = $1c
__constant char OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1 = $25
__constant char OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2 = $26
__constant char OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB = $10
__constant struct BucketSprite ORIGINAL_BUCKET_SPRITES[8*9*8] = { fill( 8*9*8, 0) }
__constant char * const P1_COLORS = (char *)$a800
__constant char P1_COLORS_CRUNCHED[] = kickasm(  uses P1_COLORS) {{ .modify B2() {
        .pc = P1_COLORS "HAPPYNEWYEAR COLORS"    
        .for (var y=0; y<25; y++)
            .for (var x=0; x<40; x++)
                .byte getMcColorData(x, y, mcBmmData1)
    }
 }}
__constant char * const P1_PIXELS = (char *)$c000
__constant char P1_PIXELS_CRUNCHED[] = kickasm(  uses P1_PIXELS) {{ .modify B2() {
        .pc = P1_PIXELS "HAPPYNEWYEAR PIXELS"    
        #import "mcbitmap.asm"
        .var mcBmmData1 = getMcBitmapData(LoadPicture("happy-newyear.png"))
        .for (var y=0; y<25; y++)
            .for (var x=0; x<40; x++)
                .fill 8, getMcPixelData(x, y, i, mcBmmData1)
    }
 }}
__constant char * const P1_SCREEN = (char *)$e000
__constant char P1_SCREEN_CRUNCHED[] = kickasm(  uses P1_SCREEN) {{ .modify B2() {
        .pc = P1_SCREEN "HAPPYNEWYEAR SCREEN"    
        .for (var y=0; y<25; y++)
            .for (var x=0; x<40; x++)
                .byte getMcScreenData(x, y, mcBmmData1)
    }
 }}
__constant char * const P1_SCREEN_SPRITE_PTRS = (char *)$e3f8
__constant char * const P1_SPRITES = (char *)$fc00
__constant char P1_SPRITES_CRUNCHED[] = kickasm(  uses P1_SPRITES) {{ .modify B2() {
        .pc = P1_SPRITES "P1_SPRITES"
        // Pixels                                                    11         01     10       11
        .var p1_sprites = LoadPicture("sparklers.png", List().add($000000, $daccc3, $472a24, $957a71))
        .for(var sx=0;sx<15;sx++) {
            .for (var y=0;y<21; y++) {
                .for (var c=0; c<3; c++) {
                    .byte p1_sprites.getMulticolorByte(sx*3+c,y)
                }
            }
            .byte 0
        }
    }
 }}
__constant char * const PART2_BITMAP = (char *)$c000
__constant char * const PART2_SCREEN = (char *)$e000
__constant char * const PART2_SPRITES = (char *)$e400
__constant const char PINK = $a
__constant char * const PIXELS_EMPTY = (char *)$e800
__constant char * const PLEX_ID_UPDATERS = (char *)$3c00
__constant char PLEX_ID_UPDATERS_CRUNCHED[] = kickasm(  uses ORIGINAL_BUCKET_SPRITES uses BUCKET_SPRITES uses plex_id_offset) {{ .modify B2() {
        .pc = PLEX_ID_UPDATERS "PLEX_ID_UPDATERS"
        // First generate a jump table
        .for(var frame=0;frame<8;frame++) 
            .word updaters[frame].updater
        // Generate the 8 unrolled updaters
        updaters: 
        .for(var frame=0;frame<8;frame++) {
            updater:
            ldx #$1f
            .for(var sprite=0; sprite<9*8; sprite++ ) {
                lda ORIGINAL_BUCKET_SPRITES + frame*8*9*2 + sprite*2 +1
                clc
                adc plex_id_offset
                sax BUCKET_SPRITES + frame*8*9*2 + sprite*2 +1
            }
            rts        
        }
    }
 }}
__constant char * const PLEX_ID_UPDATERS_CRUNCHED2 = (char *)$7c00
__constant const unsigned int PLEX_ID_UPDATERS_CRUNCHED_SIZE = $b72
__constant char PLEX_PTR[$20] = { fill( $20, 0) }
__constant char PLEX_SORTED_IDX[$20] = { fill( $20, 0) }
__constant char PLEX_XPOS[$20] = { fill( $20, 0) }
__constant char PLEX_XPOS_MSB[$20] = { fill( $20, 0) }
__constant char PLEX_YPOS[$20] = { fill( $20, 0) }
__constant char * const PROCPORT = (char *)1
__constant char * const PROCPORT_DDR = (char *)0
__constant const char PROCPORT_DDR_MEMORY_MASK = 7
__constant const char PROCPORT_RAM_ALL = 0
__constant const char PROCPORT_RAM_CHARROM = 1
__constant const char PROCPORT_RAM_IO = 5
__constant const char PURPLE = 4
__constant char * const RASTER = (char *)$d012
__constant char RASTER_BADLINES[$130] = { fill( $130, 0) }
__constant const char RED = 2
__constant char * const SCREEN_SPRITE_PTRS = (char *)$e3f8
__constant char SCROLL_TEXT[] = "* most people will remember 2020 for a long time. for us nerds, it was a chance to dig deep into our hobbies. but we do miss the demoparties, and drinking beers with you crazy people... it is the 30th birthday of camelot, and this virtual greeting card is our way of celebrating with all of you!     credits  *  code: rex  *  music: linus  *  graphics: bizkid, snabel & vic  *    camelot sends love to 刺  abyss connection  刺  algotech  刺  ancients  刺  arsenic  刺  arise  刺  artline designs  刺  artstate  刺  atlantis  刺  bonzai  刺  booze design  刺  censor design  刺  cosine  刺  crest  刺  chorus  刺  dekadence  刺  delysid  刺  desire  刺  elysium  刺  excess  刺  extend  刺  faic  刺  f4cg  刺  fairlight  刺  fossil  刺  glance  刺  genesis project  刺  haujobb  刺  hitmen  刺  hoaxers  刺  hokuto force  刺  horizon  刺  illusion  刺  john dillermand  刺  laxity  刺  lepsi de  刺  lethargy  刺  mayday  刺  megastyle  刺  multistyle labs  刺  nah-kolor  刺  noice  刺  offence  刺  onslaught  刺  oxyron  刺  padua  刺  panda design  刺  panoramic designs  刺  performers  刺  plush  刺  pretzel logic  刺  prosonix  刺  proxima  刺  rabenauge  刺  radwar  刺  rebels  刺  resource  刺  samar  刺  scenesat  刺  shape  刺  siesta  刺  silicon ltd.  刺  singular  刺  software of sweden  刺  starion  刺  success  刺  svenonacid  刺  the dreams  刺  the solution  刺  triad  刺  tropyx  刺  trsi  刺  unicess  刺  up rough  刺  vision  刺  xenon  刺  xentax  刺  ... we hope to see you all again in 2021...                                "
__constant char SCROLL_YSIN[$100] = kickasm {{ .fill $100, round(139+89.5*sin(toRadians(360*i/256)))
 }}
__constant char SIZEOF_STRUCT_BUCKETSPRITE = 2
__constant char SIZEOF_UNSIGNED_INT = 2
__constant char * const SPRITES_COLOR = (char *)$d027
__constant char SPRITES_CRUNCHED[] = kickasm {{ .modify B2() {
            .pc = PART2_SPRITES "PART2_SPRITES"
	        .var p2_sprites = LoadPicture("spritefont.png", List().add($000000, $ffffff))
	        .for(var sy=0;sy<8;sy++) {
    		    .for(var sx=0;sx<8;sx++) {
    	    	    .for (var y=0;y<21; y++) {
	    	    	    .for (var c=0; c<3; c++) {
    	                	.byte p2_sprites.getSinglecolorByte(sx*3+c,sy*21+y)
	                    }
	                }
	    	        .byte 0
	  	        }
	        }
        }
 }}
__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 SPRITE_COLOR_SEQUENCE[] = { WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, YELLOW, CYAN, GREEN, PURPLE, RED, BLUE, RED, PURPLE, GREEN, CYAN, YELLOW, WHITE, WHITE }
__constant struct MOS6569_VICII * const VICII = (struct MOS6569_VICII *)$d000
__constant const char VICII_BMM = $20
__constant char * const VICII_CONTROL1 = (char *)$d011
__constant char * const VICII_CONTROL2 = (char *)$d016
__constant const char VICII_MCM = $10
__constant char * const VICII_MEMORY = (char *)$d018
__constant unsigned int VSP_SINTABLE[$100] = kickasm {{ .fillword $100, round(160+160*sin(2*PI*i/256))
 }}
__constant const char WHITE = 1
__constant char XMOVEMENT[$400] = kickasm {{ //.lohifill $100, round(344-i*344/$100-86*sin(toRadians(360*i/$100)))
    .lohifill $200, round(344-i*344/$100-129*sin(toRadians(360*i/$100)))
    //.lohifill $100, round(344-i*344/$100-86*sin(toRadians(360*i/$80)))
    //.lohifill $100, round(344-i*344/$100 -86*sin(toRadians(360*i/$100)) -43*sin(toRadians(360*i/$80)))
    //.lohifill $100, 344-i*344/$100
 }}
__constant char * const XMOVEMENT_HI = XMOVEMENT+$200
__constant const char YELLOW = 7
void __start()
void byteboozer_decrunch(char * volatile crunched)
__loadstore char * volatile byteboozer_decrunch::crunched
__loadstore volatile unsigned int demo_frame_count
void demo_init()
void demo_start()
void demo_work()
bool demo_work::$1
bool demo_work::$3
__loadstore volatile char flipper_charline
__loadstore volatile char flipper_done
void flipper_fix_colors()
bool flipper_fix_colors::$0
bool flipper_fix_colors::$1
bool flipper_fix_colors::$11
unsigned int flipper_fix_colors::$12
bool flipper_fix_colors::$2
bool flipper_fix_colors::$3
number flipper_fix_colors::$4
number flipper_fix_colors::$5
bool flipper_fix_colors::$6
bool flipper_fix_colors::$7
char flipper_fix_colors::charline
char flipper_fix_colors::charline#0
char *flipper_fix_colors::colors
char *flipper_fix_colors::colors#0
char *flipper_fix_colors::colors#1
char *flipper_fix_colors::colors#2
char *flipper_fix_colors::happy_cols
char *flipper_fix_colors::happy_cols#0
char *flipper_fix_colors::happy_cols#1
char *flipper_fix_colors::happy_cols#2
char flipper_fix_colors::i
char flipper_fix_colors::i#0
char flipper_fix_colors::i#1
char flipper_fix_colors::i#2
char flipper_fix_colors::i#3
unsigned int flipper_fix_colors::offset
unsigned int flipper_fix_colors::offset#0
void init_rasters()
unsigned int init_rasters::$0
bool init_rasters::$1
bool init_rasters::$2
char init_rasters::b
char init_rasters::b#0
char init_rasters::b#1
char init_rasters::b#2
char init_rasters::b#3
unsigned int init_rasters::i
unsigned int init_rasters::i#0
unsigned int init_rasters::i#1
unsigned int init_rasters::i#2
unsigned int init_rasters::i#3
__interrupt(hardware_clobber) void irq_demo()
char irq_demo::port_value
char irq_demo::port_value#0
char irq_demo::port_value#1
__interrupt(hardware_clobber) void irq_flipper_bottom()
char irq_flipper_bottom::$0
number irq_flipper_bottom::$1
bool irq_flipper_bottom::$10
bool irq_flipper_bottom::$11
unsigned int irq_flipper_bottom::$12
bool irq_flipper_bottom::$13
char irq_flipper_bottom::$3
bool irq_flipper_bottom::$4
bool irq_flipper_bottom::$5
bool irq_flipper_bottom::$6
number irq_flipper_bottom::$7
bool irq_flipper_bottom::$8
number irq_flipper_bottom::$9
unsigned int irq_flipper_bottom::irq_flipper_line
unsigned int irq_flipper_bottom::irq_flipper_line#0
unsigned int irq_flipper_bottom::irq_flipper_line#1
unsigned int irq_flipper_bottom::irq_flipper_line#2
unsigned int irq_flipper_bottom::irq_flipper_line#3
unsigned int irq_flipper_bottom::irq_flipper_line#4
unsigned int irq_flipper_bottom::irq_flipper_line#5
unsigned int irq_flipper_bottom::irq_flipper_line#6
number irq_flipper_bottom::toD0181_$0
number irq_flipper_bottom::toD0181_$1
char irq_flipper_bottom::toD0181_$2
char irq_flipper_bottom::toD0181_$3
number irq_flipper_bottom::toD0181_$4
number irq_flipper_bottom::toD0181_$5
number irq_flipper_bottom::toD0181_$6
unsigned int irq_flipper_bottom::toD0181_$7
char *irq_flipper_bottom::toD0181_gfx
char *irq_flipper_bottom::toD0181_gfx#0
char *irq_flipper_bottom::toD0181_gfx#1
char irq_flipper_bottom::toD0181_return
char irq_flipper_bottom::toD0181_return#0
char irq_flipper_bottom::toD0181_return#1
char irq_flipper_bottom::toD0181_return#2
char irq_flipper_bottom::toD0181_return#3
char *irq_flipper_bottom::toD0181_screen
char *irq_flipper_bottom::toD0181_screen#0
char *irq_flipper_bottom::toD0181_screen#1
__loadstore volatile unsigned int irq_flipper_bottom_line
__loadstore volatile unsigned int irq_flipper_idx
__interrupt(hardware_clobber) void irq_flipper_top()
char irq_flipper_top::$0
number irq_flipper_top::$1
char irq_flipper_top::$3
char irq_flipper_top::$4
number irq_flipper_top::$5
bool irq_flipper_top::$6
__loadstore volatile unsigned int irq_flipper_top_line
__interrupt(hardware_clobber) void irq_part1_top()
char irq_part1_top::$0
char irq_part1_top::$1
char irq_part1_top::$2
char irq_part1_top::$3
number irq_part1_top::$4
bool irq_part1_top::$5
number irq_part1_top::toD0181_$0
number irq_part1_top::toD0181_$1
char irq_part1_top::toD0181_$2
char irq_part1_top::toD0181_$3
number irq_part1_top::toD0181_$4
number irq_part1_top::toD0181_$5
number irq_part1_top::toD0181_$6
unsigned int irq_part1_top::toD0181_$7
char *irq_part1_top::toD0181_gfx
char *irq_part1_top::toD0181_gfx#0
char *irq_part1_top::toD0181_gfx#1
char irq_part1_top::toD0181_return
char irq_part1_top::toD0181_return#0
char irq_part1_top::toD0181_return#1
char irq_part1_top::toD0181_return#2
char irq_part1_top::toD0181_return#3
char *irq_part1_top::toD0181_screen
char *irq_part1_top::toD0181_screen#0
char *irq_part1_top::toD0181_screen#1
char irq_part1_top::toDd001_$0
number irq_part1_top::toDd001_$1
number irq_part1_top::toDd001_$2
char *irq_part1_top::toDd001_gfx
char *irq_part1_top::toDd001_gfx#0
char *irq_part1_top::toDd001_gfx#1
char irq_part1_top::toDd001_return
char irq_part1_top::toDd001_return#0
char irq_part1_top::toDd001_return#1
char irq_part1_top::toDd001_return#2
char irq_part1_top::toDd001_return#3
__interrupt(hardware_clobber) void irq_swing_plex()
bool irq_swing_plex::$1
bool irq_swing_plex::$10
bool irq_swing_plex::$11
number irq_swing_plex::$16
bool irq_swing_plex::$17
unsigned int irq_swing_plex::$19
bool irq_swing_plex::$2
bool irq_swing_plex::$20
bool irq_swing_plex::$21
bool irq_swing_plex::$22
number irq_swing_plex::$23
number irq_swing_plex::$24
number irq_swing_plex::$25
unsigned int irq_swing_plex::$26
unsigned int irq_swing_plex::$27
char irq_swing_plex::$28
bool irq_swing_plex::$29
bool irq_swing_plex::$3
bool irq_swing_plex::$30
bool irq_swing_plex::$5
number irq_swing_plex::$6
number irq_swing_plex::$7
bool irq_swing_plex::$9
__constant const char irq_swing_plex::YMOVE = 3
char irq_swing_plex::coarse_scroll_diff
char irq_swing_plex::coarse_scroll_diff#0
char irq_swing_plex::coarse_scroll_diff#1
char irq_swing_plex::new_coarse_scroll
char irq_swing_plex::new_coarse_scroll#0
char irq_swing_plex::new_coarse_scroll#1
char irq_swing_plex::new_coarse_scroll#2
char irq_swing_plex::new_coarse_scroll#3
char irq_swing_plex::new_coarse_scroll#4
char irq_swing_plex::new_coarse_scroll#5
char irq_swing_plex::new_coarse_scroll#6
char irq_swing_plex::s
char irq_swing_plex::s#0
char irq_swing_plex::s#1
char irq_swing_plex::s#2
char irq_swing_plex::s#3
unsigned int irq_swing_plex::scroll
unsigned int irq_swing_plex::scroll#0
char irq_swing_plex::x_offset
char irq_swing_plex::x_offset#0
char irq_swing_plex::x_offset#1
char irq_swing_plex::x_offset1
char irq_swing_plex::x_offset1#0
__interrupt(hardware_clobber) void irq_swing_top()
number irq_swing_top::$2
__interrupt(hardware_clobber) void irq_swing_vsp()
char irq_swing_vsp::$1
void main()
bool main::$8
bool main::$9
void * memcpy(void *destination , void *source , unsigned int num)
bool memcpy::$1
char *memcpy::$2
void *memcpy::destination
void *memcpy::destination#0
void *memcpy::destination#1
void *memcpy::destination#2
void *memcpy::destination#3
void *memcpy::destination#4
void *memcpy::destination#5
void *memcpy::destination#6
void *memcpy::destination#7
void *memcpy::destination#8
void *memcpy::destination#9
char *memcpy::dst
char *memcpy::dst#0
char *memcpy::dst#1
char *memcpy::dst#2
char *memcpy::dst#3
unsigned int memcpy::num
unsigned int memcpy::num#0
unsigned int memcpy::num#1
unsigned int memcpy::num#2
unsigned int memcpy::num#3
unsigned int memcpy::num#4
unsigned int memcpy::num#5
unsigned int memcpy::num#6
void *memcpy::return
void *memcpy::return#0
void *memcpy::return#1
void *memcpy::return#2
void *memcpy::return#3
void *memcpy::return#4
void *memcpy::return#5
void *memcpy::return#6
void *memcpy::return#7
void *memcpy::return#8
void *memcpy::source
void *memcpy::source#0
void *memcpy::source#1
void *memcpy::source#2
void *memcpy::source#3
void *memcpy::source#4
void *memcpy::source#5
void *memcpy::source#6
char *memcpy::src
char *memcpy::src#0
char *memcpy::src#1
char *memcpy::src#2
char *memcpy::src#3
char *memcpy::src_end
char *memcpy::src_end#0
char *memcpy::src_end#1
char *memcpy::src_end#2
void * memset(void *str , char c , unsigned int num)
bool memset::$0
bool memset::$1
bool memset::$3
char *memset::$4
char memset::c
char memset::c#0
char memset::c#1
char memset::c#2
char memset::c#3
char memset::c#4
char memset::c#5
char memset::c#6
char memset::c#7
char memset::c#8
char *memset::dst
char *memset::dst#0
char *memset::dst#1
char *memset::dst#2
char *memset::dst#3
char *memset::end
char *memset::end#0
char *memset::end#1
char *memset::end#2
unsigned int memset::num
unsigned int memset::num#0
unsigned int memset::num#1
unsigned int memset::num#2
unsigned int memset::num#3
unsigned int memset::num#4
unsigned int memset::num#5
unsigned int memset::num#6
void *memset::return
void *memset::return#0
void *memset::return#1
void *memset::return#2
void *memset::return#3
void *memset::return#4
void *memset::return#5
void *memset::return#6
void *memset::return#7
void *memset::str
void *memset::str#0
void *memset::str#1
void *memset::str#2
void *memset::str#3
void *memset::str#4
void *memset::str#5
void *memset::str#6
void *memset::str#7
void *memset::str#8
void *memset::str#9
__constant void (* const musicInit)() = (void (*)())DEMO_MUSIC
__constant void (* const musicPlay)() = (void (*)())DEMO_MUSIC+3
__loadstore volatile char p1_work_ready
void p2_logo_reveal()
bool p2_logo_reveal::$0
__loadstore volatile char p2_logo_reveal_done
__loadstore volatile char p2_logo_reveal_idx
__loadstore volatile char p2_logo_revealing
__loadstore volatile char p2_logo_swinging
__loadstore volatile char p2_plex_scroller_moving
__loadstore volatile char p2_work_ready
void part1_init()
void part1_loop()
bool part1_loop::$0
bool part1_loop::$10
bool part1_loop::$2
bool part1_loop::$3
bool part1_loop::$4
bool part1_loop::$5
bool part1_loop::$7
bool part1_loop::$8
void part1_run()
char part1_run::$1
number part1_run::toSpritePtr1_$0
unsigned int part1_run::toSpritePtr1_$1
char part1_run::toSpritePtr1_return
char part1_run::toSpritePtr1_return#0
char part1_run::toSpritePtr1_return#1
char part1_run::toSpritePtr1_return#2
char part1_run::toSpritePtr1_return#3
char *part1_run::toSpritePtr1_sprite
char *part1_run::toSpritePtr1_sprite#0
char *part1_run::toSpritePtr1_sprite#1
void part2_init()
bool part2_init::$12
bool part2_init::$13
bool part2_init::$15
char part2_init::$16
char part2_init::$17
bool part2_init::$18
number part2_init::$19
unsigned int part2_init::$9
struct BucketSprite *part2_init::frame
struct BucketSprite *part2_init::frame#0
struct BucketSprite *part2_init::frame#1
struct BucketSprite *part2_init::frame#2
struct BucketSprite *part2_init::frame#3
struct BucketSprite *part2_init::frame#4
struct BucketSprite *part2_init::frame#5
struct BucketSprite *part2_init::frame#6
struct BucketSprite *part2_init::frame#7
char part2_init::frame_idx
char part2_init::frame_idx#0
char part2_init::frame_idx#1
char part2_init::frame_idx#2
char part2_init::frame_idx#3
char part2_init::frame_idx#4
char part2_init::frame_idx#5
char part2_init::frame_idx#6
char part2_init::frame_idx#7
char part2_init::s
char part2_init::s#0
char part2_init::s#1
char part2_init::s#2
char part2_init::s#3
char part2_init::s1
char part2_init::s1#0
char part2_init::s1#1
char part2_init::s1#2
char part2_init::s1#3
char part2_init::s1#4
char part2_init::s1#5
char part2_init::s1#6
char part2_init::s2
char part2_init::s2#0
char part2_init::s2#1
char part2_init::s2#2
char part2_init::s2#3
char part2_init::sin_idx
char part2_init::sin_idx#0
char part2_init::sin_idx#1
char part2_init::sin_idx#2
char part2_init::sin_idx#3
number part2_init::toSpritePtr1_$0
unsigned int part2_init::toSpritePtr1_$1
char part2_init::toSpritePtr1_return
char part2_init::toSpritePtr1_return#0
char part2_init::toSpritePtr1_return#1
char part2_init::toSpritePtr1_return#2
char part2_init::toSpritePtr1_return#3
char *part2_init::toSpritePtr1_sprite
char *part2_init::toSpritePtr1_sprite#0
char *part2_init::toSpritePtr1_sprite#1
void part2_loop()
bool part2_loop::$0
bool part2_loop::$10
bool part2_loop::$11
bool part2_loop::$12
bool part2_loop::$13
bool part2_loop::$14
bool part2_loop::$15
bool part2_loop::$16
bool part2_loop::$17
bool part2_loop::$18
bool part2_loop::$19
bool part2_loop::$2
bool part2_loop::$20
bool part2_loop::$3
bool part2_loop::$4
bool part2_loop::$6
bool part2_loop::$7
bool part2_loop::$8
bool part2_loop::$9
void part2_run()
char part2_run::$1
char part2_run::$2
number part2_run::toD0181_$0
number part2_run::toD0181_$1
char part2_run::toD0181_$2
char part2_run::toD0181_$3
number part2_run::toD0181_$4
number part2_run::toD0181_$5
number part2_run::toD0181_$6
unsigned int part2_run::toD0181_$7
char *part2_run::toD0181_gfx
char *part2_run::toD0181_gfx#0
char *part2_run::toD0181_gfx#1
char part2_run::toD0181_return
char part2_run::toD0181_return#0
char part2_run::toD0181_return#1
char part2_run::toD0181_return#2
char part2_run::toD0181_return#3
char *part2_run::toD0181_screen
char *part2_run::toD0181_screen#0
char *part2_run::toD0181_screen#1
char part2_run::toDd001_$0
number part2_run::toDd001_$1
number part2_run::toDd001_$2
char *part2_run::toDd001_gfx
char *part2_run::toDd001_gfx#0
char *part2_run::toDd001_gfx#1
char part2_run::toDd001_return
char part2_run::toDd001_return#0
char part2_run::toDd001_return#1
char part2_run::toDd001_return#2
char part2_run::toDd001_return#3
void plexBucketShow(struct BucketSprite *bucket)
number plexBucketShow::$1
number plexBucketShow::$2
number plexBucketShow::$3
bool plexBucketShow::$4
bool plexBucketShow::$5
bool plexBucketShow::$6
bool plexBucketShow::$7
__constant char plexBucketShow::MSB_CLEAR_MASK_BY_ID[8] = { $fe, $fd, $fb, $f7, $ef, $df, $bf, $7f }
__constant char plexBucketShow::MSB_SET_MASK_BY_ID[8] = { 1, 2, 4, 8, $10, $20, $40, $80 }
struct BucketSprite *plexBucketShow::bucket
struct BucketSprite *plexBucketShow::bucket#0
struct BucketSprite *plexBucketShow::bucket#1
struct BucketSprite *plexBucketShow::bucket#2
char *plexBucketShow::bucket_ptr
char *plexBucketShow::bucket_ptr#0
char *plexBucketShow::bucket_ptr#1
char *plexBucketShow::bucket_ptr#2
char *plexBucketShow::bucket_ptr#3
char *plexBucketShow::bucket_ptr#4
char *plexBucketShow::bucket_ptr#5
char plexBucketShow::i
char plexBucketShow::i#0
char plexBucketShow::i#1
char plexBucketShow::i#2
char plexBucketShow::i#3
char plexBucketShow::i#4
char plexBucketShow::i#5
char plexBucketShow::i#6
char plexBucketShow::i#7
char plexBucketShow::plex_id
char plexBucketShow::plex_id#0
char plexBucketShow::plex_id#1
char plexBucketShow::plex_id#2
char plexBucketShow::plex_id#3
char plexBucketShow::real_idx
char plexBucketShow::real_idx#0
char plexBucketShow::real_idx#1
char plexBucketShow::real_idx#2
char plexBucketShow::real_idx#3
char plexBucketShow::real_idx#4
char plexBucketShow::real_idx#5
char plexBucketShow::real_idx#6
char plexBucketShow::real_idx#7
char plexBucketShow::real_idx#8
char plexBucketShow::real_idx#9
void plexFrameStart()
void plexPrepareFrame(struct BucketSprite *frame)
bool plexPrepareFrame::$0
bool plexPrepareFrame::$1
bool plexPrepareFrame::$10
bool plexPrepareFrame::$11
bool plexPrepareFrame::$12
bool plexPrepareFrame::$13
bool plexPrepareFrame::$14
bool plexPrepareFrame::$15
number plexPrepareFrame::$16
number plexPrepareFrame::$17
number plexPrepareFrame::$18
number plexPrepareFrame::$19
bool plexPrepareFrame::$2
number plexPrepareFrame::$20
char *plexPrepareFrame::$21
char *plexPrepareFrame::$22
char *plexPrepareFrame::$23
char *plexPrepareFrame::$24
char *plexPrepareFrame::$25
char *plexPrepareFrame::$26
char *plexPrepareFrame::$27
char *plexPrepareFrame::$28
number plexPrepareFrame::$3
bool plexPrepareFrame::$4
bool plexPrepareFrame::$5
number plexPrepareFrame::$6
bool plexPrepareFrame::$7
bool plexPrepareFrame::$8
bool plexPrepareFrame::$9
struct BucketSprite *plexPrepareFrame::bucket
struct BucketSprite *plexPrepareFrame::bucket#0
struct BucketSprite *plexPrepareFrame::bucket#1
struct BucketSprite *plexPrepareFrame::bucket#2
struct BucketSprite *plexPrepareFrame::bucket#3
struct BucketSprite *plexPrepareFrame::bucket#4
struct BucketSprite *plexPrepareFrame::bucket#5
struct BucketSprite *plexPrepareFrame::bucket#6
struct BucketSprite *plexPrepareFrame::bucket#7
struct BucketSprite *plexPrepareFrame::bucket#8
struct BucketSprite *plexPrepareFrame::bucket#9
char plexPrepareFrame::bucket_id
char plexPrepareFrame::bucket_id#0
char plexPrepareFrame::bucket_id#1
char plexPrepareFrame::bucket_id#2
char plexPrepareFrame::bucket_id#3
char plexPrepareFrame::bucket_id#4
char plexPrepareFrame::bucket_id#5
char plexPrepareFrame::bucket_id#6
char plexPrepareFrame::bucket_id#7
char plexPrepareFrame::bucket_ypos
char plexPrepareFrame::bucket_ypos#0
char plexPrepareFrame::bucket_ypos#1
char plexPrepareFrame::bucket_ypos#2
char plexPrepareFrame::bucket_ypos#3
char plexPrepareFrame::bucket_ypos#4
char plexPrepareFrame::bucket_ypos#5
char plexPrepareFrame::bucket_ypos#6
char plexPrepareFrame::bucket_ypos#7
struct BucketSprite *plexPrepareFrame::frame
struct BucketSprite *plexPrepareFrame::frame#0
struct BucketSprite *plexPrepareFrame::frame#1
struct BucketSprite *plexPrepareFrame::frame#10
struct BucketSprite *plexPrepareFrame::frame#11
struct BucketSprite *plexPrepareFrame::frame#2
struct BucketSprite *plexPrepareFrame::frame#3
struct BucketSprite *plexPrepareFrame::frame#4
struct BucketSprite *plexPrepareFrame::frame#5
struct BucketSprite *plexPrepareFrame::frame#6
struct BucketSprite *plexPrepareFrame::frame#7
struct BucketSprite *plexPrepareFrame::frame#8
struct BucketSprite *plexPrepareFrame::frame#9
char plexPrepareFrame::i
char plexPrepareFrame::i#0
char plexPrepareFrame::i#1
char plexPrepareFrame::i#2
char plexPrepareFrame::i#3
char plexPrepareFrame::i1
char plexPrepareFrame::i1#0
char plexPrepareFrame::i1#1
char plexPrepareFrame::i1#2
char plexPrepareFrame::i1#3
char plexPrepareFrame::i1#4
char plexPrepareFrame::i1#5
char plexPrepareFrame::i1#6
char plexPrepareFrame::i1#7
char plexPrepareFrame::m
char plexPrepareFrame::m#0
char plexPrepareFrame::m#1
char plexPrepareFrame::m#2
char plexPrepareFrame::m#3
char plexPrepareFrame::m#4
char plexPrepareFrame::m#5
char plexPrepareFrame::m#6
char plexPrepareFrame::m#7
char plexPrepareFrame::nxt_idx
char plexPrepareFrame::nxt_idx#0
char plexPrepareFrame::nxt_idx#1
char plexPrepareFrame::nxt_idx#2
char plexPrepareFrame::nxt_idx#3
char plexPrepareFrame::nxt_y
char plexPrepareFrame::nxt_y#0
char plexPrepareFrame::nxt_y#1
char plexPrepareFrame::nxt_y#2
char plexPrepareFrame::plex_id
char plexPrepareFrame::plex_id#0
char plexPrepareFrame::plex_id#1
char plexPrepareFrame::plex_id#2
char plexPrepareFrame::plex_id#3
char plexPrepareFrame::plex_id#4
__constant char plexPrepareFrame::real_sprite_free_ypos[8] = { fill( 8, 0) }
char plexPrepareFrame::real_sprite_id
char plexPrepareFrame::real_sprite_id#0
char plexPrepareFrame::real_sprite_id#1
char plexPrepareFrame::real_sprite_id#2
char plexPrepareFrame::real_sprite_id#3
char plexPrepareFrame::real_sprite_id#4
char plexPrepareFrame::real_sprite_id#5
char plexPrepareFrame::real_sprite_id#6
char plexPrepareFrame::real_sprite_id#7
char plexPrepareFrame::s
char plexPrepareFrame::s#0
char plexPrepareFrame::s#1
char plexPrepareFrame::s#2
char plexPrepareFrame::s#3
char plexPrepareFrame::s#4
struct BucketSprite *plexPrepareFrame::sprite
struct BucketSprite *plexPrepareFrame::sprite#0
struct BucketSprite *plexPrepareFrame::sprite#1
struct BucketSprite *plexPrepareFrame::sprite#2
struct BucketSprite *plexPrepareFrame::sprite#3
struct BucketSprite *plexPrepareFrame::sprite#4
struct BucketSprite *plexPrepareFrame::sprite#5
struct BucketSprite *plexPrepareFrame::sprite#6
struct BucketSprite *plexPrepareFrame::sprite#7
struct BucketSprite *plexPrepareFrame::sprite#8
struct BucketSprite *plexPrepareFrame::sprite#9
char plexPrepareFrame::ypos
char plexPrepareFrame::ypos#0
char plexPrepareFrame::ypos#1
char plexPrepareFrame::ypos#2
char plexPrepareFrame::ypos#3
char plexPrepareFrame::ypos#4
void plexPrepareInit()
bool plexPrepareInit::$0
char plexPrepareInit::i
char plexPrepareInit::i#0
char plexPrepareInit::i#1
char plexPrepareInit::i#2
char plexPrepareInit::i#3
__loadstore struct BucketSprite * volatile plex_bucket
__loadstore volatile char plex_bucket_id
__loadstore struct BucketSprite * volatile plex_frame
__loadstore volatile char plex_frame_id
__loadstore volatile char plex_id_offset
__loadstore volatile char plex_real_sprite_idx
void plex_scroller_move()
bool plex_scroller_move::$0
bool plex_scroller_move::$1
bool plex_scroller_move::$2
bool plex_scroller_move::$3
bool plex_scroller_move::$4
bool plex_scroller_move::$5
bool plex_scroller_move::$6
char plex_scroller_move::$7
char plex_scroller_move::$8
char plex_scroller_move::letter
char plex_scroller_move::letter#0
char plex_scroller_move::letter#1
char plex_scroller_move::letter#2
char plex_scroller_move::letter#3
char plex_scroller_move::letter#4
char plex_scroller_move::letter#5
char plex_scroller_move::s
char plex_scroller_move::s#0
char plex_scroller_move::s#1
char plex_scroller_move::s#10
char plex_scroller_move::s#11
char plex_scroller_move::s#12
char plex_scroller_move::s#2
char plex_scroller_move::s#3
char plex_scroller_move::s#4
char plex_scroller_move::s#5
char plex_scroller_move::s#6
char plex_scroller_move::s#7
char plex_scroller_move::s#8
char plex_scroller_move::s#9
number plex_scroller_move::toSpritePtr1_$0
unsigned int plex_scroller_move::toSpritePtr1_$1
char plex_scroller_move::toSpritePtr1_return
char plex_scroller_move::toSpritePtr1_return#0
char plex_scroller_move::toSpritePtr1_return#1
char plex_scroller_move::toSpritePtr1_return#2
char plex_scroller_move::toSpritePtr1_return#3
char *plex_scroller_move::toSpritePtr1_sprite
char *plex_scroller_move::toSpritePtr1_sprite#0
char *plex_scroller_move::toSpritePtr1_sprite#1
char plex_scroller_move::x_idx
char plex_scroller_move::x_idx#0
char plex_scroller_move::x_idx#1
char plex_scroller_move::x_idx#10
char plex_scroller_move::x_idx#11
char plex_scroller_move::x_idx#12
char plex_scroller_move::x_idx#2
char plex_scroller_move::x_idx#3
char plex_scroller_move::x_idx#4
char plex_scroller_move::x_idx#5
char plex_scroller_move::x_idx#6
char plex_scroller_move::x_idx#7
char plex_scroller_move::x_idx#8
char plex_scroller_move::x_idx#9
void raster_fine(volatile char line_offset)
__loadstore volatile char raster_fine::line_offset
__loadstore char * volatile scroll_text_next
__loadstore volatile char sparkler_active
void sparkler_anim()
bool sparkler_anim::$0
bool sparkler_anim::$1
char sparkler_anim::$2
number sparkler_anim::$3
number sparkler_anim::$4
number sparkler_anim::toSpritePtr1_$0
unsigned int sparkler_anim::toSpritePtr1_$1
char sparkler_anim::toSpritePtr1_return
char sparkler_anim::toSpritePtr1_return#0
char sparkler_anim::toSpritePtr1_return#1
char sparkler_anim::toSpritePtr1_return#2
char sparkler_anim::toSpritePtr1_return#3
char *sparkler_anim::toSpritePtr1_sprite
char *sparkler_anim::toSpritePtr1_sprite#0
char *sparkler_anim::toSpritePtr1_sprite#1
__loadstore volatile char sparkler_idx
__loadstore volatile char sprite_color_idx
void update_frame_plex_id_offset(char plex_frame_id)
char update_frame_plex_id_offset::$0
__loadstore volatile unsigned int update_frame_plex_id_offset::jmp_address
__constant unsigned int *update_frame_plex_id_offset::jmp_table = (unsigned int *)PLEX_ID_UPDATERS
char update_frame_plex_id_offset::plex_frame_id
char update_frame_plex_id_offset::plex_frame_id#0
char update_frame_plex_id_offset::plex_frame_id#1
__loadstore volatile char vsp_coarse_scroll
__loadstore volatile char vsp_fine_scroll
__loadstore volatile char vsp_scroll
__loadstore volatile char vsp_sin_idx
void vsp_update_screen(volatile char x_offset)
char vsp_update_screen::$1
bool vsp_update_screen::$2
char vsp_update_screen::$3
bool vsp_update_screen::$4
unsigned int vsp_update_screen::$5
__loadstore volatile char vsp_update_screen::x_offset
__loadstore volatile unsigned int vsp_update_screen::x_offset8
__loadstore volatile char x_movement_idx

Adding number conversion cast (unumber) $200 in 
Adding number conversion cast (unumber) 3 in 
Adding number conversion cast (unumber) 0 in memset::$0 = memset::num#5 > 0
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) 0 in demo_work::$3 = 0 != sparkler_active
Adding number conversion cast (unumber) 0 in memset::c#0 = 0
Adding number conversion cast (unumber) $800 in memset::num#0 = $800
Adding number conversion cast (unumber) $800 in memcpy::num#0 = $800
Adding number conversion cast (unumber) $400 in memcpy::num#1 = $400
Adding number conversion cast (unumber) $3e8 in memcpy::num#2 = $3e8
Adding number conversion cast (unumber) $f in *IRQ_STATUS = $f
Adding number conversion cast (unumber) $80 in *VICII_CONTROL1 = *VICII_CONTROL1 | $80
Adding number conversion cast (unumber) 1 in *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = 1
Adding number conversion cast (unumber) 1 in *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = 1
Adding number conversion cast (unumber) $16 in *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_X) = $16
Adding number conversion cast (unumber) $be in *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_Y) = $be
Adding number conversion cast (unumber) $40 in part1_run::toSpritePtr1_$0 = part1_run::toSpritePtr1_$1 / $40
Adding number conversion cast (unumber) part1_run::toSpritePtr1_$0 in part1_run::toSpritePtr1_$0 = part1_run::toSpritePtr1_$1 / (unumber)$40
Adding number conversion cast (unumber) 0 in P1_SCREEN_SPRITE_PTRS[0] = part1_run::$1
Adding number conversion cast (unumber) 0 in p1_work_ready = 0
Adding number conversion cast (unumber) 0 in part1_loop::$0 = p1_work_ready == 0
Adding number conversion cast (unumber) 0 in part1_loop::$10 = 0 != sparkler_active
Adding number conversion cast (unumber) 9*$32-3 in part1_loop::$3 = demo_frame_count > 9*$32-3
Adding number conversion cast (unumber) $e*$32 in part1_loop::$7 = demo_frame_count > $e*$32
Adding number conversion cast (unumber) 1 in *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 1
Adding number conversion cast (unumber) 1 in sparkler_active = 1
Adding number conversion cast (unumber) 0 in p1_work_ready = 0
Adding number conversion cast (unumber) 0 in RASTER_BADLINES[init_rasters::i#3] = 0
Adding number conversion cast (unumber) $fa in init_rasters::$2 = init_rasters::b#2 < $fa
Adding number conversion cast (unumber) 1 in RASTER_BADLINES[init_rasters::b#3] = 1
Adding number conversion cast (unumber) 8 in init_rasters::b#1 = init_rasters::b#3 + 8
Adding number conversion cast (unumber) $40 in irq_part1_top::toDd001_$1 = irq_part1_top::toDd001_$0 / $40
Adding number conversion cast (unumber) irq_part1_top::toDd001_$1 in irq_part1_top::toDd001_$1 = irq_part1_top::toDd001_$0 / (unumber)$40
Adding number conversion cast (unumber) 3 in irq_part1_top::toDd001_$2 = 3 ^ irq_part1_top::toDd001_$1
Adding number conversion cast (unumber) irq_part1_top::toDd001_$2 in irq_part1_top::toDd001_$2 = (unumber)3 ^ irq_part1_top::toDd001_$1
Adding number conversion cast (unumber) $3fff in irq_part1_top::toD0181_$0 = irq_part1_top::toD0181_$7 & $3fff
Adding number conversion cast (unumber) irq_part1_top::toD0181_$0 in irq_part1_top::toD0181_$0 = irq_part1_top::toD0181_$7 & (unumber)$3fff
Adding number conversion cast (unumber) 4 in irq_part1_top::toD0181_$1 = irq_part1_top::toD0181_$0 * 4
Adding number conversion cast (unumber) irq_part1_top::toD0181_$1 in irq_part1_top::toD0181_$1 = irq_part1_top::toD0181_$0 * (unumber)4
Adding number conversion cast (unumber) 4 in irq_part1_top::toD0181_$4 = irq_part1_top::toD0181_$3 / 4
Adding number conversion cast (unumber) irq_part1_top::toD0181_$4 in irq_part1_top::toD0181_$4 = irq_part1_top::toD0181_$3 / (unumber)4
Adding number conversion cast (unumber) $f in irq_part1_top::toD0181_$5 = irq_part1_top::toD0181_$4 & $f
Adding number conversion cast (unumber) irq_part1_top::toD0181_$5 in irq_part1_top::toD0181_$5 = irq_part1_top::toD0181_$4 & (unumber)$f
Adding number conversion cast (unumber) irq_part1_top::toD0181_$6 in irq_part1_top::toD0181_$6 = irq_part1_top::toD0181_$2 | irq_part1_top::toD0181_$5
Adding number conversion cast (unumber) 0 in irq_part1_top::$5 = 0 != irq_part1_top::$2
Adding number conversion cast (unumber) $80 in *VICII_CONTROL1 = *VICII_CONTROL1 | $80
Adding number conversion cast (unumber) $7f in *VICII_CONTROL1 = *VICII_CONTROL1 & $7f
Adding number conversion cast (unumber) $f8 in irq_part1_top::$4 = irq_part1_top::$3 & $f8
Adding number conversion cast (unumber) irq_part1_top::$4 in irq_part1_top::$4 = irq_part1_top::$3 & (unumber)$f8
Adding number conversion cast (unumber) 1 in p1_work_ready = 1
Adding number conversion cast (unumber) 7 in irq_flipper_top::$1 = irq_flipper_top::$0 & 7
Adding number conversion cast (unumber) irq_flipper_top::$1 in irq_flipper_top::$1 = irq_flipper_top::$0 & (unumber)7
Adding number conversion cast (unumber) 0 in irq_flipper_top::$6 = 0 != irq_flipper_top::$3
Adding number conversion cast (unumber) $80 in *VICII_CONTROL1 = *VICII_CONTROL1 | $80
Adding number conversion cast (unumber) $7f in *VICII_CONTROL1 = *VICII_CONTROL1 & $7f
Adding number conversion cast (unumber) $f8 in irq_flipper_top::$5 = irq_flipper_top::$4 & $f8
Adding number conversion cast (unumber) irq_flipper_top::$5 in irq_flipper_top::$5 = irq_flipper_top::$4 & (unumber)$f8
Adding number conversion cast (unumber) 7 in irq_flipper_bottom::$1 = irq_flipper_bottom::$0 & 7
Adding number conversion cast (unumber) irq_flipper_bottom::$1 in irq_flipper_bottom::$1 = irq_flipper_bottom::$0 & (unumber)7
Adding number conversion cast (unumber) $3fff in irq_flipper_bottom::toD0181_$0 = irq_flipper_bottom::toD0181_$7 & $3fff
Adding number conversion cast (unumber) irq_flipper_bottom::toD0181_$0 in irq_flipper_bottom::toD0181_$0 = irq_flipper_bottom::toD0181_$7 & (unumber)$3fff
Adding number conversion cast (unumber) 4 in irq_flipper_bottom::toD0181_$1 = irq_flipper_bottom::toD0181_$0 * 4
Adding number conversion cast (unumber) irq_flipper_bottom::toD0181_$1 in irq_flipper_bottom::toD0181_$1 = irq_flipper_bottom::toD0181_$0 * (unumber)4
Adding number conversion cast (unumber) 4 in irq_flipper_bottom::toD0181_$4 = irq_flipper_bottom::toD0181_$3 / 4
Adding number conversion cast (unumber) irq_flipper_bottom::toD0181_$4 in irq_flipper_bottom::toD0181_$4 = irq_flipper_bottom::toD0181_$3 / (unumber)4
Adding number conversion cast (unumber) $f in irq_flipper_bottom::toD0181_$5 = irq_flipper_bottom::toD0181_$4 & $f
Adding number conversion cast (unumber) irq_flipper_bottom::toD0181_$5 in irq_flipper_bottom::toD0181_$5 = irq_flipper_bottom::toD0181_$4 & (unumber)$f
Adding number conversion cast (unumber) irq_flipper_bottom::toD0181_$6 in irq_flipper_bottom::toD0181_$6 = irq_flipper_bottom::toD0181_$2 | irq_flipper_bottom::toD0181_$5
Adding number conversion cast (unumber) 0 in irq_flipper_bottom::$13 = 0 != flipper_done
Adding number conversion cast (unumber) $80 in *VICII_CONTROL1 = *VICII_CONTROL1 | $80
Adding number conversion cast (unumber) 8 in irq_flipper_bottom::$6 = irq_flipper_bottom::irq_flipper_line#0 < 8
Adding number conversion cast (unumber) 0 in irq_flipper_top_line = 0
Adding number conversion cast (unumber) 8 in irq_flipper_bottom::$7 = irq_flipper_bottom::irq_flipper_line#1 - 8
Adding number conversion cast (unumber) irq_flipper_bottom::$7 in irq_flipper_bottom::$7 = irq_flipper_bottom::irq_flipper_line#1 - (unumber)8
Adding number conversion cast (unumber) $128 in irq_flipper_bottom::$8 = irq_flipper_bottom::irq_flipper_line#2 > $128
Adding number conversion cast (unumber) $130 in irq_flipper_bottom_line = $130
Adding number conversion cast (unumber) 8 in irq_flipper_bottom::$9 = irq_flipper_bottom::irq_flipper_line#3 + 8
Adding number conversion cast (unumber) irq_flipper_bottom::$9 in irq_flipper_bottom::$9 = irq_flipper_bottom::irq_flipper_line#3 + (unumber)8
Adding number conversion cast (unumber) $130 in irq_flipper_bottom::$10 = irq_flipper_bottom::irq_flipper_line#4 == $130
Adding number conversion cast (unumber) 1 in flipper_done = 1
Adding number conversion cast (unumber) $2e in flipper_fix_colors::$0 = irq_flipper_top_line > $2e
Adding number conversion cast (unumber) $f6 in flipper_fix_colors::$1 = irq_flipper_top_line < $f6
Adding number conversion cast (unumber) $2e in flipper_fix_colors::$4 = irq_flipper_top_line - $2e
Adding number conversion cast (unumber) flipper_fix_colors::$4 in flipper_fix_colors::$4 = irq_flipper_top_line - (unumber)$2e
Adding number conversion cast (unumber) 8 in flipper_fix_colors::$5 = flipper_fix_colors::$4 / 8
Adding number conversion cast (unumber) flipper_fix_colors::$5 in flipper_fix_colors::$5 = flipper_fix_colors::$4 / (unumber)8
Adding number conversion cast (unumber) $28 in flipper_fix_colors::offset#0 = flipper_fix_colors::$12 * $28
Adding number conversion cast (unumber) $28 in flipper_fix_colors::$11 = flipper_fix_colors::i#2 < $28
Adding number conversion cast (unumber) $20 in plexPrepareInit::$0 = plexPrepareInit::i#2 < $20
Adding number conversion cast (unumber) $20-1 in plexPrepareFrame::$2 = plexPrepareFrame::m#2 < $20-1
Adding number conversion cast (unumber) 1 in plexPrepareFrame::$3 = plexPrepareFrame::m#3 + 1
Adding number conversion cast (unumber) plexPrepareFrame::$3 in plexPrepareFrame::$3 = plexPrepareFrame::m#3 + (unumber)1
Adding number conversion cast (unumber) 1 in plexPrepareFrame::$6 = plexPrepareFrame::s#3 + 1
Adding number conversion cast (unumber) plexPrepareFrame::$6 in plexPrepareFrame::$6 = plexPrepareFrame::s#3 + (unumber)1
Adding number conversion cast (unumber) $ff in plexPrepareFrame::$7 = plexPrepareFrame::s#1 != $ff
Adding number conversion cast (unumber) 8 in plexPrepareFrame::$10 = plexPrepareFrame::i#2 < 8
Adding number conversion cast (unumber) 0 in plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::i#3] = BUCKET_YPOS[0]
Adding number conversion cast (unumber) $20 in plexPrepareFrame::$11 = plexPrepareFrame::i1#2 < $20
Adding number conversion cast (unumber) 8 in plexPrepareFrame::$19 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) plexPrepareFrame::$19 in plexPrepareFrame::$19 = (unumber)8 * SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) 1 in plexPrepareFrame::bucket_ypos#1 = plexPrepareFrame::bucket_ypos#4 + 1
Adding number conversion cast (unumber) $16 in plexPrepareFrame::$16 = plexPrepareFrame::ypos#1 + $16
Adding number conversion cast (unumber) plexPrepareFrame::$16 in plexPrepareFrame::$16 = plexPrepareFrame::ypos#1 + (unumber)$16
Adding number conversion cast (unumber) 1 in plexPrepareFrame::$17 = plexPrepareFrame::real_sprite_id#3 + 1
Adding number conversion cast (unumber) plexPrepareFrame::$17 in plexPrepareFrame::$17 = plexPrepareFrame::real_sprite_id#3 + (unumber)1
Adding number conversion cast (unumber) 7 in plexPrepareFrame::$18 = plexPrepareFrame::$17 & 7
Adding number conversion cast (unumber) plexPrepareFrame::$18 in plexPrepareFrame::$18 = plexPrepareFrame::$17 & (unumber)7
Adding number conversion cast (unumber) 8 in plexPrepareFrame::$20 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) plexPrepareFrame::$20 in plexPrepareFrame::$20 = (unumber)8 * SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) 0 in *plexPrepareFrame::$23 = 0
Adding number conversion cast (unumber) 0 in *plexPrepareFrame::$24 = 0
Adding number conversion cast (unumber) 0 in plex_real_sprite_idx = 0
Adding number conversion cast (unumber) 2 in plexBucketShow::real_idx#0 = plex_real_sprite_idx * 2
Adding number conversion cast (unumber) 0 in plexBucketShow::$6 = 0 != plexBucketShow::bucket_ptr#1[plexBucketShow::i#3]
Adding number conversion cast (unumber) 2 in plexBucketShow::real_idx#1 = plexBucketShow::real_idx#4 / 2
Adding number conversion cast (unumber) 0 in plexBucketShow::$7 = 0 != PLEX_XPOS_MSB[plexBucketShow::plex_id#0]
Adding number conversion cast (unumber) 1 in plexBucketShow::$2 = plexBucketShow::real_idx#7 + 1
Adding number conversion cast (unumber) plexBucketShow::$2 in plexBucketShow::$2 = plexBucketShow::real_idx#7 + (unumber)1
Adding number conversion cast (unumber) 7 in plexBucketShow::$3 = plexBucketShow::$2 & 7
Adding number conversion cast (unumber) plexBucketShow::$3 in plexBucketShow::$3 = plexBucketShow::$2 & (unumber)7
Adding number conversion cast (unumber) 2 in plexBucketShow::real_idx#3 = plexBucketShow::real_idx#2 * 2
Adding number conversion cast (unumber) 8*SIZEOF_STRUCT_BUCKETSPRITE in plexBucketShow::$4 = plexBucketShow::i#2 == 8*SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) 8 in plexBucketShow::$4 = plexBucketShow::i#2 == (unumber)8*SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) 2 in plexBucketShow::$1 = plexBucketShow::real_idx#8 / 2
Adding number conversion cast (unumber) plexBucketShow::$1 in plexBucketShow::$1 = plexBucketShow::real_idx#8 / (unumber)2
Adding number conversion cast (unumber) $1f40 in memset::str#1 = (void *)PART2_BITMAP+$1f40
Adding number conversion cast (unumber) 0 in memset::c#1 = 0
Adding number conversion cast (unumber) $c0 in memset::num#1 = $c0
Adding number conversion cast (unumber) $400 in memset::num#2 = $400
Adding number conversion cast (unumber) $3e8 in memset::num#3 = $3e8
Adding number conversion cast (unumber) 8 in part2_init::$12 = part2_init::frame_idx#2 < 8
Adding number conversion cast (unumber) $20 in part2_init::$13 = part2_init::s#2 < $20
Adding number conversion cast (unumber) 8 in part2_init::sin_idx#1 = part2_init::sin_idx#2 + 8
Adding number conversion cast (unumber) 8*9 in part2_init::$19 = 8*9 * SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) part2_init::$19 in part2_init::$19 = (unumber)8*9 * SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) $20 in part2_init::$15 = part2_init::s1#2 < $20
Adding number conversion cast (unumber) $40 in part2_init::toSpritePtr1_$0 = part2_init::toSpritePtr1_$1 / $40
Adding number conversion cast (unumber) part2_init::toSpritePtr1_$0 in part2_init::toSpritePtr1_$0 = part2_init::toSpritePtr1_$1 / (unumber)$40
Adding number conversion cast (unumber) 0 in *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = 0
Adding number conversion cast (unumber) 0 in *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_X) = 0
Adding number conversion cast (unumber) 0 in *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 0
Adding number conversion cast (unumber) 0 in *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = 0
Adding number conversion cast (unumber) 8 in part2_init::$18 = part2_init::s2#2 < 8
Adding number conversion cast (unumber) $3e8 in memset::str#4 = (void *)PART2_SCREEN+$3e8
Adding number conversion cast (unumber) $18 in memset::num#4 = $18
Adding number conversion cast (unumber) $40 in part2_run::toDd001_$1 = part2_run::toDd001_$0 / $40
Adding number conversion cast (unumber) part2_run::toDd001_$1 in part2_run::toDd001_$1 = part2_run::toDd001_$0 / (unumber)$40
Adding number conversion cast (unumber) 3 in part2_run::toDd001_$2 = 3 ^ part2_run::toDd001_$1
Adding number conversion cast (unumber) part2_run::toDd001_$2 in part2_run::toDd001_$2 = (unumber)3 ^ part2_run::toDd001_$1
Adding number conversion cast (unumber) $3fff in part2_run::toD0181_$0 = part2_run::toD0181_$7 & $3fff
Adding number conversion cast (unumber) part2_run::toD0181_$0 in part2_run::toD0181_$0 = part2_run::toD0181_$7 & (unumber)$3fff
Adding number conversion cast (unumber) 4 in part2_run::toD0181_$1 = part2_run::toD0181_$0 * 4
Adding number conversion cast (unumber) part2_run::toD0181_$1 in part2_run::toD0181_$1 = part2_run::toD0181_$0 * (unumber)4
Adding number conversion cast (unumber) 4 in part2_run::toD0181_$4 = part2_run::toD0181_$3 / 4
Adding number conversion cast (unumber) part2_run::toD0181_$4 in part2_run::toD0181_$4 = part2_run::toD0181_$3 / (unumber)4
Adding number conversion cast (unumber) $f in part2_run::toD0181_$5 = part2_run::toD0181_$4 & $f
Adding number conversion cast (unumber) part2_run::toD0181_$5 in part2_run::toD0181_$5 = part2_run::toD0181_$4 & (unumber)$f
Adding number conversion cast (unumber) part2_run::toD0181_$6 in part2_run::toD0181_$6 = part2_run::toD0181_$2 | part2_run::toD0181_$5
Adding number conversion cast (unumber) $ff in *SPRITES_ENABLE = $ff
Adding number conversion cast (unumber) $f in *IRQ_STATUS = $f
Adding number conversion cast (unumber) $7f in *VICII_CONTROL1 = *VICII_CONTROL1 & $7f
Adding number conversion cast (unumber) 0 in *RASTER = BUCKET_YPOS[0]
Adding number conversion cast (unumber) 0 in plex_frame_id = 0
Adding number conversion cast (unumber) 0 in plex_id_offset = 0
Adding number conversion cast (unumber) 0 in p2_work_ready = 0
Adding number conversion cast (unumber) 0 in part2_loop::$0 = p2_work_ready == 0
Adding number conversion cast (unumber) 0 in part2_loop::$17 = 0 != p2_logo_reveal_done
Adding number conversion cast (unumber) 0 in part2_loop::$18 = 0 != p2_logo_revealing
Adding number conversion cast (unumber) $12*$32+$19 in part2_loop::$7 = demo_frame_count > $12*$32+$19
Adding number conversion cast (unumber) 0 in part2_loop::$19 = 0 != p2_logo_swinging
Adding number conversion cast (unumber) 1 in p2_logo_revealing = 1
Adding number conversion cast (unumber) 0 in part2_loop::$20 = 0 != p2_plex_scroller_moving
Adding number conversion cast (unumber) $1a*$32 in part2_loop::$14 = demo_frame_count > $1a*$32
Adding number conversion cast (unumber) 1 in p2_logo_swinging = 1
Adding number conversion cast (unumber) 0 in p2_work_ready = 0
Adding number conversion cast (unumber) 1 in p2_plex_scroller_moving = 1
Adding number conversion cast (unumber) $28 in p2_logo_reveal::$0 = p2_logo_reveal_idx >= $28
Adding number conversion cast (unumber) 1 in p2_logo_reveal_done = 1
Adding number conversion cast (unumber) $20 in plex_scroller_move::$0 = plex_scroller_move::s#2 < $20
Adding number conversion cast (unumber) 0 in plex_scroller_move::$1 = plex_scroller_move::x_idx#2 == 0
Adding number conversion cast (unumber) 8 in plex_scroller_move::x_idx#1 = plex_scroller_move::x_idx#3 + 8
Adding number conversion cast (unumber) 0 in plex_scroller_move::$3 = *scroll_text_next == 0
Adding number conversion cast (unumber) $ff in plex_scroller_move::$5 = plex_scroller_move::letter#0 == $ff
Adding number conversion cast (unumber) $40 in plex_scroller_move::toSpritePtr1_$0 = plex_scroller_move::toSpritePtr1_$1 / $40
Adding number conversion cast (unumber) plex_scroller_move::toSpritePtr1_$0 in plex_scroller_move::toSpritePtr1_$0 = plex_scroller_move::toSpritePtr1_$1 / (unumber)$40
Adding number conversion cast (unumber) 0 in plex_scroller_move::letter#1 = 0
Adding number conversion cast (unumber) 0 in plex_bucket_id = 0
Adding number conversion cast (unumber) 8 in irq_swing_top::$2 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) irq_swing_top::$2 in irq_swing_top::$2 = (unumber)8 * SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) 1 in *RASTER = BUCKET_YPOS[1]
Adding number conversion cast (unumber) 8 in irq_swing_plex::$23 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) irq_swing_plex::$23 in irq_swing_plex::$23 = (unumber)8 * SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) 9 in irq_swing_plex::$1 = plex_bucket_id < 9
Adding number conversion cast (unumber) 0 in *RASTER = BUCKET_YPOS[0]
Adding number conversion cast (unumber) (unsigned int)irq_swing_plex::YMOVE*9*8 in irq_swing_plex::$24 = (unsigned int)irq_swing_plex::YMOVE*9*8 * SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) irq_swing_plex::$24 in irq_swing_plex::$24 = (unumber)(unsigned int)irq_swing_plex::YMOVE*9*8 * SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) 9 in irq_swing_plex::$24 = (unumber)(unsigned int)irq_swing_plex::YMOVE*9*8 * SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) 8 in irq_swing_plex::$2 = plex_frame_id >= 8
Adding number conversion cast (unumber) 0 in irq_swing_plex::$29 = 0 != p2_logo_swinging
Adding number conversion cast (unumber) 9*8*8 in irq_swing_plex::$25 = 9*8*8 * SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) irq_swing_plex::$25 in irq_swing_plex::$25 = (unumber)9*8*8 * SIZEOF_STRUCT_BUCKETSPRITE
Adding number conversion cast (unumber) 8 in plex_frame_id = plex_frame_id - 8
Adding number conversion cast (unumber) 0 in irq_swing_plex::$30 = 0 != p2_plex_scroller_moving
Adding number conversion cast (unumber) 7 in irq_swing_plex::$6 = irq_swing_plex::$28 & 7
Adding number conversion cast (unumber) irq_swing_plex::$6 in irq_swing_plex::$6 = irq_swing_plex::$28 & (unumber)7
Adding number conversion cast (unumber) 8 in irq_swing_plex::$7 = irq_swing_plex::scroll#0 / 8
Adding number conversion cast (unumber) irq_swing_plex::$7 in irq_swing_plex::$7 = irq_swing_plex::scroll#0 / (unumber)8
Adding number conversion cast (unumber) 1 in irq_swing_plex::$9 = irq_swing_plex::coarse_scroll_diff#0 == 1
Adding number conversion cast (unumber) $50 in irq_swing_plex::x_offset1#0 = $50 - vsp_coarse_scroll
Adding number conversion cast (unumber) $ff in irq_swing_plex::$10 = irq_swing_plex::coarse_scroll_diff#1 == $ff
Adding number conversion cast (unumber) $27 in irq_swing_plex::x_offset#0 = $27 - vsp_coarse_scroll
Adding number conversion cast (unumber) 0 in (PART2_SCREEN+$18*$28)[irq_swing_plex::x_offset#1] = 0
Adding number conversion cast (unumber) $18*$28 in (PART2_SCREEN+$18*$28)[irq_swing_plex::x_offset#1] = ((unumber)) 0
Adding number conversion cast (unumber) 0 in (COLS+$18*$28)[irq_swing_plex::x_offset#1] = 0
Adding number conversion cast (unumber) $18*$28 in (COLS+$18*$28)[irq_swing_plex::x_offset#1] = ((unumber)) 0
Adding number conversion cast (unumber) $28 in irq_swing_plex::$16 = $28 - vsp_coarse_scroll
Adding number conversion cast (unumber) irq_swing_plex::$16 in irq_swing_plex::$16 = (unumber)$28 - vsp_coarse_scroll
Adding number conversion cast (unumber) 1 in p2_work_ready = 1
Adding number conversion cast (unumber) 0 in sprite_color_idx = 0
Adding number conversion cast (unumber) 8 in irq_swing_plex::$22 = irq_swing_plex::s#2 < 8
Adding number conversion cast (unumber) 8 in vsp_update_screen::x_offset8 = vsp_update_screen::$5 * 8
Adding number conversion cast (unumber) 0 in vsp_update_screen::$2 = vsp_update_screen::$1 == 0
Adding number conversion cast (unumber) 1 in vsp_update_screen::$4 = vsp_update_screen::$3 == 1
Adding number conversion cast (unumber) 5*$32 in main::$8 = demo_frame_count < 5*$32
Adding number conversion cast (unumber) $10*$32 in main::$9 = demo_frame_count < $10*$32
Adding number conversion cast (unumber) 0 in sparkler_active = 0
Adding number conversion cast (unumber) $f in *IRQ_STATUS = $f
Adding number conversion cast (unumber) $1e in sparkler_anim::$0 = sparkler_idx == $1e
Adding number conversion cast (unumber) $40 in sparkler_anim::toSpritePtr1_$0 = sparkler_anim::toSpritePtr1_$1 / $40
Adding number conversion cast (unumber) sparkler_anim::toSpritePtr1_$0 in sparkler_anim::toSpritePtr1_$0 = sparkler_anim::toSpritePtr1_$1 / (unumber)$40
Adding number conversion cast (unumber) 2 in sparkler_anim::$3 = sparkler_idx / 2
Adding number conversion cast (unumber) sparkler_anim::$3 in sparkler_anim::$3 = sparkler_idx / (unumber)2
Adding number conversion cast (unumber) sparkler_anim::$4 in sparkler_anim::$4 = sparkler_anim::$2 + sparkler_anim::$3
Adding number conversion cast (unumber) 0 in P1_SCREEN_SPRITE_PTRS[0] = sparkler_anim::$4
Adding number conversion cast (unumber) 0 in sparkler_idx = 0
Successful SSA optimization PassNAddNumberTypeConversions
Adding number conversion cast (unumber) 8 in irq_swing_plex::$24 = (unumber)(unsigned int)irq_swing_plex::YMOVE*(unumber)9*8 * SIZEOF_STRUCT_BUCKETSPRITE
Successful SSA optimization PassNAddNumberTypeConversions
Inlining cast memcpy::src#0 = (char *)memcpy::source#6
Inlining cast memcpy::dst#0 = (char *)memcpy::destination#6
Inlining cast memset::dst#0 = (char *)memset::str#6
Inlining cast *RASTER = (unumber)0
Inlining cast memset::c#0 = (unumber)0
Inlining cast memset::num#0 = (unumber)$800
Inlining cast memcpy::num#0 = (unumber)$800
Inlining cast memcpy::num#1 = (unumber)$400
Inlining cast memcpy::num#2 = (unumber)$3e8
Inlining cast *IRQ_STATUS = (unumber)$f
Inlining cast *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = (unumber)1
Inlining cast *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = (unumber)1
Inlining cast *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_X) = (unumber)$16
Inlining cast *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_Y) = (unumber)$be
Inlining cast p1_work_ready = (unumber)0
Inlining cast *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = (unumber)1
Inlining cast sparkler_active = (unumber)1
Inlining cast p1_work_ready = (unumber)0
Inlining cast RASTER_BADLINES[init_rasters::i#3] = (unumber)0
Inlining cast RASTER_BADLINES[init_rasters::b#3] = (unumber)1
Inlining cast p1_work_ready = (unumber)1
Inlining cast irq_flipper_top_line = (unumber)0
Inlining cast irq_flipper_bottom_line = (unumber)$130
Inlining cast flipper_done = (unumber)1
Inlining cast *plexPrepareFrame::$23 = (unumber)0
Inlining cast *plexPrepareFrame::$24 = (unumber)0
Inlining cast plex_real_sprite_idx = (unumber)0
Inlining cast memset::c#1 = (unumber)0
Inlining cast memset::num#1 = (unumber)$c0
Inlining cast memset::num#2 = (unumber)$400
Inlining cast memset::num#3 = (unumber)$3e8
Inlining cast *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = (unumber)0
Inlining cast *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_X) = (unumber)0
Inlining cast *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = (unumber)0
Inlining cast *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = (unumber)0
Inlining cast memset::num#4 = (unumber)$18
Inlining cast *SPRITES_ENABLE = (unumber)$ff
Inlining cast *IRQ_STATUS = (unumber)$f
Inlining cast plex_frame_id = (unumber)0
Inlining cast plex_id_offset = (unumber)0
Inlining cast p2_work_ready = (unumber)0
Inlining cast p2_logo_revealing = (unumber)1
Inlining cast p2_logo_swinging = (unumber)1
Inlining cast p2_work_ready = (unumber)0
Inlining cast p2_plex_scroller_moving = (unumber)1
Inlining cast p2_logo_reveal_done = (unumber)1
Inlining cast plex_scroller_move::letter#1 = (unumber)0
Inlining cast plex_bucket_id = (unumber)0
Inlining cast (PART2_SCREEN+(unumber)$18*$28)[irq_swing_plex::x_offset#1] = (unumber)0
Inlining cast (COLS+(unumber)$18*$28)[irq_swing_plex::x_offset#1] = (unumber)0
Inlining cast p2_work_ready = (unumber)1
Inlining cast sprite_color_idx = (unumber)0
Inlining cast sparkler_active = (unumber)0
Inlining cast *IRQ_STATUS = (unumber)$f
Inlining cast sparkler_idx = (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 *) 53281
Simplifying constant pointer cast (char *) 53265
Simplifying constant pointer cast (char *) 53270
Simplifying constant pointer cast (char *) 53272
Simplifying constant pointer cast (char *) 53273
Simplifying constant pointer cast (char *) 53274
Simplifying constant pointer cast (char *) 0
Simplifying constant pointer cast (char *) 1
Simplifying constant pointer cast (char *) 53248
Simplifying constant pointer cast (struct MOS6569_VICII *) 53248
Simplifying constant pointer cast (char *) 55296
Simplifying constant pointer cast (char *) 1024
Simplifying constant pointer cast (struct MOS6526_CIA *) 56320
Simplifying constant pointer cast (struct MOS6526_CIA *) 56576
Simplifying constant pointer cast (char *) 56333
Simplifying constant pointer cast (void (**)()) 65534
Simplifying constant pointer cast (char *) 43008
Simplifying constant pointer cast (char *) 49152
Simplifying constant pointer cast (char *) 57344
Simplifying constant pointer cast (char *) 64512
Simplifying constant pointer cast (char *) 59392
Simplifying constant pointer cast (char *) 58368
Simplifying constant pointer cast (char *) 61440
Simplifying constant pointer cast (char *) 63488
Simplifying constant pointer cast (unsigned int *) 41984
Simplifying constant pointer cast (char *) 58360
Simplifying constant pointer cast (char *) 58360
Simplifying constant pointer cast (char *) 21504
Simplifying constant pointer cast (char *) 49152
Simplifying constant pointer cast (char *) 57344
Simplifying constant pointer cast (char *) 58368
Simplifying constant pointer cast (char *) 15360
Simplifying constant pointer cast (char *) 31744
Simplifying constant pointer cast (char *) 34816
Simplifying constant integer cast $200
Simplifying constant pointer cast (char *) 44032
Simplifying constant integer cast 3
Simplifying constant integer cast 0
Simplifying constant integer cast $7f
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast $800
Simplifying constant integer cast $800
Simplifying constant integer cast $400
Simplifying constant integer cast $3e8
Simplifying constant integer cast $f
Simplifying constant integer cast $80
Simplifying constant integer cast 1
Simplifying constant integer cast 1
Simplifying constant integer cast $16
Simplifying constant integer cast $be
Simplifying constant integer cast $40
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast 1
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast $fa
Simplifying constant integer cast 1
Simplifying constant integer cast 8
Simplifying constant integer cast $40
Simplifying constant integer cast 3
Simplifying constant integer cast $3fff
Simplifying constant integer cast 4
Simplifying constant integer cast 4
Simplifying constant integer cast $f
Simplifying constant integer cast 0
Simplifying constant integer cast $80
Simplifying constant integer cast $7f
Simplifying constant integer cast $f8
Simplifying constant integer cast 1
Simplifying constant integer cast 7
Simplifying constant integer cast 0
Simplifying constant integer cast $80
Simplifying constant integer cast $7f
Simplifying constant integer cast $f8
Simplifying constant integer cast 7
Simplifying constant integer cast $3fff
Simplifying constant integer cast 4
Simplifying constant integer cast 4
Simplifying constant integer cast $f
Simplifying constant integer cast 0
Simplifying constant integer cast $80
Simplifying constant integer cast 8
Simplifying constant integer cast 0
Simplifying constant integer cast 8
Simplifying constant integer cast $128
Simplifying constant integer cast $130
Simplifying constant integer cast 8
Simplifying constant integer cast $130
Simplifying constant integer cast 1
Simplifying constant integer cast $2e
Simplifying constant integer cast $f6
Simplifying constant integer cast $2e
Simplifying constant integer cast 8
Simplifying constant integer cast $28
Simplifying constant integer cast $28
Simplifying constant integer cast $20
Simplifying constant integer cast 1
Simplifying constant integer cast 1
Simplifying constant integer cast $ff
Simplifying constant integer cast 8
Simplifying constant integer cast 0
Simplifying constant integer cast $20
Simplifying constant integer cast 8
Simplifying constant integer cast 1
Simplifying constant integer cast $16
Simplifying constant integer cast 1
Simplifying constant integer cast 7
Simplifying constant integer cast 8
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 2
Simplifying constant integer cast 0
Simplifying constant integer cast 2
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast 7
Simplifying constant integer cast 2
Simplifying constant integer cast (unumber)8*SIZEOF_STRUCT_BUCKETSPRITE
Simplifying constant integer cast 8
Simplifying constant integer cast 2
Simplifying constant integer cast $1f40
Simplifying constant integer cast 0
Simplifying constant integer cast $c0
Simplifying constant integer cast $400
Simplifying constant integer cast $3e8
Simplifying constant integer cast 8
Simplifying constant integer cast $20
Simplifying constant integer cast 8
Simplifying constant integer cast $20
Simplifying constant integer cast $40
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 8
Simplifying constant integer cast $3e8
Simplifying constant integer cast $18
Simplifying constant integer cast $40
Simplifying constant integer cast 3
Simplifying constant integer cast $3fff
Simplifying constant integer cast 4
Simplifying constant integer cast 4
Simplifying constant integer cast $f
Simplifying constant integer cast $ff
Simplifying constant integer cast $f
Simplifying constant integer cast $7f
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast $28
Simplifying constant integer cast 1
Simplifying constant integer cast $20
Simplifying constant integer cast 0
Simplifying constant integer cast 8
Simplifying constant integer cast 0
Simplifying constant integer cast $ff
Simplifying constant integer cast $40
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 8
Simplifying constant integer cast 1
Simplifying constant integer cast 8
Simplifying constant integer cast 9
Simplifying constant integer cast 0
Simplifying constant integer cast (unsigned int)irq_swing_plex::YMOVE*(unumber)9*(unumber)8
Simplifying constant integer cast 9
Simplifying constant integer cast 8
Simplifying constant integer cast 8
Simplifying constant integer cast 0
Simplifying constant integer cast 8
Simplifying constant integer cast 0
Simplifying constant integer cast 7
Simplifying constant integer cast 8
Simplifying constant integer cast 1
Simplifying constant integer cast $50
Simplifying constant integer cast $ff
Simplifying constant integer cast $27
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast $28
Simplifying constant integer cast 1
Simplifying constant integer cast 0
Simplifying constant integer cast 8
Simplifying constant integer cast 8
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast 0
Simplifying constant integer cast $f
Simplifying constant integer cast $1e
Simplifying constant integer cast $40
Simplifying constant integer cast 2
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (unsigned int) $200
Finalized unsigned number type (char) 3
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) $7f
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (unsigned int) $800
Finalized unsigned number type (unsigned int) $800
Finalized unsigned number type (unsigned int) $400
Finalized unsigned number type (unsigned int) $3e8
Finalized unsigned number type (char) $f
Finalized unsigned number type (char) $80
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) $16
Finalized unsigned number type (char) $be
Finalized unsigned number type (char) $40
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) $fa
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) $40
Finalized unsigned number type (char) 3
Finalized unsigned number type (unsigned int) $3fff
Finalized unsigned number type (char) 4
Finalized unsigned number type (char) 4
Finalized unsigned number type (char) $f
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) $80
Finalized unsigned number type (char) $7f
Finalized unsigned number type (char) $f8
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 7
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) $80
Finalized unsigned number type (char) $7f
Finalized unsigned number type (char) $f8
Finalized unsigned number type (char) 7
Finalized unsigned number type (unsigned int) $3fff
Finalized unsigned number type (char) 4
Finalized unsigned number type (char) 4
Finalized unsigned number type (char) $f
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) $80
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 8
Finalized unsigned number type (unsigned int) $128
Finalized unsigned number type (unsigned int) $130
Finalized unsigned number type (char) 8
Finalized unsigned number type (unsigned int) $130
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) $2e
Finalized unsigned number type (char) $f6
Finalized unsigned number type (char) $2e
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) $28
Finalized unsigned number type (char) $28
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) $ff
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) $16
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 7
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 2
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 2
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 7
Finalized unsigned number type (char) 2
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 2
Finalized unsigned number type (unsigned int) $1f40
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) $c0
Finalized unsigned number type (unsigned int) $400
Finalized unsigned number type (unsigned int) $3e8
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) $40
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 8
Finalized unsigned number type (unsigned int) $3e8
Finalized unsigned number type (char) $18
Finalized unsigned number type (char) $40
Finalized unsigned number type (char) 3
Finalized unsigned number type (unsigned int) $3fff
Finalized unsigned number type (char) 4
Finalized unsigned number type (char) 4
Finalized unsigned number type (char) $f
Finalized unsigned number type (char) $ff
Finalized unsigned number type (char) $f
Finalized unsigned number type (char) $7f
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
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) 1
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) $28
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) $ff
Finalized unsigned number type (char) $40
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) 8
Finalized unsigned number type (char) 9
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 9
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 7
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) $50
Finalized unsigned number type (char) $ff
Finalized unsigned number type (char) $27
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) $28
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) $f
Finalized unsigned number type (char) $1e
Finalized unsigned number type (char) $40
Finalized unsigned number type (char) 2
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inferred type updated to unsigned int in part1_run::toSpritePtr1_$0 = part1_run::toSpritePtr1_$1 / $40
Inferred type updated to char in irq_part1_top::toDd001_$1 = irq_part1_top::toDd001_$0 / $40
Inferred type updated to char in irq_part1_top::toDd001_$2 = 3 ^ irq_part1_top::toDd001_$1
Inferred type updated to unsigned int in irq_part1_top::toD0181_$0 = irq_part1_top::toD0181_$7 & $3fff
Inferred type updated to unsigned int in irq_part1_top::toD0181_$1 = irq_part1_top::toD0181_$0 * 4
Inferred type updated to char in irq_part1_top::toD0181_$4 = irq_part1_top::toD0181_$3 / 4
Inferred type updated to char in irq_part1_top::toD0181_$5 = irq_part1_top::toD0181_$4 & $f
Inferred type updated to char in irq_part1_top::toD0181_$6 = irq_part1_top::toD0181_$2 | irq_part1_top::toD0181_$5
Inferred type updated to char in irq_part1_top::$4 = irq_part1_top::$3 & $f8
Inferred type updated to char in irq_flipper_top::$1 = irq_flipper_top::$0 & 7
Inferred type updated to char in irq_flipper_top::$5 = irq_flipper_top::$4 & $f8
Inferred type updated to char in irq_flipper_bottom::$1 = irq_flipper_bottom::$0 & 7
Inferred type updated to unsigned int in irq_flipper_bottom::toD0181_$0 = irq_flipper_bottom::toD0181_$7 & $3fff
Inferred type updated to unsigned int in irq_flipper_bottom::toD0181_$1 = irq_flipper_bottom::toD0181_$0 * 4
Inferred type updated to char in irq_flipper_bottom::toD0181_$4 = irq_flipper_bottom::toD0181_$3 / 4
Inferred type updated to char in irq_flipper_bottom::toD0181_$5 = irq_flipper_bottom::toD0181_$4 & $f
Inferred type updated to char in irq_flipper_bottom::toD0181_$6 = irq_flipper_bottom::toD0181_$2 | irq_flipper_bottom::toD0181_$5
Inferred type updated to unsigned int in irq_flipper_bottom::$7 = irq_flipper_bottom::irq_flipper_line#1 - 8
Inferred type updated to unsigned int in irq_flipper_bottom::$9 = irq_flipper_bottom::irq_flipper_line#3 + 8
Inferred type updated to unsigned int in flipper_fix_colors::$4 = irq_flipper_top_line - $2e
Inferred type updated to unsigned int in flipper_fix_colors::$5 = flipper_fix_colors::$4 / 8
Inferred type updated to char in plexPrepareFrame::$3 = plexPrepareFrame::m#3 + 1
Inferred type updated to char in plexPrepareFrame::$6 = plexPrepareFrame::s#3 + 1
Inferred type updated to char in plexPrepareFrame::$19 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
Inferred type updated to char in plexPrepareFrame::$16 = plexPrepareFrame::ypos#1 + $16
Inferred type updated to char in plexPrepareFrame::$17 = plexPrepareFrame::real_sprite_id#3 + 1
Inferred type updated to char in plexPrepareFrame::$18 = plexPrepareFrame::$17 & 7
Inferred type updated to char in plexPrepareFrame::$20 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
Inferred type updated to char in plexBucketShow::$2 = plexBucketShow::real_idx#7 + 1
Inferred type updated to char in plexBucketShow::$3 = plexBucketShow::$2 & 7
Inferred type updated to char in plexBucketShow::$1 = plexBucketShow::real_idx#8 / 2
Inferred type updated to char in part2_init::$19 = (char)8*9 * SIZEOF_STRUCT_BUCKETSPRITE
Inferred type updated to unsigned int in part2_init::toSpritePtr1_$0 = part2_init::toSpritePtr1_$1 / $40
Inferred type updated to char in part2_run::toDd001_$1 = part2_run::toDd001_$0 / $40
Inferred type updated to char in part2_run::toDd001_$2 = 3 ^ part2_run::toDd001_$1
Inferred type updated to unsigned int in part2_run::toD0181_$0 = part2_run::toD0181_$7 & $3fff
Inferred type updated to unsigned int in part2_run::toD0181_$1 = part2_run::toD0181_$0 * 4
Inferred type updated to char in part2_run::toD0181_$4 = part2_run::toD0181_$3 / 4
Inferred type updated to char in part2_run::toD0181_$5 = part2_run::toD0181_$4 & $f
Inferred type updated to char in part2_run::toD0181_$6 = part2_run::toD0181_$2 | part2_run::toD0181_$5
Inferred type updated to unsigned int in plex_scroller_move::toSpritePtr1_$0 = plex_scroller_move::toSpritePtr1_$1 / $40
Inferred type updated to char in irq_swing_top::$2 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
Inferred type updated to char in irq_swing_plex::$23 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
Inferred type updated to unsigned int in irq_swing_plex::$24 = (unsigned int)irq_swing_plex::YMOVE*9*8 * SIZEOF_STRUCT_BUCKETSPRITE
Inferred type updated to unsigned int in irq_swing_plex::$25 = (unsigned int)9*8*8 * SIZEOF_STRUCT_BUCKETSPRITE
Inferred type updated to char in irq_swing_plex::$6 = irq_swing_plex::$28 & 7
Inferred type updated to unsigned int in irq_swing_plex::$7 = irq_swing_plex::scroll#0 / 8
Inferred type updated to char in irq_swing_plex::$16 = $28 - vsp_coarse_scroll
Inferred type updated to unsigned int in sparkler_anim::toSpritePtr1_$0 = sparkler_anim::toSpritePtr1_$1 / $40
Inferred type updated to char in sparkler_anim::$3 = sparkler_idx / 2
Inferred type updated to char in sparkler_anim::$4 = sparkler_anim::$2 + sparkler_anim::$3
Inversing boolean not [19] memset::$1 = memset::num#5 <= 0 from [18] memset::$0 = memset::num#5 > 0
Inversing boolean not [46] demo_work::$1 = 0 == sparkler_active from [45] demo_work::$3 = 0 != sparkler_active
Inversing boolean not [127] part1_loop::$2 = 0 == sparkler_active from [126] part1_loop::$10 = 0 != sparkler_active
Inversing boolean not [134] part1_loop::$8 = demo_frame_count <= (unsigned int)$e*$32 from [133] part1_loop::$7 = demo_frame_count > (unsigned int)$e*$32
Inversing boolean not [244] irq_flipper_bottom::$4 = 0 == flipper_done from [243] irq_flipper_bottom::$13 = 0 != flipper_done
Inversing boolean not [245] irq_flipper_bottom::$5 = 0 != flipper_done from [244] irq_flipper_bottom::$4 = 0 == flipper_done
Inversing boolean not [271] irq_flipper_bottom::$11 = irq_flipper_bottom::irq_flipper_line#4 != $130 from [270] irq_flipper_bottom::$10 = irq_flipper_bottom::irq_flipper_line#4 == $130
Inversing boolean not [286] flipper_fix_colors::$7 = flipper_fix_colors::charline#0 < flipper_charline from [285] flipper_fix_colors::$6 = flipper_fix_colors::charline#0 >= flipper_charline
Inversing boolean not [319] plexPrepareFrame::$5 = plexPrepareFrame::nxt_y#0 >= PLEX_YPOS[PLEX_SORTED_IDX[plexPrepareFrame::m#3]] from [318] plexPrepareFrame::$4 = plexPrepareFrame::nxt_y#0 < PLEX_YPOS[PLEX_SORTED_IDX[plexPrepareFrame::m#3]]
Inversing boolean not [358] plexPrepareFrame::$13 = plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::real_sprite_id#2] <= plexPrepareFrame::bucket_ypos#3 from [357] plexPrepareFrame::$12 = plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::real_sprite_id#2] > plexPrepareFrame::bucket_ypos#3
Inversing boolean not [364] plexPrepareFrame::$1 = plexPrepareFrame::sprite#3 == plexPrepareFrame::bucket#1 from [363] plexPrepareFrame::$0 = plexPrepareFrame::sprite#3 != plexPrepareFrame::bucket#1
Inversing boolean not [387] plexPrepareFrame::$15 = plexPrepareFrame::sprite#5 == plexPrepareFrame::bucket#2 from [386] plexPrepareFrame::$14 = plexPrepareFrame::sprite#5 != plexPrepareFrame::bucket#2
Inversing boolean not [429] plexBucketShow::$5 = plexBucketShow::i#2 != 8*SIZEOF_STRUCT_BUCKETSPRITE from [428] plexBucketShow::$4 = plexBucketShow::i#2 == 8*SIZEOF_STRUCT_BUCKETSPRITE
Inversing boolean not [587] part2_loop::$2 = 0 == p2_logo_reveal_done from [586] part2_loop::$17 = 0 != p2_logo_reveal_done
Inversing boolean not [592] part2_loop::$6 = 0 == p2_logo_revealing from [591] part2_loop::$18 = 0 != p2_logo_revealing
Inversing boolean not [599] part2_loop::$10 = 0 == p2_logo_swinging from [598] part2_loop::$19 = 0 != p2_logo_swinging
Inversing boolean not [605] part2_loop::$13 = 0 == p2_plex_scroller_moving from [604] part2_loop::$20 = 0 != p2_plex_scroller_moving
Inversing boolean not [630] plex_scroller_move::$2 = plex_scroller_move::x_idx#2 != 0 from [629] plex_scroller_move::$1 = plex_scroller_move::x_idx#2 == 0
Inversing boolean not [638] plex_scroller_move::$4 = *scroll_text_next != 0 from [637] plex_scroller_move::$3 = *scroll_text_next == 0
Inversing boolean not [644] plex_scroller_move::$6 = plex_scroller_move::letter#0 != $ff from [643] plex_scroller_move::$5 = plex_scroller_move::letter#0 == $ff
Inversing boolean not [698] irq_swing_plex::$3 = plex_frame_id < 8 from [697] irq_swing_plex::$2 = plex_frame_id >= 8
Inversing boolean not [703] irq_swing_plex::$5 = 0 == p2_logo_swinging from [702] irq_swing_plex::$29 = 0 != p2_logo_swinging
Inversing boolean not [710] irq_swing_plex::$17 = 0 == p2_plex_scroller_moving from [709] irq_swing_plex::$30 = 0 != p2_plex_scroller_moving
Inversing boolean not [731] irq_swing_plex::$11 = irq_swing_plex::coarse_scroll_diff#1 != $ff from [730] irq_swing_plex::$10 = irq_swing_plex::coarse_scroll_diff#1 == $ff
Inversing boolean not [749] irq_swing_plex::$21 = sprite_color_idx != irq_swing_plex::$19 from [748] irq_swing_plex::$20 = sprite_color_idx == irq_swing_plex::$19
Inversing boolean not [808] sparkler_anim::$1 = sparkler_idx != $1e from [807] sparkler_anim::$0 = sparkler_idx == $1e
Successful SSA optimization Pass2UnaryNotSimplification
Alias candidate removed (volatile)raster_fine::line_offset = irq_flipper_top::$1 irq_flipper_bottom::$1 
Alias candidate removed (volatile)irq_flipper_top_line = irq_flipper_bottom::$7 
Alias candidate removed (volatile)irq_flipper_bottom_line = irq_flipper_bottom::$9 
Alias candidate removed (volatile)plex_real_sprite_idx = plexBucketShow::$1 
Alias candidate removed (volatile)vsp_fine_scroll = irq_swing_plex::$6 
Alias candidate removed (volatile)vsp_scroll = irq_swing_plex::$16 
Alias memcpy::src#2 = memcpy::src#3 
Alias memcpy::dst#2 = memcpy::dst#3 
Alias memcpy::src_end#1 = memcpy::src_end#2 
Alias memcpy::destination#7 = memcpy::destination#9 memcpy::destination#8 memcpy::return#0 memcpy::return#8 memcpy::return#1 
Alias memset::return#0 = memset::str#5 memset::return#7 memset::return#1 
Alias memset::str#6 = memset::str#7 
Alias memset::num#5 = memset::num#6 
Alias memset::c#7 = memset::c#8 
Alias memset::c#5 = memset::c#6 
Alias memset::dst#2 = memset::dst#3 
Alias memset::end#1 = memset::end#2 
Alias memset::str#8 = memset::str#9 
Alias part1_run::toSpritePtr1_sprite#0 = part1_run::toSpritePtr1_sprite#1 
Alias part1_run::toSpritePtr1_return#0 = part1_run::toSpritePtr1_return#2 part1_run::toSpritePtr1_return#1 part1_run::toSpritePtr1_return#3 part1_run::$1 
Alias init_rasters::i#2 = init_rasters::i#3 
Alias init_rasters::b#2 = init_rasters::b#3 
Alias irq_part1_top::toDd001_gfx#0 = irq_part1_top::toDd001_gfx#1 
Alias irq_part1_top::toDd001_return#0 = irq_part1_top::toDd001_$2 irq_part1_top::toDd001_return#2 irq_part1_top::toDd001_return#1 irq_part1_top::toDd001_return#3 irq_part1_top::$0 
Alias irq_part1_top::toD0181_screen#0 = irq_part1_top::toD0181_screen#1 
Alias irq_part1_top::toD0181_gfx#0 = irq_part1_top::toD0181_gfx#1 
Alias irq_part1_top::toD0181_return#0 = irq_part1_top::toD0181_$6 irq_part1_top::toD0181_return#2 irq_part1_top::toD0181_return#1 irq_part1_top::toD0181_return#3 irq_part1_top::$1 
Alias irq_flipper_bottom::toD0181_screen#0 = irq_flipper_bottom::toD0181_screen#1 
Alias irq_flipper_bottom::toD0181_gfx#0 = irq_flipper_bottom::toD0181_gfx#1 
Alias irq_flipper_bottom::toD0181_return#0 = irq_flipper_bottom::toD0181_$6 irq_flipper_bottom::toD0181_return#2 irq_flipper_bottom::toD0181_return#1 irq_flipper_bottom::toD0181_return#3 irq_flipper_bottom::$3 
Alias irq_flipper_bottom::irq_flipper_line#0 = irq_flipper_bottom::irq_flipper_line#5 irq_flipper_bottom::irq_flipper_line#1 
Alias irq_flipper_bottom::irq_flipper_line#2 = irq_flipper_bottom::irq_flipper_line#6 irq_flipper_bottom::irq_flipper_line#3 
Alias flipper_fix_colors::happy_cols#1 = flipper_fix_colors::happy_cols#2 
Alias flipper_fix_colors::i#2 = flipper_fix_colors::i#3 
Alias flipper_fix_colors::colors#1 = flipper_fix_colors::colors#2 
Alias plexPrepareInit::i#2 = plexPrepareInit::i#3 
Alias plexPrepareFrame::m#2 = plexPrepareFrame::m#3 plexPrepareFrame::m#5 plexPrepareFrame::s#0 
Alias plexPrepareFrame::frame#11 = plexPrepareFrame::frame#8 plexPrepareFrame::frame#5 plexPrepareFrame::frame#3 
Alias plexPrepareFrame::nxt_y#0 = plexPrepareFrame::nxt_y#2 
Alias plexPrepareFrame::nxt_idx#0 = plexPrepareFrame::nxt_idx#3 
Alias plexPrepareFrame::s#1 = plexPrepareFrame::s#4 
Alias plexPrepareFrame::nxt_idx#1 = plexPrepareFrame::nxt_idx#2 
Alias plexPrepareFrame::m#6 = plexPrepareFrame::m#7 
Alias plexPrepareFrame::frame#10 = plexPrepareFrame::frame#9 
Alias plexPrepareFrame::i#2 = plexPrepareFrame::i#3 
Alias plexPrepareFrame::frame#1 = plexPrepareFrame::frame#4 plexPrepareFrame::frame#2 plexPrepareFrame::bucket#0 plexPrepareFrame::sprite#0 
Alias plexPrepareFrame::i1#2 = plexPrepareFrame::i1#3 plexPrepareFrame::i1#6 plexPrepareFrame::i1#7 
Alias plexPrepareFrame::real_sprite_id#2 = plexPrepareFrame::real_sprite_id#4 plexPrepareFrame::real_sprite_id#6 plexPrepareFrame::real_sprite_id#7 
Alias plexPrepareFrame::bucket_ypos#3 = plexPrepareFrame::bucket_ypos#5 
Alias plexPrepareFrame::sprite#3 = plexPrepareFrame::sprite#9 plexPrepareFrame::sprite#8 plexPrepareFrame::sprite#5 plexPrepareFrame::sprite#6 plexPrepareFrame::sprite#7 
Alias plexPrepareFrame::bucket_id#2 = plexPrepareFrame::bucket_id#3 plexPrepareFrame::bucket_id#4 
Alias plexPrepareFrame::bucket#3 = plexPrepareFrame::bucket#7 plexPrepareFrame::bucket#6 plexPrepareFrame::bucket#4 
Alias plexPrepareFrame::real_sprite_id#1 = plexPrepareFrame::$18 
Alias plexPrepareFrame::ypos#0 = plexPrepareFrame::ypos#3 plexPrepareFrame::ypos#4 
Alias plexPrepareFrame::plex_id#0 = plexPrepareFrame::plex_id#3 plexPrepareFrame::plex_id#4 
Alias plexPrepareFrame::sprite#2 = plexPrepareFrame::bucket#5 
Alias plexPrepareFrame::bucket#2 = plexPrepareFrame::bucket#8 
Alias plexPrepareFrame::bucket_ypos#2 = plexPrepareFrame::bucket_ypos#7 
Alias plexPrepareFrame::bucket_id#1 = plexPrepareFrame::bucket_id#7 
Alias plexBucketShow::bucket_ptr#1 = plexBucketShow::bucket_ptr#2 plexBucketShow::bucket_ptr#4 plexBucketShow::bucket_ptr#5 
Alias plexBucketShow::i#3 = plexBucketShow::i#4 
Alias plexBucketShow::real_idx#4 = plexBucketShow::real_idx#9 
Alias plexBucketShow::real_idx#1 = plexBucketShow::real_idx#5 plexBucketShow::real_idx#6 
Alias plexBucketShow::plex_id#0 = plexBucketShow::plex_id#2 plexBucketShow::plex_id#3 
Alias plexBucketShow::i#1 = plexBucketShow::i#6 plexBucketShow::i#7 
Alias plexBucketShow::real_idx#2 = plexBucketShow::$3 
Alias part2_init::frame_idx#2 = part2_init::frame_idx#3 part2_init::sin_idx#0 
Alias part2_init::frame#5 = part2_init::frame#7 
Alias memcpy::num#5 = part2_init::$9 
Alias part2_init::sin_idx#2 = part2_init::sin_idx#3 
Alias part2_init::s#2 = part2_init::s#3 
Alias part2_init::frame#2 = part2_init::frame#6 part2_init::frame#4 part2_init::frame#3 
Alias part2_init::frame_idx#4 = part2_init::frame_idx#7 part2_init::frame_idx#6 part2_init::frame_idx#5 
Alias part2_init::s1#2 = part2_init::s1#6 part2_init::s1#5 part2_init::s1#4 part2_init::s1#3 
Alias part2_init::toSpritePtr1_sprite#0 = part2_init::toSpritePtr1_sprite#1 
Alias part2_init::toSpritePtr1_return#0 = part2_init::toSpritePtr1_return#2 part2_init::toSpritePtr1_return#1 part2_init::toSpritePtr1_return#3 part2_init::$16 
Alias part2_init::s2#2 = part2_init::s2#3 
Alias part2_run::toDd001_gfx#0 = part2_run::toDd001_gfx#1 
Alias part2_run::toDd001_return#0 = part2_run::toDd001_$2 part2_run::toDd001_return#2 part2_run::toDd001_return#1 part2_run::toDd001_return#3 part2_run::$1 
Alias part2_run::toD0181_screen#0 = part2_run::toD0181_screen#1 
Alias part2_run::toD0181_gfx#0 = part2_run::toD0181_gfx#1 
Alias part2_run::toD0181_return#0 = part2_run::toD0181_$6 part2_run::toD0181_return#2 part2_run::toD0181_return#1 part2_run::toD0181_return#3 part2_run::$2 
Alias plex_scroller_move::x_idx#11 = plex_scroller_move::x_idx#2 plex_scroller_move::x_idx#4 plex_scroller_move::x_idx#12 
Alias plex_scroller_move::s#11 = plex_scroller_move::s#3 plex_scroller_move::s#2 plex_scroller_move::s#12 
Alias plex_scroller_move::toSpritePtr1_sprite#0 = plex_scroller_move::toSpritePtr1_sprite#1 
Alias plex_scroller_move::letter#2 = plex_scroller_move::letter#4 plex_scroller_move::letter#5 plex_scroller_move::letter#3 
Alias plex_scroller_move::s#5 = plex_scroller_move::s#7 plex_scroller_move::s#8 plex_scroller_move::s#6 
Alias plex_scroller_move::x_idx#5 = plex_scroller_move::x_idx#7 plex_scroller_move::x_idx#8 plex_scroller_move::x_idx#6 
Alias plex_scroller_move::toSpritePtr1_return#0 = plex_scroller_move::toSpritePtr1_return#2 plex_scroller_move::toSpritePtr1_return#1 plex_scroller_move::toSpritePtr1_return#3 plex_scroller_move::$7 
Alias plex_scroller_move::s#10 = plex_scroller_move::s#9 
Alias plex_scroller_move::x_idx#10 = plex_scroller_move::x_idx#9 
Alias irq_swing_plex::new_coarse_scroll#0 = irq_swing_plex::new_coarse_scroll#5 irq_swing_plex::new_coarse_scroll#3 irq_swing_plex::new_coarse_scroll#2 irq_swing_plex::new_coarse_scroll#6 irq_swing_plex::new_coarse_scroll#4 
Alias irq_swing_plex::coarse_scroll_diff#0 = irq_swing_plex::coarse_scroll_diff#1 
Alias irq_swing_plex::x_offset#0 = irq_swing_plex::x_offset#1 
Alias irq_swing_plex::s#2 = irq_swing_plex::s#3 
Alias sparkler_anim::toSpritePtr1_sprite#0 = sparkler_anim::toSpritePtr1_sprite#1 
Alias sparkler_anim::toSpritePtr1_return#0 = sparkler_anim::toSpritePtr1_return#2 sparkler_anim::toSpritePtr1_return#1 sparkler_anim::toSpritePtr1_return#3 sparkler_anim::$2 
Alias irq_demo::port_value#0 = irq_demo::port_value#1 
Successful SSA optimization Pass2AliasElimination
Alias candidate removed (volatile)raster_fine::line_offset = irq_flipper_top::$1 irq_flipper_bottom::$1 
Alias candidate removed (volatile)irq_flipper_top_line = irq_flipper_bottom::$7 
Alias candidate removed (volatile)irq_flipper_bottom_line = irq_flipper_bottom::$9 
Alias candidate removed (volatile)plex_real_sprite_idx = plexBucketShow::$1 
Alias candidate removed (volatile)vsp_fine_scroll = irq_swing_plex::$6 
Alias candidate removed (volatile)vsp_scroll = irq_swing_plex::$16 
Alias irq_flipper_bottom::irq_flipper_line#0 = irq_flipper_bottom::irq_flipper_line#2 irq_flipper_bottom::irq_flipper_line#4 
Alias plexPrepareFrame::sprite#2 = plexPrepareFrame::bucket#2 
Alias plexPrepareFrame::ypos#0 = plexPrepareFrame::ypos#2 
Alias plexPrepareFrame::plex_id#0 = plexPrepareFrame::plex_id#2 
Alias plexPrepareFrame::bucket_ypos#2 = plexPrepareFrame::bucket_ypos#6 
Alias plexPrepareFrame::real_sprite_id#2 = plexPrepareFrame::real_sprite_id#5 
Alias plexPrepareFrame::i1#2 = plexPrepareFrame::i1#5 
Alias plexPrepareFrame::bucket_id#1 = plexPrepareFrame::bucket_id#6 
Alias plexBucketShow::plex_id#0 = plexBucketShow::plex_id#1 
Alias plexBucketShow::real_idx#1 = plexBucketShow::real_idx#7 
Alias plexBucketShow::i#1 = plexBucketShow::i#5 
Alias plexBucketShow::bucket_ptr#1 = plexBucketShow::bucket_ptr#3 
Alias plex_scroller_move::s#10 = plex_scroller_move::s#11 plex_scroller_move::s#5 
Alias plex_scroller_move::x_idx#10 = plex_scroller_move::x_idx#11 plex_scroller_move::x_idx#5 
Alias irq_swing_plex::new_coarse_scroll#0 = irq_swing_plex::new_coarse_scroll#1 
Successful SSA optimization Pass2AliasElimination
Alias candidate removed (volatile)raster_fine::line_offset = irq_flipper_top::$1 irq_flipper_bottom::$1 
Alias candidate removed (volatile)irq_flipper_top_line = irq_flipper_bottom::$7 
Alias candidate removed (volatile)irq_flipper_bottom_line = irq_flipper_bottom::$9 
Alias candidate removed (volatile)plex_real_sprite_idx = plexBucketShow::$1 
Alias candidate removed (volatile)vsp_fine_scroll = irq_swing_plex::$6 
Alias candidate removed (volatile)vsp_scroll = irq_swing_plex::$16 
Alias plexPrepareFrame::ypos#0 = plexPrepareFrame::ypos#1 
Alias plexPrepareFrame::plex_id#0 = plexPrepareFrame::plex_id#1 
Alias plexPrepareFrame::real_sprite_id#2 = plexPrepareFrame::real_sprite_id#3 
Alias plexPrepareFrame::i1#2 = plexPrepareFrame::i1#4 
Alias plex_scroller_move::x_idx#10 = plex_scroller_move::x_idx#3 
Alias plex_scroller_move::s#10 = plex_scroller_move::s#4 
Successful SSA optimization Pass2AliasElimination
Alias candidate removed (volatile)raster_fine::line_offset = irq_flipper_top::$1 irq_flipper_bottom::$1 
Alias candidate removed (volatile)irq_flipper_top_line = irq_flipper_bottom::$7 
Alias candidate removed (volatile)irq_flipper_bottom_line = irq_flipper_bottom::$9 
Alias candidate removed (volatile)plex_real_sprite_idx = plexBucketShow::$1 
Alias candidate removed (volatile)vsp_fine_scroll = irq_swing_plex::$6 
Alias candidate removed (volatile)vsp_scroll = irq_swing_plex::$16 
Identical Phi Values memcpy::src_end#1 memcpy::src_end#0
Identical Phi Values memcpy::destination#7 memcpy::destination#6
Identical Phi Values memset::end#1 memset::end#0
Identical Phi Values memset::str#8 memset::str#6
Identical Phi Values memset::c#5 memset::c#7
Identical Phi Values flipper_fix_colors::happy_cols#1 flipper_fix_colors::happy_cols#0
Identical Phi Values flipper_fix_colors::colors#1 flipper_fix_colors::colors#0
Identical Phi Values plexPrepareFrame::frame#6 plexPrepareFrame::frame#0
Identical Phi Values plexPrepareFrame::nxt_y#1 plexPrepareFrame::nxt_y#0
Identical Phi Values plexPrepareFrame::nxt_idx#1 plexPrepareFrame::nxt_idx#0
Identical Phi Values plexPrepareFrame::m#6 plexPrepareFrame::m#2
Identical Phi Values plexPrepareFrame::frame#10 plexPrepareFrame::frame#11
Identical Phi Values plexPrepareFrame::frame#1 plexPrepareFrame::frame#11
Identical Phi Values plexBucketShow::bucket_ptr#1 plexBucketShow::bucket_ptr#0
Identical Phi Values part2_init::frame#2 part2_init::frame#5
Identical Phi Values part2_init::frame_idx#4 part2_init::frame_idx#2
Identical Phi Values update_frame_plex_id_offset::plex_frame_id#1 update_frame_plex_id_offset::plex_frame_id#0
Successful SSA optimization Pass2IdenticalPhiElimination
Identical Phi Values memset::return#0 memset::str#6
Identical Phi Values plexPrepareFrame::m#4 plexPrepareFrame::m#2
Identical Phi Values plexPrepareFrame::frame#7 plexPrepareFrame::frame#11
Successful SSA optimization Pass2IdenticalPhiElimination
Identical Phi Values plexPrepareFrame::frame#11 plexPrepareFrame::frame#0
Successful SSA optimization Pass2IdenticalPhiElimination
Simple Condition memcpy::$1 [7] if(memcpy::src#2!=memcpy::src_end#0) goto memcpy::@2
Simple Condition memset::$1 [14] if(memset::num#5<=0) goto memset::@1
Simple Condition memset::$3 [21] if(memset::dst#2!=memset::end#0) goto memset::@4
Simple Condition demo_work::$1 [35] if(0==sparkler_active) goto demo_work::@return
Simple Condition part1_loop::$0 [107] if(p1_work_ready==0) goto part1_loop::@1
Simple Condition part1_loop::$8 [116] if(demo_frame_count<=(unsigned int)$e*$32) goto part1_loop::@5
Simple Condition init_rasters::$1 [126] if(init_rasters::i#2<init_rasters::$0) goto init_rasters::@2
Simple Condition init_rasters::$2 [132] if(init_rasters::b#2<$fa) goto init_rasters::@5
Simple Condition irq_part1_top::$5 [158] if(0!=irq_part1_top::$2) goto irq_part1_top::@1
Simple Condition irq_flipper_top::$6 [176] if(0!=irq_flipper_top::$3) goto irq_flipper_top::@1
Simple Condition irq_flipper_bottom::$5 [205] if(0!=flipper_done) goto irq_flipper_bottom::@1
Simple Condition irq_flipper_bottom::$6 [214] if(irq_flipper_bottom::irq_flipper_line#0<8) goto irq_flipper_bottom::@4
Simple Condition irq_flipper_bottom::$8 [219] if(irq_flipper_bottom::irq_flipper_line#0>$128) goto irq_flipper_bottom::@6
Simple Condition irq_flipper_bottom::$11 [224] if(irq_flipper_bottom::irq_flipper_line#0!=$130) goto irq_flipper_bottom::@1
Simple Condition flipper_fix_colors::$7 [238] if(flipper_fix_colors::charline#0<flipper_charline) goto flipper_fix_colors::@return
Simple Condition flipper_fix_colors::$11 [246] if(flipper_fix_colors::i#2<$28) goto flipper_fix_colors::@4
Simple Condition plexPrepareInit::$0 [254] if(plexPrepareInit::i#2<$20) goto plexPrepareInit::@2
Simple Condition plexPrepareFrame::$2 [262] if(plexPrepareFrame::m#2<(char)$20-1) goto plexPrepareFrame::@2
Simple Condition plexPrepareFrame::$5 [267] if(plexPrepareFrame::nxt_y#0>=PLEX_YPOS[PLEX_SORTED_IDX[plexPrepareFrame::m#2]]) goto plexPrepareFrame::@4
Simple Condition plexPrepareFrame::$10 [283] if(plexPrepareFrame::i#2<8) goto plexPrepareFrame::@9
Simple Condition plexPrepareFrame::$11 [292] if(plexPrepareFrame::i1#2<$20) goto plexPrepareFrame::@12
Simple Condition plexPrepareFrame::$13 [296] if(plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::real_sprite_id#2]<=plexPrepareFrame::bucket_ypos#3) goto plexPrepareFrame::@14
Simple Condition plexPrepareFrame::$1 [300] if(plexPrepareFrame::sprite#3==plexPrepareFrame::bucket#1) goto plexPrepareFrame::@return
Simple Condition plexPrepareFrame::$15 [320] if(plexPrepareFrame::sprite#3==plexPrepareFrame::sprite#2) goto plexPrepareFrame::@15
Simple Condition plexBucketShow::$6 [336] if(0!=plexBucketShow::bucket_ptr#0[plexBucketShow::i#3]) goto plexBucketShow::@2
Simple Condition plexBucketShow::$7 [343] if(0!=PLEX_XPOS_MSB[plexBucketShow::plex_id#0]) goto plexBucketShow::@3
Simple Condition plexBucketShow::$5 [352] if(plexBucketShow::i#2!=8*SIZEOF_STRUCT_BUCKETSPRITE) goto plexBucketShow::@1
Simple Condition part2_init::$12 [400] if(part2_init::frame_idx#2<8) goto part2_init::@2
Simple Condition part2_init::$13 [410] if(part2_init::s#2<$20) goto part2_init::@5
Simple Condition part2_init::$15 [421] if(part2_init::s1#2<$20) goto part2_init::@8
Simple Condition part2_init::$18 [436] if(part2_init::s2#2<8) goto part2_init::@11
Simple Condition part2_loop::$0 [481] if(p2_work_ready==0) goto part2_loop::@1
Simple Condition p2_logo_reveal::$0 [508] if(p2_logo_reveal_idx>=$28) goto p2_logo_reveal::@1
Simple Condition plex_scroller_move::$0 [518] if(plex_scroller_move::s#10<$20) goto plex_scroller_move::@2
Simple Condition plex_scroller_move::$2 [522] if(plex_scroller_move::x_idx#10!=0) goto plex_scroller_move::@4
Simple Condition plex_scroller_move::$4 [527] if(*scroll_text_next!=0) goto plex_scroller_move::@5
Simple Condition plex_scroller_move::$6 [531] if(plex_scroller_move::letter#0!=$ff) goto plex_scroller_move::@6
Simple Condition irq_swing_plex::$1 [568] if(plex_bucket_id<9) goto irq_swing_plex::@1
Simple Condition irq_swing_plex::$3 [577] if(plex_frame_id<8) goto irq_swing_plex::@5
Simple Condition irq_swing_plex::$5 [581] if(0==p2_logo_swinging) goto irq_swing_plex::@6
Simple Condition irq_swing_plex::$17 [587] if(0==p2_plex_scroller_moving) goto irq_swing_plex::@9
Simple Condition irq_swing_plex::$9 [599] if(irq_swing_plex::coarse_scroll_diff#0==1) goto irq_swing_plex::@7
Simple Condition irq_swing_plex::$11 [604] if(irq_swing_plex::coarse_scroll_diff#0!=$ff) goto irq_swing_plex::@8
Simple Condition irq_swing_plex::$21 [618] if(sprite_color_idx!=irq_swing_plex::$19) goto irq_swing_plex::@10
Simple Condition irq_swing_plex::$22 [623] if(irq_swing_plex::s#2<8) goto irq_swing_plex::@12
Simple Condition vsp_update_screen::$2 [640] if(vsp_update_screen::$1==0) goto vsp_update_screen::@1
Simple Condition vsp_update_screen::$4 [644] if(vsp_update_screen::$3==1) goto vsp_update_screen::@2
Simple Condition main::$8 [658] if(demo_frame_count<(char)5*$32) goto main::@2
Simple Condition main::$9 [662] if(demo_frame_count<(unsigned int)$10*$32) goto main::@4
Simple Condition sparkler_anim::$1 [675] if(sparkler_idx!=$1e) goto sparkler_anim::@1
Successful SSA optimization Pass2ConditionalJumpSimplification
Rewriting ! if()-condition to reversed if() [112] part1_loop::$5 = ! part1_loop::$4
Rewriting && if()-condition to two if()s [111] part1_loop::$4 = part1_loop::$2 && part1_loop::$3
Rewriting ! if()-condition to reversed if() [232] flipper_fix_colors::$3 = ! flipper_fix_colors::$2
Rewriting && if()-condition to two if()s [231] flipper_fix_colors::$2 = flipper_fix_colors::$0 && flipper_fix_colors::$1
Rewriting && if()-condition to two if()s [277] plexPrepareFrame::$9 = plexPrepareFrame::$7 && plexPrepareFrame::$8
Rewriting ! if()-condition to reversed if() [485] part2_loop::$4 = ! part2_loop::$3
Rewriting && if()-condition to two if()s [484] part2_loop::$3 = p2_logo_revealing && part2_loop::$2
Rewriting ! if()-condition to reversed if() [490] part2_loop::$9 = ! part2_loop::$8
Rewriting && if()-condition to two if()s [489] part2_loop::$8 = part2_loop::$6 && part2_loop::$7
Rewriting ! if()-condition to reversed if() [495] part2_loop::$12 = ! part2_loop::$11
Rewriting && if()-condition to two if()s [494] part2_loop::$11 = part2_loop::$10 && p2_logo_reveal_done
Rewriting ! if()-condition to reversed if() [501] part2_loop::$16 = ! part2_loop::$15
Rewriting && if()-condition to two if()s [500] part2_loop::$15 = part2_loop::$13 && part2_loop::$14
Successful SSA optimization Pass2ConditionalAndOrRewriting
Warning! Adding boolean cast to non-boolean condition p2_logo_revealing
Warning! Adding boolean cast to non-boolean condition p2_logo_reveal_done
Negating conditional jump and destination [352] if(plexBucketShow::i#2==8*SIZEOF_STRUCT_BUCKETSPRITE) goto plexBucketShow::@5
Constant right-side identified [124] init_rasters::$0 = sizeof  RASTER_BADLINES
Constant right-side identified [297] plexPrepareFrame::$19 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
Constant right-side identified [317] plexPrepareFrame::$20 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
Constant right-side identified [402] memcpy::num#5 = sizeof  BUCKET_SPRITES
Constant right-side identified [416] part2_init::$19 = (char)8*9 * SIZEOF_STRUCT_BUCKETSPRITE
Constant right-side identified [547] irq_swing_top::$2 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
Constant right-side identified [564] irq_swing_plex::$23 = 8 * SIZEOF_STRUCT_BUCKETSPRITE
Constant right-side identified [574] irq_swing_plex::$24 = (unsigned int)irq_swing_plex::YMOVE*9*8 * SIZEOF_STRUCT_BUCKETSPRITE
Constant right-side identified [582] irq_swing_plex::$25 = (unsigned int)9*8*8 * SIZEOF_STRUCT_BUCKETSPRITE
Constant right-side identified [616] irq_swing_plex::$19 = sizeof  SPRITE_COLOR_SEQUENCE
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant memset::str#0 = (void *)PIXELS_EMPTY
Constant memset::c#0 = 0
Constant memset::num#0 = $800
Constant memcpy::destination#0 = (void *)LOAD_CHARSET
Constant memcpy::source#0 = (void *)CHARGEN
Constant memcpy::num#0 = $800
Constant memcpy::destination#1 = (void *)LOAD_SCREEN
Constant memcpy::source#1 = (void *)DEFAULT_SCREEN
Constant memcpy::num#1 = $400
Constant memcpy::destination#2 = (void *)LOAD_COLORS
Constant memcpy::source#2 = (void *)COLS
Constant memcpy::num#2 = $3e8
Constant part1_run::toSpritePtr1_sprite#0 = P1_SPRITES
Constant init_rasters::i#0 = 0
Constant init_rasters::$0 = sizeof RASTER_BADLINES
Constant init_rasters::b#0 = $32
Constant irq_part1_top::toDd001_gfx#0 = P1_SCREEN
Constant irq_part1_top::toD0181_screen#0 = P1_SCREEN
Constant irq_part1_top::toD0181_gfx#0 = P1_PIXELS
Constant irq_flipper_bottom::toD0181_screen#0 = LOAD_SCREEN
Constant irq_flipper_bottom::toD0181_gfx#0 = LOAD_CHARSET
Constant flipper_fix_colors::i#0 = 0
Constant plexPrepareInit::i#0 = 0
Constant plexPrepareFrame::m#0 = 0
Constant plexPrepareFrame::i#0 = 0
Constant plexPrepareFrame::real_sprite_id#0 = 0
Constant plexPrepareFrame::bucket_id#0 = 0
Constant plexPrepareFrame::i1#0 = 0
Constant plexPrepareFrame::$19 = 8*SIZEOF_STRUCT_BUCKETSPRITE
Constant plexPrepareFrame::$20 = 8*SIZEOF_STRUCT_BUCKETSPRITE
Constant plexBucketShow::i#0 = 0
Constant memcpy::destination#3 = (void *)LOGO_DATA_CRUNCHED2
Constant memcpy::source#3 = (void *)LOGO_DATA_CRUNCHED
Constant memcpy::num#3 = LOGO_DATA_CRUNCHED_SIZE
Constant memcpy::destination#4 = (void *)PLEX_ID_UPDATERS_CRUNCHED2
Constant memcpy::source#4 = (void *)PLEX_ID_UPDATERS_CRUNCHED
Constant memcpy::num#4 = PLEX_ID_UPDATERS_CRUNCHED_SIZE
Constant memset::str#1 = (void *)PART2_BITMAP+$1f40
Constant memset::c#1 = 0
Constant memset::num#1 = $c0
Constant memset::str#2 = (void *)COLS
Constant memset::c#2 = BLACK
Constant memset::num#2 = $400
Constant memset::str#3 = (void *)PART2_SCREEN
Constant memset::c#3 = BLACK
Constant memset::num#3 = $3e8
Constant part2_init::frame#0 = BUCKET_SPRITES
Constant part2_init::frame_idx#0 = 0
Constant part2_init::s#0 = 0
Constant memcpy::num#5 = sizeof BUCKET_SPRITES
Constant memcpy::destination#5 = (void *)ORIGINAL_BUCKET_SPRITES
Constant memcpy::source#5 = (void *)BUCKET_SPRITES
Constant part2_init::s1#0 = 0
Constant part2_init::$19 = (char)8*9*SIZEOF_STRUCT_BUCKETSPRITE
Constant part2_init::toSpritePtr1_sprite#0 = PART2_SPRITES
Constant part2_init::s2#0 = 0
Constant memset::str#4 = (void *)PART2_SCREEN+$3e8
Constant memset::c#4 = BLACK
Constant memset::num#4 = $18
Constant part2_run::toDd001_gfx#0 = PART2_SCREEN
Constant part2_run::toD0181_screen#0 = PART2_SCREEN
Constant part2_run::toD0181_gfx#0 = PART2_BITMAP
Constant plex_scroller_move::s#0 = 0
Constant plex_scroller_move::toSpritePtr1_sprite#0 = PART2_SPRITES
Constant plex_scroller_move::letter#1 = 0
Constant irq_swing_top::$2 = 8*SIZEOF_STRUCT_BUCKETSPRITE
Constant irq_swing_plex::$23 = 8*SIZEOF_STRUCT_BUCKETSPRITE
Constant irq_swing_plex::$24 = (unsigned int)irq_swing_plex::YMOVE*9*8*SIZEOF_STRUCT_BUCKETSPRITE
Constant irq_swing_plex::$25 = (unsigned int)9*8*8*SIZEOF_STRUCT_BUCKETSPRITE
Constant irq_swing_plex::$19 = sizeof SPRITE_COLOR_SEQUENCE
Constant irq_swing_plex::s#0 = 0
Constant sparkler_anim::toSpritePtr1_sprite#0 = P1_SPRITES
Successful SSA optimization Pass2ConstantIdentification
Constant part1_run::toSpritePtr1_$1 = (unsigned int)part1_run::toSpritePtr1_sprite#0
Constant irq_part1_top::toD0181_$7 = (unsigned int)irq_part1_top::toD0181_screen#0
Constant irq_flipper_bottom::toD0181_$7 = (unsigned int)irq_flipper_bottom::toD0181_screen#0
Constant part2_init::toSpritePtr1_$1 = (unsigned int)part2_init::toSpritePtr1_sprite#0
Constant part2_run::toD0181_$7 = (unsigned int)part2_run::toD0181_screen#0
Constant plex_scroller_move::toSpritePtr1_$1 = (unsigned int)plex_scroller_move::toSpritePtr1_sprite#0
Constant sparkler_anim::toSpritePtr1_$1 = (unsigned int)sparkler_anim::toSpritePtr1_sprite#0
Successful SSA optimization Pass2ConstantIdentification
Constant value identified (unsigned int)irq_part1_top::toDd001_gfx#0 in [141] irq_part1_top::toDd001_$0 = byte1  (unsigned int)irq_part1_top::toDd001_gfx#0
Constant value identified (unsigned int)irq_part1_top::toD0181_gfx#0 in [151] irq_part1_top::toD0181_$3 = byte1  (unsigned int)irq_part1_top::toD0181_gfx#0
Constant value identified (unsigned int)irq_flipper_bottom::toD0181_gfx#0 in [199] irq_flipper_bottom::toD0181_$3 = byte1  (unsigned int)irq_flipper_bottom::toD0181_gfx#0
Constant value identified (unsigned int)part2_run::toDd001_gfx#0 in [449] part2_run::toDd001_$0 = byte1  (unsigned int)part2_run::toDd001_gfx#0
Constant value identified (unsigned int)part2_run::toD0181_gfx#0 in [459] part2_run::toD0181_$3 = byte1  (unsigned int)part2_run::toD0181_gfx#0
Successful SSA optimization Pass2ConstantValues
Converting *(pointer+n) to pointer[n] [304] *plexPrepareFrame::$21 = plexPrepareFrame::ypos#0  -- plexPrepareFrame::$25[OFFSET_STRUCT_BUCKETSPRITE_YPOS]
Converting *(pointer+n) to pointer[n] [307] *plexPrepareFrame::$22 = plexPrepareFrame::plex_id#0  -- plexPrepareFrame::$26[OFFSET_STRUCT_BUCKETSPRITE_PLEX_ID]
Converting *(pointer+n) to pointer[n] [323] *plexPrepareFrame::$23 = 0  -- plexPrepareFrame::$27[OFFSET_STRUCT_BUCKETSPRITE_YPOS]
Converting *(pointer+n) to pointer[n] [326] *plexPrepareFrame::$24 = 0  -- plexPrepareFrame::$28[OFFSET_STRUCT_BUCKETSPRITE_YPOS]
Successful SSA optimization Pass2InlineDerefIdx
De-inlining pointer[w] to *(pointer+w)   [127] RASTER_BADLINES[init_rasters::i#2] = 0
De-inlining pointer[w] to *(pointer+w)   [211] irq_flipper_bottom::irq_flipper_line#0 = FLIPPER_EASING[irq_flipper_bottom::$12]
De-inlining pointer[w] to *(pointer+w)   [590] irq_swing_plex::scroll#0 = VSP_SINTABLE[irq_swing_plex::$26]
Successful SSA optimization Pass2DeInlineWordDerefIdx
Simplifying expression containing zero (char *)VICII in [95] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_X) = $16
Simplifying expression containing zero P1_SCREEN_SPRITE_PTRS in [101] P1_SCREEN_SPRITE_PTRS[0] = part1_run::toSpritePtr1_return#0
Simplifying expression containing zero (char *)CIA2 in [144] *((char *)CIA2+OFFSET_STRUCT_MOS6526_CIA_PORT_A) = irq_part1_top::toDd001_return#0
Simplifying expression containing zero BUCKET_YPOS in [284] plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::i#2] = BUCKET_YPOS[0]
Simplifying expression containing zero BUCKET_YPOS in [288] plexPrepareFrame::bucket_ypos#0 = BUCKET_YPOS[plexPrepareFrame::bucket_id#0]
Simplifying expression containing zero plexPrepareFrame::$25 in [303] plexPrepareFrame::$21 = plexPrepareFrame::$25 + OFFSET_STRUCT_BUCKETSPRITE_YPOS
Simplifying expression containing zero plexPrepareFrame::$25 in [304] plexPrepareFrame::$25[OFFSET_STRUCT_BUCKETSPRITE_YPOS] = plexPrepareFrame::ypos#0
Simplifying expression containing zero plexPrepareFrame::$27 in [322] plexPrepareFrame::$23 = plexPrepareFrame::$27 + OFFSET_STRUCT_BUCKETSPRITE_YPOS
Simplifying expression containing zero plexPrepareFrame::$27 in [323] plexPrepareFrame::$27[OFFSET_STRUCT_BUCKETSPRITE_YPOS] = 0
Simplifying expression containing zero plexPrepareFrame::$28 in [325] plexPrepareFrame::$24 = plexPrepareFrame::$28 + OFFSET_STRUCT_BUCKETSPRITE_YPOS
Simplifying expression containing zero plexPrepareFrame::$28 in [326] plexPrepareFrame::$28[OFFSET_STRUCT_BUCKETSPRITE_YPOS] = 0
Simplifying expression containing zero (char *)VICII in [430] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_X) = 0
Simplifying expression containing zero (char *)CIA2 in [452] *((char *)CIA2+OFFSET_STRUCT_MOS6526_CIA_PORT_A) = part2_run::toDd001_return#0
Simplifying expression containing zero BUCKET_YPOS in [470] *RASTER = BUCKET_YPOS[0]
Simplifying expression containing zero BUCKET_YPOS in [572] *RASTER = BUCKET_YPOS[0]
Simplifying expression containing zero P1_SCREEN_SPRITE_PTRS in [682] P1_SCREEN_SPRITE_PTRS[0] = sparkler_anim::$4
Successful SSA optimization PassNSimplifyExpressionWithZero
Removing unused block part2_loop::@return
Removing unused block main::@return
Successful SSA optimization Pass2EliminateUnusedBlocks
Eliminating unused variable memset::return#2 and assignment [51] memset::return#2 = memset::str#6
Eliminating unused variable memcpy::return#2 and assignment [55] memcpy::return#2 = memcpy::destination#6
Eliminating unused variable memcpy::return#3 and assignment [59] memcpy::return#3 = memcpy::destination#6
Eliminating unused variable memcpy::return#4 and assignment [61] memcpy::return#4 = memcpy::destination#6
Eliminating unused variable plexPrepareFrame::$21 and assignment [242] plexPrepareFrame::$21 = plexPrepareFrame::$25
Eliminating unused variable plexPrepareFrame::$22 and assignment [245] plexPrepareFrame::$22 = plexPrepareFrame::$26 + OFFSET_STRUCT_BUCKETSPRITE_PLEX_ID
Eliminating unused variable plexPrepareFrame::$23 and assignment [259] plexPrepareFrame::$23 = plexPrepareFrame::$27
Eliminating unused variable plexPrepareFrame::$24 and assignment [262] plexPrepareFrame::$24 = plexPrepareFrame::$28
Eliminating unused variable memcpy::return#5 and assignment [293] memcpy::return#5 = memcpy::destination#6
Eliminating unused variable memcpy::return#6 and assignment [295] memcpy::return#6 = memcpy::destination#6
Eliminating unused variable memset::return#3 and assignment [303] memset::return#3 = memset::str#6
Eliminating unused variable memset::return#4 and assignment [307] memset::return#4 = memset::str#6
Eliminating unused variable memset::return#5 and assignment [309] memset::return#5 = memset::str#6
Eliminating unused variable memcpy::return#7 and assignment [317] memcpy::return#7 = memcpy::destination#6
Eliminating unused variable memset::return#6 and assignment [343] memset::return#6 = memset::str#6
Eliminating unused constant OFFSET_STRUCT_MOS6526_CIA_PORT_A
Eliminating unused constant OFFSET_STRUCT_MOS6569_VICII_SPRITE0_X
Eliminating unused constant OFFSET_STRUCT_BUCKETSPRITE_YPOS
Successful SSA optimization PassNEliminateUnusedVars
Adding number conversion cast (unumber) 0 in part2_loop::$21 = 0 != p2_logo_revealing
Adding number conversion cast (unumber) 0 in part2_loop::$22 = 0 != p2_logo_reveal_done
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (char) 0
Finalized unsigned number type (char) 0
Successful SSA optimization PassNFinalizeNumberTypeConversions
Resolving array sizeof() sizeof BUCKET_SPRITES
Resolving array sizeof() sizeof RASTER_BADLINES
Resolving array sizeof() sizeof SPRITE_COLOR_SEQUENCE
Successful SSA optimization PassNSizeOfSimplification
Alias candidate removed (volatile)raster_fine::line_offset = irq_flipper_top::$1 irq_flipper_bottom::$1 
Alias candidate removed (volatile)irq_flipper_top_line = irq_flipper_bottom::$7 
Alias candidate removed (volatile)irq_flipper_bottom_line = irq_flipper_bottom::$9 
Alias candidate removed (volatile)plex_real_sprite_idx = plexBucketShow::$1 
Alias candidate removed (volatile)vsp_fine_scroll = irq_swing_plex::$6 
Alias candidate removed (volatile)vsp_scroll = irq_swing_plex::$16 
Simple Condition part1_loop::$2 [87] if(0==sparkler_active) goto part1_loop::@10
Simple Condition flipper_fix_colors::$0 [188] if(irq_flipper_top_line>$2e) goto flipper_fix_colors::@6
Simple Condition plexPrepareFrame::$7 [221] if(plexPrepareFrame::s#1!=$ff) goto plexPrepareFrame::@19
Simple Condition part2_loop::$21 [365] if(0!=p2_logo_revealing) goto part2_loop::@13
Simple Condition part2_loop::$6 [368] if(0==p2_logo_revealing) goto part2_loop::@14
Simple Condition part2_loop::$10 [371] if(0==p2_logo_swinging) goto part2_loop::@15
Simple Condition part2_loop::$13 [375] if(0==p2_plex_scroller_moving) goto part2_loop::@16
Condition not simple part1_loop::$3 [565] if(part1_loop::$3) goto part1_loop::@3
Introduced intermediate condition variable part1_loop::$11 = demo_frame_count
Simple Condition part1_loop::$3 [565] if(part1_loop::$11>(unsigned int)9*$32-3) goto part1_loop::@3
Simple Condition flipper_fix_colors::$1 [566] if(irq_flipper_top_line<$f6) goto flipper_fix_colors::@1
Simple Condition plexPrepareFrame::$8 [567] if(plexPrepareFrame::nxt_y#0<PLEX_YPOS[PLEX_SORTED_IDX[plexPrepareFrame::s#1]]) goto plexPrepareFrame::@5
Simple Condition part2_loop::$2 [568] if(0==p2_logo_reveal_done) goto part2_loop::@3
Condition not simple part2_loop::$7 [569] if(part2_loop::$7) goto part2_loop::@8
Introduced intermediate condition variable part2_loop::$23 = demo_frame_count
Simple Condition part2_loop::$7 [569] if(part2_loop::$23>(unsigned int)$12*$32+$19) goto part2_loop::@8
Simple Condition part2_loop::$22 [571] if(0!=p2_logo_reveal_done) goto part2_loop::@9
Condition not simple part2_loop::$14 [572] if(part2_loop::$14) goto part2_loop::@10
Introduced intermediate condition variable part2_loop::$24 = demo_frame_count
Simple Condition part2_loop::$14 [572] if(part2_loop::$24>(unsigned int)$1a*$32) goto part2_loop::@10
Successful SSA optimization Pass2ConditionalJumpSimplification
Negating conditional jump and destination [87] if(0!=sparkler_active) goto part1_loop::@4
Negating conditional jump and destination [188] if(irq_flipper_top_line<=$2e) goto flipper_fix_colors::@return
Negating conditional jump and destination [221] if(plexPrepareFrame::s#1==$ff) goto plexPrepareFrame::@6
Negating conditional jump and destination [365] if(0==p2_logo_revealing) goto part2_loop::@4
Negating conditional jump and destination [368] if(0!=p2_logo_revealing) goto part2_loop::@5
Negating conditional jump and destination [371] if(0!=p2_logo_swinging) goto part2_loop::@6
Negating conditional jump and destination [375] if(0!=p2_plex_scroller_moving) goto part2_loop::@7
Negating conditional jump and destination [565] if(part1_loop::$11<=(unsigned int)9*$32-3) goto part1_loop::@4
Negating conditional jump and destination [569] if(part2_loop::$23<=(unsigned int)$12*$32+$19) goto part2_loop::@5
Negating conditional jump and destination [571] if(0==p2_logo_reveal_done) goto part2_loop::@6
Negating conditional jump and destination [572] if(part2_loop::$24<=(unsigned int)$1a*$32) goto part2_loop::@7
Successful SSA optimization Pass2ConditionalJumpSequenceImprovement
Constant right-side identified [76] part1_run::toSpritePtr1_$0 = part1_run::toSpritePtr1_$1 / $40
Constant right-side identified [109] irq_part1_top::toDd001_$0 = byte1  (unsigned int)irq_part1_top::toDd001_gfx#0
Constant right-side identified [113] irq_part1_top::toD0181_$0 = irq_part1_top::toD0181_$7 & $3fff
Constant right-side identified [116] irq_part1_top::toD0181_$3 = byte1  (unsigned int)irq_part1_top::toD0181_gfx#0
Constant right-side identified [156] irq_flipper_bottom::toD0181_$0 = irq_flipper_bottom::toD0181_$7 & $3fff
Constant right-side identified [159] irq_flipper_bottom::toD0181_$3 = byte1  (unsigned int)irq_flipper_bottom::toD0181_gfx#0
Constant right-side identified [315] part2_init::toSpritePtr1_$0 = part2_init::toSpritePtr1_$1 / $40
Constant right-side identified [333] part2_run::toDd001_$0 = byte1  (unsigned int)part2_run::toDd001_gfx#0
Constant right-side identified [337] part2_run::toD0181_$0 = part2_run::toD0181_$7 & $3fff
Constant right-side identified [340] part2_run::toD0181_$3 = byte1  (unsigned int)part2_run::toD0181_gfx#0
Constant right-side identified [400] plex_scroller_move::toSpritePtr1_$0 = plex_scroller_move::toSpritePtr1_$1 / $40
Constant right-side identified [519] sparkler_anim::toSpritePtr1_$0 = sparkler_anim::toSpritePtr1_$1 / $40
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant part1_run::toSpritePtr1_$0 = part1_run::toSpritePtr1_$1/$40
Constant irq_part1_top::toDd001_$0 = byte1 (unsigned int)irq_part1_top::toDd001_gfx#0
Constant irq_part1_top::toD0181_$0 = irq_part1_top::toD0181_$7&$3fff
Constant irq_part1_top::toD0181_$3 = byte1 (unsigned int)irq_part1_top::toD0181_gfx#0
Constant irq_flipper_bottom::toD0181_$0 = irq_flipper_bottom::toD0181_$7&$3fff
Constant irq_flipper_bottom::toD0181_$3 = byte1 (unsigned int)irq_flipper_bottom::toD0181_gfx#0
Constant part2_init::toSpritePtr1_$0 = part2_init::toSpritePtr1_$1/$40
Constant part2_run::toDd001_$0 = byte1 (unsigned int)part2_run::toDd001_gfx#0
Constant part2_run::toD0181_$0 = part2_run::toD0181_$7&$3fff
Constant part2_run::toD0181_$3 = byte1 (unsigned int)part2_run::toD0181_gfx#0
Constant plex_scroller_move::toSpritePtr1_$0 = plex_scroller_move::toSpritePtr1_$1/$40
Constant sparkler_anim::toSpritePtr1_$0 = sparkler_anim::toSpritePtr1_$1/$40
Successful SSA optimization Pass2ConstantIdentification
Constant part1_run::toSpritePtr1_return#0 = (char)part1_run::toSpritePtr1_$0
Constant part2_init::toSpritePtr1_return#0 = (char)part2_init::toSpritePtr1_$0
Constant plex_scroller_move::toSpritePtr1_return#0 = (char)plex_scroller_move::toSpritePtr1_$0
Constant sparkler_anim::toSpritePtr1_return#0 = (char)sparkler_anim::toSpritePtr1_$0
Successful SSA optimization Pass2ConstantIdentification
Rewriting conditional comparison [188] if(irq_flipper_top_line<=$2e) goto flipper_fix_colors::@return
Adding number conversion cast (unumber) 8*9*8 in 
Adding number conversion cast (unumber) $130 in 
Adding number conversion cast (unumber) $30 in 
Adding number conversion cast (unumber) $2e+1 in if(irq_flipper_top_line<$2e+1) goto flipper_fix_colors::@return
Adding number conversion cast (unumber) 1 in if(irq_flipper_top_line<(unumber)$2e+1) goto flipper_fix_colors::@return
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant integer cast $130
Simplifying constant integer cast $30
Simplifying constant integer cast $2e+(unumber)1
Simplifying constant integer cast 1
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (unsigned int) $130
Finalized unsigned number type (char) $30
Finalized unsigned number type (char) 1
Successful SSA optimization PassNFinalizeNumberTypeConversions
Alias candidate removed (volatile)raster_fine::line_offset = irq_flipper_top::$1 irq_flipper_bottom::$1 
Alias candidate removed (volatile)irq_flipper_top_line = irq_flipper_bottom::$7 
Alias candidate removed (volatile)irq_flipper_bottom_line = irq_flipper_bottom::$9 
Alias candidate removed (volatile)plex_real_sprite_idx = plexBucketShow::$1 
Alias candidate removed (volatile)vsp_fine_scroll = irq_swing_plex::$6 
Alias candidate removed (volatile)vsp_scroll = irq_swing_plex::$16 
Constant right-side identified [106] irq_part1_top::toDd001_$1 = irq_part1_top::toDd001_$0 / $40
Constant right-side identified [109] irq_part1_top::toD0181_$1 = irq_part1_top::toD0181_$0 * 4
Constant right-side identified [111] irq_part1_top::toD0181_$4 = irq_part1_top::toD0181_$3 / 4
Constant right-side identified [150] irq_flipper_bottom::toD0181_$1 = irq_flipper_bottom::toD0181_$0 * 4
Constant right-side identified [152] irq_flipper_bottom::toD0181_$4 = irq_flipper_bottom::toD0181_$3 / 4
Constant right-side identified [303] part2_init::$17 = part2_init::toSpritePtr1_return#0 + ' '
Constant right-side identified [319] part2_run::toDd001_$1 = part2_run::toDd001_$0 / $40
Constant right-side identified [322] part2_run::toD0181_$1 = part2_run::toD0181_$0 * 4
Constant right-side identified [324] part2_run::toD0181_$4 = part2_run::toD0181_$3 / 4
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant irq_part1_top::toDd001_$1 = irq_part1_top::toDd001_$0/$40
Constant irq_part1_top::toD0181_$1 = irq_part1_top::toD0181_$0*4
Constant irq_part1_top::toD0181_$4 = irq_part1_top::toD0181_$3/4
Constant irq_flipper_bottom::toD0181_$1 = irq_flipper_bottom::toD0181_$0*4
Constant irq_flipper_bottom::toD0181_$4 = irq_flipper_bottom::toD0181_$3/4
Constant part2_init::$17 = part2_init::toSpritePtr1_return#0+' '
Constant part2_run::toDd001_$1 = part2_run::toDd001_$0/$40
Constant part2_run::toD0181_$1 = part2_run::toD0181_$0*4
Constant part2_run::toD0181_$4 = part2_run::toD0181_$3/4
Successful SSA optimization Pass2ConstantIdentification
Alias candidate removed (volatile)raster_fine::line_offset = irq_flipper_top::$1 irq_flipper_bottom::$1 
Alias candidate removed (volatile)irq_flipper_top_line = irq_flipper_bottom::$7 
Alias candidate removed (volatile)irq_flipper_bottom_line = irq_flipper_bottom::$9 
Alias candidate removed (volatile)plex_real_sprite_idx = plexBucketShow::$1 
Alias candidate removed (volatile)vsp_fine_scroll = irq_swing_plex::$6 
Alias candidate removed (volatile)vsp_scroll = irq_swing_plex::$16 
Constant right-side identified [106] irq_part1_top::toDd001_return#0 = 3 ^ irq_part1_top::toDd001_$1
Constant right-side identified [108] irq_part1_top::toD0181_$2 = byte1  irq_part1_top::toD0181_$1
Constant right-side identified [109] irq_part1_top::toD0181_$5 = irq_part1_top::toD0181_$4 & $f
Constant right-side identified [147] irq_flipper_bottom::toD0181_$2 = byte1  irq_flipper_bottom::toD0181_$1
Constant right-side identified [148] irq_flipper_bottom::toD0181_$5 = irq_flipper_bottom::toD0181_$4 & $f
Constant right-side identified [313] part2_run::toDd001_return#0 = 3 ^ part2_run::toDd001_$1
Constant right-side identified [315] part2_run::toD0181_$2 = byte1  part2_run::toD0181_$1
Constant right-side identified [316] part2_run::toD0181_$5 = part2_run::toD0181_$4 & $f
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant irq_part1_top::toDd001_return#0 = 3^irq_part1_top::toDd001_$1
Constant irq_part1_top::toD0181_$2 = byte1 irq_part1_top::toD0181_$1
Constant irq_part1_top::toD0181_$5 = irq_part1_top::toD0181_$4&$f
Constant irq_flipper_bottom::toD0181_$2 = byte1 irq_flipper_bottom::toD0181_$1
Constant irq_flipper_bottom::toD0181_$5 = irq_flipper_bottom::toD0181_$4&$f
Constant part2_run::toDd001_return#0 = 3^part2_run::toDd001_$1
Constant part2_run::toD0181_$2 = byte1 part2_run::toD0181_$1
Constant part2_run::toD0181_$5 = part2_run::toD0181_$4&$f
Successful SSA optimization Pass2ConstantIdentification
Simplifying constant evaluating to zero 3^irq_part1_top::toDd001_$1 in 
Simplifying constant evaluating to zero irq_part1_top::toD0181_$4&$f in 
Simplifying constant evaluating to zero 3^part2_run::toDd001_$1 in 
Simplifying constant evaluating to zero part2_run::toD0181_$4&$f in 
Successful SSA optimization PassNSimplifyConstantZero
Simplifying expression containing zero irq_part1_top::toD0181_$2 in [110] irq_part1_top::toD0181_return#0 = irq_part1_top::toD0181_$2 | irq_part1_top::toD0181_$5
Simplifying expression containing zero part2_run::toD0181_$2 in [317] part2_run::toD0181_return#0 = part2_run::toD0181_$2 | part2_run::toD0181_$5
Successful SSA optimization PassNSimplifyExpressionWithZero
Eliminating unused constant irq_part1_top::toDd001_$1
Eliminating unused constant irq_part1_top::toD0181_$4
Eliminating unused constant irq_part1_top::toD0181_$5
Eliminating unused constant part2_run::toDd001_$1
Eliminating unused constant part2_run::toD0181_$4
Eliminating unused constant part2_run::toD0181_$5
Successful SSA optimization PassNEliminateUnusedVars
Eliminating unused constant irq_part1_top::toDd001_$0
Eliminating unused constant irq_part1_top::toD0181_$3
Eliminating unused constant part2_run::toDd001_$0
Eliminating unused constant part2_run::toD0181_$3
Successful SSA optimization PassNEliminateUnusedVars
Eliminating unused constant irq_part1_top::toDd001_gfx#0
Eliminating unused constant irq_part1_top::toD0181_gfx#0
Eliminating unused constant part2_run::toDd001_gfx#0
Eliminating unused constant part2_run::toD0181_gfx#0
Successful SSA optimization PassNEliminateUnusedVars
Alias candidate removed (volatile)raster_fine::line_offset = irq_flipper_top::$1 irq_flipper_bottom::$1 
Alias candidate removed (volatile)irq_flipper_top_line = irq_flipper_bottom::$7 
Alias candidate removed (volatile)irq_flipper_bottom_line = irq_flipper_bottom::$9 
Alias candidate removed (volatile)plex_real_sprite_idx = plexBucketShow::$1 
Alias candidate removed (volatile)vsp_fine_scroll = irq_swing_plex::$6 
Alias candidate removed (volatile)vsp_scroll = irq_swing_plex::$16 
Constant right-side identified [144] irq_flipper_bottom::toD0181_return#0 = irq_flipper_bottom::toD0181_$2 | irq_flipper_bottom::toD0181_$5
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant irq_part1_top::toD0181_return#0 = irq_part1_top::toD0181_$2
Constant irq_flipper_bottom::toD0181_return#0 = irq_flipper_bottom::toD0181_$2|irq_flipper_bottom::toD0181_$5
Constant part2_run::toD0181_return#0 = part2_run::toD0181_$2
Successful SSA optimization Pass2ConstantIdentification
Alias candidate removed (volatile)raster_fine::line_offset = irq_flipper_top::$1 irq_flipper_bottom::$1 
Alias candidate removed (volatile)irq_flipper_top_line = irq_flipper_bottom::$7 
Alias candidate removed (volatile)irq_flipper_bottom_line = irq_flipper_bottom::$9 
Alias candidate removed (volatile)plex_real_sprite_idx = plexBucketShow::$1 
Alias candidate removed (volatile)vsp_fine_scroll = irq_swing_plex::$6 
Alias candidate removed (volatile)vsp_scroll = irq_swing_plex::$16 
Inlining Noop Cast [1] memcpy::src#0 = (char *)memcpy::source#6 keeping memcpy::source#6
Inlining Noop Cast [2] memcpy::dst#0 = (char *)memcpy::destination#6 keeping memcpy::destination#6
Inlining Noop Cast [3] memcpy::$2 = (char *)memcpy::source#6 keeping memcpy::source#6
Inlining Noop Cast [13] memset::$4 = (char *)memset::str#6 keeping memset::str#6
Inlining Noop Cast [15] memset::dst#0 = (char *)memset::str#6 keeping memset::str#6
Inlining Noop Cast [213] plexPrepareFrame::$25 = (char *)plexPrepareFrame::sprite#4 keeping plexPrepareFrame::sprite#4
Inlining Noop Cast [215] plexPrepareFrame::$26 = (char *)plexPrepareFrame::sprite#4 keeping plexPrepareFrame::sprite#4
Inlining Noop Cast [228] plexPrepareFrame::$27 = (char *)plexPrepareFrame::sprite#3 keeping plexPrepareFrame::sprite#3
Inlining Noop Cast [230] plexPrepareFrame::$28 = (char *)plexPrepareFrame::sprite#3 keeping plexPrepareFrame::sprite#3
Inlining Noop Cast [236] plexBucketShow::bucket_ptr#0 = (char *)plexBucketShow::bucket#2 keeping plexBucketShow::bucket#2
Successful SSA optimization Pass2NopCastInlining
Rewriting multiplication to use shift [149] irq_flipper_bottom::$12 = irq_flipper_idx * SIZEOF_UNSIGNED_INT
Rewriting division to use shift [168] flipper_fix_colors::$5 = flipper_fix_colors::$4 / 8
Rewriting multiplication to use shift and addition[172] flipper_fix_colors::offset#0 = flipper_fix_colors::$12 * $28
Rewriting multiplication to use shift [237] plexBucketShow::real_idx#0 = plex_real_sprite_idx * 2
Rewriting division to use shift [244] plexBucketShow::real_idx#1 = plexBucketShow::real_idx#4 / 2
Rewriting multiplication to use shift [251] plexBucketShow::real_idx#3 = plexBucketShow::real_idx#2 * 2
Rewriting division to use shift [255] plexBucketShow::$1 = plexBucketShow::real_idx#8 / 2
Rewriting multiplication to use shift [400] irq_swing_plex::$26 = irq_swing_plex::$27 * SIZEOF_UNSIGNED_INT
Rewriting division to use shift [407] irq_swing_plex::$7 = irq_swing_plex::scroll#0 / 8
Rewriting multiplication to use shift [434] update_frame_plex_id_offset::$0 = update_frame_plex_id_offset::plex_frame_id#0 * SIZEOF_UNSIGNED_INT
Rewriting multiplication to use shift [442] vsp_update_screen::x_offset8 = vsp_update_screen::$5 * 8
Rewriting division to use shift [475] sparkler_anim::$3 = sparkler_idx / 2
Successful SSA optimization Pass2MultiplyToShiftRewriting
Inlining constant with var siblings memcpy::destination#0
Inlining constant with var siblings memcpy::source#0
Inlining constant with var siblings memcpy::num#0
Inlining constant with var siblings memcpy::destination#1
Inlining constant with var siblings memcpy::source#1
Inlining constant with var siblings memcpy::num#1
Inlining constant with var siblings memcpy::destination#2
Inlining constant with var siblings memcpy::source#2
Inlining constant with var siblings memcpy::num#2
Inlining constant with var siblings memcpy::destination#3
Inlining constant with var siblings memcpy::source#3
Inlining constant with var siblings memcpy::num#3
Inlining constant with var siblings memcpy::destination#4
Inlining constant with var siblings memcpy::source#4
Inlining constant with var siblings memcpy::num#4
Inlining constant with var siblings memcpy::num#5
Inlining constant with var siblings memcpy::destination#5
Inlining constant with var siblings memcpy::source#5
Inlining constant with var siblings memset::str#0
Inlining constant with var siblings memset::c#0
Inlining constant with var siblings memset::num#0
Inlining constant with var siblings memset::str#1
Inlining constant with var siblings memset::c#1
Inlining constant with var siblings memset::num#1
Inlining constant with var siblings memset::str#2
Inlining constant with var siblings memset::c#2
Inlining constant with var siblings memset::num#2
Inlining constant with var siblings memset::str#3
Inlining constant with var siblings memset::c#3
Inlining constant with var siblings memset::num#3
Inlining constant with var siblings memset::str#4
Inlining constant with var siblings memset::c#4
Inlining constant with var siblings memset::num#4
Inlining constant with var siblings init_rasters::i#0
Inlining constant with var siblings init_rasters::b#0
Inlining constant with var siblings flipper_fix_colors::i#0
Inlining constant with var siblings plexPrepareInit::i#0
Inlining constant with var siblings plexPrepareFrame::m#0
Inlining constant with var siblings plexPrepareFrame::i#0
Inlining constant with var siblings plexPrepareFrame::real_sprite_id#0
Inlining constant with var siblings plexPrepareFrame::bucket_id#0
Inlining constant with var siblings plexPrepareFrame::i1#0
Inlining constant with var siblings plexBucketShow::i#0
Inlining constant with var siblings part2_init::frame#0
Inlining constant with var siblings part2_init::frame_idx#0
Inlining constant with var siblings part2_init::s#0
Inlining constant with var siblings part2_init::s1#0
Inlining constant with var siblings part2_init::s2#0
Inlining constant with var siblings plex_scroller_move::s#0
Inlining constant with var siblings plex_scroller_move::letter#1
Inlining constant with var siblings irq_swing_plex::s#0
Constant inlined part2_init::s2#0 = 0
Constant inlined memset::num#3 = $3e8
Constant inlined memset::num#2 = $400
Constant inlined memset::num#4 = $18
Constant inlined memset::num#1 = $c0
Constant inlined memset::num#0 = $800
Constant inlined plex_scroller_move::s#0 = 0
Constant inlined part2_init::$17 = part2_init::toSpritePtr1_return#0+' '
Constant inlined part2_init::$19 = (char)8*9*SIZEOF_STRUCT_BUCKETSPRITE
Constant inlined part2_init::frame#0 = BUCKET_SPRITES
Constant inlined plexPrepareFrame::real_sprite_id#0 = 0
Constant inlined flipper_fix_colors::i#0 = 0
Constant inlined part2_init::frame_idx#0 = 0
Constant inlined part1_run::toSpritePtr1_sprite#0 = P1_SPRITES
Constant inlined irq_swing_plex::$19 = $30*SIZEOF_CHAR
Constant inlined init_rasters::b#0 = $32
Constant inlined memcpy::source#0 = (void *)CHARGEN
Constant inlined init_rasters::$0 = $130*SIZEOF_CHAR
Constant inlined irq_swing_plex::$23 = 8*SIZEOF_STRUCT_BUCKETSPRITE
Constant inlined plexBucketShow::i#0 = 0
Constant inlined irq_swing_plex::$24 = (unsigned int)irq_swing_plex::YMOVE*9*8*SIZEOF_STRUCT_BUCKETSPRITE
Constant inlined part2_run::toD0181_$7 = (unsigned int)PART2_SCREEN
Constant inlined sparkler_anim::toSpritePtr1_$0 = (unsigned int)P1_SPRITES/$40
Constant inlined plexPrepareFrame::$20 = 8*SIZEOF_STRUCT_BUCKETSPRITE
Constant inlined sparkler_anim::toSpritePtr1_$1 = (unsigned int)P1_SPRITES
Constant inlined part2_run::toD0181_$1 = (unsigned int)PART2_SCREEN&$3fff*4
Constant inlined part2_run::toD0181_$2 = byte1 (unsigned int)PART2_SCREEN&$3fff*4
Constant inlined memset::c#0 = 0
Constant inlined memset::c#1 = 0
Constant inlined memset::c#2 = BLACK
Constant inlined part2_run::toD0181_$0 = (unsigned int)PART2_SCREEN&$3fff
Constant inlined memset::c#3 = BLACK
Constant inlined memset::c#4 = BLACK
Constant inlined irq_part1_top::toD0181_screen#0 = P1_SCREEN
Constant inlined plexPrepareInit::i#0 = 0
Constant inlined plexPrepareFrame::bucket_id#0 = 0
Constant inlined memcpy::destination#4 = (void *)PLEX_ID_UPDATERS_CRUNCHED2
Constant inlined memcpy::destination#5 = (void *)ORIGINAL_BUCKET_SPRITES
Constant inlined part2_init::s1#0 = 0
Constant inlined memcpy::destination#2 = (void *)LOAD_COLORS
Constant inlined memcpy::destination#3 = (void *)LOGO_DATA_CRUNCHED2
Constant inlined memcpy::destination#0 = (void *)LOAD_CHARSET
Constant inlined memcpy::destination#1 = (void *)LOAD_SCREEN
Constant inlined irq_swing_plex::$25 = (unsigned int)9*8*8*SIZEOF_STRUCT_BUCKETSPRITE
Constant inlined memcpy::num#5 = (unsigned int)8*9*8*SIZEOF_STRUCT_BUCKETSPRITE
Constant inlined memcpy::num#4 = PLEX_ID_UPDATERS_CRUNCHED_SIZE
Constant inlined plexPrepareFrame::$19 = 8*SIZEOF_STRUCT_BUCKETSPRITE
Constant inlined memcpy::source#4 = (void *)PLEX_ID_UPDATERS_CRUNCHED
Constant inlined irq_part1_top::toD0181_$0 = (unsigned int)P1_SCREEN&$3fff
Constant inlined memcpy::source#3 = (void *)LOGO_DATA_CRUNCHED
Constant inlined irq_part1_top::toD0181_$1 = (unsigned int)P1_SCREEN&$3fff*4
Constant inlined memcpy::source#2 = (void *)COLS
Constant inlined irq_part1_top::toD0181_$2 = byte1 (unsigned int)P1_SCREEN&$3fff*4
Constant inlined irq_flipper_bottom::toD0181_gfx#0 = LOAD_CHARSET
Constant inlined memcpy::source#1 = (void *)DEFAULT_SCREEN
Constant inlined plex_scroller_move::toSpritePtr1_$0 = (unsigned int)PART2_SPRITES/$40
Constant inlined irq_flipper_bottom::toD0181_$7 = (unsigned int)LOAD_SCREEN
Constant inlined plex_scroller_move::toSpritePtr1_$1 = (unsigned int)PART2_SPRITES
Constant inlined memcpy::source#5 = (void *)BUCKET_SPRITES
Constant inlined irq_part1_top::toD0181_$7 = (unsigned int)P1_SCREEN
Constant inlined plex_scroller_move::toSpritePtr1_sprite#0 = PART2_SPRITES
Constant inlined LOGO_DATA_SCREEN = LOGO_DATA
Constant inlined memset::str#2 = (void *)COLS
Constant inlined memset::str#1 = (void *)PART2_BITMAP+$1f40
Constant inlined memset::str#0 = (void *)PIXELS_EMPTY
Constant inlined irq_swing_top::$2 = 8*SIZEOF_STRUCT_BUCKETSPRITE
Constant inlined part2_init::toSpritePtr1_$1 = (unsigned int)PART2_SPRITES
Constant inlined memset::str#4 = (void *)PART2_SCREEN+$3e8
Constant inlined part2_init::toSpritePtr1_$0 = (unsigned int)PART2_SPRITES/$40
Constant inlined memset::str#3 = (void *)PART2_SCREEN
Constant inlined irq_flipper_bottom::toD0181_$4 = byte1 (unsigned int)LOAD_CHARSET/4
Constant inlined irq_flipper_bottom::toD0181_$3 = byte1 (unsigned int)LOAD_CHARSET
Constant inlined irq_flipper_bottom::toD0181_$5 = byte1 (unsigned int)LOAD_CHARSET/4&$f
Constant inlined irq_flipper_bottom::toD0181_screen#0 = LOAD_SCREEN
Constant inlined irq_flipper_bottom::toD0181_$0 = (unsigned int)LOAD_SCREEN&$3fff
Constant inlined irq_flipper_bottom::toD0181_$2 = byte1 (unsigned int)LOAD_SCREEN&$3fff*4
Constant inlined init_rasters::i#0 = 0
Constant inlined irq_flipper_bottom::toD0181_$1 = (unsigned int)LOAD_SCREEN&$3fff*4
Constant inlined sparkler_anim::toSpritePtr1_sprite#0 = P1_SPRITES
Constant inlined memcpy::num#1 = $400
Constant inlined memcpy::num#0 = $800
Constant inlined plexPrepareFrame::i1#0 = 0
Constant inlined memcpy::num#3 = LOGO_DATA_CRUNCHED_SIZE
Constant inlined part1_run::toSpritePtr1_$1 = (unsigned int)P1_SPRITES
Constant inlined part1_run::toSpritePtr1_$0 = (unsigned int)P1_SPRITES/$40
Constant inlined memcpy::num#2 = $3e8
Constant inlined part2_run::toD0181_screen#0 = PART2_SCREEN
Constant inlined plex_scroller_move::letter#1 = 0
Constant inlined irq_swing_plex::s#0 = 0
Constant inlined plexPrepareFrame::i#0 = 0
Constant inlined plexPrepareFrame::m#0 = 0
Constant inlined part2_init::s#0 = 0
Constant inlined part2_init::toSpritePtr1_sprite#0 = PART2_SPRITES
Successful SSA optimization Pass2ConstantInlining
Consolidated array index constant in assignment (PLEX_SORTED_IDX+1)[plexPrepareFrame::$3]
Consolidated array index constant in assignment (PLEX_SORTED_IDX+1)[plexPrepareFrame::$6]
Consolidated array index constant in *(BUCKET_YPOS+1)
Successful SSA optimization Pass2ConstantAdditionElimination
Alias candidate removed (volatile)raster_fine::line_offset = irq_flipper_top::$1 irq_flipper_bottom::$1 
Alias candidate removed (volatile)irq_flipper_top_line = irq_flipper_bottom::$7 
Alias candidate removed (volatile)irq_flipper_bottom_line = irq_flipper_bottom::$9 
Alias candidate removed (volatile)plex_real_sprite_idx = plexBucketShow::$1 
Alias candidate removed (volatile)vsp_fine_scroll = irq_swing_plex::$6 
Alias candidate removed (volatile)vsp_scroll = irq_swing_plex::$16 
Alias flipper_fix_colors::offset#0 = flipper_fix_colors::$15 
Alias plexPrepareFrame::m#2 = plexPrepareFrame::$3 
Alias plexPrepareFrame::s#3 = plexPrepareFrame::$6 
Successful SSA optimization Pass2AliasElimination
Alias candidate removed (volatile)raster_fine::line_offset = irq_flipper_top::$1 irq_flipper_bottom::$1 
Alias candidate removed (volatile)irq_flipper_top_line = irq_flipper_bottom::$7 
Alias candidate removed (volatile)irq_flipper_bottom_line = irq_flipper_bottom::$9 
Alias candidate removed (volatile)plex_real_sprite_idx = plexBucketShow::$1 
Alias candidate removed (volatile)vsp_fine_scroll = irq_swing_plex::$6 
Alias candidate removed (volatile)vsp_scroll = irq_swing_plex::$16 
Eliminating unused constant SIZEOF_UNSIGNED_INT
Successful SSA optimization PassNEliminateUnusedVars
Alias candidate removed (volatile)raster_fine::line_offset = irq_flipper_top::$1 irq_flipper_bottom::$1 
Alias candidate removed (volatile)irq_flipper_top_line = irq_flipper_bottom::$7 
Alias candidate removed (volatile)irq_flipper_bottom_line = irq_flipper_bottom::$9 
Alias candidate removed (volatile)plex_real_sprite_idx = plexBucketShow::$1 
Alias candidate removed (volatile)vsp_fine_scroll = irq_swing_plex::$6 
Alias candidate removed (volatile)vsp_scroll = irq_swing_plex::$16 
Finalized unsigned number type (unsigned int) $130
Finalized unsigned number type (unsigned int) $130
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 9
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) $20
Finalized unsigned number type (unsigned int) $100
Finalized unsigned number type (unsigned int) $100
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 9
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 9
Finalized unsigned number type (char) 8
Finalized unsigned number type (unsigned int) $400
Finalized unsigned number type (char) $e
Finalized unsigned number type (char) $32
Finalized unsigned number type (char) $20
Finalized unsigned number type (char) 1
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 9
Finalized unsigned number type (char) 9
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) 8
Finalized unsigned number type (char) $18
Finalized unsigned number type (char) $28
Finalized unsigned number type (char) $18
Finalized unsigned number type (char) $28
Finalized unsigned number type (char) 5
Finalized unsigned number type (char) $32
Finalized unsigned number type (char) $10
Finalized unsigned number type (char) $32
Finalized unsigned number type (char) 9
Finalized unsigned number type (char) $32
Finalized unsigned number type (char) 3
Finalized unsigned number type (char) $12
Finalized unsigned number type (char) $32
Finalized unsigned number type (char) $19
Finalized unsigned number type (char) $1a
Finalized unsigned number type (char) $32
Successful SSA optimization PassNFinalizeNumberTypeConversions
Simplifying constant integer cast $20-1
Simplifying constant integer cast 8*9
Simplifying constant integer cast 5*$32
Successful SSA optimization PassNCastSimplification
Alias candidate removed (volatile)raster_fine::line_offset = irq_flipper_top::$1 irq_flipper_bottom::$1 
Alias candidate removed (volatile)irq_flipper_top_line = irq_flipper_bottom::$7 
Alias candidate removed (volatile)irq_flipper_bottom_line = irq_flipper_bottom::$9 
Alias candidate removed (volatile)plex_real_sprite_idx = plexBucketShow::$1 
Alias candidate removed (volatile)vsp_fine_scroll = irq_swing_plex::$6 
Alias candidate removed (volatile)vsp_scroll = irq_swing_plex::$16 
Alias candidate removed (volatile)raster_fine::line_offset = irq_flipper_top::$1 irq_flipper_bottom::$1 
Alias candidate removed (volatile)irq_flipper_top_line = irq_flipper_bottom::$7 
Alias candidate removed (volatile)irq_flipper_bottom_line = irq_flipper_bottom::$9 
Alias candidate removed (volatile)plex_real_sprite_idx = plexBucketShow::$1 
Alias candidate removed (volatile)vsp_fine_scroll = irq_swing_plex::$6 
Alias candidate removed (volatile)vsp_scroll = irq_swing_plex::$16 
Added new block during phi lifting plexPrepareFrame::@20(between plexPrepareFrame::@19 and plexPrepareFrame::@5)
Added new block during phi lifting plexPrepareFrame::@21(between plexPrepareFrame::@12 and plexPrepareFrame::@14)
Added new block during phi lifting plexBucketShow::@7(between plexBucketShow::@4 and plexBucketShow::@1)
Added new block during phi lifting plexBucketShow::@8(between plexBucketShow::@1 and plexBucketShow::@5)
Added new block during phi lifting plexBucketShow::@9(between plexBucketShow::@4 and plexBucketShow::@5)
Added new block during phi lifting plex_scroller_move::@11(between plex_scroller_move::@5 and plex_scroller_move::@6)
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 irq_swing_plex::@16
Adding NOP phi() at start of irq_swing_plex::@10
Adding NOP phi() at start of irq_swing_plex::@20
Adding NOP phi() at start of irq_swing_vsp
Adding NOP phi() at start of irq_swing_top
Adding NOP phi() at start of irq_flipper_bottom::toD0181
Adding NOP phi() at start of irq_flipper_bottom::toD0181_@return
Adding NOP phi() at start of irq_part1_top::toDd001
Adding NOP phi() at start of irq_part1_top::toDd001_@return
Adding NOP phi() at start of irq_part1_top::toD0181
Adding NOP phi() at start of irq_part1_top::toD0181_@return
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@1
Adding NOP phi() at start of main::@9
Adding NOP phi() at start of main::@10
Adding NOP phi() at start of main::@3
Adding NOP phi() at start of main::@11
Adding NOP phi() at start of main::@12
Adding NOP phi() at start of main::@13
Adding NOP phi() at start of main::@6
Adding NOP phi() at start of demo_work::@2
Adding NOP phi() at start of demo_work::@3
Adding NOP phi() at start of plex_scroller_move::@7
Adding NOP phi() at start of plex_scroller_move::toSpritePtr1
Adding NOP phi() at start of plex_scroller_move::toSpritePtr1_@return
Adding NOP phi() at start of demo_init
Adding NOP phi() at start of demo_start
Adding NOP phi() at start of part1_init::@5
Adding NOP phi() at start of part1_init::@6
Adding NOP phi() at start of part1_init::@9
Adding NOP phi() at start of part1_init::@10
Adding NOP phi() at start of part1_run
Adding NOP phi() at start of part1_run::toSpritePtr1
Adding NOP phi() at start of part1_run::toSpritePtr1_@return
Adding NOP phi() at start of part1_run::@3
Adding NOP phi() at start of part1_run::@4
Adding NOP phi() at start of part2_init::@14
Adding NOP phi() at start of part2_init::@15
Adding NOP phi() at start of part2_init::@20
Adding NOP phi() at start of part2_init::@22
Adding NOP phi() at start of part2_init::@3
Adding NOP phi() at start of part2_init::@23
Adding NOP phi() at start of part2_init::@12
Adding NOP phi() at start of part2_init::@25
Adding NOP phi() at start of part2_init::@8
Adding NOP phi() at start of part2_init::toSpritePtr1
Adding NOP phi() at start of part2_init::toSpritePtr1_@return
Adding NOP phi() at start of part2_run
Adding NOP phi() at start of part2_run::toDd001
Adding NOP phi() at start of part2_run::toDd001_@return
Adding NOP phi() at start of part2_run::toD0181
Adding NOP phi() at start of part2_run::toD0181_@return
Adding NOP phi() at start of part2_run::@5
Adding NOP phi() at start of sparkler_anim::@1
Adding NOP phi() at start of sparkler_anim::toSpritePtr1
Adding NOP phi() at start of sparkler_anim::toSpritePtr1_@return
Adding NOP phi() at start of init_rasters
Adding NOP phi() at start of init_rasters::@3
Adding NOP phi() at start of memset::@1
Adding NOP phi() at start of memcpy::@3
Adding NOP phi() at start of part1_loop::@2
Adding NOP phi() at start of part1_loop::@4
Adding NOP phi() at start of part1_loop::@6
Adding NOP phi() at start of part1_loop::@9
Adding NOP phi() at start of plexPrepareInit
Adding NOP phi() at start of plexPrepareFrame
Adding NOP phi() at start of plexPrepareFrame::@3
Adding NOP phi() at start of part2_loop::@2
Adding NOP phi() at start of part2_loop::@3
Adding NOP phi() at start of part2_loop::@12
CALL GRAPH
Calls in [__start] to main:30 
Calls in [irq_demo] to demo_work:37 
Calls in [irq_swing_plex] to plexBucketShow:44 update_frame_plex_id_offset:57 vsp_update_screen:74 plex_scroller_move:82 vsp_update_screen:97 
Calls in [irq_swing_top] to plexFrameStart:111 plexBucketShow:116 
Calls in [irq_flipper_bottom] to raster_fine:127 
Calls in [irq_flipper_top] to raster_fine:158 
Calls in [main] to demo_init:192 byteboozer_decrunch:194 null:196 demo_start:198 part1_init:200 part1_run:204 part2_init:206 part2_run:210 
Calls in [demo_work] to null:214 sparkler_anim:217 
Calls in [demo_start] to demo_init:306 
Calls in [part1_init] to byteboozer_decrunch:316 byteboozer_decrunch:320 byteboozer_decrunch:322 byteboozer_decrunch:324 byteboozer_decrunch:326 init_rasters:328 memset:330 memcpy:333 memcpy:336 memcpy:338 
Calls in [part1_run] to part1_loop:364 
Calls in [part2_init] to byteboozer_decrunch:368 memcpy:370 memcpy:372 byteboozer_decrunch:374 byteboozer_decrunch:376 memset:379 memset:382 memset:384 plexPrepareInit:388 memcpy:393 memset:404 plexPrepareFrame:420 
Calls in [part2_run] to part2_loop:453 
Calls in [part1_loop] to flipper_fix_colors:507 demo_work:514 demo_start:517 
Calls in [part2_loop] to demo_work:596 p2_logo_reveal:612 
Calls in [p2_logo_reveal] to vsp_update_screen:635 

Created 40 initial phi equivalence classes
Coalesced [43] plexBucketShow::bucket#3 = plexBucketShow::bucket#1
Coalesced [94] irq_swing_plex::s#4 = irq_swing_plex::s#1
Coalesced [115] plexBucketShow::bucket#4 = plexBucketShow::bucket#0
Coalesced [222] plexBucketShow::real_idx#10 = plexBucketShow::real_idx#0
Coalesced [225] plexBucketShow::real_idx#12 = plexBucketShow::real_idx#4
Coalesced [243] plexBucketShow::i#8 = plexBucketShow::i#2
Coalesced [244] plexBucketShow::real_idx#11 = plexBucketShow::real_idx#3
Coalesced (already) [245] plexBucketShow::real_idx#13 = plexBucketShow::real_idx#3
Coalesced [267] plex_scroller_move::x_idx#13 = plex_scroller_move::x_idx#0
Coalesced [288] plex_scroller_move::s#13 = plex_scroller_move::s#1
Coalesced [289] plex_scroller_move::x_idx#14 = plex_scroller_move::x_idx#1
Coalesced [290] plex_scroller_move::letter#6 = plex_scroller_move::letter#0
Coalesced [409] part2_init::s2#4 = part2_init::s2#1
Coalesced [415] part2_init::s1#7 = part2_init::s1#1
Not coalescing [416] part2_init::sin_idx#4 = part2_init::frame_idx#2
Coalesced [423] part2_init::frame_idx#8 = part2_init::frame_idx#1
Coalesced [424] part2_init::frame#8 = part2_init::frame#1
Coalesced [428] part2_init::s#4 = part2_init::s#1
Coalesced [429] part2_init::sin_idx#5 = part2_init::sin_idx#1
Coalesced [475] init_rasters::b#4 = init_rasters::b#1
Coalesced [479] init_rasters::i#4 = init_rasters::i#1
Coalesced [490] memset::dst#5 = memset::dst#1
Coalesced [502] memcpy::src#5 = memcpy::src#1
Coalesced [503] memcpy::dst#5 = memcpy::dst#1
Coalesced [527] plexPrepareInit::i#4 = plexPrepareInit::i#1
Coalesced [535] plexPrepareFrame::bucket_ypos#8 = plexPrepareFrame::bucket_ypos#0
Not coalescing [536] plexPrepareFrame::bucket#10 = plexPrepareFrame::frame#0
Coalesced [537] plexPrepareFrame::sprite#10 = plexPrepareFrame::frame#0
Not coalescing [552] plexPrepareFrame::sprite#13 = plexPrepareFrame::sprite#2
Coalesced [553] plexPrepareFrame::bucket_ypos#11 = plexPrepareFrame::bucket_ypos#2
Coalesced [554] plexPrepareFrame::bucket#13 = plexPrepareFrame::sprite#2
Coalesced [555] plexPrepareFrame::bucket_id#10 = plexPrepareFrame::bucket_id#1
Coalesced [566] plexPrepareFrame::i1#8 = plexPrepareFrame::i1#1
Coalesced [567] plexPrepareFrame::real_sprite_id#8 = plexPrepareFrame::real_sprite_id#1
Coalesced [568] plexPrepareFrame::bucket_ypos#9 = plexPrepareFrame::bucket_ypos#1
Coalesced [569] plexPrepareFrame::bucket#11 = plexPrepareFrame::bucket#9
Coalesced [570] plexPrepareFrame::sprite#11 = plexPrepareFrame::sprite#1
Coalesced [571] plexPrepareFrame::bucket_id#8 = plexPrepareFrame::bucket_id#5
Coalesced [572] plexPrepareFrame::sprite#12 = plexPrepareFrame::sprite#3
Coalesced [573] plexPrepareFrame::bucket_ypos#10 = plexPrepareFrame::bucket_ypos#3
Coalesced (already) [574] plexPrepareFrame::bucket#12 = plexPrepareFrame::bucket#3
Coalesced (already) [575] plexPrepareFrame::bucket_id#9 = plexPrepareFrame::bucket_id#2
Coalesced [578] plexPrepareFrame::i#4 = plexPrepareFrame::i#1
Not coalescing [582] plexPrepareFrame::s#6 = plexPrepareFrame::m#2
Coalesced [591] plexPrepareFrame::m#8 = plexPrepareFrame::m#1
Coalesced [592] plexPrepareFrame::s#5 = plexPrepareFrame::s#1
Coalesced [632] flipper_fix_colors::i#4 = flipper_fix_colors::i#1
Coalesced down to 35 phi equivalence classes
Culled Empty Block label __start::@2
Culled Empty Block label irq_swing_plex::@10
Culled Empty Block label irq_swing_plex::@20
Culled Empty Block label irq_flipper_bottom::toD0181_@return
Culled Empty Block label irq_part1_top::toDd001_@return
Culled Empty Block label irq_part1_top::toD0181_@return
Culled Empty Block label main::@10
Culled Empty Block label main::@12
Culled Empty Block label main::@13
Culled Empty Block label demo_work::@3
Culled Empty Block label plexBucketShow::@8
Culled Empty Block label plexBucketShow::@7
Culled Empty Block label plexBucketShow::@9
Culled Empty Block label plex_scroller_move::@7
Culled Empty Block label plex_scroller_move::toSpritePtr1_@return
Culled Empty Block label part1_init::@10
Culled Empty Block label part1_run::toSpritePtr1_@return
Culled Empty Block label part1_run::@4
Culled Empty Block label part2_init::@22
Culled Empty Block label part2_init::@23
Culled Empty Block label part2_init::@25
Culled Empty Block label part2_init::@8
Culled Empty Block label part2_init::toSpritePtr1_@return
Culled Empty Block label part2_run::toDd001_@return
Culled Empty Block label part2_run::toD0181_@return
Culled Empty Block label part2_run::@5
Culled Empty Block label sparkler_anim::@1
Culled Empty Block label sparkler_anim::toSpritePtr1_@return
Culled Empty Block label init_rasters::@3
Culled Empty Block label memset::@1
Culled Empty Block label memcpy::@3
Culled Empty Block label part1_loop::@9
Culled Empty Block label plexPrepareFrame::@3
Culled Empty Block label plexPrepareFrame::@21
Culled Empty Block label plexPrepareFrame::@20
Culled Empty Block label part2_loop::@12
Renumbering block memset::@2 to memset::@1
Renumbering block memset::@3 to memset::@2
Renumbering block memset::@4 to memset::@3
Renumbering block part1_loop::@10 to part1_loop::@9
Renumbering block init_rasters::@4 to init_rasters::@3
Renumbering block init_rasters::@5 to init_rasters::@4
Renumbering block plexPrepareFrame::@4 to plexPrepareFrame::@3
Renumbering block plexPrepareFrame::@5 to plexPrepareFrame::@4
Renumbering block plexPrepareFrame::@6 to plexPrepareFrame::@5
Renumbering block plexPrepareFrame::@7 to plexPrepareFrame::@6
Renumbering block plexPrepareFrame::@8 to plexPrepareFrame::@7
Renumbering block plexPrepareFrame::@9 to plexPrepareFrame::@8
Renumbering block plexPrepareFrame::@10 to plexPrepareFrame::@9
Renumbering block plexPrepareFrame::@11 to plexPrepareFrame::@10
Renumbering block plexPrepareFrame::@12 to plexPrepareFrame::@11
Renumbering block plexPrepareFrame::@13 to plexPrepareFrame::@12
Renumbering block plexPrepareFrame::@14 to plexPrepareFrame::@13
Renumbering block plexPrepareFrame::@15 to plexPrepareFrame::@14
Renumbering block plexPrepareFrame::@16 to plexPrepareFrame::@15
Renumbering block plexPrepareFrame::@17 to plexPrepareFrame::@16
Renumbering block plexPrepareFrame::@18 to plexPrepareFrame::@17
Renumbering block plexPrepareFrame::@19 to plexPrepareFrame::@18
Renumbering block part2_init::@9 to part2_init::@8
Renumbering block part2_init::@10 to part2_init::@9
Renumbering block part2_init::@11 to part2_init::@10
Renumbering block part2_init::@12 to part2_init::@11
Renumbering block part2_init::@13 to part2_init::@12
Renumbering block part2_init::@14 to part2_init::@13
Renumbering block part2_init::@15 to part2_init::@14
Renumbering block part2_init::@16 to part2_init::@15
Renumbering block part2_init::@17 to part2_init::@16
Renumbering block part2_init::@18 to part2_init::@17
Renumbering block part2_init::@19 to part2_init::@18
Renumbering block part2_init::@20 to part2_init::@19
Renumbering block part2_init::@21 to part2_init::@20
Renumbering block part2_init::@24 to part2_init::@21
Renumbering block part2_loop::@13 to part2_loop::@12
Renumbering block part2_loop::@14 to part2_loop::@13
Renumbering block part2_loop::@15 to part2_loop::@14
Renumbering block part2_loop::@16 to part2_loop::@15
Renumbering block plex_scroller_move::@8 to plex_scroller_move::@7
Renumbering block plex_scroller_move::@9 to plex_scroller_move::@8
Renumbering block plex_scroller_move::@10 to plex_scroller_move::@9
Renumbering block plex_scroller_move::@11 to plex_scroller_move::@10
Renumbering block irq_swing_plex::@11 to irq_swing_plex::@10
Renumbering block irq_swing_plex::@12 to irq_swing_plex::@11
Renumbering block irq_swing_plex::@13 to irq_swing_plex::@12
Renumbering block irq_swing_plex::@14 to irq_swing_plex::@13
Renumbering block irq_swing_plex::@15 to irq_swing_plex::@14
Renumbering block irq_swing_plex::@16 to irq_swing_plex::@15
Renumbering block irq_swing_plex::@17 to irq_swing_plex::@16
Renumbering block irq_swing_plex::@18 to irq_swing_plex::@17
Renumbering block irq_swing_plex::@19 to irq_swing_plex::@18
Renumbering block irq_swing_plex::@21 to irq_swing_plex::@19
Renumbering block irq_swing_plex::@22 to irq_swing_plex::@20
Renumbering block main::@11 to main::@10
Renumbering block sparkler_anim::@2 to sparkler_anim::@1
Renumbering block sparkler_anim::@3 to sparkler_anim::@2
Adding NOP phi() at start of __start
Adding NOP phi() at start of __start::@1
Adding NOP phi() at start of irq_swing_plex::@15
Adding NOP phi() at start of irq_swing_vsp
Adding NOP phi() at start of irq_swing_top
Adding NOP phi() at start of irq_flipper_bottom::toD0181
Adding NOP phi() at start of irq_part1_top::toDd001
Adding NOP phi() at start of irq_part1_top::toD0181
Adding NOP phi() at start of main
Adding NOP phi() at start of main::@1
Adding NOP phi() at start of main::@9
Adding NOP phi() at start of main::@3
Adding NOP phi() at start of main::@10
Adding NOP phi() at start of main::@6
Adding NOP phi() at start of demo_work::@2
Adding NOP phi() at start of plex_scroller_move::@10
Adding NOP phi() at start of plex_scroller_move::toSpritePtr1
Adding NOP phi() at start of demo_init
Adding NOP phi() at start of demo_start
Adding NOP phi() at start of part1_init::@5
Adding NOP phi() at start of part1_init::@6
Adding NOP phi() at start of part1_init::@9
Adding NOP phi() at start of part1_run
Adding NOP phi() at start of part1_run::toSpritePtr1
Adding NOP phi() at start of part1_run::@3
Adding NOP phi() at start of part2_init::@13
Adding NOP phi() at start of part2_init::@14
Adding NOP phi() at start of part2_init::@19
Adding NOP phi() at start of part2_init::@3
Adding NOP phi() at start of part2_init::@11
Adding NOP phi() at start of part2_init::toSpritePtr1
Adding NOP phi() at start of part2_run
Adding NOP phi() at start of part2_run::toDd001
Adding NOP phi() at start of part2_run::toD0181
Adding NOP phi() at start of sparkler_anim::toSpritePtr1
Adding NOP phi() at start of init_rasters
Adding NOP phi() at start of part1_loop::@2
Adding NOP phi() at start of part1_loop::@4
Adding NOP phi() at start of part1_loop::@6
Adding NOP phi() at start of plexPrepareInit
Adding NOP phi() at start of plexPrepareFrame
Adding NOP phi() at start of part2_loop::@2
Adding NOP phi() at start of part2_loop::@3

FINAL CONTROL FLOW GRAPH

void __start()
__start: scope:[__start]  from
  [0] phi()
  to:__start::__init1
__start::__init1: scope:[__start]  from __start
  [1] p1_work_ready = 0
  [2] irq_flipper_top_line = 0
  [3] irq_flipper_bottom_line = 8
  [4] flipper_done = 0
  [5] irq_flipper_idx = 0
  [6] flipper_charline = 0
  [7] vsp_scroll = 0
  [8] plex_real_sprite_idx = 0
  [9] p2_work_ready = 0
  [10] p2_logo_revealing = 0
  [11] p2_logo_reveal_done = 0
  [12] p2_logo_swinging = 0
  [13] p2_plex_scroller_moving = 0
  [14] p2_logo_reveal_idx = 0
  [15] x_movement_idx = 0
  [16] scroll_text_next = SCROLL_TEXT
  [17] plex_frame_id = 0
  [18] plex_frame = BUCKET_SPRITES
  [19] plex_id_offset = 0
  [20] plex_bucket = BUCKET_SPRITES
  [21] plex_bucket_id = 0
  [22] vsp_fine_scroll = 0
  [23] vsp_coarse_scroll = 0
  [24] vsp_sin_idx = $40
  [25] sprite_color_idx = 0
  [26] demo_frame_count = 0
  [27] sparkler_active = 0
  [28] sparkler_idx = 0
  to:__start::@1
__start::@1: scope:[__start]  from __start::__init1
  [29] phi()
  [30] call main
  to:__start::@return
__start::@return: scope:[__start]  from __start::@1
  [31] return 
  to:@return

__interrupt(hardware_clobber) void irq_demo()
irq_demo: scope:[irq_demo]  from
  [32] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  [33] irq_demo::port_value#0 = *PROCPORT
  [34] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  [35] *PROCPORT = PROCPORT_RAM_IO
  [36] call demo_work
  to:irq_demo::@1
irq_demo::@1: scope:[irq_demo]  from irq_demo
  [37] *IRQ_STATUS = IRQ_RASTER
  [38] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  [39] *PROCPORT = irq_demo::port_value#0
  to:irq_demo::@return
irq_demo::@return: scope:[irq_demo]  from irq_demo::@1
  [40] return 
  to:@return

__interrupt(hardware_clobber) void irq_swing_plex()
irq_swing_plex: scope:[irq_swing_plex]  from
  [41] plexBucketShow::bucket#1 = plex_bucket
  [42] call plexBucketShow
  to:irq_swing_plex::@17
irq_swing_plex::@17: scope:[irq_swing_plex]  from irq_swing_plex
  [43] plex_bucket = plex_bucket + 8*SIZEOF_STRUCT_BUCKETSPRITE
  [44] plex_bucket_id = ++ plex_bucket_id
  [45] if(plex_bucket_id<9) goto irq_swing_plex::@1
  to:irq_swing_plex::@3
irq_swing_plex::@3: scope:[irq_swing_plex]  from irq_swing_plex::@17
  [46] *HARDWARE_IRQ = &irq_swing_top
  [47] *RASTER = *BUCKET_YPOS
  [48] plex_frame_id = plex_frame_id + irq_swing_plex::YMOVE
  [49] plex_frame = plex_frame + (unsigned int)irq_swing_plex::YMOVE*9*8*SIZEOF_STRUCT_BUCKETSPRITE
  [50] if(plex_frame_id<8) goto irq_swing_plex::@5
  to:irq_swing_plex::@4
irq_swing_plex::@4: scope:[irq_swing_plex]  from irq_swing_plex::@3
  [51] plex_frame = plex_frame - (unsigned int)9*8*8*SIZEOF_STRUCT_BUCKETSPRITE
  [52] plex_frame_id = plex_frame_id - 8
  [53] plex_id_offset = -- plex_id_offset
  to:irq_swing_plex::@5
irq_swing_plex::@5: scope:[irq_swing_plex]  from irq_swing_plex::@3 irq_swing_plex::@4
  [54] update_frame_plex_id_offset::plex_frame_id#0 = plex_frame_id
  [55] call update_frame_plex_id_offset
  to:irq_swing_plex::@18
irq_swing_plex::@18: scope:[irq_swing_plex]  from irq_swing_plex::@5
  [56] if(0==p2_logo_swinging) goto irq_swing_plex::@6
  to:irq_swing_plex::@12
irq_swing_plex::@12: scope:[irq_swing_plex]  from irq_swing_plex::@18
  [57] irq_swing_plex::$27 = (unsigned int)vsp_sin_idx
  [58] irq_swing_plex::$26 = irq_swing_plex::$27 << 1
  [59] irq_swing_plex::$31 = VSP_SINTABLE + irq_swing_plex::$26
  [60] irq_swing_plex::scroll#0 = *irq_swing_plex::$31
  [61] vsp_sin_idx = ++ vsp_sin_idx
  [62] irq_swing_plex::$28 = (char)irq_swing_plex::scroll#0
  [63] irq_swing_plex::$6 = irq_swing_plex::$28 & 7
  [64] vsp_fine_scroll = irq_swing_plex::$6
  [65] irq_swing_plex::$7 = irq_swing_plex::scroll#0 >> 3
  [66] irq_swing_plex::new_coarse_scroll#0 = (char)irq_swing_plex::$7
  [67] irq_swing_plex::coarse_scroll_diff#0 = vsp_coarse_scroll - irq_swing_plex::new_coarse_scroll#0
  [68] if(irq_swing_plex::coarse_scroll_diff#0==1) goto irq_swing_plex::@7
  to:irq_swing_plex::@13
irq_swing_plex::@13: scope:[irq_swing_plex]  from irq_swing_plex::@12
  [69] if(irq_swing_plex::coarse_scroll_diff#0!=$ff) goto irq_swing_plex::@8
  to:irq_swing_plex::@14
irq_swing_plex::@14: scope:[irq_swing_plex]  from irq_swing_plex::@13
  [70] irq_swing_plex::x_offset#0 = $27 - vsp_coarse_scroll
  [71] vsp_update_screen::x_offset = irq_swing_plex::x_offset#0
  [72] call vsp_update_screen
  to:irq_swing_plex::@19
irq_swing_plex::@19: scope:[irq_swing_plex]  from irq_swing_plex::@14
  [73] (PART2_SCREEN+(unsigned int)$18*$28)[irq_swing_plex::x_offset#0] = 0
  [74] (COLS+(unsigned int)$18*$28)[irq_swing_plex::x_offset#0] = 0
  to:irq_swing_plex::@8
irq_swing_plex::@8: scope:[irq_swing_plex]  from irq_swing_plex::@13 irq_swing_plex::@19 irq_swing_plex::@7
  [75] vsp_coarse_scroll = irq_swing_plex::new_coarse_scroll#0
  [76] irq_swing_plex::$16 = $28 - vsp_coarse_scroll
  [77] vsp_scroll = irq_swing_plex::$16
  to:irq_swing_plex::@6
irq_swing_plex::@6: scope:[irq_swing_plex]  from irq_swing_plex::@18 irq_swing_plex::@8
  [78] if(0==p2_plex_scroller_moving) goto irq_swing_plex::@9
  to:irq_swing_plex::@15
irq_swing_plex::@15: scope:[irq_swing_plex]  from irq_swing_plex::@6
  [79] phi()
  [80] call plex_scroller_move
  to:irq_swing_plex::@20
irq_swing_plex::@20: scope:[irq_swing_plex]  from irq_swing_plex::@15
  [81] sprite_color_idx = ++ sprite_color_idx
  [82] if(sprite_color_idx!=$30*SIZEOF_CHAR) goto irq_swing_plex::@10
  to:irq_swing_plex::@16
irq_swing_plex::@16: scope:[irq_swing_plex]  from irq_swing_plex::@20
  [83] sprite_color_idx = 0
  to:irq_swing_plex::@10
irq_swing_plex::@10: scope:[irq_swing_plex]  from irq_swing_plex::@11 irq_swing_plex::@16 irq_swing_plex::@20
  [84] irq_swing_plex::s#2 = phi( irq_swing_plex::@16/0, irq_swing_plex::@11/irq_swing_plex::s#1, irq_swing_plex::@20/0 )
  [85] if(irq_swing_plex::s#2<8) goto irq_swing_plex::@11
  to:irq_swing_plex::@9
irq_swing_plex::@9: scope:[irq_swing_plex]  from irq_swing_plex::@10 irq_swing_plex::@6
  [86] p2_work_ready = 1
  to:irq_swing_plex::@2
irq_swing_plex::@2: scope:[irq_swing_plex]  from irq_swing_plex::@1 irq_swing_plex::@9
  [87] *IRQ_STATUS = IRQ_RASTER
  to:irq_swing_plex::@return
irq_swing_plex::@return: scope:[irq_swing_plex]  from irq_swing_plex::@2
  [88] return 
  to:@return
irq_swing_plex::@11: scope:[irq_swing_plex]  from irq_swing_plex::@10
  [89] SPRITES_COLOR[irq_swing_plex::s#2] = SPRITE_COLOR_SEQUENCE[sprite_color_idx]
  [90] irq_swing_plex::s#1 = ++ irq_swing_plex::s#2
  to:irq_swing_plex::@10
irq_swing_plex::@7: scope:[irq_swing_plex]  from irq_swing_plex::@12
  [91] irq_swing_plex::x_offset1#0 = $50 - vsp_coarse_scroll
  [92] vsp_update_screen::x_offset = irq_swing_plex::x_offset1#0
  [93] call vsp_update_screen
  to:irq_swing_plex::@8
irq_swing_plex::@1: scope:[irq_swing_plex]  from irq_swing_plex::@17
  [94] *HARDWARE_IRQ = &irq_swing_plex
  [95] *RASTER = BUCKET_YPOS[plex_bucket_id]
  to:irq_swing_plex::@2

__interrupt(hardware_clobber) void irq_swing_vsp()
irq_swing_vsp: scope:[irq_swing_vsp]  from
  [96] phi()
  to:irq_swing_vsp::vsp_perform1
irq_swing_vsp::vsp_perform1: scope:[irq_swing_vsp]  from irq_swing_vsp
  kickasm( uses vsp_scroll uses HARDWARE_IRQ uses RASTER uses IRQ_STATUS uses IRQ_RASTER uses VICII_CONTROL1) {{ // Stabilize the raster by using the double IRQ method
        // Acknowledge the IRQ
        lda #IRQ_RASTER
        sta IRQ_STATUS
        // Set-up IRQ for the next line
        inc RASTER
        // Point IRQ to almost stable code
        lda #<stable
        sta HARDWARE_IRQ
        lda #>stable
        sta HARDWARE_IRQ+1
        tsx       // Save stack pointer
        cli       // Reenable interrupts
        // Wait for new IRQ using NOP's to ensure minimal jitter when it hits
        .fill 15, NOP
        .align $100
    stable:
        txs             // Restore stack pointer
        ldx #9          // Wait till the raster has almost crossed to the next line (48 cycles)
        !: dex
        bne !-
        nop
        lda RASTER
        cmp RASTER
        bne !+          // And correct the last cycle of potential jitter
        !:
        // Raster is now completely stable! (Line $2f cycle 7)
        // Perform VSP by waiting an exact number of cycles and then enabling the display
        // See http://www.zimmers.net/cbmpics/cbm/c64/vic-ii.txt (Section 3.14.6. DMA delay)
        ldx #8          // Wait 45 cycles to get the VSP timing right
        !: dex
        bne !-
        nop
        nop
        lda vsp_scroll
        lsr         //  Put bit 0 into carry 
        bcc dma1    // Spend 2 or 3 cycles depending on the carry (bit 0)
    dma1:
        sta dma2+1  // Update the branch
        clv
    dma2:
        bvc dma2    // This branch is updated with vsp_scroll/2 - changing the number of NOP's executed
        // 20 NOP's - enabling vsp scroll from 0-40
        .fill 20, NOP
        ldx #$18
        lda #$1b  // TODO: To control Y-scrolling this must be flexible!
        // The STX $d011 must be line $30 cycle $10 for vsp_scroll==0
        stx VICII_CONTROL1 // Enable the display - starts DMA
        sta VICII_CONTROL1
     }}
  to:irq_swing_vsp::@1
irq_swing_vsp::@1: scope:[irq_swing_vsp]  from irq_swing_vsp::vsp_perform1
  [98] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM
  [99] irq_swing_vsp::$1 = vsp_fine_scroll | VICII_MCM
  [100] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) = irq_swing_vsp::$1
  [101] *IRQ_STATUS = IRQ_RASTER
  [102] *HARDWARE_IRQ = &irq_swing_plex
  [103] *RASTER = *(BUCKET_YPOS+1)
  to:irq_swing_vsp::@return
irq_swing_vsp::@return: scope:[irq_swing_vsp]  from irq_swing_vsp::@1
  [104] return 
  to:@return

__interrupt(hardware_clobber) void irq_swing_top()
irq_swing_top: scope:[irq_swing_top]  from
  [105] phi()
  [106] call plexFrameStart
  to:irq_swing_top::@1
irq_swing_top::@1: scope:[irq_swing_top]  from irq_swing_top
  [107] plex_bucket = plex_frame
  [108] plex_bucket_id = 0
  [109] plexBucketShow::bucket#0 = plex_bucket
  [110] call plexBucketShow
  to:irq_swing_top::@2
irq_swing_top::@2: scope:[irq_swing_top]  from irq_swing_top::@1
  [111] plex_bucket = plex_bucket + 8*SIZEOF_STRUCT_BUCKETSPRITE
  [112] plex_bucket_id = ++ plex_bucket_id
  [113] *IRQ_STATUS = IRQ_RASTER
  [114] *HARDWARE_IRQ = &irq_swing_vsp
  [115] *RASTER = IRQ_SWING_VSP_LINE
  to:irq_swing_top::@return
irq_swing_top::@return: scope:[irq_swing_top]  from irq_swing_top::@2
  [116] return 
  to:@return

__interrupt(hardware_clobber) void irq_flipper_bottom()
irq_flipper_bottom: scope:[irq_flipper_bottom]  from
  asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop  }
  [118] irq_flipper_bottom::$0 = byte0  irq_flipper_bottom_line
  [119] irq_flipper_bottom::$1 = irq_flipper_bottom::$0 & 7
  [120] raster_fine::line_offset = irq_flipper_bottom::$1
  [121] call raster_fine
  to:irq_flipper_bottom::@11
irq_flipper_bottom::@11: scope:[irq_flipper_bottom]  from irq_flipper_bottom
  asm { nop nop nop nop  }
  [123] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = LIGHT_BLUE
  [124] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLUE
  to:irq_flipper_bottom::toD0181
irq_flipper_bottom::toD0181: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@11
  [125] phi()
  to:irq_flipper_bottom::@10
irq_flipper_bottom::@10: scope:[irq_flipper_bottom]  from irq_flipper_bottom::toD0181
  [126] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = irq_flipper_bottom::toD0181_return#0
  [127] if(0!=flipper_done) goto irq_flipper_bottom::@1
  to:irq_flipper_bottom::@2
irq_flipper_bottom::@2: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@10
  [128] irq_flipper_bottom::$12 = irq_flipper_idx << 1
  [129] irq_flipper_bottom::$14 = FLIPPER_EASING + irq_flipper_bottom::$12
  [130] irq_flipper_bottom::irq_flipper_line#0 = *irq_flipper_bottom::$14
  [131] irq_flipper_idx = ++ irq_flipper_idx
  [132] if(irq_flipper_bottom::irq_flipper_line#0<8) goto irq_flipper_bottom::@4
  to:irq_flipper_bottom::@3
irq_flipper_bottom::@3: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@2
  [133] irq_flipper_bottom::$7 = irq_flipper_bottom::irq_flipper_line#0 - 8
  [134] irq_flipper_top_line = irq_flipper_bottom::$7
  to:irq_flipper_bottom::@5
irq_flipper_bottom::@5: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@3 irq_flipper_bottom::@4
  [135] if(irq_flipper_bottom::irq_flipper_line#0>$128) goto irq_flipper_bottom::@6
  to:irq_flipper_bottom::@8
irq_flipper_bottom::@8: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@5
  [136] irq_flipper_bottom::$9 = irq_flipper_bottom::irq_flipper_line#0 + 8
  [137] irq_flipper_bottom_line = irq_flipper_bottom::$9
  to:irq_flipper_bottom::@7
irq_flipper_bottom::@7: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@6 irq_flipper_bottom::@8
  [138] if(irq_flipper_bottom::irq_flipper_line#0!=$130) goto irq_flipper_bottom::@1
  to:irq_flipper_bottom::@9
irq_flipper_bottom::@9: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@7
  [139] flipper_done = 1
  to:irq_flipper_bottom::@1
irq_flipper_bottom::@1: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@10 irq_flipper_bottom::@7 irq_flipper_bottom::@9
  [140] *VICII_CONTROL1 = *VICII_CONTROL1 | $80
  [141] *RASTER = IRQ_PART1_TOP_LINE
  [142] *HARDWARE_IRQ = &irq_part1_top
  [143] *IRQ_STATUS = IRQ_RASTER
  to:irq_flipper_bottom::@return
irq_flipper_bottom::@return: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@1
  [144] return 
  to:@return
irq_flipper_bottom::@6: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@5
  [145] irq_flipper_bottom_line = $130
  to:irq_flipper_bottom::@7
irq_flipper_bottom::@4: scope:[irq_flipper_bottom]  from irq_flipper_bottom::@2
  [146] irq_flipper_top_line = 0
  to:irq_flipper_bottom::@5

__interrupt(hardware_clobber) void irq_flipper_top()
irq_flipper_top: scope:[irq_flipper_top]  from
  asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop  }
  [148] irq_flipper_top::$0 = byte0  irq_flipper_top_line
  [149] irq_flipper_top::$1 = irq_flipper_top::$0 & 7
  [150] raster_fine::line_offset = irq_flipper_top::$1
  [151] call raster_fine
  to:irq_flipper_top::@4
irq_flipper_top::@4: scope:[irq_flipper_top]  from irq_flipper_top
  asm { lda#$9a ldx#LIGHT_GREEN ldy#$1b staVICII_MEMORY stxBORDER_COLOR styVICII_CONTROL1 stxBG_COLOR lda#$c8 staVICII_CONTROL2  }
  [153] irq_flipper_top::$3 = byte1  irq_flipper_bottom_line
  [154] if(0!=irq_flipper_top::$3) goto irq_flipper_top::@1
  to:irq_flipper_top::@3
irq_flipper_top::@3: scope:[irq_flipper_top]  from irq_flipper_top::@4
  [155] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f
  to:irq_flipper_top::@2
irq_flipper_top::@2: scope:[irq_flipper_top]  from irq_flipper_top::@1 irq_flipper_top::@3
  [156] irq_flipper_top::$4 = byte0  irq_flipper_bottom_line
  [157] irq_flipper_top::$5 = irq_flipper_top::$4 & $f8
  [158] *RASTER = irq_flipper_top::$5
  [159] *HARDWARE_IRQ = &irq_flipper_bottom
  [160] *IRQ_STATUS = IRQ_RASTER
  to:irq_flipper_top::@return
irq_flipper_top::@return: scope:[irq_flipper_top]  from irq_flipper_top::@2
  [161] return 
  to:@return
irq_flipper_top::@1: scope:[irq_flipper_top]  from irq_flipper_top::@4
  [162] *VICII_CONTROL1 = *VICII_CONTROL1 | $80
  to:irq_flipper_top::@2

__interrupt(hardware_clobber) void irq_part1_top()
irq_part1_top: scope:[irq_part1_top]  from
  [163] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = BLACK
  [164] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLACK
  [165] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM
  [166] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) | VICII_MCM
  to:irq_part1_top::toDd001
irq_part1_top::toDd001: scope:[irq_part1_top]  from irq_part1_top
  [167] phi()
  to:irq_part1_top::@4
irq_part1_top::@4: scope:[irq_part1_top]  from irq_part1_top::toDd001
  [168] *((char *)CIA2) = irq_part1_top::toDd001_return#0
  to:irq_part1_top::toD0181
irq_part1_top::toD0181: scope:[irq_part1_top]  from irq_part1_top::@4
  [169] phi()
  to:irq_part1_top::@5
irq_part1_top::@5: scope:[irq_part1_top]  from irq_part1_top::toD0181
  [170] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = irq_part1_top::toD0181_return#0
  [171] irq_part1_top::$2 = byte1  irq_flipper_top_line
  [172] if(0!=irq_part1_top::$2) goto irq_part1_top::@1
  to:irq_part1_top::@3
irq_part1_top::@3: scope:[irq_part1_top]  from irq_part1_top::@5
  [173] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f
  to:irq_part1_top::@2
irq_part1_top::@2: scope:[irq_part1_top]  from irq_part1_top::@1 irq_part1_top::@3
  [174] irq_part1_top::$3 = byte0  irq_flipper_top_line
  [175] irq_part1_top::$4 = irq_part1_top::$3 & $f8
  [176] *RASTER = irq_part1_top::$4
  [177] *HARDWARE_IRQ = &irq_flipper_top
  [178] p1_work_ready = 1
  [179] *IRQ_STATUS = IRQ_RASTER
  to:irq_part1_top::@return
irq_part1_top::@return: scope:[irq_part1_top]  from irq_part1_top::@2
  [180] return 
  to:@return
irq_part1_top::@1: scope:[irq_part1_top]  from irq_part1_top::@5
  [181] *VICII_CONTROL1 = *VICII_CONTROL1 | $80
  to:irq_part1_top::@2

void main()
main: scope:[main]  from __start::@1
  [182] phi()
  [183] call demo_init
  to:main::@7
main::@7: scope:[main]  from main
  [184] byteboozer_decrunch::crunched = DEMO_MUSIC_CRUNCHED
  [185] call byteboozer_decrunch
  to:main::@8
main::@8: scope:[main]  from main::@7
  asm { lda#0  }
  [187] callexecute *musicInit 
  to:main::@1
main::@1: scope:[main]  from main::@8
  [188] phi()
  [189] call demo_start
  to:main::@9
main::@9: scope:[main]  from main::@1
  [190] phi()
  [191] call part1_init
  to:main::@2
main::@2: scope:[main]  from main::@2 main::@9
  [192] if(demo_frame_count<5*$32) goto main::@2
  to:main::@3
main::@3: scope:[main]  from main::@2
  [193] phi()
  [194] call part1_run
  to:main::@10
main::@10: scope:[main]  from main::@3
  [195] phi()
  [196] call part2_init
  to:main::@4
main::@4: scope:[main]  from main::@10 main::@4
  [197] if(demo_frame_count<(unsigned int)$10*$32) goto main::@4
  to:main::@5
main::@5: scope:[main]  from main::@4
  [198] sparkler_active = 0
  [199] call part2_run
  to:main::@6
main::@6: scope:[main]  from main::@5 main::@6
  [200] phi()
  to:main::@6

void demo_work()
demo_work: scope:[demo_work]  from irq_demo part1_loop::@4 part2_loop::@2
  [201] demo_frame_count = ++ demo_frame_count
  [202] callexecute *musicPlay 
  to:demo_work::@1
demo_work::@1: scope:[demo_work]  from demo_work
  [203] if(0==sparkler_active) goto demo_work::@return
  to:demo_work::@2
demo_work::@2: scope:[demo_work]  from demo_work::@1
  [204] phi()
  [205] call sparkler_anim
  to:demo_work::@return
demo_work::@return: scope:[demo_work]  from demo_work::@1 demo_work::@2
  [206] return 
  to:@return

void plexBucketShow(struct BucketSprite *bucket)
plexBucketShow: scope:[plexBucketShow]  from irq_swing_plex irq_swing_top::@1
  [207] plexBucketShow::bucket#2 = phi( irq_swing_plex/plexBucketShow::bucket#1, irq_swing_top::@1/plexBucketShow::bucket#0 )
  [208] plexBucketShow::real_idx#0 = plex_real_sprite_idx << 1
  to:plexBucketShow::@1
plexBucketShow::@1: scope:[plexBucketShow]  from plexBucketShow plexBucketShow::@4
  [209] plexBucketShow::real_idx#4 = phi( plexBucketShow/plexBucketShow::real_idx#0, plexBucketShow::@4/plexBucketShow::real_idx#3 )
  [209] plexBucketShow::i#3 = phi( plexBucketShow/0, plexBucketShow::@4/plexBucketShow::i#2 )
  [210] if(0!=((char *)plexBucketShow::bucket#2)[plexBucketShow::i#3]) goto plexBucketShow::@2
  to:plexBucketShow::@5
plexBucketShow::@5: scope:[plexBucketShow]  from plexBucketShow::@1 plexBucketShow::@4
  [211] plexBucketShow::real_idx#8 = phi( plexBucketShow::@1/plexBucketShow::real_idx#4, plexBucketShow::@4/plexBucketShow::real_idx#3 )
  [212] plexBucketShow::$1 = plexBucketShow::real_idx#8 >> 1
  [213] plex_real_sprite_idx = plexBucketShow::$1
  to:plexBucketShow::@return
plexBucketShow::@return: scope:[plexBucketShow]  from plexBucketShow::@5
  [214] return 
  to:@return
plexBucketShow::@2: scope:[plexBucketShow]  from plexBucketShow::@1
  [215] SPRITES_YPOS[plexBucketShow::real_idx#4] = ((char *)plexBucketShow::bucket#2)[plexBucketShow::i#3]
  [216] plexBucketShow::i#1 = ++ plexBucketShow::i#3
  [217] plexBucketShow::plex_id#0 = ((char *)plexBucketShow::bucket#2)[plexBucketShow::i#1]
  [218] SPRITES_XPOS[plexBucketShow::real_idx#4] = PLEX_XPOS[plexBucketShow::plex_id#0]
  [219] plexBucketShow::real_idx#1 = plexBucketShow::real_idx#4 >> 1
  [220] if(0!=PLEX_XPOS_MSB[plexBucketShow::plex_id#0]) goto plexBucketShow::@3
  to:plexBucketShow::@6
plexBucketShow::@6: scope:[plexBucketShow]  from plexBucketShow::@2
  [221] *SPRITES_XMSB = *SPRITES_XMSB & plexBucketShow::MSB_CLEAR_MASK_BY_ID[plexBucketShow::real_idx#1]
  to:plexBucketShow::@4
plexBucketShow::@4: scope:[plexBucketShow]  from plexBucketShow::@3 plexBucketShow::@6
  [222] SCREEN_SPRITE_PTRS[plexBucketShow::real_idx#1] = PLEX_PTR[plexBucketShow::plex_id#0]
  [223] plexBucketShow::$2 = plexBucketShow::real_idx#1 + 1
  [224] plexBucketShow::real_idx#2 = plexBucketShow::$2 & 7
  [225] plexBucketShow::real_idx#3 = plexBucketShow::real_idx#2 << 1
  [226] plexBucketShow::i#2 = ++ plexBucketShow::i#1
  [227] if(plexBucketShow::i#2==8*SIZEOF_STRUCT_BUCKETSPRITE) goto plexBucketShow::@5
  to:plexBucketShow::@1
plexBucketShow::@3: scope:[plexBucketShow]  from plexBucketShow::@2
  [228] *SPRITES_XMSB = *SPRITES_XMSB | plexBucketShow::MSB_SET_MASK_BY_ID[plexBucketShow::real_idx#1]
  to:plexBucketShow::@4

void update_frame_plex_id_offset(char plex_frame_id)
update_frame_plex_id_offset: scope:[update_frame_plex_id_offset]  from irq_swing_plex::@5
  [229] update_frame_plex_id_offset::$0 = update_frame_plex_id_offset::plex_frame_id#0 << 1
  [230] update_frame_plex_id_offset::jmp_address = update_frame_plex_id_offset::jmp_table[update_frame_plex_id_offset::$0]
  kickasm( uses update_frame_plex_id_offset::jmp_address) {{ lda jmp_address
        sta call+1
        lda jmp_address+1
        sta call+2
        call: jsr $0000
     }}
  to:update_frame_plex_id_offset::@return
update_frame_plex_id_offset::@return: scope:[update_frame_plex_id_offset]  from update_frame_plex_id_offset
  [232] return 
  to:@return

void vsp_update_screen(volatile char x_offset)
vsp_update_screen: scope:[vsp_update_screen]  from irq_swing_plex::@14 irq_swing_plex::@7 p2_logo_reveal::@2
  kickasm( uses vsp_update_screen::x_offset uses PART2_SCREEN uses COLS uses LOGO_DATA uses LOGO_DATA_COLORS) {{ ldx x_offset
        .for(var row=0;row<24;row++) {
            lda LOGO_DATA+80*row,x
            sta PART2_SCREEN+40*row,x
            lda LOGO_DATA_COLORS+80*row,x
            sta COLS+40*row,x
        }
     }}
  [234] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  [235] *PROCPORT = PROCPORT_RAM_ALL
  [236] vsp_update_screen::$5 = (unsigned int)vsp_update_screen::x_offset
  [237] vsp_update_screen::x_offset8 = vsp_update_screen::$5 << 3
  [238] vsp_update_screen::$1 = byte1  vsp_update_screen::x_offset8
  [239] if(vsp_update_screen::$1==0) goto vsp_update_screen::@1
  to:vsp_update_screen::@4
vsp_update_screen::@4: scope:[vsp_update_screen]  from vsp_update_screen
  [240] vsp_update_screen::$3 = byte1  vsp_update_screen::x_offset8
  [241] if(vsp_update_screen::$3==1) goto vsp_update_screen::@2
  to:vsp_update_screen::@5
vsp_update_screen::@5: scope:[vsp_update_screen]  from vsp_update_screen::@4
  kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+$200+row*40*8+pix,y
                }
         }}
  to:vsp_update_screen::@3
vsp_update_screen::@3: scope:[vsp_update_screen]  from vsp_update_screen::@1 vsp_update_screen::@2 vsp_update_screen::@5
  [243] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  [244] *PROCPORT = PROCPORT_RAM_IO
  to:vsp_update_screen::@return
vsp_update_screen::@return: scope:[vsp_update_screen]  from vsp_update_screen::@3
  [245] return 
  to:@return
vsp_update_screen::@2: scope:[vsp_update_screen]  from vsp_update_screen::@4
  kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+$100+row*40*8+pix,y
                }
         }}
  to:vsp_update_screen::@3
vsp_update_screen::@1: scope:[vsp_update_screen]  from vsp_update_screen
  kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+row*40*8+pix,y
                }
         }}
  to:vsp_update_screen::@3

void plex_scroller_move()
plex_scroller_move: scope:[plex_scroller_move]  from irq_swing_plex::@15
  [248] plex_scroller_move::x_idx#0 = x_movement_idx
  to:plex_scroller_move::@1
plex_scroller_move::@1: scope:[plex_scroller_move]  from plex_scroller_move plex_scroller_move::@4
  [249] plex_scroller_move::x_idx#10 = phi( plex_scroller_move/plex_scroller_move::x_idx#0, plex_scroller_move::@4/plex_scroller_move::x_idx#1 )
  [249] plex_scroller_move::s#10 = phi( plex_scroller_move/0, plex_scroller_move::@4/plex_scroller_move::s#1 )
  [250] if(plex_scroller_move::s#10<$20) goto plex_scroller_move::@2
  to:plex_scroller_move::@3
plex_scroller_move::@3: scope:[plex_scroller_move]  from plex_scroller_move::@1
  [251] x_movement_idx = ++ x_movement_idx
  to:plex_scroller_move::@return
plex_scroller_move::@return: scope:[plex_scroller_move]  from plex_scroller_move::@3
  [252] return 
  to:@return
plex_scroller_move::@2: scope:[plex_scroller_move]  from plex_scroller_move::@1
  [253] PLEX_XPOS[plex_scroller_move::s#10] = XMOVEMENT[plex_scroller_move::x_idx#10]
  [254] PLEX_XPOS_MSB[plex_scroller_move::s#10] = XMOVEMENT_HI[plex_scroller_move::x_idx#10]
  [255] if(plex_scroller_move::x_idx#10!=0) goto plex_scroller_move::@4
  to:plex_scroller_move::@7
plex_scroller_move::@7: scope:[plex_scroller_move]  from plex_scroller_move::@2
  [256] if(*scroll_text_next!=0) goto plex_scroller_move::@5
  to:plex_scroller_move::@8
plex_scroller_move::@8: scope:[plex_scroller_move]  from plex_scroller_move::@7
  [257] scroll_text_next = SCROLL_TEXT
  to:plex_scroller_move::@5
plex_scroller_move::@5: scope:[plex_scroller_move]  from plex_scroller_move::@7 plex_scroller_move::@8
  [258] plex_scroller_move::letter#0 = *scroll_text_next
  [259] scroll_text_next = ++ scroll_text_next
  [260] if(plex_scroller_move::letter#0!=$ff) goto plex_scroller_move::@10
  to:plex_scroller_move::@6
plex_scroller_move::@10: scope:[plex_scroller_move]  from plex_scroller_move::@5
  [261] phi()
  to:plex_scroller_move::@6
plex_scroller_move::@6: scope:[plex_scroller_move]  from plex_scroller_move::@10 plex_scroller_move::@5
  [262] plex_scroller_move::letter#2 = phi( plex_scroller_move::@10/plex_scroller_move::letter#0, plex_scroller_move::@5/0 )
  to:plex_scroller_move::toSpritePtr1
plex_scroller_move::toSpritePtr1: scope:[plex_scroller_move]  from plex_scroller_move::@6
  [263] phi()
  to:plex_scroller_move::@9
plex_scroller_move::@9: scope:[plex_scroller_move]  from plex_scroller_move::toSpritePtr1
  [264] plex_scroller_move::$8 = plex_scroller_move::toSpritePtr1_return#0 + plex_scroller_move::letter#2
  [265] PLEX_PTR[plex_scroller_move::s#10] = plex_scroller_move::$8
  to:plex_scroller_move::@4
plex_scroller_move::@4: scope:[plex_scroller_move]  from plex_scroller_move::@2 plex_scroller_move::@9
  [266] plex_scroller_move::x_idx#1 = plex_scroller_move::x_idx#10 + 8
  [267] plex_scroller_move::s#1 = ++ plex_scroller_move::s#10
  to:plex_scroller_move::@1

void plexFrameStart()
plexFrameStart: scope:[plexFrameStart]  from irq_swing_top
  [268] plex_real_sprite_idx = 0
  to:plexFrameStart::@return
plexFrameStart::@return: scope:[plexFrameStart]  from plexFrameStart
  [269] return 
  to:@return

void raster_fine(volatile char line_offset)
raster_fine: scope:[raster_fine]  from irq_flipper_bottom irq_flipper_top
  kickasm( uses raster_fine::line_offset uses RASTER_BADLINES) {{ jmp aligned
        .align $100
    aligned:
        ldy RASTER
        ldx line_offset
        inx
    rst:
        nop 
        nop 
        nop 
        nop
        dex                             // 2
        beq done                        // 2
        lda RASTER_BADLINES,y           // 4
        beq notbad                      // 3
    bad:
        nop                             // 2
        nop 
        nop 
        nop 
        nop
        dex                             
        beq done                        
        iny                             
        nop                             
        bit $ea                         
    notbad:
        .fill 18, NOP
        bit $ea
        iny                             
        jmp rst                         
    done:
     }}
  to:raster_fine::@return
raster_fine::@return: scope:[raster_fine]  from raster_fine
  [271] return 
  to:@return

void demo_init()
demo_init: scope:[demo_init]  from demo_start main
  [272] phi()
  to:demo_init::SEI1
demo_init::SEI1: scope:[demo_init]  from demo_init
  asm { sei  }
  to:demo_init::@1
demo_init::@1: scope:[demo_init]  from demo_init::SEI1
  [274] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  [275] *PROCPORT = PROCPORT_RAM_IO
  [276] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR
  asm { ldaCIA1_INTERRUPT  }
  [278] *IRQ_STATUS = $f
  to:demo_init::@return
demo_init::@return: scope:[demo_init]  from demo_init::@1
  [279] return 
  to:@return

void byteboozer_decrunch(char * volatile crunched)
byteboozer_decrunch: scope:[byteboozer_decrunch]  from main::@7 part1_init part1_init::@1 part1_init::@2 part1_init::@3 part1_init::@4 part2_init part2_init::@15 part2_init::@16
  asm { ldycrunched ldxcrunched+1 jsrb2.Decrunch  }
  to:byteboozer_decrunch::@return
byteboozer_decrunch::@return: scope:[byteboozer_decrunch]  from byteboozer_decrunch
  [281] return 
  to:@return

void demo_start()
demo_start: scope:[demo_start]  from main::@1 part1_loop::@6
  [282] phi()
  [283] call demo_init
  to:demo_start::@1
demo_start::@1: scope:[demo_start]  from demo_start
  [284] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f
  [285] *RASTER = 0
  [286] *HARDWARE_IRQ = &irq_demo
  [287] *IRQ_ENABLE = IRQ_RASTER
  to:demo_start::CLI1
demo_start::CLI1: scope:[demo_start]  from demo_start::@1
  asm { cli  }
  to:demo_start::@return
demo_start::@return: scope:[demo_start]  from demo_start::CLI1
  [289] return 
  to:@return

void part1_init()
part1_init: scope:[part1_init]  from main::@9
  [290] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  [291] *PROCPORT = PROCPORT_RAM_ALL
  [292] byteboozer_decrunch::crunched = P1_PIXELS_CRUNCHED
  [293] call byteboozer_decrunch
  to:part1_init::@1
part1_init::@1: scope:[part1_init]  from part1_init
  [294] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  [295] *PROCPORT = PROCPORT_RAM_IO
  [296] byteboozer_decrunch::crunched = P1_SCREEN_CRUNCHED
  [297] call byteboozer_decrunch
  to:part1_init::@2
part1_init::@2: scope:[part1_init]  from part1_init::@1
  [298] byteboozer_decrunch::crunched = P1_COLORS_CRUNCHED
  [299] call byteboozer_decrunch
  to:part1_init::@3
part1_init::@3: scope:[part1_init]  from part1_init::@2
  [300] byteboozer_decrunch::crunched = P1_SPRITES_CRUNCHED
  [301] call byteboozer_decrunch
  to:part1_init::@4
part1_init::@4: scope:[part1_init]  from part1_init::@3
  [302] byteboozer_decrunch::crunched = FLIPPER_EASING_CRUNCHED
  [303] call byteboozer_decrunch
  to:part1_init::@5
part1_init::@5: scope:[part1_init]  from part1_init::@4
  [304] phi()
  [305] call init_rasters
  to:part1_init::@6
part1_init::@6: scope:[part1_init]  from part1_init::@5
  [306] phi()
  [307] call memset
  to:part1_init::@7
part1_init::@7: scope:[part1_init]  from part1_init::@6
  [308] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  [309] *PROCPORT = PROCPORT_RAM_CHARROM
  [310] call memcpy
  to:part1_init::@8
part1_init::@8: scope:[part1_init]  from part1_init::@7
  [311] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  [312] *PROCPORT = PROCPORT_RAM_IO
  [313] call memcpy
  to:part1_init::@9
part1_init::@9: scope:[part1_init]  from part1_init::@8
  [314] phi()
  [315] call memcpy
  to:part1_init::@return
part1_init::@return: scope:[part1_init]  from part1_init::@9
  [316] return 
  to:@return

void part1_run()
part1_run: scope:[part1_run]  from main::@3
  [317] phi()
  to:part1_run::SEI1
part1_run::SEI1: scope:[part1_run]  from part1_run
  asm { sei  }
  to:part1_run::@1
part1_run::@1: scope:[part1_run]  from part1_run::SEI1
  [319] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  [320] *PROCPORT = PROCPORT_RAM_IO
  [321] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR
  asm { ldaCIA1_INTERRUPT  }
  [323] *IRQ_STATUS = $f
  [324] *VICII_CONTROL1 = *VICII_CONTROL1 | $80
  [325] *RASTER = IRQ_PART1_TOP_LINE
  [326] *HARDWARE_IRQ = &irq_part1_top
  [327] *IRQ_ENABLE = IRQ_RASTER
  [328] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = 1
  [329] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR) = PINK
  [330] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1) = YELLOW
  [331] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2) = PURPLE
  [332] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = 1
  [333] *((char *)VICII) = $16
  [334] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_Y) = $be
  to:part1_run::toSpritePtr1
part1_run::toSpritePtr1: scope:[part1_run]  from part1_run::@1
  [335] phi()
  to:part1_run::@2
part1_run::@2: scope:[part1_run]  from part1_run::toSpritePtr1
  [336] *P1_SCREEN_SPRITE_PTRS = part1_run::toSpritePtr1_return#0
  to:part1_run::CLI1
part1_run::CLI1: scope:[part1_run]  from part1_run::@2
  asm { cli  }
  to:part1_run::@3
part1_run::@3: scope:[part1_run]  from part1_run::CLI1
  [338] phi()
  [339] call part1_loop
  to:part1_run::@return
part1_run::@return: scope:[part1_run]  from part1_run::@3
  [340] return 
  to:@return

void part2_init()
part2_init: scope:[part2_init]  from main::@10
  [341] byteboozer_decrunch::crunched = SPRITES_CRUNCHED
  [342] call byteboozer_decrunch
  to:part2_init::@13
part2_init::@13: scope:[part2_init]  from part2_init
  [343] phi()
  [344] call memcpy
  to:part2_init::@14
part2_init::@14: scope:[part2_init]  from part2_init::@13
  [345] phi()
  [346] call memcpy
  to:part2_init::@15
part2_init::@15: scope:[part2_init]  from part2_init::@14
  [347] byteboozer_decrunch::crunched = PLEX_ID_UPDATERS_CRUNCHED2
  [348] call byteboozer_decrunch
  to:part2_init::@16
part2_init::@16: scope:[part2_init]  from part2_init::@15
  [349] byteboozer_decrunch::crunched = LOGO_DATA_CRUNCHED2
  [350] call byteboozer_decrunch
  to:part2_init::@17
part2_init::@17: scope:[part2_init]  from part2_init::@16
  [351] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  [352] *PROCPORT = PROCPORT_RAM_ALL
  [353] call memset
  to:part2_init::@18
part2_init::@18: scope:[part2_init]  from part2_init::@17
  [354] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
  [355] *PROCPORT = PROCPORT_RAM_IO
  [356] call memset
  to:part2_init::@19
part2_init::@19: scope:[part2_init]  from part2_init::@18
  [357] phi()
  [358] call memset
  to:part2_init::@20
part2_init::@20: scope:[part2_init]  from part2_init::@19
  [359] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR) = GREY
  [360] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1) = BROWN
  [361] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2) = BLUE
  [362] call plexPrepareInit
  to:part2_init::@1
part2_init::@1: scope:[part2_init]  from part2_init::@20 part2_init::@21
  [363] part2_init::frame#5 = phi( part2_init::@20/BUCKET_SPRITES, part2_init::@21/part2_init::frame#1 )
  [363] part2_init::frame_idx#2 = phi( part2_init::@20/0, part2_init::@21/part2_init::frame_idx#1 )
  [364] if(part2_init::frame_idx#2<8) goto part2_init::@2
  to:part2_init::@3
part2_init::@3: scope:[part2_init]  from part2_init::@1
  [365] phi()
  [366] call memcpy
  to:part2_init::@7
part2_init::@7: scope:[part2_init]  from part2_init::@12 part2_init::@3
  [367] part2_init::s1#2 = phi( part2_init::@12/part2_init::s1#1, part2_init::@3/0 )
  [368] if(part2_init::s1#2<$20) goto part2_init::toSpritePtr1
  to:part2_init::@8
part2_init::@8: scope:[part2_init]  from part2_init::@7
  [369] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = 0
  [370] *((char *)VICII) = 0
  [371] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 0
  [372] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = 0
  to:part2_init::@9
part2_init::@9: scope:[part2_init]  from part2_init::@10 part2_init::@8
  [373] part2_init::s2#2 = phi( part2_init::@10/part2_init::s2#1, part2_init::@8/0 )
  [374] if(part2_init::s2#2<8) goto part2_init::@10
  to:part2_init::@11
part2_init::@11: scope:[part2_init]  from part2_init::@9
  [375] phi()
  [376] call memset
  to:part2_init::@return
part2_init::@return: scope:[part2_init]  from part2_init::@11
  [377] return 
  to:@return
part2_init::@10: scope:[part2_init]  from part2_init::@9
  [378] SPRITES_COLOR[part2_init::s2#2] = WHITE
  [379] part2_init::s2#1 = ++ part2_init::s2#2
  to:part2_init::@9
part2_init::toSpritePtr1: scope:[part2_init]  from part2_init::@7
  [380] phi()
  to:part2_init::@12
part2_init::@12: scope:[part2_init]  from part2_init::toSpritePtr1
  [381] PLEX_PTR[part2_init::s1#2] = part2_init::toSpritePtr1_return#0+' '
  [382] part2_init::s1#1 = ++ part2_init::s1#2
  to:part2_init::@7
part2_init::@2: scope:[part2_init]  from part2_init::@1
  [383] part2_init::sin_idx#4 = part2_init::frame_idx#2
  to:part2_init::@4
part2_init::@4: scope:[part2_init]  from part2_init::@2 part2_init::@5
  [384] part2_init::sin_idx#2 = phi( part2_init::@2/part2_init::sin_idx#4, part2_init::@5/part2_init::sin_idx#1 )
  [384] part2_init::s#2 = phi( part2_init::@2/0, part2_init::@5/part2_init::s#1 )
  [385] if(part2_init::s#2<$20) goto part2_init::@5
  to:part2_init::@6
part2_init::@6: scope:[part2_init]  from part2_init::@4
  [386] plexPrepareFrame::frame#0 = part2_init::frame#5
  [387] call plexPrepareFrame
  to:part2_init::@21
part2_init::@21: scope:[part2_init]  from part2_init::@6
  [388] part2_init::frame#1 = part2_init::frame#5 + 8*9*SIZEOF_STRUCT_BUCKETSPRITE
  [389] part2_init::frame_idx#1 = ++ part2_init::frame_idx#2
  to:part2_init::@1
part2_init::@5: scope:[part2_init]  from part2_init::@4
  [390] PLEX_YPOS[part2_init::s#2] = SCROLL_YSIN[part2_init::sin_idx#2]
  [391] part2_init::sin_idx#1 = part2_init::sin_idx#2 + 8
  [392] part2_init::s#1 = ++ part2_init::s#2
  to:part2_init::@4

void part2_run()
part2_run: scope:[part2_run]  from main::@5
  [393] phi()
  to:part2_run::SEI1
part2_run::SEI1: scope:[part2_run]  from part2_run
  asm { sei  }
  to:part2_run::@1
part2_run::@1: scope:[part2_run]  from part2_run::SEI1
  [395] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = BLACK
  [396] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLACK
  to:part2_run::toDd001
part2_run::toDd001: scope:[part2_run]  from part2_run::@1
  [397] phi()
  to:part2_run::@2
part2_run::@2: scope:[part2_run]  from part2_run::toDd001
  [398] *((char *)CIA2) = part2_run::toDd001_return#0
  to:part2_run::toD0181
part2_run::toD0181: scope:[part2_run]  from part2_run::@2
  [399] phi()
  to:part2_run::@3
part2_run::@3: scope:[part2_run]  from part2_run::toD0181
  [400] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = part2_run::toD0181_return#0
  [401] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM
  [402] *SPRITES_ENABLE = $ff
  [403] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR
  asm { ldaCIA1_INTERRUPT  }
  [405] *IRQ_STATUS = $f
  [406] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f
  [407] *RASTER = *BUCKET_YPOS
  [408] *IRQ_ENABLE = IRQ_RASTER
  [409] *HARDWARE_IRQ = &irq_swing_top
  to:part2_run::CLI1
part2_run::CLI1: scope:[part2_run]  from part2_run::@3
  asm { cli  }
  to:part2_run::@4
part2_run::@4: scope:[part2_run]  from part2_run::CLI1
  [411] plex_frame_id = 0
  [412] plex_frame = BUCKET_SPRITES
  [413] plex_id_offset = 0
  [414] call part2_loop
  to:part2_run::@return
part2_run::@return: scope:[part2_run]  from part2_run::@4
  [415] return 
  to:@return

void sparkler_anim()
sparkler_anim: scope:[sparkler_anim]  from demo_work::@2
  [416] sparkler_idx = ++ sparkler_idx
  [417] if(sparkler_idx!=$1e) goto sparkler_anim::toSpritePtr1
  to:sparkler_anim::@1
sparkler_anim::@1: scope:[sparkler_anim]  from sparkler_anim
  [418] sparkler_idx = 0
  to:sparkler_anim::toSpritePtr1
sparkler_anim::toSpritePtr1: scope:[sparkler_anim]  from sparkler_anim sparkler_anim::@1
  [419] phi()
  to:sparkler_anim::@2
sparkler_anim::@2: scope:[sparkler_anim]  from sparkler_anim::toSpritePtr1
  [420] sparkler_anim::$3 = sparkler_idx >> 1
  [421] sparkler_anim::$4 = sparkler_anim::toSpritePtr1_return#0 + sparkler_anim::$3
  [422] *P1_SCREEN_SPRITE_PTRS = sparkler_anim::$4
  to:sparkler_anim::@return
sparkler_anim::@return: scope:[sparkler_anim]  from sparkler_anim::@2
  [423] return 
  to:@return

void init_rasters()
init_rasters: scope:[init_rasters]  from part1_init::@5
  [424] phi()
  to:init_rasters::@1
init_rasters::@1: scope:[init_rasters]  from init_rasters init_rasters::@2
  [425] init_rasters::i#2 = phi( init_rasters/0, init_rasters::@2/init_rasters::i#1 )
  [426] if(init_rasters::i#2<$130*SIZEOF_CHAR) goto init_rasters::@2
  to:init_rasters::@3
init_rasters::@3: scope:[init_rasters]  from init_rasters::@1 init_rasters::@4
  [427] init_rasters::b#2 = phi( init_rasters::@1/$32, init_rasters::@4/init_rasters::b#1 )
  [428] if(init_rasters::b#2<$fa) goto init_rasters::@4
  to:init_rasters::@return
init_rasters::@return: scope:[init_rasters]  from init_rasters::@3
  [429] return 
  to:@return
init_rasters::@4: scope:[init_rasters]  from init_rasters::@3
  [430] RASTER_BADLINES[init_rasters::b#2] = 1
  [431] init_rasters::b#1 = init_rasters::b#2 + 8
  to:init_rasters::@3
init_rasters::@2: scope:[init_rasters]  from init_rasters::@1
  [432] init_rasters::$3 = RASTER_BADLINES + init_rasters::i#2
  [433] *init_rasters::$3 = 0
  [434] init_rasters::i#1 = ++ init_rasters::i#2
  to:init_rasters::@1

void * memset(void *str , char c , unsigned int num)
memset: scope:[memset]  from part1_init::@6 part2_init::@11 part2_init::@17 part2_init::@18 part2_init::@19
  [435] memset::c#7 = phi( part1_init::@6/0, part2_init::@11/BLACK, part2_init::@17/0, part2_init::@18/BLACK, part2_init::@19/BLACK )
  [435] memset::str#6 = phi( part1_init::@6/(void *)PIXELS_EMPTY, part2_init::@11/(void *)PART2_SCREEN+$3e8, part2_init::@17/(void *)PART2_BITMAP+$1f40, part2_init::@18/(void *)COLS, part2_init::@19/(void *)PART2_SCREEN )
  [435] memset::num#5 = phi( part1_init::@6/$800, part2_init::@11/$18, part2_init::@17/$c0, part2_init::@18/$400, part2_init::@19/$3e8 )
  [436] if(memset::num#5<=0) goto memset::@return
  to:memset::@1
memset::@1: scope:[memset]  from memset
  [437] memset::end#0 = (char *)memset::str#6 + memset::num#5
  [438] memset::dst#4 = (char *)memset::str#6
  to:memset::@2
memset::@2: scope:[memset]  from memset::@1 memset::@3
  [439] memset::dst#2 = phi( memset::@1/memset::dst#4, memset::@3/memset::dst#1 )
  [440] if(memset::dst#2!=memset::end#0) goto memset::@3
  to:memset::@return
memset::@return: scope:[memset]  from memset memset::@2
  [441] return 
  to:@return
memset::@3: scope:[memset]  from memset::@2
  [442] *memset::dst#2 = memset::c#7
  [443] memset::dst#1 = ++ memset::dst#2
  to:memset::@2

void * memcpy(void *destination , void *source , unsigned int num)
memcpy: scope:[memcpy]  from part1_init::@7 part1_init::@8 part1_init::@9 part2_init::@13 part2_init::@14 part2_init::@3
  [444] memcpy::num#6 = phi( part1_init::@7/$800, part1_init::@8/$400, part1_init::@9/$3e8, part2_init::@13/LOGO_DATA_CRUNCHED_SIZE, part2_init::@14/PLEX_ID_UPDATERS_CRUNCHED_SIZE, part2_init::@3/(unsigned int)8*9*8*SIZEOF_STRUCT_BUCKETSPRITE )
  [444] memcpy::destination#6 = phi( part1_init::@7/(void *)LOAD_CHARSET, part1_init::@8/(void *)LOAD_SCREEN, part1_init::@9/(void *)LOAD_COLORS, part2_init::@13/(void *)LOGO_DATA_CRUNCHED2, part2_init::@14/(void *)PLEX_ID_UPDATERS_CRUNCHED2, part2_init::@3/(void *)ORIGINAL_BUCKET_SPRITES )
  [444] memcpy::source#6 = phi( part1_init::@7/(void *)CHARGEN, part1_init::@8/(void *)DEFAULT_SCREEN, part1_init::@9/(void *)COLS, part2_init::@13/(void *)LOGO_DATA_CRUNCHED, part2_init::@14/(void *)PLEX_ID_UPDATERS_CRUNCHED, part2_init::@3/(void *)BUCKET_SPRITES )
  [445] memcpy::src_end#0 = (char *)memcpy::source#6 + memcpy::num#6
  [446] memcpy::src#4 = (char *)memcpy::source#6
  [447] memcpy::dst#4 = (char *)memcpy::destination#6
  to:memcpy::@1
memcpy::@1: scope:[memcpy]  from memcpy memcpy::@2
  [448] memcpy::dst#2 = phi( memcpy/memcpy::dst#4, memcpy::@2/memcpy::dst#1 )
  [448] memcpy::src#2 = phi( memcpy/memcpy::src#4, memcpy::@2/memcpy::src#1 )
  [449] if(memcpy::src#2!=memcpy::src_end#0) goto memcpy::@2
  to:memcpy::@return
memcpy::@return: scope:[memcpy]  from memcpy::@1
  [450] return 
  to:@return
memcpy::@2: scope:[memcpy]  from memcpy::@1
  [451] *memcpy::dst#2 = *memcpy::src#2
  [452] memcpy::dst#1 = ++ memcpy::dst#2
  [453] memcpy::src#1 = ++ memcpy::src#2
  to:memcpy::@1

void part1_loop()
part1_loop: scope:[part1_loop]  from part1_run::@3
  [454] p1_work_ready = 0
  to:part1_loop::@1
part1_loop::@1: scope:[part1_loop]  from part1_loop part1_loop::@1 part1_loop::@5
  [455] if(p1_work_ready==0) goto part1_loop::@1
  to:part1_loop::@2
part1_loop::@2: scope:[part1_loop]  from part1_loop::@1
  [456] phi()
  [457] call flipper_fix_colors
  to:part1_loop::@7
part1_loop::@7: scope:[part1_loop]  from part1_loop::@2
  [458] part1_loop::$11 = demo_frame_count
  [459] if(0!=sparkler_active) goto part1_loop::@4
  to:part1_loop::@9
part1_loop::@9: scope:[part1_loop]  from part1_loop::@7
  [460] if(part1_loop::$11<=(unsigned int)9*$32-3) goto part1_loop::@4
  to:part1_loop::@3
part1_loop::@3: scope:[part1_loop]  from part1_loop::@9
  [461] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 1
  [462] sparkler_active = 1
  to:part1_loop::@4
part1_loop::@4: scope:[part1_loop]  from part1_loop::@3 part1_loop::@7 part1_loop::@9
  [463] phi()
  [464] call demo_work
  to:part1_loop::@8
part1_loop::@8: scope:[part1_loop]  from part1_loop::@4
  [465] if(demo_frame_count<=(unsigned int)$e*$32) goto part1_loop::@5
  to:part1_loop::@6
part1_loop::@6: scope:[part1_loop]  from part1_loop::@8
  [466] phi()
  [467] call demo_start
  to:part1_loop::@return
part1_loop::@return: scope:[part1_loop]  from part1_loop::@6
  [468] return 
  to:@return
part1_loop::@5: scope:[part1_loop]  from part1_loop::@8
  [469] p1_work_ready = 0
  to:part1_loop::@1

void plexPrepareInit()
plexPrepareInit: scope:[plexPrepareInit]  from part2_init::@20
  [470] phi()
  to:plexPrepareInit::@1
plexPrepareInit::@1: scope:[plexPrepareInit]  from plexPrepareInit plexPrepareInit::@2
  [471] plexPrepareInit::i#2 = phi( plexPrepareInit/0, plexPrepareInit::@2/plexPrepareInit::i#1 )
  [472] if(plexPrepareInit::i#2<$20) goto plexPrepareInit::@2
  to:plexPrepareInit::@return
plexPrepareInit::@return: scope:[plexPrepareInit]  from plexPrepareInit::@1
  [473] return 
  to:@return
plexPrepareInit::@2: scope:[plexPrepareInit]  from plexPrepareInit::@1
  [474] PLEX_SORTED_IDX[plexPrepareInit::i#2] = plexPrepareInit::i#2
  [475] plexPrepareInit::i#1 = ++ plexPrepareInit::i#2
  to:plexPrepareInit::@1

void plexPrepareFrame(struct BucketSprite *frame)
plexPrepareFrame: scope:[plexPrepareFrame]  from part2_init::@6
  [476] phi()
  to:plexPrepareFrame::@1
plexPrepareFrame::@1: scope:[plexPrepareFrame]  from plexPrepareFrame plexPrepareFrame::@3
  [477] plexPrepareFrame::m#2 = phi( plexPrepareFrame/0, plexPrepareFrame::@3/plexPrepareFrame::m#1 )
  [478] if(plexPrepareFrame::m#2<$20-1) goto plexPrepareFrame::@2
  to:plexPrepareFrame::@7
plexPrepareFrame::@7: scope:[plexPrepareFrame]  from plexPrepareFrame::@1 plexPrepareFrame::@8
  [479] plexPrepareFrame::i#2 = phi( plexPrepareFrame::@1/0, plexPrepareFrame::@8/plexPrepareFrame::i#1 )
  [480] if(plexPrepareFrame::i#2<8) goto plexPrepareFrame::@8
  to:plexPrepareFrame::@9
plexPrepareFrame::@9: scope:[plexPrepareFrame]  from plexPrepareFrame::@7
  [481] plexPrepareFrame::bucket_ypos#0 = *BUCKET_YPOS
  [482] plexPrepareFrame::bucket#10 = plexPrepareFrame::frame#0
  to:plexPrepareFrame::@10
plexPrepareFrame::@10: scope:[plexPrepareFrame]  from plexPrepareFrame::@13 plexPrepareFrame::@9
  [483] plexPrepareFrame::bucket_id#2 = phi( plexPrepareFrame::@9/0, plexPrepareFrame::@13/plexPrepareFrame::bucket_id#5 )
  [483] plexPrepareFrame::sprite#3 = phi( plexPrepareFrame::@9/plexPrepareFrame::frame#0, plexPrepareFrame::@13/plexPrepareFrame::sprite#1 )
  [483] plexPrepareFrame::bucket#3 = phi( plexPrepareFrame::@9/plexPrepareFrame::bucket#10, plexPrepareFrame::@13/plexPrepareFrame::bucket#9 )
  [483] plexPrepareFrame::bucket_ypos#3 = phi( plexPrepareFrame::@9/plexPrepareFrame::bucket_ypos#0, plexPrepareFrame::@13/plexPrepareFrame::bucket_ypos#1 )
  [483] plexPrepareFrame::real_sprite_id#2 = phi( plexPrepareFrame::@9/0, plexPrepareFrame::@13/plexPrepareFrame::real_sprite_id#1 )
  [483] plexPrepareFrame::i1#2 = phi( plexPrepareFrame::@9/0, plexPrepareFrame::@13/plexPrepareFrame::i1#1 )
  [484] if(plexPrepareFrame::i1#2<$20) goto plexPrepareFrame::@11
  to:plexPrepareFrame::@12
plexPrepareFrame::@12: scope:[plexPrepareFrame]  from plexPrepareFrame::@10
  [485] plexPrepareFrame::bucket#1 = plexPrepareFrame::bucket#3 + 8*SIZEOF_STRUCT_BUCKETSPRITE
  [486] if(plexPrepareFrame::sprite#3==plexPrepareFrame::bucket#1) goto plexPrepareFrame::@return
  to:plexPrepareFrame::@17
plexPrepareFrame::@17: scope:[plexPrepareFrame]  from plexPrepareFrame::@12
  [487] *((char *)plexPrepareFrame::sprite#3) = 0
  to:plexPrepareFrame::@return
plexPrepareFrame::@return: scope:[plexPrepareFrame]  from plexPrepareFrame::@12 plexPrepareFrame::@17
  [488] return 
  to:@return
plexPrepareFrame::@11: scope:[plexPrepareFrame]  from plexPrepareFrame::@10
  [489] plexPrepareFrame::plex_id#0 = PLEX_SORTED_IDX[plexPrepareFrame::i1#2]
  [490] plexPrepareFrame::ypos#0 = PLEX_YPOS[plexPrepareFrame::plex_id#0]
  [491] if(plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::real_sprite_id#2]<=plexPrepareFrame::bucket_ypos#3) goto plexPrepareFrame::@13
  to:plexPrepareFrame::@15
plexPrepareFrame::@15: scope:[plexPrepareFrame]  from plexPrepareFrame::@11
  [492] plexPrepareFrame::bucket_id#1 = ++ plexPrepareFrame::bucket_id#2
  [493] plexPrepareFrame::bucket_ypos#2 = BUCKET_YPOS[plexPrepareFrame::bucket_id#1]
  [494] plexPrepareFrame::sprite#2 = plexPrepareFrame::bucket#3 + 8*SIZEOF_STRUCT_BUCKETSPRITE
  [495] if(plexPrepareFrame::sprite#3==plexPrepareFrame::sprite#2) goto plexPrepareFrame::@14
  to:plexPrepareFrame::@16
plexPrepareFrame::@16: scope:[plexPrepareFrame]  from plexPrepareFrame::@15
  [496] *((char *)plexPrepareFrame::sprite#3) = 0
  to:plexPrepareFrame::@14
plexPrepareFrame::@14: scope:[plexPrepareFrame]  from plexPrepareFrame::@15 plexPrepareFrame::@16
  [497] plexPrepareFrame::sprite#13 = plexPrepareFrame::sprite#2
  to:plexPrepareFrame::@13
plexPrepareFrame::@13: scope:[plexPrepareFrame]  from plexPrepareFrame::@11 plexPrepareFrame::@14
  [498] plexPrepareFrame::bucket_id#5 = phi( plexPrepareFrame::@11/plexPrepareFrame::bucket_id#2, plexPrepareFrame::@14/plexPrepareFrame::bucket_id#1 )
  [498] plexPrepareFrame::bucket#9 = phi( plexPrepareFrame::@11/plexPrepareFrame::bucket#3, plexPrepareFrame::@14/plexPrepareFrame::sprite#2 )
  [498] plexPrepareFrame::bucket_ypos#4 = phi( plexPrepareFrame::@11/plexPrepareFrame::bucket_ypos#3, plexPrepareFrame::@14/plexPrepareFrame::bucket_ypos#2 )
  [498] plexPrepareFrame::sprite#4 = phi( plexPrepareFrame::@11/plexPrepareFrame::sprite#3, plexPrepareFrame::@14/plexPrepareFrame::sprite#13 )
  [499] *((char *)plexPrepareFrame::sprite#4) = plexPrepareFrame::ypos#0
  [500] ((char *)plexPrepareFrame::sprite#4)[OFFSET_STRUCT_BUCKETSPRITE_PLEX_ID] = plexPrepareFrame::plex_id#0
  [501] plexPrepareFrame::bucket_ypos#1 = plexPrepareFrame::bucket_ypos#4 + 1
  [502] plexPrepareFrame::$16 = plexPrepareFrame::ypos#0 + $16
  [503] plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::real_sprite_id#2] = plexPrepareFrame::$16
  [504] plexPrepareFrame::$17 = plexPrepareFrame::real_sprite_id#2 + 1
  [505] plexPrepareFrame::real_sprite_id#1 = plexPrepareFrame::$17 & 7
  [506] plexPrepareFrame::sprite#1 = plexPrepareFrame::sprite#4 + SIZEOF_STRUCT_BUCKETSPRITE
  [507] plexPrepareFrame::i1#1 = ++ plexPrepareFrame::i1#2
  to:plexPrepareFrame::@10
plexPrepareFrame::@8: scope:[plexPrepareFrame]  from plexPrepareFrame::@7
  [508] plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::i#2] = *BUCKET_YPOS
  [509] plexPrepareFrame::i#1 = ++ plexPrepareFrame::i#2
  to:plexPrepareFrame::@7
plexPrepareFrame::@2: scope:[plexPrepareFrame]  from plexPrepareFrame::@1
  [510] plexPrepareFrame::nxt_idx#0 = (PLEX_SORTED_IDX+1)[plexPrepareFrame::m#2]
  [511] plexPrepareFrame::nxt_y#0 = PLEX_YPOS[plexPrepareFrame::nxt_idx#0]
  [512] if(plexPrepareFrame::nxt_y#0>=PLEX_YPOS[PLEX_SORTED_IDX[plexPrepareFrame::m#2]]) goto plexPrepareFrame::@3
  to:plexPrepareFrame::@6
plexPrepareFrame::@6: scope:[plexPrepareFrame]  from plexPrepareFrame::@2
  [513] plexPrepareFrame::s#6 = plexPrepareFrame::m#2
  to:plexPrepareFrame::@4
plexPrepareFrame::@4: scope:[plexPrepareFrame]  from plexPrepareFrame::@18 plexPrepareFrame::@6
  [514] plexPrepareFrame::s#3 = phi( plexPrepareFrame::@18/plexPrepareFrame::s#1, plexPrepareFrame::@6/plexPrepareFrame::s#6 )
  [515] (PLEX_SORTED_IDX+1)[plexPrepareFrame::s#3] = PLEX_SORTED_IDX[plexPrepareFrame::s#3]
  [516] plexPrepareFrame::s#1 = -- plexPrepareFrame::s#3
  [517] if(plexPrepareFrame::s#1==$ff) goto plexPrepareFrame::@5
  to:plexPrepareFrame::@18
plexPrepareFrame::@18: scope:[plexPrepareFrame]  from plexPrepareFrame::@4
  [518] if(plexPrepareFrame::nxt_y#0<PLEX_YPOS[PLEX_SORTED_IDX[plexPrepareFrame::s#1]]) goto plexPrepareFrame::@4
  to:plexPrepareFrame::@5
plexPrepareFrame::@5: scope:[plexPrepareFrame]  from plexPrepareFrame::@18 plexPrepareFrame::@4
  [519] plexPrepareFrame::s#2 = ++ plexPrepareFrame::s#1
  [520] PLEX_SORTED_IDX[plexPrepareFrame::s#2] = plexPrepareFrame::nxt_idx#0
  to:plexPrepareFrame::@3
plexPrepareFrame::@3: scope:[plexPrepareFrame]  from plexPrepareFrame::@2 plexPrepareFrame::@5
  [521] plexPrepareFrame::m#1 = ++ plexPrepareFrame::m#2
  to:plexPrepareFrame::@1

void part2_loop()
part2_loop: scope:[part2_loop]  from part2_run::@4
  [522] p2_work_ready = 0
  to:part2_loop::@1
part2_loop::@1: scope:[part2_loop]  from part2_loop part2_loop::@1 part2_loop::@7
  [523] if(p2_work_ready==0) goto part2_loop::@1
  to:part2_loop::@2
part2_loop::@2: scope:[part2_loop]  from part2_loop::@1
  [524] phi()
  [525] call demo_work
  to:part2_loop::@11
part2_loop::@11: scope:[part2_loop]  from part2_loop::@2
  [526] if(0==p2_logo_revealing) goto part2_loop::@4
  to:part2_loop::@12
part2_loop::@12: scope:[part2_loop]  from part2_loop::@11
  [527] if(0==p2_logo_reveal_done) goto part2_loop::@3
  to:part2_loop::@4
part2_loop::@3: scope:[part2_loop]  from part2_loop::@12
  [528] phi()
  [529] call p2_logo_reveal
  to:part2_loop::@4
part2_loop::@4: scope:[part2_loop]  from part2_loop::@11 part2_loop::@12 part2_loop::@3
  [530] part2_loop::$23 = demo_frame_count
  [531] if(0!=p2_logo_revealing) goto part2_loop::@5
  to:part2_loop::@13
part2_loop::@13: scope:[part2_loop]  from part2_loop::@4
  [532] if(part2_loop::$23<=(unsigned int)$12*$32+$19) goto part2_loop::@5
  to:part2_loop::@8
part2_loop::@8: scope:[part2_loop]  from part2_loop::@13
  [533] p2_logo_revealing = 1
  to:part2_loop::@5
part2_loop::@5: scope:[part2_loop]  from part2_loop::@13 part2_loop::@4 part2_loop::@8
  [534] if(0!=p2_logo_swinging) goto part2_loop::@6
  to:part2_loop::@14
part2_loop::@14: scope:[part2_loop]  from part2_loop::@5
  [535] if(0==p2_logo_reveal_done) goto part2_loop::@6
  to:part2_loop::@9
part2_loop::@9: scope:[part2_loop]  from part2_loop::@14
  [536] p2_logo_swinging = 1
  to:part2_loop::@6
part2_loop::@6: scope:[part2_loop]  from part2_loop::@14 part2_loop::@5 part2_loop::@9
  [537] part2_loop::$24 = demo_frame_count
  [538] if(0!=p2_plex_scroller_moving) goto part2_loop::@7
  to:part2_loop::@15
part2_loop::@15: scope:[part2_loop]  from part2_loop::@6
  [539] if(part2_loop::$24<=(unsigned int)$1a*$32) goto part2_loop::@7
  to:part2_loop::@10
part2_loop::@10: scope:[part2_loop]  from part2_loop::@15
  [540] p2_plex_scroller_moving = 1
  to:part2_loop::@7
part2_loop::@7: scope:[part2_loop]  from part2_loop::@10 part2_loop::@15 part2_loop::@6
  [541] p2_work_ready = 0
  to:part2_loop::@1

void flipper_fix_colors()
flipper_fix_colors: scope:[flipper_fix_colors]  from part1_loop::@2
  [542] if(irq_flipper_top_line<$2e+1) goto flipper_fix_colors::@return
  to:flipper_fix_colors::@6
flipper_fix_colors::@6: scope:[flipper_fix_colors]  from flipper_fix_colors
  [543] if(irq_flipper_top_line<$f6) goto flipper_fix_colors::@1
  to:flipper_fix_colors::@return
flipper_fix_colors::@return: scope:[flipper_fix_colors]  from flipper_fix_colors flipper_fix_colors::@1 flipper_fix_colors::@5 flipper_fix_colors::@6
  [544] return 
  to:@return
flipper_fix_colors::@1: scope:[flipper_fix_colors]  from flipper_fix_colors::@6
  [545] flipper_fix_colors::$4 = irq_flipper_top_line - $2e
  [546] flipper_fix_colors::$5 = flipper_fix_colors::$4 >> 3
  [547] flipper_fix_colors::charline#0 = (char)flipper_fix_colors::$5
  [548] if(flipper_fix_colors::charline#0<flipper_charline) goto flipper_fix_colors::@return
  to:flipper_fix_colors::@2
flipper_fix_colors::@2: scope:[flipper_fix_colors]  from flipper_fix_colors::@1
  [549] flipper_fix_colors::$12 = (unsigned int)flipper_charline
  [550] flipper_fix_colors::$13 = flipper_fix_colors::$12 << 2
  [551] flipper_fix_colors::$14 = flipper_fix_colors::$13 + flipper_fix_colors::$12
  [552] flipper_fix_colors::offset#0 = flipper_fix_colors::$14 << 3
  [553] flipper_fix_colors::colors#0 = COLS + flipper_fix_colors::offset#0
  [554] flipper_fix_colors::happy_cols#0 = P1_COLORS + flipper_fix_colors::offset#0
  to:flipper_fix_colors::@3
flipper_fix_colors::@3: scope:[flipper_fix_colors]  from flipper_fix_colors::@2 flipper_fix_colors::@4
  [555] flipper_fix_colors::i#2 = phi( flipper_fix_colors::@2/0, flipper_fix_colors::@4/flipper_fix_colors::i#1 )
  [556] if(flipper_fix_colors::i#2<$28) goto flipper_fix_colors::@4
  to:flipper_fix_colors::@5
flipper_fix_colors::@5: scope:[flipper_fix_colors]  from flipper_fix_colors::@3
  [557] flipper_charline = ++ flipper_charline
  to:flipper_fix_colors::@return
flipper_fix_colors::@4: scope:[flipper_fix_colors]  from flipper_fix_colors::@3
  [558] flipper_fix_colors::colors#0[flipper_fix_colors::i#2] = flipper_fix_colors::happy_cols#0[flipper_fix_colors::i#2]
  [559] flipper_fix_colors::i#1 = ++ flipper_fix_colors::i#2
  to:flipper_fix_colors::@3

void p2_logo_reveal()
p2_logo_reveal: scope:[p2_logo_reveal]  from part2_loop::@3
  [560] if(p2_logo_reveal_idx>=$28) goto p2_logo_reveal::@1
  to:p2_logo_reveal::@2
p2_logo_reveal::@2: scope:[p2_logo_reveal]  from p2_logo_reveal
  [561] vsp_update_screen::x_offset = p2_logo_reveal_idx
  [562] call vsp_update_screen
  to:p2_logo_reveal::@3
p2_logo_reveal::@3: scope:[p2_logo_reveal]  from p2_logo_reveal::@2
  [563] p2_logo_reveal_idx = ++ p2_logo_reveal_idx
  to:p2_logo_reveal::@return
p2_logo_reveal::@return: scope:[p2_logo_reveal]  from p2_logo_reveal::@1 p2_logo_reveal::@3
  [564] return 
  to:@return
p2_logo_reveal::@1: scope:[p2_logo_reveal]  from p2_logo_reveal
  [565] p2_logo_reveal_done = 1
  to:p2_logo_reveal::@return

null depth in calling loop Loop head: part1_loop::@1 tails: part1_loop::@5 blocks: part1_loop::@5 part1_loop::@8 part1_loop::@4 part1_loop::@3 part1_loop::@7 part1_loop::@9 part1_loop::@2 part1_loop::@1  in scope demo_work
null depth in calling loop Loop head: part2_loop::@1 tails: part2_loop::@7 blocks: part2_loop::@7 part2_loop::@10 part2_loop::@15 part2_loop::@6 part2_loop::@14 part2_loop::@5 part2_loop::@9 part2_loop::@13 part2_loop::@4 part2_loop::@8 part2_loop::@11 part2_loop::@12 part2_loop::@3 part2_loop::@2 part2_loop::@1  in scope demo_work
null depth in calling loop Loop head: part2_loop::@1 tails: part2_loop::@7 blocks: part2_loop::@7 part2_loop::@10 part2_loop::@15 part2_loop::@6 part2_loop::@14 part2_loop::@5 part2_loop::@9 part2_loop::@13 part2_loop::@4 part2_loop::@8 part2_loop::@11 part2_loop::@12 part2_loop::@3 part2_loop::@2 part2_loop::@1  in scope p2_logo_reveal
null depth in calling loop Loop head: part1_loop::@1 tails: part1_loop::@5 blocks: part1_loop::@5 part1_loop::@8 part1_loop::@4 part1_loop::@3 part1_loop::@7 part1_loop::@9 part1_loop::@2 part1_loop::@1  in scope demo_work
null depth in calling loop Loop head: part2_loop::@1 tails: part2_loop::@7 blocks: part2_loop::@7 part2_loop::@10 part2_loop::@15 part2_loop::@6 part2_loop::@14 part2_loop::@5 part2_loop::@9 part2_loop::@13 part2_loop::@4 part2_loop::@8 part2_loop::@11 part2_loop::@12 part2_loop::@3 part2_loop::@2 part2_loop::@1  in scope demo_work

VARIABLE REGISTER WEIGHTS
void __start()
void byteboozer_decrunch(char * volatile crunched)
__loadstore char * volatile byteboozer_decrunch::crunched // 91.0
__loadstore volatile unsigned int demo_frame_count // 2355.0
void demo_init()
void demo_start()
void demo_work()
__loadstore volatile char flipper_charline // 5000.083333333334
__loadstore volatile char flipper_done // 0.6000000000000001
void flipper_fix_colors()
unsigned int flipper_fix_colors::$12 // 150001.5
unsigned int flipper_fix_colors::$13 // 200002.0
unsigned int flipper_fix_colors::$14 // 200002.0
unsigned int flipper_fix_colors::$4 // 200002.0
unsigned int flipper_fix_colors::$5 // 100001.0
char flipper_fix_colors::charline
char flipper_fix_colors::charline#0 // 200002.0
char *flipper_fix_colors::colors
char *flipper_fix_colors::colors#0 // 1683333.6666666665
char *flipper_fix_colors::happy_cols
char *flipper_fix_colors::happy_cols#0 // 2020000.4
char flipper_fix_colors::i
char flipper_fix_colors::i#1 // 2.0000002E7
char flipper_fix_colors::i#2 // 1.6666668333333332E7
unsigned int flipper_fix_colors::offset
unsigned int flipper_fix_colors::offset#0 // 150001.5
void init_rasters()
char *init_rasters::$3 // 20002.0
char init_rasters::b
char init_rasters::b#1 // 20002.0
char init_rasters::b#2 // 13334.666666666666
unsigned int init_rasters::i
unsigned int init_rasters::i#1 // 20002.0
unsigned int init_rasters::i#2 // 10001.0
__interrupt(hardware_clobber) void irq_demo()
char irq_demo::port_value
char irq_demo::port_value#0 // 0.6666666666666666
__interrupt(hardware_clobber) void irq_flipper_bottom()
char irq_flipper_bottom::$0 // 4.0
char irq_flipper_bottom::$1 // 4.0
unsigned int irq_flipper_bottom::$12 // 4.0
unsigned int *irq_flipper_bottom::$14 // 4.0
unsigned int irq_flipper_bottom::$7 // 4.0
unsigned int irq_flipper_bottom::$9 // 4.0
unsigned int irq_flipper_bottom::irq_flipper_line
unsigned int irq_flipper_bottom::irq_flipper_line#0 // 1.2
char *irq_flipper_bottom::toD0181_gfx
char irq_flipper_bottom::toD0181_return
char *irq_flipper_bottom::toD0181_screen
__loadstore volatile unsigned int irq_flipper_bottom_line // 1.090909090909091
__loadstore volatile unsigned int irq_flipper_idx // 0.5714285714285714
__interrupt(hardware_clobber) void irq_flipper_top()
char irq_flipper_top::$0 // 4.0
char irq_flipper_top::$1 // 4.0
char irq_flipper_top::$3 // 4.0
char irq_flipper_top::$4 // 4.0
char irq_flipper_top::$5 // 4.0
__loadstore volatile unsigned int irq_flipper_top_line // 4109.7945205479455
__interrupt(hardware_clobber) void irq_part1_top()
char irq_part1_top::$2 // 4.0
char irq_part1_top::$3 // 4.0
char irq_part1_top::$4 // 4.0
char *irq_part1_top::toD0181_gfx
char irq_part1_top::toD0181_return
char *irq_part1_top::toD0181_screen
char *irq_part1_top::toDd001_gfx
char irq_part1_top::toDd001_return
__interrupt(hardware_clobber) void irq_swing_plex()
char irq_swing_plex::$16 // 4.0
unsigned int irq_swing_plex::$26 // 4.0
unsigned int irq_swing_plex::$27 // 4.0
char irq_swing_plex::$28 // 4.0
unsigned int *irq_swing_plex::$31 // 4.0
char irq_swing_plex::$6 // 4.0
unsigned int irq_swing_plex::$7 // 2.0
char irq_swing_plex::coarse_scroll_diff
char irq_swing_plex::coarse_scroll_diff#0 // 3.0
char irq_swing_plex::new_coarse_scroll
char irq_swing_plex::new_coarse_scroll#0 // 0.5
char irq_swing_plex::s
char irq_swing_plex::s#1 // 22.0
char irq_swing_plex::s#2 // 14.666666666666666
unsigned int irq_swing_plex::scroll
unsigned int irq_swing_plex::scroll#0 // 0.8
char irq_swing_plex::x_offset
char irq_swing_plex::x_offset#0 // 2.0
char irq_swing_plex::x_offset1
char irq_swing_plex::x_offset1#0 // 4.0
__interrupt(hardware_clobber) void irq_swing_top()
__interrupt(hardware_clobber) void irq_swing_vsp()
char irq_swing_vsp::$1 // 4.0
void main()
void * memcpy(void *destination , void *source , unsigned int num)
void *memcpy::destination
void *memcpy::destination#6
char *memcpy::dst
char *memcpy::dst#1 // 10001.0
char *memcpy::dst#2 // 10334.666666666666
char *memcpy::dst#4 // 2002.0
unsigned int memcpy::num
unsigned int memcpy::num#6 // 1001.0
void *memcpy::return
void *memcpy::source
void *memcpy::source#6
char *memcpy::src
char *memcpy::src#1 // 20002.0
char *memcpy::src#2 // 10251.25
char *memcpy::src#4 // 1001.0
char *memcpy::src_end
char *memcpy::src_end#0 // 1375.25
void * memset(void *str , char c , unsigned int num)
char memset::c
char memset::c#7 // 1250.125
char *memset::dst
char *memset::dst#1 // 20002.0
char *memset::dst#2 // 13668.333333333332
char *memset::dst#4 // 2002.0
char *memset::end
char *memset::end#0 // 1833.6666666666665
unsigned int memset::num
unsigned int memset::num#5 // 1001.0
void *memset::return
void *memset::str
void *memset::str#6
__loadstore volatile char p1_work_ready // 37002.33333333333
void p2_logo_reveal()
__loadstore volatile char p2_logo_reveal_done // 2033.9830508474574
__loadstore volatile char p2_logo_reveal_idx // 6779.762711864407
__loadstore volatile char p2_logo_revealing // 566.1320754716982
__loadstore volatile char p2_logo_swinging // 294.20588235294116
__loadstore volatile char p2_plex_scroller_moving // 215.11827956989248
__loadstore volatile char p2_work_ready // 37002.33333333333
void part1_init()
void part1_loop()
unsigned int part1_loop::$11 // 10001.0
void part1_run()
char part1_run::toSpritePtr1_return
char *part1_run::toSpritePtr1_sprite
void part2_init()
struct BucketSprite *part2_init::frame
struct BucketSprite *part2_init::frame#1 // 1001.0
struct BucketSprite *part2_init::frame#5 // 300.29999999999995
char part2_init::frame_idx
char part2_init::frame_idx#1 // 2002.0
char part2_init::frame_idx#2 // 364.0
char part2_init::s
char part2_init::s#1 // 20002.0
char part2_init::s#2 // 10001.0
char part2_init::s1
char part2_init::s1#1 // 2002.0
char part2_init::s1#2 // 1001.0
char part2_init::s2
char part2_init::s2#1 // 2002.0
char part2_init::s2#2 // 1334.6666666666667
char part2_init::sin_idx
char part2_init::sin_idx#1 // 10001.0
char part2_init::sin_idx#2 // 10334.666666666666
char part2_init::sin_idx#4 // 2002.0
char part2_init::toSpritePtr1_return
char *part2_init::toSpritePtr1_sprite
void part2_loop()
unsigned int part2_loop::$23 // 10001.0
unsigned int part2_loop::$24 // 10001.0
void part2_run()
char *part2_run::toD0181_gfx
char part2_run::toD0181_return
char *part2_run::toD0181_screen
char *part2_run::toDd001_gfx
char part2_run::toDd001_return
void plexBucketShow(struct BucketSprite *bucket)
char plexBucketShow::$1 // 22.0
char plexBucketShow::$2 // 202.0
struct BucketSprite *plexBucketShow::bucket
struct BucketSprite *plexBucketShow::bucket#0 // 4.0
struct BucketSprite *plexBucketShow::bucket#1 // 4.0
struct BucketSprite *plexBucketShow::bucket#2 // 0.2222222222222222
char *plexBucketShow::bucket_ptr
char plexBucketShow::i
char plexBucketShow::i#1 // 27.545454545454547
char plexBucketShow::i#2 // 151.5
char plexBucketShow::i#3 // 134.66666666666666
char plexBucketShow::plex_id
char plexBucketShow::plex_id#0 // 67.33333333333333
char plexBucketShow::real_idx
char plexBucketShow::real_idx#0 // 22.0
char plexBucketShow::real_idx#1 // 101.0
char plexBucketShow::real_idx#2 // 202.0
char plexBucketShow::real_idx#3 // 101.0
char plexBucketShow::real_idx#4 // 85.99999999999999
char plexBucketShow::real_idx#8 // 213.0
void plexFrameStart()
void plexPrepareFrame(struct BucketSprite *frame)
char plexPrepareFrame::$16 // 2000002.0
char plexPrepareFrame::$17 // 2000002.0
struct BucketSprite *plexPrepareFrame::bucket
struct BucketSprite *plexPrepareFrame::bucket#1 // 20002.0
struct BucketSprite *plexPrepareFrame::bucket#10 // 20002.0
struct BucketSprite *plexPrepareFrame::bucket#3 // 431429.2857142857
struct BucketSprite *plexPrepareFrame::bucket#9 // 300000.30000000005
char plexPrepareFrame::bucket_id
char plexPrepareFrame::bucket_id#1 // 500000.5
char plexPrepareFrame::bucket_id#2 // 600000.6000000001
char plexPrepareFrame::bucket_id#5 // 300000.30000000005
char plexPrepareFrame::bucket_ypos
char plexPrepareFrame::bucket_ypos#0 // 10001.0
char plexPrepareFrame::bucket_ypos#1 // 285714.5714285714
char plexPrepareFrame::bucket_ypos#2 // 400000.4
char plexPrepareFrame::bucket_ypos#3 // 602000.8
char plexPrepareFrame::bucket_ypos#4 // 1000001.0
struct BucketSprite *plexPrepareFrame::frame
struct BucketSprite *plexPrepareFrame::frame#0 // 954.6818181818181
char plexPrepareFrame::i
char plexPrepareFrame::i#1 // 2000002.0
char plexPrepareFrame::i#2 // 1333334.6666666667
char plexPrepareFrame::i1
char plexPrepareFrame::i1#1 // 2000002.0
char plexPrepareFrame::i1#2 // 200000.2
char plexPrepareFrame::m
char plexPrepareFrame::m#1 // 2000002.0
char plexPrepareFrame::m#2 // 461538.9230769231
char plexPrepareFrame::nxt_idx
char plexPrepareFrame::nxt_idx#0 // 300000.30000000005
char plexPrepareFrame::nxt_y
char plexPrepareFrame::nxt_y#0 // 1500000.375
char plexPrepareFrame::plex_id
char plexPrepareFrame::plex_id#0 // 272727.54545454547
char plexPrepareFrame::real_sprite_id
char plexPrepareFrame::real_sprite_id#1 // 666667.3333333334
char plexPrepareFrame::real_sprite_id#2 // 235294.35294117648
char plexPrepareFrame::s
char plexPrepareFrame::s#1 // 1.3666668333333332E7
char plexPrepareFrame::s#2 // 2000002.0
char plexPrepareFrame::s#3 // 2.05000025E7
char plexPrepareFrame::s#6 // 2000002.0
struct BucketSprite *plexPrepareFrame::sprite
struct BucketSprite *plexPrepareFrame::sprite#1 // 1000001.0
struct BucketSprite *plexPrepareFrame::sprite#13 // 2000002.0
struct BucketSprite *plexPrepareFrame::sprite#2 // 1000001.0
struct BucketSprite *plexPrepareFrame::sprite#3 // 274545.9090909091
struct BucketSprite *plexPrepareFrame::sprite#4 // 375000.375
char plexPrepareFrame::ypos
char plexPrepareFrame::ypos#0 // 250000.25
void plexPrepareInit()
char plexPrepareInit::i
char plexPrepareInit::i#1 // 20002.0
char plexPrepareInit::i#2 // 16668.333333333332
__loadstore struct BucketSprite * volatile plex_bucket // 2.6666666666666665
__loadstore volatile char plex_bucket_id // 1.5999999999999999
__loadstore struct BucketSprite * volatile plex_frame // 9.416666666666666
__loadstore volatile char plex_frame_id // 8.846153846153847
__loadstore volatile char plex_id_offset // 8.916666666666666
__loadstore volatile char plex_real_sprite_idx // 4.375
void plex_scroller_move()
char plex_scroller_move::$8 // 202.0
char plex_scroller_move::letter
char plex_scroller_move::letter#0 // 75.75
char plex_scroller_move::letter#2 // 101.0
char plex_scroller_move::s
char plex_scroller_move::s#1 // 202.0
char plex_scroller_move::s#10 // 37.875
char plex_scroller_move::toSpritePtr1_return
char *plex_scroller_move::toSpritePtr1_sprite
char plex_scroller_move::x_idx
char plex_scroller_move::x_idx#0 // 22.0
char plex_scroller_move::x_idx#1 // 101.0
char plex_scroller_move::x_idx#10 // 34.4
void raster_fine(volatile char line_offset)
__loadstore volatile char raster_fine::line_offset // 2.0
__loadstore char * volatile scroll_text_next // 8.450000000000001
__loadstore volatile char sparkler_active // 2857.5238095238096
void sparkler_anim()
char sparkler_anim::$3 // 2000002.0
char sparkler_anim::$4 // 2000002.0
char sparkler_anim::toSpritePtr1_return
char *sparkler_anim::toSpritePtr1_sprite
__loadstore volatile char sparkler_idx // 714286.7142857142
__loadstore volatile char sprite_color_idx // 0.42000000000000004
void update_frame_plex_id_offset(char plex_frame_id)
char update_frame_plex_id_offset::$0 // 22.0
__loadstore volatile unsigned int update_frame_plex_id_offset::jmp_address // 11.0
char update_frame_plex_id_offset::plex_frame_id
char update_frame_plex_id_offset::plex_frame_id#0 // 13.0
__loadstore volatile char vsp_coarse_scroll // 0.39999999999999997
__loadstore volatile char vsp_fine_scroll // 2.0
__loadstore volatile char vsp_scroll // 4.0
__loadstore volatile char vsp_sin_idx // 0.30000000000000004
void vsp_update_screen(volatile char x_offset)
char vsp_update_screen::$1 // 2000002.0
char vsp_update_screen::$3 // 2000002.0
unsigned int vsp_update_screen::$5 // 2000002.0
__loadstore volatile char vsp_update_screen::x_offset // 8333.75
__loadstore volatile unsigned int vsp_update_screen::x_offset8 // 600000.6000000001
__loadstore volatile char x_movement_idx // 0.5833333333333333

Initial phi equivalence classes
[ irq_swing_plex::s#2 irq_swing_plex::s#1 ]
[ plexBucketShow::bucket#2 plexBucketShow::bucket#1 plexBucketShow::bucket#0 ]
[ plexBucketShow::i#3 plexBucketShow::i#2 ]
[ plexBucketShow::real_idx#8 plexBucketShow::real_idx#4 plexBucketShow::real_idx#0 plexBucketShow::real_idx#3 ]
[ plex_scroller_move::s#10 plex_scroller_move::s#1 ]
[ plex_scroller_move::x_idx#10 plex_scroller_move::x_idx#0 plex_scroller_move::x_idx#1 ]
[ plex_scroller_move::letter#2 plex_scroller_move::letter#0 ]
[ part2_init::frame_idx#2 part2_init::frame_idx#1 ]
[ part2_init::frame#5 part2_init::frame#1 ]
[ part2_init::s1#2 part2_init::s1#1 ]
[ part2_init::s2#2 part2_init::s2#1 ]
[ part2_init::s#2 part2_init::s#1 ]
[ part2_init::sin_idx#2 part2_init::sin_idx#4 part2_init::sin_idx#1 ]
[ init_rasters::i#2 init_rasters::i#1 ]
[ init_rasters::b#2 init_rasters::b#1 ]
[ memset::num#5 ]
[ memset::str#6 ]
[ memset::c#7 ]
[ memset::dst#2 memset::dst#4 memset::dst#1 ]
[ memcpy::source#6 ]
[ memcpy::destination#6 ]
[ memcpy::num#6 ]
[ memcpy::src#2 memcpy::src#4 memcpy::src#1 ]
[ memcpy::dst#2 memcpy::dst#4 memcpy::dst#1 ]
[ plexPrepareInit::i#2 plexPrepareInit::i#1 ]
[ plexPrepareFrame::m#2 plexPrepareFrame::m#1 ]
[ plexPrepareFrame::i#2 plexPrepareFrame::i#1 ]
[ plexPrepareFrame::i1#2 plexPrepareFrame::i1#1 ]
[ plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::real_sprite_id#1 ]
[ plexPrepareFrame::bucket#3 plexPrepareFrame::bucket#10 plexPrepareFrame::bucket#9 plexPrepareFrame::sprite#2 ]
[ plexPrepareFrame::bucket_id#2 plexPrepareFrame::bucket_id#5 plexPrepareFrame::bucket_id#1 ]
[ plexPrepareFrame::sprite#4 plexPrepareFrame::sprite#3 plexPrepareFrame::frame#0 plexPrepareFrame::sprite#1 plexPrepareFrame::sprite#13 ]
[ plexPrepareFrame::bucket_ypos#4 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket_ypos#2 ]
[ plexPrepareFrame::s#3 plexPrepareFrame::s#1 plexPrepareFrame::s#6 ]
[ flipper_fix_colors::i#2 flipper_fix_colors::i#1 ]
Added variable p1_work_ready to live range equivalence class [ p1_work_ready ]
Added variable irq_flipper_top_line to live range equivalence class [ irq_flipper_top_line ]
Added variable irq_flipper_bottom_line to live range equivalence class [ irq_flipper_bottom_line ]
Added variable flipper_done to live range equivalence class [ flipper_done ]
Added variable irq_flipper_idx to live range equivalence class [ irq_flipper_idx ]
Added variable flipper_charline to live range equivalence class [ flipper_charline ]
Added variable vsp_scroll to live range equivalence class [ vsp_scroll ]
Added variable plex_real_sprite_idx to live range equivalence class [ plex_real_sprite_idx ]
Added variable p2_work_ready to live range equivalence class [ p2_work_ready ]
Added variable p2_logo_revealing to live range equivalence class [ p2_logo_revealing ]
Added variable p2_logo_reveal_done to live range equivalence class [ p2_logo_reveal_done ]
Added variable p2_logo_swinging to live range equivalence class [ p2_logo_swinging ]
Added variable p2_plex_scroller_moving to live range equivalence class [ p2_plex_scroller_moving ]
Added variable p2_logo_reveal_idx to live range equivalence class [ p2_logo_reveal_idx ]
Added variable x_movement_idx to live range equivalence class [ x_movement_idx ]
Added variable scroll_text_next to live range equivalence class [ scroll_text_next ]
Added variable plex_frame_id to live range equivalence class [ plex_frame_id ]
Added variable plex_frame to live range equivalence class [ plex_frame ]
Added variable plex_id_offset to live range equivalence class [ plex_id_offset ]
Added variable plex_bucket to live range equivalence class [ plex_bucket ]
Added variable plex_bucket_id to live range equivalence class [ plex_bucket_id ]
Added variable vsp_fine_scroll to live range equivalence class [ vsp_fine_scroll ]
Added variable vsp_coarse_scroll to live range equivalence class [ vsp_coarse_scroll ]
Added variable vsp_sin_idx to live range equivalence class [ vsp_sin_idx ]
Added variable sprite_color_idx to live range equivalence class [ sprite_color_idx ]
Added variable demo_frame_count to live range equivalence class [ demo_frame_count ]
Added variable sparkler_active to live range equivalence class [ sparkler_active ]
Added variable sparkler_idx to live range equivalence class [ sparkler_idx ]
Added variable irq_demo::port_value#0 to live range equivalence class [ irq_demo::port_value#0 ]
Added variable update_frame_plex_id_offset::plex_frame_id#0 to live range equivalence class [ update_frame_plex_id_offset::plex_frame_id#0 ]
Added variable irq_swing_plex::$27 to live range equivalence class [ irq_swing_plex::$27 ]
Added variable irq_swing_plex::$26 to live range equivalence class [ irq_swing_plex::$26 ]
Added variable irq_swing_plex::$31 to live range equivalence class [ irq_swing_plex::$31 ]
Added variable irq_swing_plex::scroll#0 to live range equivalence class [ irq_swing_plex::scroll#0 ]
Added variable irq_swing_plex::$28 to live range equivalence class [ irq_swing_plex::$28 ]
Added variable irq_swing_plex::$6 to live range equivalence class [ irq_swing_plex::$6 ]
Added variable irq_swing_plex::$7 to live range equivalence class [ irq_swing_plex::$7 ]
Added variable irq_swing_plex::new_coarse_scroll#0 to live range equivalence class [ irq_swing_plex::new_coarse_scroll#0 ]
Added variable irq_swing_plex::coarse_scroll_diff#0 to live range equivalence class [ irq_swing_plex::coarse_scroll_diff#0 ]
Added variable irq_swing_plex::x_offset#0 to live range equivalence class [ irq_swing_plex::x_offset#0 ]
Added variable vsp_update_screen::x_offset to live range equivalence class [ vsp_update_screen::x_offset ]
Added variable irq_swing_plex::$16 to live range equivalence class [ irq_swing_plex::$16 ]
Added variable irq_swing_plex::x_offset1#0 to live range equivalence class [ irq_swing_plex::x_offset1#0 ]
Added variable irq_swing_vsp::$1 to live range equivalence class [ irq_swing_vsp::$1 ]
Added variable irq_flipper_bottom::$0 to live range equivalence class [ irq_flipper_bottom::$0 ]
Added variable irq_flipper_bottom::$1 to live range equivalence class [ irq_flipper_bottom::$1 ]
Added variable raster_fine::line_offset to live range equivalence class [ raster_fine::line_offset ]
Added variable irq_flipper_bottom::$12 to live range equivalence class [ irq_flipper_bottom::$12 ]
Added variable irq_flipper_bottom::$14 to live range equivalence class [ irq_flipper_bottom::$14 ]
Added variable irq_flipper_bottom::irq_flipper_line#0 to live range equivalence class [ irq_flipper_bottom::irq_flipper_line#0 ]
Added variable irq_flipper_bottom::$7 to live range equivalence class [ irq_flipper_bottom::$7 ]
Added variable irq_flipper_bottom::$9 to live range equivalence class [ irq_flipper_bottom::$9 ]
Added variable irq_flipper_top::$0 to live range equivalence class [ irq_flipper_top::$0 ]
Added variable irq_flipper_top::$1 to live range equivalence class [ irq_flipper_top::$1 ]
Added variable irq_flipper_top::$3 to live range equivalence class [ irq_flipper_top::$3 ]
Added variable irq_flipper_top::$4 to live range equivalence class [ irq_flipper_top::$4 ]
Added variable irq_flipper_top::$5 to live range equivalence class [ irq_flipper_top::$5 ]
Added variable irq_part1_top::$2 to live range equivalence class [ irq_part1_top::$2 ]
Added variable irq_part1_top::$3 to live range equivalence class [ irq_part1_top::$3 ]
Added variable irq_part1_top::$4 to live range equivalence class [ irq_part1_top::$4 ]
Added variable byteboozer_decrunch::crunched to live range equivalence class [ byteboozer_decrunch::crunched ]
Added variable plexBucketShow::$1 to live range equivalence class [ plexBucketShow::$1 ]
Added variable plexBucketShow::i#1 to live range equivalence class [ plexBucketShow::i#1 ]
Added variable plexBucketShow::plex_id#0 to live range equivalence class [ plexBucketShow::plex_id#0 ]
Added variable plexBucketShow::real_idx#1 to live range equivalence class [ plexBucketShow::real_idx#1 ]
Added variable plexBucketShow::$2 to live range equivalence class [ plexBucketShow::$2 ]
Added variable plexBucketShow::real_idx#2 to live range equivalence class [ plexBucketShow::real_idx#2 ]
Added variable update_frame_plex_id_offset::$0 to live range equivalence class [ update_frame_plex_id_offset::$0 ]
Added variable update_frame_plex_id_offset::jmp_address to live range equivalence class [ update_frame_plex_id_offset::jmp_address ]
Added variable vsp_update_screen::$5 to live range equivalence class [ vsp_update_screen::$5 ]
Added variable vsp_update_screen::x_offset8 to live range equivalence class [ vsp_update_screen::x_offset8 ]
Added variable vsp_update_screen::$1 to live range equivalence class [ vsp_update_screen::$1 ]
Added variable vsp_update_screen::$3 to live range equivalence class [ vsp_update_screen::$3 ]
Added variable plex_scroller_move::$8 to live range equivalence class [ plex_scroller_move::$8 ]
Added variable sparkler_anim::$3 to live range equivalence class [ sparkler_anim::$3 ]
Added variable sparkler_anim::$4 to live range equivalence class [ sparkler_anim::$4 ]
Added variable init_rasters::$3 to live range equivalence class [ init_rasters::$3 ]
Added variable memset::end#0 to live range equivalence class [ memset::end#0 ]
Added variable memcpy::src_end#0 to live range equivalence class [ memcpy::src_end#0 ]
Added variable part1_loop::$11 to live range equivalence class [ part1_loop::$11 ]
Added variable plexPrepareFrame::bucket#1 to live range equivalence class [ plexPrepareFrame::bucket#1 ]
Added variable plexPrepareFrame::plex_id#0 to live range equivalence class [ plexPrepareFrame::plex_id#0 ]
Added variable plexPrepareFrame::ypos#0 to live range equivalence class [ plexPrepareFrame::ypos#0 ]
Added variable plexPrepareFrame::$16 to live range equivalence class [ plexPrepareFrame::$16 ]
Added variable plexPrepareFrame::$17 to live range equivalence class [ plexPrepareFrame::$17 ]
Added variable plexPrepareFrame::nxt_idx#0 to live range equivalence class [ plexPrepareFrame::nxt_idx#0 ]
Added variable plexPrepareFrame::nxt_y#0 to live range equivalence class [ plexPrepareFrame::nxt_y#0 ]
Added variable plexPrepareFrame::s#2 to live range equivalence class [ plexPrepareFrame::s#2 ]
Added variable part2_loop::$23 to live range equivalence class [ part2_loop::$23 ]
Added variable part2_loop::$24 to live range equivalence class [ part2_loop::$24 ]
Added variable flipper_fix_colors::$4 to live range equivalence class [ flipper_fix_colors::$4 ]
Added variable flipper_fix_colors::$5 to live range equivalence class [ flipper_fix_colors::$5 ]
Added variable flipper_fix_colors::charline#0 to live range equivalence class [ flipper_fix_colors::charline#0 ]
Added variable flipper_fix_colors::$12 to live range equivalence class [ flipper_fix_colors::$12 ]
Added variable flipper_fix_colors::$13 to live range equivalence class [ flipper_fix_colors::$13 ]
Added variable flipper_fix_colors::$14 to live range equivalence class [ flipper_fix_colors::$14 ]
Added variable flipper_fix_colors::offset#0 to live range equivalence class [ flipper_fix_colors::offset#0 ]
Added variable flipper_fix_colors::colors#0 to live range equivalence class [ flipper_fix_colors::colors#0 ]
Added variable flipper_fix_colors::happy_cols#0 to live range equivalence class [ flipper_fix_colors::happy_cols#0 ]
Complete equivalence classes
[ irq_swing_plex::s#2 irq_swing_plex::s#1 ]
[ plexBucketShow::bucket#2 plexBucketShow::bucket#1 plexBucketShow::bucket#0 ]
[ plexBucketShow::i#3 plexBucketShow::i#2 ]
[ plexBucketShow::real_idx#8 plexBucketShow::real_idx#4 plexBucketShow::real_idx#0 plexBucketShow::real_idx#3 ]
[ plex_scroller_move::s#10 plex_scroller_move::s#1 ]
[ plex_scroller_move::x_idx#10 plex_scroller_move::x_idx#0 plex_scroller_move::x_idx#1 ]
[ plex_scroller_move::letter#2 plex_scroller_move::letter#0 ]
[ part2_init::frame_idx#2 part2_init::frame_idx#1 ]
[ part2_init::frame#5 part2_init::frame#1 ]
[ part2_init::s1#2 part2_init::s1#1 ]
[ part2_init::s2#2 part2_init::s2#1 ]
[ part2_init::s#2 part2_init::s#1 ]
[ part2_init::sin_idx#2 part2_init::sin_idx#4 part2_init::sin_idx#1 ]
[ init_rasters::i#2 init_rasters::i#1 ]
[ init_rasters::b#2 init_rasters::b#1 ]
[ memset::num#5 ]
[ memset::str#6 ]
[ memset::c#7 ]
[ memset::dst#2 memset::dst#4 memset::dst#1 ]
[ memcpy::source#6 ]
[ memcpy::destination#6 ]
[ memcpy::num#6 ]
[ memcpy::src#2 memcpy::src#4 memcpy::src#1 ]
[ memcpy::dst#2 memcpy::dst#4 memcpy::dst#1 ]
[ plexPrepareInit::i#2 plexPrepareInit::i#1 ]
[ plexPrepareFrame::m#2 plexPrepareFrame::m#1 ]
[ plexPrepareFrame::i#2 plexPrepareFrame::i#1 ]
[ plexPrepareFrame::i1#2 plexPrepareFrame::i1#1 ]
[ plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::real_sprite_id#1 ]
[ plexPrepareFrame::bucket#3 plexPrepareFrame::bucket#10 plexPrepareFrame::bucket#9 plexPrepareFrame::sprite#2 ]
[ plexPrepareFrame::bucket_id#2 plexPrepareFrame::bucket_id#5 plexPrepareFrame::bucket_id#1 ]
[ plexPrepareFrame::sprite#4 plexPrepareFrame::sprite#3 plexPrepareFrame::frame#0 plexPrepareFrame::sprite#1 plexPrepareFrame::sprite#13 ]
[ plexPrepareFrame::bucket_ypos#4 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket_ypos#2 ]
[ plexPrepareFrame::s#3 plexPrepareFrame::s#1 plexPrepareFrame::s#6 ]
[ flipper_fix_colors::i#2 flipper_fix_colors::i#1 ]
[ p1_work_ready ]
[ irq_flipper_top_line ]
[ irq_flipper_bottom_line ]
[ flipper_done ]
[ irq_flipper_idx ]
[ flipper_charline ]
[ vsp_scroll ]
[ plex_real_sprite_idx ]
[ p2_work_ready ]
[ p2_logo_revealing ]
[ p2_logo_reveal_done ]
[ p2_logo_swinging ]
[ p2_plex_scroller_moving ]
[ p2_logo_reveal_idx ]
[ x_movement_idx ]
[ scroll_text_next ]
[ plex_frame_id ]
[ plex_frame ]
[ plex_id_offset ]
[ plex_bucket ]
[ plex_bucket_id ]
[ vsp_fine_scroll ]
[ vsp_coarse_scroll ]
[ vsp_sin_idx ]
[ sprite_color_idx ]
[ demo_frame_count ]
[ sparkler_active ]
[ sparkler_idx ]
[ irq_demo::port_value#0 ]
[ update_frame_plex_id_offset::plex_frame_id#0 ]
[ irq_swing_plex::$27 ]
[ irq_swing_plex::$26 ]
[ irq_swing_plex::$31 ]
[ irq_swing_plex::scroll#0 ]
[ irq_swing_plex::$28 ]
[ irq_swing_plex::$6 ]
[ irq_swing_plex::$7 ]
[ irq_swing_plex::new_coarse_scroll#0 ]
[ irq_swing_plex::coarse_scroll_diff#0 ]
[ irq_swing_plex::x_offset#0 ]
[ vsp_update_screen::x_offset ]
[ irq_swing_plex::$16 ]
[ irq_swing_plex::x_offset1#0 ]
[ irq_swing_vsp::$1 ]
[ irq_flipper_bottom::$0 ]
[ irq_flipper_bottom::$1 ]
[ raster_fine::line_offset ]
[ irq_flipper_bottom::$12 ]
[ irq_flipper_bottom::$14 ]
[ irq_flipper_bottom::irq_flipper_line#0 ]
[ irq_flipper_bottom::$7 ]
[ irq_flipper_bottom::$9 ]
[ irq_flipper_top::$0 ]
[ irq_flipper_top::$1 ]
[ irq_flipper_top::$3 ]
[ irq_flipper_top::$4 ]
[ irq_flipper_top::$5 ]
[ irq_part1_top::$2 ]
[ irq_part1_top::$3 ]
[ irq_part1_top::$4 ]
[ byteboozer_decrunch::crunched ]
[ plexBucketShow::$1 ]
[ plexBucketShow::i#1 ]
[ plexBucketShow::plex_id#0 ]
[ plexBucketShow::real_idx#1 ]
[ plexBucketShow::$2 ]
[ plexBucketShow::real_idx#2 ]
[ update_frame_plex_id_offset::$0 ]
[ update_frame_plex_id_offset::jmp_address ]
[ vsp_update_screen::$5 ]
[ vsp_update_screen::x_offset8 ]
[ vsp_update_screen::$1 ]
[ vsp_update_screen::$3 ]
[ plex_scroller_move::$8 ]
[ sparkler_anim::$3 ]
[ sparkler_anim::$4 ]
[ init_rasters::$3 ]
[ memset::end#0 ]
[ memcpy::src_end#0 ]
[ part1_loop::$11 ]
[ plexPrepareFrame::bucket#1 ]
[ plexPrepareFrame::plex_id#0 ]
[ plexPrepareFrame::ypos#0 ]
[ plexPrepareFrame::$16 ]
[ plexPrepareFrame::$17 ]
[ plexPrepareFrame::nxt_idx#0 ]
[ plexPrepareFrame::nxt_y#0 ]
[ plexPrepareFrame::s#2 ]
[ part2_loop::$23 ]
[ part2_loop::$24 ]
[ flipper_fix_colors::$4 ]
[ flipper_fix_colors::$5 ]
[ flipper_fix_colors::charline#0 ]
[ flipper_fix_colors::$12 ]
[ flipper_fix_colors::$13 ]
[ flipper_fix_colors::$14 ]
[ flipper_fix_colors::offset#0 ]
[ flipper_fix_colors::colors#0 ]
[ flipper_fix_colors::happy_cols#0 ]
Allocated zp[1]:2 [ irq_swing_plex::s#2 irq_swing_plex::s#1 ]
Allocated zp[2]:3 [ plexBucketShow::bucket#2 plexBucketShow::bucket#1 plexBucketShow::bucket#0 ]
Allocated zp[1]:5 [ plexBucketShow::i#3 plexBucketShow::i#2 ]
Allocated zp[1]:6 [ plexBucketShow::real_idx#8 plexBucketShow::real_idx#4 plexBucketShow::real_idx#0 plexBucketShow::real_idx#3 ]
Allocated zp[1]:7 [ plex_scroller_move::s#10 plex_scroller_move::s#1 ]
Allocated zp[1]:8 [ plex_scroller_move::x_idx#10 plex_scroller_move::x_idx#0 plex_scroller_move::x_idx#1 ]
Allocated zp[1]:9 [ plex_scroller_move::letter#2 plex_scroller_move::letter#0 ]
Allocated zp[1]:10 [ part2_init::frame_idx#2 part2_init::frame_idx#1 ]
Allocated zp[2]:11 [ part2_init::frame#5 part2_init::frame#1 ]
Allocated zp[1]:13 [ part2_init::s1#2 part2_init::s1#1 ]
Allocated zp[1]:14 [ part2_init::s2#2 part2_init::s2#1 ]
Allocated zp[1]:15 [ part2_init::s#2 part2_init::s#1 ]
Allocated zp[1]:16 [ part2_init::sin_idx#2 part2_init::sin_idx#4 part2_init::sin_idx#1 ]
Allocated zp[2]:17 [ init_rasters::i#2 init_rasters::i#1 ]
Allocated zp[1]:19 [ init_rasters::b#2 init_rasters::b#1 ]
Allocated zp[2]:20 [ memset::num#5 ]
Allocated zp[2]:22 [ memset::str#6 ]
Allocated zp[1]:24 [ memset::c#7 ]
Allocated zp[2]:25 [ memset::dst#2 memset::dst#4 memset::dst#1 ]
Allocated zp[2]:27 [ memcpy::source#6 ]
Allocated zp[2]:29 [ memcpy::destination#6 ]
Allocated zp[2]:31 [ memcpy::num#6 ]
Allocated zp[2]:33 [ memcpy::src#2 memcpy::src#4 memcpy::src#1 ]
Allocated zp[2]:35 [ memcpy::dst#2 memcpy::dst#4 memcpy::dst#1 ]
Allocated zp[1]:37 [ plexPrepareInit::i#2 plexPrepareInit::i#1 ]
Allocated zp[1]:38 [ plexPrepareFrame::m#2 plexPrepareFrame::m#1 ]
Allocated zp[1]:39 [ plexPrepareFrame::i#2 plexPrepareFrame::i#1 ]
Allocated zp[1]:40 [ plexPrepareFrame::i1#2 plexPrepareFrame::i1#1 ]
Allocated zp[1]:41 [ plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::real_sprite_id#1 ]
Allocated zp[2]:42 [ plexPrepareFrame::bucket#3 plexPrepareFrame::bucket#10 plexPrepareFrame::bucket#9 plexPrepareFrame::sprite#2 ]
Allocated zp[1]:44 [ plexPrepareFrame::bucket_id#2 plexPrepareFrame::bucket_id#5 plexPrepareFrame::bucket_id#1 ]
Allocated zp[2]:45 [ plexPrepareFrame::sprite#4 plexPrepareFrame::sprite#3 plexPrepareFrame::frame#0 plexPrepareFrame::sprite#1 plexPrepareFrame::sprite#13 ]
Allocated zp[1]:47 [ plexPrepareFrame::bucket_ypos#4 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket_ypos#2 ]
Allocated zp[1]:48 [ plexPrepareFrame::s#3 plexPrepareFrame::s#1 plexPrepareFrame::s#6 ]
Allocated zp[1]:49 [ flipper_fix_colors::i#2 flipper_fix_colors::i#1 ]
Allocated zp[1]:50 [ p1_work_ready ]
Allocated zp[2]:51 [ irq_flipper_top_line ]
Allocated zp[2]:53 [ irq_flipper_bottom_line ]
Allocated zp[1]:55 [ flipper_done ]
Allocated zp[2]:56 [ irq_flipper_idx ]
Allocated zp[1]:58 [ flipper_charline ]
Allocated zp[1]:59 [ vsp_scroll ]
Allocated zp[1]:60 [ plex_real_sprite_idx ]
Allocated zp[1]:61 [ p2_work_ready ]
Allocated zp[1]:62 [ p2_logo_revealing ]
Allocated zp[1]:63 [ p2_logo_reveal_done ]
Allocated zp[1]:64 [ p2_logo_swinging ]
Allocated zp[1]:65 [ p2_plex_scroller_moving ]
Allocated zp[1]:66 [ p2_logo_reveal_idx ]
Allocated zp[1]:67 [ x_movement_idx ]
Allocated zp[2]:68 [ scroll_text_next ]
Allocated zp[1]:70 [ plex_frame_id ]
Allocated zp[2]:71 [ plex_frame ]
Allocated zp[1]:73 [ plex_id_offset ]
Allocated zp[2]:74 [ plex_bucket ]
Allocated zp[1]:76 [ plex_bucket_id ]
Allocated zp[1]:77 [ vsp_fine_scroll ]
Allocated zp[1]:78 [ vsp_coarse_scroll ]
Allocated zp[1]:79 [ vsp_sin_idx ]
Allocated zp[1]:80 [ sprite_color_idx ]
Allocated zp[2]:81 [ demo_frame_count ]
Allocated zp[1]:83 [ sparkler_active ]
Allocated zp[1]:84 [ sparkler_idx ]
Allocated zp[1]:85 [ irq_demo::port_value#0 ]
Allocated zp[1]:86 [ update_frame_plex_id_offset::plex_frame_id#0 ]
Allocated zp[2]:87 [ irq_swing_plex::$27 ]
Allocated zp[2]:89 [ irq_swing_plex::$26 ]
Allocated zp[2]:91 [ irq_swing_plex::$31 ]
Allocated zp[2]:93 [ irq_swing_plex::scroll#0 ]
Allocated zp[1]:95 [ irq_swing_plex::$28 ]
Allocated zp[1]:96 [ irq_swing_plex::$6 ]
Allocated zp[2]:97 [ irq_swing_plex::$7 ]
Allocated zp[1]:99 [ irq_swing_plex::new_coarse_scroll#0 ]
Allocated zp[1]:100 [ irq_swing_plex::coarse_scroll_diff#0 ]
Allocated zp[1]:101 [ irq_swing_plex::x_offset#0 ]
Allocated zp[1]:102 [ vsp_update_screen::x_offset ]
Allocated zp[1]:103 [ irq_swing_plex::$16 ]
Allocated zp[1]:104 [ irq_swing_plex::x_offset1#0 ]
Allocated zp[1]:105 [ irq_swing_vsp::$1 ]
Allocated zp[1]:106 [ irq_flipper_bottom::$0 ]
Allocated zp[1]:107 [ irq_flipper_bottom::$1 ]
Allocated zp[1]:108 [ raster_fine::line_offset ]
Allocated zp[2]:109 [ irq_flipper_bottom::$12 ]
Allocated zp[2]:111 [ irq_flipper_bottom::$14 ]
Allocated zp[2]:113 [ irq_flipper_bottom::irq_flipper_line#0 ]
Allocated zp[2]:115 [ irq_flipper_bottom::$7 ]
Allocated zp[2]:117 [ irq_flipper_bottom::$9 ]
Allocated zp[1]:119 [ irq_flipper_top::$0 ]
Allocated zp[1]:120 [ irq_flipper_top::$1 ]
Allocated zp[1]:121 [ irq_flipper_top::$3 ]
Allocated zp[1]:122 [ irq_flipper_top::$4 ]
Allocated zp[1]:123 [ irq_flipper_top::$5 ]
Allocated zp[1]:124 [ irq_part1_top::$2 ]
Allocated zp[1]:125 [ irq_part1_top::$3 ]
Allocated zp[1]:126 [ irq_part1_top::$4 ]
Allocated zp[2]:127 [ byteboozer_decrunch::crunched ]
Allocated zp[1]:129 [ plexBucketShow::$1 ]
Allocated zp[1]:130 [ plexBucketShow::i#1 ]
Allocated zp[1]:131 [ plexBucketShow::plex_id#0 ]
Allocated zp[1]:132 [ plexBucketShow::real_idx#1 ]
Allocated zp[1]:133 [ plexBucketShow::$2 ]
Allocated zp[1]:134 [ plexBucketShow::real_idx#2 ]
Allocated zp[1]:135 [ update_frame_plex_id_offset::$0 ]
Allocated zp[2]:136 [ update_frame_plex_id_offset::jmp_address ]
Allocated zp[2]:138 [ vsp_update_screen::$5 ]
Allocated zp[2]:140 [ vsp_update_screen::x_offset8 ]
Allocated zp[1]:142 [ vsp_update_screen::$1 ]
Allocated zp[1]:143 [ vsp_update_screen::$3 ]
Allocated zp[1]:144 [ plex_scroller_move::$8 ]
Allocated zp[1]:145 [ sparkler_anim::$3 ]
Allocated zp[1]:146 [ sparkler_anim::$4 ]
Allocated zp[2]:147 [ init_rasters::$3 ]
Allocated zp[2]:149 [ memset::end#0 ]
Allocated zp[2]:151 [ memcpy::src_end#0 ]
Allocated zp[2]:153 [ part1_loop::$11 ]
Allocated zp[2]:155 [ plexPrepareFrame::bucket#1 ]
Allocated zp[1]:157 [ plexPrepareFrame::plex_id#0 ]
Allocated zp[1]:158 [ plexPrepareFrame::ypos#0 ]
Allocated zp[1]:159 [ plexPrepareFrame::$16 ]
Allocated zp[1]:160 [ plexPrepareFrame::$17 ]
Allocated zp[1]:161 [ plexPrepareFrame::nxt_idx#0 ]
Allocated zp[1]:162 [ plexPrepareFrame::nxt_y#0 ]
Allocated zp[1]:163 [ plexPrepareFrame::s#2 ]
Allocated zp[2]:164 [ part2_loop::$23 ]
Allocated zp[2]:166 [ part2_loop::$24 ]
Allocated zp[2]:168 [ flipper_fix_colors::$4 ]
Allocated zp[2]:170 [ flipper_fix_colors::$5 ]
Allocated zp[1]:172 [ flipper_fix_colors::charline#0 ]
Allocated zp[2]:173 [ flipper_fix_colors::$12 ]
Allocated zp[2]:175 [ flipper_fix_colors::$13 ]
Allocated zp[2]:177 [ flipper_fix_colors::$14 ]
Allocated zp[2]:179 [ flipper_fix_colors::offset#0 ]
Allocated zp[2]:181 [ flipper_fix_colors::colors#0 ]
Allocated zp[2]:183 [ flipper_fix_colors::happy_cols#0 ]
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [1] p1_work_ready = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [2] irq_flipper_top_line = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [3] irq_flipper_bottom_line = 8 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [4] flipper_done = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [5] irq_flipper_idx = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [6] flipper_charline = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [7] vsp_scroll = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [8] plex_real_sprite_idx = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [9] p2_work_ready = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [10] p2_logo_revealing = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [11] p2_logo_reveal_done = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [12] p2_logo_swinging = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [13] p2_plex_scroller_moving = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [14] p2_logo_reveal_idx = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [15] x_movement_idx = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [16] scroll_text_next = SCROLL_TEXT [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [17] plex_frame_id = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [18] plex_frame = BUCKET_SPRITES [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [19] plex_id_offset = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [20] plex_bucket = BUCKET_SPRITES [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [21] plex_bucket_id = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [22] vsp_fine_scroll = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [23] vsp_coarse_scroll = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [24] vsp_sin_idx = $40 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [25] sprite_color_idx = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [26] demo_frame_count = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [27] sparkler_active = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [28] sparkler_idx = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [32] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ demo_frame_count ] (  [ demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [34] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ demo_frame_count irq_demo::port_value#0 ] (  [ demo_frame_count irq_demo::port_value#0 ] { }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:85 [ irq_demo::port_value#0 ]
Statement [35] *PROCPORT = PROCPORT_RAM_IO [ demo_frame_count irq_demo::port_value#0 ] (  [ demo_frame_count irq_demo::port_value#0 ] { }  ) always clobbers reg byte a 
Statement [37] *IRQ_STATUS = IRQ_RASTER [ irq_demo::port_value#0 ] (  [ irq_demo::port_value#0 ] { }  ) always clobbers reg byte a 
Statement [38] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ irq_demo::port_value#0 ] (  [ irq_demo::port_value#0 ] { }  ) always clobbers reg byte a 
Statement [40] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [41] plexBucketShow::bucket#1 = plex_bucket [ plex_real_sprite_idx p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#1 ] (  [ plex_real_sprite_idx p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [43] plex_bucket = plex_bucket + 8*SIZEOF_STRUCT_BUCKETSPRITE [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [45] if(plex_bucket_id<9) goto irq_swing_plex::@1 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [46] *HARDWARE_IRQ = &irq_swing_top [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [47] *RASTER = *BUCKET_YPOS [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [48] plex_frame_id = plex_frame_id + irq_swing_plex::YMOVE [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a reg byte x 
Statement [49] plex_frame = plex_frame + (unsigned int)irq_swing_plex::YMOVE*9*8*SIZEOF_STRUCT_BUCKETSPRITE [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [50] if(plex_frame_id<8) goto irq_swing_plex::@5 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [51] plex_frame = plex_frame - (unsigned int)9*8*8*SIZEOF_STRUCT_BUCKETSPRITE [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [52] plex_frame_id = plex_frame_id - 8 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a reg byte x 
Statement [56] if(0==p2_logo_swinging) goto irq_swing_plex::@6 [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [57] irq_swing_plex::$27 = (unsigned int)vsp_sin_idx [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::$27 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::$27 ] { }  ) always clobbers reg byte a 
Statement [58] irq_swing_plex::$26 = irq_swing_plex::$27 << 1 [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::$26 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::$26 ] { }  ) always clobbers reg byte a 
Statement [59] irq_swing_plex::$31 = VSP_SINTABLE + irq_swing_plex::$26 [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::$31 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::$31 ] { }  ) always clobbers reg byte a 
Statement [60] irq_swing_plex::scroll#0 = *irq_swing_plex::$31 [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::scroll#0 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::scroll#0 ] { }  ) always clobbers reg byte a reg byte y 
Statement [65] irq_swing_plex::$7 = irq_swing_plex::scroll#0 >> 3 [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll sprite_color_idx irq_swing_plex::$7 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll sprite_color_idx irq_swing_plex::$7 ] { }  ) always clobbers reg byte a 
Statement [67] irq_swing_plex::coarse_scroll_diff#0 = vsp_coarse_scroll - irq_swing_plex::new_coarse_scroll#0 [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::coarse_scroll_diff#0 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::coarse_scroll_diff#0 ] { }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:99 [ irq_swing_plex::new_coarse_scroll#0 ]
Statement [70] irq_swing_plex::x_offset#0 = $27 - vsp_coarse_scroll [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 ] { { irq_swing_plex::x_offset#0 = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement [73] (PART2_SCREEN+(unsigned int)$18*$28)[irq_swing_plex::x_offset#0] = 0 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 ] { }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:101 [ irq_swing_plex::x_offset#0 ]
Statement [74] (COLS+(unsigned int)$18*$28)[irq_swing_plex::x_offset#0] = 0 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 ] { }  ) always clobbers reg byte a 
Statement [76] irq_swing_plex::$16 = $28 - vsp_coarse_scroll [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::$16 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::$16 ] { }  ) always clobbers reg byte a 
Statement [78] if(0==p2_plex_scroller_moving) goto irq_swing_plex::@9 [ x_movement_idx scroll_text_next sprite_color_idx ] (  [ x_movement_idx scroll_text_next sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [82] if(sprite_color_idx!=$30*SIZEOF_CHAR) goto irq_swing_plex::@10 [ sprite_color_idx ] (  [ sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [83] sprite_color_idx = 0 [ sprite_color_idx ] (  [ sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [86] p2_work_ready = 1 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [87] *IRQ_STATUS = IRQ_RASTER [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [88] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [89] SPRITES_COLOR[irq_swing_plex::s#2] = SPRITE_COLOR_SEQUENCE[sprite_color_idx] [ sprite_color_idx irq_swing_plex::s#2 ] (  [ sprite_color_idx irq_swing_plex::s#2 ] { }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:2 [ irq_swing_plex::s#2 irq_swing_plex::s#1 ]
Statement [91] irq_swing_plex::x_offset1#0 = $50 - vsp_coarse_scroll [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset1#0 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset1#0 ] { { irq_swing_plex::x_offset1#0 = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement [94] *HARDWARE_IRQ = &irq_swing_plex [ plex_bucket_id ] (  [ plex_bucket_id ] { }  ) always clobbers reg byte a 
Statement [95] *RASTER = BUCKET_YPOS[plex_bucket_id] [ ] (  [ ] { }  ) always clobbers reg byte a reg byte y 
Statement kickasm( uses vsp_scroll uses HARDWARE_IRQ uses RASTER uses IRQ_STATUS uses IRQ_RASTER uses VICII_CONTROL1) {{ // Stabilize the raster by using the double IRQ method
        // Acknowledge the IRQ
        lda #IRQ_RASTER
        sta IRQ_STATUS
        // Set-up IRQ for the next line
        inc RASTER
        // Point IRQ to almost stable code
        lda #<stable
        sta HARDWARE_IRQ
        lda #>stable
        sta HARDWARE_IRQ+1
        tsx       // Save stack pointer
        cli       // Reenable interrupts
        // Wait for new IRQ using NOP's to ensure minimal jitter when it hits
        .fill 15, NOP
        .align $100
    stable:
        txs             // Restore stack pointer
        ldx #9          // Wait till the raster has almost crossed to the next line (48 cycles)
        !: dex
        bne !-
        nop
        lda RASTER
        cmp RASTER
        bne !+          // And correct the last cycle of potential jitter
        !:
        // Raster is now completely stable! (Line $2f cycle 7)
        // Perform VSP by waiting an exact number of cycles and then enabling the display
        // See http://www.zimmers.net/cbmpics/cbm/c64/vic-ii.txt (Section 3.14.6. DMA delay)
        ldx #8          // Wait 45 cycles to get the VSP timing right
        !: dex
        bne !-
        nop
        nop
        lda vsp_scroll
        lsr         //  Put bit 0 into carry 
        bcc dma1    // Spend 2 or 3 cycles depending on the carry (bit 0)
    dma1:
        sta dma2+1  // Update the branch
        clv
    dma2:
        bvc dma2    // This branch is updated with vsp_scroll/2 - changing the number of NOP's executed
        // 20 NOP's - enabling vsp scroll from 0-40
        .fill 20, NOP
        ldx #$18
        lda #$1b  // TODO: To control Y-scrolling this must be flexible!
        // The STX $d011 must be line $30 cycle $10 for vsp_scroll==0
        stx VICII_CONTROL1 // Enable the display - starts DMA
        sta VICII_CONTROL1
     }} always clobbers reg byte a reg byte x 
Statement [98] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM [ vsp_fine_scroll ] (  [ vsp_fine_scroll ] { }  ) always clobbers reg byte a 
Statement [99] irq_swing_vsp::$1 = vsp_fine_scroll | VICII_MCM [ irq_swing_vsp::$1 ] (  [ irq_swing_vsp::$1 ] { }  ) always clobbers reg byte a 
Statement [101] *IRQ_STATUS = IRQ_RASTER [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [102] *HARDWARE_IRQ = &irq_swing_plex [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [103] *RASTER = *(BUCKET_YPOS+1) [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [104] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [107] plex_bucket = plex_frame [ plex_real_sprite_idx plex_bucket ] (  [ plex_real_sprite_idx plex_bucket ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [108] plex_bucket_id = 0 [ plex_real_sprite_idx plex_bucket plex_bucket_id ] (  [ plex_real_sprite_idx plex_bucket plex_bucket_id ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [109] plexBucketShow::bucket#0 = plex_bucket [ plex_real_sprite_idx plex_bucket plex_bucket_id plexBucketShow::bucket#0 ] (  [ plex_real_sprite_idx plex_bucket plex_bucket_id plexBucketShow::bucket#0 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [111] plex_bucket = plex_bucket + 8*SIZEOF_STRUCT_BUCKETSPRITE [ plex_bucket_id ] (  [ plex_bucket_id ] { }  ) always clobbers reg byte a 
Statement [113] *IRQ_STATUS = IRQ_RASTER [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [114] *HARDWARE_IRQ = &irq_swing_vsp [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [115] *RASTER = IRQ_SWING_VSP_LINE [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [116] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [123] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = LIGHT_BLUE [ flipper_done irq_flipper_idx ] (  [ flipper_done irq_flipper_idx ] { }  ) always clobbers reg byte a 
Statement [124] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLUE [ flipper_done irq_flipper_idx ] (  [ flipper_done irq_flipper_idx ] { }  ) always clobbers reg byte a 
Statement [126] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = irq_flipper_bottom::toD0181_return#0 [ flipper_done irq_flipper_idx ] (  [ flipper_done irq_flipper_idx ] { }  ) always clobbers reg byte a 
Statement [127] if(0!=flipper_done) goto irq_flipper_bottom::@1 [ irq_flipper_idx ] (  [ irq_flipper_idx ] { }  ) always clobbers reg byte a 
Statement [128] irq_flipper_bottom::$12 = irq_flipper_idx << 1 [ irq_flipper_idx irq_flipper_bottom::$12 ] (  [ irq_flipper_idx irq_flipper_bottom::$12 ] { }  ) always clobbers reg byte a 
Statement [129] irq_flipper_bottom::$14 = FLIPPER_EASING + irq_flipper_bottom::$12 [ irq_flipper_idx irq_flipper_bottom::$14 ] (  [ irq_flipper_idx irq_flipper_bottom::$14 ] { }  ) always clobbers reg byte a 
Statement [130] irq_flipper_bottom::irq_flipper_line#0 = *irq_flipper_bottom::$14 [ irq_flipper_idx irq_flipper_bottom::irq_flipper_line#0 ] (  [ irq_flipper_idx irq_flipper_bottom::irq_flipper_line#0 ] { }  ) always clobbers reg byte a reg byte y 
Statement [132] if(irq_flipper_bottom::irq_flipper_line#0<8) goto irq_flipper_bottom::@4 [ irq_flipper_bottom::irq_flipper_line#0 ] (  [ irq_flipper_bottom::irq_flipper_line#0 ] { }  ) always clobbers reg byte a 
Statement [133] irq_flipper_bottom::$7 = irq_flipper_bottom::irq_flipper_line#0 - 8 [ irq_flipper_bottom::irq_flipper_line#0 irq_flipper_bottom::$7 ] (  [ irq_flipper_bottom::irq_flipper_line#0 irq_flipper_bottom::$7 ] { }  ) always clobbers reg byte a 
Statement [134] irq_flipper_top_line = irq_flipper_bottom::$7 [ irq_flipper_bottom::irq_flipper_line#0 ] (  [ irq_flipper_bottom::irq_flipper_line#0 ] { }  ) always clobbers reg byte a 
Statement [135] if(irq_flipper_bottom::irq_flipper_line#0>$128) goto irq_flipper_bottom::@6 [ irq_flipper_bottom::irq_flipper_line#0 ] (  [ irq_flipper_bottom::irq_flipper_line#0 ] { }  ) always clobbers reg byte a 
Statement [136] irq_flipper_bottom::$9 = irq_flipper_bottom::irq_flipper_line#0 + 8 [ irq_flipper_bottom::irq_flipper_line#0 irq_flipper_bottom::$9 ] (  [ irq_flipper_bottom::irq_flipper_line#0 irq_flipper_bottom::$9 ] { }  ) always clobbers reg byte a 
Statement [137] irq_flipper_bottom_line = irq_flipper_bottom::$9 [ irq_flipper_bottom::irq_flipper_line#0 ] (  [ irq_flipper_bottom::irq_flipper_line#0 ] { }  ) always clobbers reg byte a 
Statement [138] if(irq_flipper_bottom::irq_flipper_line#0!=$130) goto irq_flipper_bottom::@1 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [139] flipper_done = 1 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [140] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [141] *RASTER = IRQ_PART1_TOP_LINE [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [142] *HARDWARE_IRQ = &irq_part1_top [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [143] *IRQ_STATUS = IRQ_RASTER [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [144] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [145] irq_flipper_bottom_line = $130 [ irq_flipper_bottom::irq_flipper_line#0 ] (  [ irq_flipper_bottom::irq_flipper_line#0 ] { }  ) always clobbers reg byte a 
Statement [146] irq_flipper_top_line = 0 [ irq_flipper_bottom::irq_flipper_line#0 ] (  [ irq_flipper_bottom::irq_flipper_line#0 ] { }  ) always clobbers reg byte a 
Statement asm { lda#$9a ldx#LIGHT_GREEN ldy#$1b staVICII_MEMORY stxBORDER_COLOR styVICII_CONTROL1 stxBG_COLOR lda#$c8 staVICII_CONTROL2  } always clobbers reg byte a reg byte x reg byte y 
Statement [155] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f [ irq_flipper_bottom_line ] (  [ irq_flipper_bottom_line ] { }  ) always clobbers reg byte a 
Statement [159] *HARDWARE_IRQ = &irq_flipper_bottom [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [160] *IRQ_STATUS = IRQ_RASTER [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [161] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [162] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 [ irq_flipper_bottom_line ] (  [ irq_flipper_bottom_line ] { }  ) always clobbers reg byte a 
Statement [163] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = BLACK [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [164] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLACK [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [165] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [166] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) | VICII_MCM [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [168] *((char *)CIA2) = irq_part1_top::toDd001_return#0 [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [170] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = irq_part1_top::toD0181_return#0 [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [173] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [177] *HARDWARE_IRQ = &irq_flipper_top [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [178] p1_work_ready = 1 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [179] *IRQ_STATUS = IRQ_RASTER [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [180] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [181] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [184] byteboozer_decrunch::crunched = DEMO_MUSIC_CRUNCHED [ byteboozer_decrunch::crunched ] ( main:30 [ byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement asm { lda#0  } always clobbers reg byte a 
Statement [187] callexecute *musicInit  [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] ( main:30 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [192] if(demo_frame_count<5*$32) goto main::@2 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] ( main:30 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [197] if(demo_frame_count<(unsigned int)$10*$32) goto main::@4 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [198] sparkler_active = 0 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [202] callexecute *musicPlay  [ demo_frame_count sparkler_active sparkler_idx ] ( demo_work:36 [ irq_demo::port_value#0 demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part1_run:194::part1_loop:339::demo_work:464 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part2_run:199::part2_loop:414::demo_work:525 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active sparkler_idx ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Removing always clobbered register reg byte x as potential for zp[1]:85 [ irq_demo::port_value#0 ]
Removing always clobbered register reg byte y as potential for zp[1]:85 [ irq_demo::port_value#0 ]
Statement [203] if(0==sparkler_active) goto demo_work::@return [ demo_frame_count sparkler_active sparkler_idx ] ( demo_work:36 [ irq_demo::port_value#0 demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part1_run:194::part1_loop:339::demo_work:464 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part2_run:199::part2_loop:414::demo_work:525 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active sparkler_idx ] { }  ) always clobbers reg byte a 
Statement [208] plexBucketShow::real_idx#0 = plex_real_sprite_idx << 1 [ plexBucketShow::bucket#2 plexBucketShow::real_idx#0 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::real_idx#0 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::real_idx#0 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [210] if(0!=((char *)plexBucketShow::bucket#2)[plexBucketShow::i#3]) goto plexBucketShow::@2 [ plexBucketShow::bucket#2 plexBucketShow::i#3 plexBucketShow::real_idx#4 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::i#3 plexBucketShow::real_idx#4 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::i#3 plexBucketShow::real_idx#4 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:5 [ plexBucketShow::i#3 plexBucketShow::i#2 ]
Removing always clobbered register reg byte a as potential for zp[1]:6 [ plexBucketShow::real_idx#8 plexBucketShow::real_idx#4 plexBucketShow::real_idx#0 plexBucketShow::real_idx#3 ]
Statement [212] plexBucketShow::$1 = plexBucketShow::real_idx#8 >> 1 [ plexBucketShow::$1 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::$1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::$1 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [215] SPRITES_YPOS[plexBucketShow::real_idx#4] = ((char *)plexBucketShow::bucket#2)[plexBucketShow::i#3] [ plexBucketShow::bucket#2 plexBucketShow::i#3 plexBucketShow::real_idx#4 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::i#3 plexBucketShow::real_idx#4 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::i#3 plexBucketShow::real_idx#4 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [217] plexBucketShow::plex_id#0 = ((char *)plexBucketShow::bucket#2)[plexBucketShow::i#1] [ plexBucketShow::bucket#2 plexBucketShow::real_idx#4 plexBucketShow::i#1 plexBucketShow::plex_id#0 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::real_idx#4 plexBucketShow::i#1 plexBucketShow::plex_id#0 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::real_idx#4 plexBucketShow::i#1 plexBucketShow::plex_id#0 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:130 [ plexBucketShow::i#1 ]
Statement [218] SPRITES_XPOS[plexBucketShow::real_idx#4] = PLEX_XPOS[plexBucketShow::plex_id#0] [ plexBucketShow::bucket#2 plexBucketShow::real_idx#4 plexBucketShow::i#1 plexBucketShow::plex_id#0 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::real_idx#4 plexBucketShow::i#1 plexBucketShow::plex_id#0 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::real_idx#4 plexBucketShow::i#1 plexBucketShow::plex_id#0 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:131 [ plexBucketShow::plex_id#0 ]
Statement [219] plexBucketShow::real_idx#1 = plexBucketShow::real_idx#4 >> 1 [ plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [220] if(0!=PLEX_XPOS_MSB[plexBucketShow::plex_id#0]) goto plexBucketShow::@3 [ plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:132 [ plexBucketShow::real_idx#1 ]
Statement [221] *SPRITES_XMSB = *SPRITES_XMSB & plexBucketShow::MSB_CLEAR_MASK_BY_ID[plexBucketShow::real_idx#1] [ plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [222] SCREEN_SPRITE_PTRS[plexBucketShow::real_idx#1] = PLEX_PTR[plexBucketShow::plex_id#0] [ plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::real_idx#1 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [225] plexBucketShow::real_idx#3 = plexBucketShow::real_idx#2 << 1 [ plexBucketShow::bucket#2 plexBucketShow::real_idx#3 plexBucketShow::i#1 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::real_idx#3 plexBucketShow::i#1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::real_idx#3 plexBucketShow::i#1 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [228] *SPRITES_XMSB = *SPRITES_XMSB | plexBucketShow::MSB_SET_MASK_BY_ID[plexBucketShow::real_idx#1] [ plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [229] update_frame_plex_id_offset::$0 = update_frame_plex_id_offset::plex_frame_id#0 << 1 [ update_frame_plex_id_offset::$0 ] ( update_frame_plex_id_offset:55 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx update_frame_plex_id_offset::$0 ] { { update_frame_plex_id_offset::plex_frame_id#0 = plex_frame_id } }  ) always clobbers reg byte a 
Statement [230] update_frame_plex_id_offset::jmp_address = update_frame_plex_id_offset::jmp_table[update_frame_plex_id_offset::$0] [ update_frame_plex_id_offset::jmp_address ] ( update_frame_plex_id_offset:55 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx update_frame_plex_id_offset::jmp_address ] { { update_frame_plex_id_offset::plex_frame_id#0 = plex_frame_id } }  ) always clobbers reg byte a 
Statement kickasm( uses vsp_update_screen::x_offset uses PART2_SCREEN uses COLS uses LOGO_DATA uses LOGO_DATA_COLORS) {{ ldx x_offset
        .for(var row=0;row<24;row++) {
            lda LOGO_DATA+80*row,x
            sta PART2_SCREEN+40*row,x
            lda LOGO_DATA_COLORS+80*row,x
            sta COLS+40*row,x
        }
     }} always clobbers reg byte a reg byte x 
Removing always clobbered register reg byte x as potential for zp[1]:99 [ irq_swing_plex::new_coarse_scroll#0 ]
Removing always clobbered register reg byte x as potential for zp[1]:101 [ irq_swing_plex::x_offset#0 ]
Statement [234] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ vsp_update_screen::x_offset ] ( vsp_update_screen:72 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 vsp_update_screen::x_offset ] { { irq_swing_plex::x_offset#0 = vsp_update_screen::x_offset } }  vsp_update_screen:93 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 vsp_update_screen::x_offset ] { { irq_swing_plex::x_offset1#0 = vsp_update_screen::x_offset } }  main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529::vsp_update_screen:562 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx vsp_update_screen::x_offset ] { { p2_logo_reveal_idx = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement [235] *PROCPORT = PROCPORT_RAM_ALL [ vsp_update_screen::x_offset ] ( vsp_update_screen:72 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 vsp_update_screen::x_offset ] { { irq_swing_plex::x_offset#0 = vsp_update_screen::x_offset } }  vsp_update_screen:93 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 vsp_update_screen::x_offset ] { { irq_swing_plex::x_offset1#0 = vsp_update_screen::x_offset } }  main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529::vsp_update_screen:562 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx vsp_update_screen::x_offset ] { { p2_logo_reveal_idx = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement [236] vsp_update_screen::$5 = (unsigned int)vsp_update_screen::x_offset [ vsp_update_screen::x_offset vsp_update_screen::$5 ] ( vsp_update_screen:72 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 vsp_update_screen::x_offset vsp_update_screen::$5 ] { { irq_swing_plex::x_offset#0 = vsp_update_screen::x_offset } }  vsp_update_screen:93 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 vsp_update_screen::x_offset vsp_update_screen::$5 ] { { irq_swing_plex::x_offset1#0 = vsp_update_screen::x_offset } }  main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529::vsp_update_screen:562 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx vsp_update_screen::x_offset vsp_update_screen::$5 ] { { p2_logo_reveal_idx = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement [237] vsp_update_screen::x_offset8 = vsp_update_screen::$5 << 3 [ vsp_update_screen::x_offset vsp_update_screen::x_offset8 ] ( vsp_update_screen:72 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 vsp_update_screen::x_offset vsp_update_screen::x_offset8 ] { { irq_swing_plex::x_offset#0 = vsp_update_screen::x_offset } }  vsp_update_screen:93 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 vsp_update_screen::x_offset vsp_update_screen::x_offset8 ] { { irq_swing_plex::x_offset1#0 = vsp_update_screen::x_offset } }  main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529::vsp_update_screen:562 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx vsp_update_screen::x_offset vsp_update_screen::x_offset8 ] { { p2_logo_reveal_idx = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+$200+row*40*8+pix,y
                }
         }} always clobbers reg byte a reg byte x reg byte y 
Removing always clobbered register reg byte y as potential for zp[1]:99 [ irq_swing_plex::new_coarse_scroll#0 ]
Removing always clobbered register reg byte y as potential for zp[1]:101 [ irq_swing_plex::x_offset#0 ]
Statement [243] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( vsp_update_screen:72 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 ] { { irq_swing_plex::x_offset#0 = vsp_update_screen::x_offset } }  vsp_update_screen:93 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 ] { { irq_swing_plex::x_offset1#0 = vsp_update_screen::x_offset } }  main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529::vsp_update_screen:562 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx ] { { p2_logo_reveal_idx = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement [244] *PROCPORT = PROCPORT_RAM_IO [ ] ( vsp_update_screen:72 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 ] { { irq_swing_plex::x_offset#0 = vsp_update_screen::x_offset } }  vsp_update_screen:93 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 ] { { irq_swing_plex::x_offset1#0 = vsp_update_screen::x_offset } }  main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529::vsp_update_screen:562 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx ] { { p2_logo_reveal_idx = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+$100+row*40*8+pix,y
                }
         }} always clobbers reg byte a reg byte x reg byte y 
Statement kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+row*40*8+pix,y
                }
         }} always clobbers reg byte a reg byte x reg byte y 
Statement [253] PLEX_XPOS[plex_scroller_move::s#10] = XMOVEMENT[plex_scroller_move::x_idx#10] [ x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] ( plex_scroller_move:80 [ sprite_color_idx x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] { }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:7 [ plex_scroller_move::s#10 plex_scroller_move::s#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:8 [ plex_scroller_move::x_idx#10 plex_scroller_move::x_idx#0 plex_scroller_move::x_idx#1 ]
Statement [254] PLEX_XPOS_MSB[plex_scroller_move::s#10] = XMOVEMENT_HI[plex_scroller_move::x_idx#10] [ x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] ( plex_scroller_move:80 [ sprite_color_idx x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] { }  ) always clobbers reg byte a 
Statement [256] if(*scroll_text_next!=0) goto plex_scroller_move::@5 [ x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] ( plex_scroller_move:80 [ sprite_color_idx x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] { }  ) always clobbers reg byte a reg byte y 
Removing always clobbered register reg byte y as potential for zp[1]:7 [ plex_scroller_move::s#10 plex_scroller_move::s#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:8 [ plex_scroller_move::x_idx#10 plex_scroller_move::x_idx#0 plex_scroller_move::x_idx#1 ]
Statement [257] scroll_text_next = SCROLL_TEXT [ x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] ( plex_scroller_move:80 [ sprite_color_idx x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] { }  ) always clobbers reg byte a 
Statement [258] plex_scroller_move::letter#0 = *scroll_text_next [ x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 plex_scroller_move::letter#0 ] ( plex_scroller_move:80 [ sprite_color_idx x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 plex_scroller_move::letter#0 ] { }  ) always clobbers reg byte a reg byte y 
Statement [266] plex_scroller_move::x_idx#1 = plex_scroller_move::x_idx#10 + 8 [ x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#1 ] ( plex_scroller_move:80 [ sprite_color_idx x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#1 ] { }  ) always clobbers reg byte a reg byte x 
Removing always clobbered register reg byte x as potential for zp[1]:7 [ plex_scroller_move::s#10 plex_scroller_move::s#1 ]
Statement [268] plex_real_sprite_idx = 0 [ plex_real_sprite_idx ] ( plexFrameStart:106 [ plex_frame plex_real_sprite_idx ] { }  ) always clobbers reg byte a 
Statement kickasm( uses raster_fine::line_offset uses RASTER_BADLINES) {{ jmp aligned
        .align $100
    aligned:
        ldy RASTER
        ldx line_offset
        inx
    rst:
        nop 
        nop 
        nop 
        nop
        dex                             // 2
        beq done                        // 2
        lda RASTER_BADLINES,y           // 4
        beq notbad                      // 3
    bad:
        nop                             // 2
        nop 
        nop 
        nop 
        nop
        dex                             
        beq done                        
        iny                             
        nop                             
        bit $ea                         
    notbad:
        .fill 18, NOP
        bit $ea
        iny                             
        jmp rst                         
    done:
     }} always clobbers reg byte a reg byte x reg byte y 
Statement [274] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:30::demo_init:183 [ ] { }  main:30::demo_start:189::demo_init:283 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467::demo_init:283 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [275] *PROCPORT = PROCPORT_RAM_IO [ ] ( main:30::demo_init:183 [ ] { }  main:30::demo_start:189::demo_init:283 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467::demo_init:283 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [276] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR [ ] ( main:30::demo_init:183 [ ] { }  main:30::demo_start:189::demo_init:283 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467::demo_init:283 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement asm { ldaCIA1_INTERRUPT  } always clobbers reg byte a 
Statement [278] *IRQ_STATUS = $f [ ] ( main:30::demo_init:183 [ ] { }  main:30::demo_start:189::demo_init:283 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467::demo_init:283 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement asm { ldycrunched ldxcrunched+1 jsrb2.Decrunch  } always clobbers reg byte a reg byte x reg byte y 
Statement [284] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f [ ] ( main:30::demo_start:189 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [285] *RASTER = 0 [ ] ( main:30::demo_start:189 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [286] *HARDWARE_IRQ = &irq_demo [ ] ( main:30::demo_start:189 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [287] *IRQ_ENABLE = IRQ_RASTER [ ] ( main:30::demo_start:189 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [290] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [291] *PROCPORT = PROCPORT_RAM_ALL [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [292] byteboozer_decrunch::crunched = P1_PIXELS_CRUNCHED [ byteboozer_decrunch::crunched ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [294] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [295] *PROCPORT = PROCPORT_RAM_IO [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [296] byteboozer_decrunch::crunched = P1_SCREEN_CRUNCHED [ byteboozer_decrunch::crunched ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [298] byteboozer_decrunch::crunched = P1_COLORS_CRUNCHED [ byteboozer_decrunch::crunched ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [300] byteboozer_decrunch::crunched = P1_SPRITES_CRUNCHED [ byteboozer_decrunch::crunched ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [302] byteboozer_decrunch::crunched = FLIPPER_EASING_CRUNCHED [ byteboozer_decrunch::crunched ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [308] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [309] *PROCPORT = PROCPORT_RAM_CHARROM [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [311] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [312] *PROCPORT = PROCPORT_RAM_IO [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [319] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [320] *PROCPORT = PROCPORT_RAM_IO [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [321] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement asm { ldaCIA1_INTERRUPT  } always clobbers reg byte a 
Statement [323] *IRQ_STATUS = $f [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [324] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [325] *RASTER = IRQ_PART1_TOP_LINE [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [326] *HARDWARE_IRQ = &irq_part1_top [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [327] *IRQ_ENABLE = IRQ_RASTER [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [328] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = 1 [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [329] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR) = PINK [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [330] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1) = YELLOW [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [331] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2) = PURPLE [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [332] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = 1 [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [333] *((char *)VICII) = $16 [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [334] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_Y) = $be [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [336] *P1_SCREEN_SPRITE_PTRS = part1_run::toSpritePtr1_return#0 [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [341] byteboozer_decrunch::crunched = SPRITES_CRUNCHED [ byteboozer_decrunch::crunched ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [347] byteboozer_decrunch::crunched = PLEX_ID_UPDATERS_CRUNCHED2 [ byteboozer_decrunch::crunched ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [349] byteboozer_decrunch::crunched = LOGO_DATA_CRUNCHED2 [ byteboozer_decrunch::crunched ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [351] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [352] *PROCPORT = PROCPORT_RAM_ALL [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [354] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [355] *PROCPORT = PROCPORT_RAM_IO [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [359] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR) = GREY [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [360] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1) = BROWN [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [361] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2) = BLUE [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [369] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = 0 [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [370] *((char *)VICII) = 0 [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [371] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 0 [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [372] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = 0 [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [378] SPRITES_COLOR[part2_init::s2#2] = WHITE [ part2_init::s2#2 ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::s2#2 ] { }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:14 [ part2_init::s2#2 part2_init::s2#1 ]
Statement [381] PLEX_PTR[part2_init::s1#2] = part2_init::toSpritePtr1_return#0+' ' [ part2_init::s1#2 ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::s1#2 ] { }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:13 [ part2_init::s1#2 part2_init::s1#1 ]
Statement [386] plexPrepareFrame::frame#0 = part2_init::frame#5 [ part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::frame#0 ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::frame#0 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:10 [ part2_init::frame_idx#2 part2_init::frame_idx#1 ]
Statement [388] part2_init::frame#1 = part2_init::frame#5 + 8*9*SIZEOF_STRUCT_BUCKETSPRITE [ part2_init::frame_idx#2 part2_init::frame#1 ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#1 ] { }  ) always clobbers reg byte a 
Statement [390] PLEX_YPOS[part2_init::s#2] = SCROLL_YSIN[part2_init::sin_idx#2] [ part2_init::frame_idx#2 part2_init::frame#5 part2_init::s#2 part2_init::sin_idx#2 ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 part2_init::s#2 part2_init::sin_idx#2 ] { }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:15 [ part2_init::s#2 part2_init::s#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:16 [ part2_init::sin_idx#2 part2_init::sin_idx#4 part2_init::sin_idx#1 ]
Statement [391] part2_init::sin_idx#1 = part2_init::sin_idx#2 + 8 [ part2_init::frame_idx#2 part2_init::frame#5 part2_init::s#2 part2_init::sin_idx#1 ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 part2_init::s#2 part2_init::sin_idx#1 ] { }  ) always clobbers reg byte a 
Statement [395] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = BLACK [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [396] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLACK [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [398] *((char *)CIA2) = part2_run::toDd001_return#0 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [400] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = part2_run::toD0181_return#0 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [401] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [402] *SPRITES_ENABLE = $ff [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [403] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement asm { ldaCIA1_INTERRUPT  } always clobbers reg byte a 
Statement [405] *IRQ_STATUS = $f [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [406] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [407] *RASTER = *BUCKET_YPOS [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [408] *IRQ_ENABLE = IRQ_RASTER [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [409] *HARDWARE_IRQ = &irq_swing_top [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [411] plex_frame_id = 0 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [412] plex_frame = BUCKET_SPRITES [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [413] plex_id_offset = 0 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [417] if(sparkler_idx!=$1e) goto sparkler_anim::toSpritePtr1 [ sparkler_idx ] ( demo_work:36::sparkler_anim:205 [ irq_demo::port_value#0 demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part1_run:194::part1_loop:339::demo_work:464::sparkler_anim:205 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part2_run:199::part2_loop:414::demo_work:525::sparkler_anim:205 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active sparkler_idx ] { }  ) always clobbers reg byte a 
Statement [418] sparkler_idx = 0 [ sparkler_idx ] ( demo_work:36::sparkler_anim:205 [ irq_demo::port_value#0 demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part1_run:194::part1_loop:339::demo_work:464::sparkler_anim:205 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part2_run:199::part2_loop:414::demo_work:525::sparkler_anim:205 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active sparkler_idx ] { }  ) always clobbers reg byte a 
Statement [420] sparkler_anim::$3 = sparkler_idx >> 1 [ sparkler_anim::$3 ] ( demo_work:36::sparkler_anim:205 [ irq_demo::port_value#0 demo_frame_count sparkler_active sparkler_anim::$3 ] { }  main:30::part1_run:194::part1_loop:339::demo_work:464::sparkler_anim:205 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active sparkler_anim::$3 ] { }  main:30::part2_run:199::part2_loop:414::demo_work:525::sparkler_anim:205 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active sparkler_anim::$3 ] { }  ) always clobbers reg byte a 
Statement [426] if(init_rasters::i#2<$130*SIZEOF_CHAR) goto init_rasters::@2 [ init_rasters::i#2 ] ( main:30::part1_init:191::init_rasters:305 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active init_rasters::i#2 ] { }  ) always clobbers reg byte a 
Statement [430] RASTER_BADLINES[init_rasters::b#2] = 1 [ init_rasters::b#2 ] ( main:30::part1_init:191::init_rasters:305 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active init_rasters::b#2 ] { }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:19 [ init_rasters::b#2 init_rasters::b#1 ]
Statement [431] init_rasters::b#1 = init_rasters::b#2 + 8 [ init_rasters::b#1 ] ( main:30::part1_init:191::init_rasters:305 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active init_rasters::b#1 ] { }  ) always clobbers reg byte a 
Statement [432] init_rasters::$3 = RASTER_BADLINES + init_rasters::i#2 [ init_rasters::i#2 init_rasters::$3 ] ( main:30::part1_init:191::init_rasters:305 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active init_rasters::i#2 init_rasters::$3 ] { }  ) always clobbers reg byte a 
Statement [433] *init_rasters::$3 = 0 [ init_rasters::i#2 ] ( main:30::part1_init:191::init_rasters:305 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active init_rasters::i#2 ] { }  ) always clobbers reg byte a reg byte y 
Statement [436] if(memset::num#5<=0) goto memset::@return [ memset::num#5 memset::str#6 memset::c#7 ] ( main:30::part1_init:191::memset:307 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memset::num#5 memset::str#6 memset::c#7 ] { }  main:30::part2_init:196::memset:353 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::num#5 memset::str#6 memset::c#7 ] { }  main:30::part2_init:196::memset:356 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::num#5 memset::str#6 memset::c#7 ] { }  main:30::part2_init:196::memset:358 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::num#5 memset::str#6 memset::c#7 ] { }  main:30::part2_init:196::memset:376 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::num#5 memset::str#6 memset::c#7 ] { }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:24 [ memset::c#7 ]
Statement [437] memset::end#0 = (char *)memset::str#6 + memset::num#5 [ memset::str#6 memset::c#7 memset::end#0 ] ( main:30::part1_init:191::memset:307 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memset::str#6 memset::c#7 memset::end#0 ] { }  main:30::part2_init:196::memset:353 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::str#6 memset::c#7 memset::end#0 ] { }  main:30::part2_init:196::memset:356 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::str#6 memset::c#7 memset::end#0 ] { }  main:30::part2_init:196::memset:358 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::str#6 memset::c#7 memset::end#0 ] { }  main:30::part2_init:196::memset:376 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::str#6 memset::c#7 memset::end#0 ] { }  ) always clobbers reg byte a 
Statement [438] memset::dst#4 = (char *)memset::str#6 [ memset::c#7 memset::end#0 memset::dst#4 ] ( main:30::part1_init:191::memset:307 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memset::c#7 memset::end#0 memset::dst#4 ] { }  main:30::part2_init:196::memset:353 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#4 ] { }  main:30::part2_init:196::memset:356 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#4 ] { }  main:30::part2_init:196::memset:358 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#4 ] { }  main:30::part2_init:196::memset:376 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#4 ] { }  ) always clobbers reg byte a 
Statement [440] if(memset::dst#2!=memset::end#0) goto memset::@3 [ memset::c#7 memset::end#0 memset::dst#2 ] ( main:30::part1_init:191::memset:307 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:353 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:356 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:358 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:376 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  ) always clobbers reg byte a 
Statement [442] *memset::dst#2 = memset::c#7 [ memset::c#7 memset::end#0 memset::dst#2 ] ( main:30::part1_init:191::memset:307 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:353 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:356 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:358 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:376 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  ) always clobbers reg byte a reg byte y 
Removing always clobbered register reg byte y as potential for zp[1]:24 [ memset::c#7 ]
Statement [445] memcpy::src_end#0 = (char *)memcpy::source#6 + memcpy::num#6 [ memcpy::source#6 memcpy::destination#6 memcpy::src_end#0 ] ( main:30::part1_init:191::memcpy:310 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::source#6 memcpy::destination#6 memcpy::src_end#0 ] { }  main:30::part1_init:191::memcpy:313 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::source#6 memcpy::destination#6 memcpy::src_end#0 ] { }  main:30::part1_init:191::memcpy:315 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::source#6 memcpy::destination#6 memcpy::src_end#0 ] { }  main:30::part2_init:196::memcpy:344 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::source#6 memcpy::destination#6 memcpy::src_end#0 ] { }  main:30::part2_init:196::memcpy:346 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::source#6 memcpy::destination#6 memcpy::src_end#0 ] { }  main:30::part2_init:196::memcpy:366 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::source#6 memcpy::destination#6 memcpy::src_end#0 ] { }  ) always clobbers reg byte a 
Statement [446] memcpy::src#4 = (char *)memcpy::source#6 [ memcpy::destination#6 memcpy::src_end#0 memcpy::src#4 ] ( main:30::part1_init:191::memcpy:310 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::destination#6 memcpy::src_end#0 memcpy::src#4 ] { }  main:30::part1_init:191::memcpy:313 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::destination#6 memcpy::src_end#0 memcpy::src#4 ] { }  main:30::part1_init:191::memcpy:315 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::destination#6 memcpy::src_end#0 memcpy::src#4 ] { }  main:30::part2_init:196::memcpy:344 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::destination#6 memcpy::src_end#0 memcpy::src#4 ] { }  main:30::part2_init:196::memcpy:346 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::destination#6 memcpy::src_end#0 memcpy::src#4 ] { }  main:30::part2_init:196::memcpy:366 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::destination#6 memcpy::src_end#0 memcpy::src#4 ] { }  ) always clobbers reg byte a 
Statement [447] memcpy::dst#4 = (char *)memcpy::destination#6 [ memcpy::src_end#0 memcpy::src#4 memcpy::dst#4 ] ( main:30::part1_init:191::memcpy:310 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#4 memcpy::dst#4 ] { }  main:30::part1_init:191::memcpy:313 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#4 memcpy::dst#4 ] { }  main:30::part1_init:191::memcpy:315 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#4 memcpy::dst#4 ] { }  main:30::part2_init:196::memcpy:344 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#4 memcpy::dst#4 ] { }  main:30::part2_init:196::memcpy:346 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#4 memcpy::dst#4 ] { }  main:30::part2_init:196::memcpy:366 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#4 memcpy::dst#4 ] { }  ) always clobbers reg byte a 
Statement [449] if(memcpy::src#2!=memcpy::src_end#0) goto memcpy::@2 [ memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] ( main:30::part1_init:191::memcpy:310 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part1_init:191::memcpy:313 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part1_init:191::memcpy:315 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part2_init:196::memcpy:344 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part2_init:196::memcpy:346 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part2_init:196::memcpy:366 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  ) always clobbers reg byte a 
Statement [451] *memcpy::dst#2 = *memcpy::src#2 [ memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] ( main:30::part1_init:191::memcpy:310 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part1_init:191::memcpy:313 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part1_init:191::memcpy:315 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part2_init:196::memcpy:344 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part2_init:196::memcpy:346 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part2_init:196::memcpy:366 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  ) always clobbers reg byte a reg byte y 
Statement [454] p1_work_ready = 0 [ p1_work_ready irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx p1_work_ready irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [455] if(p1_work_ready==0) goto part1_loop::@1 [ p1_work_ready irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx p1_work_ready irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [458] part1_loop::$11 = demo_frame_count [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active part1_loop::$11 ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active part1_loop::$11 ] { }  ) always clobbers reg byte a 
Statement [459] if(0!=sparkler_active) goto part1_loop::@4 [ irq_flipper_top_line flipper_charline demo_frame_count part1_loop::$11 ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count part1_loop::$11 ] { }  ) always clobbers reg byte a 
Statement [460] if(part1_loop::$11<=(unsigned int)9*$32-3) goto part1_loop::@4 [ irq_flipper_top_line flipper_charline demo_frame_count ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [461] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 1 [ irq_flipper_top_line flipper_charline demo_frame_count ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [462] sparkler_active = 1 [ irq_flipper_top_line flipper_charline demo_frame_count ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [465] if(demo_frame_count<=(unsigned int)$e*$32) goto part1_loop::@5 [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [469] p1_work_ready = 0 [ p1_work_ready irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx p1_work_ready irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [482] plexPrepareFrame::bucket#10 = plexPrepareFrame::frame#0 [ plexPrepareFrame::frame#0 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket#10 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::frame#0 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket#10 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:47 [ plexPrepareFrame::bucket_ypos#4 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket_ypos#2 ]
Statement [485] plexPrepareFrame::bucket#1 = plexPrepareFrame::bucket#3 + 8*SIZEOF_STRUCT_BUCKETSPRITE [ plexPrepareFrame::sprite#3 plexPrepareFrame::bucket#1 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::sprite#3 plexPrepareFrame::bucket#1 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [486] if(plexPrepareFrame::sprite#3==plexPrepareFrame::bucket#1) goto plexPrepareFrame::@return [ plexPrepareFrame::sprite#3 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::sprite#3 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [487] *((char *)plexPrepareFrame::sprite#3) = 0 [ ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a reg byte y 
Removing always clobbered register reg byte y as potential for zp[1]:10 [ part2_init::frame_idx#2 part2_init::frame_idx#1 ]
Statement [491] if(plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::real_sprite_id#2]<=plexPrepareFrame::bucket_ypos#3) goto plexPrepareFrame::@13 [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket#3 plexPrepareFrame::sprite#3 plexPrepareFrame::bucket_id#2 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket#3 plexPrepareFrame::sprite#3 plexPrepareFrame::bucket_id#2 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:40 [ plexPrepareFrame::i1#2 plexPrepareFrame::i1#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:41 [ plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::real_sprite_id#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:44 [ plexPrepareFrame::bucket_id#2 plexPrepareFrame::bucket_id#5 plexPrepareFrame::bucket_id#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:157 [ plexPrepareFrame::plex_id#0 ]
Removing always clobbered register reg byte a as potential for zp[1]:158 [ plexPrepareFrame::ypos#0 ]
Statement [494] plexPrepareFrame::sprite#2 = plexPrepareFrame::bucket#3 + 8*SIZEOF_STRUCT_BUCKETSPRITE [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::sprite#3 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::sprite#3 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [495] if(plexPrepareFrame::sprite#3==plexPrepareFrame::sprite#2) goto plexPrepareFrame::@14 [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::sprite#3 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::sprite#3 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [496] *((char *)plexPrepareFrame::sprite#3) = 0 [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a reg byte y 
Removing always clobbered register reg byte y as potential for zp[1]:40 [ plexPrepareFrame::i1#2 plexPrepareFrame::i1#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:41 [ plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::real_sprite_id#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:157 [ plexPrepareFrame::plex_id#0 ]
Removing always clobbered register reg byte y as potential for zp[1]:158 [ plexPrepareFrame::ypos#0 ]
Removing always clobbered register reg byte y as potential for zp[1]:44 [ plexPrepareFrame::bucket_id#2 plexPrepareFrame::bucket_id#5 plexPrepareFrame::bucket_id#1 ]
Removing always clobbered register reg byte y as potential for zp[1]:47 [ plexPrepareFrame::bucket_ypos#4 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket_ypos#2 ]
Statement [497] plexPrepareFrame::sprite#13 = plexPrepareFrame::sprite#2 [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 plexPrepareFrame::sprite#13 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 plexPrepareFrame::sprite#13 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [499] *((char *)plexPrepareFrame::sprite#4) = plexPrepareFrame::ypos#0 [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket#9 plexPrepareFrame::bucket_id#5 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::sprite#4 plexPrepareFrame::bucket_ypos#4 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket#9 plexPrepareFrame::bucket_id#5 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::sprite#4 plexPrepareFrame::bucket_ypos#4 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a reg byte y 
Statement [500] ((char *)plexPrepareFrame::sprite#4)[OFFSET_STRUCT_BUCKETSPRITE_PLEX_ID] = plexPrepareFrame::plex_id#0 [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket#9 plexPrepareFrame::bucket_id#5 plexPrepareFrame::ypos#0 plexPrepareFrame::sprite#4 plexPrepareFrame::bucket_ypos#4 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket#9 plexPrepareFrame::bucket_id#5 plexPrepareFrame::ypos#0 plexPrepareFrame::sprite#4 plexPrepareFrame::bucket_ypos#4 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a reg byte y 
Statement [502] plexPrepareFrame::$16 = plexPrepareFrame::ypos#0 + $16 [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket#9 plexPrepareFrame::bucket_id#5 plexPrepareFrame::sprite#4 plexPrepareFrame::$16 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket#9 plexPrepareFrame::bucket_id#5 plexPrepareFrame::sprite#4 plexPrepareFrame::$16 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [506] plexPrepareFrame::sprite#1 = plexPrepareFrame::sprite#4 + SIZEOF_STRUCT_BUCKETSPRITE [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#1 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket#9 plexPrepareFrame::sprite#1 plexPrepareFrame::bucket_id#5 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#1 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket#9 plexPrepareFrame::sprite#1 plexPrepareFrame::bucket_id#5 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [508] plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::i#2] = *BUCKET_YPOS [ plexPrepareFrame::frame#0 plexPrepareFrame::i#2 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::frame#0 plexPrepareFrame::i#2 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:39 [ plexPrepareFrame::i#2 plexPrepareFrame::i#1 ]
Statement [515] (PLEX_SORTED_IDX+1)[plexPrepareFrame::s#3] = PLEX_SORTED_IDX[plexPrepareFrame::s#3] [ plexPrepareFrame::frame#0 plexPrepareFrame::m#2 plexPrepareFrame::nxt_idx#0 plexPrepareFrame::nxt_y#0 plexPrepareFrame::s#3 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::frame#0 plexPrepareFrame::m#2 plexPrepareFrame::nxt_idx#0 plexPrepareFrame::nxt_y#0 plexPrepareFrame::s#3 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:38 [ plexPrepareFrame::m#2 plexPrepareFrame::m#1 ]
Removing always clobbered register reg byte a as potential for zp[1]:161 [ plexPrepareFrame::nxt_idx#0 ]
Removing always clobbered register reg byte a as potential for zp[1]:162 [ plexPrepareFrame::nxt_y#0 ]
Removing always clobbered register reg byte a as potential for zp[1]:48 [ plexPrepareFrame::s#3 plexPrepareFrame::s#1 plexPrepareFrame::s#6 ]
Statement [518] if(plexPrepareFrame::nxt_y#0<PLEX_YPOS[PLEX_SORTED_IDX[plexPrepareFrame::s#1]]) goto plexPrepareFrame::@4 [ plexPrepareFrame::frame#0 plexPrepareFrame::m#2 plexPrepareFrame::nxt_idx#0 plexPrepareFrame::nxt_y#0 plexPrepareFrame::s#1 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::frame#0 plexPrepareFrame::m#2 plexPrepareFrame::nxt_idx#0 plexPrepareFrame::nxt_y#0 plexPrepareFrame::s#1 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [520] PLEX_SORTED_IDX[plexPrepareFrame::s#2] = plexPrepareFrame::nxt_idx#0 [ plexPrepareFrame::frame#0 plexPrepareFrame::m#2 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::frame#0 plexPrepareFrame::m#2 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [522] p2_work_ready = 0 [ p2_work_ready p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_work_ready p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [523] if(p2_work_ready==0) goto part2_loop::@1 [ p2_work_ready p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_work_ready p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [526] if(0==p2_logo_revealing) goto part2_loop::@4 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [527] if(0==p2_logo_reveal_done) goto part2_loop::@3 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [530] part2_loop::$23 = demo_frame_count [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$23 ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$23 ] { }  ) always clobbers reg byte a 
Statement [531] if(0!=p2_logo_revealing) goto part2_loop::@5 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$23 ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$23 ] { }  ) always clobbers reg byte a 
Statement [532] if(part2_loop::$23<=(unsigned int)$12*$32+$19) goto part2_loop::@5 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [533] p2_logo_revealing = 1 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [534] if(0!=p2_logo_swinging) goto part2_loop::@6 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [535] if(0==p2_logo_reveal_done) goto part2_loop::@6 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [536] p2_logo_swinging = 1 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [537] part2_loop::$24 = demo_frame_count [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$24 ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$24 ] { }  ) always clobbers reg byte a 
Statement [538] if(0!=p2_plex_scroller_moving) goto part2_loop::@7 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$24 ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$24 ] { }  ) always clobbers reg byte a 
Statement [539] if(part2_loop::$24<=(unsigned int)$1a*$32) goto part2_loop::@7 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [540] p2_plex_scroller_moving = 1 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [541] p2_work_ready = 0 [ p2_work_ready p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_work_ready p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [542] if(irq_flipper_top_line<$2e+1) goto flipper_fix_colors::@return [ irq_flipper_top_line flipper_charline ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline ] { }  ) always clobbers reg byte a 
Statement [543] if(irq_flipper_top_line<$f6) goto flipper_fix_colors::@1 [ irq_flipper_top_line flipper_charline ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline ] { }  ) always clobbers reg byte a 
Statement [545] flipper_fix_colors::$4 = irq_flipper_top_line - $2e [ irq_flipper_top_line flipper_charline flipper_fix_colors::$4 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::$4 ] { }  ) always clobbers reg byte a 
Statement [546] flipper_fix_colors::$5 = flipper_fix_colors::$4 >> 3 [ irq_flipper_top_line flipper_charline flipper_fix_colors::$5 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::$5 ] { }  ) always clobbers reg byte a 
Statement [549] flipper_fix_colors::$12 = (unsigned int)flipper_charline [ irq_flipper_top_line flipper_charline flipper_fix_colors::$12 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::$12 ] { }  ) always clobbers reg byte a 
Statement [550] flipper_fix_colors::$13 = flipper_fix_colors::$12 << 2 [ irq_flipper_top_line flipper_charline flipper_fix_colors::$12 flipper_fix_colors::$13 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::$12 flipper_fix_colors::$13 ] { }  ) always clobbers reg byte a 
Statement [551] flipper_fix_colors::$14 = flipper_fix_colors::$13 + flipper_fix_colors::$12 [ irq_flipper_top_line flipper_charline flipper_fix_colors::$14 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::$14 ] { }  ) always clobbers reg byte a 
Statement [552] flipper_fix_colors::offset#0 = flipper_fix_colors::$14 << 3 [ irq_flipper_top_line flipper_charline flipper_fix_colors::offset#0 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::offset#0 ] { }  ) always clobbers reg byte a 
Statement [553] flipper_fix_colors::colors#0 = COLS + flipper_fix_colors::offset#0 [ irq_flipper_top_line flipper_charline flipper_fix_colors::offset#0 flipper_fix_colors::colors#0 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::offset#0 flipper_fix_colors::colors#0 ] { }  ) always clobbers reg byte a 
Statement [554] flipper_fix_colors::happy_cols#0 = P1_COLORS + flipper_fix_colors::offset#0 [ irq_flipper_top_line flipper_charline flipper_fix_colors::colors#0 flipper_fix_colors::happy_cols#0 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::colors#0 flipper_fix_colors::happy_cols#0 ] { }  ) always clobbers reg byte a 
Statement [558] flipper_fix_colors::colors#0[flipper_fix_colors::i#2] = flipper_fix_colors::happy_cols#0[flipper_fix_colors::i#2] [ irq_flipper_top_line flipper_charline flipper_fix_colors::colors#0 flipper_fix_colors::happy_cols#0 flipper_fix_colors::i#2 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::colors#0 flipper_fix_colors::happy_cols#0 flipper_fix_colors::i#2 ] { }  ) always clobbers reg byte a 
Removing always clobbered register reg byte a as potential for zp[1]:49 [ flipper_fix_colors::i#2 flipper_fix_colors::i#1 ]
Statement [560] if(p2_logo_reveal_idx>=$28) goto p2_logo_reveal::@1 [ p2_logo_reveal_done p2_logo_reveal_idx ] ( main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx ] { }  ) always clobbers reg byte a 
Statement [561] vsp_update_screen::x_offset = p2_logo_reveal_idx [ p2_logo_reveal_done p2_logo_reveal_idx vsp_update_screen::x_offset ] ( main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx vsp_update_screen::x_offset ] { { p2_logo_reveal_idx = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement [565] p2_logo_reveal_done = 1 [ p2_logo_reveal_done p2_logo_reveal_idx ] ( main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx ] { }  ) always clobbers reg byte a 
Statement [1] p1_work_ready = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [2] irq_flipper_top_line = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [3] irq_flipper_bottom_line = 8 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [4] flipper_done = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [5] irq_flipper_idx = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [6] flipper_charline = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [7] vsp_scroll = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [8] plex_real_sprite_idx = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [9] p2_work_ready = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [10] p2_logo_revealing = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [11] p2_logo_reveal_done = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [12] p2_logo_swinging = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [13] p2_plex_scroller_moving = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [14] p2_logo_reveal_idx = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [15] x_movement_idx = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [16] scroll_text_next = SCROLL_TEXT [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [17] plex_frame_id = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [18] plex_frame = BUCKET_SPRITES [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [19] plex_id_offset = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [20] plex_bucket = BUCKET_SPRITES [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [21] plex_bucket_id = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [22] vsp_fine_scroll = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [23] vsp_coarse_scroll = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [24] vsp_sin_idx = $40 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [25] sprite_color_idx = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [26] demo_frame_count = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [27] sparkler_active = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [28] sparkler_idx = 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [32] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ demo_frame_count ] (  [ demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [33] irq_demo::port_value#0 = *PROCPORT [ demo_frame_count irq_demo::port_value#0 ] (  [ demo_frame_count irq_demo::port_value#0 ] { }  ) always clobbers reg byte a 
Statement [34] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ demo_frame_count irq_demo::port_value#0 ] (  [ demo_frame_count irq_demo::port_value#0 ] { }  ) always clobbers reg byte a 
Statement [35] *PROCPORT = PROCPORT_RAM_IO [ demo_frame_count irq_demo::port_value#0 ] (  [ demo_frame_count irq_demo::port_value#0 ] { }  ) always clobbers reg byte a 
Statement [37] *IRQ_STATUS = IRQ_RASTER [ irq_demo::port_value#0 ] (  [ irq_demo::port_value#0 ] { }  ) always clobbers reg byte a 
Statement [38] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ irq_demo::port_value#0 ] (  [ irq_demo::port_value#0 ] { }  ) always clobbers reg byte a 
Statement [39] *PROCPORT = irq_demo::port_value#0 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [40] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [41] plexBucketShow::bucket#1 = plex_bucket [ plex_real_sprite_idx p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#1 ] (  [ plex_real_sprite_idx p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [43] plex_bucket = plex_bucket + 8*SIZEOF_STRUCT_BUCKETSPRITE [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [45] if(plex_bucket_id<9) goto irq_swing_plex::@1 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [46] *HARDWARE_IRQ = &irq_swing_top [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [47] *RASTER = *BUCKET_YPOS [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [48] plex_frame_id = plex_frame_id + irq_swing_plex::YMOVE [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a reg byte x 
Statement [49] plex_frame = plex_frame + (unsigned int)irq_swing_plex::YMOVE*9*8*SIZEOF_STRUCT_BUCKETSPRITE [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [50] if(plex_frame_id<8) goto irq_swing_plex::@5 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [51] plex_frame = plex_frame - (unsigned int)9*8*8*SIZEOF_STRUCT_BUCKETSPRITE [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [52] plex_frame_id = plex_frame_id - 8 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_id_offset vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a reg byte x 
Statement [56] if(0==p2_logo_swinging) goto irq_swing_plex::@6 [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [57] irq_swing_plex::$27 = (unsigned int)vsp_sin_idx [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::$27 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::$27 ] { }  ) always clobbers reg byte a 
Statement [58] irq_swing_plex::$26 = irq_swing_plex::$27 << 1 [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::$26 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::$26 ] { }  ) always clobbers reg byte a 
Statement [59] irq_swing_plex::$31 = VSP_SINTABLE + irq_swing_plex::$26 [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::$31 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::$31 ] { }  ) always clobbers reg byte a 
Statement [60] irq_swing_plex::scroll#0 = *irq_swing_plex::$31 [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::scroll#0 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx irq_swing_plex::scroll#0 ] { }  ) always clobbers reg byte a reg byte y 
Statement [65] irq_swing_plex::$7 = irq_swing_plex::scroll#0 >> 3 [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll sprite_color_idx irq_swing_plex::$7 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll sprite_color_idx irq_swing_plex::$7 ] { }  ) always clobbers reg byte a 
Statement [66] irq_swing_plex::new_coarse_scroll#0 = (char)irq_swing_plex::$7 [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll sprite_color_idx irq_swing_plex::new_coarse_scroll#0 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll sprite_color_idx irq_swing_plex::new_coarse_scroll#0 ] { }  ) always clobbers reg byte a 
Statement [67] irq_swing_plex::coarse_scroll_diff#0 = vsp_coarse_scroll - irq_swing_plex::new_coarse_scroll#0 [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::coarse_scroll_diff#0 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::coarse_scroll_diff#0 ] { }  ) always clobbers reg byte a 
Statement [70] irq_swing_plex::x_offset#0 = $27 - vsp_coarse_scroll [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 ] { { irq_swing_plex::x_offset#0 = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement [71] vsp_update_screen::x_offset = irq_swing_plex::x_offset#0 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 vsp_update_screen::x_offset ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 vsp_update_screen::x_offset ] { { irq_swing_plex::x_offset#0 = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement [73] (PART2_SCREEN+(unsigned int)$18*$28)[irq_swing_plex::x_offset#0] = 0 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 ] { }  ) always clobbers reg byte a reg byte y 
Statement [74] (COLS+(unsigned int)$18*$28)[irq_swing_plex::x_offset#0] = 0 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 ] { }  ) always clobbers reg byte a reg byte y 
Statement [75] vsp_coarse_scroll = irq_swing_plex::new_coarse_scroll#0 [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll sprite_color_idx ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [76] irq_swing_plex::$16 = $28 - vsp_coarse_scroll [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::$16 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::$16 ] { }  ) always clobbers reg byte a 
Statement [78] if(0==p2_plex_scroller_moving) goto irq_swing_plex::@9 [ x_movement_idx scroll_text_next sprite_color_idx ] (  [ x_movement_idx scroll_text_next sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [82] if(sprite_color_idx!=$30*SIZEOF_CHAR) goto irq_swing_plex::@10 [ sprite_color_idx ] (  [ sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [83] sprite_color_idx = 0 [ sprite_color_idx ] (  [ sprite_color_idx ] { }  ) always clobbers reg byte a 
Statement [86] p2_work_ready = 1 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [87] *IRQ_STATUS = IRQ_RASTER [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [88] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [89] SPRITES_COLOR[irq_swing_plex::s#2] = SPRITE_COLOR_SEQUENCE[sprite_color_idx] [ sprite_color_idx irq_swing_plex::s#2 ] (  [ sprite_color_idx irq_swing_plex::s#2 ] { }  ) always clobbers reg byte a 
Statement [91] irq_swing_plex::x_offset1#0 = $50 - vsp_coarse_scroll [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset1#0 ] (  [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset1#0 ] { { irq_swing_plex::x_offset1#0 = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement [94] *HARDWARE_IRQ = &irq_swing_plex [ plex_bucket_id ] (  [ plex_bucket_id ] { }  ) always clobbers reg byte a 
Statement [95] *RASTER = BUCKET_YPOS[plex_bucket_id] [ ] (  [ ] { }  ) always clobbers reg byte a reg byte y 
Statement kickasm( uses vsp_scroll uses HARDWARE_IRQ uses RASTER uses IRQ_STATUS uses IRQ_RASTER uses VICII_CONTROL1) {{ // Stabilize the raster by using the double IRQ method
        // Acknowledge the IRQ
        lda #IRQ_RASTER
        sta IRQ_STATUS
        // Set-up IRQ for the next line
        inc RASTER
        // Point IRQ to almost stable code
        lda #<stable
        sta HARDWARE_IRQ
        lda #>stable
        sta HARDWARE_IRQ+1
        tsx       // Save stack pointer
        cli       // Reenable interrupts
        // Wait for new IRQ using NOP's to ensure minimal jitter when it hits
        .fill 15, NOP
        .align $100
    stable:
        txs             // Restore stack pointer
        ldx #9          // Wait till the raster has almost crossed to the next line (48 cycles)
        !: dex
        bne !-
        nop
        lda RASTER
        cmp RASTER
        bne !+          // And correct the last cycle of potential jitter
        !:
        // Raster is now completely stable! (Line $2f cycle 7)
        // Perform VSP by waiting an exact number of cycles and then enabling the display
        // See http://www.zimmers.net/cbmpics/cbm/c64/vic-ii.txt (Section 3.14.6. DMA delay)
        ldx #8          // Wait 45 cycles to get the VSP timing right
        !: dex
        bne !-
        nop
        nop
        lda vsp_scroll
        lsr         //  Put bit 0 into carry 
        bcc dma1    // Spend 2 or 3 cycles depending on the carry (bit 0)
    dma1:
        sta dma2+1  // Update the branch
        clv
    dma2:
        bvc dma2    // This branch is updated with vsp_scroll/2 - changing the number of NOP's executed
        // 20 NOP's - enabling vsp scroll from 0-40
        .fill 20, NOP
        ldx #$18
        lda #$1b  // TODO: To control Y-scrolling this must be flexible!
        // The STX $d011 must be line $30 cycle $10 for vsp_scroll==0
        stx VICII_CONTROL1 // Enable the display - starts DMA
        sta VICII_CONTROL1
     }} always clobbers reg byte a reg byte x 
Statement [98] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM [ vsp_fine_scroll ] (  [ vsp_fine_scroll ] { }  ) always clobbers reg byte a 
Statement [99] irq_swing_vsp::$1 = vsp_fine_scroll | VICII_MCM [ irq_swing_vsp::$1 ] (  [ irq_swing_vsp::$1 ] { }  ) always clobbers reg byte a 
Statement [101] *IRQ_STATUS = IRQ_RASTER [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [102] *HARDWARE_IRQ = &irq_swing_plex [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [103] *RASTER = *(BUCKET_YPOS+1) [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [104] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [107] plex_bucket = plex_frame [ plex_real_sprite_idx plex_bucket ] (  [ plex_real_sprite_idx plex_bucket ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [108] plex_bucket_id = 0 [ plex_real_sprite_idx plex_bucket plex_bucket_id ] (  [ plex_real_sprite_idx plex_bucket plex_bucket_id ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [109] plexBucketShow::bucket#0 = plex_bucket [ plex_real_sprite_idx plex_bucket plex_bucket_id plexBucketShow::bucket#0 ] (  [ plex_real_sprite_idx plex_bucket plex_bucket_id plexBucketShow::bucket#0 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [111] plex_bucket = plex_bucket + 8*SIZEOF_STRUCT_BUCKETSPRITE [ plex_bucket_id ] (  [ plex_bucket_id ] { }  ) always clobbers reg byte a 
Statement [113] *IRQ_STATUS = IRQ_RASTER [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [114] *HARDWARE_IRQ = &irq_swing_vsp [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [115] *RASTER = IRQ_SWING_VSP_LINE [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [116] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [123] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = LIGHT_BLUE [ flipper_done irq_flipper_idx ] (  [ flipper_done irq_flipper_idx ] { }  ) always clobbers reg byte a 
Statement [124] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLUE [ flipper_done irq_flipper_idx ] (  [ flipper_done irq_flipper_idx ] { }  ) always clobbers reg byte a 
Statement [126] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = irq_flipper_bottom::toD0181_return#0 [ flipper_done irq_flipper_idx ] (  [ flipper_done irq_flipper_idx ] { }  ) always clobbers reg byte a 
Statement [127] if(0!=flipper_done) goto irq_flipper_bottom::@1 [ irq_flipper_idx ] (  [ irq_flipper_idx ] { }  ) always clobbers reg byte a 
Statement [128] irq_flipper_bottom::$12 = irq_flipper_idx << 1 [ irq_flipper_idx irq_flipper_bottom::$12 ] (  [ irq_flipper_idx irq_flipper_bottom::$12 ] { }  ) always clobbers reg byte a 
Statement [129] irq_flipper_bottom::$14 = FLIPPER_EASING + irq_flipper_bottom::$12 [ irq_flipper_idx irq_flipper_bottom::$14 ] (  [ irq_flipper_idx irq_flipper_bottom::$14 ] { }  ) always clobbers reg byte a 
Statement [130] irq_flipper_bottom::irq_flipper_line#0 = *irq_flipper_bottom::$14 [ irq_flipper_idx irq_flipper_bottom::irq_flipper_line#0 ] (  [ irq_flipper_idx irq_flipper_bottom::irq_flipper_line#0 ] { }  ) always clobbers reg byte a reg byte y 
Statement [132] if(irq_flipper_bottom::irq_flipper_line#0<8) goto irq_flipper_bottom::@4 [ irq_flipper_bottom::irq_flipper_line#0 ] (  [ irq_flipper_bottom::irq_flipper_line#0 ] { }  ) always clobbers reg byte a 
Statement [133] irq_flipper_bottom::$7 = irq_flipper_bottom::irq_flipper_line#0 - 8 [ irq_flipper_bottom::irq_flipper_line#0 irq_flipper_bottom::$7 ] (  [ irq_flipper_bottom::irq_flipper_line#0 irq_flipper_bottom::$7 ] { }  ) always clobbers reg byte a 
Statement [134] irq_flipper_top_line = irq_flipper_bottom::$7 [ irq_flipper_bottom::irq_flipper_line#0 ] (  [ irq_flipper_bottom::irq_flipper_line#0 ] { }  ) always clobbers reg byte a 
Statement [135] if(irq_flipper_bottom::irq_flipper_line#0>$128) goto irq_flipper_bottom::@6 [ irq_flipper_bottom::irq_flipper_line#0 ] (  [ irq_flipper_bottom::irq_flipper_line#0 ] { }  ) always clobbers reg byte a 
Statement [136] irq_flipper_bottom::$9 = irq_flipper_bottom::irq_flipper_line#0 + 8 [ irq_flipper_bottom::irq_flipper_line#0 irq_flipper_bottom::$9 ] (  [ irq_flipper_bottom::irq_flipper_line#0 irq_flipper_bottom::$9 ] { }  ) always clobbers reg byte a 
Statement [137] irq_flipper_bottom_line = irq_flipper_bottom::$9 [ irq_flipper_bottom::irq_flipper_line#0 ] (  [ irq_flipper_bottom::irq_flipper_line#0 ] { }  ) always clobbers reg byte a 
Statement [138] if(irq_flipper_bottom::irq_flipper_line#0!=$130) goto irq_flipper_bottom::@1 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [139] flipper_done = 1 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [140] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [141] *RASTER = IRQ_PART1_TOP_LINE [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [142] *HARDWARE_IRQ = &irq_part1_top [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [143] *IRQ_STATUS = IRQ_RASTER [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [144] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [145] irq_flipper_bottom_line = $130 [ irq_flipper_bottom::irq_flipper_line#0 ] (  [ irq_flipper_bottom::irq_flipper_line#0 ] { }  ) always clobbers reg byte a 
Statement [146] irq_flipper_top_line = 0 [ irq_flipper_bottom::irq_flipper_line#0 ] (  [ irq_flipper_bottom::irq_flipper_line#0 ] { }  ) always clobbers reg byte a 
Statement asm { lda#$9a ldx#LIGHT_GREEN ldy#$1b staVICII_MEMORY stxBORDER_COLOR styVICII_CONTROL1 stxBG_COLOR lda#$c8 staVICII_CONTROL2  } always clobbers reg byte a reg byte x reg byte y 
Statement [155] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f [ irq_flipper_bottom_line ] (  [ irq_flipper_bottom_line ] { }  ) always clobbers reg byte a 
Statement [159] *HARDWARE_IRQ = &irq_flipper_bottom [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [160] *IRQ_STATUS = IRQ_RASTER [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [161] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [162] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 [ irq_flipper_bottom_line ] (  [ irq_flipper_bottom_line ] { }  ) always clobbers reg byte a 
Statement [163] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = BLACK [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [164] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLACK [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [165] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [166] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) | VICII_MCM [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [168] *((char *)CIA2) = irq_part1_top::toDd001_return#0 [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [170] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = irq_part1_top::toD0181_return#0 [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [173] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [177] *HARDWARE_IRQ = &irq_flipper_top [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [178] p1_work_ready = 1 [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [179] *IRQ_STATUS = IRQ_RASTER [ ] (  [ ] { }  ) always clobbers reg byte a 
Statement [180] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [181] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 [ irq_flipper_top_line ] (  [ irq_flipper_top_line ] { }  ) always clobbers reg byte a 
Statement [184] byteboozer_decrunch::crunched = DEMO_MUSIC_CRUNCHED [ byteboozer_decrunch::crunched ] ( main:30 [ byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement asm { lda#0  } always clobbers reg byte a 
Statement [187] callexecute *musicInit  [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] ( main:30 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [192] if(demo_frame_count<5*$32) goto main::@2 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] ( main:30 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [197] if(demo_frame_count<(unsigned int)$10*$32) goto main::@4 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [198] sparkler_active = 0 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [202] callexecute *musicPlay  [ demo_frame_count sparkler_active sparkler_idx ] ( demo_work:36 [ irq_demo::port_value#0 demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part1_run:194::part1_loop:339::demo_work:464 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part2_run:199::part2_loop:414::demo_work:525 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active sparkler_idx ] { }  ) always clobbers reg byte a reg byte x reg byte y 
Statement [203] if(0==sparkler_active) goto demo_work::@return [ demo_frame_count sparkler_active sparkler_idx ] ( demo_work:36 [ irq_demo::port_value#0 demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part1_run:194::part1_loop:339::demo_work:464 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part2_run:199::part2_loop:414::demo_work:525 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active sparkler_idx ] { }  ) always clobbers reg byte a 
Statement [208] plexBucketShow::real_idx#0 = plex_real_sprite_idx << 1 [ plexBucketShow::bucket#2 plexBucketShow::real_idx#0 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::real_idx#0 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::real_idx#0 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [210] if(0!=((char *)plexBucketShow::bucket#2)[plexBucketShow::i#3]) goto plexBucketShow::@2 [ plexBucketShow::bucket#2 plexBucketShow::i#3 plexBucketShow::real_idx#4 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::i#3 plexBucketShow::real_idx#4 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::i#3 plexBucketShow::real_idx#4 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [212] plexBucketShow::$1 = plexBucketShow::real_idx#8 >> 1 [ plexBucketShow::$1 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::$1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::$1 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [215] SPRITES_YPOS[plexBucketShow::real_idx#4] = ((char *)plexBucketShow::bucket#2)[plexBucketShow::i#3] [ plexBucketShow::bucket#2 plexBucketShow::i#3 plexBucketShow::real_idx#4 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::i#3 plexBucketShow::real_idx#4 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::i#3 plexBucketShow::real_idx#4 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [217] plexBucketShow::plex_id#0 = ((char *)plexBucketShow::bucket#2)[plexBucketShow::i#1] [ plexBucketShow::bucket#2 plexBucketShow::real_idx#4 plexBucketShow::i#1 plexBucketShow::plex_id#0 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::real_idx#4 plexBucketShow::i#1 plexBucketShow::plex_id#0 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::real_idx#4 plexBucketShow::i#1 plexBucketShow::plex_id#0 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [218] SPRITES_XPOS[plexBucketShow::real_idx#4] = PLEX_XPOS[plexBucketShow::plex_id#0] [ plexBucketShow::bucket#2 plexBucketShow::real_idx#4 plexBucketShow::i#1 plexBucketShow::plex_id#0 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::real_idx#4 plexBucketShow::i#1 plexBucketShow::plex_id#0 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::real_idx#4 plexBucketShow::i#1 plexBucketShow::plex_id#0 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [219] plexBucketShow::real_idx#1 = plexBucketShow::real_idx#4 >> 1 [ plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [220] if(0!=PLEX_XPOS_MSB[plexBucketShow::plex_id#0]) goto plexBucketShow::@3 [ plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [221] *SPRITES_XMSB = *SPRITES_XMSB & plexBucketShow::MSB_CLEAR_MASK_BY_ID[plexBucketShow::real_idx#1] [ plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [222] SCREEN_SPRITE_PTRS[plexBucketShow::real_idx#1] = PLEX_PTR[plexBucketShow::plex_id#0] [ plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::real_idx#1 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [225] plexBucketShow::real_idx#3 = plexBucketShow::real_idx#2 << 1 [ plexBucketShow::bucket#2 plexBucketShow::real_idx#3 plexBucketShow::i#1 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::real_idx#3 plexBucketShow::i#1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::real_idx#3 plexBucketShow::i#1 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [228] *SPRITES_XMSB = *SPRITES_XMSB | plexBucketShow::MSB_SET_MASK_BY_ID[plexBucketShow::real_idx#1] [ plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] ( plexBucketShow:42 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next plex_frame_id plex_frame plex_id_offset plex_bucket plex_bucket_id vsp_coarse_scroll vsp_sin_idx sprite_color_idx plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#1 = plexBucketShow::bucket#2 plex_bucket } }  plexBucketShow:110 [ plex_bucket plex_bucket_id plexBucketShow::bucket#2 plexBucketShow::i#1 plexBucketShow::plex_id#0 plexBucketShow::real_idx#1 ] { { plexBucketShow::bucket#0 = plexBucketShow::bucket#2 plex_bucket } }  ) always clobbers reg byte a 
Statement [229] update_frame_plex_id_offset::$0 = update_frame_plex_id_offset::plex_frame_id#0 << 1 [ update_frame_plex_id_offset::$0 ] ( update_frame_plex_id_offset:55 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx update_frame_plex_id_offset::$0 ] { { update_frame_plex_id_offset::plex_frame_id#0 = plex_frame_id } }  ) always clobbers reg byte a 
Statement [230] update_frame_plex_id_offset::jmp_address = update_frame_plex_id_offset::jmp_table[update_frame_plex_id_offset::$0] [ update_frame_plex_id_offset::jmp_address ] ( update_frame_plex_id_offset:55 [ p2_logo_swinging p2_plex_scroller_moving x_movement_idx scroll_text_next vsp_coarse_scroll vsp_sin_idx sprite_color_idx update_frame_plex_id_offset::jmp_address ] { { update_frame_plex_id_offset::plex_frame_id#0 = plex_frame_id } }  ) always clobbers reg byte a 
Statement kickasm( uses vsp_update_screen::x_offset uses PART2_SCREEN uses COLS uses LOGO_DATA uses LOGO_DATA_COLORS) {{ ldx x_offset
        .for(var row=0;row<24;row++) {
            lda LOGO_DATA+80*row,x
            sta PART2_SCREEN+40*row,x
            lda LOGO_DATA_COLORS+80*row,x
            sta COLS+40*row,x
        }
     }} always clobbers reg byte a reg byte x 
Statement [234] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ vsp_update_screen::x_offset ] ( vsp_update_screen:72 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 vsp_update_screen::x_offset ] { { irq_swing_plex::x_offset#0 = vsp_update_screen::x_offset } }  vsp_update_screen:93 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 vsp_update_screen::x_offset ] { { irq_swing_plex::x_offset1#0 = vsp_update_screen::x_offset } }  main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529::vsp_update_screen:562 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx vsp_update_screen::x_offset ] { { p2_logo_reveal_idx = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement [235] *PROCPORT = PROCPORT_RAM_ALL [ vsp_update_screen::x_offset ] ( vsp_update_screen:72 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 vsp_update_screen::x_offset ] { { irq_swing_plex::x_offset#0 = vsp_update_screen::x_offset } }  vsp_update_screen:93 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 vsp_update_screen::x_offset ] { { irq_swing_plex::x_offset1#0 = vsp_update_screen::x_offset } }  main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529::vsp_update_screen:562 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx vsp_update_screen::x_offset ] { { p2_logo_reveal_idx = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement [236] vsp_update_screen::$5 = (unsigned int)vsp_update_screen::x_offset [ vsp_update_screen::x_offset vsp_update_screen::$5 ] ( vsp_update_screen:72 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 vsp_update_screen::x_offset vsp_update_screen::$5 ] { { irq_swing_plex::x_offset#0 = vsp_update_screen::x_offset } }  vsp_update_screen:93 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 vsp_update_screen::x_offset vsp_update_screen::$5 ] { { irq_swing_plex::x_offset1#0 = vsp_update_screen::x_offset } }  main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529::vsp_update_screen:562 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx vsp_update_screen::x_offset vsp_update_screen::$5 ] { { p2_logo_reveal_idx = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement [237] vsp_update_screen::x_offset8 = vsp_update_screen::$5 << 3 [ vsp_update_screen::x_offset vsp_update_screen::x_offset8 ] ( vsp_update_screen:72 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 vsp_update_screen::x_offset vsp_update_screen::x_offset8 ] { { irq_swing_plex::x_offset#0 = vsp_update_screen::x_offset } }  vsp_update_screen:93 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 vsp_update_screen::x_offset vsp_update_screen::x_offset8 ] { { irq_swing_plex::x_offset1#0 = vsp_update_screen::x_offset } }  main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529::vsp_update_screen:562 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx vsp_update_screen::x_offset vsp_update_screen::x_offset8 ] { { p2_logo_reveal_idx = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+$200+row*40*8+pix,y
                }
         }} always clobbers reg byte a reg byte x reg byte y 
Statement [243] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( vsp_update_screen:72 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 ] { { irq_swing_plex::x_offset#0 = vsp_update_screen::x_offset } }  vsp_update_screen:93 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 ] { { irq_swing_plex::x_offset1#0 = vsp_update_screen::x_offset } }  main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529::vsp_update_screen:562 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx ] { { p2_logo_reveal_idx = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement [244] *PROCPORT = PROCPORT_RAM_IO [ ] ( vsp_update_screen:72 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 irq_swing_plex::x_offset#0 ] { { irq_swing_plex::x_offset#0 = vsp_update_screen::x_offset } }  vsp_update_screen:93 [ p2_plex_scroller_moving x_movement_idx scroll_text_next sprite_color_idx irq_swing_plex::new_coarse_scroll#0 ] { { irq_swing_plex::x_offset1#0 = vsp_update_screen::x_offset } }  main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529::vsp_update_screen:562 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx ] { { p2_logo_reveal_idx = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+$100+row*40*8+pix,y
                }
         }} always clobbers reg byte a reg byte x reg byte y 
Statement kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+row*40*8+pix,y
                }
         }} always clobbers reg byte a reg byte x reg byte y 
Statement [250] if(plex_scroller_move::s#10<$20) goto plex_scroller_move::@2 [ x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] ( plex_scroller_move:80 [ sprite_color_idx x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] { }  ) always clobbers reg byte a 
Statement [253] PLEX_XPOS[plex_scroller_move::s#10] = XMOVEMENT[plex_scroller_move::x_idx#10] [ x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] ( plex_scroller_move:80 [ sprite_color_idx x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] { }  ) always clobbers reg byte a reg byte y 
Statement [254] PLEX_XPOS_MSB[plex_scroller_move::s#10] = XMOVEMENT_HI[plex_scroller_move::x_idx#10] [ x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] ( plex_scroller_move:80 [ sprite_color_idx x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] { }  ) always clobbers reg byte a reg byte y 
Statement [256] if(*scroll_text_next!=0) goto plex_scroller_move::@5 [ x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] ( plex_scroller_move:80 [ sprite_color_idx x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] { }  ) always clobbers reg byte a reg byte y 
Statement [257] scroll_text_next = SCROLL_TEXT [ x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] ( plex_scroller_move:80 [ sprite_color_idx x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] { }  ) always clobbers reg byte a 
Statement [258] plex_scroller_move::letter#0 = *scroll_text_next [ x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 plex_scroller_move::letter#0 ] ( plex_scroller_move:80 [ sprite_color_idx x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 plex_scroller_move::letter#0 ] { }  ) always clobbers reg byte a reg byte y 
Statement [265] PLEX_PTR[plex_scroller_move::s#10] = plex_scroller_move::$8 [ x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] ( plex_scroller_move:80 [ sprite_color_idx x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#10 ] { }  ) always clobbers reg byte y 
Statement [266] plex_scroller_move::x_idx#1 = plex_scroller_move::x_idx#10 + 8 [ x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#1 ] ( plex_scroller_move:80 [ sprite_color_idx x_movement_idx scroll_text_next plex_scroller_move::s#10 plex_scroller_move::x_idx#1 ] { }  ) always clobbers reg byte a reg byte x 
Statement [268] plex_real_sprite_idx = 0 [ plex_real_sprite_idx ] ( plexFrameStart:106 [ plex_frame plex_real_sprite_idx ] { }  ) always clobbers reg byte a 
Statement kickasm( uses raster_fine::line_offset uses RASTER_BADLINES) {{ jmp aligned
        .align $100
    aligned:
        ldy RASTER
        ldx line_offset
        inx
    rst:
        nop 
        nop 
        nop 
        nop
        dex                             // 2
        beq done                        // 2
        lda RASTER_BADLINES,y           // 4
        beq notbad                      // 3
    bad:
        nop                             // 2
        nop 
        nop 
        nop 
        nop
        dex                             
        beq done                        
        iny                             
        nop                             
        bit $ea                         
    notbad:
        .fill 18, NOP
        bit $ea
        iny                             
        jmp rst                         
    done:
     }} always clobbers reg byte a reg byte x reg byte y 
Statement [274] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:30::demo_init:183 [ ] { }  main:30::demo_start:189::demo_init:283 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467::demo_init:283 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [275] *PROCPORT = PROCPORT_RAM_IO [ ] ( main:30::demo_init:183 [ ] { }  main:30::demo_start:189::demo_init:283 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467::demo_init:283 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [276] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR [ ] ( main:30::demo_init:183 [ ] { }  main:30::demo_start:189::demo_init:283 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467::demo_init:283 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement asm { ldaCIA1_INTERRUPT  } always clobbers reg byte a 
Statement [278] *IRQ_STATUS = $f [ ] ( main:30::demo_init:183 [ ] { }  main:30::demo_start:189::demo_init:283 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467::demo_init:283 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement asm { ldycrunched ldxcrunched+1 jsrb2.Decrunch  } always clobbers reg byte a reg byte x reg byte y 
Statement [284] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f [ ] ( main:30::demo_start:189 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [285] *RASTER = 0 [ ] ( main:30::demo_start:189 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [286] *HARDWARE_IRQ = &irq_demo [ ] ( main:30::demo_start:189 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [287] *IRQ_ENABLE = IRQ_RASTER [ ] ( main:30::demo_start:189 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  main:30::part1_run:194::part1_loop:339::demo_start:467 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [290] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [291] *PROCPORT = PROCPORT_RAM_ALL [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [292] byteboozer_decrunch::crunched = P1_PIXELS_CRUNCHED [ byteboozer_decrunch::crunched ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [294] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [295] *PROCPORT = PROCPORT_RAM_IO [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [296] byteboozer_decrunch::crunched = P1_SCREEN_CRUNCHED [ byteboozer_decrunch::crunched ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [298] byteboozer_decrunch::crunched = P1_COLORS_CRUNCHED [ byteboozer_decrunch::crunched ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [300] byteboozer_decrunch::crunched = P1_SPRITES_CRUNCHED [ byteboozer_decrunch::crunched ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [302] byteboozer_decrunch::crunched = FLIPPER_EASING_CRUNCHED [ byteboozer_decrunch::crunched ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [308] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [309] *PROCPORT = PROCPORT_RAM_CHARROM [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [311] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [312] *PROCPORT = PROCPORT_RAM_IO [ ] ( main:30::part1_init:191 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [319] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [320] *PROCPORT = PROCPORT_RAM_IO [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [321] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement asm { ldaCIA1_INTERRUPT  } always clobbers reg byte a 
Statement [323] *IRQ_STATUS = $f [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [324] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [325] *RASTER = IRQ_PART1_TOP_LINE [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [326] *HARDWARE_IRQ = &irq_part1_top [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [327] *IRQ_ENABLE = IRQ_RASTER [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [328] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = 1 [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [329] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR) = PINK [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [330] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1) = YELLOW [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [331] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2) = PURPLE [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [332] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = 1 [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [333] *((char *)VICII) = $16 [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [334] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_Y) = $be [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [336] *P1_SCREEN_SPRITE_PTRS = part1_run::toSpritePtr1_return#0 [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [341] byteboozer_decrunch::crunched = SPRITES_CRUNCHED [ byteboozer_decrunch::crunched ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [347] byteboozer_decrunch::crunched = PLEX_ID_UPDATERS_CRUNCHED2 [ byteboozer_decrunch::crunched ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [349] byteboozer_decrunch::crunched = LOGO_DATA_CRUNCHED2 [ byteboozer_decrunch::crunched ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count byteboozer_decrunch::crunched ] { }  ) always clobbers reg byte a 
Statement [351] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [352] *PROCPORT = PROCPORT_RAM_ALL [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [354] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [355] *PROCPORT = PROCPORT_RAM_IO [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [359] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR) = GREY [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [360] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1) = BROWN [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [361] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2) = BLUE [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [369] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = 0 [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [370] *((char *)VICII) = 0 [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [371] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 0 [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [372] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = 0 [ ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [378] SPRITES_COLOR[part2_init::s2#2] = WHITE [ part2_init::s2#2 ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::s2#2 ] { }  ) always clobbers reg byte a 
Statement [381] PLEX_PTR[part2_init::s1#2] = part2_init::toSpritePtr1_return#0+' ' [ part2_init::s1#2 ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::s1#2 ] { }  ) always clobbers reg byte a 
Statement [386] plexPrepareFrame::frame#0 = part2_init::frame#5 [ part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::frame#0 ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::frame#0 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [388] part2_init::frame#1 = part2_init::frame#5 + 8*9*SIZEOF_STRUCT_BUCKETSPRITE [ part2_init::frame_idx#2 part2_init::frame#1 ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#1 ] { }  ) always clobbers reg byte a 
Statement [390] PLEX_YPOS[part2_init::s#2] = SCROLL_YSIN[part2_init::sin_idx#2] [ part2_init::frame_idx#2 part2_init::frame#5 part2_init::s#2 part2_init::sin_idx#2 ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 part2_init::s#2 part2_init::sin_idx#2 ] { }  ) always clobbers reg byte a 
Statement [391] part2_init::sin_idx#1 = part2_init::sin_idx#2 + 8 [ part2_init::frame_idx#2 part2_init::frame#5 part2_init::s#2 part2_init::sin_idx#1 ] ( main:30::part2_init:196 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 part2_init::s#2 part2_init::sin_idx#1 ] { }  ) always clobbers reg byte a 
Statement [395] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = BLACK [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [396] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLACK [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [398] *((char *)CIA2) = part2_run::toDd001_return#0 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [400] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = part2_run::toD0181_return#0 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [401] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [402] *SPRITES_ENABLE = $ff [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [403] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement asm { ldaCIA1_INTERRUPT  } always clobbers reg byte a 
Statement [405] *IRQ_STATUS = $f [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [406] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [407] *RASTER = *BUCKET_YPOS [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [408] *IRQ_ENABLE = IRQ_RASTER [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [409] *HARDWARE_IRQ = &irq_swing_top [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [411] plex_frame_id = 0 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [412] plex_frame = BUCKET_SPRITES [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [413] plex_id_offset = 0 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [417] if(sparkler_idx!=$1e) goto sparkler_anim::toSpritePtr1 [ sparkler_idx ] ( demo_work:36::sparkler_anim:205 [ irq_demo::port_value#0 demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part1_run:194::part1_loop:339::demo_work:464::sparkler_anim:205 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part2_run:199::part2_loop:414::demo_work:525::sparkler_anim:205 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active sparkler_idx ] { }  ) always clobbers reg byte a 
Statement [418] sparkler_idx = 0 [ sparkler_idx ] ( demo_work:36::sparkler_anim:205 [ irq_demo::port_value#0 demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part1_run:194::part1_loop:339::demo_work:464::sparkler_anim:205 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active sparkler_idx ] { }  main:30::part2_run:199::part2_loop:414::demo_work:525::sparkler_anim:205 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active sparkler_idx ] { }  ) always clobbers reg byte a 
Statement [420] sparkler_anim::$3 = sparkler_idx >> 1 [ sparkler_anim::$3 ] ( demo_work:36::sparkler_anim:205 [ irq_demo::port_value#0 demo_frame_count sparkler_active sparkler_anim::$3 ] { }  main:30::part1_run:194::part1_loop:339::demo_work:464::sparkler_anim:205 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active sparkler_anim::$3 ] { }  main:30::part2_run:199::part2_loop:414::demo_work:525::sparkler_anim:205 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active sparkler_anim::$3 ] { }  ) always clobbers reg byte a 
Statement [426] if(init_rasters::i#2<$130*SIZEOF_CHAR) goto init_rasters::@2 [ init_rasters::i#2 ] ( main:30::part1_init:191::init_rasters:305 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active init_rasters::i#2 ] { }  ) always clobbers reg byte a 
Statement [430] RASTER_BADLINES[init_rasters::b#2] = 1 [ init_rasters::b#2 ] ( main:30::part1_init:191::init_rasters:305 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active init_rasters::b#2 ] { }  ) always clobbers reg byte a 
Statement [431] init_rasters::b#1 = init_rasters::b#2 + 8 [ init_rasters::b#1 ] ( main:30::part1_init:191::init_rasters:305 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active init_rasters::b#1 ] { }  ) always clobbers reg byte a 
Statement [432] init_rasters::$3 = RASTER_BADLINES + init_rasters::i#2 [ init_rasters::i#2 init_rasters::$3 ] ( main:30::part1_init:191::init_rasters:305 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active init_rasters::i#2 init_rasters::$3 ] { }  ) always clobbers reg byte a 
Statement [433] *init_rasters::$3 = 0 [ init_rasters::i#2 ] ( main:30::part1_init:191::init_rasters:305 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active init_rasters::i#2 ] { }  ) always clobbers reg byte a reg byte y 
Statement [436] if(memset::num#5<=0) goto memset::@return [ memset::num#5 memset::str#6 memset::c#7 ] ( main:30::part1_init:191::memset:307 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memset::num#5 memset::str#6 memset::c#7 ] { }  main:30::part2_init:196::memset:353 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::num#5 memset::str#6 memset::c#7 ] { }  main:30::part2_init:196::memset:356 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::num#5 memset::str#6 memset::c#7 ] { }  main:30::part2_init:196::memset:358 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::num#5 memset::str#6 memset::c#7 ] { }  main:30::part2_init:196::memset:376 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::num#5 memset::str#6 memset::c#7 ] { }  ) always clobbers reg byte a 
Statement [437] memset::end#0 = (char *)memset::str#6 + memset::num#5 [ memset::str#6 memset::c#7 memset::end#0 ] ( main:30::part1_init:191::memset:307 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memset::str#6 memset::c#7 memset::end#0 ] { }  main:30::part2_init:196::memset:353 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::str#6 memset::c#7 memset::end#0 ] { }  main:30::part2_init:196::memset:356 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::str#6 memset::c#7 memset::end#0 ] { }  main:30::part2_init:196::memset:358 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::str#6 memset::c#7 memset::end#0 ] { }  main:30::part2_init:196::memset:376 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::str#6 memset::c#7 memset::end#0 ] { }  ) always clobbers reg byte a 
Statement [438] memset::dst#4 = (char *)memset::str#6 [ memset::c#7 memset::end#0 memset::dst#4 ] ( main:30::part1_init:191::memset:307 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memset::c#7 memset::end#0 memset::dst#4 ] { }  main:30::part2_init:196::memset:353 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#4 ] { }  main:30::part2_init:196::memset:356 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#4 ] { }  main:30::part2_init:196::memset:358 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#4 ] { }  main:30::part2_init:196::memset:376 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#4 ] { }  ) always clobbers reg byte a 
Statement [440] if(memset::dst#2!=memset::end#0) goto memset::@3 [ memset::c#7 memset::end#0 memset::dst#2 ] ( main:30::part1_init:191::memset:307 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:353 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:356 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:358 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:376 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  ) always clobbers reg byte a 
Statement [442] *memset::dst#2 = memset::c#7 [ memset::c#7 memset::end#0 memset::dst#2 ] ( main:30::part1_init:191::memset:307 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:353 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:356 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:358 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  main:30::part2_init:196::memset:376 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memset::c#7 memset::end#0 memset::dst#2 ] { }  ) always clobbers reg byte a reg byte y 
Statement [445] memcpy::src_end#0 = (char *)memcpy::source#6 + memcpy::num#6 [ memcpy::source#6 memcpy::destination#6 memcpy::src_end#0 ] ( main:30::part1_init:191::memcpy:310 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::source#6 memcpy::destination#6 memcpy::src_end#0 ] { }  main:30::part1_init:191::memcpy:313 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::source#6 memcpy::destination#6 memcpy::src_end#0 ] { }  main:30::part1_init:191::memcpy:315 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::source#6 memcpy::destination#6 memcpy::src_end#0 ] { }  main:30::part2_init:196::memcpy:344 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::source#6 memcpy::destination#6 memcpy::src_end#0 ] { }  main:30::part2_init:196::memcpy:346 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::source#6 memcpy::destination#6 memcpy::src_end#0 ] { }  main:30::part2_init:196::memcpy:366 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::source#6 memcpy::destination#6 memcpy::src_end#0 ] { }  ) always clobbers reg byte a 
Statement [446] memcpy::src#4 = (char *)memcpy::source#6 [ memcpy::destination#6 memcpy::src_end#0 memcpy::src#4 ] ( main:30::part1_init:191::memcpy:310 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::destination#6 memcpy::src_end#0 memcpy::src#4 ] { }  main:30::part1_init:191::memcpy:313 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::destination#6 memcpy::src_end#0 memcpy::src#4 ] { }  main:30::part1_init:191::memcpy:315 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::destination#6 memcpy::src_end#0 memcpy::src#4 ] { }  main:30::part2_init:196::memcpy:344 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::destination#6 memcpy::src_end#0 memcpy::src#4 ] { }  main:30::part2_init:196::memcpy:346 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::destination#6 memcpy::src_end#0 memcpy::src#4 ] { }  main:30::part2_init:196::memcpy:366 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::destination#6 memcpy::src_end#0 memcpy::src#4 ] { }  ) always clobbers reg byte a 
Statement [447] memcpy::dst#4 = (char *)memcpy::destination#6 [ memcpy::src_end#0 memcpy::src#4 memcpy::dst#4 ] ( main:30::part1_init:191::memcpy:310 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#4 memcpy::dst#4 ] { }  main:30::part1_init:191::memcpy:313 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#4 memcpy::dst#4 ] { }  main:30::part1_init:191::memcpy:315 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#4 memcpy::dst#4 ] { }  main:30::part2_init:196::memcpy:344 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#4 memcpy::dst#4 ] { }  main:30::part2_init:196::memcpy:346 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#4 memcpy::dst#4 ] { }  main:30::part2_init:196::memcpy:366 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#4 memcpy::dst#4 ] { }  ) always clobbers reg byte a 
Statement [449] if(memcpy::src#2!=memcpy::src_end#0) goto memcpy::@2 [ memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] ( main:30::part1_init:191::memcpy:310 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part1_init:191::memcpy:313 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part1_init:191::memcpy:315 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part2_init:196::memcpy:344 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part2_init:196::memcpy:346 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part2_init:196::memcpy:366 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  ) always clobbers reg byte a 
Statement [451] *memcpy::dst#2 = *memcpy::src#2 [ memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] ( main:30::part1_init:191::memcpy:310 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part1_init:191::memcpy:313 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part1_init:191::memcpy:315 [ irq_flipper_top_line flipper_charline p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part2_init:196::memcpy:344 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part2_init:196::memcpy:346 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  main:30::part2_init:196::memcpy:366 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count memcpy::src_end#0 memcpy::src#2 memcpy::dst#2 ] { }  ) always clobbers reg byte a reg byte y 
Statement [454] p1_work_ready = 0 [ p1_work_ready irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx p1_work_ready irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [455] if(p1_work_ready==0) goto part1_loop::@1 [ p1_work_ready irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx p1_work_ready irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [458] part1_loop::$11 = demo_frame_count [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active part1_loop::$11 ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active part1_loop::$11 ] { }  ) always clobbers reg byte a 
Statement [459] if(0!=sparkler_active) goto part1_loop::@4 [ irq_flipper_top_line flipper_charline demo_frame_count part1_loop::$11 ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count part1_loop::$11 ] { }  ) always clobbers reg byte a 
Statement [460] if(part1_loop::$11<=(unsigned int)9*$32-3) goto part1_loop::@4 [ irq_flipper_top_line flipper_charline demo_frame_count ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [461] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 1 [ irq_flipper_top_line flipper_charline demo_frame_count ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [462] sparkler_active = 1 [ irq_flipper_top_line flipper_charline demo_frame_count ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [465] if(demo_frame_count<=(unsigned int)$e*$32) goto part1_loop::@5 [ irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [469] p1_work_ready = 0 [ p1_work_ready irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] ( main:30::part1_run:194::part1_loop:339 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx p1_work_ready irq_flipper_top_line flipper_charline demo_frame_count sparkler_active ] { }  ) always clobbers reg byte a 
Statement [482] plexPrepareFrame::bucket#10 = plexPrepareFrame::frame#0 [ plexPrepareFrame::frame#0 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket#10 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::frame#0 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket#10 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [485] plexPrepareFrame::bucket#1 = plexPrepareFrame::bucket#3 + 8*SIZEOF_STRUCT_BUCKETSPRITE [ plexPrepareFrame::sprite#3 plexPrepareFrame::bucket#1 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::sprite#3 plexPrepareFrame::bucket#1 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [486] if(plexPrepareFrame::sprite#3==plexPrepareFrame::bucket#1) goto plexPrepareFrame::@return [ plexPrepareFrame::sprite#3 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::sprite#3 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [487] *((char *)plexPrepareFrame::sprite#3) = 0 [ ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a reg byte y 
Statement [491] if(plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::real_sprite_id#2]<=plexPrepareFrame::bucket_ypos#3) goto plexPrepareFrame::@13 [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket#3 plexPrepareFrame::sprite#3 plexPrepareFrame::bucket_id#2 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket#3 plexPrepareFrame::sprite#3 plexPrepareFrame::bucket_id#2 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a reg byte y 
Statement [494] plexPrepareFrame::sprite#2 = plexPrepareFrame::bucket#3 + 8*SIZEOF_STRUCT_BUCKETSPRITE [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::sprite#3 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::sprite#3 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [495] if(plexPrepareFrame::sprite#3==plexPrepareFrame::sprite#2) goto plexPrepareFrame::@14 [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::sprite#3 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::sprite#3 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [496] *((char *)plexPrepareFrame::sprite#3) = 0 [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a reg byte y 
Statement [497] plexPrepareFrame::sprite#13 = plexPrepareFrame::sprite#2 [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 plexPrepareFrame::sprite#13 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::bucket_id#1 plexPrepareFrame::bucket_ypos#2 plexPrepareFrame::sprite#2 plexPrepareFrame::sprite#13 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [499] *((char *)plexPrepareFrame::sprite#4) = plexPrepareFrame::ypos#0 [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket#9 plexPrepareFrame::bucket_id#5 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::sprite#4 plexPrepareFrame::bucket_ypos#4 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket#9 plexPrepareFrame::bucket_id#5 plexPrepareFrame::plex_id#0 plexPrepareFrame::ypos#0 plexPrepareFrame::sprite#4 plexPrepareFrame::bucket_ypos#4 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a reg byte y 
Statement [500] ((char *)plexPrepareFrame::sprite#4)[OFFSET_STRUCT_BUCKETSPRITE_PLEX_ID] = plexPrepareFrame::plex_id#0 [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket#9 plexPrepareFrame::bucket_id#5 plexPrepareFrame::ypos#0 plexPrepareFrame::sprite#4 plexPrepareFrame::bucket_ypos#4 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket#9 plexPrepareFrame::bucket_id#5 plexPrepareFrame::ypos#0 plexPrepareFrame::sprite#4 plexPrepareFrame::bucket_ypos#4 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a reg byte y 
Statement [502] plexPrepareFrame::$16 = plexPrepareFrame::ypos#0 + $16 [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket#9 plexPrepareFrame::bucket_id#5 plexPrepareFrame::sprite#4 plexPrepareFrame::$16 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket#9 plexPrepareFrame::bucket_id#5 plexPrepareFrame::sprite#4 plexPrepareFrame::$16 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [506] plexPrepareFrame::sprite#1 = plexPrepareFrame::sprite#4 + SIZEOF_STRUCT_BUCKETSPRITE [ plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#1 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket#9 plexPrepareFrame::sprite#1 plexPrepareFrame::bucket_id#5 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::i1#2 plexPrepareFrame::real_sprite_id#1 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket#9 plexPrepareFrame::sprite#1 plexPrepareFrame::bucket_id#5 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [508] plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::i#2] = *BUCKET_YPOS [ plexPrepareFrame::frame#0 plexPrepareFrame::i#2 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::frame#0 plexPrepareFrame::i#2 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [512] if(plexPrepareFrame::nxt_y#0>=PLEX_YPOS[PLEX_SORTED_IDX[plexPrepareFrame::m#2]]) goto plexPrepareFrame::@3 [ plexPrepareFrame::frame#0 plexPrepareFrame::m#2 plexPrepareFrame::nxt_idx#0 plexPrepareFrame::nxt_y#0 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::frame#0 plexPrepareFrame::m#2 plexPrepareFrame::nxt_idx#0 plexPrepareFrame::nxt_y#0 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [515] (PLEX_SORTED_IDX+1)[plexPrepareFrame::s#3] = PLEX_SORTED_IDX[plexPrepareFrame::s#3] [ plexPrepareFrame::frame#0 plexPrepareFrame::m#2 plexPrepareFrame::nxt_idx#0 plexPrepareFrame::nxt_y#0 plexPrepareFrame::s#3 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::frame#0 plexPrepareFrame::m#2 plexPrepareFrame::nxt_idx#0 plexPrepareFrame::nxt_y#0 plexPrepareFrame::s#3 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [518] if(plexPrepareFrame::nxt_y#0<PLEX_YPOS[PLEX_SORTED_IDX[plexPrepareFrame::s#1]]) goto plexPrepareFrame::@4 [ plexPrepareFrame::frame#0 plexPrepareFrame::m#2 plexPrepareFrame::nxt_idx#0 plexPrepareFrame::nxt_y#0 plexPrepareFrame::s#1 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::frame#0 plexPrepareFrame::m#2 plexPrepareFrame::nxt_idx#0 plexPrepareFrame::nxt_y#0 plexPrepareFrame::s#1 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [520] PLEX_SORTED_IDX[plexPrepareFrame::s#2] = plexPrepareFrame::nxt_idx#0 [ plexPrepareFrame::frame#0 plexPrepareFrame::m#2 ] ( main:30::part2_init:196::plexPrepareFrame:387 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_init::frame_idx#2 part2_init::frame#5 plexPrepareFrame::frame#0 plexPrepareFrame::m#2 ] { { plexPrepareFrame::frame#0 = part2_init::frame#5 } }  ) always clobbers reg byte a 
Statement [522] p2_work_ready = 0 [ p2_work_ready p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_work_ready p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [523] if(p2_work_ready==0) goto part2_loop::@1 [ p2_work_ready p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_work_ready p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [526] if(0==p2_logo_revealing) goto part2_loop::@4 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [527] if(0==p2_logo_reveal_done) goto part2_loop::@3 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [530] part2_loop::$23 = demo_frame_count [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$23 ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$23 ] { }  ) always clobbers reg byte a 
Statement [531] if(0!=p2_logo_revealing) goto part2_loop::@5 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$23 ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$23 ] { }  ) always clobbers reg byte a 
Statement [532] if(part2_loop::$23<=(unsigned int)$12*$32+$19) goto part2_loop::@5 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [533] p2_logo_revealing = 1 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [534] if(0!=p2_logo_swinging) goto part2_loop::@6 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [535] if(0==p2_logo_reveal_done) goto part2_loop::@6 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [536] p2_logo_swinging = 1 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [537] part2_loop::$24 = demo_frame_count [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$24 ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$24 ] { }  ) always clobbers reg byte a 
Statement [538] if(0!=p2_plex_scroller_moving) goto part2_loop::@7 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$24 ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count part2_loop::$24 ] { }  ) always clobbers reg byte a 
Statement [539] if(part2_loop::$24<=(unsigned int)$1a*$32) goto part2_loop::@7 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [540] p2_plex_scroller_moving = 1 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [541] p2_work_ready = 0 [ p2_work_ready p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] ( main:30::part2_run:199::part2_loop:414 [ p2_work_ready p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count ] { }  ) always clobbers reg byte a 
Statement [542] if(irq_flipper_top_line<$2e+1) goto flipper_fix_colors::@return [ irq_flipper_top_line flipper_charline ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline ] { }  ) always clobbers reg byte a 
Statement [543] if(irq_flipper_top_line<$f6) goto flipper_fix_colors::@1 [ irq_flipper_top_line flipper_charline ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline ] { }  ) always clobbers reg byte a 
Statement [545] flipper_fix_colors::$4 = irq_flipper_top_line - $2e [ irq_flipper_top_line flipper_charline flipper_fix_colors::$4 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::$4 ] { }  ) always clobbers reg byte a 
Statement [546] flipper_fix_colors::$5 = flipper_fix_colors::$4 >> 3 [ irq_flipper_top_line flipper_charline flipper_fix_colors::$5 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::$5 ] { }  ) always clobbers reg byte a 
Statement [549] flipper_fix_colors::$12 = (unsigned int)flipper_charline [ irq_flipper_top_line flipper_charline flipper_fix_colors::$12 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::$12 ] { }  ) always clobbers reg byte a 
Statement [550] flipper_fix_colors::$13 = flipper_fix_colors::$12 << 2 [ irq_flipper_top_line flipper_charline flipper_fix_colors::$12 flipper_fix_colors::$13 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::$12 flipper_fix_colors::$13 ] { }  ) always clobbers reg byte a 
Statement [551] flipper_fix_colors::$14 = flipper_fix_colors::$13 + flipper_fix_colors::$12 [ irq_flipper_top_line flipper_charline flipper_fix_colors::$14 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::$14 ] { }  ) always clobbers reg byte a 
Statement [552] flipper_fix_colors::offset#0 = flipper_fix_colors::$14 << 3 [ irq_flipper_top_line flipper_charline flipper_fix_colors::offset#0 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::offset#0 ] { }  ) always clobbers reg byte a 
Statement [553] flipper_fix_colors::colors#0 = COLS + flipper_fix_colors::offset#0 [ irq_flipper_top_line flipper_charline flipper_fix_colors::offset#0 flipper_fix_colors::colors#0 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::offset#0 flipper_fix_colors::colors#0 ] { }  ) always clobbers reg byte a 
Statement [554] flipper_fix_colors::happy_cols#0 = P1_COLORS + flipper_fix_colors::offset#0 [ irq_flipper_top_line flipper_charline flipper_fix_colors::colors#0 flipper_fix_colors::happy_cols#0 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::colors#0 flipper_fix_colors::happy_cols#0 ] { }  ) always clobbers reg byte a 
Statement [558] flipper_fix_colors::colors#0[flipper_fix_colors::i#2] = flipper_fix_colors::happy_cols#0[flipper_fix_colors::i#2] [ irq_flipper_top_line flipper_charline flipper_fix_colors::colors#0 flipper_fix_colors::happy_cols#0 flipper_fix_colors::i#2 ] ( main:30::part1_run:194::part1_loop:339::flipper_fix_colors:457 [ p2_logo_revealing p2_logo_reveal_done p2_logo_swinging p2_plex_scroller_moving p2_logo_reveal_idx demo_frame_count sparkler_active irq_flipper_top_line flipper_charline flipper_fix_colors::colors#0 flipper_fix_colors::happy_cols#0 flipper_fix_colors::i#2 ] { }  ) always clobbers reg byte a 
Statement [560] if(p2_logo_reveal_idx>=$28) goto p2_logo_reveal::@1 [ p2_logo_reveal_done p2_logo_reveal_idx ] ( main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx ] { }  ) always clobbers reg byte a 
Statement [561] vsp_update_screen::x_offset = p2_logo_reveal_idx [ p2_logo_reveal_done p2_logo_reveal_idx vsp_update_screen::x_offset ] ( main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx vsp_update_screen::x_offset ] { { p2_logo_reveal_idx = vsp_update_screen::x_offset } }  ) always clobbers reg byte a 
Statement [565] p2_logo_reveal_done = 1 [ p2_logo_reveal_done p2_logo_reveal_idx ] ( main:30::part2_run:199::part2_loop:414::p2_logo_reveal:529 [ p2_logo_revealing p2_logo_swinging p2_plex_scroller_moving demo_frame_count p2_logo_reveal_done p2_logo_reveal_idx ] { }  ) always clobbers reg byte a 
Potential registers zp[1]:2 [ irq_swing_plex::s#2 irq_swing_plex::s#1 ] : zp[1]:2 , reg byte x , reg byte y , 
Potential registers zp[2]:3 [ plexBucketShow::bucket#2 plexBucketShow::bucket#1 plexBucketShow::bucket#0 ] : zp[2]:3 , 
Potential registers zp[1]:5 [ plexBucketShow::i#3 plexBucketShow::i#2 ] : zp[1]:5 , reg byte x , reg byte y , 
Potential registers zp[1]:6 [ plexBucketShow::real_idx#8 plexBucketShow::real_idx#4 plexBucketShow::real_idx#0 plexBucketShow::real_idx#3 ] : zp[1]:6 , reg byte x , reg byte y , 
Potential registers zp[1]:7 [ plex_scroller_move::s#10 plex_scroller_move::s#1 ] : zp[1]:7 , 
Potential registers zp[1]:8 [ plex_scroller_move::x_idx#10 plex_scroller_move::x_idx#0 plex_scroller_move::x_idx#1 ] : zp[1]:8 , reg byte x , 
Potential registers zp[1]:9 [ plex_scroller_move::letter#2 plex_scroller_move::letter#0 ] : zp[1]:9 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:10 [ part2_init::frame_idx#2 part2_init::frame_idx#1 ] : zp[1]:10 , reg byte x , 
Potential registers zp[2]:11 [ part2_init::frame#5 part2_init::frame#1 ] : zp[2]:11 , 
Potential registers zp[1]:13 [ part2_init::s1#2 part2_init::s1#1 ] : zp[1]:13 , reg byte x , reg byte y , 
Potential registers zp[1]:14 [ part2_init::s2#2 part2_init::s2#1 ] : zp[1]:14 , reg byte x , reg byte y , 
Potential registers zp[1]:15 [ part2_init::s#2 part2_init::s#1 ] : zp[1]:15 , reg byte x , reg byte y , 
Potential registers zp[1]:16 [ part2_init::sin_idx#2 part2_init::sin_idx#4 part2_init::sin_idx#1 ] : zp[1]:16 , reg byte x , reg byte y , 
Potential registers zp[2]:17 [ init_rasters::i#2 init_rasters::i#1 ] : zp[2]:17 , 
Potential registers zp[1]:19 [ init_rasters::b#2 init_rasters::b#1 ] : zp[1]:19 , reg byte x , reg byte y , 
Potential registers zp[2]:20 [ memset::num#5 ] : zp[2]:20 , 
Potential registers zp[2]:22 [ memset::str#6 ] : zp[2]:22 , 
Potential registers zp[1]:24 [ memset::c#7 ] : zp[1]:24 , reg byte x , 
Potential registers zp[2]:25 [ memset::dst#2 memset::dst#4 memset::dst#1 ] : zp[2]:25 , 
Potential registers zp[2]:27 [ memcpy::source#6 ] : zp[2]:27 , 
Potential registers zp[2]:29 [ memcpy::destination#6 ] : zp[2]:29 , 
Potential registers zp[2]:31 [ memcpy::num#6 ] : zp[2]:31 , 
Potential registers zp[2]:33 [ memcpy::src#2 memcpy::src#4 memcpy::src#1 ] : zp[2]:33 , 
Potential registers zp[2]:35 [ memcpy::dst#2 memcpy::dst#4 memcpy::dst#1 ] : zp[2]:35 , 
Potential registers zp[1]:37 [ plexPrepareInit::i#2 plexPrepareInit::i#1 ] : zp[1]:37 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:38 [ plexPrepareFrame::m#2 plexPrepareFrame::m#1 ] : zp[1]:38 , reg byte x , reg byte y , 
Potential registers zp[1]:39 [ plexPrepareFrame::i#2 plexPrepareFrame::i#1 ] : zp[1]:39 , reg byte x , reg byte y , 
Potential registers zp[1]:40 [ plexPrepareFrame::i1#2 plexPrepareFrame::i1#1 ] : zp[1]:40 , reg byte x , 
Potential registers zp[1]:41 [ plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::real_sprite_id#1 ] : zp[1]:41 , reg byte x , 
Potential registers zp[2]:42 [ plexPrepareFrame::bucket#3 plexPrepareFrame::bucket#10 plexPrepareFrame::bucket#9 plexPrepareFrame::sprite#2 ] : zp[2]:42 , 
Potential registers zp[1]:44 [ plexPrepareFrame::bucket_id#2 plexPrepareFrame::bucket_id#5 plexPrepareFrame::bucket_id#1 ] : zp[1]:44 , reg byte x , 
Potential registers zp[2]:45 [ plexPrepareFrame::sprite#4 plexPrepareFrame::sprite#3 plexPrepareFrame::frame#0 plexPrepareFrame::sprite#1 plexPrepareFrame::sprite#13 ] : zp[2]:45 , 
Potential registers zp[1]:47 [ plexPrepareFrame::bucket_ypos#4 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket_ypos#2 ] : zp[1]:47 , reg byte x , 
Potential registers zp[1]:48 [ plexPrepareFrame::s#3 plexPrepareFrame::s#1 plexPrepareFrame::s#6 ] : zp[1]:48 , reg byte x , reg byte y , 
Potential registers zp[1]:49 [ flipper_fix_colors::i#2 flipper_fix_colors::i#1 ] : zp[1]:49 , reg byte x , reg byte y , 
Potential registers zp[1]:50 [ p1_work_ready ] : zp[1]:50 , 
Potential registers zp[2]:51 [ irq_flipper_top_line ] : zp[2]:51 , 
Potential registers zp[2]:53 [ irq_flipper_bottom_line ] : zp[2]:53 , 
Potential registers zp[1]:55 [ flipper_done ] : zp[1]:55 , 
Potential registers zp[2]:56 [ irq_flipper_idx ] : zp[2]:56 , 
Potential registers zp[1]:58 [ flipper_charline ] : zp[1]:58 , 
Potential registers zp[1]:59 [ vsp_scroll ] : zp[1]:59 , 
Potential registers zp[1]:60 [ plex_real_sprite_idx ] : zp[1]:60 , 
Potential registers zp[1]:61 [ p2_work_ready ] : zp[1]:61 , 
Potential registers zp[1]:62 [ p2_logo_revealing ] : zp[1]:62 , 
Potential registers zp[1]:63 [ p2_logo_reveal_done ] : zp[1]:63 , 
Potential registers zp[1]:64 [ p2_logo_swinging ] : zp[1]:64 , 
Potential registers zp[1]:65 [ p2_plex_scroller_moving ] : zp[1]:65 , 
Potential registers zp[1]:66 [ p2_logo_reveal_idx ] : zp[1]:66 , 
Potential registers zp[1]:67 [ x_movement_idx ] : zp[1]:67 , 
Potential registers zp[2]:68 [ scroll_text_next ] : zp[2]:68 , 
Potential registers zp[1]:70 [ plex_frame_id ] : zp[1]:70 , 
Potential registers zp[2]:71 [ plex_frame ] : zp[2]:71 , 
Potential registers zp[1]:73 [ plex_id_offset ] : zp[1]:73 , 
Potential registers zp[2]:74 [ plex_bucket ] : zp[2]:74 , 
Potential registers zp[1]:76 [ plex_bucket_id ] : zp[1]:76 , 
Potential registers zp[1]:77 [ vsp_fine_scroll ] : zp[1]:77 , 
Potential registers zp[1]:78 [ vsp_coarse_scroll ] : zp[1]:78 , 
Potential registers zp[1]:79 [ vsp_sin_idx ] : zp[1]:79 , 
Potential registers zp[1]:80 [ sprite_color_idx ] : zp[1]:80 , 
Potential registers zp[2]:81 [ demo_frame_count ] : zp[2]:81 , 
Potential registers zp[1]:83 [ sparkler_active ] : zp[1]:83 , 
Potential registers zp[1]:84 [ sparkler_idx ] : zp[1]:84 , 
Potential registers zp[1]:85 [ irq_demo::port_value#0 ] : zp[1]:85 , 
Potential registers zp[1]:86 [ update_frame_plex_id_offset::plex_frame_id#0 ] : zp[1]:86 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[2]:87 [ irq_swing_plex::$27 ] : zp[2]:87 , 
Potential registers zp[2]:89 [ irq_swing_plex::$26 ] : zp[2]:89 , 
Potential registers zp[2]:91 [ irq_swing_plex::$31 ] : zp[2]:91 , 
Potential registers zp[2]:93 [ irq_swing_plex::scroll#0 ] : zp[2]:93 , 
Potential registers zp[1]:95 [ irq_swing_plex::$28 ] : zp[1]:95 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:96 [ irq_swing_plex::$6 ] : zp[1]:96 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[2]:97 [ irq_swing_plex::$7 ] : zp[2]:97 , 
Potential registers zp[1]:99 [ irq_swing_plex::new_coarse_scroll#0 ] : zp[1]:99 , 
Potential registers zp[1]:100 [ irq_swing_plex::coarse_scroll_diff#0 ] : zp[1]:100 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:101 [ irq_swing_plex::x_offset#0 ] : zp[1]:101 , 
Potential registers zp[1]:102 [ vsp_update_screen::x_offset ] : zp[1]:102 , 
Potential registers zp[1]:103 [ irq_swing_plex::$16 ] : zp[1]:103 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:104 [ irq_swing_plex::x_offset1#0 ] : zp[1]:104 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:105 [ irq_swing_vsp::$1 ] : zp[1]:105 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:106 [ irq_flipper_bottom::$0 ] : zp[1]:106 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:107 [ irq_flipper_bottom::$1 ] : zp[1]:107 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:108 [ raster_fine::line_offset ] : zp[1]:108 , 
Potential registers zp[2]:109 [ irq_flipper_bottom::$12 ] : zp[2]:109 , 
Potential registers zp[2]:111 [ irq_flipper_bottom::$14 ] : zp[2]:111 , 
Potential registers zp[2]:113 [ irq_flipper_bottom::irq_flipper_line#0 ] : zp[2]:113 , 
Potential registers zp[2]:115 [ irq_flipper_bottom::$7 ] : zp[2]:115 , 
Potential registers zp[2]:117 [ irq_flipper_bottom::$9 ] : zp[2]:117 , 
Potential registers zp[1]:119 [ irq_flipper_top::$0 ] : zp[1]:119 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:120 [ irq_flipper_top::$1 ] : zp[1]:120 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:121 [ irq_flipper_top::$3 ] : zp[1]:121 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:122 [ irq_flipper_top::$4 ] : zp[1]:122 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:123 [ irq_flipper_top::$5 ] : zp[1]:123 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:124 [ irq_part1_top::$2 ] : zp[1]:124 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:125 [ irq_part1_top::$3 ] : zp[1]:125 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:126 [ irq_part1_top::$4 ] : zp[1]:126 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[2]:127 [ byteboozer_decrunch::crunched ] : zp[2]:127 , 
Potential registers zp[1]:129 [ plexBucketShow::$1 ] : zp[1]:129 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:130 [ plexBucketShow::i#1 ] : zp[1]:130 , reg byte x , reg byte y , 
Potential registers zp[1]:131 [ plexBucketShow::plex_id#0 ] : zp[1]:131 , reg byte x , reg byte y , 
Potential registers zp[1]:132 [ plexBucketShow::real_idx#1 ] : zp[1]:132 , reg byte x , reg byte y , 
Potential registers zp[1]:133 [ plexBucketShow::$2 ] : zp[1]:133 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:134 [ plexBucketShow::real_idx#2 ] : zp[1]:134 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:135 [ update_frame_plex_id_offset::$0 ] : zp[1]:135 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[2]:136 [ update_frame_plex_id_offset::jmp_address ] : zp[2]:136 , 
Potential registers zp[2]:138 [ vsp_update_screen::$5 ] : zp[2]:138 , 
Potential registers zp[2]:140 [ vsp_update_screen::x_offset8 ] : zp[2]:140 , 
Potential registers zp[1]:142 [ vsp_update_screen::$1 ] : zp[1]:142 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:143 [ vsp_update_screen::$3 ] : zp[1]:143 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:144 [ plex_scroller_move::$8 ] : zp[1]:144 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:145 [ sparkler_anim::$3 ] : zp[1]:145 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:146 [ sparkler_anim::$4 ] : zp[1]:146 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[2]:147 [ init_rasters::$3 ] : zp[2]:147 , 
Potential registers zp[2]:149 [ memset::end#0 ] : zp[2]:149 , 
Potential registers zp[2]:151 [ memcpy::src_end#0 ] : zp[2]:151 , 
Potential registers zp[2]:153 [ part1_loop::$11 ] : zp[2]:153 , 
Potential registers zp[2]:155 [ plexPrepareFrame::bucket#1 ] : zp[2]:155 , 
Potential registers zp[1]:157 [ plexPrepareFrame::plex_id#0 ] : zp[1]:157 , reg byte x , 
Potential registers zp[1]:158 [ plexPrepareFrame::ypos#0 ] : zp[1]:158 , reg byte x , 
Potential registers zp[1]:159 [ plexPrepareFrame::$16 ] : zp[1]:159 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:160 [ plexPrepareFrame::$17 ] : zp[1]:160 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[1]:161 [ plexPrepareFrame::nxt_idx#0 ] : zp[1]:161 , reg byte x , reg byte y , 
Potential registers zp[1]:162 [ plexPrepareFrame::nxt_y#0 ] : zp[1]:162 , reg byte x , reg byte y , 
Potential registers zp[1]:163 [ plexPrepareFrame::s#2 ] : zp[1]:163 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[2]:164 [ part2_loop::$23 ] : zp[2]:164 , 
Potential registers zp[2]:166 [ part2_loop::$24 ] : zp[2]:166 , 
Potential registers zp[2]:168 [ flipper_fix_colors::$4 ] : zp[2]:168 , 
Potential registers zp[2]:170 [ flipper_fix_colors::$5 ] : zp[2]:170 , 
Potential registers zp[1]:172 [ flipper_fix_colors::charline#0 ] : zp[1]:172 , reg byte a , reg byte x , reg byte y , 
Potential registers zp[2]:173 [ flipper_fix_colors::$12 ] : zp[2]:173 , 
Potential registers zp[2]:175 [ flipper_fix_colors::$13 ] : zp[2]:175 , 
Potential registers zp[2]:177 [ flipper_fix_colors::$14 ] : zp[2]:177 , 
Potential registers zp[2]:179 [ flipper_fix_colors::offset#0 ] : zp[2]:179 , 
Potential registers zp[2]:181 [ flipper_fix_colors::colors#0 ] : zp[2]:181 , 
Potential registers zp[2]:183 [ flipper_fix_colors::happy_cols#0 ] : zp[2]:183 , 

REGISTER UPLIFT SCOPES
Uplift Scope [plexPrepareFrame] 36,166,672.83: zp[1]:48 [ plexPrepareFrame::s#3 plexPrepareFrame::s#1 plexPrepareFrame::s#6 ] 3,650,503.97: zp[2]:45 [ plexPrepareFrame::sprite#4 plexPrepareFrame::sprite#3 plexPrepareFrame::frame#0 plexPrepareFrame::sprite#1 plexPrepareFrame::sprite#13 ] 3,333,336.67: zp[1]:39 [ plexPrepareFrame::i#2 plexPrepareFrame::i#1 ] 2,461,540.92: zp[1]:38 [ plexPrepareFrame::m#2 plexPrepareFrame::m#1 ] 2,297,717.77: zp[1]:47 [ plexPrepareFrame::bucket_ypos#4 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket_ypos#2 ] 2,200,002.2: zp[1]:40 [ plexPrepareFrame::i1#2 plexPrepareFrame::i1#1 ] 2,000,002: zp[1]:159 [ plexPrepareFrame::$16 ] 2,000,002: zp[1]:160 [ plexPrepareFrame::$17 ] 2,000,002: zp[1]:163 [ plexPrepareFrame::s#2 ] 1,751,432.59: zp[2]:42 [ plexPrepareFrame::bucket#3 plexPrepareFrame::bucket#10 plexPrepareFrame::bucket#9 plexPrepareFrame::sprite#2 ] 1,500,000.38: zp[1]:162 [ plexPrepareFrame::nxt_y#0 ] 1,400,001.4: zp[1]:44 [ plexPrepareFrame::bucket_id#2 plexPrepareFrame::bucket_id#5 plexPrepareFrame::bucket_id#1 ] 901,961.69: zp[1]:41 [ plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::real_sprite_id#1 ] 300,000.3: zp[1]:161 [ plexPrepareFrame::nxt_idx#0 ] 272,727.55: zp[1]:157 [ plexPrepareFrame::plex_id#0 ] 250,000.25: zp[1]:158 [ plexPrepareFrame::ypos#0 ] 20,002: zp[2]:155 [ plexPrepareFrame::bucket#1 ] 
Uplift Scope [flipper_fix_colors] 36,666,670.33: zp[1]:49 [ flipper_fix_colors::i#2 flipper_fix_colors::i#1 ] 2,020,000.4: zp[2]:183 [ flipper_fix_colors::happy_cols#0 ] 1,683,333.67: zp[2]:181 [ flipper_fix_colors::colors#0 ] 200,002: zp[2]:168 [ flipper_fix_colors::$4 ] 200,002: zp[1]:172 [ flipper_fix_colors::charline#0 ] 200,002: zp[2]:175 [ flipper_fix_colors::$13 ] 200,002: zp[2]:177 [ flipper_fix_colors::$14 ] 150,001.5: zp[2]:173 [ flipper_fix_colors::$12 ] 150,001.5: zp[2]:179 [ flipper_fix_colors::offset#0 ] 100,001: zp[2]:170 [ flipper_fix_colors::$5 ] 
Uplift Scope [vsp_update_screen] 2,000,002: zp[2]:138 [ vsp_update_screen::$5 ] 2,000,002: zp[1]:142 [ vsp_update_screen::$1 ] 2,000,002: zp[1]:143 [ vsp_update_screen::$3 ] 600,000.6: zp[2]:140 [ vsp_update_screen::x_offset8 ] 8,333.75: zp[1]:102 [ vsp_update_screen::x_offset ] 
Uplift Scope [sparkler_anim] 2,000,002: zp[1]:145 [ sparkler_anim::$3 ] 2,000,002: zp[1]:146 [ sparkler_anim::$4 ] 
Uplift Scope [] 714,286.71: zp[1]:84 [ sparkler_idx ] 37,002.33: zp[1]:50 [ p1_work_ready ] 37,002.33: zp[1]:61 [ p2_work_ready ] 6,779.76: zp[1]:66 [ p2_logo_reveal_idx ] 5,000.08: zp[1]:58 [ flipper_charline ] 4,109.79: zp[2]:51 [ irq_flipper_top_line ] 2,857.52: zp[1]:83 [ sparkler_active ] 2,355: zp[2]:81 [ demo_frame_count ] 2,033.98: zp[1]:63 [ p2_logo_reveal_done ] 566.13: zp[1]:62 [ p2_logo_revealing ] 294.21: zp[1]:64 [ p2_logo_swinging ] 215.12: zp[1]:65 [ p2_plex_scroller_moving ] 9.42: zp[2]:71 [ plex_frame ] 8.92: zp[1]:73 [ plex_id_offset ] 8.85: zp[1]:70 [ plex_frame_id ] 8.45: zp[2]:68 [ scroll_text_next ] 4.38: zp[1]:60 [ plex_real_sprite_idx ] 4: zp[1]:59 [ vsp_scroll ] 2.67: zp[2]:74 [ plex_bucket ] 2: zp[1]:77 [ vsp_fine_scroll ] 1.6: zp[1]:76 [ plex_bucket_id ] 1.09: zp[2]:53 [ irq_flipper_bottom_line ] 0.6: zp[1]:55 [ flipper_done ] 0.58: zp[1]:67 [ x_movement_idx ] 0.57: zp[2]:56 [ irq_flipper_idx ] 0.42: zp[1]:80 [ sprite_color_idx ] 0.4: zp[1]:78 [ vsp_coarse_scroll ] 0.3: zp[1]:79 [ vsp_sin_idx ] 
Uplift Scope [init_rasters] 33,336.67: zp[1]:19 [ init_rasters::b#2 init_rasters::b#1 ] 30,003: zp[2]:17 [ init_rasters::i#2 init_rasters::i#1 ] 20,002: zp[2]:147 [ init_rasters::$3 ] 
Uplift Scope [part2_init] 30,003: zp[1]:15 [ part2_init::s#2 part2_init::s#1 ] 22,337.67: zp[1]:16 [ part2_init::sin_idx#2 part2_init::sin_idx#4 part2_init::sin_idx#1 ] 3,336.67: zp[1]:14 [ part2_init::s2#2 part2_init::s2#1 ] 3,003: zp[1]:13 [ part2_init::s1#2 part2_init::s1#1 ] 2,366: zp[1]:10 [ part2_init::frame_idx#2 part2_init::frame_idx#1 ] 1,301.3: zp[2]:11 [ part2_init::frame#5 part2_init::frame#1 ] 
Uplift Scope [memcpy] 31,254.25: zp[2]:33 [ memcpy::src#2 memcpy::src#4 memcpy::src#1 ] 22,337.67: zp[2]:35 [ memcpy::dst#2 memcpy::dst#4 memcpy::dst#1 ] 1,375.25: zp[2]:151 [ memcpy::src_end#0 ] 1,001: zp[2]:31 [ memcpy::num#6 ] 0: zp[2]:27 [ memcpy::source#6 ] 0: zp[2]:29 [ memcpy::destination#6 ] 
Uplift Scope [memset] 35,672.33: zp[2]:25 [ memset::dst#2 memset::dst#4 memset::dst#1 ] 1,833.67: zp[2]:149 [ memset::end#0 ] 1,250.12: zp[1]:24 [ memset::c#7 ] 1,001: zp[2]:20 [ memset::num#5 ] 0: zp[2]:22 [ memset::str#6 ] 
Uplift Scope [plexPrepareInit] 36,670.33: zp[1]:37 [ plexPrepareInit::i#2 plexPrepareInit::i#1 ] 
Uplift Scope [part2_loop] 10,001: zp[2]:164 [ part2_loop::$23 ] 10,001: zp[2]:166 [ part2_loop::$24 ] 
Uplift Scope [part1_loop] 10,001: zp[2]:153 [ part1_loop::$11 ] 
Uplift Scope [plexBucketShow] 422: zp[1]:6 [ plexBucketShow::real_idx#8 plexBucketShow::real_idx#4 plexBucketShow::real_idx#0 plexBucketShow::real_idx#3 ] 286.17: zp[1]:5 [ plexBucketShow::i#3 plexBucketShow::i#2 ] 202: zp[1]:133 [ plexBucketShow::$2 ] 202: zp[1]:134 [ plexBucketShow::real_idx#2 ] 101: zp[1]:132 [ plexBucketShow::real_idx#1 ] 67.33: zp[1]:131 [ plexBucketShow::plex_id#0 ] 27.55: zp[1]:130 [ plexBucketShow::i#1 ] 22: zp[1]:129 [ plexBucketShow::$1 ] 8.22: zp[2]:3 [ plexBucketShow::bucket#2 plexBucketShow::bucket#1 plexBucketShow::bucket#0 ] 
Uplift Scope [plex_scroller_move] 239.88: zp[1]:7 [ plex_scroller_move::s#10 plex_scroller_move::s#1 ] 202: zp[1]:144 [ plex_scroller_move::$8 ] 176.75: zp[1]:9 [ plex_scroller_move::letter#2 plex_scroller_move::letter#0 ] 157.4: zp[1]:8 [ plex_scroller_move::x_idx#10 plex_scroller_move::x_idx#0 plex_scroller_move::x_idx#1 ] 
Uplift Scope [byteboozer_decrunch] 91: zp[2]:127 [ byteboozer_decrunch::crunched ] 
Uplift Scope [irq_swing_plex] 36.67: zp[1]:2 [ irq_swing_plex::s#2 irq_swing_plex::s#1 ] 4: zp[2]:87 [ irq_swing_plex::$27 ] 4: zp[2]:89 [ irq_swing_plex::$26 ] 4: zp[2]:91 [ irq_swing_plex::$31 ] 4: zp[1]:95 [ irq_swing_plex::$28 ] 4: zp[1]:96 [ irq_swing_plex::$6 ] 4: zp[1]:103 [ irq_swing_plex::$16 ] 4: zp[1]:104 [ irq_swing_plex::x_offset1#0 ] 3: zp[1]:100 [ irq_swing_plex::coarse_scroll_diff#0 ] 2: zp[2]:97 [ irq_swing_plex::$7 ] 2: zp[1]:101 [ irq_swing_plex::x_offset#0 ] 0.8: zp[2]:93 [ irq_swing_plex::scroll#0 ] 0.5: zp[1]:99 [ irq_swing_plex::new_coarse_scroll#0 ] 
Uplift Scope [update_frame_plex_id_offset] 22: zp[1]:135 [ update_frame_plex_id_offset::$0 ] 13: zp[1]:86 [ update_frame_plex_id_offset::plex_frame_id#0 ] 11: zp[2]:136 [ update_frame_plex_id_offset::jmp_address ] 
Uplift Scope [irq_flipper_bottom] 4: zp[1]:106 [ irq_flipper_bottom::$0 ] 4: zp[1]:107 [ irq_flipper_bottom::$1 ] 4: zp[2]:109 [ irq_flipper_bottom::$12 ] 4: zp[2]:111 [ irq_flipper_bottom::$14 ] 4: zp[2]:115 [ irq_flipper_bottom::$7 ] 4: zp[2]:117 [ irq_flipper_bottom::$9 ] 1.2: zp[2]:113 [ irq_flipper_bottom::irq_flipper_line#0 ] 
Uplift Scope [irq_flipper_top] 4: zp[1]:119 [ irq_flipper_top::$0 ] 4: zp[1]:120 [ irq_flipper_top::$1 ] 4: zp[1]:121 [ irq_flipper_top::$3 ] 4: zp[1]:122 [ irq_flipper_top::$4 ] 4: zp[1]:123 [ irq_flipper_top::$5 ] 
Uplift Scope [irq_part1_top] 4: zp[1]:124 [ irq_part1_top::$2 ] 4: zp[1]:125 [ irq_part1_top::$3 ] 4: zp[1]:126 [ irq_part1_top::$4 ] 
Uplift Scope [irq_swing_vsp] 4: zp[1]:105 [ irq_swing_vsp::$1 ] 
Uplift Scope [raster_fine] 2: zp[1]:108 [ raster_fine::line_offset ] 
Uplift Scope [irq_demo] 0.67: zp[1]:85 [ irq_demo::port_value#0 ] 
Uplift Scope [MOS6526_CIA] 
Uplift Scope [MOS6569_VICII] 
Uplift Scope [MOS6581_SID] 
Uplift Scope [demo_start] 
Uplift Scope [demo_work] 
Uplift Scope [part1_init] 
Uplift Scope [part1_run] 
Uplift Scope [BucketSprite] 
Uplift Scope [plexFrameStart] 
Uplift Scope [part2_run] 
Uplift Scope [p2_logo_reveal] 
Uplift Scope [irq_swing_top] 
Uplift Scope [main] 
Uplift Scope [demo_init] 
Uplift Scope [__start] 

Uplifting [plexPrepareFrame] best 103248 combination reg byte x [ plexPrepareFrame::s#3 plexPrepareFrame::s#1 plexPrepareFrame::s#6 ] zp[2]:45 [ plexPrepareFrame::sprite#4 plexPrepareFrame::sprite#3 plexPrepareFrame::frame#0 plexPrepareFrame::sprite#1 plexPrepareFrame::sprite#13 ] reg byte x [ plexPrepareFrame::i#2 plexPrepareFrame::i#1 ] zp[1]:38 [ plexPrepareFrame::m#2 plexPrepareFrame::m#1 ] zp[1]:47 [ plexPrepareFrame::bucket_ypos#4 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket_ypos#2 ] zp[1]:40 [ plexPrepareFrame::i1#2 plexPrepareFrame::i1#1 ] zp[1]:159 [ plexPrepareFrame::$16 ] zp[1]:160 [ plexPrepareFrame::$17 ] zp[1]:163 [ plexPrepareFrame::s#2 ] zp[2]:42 [ plexPrepareFrame::bucket#3 plexPrepareFrame::bucket#10 plexPrepareFrame::bucket#9 plexPrepareFrame::sprite#2 ] zp[1]:162 [ plexPrepareFrame::nxt_y#0 ] zp[1]:44 [ plexPrepareFrame::bucket_id#2 plexPrepareFrame::bucket_id#5 plexPrepareFrame::bucket_id#1 ] zp[1]:41 [ plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::real_sprite_id#1 ] zp[1]:161 [ plexPrepareFrame::nxt_idx#0 ] zp[1]:157 [ plexPrepareFrame::plex_id#0 ] zp[1]:158 [ plexPrepareFrame::ypos#0 ] zp[2]:155 [ plexPrepareFrame::bucket#1 ] 
Limited combination testing to 100 combinations of 995328 possible.
Uplifting [flipper_fix_colors] best 102042 combination reg byte y [ flipper_fix_colors::i#2 flipper_fix_colors::i#1 ] zp[2]:183 [ flipper_fix_colors::happy_cols#0 ] zp[2]:181 [ flipper_fix_colors::colors#0 ] zp[2]:168 [ flipper_fix_colors::$4 ] reg byte a [ flipper_fix_colors::charline#0 ] zp[2]:175 [ flipper_fix_colors::$13 ] zp[2]:177 [ flipper_fix_colors::$14 ] zp[2]:173 [ flipper_fix_colors::$12 ] zp[2]:179 [ flipper_fix_colors::offset#0 ] zp[2]:170 [ flipper_fix_colors::$5 ] 
Uplifting [vsp_update_screen] best 102032 combination zp[2]:138 [ vsp_update_screen::$5 ] reg byte a [ vsp_update_screen::$1 ] reg byte a [ vsp_update_screen::$3 ] zp[2]:140 [ vsp_update_screen::x_offset8 ] zp[1]:102 [ vsp_update_screen::x_offset ] 
Uplifting [sparkler_anim] best 102022 combination reg byte a [ sparkler_anim::$3 ] reg byte a [ sparkler_anim::$4 ] 
Uplifting [] best 102022 combination zp[1]:84 [ sparkler_idx ] zp[1]:50 [ p1_work_ready ] zp[1]:61 [ p2_work_ready ] zp[1]:66 [ p2_logo_reveal_idx ] zp[1]:58 [ flipper_charline ] zp[2]:51 [ irq_flipper_top_line ] zp[1]:83 [ sparkler_active ] zp[2]:81 [ demo_frame_count ] zp[1]:63 [ p2_logo_reveal_done ] zp[1]:62 [ p2_logo_revealing ] zp[1]:64 [ p2_logo_swinging ] zp[1]:65 [ p2_plex_scroller_moving ] zp[2]:71 [ plex_frame ] zp[1]:73 [ plex_id_offset ] zp[1]:70 [ plex_frame_id ] zp[2]:68 [ scroll_text_next ] zp[1]:60 [ plex_real_sprite_idx ] zp[1]:59 [ vsp_scroll ] zp[2]:74 [ plex_bucket ] zp[1]:77 [ vsp_fine_scroll ] zp[1]:76 [ plex_bucket_id ] zp[2]:53 [ irq_flipper_bottom_line ] zp[1]:55 [ flipper_done ] zp[1]:67 [ x_movement_idx ] zp[2]:56 [ irq_flipper_idx ] zp[1]:80 [ sprite_color_idx ] zp[1]:78 [ vsp_coarse_scroll ] zp[1]:79 [ vsp_sin_idx ] 
Uplifting [init_rasters] best 101892 combination reg byte x [ init_rasters::b#2 init_rasters::b#1 ] zp[2]:17 [ init_rasters::i#2 init_rasters::i#1 ] zp[2]:147 [ init_rasters::$3 ] 
Uplifting [part2_init] best 99722 combination reg byte y [ part2_init::s#2 part2_init::s#1 ] reg byte x [ part2_init::sin_idx#2 part2_init::sin_idx#4 part2_init::sin_idx#1 ] reg byte x [ part2_init::s2#2 part2_init::s2#1 ] reg byte x [ part2_init::s1#2 part2_init::s1#1 ] zp[1]:10 [ part2_init::frame_idx#2 part2_init::frame_idx#1 ] zp[2]:11 [ part2_init::frame#5 part2_init::frame#1 ] 
Limited combination testing to 100 combinations of 162 possible.
Uplifting [memcpy] best 99722 combination zp[2]:33 [ memcpy::src#2 memcpy::src#4 memcpy::src#1 ] zp[2]:35 [ memcpy::dst#2 memcpy::dst#4 memcpy::dst#1 ] zp[2]:151 [ memcpy::src_end#0 ] zp[2]:31 [ memcpy::num#6 ] zp[2]:27 [ memcpy::source#6 ] zp[2]:29 [ memcpy::destination#6 ] 
Uplifting [memset] best 99697 combination zp[2]:25 [ memset::dst#2 memset::dst#4 memset::dst#1 ] zp[2]:149 [ memset::end#0 ] reg byte x [ memset::c#7 ] zp[2]:20 [ memset::num#5 ] zp[2]:22 [ memset::str#6 ] 
Uplifting [plexPrepareInit] best 99577 combination reg byte x [ plexPrepareInit::i#2 plexPrepareInit::i#1 ] 
Uplifting [part2_loop] best 99577 combination zp[2]:164 [ part2_loop::$23 ] zp[2]:166 [ part2_loop::$24 ] 
Uplifting [part1_loop] best 99577 combination zp[2]:153 [ part1_loop::$11 ] 
Uplifting [plexBucketShow] best 99215 combination reg byte x [ plexBucketShow::real_idx#8 plexBucketShow::real_idx#4 plexBucketShow::real_idx#0 plexBucketShow::real_idx#3 ] reg byte y [ plexBucketShow::i#3 plexBucketShow::i#2 ] reg byte a [ plexBucketShow::$2 ] reg byte a [ plexBucketShow::real_idx#2 ] zp[1]:132 [ plexBucketShow::real_idx#1 ] zp[1]:131 [ plexBucketShow::plex_id#0 ] zp[1]:130 [ plexBucketShow::i#1 ] zp[1]:129 [ plexBucketShow::$1 ] zp[2]:3 [ plexBucketShow::bucket#2 plexBucketShow::bucket#1 plexBucketShow::bucket#0 ] 
Limited combination testing to 100 combinations of 15552 possible.
Uplifting [plex_scroller_move] best 98942 combination zp[1]:7 [ plex_scroller_move::s#10 plex_scroller_move::s#1 ] reg byte a [ plex_scroller_move::$8 ] reg byte a [ plex_scroller_move::letter#2 plex_scroller_move::letter#0 ] reg byte x [ plex_scroller_move::x_idx#10 plex_scroller_move::x_idx#0 plex_scroller_move::x_idx#1 ] 
Uplifting [byteboozer_decrunch] best 98942 combination zp[2]:127 [ byteboozer_decrunch::crunched ] 
Uplifting [irq_swing_plex] best 98804 combination reg byte x [ irq_swing_plex::s#2 irq_swing_plex::s#1 ] zp[2]:87 [ irq_swing_plex::$27 ] zp[2]:89 [ irq_swing_plex::$26 ] zp[2]:91 [ irq_swing_plex::$31 ] reg byte a [ irq_swing_plex::$28 ] reg byte a [ irq_swing_plex::$6 ] reg byte a [ irq_swing_plex::$16 ] zp[1]:104 [ irq_swing_plex::x_offset1#0 ] zp[1]:100 [ irq_swing_plex::coarse_scroll_diff#0 ] zp[2]:97 [ irq_swing_plex::$7 ] zp[1]:101 [ irq_swing_plex::x_offset#0 ] zp[2]:93 [ irq_swing_plex::scroll#0 ] zp[1]:99 [ irq_swing_plex::new_coarse_scroll#0 ] 
Limited combination testing to 100 combinations of 3072 possible.
Uplifting [update_frame_plex_id_offset] best 98794 combination reg byte a [ update_frame_plex_id_offset::$0 ] reg byte a [ update_frame_plex_id_offset::plex_frame_id#0 ] zp[2]:136 [ update_frame_plex_id_offset::jmp_address ] 
Uplifting [irq_flipper_bottom] best 98782 combination reg byte a [ irq_flipper_bottom::$0 ] reg byte a [ irq_flipper_bottom::$1 ] zp[2]:109 [ irq_flipper_bottom::$12 ] zp[2]:111 [ irq_flipper_bottom::$14 ] zp[2]:115 [ irq_flipper_bottom::$7 ] zp[2]:117 [ irq_flipper_bottom::$9 ] zp[2]:113 [ irq_flipper_bottom::irq_flipper_line#0 ] 
Uplifting [irq_flipper_top] best 98760 combination reg byte a [ irq_flipper_top::$0 ] reg byte a [ irq_flipper_top::$1 ] reg byte a [ irq_flipper_top::$3 ] reg byte a [ irq_flipper_top::$4 ] zp[1]:123 [ irq_flipper_top::$5 ] 
Limited combination testing to 100 combinations of 1024 possible.
Uplifting [irq_part1_top] best 98744 combination reg byte a [ irq_part1_top::$2 ] reg byte a [ irq_part1_top::$3 ] reg byte a [ irq_part1_top::$4 ] 
Uplifting [irq_swing_vsp] best 98738 combination reg byte a [ irq_swing_vsp::$1 ] 
Uplifting [raster_fine] best 98738 combination zp[1]:108 [ raster_fine::line_offset ] 
Uplifting [irq_demo] best 98738 combination zp[1]:85 [ irq_demo::port_value#0 ] 
Uplifting [MOS6526_CIA] best 98738 combination 
Uplifting [MOS6569_VICII] best 98738 combination 
Uplifting [MOS6581_SID] best 98738 combination 
Uplifting [demo_start] best 98738 combination 
Uplifting [demo_work] best 98738 combination 
Uplifting [part1_init] best 98738 combination 
Uplifting [part1_run] best 98738 combination 
Uplifting [BucketSprite] best 98738 combination 
Uplifting [plexFrameStart] best 98738 combination 
Uplifting [part2_run] best 98738 combination 
Uplifting [p2_logo_reveal] best 98738 combination 
Uplifting [irq_swing_top] best 98738 combination 
Uplifting [main] best 98738 combination 
Uplifting [demo_init] best 98738 combination 
Uplifting [__start] best 98738 combination 
Attempting to uplift remaining variables inzp[1]:38 [ plexPrepareFrame::m#2 plexPrepareFrame::m#1 ]
Uplifting [plexPrepareFrame] best 98738 combination zp[1]:38 [ plexPrepareFrame::m#2 plexPrepareFrame::m#1 ] 
Attempting to uplift remaining variables inzp[1]:47 [ plexPrepareFrame::bucket_ypos#4 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket_ypos#2 ]
Uplifting [plexPrepareFrame] best 98738 combination zp[1]:47 [ plexPrepareFrame::bucket_ypos#4 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket_ypos#2 ] 
Attempting to uplift remaining variables inzp[1]:40 [ plexPrepareFrame::i1#2 plexPrepareFrame::i1#1 ]
Uplifting [plexPrepareFrame] best 98738 combination zp[1]:40 [ plexPrepareFrame::i1#2 plexPrepareFrame::i1#1 ] 
Attempting to uplift remaining variables inzp[1]:159 [ plexPrepareFrame::$16 ]
Uplifting [plexPrepareFrame] best 98338 combination reg byte a [ plexPrepareFrame::$16 ] 
Attempting to uplift remaining variables inzp[1]:160 [ plexPrepareFrame::$17 ]
Uplifting [plexPrepareFrame] best 97738 combination reg byte x [ plexPrepareFrame::$17 ] 
Attempting to uplift remaining variables inzp[1]:163 [ plexPrepareFrame::s#2 ]
Uplifting [plexPrepareFrame] best 97138 combination reg byte x [ plexPrepareFrame::s#2 ] 
Attempting to uplift remaining variables inzp[1]:162 [ plexPrepareFrame::nxt_y#0 ]
Uplifting [plexPrepareFrame] best 97138 combination zp[1]:162 [ plexPrepareFrame::nxt_y#0 ] 
Attempting to uplift remaining variables inzp[1]:44 [ plexPrepareFrame::bucket_id#2 plexPrepareFrame::bucket_id#5 plexPrepareFrame::bucket_id#1 ]
Uplifting [plexPrepareFrame] best 97138 combination zp[1]:44 [ plexPrepareFrame::bucket_id#2 plexPrepareFrame::bucket_id#5 plexPrepareFrame::bucket_id#1 ] 
Attempting to uplift remaining variables inzp[1]:41 [ plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::real_sprite_id#1 ]
Uplifting [plexPrepareFrame] best 96238 combination reg byte x [ plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::real_sprite_id#1 ] 
Attempting to uplift remaining variables inzp[1]:84 [ sparkler_idx ]
Uplifting [] best 96238 combination zp[1]:84 [ sparkler_idx ] 
Attempting to uplift remaining variables inzp[1]:161 [ plexPrepareFrame::nxt_idx#0 ]
Uplifting [plexPrepareFrame] best 96238 combination zp[1]:161 [ plexPrepareFrame::nxt_idx#0 ] 
Attempting to uplift remaining variables inzp[1]:157 [ plexPrepareFrame::plex_id#0 ]
Uplifting [plexPrepareFrame] best 96238 combination zp[1]:157 [ plexPrepareFrame::plex_id#0 ] 
Attempting to uplift remaining variables inzp[1]:158 [ plexPrepareFrame::ypos#0 ]
Uplifting [plexPrepareFrame] best 96238 combination zp[1]:158 [ plexPrepareFrame::ypos#0 ] 
Attempting to uplift remaining variables inzp[1]:50 [ p1_work_ready ]
Uplifting [] best 96238 combination zp[1]:50 [ p1_work_ready ] 
Attempting to uplift remaining variables inzp[1]:61 [ p2_work_ready ]
Uplifting [] best 96238 combination zp[1]:61 [ p2_work_ready ] 
Attempting to uplift remaining variables inzp[1]:102 [ vsp_update_screen::x_offset ]
Uplifting [vsp_update_screen] best 96238 combination zp[1]:102 [ vsp_update_screen::x_offset ] 
Attempting to uplift remaining variables inzp[1]:66 [ p2_logo_reveal_idx ]
Uplifting [] best 96238 combination zp[1]:66 [ p2_logo_reveal_idx ] 
Attempting to uplift remaining variables inzp[1]:58 [ flipper_charline ]
Uplifting [] best 96238 combination zp[1]:58 [ flipper_charline ] 
Attempting to uplift remaining variables inzp[1]:83 [ sparkler_active ]
Uplifting [] best 96238 combination zp[1]:83 [ sparkler_active ] 
Attempting to uplift remaining variables inzp[1]:10 [ part2_init::frame_idx#2 part2_init::frame_idx#1 ]
Uplifting [part2_init] best 96238 combination zp[1]:10 [ part2_init::frame_idx#2 part2_init::frame_idx#1 ] 
Attempting to uplift remaining variables inzp[1]:63 [ p2_logo_reveal_done ]
Uplifting [] best 96238 combination zp[1]:63 [ p2_logo_reveal_done ] 
Attempting to uplift remaining variables inzp[1]:62 [ p2_logo_revealing ]
Uplifting [] best 96238 combination zp[1]:62 [ p2_logo_revealing ] 
Attempting to uplift remaining variables inzp[1]:64 [ p2_logo_swinging ]
Uplifting [] best 96238 combination zp[1]:64 [ p2_logo_swinging ] 
Attempting to uplift remaining variables inzp[1]:7 [ plex_scroller_move::s#10 plex_scroller_move::s#1 ]
Uplifting [plex_scroller_move] best 96238 combination zp[1]:7 [ plex_scroller_move::s#10 plex_scroller_move::s#1 ] 
Attempting to uplift remaining variables inzp[1]:65 [ p2_plex_scroller_moving ]
Uplifting [] best 96238 combination zp[1]:65 [ p2_plex_scroller_moving ] 
Attempting to uplift remaining variables inzp[1]:132 [ plexBucketShow::real_idx#1 ]
Uplifting [plexBucketShow] best 96108 combination reg byte x [ plexBucketShow::real_idx#1 ] 
Attempting to uplift remaining variables inzp[1]:131 [ plexBucketShow::plex_id#0 ]
Uplifting [plexBucketShow] best 96008 combination reg byte y [ plexBucketShow::plex_id#0 ] 
Attempting to uplift remaining variables inzp[1]:130 [ plexBucketShow::i#1 ]
Uplifting [plexBucketShow] best 96008 combination zp[1]:130 [ plexBucketShow::i#1 ] 
Attempting to uplift remaining variables inzp[1]:129 [ plexBucketShow::$1 ]
Uplifting [plexBucketShow] best 96002 combination reg byte a [ plexBucketShow::$1 ] 
Attempting to uplift remaining variables inzp[1]:73 [ plex_id_offset ]
Uplifting [] best 96002 combination zp[1]:73 [ plex_id_offset ] 
Attempting to uplift remaining variables inzp[1]:70 [ plex_frame_id ]
Uplifting [] best 96002 combination zp[1]:70 [ plex_frame_id ] 
Attempting to uplift remaining variables inzp[1]:60 [ plex_real_sprite_idx ]
Uplifting [] best 96002 combination zp[1]:60 [ plex_real_sprite_idx ] 
Attempting to uplift remaining variables inzp[1]:59 [ vsp_scroll ]
Uplifting [] best 96002 combination zp[1]:59 [ vsp_scroll ] 
Attempting to uplift remaining variables inzp[1]:104 [ irq_swing_plex::x_offset1#0 ]
Uplifting [irq_swing_plex] best 95996 combination reg byte a [ irq_swing_plex::x_offset1#0 ] 
Attempting to uplift remaining variables inzp[1]:123 [ irq_flipper_top::$5 ]
Uplifting [irq_flipper_top] best 95990 combination reg byte a [ irq_flipper_top::$5 ] 
Attempting to uplift remaining variables inzp[1]:100 [ irq_swing_plex::coarse_scroll_diff#0 ]
Uplifting [irq_swing_plex] best 95981 combination reg byte a [ irq_swing_plex::coarse_scroll_diff#0 ] 
Attempting to uplift remaining variables inzp[1]:77 [ vsp_fine_scroll ]
Uplifting [] best 95981 combination zp[1]:77 [ vsp_fine_scroll ] 
Attempting to uplift remaining variables inzp[1]:101 [ irq_swing_plex::x_offset#0 ]
Uplifting [irq_swing_plex] best 95981 combination zp[1]:101 [ irq_swing_plex::x_offset#0 ] 
Attempting to uplift remaining variables inzp[1]:108 [ raster_fine::line_offset ]
Uplifting [raster_fine] best 95981 combination zp[1]:108 [ raster_fine::line_offset ] 
Attempting to uplift remaining variables inzp[1]:76 [ plex_bucket_id ]
Uplifting [] best 95981 combination zp[1]:76 [ plex_bucket_id ] 
Attempting to uplift remaining variables inzp[1]:85 [ irq_demo::port_value#0 ]
Uplifting [irq_demo] best 95981 combination zp[1]:85 [ irq_demo::port_value#0 ] 
Attempting to uplift remaining variables inzp[1]:55 [ flipper_done ]
Uplifting [] best 95981 combination zp[1]:55 [ flipper_done ] 
Attempting to uplift remaining variables inzp[1]:67 [ x_movement_idx ]
Uplifting [] best 95981 combination zp[1]:67 [ x_movement_idx ] 
Attempting to uplift remaining variables inzp[1]:99 [ irq_swing_plex::new_coarse_scroll#0 ]
Uplifting [irq_swing_plex] best 95981 combination zp[1]:99 [ irq_swing_plex::new_coarse_scroll#0 ] 
Attempting to uplift remaining variables inzp[1]:80 [ sprite_color_idx ]
Uplifting [] best 95981 combination zp[1]:80 [ sprite_color_idx ] 
Attempting to uplift remaining variables inzp[1]:78 [ vsp_coarse_scroll ]
Uplifting [] best 95981 combination zp[1]:78 [ vsp_coarse_scroll ] 
Attempting to uplift remaining variables inzp[1]:79 [ vsp_sin_idx ]
Uplifting [] best 95981 combination zp[1]:79 [ vsp_sin_idx ] 
Coalescing zero page register [ zp[2]:20 [ memset::num#5 ] ] with [ zp[2]:149 [ memset::end#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:22 [ memset::str#6 ] ] with [ zp[2]:25 [ memset::dst#2 memset::dst#4 memset::dst#1 ] ] - score: 1
Coalescing zero page register [ zp[2]:27 [ memcpy::source#6 ] ] with [ zp[2]:33 [ memcpy::src#2 memcpy::src#4 memcpy::src#1 ] ] - score: 1
Coalescing zero page register [ zp[2]:29 [ memcpy::destination#6 ] ] with [ zp[2]:35 [ memcpy::dst#2 memcpy::dst#4 memcpy::dst#1 ] ] - score: 1
Coalescing zero page register [ zp[2]:31 [ memcpy::num#6 ] ] with [ zp[2]:151 [ memcpy::src_end#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:42 [ plexPrepareFrame::bucket#3 plexPrepareFrame::bucket#10 plexPrepareFrame::bucket#9 plexPrepareFrame::sprite#2 ] ] with [ zp[2]:155 [ plexPrepareFrame::bucket#1 ] ] - score: 1
Coalescing zero page register [ zp[2]:87 [ irq_swing_plex::$27 ] ] with [ zp[2]:89 [ irq_swing_plex::$26 ] ] - score: 1
Coalescing zero page register [ zp[2]:91 [ irq_swing_plex::$31 ] ] with [ zp[2]:93 [ irq_swing_plex::scroll#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:109 [ irq_flipper_bottom::$12 ] ] with [ zp[2]:111 [ irq_flipper_bottom::$14 ] ] - score: 1
Coalescing zero page register [ zp[2]:168 [ flipper_fix_colors::$4 ] ] with [ zp[2]:170 [ flipper_fix_colors::$5 ] ] - score: 1
Coalescing zero page register [ zp[2]:173 [ flipper_fix_colors::$12 ] ] with [ zp[2]:177 [ flipper_fix_colors::$14 ] ] - score: 1
Coalescing zero page register [ zp[2]:179 [ flipper_fix_colors::offset#0 ] ] with [ zp[2]:183 [ flipper_fix_colors::happy_cols#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:87 [ irq_swing_plex::$27 irq_swing_plex::$26 ] ] with [ zp[2]:91 [ irq_swing_plex::$31 irq_swing_plex::scroll#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:109 [ irq_flipper_bottom::$12 irq_flipper_bottom::$14 ] ] with [ zp[2]:113 [ irq_flipper_bottom::irq_flipper_line#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:173 [ flipper_fix_colors::$12 flipper_fix_colors::$14 ] ] with [ zp[2]:179 [ flipper_fix_colors::offset#0 flipper_fix_colors::happy_cols#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:87 [ irq_swing_plex::$27 irq_swing_plex::$26 irq_swing_plex::$31 irq_swing_plex::scroll#0 ] ] with [ zp[2]:97 [ irq_swing_plex::$7 ] ] - score: 1
Coalescing zero page register [ zp[2]:17 [ init_rasters::i#2 init_rasters::i#1 ] ] with [ zp[2]:11 [ part2_init::frame#5 part2_init::frame#1 ] ]
Coalescing zero page register [ zp[2]:27 [ memcpy::source#6 memcpy::src#2 memcpy::src#4 memcpy::src#1 ] ] with [ zp[2]:20 [ memset::num#5 memset::end#0 ] ]
Coalescing zero page register [ zp[2]:29 [ memcpy::destination#6 memcpy::dst#2 memcpy::dst#4 memcpy::dst#1 ] ] with [ zp[2]:22 [ memset::str#6 memset::dst#2 memset::dst#4 memset::dst#1 ] ]
Coalescing zero page register [ zp[2]:42 [ plexPrepareFrame::bucket#3 plexPrepareFrame::bucket#10 plexPrepareFrame::bucket#9 plexPrepareFrame::sprite#2 plexPrepareFrame::bucket#1 ] ] with [ zp[2]:31 [ memcpy::num#6 memcpy::src_end#0 ] ]
Coalescing zero page register [ zp[1]:99 [ irq_swing_plex::new_coarse_scroll#0 ] ] with [ zp[1]:7 [ plex_scroller_move::s#10 plex_scroller_move::s#1 ] ]
Coalescing zero page register [ zp[2]:147 [ init_rasters::$3 ] ] with [ zp[2]:45 [ plexPrepareFrame::sprite#4 plexPrepareFrame::sprite#3 plexPrepareFrame::frame#0 plexPrepareFrame::sprite#1 plexPrepareFrame::sprite#13 ] ]
Coalescing zero page register [ zp[2]:164 [ part2_loop::$23 ] ] with [ zp[2]:153 [ part1_loop::$11 ] ]
Coalescing zero page register [ zp[2]:168 [ flipper_fix_colors::$4 flipper_fix_colors::$5 ] ] with [ zp[2]:166 [ part2_loop::$24 ] ]
Coalescing zero page register [ zp[2]:147 [ init_rasters::$3 plexPrepareFrame::sprite#4 plexPrepareFrame::sprite#3 plexPrepareFrame::frame#0 plexPrepareFrame::sprite#1 plexPrepareFrame::sprite#13 ] ] with [ zp[2]:27 [ memcpy::source#6 memcpy::src#2 memcpy::src#4 memcpy::src#1 memset::num#5 memset::end#0 ] ]
Coalescing zero page register [ zp[2]:164 [ part2_loop::$23 part1_loop::$11 ] ] with [ zp[2]:17 [ init_rasters::i#2 init_rasters::i#1 part2_init::frame#5 part2_init::frame#1 ] ]
Coalescing zero page register [ zp[2]:168 [ flipper_fix_colors::$4 flipper_fix_colors::$5 part2_loop::$24 ] ] with [ zp[2]:29 [ memcpy::destination#6 memcpy::dst#2 memcpy::dst#4 memcpy::dst#1 memset::str#6 memset::dst#2 memset::dst#4 memset::dst#1 ] ]
Coalescing zero page register [ zp[2]:173 [ flipper_fix_colors::$12 flipper_fix_colors::$14 flipper_fix_colors::offset#0 flipper_fix_colors::happy_cols#0 ] ] with [ zp[2]:42 [ plexPrepareFrame::bucket#3 plexPrepareFrame::bucket#10 plexPrepareFrame::bucket#9 plexPrepareFrame::sprite#2 plexPrepareFrame::bucket#1 memcpy::num#6 memcpy::src_end#0 ] ]
Coalescing zero page register [ zp[2]:175 [ flipper_fix_colors::$13 ] ] with [ zp[2]:147 [ init_rasters::$3 plexPrepareFrame::sprite#4 plexPrepareFrame::sprite#3 plexPrepareFrame::frame#0 plexPrepareFrame::sprite#1 plexPrepareFrame::sprite#13 memcpy::source#6 memcpy::src#2 memcpy::src#4 memcpy::src#1 memset::num#5 memset::end#0 ] ]
Allocated (was zp[2]:3) zp[2]:2 [ plexBucketShow::bucket#2 plexBucketShow::bucket#1 plexBucketShow::bucket#0 ]
Allocated (was zp[1]:10) zp[1]:4 [ part2_init::frame_idx#2 part2_init::frame_idx#1 ]
Allocated (was zp[1]:38) zp[1]:5 [ plexPrepareFrame::m#2 plexPrepareFrame::m#1 ]
Allocated (was zp[1]:40) zp[1]:6 [ plexPrepareFrame::i1#2 plexPrepareFrame::i1#1 ]
Allocated (was zp[1]:44) zp[1]:7 [ plexPrepareFrame::bucket_id#2 plexPrepareFrame::bucket_id#5 plexPrepareFrame::bucket_id#1 ]
Allocated (was zp[1]:47) zp[1]:8 [ plexPrepareFrame::bucket_ypos#4 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket_ypos#2 ]
Allocated (was zp[1]:50) zp[1]:9 [ p1_work_ready ]
Allocated (was zp[2]:51) zp[2]:10 [ irq_flipper_top_line ]
Allocated (was zp[2]:53) zp[2]:12 [ irq_flipper_bottom_line ]
Allocated (was zp[1]:55) zp[1]:14 [ flipper_done ]
Allocated (was zp[2]:56) zp[2]:15 [ irq_flipper_idx ]
Allocated (was zp[1]:58) zp[1]:17 [ flipper_charline ]
Allocated (was zp[1]:59) zp[1]:18 [ vsp_scroll ]
Allocated (was zp[1]:60) zp[1]:19 [ plex_real_sprite_idx ]
Allocated (was zp[1]:61) zp[1]:20 [ p2_work_ready ]
Allocated (was zp[1]:62) zp[1]:21 [ p2_logo_revealing ]
Allocated (was zp[1]:63) zp[1]:22 [ p2_logo_reveal_done ]
Allocated (was zp[1]:64) zp[1]:23 [ p2_logo_swinging ]
Allocated (was zp[1]:65) zp[1]:24 [ p2_plex_scroller_moving ]
Allocated (was zp[1]:66) zp[1]:25 [ p2_logo_reveal_idx ]
Allocated (was zp[1]:67) zp[1]:26 [ x_movement_idx ]
Allocated (was zp[2]:68) zp[2]:27 [ scroll_text_next ]
Allocated (was zp[1]:70) zp[1]:29 [ plex_frame_id ]
Allocated (was zp[2]:71) zp[2]:30 [ plex_frame ]
Allocated (was zp[1]:73) zp[1]:32 [ plex_id_offset ]
Allocated (was zp[2]:74) zp[2]:33 [ plex_bucket ]
Allocated (was zp[1]:76) zp[1]:35 [ plex_bucket_id ]
Allocated (was zp[1]:77) zp[1]:36 [ vsp_fine_scroll ]
Allocated (was zp[1]:78) zp[1]:37 [ vsp_coarse_scroll ]
Allocated (was zp[1]:79) zp[1]:38 [ vsp_sin_idx ]
Allocated (was zp[1]:80) zp[1]:39 [ sprite_color_idx ]
Allocated (was zp[2]:81) zp[2]:40 [ demo_frame_count ]
Allocated (was zp[1]:83) zp[1]:42 [ sparkler_active ]
Allocated (was zp[1]:84) zp[1]:43 [ sparkler_idx ]
Allocated (was zp[1]:85) zp[1]:44 [ irq_demo::port_value#0 ]
Allocated (was zp[2]:87) zp[2]:45 [ irq_swing_plex::$27 irq_swing_plex::$26 irq_swing_plex::$31 irq_swing_plex::scroll#0 irq_swing_plex::$7 ]
Allocated (was zp[1]:99) zp[1]:47 [ irq_swing_plex::new_coarse_scroll#0 plex_scroller_move::s#10 plex_scroller_move::s#1 ]
Allocated (was zp[1]:101) zp[1]:48 [ irq_swing_plex::x_offset#0 ]
Allocated (was zp[1]:102) zp[1]:49 [ vsp_update_screen::x_offset ]
Allocated (was zp[1]:108) zp[1]:50 [ raster_fine::line_offset ]
Allocated (was zp[2]:109) zp[2]:51 [ irq_flipper_bottom::$12 irq_flipper_bottom::$14 irq_flipper_bottom::irq_flipper_line#0 ]
Allocated (was zp[2]:115) zp[2]:53 [ irq_flipper_bottom::$7 ]
Allocated (was zp[2]:117) zp[2]:55 [ irq_flipper_bottom::$9 ]
Allocated (was zp[2]:127) zp[2]:57 [ byteboozer_decrunch::crunched ]
Allocated (was zp[1]:130) zp[1]:59 [ plexBucketShow::i#1 ]
Allocated (was zp[2]:136) zp[2]:60 [ update_frame_plex_id_offset::jmp_address ]
Allocated (was zp[2]:138) zp[2]:62 [ vsp_update_screen::$5 ]
Allocated (was zp[2]:140) zp[2]:64 [ vsp_update_screen::x_offset8 ]
Allocated (was zp[1]:157) zp[1]:66 [ plexPrepareFrame::plex_id#0 ]
Allocated (was zp[1]:158) zp[1]:67 [ plexPrepareFrame::ypos#0 ]
Allocated (was zp[1]:161) zp[1]:68 [ plexPrepareFrame::nxt_idx#0 ]
Allocated (was zp[1]:162) zp[1]:69 [ plexPrepareFrame::nxt_y#0 ]
Allocated (was zp[2]:164) zp[2]:70 [ part2_loop::$23 part1_loop::$11 init_rasters::i#2 init_rasters::i#1 part2_init::frame#5 part2_init::frame#1 ]
Allocated (was zp[2]:168) zp[2]:72 [ flipper_fix_colors::$4 flipper_fix_colors::$5 part2_loop::$24 memcpy::destination#6 memcpy::dst#2 memcpy::dst#4 memcpy::dst#1 memset::str#6 memset::dst#2 memset::dst#4 memset::dst#1 ]
Allocated (was zp[2]:173) zp[2]:74 [ flipper_fix_colors::$12 flipper_fix_colors::$14 flipper_fix_colors::offset#0 flipper_fix_colors::happy_cols#0 plexPrepareFrame::bucket#3 plexPrepareFrame::bucket#10 plexPrepareFrame::bucket#9 plexPrepareFrame::sprite#2 plexPrepareFrame::bucket#1 memcpy::num#6 memcpy::src_end#0 ]
Allocated (was zp[2]:175) zp[2]:76 [ flipper_fix_colors::$13 init_rasters::$3 plexPrepareFrame::sprite#4 plexPrepareFrame::sprite#3 plexPrepareFrame::frame#0 plexPrepareFrame::sprite#1 plexPrepareFrame::sprite#13 memcpy::source#6 memcpy::src#2 memcpy::src#4 memcpy::src#1 memset::num#5 memset::end#0 ]
Allocated (was zp[2]:181) zp[2]:78 [ flipper_fix_colors::colors#0 ]
Interrupt procedure irq_part1_top clobbers AcnzP
Interrupt procedure irq_flipper_top clobbers AXYcnzPS
Interrupt procedure irq_flipper_bottom clobbers AXYcnzvPS
Interrupt procedure irq_swing_top clobbers AXYcnzvPS
Interrupt procedure irq_swing_vsp clobbers AXnzP
Interrupt procedure irq_swing_plex clobbers AXYcnzvPS
Interrupt procedure irq_demo clobbers AXYZcnzvidePSB

ASSEMBLER BEFORE OPTIMIZATION
  // File Comments
// The Demo collects the parts and handles overall control
  // Upstart
  // Commodore 64 PRG executable file
.plugin "se.triad.kickass.CruncherPlugins"
.file [name="new_30_years_low_resolution.prg", type="prg", segments="Program"]
.segmentdef Program [segments="Basic, Common, Part2, Part1, InitDemo"]
.segmentdef Basic [start=$0801]
.segmentdef Common [segments="Code, Data"]
.segmentdef   Code [start=$80d]
.segmentdef   Data [startAfter="Code"]
.segmentdef Part2 [segments="CodePart2, DataPart2, InitPart2"]
.segmentdef   CodePart2 [startAfter="Data"]
.segmentdef   DataPart2 [startAfter="CodePart2"]
.segmentdef   InitPart2 [startAfter="DataPart2"]
.segmentdef Part1 [segments="CodePart1, DataPart1, InitPart1"]
.segmentdef   CodePart1 [startAfter="InitPart2"]
.segmentdef   DataPart1 [startAfter="CodePart1"]
.segmentdef   InitPart1 [startAfter="DataPart1"]
.segmentdef InitDemo [startAfter="InitPart1"]
.segment Basic
:BasicUpstart(__start)
  // Global Constants & labels
  /// Value that disables all CIA interrupts when stored to the CIA Interrupt registers
  .const CIA_INTERRUPT_CLEAR = $7f
  /// $D011 Control Register #1  Bit#5: BMM Turn Bitmap Mode on/off
  .const VICII_BMM = $20
  /// $D016 Control register #2 Bit#4: MCM Turn Multicolor Mode on/off
  .const VICII_MCM = $10
  /// VICII IRQ Status/Enable Raster
  // @see #IRQ_ENABLE #IRQ_STATUS
  ///  0 | RST| Reaching a certain raster line. The line is specified by writing
  ///    |    | to register 0xd012 and bit 7 of $d011 and internally stored by
  ///    |    | the VIC for the raster compare. The test for reaching the
  ///    |    | interrupt raster line is done in cycle 0 of every line (for line
  ///    |    | 0, in cycle 1).
  .const IRQ_RASTER = 1
  /// Mask for PROCESSOR_PORT_DDR which allows only memory configuration to be written
  .const PROCPORT_DDR_MEMORY_MASK = 7
  /// RAM in all three areas 0xA000, 0xD000, 0xE000
  .const PROCPORT_RAM_ALL = 0
  /// RAM in 0xA000, 0xE000 I/O in 0xD000
  .const PROCPORT_RAM_IO = 5
  /// RAM in 0xA000, 0xE000 CHAR ROM in 0xD000
  .const PROCPORT_RAM_CHARROM = 1
  /// The colors of the C64
  .const BLACK = 0
  .const WHITE = 1
  .const RED = 2
  .const CYAN = 3
  .const PURPLE = 4
  .const GREEN = 5
  .const BLUE = 6
  .const YELLOW = 7
  .const BROWN = 9
  .const PINK = $a
  .const GREY = $c
  .const LIGHT_GREEN = $d
  .const LIGHT_BLUE = $e
  .const IRQ_PART1_TOP_LINE = $36
  .const SIZEOF_STRUCT_BUCKETSPRITE = 2
  // -0xFF72
  // Size of the crunched PLEX ID updaters 
  .const PLEX_ID_UPDATERS_CRUNCHED_SIZE = $b72
  // -0xAA2D
  // Size of the crunched PLEX ID updaters 
  .const LOGO_DATA_CRUNCHED_SIZE = $222d
  // Char-based sizes for the logo
  .const LOGO_HEIGHT = $19
  .const LOGO_WIDTH = $50
  // IRQ performing the VSP
  .const IRQ_SWING_VSP_LINE = $2d
  .const OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d
  .const OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC = $1c
  .const OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR = $27
  .const OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1 = $25
  .const OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2 = $26
  .const OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB = $10
  .const OFFSET_STRUCT_MOS6569_VICII_SPRITE0_Y = 1
  .const OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE = $15
  .const OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR = $20
  .const OFFSET_STRUCT_MOS6569_VICII_BG_COLOR = $21
  .const OFFSET_STRUCT_MOS6569_VICII_CONTROL1 = $11
  .const OFFSET_STRUCT_MOS6569_VICII_CONTROL2 = $16
  .const OFFSET_STRUCT_MOS6569_VICII_MEMORY = $18
  .const OFFSET_STRUCT_BUCKETSPRITE_PLEX_ID = 1
  .const SIZEOF_CHAR = 1
  /// 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
  /// $D021 Background Color 0
  .label BG_COLOR = $d021
  /// $D011 Control Register #1
  /// - Bit#0-#2: YSCROLL Screen Soft Scroll Vertical
  /// - Bit#3: RSEL Switch betweem 25 or 24 visible rows
  ///          RSEL|  Display window height   | First line  | Last line
  ///          ----+--------------------------+-------------+----------
  ///            0 | 24 text lines/192 pixels |   55 ($37)  | 246 ($f6)
  ///            1 | 25 text lines/200 pixels |   51 ($33)  | 250 ($fa)
  /// - Bit#4: DEN Switch VIC-II output on/off
  /// - Bit#5: BMM Turn Bitmap Mode on/off
  /// - Bit#6: ECM Turn Extended Color Mode on/off
  /// - Bit#7: RST8 9th Bit for $D012 Rasterline counter
  /// Initial Value: %10011011
  .label VICII_CONTROL1 = $d011
  /// $D016 Control register 2
  /// -  Bit#0-#2: XSCROLL Screen Soft Scroll Horizontal
  /// -  Bit#3: CSEL Switch betweem 40 or 38 visible columns
  ///           CSEL|   Display window width   | First X coo. | Last X coo.
  ///           ----+--------------------------+--------------+------------
  ///             0 | 38 characters/304 pixels |   31 ($1f)   |  334 ($14e)
  ///             1 | 40 characters/320 pixels |   24 ($18)   |  343 ($157)
  /// -  Bit#4: MCM Turn Multicolor Mode on/off
  /// -  Bit#5-#7: not used
  /// Initial Value: %00001000
  .label VICII_CONTROL2 = $d016
  /// $D018 VIC-II base addresses
  /// - Bit#0: not used
  /// - Bit#1-#3: CB Address Bits 11-13 of the Character Set (*2048)
  /// - Bit#4-#7: VM Address Bits 10-13 of the Screen RAM (*1024)
  /// Initial Value: %00010100
  .label VICII_MEMORY = $d018
  /// VIC II IRQ Status Register
  .label IRQ_STATUS = $d019
  /// VIC II IRQ Enable Register
  .label IRQ_ENABLE = $d01a
  /// Processor port data direction register
  .label PROCPORT_DDR = 0
  /// Processor Port Register controlling RAM/ROM configuration and the datasette
  .label PROCPORT = 1
  /// The address of the CHARGEN character set
  .label CHARGEN = $d000
  /// The VIC-II MOS 6567/6569
  .label VICII = $d000
  /// Color Ram
  .label COLS = $d800
  /// Default address of screen character matrix
  .label DEFAULT_SCREEN = $400
  /// The CIA#1: keyboard matrix, joystick #1/#2
  .label CIA1 = $dc00
  /// The CIA#2: Serial bus, RS-232, VIC memory bank
  .label CIA2 = $dd00
  /// CIA#1 Interrupt for reading in ASM
  .label CIA1_INTERRUPT = $dc0d
  /// The vector used when the HARDWARE serves IRQ interrupts
  .label HARDWARE_IRQ = $fffe
  .label P1_COLORS = $a800
  // A800-AFFF
  .label P1_PIXELS = $c000
  // C000-DFFF
  .label P1_SCREEN = $e000
  // E000-E3FF
  .label P1_SPRITES = $fc00
  // E000-E3FF
  .label PIXELS_EMPTY = $e800
  // E800-EFFF
  // A copy of the load screen and colors
  .label LOAD_SCREEN = $e400
  // E400-E7FF
  .label LOAD_CHARSET = $f000
  // F000-F7FF
  .label LOAD_COLORS = $f800
  // Flipper cosine easing table
  .label FLIPPER_EASING = $a400
  // Sprite pointers 
  .label P1_SCREEN_SPRITE_PTRS = $e3f8
  // The screen sprite pointers to update
  .label SCREEN_SPRITE_PTRS = $e3f8
  // Memory layout of the graphics bank
  .label LOGO_DATA = $5400
  .label PART2_BITMAP = $c000
  // -0xdfff
  .label PART2_SCREEN = $e000
  // -0xe400
  .label PART2_SPRITES = $e400
  // -0xf400
  // Location PLEX ID updaters are placed when running
  .label PLEX_ID_UPDATERS = $3c00
  // Location where the crunched PLEX ID updaters are placed to be decrunched
  .label PLEX_ID_UPDATERS_CRUNCHED2 = $7c00
  // Location where the crunched LOGO DATA is placed  to be decrunched
  .label LOGO_DATA_CRUNCHED2 = $8800
  // Address of color data
  .label LOGO_DATA_COLORS = LOGO_DATA+LOGO_HEIGHT*LOGO_WIDTH
  // Address of pixel data
  .label LOGO_DATA_BITMAP = LOGO_DATA_COLORS+LOGO_HEIGHT*LOGO_WIDTH
  // The high-value table
  .label XMOVEMENT_HI = XMOVEMENT+$200
  .label DEMO_MUSIC = $ac00
  // Pointer to the music init routine
  .label musicInit = DEMO_MUSIC
  // Pointer to the music play routine
  .label musicPlay = DEMO_MUSIC+3
  // Signals the main() loop to do work when all rasters are complete
  .label p1_work_ready = 9
  // Top of the flipper
  .label irq_flipper_top_line = $a
  // Bottom of the flipper
  .label irq_flipper_bottom_line = $c
  // 1 if flipper is done
  .label flipper_done = $e
  // Middle of the flipper
  .label irq_flipper_idx = $f
  // The current char line where the flipper switches from bitmap to text
  .label flipper_charline = $11
  // The number of chars to scroll the screen by VSP. 
  // Legal values are 0-40.
  //  0 shows the normal screen (no scrolling)
  // 20 shows char #20 in the top left corner of the screen, effectively scrolling the screen left 20 chars.
  .label vsp_scroll = $12
  // The next "real" sprite being used by the multiplexer
  .label plex_real_sprite_idx = $13
  // Signals the main() loop to do work when all rasters are complete
  .label p2_work_ready = $14
  // 1 if the logo is being revealed
  .label p2_logo_revealing = $15
  // 1 if the logo is completely revealed
  .label p2_logo_reveal_done = $16
  // 1 if the logo is being showed
  .label p2_logo_swinging = $17
  // 1 if the scroll is moving
  .label p2_plex_scroller_moving = $18
  // Number of columns shown of the logo
  .label p2_logo_reveal_idx = $19
  // X-movement index
  .label x_movement_idx = $1a
  // The next char to use from the scroll text
  .label scroll_text_next = $1b
  // The current frame ID (0-7)
  .label plex_frame_id = $1d
  // Pointer to the buckets of the current frame
  .label plex_frame = $1e
  // Offset added to plex_id to ensure the sprite cycling works (decreased 1 every time a cycle is complete)
  .label plex_id_offset = $20
  // Pointer to the current bucket of the current frame
  .label plex_bucket = $21
  // Index of the current bucket in the current frame (0..BUCKET_COUNT-1)
  .label plex_bucket_id = $23
  // The fine scroll (0-7)
  .label vsp_fine_scroll = $24
  // The coarse scroll (0-40)
  .label vsp_coarse_scroll = $25
  // Index into the VSP sinus value
  .label vsp_sin_idx = $26
  // Index into the sprite color sequence
  .label sprite_color_idx = $27
  // Counts total demo frames
  .label demo_frame_count = $28
  // Is the sparkler active
  .label sparkler_active = $2a
  // The sparkler sprite idx
  .label sparkler_idx = $2b
.segment Code
  // __start
__start: {
    jmp __init1
    // __start::__init1
  __init1:
    // [1] p1_work_ready = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z p1_work_ready
    // [2] irq_flipper_top_line = 0 -- vwuz1=vwuc1 
    lda #<0
    sta.z irq_flipper_top_line
    lda #>0
    sta.z irq_flipper_top_line+1
    // [3] irq_flipper_bottom_line = 8 -- vwuz1=vwuc1 
    lda #<8
    sta.z irq_flipper_bottom_line
    lda #>8
    sta.z irq_flipper_bottom_line+1
    // [4] flipper_done = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z flipper_done
    // [5] irq_flipper_idx = 0 -- vwuz1=vwuc1 
    lda #<0
    sta.z irq_flipper_idx
    lda #>0
    sta.z irq_flipper_idx+1
    // [6] flipper_charline = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z flipper_charline
    // [7] vsp_scroll = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z vsp_scroll
    // [8] plex_real_sprite_idx = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z plex_real_sprite_idx
    // [9] p2_work_ready = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z p2_work_ready
    // [10] p2_logo_revealing = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z p2_logo_revealing
    // [11] p2_logo_reveal_done = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z p2_logo_reveal_done
    // [12] p2_logo_swinging = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z p2_logo_swinging
    // [13] p2_plex_scroller_moving = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z p2_plex_scroller_moving
    // [14] p2_logo_reveal_idx = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z p2_logo_reveal_idx
    // [15] x_movement_idx = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z x_movement_idx
    // [16] scroll_text_next = SCROLL_TEXT -- pbuz1=pbuc1 
    lda #<SCROLL_TEXT
    sta.z scroll_text_next
    lda #>SCROLL_TEXT
    sta.z scroll_text_next+1
    // [17] plex_frame_id = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z plex_frame_id
    // [18] plex_frame = BUCKET_SPRITES -- pssz1=pssc1 
    lda #<BUCKET_SPRITES
    sta.z plex_frame
    lda #>BUCKET_SPRITES
    sta.z plex_frame+1
    // [19] plex_id_offset = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z plex_id_offset
    // [20] plex_bucket = BUCKET_SPRITES -- pssz1=pssc1 
    lda #<BUCKET_SPRITES
    sta.z plex_bucket
    lda #>BUCKET_SPRITES
    sta.z plex_bucket+1
    // [21] plex_bucket_id = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z plex_bucket_id
    // [22] vsp_fine_scroll = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z vsp_fine_scroll
    // [23] vsp_coarse_scroll = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z vsp_coarse_scroll
    // [24] vsp_sin_idx = $40 -- vbuz1=vbuc1 
    lda #$40
    sta.z vsp_sin_idx
    // [25] sprite_color_idx = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z sprite_color_idx
    // [26] demo_frame_count = 0 -- vwuz1=vwuc1 
    lda #<0
    sta.z demo_frame_count
    lda #>0
    sta.z demo_frame_count+1
    // [27] sparkler_active = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z sparkler_active
    // [28] sparkler_idx = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z sparkler_idx
    // [29] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1]
  __b1_from___init1:
    jmp __b1
    // __start::@1
  __b1:
    // [30] call main
    // [182] phi from __start::@1 to main [phi:__start::@1->main]
  main_from___b1:
    jsr main
    jmp __breturn
    // __start::@return
  __breturn:
    // [31] return 
    rts
}
  // irq_demo
// IRQ running during between parts
irq_demo: {
    .label port_value = $2c
    // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry 
    sta rega+1
    stx regx+1
    sty regy+1
    // [32] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Remember processor port value
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // [33] irq_demo::port_value#0 = *PROCPORT -- vbuz1=_deref_pbuc1 
    lda PROCPORT
    sta.z port_value
    // [34] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Enable IO
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // [35] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_IO
    sta PROCPORT
    // [36] call demo_work
    // Perform any demo work
    jsr demo_work
    jmp __b1
    // irq_demo::@1
  __b1:
    // [37] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Acknowledge the IRQ
    lda #IRQ_RASTER
    sta IRQ_STATUS
    // [38] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Restore processor port value
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // [39] *PROCPORT = irq_demo::port_value#0 -- _deref_pbuc1=vbuz1 
    lda.z port_value
    sta PROCPORT
    jmp __breturn
    // irq_demo::@return
  __breturn:
    // [40] return 
    // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit 
  rega:
    lda #0
  regx:
    ldx #0
  regy:
    ldy #0
    rti
}
.segment CodePart2
  // irq_swing_plex
// Show sprites from the multiplexer, rescheduling the IRQ for each bucket
irq_swing_plex: {
    // Move to the next frame of the plexer
    .const YMOVE = 3
    .label __7 = $2d
    .label __26 = $2d
    .label __27 = $2d
    .label scroll = $2d
    .label new_coarse_scroll = $2f
    .label x_offset = $30
    .label __31 = $2d
    // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry 
    sta rega+1
    stx regx+1
    sty regy+1
    // [41] plexBucketShow::bucket#1 = plex_bucket -- pssz1=pssz2 
    lda.z plex_bucket
    sta.z plexBucketShow.bucket
    lda.z plex_bucket+1
    sta.z plexBucketShow.bucket+1
    // [42] call plexBucketShow
  //*BORDER_COLOR = DARK_GREY;
  // Show the bucket
    // [207] phi from irq_swing_plex to plexBucketShow [phi:irq_swing_plex->plexBucketShow]
  plexBucketShow_from_irq_swing_plex:
    // [207] phi plexBucketShow::bucket#2 = plexBucketShow::bucket#1 [phi:irq_swing_plex->plexBucketShow#0] -- register_copy 
    jsr plexBucketShow
    jmp __b17
    // irq_swing_plex::@17
  __b17:
    // [43] plex_bucket = plex_bucket + 8*SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_plus_vbuc1 
    // Move forward to the next bucket
    lda #8*SIZEOF_STRUCT_BUCKETSPRITE
    clc
    adc.z plex_bucket
    sta.z plex_bucket
    bcc !+
    inc.z plex_bucket+1
  !:
    // [44] plex_bucket_id = ++ plex_bucket_id -- vbuz1=_inc_vbuz1 
    inc.z plex_bucket_id
    // [45] if(plex_bucket_id<9) goto irq_swing_plex::@1 -- vbuz1_lt_vbuc1_then_la1 
    lda.z plex_bucket_id
    cmp #9
    bcc __b1
    jmp __b3
    // irq_swing_plex::@3
  __b3:
    // [46] *HARDWARE_IRQ = &irq_swing_top -- _deref_qprc1=pprc2 
    // We are done with this frame - finish it and perform other stuff!
    //VICII->BORDER_COLOR = RED;
    // Set up the TOP IRQ
    lda #<irq_swing_top
    sta HARDWARE_IRQ
    lda #>irq_swing_top
    sta HARDWARE_IRQ+1
    // [47] *RASTER = *BUCKET_YPOS -- _deref_pbuc1=_deref_pbuc2 
    lda BUCKET_YPOS
    sta RASTER
    // [48] plex_frame_id = plex_frame_id + irq_swing_plex::YMOVE -- vbuz1=vbuz1_plus_vbuc1 
    lax.z plex_frame_id
    axs #-[YMOVE]
    stx.z plex_frame_id
    // [49] plex_frame = plex_frame + (unsigned int)irq_swing_plex::YMOVE*9*8*SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_plus_vwuc1 
    lda.z plex_frame
    clc
    adc #<YMOVE*9*8*SIZEOF_STRUCT_BUCKETSPRITE
    sta.z plex_frame
    lda.z plex_frame+1
    adc #>YMOVE*9*8*SIZEOF_STRUCT_BUCKETSPRITE
    sta.z plex_frame+1
    // [50] if(plex_frame_id<8) goto irq_swing_plex::@5 -- vbuz1_lt_vbuc1_then_la1 
    lda.z plex_frame_id
    cmp #8
    bcc __b5
    jmp __b4
    // irq_swing_plex::@4
  __b4:
    // [51] plex_frame = plex_frame - (unsigned int)9*8*8*SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_minus_vwuc1 
    // Reset to start of cycle 
    lda.z plex_frame
    sec
    sbc #<9*8*8*SIZEOF_STRUCT_BUCKETSPRITE
    sta.z plex_frame
    lda.z plex_frame+1
    sbc #>9*8*8*SIZEOF_STRUCT_BUCKETSPRITE
    sta.z plex_frame+1
    // [52] plex_frame_id = plex_frame_id - 8 -- vbuz1=vbuz1_minus_vbuc1 
    lax.z plex_frame_id
    axs #8
    stx.z plex_frame_id
    // [53] plex_id_offset = -- plex_id_offset -- vbuz1=_dec_vbuz1 
    dec.z plex_id_offset
    jmp __b5
    // irq_swing_plex::@5
  __b5:
    // [54] update_frame_plex_id_offset::plex_frame_id#0 = plex_frame_id -- vbuaa=vbuz1 
    lda.z plex_frame_id
    // [55] call update_frame_plex_id_offset
    // Update plex_id in the next frame
    //VICII->BORDER_COLOR = BLUE;
    jsr update_frame_plex_id_offset
    jmp __b18
    // irq_swing_plex::@18
  __b18:
    // [56] if(0==p2_logo_swinging) goto irq_swing_plex::@6 -- 0_eq_vbuz1_then_la1 
    lda.z p2_logo_swinging
    beq __b6
    jmp __b12
    // irq_swing_plex::@12
  __b12:
    // [57] irq_swing_plex::$27 = (unsigned int)vsp_sin_idx -- vwuz1=_word_vbuz2 
    lda.z vsp_sin_idx
    sta.z __27
    lda #0
    sta.z __27+1
    // [58] irq_swing_plex::$26 = irq_swing_plex::$27 << 1 -- vwuz1=vwuz1_rol_1 
    asl.z __26
    rol.z __26+1
    // [59] irq_swing_plex::$31 = VSP_SINTABLE + irq_swing_plex::$26 -- pwuz1=pwuc1_plus_vwuz1 
    lda.z __31
    clc
    adc #<VSP_SINTABLE
    sta.z __31
    lda.z __31+1
    adc #>VSP_SINTABLE
    sta.z __31+1
    // [60] irq_swing_plex::scroll#0 = *irq_swing_plex::$31 -- vwuz1=_deref_pwuz1 
    // Update the VSP value with a sinus
    ldy #0
    lda (scroll),y
    pha
    iny
    lda (scroll),y
    sta.z scroll+1
    pla
    sta.z scroll
    // [61] vsp_sin_idx = ++ vsp_sin_idx -- vbuz1=_inc_vbuz1 
    inc.z vsp_sin_idx
    // [62] irq_swing_plex::$28 = (char)irq_swing_plex::scroll#0 -- vbuaa=_byte_vwuz1 
    lda.z scroll
    // [63] irq_swing_plex::$6 = irq_swing_plex::$28 & 7 -- vbuaa=vbuaa_band_vbuc1 
    and #7
    // [64] vsp_fine_scroll = irq_swing_plex::$6 -- vbuz1=vbuaa 
    sta.z vsp_fine_scroll
    // [65] irq_swing_plex::$7 = irq_swing_plex::scroll#0 >> 3 -- vwuz1=vwuz1_ror_3 
    lsr.z __7+1
    ror.z __7
    lsr.z __7+1
    ror.z __7
    lsr.z __7+1
    ror.z __7
    // [66] irq_swing_plex::new_coarse_scroll#0 = (char)irq_swing_plex::$7 -- vbuz1=_byte_vwuz2 
    lda.z __7
    sta.z new_coarse_scroll
    // [67] irq_swing_plex::coarse_scroll_diff#0 = vsp_coarse_scroll - irq_swing_plex::new_coarse_scroll#0 -- vbuaa=vbuz1_minus_vbuz2 
    // Update the VSP value with a sinus
    lda.z vsp_coarse_scroll
    sec
    sbc.z new_coarse_scroll
    // [68] if(irq_swing_plex::coarse_scroll_diff#0==1) goto irq_swing_plex::@7 -- vbuaa_eq_vbuc1_then_la1 
    // Update screen column (if needed)
    cmp #1
    beq __b7
    jmp __b13
    // irq_swing_plex::@13
  __b13:
    // [69] if(irq_swing_plex::coarse_scroll_diff#0!=$ff) goto irq_swing_plex::@8 -- vbuaa_neq_vbuc1_then_la1 
    cmp #$ff
    bne __b8
    jmp __b14
    // irq_swing_plex::@14
  __b14:
    // [70] irq_swing_plex::x_offset#0 = $27 - vsp_coarse_scroll -- vbuz1=vbuc1_minus_vbuz2 
    // Moving right - put a new column at the left border
    lda #$27
    sec
    sbc.z vsp_coarse_scroll
    sta.z x_offset
    // [71] vsp_update_screen::x_offset = irq_swing_plex::x_offset#0 -- vbuz1=vbuz2 
    lda.z x_offset
    sta.z vsp_update_screen.x_offset
    // [72] call vsp_update_screen
    jsr vsp_update_screen
    jmp __b19
    // irq_swing_plex::@19
  __b19:
    // [73] (PART2_SCREEN+(unsigned int)$18*$28)[irq_swing_plex::x_offset#0] = 0 -- pbuc1_derefidx_vbuz1=vbuc2 
    // Clear line 25 - because the start of the last line was over-written by line #24 chars 40-80
    lda #0
    ldy.z x_offset
    sta PART2_SCREEN+$18*$28,y
    // [74] (COLS+(unsigned int)$18*$28)[irq_swing_plex::x_offset#0] = 0 -- pbuc1_derefidx_vbuz1=vbuc2 
    //(LOGO_DATA_SCREEN+24*80)[x_offset];
    lda #0
    ldy.z x_offset
    sta COLS+$18*$28,y
    jmp __b8
    // irq_swing_plex::@8
  __b8:
    // [75] vsp_coarse_scroll = irq_swing_plex::new_coarse_scroll#0 -- vbuz1=vbuz2 
    lda.z new_coarse_scroll
    sta.z vsp_coarse_scroll
    // [76] irq_swing_plex::$16 = $28 - vsp_coarse_scroll -- vbuaa=vbuc1_minus_vbuz1 
    lda #$28
    sec
    sbc.z vsp_coarse_scroll
    // [77] vsp_scroll = irq_swing_plex::$16 -- vbuz1=vbuaa 
    sta.z vsp_scroll
    jmp __b6
    // irq_swing_plex::@6
  __b6:
    // [78] if(0==p2_plex_scroller_moving) goto irq_swing_plex::@9 -- 0_eq_vbuz1_then_la1 
    lda.z p2_plex_scroller_moving
    beq __b9
    // [79] phi from irq_swing_plex::@6 to irq_swing_plex::@15 [phi:irq_swing_plex::@6->irq_swing_plex::@15]
  __b15_from___b6:
    jmp __b15
    // irq_swing_plex::@15
  __b15:
    // [80] call plex_scroller_move
    jsr plex_scroller_move
    jmp __b20
    // irq_swing_plex::@20
  __b20:
    // [81] sprite_color_idx = ++ sprite_color_idx -- vbuz1=_inc_vbuz1 
    inc.z sprite_color_idx
    // [82] if(sprite_color_idx!=$30*SIZEOF_CHAR) goto irq_swing_plex::@10 -- vbuz1_neq_vbuc1_then_la1 
    lda #$30*SIZEOF_CHAR
    cmp.z sprite_color_idx
    bne __b10_from___b20
    jmp __b16
    // irq_swing_plex::@16
  __b16:
    // [83] sprite_color_idx = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z sprite_color_idx
    // [84] phi from irq_swing_plex::@16 irq_swing_plex::@20 to irq_swing_plex::@10 [phi:irq_swing_plex::@16/irq_swing_plex::@20->irq_swing_plex::@10]
  __b10_from___b16:
  __b10_from___b20:
    // [84] phi irq_swing_plex::s#2 = 0 [phi:irq_swing_plex::@16/irq_swing_plex::@20->irq_swing_plex::@10#0] -- vbuxx=vbuc1 
    ldx #0
    jmp __b10
    // irq_swing_plex::@10
  __b10:
    // [85] if(irq_swing_plex::s#2<8) goto irq_swing_plex::@11 -- vbuxx_lt_vbuc1_then_la1 
    cpx #8
    bcc __b11
    jmp __b9
    // irq_swing_plex::@9
  __b9:
    // [86] p2_work_ready = 1 -- vbuz1=vbuc1 
    // Signal the main routine
    lda #1
    sta.z p2_work_ready
    jmp __b2
    // irq_swing_plex::@2
  __b2:
    // [87] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Acknowledge the IRQ
    lda #IRQ_RASTER
    sta IRQ_STATUS
    jmp __breturn
    // irq_swing_plex::@return
  __breturn:
    // [88] return 
    // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit 
  rega:
    lda #0
  regx:
    ldx #0
  regy:
    ldy #0
    rti
    // irq_swing_plex::@11
  __b11:
    // [89] SPRITES_COLOR[irq_swing_plex::s#2] = SPRITE_COLOR_SEQUENCE[sprite_color_idx] -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuz1 
    ldy.z sprite_color_idx
    lda SPRITE_COLOR_SEQUENCE,y
    sta SPRITES_COLOR,x
    // [90] irq_swing_plex::s#1 = ++ irq_swing_plex::s#2 -- vbuxx=_inc_vbuxx 
    inx
    // [84] phi from irq_swing_plex::@11 to irq_swing_plex::@10 [phi:irq_swing_plex::@11->irq_swing_plex::@10]
  __b10_from___b11:
    // [84] phi irq_swing_plex::s#2 = irq_swing_plex::s#1 [phi:irq_swing_plex::@11->irq_swing_plex::@10#0] -- register_copy 
    jmp __b10
    // irq_swing_plex::@7
  __b7:
    // [91] irq_swing_plex::x_offset1#0 = $50 - vsp_coarse_scroll -- vbuaa=vbuc1_minus_vbuz1 
    // Moving left - put a new column at the right border
    lda #$50
    sec
    sbc.z vsp_coarse_scroll
    // [92] vsp_update_screen::x_offset = irq_swing_plex::x_offset1#0 -- vbuz1=vbuaa 
    sta.z vsp_update_screen.x_offset
    // [93] call vsp_update_screen
    // Only move 24 - because the last line is empty (and holds sprite pointers)
    jsr vsp_update_screen
    jmp __b8
    // irq_swing_plex::@1
  __b1:
    // [94] *HARDWARE_IRQ = &irq_swing_plex -- _deref_qprc1=pprc2 
    // Not done with the frame yet - set up the next PLEX IRQ (handles the rest of the multiplexer buckets)
    lda #<irq_swing_plex
    sta HARDWARE_IRQ
    lda #>irq_swing_plex
    sta HARDWARE_IRQ+1
    // [95] *RASTER = BUCKET_YPOS[plex_bucket_id] -- _deref_pbuc1=pbuc2_derefidx_vbuz1 
    ldy.z plex_bucket_id
    lda BUCKET_YPOS,y
    sta RASTER
    jmp __b2
}
  // irq_swing_vsp
// Show sprites from the multiplexer, rescheduling the IRQ as many times as needed
irq_swing_vsp: {
    // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry 
    sta rega+1
    stx regx+1
    jmp vsp_perform1
    // irq_swing_vsp::vsp_perform1
  vsp_perform1:
    // kickasm( uses vsp_scroll uses HARDWARE_IRQ uses RASTER uses IRQ_STATUS uses IRQ_RASTER uses VICII_CONTROL1) {{ // Stabilize the raster by using the double IRQ method         // Acknowledge the IRQ         lda #IRQ_RASTER         sta IRQ_STATUS         // Set-up IRQ for the next line         inc RASTER         // Point IRQ to almost stable code         lda #<stable         sta HARDWARE_IRQ         lda #>stable         sta HARDWARE_IRQ+1         tsx       // Save stack pointer         cli       // Reenable interrupts         // Wait for new IRQ using NOP's to ensure minimal jitter when it hits         .fill 15, NOP         .align $100     stable:         txs             // Restore stack pointer         ldx #9          // Wait till the raster has almost crossed to the next line (48 cycles)         !: dex         bne !-         nop         lda RASTER         cmp RASTER         bne !+          // And correct the last cycle of potential jitter         !:         // Raster is now completely stable! (Line $2f cycle 7)         // Perform VSP by waiting an exact number of cycles and then enabling the display         // See http://www.zimmers.net/cbmpics/cbm/c64/vic-ii.txt (Section 3.14.6. DMA delay)         ldx #8          // Wait 45 cycles to get the VSP timing right         !: dex         bne !-         nop         nop         lda vsp_scroll         lsr         //  Put bit 0 into carry          bcc dma1    // Spend 2 or 3 cycles depending on the carry (bit 0)     dma1:         sta dma2+1  // Update the branch         clv     dma2:         bvc dma2    // This branch is updated with vsp_scroll/2 - changing the number of NOP's executed         // 20 NOP's - enabling vsp scroll from 0-40         .fill 20, NOP         ldx #$18         lda #$1b  // TODO: To control Y-scrolling this must be flexible!         // The STX $d011 must be line $30 cycle $10 for vsp_scroll==0         stx VICII_CONTROL1 // Enable the display - starts DMA         sta VICII_CONTROL1      }}
    // Stabilize the raster by using the double IRQ method
        // Acknowledge the IRQ
        lda #IRQ_RASTER
        sta IRQ_STATUS
        // Set-up IRQ for the next line
        inc RASTER
        // Point IRQ to almost stable code
        lda #<stable
        sta HARDWARE_IRQ
        lda #>stable
        sta HARDWARE_IRQ+1
        tsx       // Save stack pointer
        cli       // Reenable interrupts
        // Wait for new IRQ using NOP's to ensure minimal jitter when it hits
        .fill 15, NOP
        .align $100
    stable:
        txs             // Restore stack pointer
        ldx #9          // Wait till the raster has almost crossed to the next line (48 cycles)
        !: dex
        bne !-
        nop
        lda RASTER
        cmp RASTER
        bne !+          // And correct the last cycle of potential jitter
        !:
        // Raster is now completely stable! (Line $2f cycle 7)
        // Perform VSP by waiting an exact number of cycles and then enabling the display
        // See http://www.zimmers.net/cbmpics/cbm/c64/vic-ii.txt (Section 3.14.6. DMA delay)
        ldx #8          // Wait 45 cycles to get the VSP timing right
        !: dex
        bne !-
        nop
        nop
        lda vsp_scroll
        lsr         //  Put bit 0 into carry 
        bcc dma1    // Spend 2 or 3 cycles depending on the carry (bit 0)
    dma1:
        sta dma2+1  // Update the branch
        clv
    dma2:
        bvc dma2    // This branch is updated with vsp_scroll/2 - changing the number of NOP's executed
        // 20 NOP's - enabling vsp scroll from 0-40
        .fill 20, NOP
        ldx #$18
        lda #$1b  // TODO: To control Y-scrolling this must be flexible!
        // The STX $d011 must be line $30 cycle $10 for vsp_scroll==0
        stx VICII_CONTROL1 // Enable the display - starts DMA
        sta VICII_CONTROL1
    
    jmp __b1
    // irq_swing_vsp::@1
  __b1:
    // [98] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    // Set BMM
    lda #VICII_BMM
    ora VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
    // [99] irq_swing_vsp::$1 = vsp_fine_scroll | VICII_MCM -- vbuaa=vbuz1_bor_vbuc1 
    lda #VICII_MCM
    ora.z vsp_fine_scroll
    // [100] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) = irq_swing_vsp::$1 -- _deref_pbuc1=vbuaa 
    // Set fine scroll (and MCM)
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2
    // [101] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    //*BORDER_COLOR = DARK_GREY;
    // Acknowledge the IRQ
    lda #IRQ_RASTER
    sta IRQ_STATUS
    // [102] *HARDWARE_IRQ = &irq_swing_plex -- _deref_qprc1=pprc2 
    // Set up the PLEX IRQ (handles the rest of the multiplexer buckets)
    lda #<irq_swing_plex
    sta HARDWARE_IRQ
    lda #>irq_swing_plex
    sta HARDWARE_IRQ+1
    // [103] *RASTER = *(BUCKET_YPOS+1) -- _deref_pbuc1=_deref_pbuc2 
    lda BUCKET_YPOS+1
    sta RASTER
    jmp __breturn
    // irq_swing_vsp::@return
  __breturn:
    // [104] return 
    // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit 
  rega:
    lda #0
  regx:
    ldx #0
    rti
}
  // irq_swing_top
// Inititialize plex frame and show first bucket
irq_swing_top: {
    // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry 
    sta rega+1
    stx regx+1
    sty regy+1
    // [106] call plexFrameStart
    //*BORDER_COLOR = DARK_GREY;
    //VICII->BORDER_COLOR++;
    // Initialize the multiplexer frame
    jsr plexFrameStart
    jmp __b1
    // irq_swing_top::@1
  __b1:
    // [107] plex_bucket = plex_frame -- pssz1=pssz2 
    lda.z plex_frame
    sta.z plex_bucket
    lda.z plex_frame+1
    sta.z plex_bucket+1
    // [108] plex_bucket_id = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z plex_bucket_id
    // [109] plexBucketShow::bucket#0 = plex_bucket -- pssz1=pssz2 
    lda.z plex_bucket
    sta.z plexBucketShow.bucket
    lda.z plex_bucket+1
    sta.z plexBucketShow.bucket+1
    // [110] call plexBucketShow
  // Show the first bucket
    // [207] phi from irq_swing_top::@1 to plexBucketShow [phi:irq_swing_top::@1->plexBucketShow]
  plexBucketShow_from___b1:
    // [207] phi plexBucketShow::bucket#2 = plexBucketShow::bucket#0 [phi:irq_swing_top::@1->plexBucketShow#0] -- register_copy 
    jsr plexBucketShow
    jmp __b2
    // irq_swing_top::@2
  __b2:
    // [111] plex_bucket = plex_bucket + 8*SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_plus_vbuc1 
    // Move forward to the next bucket
    lda #8*SIZEOF_STRUCT_BUCKETSPRITE
    clc
    adc.z plex_bucket
    sta.z plex_bucket
    bcc !+
    inc.z plex_bucket+1
  !:
    // [112] plex_bucket_id = ++ plex_bucket_id -- vbuz1=_inc_vbuz1 
    inc.z plex_bucket_id
    // [113] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Acknowledge the IRQ
    lda #IRQ_RASTER
    sta IRQ_STATUS
    // [114] *HARDWARE_IRQ = &irq_swing_vsp -- _deref_qprc1=pprc2 
    // Set up the VSP IRQ
    lda #<irq_swing_vsp
    sta HARDWARE_IRQ
    lda #>irq_swing_vsp
    sta HARDWARE_IRQ+1
    // [115] *RASTER = IRQ_SWING_VSP_LINE -- _deref_pbuc1=vbuc2 
    lda #IRQ_SWING_VSP_LINE
    sta RASTER
    jmp __breturn
    // irq_swing_top::@return
  __breturn:
    // [116] return 
    // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit 
  rega:
    lda #0
  regx:
    ldx #0
  regy:
    ldy #0
    rti
}
.segment CodePart1
  // irq_flipper_bottom
// IRQ running during set-up
// Flips from start screen to bitmap (starts the start-up screen)
irq_flipper_bottom: {
    .const toD0181_return = (>(LOAD_SCREEN&$3fff)*4)|(>LOAD_CHARSET)/4&$f
    .label __7 = $35
    .label __9 = $37
    .label __12 = $33
    .label irq_flipper_line = $33
    .label __14 = $33
    // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry 
    sta rega+1
    stx regx+1
    sty regy+1
    // asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop  }
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    // [118] irq_flipper_bottom::$0 = byte0  irq_flipper_bottom_line -- vbuaa=_byte0_vwuz1 
    lda.z irq_flipper_bottom_line
    // [119] irq_flipper_bottom::$1 = irq_flipper_bottom::$0 & 7 -- vbuaa=vbuaa_band_vbuc1 
    and #7
    // [120] raster_fine::line_offset = irq_flipper_bottom::$1 -- vbuz1=vbuaa 
    sta.z raster_fine.line_offset
    // [121] call raster_fine
    jsr raster_fine
    jmp __b11
    // irq_flipper_bottom::@11
  __b11:
    // asm { nop nop nop nop  }
    // Colors
    nop
    nop
    nop
    nop
    // [123] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = LIGHT_BLUE -- _deref_pbuc1=vbuc2 
    lda #LIGHT_BLUE
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR
    // [124] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLUE -- _deref_pbuc1=vbuc2 
    lda #BLUE
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR
    // [125] phi from irq_flipper_bottom::@11 to irq_flipper_bottom::toD0181 [phi:irq_flipper_bottom::@11->irq_flipper_bottom::toD0181]
  toD0181_from___b11:
    jmp toD0181
    // irq_flipper_bottom::toD0181
  toD0181:
    jmp __b10
    // irq_flipper_bottom::@10
  __b10:
    // [126] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = irq_flipper_bottom::toD0181_return#0 -- _deref_pbuc1=vbuc2 
    // Show default screen
    lda #toD0181_return
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY
    // [127] if(0!=flipper_done) goto irq_flipper_bottom::@1 -- 0_neq_vbuz1_then_la1 
    lda.z flipper_done
    bne __b1
    jmp __b2
    // irq_flipper_bottom::@2
  __b2:
    // [128] irq_flipper_bottom::$12 = irq_flipper_idx << 1 -- vwuz1=vwuz2_rol_1 
    lda.z irq_flipper_idx
    asl
    sta.z __12
    lda.z irq_flipper_idx+1
    rol
    sta.z __12+1
    // [129] irq_flipper_bottom::$14 = FLIPPER_EASING + irq_flipper_bottom::$12 -- pwuz1=pwuc1_plus_vwuz1 
    lda.z __14
    clc
    adc #<FLIPPER_EASING
    sta.z __14
    lda.z __14+1
    adc #>FLIPPER_EASING
    sta.z __14+1
    // [130] irq_flipper_bottom::irq_flipper_line#0 = *irq_flipper_bottom::$14 -- vwuz1=_deref_pwuz1 
    // Move the flipper down    
    ldy #0
    lda (irq_flipper_line),y
    pha
    iny
    lda (irq_flipper_line),y
    sta.z irq_flipper_line+1
    pla
    sta.z irq_flipper_line
    // [131] irq_flipper_idx = ++ irq_flipper_idx -- vwuz1=_inc_vwuz1 
    inc.z irq_flipper_idx
    bne !+
    inc.z irq_flipper_idx+1
  !:
    // [132] if(irq_flipper_bottom::irq_flipper_line#0<8) goto irq_flipper_bottom::@4 -- vwuz1_lt_vbuc1_then_la1 
    // Check limits
    lda.z irq_flipper_line+1
    bne !+
    lda.z irq_flipper_line
    cmp #8
    bcc __b4
  !:
    jmp __b3
    // irq_flipper_bottom::@3
  __b3:
    // [133] irq_flipper_bottom::$7 = irq_flipper_bottom::irq_flipper_line#0 - 8 -- vwuz1=vwuz2_minus_vbuc1 
    sec
    lda.z irq_flipper_line
    sbc #8
    sta.z __7
    lda.z irq_flipper_line+1
    sbc #0
    sta.z __7+1
    // [134] irq_flipper_top_line = irq_flipper_bottom::$7 -- vwuz1=vwuz2 
    lda.z __7
    sta.z irq_flipper_top_line
    lda.z __7+1
    sta.z irq_flipper_top_line+1
    jmp __b5
    // irq_flipper_bottom::@5
  __b5:
    // [135] if(irq_flipper_bottom::irq_flipper_line#0>$128) goto irq_flipper_bottom::@6 -- vwuz1_gt_vwuc1_then_la1 
    lda #>$128
    cmp.z irq_flipper_line+1
    bcc __b6
    bne !+
    lda #<$128
    cmp.z irq_flipper_line
    bcc __b6
  !:
    jmp __b8
    // irq_flipper_bottom::@8
  __b8:
    // [136] irq_flipper_bottom::$9 = irq_flipper_bottom::irq_flipper_line#0 + 8 -- vwuz1=vwuz2_plus_vbuc1 
    lda #8
    clc
    adc.z irq_flipper_line
    sta.z __9
    lda #0
    adc.z irq_flipper_line+1
    sta.z __9+1
    // [137] irq_flipper_bottom_line = irq_flipper_bottom::$9 -- vwuz1=vwuz2 
    lda.z __9
    sta.z irq_flipper_bottom_line
    lda.z __9+1
    sta.z irq_flipper_bottom_line+1
    jmp __b7
    // irq_flipper_bottom::@7
  __b7:
    // [138] if(irq_flipper_bottom::irq_flipper_line#0!=$130) goto irq_flipper_bottom::@1 -- vwuz1_neq_vwuc1_then_la1 
    lda.z irq_flipper_line+1
    cmp #>$130
    bne __b1
    lda.z irq_flipper_line
    cmp #<$130
    bne __b1
    jmp __b9
    // irq_flipper_bottom::@9
  __b9:
    // [139] flipper_done = 1 -- vbuz1=vbuc1 
    lda #1
    sta.z flipper_done
    jmp __b1
    // irq_flipper_bottom::@1
  __b1:
    // [140] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    // Set up the IRQ again
    lda #$80
    ora VICII_CONTROL1
    sta VICII_CONTROL1
    // [141] *RASTER = IRQ_PART1_TOP_LINE -- _deref_pbuc1=vbuc2 
    lda #IRQ_PART1_TOP_LINE
    sta RASTER
    // [142] *HARDWARE_IRQ = &irq_part1_top -- _deref_qprc1=pprc2 
    lda #<irq_part1_top
    sta HARDWARE_IRQ
    lda #>irq_part1_top
    sta HARDWARE_IRQ+1
    // [143] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Acknowledge the IRQ
    lda #IRQ_RASTER
    sta IRQ_STATUS
    jmp __breturn
    // irq_flipper_bottom::@return
  __breturn:
    // [144] return 
    // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit 
  rega:
    lda #0
  regx:
    ldx #0
  regy:
    ldy #0
    rti
    // irq_flipper_bottom::@6
  __b6:
    // [145] irq_flipper_bottom_line = $130 -- vwuz1=vwuc1 
    lda #<$130
    sta.z irq_flipper_bottom_line
    lda #>$130
    sta.z irq_flipper_bottom_line+1
    jmp __b7
    // irq_flipper_bottom::@4
  __b4:
    // [146] irq_flipper_top_line = 0 -- vwuz1=vbuc1 
    lda #<0
    sta.z irq_flipper_top_line
    lda #>0
    sta.z irq_flipper_top_line+1
    jmp __b5
}
  // irq_flipper_top
// IRQ running during set-up
// Flips from start screen to bitmap (stops the bitmap)
irq_flipper_top: {
    // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry 
    sta rega+1
    stx regx+1
    sty regy+1
    // asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop  }
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    // [148] irq_flipper_top::$0 = byte0  irq_flipper_top_line -- vbuaa=_byte0_vwuz1 
    lda.z irq_flipper_top_line
    // [149] irq_flipper_top::$1 = irq_flipper_top::$0 & 7 -- vbuaa=vbuaa_band_vbuc1 
    and #7
    // [150] raster_fine::line_offset = irq_flipper_top::$1 -- vbuz1=vbuaa 
    sta.z raster_fine.line_offset
    // [151] call raster_fine
    jsr raster_fine
    jmp __b4
    // irq_flipper_top::@4
  __b4:
    // asm { lda#$9a ldx#LIGHT_GREEN ldy#$1b staVICII_MEMORY stxBORDER_COLOR styVICII_CONTROL1 stxBG_COLOR lda#$c8 staVICII_CONTROL2  }
    lda #$9a
    ldx #LIGHT_GREEN
    ldy #$1b
    sta VICII_MEMORY
    stx BORDER_COLOR
    sty VICII_CONTROL1
    stx BG_COLOR
    lda #$c8
    sta VICII_CONTROL2
    // [153] irq_flipper_top::$3 = byte1  irq_flipper_bottom_line -- vbuaa=_byte1_vwuz1 
    lda.z irq_flipper_bottom_line+1
    // [154] if(0!=irq_flipper_top::$3) goto irq_flipper_top::@1 -- 0_neq_vbuaa_then_la1 
    // Set up the flipper IRQ
    cmp #0
    bne __b1
    jmp __b3
    // irq_flipper_top::@3
  __b3:
    // [155] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2 
    lda #$7f
    and VICII_CONTROL1
    sta VICII_CONTROL1
    jmp __b2
    // irq_flipper_top::@2
  __b2:
    // [156] irq_flipper_top::$4 = byte0  irq_flipper_bottom_line -- vbuaa=_byte0_vwuz1 
    lda.z irq_flipper_bottom_line
    // [157] irq_flipper_top::$5 = irq_flipper_top::$4 & $f8 -- vbuaa=vbuaa_band_vbuc1 
    and #$f8
    // [158] *RASTER = irq_flipper_top::$5 -- _deref_pbuc1=vbuaa 
    sta RASTER
    // [159] *HARDWARE_IRQ = &irq_flipper_bottom -- _deref_qprc1=pprc2 
    lda #<irq_flipper_bottom
    sta HARDWARE_IRQ
    lda #>irq_flipper_bottom
    sta HARDWARE_IRQ+1
    // [160] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Acknowledge the IRQ
    lda #IRQ_RASTER
    sta IRQ_STATUS
    jmp __breturn
    // irq_flipper_top::@return
  __breturn:
    // [161] return 
    // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit 
  rega:
    lda #0
  regx:
    ldx #0
  regy:
    ldy #0
    rti
    // irq_flipper_top::@1
  __b1:
    // [162] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    lda #$80
    ora VICII_CONTROL1
    sta VICII_CONTROL1
    jmp __b2
}
  // irq_part1_top
// IRQ running during set-up
irq_part1_top: {
    .const toDd001_return = 0
    .const toD0181_return = >(P1_SCREEN&$3fff)*4
    // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry 
    sta rega+1
    // [163] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = BLACK -- _deref_pbuc1=vbuc2 
    // Colors
    lda #BLACK
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR
    // [164] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLACK -- _deref_pbuc1=vbuc2 
    lda #BLACK
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR
    // [165] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    // Set BMM
    lda #VICII_BMM
    ora VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
    // [166] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) | VICII_MCM -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    // Set MCM
    lda #VICII_MCM
    ora VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2
    // [167] phi from irq_part1_top to irq_part1_top::toDd001 [phi:irq_part1_top->irq_part1_top::toDd001]
  toDd001_from_irq_part1_top:
    jmp toDd001
    // irq_part1_top::toDd001
  toDd001:
    jmp __b4
    // irq_part1_top::@4
  __b4:
    // [168] *((char *)CIA2) = irq_part1_top::toDd001_return#0 -- _deref_pbuc1=vbuc2 
    // Change graphics bank
    lda #toDd001_return
    sta CIA2
    // [169] phi from irq_part1_top::@4 to irq_part1_top::toD0181 [phi:irq_part1_top::@4->irq_part1_top::toD0181]
  toD0181_from___b4:
    jmp toD0181
    // irq_part1_top::toD0181
  toD0181:
    jmp __b5
    // irq_part1_top::@5
  __b5:
    // [170] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = irq_part1_top::toD0181_return#0 -- _deref_pbuc1=vbuc2 
    // Show screen
    lda #toD0181_return
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY
    // [171] irq_part1_top::$2 = byte1  irq_flipper_top_line -- vbuaa=_byte1_vwuz1 
    lda.z irq_flipper_top_line+1
    // [172] if(0!=irq_part1_top::$2) goto irq_part1_top::@1 -- 0_neq_vbuaa_then_la1 
    // Set up the flipper IRQ
    cmp #0
    bne __b1
    jmp __b3
    // irq_part1_top::@3
  __b3:
    // [173] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2 
    lda #$7f
    and VICII_CONTROL1
    sta VICII_CONTROL1
    jmp __b2
    // irq_part1_top::@2
  __b2:
    // [174] irq_part1_top::$3 = byte0  irq_flipper_top_line -- vbuaa=_byte0_vwuz1 
    lda.z irq_flipper_top_line
    // [175] irq_part1_top::$4 = irq_part1_top::$3 & $f8 -- vbuaa=vbuaa_band_vbuc1 
    and #$f8
    // [176] *RASTER = irq_part1_top::$4 -- _deref_pbuc1=vbuaa 
    sta RASTER
    // [177] *HARDWARE_IRQ = &irq_flipper_top -- _deref_qprc1=pprc2 
    lda #<irq_flipper_top
    sta HARDWARE_IRQ
    lda #>irq_flipper_top
    sta HARDWARE_IRQ+1
    // [178] p1_work_ready = 1 -- vbuz1=vbuc1 
    // Signal main routine to play music    
    lda #1
    sta.z p1_work_ready
    // [179] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Acknowledge the IRQ
    lda #IRQ_RASTER
    sta IRQ_STATUS
    jmp __breturn
    // irq_part1_top::@return
  __breturn:
    // [180] return 
    // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit 
  rega:
    lda #0
    rti
    // irq_part1_top::@1
  __b1:
    // [181] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    lda #$80
    ora VICII_CONTROL1
    sta VICII_CONTROL1
    jmp __b2
}
.segment Code
  // main
main: {
    // [183] call demo_init
  // Initialize the demo - start the IRQ
    // [272] phi from main to demo_init [phi:main->demo_init]
  demo_init_from_main:
    jsr demo_init
    jmp __b7
    // main::@7
  __b7:
    // [184] byteboozer_decrunch::crunched = DEMO_MUSIC_CRUNCHED -- pbuz1=pbuc1 
    lda #<DEMO_MUSIC_CRUNCHED
    sta.z byteboozer_decrunch.crunched
    lda #>DEMO_MUSIC_CRUNCHED
    sta.z byteboozer_decrunch.crunched+1
    // [185] call byteboozer_decrunch
    // Decrunch music
    jsr byteboozer_decrunch
    jmp __b8
    // main::@8
  __b8:
    // asm { lda#0  }
    // Init music
    lda #0
    // [187] callexecute *musicInit  -- call__deref_pprc1 
    jsr musicInit
    // [188] phi from main::@8 to main::@1 [phi:main::@8->main::@1]
  __b1_from___b8:
    jmp __b1
    // main::@1
  __b1:
    // [189] call demo_start
  // Initialize the demo - start the IRQ
    // [282] phi from main::@1 to demo_start [phi:main::@1->demo_start]
  demo_start_from___b1:
    jsr demo_start
    // [190] phi from main::@1 to main::@9 [phi:main::@1->main::@9]
  __b9_from___b1:
    jmp __b9
    // main::@9
  __b9:
    // [191] call part1_init
    // Initialize Part 1 (Revealing "Happy New Year" logo)
    jsr part1_init
    jmp __b2
  // Start part 1 at 0:04,5
    // main::@2
  __b2:
    // [192] if(demo_frame_count<5*$32) goto main::@2 -- vwuz1_lt_vbuc1_then_la1 
    lda.z demo_frame_count+1
    bne !+
    lda.z demo_frame_count
    cmp #5*$32
    bcc __b2
  !:
    // [193] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
  __b3_from___b2:
    jmp __b3
    // main::@3
  __b3:
    // [194] call part1_run
  // Run Part 1 (Revealing "Happy New Year" logo)
    // [317] phi from main::@3 to part1_run [phi:main::@3->part1_run]
  part1_run_from___b3:
    jsr part1_run
    // [195] phi from main::@3 to main::@10 [phi:main::@3->main::@10]
  __b10_from___b3:
    jmp __b10
    // main::@10
  __b10:
    // [196] call part2_init
    // Initialize part 2
    jsr part2_init
    jmp __b4
  // Wait for the right place to start part 2
    // main::@4
  __b4:
    // [197] if(demo_frame_count<(unsigned int)$10*$32) goto main::@4 -- vwuz1_lt_vwuc1_then_la1 
    lda.z demo_frame_count+1
    cmp #>$10*$32
    bcc __b4
    bne !+
    lda.z demo_frame_count
    cmp #<$10*$32
    bcc __b4
  !:
    jmp __b5
    // main::@5
  __b5:
    // [198] sparkler_active = 0 -- vbuz1=vbuc1 
    // Disable sparkler
    lda #0
    sta.z sparkler_active
    // [199] call part2_run
  // Run part 2
    // [393] phi from main::@5 to part2_run [phi:main::@5->part2_run]
  part2_run_from___b5:
    jsr part2_run
    // [200] phi from main::@5 main::@6 to main::@6 [phi:main::@5/main::@6->main::@6]
  __b6_from___b5:
  __b6_from___b6:
    jmp __b6
    // main::@6
  __b6:
    jmp __b6_from___b6
}
  // demo_work
// Work to be performed every frame while the demo runs
// Assumes that I/O is enabled
demo_work: {
    // [201] demo_frame_count = ++ demo_frame_count -- vwuz1=_inc_vwuz1 
    inc.z demo_frame_count
    bne !+
    inc.z demo_frame_count+1
  !:
    // [202] callexecute *musicPlay  -- call__deref_pprc1 
    // Play music
    jsr musicPlay
    jmp __b1
    // demo_work::@1
  __b1:
    // [203] if(0==sparkler_active) goto demo_work::@return -- 0_eq_vbuz1_then_la1 
    lda.z sparkler_active
    beq __breturn
    // [204] phi from demo_work::@1 to demo_work::@2 [phi:demo_work::@1->demo_work::@2]
  __b2_from___b1:
    jmp __b2
    // demo_work::@2
  __b2:
    // [205] call sparkler_anim
    jsr sparkler_anim
    jmp __breturn
    // demo_work::@return
  __breturn:
    // [206] return 
    rts
}
.segment CodePart2
  // plexBucketShow
// Show the sprites in a specific bucket
// - bucket: The bucket to show
// void plexBucketShow(__zp(2) struct BucketSprite *bucket)
plexBucketShow: {
    .label i = $3b
    .label bucket = 2
    // [208] plexBucketShow::real_idx#0 = plex_real_sprite_idx << 1 -- vbuxx=vbuz1_rol_1 
    lda.z plex_real_sprite_idx
    asl
    tax
    // [209] phi from plexBucketShow to plexBucketShow::@1 [phi:plexBucketShow->plexBucketShow::@1]
  __b1_from_plexBucketShow:
    // [209] phi plexBucketShow::real_idx#4 = plexBucketShow::real_idx#0 [phi:plexBucketShow->plexBucketShow::@1#0] -- register_copy 
    // [209] phi plexBucketShow::i#3 = 0 [phi:plexBucketShow->plexBucketShow::@1#1] -- vbuyy=vbuc1 
    ldy #0
    jmp __b1
    // plexBucketShow::@1
  __b1:
    // [210] if(0!=((char *)plexBucketShow::bucket#2)[plexBucketShow::i#3]) goto plexBucketShow::@2 -- 0_neq_pbuz1_derefidx_vbuyy_then_la1 
    lda (bucket),y
    cmp #0
    bne __b2
    // [211] phi from plexBucketShow::@1 plexBucketShow::@4 to plexBucketShow::@5 [phi:plexBucketShow::@1/plexBucketShow::@4->plexBucketShow::@5]
  __b5_from___b1:
  __b5_from___b4:
    // [211] phi plexBucketShow::real_idx#8 = plexBucketShow::real_idx#4 [phi:plexBucketShow::@1/plexBucketShow::@4->plexBucketShow::@5#0] -- register_copy 
    jmp __b5
    // plexBucketShow::@5
  __b5:
    // [212] plexBucketShow::$1 = plexBucketShow::real_idx#8 >> 1 -- vbuaa=vbuxx_ror_1 
    txa
    lsr
    // [213] plex_real_sprite_idx = plexBucketShow::$1 -- vbuz1=vbuaa 
    sta.z plex_real_sprite_idx
    jmp __breturn
    // plexBucketShow::@return
  __breturn:
    // [214] return 
    rts
    // plexBucketShow::@2
  __b2:
    // [215] SPRITES_YPOS[plexBucketShow::real_idx#4] = ((char *)plexBucketShow::bucket#2)[plexBucketShow::i#3] -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuyy 
    lda (bucket),y
    sta SPRITES_YPOS,x
    // [216] plexBucketShow::i#1 = ++ plexBucketShow::i#3 -- vbuz1=_inc_vbuyy 
    iny
    sty.z i
    // [217] plexBucketShow::plex_id#0 = ((char *)plexBucketShow::bucket#2)[plexBucketShow::i#1] -- vbuyy=pbuz1_derefidx_vbuz2 
    ldy.z i
    lda (bucket),y
    tay
    // [218] SPRITES_XPOS[plexBucketShow::real_idx#4] = PLEX_XPOS[plexBucketShow::plex_id#0] -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuyy 
    lda PLEX_XPOS,y
    sta SPRITES_XPOS,x
    // [219] plexBucketShow::real_idx#1 = plexBucketShow::real_idx#4 >> 1 -- vbuxx=vbuxx_ror_1 
    txa
    lsr
    tax
    // [220] if(0!=PLEX_XPOS_MSB[plexBucketShow::plex_id#0]) goto plexBucketShow::@3 -- 0_neq_pbuc1_derefidx_vbuyy_then_la1 
    lda PLEX_XPOS_MSB,y
    cmp #0
    bne __b3
    jmp __b6
    // plexBucketShow::@6
  __b6:
    // [221] *SPRITES_XMSB = *SPRITES_XMSB & plexBucketShow::MSB_CLEAR_MASK_BY_ID[plexBucketShow::real_idx#1] -- _deref_pbuc1=_deref_pbuc1_band_pbuc2_derefidx_vbuxx 
    lda SPRITES_XMSB
    and MSB_CLEAR_MASK_BY_ID,x
    sta SPRITES_XMSB
    jmp __b4
    // plexBucketShow::@4
  __b4:
    // [222] SCREEN_SPRITE_PTRS[plexBucketShow::real_idx#1] = PLEX_PTR[plexBucketShow::plex_id#0] -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuyy 
    lda PLEX_PTR,y
    sta SCREEN_SPRITE_PTRS,x
    // [223] plexBucketShow::$2 = plexBucketShow::real_idx#1 + 1 -- vbuaa=vbuxx_plus_1 
    inx
    txa
    // [224] plexBucketShow::real_idx#2 = plexBucketShow::$2 & 7 -- vbuaa=vbuaa_band_vbuc1 
    and #7
    // [225] plexBucketShow::real_idx#3 = plexBucketShow::real_idx#2 << 1 -- vbuxx=vbuaa_rol_1 
    asl
    tax
    // [226] plexBucketShow::i#2 = ++ plexBucketShow::i#1 -- vbuyy=_inc_vbuz1 
    ldy.z i
    iny
    // [227] if(plexBucketShow::i#2==8*SIZEOF_STRUCT_BUCKETSPRITE) goto plexBucketShow::@5 -- vbuyy_eq_vbuc1_then_la1 
    cpy #8*SIZEOF_STRUCT_BUCKETSPRITE
    beq __b5_from___b4
    // [209] phi from plexBucketShow::@4 to plexBucketShow::@1 [phi:plexBucketShow::@4->plexBucketShow::@1]
  __b1_from___b4:
    // [209] phi plexBucketShow::real_idx#4 = plexBucketShow::real_idx#3 [phi:plexBucketShow::@4->plexBucketShow::@1#0] -- register_copy 
    // [209] phi plexBucketShow::i#3 = plexBucketShow::i#2 [phi:plexBucketShow::@4->plexBucketShow::@1#1] -- register_copy 
    jmp __b1
    // plexBucketShow::@3
  __b3:
    // [228] *SPRITES_XMSB = *SPRITES_XMSB | plexBucketShow::MSB_SET_MASK_BY_ID[plexBucketShow::real_idx#1] -- _deref_pbuc1=_deref_pbuc1_bor_pbuc2_derefidx_vbuxx 
    lda SPRITES_XMSB
    ora MSB_SET_MASK_BY_ID,x
    sta SPRITES_XMSB
    jmp __b4
  .segment DataPart2
    // Masks used for MSB
    MSB_SET_MASK_BY_ID: .byte 1, 2, 4, 8, $10, $20, $40, $80
    MSB_CLEAR_MASK_BY_ID: .byte $fe, $fd, $fb, $f7, $ef, $df, $bf, $7f
}
.segment CodePart2
  // update_frame_plex_id_offset
// Update the plex_id's of a multiplexer frame to reflect a specific plex_id_offset
// void update_frame_plex_id_offset(__register(A) char plex_frame_id)
update_frame_plex_id_offset: {
    .label jmp_table = PLEX_ID_UPDATERS
    .label jmp_address = $3c
    // [229] update_frame_plex_id_offset::$0 = update_frame_plex_id_offset::plex_frame_id#0 << 1 -- vbuaa=vbuaa_rol_1 
    asl
    // [230] update_frame_plex_id_offset::jmp_address = update_frame_plex_id_offset::jmp_table[update_frame_plex_id_offset::$0] -- vwuz1=pwuc1_derefidx_vbuaa 
    tay
    lda jmp_table,y
    sta.z jmp_address
    lda jmp_table+1,y
    sta.z jmp_address+1
    // kickasm( uses update_frame_plex_id_offset::jmp_address) {{ lda jmp_address         sta call+1         lda jmp_address+1         sta call+2         call: jsr $0000      }}
    lda jmp_address
        sta call+1
        lda jmp_address+1
        sta call+2
        call: jsr $0000
    
    jmp __breturn
    // update_frame_plex_id_offset::@return
  __breturn:
    // [232] return 
    rts
}
  // vsp_update_screen
// Update screen, colors and bitmap with a single column of new data
// - x_offset is the offset of the column to update (0-79)
// void vsp_update_screen(__zp($31) volatile char x_offset)
vsp_update_screen: {
    .label x_offset = $31
    .label x_offset8 = $40
    .label __5 = $3e
    // kickasm( uses vsp_update_screen::x_offset uses PART2_SCREEN uses COLS uses LOGO_DATA uses LOGO_DATA_COLORS) {{ ldx x_offset         .for(var row=0;row<24;row++) {             lda LOGO_DATA+80*row,x             sta PART2_SCREEN+40*row,x             lda LOGO_DATA_COLORS+80*row,x             sta COLS+40*row,x         }      }}
    // Update screen and colors
    ldx x_offset
        .for(var row=0;row<24;row++) {
            lda LOGO_DATA+80*row,x
            sta PART2_SCREEN+40*row,x
            lda LOGO_DATA_COLORS+80*row,x
            sta COLS+40*row,x
        }
    
    // [234] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Disable I/O (BITMAP is below I/O)
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // [235] *PROCPORT = PROCPORT_RAM_ALL -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_ALL
    sta PROCPORT
    // [236] vsp_update_screen::$5 = (unsigned int)vsp_update_screen::x_offset -- vwuz1=_word_vbuz2 
    lda.z x_offset
    sta.z __5
    lda #0
    sta.z __5+1
    // [237] vsp_update_screen::x_offset8 = vsp_update_screen::$5 << 3 -- vwuz1=vwuz2_rol_3 
    // Update bitmap (using 3 routines to handle all bitmap columns)
    lda.z __5
    asl
    sta.z x_offset8
    lda.z __5+1
    rol
    sta.z x_offset8+1
    asl.z x_offset8
    rol.z x_offset8+1
    asl.z x_offset8
    rol.z x_offset8+1
    // [238] vsp_update_screen::$1 = byte1  vsp_update_screen::x_offset8 -- vbuaa=_byte1_vwuz1 
    lda.z x_offset8+1
    // [239] if(vsp_update_screen::$1==0) goto vsp_update_screen::@1 -- vbuaa_eq_0_then_la1 
    cmp #0
    beq __b1
    jmp __b4
    // vsp_update_screen::@4
  __b4:
    // [240] vsp_update_screen::$3 = byte1  vsp_update_screen::x_offset8 -- vbuaa=_byte1_vwuz1 
    lda.z x_offset8+1
    // [241] if(vsp_update_screen::$3==1) goto vsp_update_screen::@2 -- vbuaa_eq_vbuc1_then_la1 
    cmp #1
    beq __b2
    jmp __b5
    // vsp_update_screen::@5
  __b5:
    // kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset             ldy x_offset8             .for(var row=0;row<24;row++)                 .for(var pix=0;pix<8;pix++) {                     lda LOGO_DATA_BITMAP+80*(row*8+pix),x                     sta PART2_BITMAP+$200+row*40*8+pix,y                 }          }}
    // >x_offset8 == 2
    ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+$200+row*40*8+pix,y
                }
        
    jmp __b3
    // vsp_update_screen::@3
  __b3:
    // [243] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // [244] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_IO
    sta PROCPORT
    jmp __breturn
    // vsp_update_screen::@return
  __breturn:
    // [245] return 
    rts
    // vsp_update_screen::@2
  __b2:
    // kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset             ldy x_offset8             .for(var row=0;row<24;row++)                 .for(var pix=0;pix<8;pix++) {                     lda LOGO_DATA_BITMAP+80*(row*8+pix),x                     sta PART2_BITMAP+$100+row*40*8+pix,y                 }          }}
    ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+$100+row*40*8+pix,y
                }
        
    jmp __b3
    // vsp_update_screen::@1
  __b1:
    // kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset             ldy x_offset8             .for(var row=0;row<24;row++)                 .for(var pix=0;pix<8;pix++) {                     lda LOGO_DATA_BITMAP+80*(row*8+pix),x                     sta PART2_BITMAP+row*40*8+pix,y                 }          }}
    ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+row*40*8+pix,y
                }
        
    jmp __b3
}
  // plex_scroller_move
// Scroll the plex sprites to the left.
plex_scroller_move: {
    .const toSpritePtr1_return = $ff&PART2_SPRITES/$40
    .label s = $2f
    // [248] plex_scroller_move::x_idx#0 = x_movement_idx -- vbuxx=vbuz1 
    ldx.z x_movement_idx
    // [249] phi from plex_scroller_move to plex_scroller_move::@1 [phi:plex_scroller_move->plex_scroller_move::@1]
  __b1_from_plex_scroller_move:
    // [249] phi plex_scroller_move::x_idx#10 = plex_scroller_move::x_idx#0 [phi:plex_scroller_move->plex_scroller_move::@1#0] -- register_copy 
    // [249] phi plex_scroller_move::s#10 = 0 [phi:plex_scroller_move->plex_scroller_move::@1#1] -- vbuz1=vbuc1 
    lda #0
    sta.z s
    jmp __b1
    // plex_scroller_move::@1
  __b1:
    // [250] if(plex_scroller_move::s#10<$20) goto plex_scroller_move::@2 -- vbuz1_lt_vbuc1_then_la1 
    lda.z s
    cmp #$20
    bcc __b2
    jmp __b3
    // plex_scroller_move::@3
  __b3:
    // [251] x_movement_idx = ++ x_movement_idx -- vbuz1=_inc_vbuz1 
    inc.z x_movement_idx
    jmp __breturn
    // plex_scroller_move::@return
  __breturn:
    // [252] return 
    rts
    // plex_scroller_move::@2
  __b2:
    // [253] PLEX_XPOS[plex_scroller_move::s#10] = XMOVEMENT[plex_scroller_move::x_idx#10] -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuxx 
    lda XMOVEMENT,x
    ldy.z s
    sta PLEX_XPOS,y
    // [254] PLEX_XPOS_MSB[plex_scroller_move::s#10] = XMOVEMENT_HI[plex_scroller_move::x_idx#10] -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuxx 
    lda XMOVEMENT_HI,x
    ldy.z s
    sta PLEX_XPOS_MSB,y
    // [255] if(plex_scroller_move::x_idx#10!=0) goto plex_scroller_move::@4 -- vbuxx_neq_0_then_la1 
    cpx #0
    bne __b4
    jmp __b7
    // plex_scroller_move::@7
  __b7:
    // [256] if(*scroll_text_next!=0) goto plex_scroller_move::@5 -- _deref_pbuz1_neq_0_then_la1 
    ldy #0
    lda (scroll_text_next),y
    cmp #0
    bne __b5
    jmp __b8
    // plex_scroller_move::@8
  __b8:
    // [257] scroll_text_next = SCROLL_TEXT -- pbuz1=pbuc1 
    lda #<SCROLL_TEXT
    sta.z scroll_text_next
    lda #>SCROLL_TEXT
    sta.z scroll_text_next+1
    jmp __b5
    // plex_scroller_move::@5
  __b5:
    // [258] plex_scroller_move::letter#0 = *scroll_text_next -- vbuaa=_deref_pbuz1 
    // Read next char from the scroll text
    ldy #0
    lda (scroll_text_next),y
    // [259] scroll_text_next = ++ scroll_text_next -- pbuz1=_inc_pbuz1 
    inc.z scroll_text_next
    bne !+
    inc.z scroll_text_next+1
  !:
    // [260] if(plex_scroller_move::letter#0!=$ff) goto plex_scroller_move::@10 -- vbuaa_neq_vbuc1_then_la1 
    cmp #$ff
    bne __b10_from___b5
    // [262] phi from plex_scroller_move::@5 to plex_scroller_move::@6 [phi:plex_scroller_move::@5->plex_scroller_move::@6]
  __b6_from___b5:
    // [262] phi plex_scroller_move::letter#2 = 0 [phi:plex_scroller_move::@5->plex_scroller_move::@6#0] -- vbuaa=vbuc1 
    lda #0
    jmp __b6
    // [261] phi from plex_scroller_move::@5 to plex_scroller_move::@10 [phi:plex_scroller_move::@5->plex_scroller_move::@10]
  __b10_from___b5:
    jmp __b10
    // plex_scroller_move::@10
  __b10:
    // [262] phi from plex_scroller_move::@10 to plex_scroller_move::@6 [phi:plex_scroller_move::@10->plex_scroller_move::@6]
  __b6_from___b10:
    // [262] phi plex_scroller_move::letter#2 = plex_scroller_move::letter#0 [phi:plex_scroller_move::@10->plex_scroller_move::@6#0] -- register_copy 
    jmp __b6
    // plex_scroller_move::@6
  __b6:
    // [263] phi from plex_scroller_move::@6 to plex_scroller_move::toSpritePtr1 [phi:plex_scroller_move::@6->plex_scroller_move::toSpritePtr1]
  toSpritePtr1_from___b6:
    jmp toSpritePtr1
    // plex_scroller_move::toSpritePtr1
  toSpritePtr1:
    jmp __b9
    // plex_scroller_move::@9
  __b9:
    // [264] plex_scroller_move::$8 = plex_scroller_move::toSpritePtr1_return#0 + plex_scroller_move::letter#2 -- vbuaa=vbuc1_plus_vbuaa 
    clc
    adc #toSpritePtr1_return
    // [265] PLEX_PTR[plex_scroller_move::s#10] = plex_scroller_move::$8 -- pbuc1_derefidx_vbuz1=vbuaa 
    // Add the letter
    ldy.z s
    sta PLEX_PTR,y
    jmp __b4
    // plex_scroller_move::@4
  __b4:
    // [266] plex_scroller_move::x_idx#1 = plex_scroller_move::x_idx#10 + 8 -- vbuxx=vbuxx_plus_vbuc1 
    txa
    axs #-[8]
    // [267] plex_scroller_move::s#1 = ++ plex_scroller_move::s#10 -- vbuz1=_inc_vbuz1 
    inc.z s
    // [249] phi from plex_scroller_move::@4 to plex_scroller_move::@1 [phi:plex_scroller_move::@4->plex_scroller_move::@1]
  __b1_from___b4:
    // [249] phi plex_scroller_move::x_idx#10 = plex_scroller_move::x_idx#1 [phi:plex_scroller_move::@4->plex_scroller_move::@1#0] -- register_copy 
    // [249] phi plex_scroller_move::s#10 = plex_scroller_move::s#1 [phi:plex_scroller_move::@4->plex_scroller_move::@1#1] -- register_copy 
    jmp __b1
}
  // plexFrameStart
// Start a new frame (initializing data structures)
plexFrameStart: {
    // [268] plex_real_sprite_idx = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z plex_real_sprite_idx
    jmp __breturn
    // plexFrameStart::@return
  __breturn:
    // [269] return 
    rts
}
.segment CodePart1
  // raster_fine
// Waits until at the exact start of raster line 
// Excepts to start at a line divisible by 8 (0x00, 0x08, x010, ...). 
// Waits line_offset (0-7) additional lines.
// void raster_fine(__zp($32) volatile char line_offset)
raster_fine: {
    .label line_offset = $32
    // kickasm( uses raster_fine::line_offset uses RASTER_BADLINES) {{ jmp aligned         .align $100     aligned:         ldy RASTER         ldx line_offset         inx     rst:         nop          nop          nop          nop         dex                             // 2         beq done                        // 2         lda RASTER_BADLINES,y           // 4         beq notbad                      // 3     bad:         nop                             // 2         nop          nop          nop          nop         dex                                      beq done                                 iny                                      nop                                      bit $ea                              notbad:         .fill 18, NOP         bit $ea         iny                                      jmp rst                              done:      }}
    jmp aligned
        .align $100
    aligned:
        ldy RASTER
        ldx line_offset
        inx
    rst:
        nop 
        nop 
        nop 
        nop
        dex                             // 2
        beq done                        // 2
        lda RASTER_BADLINES,y           // 4
        beq notbad                      // 3
    bad:
        nop                             // 2
        nop 
        nop 
        nop 
        nop
        dex                             
        beq done                        
        iny                             
        nop                             
        bit $ea                         
    notbad:
        .fill 18, NOP
        bit $ea
        iny                             
        jmp rst                         
    done:
    
    jmp __breturn
    // raster_fine::@return
  __breturn:
    // [271] return 
    rts
}
.segment Code
  // demo_init
// Initialize demo code. 
// Can be called multiple times!
// Setting IRQ to the "demo" IRQ running outside the parts and 
// Setting memory to IO + RAM (no kernal/basic)
demo_init: {
    jmp SEI1
    // demo_init::SEI1
  SEI1:
    // asm { sei  }
    sei
    jmp __b1
    // demo_init::@1
  __b1:
    // [274] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Disable kernal & basic
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // [275] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_IO
    sta PROCPORT
    // [276] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR -- _deref_pbuc1=vbuc2 
    // Disable CIA 1 Timer IRQ
    lda #CIA_INTERRUPT_CLEAR
    sta CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT
    // asm { ldaCIA1_INTERRUPT  }
    // Acknowledge any timer IRQ
    lda CIA1_INTERRUPT
    // [278] *IRQ_STATUS = $f -- _deref_pbuc1=vbuc2 
    // Acknowledge any VIC IRQ
    lda #$f
    sta IRQ_STATUS
    jmp __breturn
    // demo_init::@return
  __breturn:
    // [279] return 
    rts
}
  // byteboozer_decrunch
// Decrunch crunched data using ByteBoozer
// - crunched: Pointer to the start of the crunched data
// void byteboozer_decrunch(__zp($39) char * volatile crunched)
byteboozer_decrunch: {
    .label crunched = $39
    // asm { ldycrunched ldxcrunched+1 jsrb2.Decrunch  }
    ldy crunched
    ldx crunched+1
    jsr b2.Decrunch
    jmp __breturn
    // byteboozer_decrunch::@return
  __breturn:
    // [281] return 
    rts
}
  // demo_start
// Start the demo IRQ. Can be called multiple times!
// Setting IRQ to the "demo" IRQ running outside the parts and 
// Setting memory to IO + RAM (no kernal/basic)
demo_start: {
    // [283] call demo_init
    // [272] phi from demo_start to demo_init [phi:demo_start->demo_init]
  demo_init_from_demo_start:
    jsr demo_init
    jmp __b1
    // demo_start::@1
  __b1:
    // [284] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2 
    // Set raster line to 0x00
    lda #$7f
    and VICII_CONTROL1
    sta VICII_CONTROL1
    // [285] *RASTER = 0 -- _deref_pbuc1=vbuc2 
    lda #0
    sta RASTER
    // [286] *HARDWARE_IRQ = &irq_demo -- _deref_qprc1=pprc2 
    // Set the IRQ routine
    lda #<irq_demo
    sta HARDWARE_IRQ
    lda #>irq_demo
    sta HARDWARE_IRQ+1
    // [287] *IRQ_ENABLE = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Enable Raster Interrupt
    lda #IRQ_RASTER
    sta IRQ_ENABLE
    jmp CLI1
    // demo_start::CLI1
  CLI1:
    // asm { cli  }
    cli
    jmp __breturn
    // demo_start::@return
  __breturn:
    // [289] return 
    rts
}
.segment CodePart1
  // part1_init
part1_init: {
    // [290] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Disable IO
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // [291] *PROCPORT = PROCPORT_RAM_ALL -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_ALL
    sta PROCPORT
    // [292] byteboozer_decrunch::crunched = P1_PIXELS_CRUNCHED -- pbuz1=pbuc1 
    lda #<P1_PIXELS_CRUNCHED
    sta.z byteboozer_decrunch.crunched
    lda #>P1_PIXELS_CRUNCHED
    sta.z byteboozer_decrunch.crunched+1
    // [293] call byteboozer_decrunch
    // Decrunch pixels
    jsr byteboozer_decrunch
    jmp __b1
    // part1_init::@1
  __b1:
    // [294] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Enable IO, Disable kernal & basic
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // [295] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_IO
    sta PROCPORT
    // [296] byteboozer_decrunch::crunched = P1_SCREEN_CRUNCHED -- pbuz1=pbuc1 
    lda #<P1_SCREEN_CRUNCHED
    sta.z byteboozer_decrunch.crunched
    lda #>P1_SCREEN_CRUNCHED
    sta.z byteboozer_decrunch.crunched+1
    // [297] call byteboozer_decrunch
    // Decrunch screen
    jsr byteboozer_decrunch
    jmp __b2
    // part1_init::@2
  __b2:
    // [298] byteboozer_decrunch::crunched = P1_COLORS_CRUNCHED -- pbuz1=pbuc1 
    lda #<P1_COLORS_CRUNCHED
    sta.z byteboozer_decrunch.crunched
    lda #>P1_COLORS_CRUNCHED
    sta.z byteboozer_decrunch.crunched+1
    // [299] call byteboozer_decrunch
    // Decrunch colors
    jsr byteboozer_decrunch
    jmp __b3
    // part1_init::@3
  __b3:
    // [300] byteboozer_decrunch::crunched = P1_SPRITES_CRUNCHED -- pbuz1=pbuc1 
    lda #<P1_SPRITES_CRUNCHED
    sta.z byteboozer_decrunch.crunched
    lda #>P1_SPRITES_CRUNCHED
    sta.z byteboozer_decrunch.crunched+1
    // [301] call byteboozer_decrunch
    // Decrunch sprites
    jsr byteboozer_decrunch
    jmp __b4
    // part1_init::@4
  __b4:
    // [302] byteboozer_decrunch::crunched = FLIPPER_EASING_CRUNCHED -- pbuz1=pbuc1 
    lda #<FLIPPER_EASING_CRUNCHED
    sta.z byteboozer_decrunch.crunched
    lda #>FLIPPER_EASING_CRUNCHED
    sta.z byteboozer_decrunch.crunched+1
    // [303] call byteboozer_decrunch
    // Decrunch flipper sine table
    jsr byteboozer_decrunch
    // [304] phi from part1_init::@4 to part1_init::@5 [phi:part1_init::@4->part1_init::@5]
  __b5_from___b4:
    jmp __b5
    // part1_init::@5
  __b5:
    // [305] call init_rasters
  // Initialize the badlines
    // [424] phi from part1_init::@5 to init_rasters [phi:part1_init::@5->init_rasters]
  init_rasters_from___b5:
    jsr init_rasters
    // [306] phi from part1_init::@5 to part1_init::@6 [phi:part1_init::@5->part1_init::@6]
  __b6_from___b5:
    jmp __b6
    // part1_init::@6
  __b6:
    // [307] call memset
  // Fill some empty pixels
    // [435] phi from part1_init::@6 to memset [phi:part1_init::@6->memset]
  memset_from___b6:
    // [435] phi memset::c#7 = 0 [phi:part1_init::@6->memset#0] -- vbuxx=vbuc1 
    ldx #0
    // [435] phi memset::str#6 = (void *)PIXELS_EMPTY [phi:part1_init::@6->memset#1] -- pvoz1=pvoc1 
    lda #<PIXELS_EMPTY
    sta.z memset.str
    lda #>PIXELS_EMPTY
    sta.z memset.str+1
    // [435] phi memset::num#5 = $800 [phi:part1_init::@6->memset#2] -- vwuz1=vwuc1 
    lda #<$800
    sta.z memset.num
    lda #>$800
    sta.z memset.num+1
    jsr memset
    jmp __b7
    // part1_init::@7
  __b7:
    // [308] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Enable CHARGEN, Disable kernal & basic
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // [309] *PROCPORT = PROCPORT_RAM_CHARROM -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_CHARROM
    sta PROCPORT
    // [310] call memcpy
    // [444] phi from part1_init::@7 to memcpy [phi:part1_init::@7->memcpy]
  memcpy_from___b7:
    // [444] phi memcpy::num#6 = $800 [phi:part1_init::@7->memcpy#0] -- vwuz1=vwuc1 
    lda #<$800
    sta.z memcpy.num
    lda #>$800
    sta.z memcpy.num+1
    // [444] phi memcpy::destination#6 = (void *)LOAD_CHARSET [phi:part1_init::@7->memcpy#1] -- pvoz1=pvoc1 
    lda #<LOAD_CHARSET
    sta.z memcpy.destination
    lda #>LOAD_CHARSET
    sta.z memcpy.destination+1
    // [444] phi memcpy::source#6 = (void *)CHARGEN [phi:part1_init::@7->memcpy#2] -- pvoz1=pvoc1 
    lda #<CHARGEN
    sta.z memcpy.source
    lda #>CHARGEN
    sta.z memcpy.source+1
    jsr memcpy
    jmp __b8
    // part1_init::@8
  __b8:
    // [311] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Enable IO, Disable kernal & basic
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // [312] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_IO
    sta PROCPORT
    // [313] call memcpy
  // Copy loading screen 
    // [444] phi from part1_init::@8 to memcpy [phi:part1_init::@8->memcpy]
  memcpy_from___b8:
    // [444] phi memcpy::num#6 = $400 [phi:part1_init::@8->memcpy#0] -- vwuz1=vwuc1 
    lda #<$400
    sta.z memcpy.num
    lda #>$400
    sta.z memcpy.num+1
    // [444] phi memcpy::destination#6 = (void *)LOAD_SCREEN [phi:part1_init::@8->memcpy#1] -- pvoz1=pvoc1 
    lda #<LOAD_SCREEN
    sta.z memcpy.destination
    lda #>LOAD_SCREEN
    sta.z memcpy.destination+1
    // [444] phi memcpy::source#6 = (void *)DEFAULT_SCREEN [phi:part1_init::@8->memcpy#2] -- pvoz1=pvoc1 
    lda #<DEFAULT_SCREEN
    sta.z memcpy.source
    lda #>DEFAULT_SCREEN
    sta.z memcpy.source+1
    jsr memcpy
    // [314] phi from part1_init::@8 to part1_init::@9 [phi:part1_init::@8->part1_init::@9]
  __b9_from___b8:
    jmp __b9
    // part1_init::@9
  __b9:
    // [315] call memcpy
  // Copy loading  colors
    // [444] phi from part1_init::@9 to memcpy [phi:part1_init::@9->memcpy]
  memcpy_from___b9:
    // [444] phi memcpy::num#6 = $3e8 [phi:part1_init::@9->memcpy#0] -- vwuz1=vwuc1 
    lda #<$3e8
    sta.z memcpy.num
    lda #>$3e8
    sta.z memcpy.num+1
    // [444] phi memcpy::destination#6 = (void *)LOAD_COLORS [phi:part1_init::@9->memcpy#1] -- pvoz1=pvoc1 
    lda #<LOAD_COLORS
    sta.z memcpy.destination
    lda #>LOAD_COLORS
    sta.z memcpy.destination+1
    // [444] phi memcpy::source#6 = (void *)COLS [phi:part1_init::@9->memcpy#2] -- pvoz1=pvoc1 
    lda #<COLS
    sta.z memcpy.source
    lda #>COLS
    sta.z memcpy.source+1
    jsr memcpy
    jmp __breturn
    // part1_init::@return
  __breturn:
    // [316] return 
    rts
}
  // part1_run
part1_run: {
    .const toSpritePtr1_return = $ff&P1_SPRITES/$40
    jmp SEI1
    // part1_run::SEI1
  SEI1:
    // asm { sei  }
    sei
    jmp __b1
    // part1_run::@1
  __b1:
    // [319] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Disable kernal & basic
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // [320] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_IO
    sta PROCPORT
    // [321] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR -- _deref_pbuc1=vbuc2 
    // Disable CIA 1 Timer IRQ
    lda #CIA_INTERRUPT_CLEAR
    sta CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT
    // asm { ldaCIA1_INTERRUPT  }
    // Acknowledge any timer IRQ
    lda CIA1_INTERRUPT
    // [323] *IRQ_STATUS = $f -- _deref_pbuc1=vbuc2 
    // Acknowledge any VIC IRQ
    lda #$f
    sta IRQ_STATUS
    // [324] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    // Set raster line to 0x136
    lda #$80
    ora VICII_CONTROL1
    sta VICII_CONTROL1
    // [325] *RASTER = IRQ_PART1_TOP_LINE -- _deref_pbuc1=vbuc2 
    lda #IRQ_PART1_TOP_LINE
    sta RASTER
    // [326] *HARDWARE_IRQ = &irq_part1_top -- _deref_qprc1=pprc2 
    // Set the IRQ routine
    lda #<irq_part1_top
    sta HARDWARE_IRQ
    lda #>irq_part1_top
    sta HARDWARE_IRQ+1
    // [327] *IRQ_ENABLE = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Enable Raster Interrupt
    lda #IRQ_RASTER
    sta IRQ_ENABLE
    // [328] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = 1 -- _deref_pbuc1=vbuc2 
    // Show Sparkler 
    lda #1
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC
    // [329] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR) = PINK -- _deref_pbuc1=vbuc2 
    lda #PINK
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR
    // [330] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1) = YELLOW -- _deref_pbuc1=vbuc2 
    lda #YELLOW
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1
    // [331] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2) = PURPLE -- _deref_pbuc1=vbuc2 
    lda #PURPLE
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2
    // [332] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = 1 -- _deref_pbuc1=vbuc2 
    lda #1
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB
    // [333] *((char *)VICII) = $16 -- _deref_pbuc1=vbuc2 
    // 262
    lda #$16
    sta VICII
    // [334] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_Y) = $be -- _deref_pbuc1=vbuc2 
    // 262
    lda #$be
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_Y
    // [335] phi from part1_run::@1 to part1_run::toSpritePtr1 [phi:part1_run::@1->part1_run::toSpritePtr1]
  toSpritePtr1_from___b1:
    jmp toSpritePtr1
    // part1_run::toSpritePtr1
  toSpritePtr1:
    jmp __b2
    // part1_run::@2
  __b2:
    // [336] *P1_SCREEN_SPRITE_PTRS = part1_run::toSpritePtr1_return#0 -- _deref_pbuc1=vbuc2 
    // 144
    lda #toSpritePtr1_return
    sta P1_SCREEN_SPRITE_PTRS
    jmp CLI1
    // part1_run::CLI1
  CLI1:
    // asm { cli  }
    cli
    // [338] phi from part1_run::CLI1 to part1_run::@3 [phi:part1_run::CLI1->part1_run::@3]
  __b3_from_CLI1:
    jmp __b3
    // part1_run::@3
  __b3:
    // [339] call part1_loop
    jsr part1_loop
    jmp __breturn
    // part1_run::@return
  __breturn:
    // [340] return 
    rts
}
.segment CodePart2
  // part2_init
part2_init: {
    .const toSpritePtr1_return = $ff&PART2_SPRITES/$40
    // Prepare 8 frames of y-positions into BUCKET_SPRITES
    .label frame = $46
    .label frame_idx = 4
    // [341] byteboozer_decrunch::crunched = SPRITES_CRUNCHED -- pbuz1=pbuc1 
    lda #<SPRITES_CRUNCHED
    sta.z byteboozer_decrunch.crunched
    lda #>SPRITES_CRUNCHED
    sta.z byteboozer_decrunch.crunched+1
    // [342] call byteboozer_decrunch
    // Decrunch sprites
    jsr byteboozer_decrunch
    // [343] phi from part2_init to part2_init::@13 [phi:part2_init->part2_init::@13]
  __b13_from_part2_init:
    jmp __b13
    // part2_init::@13
  __b13:
    // [344] call memcpy
  // Move the crunched logo data out of harms way
    // [444] phi from part2_init::@13 to memcpy [phi:part2_init::@13->memcpy]
  memcpy_from___b13:
    // [444] phi memcpy::num#6 = LOGO_DATA_CRUNCHED_SIZE [phi:part2_init::@13->memcpy#0] -- vwuz1=vwuc1 
    lda #<LOGO_DATA_CRUNCHED_SIZE
    sta.z memcpy.num
    lda #>LOGO_DATA_CRUNCHED_SIZE
    sta.z memcpy.num+1
    // [444] phi memcpy::destination#6 = (void *)LOGO_DATA_CRUNCHED2 [phi:part2_init::@13->memcpy#1] -- pvoz1=pvoc1 
    lda #<LOGO_DATA_CRUNCHED2
    sta.z memcpy.destination
    lda #>LOGO_DATA_CRUNCHED2
    sta.z memcpy.destination+1
    // [444] phi memcpy::source#6 = (void *)LOGO_DATA_CRUNCHED [phi:part2_init::@13->memcpy#2] -- pvoz1=pvoc1 
    lda #<LOGO_DATA_CRUNCHED
    sta.z memcpy.source
    lda #>LOGO_DATA_CRUNCHED
    sta.z memcpy.source+1
    jsr memcpy
    // [345] phi from part2_init::@13 to part2_init::@14 [phi:part2_init::@13->part2_init::@14]
  __b14_from___b13:
    jmp __b14
    // part2_init::@14
  __b14:
    // [346] call memcpy
  // Move the crunched plex updaters out of harms way
    // [444] phi from part2_init::@14 to memcpy [phi:part2_init::@14->memcpy]
  memcpy_from___b14:
    // [444] phi memcpy::num#6 = PLEX_ID_UPDATERS_CRUNCHED_SIZE [phi:part2_init::@14->memcpy#0] -- vwuz1=vwuc1 
    lda #<PLEX_ID_UPDATERS_CRUNCHED_SIZE
    sta.z memcpy.num
    lda #>PLEX_ID_UPDATERS_CRUNCHED_SIZE
    sta.z memcpy.num+1
    // [444] phi memcpy::destination#6 = (void *)PLEX_ID_UPDATERS_CRUNCHED2 [phi:part2_init::@14->memcpy#1] -- pvoz1=pvoc1 
    lda #<PLEX_ID_UPDATERS_CRUNCHED2
    sta.z memcpy.destination
    lda #>PLEX_ID_UPDATERS_CRUNCHED2
    sta.z memcpy.destination+1
    // [444] phi memcpy::source#6 = (void *)PLEX_ID_UPDATERS_CRUNCHED [phi:part2_init::@14->memcpy#2] -- pvoz1=pvoc1 
    lda #<PLEX_ID_UPDATERS_CRUNCHED
    sta.z memcpy.source
    lda #>PLEX_ID_UPDATERS_CRUNCHED
    sta.z memcpy.source+1
    jsr memcpy
    jmp __b15
    // part2_init::@15
  __b15:
    // [347] byteboozer_decrunch::crunched = PLEX_ID_UPDATERS_CRUNCHED2 -- pbuz1=pbuc1 
    lda #<PLEX_ID_UPDATERS_CRUNCHED2
    sta.z byteboozer_decrunch.crunched
    lda #>PLEX_ID_UPDATERS_CRUNCHED2
    sta.z byteboozer_decrunch.crunched+1
    // [348] call byteboozer_decrunch
    // Decrunch multiplexer frame updaters (from new location)
    jsr byteboozer_decrunch
    jmp __b16
    // part2_init::@16
  __b16:
    // [349] byteboozer_decrunch::crunched = LOGO_DATA_CRUNCHED2 -- pbuz1=pbuc1 
    lda #<LOGO_DATA_CRUNCHED2
    sta.z byteboozer_decrunch.crunched
    lda #>LOGO_DATA_CRUNCHED2
    sta.z byteboozer_decrunch.crunched+1
    // [350] call byteboozer_decrunch
    // Decrunch logo data
    jsr byteboozer_decrunch
    jmp __b17
    // part2_init::@17
  __b17:
    // [351] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Empty the hidden part of the bitmap   
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // [352] *PROCPORT = PROCPORT_RAM_ALL -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_ALL
    sta PROCPORT
    // [353] call memset
    // [435] phi from part2_init::@17 to memset [phi:part2_init::@17->memset]
  memset_from___b17:
    // [435] phi memset::c#7 = 0 [phi:part2_init::@17->memset#0] -- vbuxx=vbuc1 
    ldx #0
    // [435] phi memset::str#6 = (void *)PART2_BITMAP+$1f40 [phi:part2_init::@17->memset#1] -- pvoz1=pvoc1 
    lda #<PART2_BITMAP+$1f40
    sta.z memset.str
    lda #>PART2_BITMAP+$1f40
    sta.z memset.str+1
    // [435] phi memset::num#5 = $c0 [phi:part2_init::@17->memset#2] -- vwuz1=vbuc1 
    lda #<$c0
    sta.z memset.num
    lda #>$c0
    sta.z memset.num+1
    jsr memset
    jmp __b18
    // part2_init::@18
  __b18:
    // [354] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // [355] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_IO
    sta PROCPORT
    // [356] call memset
  // Empty screen & cols
    // [435] phi from part2_init::@18 to memset [phi:part2_init::@18->memset]
  memset_from___b18:
    // [435] phi memset::c#7 = BLACK [phi:part2_init::@18->memset#0] -- vbuxx=vbuc1 
    ldx #BLACK
    // [435] phi memset::str#6 = (void *)COLS [phi:part2_init::@18->memset#1] -- pvoz1=pvoc1 
    lda #<COLS
    sta.z memset.str
    lda #>COLS
    sta.z memset.str+1
    // [435] phi memset::num#5 = $400 [phi:part2_init::@18->memset#2] -- vwuz1=vwuc1 
    lda #<$400
    sta.z memset.num
    lda #>$400
    sta.z memset.num+1
    jsr memset
    // [357] phi from part2_init::@18 to part2_init::@19 [phi:part2_init::@18->part2_init::@19]
  __b19_from___b18:
    jmp __b19
    // part2_init::@19
  __b19:
    // [358] call memset
    // [435] phi from part2_init::@19 to memset [phi:part2_init::@19->memset]
  memset_from___b19:
    // [435] phi memset::c#7 = BLACK [phi:part2_init::@19->memset#0] -- vbuxx=vbuc1 
    ldx #BLACK
    // [435] phi memset::str#6 = (void *)PART2_SCREEN [phi:part2_init::@19->memset#1] -- pvoz1=pvoc1 
    lda #<PART2_SCREEN
    sta.z memset.str
    lda #>PART2_SCREEN
    sta.z memset.str+1
    // [435] phi memset::num#5 = $3e8 [phi:part2_init::@19->memset#2] -- vwuz1=vwuc1 
    lda #<$3e8
    sta.z memset.num
    lda #>$3e8
    sta.z memset.num+1
    jsr memset
    jmp __b20
    // part2_init::@20
  __b20:
    // [359] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR) = GREY -- _deref_pbuc1=vbuc2 
    // Fade the sparkler
    lda #GREY
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR
    // [360] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1) = BROWN -- _deref_pbuc1=vbuc2 
    lda #BROWN
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1
    // [361] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2) = BLUE -- _deref_pbuc1=vbuc2 
    lda #BLUE
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2
    // [362] call plexPrepareInit
  // Initialize PLEX tables
    // [470] phi from part2_init::@20 to plexPrepareInit [phi:part2_init::@20->plexPrepareInit]
  plexPrepareInit_from___b20:
    jsr plexPrepareInit
    // [363] phi from part2_init::@20 to part2_init::@1 [phi:part2_init::@20->part2_init::@1]
  __b1_from___b20:
    // [363] phi part2_init::frame#5 = BUCKET_SPRITES [phi:part2_init::@20->part2_init::@1#0] -- pssz1=pssc1 
    lda #<BUCKET_SPRITES
    sta.z frame
    lda #>BUCKET_SPRITES
    sta.z frame+1
    // [363] phi part2_init::frame_idx#2 = 0 [phi:part2_init::@20->part2_init::@1#1] -- vbuz1=vbuc1 
    lda #0
    sta.z frame_idx
    jmp __b1
    // part2_init::@1
  __b1:
    // [364] if(part2_init::frame_idx#2<8) goto part2_init::@2 -- vbuz1_lt_vbuc1_then_la1 
    lda.z frame_idx
    cmp #8
    bcc __b2
    // [365] phi from part2_init::@1 to part2_init::@3 [phi:part2_init::@1->part2_init::@3]
  __b3_from___b1:
    jmp __b3
    // part2_init::@3
  __b3:
    // [366] call memcpy
  // Copy the original buckets 
    // [444] phi from part2_init::@3 to memcpy [phi:part2_init::@3->memcpy]
  memcpy_from___b3:
    // [444] phi memcpy::num#6 = (unsigned int)8*9*8*SIZEOF_STRUCT_BUCKETSPRITE [phi:part2_init::@3->memcpy#0] -- vwuz1=vwuc1 
    lda #<8*9*8*SIZEOF_STRUCT_BUCKETSPRITE
    sta.z memcpy.num
    lda #>8*9*8*SIZEOF_STRUCT_BUCKETSPRITE
    sta.z memcpy.num+1
    // [444] phi memcpy::destination#6 = (void *)ORIGINAL_BUCKET_SPRITES [phi:part2_init::@3->memcpy#1] -- pvoz1=pvoc1 
    lda #<ORIGINAL_BUCKET_SPRITES
    sta.z memcpy.destination
    lda #>ORIGINAL_BUCKET_SPRITES
    sta.z memcpy.destination+1
    // [444] phi memcpy::source#6 = (void *)BUCKET_SPRITES [phi:part2_init::@3->memcpy#2] -- pvoz1=pvoc1 
    lda #<BUCKET_SPRITES
    sta.z memcpy.source
    lda #>BUCKET_SPRITES
    sta.z memcpy.source+1
    jsr memcpy
    // [367] phi from part2_init::@3 to part2_init::@7 [phi:part2_init::@3->part2_init::@7]
  __b7_from___b3:
    // [367] phi part2_init::s1#2 = 0 [phi:part2_init::@3->part2_init::@7#0] -- vbuxx=vbuc1 
    ldx #0
    jmp __b7
  // Set the initial sprite pointers
    // part2_init::@7
  __b7:
    // [368] if(part2_init::s1#2<$20) goto part2_init::toSpritePtr1 -- vbuxx_lt_vbuc1_then_la1 
    cpx #$20
    bcc toSpritePtr1_from___b7
    jmp __b8
    // part2_init::@8
  __b8:
    // [369] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = 0 -- _deref_pbuc1=vbuc2 
    // Disable sparkler
    lda #0
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB
    // [370] *((char *)VICII) = 0 -- _deref_pbuc1=vbuc2 
    lda #0
    sta VICII
    // [371] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 0 -- _deref_pbuc1=vbuc2 
    lda #0
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE
    // [372] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = 0 -- _deref_pbuc1=vbuc2 
    // Set sprite colors
    lda #0
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC
    // [373] phi from part2_init::@8 to part2_init::@9 [phi:part2_init::@8->part2_init::@9]
  __b9_from___b8:
    // [373] phi part2_init::s2#2 = 0 [phi:part2_init::@8->part2_init::@9#0] -- vbuxx=vbuc1 
    ldx #0
    jmp __b9
    // part2_init::@9
  __b9:
    // [374] if(part2_init::s2#2<8) goto part2_init::@10 -- vbuxx_lt_vbuc1_then_la1 
    cpx #8
    bcc __b10
    // [375] phi from part2_init::@9 to part2_init::@11 [phi:part2_init::@9->part2_init::@11]
  __b11_from___b9:
    jmp __b11
    // part2_init::@11
  __b11:
    // [376] call memset
  // Empty the rest of the screen    
    // [435] phi from part2_init::@11 to memset [phi:part2_init::@11->memset]
  memset_from___b11:
    // [435] phi memset::c#7 = BLACK [phi:part2_init::@11->memset#0] -- vbuxx=vbuc1 
    ldx #BLACK
    // [435] phi memset::str#6 = (void *)PART2_SCREEN+$3e8 [phi:part2_init::@11->memset#1] -- pvoz1=pvoc1 
    lda #<PART2_SCREEN+$3e8
    sta.z memset.str
    lda #>PART2_SCREEN+$3e8
    sta.z memset.str+1
    // [435] phi memset::num#5 = $18 [phi:part2_init::@11->memset#2] -- vwuz1=vbuc1 
    lda #<$18
    sta.z memset.num
    lda #>$18
    sta.z memset.num+1
    jsr memset
    jmp __breturn
    // part2_init::@return
  __breturn:
    // [377] return 
    rts
    // part2_init::@10
  __b10:
    // [378] SPRITES_COLOR[part2_init::s2#2] = WHITE -- pbuc1_derefidx_vbuxx=vbuc2 
    lda #WHITE
    sta SPRITES_COLOR,x
    // [379] part2_init::s2#1 = ++ part2_init::s2#2 -- vbuxx=_inc_vbuxx 
    inx
    // [373] phi from part2_init::@10 to part2_init::@9 [phi:part2_init::@10->part2_init::@9]
  __b9_from___b10:
    // [373] phi part2_init::s2#2 = part2_init::s2#1 [phi:part2_init::@10->part2_init::@9#0] -- register_copy 
    jmp __b9
    // [380] phi from part2_init::@7 to part2_init::toSpritePtr1 [phi:part2_init::@7->part2_init::toSpritePtr1]
  toSpritePtr1_from___b7:
    jmp toSpritePtr1
    // part2_init::toSpritePtr1
  toSpritePtr1:
    jmp __b12
    // part2_init::@12
  __b12:
    // [381] PLEX_PTR[part2_init::s1#2] = part2_init::toSpritePtr1_return#0+' ' -- pbuc1_derefidx_vbuxx=vbuc2 
    lda #toSpritePtr1_return+' '
    sta PLEX_PTR,x
    // [382] part2_init::s1#1 = ++ part2_init::s1#2 -- vbuxx=_inc_vbuxx 
    inx
    // [367] phi from part2_init::@12 to part2_init::@7 [phi:part2_init::@12->part2_init::@7]
  __b7_from___b12:
    // [367] phi part2_init::s1#2 = part2_init::s1#1 [phi:part2_init::@12->part2_init::@7#0] -- register_copy 
    jmp __b7
    // part2_init::@2
  __b2:
    // [383] part2_init::sin_idx#4 = part2_init::frame_idx#2 -- vbuxx=vbuz1 
    ldx.z frame_idx
    // [384] phi from part2_init::@2 to part2_init::@4 [phi:part2_init::@2->part2_init::@4]
  __b4_from___b2:
    // [384] phi part2_init::sin_idx#2 = part2_init::sin_idx#4 [phi:part2_init::@2->part2_init::@4#0] -- register_copy 
    // [384] phi part2_init::s#2 = 0 [phi:part2_init::@2->part2_init::@4#1] -- vbuyy=vbuc1 
    ldy #0
    jmp __b4
    // part2_init::@4
  __b4:
    // [385] if(part2_init::s#2<$20) goto part2_init::@5 -- vbuyy_lt_vbuc1_then_la1 
    cpy #$20
    bcc __b5
    jmp __b6
    // part2_init::@6
  __b6:
    // [386] plexPrepareFrame::frame#0 = part2_init::frame#5 -- pssz1=pssz2 
    lda.z frame
    sta.z plexPrepareFrame.frame
    lda.z frame+1
    sta.z plexPrepareFrame.frame+1
    // [387] call plexPrepareFrame
  // Perform bucket sort
    // [476] phi from part2_init::@6 to plexPrepareFrame [phi:part2_init::@6->plexPrepareFrame]
  plexPrepareFrame_from___b6:
    jsr plexPrepareFrame
    jmp __b21
    // part2_init::@21
  __b21:
    // [388] part2_init::frame#1 = part2_init::frame#5 + 8*9*SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_plus_vbuc1 
    // Move to Next frame
    lda #8*9*SIZEOF_STRUCT_BUCKETSPRITE
    clc
    adc.z frame
    sta.z frame
    bcc !+
    inc.z frame+1
  !:
    // [389] part2_init::frame_idx#1 = ++ part2_init::frame_idx#2 -- vbuz1=_inc_vbuz1 
    inc.z frame_idx
    // [363] phi from part2_init::@21 to part2_init::@1 [phi:part2_init::@21->part2_init::@1]
  __b1_from___b21:
    // [363] phi part2_init::frame#5 = part2_init::frame#1 [phi:part2_init::@21->part2_init::@1#0] -- register_copy 
    // [363] phi part2_init::frame_idx#2 = part2_init::frame_idx#1 [phi:part2_init::@21->part2_init::@1#1] -- register_copy 
    jmp __b1
    // part2_init::@5
  __b5:
    // [390] PLEX_YPOS[part2_init::s#2] = SCROLL_YSIN[part2_init::sin_idx#2] -- pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuxx 
    lda SCROLL_YSIN,x
    sta PLEX_YPOS,y
    // [391] part2_init::sin_idx#1 = part2_init::sin_idx#2 + 8 -- vbuxx=vbuxx_plus_vbuc1 
    txa
    axs #-[8]
    // [392] part2_init::s#1 = ++ part2_init::s#2 -- vbuyy=_inc_vbuyy 
    iny
    // [384] phi from part2_init::@5 to part2_init::@4 [phi:part2_init::@5->part2_init::@4]
  __b4_from___b5:
    // [384] phi part2_init::sin_idx#2 = part2_init::sin_idx#1 [phi:part2_init::@5->part2_init::@4#0] -- register_copy 
    // [384] phi part2_init::s#2 = part2_init::s#1 [phi:part2_init::@5->part2_init::@4#1] -- register_copy 
    jmp __b4
}
  // part2_run
part2_run: {
    .const toDd001_return = 0
    .const toD0181_return = >(PART2_SCREEN&$3fff)*4
    jmp SEI1
    // part2_run::SEI1
  SEI1:
    // asm { sei  }
    sei
    jmp __b1
    // part2_run::@1
  __b1:
    // [395] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = BLACK -- _deref_pbuc1=vbuc2 
    // Colors
    lda #BLACK
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR
    // [396] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLACK -- _deref_pbuc1=vbuc2 
    lda #BLACK
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR
    // [397] phi from part2_run::@1 to part2_run::toDd001 [phi:part2_run::@1->part2_run::toDd001]
  toDd001_from___b1:
    jmp toDd001
    // part2_run::toDd001
  toDd001:
    jmp __b2
    // part2_run::@2
  __b2:
    // [398] *((char *)CIA2) = part2_run::toDd001_return#0 -- _deref_pbuc1=vbuc2 
    // Change graphics bank
    lda #toDd001_return
    sta CIA2
    // [399] phi from part2_run::@2 to part2_run::toD0181 [phi:part2_run::@2->part2_run::toD0181]
  toD0181_from___b2:
    jmp toD0181
    // part2_run::toD0181
  toD0181:
    jmp __b3
    // part2_run::@3
  __b3:
    // [400] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = part2_run::toD0181_return#0 -- _deref_pbuc1=vbuc2 
    // Show screen
    lda #toD0181_return
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY
    // [401] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    // Set bitmap mode
    lda #VICII_BMM
    ora VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
    // [402] *SPRITES_ENABLE = $ff -- _deref_pbuc1=vbuc2 
    // Enable & initialize sprites
    lda #$ff
    sta SPRITES_ENABLE
    // [403] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR -- _deref_pbuc1=vbuc2 
    // Disable CIA 1 Timer IRQ
    lda #CIA_INTERRUPT_CLEAR
    sta CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT
    // asm { ldaCIA1_INTERRUPT  }
    // Acknowledge any timer IRQ
    lda CIA1_INTERRUPT
    // [405] *IRQ_STATUS = $f -- _deref_pbuc1=vbuc2 
    // Acknowledge any VIC IRQ
    lda #$f
    sta IRQ_STATUS
    // [406] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2 
    // Set raster line to first bucket
    lda #$7f
    and VICII_CONTROL1
    sta VICII_CONTROL1
    // [407] *RASTER = *BUCKET_YPOS -- _deref_pbuc1=_deref_pbuc2 
    lda BUCKET_YPOS
    sta RASTER
    // [408] *IRQ_ENABLE = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Enable Raster Interrupt
    lda #IRQ_RASTER
    sta IRQ_ENABLE
    // [409] *HARDWARE_IRQ = &irq_swing_top -- _deref_qprc1=pprc2 
    // Set the IRQ routine
    lda #<irq_swing_top
    sta HARDWARE_IRQ
    lda #>irq_swing_top
    sta HARDWARE_IRQ+1
    jmp CLI1
    // part2_run::CLI1
  CLI1:
    // asm { cli  }
    cli
    jmp __b4
    // part2_run::@4
  __b4:
    // [411] plex_frame_id = 0 -- vbuz1=vbuc1 
    // The current frame ID (0-7)
    lda #0
    sta.z plex_frame_id
    // [412] plex_frame = BUCKET_SPRITES -- pssz1=pssc1 
    // Pointer to the buckets of the current frame
    lda #<BUCKET_SPRITES
    sta.z plex_frame
    lda #>BUCKET_SPRITES
    sta.z plex_frame+1
    // [413] plex_id_offset = 0 -- vbuz1=vbuc1 
    // Offset added to plex_id to ensure the sprite cycling works (decreased 1 every time a cycle is complete)
    lda #0
    sta.z plex_id_offset
    // [414] call part2_loop
    jsr part2_loop
    jmp __breturn
    // part2_run::@return
  __breturn:
    // [415] return 
    rts
}
.segment Code
  // sparkler_anim
// Animate the sparkler sprite
sparkler_anim: {
    .const toSpritePtr1_return = $ff&P1_SPRITES/$40
    // [416] sparkler_idx = ++ sparkler_idx -- vbuz1=_inc_vbuz1 
    inc.z sparkler_idx
    // [417] if(sparkler_idx!=$1e) goto sparkler_anim::toSpritePtr1 -- vbuz1_neq_vbuc1_then_la1 
    lda #$1e
    cmp.z sparkler_idx
    bne toSpritePtr1_from_sparkler_anim
    jmp __b1
    // sparkler_anim::@1
  __b1:
    // [418] sparkler_idx = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z sparkler_idx
    // [419] phi from sparkler_anim sparkler_anim::@1 to sparkler_anim::toSpritePtr1 [phi:sparkler_anim/sparkler_anim::@1->sparkler_anim::toSpritePtr1]
  toSpritePtr1_from_sparkler_anim:
  toSpritePtr1_from___b1:
    jmp toSpritePtr1
    // sparkler_anim::toSpritePtr1
  toSpritePtr1:
    jmp __b2
    // sparkler_anim::@2
  __b2:
    // [420] sparkler_anim::$3 = sparkler_idx >> 1 -- vbuaa=vbuz1_ror_1 
    lda.z sparkler_idx
    lsr
    // [421] sparkler_anim::$4 = sparkler_anim::toSpritePtr1_return#0 + sparkler_anim::$3 -- vbuaa=vbuc1_plus_vbuaa 
    clc
    adc #toSpritePtr1_return
    // [422] *P1_SCREEN_SPRITE_PTRS = sparkler_anim::$4 -- _deref_pbuc1=vbuaa 
    sta P1_SCREEN_SPRITE_PTRS
    jmp __breturn
    // sparkler_anim::@return
  __breturn:
    // [423] return 
    rts
}
.segment CodePart1
  // init_rasters
// Initialize the BADLINES
init_rasters: {
    .label i = $46
    .label __3 = $4c
    // [425] phi from init_rasters to init_rasters::@1 [phi:init_rasters->init_rasters::@1]
  __b1_from_init_rasters:
    // [425] phi init_rasters::i#2 = 0 [phi:init_rasters->init_rasters::@1#0] -- vwuz1=vwuc1 
    lda #<0
    sta.z i
    lda #>0
    sta.z i+1
    jmp __b1
    // init_rasters::@1
  __b1:
    // [426] if(init_rasters::i#2<$130*SIZEOF_CHAR) goto init_rasters::@2 -- vwuz1_lt_vwuc1_then_la1 
    lda.z i+1
    cmp #>$130*SIZEOF_CHAR
    bcc __b2
    bne !+
    lda.z i
    cmp #<$130*SIZEOF_CHAR
    bcc __b2
  !:
    // [427] phi from init_rasters::@1 to init_rasters::@3 [phi:init_rasters::@1->init_rasters::@3]
  __b3_from___b1:
    // [427] phi init_rasters::b#2 = $32 [phi:init_rasters::@1->init_rasters::@3#0] -- vbuxx=vbuc1 
    ldx #$32
    jmp __b3
    // init_rasters::@3
  __b3:
    // [428] if(init_rasters::b#2<$fa) goto init_rasters::@4 -- vbuxx_lt_vbuc1_then_la1 
    cpx #$fa
    bcc __b4
    jmp __breturn
    // init_rasters::@return
  __breturn:
    // [429] return 
    rts
    // init_rasters::@4
  __b4:
    // [430] RASTER_BADLINES[init_rasters::b#2] = 1 -- pbuc1_derefidx_vbuxx=vbuc2 
    lda #1
    sta RASTER_BADLINES,x
    // [431] init_rasters::b#1 = init_rasters::b#2 + 8 -- vbuxx=vbuxx_plus_vbuc1 
    txa
    axs #-[8]
    // [427] phi from init_rasters::@4 to init_rasters::@3 [phi:init_rasters::@4->init_rasters::@3]
  __b3_from___b4:
    // [427] phi init_rasters::b#2 = init_rasters::b#1 [phi:init_rasters::@4->init_rasters::@3#0] -- register_copy 
    jmp __b3
    // init_rasters::@2
  __b2:
    // [432] init_rasters::$3 = RASTER_BADLINES + init_rasters::i#2 -- pbuz1=pbuc1_plus_vwuz2 
    lda.z i
    clc
    adc #<RASTER_BADLINES
    sta.z __3
    lda.z i+1
    adc #>RASTER_BADLINES
    sta.z __3+1
    // [433] *init_rasters::$3 = 0 -- _deref_pbuz1=vbuc1 
    lda #0
    ldy #0
    sta (__3),y
    // [434] init_rasters::i#1 = ++ init_rasters::i#2 -- vwuz1=_inc_vwuz1 
    inc.z i
    bne !+
    inc.z i+1
  !:
    // [425] phi from init_rasters::@2 to init_rasters::@1 [phi:init_rasters::@2->init_rasters::@1]
  __b1_from___b2:
    // [425] phi init_rasters::i#2 = init_rasters::i#1 [phi:init_rasters::@2->init_rasters::@1#0] -- register_copy 
    jmp __b1
}
.segment Code
  // memset
// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
// void * memset(__zp($48) void *str, __register(X) char c, __zp($4c) unsigned int num)
memset: {
    .label end = $4c
    .label dst = $48
    .label num = $4c
    .label str = $48
    // [436] if(memset::num#5<=0) goto memset::@return -- vwuz1_le_0_then_la1 
    lda.z num
    bne !+
    lda.z num+1
    beq __breturn
  !:
    jmp __b1
    // memset::@1
  __b1:
    // [437] memset::end#0 = (char *)memset::str#6 + memset::num#5 -- pbuz1=pbuz2_plus_vwuz1 
    clc
    lda.z end
    adc.z str
    sta.z end
    lda.z end+1
    adc.z str+1
    sta.z end+1
    // [438] memset::dst#4 = (char *)memset::str#6
    // [439] phi from memset::@1 memset::@3 to memset::@2 [phi:memset::@1/memset::@3->memset::@2]
  __b2_from___b1:
  __b2_from___b3:
    // [439] phi memset::dst#2 = memset::dst#4 [phi:memset::@1/memset::@3->memset::@2#0] -- register_copy 
    jmp __b2
    // memset::@2
  __b2:
    // [440] if(memset::dst#2!=memset::end#0) goto memset::@3 -- pbuz1_neq_pbuz2_then_la1 
    lda.z dst+1
    cmp.z end+1
    bne __b3
    lda.z dst
    cmp.z end
    bne __b3
    jmp __breturn
    // memset::@return
  __breturn:
    // [441] return 
    rts
    // memset::@3
  __b3:
    // [442] *memset::dst#2 = memset::c#7 -- _deref_pbuz1=vbuxx 
    txa
    ldy #0
    sta (dst),y
    // [443] memset::dst#1 = ++ memset::dst#2 -- pbuz1=_inc_pbuz1 
    inc.z dst
    bne !+
    inc.z dst+1
  !:
    jmp __b2_from___b3
}
  // memcpy
// Copy block of memory (forwards)
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
// void * memcpy(__zp($48) void *destination, __zp($4c) void *source, __zp($4a) unsigned int num)
memcpy: {
    .label src_end = $4a
    .label dst = $48
    .label src = $4c
    .label source = $4c
    .label destination = $48
    .label num = $4a
    // [445] memcpy::src_end#0 = (char *)memcpy::source#6 + memcpy::num#6 -- pbuz1=pbuz2_plus_vwuz1 
    clc
    lda.z src_end
    adc.z source
    sta.z src_end
    lda.z src_end+1
    adc.z source+1
    sta.z src_end+1
    // [446] memcpy::src#4 = (char *)memcpy::source#6
    // [447] memcpy::dst#4 = (char *)memcpy::destination#6
    // [448] phi from memcpy memcpy::@2 to memcpy::@1 [phi:memcpy/memcpy::@2->memcpy::@1]
  __b1_from_memcpy:
  __b1_from___b2:
    // [448] phi memcpy::dst#2 = memcpy::dst#4 [phi:memcpy/memcpy::@2->memcpy::@1#0] -- register_copy 
    // [448] phi memcpy::src#2 = memcpy::src#4 [phi:memcpy/memcpy::@2->memcpy::@1#1] -- register_copy 
    jmp __b1
    // memcpy::@1
  __b1:
    // [449] if(memcpy::src#2!=memcpy::src_end#0) goto memcpy::@2 -- pbuz1_neq_pbuz2_then_la1 
    lda.z src+1
    cmp.z src_end+1
    bne __b2
    lda.z src
    cmp.z src_end
    bne __b2
    jmp __breturn
    // memcpy::@return
  __breturn:
    // [450] return 
    rts
    // memcpy::@2
  __b2:
    // [451] *memcpy::dst#2 = *memcpy::src#2 -- _deref_pbuz1=_deref_pbuz2 
    ldy #0
    lda (src),y
    ldy #0
    sta (dst),y
    // [452] memcpy::dst#1 = ++ memcpy::dst#2 -- pbuz1=_inc_pbuz1 
    inc.z dst
    bne !+
    inc.z dst+1
  !:
    // [453] memcpy::src#1 = ++ memcpy::src#2 -- pbuz1=_inc_pbuz1 
    inc.z src
    bne !+
    inc.z src+1
  !:
    jmp __b1_from___b2
}
.segment CodePart1
  // part1_loop
// Handle some stuff in the main() routine
part1_loop: {
    .label __11 = $46
    // [454] p1_work_ready = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z p1_work_ready
    jmp __b1
    // part1_loop::@1
  __b1:
    // [455] if(p1_work_ready==0) goto part1_loop::@1 -- vbuz1_eq_0_then_la1 
    lda.z p1_work_ready
    beq __b1
    // [456] phi from part1_loop::@1 to part1_loop::@2 [phi:part1_loop::@1->part1_loop::@2]
  __b2_from___b1:
    jmp __b2
    // part1_loop::@2
  __b2:
    // [457] call flipper_fix_colors
    // Fix colors
    jsr flipper_fix_colors
    jmp __b7
    // part1_loop::@7
  __b7:
    // [458] part1_loop::$11 = demo_frame_count -- vwuz1=vwuz2 
    lda.z demo_frame_count
    sta.z __11
    lda.z demo_frame_count+1
    sta.z __11+1
    // [459] if(0!=sparkler_active) goto part1_loop::@4 -- 0_neq_vbuz1_then_la1 
    lda.z sparkler_active
    bne __b4_from___b7
    jmp __b9
    // part1_loop::@9
  __b9:
    // [460] if(part1_loop::$11<=(unsigned int)9*$32-3) goto part1_loop::@4 -- vwuz1_le_vwuc1_then_la1 
    lda.z __11+1
    cmp #>9*$32-3
    bne !+
    lda.z __11
    cmp #<9*$32-3
  !:
    bcc __b4_from___b9
    beq __b4_from___b9
    jmp __b3
    // part1_loop::@3
  __b3:
    // [461] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 1 -- _deref_pbuc1=vbuc2 
    lda #1
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE
    // [462] sparkler_active = 1 -- vbuz1=vbuc1 
    lda #1
    sta.z sparkler_active
    // [463] phi from part1_loop::@3 part1_loop::@7 part1_loop::@9 to part1_loop::@4 [phi:part1_loop::@3/part1_loop::@7/part1_loop::@9->part1_loop::@4]
  __b4_from___b3:
  __b4_from___b7:
  __b4_from___b9:
    jmp __b4
    // part1_loop::@4
  __b4:
    // [464] call demo_work
    // Perform any demo-wide work
    jsr demo_work
    jmp __b8
    // part1_loop::@8
  __b8:
    // [465] if(demo_frame_count<=(unsigned int)$e*$32) goto part1_loop::@5 -- vwuz1_le_vwuc1_then_la1 
    lda.z demo_frame_count+1
    cmp #>$e*$32
    bne !+
    lda.z demo_frame_count
    cmp #<$e*$32
  !:
    bcc __b5
    beq __b5
    // [466] phi from part1_loop::@8 to part1_loop::@6 [phi:part1_loop::@8->part1_loop::@6]
  __b6_from___b8:
    jmp __b6
    // part1_loop::@6
  __b6:
    // [467] call demo_start
  // Re-start the demo base IRQ
    // [282] phi from part1_loop::@6 to demo_start [phi:part1_loop::@6->demo_start]
  demo_start_from___b6:
    jsr demo_start
    jmp __breturn
    // part1_loop::@return
  __breturn:
    // [468] return 
    rts
    // part1_loop::@5
  __b5:
    // [469] p1_work_ready = 0 -- vbuz1=vbuc1 
    // My work is done!
    lda #0
    sta.z p1_work_ready
    jmp __b1
}
.segment CodePart2
  // plexPrepareInit
// Initialize data structures for the multiplexer
plexPrepareInit: {
    // [471] phi from plexPrepareInit to plexPrepareInit::@1 [phi:plexPrepareInit->plexPrepareInit::@1]
  __b1_from_plexPrepareInit:
    // [471] phi plexPrepareInit::i#2 = 0 [phi:plexPrepareInit->plexPrepareInit::@1#0] -- vbuxx=vbuc1 
    ldx #0
    jmp __b1
  // Initial sorting is trivial
    // plexPrepareInit::@1
  __b1:
    // [472] if(plexPrepareInit::i#2<$20) goto plexPrepareInit::@2 -- vbuxx_lt_vbuc1_then_la1 
    cpx #$20
    bcc __b2
    jmp __breturn
    // plexPrepareInit::@return
  __breturn:
    // [473] return 
    rts
    // plexPrepareInit::@2
  __b2:
    // [474] PLEX_SORTED_IDX[plexPrepareInit::i#2] = plexPrepareInit::i#2 -- pbuc1_derefidx_vbuxx=vbuxx 
    txa
    sta PLEX_SORTED_IDX,x
    // [475] plexPrepareInit::i#1 = ++ plexPrepareInit::i#2 -- vbuxx=_inc_vbuxx 
    inx
    // [471] phi from plexPrepareInit::@2 to plexPrepareInit::@1 [phi:plexPrepareInit::@2->plexPrepareInit::@1]
  __b1_from___b2:
    // [471] phi plexPrepareInit::i#2 = plexPrepareInit::i#1 [phi:plexPrepareInit::@2->plexPrepareInit::@1#0] -- register_copy 
    jmp __b1
}
  // plexPrepareFrame
// Performs run-time bucket sort of the sprites in the PLEX_ arrays into struct BucketSprite[]
// Starts by performing a true sorting of the sprites based on Y-position (unsing insertion sort)
// void plexPrepareFrame(__zp($4c) struct BucketSprite *frame)
plexPrepareFrame: {
    .label nxt_idx = $44
    .label nxt_y = $45
    .label m = 5
    .label bucket_ypos = 8
    .label plex_id = $42
    .label ypos = $43
    .label bucket = $4a
    .label sprite = $4c
    .label i1 = 6
    // The current bucket idx
    .label bucket_id = 7
    .label sprite_1 = $4a
    .label frame = $4c
    // [477] phi from plexPrepareFrame to plexPrepareFrame::@1 [phi:plexPrepareFrame->plexPrepareFrame::@1]
  __b1_from_plexPrepareFrame:
    // [477] phi plexPrepareFrame::m#2 = 0 [phi:plexPrepareFrame->plexPrepareFrame::@1#0] -- vbuz1=vbuc1 
    lda #0
    sta.z m
    jmp __b1
  // Sort the sprite indices in PLEX_SORTED_IDX based on the Y-position (using insertion sort)
  // Assumes that the positions are nearly sorted already (as each sprite just moves a bit)
  // 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.
    // plexPrepareFrame::@1
  __b1:
    // [478] if(plexPrepareFrame::m#2<$20-1) goto plexPrepareFrame::@2 -- vbuz1_lt_vbuc1_then_la1 
    lda.z m
    cmp #$20-1
    bcc __b2
    // [479] phi from plexPrepareFrame::@1 to plexPrepareFrame::@7 [phi:plexPrepareFrame::@1->plexPrepareFrame::@7]
  __b7_from___b1:
    // [479] phi plexPrepareFrame::i#2 = 0 [phi:plexPrepareFrame::@1->plexPrepareFrame::@7#0] -- vbuxx=vbuc1 
    ldx #0
    jmp __b7
  // Initialize real sprite free to the first bucket Y-position
    // plexPrepareFrame::@7
  __b7:
    // [480] if(plexPrepareFrame::i#2<8) goto plexPrepareFrame::@8 -- vbuxx_lt_vbuc1_then_la1 
    cpx #8
    bcc __b8
    jmp __b9
    // plexPrepareFrame::@9
  __b9:
    // [481] plexPrepareFrame::bucket_ypos#0 = *BUCKET_YPOS -- vbuz1=_deref_pbuc1 
    // The current bucket start y-position
    lda BUCKET_YPOS
    sta.z bucket_ypos
    // [482] plexPrepareFrame::bucket#10 = plexPrepareFrame::frame#0 -- pssz1=pssz2 
    lda.z frame
    sta.z bucket
    lda.z frame+1
    sta.z bucket+1
    // [483] phi from plexPrepareFrame::@9 to plexPrepareFrame::@10 [phi:plexPrepareFrame::@9->plexPrepareFrame::@10]
  __b10_from___b9:
    // [483] phi plexPrepareFrame::bucket_id#2 = 0 [phi:plexPrepareFrame::@9->plexPrepareFrame::@10#0] -- vbuz1=vbuc1 
    lda #0
    sta.z bucket_id
    // [483] phi plexPrepareFrame::sprite#3 = plexPrepareFrame::frame#0 [phi:plexPrepareFrame::@9->plexPrepareFrame::@10#1] -- register_copy 
    // [483] phi plexPrepareFrame::bucket#3 = plexPrepareFrame::bucket#10 [phi:plexPrepareFrame::@9->plexPrepareFrame::@10#2] -- register_copy 
    // [483] phi plexPrepareFrame::bucket_ypos#3 = plexPrepareFrame::bucket_ypos#0 [phi:plexPrepareFrame::@9->plexPrepareFrame::@10#3] -- register_copy 
    // [483] phi plexPrepareFrame::real_sprite_id#2 = 0 [phi:plexPrepareFrame::@9->plexPrepareFrame::@10#4] -- vbuxx=vbuc1 
    ldx #0
    // [483] phi plexPrepareFrame::i1#2 = 0 [phi:plexPrepareFrame::@9->plexPrepareFrame::@10#5] -- vbuz1=vbuc1 
    lda #0
    sta.z i1
    jmp __b10
    // plexPrepareFrame::@10
  __b10:
    // [484] if(plexPrepareFrame::i1#2<$20) goto plexPrepareFrame::@11 -- vbuz1_lt_vbuc1_then_la1 
    lda.z i1
    cmp #$20
    bcc __b11
    jmp __b12
    // plexPrepareFrame::@12
  __b12:
    // [485] plexPrepareFrame::bucket#1 = plexPrepareFrame::bucket#3 + 8*SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_plus_vbuc1 
    // Zero-fill the next sprite in the bucket (if not full)
    lda #8*SIZEOF_STRUCT_BUCKETSPRITE
    clc
    adc.z bucket
    sta.z bucket
    bcc !+
    inc.z bucket+1
  !:
    // [486] if(plexPrepareFrame::sprite#3==plexPrepareFrame::bucket#1) goto plexPrepareFrame::@return -- pssz1_eq_pssz2_then_la1 
    lda.z sprite
    cmp.z bucket
    bne !+
    lda.z sprite+1
    cmp.z bucket+1
    beq __breturn
  !:
    jmp __b17
    // plexPrepareFrame::@17
  __b17:
    // [487] *((char *)plexPrepareFrame::sprite#3) = 0 -- _deref_pbuz1=vbuc1 
    lda #0
    ldy #0
    sta (sprite),y
    jmp __breturn
    // plexPrepareFrame::@return
  __breturn:
    // [488] return 
    rts
    // plexPrepareFrame::@11
  __b11:
    // [489] plexPrepareFrame::plex_id#0 = PLEX_SORTED_IDX[plexPrepareFrame::i1#2] -- vbuz1=pbuc1_derefidx_vbuz2 
    ldy.z i1
    lda PLEX_SORTED_IDX,y
    sta.z plex_id
    // [490] plexPrepareFrame::ypos#0 = PLEX_YPOS[plexPrepareFrame::plex_id#0] -- vbuz1=pbuc1_derefidx_vbuz2 
    ldy.z plex_id
    lda PLEX_YPOS,y
    sta.z ypos
    // [491] if(plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::real_sprite_id#2]<=plexPrepareFrame::bucket_ypos#3) goto plexPrepareFrame::@13 -- pbuc1_derefidx_vbuxx_le_vbuz1_then_la1 
    txa
    tay
    lda.z bucket_ypos
    cmp real_sprite_free_ypos,y
    bcs __b13_from___b11
    jmp __b15
    // plexPrepareFrame::@15
  __b15:
    // [492] plexPrepareFrame::bucket_id#1 = ++ plexPrepareFrame::bucket_id#2 -- vbuz1=_inc_vbuz1 
    inc.z bucket_id
    // [493] plexPrepareFrame::bucket_ypos#2 = BUCKET_YPOS[plexPrepareFrame::bucket_id#1] -- vbuz1=pbuc1_derefidx_vbuz2 
    ldy.z bucket_id
    lda BUCKET_YPOS,y
    sta.z bucket_ypos
    // [494] plexPrepareFrame::sprite#2 = plexPrepareFrame::bucket#3 + 8*SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_plus_vbuc1 
    lda #8*SIZEOF_STRUCT_BUCKETSPRITE
    clc
    adc.z sprite_1
    sta.z sprite_1
    bcc !+
    inc.z sprite_1+1
  !:
    // [495] if(plexPrepareFrame::sprite#3==plexPrepareFrame::sprite#2) goto plexPrepareFrame::@14 -- pssz1_eq_pssz2_then_la1 
    lda.z sprite
    cmp.z sprite_1
    bne !+
    lda.z sprite+1
    cmp.z sprite_1+1
    beq __b14
  !:
    jmp __b16
    // plexPrepareFrame::@16
  __b16:
    // [496] *((char *)plexPrepareFrame::sprite#3) = 0 -- _deref_pbuz1=vbuc1 
    lda #0
    ldy #0
    sta (sprite),y
    jmp __b14
    // plexPrepareFrame::@14
  __b14:
    // [497] plexPrepareFrame::sprite#13 = plexPrepareFrame::sprite#2 -- pssz1=pssz2 
    lda.z sprite_1
    sta.z sprite
    lda.z sprite_1+1
    sta.z sprite+1
    // [498] phi from plexPrepareFrame::@11 plexPrepareFrame::@14 to plexPrepareFrame::@13 [phi:plexPrepareFrame::@11/plexPrepareFrame::@14->plexPrepareFrame::@13]
  __b13_from___b11:
  __b13_from___b14:
    // [498] phi plexPrepareFrame::bucket_id#5 = plexPrepareFrame::bucket_id#2 [phi:plexPrepareFrame::@11/plexPrepareFrame::@14->plexPrepareFrame::@13#0] -- register_copy 
    // [498] phi plexPrepareFrame::bucket#9 = plexPrepareFrame::bucket#3 [phi:plexPrepareFrame::@11/plexPrepareFrame::@14->plexPrepareFrame::@13#1] -- register_copy 
    // [498] phi plexPrepareFrame::bucket_ypos#4 = plexPrepareFrame::bucket_ypos#3 [phi:plexPrepareFrame::@11/plexPrepareFrame::@14->plexPrepareFrame::@13#2] -- register_copy 
    // [498] phi plexPrepareFrame::sprite#4 = plexPrepareFrame::sprite#3 [phi:plexPrepareFrame::@11/plexPrepareFrame::@14->plexPrepareFrame::@13#3] -- register_copy 
    jmp __b13
    // plexPrepareFrame::@13
  __b13:
    // [499] *((char *)plexPrepareFrame::sprite#4) = plexPrepareFrame::ypos#0 -- _deref_pbuz1=vbuz2 
    // Identify problems filling buckets
    // Put the sprite into the bucket
    lda.z ypos
    ldy #0
    sta (sprite),y
    // [500] ((char *)plexPrepareFrame::sprite#4)[OFFSET_STRUCT_BUCKETSPRITE_PLEX_ID] = plexPrepareFrame::plex_id#0 -- pbuz1_derefidx_vbuc1=vbuz2 
    lda.z plex_id
    ldy #OFFSET_STRUCT_BUCKETSPRITE_PLEX_ID
    sta (sprite),y
    // [501] plexPrepareFrame::bucket_ypos#1 = plexPrepareFrame::bucket_ypos#4 + 1 -- vbuz1=vbuz1_plus_1 
    // Increase bucket ypos to account for time spent placing the sprite
    inc.z bucket_ypos
    // [502] plexPrepareFrame::$16 = plexPrepareFrame::ypos#0 + $16 -- vbuaa=vbuz1_plus_vbuc1 
    lda #$16
    clc
    adc.z ypos
    // [503] plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::real_sprite_id#2] = plexPrepareFrame::$16 -- pbuc1_derefidx_vbuxx=vbuaa 
    // Update  next free ypos for the real sprite
    sta real_sprite_free_ypos,x
    // [504] plexPrepareFrame::$17 = plexPrepareFrame::real_sprite_id#2 + 1 -- vbuxx=vbuxx_plus_1 
    inx
    // [505] plexPrepareFrame::real_sprite_id#1 = plexPrepareFrame::$17 & 7 -- vbuxx=vbuxx_band_vbuc1 
    lda #7
    axs #0
    // [506] plexPrepareFrame::sprite#1 = plexPrepareFrame::sprite#4 + SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_plus_vbuc1 
    lda #SIZEOF_STRUCT_BUCKETSPRITE
    clc
    adc.z sprite
    sta.z sprite
    bcc !+
    inc.z sprite+1
  !:
    // [507] plexPrepareFrame::i1#1 = ++ plexPrepareFrame::i1#2 -- vbuz1=_inc_vbuz1 
    inc.z i1
    // [483] phi from plexPrepareFrame::@13 to plexPrepareFrame::@10 [phi:plexPrepareFrame::@13->plexPrepareFrame::@10]
  __b10_from___b13:
    // [483] phi plexPrepareFrame::bucket_id#2 = plexPrepareFrame::bucket_id#5 [phi:plexPrepareFrame::@13->plexPrepareFrame::@10#0] -- register_copy 
    // [483] phi plexPrepareFrame::sprite#3 = plexPrepareFrame::sprite#1 [phi:plexPrepareFrame::@13->plexPrepareFrame::@10#1] -- register_copy 
    // [483] phi plexPrepareFrame::bucket#3 = plexPrepareFrame::bucket#9 [phi:plexPrepareFrame::@13->plexPrepareFrame::@10#2] -- register_copy 
    // [483] phi plexPrepareFrame::bucket_ypos#3 = plexPrepareFrame::bucket_ypos#1 [phi:plexPrepareFrame::@13->plexPrepareFrame::@10#3] -- register_copy 
    // [483] phi plexPrepareFrame::real_sprite_id#2 = plexPrepareFrame::real_sprite_id#1 [phi:plexPrepareFrame::@13->plexPrepareFrame::@10#4] -- register_copy 
    // [483] phi plexPrepareFrame::i1#2 = plexPrepareFrame::i1#1 [phi:plexPrepareFrame::@13->plexPrepareFrame::@10#5] -- register_copy 
    jmp __b10
    // plexPrepareFrame::@8
  __b8:
    // [508] plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::i#2] = *BUCKET_YPOS -- pbuc1_derefidx_vbuxx=_deref_pbuc2 
    lda BUCKET_YPOS
    sta real_sprite_free_ypos,x
    // [509] plexPrepareFrame::i#1 = ++ plexPrepareFrame::i#2 -- vbuxx=_inc_vbuxx 
    inx
    // [479] phi from plexPrepareFrame::@8 to plexPrepareFrame::@7 [phi:plexPrepareFrame::@8->plexPrepareFrame::@7]
  __b7_from___b8:
    // [479] phi plexPrepareFrame::i#2 = plexPrepareFrame::i#1 [phi:plexPrepareFrame::@8->plexPrepareFrame::@7#0] -- register_copy 
    jmp __b7
    // plexPrepareFrame::@2
  __b2:
    // [510] plexPrepareFrame::nxt_idx#0 = (PLEX_SORTED_IDX+1)[plexPrepareFrame::m#2] -- vbuz1=pbuc1_derefidx_vbuz2 
    ldy.z m
    lda PLEX_SORTED_IDX+1,y
    sta.z nxt_idx
    // [511] plexPrepareFrame::nxt_y#0 = PLEX_YPOS[plexPrepareFrame::nxt_idx#0] -- vbuz1=pbuc1_derefidx_vbuz2 
    ldy.z nxt_idx
    lda PLEX_YPOS,y
    sta.z nxt_y
    // [512] if(plexPrepareFrame::nxt_y#0>=PLEX_YPOS[PLEX_SORTED_IDX[plexPrepareFrame::m#2]]) goto plexPrepareFrame::@3 -- 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 __b3
    jmp __b6
    // plexPrepareFrame::@6
  __b6:
    // [513] plexPrepareFrame::s#6 = plexPrepareFrame::m#2 -- vbuxx=vbuz1 
    ldx.z m
    // [514] phi from plexPrepareFrame::@18 plexPrepareFrame::@6 to plexPrepareFrame::@4 [phi:plexPrepareFrame::@18/plexPrepareFrame::@6->plexPrepareFrame::@4]
  __b4_from___b18:
  __b4_from___b6:
    // [514] phi plexPrepareFrame::s#3 = plexPrepareFrame::s#1 [phi:plexPrepareFrame::@18/plexPrepareFrame::@6->plexPrepareFrame::@4#0] -- register_copy 
    jmp __b4
    // plexPrepareFrame::@4
  __b4:
    // [515] (PLEX_SORTED_IDX+1)[plexPrepareFrame::s#3] = PLEX_SORTED_IDX[plexPrepareFrame::s#3] -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx 
    lda PLEX_SORTED_IDX,x
    sta PLEX_SORTED_IDX+1,x
    // [516] plexPrepareFrame::s#1 = -- plexPrepareFrame::s#3 -- vbuxx=_dec_vbuxx 
    dex
    // [517] if(plexPrepareFrame::s#1==$ff) goto plexPrepareFrame::@5 -- vbuxx_eq_vbuc1_then_la1 
    cpx #$ff
    beq __b5
    jmp __b18
    // plexPrepareFrame::@18
  __b18:
    // [518] if(plexPrepareFrame::nxt_y#0<PLEX_YPOS[PLEX_SORTED_IDX[plexPrepareFrame::s#1]]) goto plexPrepareFrame::@4 -- vbuz1_lt_pbuc1_derefidx_(pbuc2_derefidx_vbuxx)_then_la1 
    lda.z nxt_y
    ldy PLEX_SORTED_IDX,x
    cmp PLEX_YPOS,y
    bcc __b4_from___b18
    jmp __b5
    // plexPrepareFrame::@5
  __b5:
    // [519] plexPrepareFrame::s#2 = ++ plexPrepareFrame::s#1 -- vbuxx=_inc_vbuxx 
    inx
    // [520] PLEX_SORTED_IDX[plexPrepareFrame::s#2] = plexPrepareFrame::nxt_idx#0 -- pbuc1_derefidx_vbuxx=vbuz1 
    lda.z nxt_idx
    sta PLEX_SORTED_IDX,x
    jmp __b3
    // plexPrepareFrame::@3
  __b3:
    // [521] plexPrepareFrame::m#1 = ++ plexPrepareFrame::m#2 -- vbuz1=_inc_vbuz1 
    inc.z m
    // [477] phi from plexPrepareFrame::@3 to plexPrepareFrame::@1 [phi:plexPrepareFrame::@3->plexPrepareFrame::@1]
  __b1_from___b3:
    // [477] phi plexPrepareFrame::m#2 = plexPrepareFrame::m#1 [phi:plexPrepareFrame::@3->plexPrepareFrame::@1#0] -- register_copy 
    jmp __b1
  .segment DataPart2
    // Y-position where each real sprite is free (used for selecting the best bucket)
    real_sprite_free_ypos: .fill 8, 0
}
.segment CodePart2
  // part2_loop
// Part 2 main loop
part2_loop: {
    .label __23 = $46
    .label __24 = $48
    // [522] p2_work_ready = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z p2_work_ready
    jmp __b1
    // part2_loop::@1
  __b1:
    // [523] if(p2_work_ready==0) goto part2_loop::@1 -- vbuz1_eq_0_then_la1 
    lda.z p2_work_ready
    beq __b1
    // [524] phi from part2_loop::@1 to part2_loop::@2 [phi:part2_loop::@1->part2_loop::@2]
  __b2_from___b1:
    jmp __b2
    // part2_loop::@2
  __b2:
    // [525] call demo_work
    // Play music
    jsr demo_work
    jmp __b11
    // part2_loop::@11
  __b11:
    // [526] if(0==p2_logo_revealing) goto part2_loop::@4 -- 0_eq_vbuz1_then_la1 
    lda.z p2_logo_revealing
    beq __b4
    jmp __b12
    // part2_loop::@12
  __b12:
    // [527] if(0==p2_logo_reveal_done) goto part2_loop::@3 -- 0_eq_vbuz1_then_la1 
    lda.z p2_logo_reveal_done
    beq __b3_from___b12
    jmp __b4
    // [528] phi from part2_loop::@12 to part2_loop::@3 [phi:part2_loop::@12->part2_loop::@3]
  __b3_from___b12:
    jmp __b3
    // part2_loop::@3
  __b3:
    // [529] call p2_logo_reveal
    jsr p2_logo_reveal
    jmp __b4
    // part2_loop::@4
  __b4:
    // [530] part2_loop::$23 = demo_frame_count -- vwuz1=vwuz2 
    lda.z demo_frame_count
    sta.z __23
    lda.z demo_frame_count+1
    sta.z __23+1
    // [531] if(0!=p2_logo_revealing) goto part2_loop::@5 -- 0_neq_vbuz1_then_la1 
    lda.z p2_logo_revealing
    bne __b5
    jmp __b13
    // part2_loop::@13
  __b13:
    // [532] if(part2_loop::$23<=(unsigned int)$12*$32+$19) goto part2_loop::@5 -- vwuz1_le_vwuc1_then_la1 
    lda.z __23+1
    cmp #>$12*$32+$19
    bne !+
    lda.z __23
    cmp #<$12*$32+$19
  !:
    bcc __b5
    beq __b5
    jmp __b8
    // part2_loop::@8
  __b8:
    // [533] p2_logo_revealing = 1 -- vbuz1=vbuc1 
    lda #1
    sta.z p2_logo_revealing
    jmp __b5
    // part2_loop::@5
  __b5:
    // [534] if(0!=p2_logo_swinging) goto part2_loop::@6 -- 0_neq_vbuz1_then_la1 
    lda.z p2_logo_swinging
    bne __b6
    jmp __b14
    // part2_loop::@14
  __b14:
    // [535] if(0==p2_logo_reveal_done) goto part2_loop::@6 -- 0_eq_vbuz1_then_la1 
    lda.z p2_logo_reveal_done
    beq __b6
    jmp __b9
    // part2_loop::@9
  __b9:
    // [536] p2_logo_swinging = 1 -- vbuz1=vbuc1 
    lda #1
    sta.z p2_logo_swinging
    jmp __b6
    // part2_loop::@6
  __b6:
    // [537] part2_loop::$24 = demo_frame_count -- vwuz1=vwuz2 
    lda.z demo_frame_count
    sta.z __24
    lda.z demo_frame_count+1
    sta.z __24+1
    // [538] if(0!=p2_plex_scroller_moving) goto part2_loop::@7 -- 0_neq_vbuz1_then_la1 
    lda.z p2_plex_scroller_moving
    bne __b7
    jmp __b15
    // part2_loop::@15
  __b15:
    // [539] if(part2_loop::$24<=(unsigned int)$1a*$32) goto part2_loop::@7 -- vwuz1_le_vwuc1_then_la1 
    lda.z __24+1
    cmp #>$1a*$32
    bne !+
    lda.z __24
    cmp #<$1a*$32
  !:
    bcc __b7
    beq __b7
    jmp __b10
    // part2_loop::@10
  __b10:
    // [540] p2_plex_scroller_moving = 1 -- vbuz1=vbuc1 
    lda #1
    sta.z p2_plex_scroller_moving
    jmp __b7
    // part2_loop::@7
  __b7:
    // [541] p2_work_ready = 0 -- vbuz1=vbuc1 
    // My work is done!
    lda #0
    sta.z p2_work_ready
    jmp __b1
}
.segment CodePart1
  // flipper_fix_colors
// Fixes the colors for the flipper
// Updates with bitmap colors when the bitmap is being shown
flipper_fix_colors: {
    .label __4 = $48
    .label __5 = $48
    .label __12 = $4a
    .label offset = $4a
    .label colors = $4e
    .label happy_cols = $4a
    .label __13 = $4c
    .label __14 = $4a
    // [542] if(irq_flipper_top_line<$2e+1) goto flipper_fix_colors::@return -- vwuz1_lt_vbuc1_then_la1 
    lda.z irq_flipper_top_line+1
    bne !+
    lda.z irq_flipper_top_line
    cmp #$2e+1
    bcc __breturn
  !:
    jmp __b6
    // flipper_fix_colors::@6
  __b6:
    // [543] if(irq_flipper_top_line<$f6) goto flipper_fix_colors::@1 -- vwuz1_lt_vbuc1_then_la1 
    lda.z irq_flipper_top_line+1
    bne !+
    lda.z irq_flipper_top_line
    cmp #$f6
    bcc __b1
  !:
    jmp __breturn
    // flipper_fix_colors::@return
  __breturn:
    // [544] return 
    rts
    // flipper_fix_colors::@1
  __b1:
    // [545] flipper_fix_colors::$4 = irq_flipper_top_line - $2e -- vwuz1=vwuz2_minus_vbuc1 
    sec
    lda.z irq_flipper_top_line
    sbc #$2e
    sta.z __4
    lda.z irq_flipper_top_line+1
    sbc #0
    sta.z __4+1
    // [546] flipper_fix_colors::$5 = flipper_fix_colors::$4 >> 3 -- vwuz1=vwuz1_ror_3 
    lsr.z __5+1
    ror.z __5
    lsr.z __5+1
    ror.z __5
    lsr.z __5+1
    ror.z __5
    // [547] flipper_fix_colors::charline#0 = (char)flipper_fix_colors::$5 -- vbuaa=_byte_vwuz1 
    lda.z __5
    // [548] if(flipper_fix_colors::charline#0<flipper_charline) goto flipper_fix_colors::@return -- vbuaa_lt_vbuz1_then_la1 
    cmp.z flipper_charline
    bcc __breturn
    jmp __b2
    // flipper_fix_colors::@2
  __b2:
    // [549] flipper_fix_colors::$12 = (unsigned int)flipper_charline -- vwuz1=_word_vbuz2 
    lda.z flipper_charline
    sta.z __12
    lda #0
    sta.z __12+1
    // [550] flipper_fix_colors::$13 = flipper_fix_colors::$12 << 2 -- vwuz1=vwuz2_rol_2 
    lda.z __12
    asl
    sta.z __13
    lda.z __12+1
    rol
    sta.z __13+1
    asl.z __13
    rol.z __13+1
    // [551] flipper_fix_colors::$14 = flipper_fix_colors::$13 + flipper_fix_colors::$12 -- vwuz1=vwuz2_plus_vwuz1 
    clc
    lda.z __14
    adc.z __13
    sta.z __14
    lda.z __14+1
    adc.z __13+1
    sta.z __14+1
    // [552] flipper_fix_colors::offset#0 = flipper_fix_colors::$14 << 3 -- vwuz1=vwuz1_rol_3 
    asl.z offset
    rol.z offset+1
    asl.z offset
    rol.z offset+1
    asl.z offset
    rol.z offset+1
    // [553] flipper_fix_colors::colors#0 = COLS + flipper_fix_colors::offset#0 -- pbuz1=pbuc1_plus_vwuz2 
    // We have to update some colors
    lda.z offset
    clc
    adc #<COLS
    sta.z colors
    lda.z offset+1
    adc #>COLS
    sta.z colors+1
    // [554] flipper_fix_colors::happy_cols#0 = P1_COLORS + flipper_fix_colors::offset#0 -- pbuz1=pbuc1_plus_vwuz1 
    lda.z happy_cols
    clc
    adc #<P1_COLORS
    sta.z happy_cols
    lda.z happy_cols+1
    adc #>P1_COLORS
    sta.z happy_cols+1
    // [555] phi from flipper_fix_colors::@2 to flipper_fix_colors::@3 [phi:flipper_fix_colors::@2->flipper_fix_colors::@3]
  __b3_from___b2:
    // [555] phi flipper_fix_colors::i#2 = 0 [phi:flipper_fix_colors::@2->flipper_fix_colors::@3#0] -- vbuyy=vbuc1 
    ldy #0
    jmp __b3
    // flipper_fix_colors::@3
  __b3:
    // [556] if(flipper_fix_colors::i#2<$28) goto flipper_fix_colors::@4 -- vbuyy_lt_vbuc1_then_la1 
    cpy #$28
    bcc __b4
    jmp __b5
    // flipper_fix_colors::@5
  __b5:
    // [557] flipper_charline = ++ flipper_charline -- vbuz1=_inc_vbuz1 
    inc.z flipper_charline
    jmp __breturn
    // flipper_fix_colors::@4
  __b4:
    // [558] flipper_fix_colors::colors#0[flipper_fix_colors::i#2] = flipper_fix_colors::happy_cols#0[flipper_fix_colors::i#2] -- pbuz1_derefidx_vbuyy=pbuz2_derefidx_vbuyy 
    lda (happy_cols),y
    sta (colors),y
    // [559] flipper_fix_colors::i#1 = ++ flipper_fix_colors::i#2 -- vbuyy=_inc_vbuyy 
    iny
    // [555] phi from flipper_fix_colors::@4 to flipper_fix_colors::@3 [phi:flipper_fix_colors::@4->flipper_fix_colors::@3]
  __b3_from___b4:
    // [555] phi flipper_fix_colors::i#2 = flipper_fix_colors::i#1 [phi:flipper_fix_colors::@4->flipper_fix_colors::@3#0] -- register_copy 
    jmp __b3
}
.segment CodePart2
  // p2_logo_reveal
// Reveals the logo column by column
p2_logo_reveal: {
    // [560] if(p2_logo_reveal_idx>=$28) goto p2_logo_reveal::@1 -- vbuz1_ge_vbuc1_then_la1 
    lda.z p2_logo_reveal_idx
    cmp #$28
    bcs __b1
    jmp __b2
    // p2_logo_reveal::@2
  __b2:
    // [561] vsp_update_screen::x_offset = p2_logo_reveal_idx -- vbuz1=vbuz2 
    lda.z p2_logo_reveal_idx
    sta.z vsp_update_screen.x_offset
    // [562] call vsp_update_screen
    jsr vsp_update_screen
    jmp __b3
    // p2_logo_reveal::@3
  __b3:
    // [563] p2_logo_reveal_idx = ++ p2_logo_reveal_idx -- vbuz1=_inc_vbuz1 
    inc.z p2_logo_reveal_idx
    jmp __breturn
    // p2_logo_reveal::@return
  __breturn:
    // [564] return 
    rts
    // p2_logo_reveal::@1
  __b1:
    // [565] p2_logo_reveal_done = 1 -- vbuz1=vbuc1 
    lda #1
    sta.z p2_logo_reveal_done
    jmp __breturn
}
  // File Data
.segment Data
  // The byteboozer decruncher
BYTEBOOZER:
.const B2_ZP_BASE = $fc
    #import "byteboozer_decrunch.asm"

.segment InitPart1
  // MC Bitmap Data
P1_PIXELS_CRUNCHED:
.modify B2() {
        .pc = P1_PIXELS "HAPPYNEWYEAR PIXELS"    
        #import "mcbitmap.asm"
        .var mcBmmData1 = getMcBitmapData(LoadPicture("happy-newyear.png"))
        .for (var y=0; y<25; y++)
            .for (var x=0; x<40; x++)
                .fill 8, getMcPixelData(x, y, i, mcBmmData1)
    }

P1_SCREEN_CRUNCHED:
.modify B2() {
        .pc = P1_SCREEN "HAPPYNEWYEAR SCREEN"    
        .for (var y=0; y<25; y++)
            .for (var x=0; x<40; x++)
                .byte getMcScreenData(x, y, mcBmmData1)
    }

P1_COLORS_CRUNCHED:
.modify B2() {
        .pc = P1_COLORS "HAPPYNEWYEAR COLORS"    
        .for (var y=0; y<25; y++)
            .for (var x=0; x<40; x++)
                .byte getMcColorData(x, y, mcBmmData1)
    }

  // Sparkler sprites
P1_SPRITES_CRUNCHED:
.modify B2() {
        .pc = P1_SPRITES "P1_SPRITES"
        // Pixels                                                    11         01     10       11
        .var p1_sprites = LoadPicture("sparklers.png", List().add($000000, $daccc3, $472a24, $957a71))
        .for(var sx=0;sx<15;sx++) {
            .for (var y=0;y<21; y++) {
                .for (var c=0; c<3; c++) {
                    .byte p1_sprites.getMulticolorByte(sx*3+c,y)
                }
            }
            .byte 0
        }
    }

  // An easing curve from 0x000 to 0x130
FLIPPER_EASING_CRUNCHED:
.modify B2() {
        .pc = FLIPPER_EASING "FLIPPER_EASING"
        .fillword $130, round($98+$98*cos(PI+PI*i/$130))
    }

.segment DataPart1
  // 1 if the raster line is a badline
  .align $100
  RASTER_BADLINES: .fill $130, 0
.segment DataPart2
  // The Y-position (IRQ raster line) starting each bucket
  BUCKET_YPOS: .byte $10, $48, $58, $72, $8e, $aa, $c0, $d0, $de
  // The y-positions of the multiplexer sprites. (These are converted to multiplexer buckets)
  PLEX_YPOS: .fill $20, 0
  // The low byte of the x-positions of the multiplexer sprites 
  PLEX_XPOS: .fill $20, 0
  // The MSB of the x-positions of the multiplexer sprites (0/1)
  PLEX_XPOS_MSB: .fill $20, 0
  // The sprite pointers for the multiplexed sprites
  PLEX_PTR: .fill $20, 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 $20, 0
.segment InitPart2
SPRITES_CRUNCHED:
.modify B2() {
            .pc = PART2_SPRITES "PART2_SPRITES"
	        .var p2_sprites = LoadPicture("spritefont.png", List().add($000000, $ffffff))
	        .for(var sy=0;sy<8;sy++) {
    		    .for(var sx=0;sx<8;sx++) {
    	    	    .for (var y=0;y<21; y++) {
	    	    	    .for (var c=0; c<3; c++) {
    	                	.byte p2_sprites.getSinglecolorByte(sx*3+c,sy*21+y)
	                    }
	                }
	    	        .byte 0
	  	        }
	        }
        }

LOGO_DATA_CRUNCHED:
.modify B2() {
            .pc = LOGO_DATA "LOGO DATA"
            #import "mcbitmap.asm"
            .var mcBmmData2 = getMcBitmapData(LoadPicture("logo-bitmap-640.png"))    
            // Screen data
            .for (var y=0; y<LOGO_HEIGHT; y++)
                .for (var x=0; x<LOGO_WIDTH; x++)
                    .byte getMcScreenData(x, y, mcBmmData2)
            // Color Data
            .for (var y=0; y<LOGO_HEIGHT; y++)
                .for (var x=0; x<LOGO_WIDTH; x++)
                    .byte getMcColorData(x, y, mcBmmData2)
            // Bitmap Data (row by row)
            .for (var y=0; y<LOGO_HEIGHT; y++)
                .for (var i=0; i<8; i++)
                    .for (var x=0; x<LOGO_WIDTH; x++)
                        .byte getMcPixelData(x, y, i, mcBmmData2)
        }

.segment DataPart2
  // A sinus table with values [0;320]
  .align $100
VSP_SINTABLE:
.fillword $100, round(160+160*sin(2*PI*i/256))

  // The sequence of colors for the sprites
  SPRITE_COLOR_SEQUENCE: .byte WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, YELLOW, CYAN, GREEN, PURPLE, RED, BLUE, RED, PURPLE, GREEN, CYAN, YELLOW, WHITE, WHITE
  .align $100
SCROLL_YSIN:
.fill $100, round(139+89.5*sin(toRadians(360*i/256)))

  // The buckets containing sprites to show. 8 sprites in each bucket.
  .align $100
  BUCKET_SPRITES: .fill 2*8*9*8, 0
  // Copy of the original buckets containing sprites to show. 8 sprites in each bucket. (Used for adding the plex_id_offset)
  .align $100
  ORIGINAL_BUCKET_SPRITES: .fill 2*8*9*8, 0
  .align $100
XMOVEMENT:
//.lohifill $100, round(344-i*344/$100-86*sin(toRadians(360*i/$100)))
    .lohifill $200, round(344-i*344/$100-129*sin(toRadians(360*i/$100)))
    //.lohifill $100, round(344-i*344/$100-86*sin(toRadians(360*i/$80)))
    //.lohifill $100, round(344-i*344/$100 -86*sin(toRadians(360*i/$100)) -43*sin(toRadians(360*i/$80)))
    //.lohifill $100, 344-i*344/$100

  // The scroll text
  SCROLL_TEXT: .text @"* most people will remember 2020 for a long time. for us nerds, it was a chance to dig deep into our hobbies. but we do miss the demoparties, and drinking beers with you crazy people... it is the 30th birthday of camelot, and this virtual greeting card is our way of celebrating with all of you!     credits  *  code: rex  *  music: linus  *  graphics: bizkid, snabel & vic  *    camelot sends love to \$ff  abyss connection  \$ff  algotech  \$ff  ancients  \$ff  arsenic  \$ff  arise  \$ff  artline designs  \$ff  artstate  \$ff  atlantis  \$ff  bonzai  \$ff  booze design  \$ff  censor design  \$ff  cosine  \$ff  crest  \$ff  chorus  \$ff  dekadence  \$ff  delysid  \$ff  desire  \$ff  elysium  \$ff  excess  \$ff  extend  \$ff  faic  \$ff  f4cg  \$ff  fairlight  \$ff  fossil  \$ff  glance  \$ff  genesis project  \$ff  haujobb  \$ff  hitmen  \$ff  hoaxers  \$ff  hokuto force  \$ff  horizon  \$ff  illusion  \$ff  john dillermand  \$ff  laxity  \$ff  lepsi de  \$ff  lethargy  \$ff  mayday  \$ff  megastyle  \$ff  multistyle labs  \$ff  nah-kolor  \$ff  noice  \$ff  offence  \$ff  onslaught  \$ff  oxyron  \$ff  padua  \$ff  panda design  \$ff  panoramic designs  \$ff  performers  \$ff  plush  \$ff  pretzel logic  \$ff  prosonix  \$ff  proxima  \$ff  rabenauge  \$ff  radwar  \$ff  rebels  \$ff  resource  \$ff  samar  \$ff  scenesat  \$ff  shape  \$ff  siesta  \$ff  silicon ltd.  \$ff  singular  \$ff  software of sweden  \$ff  starion  \$ff  success  \$ff  svenonacid  \$ff  the dreams  \$ff  the solution  \$ff  triad  \$ff  tropyx  \$ff  trsi  \$ff  unicess  \$ff  up rough  \$ff  vision  \$ff  xenon  \$ff  xentax  \$ff  ... we hope to see you all again in 2021...                                "
  .byte 0
.segment InitPart2
PLEX_ID_UPDATERS_CRUNCHED:
.modify B2() {
        .pc = PLEX_ID_UPDATERS "PLEX_ID_UPDATERS"
        // First generate a jump table
        .for(var frame=0;frame<8;frame++) 
            .word updaters[frame].updater
        // Generate the 8 unrolled updaters
        updaters: 
        .for(var frame=0;frame<8;frame++) {
            updater:
            ldx #$1f
            .for(var sprite=0; sprite<9*8; sprite++ ) {
                lda ORIGINAL_BUCKET_SPRITES + frame*8*9*2 + sprite*2 +1
                clc
                adc plex_id_offset
                sax BUCKET_SPRITES + frame*8*9*2 + sprite*2 +1
            }
            rts        
        }
    }

.segment InitDemo
// SID tune
DEMO_MUSIC_CRUNCHED:
.modify B2() {
        .pc = DEMO_MUSIC "MUSIC"
        .const music = LoadSid("do-it-again-$AC00-$FA-8580.sid")
        .fill music.size, music.getData(i)
    }


ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __init1
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b17
Removing instruction jmp __b3
Removing instruction jmp __b4
Removing instruction jmp __b5
Removing instruction jmp __b18
Removing instruction jmp __b12
Removing instruction jmp __b13
Removing instruction jmp __b14
Removing instruction jmp __b19
Removing instruction jmp __b8
Removing instruction jmp __b6
Removing instruction jmp __b15
Removing instruction jmp __b20
Removing instruction jmp __b16
Removing instruction jmp __b10
Removing instruction jmp __b9
Removing instruction jmp __b2
Removing instruction jmp __breturn
Removing instruction jmp vsp_perform1
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b2
Removing instruction jmp __breturn
Removing instruction jmp __b11
Removing instruction jmp toD0181
Removing instruction jmp __b10
Removing instruction jmp __b2
Removing instruction jmp __b3
Removing instruction jmp __b5
Removing instruction jmp __b8
Removing instruction jmp __b7
Removing instruction jmp __b9
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b4
Removing instruction jmp __b3
Removing instruction jmp __b2
Removing instruction jmp __breturn
Removing instruction jmp toDd001
Removing instruction jmp __b4
Removing instruction jmp toD0181
Removing instruction jmp __b5
Removing instruction jmp __b3
Removing instruction jmp __b2
Removing instruction jmp __breturn
Removing instruction jmp __b7
Removing instruction jmp __b8
Removing instruction jmp __b1
Removing instruction jmp __b9
Removing instruction jmp __b2
Removing instruction jmp __b3
Removing instruction jmp __b10
Removing instruction jmp __b4
Removing instruction jmp __b5
Removing instruction jmp __b6
Removing instruction jmp __b1
Removing instruction jmp __b2
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b5
Removing instruction jmp __breturn
Removing instruction jmp __b6
Removing instruction jmp __b4
Removing instruction jmp __breturn
Removing instruction jmp __b4
Removing instruction jmp __b5
Removing instruction jmp __b3
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b3
Removing instruction jmp __breturn
Removing instruction jmp __b7
Removing instruction jmp __b8
Removing instruction jmp __b5
Removing instruction jmp __b10
Removing instruction jmp __b6
Removing instruction jmp toSpritePtr1
Removing instruction jmp __b9
Removing instruction jmp __b4
Removing instruction jmp __breturn
Removing instruction jmp __breturn
Removing instruction jmp SEI1
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp CLI1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b2
Removing instruction jmp __b3
Removing instruction jmp __b4
Removing instruction jmp __b5
Removing instruction jmp __b6
Removing instruction jmp __b7
Removing instruction jmp __b8
Removing instruction jmp __b9
Removing instruction jmp __breturn
Removing instruction jmp SEI1
Removing instruction jmp __b1
Removing instruction jmp toSpritePtr1
Removing instruction jmp __b2
Removing instruction jmp CLI1
Removing instruction jmp __b3
Removing instruction jmp __breturn
Removing instruction jmp __b13
Removing instruction jmp __b14
Removing instruction jmp __b15
Removing instruction jmp __b16
Removing instruction jmp __b17
Removing instruction jmp __b18
Removing instruction jmp __b19
Removing instruction jmp __b20
Removing instruction jmp __b1
Removing instruction jmp __b3
Removing instruction jmp __b7
Removing instruction jmp __b8
Removing instruction jmp __b9
Removing instruction jmp __b11
Removing instruction jmp __breturn
Removing instruction jmp toSpritePtr1
Removing instruction jmp __b12
Removing instruction jmp __b4
Removing instruction jmp __b6
Removing instruction jmp __b21
Removing instruction jmp SEI1
Removing instruction jmp __b1
Removing instruction jmp toDd001
Removing instruction jmp __b2
Removing instruction jmp toD0181
Removing instruction jmp __b3
Removing instruction jmp CLI1
Removing instruction jmp __b4
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp toSpritePtr1
Removing instruction jmp __b2
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b3
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b2
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b2
Removing instruction jmp __b7
Removing instruction jmp __b9
Removing instruction jmp __b3
Removing instruction jmp __b4
Removing instruction jmp __b8
Removing instruction jmp __b6
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __b7
Removing instruction jmp __b9
Removing instruction jmp __b10
Removing instruction jmp __b12
Removing instruction jmp __b17
Removing instruction jmp __breturn
Removing instruction jmp __b15
Removing instruction jmp __b16
Removing instruction jmp __b14
Removing instruction jmp __b13
Removing instruction jmp __b6
Removing instruction jmp __b4
Removing instruction jmp __b18
Removing instruction jmp __b5
Removing instruction jmp __b3
Removing instruction jmp __b1
Removing instruction jmp __b2
Removing instruction jmp __b11
Removing instruction jmp __b12
Removing instruction jmp __b3
Removing instruction jmp __b4
Removing instruction jmp __b13
Removing instruction jmp __b8
Removing instruction jmp __b5
Removing instruction jmp __b14
Removing instruction jmp __b9
Removing instruction jmp __b6
Removing instruction jmp __b15
Removing instruction jmp __b10
Removing instruction jmp __b7
Removing instruction jmp __b6
Removing instruction jmp __breturn
Removing instruction jmp __b2
Removing instruction jmp __b3
Removing instruction jmp __b5
Removing instruction jmp __b2
Removing instruction jmp __b3
Removing instruction jmp __breturn
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda #<0
Removing instruction lda #>0
Removing instruction lda #0
Removing instruction lda #<0
Removing instruction lda #>0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #<0
Removing instruction lda #>0
Removing instruction lda #0
Removing instruction lda #0
Replacing instruction lda.z plex_frame_id with TXA
Removing instruction lda.z scroll
Removing instruction lda.z x_offset
Removing instruction lda #0
Removing instruction ldy.z x_offset
Removing instruction lda #>0
Removing instruction lda #BLACK
Removing instruction ldy.z i
Removing instruction ldy.z s
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #BLACK
Removing instruction lda #>0
Replacing instruction ldy #0 with TAY
Removing instruction ldy #0
Removing instruction lda #1
Replacing instruction ldx #0 with TAX
Removing instruction lda #0
Replacing instruction ldy #0 with TAY
Replacing instruction ldy.z plex_id with TAY
Replacing instruction ldy #0 with TAY
Replacing instruction ldy.z nxt_idx with TAY
Removing instruction lda.z nxt_y
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Replacing label __b6_from___b6 with __b6
Replacing label __b5_from___b4 with __b5
Replacing label __b10_from___b5 with __b9
Replacing label __b6 with __b9
Replacing label toSpritePtr1_from___b7 with __b12
Replacing label toSpritePtr1_from_sparkler_anim with __b2
Replacing label __b2_from___b3 with __b2
Replacing label __b1_from___b2 with __b1
Replacing label __b4_from___b7 with __b4
Replacing label __b4_from___b9 with __b4
Replacing label __b4_from___b9 with __b4
Replacing label __b13_from___b11 with __b13
Replacing label __b4_from___b18 with __b4
Replacing label __b3_from___b12 with __b3
Removing instruction __b1_from___init1:
Removing instruction main_from___b1:
Removing instruction __breturn:
Removing instruction __b15_from___b6:
Removing instruction __b10_from___b16:
Removing instruction __breturn:
Removing instruction __breturn:
Removing instruction __breturn:
Removing instruction toD0181_from___b11:
Removing instruction toD0181:
Removing instruction __breturn:
Removing instruction __breturn:
Removing instruction toDd001_from_irq_part1_top:
Removing instruction toDd001:
Removing instruction toD0181_from___b4:
Removing instruction toD0181:
Removing instruction __breturn:
Removing instruction __b1_from___b8:
Removing instruction __b9_from___b1:
Removing instruction __b3_from___b2:
Removing instruction __b10_from___b3:
Removing instruction __b6_from___b5:
Removing instruction __b6_from___b6:
Removing instruction __b2_from___b1:
Removing instruction __b5_from___b1:
Removing instruction __b5_from___b4:
Removing instruction __b10_from___b5:
Removing instruction __b10:
Removing instruction __b6_from___b10:
Removing instruction __b6:
Removing instruction toSpritePtr1_from___b6:
Removing instruction toSpritePtr1:
Removing instruction __b5_from___b4:
Removing instruction __b6_from___b5:
Removing instruction __b9_from___b8:
Removing instruction toSpritePtr1_from___b1:
Removing instruction toSpritePtr1:
Removing instruction __b3_from_CLI1:
Removing instruction __b13_from_part2_init:
Removing instruction __b14_from___b13:
Removing instruction __b19_from___b18:
Removing instruction memset_from___b19:
Removing instruction __b3_from___b1:
Removing instruction __b11_from___b9:
Removing instruction toSpritePtr1_from___b7:
Removing instruction toSpritePtr1:
Removing instruction toDd001_from___b1:
Removing instruction toDd001:
Removing instruction toD0181_from___b2:
Removing instruction toD0181:
Removing instruction toSpritePtr1_from_sparkler_anim:
Removing instruction toSpritePtr1_from___b1:
Removing instruction toSpritePtr1:
Removing instruction __b2_from___b1:
Removing instruction __b2_from___b3:
Removing instruction __b1_from_memcpy:
Removing instruction __b1_from___b2:
Removing instruction __b2_from___b1:
Removing instruction __b4_from___b3:
Removing instruction __b4_from___b7:
Removing instruction __b4_from___b9:
Removing instruction __b6_from___b8:
Removing instruction __b13_from___b11:
Removing instruction __b13_from___b14:
Removing instruction __b4_from___b18:
Removing instruction __b4_from___b6:
Removing instruction __b2_from___b1:
Removing instruction __b3_from___b12:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction __init1:
Removing instruction __b1:
Removing instruction __breturn:
Removing instruction __b1:
Removing instruction plexBucketShow_from_irq_swing_plex:
Removing instruction __b17:
Removing instruction __b3:
Removing instruction __b4:
Removing instruction __b18:
Removing instruction __b12:
Removing instruction __b13:
Removing instruction __b14:
Removing instruction __b19:
Removing instruction __b15:
Removing instruction __b20:
Removing instruction __b16:
Removing instruction __b10_from___b11:
Removing instruction vsp_perform1:
Removing instruction __b1:
Removing instruction __b1:
Removing instruction plexBucketShow_from___b1:
Removing instruction __b2:
Removing instruction __b11:
Removing instruction __b10:
Removing instruction __b2:
Removing instruction __b3:
Removing instruction __b8:
Removing instruction __b9:
Removing instruction __b4:
Removing instruction __b3:
Removing instruction __b4:
Removing instruction __b5:
Removing instruction __b3:
Removing instruction demo_init_from_main:
Removing instruction __b7:
Removing instruction __b8:
Removing instruction __b1:
Removing instruction demo_start_from___b1:
Removing instruction __b9:
Removing instruction __b3:
Removing instruction part1_run_from___b3:
Removing instruction __b10:
Removing instruction __b5:
Removing instruction part2_run_from___b5:
Removing instruction __b1:
Removing instruction __b2:
Removing instruction __b1_from_plexBucketShow:
Removing instruction __breturn:
Removing instruction __b6:
Removing instruction __b1_from___b4:
Removing instruction __breturn:
Removing instruction __b4:
Removing instruction __b5:
Removing instruction __breturn:
Removing instruction __b1_from_plex_scroller_move:
Removing instruction __b3:
Removing instruction __breturn:
Removing instruction __b7:
Removing instruction __b8:
Removing instruction __b6_from___b5:
Removing instruction __b1_from___b4:
Removing instruction __breturn:
Removing instruction __breturn:
Removing instruction SEI1:
Removing instruction __b1:
Removing instruction __breturn:
Removing instruction __breturn:
Removing instruction demo_init_from_demo_start:
Removing instruction __b1:
Removing instruction CLI1:
Removing instruction __breturn:
Removing instruction __b1:
Removing instruction __b2:
Removing instruction __b3:
Removing instruction __b4:
Removing instruction __b5:
Removing instruction init_rasters_from___b5:
Removing instruction __b6:
Removing instruction memset_from___b6:
Removing instruction __b7:
Removing instruction memcpy_from___b7:
Removing instruction __b8:
Removing instruction memcpy_from___b8:
Removing instruction __b9:
Removing instruction memcpy_from___b9:
Removing instruction __breturn:
Removing instruction SEI1:
Removing instruction __b1:
Removing instruction __b2:
Removing instruction CLI1:
Removing instruction __b3:
Removing instruction __breturn:
Removing instruction __b13:
Removing instruction memcpy_from___b13:
Removing instruction __b14:
Removing instruction memcpy_from___b14:
Removing instruction __b15:
Removing instruction __b16:
Removing instruction __b17:
Removing instruction memset_from___b17:
Removing instruction __b18:
Removing instruction memset_from___b18:
Removing instruction __b19:
Removing instruction __b20:
Removing instruction plexPrepareInit_from___b20:
Removing instruction __b1_from___b20:
Removing instruction __b3:
Removing instruction memcpy_from___b3:
Removing instruction __b7_from___b3:
Removing instruction __b8:
Removing instruction __b9_from___b8:
Removing instruction __b11:
Removing instruction memset_from___b11:
Removing instruction __breturn:
Removing instruction __b9_from___b10:
Removing instruction __b7_from___b12:
Removing instruction __b4_from___b2:
Removing instruction __b6:
Removing instruction plexPrepareFrame_from___b6:
Removing instruction __b21:
Removing instruction __b1_from___b21:
Removing instruction __b4_from___b5:
Removing instruction SEI1:
Removing instruction __b1:
Removing instruction __b2:
Removing instruction __b3:
Removing instruction CLI1:
Removing instruction __b4:
Removing instruction __breturn:
Removing instruction __b1:
Removing instruction __breturn:
Removing instruction __b1_from_init_rasters:
Removing instruction __b3_from___b1:
Removing instruction __breturn:
Removing instruction __b3_from___b4:
Removing instruction __b1_from___b2:
Removing instruction __b1:
Removing instruction __breturn:
Removing instruction __b2:
Removing instruction __b7:
Removing instruction __b9:
Removing instruction __b3:
Removing instruction __b8:
Removing instruction __b6:
Removing instruction demo_start_from___b6:
Removing instruction __breturn:
Removing instruction __b1_from_plexPrepareInit:
Removing instruction __breturn:
Removing instruction __b1_from___b2:
Removing instruction __b1_from_plexPrepareFrame:
Removing instruction __b7_from___b1:
Removing instruction __b9:
Removing instruction __b10_from___b9:
Removing instruction __b12:
Removing instruction __b17:
Removing instruction __b15:
Removing instruction __b16:
Removing instruction __b10_from___b13:
Removing instruction __b7_from___b8:
Removing instruction __b6:
Removing instruction __b18:
Removing instruction __b1_from___b3:
Removing instruction __b2:
Removing instruction __b11:
Removing instruction __b12:
Removing instruction __b13:
Removing instruction __b8:
Removing instruction __b14:
Removing instruction __b9:
Removing instruction __b15:
Removing instruction __b10:
Removing instruction __b6:
Removing instruction __b2:
Removing instruction __b3_from___b2:
Removing instruction __b5:
Removing instruction __b3_from___b4:
Removing instruction __b2:
Removing instruction __b3:
Succesful ASM optimization Pass5UnusedLabelElimination
Replacing jump to rts with rts in jmp __breturn
Replacing jump to rts with rts in jmp __breturn
Succesful ASM optimization Pass5DoubleJumpElimination
Relabelling long label __b10_from___b20 to __b3
Succesful ASM optimization Pass5RelabelLongLabels
Removing instruction jmp __b9
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda.z x_offset8+1
Replacing instruction ldx #0 with TAX
Removing instruction ldx.z m
Removing instruction lda.z p2_logo_reveal_idx
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Removing instruction __breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Fixing long branch [381] bcc __b1 to bcs
Fixing long branch [1137] beq __b1 to bne
Fixing long branch [1141] beq __b2 to bne
Fixing long branch [1981] bcc __b2 to bcs
Fixing long branch [1988] bcc __b8 to bcs

FINAL SYMBOL TABLE
__constant char * const BG_COLOR = (char *) 53281
__constant const char BLACK = 0
__constant const char BLUE = 6
__constant char * const BORDER_COLOR = (char *) 53280
__constant const char BROWN = 9
__constant struct BucketSprite BUCKET_SPRITES[8*9*8] = { fill( 8*9*8, 0) }
__constant char BUCKET_YPOS[9] = { $10, $48, $58, $72, $8e, $aa, $c0, $d0, $de }
__constant char BYTEBOOZER[] = kickasm {{ .const B2_ZP_BASE = $fc
    #import "byteboozer_decrunch.asm"
 }}
__constant char * const CHARGEN = (char *) 53248
__constant struct MOS6526_CIA * const CIA1 = (struct MOS6526_CIA *) 56320
__constant char * const CIA1_INTERRUPT = (char *) 56333
__constant struct MOS6526_CIA * const CIA2 = (struct MOS6526_CIA *) 56576
__constant const char CIA_INTERRUPT_CLEAR = $7f
__constant char * const COLS = (char *) 55296
__constant const char CYAN = 3
__constant char * const DEFAULT_SCREEN = (char *) 1024
__constant char * const DEMO_MUSIC = (char *) 44032
__constant char DEMO_MUSIC_CRUNCHED[] = kickasm(  uses DEMO_MUSIC) {{ .modify B2() {
        .pc = DEMO_MUSIC "MUSIC"
        .const music = LoadSid("do-it-again-$AC00-$FA-8580.sid")
        .fill music.size, music.getData(i)
    }
 }}
__constant unsigned int * const FLIPPER_EASING = (unsigned int *) 41984
__constant char FLIPPER_EASING_CRUNCHED[] = kickasm {{ .modify B2() {
        .pc = FLIPPER_EASING "FLIPPER_EASING"
        .fillword $130, round($98+$98*cos(PI+PI*i/$130))
    }
 }}
__constant const char GREEN = 5
__constant const char GREY = $c
__constant void (** const HARDWARE_IRQ)() = (void (**)()) 65534
__constant char * const IRQ_ENABLE = (char *) 53274
__constant const char IRQ_PART1_TOP_LINE = $36
__constant const char IRQ_RASTER = 1
__constant char * const IRQ_STATUS = (char *) 53273
__constant const char IRQ_SWING_VSP_LINE = $2d
__constant const char LIGHT_BLUE = $e
__constant const char LIGHT_GREEN = $d
__constant char * const LOAD_CHARSET = (char *) 61440
__constant char * const LOAD_COLORS = (char *) 63488
__constant char * const LOAD_SCREEN = (char *) 58368
__constant char * const LOGO_DATA = (char *) 21504
__constant char * const LOGO_DATA_BITMAP = LOGO_DATA_COLORS+LOGO_HEIGHT*LOGO_WIDTH
__constant char * const LOGO_DATA_COLORS = LOGO_DATA+LOGO_HEIGHT*LOGO_WIDTH
__constant char LOGO_DATA_CRUNCHED[] = kickasm(  uses LOGO_HEIGHT uses LOGO_WIDTH) {{ .modify B2() {
            .pc = LOGO_DATA "LOGO DATA"
            #import "mcbitmap.asm"
            .var mcBmmData2 = getMcBitmapData(LoadPicture("logo-bitmap-640.png"))    
            // Screen data
            .for (var y=0; y<LOGO_HEIGHT; y++)
                .for (var x=0; x<LOGO_WIDTH; x++)
                    .byte getMcScreenData(x, y, mcBmmData2)
            // Color Data
            .for (var y=0; y<LOGO_HEIGHT; y++)
                .for (var x=0; x<LOGO_WIDTH; x++)
                    .byte getMcColorData(x, y, mcBmmData2)
            // Bitmap Data (row by row)
            .for (var y=0; y<LOGO_HEIGHT; y++)
                .for (var i=0; i<8; i++)
                    .for (var x=0; x<LOGO_WIDTH; x++)
                        .byte getMcPixelData(x, y, i, mcBmmData2)
        }
 }}
__constant char * const LOGO_DATA_CRUNCHED2 = (char *) 34816
__constant const unsigned int LOGO_DATA_CRUNCHED_SIZE = $222d
__constant const char LOGO_HEIGHT = $19
__constant const char LOGO_WIDTH = $50
__constant char OFFSET_STRUCT_BUCKETSPRITE_PLEX_ID = 1
__constant char OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d
__constant char OFFSET_STRUCT_MOS6569_VICII_BG_COLOR = $21
__constant char OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR = $20
__constant char OFFSET_STRUCT_MOS6569_VICII_CONTROL1 = $11
__constant char OFFSET_STRUCT_MOS6569_VICII_CONTROL2 = $16
__constant char OFFSET_STRUCT_MOS6569_VICII_MEMORY = $18
__constant char OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR = $27
__constant char OFFSET_STRUCT_MOS6569_VICII_SPRITE0_Y = 1
__constant char OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE = $15
__constant char OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC = $1c
__constant char OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1 = $25
__constant char OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2 = $26
__constant char OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB = $10
__constant struct BucketSprite ORIGINAL_BUCKET_SPRITES[8*9*8] = { fill( 8*9*8, 0) }
__constant char * const P1_COLORS = (char *) 43008
__constant char P1_COLORS_CRUNCHED[] = kickasm(  uses P1_COLORS) {{ .modify B2() {
        .pc = P1_COLORS "HAPPYNEWYEAR COLORS"    
        .for (var y=0; y<25; y++)
            .for (var x=0; x<40; x++)
                .byte getMcColorData(x, y, mcBmmData1)
    }
 }}
__constant char * const P1_PIXELS = (char *) 49152
__constant char P1_PIXELS_CRUNCHED[] = kickasm(  uses P1_PIXELS) {{ .modify B2() {
        .pc = P1_PIXELS "HAPPYNEWYEAR PIXELS"    
        #import "mcbitmap.asm"
        .var mcBmmData1 = getMcBitmapData(LoadPicture("happy-newyear.png"))
        .for (var y=0; y<25; y++)
            .for (var x=0; x<40; x++)
                .fill 8, getMcPixelData(x, y, i, mcBmmData1)
    }
 }}
__constant char * const P1_SCREEN = (char *) 57344
__constant char P1_SCREEN_CRUNCHED[] = kickasm(  uses P1_SCREEN) {{ .modify B2() {
        .pc = P1_SCREEN "HAPPYNEWYEAR SCREEN"    
        .for (var y=0; y<25; y++)
            .for (var x=0; x<40; x++)
                .byte getMcScreenData(x, y, mcBmmData1)
    }
 }}
__constant char * const P1_SCREEN_SPRITE_PTRS = (char *) 58360
__constant char * const P1_SPRITES = (char *) 64512
__constant char P1_SPRITES_CRUNCHED[] = kickasm(  uses P1_SPRITES) {{ .modify B2() {
        .pc = P1_SPRITES "P1_SPRITES"
        // Pixels                                                    11         01     10       11
        .var p1_sprites = LoadPicture("sparklers.png", List().add($000000, $daccc3, $472a24, $957a71))
        .for(var sx=0;sx<15;sx++) {
            .for (var y=0;y<21; y++) {
                .for (var c=0; c<3; c++) {
                    .byte p1_sprites.getMulticolorByte(sx*3+c,y)
                }
            }
            .byte 0
        }
    }
 }}
__constant char * const PART2_BITMAP = (char *) 49152
__constant char * const PART2_SCREEN = (char *) 57344
__constant char * const PART2_SPRITES = (char *) 58368
__constant const char PINK = $a
__constant char * const PIXELS_EMPTY = (char *) 59392
__constant char * const PLEX_ID_UPDATERS = (char *) 15360
__constant char PLEX_ID_UPDATERS_CRUNCHED[] = kickasm(  uses ORIGINAL_BUCKET_SPRITES uses BUCKET_SPRITES uses plex_id_offset) {{ .modify B2() {
        .pc = PLEX_ID_UPDATERS "PLEX_ID_UPDATERS"
        // First generate a jump table
        .for(var frame=0;frame<8;frame++) 
            .word updaters[frame].updater
        // Generate the 8 unrolled updaters
        updaters: 
        .for(var frame=0;frame<8;frame++) {
            updater:
            ldx #$1f
            .for(var sprite=0; sprite<9*8; sprite++ ) {
                lda ORIGINAL_BUCKET_SPRITES + frame*8*9*2 + sprite*2 +1
                clc
                adc plex_id_offset
                sax BUCKET_SPRITES + frame*8*9*2 + sprite*2 +1
            }
            rts        
        }
    }
 }}
__constant char * const PLEX_ID_UPDATERS_CRUNCHED2 = (char *) 31744
__constant const unsigned int PLEX_ID_UPDATERS_CRUNCHED_SIZE = $b72
__constant char PLEX_PTR[$20] = { fill( $20, 0) }
__constant char PLEX_SORTED_IDX[$20] = { fill( $20, 0) }
__constant char PLEX_XPOS[$20] = { fill( $20, 0) }
__constant char PLEX_XPOS_MSB[$20] = { fill( $20, 0) }
__constant char PLEX_YPOS[$20] = { fill( $20, 0) }
__constant char * const PROCPORT = (char *) 1
__constant char * const PROCPORT_DDR = (char *) 0
__constant const char PROCPORT_DDR_MEMORY_MASK = 7
__constant const char PROCPORT_RAM_ALL = 0
__constant const char PROCPORT_RAM_CHARROM = 1
__constant const char PROCPORT_RAM_IO = 5
__constant const char PURPLE = 4
__constant char * const RASTER = (char *) 53266
__constant char RASTER_BADLINES[$130] = { fill( $130, 0) }
__constant const char RED = 2
__constant char * const SCREEN_SPRITE_PTRS = (char *) 58360
__constant char SCROLL_TEXT[] = "* most people will remember 2020 for a long time. for us nerds, it was a chance to dig deep into our hobbies. but we do miss the demoparties, and drinking beers with you crazy people... it is the 30th birthday of camelot, and this virtual greeting card is our way of celebrating with all of you!     credits  *  code: rex  *  music: linus  *  graphics: bizkid, snabel & vic  *    camelot sends love to 刺  abyss connection  刺  algotech  刺  ancients  刺  arsenic  刺  arise  刺  artline designs  刺  artstate  刺  atlantis  刺  bonzai  刺  booze design  刺  censor design  刺  cosine  刺  crest  刺  chorus  刺  dekadence  刺  delysid  刺  desire  刺  elysium  刺  excess  刺  extend  刺  faic  刺  f4cg  刺  fairlight  刺  fossil  刺  glance  刺  genesis project  刺  haujobb  刺  hitmen  刺  hoaxers  刺  hokuto force  刺  horizon  刺  illusion  刺  john dillermand  刺  laxity  刺  lepsi de  刺  lethargy  刺  mayday  刺  megastyle  刺  multistyle labs  刺  nah-kolor  刺  noice  刺  offence  刺  onslaught  刺  oxyron  刺  padua  刺  panda design  刺  panoramic designs  刺  performers  刺  plush  刺  pretzel logic  刺  prosonix  刺  proxima  刺  rabenauge  刺  radwar  刺  rebels  刺  resource  刺  samar  刺  scenesat  刺  shape  刺  siesta  刺  silicon ltd.  刺  singular  刺  software of sweden  刺  starion  刺  success  刺  svenonacid  刺  the dreams  刺  the solution  刺  triad  刺  tropyx  刺  trsi  刺  unicess  刺  up rough  刺  vision  刺  xenon  刺  xentax  刺  ... we hope to see you all again in 2021...                                "
__constant char SCROLL_YSIN[$100] = kickasm {{ .fill $100, round(139+89.5*sin(toRadians(360*i/256)))
 }}
__constant char SIZEOF_CHAR = 1
__constant char SIZEOF_STRUCT_BUCKETSPRITE = 2
__constant char * const SPRITES_COLOR = (char *) 53287
__constant char SPRITES_CRUNCHED[] = kickasm {{ .modify B2() {
            .pc = PART2_SPRITES "PART2_SPRITES"
	        .var p2_sprites = LoadPicture("spritefont.png", List().add($000000, $ffffff))
	        .for(var sy=0;sy<8;sy++) {
    		    .for(var sx=0;sx<8;sx++) {
    	    	    .for (var y=0;y<21; y++) {
	    	    	    .for (var c=0; c<3; c++) {
    	                	.byte p2_sprites.getSinglecolorByte(sx*3+c,sy*21+y)
	                    }
	                }
	    	        .byte 0
	  	        }
	        }
        }
 }}
__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 SPRITE_COLOR_SEQUENCE[] = { WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, YELLOW, CYAN, GREEN, PURPLE, RED, BLUE, RED, PURPLE, GREEN, CYAN, YELLOW, WHITE, WHITE }
__constant struct MOS6569_VICII * const VICII = (struct MOS6569_VICII *) 53248
__constant const char VICII_BMM = $20
__constant char * const VICII_CONTROL1 = (char *) 53265
__constant char * const VICII_CONTROL2 = (char *) 53270
__constant const char VICII_MCM = $10
__constant char * const VICII_MEMORY = (char *) 53272
__constant unsigned int VSP_SINTABLE[$100] = kickasm {{ .fillword $100, round(160+160*sin(2*PI*i/256))
 }}
__constant const char WHITE = 1
__constant char XMOVEMENT[$400] = kickasm {{ //.lohifill $100, round(344-i*344/$100-86*sin(toRadians(360*i/$100)))
    .lohifill $200, round(344-i*344/$100-129*sin(toRadians(360*i/$100)))
    //.lohifill $100, round(344-i*344/$100-86*sin(toRadians(360*i/$80)))
    //.lohifill $100, round(344-i*344/$100 -86*sin(toRadians(360*i/$100)) -43*sin(toRadians(360*i/$80)))
    //.lohifill $100, 344-i*344/$100
 }}
__constant char * const XMOVEMENT_HI = XMOVEMENT+$200
__constant const char YELLOW = 7
void __start()
void byteboozer_decrunch(char * volatile crunched)
__loadstore char * volatile byteboozer_decrunch::crunched // zp[2]:57 91.0
__loadstore volatile unsigned int demo_frame_count // zp[2]:40 2355.0
void demo_init()
void demo_start()
void demo_work()
__loadstore volatile char flipper_charline // zp[1]:17 5000.083333333334
__loadstore volatile char flipper_done // zp[1]:14 0.6000000000000001
void flipper_fix_colors()
unsigned int flipper_fix_colors::$12 // zp[2]:74 150001.5
unsigned int flipper_fix_colors::$13 // zp[2]:76 200002.0
unsigned int flipper_fix_colors::$14 // zp[2]:74 200002.0
unsigned int flipper_fix_colors::$4 // zp[2]:72 200002.0
unsigned int flipper_fix_colors::$5 // zp[2]:72 100001.0
char flipper_fix_colors::charline
char flipper_fix_colors::charline#0 // reg byte a 200002.0
char *flipper_fix_colors::colors
char *flipper_fix_colors::colors#0 // colors zp[2]:78 1683333.6666666665
char *flipper_fix_colors::happy_cols
char *flipper_fix_colors::happy_cols#0 // happy_cols zp[2]:74 2020000.4
char flipper_fix_colors::i
char flipper_fix_colors::i#1 // reg byte y 2.0000002E7
char flipper_fix_colors::i#2 // reg byte y 1.6666668333333332E7
unsigned int flipper_fix_colors::offset
unsigned int flipper_fix_colors::offset#0 // offset zp[2]:74 150001.5
void init_rasters()
char *init_rasters::$3 // zp[2]:76 20002.0
char init_rasters::b
char init_rasters::b#1 // reg byte x 20002.0
char init_rasters::b#2 // reg byte x 13334.666666666666
unsigned int init_rasters::i
unsigned int init_rasters::i#1 // i zp[2]:70 20002.0
unsigned int init_rasters::i#2 // i zp[2]:70 10001.0
__interrupt(hardware_clobber) void irq_demo()
char irq_demo::port_value
char irq_demo::port_value#0 // port_value zp[1]:44 0.6666666666666666
__interrupt(hardware_clobber) void irq_flipper_bottom()
char irq_flipper_bottom::$0 // reg byte a 4.0
char irq_flipper_bottom::$1 // reg byte a 4.0
unsigned int irq_flipper_bottom::$12 // zp[2]:51 4.0
unsigned int *irq_flipper_bottom::$14 // zp[2]:51 4.0
unsigned int irq_flipper_bottom::$7 // zp[2]:53 4.0
unsigned int irq_flipper_bottom::$9 // zp[2]:55 4.0
unsigned int irq_flipper_bottom::irq_flipper_line
unsigned int irq_flipper_bottom::irq_flipper_line#0 // irq_flipper_line zp[2]:51 1.2
char *irq_flipper_bottom::toD0181_gfx
char irq_flipper_bottom::toD0181_return
__constant char irq_flipper_bottom::toD0181_return#0 = byte1 (unsigned int)LOAD_SCREEN&$3fff*4|byte1 (unsigned int)LOAD_CHARSET/4&$f // toD0181_return
char *irq_flipper_bottom::toD0181_screen
__loadstore volatile unsigned int irq_flipper_bottom_line // zp[2]:12 1.090909090909091
__loadstore volatile unsigned int irq_flipper_idx // zp[2]:15 0.5714285714285714
__interrupt(hardware_clobber) void irq_flipper_top()
char irq_flipper_top::$0 // reg byte a 4.0
char irq_flipper_top::$1 // reg byte a 4.0
char irq_flipper_top::$3 // reg byte a 4.0
char irq_flipper_top::$4 // reg byte a 4.0
char irq_flipper_top::$5 // reg byte a 4.0
__loadstore volatile unsigned int irq_flipper_top_line // zp[2]:10 4109.7945205479455
__interrupt(hardware_clobber) void irq_part1_top()
char irq_part1_top::$2 // reg byte a 4.0
char irq_part1_top::$3 // reg byte a 4.0
char irq_part1_top::$4 // reg byte a 4.0
char *irq_part1_top::toD0181_gfx
char irq_part1_top::toD0181_return
__constant char irq_part1_top::toD0181_return#0 = byte1 (unsigned int)P1_SCREEN&$3fff*4 // toD0181_return
char *irq_part1_top::toD0181_screen
char *irq_part1_top::toDd001_gfx
char irq_part1_top::toDd001_return
__constant char irq_part1_top::toDd001_return#0 = 0 // toDd001_return
__interrupt(hardware_clobber) void irq_swing_plex()
char irq_swing_plex::$16 // reg byte a 4.0
unsigned int irq_swing_plex::$26 // zp[2]:45 4.0
unsigned int irq_swing_plex::$27 // zp[2]:45 4.0
char irq_swing_plex::$28 // reg byte a 4.0
unsigned int *irq_swing_plex::$31 // zp[2]:45 4.0
char irq_swing_plex::$6 // reg byte a 4.0
unsigned int irq_swing_plex::$7 // zp[2]:45 2.0
__constant const char irq_swing_plex::YMOVE = 3
char irq_swing_plex::coarse_scroll_diff
char irq_swing_plex::coarse_scroll_diff#0 // reg byte a 3.0
char irq_swing_plex::new_coarse_scroll
char irq_swing_plex::new_coarse_scroll#0 // new_coarse_scroll zp[1]:47 0.5
char irq_swing_plex::s
char irq_swing_plex::s#1 // reg byte x 22.0
char irq_swing_plex::s#2 // reg byte x 14.666666666666666
unsigned int irq_swing_plex::scroll
unsigned int irq_swing_plex::scroll#0 // scroll zp[2]:45 0.8
char irq_swing_plex::x_offset
char irq_swing_plex::x_offset#0 // x_offset zp[1]:48 2.0
char irq_swing_plex::x_offset1
char irq_swing_plex::x_offset1#0 // reg byte a 4.0
__interrupt(hardware_clobber) void irq_swing_top()
__interrupt(hardware_clobber) void irq_swing_vsp()
char irq_swing_vsp::$1 // reg byte a 4.0
void main()
void * memcpy(void *destination , void *source , unsigned int num)
void *memcpy::destination
void *memcpy::destination#6 // destination zp[2]:72
char *memcpy::dst
char *memcpy::dst#1 // dst zp[2]:72 10001.0
char *memcpy::dst#2 // dst zp[2]:72 10334.666666666666
char *memcpy::dst#4 // dst zp[2]:72 2002.0
unsigned int memcpy::num
unsigned int memcpy::num#6 // num zp[2]:74 1001.0
void *memcpy::return
void *memcpy::source
void *memcpy::source#6 // source zp[2]:76
char *memcpy::src
char *memcpy::src#1 // src zp[2]:76 20002.0
char *memcpy::src#2 // src zp[2]:76 10251.25
char *memcpy::src#4 // src zp[2]:76 1001.0
char *memcpy::src_end
char *memcpy::src_end#0 // src_end zp[2]:74 1375.25
void * memset(void *str , char c , unsigned int num)
char memset::c
char memset::c#7 // reg byte x 1250.125
char *memset::dst
char *memset::dst#1 // dst zp[2]:72 20002.0
char *memset::dst#2 // dst zp[2]:72 13668.333333333332
char *memset::dst#4 // dst zp[2]:72 2002.0
char *memset::end
char *memset::end#0 // end zp[2]:76 1833.6666666666665
unsigned int memset::num
unsigned int memset::num#5 // num zp[2]:76 1001.0
void *memset::return
void *memset::str
void *memset::str#6 // str zp[2]:72
__constant void (* const musicInit)() = (void (*)())DEMO_MUSIC
__constant void (* const musicPlay)() = (void (*)())DEMO_MUSIC+3
__loadstore volatile char p1_work_ready // zp[1]:9 37002.33333333333
void p2_logo_reveal()
__loadstore volatile char p2_logo_reveal_done // zp[1]:22 2033.9830508474574
__loadstore volatile char p2_logo_reveal_idx // zp[1]:25 6779.762711864407
__loadstore volatile char p2_logo_revealing // zp[1]:21 566.1320754716982
__loadstore volatile char p2_logo_swinging // zp[1]:23 294.20588235294116
__loadstore volatile char p2_plex_scroller_moving // zp[1]:24 215.11827956989248
__loadstore volatile char p2_work_ready // zp[1]:20 37002.33333333333
void part1_init()
void part1_loop()
unsigned int part1_loop::$11 // zp[2]:70 10001.0
void part1_run()
char part1_run::toSpritePtr1_return
__constant char part1_run::toSpritePtr1_return#0 = (char)(unsigned int)P1_SPRITES/$40 // toSpritePtr1_return
char *part1_run::toSpritePtr1_sprite
void part2_init()
struct BucketSprite *part2_init::frame
struct BucketSprite *part2_init::frame#1 // frame zp[2]:70 1001.0
struct BucketSprite *part2_init::frame#5 // frame zp[2]:70 300.29999999999995
char part2_init::frame_idx
char part2_init::frame_idx#1 // frame_idx zp[1]:4 2002.0
char part2_init::frame_idx#2 // frame_idx zp[1]:4 364.0
char part2_init::s
char part2_init::s#1 // reg byte y 20002.0
char part2_init::s#2 // reg byte y 10001.0
char part2_init::s1
char part2_init::s1#1 // reg byte x 2002.0
char part2_init::s1#2 // reg byte x 1001.0
char part2_init::s2
char part2_init::s2#1 // reg byte x 2002.0
char part2_init::s2#2 // reg byte x 1334.6666666666667
char part2_init::sin_idx
char part2_init::sin_idx#1 // reg byte x 10001.0
char part2_init::sin_idx#2 // reg byte x 10334.666666666666
char part2_init::sin_idx#4 // reg byte x 2002.0
char part2_init::toSpritePtr1_return
__constant char part2_init::toSpritePtr1_return#0 = (char)(unsigned int)PART2_SPRITES/$40 // toSpritePtr1_return
char *part2_init::toSpritePtr1_sprite
void part2_loop()
unsigned int part2_loop::$23 // zp[2]:70 10001.0
unsigned int part2_loop::$24 // zp[2]:72 10001.0
void part2_run()
char *part2_run::toD0181_gfx
char part2_run::toD0181_return
__constant char part2_run::toD0181_return#0 = byte1 (unsigned int)PART2_SCREEN&$3fff*4 // toD0181_return
char *part2_run::toD0181_screen
char *part2_run::toDd001_gfx
char part2_run::toDd001_return
__constant char part2_run::toDd001_return#0 = 0 // toDd001_return
void plexBucketShow(struct BucketSprite *bucket)
char plexBucketShow::$1 // reg byte a 22.0
char plexBucketShow::$2 // reg byte a 202.0
__constant char plexBucketShow::MSB_CLEAR_MASK_BY_ID[8] = { $fe, $fd, $fb, $f7, $ef, $df, $bf, $7f }
__constant char plexBucketShow::MSB_SET_MASK_BY_ID[8] = { 1, 2, 4, 8, $10, $20, $40, $80 }
struct BucketSprite *plexBucketShow::bucket
struct BucketSprite *plexBucketShow::bucket#0 // bucket zp[2]:2 4.0
struct BucketSprite *plexBucketShow::bucket#1 // bucket zp[2]:2 4.0
struct BucketSprite *plexBucketShow::bucket#2 // bucket zp[2]:2 0.2222222222222222
char *plexBucketShow::bucket_ptr
char plexBucketShow::i
char plexBucketShow::i#1 // i zp[1]:59 27.545454545454547
char plexBucketShow::i#2 // reg byte y 151.5
char plexBucketShow::i#3 // reg byte y 134.66666666666666
char plexBucketShow::plex_id
char plexBucketShow::plex_id#0 // reg byte y 67.33333333333333
char plexBucketShow::real_idx
char plexBucketShow::real_idx#0 // reg byte x 22.0
char plexBucketShow::real_idx#1 // reg byte x 101.0
char plexBucketShow::real_idx#2 // reg byte a 202.0
char plexBucketShow::real_idx#3 // reg byte x 101.0
char plexBucketShow::real_idx#4 // reg byte x 85.99999999999999
char plexBucketShow::real_idx#8 // reg byte x 213.0
void plexFrameStart()
void plexPrepareFrame(struct BucketSprite *frame)
char plexPrepareFrame::$16 // reg byte a 2000002.0
char plexPrepareFrame::$17 // reg byte x 2000002.0
struct BucketSprite *plexPrepareFrame::bucket
struct BucketSprite *plexPrepareFrame::bucket#1 // bucket zp[2]:74 20002.0
struct BucketSprite *plexPrepareFrame::bucket#10 // bucket zp[2]:74 20002.0
struct BucketSprite *plexPrepareFrame::bucket#3 // bucket zp[2]:74 431429.2857142857
struct BucketSprite *plexPrepareFrame::bucket#9 // bucket zp[2]:74 300000.30000000005
char plexPrepareFrame::bucket_id
char plexPrepareFrame::bucket_id#1 // bucket_id zp[1]:7 500000.5
char plexPrepareFrame::bucket_id#2 // bucket_id zp[1]:7 600000.6000000001
char plexPrepareFrame::bucket_id#5 // bucket_id zp[1]:7 300000.30000000005
char plexPrepareFrame::bucket_ypos
char plexPrepareFrame::bucket_ypos#0 // bucket_ypos zp[1]:8 10001.0
char plexPrepareFrame::bucket_ypos#1 // bucket_ypos zp[1]:8 285714.5714285714
char plexPrepareFrame::bucket_ypos#2 // bucket_ypos zp[1]:8 400000.4
char plexPrepareFrame::bucket_ypos#3 // bucket_ypos zp[1]:8 602000.8
char plexPrepareFrame::bucket_ypos#4 // bucket_ypos zp[1]:8 1000001.0
struct BucketSprite *plexPrepareFrame::frame
struct BucketSprite *plexPrepareFrame::frame#0 // frame zp[2]:76 954.6818181818181
char plexPrepareFrame::i
char plexPrepareFrame::i#1 // reg byte x 2000002.0
char plexPrepareFrame::i#2 // reg byte x 1333334.6666666667
char plexPrepareFrame::i1
char plexPrepareFrame::i1#1 // i1 zp[1]:6 2000002.0
char plexPrepareFrame::i1#2 // i1 zp[1]:6 200000.2
char plexPrepareFrame::m
char plexPrepareFrame::m#1 // m zp[1]:5 2000002.0
char plexPrepareFrame::m#2 // m zp[1]:5 461538.9230769231
char plexPrepareFrame::nxt_idx
char plexPrepareFrame::nxt_idx#0 // nxt_idx zp[1]:68 300000.30000000005
char plexPrepareFrame::nxt_y
char plexPrepareFrame::nxt_y#0 // nxt_y zp[1]:69 1500000.375
char plexPrepareFrame::plex_id
char plexPrepareFrame::plex_id#0 // plex_id zp[1]:66 272727.54545454547
__constant char plexPrepareFrame::real_sprite_free_ypos[8] = { fill( 8, 0) }
char plexPrepareFrame::real_sprite_id
char plexPrepareFrame::real_sprite_id#1 // reg byte x 666667.3333333334
char plexPrepareFrame::real_sprite_id#2 // reg byte x 235294.35294117648
char plexPrepareFrame::s
char plexPrepareFrame::s#1 // reg byte x 1.3666668333333332E7
char plexPrepareFrame::s#2 // reg byte x 2000002.0
char plexPrepareFrame::s#3 // reg byte x 2.05000025E7
char plexPrepareFrame::s#6 // reg byte x 2000002.0
struct BucketSprite *plexPrepareFrame::sprite
struct BucketSprite *plexPrepareFrame::sprite#1 // sprite zp[2]:76 1000001.0
struct BucketSprite *plexPrepareFrame::sprite#13 // sprite zp[2]:76 2000002.0
struct BucketSprite *plexPrepareFrame::sprite#2 // sprite_1 zp[2]:74 1000001.0
struct BucketSprite *plexPrepareFrame::sprite#3 // sprite zp[2]:76 274545.9090909091
struct BucketSprite *plexPrepareFrame::sprite#4 // sprite zp[2]:76 375000.375
char plexPrepareFrame::ypos
char plexPrepareFrame::ypos#0 // ypos zp[1]:67 250000.25
void plexPrepareInit()
char plexPrepareInit::i
char plexPrepareInit::i#1 // reg byte x 20002.0
char plexPrepareInit::i#2 // reg byte x 16668.333333333332
__loadstore struct BucketSprite * volatile plex_bucket // zp[2]:33 2.6666666666666665
__loadstore volatile char plex_bucket_id // zp[1]:35 1.5999999999999999
__loadstore struct BucketSprite * volatile plex_frame // zp[2]:30 9.416666666666666
__loadstore volatile char plex_frame_id // zp[1]:29 8.846153846153847
__loadstore volatile char plex_id_offset // zp[1]:32 8.916666666666666
__loadstore volatile char plex_real_sprite_idx // zp[1]:19 4.375
void plex_scroller_move()
char plex_scroller_move::$8 // reg byte a 202.0
char plex_scroller_move::letter
char plex_scroller_move::letter#0 // reg byte a 75.75
char plex_scroller_move::letter#2 // reg byte a 101.0
char plex_scroller_move::s
char plex_scroller_move::s#1 // s zp[1]:47 202.0
char plex_scroller_move::s#10 // s zp[1]:47 37.875
char plex_scroller_move::toSpritePtr1_return
__constant char plex_scroller_move::toSpritePtr1_return#0 = (char)(unsigned int)PART2_SPRITES/$40 // toSpritePtr1_return
char *plex_scroller_move::toSpritePtr1_sprite
char plex_scroller_move::x_idx
char plex_scroller_move::x_idx#0 // reg byte x 22.0
char plex_scroller_move::x_idx#1 // reg byte x 101.0
char plex_scroller_move::x_idx#10 // reg byte x 34.4
void raster_fine(volatile char line_offset)
__loadstore volatile char raster_fine::line_offset // zp[1]:50 2.0
__loadstore char * volatile scroll_text_next // zp[2]:27 8.450000000000001
__loadstore volatile char sparkler_active // zp[1]:42 2857.5238095238096
void sparkler_anim()
char sparkler_anim::$3 // reg byte a 2000002.0
char sparkler_anim::$4 // reg byte a 2000002.0
char sparkler_anim::toSpritePtr1_return
__constant char sparkler_anim::toSpritePtr1_return#0 = (char)(unsigned int)P1_SPRITES/$40 // toSpritePtr1_return
char *sparkler_anim::toSpritePtr1_sprite
__loadstore volatile char sparkler_idx // zp[1]:43 714286.7142857142
__loadstore volatile char sprite_color_idx // zp[1]:39 0.42000000000000004
void update_frame_plex_id_offset(char plex_frame_id)
char update_frame_plex_id_offset::$0 // reg byte a 22.0
__loadstore volatile unsigned int update_frame_plex_id_offset::jmp_address // zp[2]:60 11.0
__constant unsigned int *update_frame_plex_id_offset::jmp_table = (unsigned int *)PLEX_ID_UPDATERS
char update_frame_plex_id_offset::plex_frame_id
char update_frame_plex_id_offset::plex_frame_id#0 // reg byte a 13.0
__loadstore volatile char vsp_coarse_scroll // zp[1]:37 0.39999999999999997
__loadstore volatile char vsp_fine_scroll // zp[1]:36 2.0
__loadstore volatile char vsp_scroll // zp[1]:18 4.0
__loadstore volatile char vsp_sin_idx // zp[1]:38 0.30000000000000004
void vsp_update_screen(volatile char x_offset)
char vsp_update_screen::$1 // reg byte a 2000002.0
char vsp_update_screen::$3 // reg byte a 2000002.0
unsigned int vsp_update_screen::$5 // zp[2]:62 2000002.0
__loadstore volatile char vsp_update_screen::x_offset // zp[1]:49 8333.75
__loadstore volatile unsigned int vsp_update_screen::x_offset8 // zp[2]:64 600000.6000000001
__loadstore volatile char x_movement_idx // zp[1]:26 0.5833333333333333

reg byte x [ irq_swing_plex::s#2 irq_swing_plex::s#1 ]
zp[2]:2 [ plexBucketShow::bucket#2 plexBucketShow::bucket#1 plexBucketShow::bucket#0 ]
reg byte y [ plexBucketShow::i#3 plexBucketShow::i#2 ]
reg byte x [ plexBucketShow::real_idx#8 plexBucketShow::real_idx#4 plexBucketShow::real_idx#0 plexBucketShow::real_idx#3 ]
reg byte x [ plex_scroller_move::x_idx#10 plex_scroller_move::x_idx#0 plex_scroller_move::x_idx#1 ]
reg byte a [ plex_scroller_move::letter#2 plex_scroller_move::letter#0 ]
zp[1]:4 [ part2_init::frame_idx#2 part2_init::frame_idx#1 ]
reg byte x [ part2_init::s1#2 part2_init::s1#1 ]
reg byte x [ part2_init::s2#2 part2_init::s2#1 ]
reg byte y [ part2_init::s#2 part2_init::s#1 ]
reg byte x [ part2_init::sin_idx#2 part2_init::sin_idx#4 part2_init::sin_idx#1 ]
reg byte x [ init_rasters::b#2 init_rasters::b#1 ]
reg byte x [ memset::c#7 ]
reg byte x [ plexPrepareInit::i#2 plexPrepareInit::i#1 ]
zp[1]:5 [ plexPrepareFrame::m#2 plexPrepareFrame::m#1 ]
reg byte x [ plexPrepareFrame::i#2 plexPrepareFrame::i#1 ]
zp[1]:6 [ plexPrepareFrame::i1#2 plexPrepareFrame::i1#1 ]
reg byte x [ plexPrepareFrame::real_sprite_id#2 plexPrepareFrame::real_sprite_id#1 ]
zp[1]:7 [ plexPrepareFrame::bucket_id#2 plexPrepareFrame::bucket_id#5 plexPrepareFrame::bucket_id#1 ]
zp[1]:8 [ plexPrepareFrame::bucket_ypos#4 plexPrepareFrame::bucket_ypos#3 plexPrepareFrame::bucket_ypos#0 plexPrepareFrame::bucket_ypos#1 plexPrepareFrame::bucket_ypos#2 ]
reg byte x [ plexPrepareFrame::s#3 plexPrepareFrame::s#1 plexPrepareFrame::s#6 ]
reg byte y [ flipper_fix_colors::i#2 flipper_fix_colors::i#1 ]
zp[1]:9 [ p1_work_ready ]
zp[2]:10 [ irq_flipper_top_line ]
zp[2]:12 [ irq_flipper_bottom_line ]
zp[1]:14 [ flipper_done ]
zp[2]:15 [ irq_flipper_idx ]
zp[1]:17 [ flipper_charline ]
zp[1]:18 [ vsp_scroll ]
zp[1]:19 [ plex_real_sprite_idx ]
zp[1]:20 [ p2_work_ready ]
zp[1]:21 [ p2_logo_revealing ]
zp[1]:22 [ p2_logo_reveal_done ]
zp[1]:23 [ p2_logo_swinging ]
zp[1]:24 [ p2_plex_scroller_moving ]
zp[1]:25 [ p2_logo_reveal_idx ]
zp[1]:26 [ x_movement_idx ]
zp[2]:27 [ scroll_text_next ]
zp[1]:29 [ plex_frame_id ]
zp[2]:30 [ plex_frame ]
zp[1]:32 [ plex_id_offset ]
zp[2]:33 [ plex_bucket ]
zp[1]:35 [ plex_bucket_id ]
zp[1]:36 [ vsp_fine_scroll ]
zp[1]:37 [ vsp_coarse_scroll ]
zp[1]:38 [ vsp_sin_idx ]
zp[1]:39 [ sprite_color_idx ]
zp[2]:40 [ demo_frame_count ]
zp[1]:42 [ sparkler_active ]
zp[1]:43 [ sparkler_idx ]
zp[1]:44 [ irq_demo::port_value#0 ]
reg byte a [ update_frame_plex_id_offset::plex_frame_id#0 ]
zp[2]:45 [ irq_swing_plex::$27 irq_swing_plex::$26 irq_swing_plex::$31 irq_swing_plex::scroll#0 irq_swing_plex::$7 ]
reg byte a [ irq_swing_plex::$28 ]
reg byte a [ irq_swing_plex::$6 ]
zp[1]:47 [ irq_swing_plex::new_coarse_scroll#0 plex_scroller_move::s#10 plex_scroller_move::s#1 ]
reg byte a [ irq_swing_plex::coarse_scroll_diff#0 ]
zp[1]:48 [ irq_swing_plex::x_offset#0 ]
zp[1]:49 [ vsp_update_screen::x_offset ]
reg byte a [ irq_swing_plex::$16 ]
reg byte a [ irq_swing_plex::x_offset1#0 ]
reg byte a [ irq_swing_vsp::$1 ]
reg byte a [ irq_flipper_bottom::$0 ]
reg byte a [ irq_flipper_bottom::$1 ]
zp[1]:50 [ raster_fine::line_offset ]
zp[2]:51 [ irq_flipper_bottom::$12 irq_flipper_bottom::$14 irq_flipper_bottom::irq_flipper_line#0 ]
zp[2]:53 [ irq_flipper_bottom::$7 ]
zp[2]:55 [ irq_flipper_bottom::$9 ]
reg byte a [ irq_flipper_top::$0 ]
reg byte a [ irq_flipper_top::$1 ]
reg byte a [ irq_flipper_top::$3 ]
reg byte a [ irq_flipper_top::$4 ]
reg byte a [ irq_flipper_top::$5 ]
reg byte a [ irq_part1_top::$2 ]
reg byte a [ irq_part1_top::$3 ]
reg byte a [ irq_part1_top::$4 ]
zp[2]:57 [ byteboozer_decrunch::crunched ]
reg byte a [ plexBucketShow::$1 ]
zp[1]:59 [ plexBucketShow::i#1 ]
reg byte y [ plexBucketShow::plex_id#0 ]
reg byte x [ plexBucketShow::real_idx#1 ]
reg byte a [ plexBucketShow::$2 ]
reg byte a [ plexBucketShow::real_idx#2 ]
reg byte a [ update_frame_plex_id_offset::$0 ]
zp[2]:60 [ update_frame_plex_id_offset::jmp_address ]
zp[2]:62 [ vsp_update_screen::$5 ]
zp[2]:64 [ vsp_update_screen::x_offset8 ]
reg byte a [ vsp_update_screen::$1 ]
reg byte a [ vsp_update_screen::$3 ]
reg byte a [ plex_scroller_move::$8 ]
reg byte a [ sparkler_anim::$3 ]
reg byte a [ sparkler_anim::$4 ]
zp[1]:66 [ plexPrepareFrame::plex_id#0 ]
zp[1]:67 [ plexPrepareFrame::ypos#0 ]
reg byte a [ plexPrepareFrame::$16 ]
reg byte x [ plexPrepareFrame::$17 ]
zp[1]:68 [ plexPrepareFrame::nxt_idx#0 ]
zp[1]:69 [ plexPrepareFrame::nxt_y#0 ]
reg byte x [ plexPrepareFrame::s#2 ]
zp[2]:70 [ part2_loop::$23 part1_loop::$11 init_rasters::i#2 init_rasters::i#1 part2_init::frame#5 part2_init::frame#1 ]
zp[2]:72 [ flipper_fix_colors::$4 flipper_fix_colors::$5 part2_loop::$24 memcpy::destination#6 memcpy::dst#2 memcpy::dst#4 memcpy::dst#1 memset::str#6 memset::dst#2 memset::dst#4 memset::dst#1 ]
reg byte a [ flipper_fix_colors::charline#0 ]
zp[2]:74 [ flipper_fix_colors::$12 flipper_fix_colors::$14 flipper_fix_colors::offset#0 flipper_fix_colors::happy_cols#0 plexPrepareFrame::bucket#3 plexPrepareFrame::bucket#10 plexPrepareFrame::bucket#9 plexPrepareFrame::sprite#2 plexPrepareFrame::bucket#1 memcpy::num#6 memcpy::src_end#0 ]
zp[2]:76 [ flipper_fix_colors::$13 init_rasters::$3 plexPrepareFrame::sprite#4 plexPrepareFrame::sprite#3 plexPrepareFrame::frame#0 plexPrepareFrame::sprite#1 plexPrepareFrame::sprite#13 memcpy::source#6 memcpy::src#2 memcpy::src#4 memcpy::src#1 memset::num#5 memset::end#0 ]
zp[2]:78 [ flipper_fix_colors::colors#0 ]


FINAL ASSEMBLER
Score: 79367

  // File Comments
// The Demo collects the parts and handles overall control
  // Upstart
  // Commodore 64 PRG executable file
.plugin "se.triad.kickass.CruncherPlugins"
.file [name="new_30_years_low_resolution.prg", type="prg", segments="Program"]
.segmentdef Program [segments="Basic, Common, Part2, Part1, InitDemo"]
.segmentdef Basic [start=$0801]
.segmentdef Common [segments="Code, Data"]
.segmentdef   Code [start=$80d]
.segmentdef   Data [startAfter="Code"]
.segmentdef Part2 [segments="CodePart2, DataPart2, InitPart2"]
.segmentdef   CodePart2 [startAfter="Data"]
.segmentdef   DataPart2 [startAfter="CodePart2"]
.segmentdef   InitPart2 [startAfter="DataPart2"]
.segmentdef Part1 [segments="CodePart1, DataPart1, InitPart1"]
.segmentdef   CodePart1 [startAfter="InitPart2"]
.segmentdef   DataPart1 [startAfter="CodePart1"]
.segmentdef   InitPart1 [startAfter="DataPart1"]
.segmentdef InitDemo [startAfter="InitPart1"]
.segment Basic
:BasicUpstart(__start)
  // Global Constants & labels
  /// Value that disables all CIA interrupts when stored to the CIA Interrupt registers
  .const CIA_INTERRUPT_CLEAR = $7f
  /// $D011 Control Register #1  Bit#5: BMM Turn Bitmap Mode on/off
  .const VICII_BMM = $20
  /// $D016 Control register #2 Bit#4: MCM Turn Multicolor Mode on/off
  .const VICII_MCM = $10
  /// VICII IRQ Status/Enable Raster
  // @see #IRQ_ENABLE #IRQ_STATUS
  ///  0 | RST| Reaching a certain raster line. The line is specified by writing
  ///    |    | to register 0xd012 and bit 7 of $d011 and internally stored by
  ///    |    | the VIC for the raster compare. The test for reaching the
  ///    |    | interrupt raster line is done in cycle 0 of every line (for line
  ///    |    | 0, in cycle 1).
  .const IRQ_RASTER = 1
  /// Mask for PROCESSOR_PORT_DDR which allows only memory configuration to be written
  .const PROCPORT_DDR_MEMORY_MASK = 7
  /// RAM in all three areas 0xA000, 0xD000, 0xE000
  .const PROCPORT_RAM_ALL = 0
  /// RAM in 0xA000, 0xE000 I/O in 0xD000
  .const PROCPORT_RAM_IO = 5
  /// RAM in 0xA000, 0xE000 CHAR ROM in 0xD000
  .const PROCPORT_RAM_CHARROM = 1
  /// The colors of the C64
  .const BLACK = 0
  .const WHITE = 1
  .const RED = 2
  .const CYAN = 3
  .const PURPLE = 4
  .const GREEN = 5
  .const BLUE = 6
  .const YELLOW = 7
  .const BROWN = 9
  .const PINK = $a
  .const GREY = $c
  .const LIGHT_GREEN = $d
  .const LIGHT_BLUE = $e
  .const IRQ_PART1_TOP_LINE = $36
  .const SIZEOF_STRUCT_BUCKETSPRITE = 2
  // -0xFF72
  // Size of the crunched PLEX ID updaters 
  .const PLEX_ID_UPDATERS_CRUNCHED_SIZE = $b72
  // -0xAA2D
  // Size of the crunched PLEX ID updaters 
  .const LOGO_DATA_CRUNCHED_SIZE = $222d
  // Char-based sizes for the logo
  .const LOGO_HEIGHT = $19
  .const LOGO_WIDTH = $50
  // IRQ performing the VSP
  .const IRQ_SWING_VSP_LINE = $2d
  .const OFFSET_STRUCT_MOS6526_CIA_INTERRUPT = $d
  .const OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC = $1c
  .const OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR = $27
  .const OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1 = $25
  .const OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2 = $26
  .const OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB = $10
  .const OFFSET_STRUCT_MOS6569_VICII_SPRITE0_Y = 1
  .const OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE = $15
  .const OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR = $20
  .const OFFSET_STRUCT_MOS6569_VICII_BG_COLOR = $21
  .const OFFSET_STRUCT_MOS6569_VICII_CONTROL1 = $11
  .const OFFSET_STRUCT_MOS6569_VICII_CONTROL2 = $16
  .const OFFSET_STRUCT_MOS6569_VICII_MEMORY = $18
  .const OFFSET_STRUCT_BUCKETSPRITE_PLEX_ID = 1
  .const SIZEOF_CHAR = 1
  /// 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
  /// $D021 Background Color 0
  .label BG_COLOR = $d021
  /// $D011 Control Register #1
  /// - Bit#0-#2: YSCROLL Screen Soft Scroll Vertical
  /// - Bit#3: RSEL Switch betweem 25 or 24 visible rows
  ///          RSEL|  Display window height   | First line  | Last line
  ///          ----+--------------------------+-------------+----------
  ///            0 | 24 text lines/192 pixels |   55 ($37)  | 246 ($f6)
  ///            1 | 25 text lines/200 pixels |   51 ($33)  | 250 ($fa)
  /// - Bit#4: DEN Switch VIC-II output on/off
  /// - Bit#5: BMM Turn Bitmap Mode on/off
  /// - Bit#6: ECM Turn Extended Color Mode on/off
  /// - Bit#7: RST8 9th Bit for $D012 Rasterline counter
  /// Initial Value: %10011011
  .label VICII_CONTROL1 = $d011
  /// $D016 Control register 2
  /// -  Bit#0-#2: XSCROLL Screen Soft Scroll Horizontal
  /// -  Bit#3: CSEL Switch betweem 40 or 38 visible columns
  ///           CSEL|   Display window width   | First X coo. | Last X coo.
  ///           ----+--------------------------+--------------+------------
  ///             0 | 38 characters/304 pixels |   31 ($1f)   |  334 ($14e)
  ///             1 | 40 characters/320 pixels |   24 ($18)   |  343 ($157)
  /// -  Bit#4: MCM Turn Multicolor Mode on/off
  /// -  Bit#5-#7: not used
  /// Initial Value: %00001000
  .label VICII_CONTROL2 = $d016
  /// $D018 VIC-II base addresses
  /// - Bit#0: not used
  /// - Bit#1-#3: CB Address Bits 11-13 of the Character Set (*2048)
  /// - Bit#4-#7: VM Address Bits 10-13 of the Screen RAM (*1024)
  /// Initial Value: %00010100
  .label VICII_MEMORY = $d018
  /// VIC II IRQ Status Register
  .label IRQ_STATUS = $d019
  /// VIC II IRQ Enable Register
  .label IRQ_ENABLE = $d01a
  /// Processor port data direction register
  .label PROCPORT_DDR = 0
  /// Processor Port Register controlling RAM/ROM configuration and the datasette
  .label PROCPORT = 1
  /// The address of the CHARGEN character set
  .label CHARGEN = $d000
  /// The VIC-II MOS 6567/6569
  .label VICII = $d000
  /// Color Ram
  .label COLS = $d800
  /// Default address of screen character matrix
  .label DEFAULT_SCREEN = $400
  /// The CIA#1: keyboard matrix, joystick #1/#2
  .label CIA1 = $dc00
  /// The CIA#2: Serial bus, RS-232, VIC memory bank
  .label CIA2 = $dd00
  /// CIA#1 Interrupt for reading in ASM
  .label CIA1_INTERRUPT = $dc0d
  /// The vector used when the HARDWARE serves IRQ interrupts
  .label HARDWARE_IRQ = $fffe
  .label P1_COLORS = $a800
  // A800-AFFF
  .label P1_PIXELS = $c000
  // C000-DFFF
  .label P1_SCREEN = $e000
  // E000-E3FF
  .label P1_SPRITES = $fc00
  // E000-E3FF
  .label PIXELS_EMPTY = $e800
  // E800-EFFF
  // A copy of the load screen and colors
  .label LOAD_SCREEN = $e400
  // E400-E7FF
  .label LOAD_CHARSET = $f000
  // F000-F7FF
  .label LOAD_COLORS = $f800
  // Flipper cosine easing table
  .label FLIPPER_EASING = $a400
  // Sprite pointers 
  .label P1_SCREEN_SPRITE_PTRS = $e3f8
  // The screen sprite pointers to update
  .label SCREEN_SPRITE_PTRS = $e3f8
  // Memory layout of the graphics bank
  .label LOGO_DATA = $5400
  .label PART2_BITMAP = $c000
  // -0xdfff
  .label PART2_SCREEN = $e000
  // -0xe400
  .label PART2_SPRITES = $e400
  // -0xf400
  // Location PLEX ID updaters are placed when running
  .label PLEX_ID_UPDATERS = $3c00
  // Location where the crunched PLEX ID updaters are placed to be decrunched
  .label PLEX_ID_UPDATERS_CRUNCHED2 = $7c00
  // Location where the crunched LOGO DATA is placed  to be decrunched
  .label LOGO_DATA_CRUNCHED2 = $8800
  // Address of color data
  .label LOGO_DATA_COLORS = LOGO_DATA+LOGO_HEIGHT*LOGO_WIDTH
  // Address of pixel data
  .label LOGO_DATA_BITMAP = LOGO_DATA_COLORS+LOGO_HEIGHT*LOGO_WIDTH
  // The high-value table
  .label XMOVEMENT_HI = XMOVEMENT+$200
  .label DEMO_MUSIC = $ac00
  // Pointer to the music init routine
  .label musicInit = DEMO_MUSIC
  // Pointer to the music play routine
  .label musicPlay = DEMO_MUSIC+3
  // Signals the main() loop to do work when all rasters are complete
  .label p1_work_ready = 9
  // Top of the flipper
  .label irq_flipper_top_line = $a
  // Bottom of the flipper
  .label irq_flipper_bottom_line = $c
  // 1 if flipper is done
  .label flipper_done = $e
  // Middle of the flipper
  .label irq_flipper_idx = $f
  // The current char line where the flipper switches from bitmap to text
  .label flipper_charline = $11
  // The number of chars to scroll the screen by VSP. 
  // Legal values are 0-40.
  //  0 shows the normal screen (no scrolling)
  // 20 shows char #20 in the top left corner of the screen, effectively scrolling the screen left 20 chars.
  .label vsp_scroll = $12
  // The next "real" sprite being used by the multiplexer
  .label plex_real_sprite_idx = $13
  // Signals the main() loop to do work when all rasters are complete
  .label p2_work_ready = $14
  // 1 if the logo is being revealed
  .label p2_logo_revealing = $15
  // 1 if the logo is completely revealed
  .label p2_logo_reveal_done = $16
  // 1 if the logo is being showed
  .label p2_logo_swinging = $17
  // 1 if the scroll is moving
  .label p2_plex_scroller_moving = $18
  // Number of columns shown of the logo
  .label p2_logo_reveal_idx = $19
  // X-movement index
  .label x_movement_idx = $1a
  // The next char to use from the scroll text
  .label scroll_text_next = $1b
  // The current frame ID (0-7)
  .label plex_frame_id = $1d
  // Pointer to the buckets of the current frame
  .label plex_frame = $1e
  // Offset added to plex_id to ensure the sprite cycling works (decreased 1 every time a cycle is complete)
  .label plex_id_offset = $20
  // Pointer to the current bucket of the current frame
  .label plex_bucket = $21
  // Index of the current bucket in the current frame (0..BUCKET_COUNT-1)
  .label plex_bucket_id = $23
  // The fine scroll (0-7)
  .label vsp_fine_scroll = $24
  // The coarse scroll (0-40)
  .label vsp_coarse_scroll = $25
  // Index into the VSP sinus value
  .label vsp_sin_idx = $26
  // Index into the sprite color sequence
  .label sprite_color_idx = $27
  // Counts total demo frames
  .label demo_frame_count = $28
  // Is the sparkler active
  .label sparkler_active = $2a
  // The sparkler sprite idx
  .label sparkler_idx = $2b
.segment Code
  // __start
__start: {
    // __start::__init1
    // volatile char p1_work_ready = 0
    // [1] p1_work_ready = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z p1_work_ready
    // volatile unsigned int irq_flipper_top_line = 0x00
    // [2] irq_flipper_top_line = 0 -- vwuz1=vwuc1 
    sta.z irq_flipper_top_line
    sta.z irq_flipper_top_line+1
    // volatile unsigned int irq_flipper_bottom_line = 0x08
    // [3] irq_flipper_bottom_line = 8 -- vwuz1=vwuc1 
    lda #<8
    sta.z irq_flipper_bottom_line
    lda #>8
    sta.z irq_flipper_bottom_line+1
    // volatile char flipper_done = 0
    // [4] flipper_done = 0 -- vbuz1=vbuc1 
    sta.z flipper_done
    // volatile unsigned int irq_flipper_idx = 0x00
    // [5] irq_flipper_idx = 0 -- vwuz1=vwuc1 
    sta.z irq_flipper_idx
    sta.z irq_flipper_idx+1
    // volatile char flipper_charline = 0
    // [6] flipper_charline = 0 -- vbuz1=vbuc1 
    sta.z flipper_charline
    // volatile __zp char vsp_scroll = 0
    // [7] vsp_scroll = 0 -- vbuz1=vbuc1 
    sta.z vsp_scroll
    // volatile char plex_real_sprite_idx = 0
    // [8] plex_real_sprite_idx = 0 -- vbuz1=vbuc1 
    sta.z plex_real_sprite_idx
    // volatile char p2_work_ready
    // [9] p2_work_ready = 0 -- vbuz1=vbuc1 
    sta.z p2_work_ready
    // volatile char p2_logo_revealing = 0
    // [10] p2_logo_revealing = 0 -- vbuz1=vbuc1 
    sta.z p2_logo_revealing
    // volatile char p2_logo_reveal_done = 0
    // [11] p2_logo_reveal_done = 0 -- vbuz1=vbuc1 
    sta.z p2_logo_reveal_done
    // volatile char p2_logo_swinging = 0
    // [12] p2_logo_swinging = 0 -- vbuz1=vbuc1 
    sta.z p2_logo_swinging
    // volatile char p2_plex_scroller_moving = 0
    // [13] p2_plex_scroller_moving = 0 -- vbuz1=vbuc1 
    sta.z p2_plex_scroller_moving
    // volatile char p2_logo_reveal_idx = 0
    // [14] p2_logo_reveal_idx = 0 -- vbuz1=vbuc1 
    sta.z p2_logo_reveal_idx
    // volatile char x_movement_idx = 0
    // [15] x_movement_idx = 0 -- vbuz1=vbuc1 
    sta.z x_movement_idx
    // char* volatile scroll_text_next = SCROLL_TEXT
    // [16] scroll_text_next = SCROLL_TEXT -- pbuz1=pbuc1 
    lda #<SCROLL_TEXT
    sta.z scroll_text_next
    lda #>SCROLL_TEXT
    sta.z scroll_text_next+1
    // volatile char plex_frame_id = 0
    // [17] plex_frame_id = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z plex_frame_id
    // struct BucketSprite* volatile plex_frame = BUCKET_SPRITES
    // [18] plex_frame = BUCKET_SPRITES -- pssz1=pssc1 
    lda #<BUCKET_SPRITES
    sta.z plex_frame
    lda #>BUCKET_SPRITES
    sta.z plex_frame+1
    // volatile char plex_id_offset = 0
    // [19] plex_id_offset = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z plex_id_offset
    // struct BucketSprite* volatile plex_bucket = BUCKET_SPRITES
    // [20] plex_bucket = BUCKET_SPRITES -- pssz1=pssc1 
    lda #<BUCKET_SPRITES
    sta.z plex_bucket
    lda #>BUCKET_SPRITES
    sta.z plex_bucket+1
    // volatile char plex_bucket_id = 0
    // [21] plex_bucket_id = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z plex_bucket_id
    // volatile char vsp_fine_scroll
    // [22] vsp_fine_scroll = 0 -- vbuz1=vbuc1 
    sta.z vsp_fine_scroll
    // volatile char vsp_coarse_scroll
    // [23] vsp_coarse_scroll = 0 -- vbuz1=vbuc1 
    sta.z vsp_coarse_scroll
    // volatile char vsp_sin_idx = 0x40
    // [24] vsp_sin_idx = $40 -- vbuz1=vbuc1 
    lda #$40
    sta.z vsp_sin_idx
    // volatile char sprite_color_idx = 0
    // [25] sprite_color_idx = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z sprite_color_idx
    // volatile unsigned int demo_frame_count = 0
    // [26] demo_frame_count = 0 -- vwuz1=vwuc1 
    sta.z demo_frame_count
    sta.z demo_frame_count+1
    // volatile char sparkler_active = 0
    // [27] sparkler_active = 0 -- vbuz1=vbuc1 
    sta.z sparkler_active
    // volatile char sparkler_idx = 0
    // [28] sparkler_idx = 0 -- vbuz1=vbuc1 
    sta.z sparkler_idx
    // [29] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1]
    // __start::@1
    // [30] call main
    // [182] phi from __start::@1 to main [phi:__start::@1->main]
    jsr main
    // __start::@return
    // [31] return 
    rts
}
  // irq_demo
// IRQ running during between parts
irq_demo: {
    .label port_value = $2c
    // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry 
    sta rega+1
    stx regx+1
    sty regy+1
    // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
    // [32] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Remember processor port value
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // char port_value = *PROCPORT
    // [33] irq_demo::port_value#0 = *PROCPORT -- vbuz1=_deref_pbuc1 
    lda PROCPORT
    sta.z port_value
    // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
    // [34] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Enable IO
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // *PROCPORT = PROCPORT_RAM_IO
    // [35] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_IO
    sta PROCPORT
    // demo_work()
    // [36] call demo_work
    // Perform any demo work
    jsr demo_work
    // irq_demo::@1
    // *IRQ_STATUS = IRQ_RASTER
    // [37] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Acknowledge the IRQ
    lda #IRQ_RASTER
    sta IRQ_STATUS
    // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
    // [38] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Restore processor port value
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // *PROCPORT = port_value
    // [39] *PROCPORT = irq_demo::port_value#0 -- _deref_pbuc1=vbuz1 
    lda.z port_value
    sta PROCPORT
    // irq_demo::@return
    // }
    // [40] return 
    // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit 
  rega:
    lda #0
  regx:
    ldx #0
  regy:
    ldy #0
    rti
}
.segment CodePart2
  // irq_swing_plex
// Show sprites from the multiplexer, rescheduling the IRQ for each bucket
irq_swing_plex: {
    // Move to the next frame of the plexer
    .const YMOVE = 3
    .label __7 = $2d
    .label __26 = $2d
    .label __27 = $2d
    .label scroll = $2d
    .label new_coarse_scroll = $2f
    .label x_offset = $30
    .label __31 = $2d
    // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry 
    sta rega+1
    stx regx+1
    sty regy+1
    // plexBucketShow(plex_bucket)
    // [41] plexBucketShow::bucket#1 = plex_bucket -- pssz1=pssz2 
    lda.z plex_bucket
    sta.z plexBucketShow.bucket
    lda.z plex_bucket+1
    sta.z plexBucketShow.bucket+1
    // [42] call plexBucketShow
  //*BORDER_COLOR = DARK_GREY;
  // Show the bucket
    // [207] phi from irq_swing_plex to plexBucketShow [phi:irq_swing_plex->plexBucketShow]
    // [207] phi plexBucketShow::bucket#2 = plexBucketShow::bucket#1 [phi:irq_swing_plex->plexBucketShow#0] -- register_copy 
    jsr plexBucketShow
    // irq_swing_plex::@17
    // plex_bucket += BUCKET_SIZE
    // [43] plex_bucket = plex_bucket + 8*SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_plus_vbuc1 
    // Move forward to the next bucket
    lda #8*SIZEOF_STRUCT_BUCKETSPRITE
    clc
    adc.z plex_bucket
    sta.z plex_bucket
    bcc !+
    inc.z plex_bucket+1
  !:
    // plex_bucket_id++;
    // [44] plex_bucket_id = ++ plex_bucket_id -- vbuz1=_inc_vbuz1 
    inc.z plex_bucket_id
    // if(plex_bucket_id<BUCKET_COUNT)
    // [45] if(plex_bucket_id<9) goto irq_swing_plex::@1 -- vbuz1_lt_vbuc1_then_la1 
    lda.z plex_bucket_id
    cmp #9
    bcs !__b1+
    jmp __b1
  !__b1:
    // irq_swing_plex::@3
    // *HARDWARE_IRQ = &irq_swing_top
    // [46] *HARDWARE_IRQ = &irq_swing_top -- _deref_qprc1=pprc2 
    // We are done with this frame - finish it and perform other stuff!
    //VICII->BORDER_COLOR = RED;
    // Set up the TOP IRQ
    lda #<irq_swing_top
    sta HARDWARE_IRQ
    lda #>irq_swing_top
    sta HARDWARE_IRQ+1
    // *RASTER = BUCKET_YPOS[0]
    // [47] *RASTER = *BUCKET_YPOS -- _deref_pbuc1=_deref_pbuc2 
    lda BUCKET_YPOS
    sta RASTER
    // plex_frame_id += YMOVE
    // [48] plex_frame_id = plex_frame_id + irq_swing_plex::YMOVE -- vbuz1=vbuz1_plus_vbuc1 
    lax.z plex_frame_id
    axs #-[YMOVE]
    stx.z plex_frame_id
    // plex_frame += (unsigned int)YMOVE*BUCKET_COUNT*BUCKET_SIZE
    // [49] plex_frame = plex_frame + (unsigned int)irq_swing_plex::YMOVE*9*8*SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_plus_vwuc1 
    lda.z plex_frame
    clc
    adc #<YMOVE*9*8*SIZEOF_STRUCT_BUCKETSPRITE
    sta.z plex_frame
    lda.z plex_frame+1
    adc #>YMOVE*9*8*SIZEOF_STRUCT_BUCKETSPRITE
    sta.z plex_frame+1
    // if(plex_frame_id>=FRAME_COUNT)
    // [50] if(plex_frame_id<8) goto irq_swing_plex::@5 -- vbuz1_lt_vbuc1_then_la1 
    txa
    cmp #8
    bcc __b5
    // irq_swing_plex::@4
    // plex_frame -= BUCKET_COUNT*BUCKET_SIZE*FRAME_COUNT
    // [51] plex_frame = plex_frame - (unsigned int)9*8*8*SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_minus_vwuc1 
    // Reset to start of cycle 
    lda.z plex_frame
    sec
    sbc #<9*8*8*SIZEOF_STRUCT_BUCKETSPRITE
    sta.z plex_frame
    lda.z plex_frame+1
    sbc #>9*8*8*SIZEOF_STRUCT_BUCKETSPRITE
    sta.z plex_frame+1
    // plex_frame_id -= FRAME_COUNT
    // [52] plex_frame_id = plex_frame_id - 8 -- vbuz1=vbuz1_minus_vbuc1 
    lax.z plex_frame_id
    axs #8
    stx.z plex_frame_id
    // plex_id_offset--;
    // [53] plex_id_offset = -- plex_id_offset -- vbuz1=_dec_vbuz1 
    dec.z plex_id_offset
    // irq_swing_plex::@5
  __b5:
    // update_frame_plex_id_offset(plex_frame_id)
    // [54] update_frame_plex_id_offset::plex_frame_id#0 = plex_frame_id -- vbuaa=vbuz1 
    lda.z plex_frame_id
    // [55] call update_frame_plex_id_offset
    // Update plex_id in the next frame
    //VICII->BORDER_COLOR = BLUE;
    jsr update_frame_plex_id_offset
    // irq_swing_plex::@18
    // if(p2_logo_swinging)
    // [56] if(0==p2_logo_swinging) goto irq_swing_plex::@6 -- 0_eq_vbuz1_then_la1 
    lda.z p2_logo_swinging
    beq __b6
    // irq_swing_plex::@12
    // unsigned int scroll = VSP_SINTABLE[(unsigned int)(vsp_sin_idx++)]
    // [57] irq_swing_plex::$27 = (unsigned int)vsp_sin_idx -- vwuz1=_word_vbuz2 
    lda.z vsp_sin_idx
    sta.z __27
    lda #0
    sta.z __27+1
    // [58] irq_swing_plex::$26 = irq_swing_plex::$27 << 1 -- vwuz1=vwuz1_rol_1 
    asl.z __26
    rol.z __26+1
    // [59] irq_swing_plex::$31 = VSP_SINTABLE + irq_swing_plex::$26 -- pwuz1=pwuc1_plus_vwuz1 
    lda.z __31
    clc
    adc #<VSP_SINTABLE
    sta.z __31
    lda.z __31+1
    adc #>VSP_SINTABLE
    sta.z __31+1
    // [60] irq_swing_plex::scroll#0 = *irq_swing_plex::$31 -- vwuz1=_deref_pwuz1 
    // Update the VSP value with a sinus
    ldy #0
    lda (scroll),y
    pha
    iny
    lda (scroll),y
    sta.z scroll+1
    pla
    sta.z scroll
    // [61] vsp_sin_idx = ++ vsp_sin_idx -- vbuz1=_inc_vbuz1 
    inc.z vsp_sin_idx
    // (char)scroll&7
    // [62] irq_swing_plex::$28 = (char)irq_swing_plex::scroll#0 -- vbuaa=_byte_vwuz1 
    // [63] irq_swing_plex::$6 = irq_swing_plex::$28 & 7 -- vbuaa=vbuaa_band_vbuc1 
    and #7
    // vsp_fine_scroll = (char)scroll&7
    // [64] vsp_fine_scroll = irq_swing_plex::$6 -- vbuz1=vbuaa 
    sta.z vsp_fine_scroll
    // scroll/8
    // [65] irq_swing_plex::$7 = irq_swing_plex::scroll#0 >> 3 -- vwuz1=vwuz1_ror_3 
    lsr.z __7+1
    ror.z __7
    lsr.z __7+1
    ror.z __7
    lsr.z __7+1
    ror.z __7
    // char new_coarse_scroll = (char)(scroll/8)
    // [66] irq_swing_plex::new_coarse_scroll#0 = (char)irq_swing_plex::$7 -- vbuz1=_byte_vwuz2 
    lda.z __7
    sta.z new_coarse_scroll
    // char coarse_scroll_diff = vsp_coarse_scroll - new_coarse_scroll
    // [67] irq_swing_plex::coarse_scroll_diff#0 = vsp_coarse_scroll - irq_swing_plex::new_coarse_scroll#0 -- vbuaa=vbuz1_minus_vbuz2 
    // Update the VSP value with a sinus
    lda.z vsp_coarse_scroll
    sec
    sbc.z new_coarse_scroll
    // if(coarse_scroll_diff==0x01)
    // [68] if(irq_swing_plex::coarse_scroll_diff#0==1) goto irq_swing_plex::@7 -- vbuaa_eq_vbuc1_then_la1 
    // Update screen column (if needed)
    cmp #1
    beq __b7
    // irq_swing_plex::@13
    // if(coarse_scroll_diff==0xff)
    // [69] if(irq_swing_plex::coarse_scroll_diff#0!=$ff) goto irq_swing_plex::@8 -- vbuaa_neq_vbuc1_then_la1 
    cmp #$ff
    bne __b8
    // irq_swing_plex::@14
    // char x_offset = 0x27-vsp_coarse_scroll
    // [70] irq_swing_plex::x_offset#0 = $27 - vsp_coarse_scroll -- vbuz1=vbuc1_minus_vbuz2 
    // Moving right - put a new column at the left border
    lda #$27
    sec
    sbc.z vsp_coarse_scroll
    sta.z x_offset
    // vsp_update_screen(x_offset)
    // [71] vsp_update_screen::x_offset = irq_swing_plex::x_offset#0 -- vbuz1=vbuz2 
    sta.z vsp_update_screen.x_offset
    // [72] call vsp_update_screen
    jsr vsp_update_screen
    // irq_swing_plex::@19
    // (PART2_SCREEN+24*40)[x_offset] = 0
    // [73] (PART2_SCREEN+(unsigned int)$18*$28)[irq_swing_plex::x_offset#0] = 0 -- pbuc1_derefidx_vbuz1=vbuc2 
    // Clear line 25 - because the start of the last line was over-written by line #24 chars 40-80
    lda #0
    ldy.z x_offset
    sta PART2_SCREEN+$18*$28,y
    // (COLS+24*40)[x_offset] = 0
    // [74] (COLS+(unsigned int)$18*$28)[irq_swing_plex::x_offset#0] = 0 -- pbuc1_derefidx_vbuz1=vbuc2 
    //(LOGO_DATA_SCREEN+24*80)[x_offset];
    sta COLS+$18*$28,y
    // irq_swing_plex::@8
  __b8:
    // vsp_coarse_scroll = new_coarse_scroll
    // [75] vsp_coarse_scroll = irq_swing_plex::new_coarse_scroll#0 -- vbuz1=vbuz2 
    lda.z new_coarse_scroll
    sta.z vsp_coarse_scroll
    // 40-vsp_coarse_scroll
    // [76] irq_swing_plex::$16 = $28 - vsp_coarse_scroll -- vbuaa=vbuc1_minus_vbuz1 
    lda #$28
    sec
    sbc.z vsp_coarse_scroll
    // vsp_scroll = 40-vsp_coarse_scroll
    // [77] vsp_scroll = irq_swing_plex::$16 -- vbuz1=vbuaa 
    sta.z vsp_scroll
    // irq_swing_plex::@6
  __b6:
    // if(p2_plex_scroller_moving)
    // [78] if(0==p2_plex_scroller_moving) goto irq_swing_plex::@9 -- 0_eq_vbuz1_then_la1 
    lda.z p2_plex_scroller_moving
    beq __b9
    // [79] phi from irq_swing_plex::@6 to irq_swing_plex::@15 [phi:irq_swing_plex::@6->irq_swing_plex::@15]
    // irq_swing_plex::@15
    // plex_scroller_move()
    // [80] call plex_scroller_move
    jsr plex_scroller_move
    // irq_swing_plex::@20
    // if(++sprite_color_idx == sizeof(SPRITE_COLOR_SEQUENCE))
    // [81] sprite_color_idx = ++ sprite_color_idx -- vbuz1=_inc_vbuz1 
    inc.z sprite_color_idx
    // [82] if(sprite_color_idx!=$30*SIZEOF_CHAR) goto irq_swing_plex::@10 -- vbuz1_neq_vbuc1_then_la1 
    lda #$30*SIZEOF_CHAR
    cmp.z sprite_color_idx
    bne __b3
    // irq_swing_plex::@16
    // sprite_color_idx = 0
    // [83] sprite_color_idx = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z sprite_color_idx
    // [84] phi from irq_swing_plex::@16 irq_swing_plex::@20 to irq_swing_plex::@10 [phi:irq_swing_plex::@16/irq_swing_plex::@20->irq_swing_plex::@10]
  __b3:
    // [84] phi irq_swing_plex::s#2 = 0 [phi:irq_swing_plex::@16/irq_swing_plex::@20->irq_swing_plex::@10#0] -- vbuxx=vbuc1 
    ldx #0
    // irq_swing_plex::@10
  __b10:
    // for(char s=0;s<8;s++)
    // [85] if(irq_swing_plex::s#2<8) goto irq_swing_plex::@11 -- vbuxx_lt_vbuc1_then_la1 
    cpx #8
    bcc __b11
    // irq_swing_plex::@9
  __b9:
    // p2_work_ready = 1
    // [86] p2_work_ready = 1 -- vbuz1=vbuc1 
    // Signal the main routine
    lda #1
    sta.z p2_work_ready
    // irq_swing_plex::@2
  __b2:
    // *IRQ_STATUS = IRQ_RASTER
    // [87] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Acknowledge the IRQ
    lda #IRQ_RASTER
    sta IRQ_STATUS
    // irq_swing_plex::@return
    // }
    // [88] return 
    // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit 
  rega:
    lda #0
  regx:
    ldx #0
  regy:
    ldy #0
    rti
    // irq_swing_plex::@11
  __b11:
    // SPRITES_COLOR[s] = SPRITE_COLOR_SEQUENCE[sprite_color_idx]
    // [89] SPRITES_COLOR[irq_swing_plex::s#2] = SPRITE_COLOR_SEQUENCE[sprite_color_idx] -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuz1 
    ldy.z sprite_color_idx
    lda SPRITE_COLOR_SEQUENCE,y
    sta SPRITES_COLOR,x
    // for(char s=0;s<8;s++)
    // [90] irq_swing_plex::s#1 = ++ irq_swing_plex::s#2 -- vbuxx=_inc_vbuxx 
    inx
    // [84] phi from irq_swing_plex::@11 to irq_swing_plex::@10 [phi:irq_swing_plex::@11->irq_swing_plex::@10]
    // [84] phi irq_swing_plex::s#2 = irq_swing_plex::s#1 [phi:irq_swing_plex::@11->irq_swing_plex::@10#0] -- register_copy 
    jmp __b10
    // irq_swing_plex::@7
  __b7:
    // char x_offset = 0x50-vsp_coarse_scroll
    // [91] irq_swing_plex::x_offset1#0 = $50 - vsp_coarse_scroll -- vbuaa=vbuc1_minus_vbuz1 
    // Moving left - put a new column at the right border
    lda #$50
    sec
    sbc.z vsp_coarse_scroll
    // vsp_update_screen(x_offset)
    // [92] vsp_update_screen::x_offset = irq_swing_plex::x_offset1#0 -- vbuz1=vbuaa 
    sta.z vsp_update_screen.x_offset
    // [93] call vsp_update_screen
    // Only move 24 - because the last line is empty (and holds sprite pointers)
    jsr vsp_update_screen
    jmp __b8
    // irq_swing_plex::@1
  __b1:
    // *HARDWARE_IRQ = &irq_swing_plex
    // [94] *HARDWARE_IRQ = &irq_swing_plex -- _deref_qprc1=pprc2 
    // Not done with the frame yet - set up the next PLEX IRQ (handles the rest of the multiplexer buckets)
    lda #<irq_swing_plex
    sta HARDWARE_IRQ
    lda #>irq_swing_plex
    sta HARDWARE_IRQ+1
    // *RASTER = BUCKET_YPOS[plex_bucket_id]
    // [95] *RASTER = BUCKET_YPOS[plex_bucket_id] -- _deref_pbuc1=pbuc2_derefidx_vbuz1 
    ldy.z plex_bucket_id
    lda BUCKET_YPOS,y
    sta RASTER
    jmp __b2
}
  // irq_swing_vsp
// Show sprites from the multiplexer, rescheduling the IRQ as many times as needed
irq_swing_vsp: {
    // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry 
    sta rega+1
    stx regx+1
    // irq_swing_vsp::vsp_perform1
    // kickasm
    // kickasm( uses vsp_scroll uses HARDWARE_IRQ uses RASTER uses IRQ_STATUS uses IRQ_RASTER uses VICII_CONTROL1) {{ // Stabilize the raster by using the double IRQ method         // Acknowledge the IRQ         lda #IRQ_RASTER         sta IRQ_STATUS         // Set-up IRQ for the next line         inc RASTER         // Point IRQ to almost stable code         lda #<stable         sta HARDWARE_IRQ         lda #>stable         sta HARDWARE_IRQ+1         tsx       // Save stack pointer         cli       // Reenable interrupts         // Wait for new IRQ using NOP's to ensure minimal jitter when it hits         .fill 15, NOP         .align $100     stable:         txs             // Restore stack pointer         ldx #9          // Wait till the raster has almost crossed to the next line (48 cycles)         !: dex         bne !-         nop         lda RASTER         cmp RASTER         bne !+          // And correct the last cycle of potential jitter         !:         // Raster is now completely stable! (Line $2f cycle 7)         // Perform VSP by waiting an exact number of cycles and then enabling the display         // See http://www.zimmers.net/cbmpics/cbm/c64/vic-ii.txt (Section 3.14.6. DMA delay)         ldx #8          // Wait 45 cycles to get the VSP timing right         !: dex         bne !-         nop         nop         lda vsp_scroll         lsr         //  Put bit 0 into carry          bcc dma1    // Spend 2 or 3 cycles depending on the carry (bit 0)     dma1:         sta dma2+1  // Update the branch         clv     dma2:         bvc dma2    // This branch is updated with vsp_scroll/2 - changing the number of NOP's executed         // 20 NOP's - enabling vsp scroll from 0-40         .fill 20, NOP         ldx #$18         lda #$1b  // TODO: To control Y-scrolling this must be flexible!         // The STX $d011 must be line $30 cycle $10 for vsp_scroll==0         stx VICII_CONTROL1 // Enable the display - starts DMA         sta VICII_CONTROL1      }}
    // Stabilize the raster by using the double IRQ method
        // Acknowledge the IRQ
        lda #IRQ_RASTER
        sta IRQ_STATUS
        // Set-up IRQ for the next line
        inc RASTER
        // Point IRQ to almost stable code
        lda #<stable
        sta HARDWARE_IRQ
        lda #>stable
        sta HARDWARE_IRQ+1
        tsx       // Save stack pointer
        cli       // Reenable interrupts
        // Wait for new IRQ using NOP's to ensure minimal jitter when it hits
        .fill 15, NOP
        .align $100
    stable:
        txs             // Restore stack pointer
        ldx #9          // Wait till the raster has almost crossed to the next line (48 cycles)
        !: dex
        bne !-
        nop
        lda RASTER
        cmp RASTER
        bne !+          // And correct the last cycle of potential jitter
        !:
        // Raster is now completely stable! (Line $2f cycle 7)
        // Perform VSP by waiting an exact number of cycles and then enabling the display
        // See http://www.zimmers.net/cbmpics/cbm/c64/vic-ii.txt (Section 3.14.6. DMA delay)
        ldx #8          // Wait 45 cycles to get the VSP timing right
        !: dex
        bne !-
        nop
        nop
        lda vsp_scroll
        lsr         //  Put bit 0 into carry 
        bcc dma1    // Spend 2 or 3 cycles depending on the carry (bit 0)
    dma1:
        sta dma2+1  // Update the branch
        clv
    dma2:
        bvc dma2    // This branch is updated with vsp_scroll/2 - changing the number of NOP's executed
        // 20 NOP's - enabling vsp scroll from 0-40
        .fill 20, NOP
        ldx #$18
        lda #$1b  // TODO: To control Y-scrolling this must be flexible!
        // The STX $d011 must be line $30 cycle $10 for vsp_scroll==0
        stx VICII_CONTROL1 // Enable the display - starts DMA
        sta VICII_CONTROL1
    
    // irq_swing_vsp::@1
    // VICII->CONTROL1 |= VICII_BMM
    // [98] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    // Set BMM
    lda #VICII_BMM
    ora VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
    // vsp_fine_scroll | VICII_MCM
    // [99] irq_swing_vsp::$1 = vsp_fine_scroll | VICII_MCM -- vbuaa=vbuz1_bor_vbuc1 
    lda #VICII_MCM
    ora.z vsp_fine_scroll
    // VICII->CONTROL2 = vsp_fine_scroll | VICII_MCM
    // [100] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) = irq_swing_vsp::$1 -- _deref_pbuc1=vbuaa 
    // Set fine scroll (and MCM)
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2
    // *IRQ_STATUS = IRQ_RASTER
    // [101] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    //*BORDER_COLOR = DARK_GREY;
    // Acknowledge the IRQ
    lda #IRQ_RASTER
    sta IRQ_STATUS
    // *HARDWARE_IRQ = &irq_swing_plex
    // [102] *HARDWARE_IRQ = &irq_swing_plex -- _deref_qprc1=pprc2 
    // Set up the PLEX IRQ (handles the rest of the multiplexer buckets)
    lda #<irq_swing_plex
    sta HARDWARE_IRQ
    lda #>irq_swing_plex
    sta HARDWARE_IRQ+1
    // *RASTER = BUCKET_YPOS[1]
    // [103] *RASTER = *(BUCKET_YPOS+1) -- _deref_pbuc1=_deref_pbuc2 
    lda BUCKET_YPOS+1
    sta RASTER
    // irq_swing_vsp::@return
    // }
    // [104] return 
    // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit 
  rega:
    lda #0
  regx:
    ldx #0
    rti
}
  // irq_swing_top
// Inititialize plex frame and show first bucket
irq_swing_top: {
    // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry 
    sta rega+1
    stx regx+1
    sty regy+1
    // plexFrameStart()
    // [106] call plexFrameStart
    //*BORDER_COLOR = DARK_GREY;
    //VICII->BORDER_COLOR++;
    // Initialize the multiplexer frame
    jsr plexFrameStart
    // irq_swing_top::@1
    // plex_bucket = plex_frame
    // [107] plex_bucket = plex_frame -- pssz1=pssz2 
    lda.z plex_frame
    sta.z plex_bucket
    lda.z plex_frame+1
    sta.z plex_bucket+1
    // plex_bucket_id = 0
    // [108] plex_bucket_id = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z plex_bucket_id
    // plexBucketShow(plex_bucket)
    // [109] plexBucketShow::bucket#0 = plex_bucket -- pssz1=pssz2 
    lda.z plex_bucket
    sta.z plexBucketShow.bucket
    lda.z plex_bucket+1
    sta.z plexBucketShow.bucket+1
    // [110] call plexBucketShow
  // Show the first bucket
    // [207] phi from irq_swing_top::@1 to plexBucketShow [phi:irq_swing_top::@1->plexBucketShow]
    // [207] phi plexBucketShow::bucket#2 = plexBucketShow::bucket#0 [phi:irq_swing_top::@1->plexBucketShow#0] -- register_copy 
    jsr plexBucketShow
    // irq_swing_top::@2
    // plex_bucket += BUCKET_SIZE
    // [111] plex_bucket = plex_bucket + 8*SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_plus_vbuc1 
    // Move forward to the next bucket
    lda #8*SIZEOF_STRUCT_BUCKETSPRITE
    clc
    adc.z plex_bucket
    sta.z plex_bucket
    bcc !+
    inc.z plex_bucket+1
  !:
    // plex_bucket_id++;
    // [112] plex_bucket_id = ++ plex_bucket_id -- vbuz1=_inc_vbuz1 
    inc.z plex_bucket_id
    // *IRQ_STATUS = IRQ_RASTER
    // [113] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Acknowledge the IRQ
    lda #IRQ_RASTER
    sta IRQ_STATUS
    // *HARDWARE_IRQ = &irq_swing_vsp
    // [114] *HARDWARE_IRQ = &irq_swing_vsp -- _deref_qprc1=pprc2 
    // Set up the VSP IRQ
    lda #<irq_swing_vsp
    sta HARDWARE_IRQ
    lda #>irq_swing_vsp
    sta HARDWARE_IRQ+1
    // *RASTER = IRQ_SWING_VSP_LINE
    // [115] *RASTER = IRQ_SWING_VSP_LINE -- _deref_pbuc1=vbuc2 
    lda #IRQ_SWING_VSP_LINE
    sta RASTER
    // irq_swing_top::@return
    // }
    // [116] return 
    // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit 
  rega:
    lda #0
  regx:
    ldx #0
  regy:
    ldy #0
    rti
}
.segment CodePart1
  // irq_flipper_bottom
// IRQ running during set-up
// Flips from start screen to bitmap (starts the start-up screen)
irq_flipper_bottom: {
    .const toD0181_return = (>(LOAD_SCREEN&$3fff)*4)|(>LOAD_CHARSET)/4&$f
    .label __7 = $35
    .label __9 = $37
    .label __12 = $33
    .label irq_flipper_line = $33
    .label __14 = $33
    // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry 
    sta rega+1
    stx regx+1
    sty regy+1
    // asm
    // asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop  }
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    // BYTE0(irq_flipper_bottom_line)
    // [118] irq_flipper_bottom::$0 = byte0  irq_flipper_bottom_line -- vbuaa=_byte0_vwuz1 
    lda.z irq_flipper_bottom_line
    // BYTE0(irq_flipper_bottom_line)&7
    // [119] irq_flipper_bottom::$1 = irq_flipper_bottom::$0 & 7 -- vbuaa=vbuaa_band_vbuc1 
    and #7
    // raster_fine(BYTE0(irq_flipper_bottom_line)&7)
    // [120] raster_fine::line_offset = irq_flipper_bottom::$1 -- vbuz1=vbuaa 
    sta.z raster_fine.line_offset
    // [121] call raster_fine
    jsr raster_fine
    // irq_flipper_bottom::@11
    // asm
    // asm { nop nop nop nop  }
    // Colors
    nop
    nop
    nop
    nop
    // VICII->BORDER_COLOR = LIGHT_BLUE
    // [123] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = LIGHT_BLUE -- _deref_pbuc1=vbuc2 
    lda #LIGHT_BLUE
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR
    // VICII->BG_COLOR = BLUE
    // [124] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLUE -- _deref_pbuc1=vbuc2 
    lda #BLUE
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR
    // [125] phi from irq_flipper_bottom::@11 to irq_flipper_bottom::toD0181 [phi:irq_flipper_bottom::@11->irq_flipper_bottom::toD0181]
    // irq_flipper_bottom::toD0181
    // irq_flipper_bottom::@10
    // VICII->MEMORY = toD018(LOAD_SCREEN, LOAD_CHARSET)
    // [126] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = irq_flipper_bottom::toD0181_return#0 -- _deref_pbuc1=vbuc2 
    // Show default screen
    lda #toD0181_return
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY
    // if(!flipper_done)
    // [127] if(0!=flipper_done) goto irq_flipper_bottom::@1 -- 0_neq_vbuz1_then_la1 
    lda.z flipper_done
    bne __b1
    // irq_flipper_bottom::@2
    // unsigned int irq_flipper_line = FLIPPER_EASING[irq_flipper_idx++]
    // [128] irq_flipper_bottom::$12 = irq_flipper_idx << 1 -- vwuz1=vwuz2_rol_1 
    lda.z irq_flipper_idx
    asl
    sta.z __12
    lda.z irq_flipper_idx+1
    rol
    sta.z __12+1
    // [129] irq_flipper_bottom::$14 = FLIPPER_EASING + irq_flipper_bottom::$12 -- pwuz1=pwuc1_plus_vwuz1 
    lda.z __14
    clc
    adc #<FLIPPER_EASING
    sta.z __14
    lda.z __14+1
    adc #>FLIPPER_EASING
    sta.z __14+1
    // [130] irq_flipper_bottom::irq_flipper_line#0 = *irq_flipper_bottom::$14 -- vwuz1=_deref_pwuz1 
    // Move the flipper down    
    ldy #0
    lda (irq_flipper_line),y
    pha
    iny
    lda (irq_flipper_line),y
    sta.z irq_flipper_line+1
    pla
    sta.z irq_flipper_line
    // [131] irq_flipper_idx = ++ irq_flipper_idx -- vwuz1=_inc_vwuz1 
    inc.z irq_flipper_idx
    bne !+
    inc.z irq_flipper_idx+1
  !:
    // if(irq_flipper_line<8)
    // [132] if(irq_flipper_bottom::irq_flipper_line#0<8) goto irq_flipper_bottom::@4 -- vwuz1_lt_vbuc1_then_la1 
    // Check limits
    lda.z irq_flipper_line+1
    bne !+
    lda.z irq_flipper_line
    cmp #8
    bcc __b4
  !:
    // irq_flipper_bottom::@3
    // irq_flipper_line-8
    // [133] irq_flipper_bottom::$7 = irq_flipper_bottom::irq_flipper_line#0 - 8 -- vwuz1=vwuz2_minus_vbuc1 
    sec
    lda.z irq_flipper_line
    sbc #8
    sta.z __7
    lda.z irq_flipper_line+1
    sbc #0
    sta.z __7+1
    // irq_flipper_top_line = irq_flipper_line-8
    // [134] irq_flipper_top_line = irq_flipper_bottom::$7 -- vwuz1=vwuz2 
    lda.z __7
    sta.z irq_flipper_top_line
    lda.z __7+1
    sta.z irq_flipper_top_line+1
    // irq_flipper_bottom::@5
  __b5:
    // if(irq_flipper_line>0x128)
    // [135] if(irq_flipper_bottom::irq_flipper_line#0>$128) goto irq_flipper_bottom::@6 -- vwuz1_gt_vwuc1_then_la1 
    lda #>$128
    cmp.z irq_flipper_line+1
    bcc __b6
    bne !+
    lda #<$128
    cmp.z irq_flipper_line
    bcc __b6
  !:
    // irq_flipper_bottom::@8
    // irq_flipper_line+8
    // [136] irq_flipper_bottom::$9 = irq_flipper_bottom::irq_flipper_line#0 + 8 -- vwuz1=vwuz2_plus_vbuc1 
    lda #8
    clc
    adc.z irq_flipper_line
    sta.z __9
    lda #0
    adc.z irq_flipper_line+1
    sta.z __9+1
    // irq_flipper_bottom_line = irq_flipper_line+8
    // [137] irq_flipper_bottom_line = irq_flipper_bottom::$9 -- vwuz1=vwuz2 
    lda.z __9
    sta.z irq_flipper_bottom_line
    lda.z __9+1
    sta.z irq_flipper_bottom_line+1
    // irq_flipper_bottom::@7
  __b7:
    // if(irq_flipper_line==0x130)
    // [138] if(irq_flipper_bottom::irq_flipper_line#0!=$130) goto irq_flipper_bottom::@1 -- vwuz1_neq_vwuc1_then_la1 
    lda.z irq_flipper_line+1
    cmp #>$130
    bne __b1
    lda.z irq_flipper_line
    cmp #<$130
    bne __b1
    // irq_flipper_bottom::@9
    // flipper_done = 1
    // [139] flipper_done = 1 -- vbuz1=vbuc1 
    lda #1
    sta.z flipper_done
    // irq_flipper_bottom::@1
  __b1:
    // *VICII_CONTROL1 |=0x80
    // [140] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    // Set up the IRQ again
    lda #$80
    ora VICII_CONTROL1
    sta VICII_CONTROL1
    // *RASTER = IRQ_PART1_TOP_LINE
    // [141] *RASTER = IRQ_PART1_TOP_LINE -- _deref_pbuc1=vbuc2 
    lda #IRQ_PART1_TOP_LINE
    sta RASTER
    // *HARDWARE_IRQ = &irq_part1_top
    // [142] *HARDWARE_IRQ = &irq_part1_top -- _deref_qprc1=pprc2 
    lda #<irq_part1_top
    sta HARDWARE_IRQ
    lda #>irq_part1_top
    sta HARDWARE_IRQ+1
    // *IRQ_STATUS = IRQ_RASTER
    // [143] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Acknowledge the IRQ
    lda #IRQ_RASTER
    sta IRQ_STATUS
    // irq_flipper_bottom::@return
    // }
    // [144] return 
    // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit 
  rega:
    lda #0
  regx:
    ldx #0
  regy:
    ldy #0
    rti
    // irq_flipper_bottom::@6
  __b6:
    // irq_flipper_bottom_line = 0x130
    // [145] irq_flipper_bottom_line = $130 -- vwuz1=vwuc1 
    lda #<$130
    sta.z irq_flipper_bottom_line
    lda #>$130
    sta.z irq_flipper_bottom_line+1
    jmp __b7
    // irq_flipper_bottom::@4
  __b4:
    // irq_flipper_top_line = 0
    // [146] irq_flipper_top_line = 0 -- vwuz1=vbuc1 
    lda #<0
    sta.z irq_flipper_top_line
    sta.z irq_flipper_top_line+1
    jmp __b5
}
  // irq_flipper_top
// IRQ running during set-up
// Flips from start screen to bitmap (stops the bitmap)
irq_flipper_top: {
    // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry 
    sta rega+1
    stx regx+1
    sty regy+1
    // asm
    // asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop  }
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    // BYTE0(irq_flipper_top_line)
    // [148] irq_flipper_top::$0 = byte0  irq_flipper_top_line -- vbuaa=_byte0_vwuz1 
    lda.z irq_flipper_top_line
    // BYTE0(irq_flipper_top_line)&7
    // [149] irq_flipper_top::$1 = irq_flipper_top::$0 & 7 -- vbuaa=vbuaa_band_vbuc1 
    and #7
    // raster_fine(BYTE0(irq_flipper_top_line)&7)
    // [150] raster_fine::line_offset = irq_flipper_top::$1 -- vbuz1=vbuaa 
    sta.z raster_fine.line_offset
    // [151] call raster_fine
    jsr raster_fine
    // irq_flipper_top::@4
    // asm
    // asm { lda#$9a ldx#LIGHT_GREEN ldy#$1b staVICII_MEMORY stxBORDER_COLOR styVICII_CONTROL1 stxBG_COLOR lda#$c8 staVICII_CONTROL2  }
    lda #$9a
    ldx #LIGHT_GREEN
    ldy #$1b
    sta VICII_MEMORY
    stx BORDER_COLOR
    sty VICII_CONTROL1
    stx BG_COLOR
    lda #$c8
    sta VICII_CONTROL2
    // BYTE1(irq_flipper_bottom_line)
    // [153] irq_flipper_top::$3 = byte1  irq_flipper_bottom_line -- vbuaa=_byte1_vwuz1 
    lda.z irq_flipper_bottom_line+1
    // if(BYTE1(irq_flipper_bottom_line))
    // [154] if(0!=irq_flipper_top::$3) goto irq_flipper_top::@1 -- 0_neq_vbuaa_then_la1 
    // Set up the flipper IRQ
    cmp #0
    bne __b1
    // irq_flipper_top::@3
    // *VICII_CONTROL1 &= 0x7f
    // [155] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2 
    lda #$7f
    and VICII_CONTROL1
    sta VICII_CONTROL1
    // irq_flipper_top::@2
  __b2:
    // BYTE0(irq_flipper_bottom_line)
    // [156] irq_flipper_top::$4 = byte0  irq_flipper_bottom_line -- vbuaa=_byte0_vwuz1 
    lda.z irq_flipper_bottom_line
    // BYTE0(irq_flipper_bottom_line)&0xf8
    // [157] irq_flipper_top::$5 = irq_flipper_top::$4 & $f8 -- vbuaa=vbuaa_band_vbuc1 
    and #$f8
    // *RASTER = BYTE0(irq_flipper_bottom_line)&0xf8
    // [158] *RASTER = irq_flipper_top::$5 -- _deref_pbuc1=vbuaa 
    sta RASTER
    // *HARDWARE_IRQ = &irq_flipper_bottom
    // [159] *HARDWARE_IRQ = &irq_flipper_bottom -- _deref_qprc1=pprc2 
    lda #<irq_flipper_bottom
    sta HARDWARE_IRQ
    lda #>irq_flipper_bottom
    sta HARDWARE_IRQ+1
    // *IRQ_STATUS = IRQ_RASTER
    // [160] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Acknowledge the IRQ
    lda #IRQ_RASTER
    sta IRQ_STATUS
    // irq_flipper_top::@return
    // }
    // [161] return 
    // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit 
  rega:
    lda #0
  regx:
    ldx #0
  regy:
    ldy #0
    rti
    // irq_flipper_top::@1
  __b1:
    // *VICII_CONTROL1 |= 0x80
    // [162] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    lda #$80
    ora VICII_CONTROL1
    sta VICII_CONTROL1
    jmp __b2
}
  // irq_part1_top
// IRQ running during set-up
irq_part1_top: {
    .const toDd001_return = 0
    .const toD0181_return = >(P1_SCREEN&$3fff)*4
    // interrupt(isr_hardware_clobber_entry) -- isr_hardware_all_entry 
    sta rega+1
    // VICII->BORDER_COLOR = BLACK
    // [163] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = BLACK -- _deref_pbuc1=vbuc2 
    // Colors
    lda #BLACK
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR
    // VICII->BG_COLOR = BLACK
    // [164] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLACK -- _deref_pbuc1=vbuc2 
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR
    // VICII->CONTROL1 |= VICII_BMM
    // [165] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    // Set BMM
    lda #VICII_BMM
    ora VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
    // VICII->CONTROL2 |= VICII_MCM
    // [166] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2) | VICII_MCM -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    // Set MCM
    lda #VICII_MCM
    ora VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL2
    // [167] phi from irq_part1_top to irq_part1_top::toDd001 [phi:irq_part1_top->irq_part1_top::toDd001]
    // irq_part1_top::toDd001
    // irq_part1_top::@4
    // CIA2->PORT_A = toDd00(P1_SCREEN)
    // [168] *((char *)CIA2) = irq_part1_top::toDd001_return#0 -- _deref_pbuc1=vbuc2 
    // Change graphics bank
    lda #toDd001_return
    sta CIA2
    // [169] phi from irq_part1_top::@4 to irq_part1_top::toD0181 [phi:irq_part1_top::@4->irq_part1_top::toD0181]
    // irq_part1_top::toD0181
    // irq_part1_top::@5
    // VICII->MEMORY = toD018(P1_SCREEN, P1_PIXELS)
    // [170] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = irq_part1_top::toD0181_return#0 -- _deref_pbuc1=vbuc2 
    // Show screen
    lda #toD0181_return
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY
    // BYTE1(irq_flipper_top_line)
    // [171] irq_part1_top::$2 = byte1  irq_flipper_top_line -- vbuaa=_byte1_vwuz1 
    lda.z irq_flipper_top_line+1
    // if(BYTE1(irq_flipper_top_line))
    // [172] if(0!=irq_part1_top::$2) goto irq_part1_top::@1 -- 0_neq_vbuaa_then_la1 
    // Set up the flipper IRQ
    cmp #0
    bne __b1
    // irq_part1_top::@3
    // *VICII_CONTROL1 &= 0x7f
    // [173] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2 
    lda #$7f
    and VICII_CONTROL1
    sta VICII_CONTROL1
    // irq_part1_top::@2
  __b2:
    // BYTE0(irq_flipper_top_line)
    // [174] irq_part1_top::$3 = byte0  irq_flipper_top_line -- vbuaa=_byte0_vwuz1 
    lda.z irq_flipper_top_line
    // BYTE0(irq_flipper_top_line)&0xf8
    // [175] irq_part1_top::$4 = irq_part1_top::$3 & $f8 -- vbuaa=vbuaa_band_vbuc1 
    and #$f8
    // *RASTER = BYTE0(irq_flipper_top_line)&0xf8
    // [176] *RASTER = irq_part1_top::$4 -- _deref_pbuc1=vbuaa 
    sta RASTER
    // *HARDWARE_IRQ = &irq_flipper_top
    // [177] *HARDWARE_IRQ = &irq_flipper_top -- _deref_qprc1=pprc2 
    lda #<irq_flipper_top
    sta HARDWARE_IRQ
    lda #>irq_flipper_top
    sta HARDWARE_IRQ+1
    // p1_work_ready = 1
    // [178] p1_work_ready = 1 -- vbuz1=vbuc1 
    // Signal main routine to play music    
    lda #1
    sta.z p1_work_ready
    // *IRQ_STATUS = IRQ_RASTER
    // [179] *IRQ_STATUS = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Acknowledge the IRQ
    lda #IRQ_RASTER
    sta IRQ_STATUS
    // irq_part1_top::@return
    // }
    // [180] return 
    // interrupt(isr_hardware_clobber_exit) -- isr_hardware_all_exit 
  rega:
    lda #0
    rti
    // irq_part1_top::@1
  __b1:
    // *VICII_CONTROL1 |= 0x80
    // [181] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    lda #$80
    ora VICII_CONTROL1
    sta VICII_CONTROL1
    jmp __b2
}
.segment Code
  // main
main: {
    // demo_init()
    // [183] call demo_init
  // Initialize the demo - start the IRQ
    // [272] phi from main to demo_init [phi:main->demo_init]
    jsr demo_init
    // main::@7
    // byteboozer_decrunch(DEMO_MUSIC_CRUNCHED)
    // [184] byteboozer_decrunch::crunched = DEMO_MUSIC_CRUNCHED -- pbuz1=pbuc1 
    lda #<DEMO_MUSIC_CRUNCHED
    sta.z byteboozer_decrunch.crunched
    lda #>DEMO_MUSIC_CRUNCHED
    sta.z byteboozer_decrunch.crunched+1
    // [185] call byteboozer_decrunch
    // Decrunch music
    jsr byteboozer_decrunch
    // main::@8
    // asm
    // asm { lda#0  }
    // Init music
    lda #0
    // (*musicInit)()
    // [187] callexecute *musicInit  -- call__deref_pprc1 
    jsr musicInit
    // [188] phi from main::@8 to main::@1 [phi:main::@8->main::@1]
    // main::@1
    // demo_start()
    // [189] call demo_start
  // Initialize the demo - start the IRQ
    // [282] phi from main::@1 to demo_start [phi:main::@1->demo_start]
    jsr demo_start
    // [190] phi from main::@1 to main::@9 [phi:main::@1->main::@9]
    // main::@9
    // part1_init()
    // [191] call part1_init
    // Initialize Part 1 (Revealing "Happy New Year" logo)
    jsr part1_init
  // Start part 1 at 0:04,5
    // main::@2
  __b2:
    // while(demo_frame_count<5*50)
    // [192] if(demo_frame_count<5*$32) goto main::@2 -- vwuz1_lt_vbuc1_then_la1 
    lda.z demo_frame_count+1
    bne !+
    lda.z demo_frame_count
    cmp #5*$32
    bcc __b2
  !:
    // [193] phi from main::@2 to main::@3 [phi:main::@2->main::@3]
    // main::@3
    // part1_run()
    // [194] call part1_run
  // Run Part 1 (Revealing "Happy New Year" logo)
    // [317] phi from main::@3 to part1_run [phi:main::@3->part1_run]
    jsr part1_run
    // [195] phi from main::@3 to main::@10 [phi:main::@3->main::@10]
    // main::@10
    // part2_init()
    // [196] call part2_init
    // Initialize part 2
    jsr part2_init
  // Wait for the right place to start part 2
    // main::@4
  __b4:
    // while(demo_frame_count<16*50)
    // [197] if(demo_frame_count<(unsigned int)$10*$32) goto main::@4 -- vwuz1_lt_vwuc1_then_la1 
    lda.z demo_frame_count+1
    cmp #>$10*$32
    bcc __b4
    bne !+
    lda.z demo_frame_count
    cmp #<$10*$32
    bcc __b4
  !:
    // main::@5
    // sparkler_active = 0
    // [198] sparkler_active = 0 -- vbuz1=vbuc1 
    // Disable sparkler
    lda #0
    sta.z sparkler_active
    // part2_run()
    // [199] call part2_run
  // Run part 2
    // [393] phi from main::@5 to part2_run [phi:main::@5->part2_run]
    jsr part2_run
    // [200] phi from main::@5 main::@6 to main::@6 [phi:main::@5/main::@6->main::@6]
    // main::@6
  __b6:
    jmp __b6
}
  // demo_work
// Work to be performed every frame while the demo runs
// Assumes that I/O is enabled
demo_work: {
    // demo_frame_count++;
    // [201] demo_frame_count = ++ demo_frame_count -- vwuz1=_inc_vwuz1 
    inc.z demo_frame_count
    bne !+
    inc.z demo_frame_count+1
  !:
    // (*musicPlay)()
    // [202] callexecute *musicPlay  -- call__deref_pprc1 
    // Play music
    jsr musicPlay
    // demo_work::@1
    // if(sparkler_active)
    // [203] if(0==sparkler_active) goto demo_work::@return -- 0_eq_vbuz1_then_la1 
    lda.z sparkler_active
    beq __breturn
    // [204] phi from demo_work::@1 to demo_work::@2 [phi:demo_work::@1->demo_work::@2]
    // demo_work::@2
    // sparkler_anim()
    // [205] call sparkler_anim
    jsr sparkler_anim
    // demo_work::@return
  __breturn:
    // }
    // [206] return 
    rts
}
.segment CodePart2
  // plexBucketShow
// Show the sprites in a specific bucket
// - bucket: The bucket to show
// void plexBucketShow(__zp(2) struct BucketSprite *bucket)
plexBucketShow: {
    .label i = $3b
    .label bucket = 2
    // char real_idx = plex_real_sprite_idx*2
    // [208] plexBucketShow::real_idx#0 = plex_real_sprite_idx << 1 -- vbuxx=vbuz1_rol_1 
    lda.z plex_real_sprite_idx
    asl
    tax
    // [209] phi from plexBucketShow to plexBucketShow::@1 [phi:plexBucketShow->plexBucketShow::@1]
    // [209] phi plexBucketShow::real_idx#4 = plexBucketShow::real_idx#0 [phi:plexBucketShow->plexBucketShow::@1#0] -- register_copy 
    // [209] phi plexBucketShow::i#3 = 0 [phi:plexBucketShow->plexBucketShow::@1#1] -- vbuyy=vbuc1 
    ldy #0
    // plexBucketShow::@1
  __b1:
    // while(bucket_ptr[i])
    // [210] if(0!=((char *)plexBucketShow::bucket#2)[plexBucketShow::i#3]) goto plexBucketShow::@2 -- 0_neq_pbuz1_derefidx_vbuyy_then_la1 
    lda (bucket),y
    cmp #0
    bne __b2
    // [211] phi from plexBucketShow::@1 plexBucketShow::@4 to plexBucketShow::@5 [phi:plexBucketShow::@1/plexBucketShow::@4->plexBucketShow::@5]
    // [211] phi plexBucketShow::real_idx#8 = plexBucketShow::real_idx#4 [phi:plexBucketShow::@1/plexBucketShow::@4->plexBucketShow::@5#0] -- register_copy 
    // plexBucketShow::@5
  __b5:
    // real_idx/2
    // [212] plexBucketShow::$1 = plexBucketShow::real_idx#8 >> 1 -- vbuaa=vbuxx_ror_1 
    txa
    lsr
    // plex_real_sprite_idx = real_idx/2
    // [213] plex_real_sprite_idx = plexBucketShow::$1 -- vbuz1=vbuaa 
    sta.z plex_real_sprite_idx
    // plexBucketShow::@return
    // }
    // [214] return 
    rts
    // plexBucketShow::@2
  __b2:
    // SPRITES_YPOS[real_idx] = bucket_ptr[i++]
    // [215] SPRITES_YPOS[plexBucketShow::real_idx#4] = ((char *)plexBucketShow::bucket#2)[plexBucketShow::i#3] -- pbuc1_derefidx_vbuxx=pbuz1_derefidx_vbuyy 
    lda (bucket),y
    sta SPRITES_YPOS,x
    // SPRITES_YPOS[real_idx] = bucket_ptr[i++];
    // [216] plexBucketShow::i#1 = ++ plexBucketShow::i#3 -- vbuz1=_inc_vbuyy 
    iny
    sty.z i
    // char plex_id = bucket_ptr[i]
    // [217] plexBucketShow::plex_id#0 = ((char *)plexBucketShow::bucket#2)[plexBucketShow::i#1] -- vbuyy=pbuz1_derefidx_vbuz2 
    lda (bucket),y
    tay
    // SPRITES_XPOS[real_idx] = PLEX_XPOS[plex_id]
    // [218] SPRITES_XPOS[plexBucketShow::real_idx#4] = PLEX_XPOS[plexBucketShow::plex_id#0] -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuyy 
    lda PLEX_XPOS,y
    sta SPRITES_XPOS,x
    // real_idx /= 2
    // [219] plexBucketShow::real_idx#1 = plexBucketShow::real_idx#4 >> 1 -- vbuxx=vbuxx_ror_1 
    txa
    lsr
    tax
    // if(PLEX_XPOS_MSB[plex_id])
    // [220] if(0!=PLEX_XPOS_MSB[plexBucketShow::plex_id#0]) goto plexBucketShow::@3 -- 0_neq_pbuc1_derefidx_vbuyy_then_la1 
    lda PLEX_XPOS_MSB,y
    cmp #0
    bne __b3
    // plexBucketShow::@6
    // *SPRITES_XMSB &= MSB_CLEAR_MASK_BY_ID[real_idx]
    // [221] *SPRITES_XMSB = *SPRITES_XMSB & plexBucketShow::MSB_CLEAR_MASK_BY_ID[plexBucketShow::real_idx#1] -- _deref_pbuc1=_deref_pbuc1_band_pbuc2_derefidx_vbuxx 
    lda SPRITES_XMSB
    and MSB_CLEAR_MASK_BY_ID,x
    sta SPRITES_XMSB
    // plexBucketShow::@4
  __b4:
    // SCREEN_SPRITE_PTRS[real_idx] = PLEX_PTR[plex_id]
    // [222] SCREEN_SPRITE_PTRS[plexBucketShow::real_idx#1] = PLEX_PTR[plexBucketShow::plex_id#0] -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuyy 
    lda PLEX_PTR,y
    sta SCREEN_SPRITE_PTRS,x
    // real_idx+1
    // [223] plexBucketShow::$2 = plexBucketShow::real_idx#1 + 1 -- vbuaa=vbuxx_plus_1 
    inx
    txa
    // real_idx = (real_idx+1)&7
    // [224] plexBucketShow::real_idx#2 = plexBucketShow::$2 & 7 -- vbuaa=vbuaa_band_vbuc1 
    and #7
    // real_idx *= 2
    // [225] plexBucketShow::real_idx#3 = plexBucketShow::real_idx#2 << 1 -- vbuxx=vbuaa_rol_1 
    asl
    tax
    // i++;
    // [226] plexBucketShow::i#2 = ++ plexBucketShow::i#1 -- vbuyy=_inc_vbuz1 
    ldy.z i
    iny
    // if(i==BUCKET_SIZE*sizeof(struct BucketSprite))
    // [227] if(plexBucketShow::i#2==8*SIZEOF_STRUCT_BUCKETSPRITE) goto plexBucketShow::@5 -- vbuyy_eq_vbuc1_then_la1 
    cpy #8*SIZEOF_STRUCT_BUCKETSPRITE
    beq __b5
    // [209] phi from plexBucketShow::@4 to plexBucketShow::@1 [phi:plexBucketShow::@4->plexBucketShow::@1]
    // [209] phi plexBucketShow::real_idx#4 = plexBucketShow::real_idx#3 [phi:plexBucketShow::@4->plexBucketShow::@1#0] -- register_copy 
    // [209] phi plexBucketShow::i#3 = plexBucketShow::i#2 [phi:plexBucketShow::@4->plexBucketShow::@1#1] -- register_copy 
    jmp __b1
    // plexBucketShow::@3
  __b3:
    // *SPRITES_XMSB |= MSB_SET_MASK_BY_ID[real_idx]
    // [228] *SPRITES_XMSB = *SPRITES_XMSB | plexBucketShow::MSB_SET_MASK_BY_ID[plexBucketShow::real_idx#1] -- _deref_pbuc1=_deref_pbuc1_bor_pbuc2_derefidx_vbuxx 
    lda SPRITES_XMSB
    ora MSB_SET_MASK_BY_ID,x
    sta SPRITES_XMSB
    jmp __b4
  .segment DataPart2
    // Masks used for MSB
    MSB_SET_MASK_BY_ID: .byte 1, 2, 4, 8, $10, $20, $40, $80
    MSB_CLEAR_MASK_BY_ID: .byte $fe, $fd, $fb, $f7, $ef, $df, $bf, $7f
}
.segment CodePart2
  // update_frame_plex_id_offset
// Update the plex_id's of a multiplexer frame to reflect a specific plex_id_offset
// void update_frame_plex_id_offset(__register(A) char plex_frame_id)
update_frame_plex_id_offset: {
    .label jmp_table = PLEX_ID_UPDATERS
    .label jmp_address = $3c
    // unsigned int jmp_address = jmp_table[plex_frame_id]
    // [229] update_frame_plex_id_offset::$0 = update_frame_plex_id_offset::plex_frame_id#0 << 1 -- vbuaa=vbuaa_rol_1 
    asl
    // [230] update_frame_plex_id_offset::jmp_address = update_frame_plex_id_offset::jmp_table[update_frame_plex_id_offset::$0] -- vwuz1=pwuc1_derefidx_vbuaa 
    tay
    lda jmp_table,y
    sta.z jmp_address
    lda jmp_table+1,y
    sta.z jmp_address+1
    // kickasm
    // kickasm( uses update_frame_plex_id_offset::jmp_address) {{ lda jmp_address         sta call+1         lda jmp_address+1         sta call+2         call: jsr $0000      }}
    lda jmp_address
        sta call+1
        lda jmp_address+1
        sta call+2
        call: jsr $0000
    
    // update_frame_plex_id_offset::@return
    // }
    // [232] return 
    rts
}
  // vsp_update_screen
// Update screen, colors and bitmap with a single column of new data
// - x_offset is the offset of the column to update (0-79)
// void vsp_update_screen(__zp($31) volatile char x_offset)
vsp_update_screen: {
    .label x_offset = $31
    .label x_offset8 = $40
    .label __5 = $3e
    // kickasm
    // kickasm( uses vsp_update_screen::x_offset uses PART2_SCREEN uses COLS uses LOGO_DATA uses LOGO_DATA_COLORS) {{ ldx x_offset         .for(var row=0;row<24;row++) {             lda LOGO_DATA+80*row,x             sta PART2_SCREEN+40*row,x             lda LOGO_DATA_COLORS+80*row,x             sta COLS+40*row,x         }      }}
    // Update screen and colors
    ldx x_offset
        .for(var row=0;row<24;row++) {
            lda LOGO_DATA+80*row,x
            sta PART2_SCREEN+40*row,x
            lda LOGO_DATA_COLORS+80*row,x
            sta COLS+40*row,x
        }
    
    // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
    // [234] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Disable I/O (BITMAP is below I/O)
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // *PROCPORT = PROCPORT_RAM_ALL
    // [235] *PROCPORT = PROCPORT_RAM_ALL -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_ALL
    sta PROCPORT
    // unsigned int x_offset8 = (unsigned int)x_offset*8
    // [236] vsp_update_screen::$5 = (unsigned int)vsp_update_screen::x_offset -- vwuz1=_word_vbuz2 
    lda.z x_offset
    sta.z __5
    lda #0
    sta.z __5+1
    // [237] vsp_update_screen::x_offset8 = vsp_update_screen::$5 << 3 -- vwuz1=vwuz2_rol_3 
    // Update bitmap (using 3 routines to handle all bitmap columns)
    lda.z __5
    asl
    sta.z x_offset8
    lda.z __5+1
    rol
    sta.z x_offset8+1
    asl.z x_offset8
    rol.z x_offset8+1
    asl.z x_offset8
    rol.z x_offset8+1
    // BYTE1(x_offset8)
    // [238] vsp_update_screen::$1 = byte1  vsp_update_screen::x_offset8 -- vbuaa=_byte1_vwuz1 
    lda.z x_offset8+1
    // if(BYTE1(x_offset8) == 0)
    // [239] if(vsp_update_screen::$1==0) goto vsp_update_screen::@1 -- vbuaa_eq_0_then_la1 
    cmp #0
    bne !__b1+
    jmp __b1
  !__b1:
    // vsp_update_screen::@4
    // BYTE1(x_offset8)
    // [240] vsp_update_screen::$3 = byte1  vsp_update_screen::x_offset8 -- vbuaa=_byte1_vwuz1 
    // if(BYTE1(x_offset8) == 1)
    // [241] if(vsp_update_screen::$3==1) goto vsp_update_screen::@2 -- vbuaa_eq_vbuc1_then_la1 
    cmp #1
    bne !__b2+
    jmp __b2
  !__b2:
    // vsp_update_screen::@5
    // kickasm
    // kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset             ldy x_offset8             .for(var row=0;row<24;row++)                 .for(var pix=0;pix<8;pix++) {                     lda LOGO_DATA_BITMAP+80*(row*8+pix),x                     sta PART2_BITMAP+$200+row*40*8+pix,y                 }          }}
    // >x_offset8 == 2
    ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+$200+row*40*8+pix,y
                }
        
    // vsp_update_screen::@3
  __b3:
    // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
    // [243] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // *PROCPORT = PROCPORT_RAM_IO
    // [244] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_IO
    sta PROCPORT
    // vsp_update_screen::@return
    // }
    // [245] return 
    rts
    // vsp_update_screen::@2
  __b2:
    // kickasm
    // kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset             ldy x_offset8             .for(var row=0;row<24;row++)                 .for(var pix=0;pix<8;pix++) {                     lda LOGO_DATA_BITMAP+80*(row*8+pix),x                     sta PART2_BITMAP+$100+row*40*8+pix,y                 }          }}
    ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+$100+row*40*8+pix,y
                }
        
    jmp __b3
    // vsp_update_screen::@1
  __b1:
    // kickasm( uses vsp_update_screen::x_offset uses vsp_update_screen::x_offset8 uses PART2_BITMAP uses LOGO_DATA_BITMAP) {{ ldx x_offset             ldy x_offset8             .for(var row=0;row<24;row++)                 .for(var pix=0;pix<8;pix++) {                     lda LOGO_DATA_BITMAP+80*(row*8+pix),x                     sta PART2_BITMAP+row*40*8+pix,y                 }          }}
    ldx x_offset
            ldy x_offset8
            .for(var row=0;row<24;row++)
                .for(var pix=0;pix<8;pix++) {
                    lda LOGO_DATA_BITMAP+80*(row*8+pix),x
                    sta PART2_BITMAP+row*40*8+pix,y
                }
        
    jmp __b3
}
  // plex_scroller_move
// Scroll the plex sprites to the left.
plex_scroller_move: {
    .const toSpritePtr1_return = $ff&PART2_SPRITES/$40
    .label s = $2f
    // char x_idx = x_movement_idx
    // [248] plex_scroller_move::x_idx#0 = x_movement_idx -- vbuxx=vbuz1 
    ldx.z x_movement_idx
    // [249] phi from plex_scroller_move to plex_scroller_move::@1 [phi:plex_scroller_move->plex_scroller_move::@1]
    // [249] phi plex_scroller_move::x_idx#10 = plex_scroller_move::x_idx#0 [phi:plex_scroller_move->plex_scroller_move::@1#0] -- register_copy 
    // [249] phi plex_scroller_move::s#10 = 0 [phi:plex_scroller_move->plex_scroller_move::@1#1] -- vbuz1=vbuc1 
    lda #0
    sta.z s
    // plex_scroller_move::@1
  __b1:
    // for(char s=0; s<PLEX_COUNT;s++)
    // [250] if(plex_scroller_move::s#10<$20) goto plex_scroller_move::@2 -- vbuz1_lt_vbuc1_then_la1 
    lda.z s
    cmp #$20
    bcc __b2
    // plex_scroller_move::@3
    // x_movement_idx++;
    // [251] x_movement_idx = ++ x_movement_idx -- vbuz1=_inc_vbuz1 
    inc.z x_movement_idx
    // plex_scroller_move::@return
    // }
    // [252] return 
    rts
    // plex_scroller_move::@2
  __b2:
    // PLEX_XPOS[s] = XMOVEMENT[x_idx]
    // [253] PLEX_XPOS[plex_scroller_move::s#10] = XMOVEMENT[plex_scroller_move::x_idx#10] -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuxx 
    lda XMOVEMENT,x
    ldy.z s
    sta PLEX_XPOS,y
    // PLEX_XPOS_MSB[s] = XMOVEMENT_HI[x_idx]
    // [254] PLEX_XPOS_MSB[plex_scroller_move::s#10] = XMOVEMENT_HI[plex_scroller_move::x_idx#10] -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuxx 
    lda XMOVEMENT_HI,x
    sta PLEX_XPOS_MSB,y
    // if(x_idx==0)
    // [255] if(plex_scroller_move::x_idx#10!=0) goto plex_scroller_move::@4 -- vbuxx_neq_0_then_la1 
    cpx #0
    bne __b4
    // plex_scroller_move::@7
    // if(*scroll_text_next==0x00)
    // [256] if(*scroll_text_next!=0) goto plex_scroller_move::@5 -- _deref_pbuz1_neq_0_then_la1 
    ldy #0
    lda (scroll_text_next),y
    cmp #0
    bne __b5
    // plex_scroller_move::@8
    // scroll_text_next = SCROLL_TEXT
    // [257] scroll_text_next = SCROLL_TEXT -- pbuz1=pbuc1 
    lda #<SCROLL_TEXT
    sta.z scroll_text_next
    lda #>SCROLL_TEXT
    sta.z scroll_text_next+1
    // plex_scroller_move::@5
  __b5:
    // char letter = *scroll_text_next++
    // [258] plex_scroller_move::letter#0 = *scroll_text_next -- vbuaa=_deref_pbuz1 
    // Read next char from the scroll text
    ldy #0
    lda (scroll_text_next),y
    // [259] scroll_text_next = ++ scroll_text_next -- pbuz1=_inc_pbuz1 
    inc.z scroll_text_next
    bne !+
    inc.z scroll_text_next+1
  !:
    // if(letter==0xff)
    // [260] if(plex_scroller_move::letter#0!=$ff) goto plex_scroller_move::@10 -- vbuaa_neq_vbuc1_then_la1 
    cmp #$ff
    bne __b9
    // [262] phi from plex_scroller_move::@5 to plex_scroller_move::@6 [phi:plex_scroller_move::@5->plex_scroller_move::@6]
    // [262] phi plex_scroller_move::letter#2 = 0 [phi:plex_scroller_move::@5->plex_scroller_move::@6#0] -- vbuaa=vbuc1 
    lda #0
    // [261] phi from plex_scroller_move::@5 to plex_scroller_move::@10 [phi:plex_scroller_move::@5->plex_scroller_move::@10]
    // plex_scroller_move::@10
    // [262] phi from plex_scroller_move::@10 to plex_scroller_move::@6 [phi:plex_scroller_move::@10->plex_scroller_move::@6]
    // [262] phi plex_scroller_move::letter#2 = plex_scroller_move::letter#0 [phi:plex_scroller_move::@10->plex_scroller_move::@6#0] -- register_copy 
    // plex_scroller_move::@6
    // [263] phi from plex_scroller_move::@6 to plex_scroller_move::toSpritePtr1 [phi:plex_scroller_move::@6->plex_scroller_move::toSpritePtr1]
    // plex_scroller_move::toSpritePtr1
    // plex_scroller_move::@9
  __b9:
    // SPRITE_0+letter
    // [264] plex_scroller_move::$8 = plex_scroller_move::toSpritePtr1_return#0 + plex_scroller_move::letter#2 -- vbuaa=vbuc1_plus_vbuaa 
    clc
    adc #toSpritePtr1_return
    // PLEX_PTR[s] = SPRITE_0+letter
    // [265] PLEX_PTR[plex_scroller_move::s#10] = plex_scroller_move::$8 -- pbuc1_derefidx_vbuz1=vbuaa 
    // Add the letter
    ldy.z s
    sta PLEX_PTR,y
    // plex_scroller_move::@4
  __b4:
    // x_idx +=8
    // [266] plex_scroller_move::x_idx#1 = plex_scroller_move::x_idx#10 + 8 -- vbuxx=vbuxx_plus_vbuc1 
    txa
    axs #-[8]
    // for(char s=0; s<PLEX_COUNT;s++)
    // [267] plex_scroller_move::s#1 = ++ plex_scroller_move::s#10 -- vbuz1=_inc_vbuz1 
    inc.z s
    // [249] phi from plex_scroller_move::@4 to plex_scroller_move::@1 [phi:plex_scroller_move::@4->plex_scroller_move::@1]
    // [249] phi plex_scroller_move::x_idx#10 = plex_scroller_move::x_idx#1 [phi:plex_scroller_move::@4->plex_scroller_move::@1#0] -- register_copy 
    // [249] phi plex_scroller_move::s#10 = plex_scroller_move::s#1 [phi:plex_scroller_move::@4->plex_scroller_move::@1#1] -- register_copy 
    jmp __b1
}
  // plexFrameStart
// Start a new frame (initializing data structures)
plexFrameStart: {
    // plex_real_sprite_idx = 0
    // [268] plex_real_sprite_idx = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z plex_real_sprite_idx
    // plexFrameStart::@return
    // }
    // [269] return 
    rts
}
.segment CodePart1
  // raster_fine
// Waits until at the exact start of raster line 
// Excepts to start at a line divisible by 8 (0x00, 0x08, x010, ...). 
// Waits line_offset (0-7) additional lines.
// void raster_fine(__zp($32) volatile char line_offset)
raster_fine: {
    .label line_offset = $32
    // kickasm
    // kickasm( uses raster_fine::line_offset uses RASTER_BADLINES) {{ jmp aligned         .align $100     aligned:         ldy RASTER         ldx line_offset         inx     rst:         nop          nop          nop          nop         dex                             // 2         beq done                        // 2         lda RASTER_BADLINES,y           // 4         beq notbad                      // 3     bad:         nop                             // 2         nop          nop          nop          nop         dex                                      beq done                                 iny                                      nop                                      bit $ea                              notbad:         .fill 18, NOP         bit $ea         iny                                      jmp rst                              done:      }}
    jmp aligned
        .align $100
    aligned:
        ldy RASTER
        ldx line_offset
        inx
    rst:
        nop 
        nop 
        nop 
        nop
        dex                             // 2
        beq done                        // 2
        lda RASTER_BADLINES,y           // 4
        beq notbad                      // 3
    bad:
        nop                             // 2
        nop 
        nop 
        nop 
        nop
        dex                             
        beq done                        
        iny                             
        nop                             
        bit $ea                         
    notbad:
        .fill 18, NOP
        bit $ea
        iny                             
        jmp rst                         
    done:
    
    // raster_fine::@return
    // }
    // [271] return 
    rts
}
.segment Code
  // demo_init
// Initialize demo code. 
// Can be called multiple times!
// Setting IRQ to the "demo" IRQ running outside the parts and 
// Setting memory to IO + RAM (no kernal/basic)
demo_init: {
    // demo_init::SEI1
    // asm
    // asm { sei  }
    sei
    // demo_init::@1
    // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
    // [274] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Disable kernal & basic
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // *PROCPORT = PROCPORT_RAM_IO
    // [275] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_IO
    sta PROCPORT
    // CIA1->INTERRUPT = CIA_INTERRUPT_CLEAR
    // [276] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR -- _deref_pbuc1=vbuc2 
    // Disable CIA 1 Timer IRQ
    lda #CIA_INTERRUPT_CLEAR
    sta CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT
    // asm
    // asm { ldaCIA1_INTERRUPT  }
    // Acknowledge any timer IRQ
    lda CIA1_INTERRUPT
    // *IRQ_STATUS = 0x0f
    // [278] *IRQ_STATUS = $f -- _deref_pbuc1=vbuc2 
    // Acknowledge any VIC IRQ
    lda #$f
    sta IRQ_STATUS
    // demo_init::@return
    // }
    // [279] return 
    rts
}
  // byteboozer_decrunch
// Decrunch crunched data using ByteBoozer
// - crunched: Pointer to the start of the crunched data
// void byteboozer_decrunch(__zp($39) char * volatile crunched)
byteboozer_decrunch: {
    .label crunched = $39
    // asm
    // asm { ldycrunched ldxcrunched+1 jsrb2.Decrunch  }
    ldy crunched
    ldx crunched+1
    jsr b2.Decrunch
    // byteboozer_decrunch::@return
    // }
    // [281] return 
    rts
}
  // demo_start
// Start the demo IRQ. Can be called multiple times!
// Setting IRQ to the "demo" IRQ running outside the parts and 
// Setting memory to IO + RAM (no kernal/basic)
demo_start: {
    // demo_init()
    // [283] call demo_init
    // [272] phi from demo_start to demo_init [phi:demo_start->demo_init]
    jsr demo_init
    // demo_start::@1
    // *VICII_CONTROL1 &= 0x7f
    // [284] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2 
    // Set raster line to 0x00
    lda #$7f
    and VICII_CONTROL1
    sta VICII_CONTROL1
    // *RASTER = 0
    // [285] *RASTER = 0 -- _deref_pbuc1=vbuc2 
    lda #0
    sta RASTER
    // *HARDWARE_IRQ = &irq_demo
    // [286] *HARDWARE_IRQ = &irq_demo -- _deref_qprc1=pprc2 
    // Set the IRQ routine
    lda #<irq_demo
    sta HARDWARE_IRQ
    lda #>irq_demo
    sta HARDWARE_IRQ+1
    // *IRQ_ENABLE = IRQ_RASTER
    // [287] *IRQ_ENABLE = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Enable Raster Interrupt
    lda #IRQ_RASTER
    sta IRQ_ENABLE
    // demo_start::CLI1
    // asm
    // asm { cli  }
    cli
    // demo_start::@return
    // }
    // [289] return 
    rts
}
.segment CodePart1
  // part1_init
part1_init: {
    // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
    // [290] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Disable IO
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // *PROCPORT = PROCPORT_RAM_ALL
    // [291] *PROCPORT = PROCPORT_RAM_ALL -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_ALL
    sta PROCPORT
    // byteboozer_decrunch(P1_PIXELS_CRUNCHED)
    // [292] byteboozer_decrunch::crunched = P1_PIXELS_CRUNCHED -- pbuz1=pbuc1 
    lda #<P1_PIXELS_CRUNCHED
    sta.z byteboozer_decrunch.crunched
    lda #>P1_PIXELS_CRUNCHED
    sta.z byteboozer_decrunch.crunched+1
    // [293] call byteboozer_decrunch
    // Decrunch pixels
    jsr byteboozer_decrunch
    // part1_init::@1
    // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
    // [294] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Enable IO, Disable kernal & basic
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // *PROCPORT = PROCPORT_RAM_IO
    // [295] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_IO
    sta PROCPORT
    // byteboozer_decrunch(P1_SCREEN_CRUNCHED)
    // [296] byteboozer_decrunch::crunched = P1_SCREEN_CRUNCHED -- pbuz1=pbuc1 
    lda #<P1_SCREEN_CRUNCHED
    sta.z byteboozer_decrunch.crunched
    lda #>P1_SCREEN_CRUNCHED
    sta.z byteboozer_decrunch.crunched+1
    // [297] call byteboozer_decrunch
    // Decrunch screen
    jsr byteboozer_decrunch
    // part1_init::@2
    // byteboozer_decrunch(P1_COLORS_CRUNCHED)
    // [298] byteboozer_decrunch::crunched = P1_COLORS_CRUNCHED -- pbuz1=pbuc1 
    lda #<P1_COLORS_CRUNCHED
    sta.z byteboozer_decrunch.crunched
    lda #>P1_COLORS_CRUNCHED
    sta.z byteboozer_decrunch.crunched+1
    // [299] call byteboozer_decrunch
    // Decrunch colors
    jsr byteboozer_decrunch
    // part1_init::@3
    // byteboozer_decrunch(P1_SPRITES_CRUNCHED)
    // [300] byteboozer_decrunch::crunched = P1_SPRITES_CRUNCHED -- pbuz1=pbuc1 
    lda #<P1_SPRITES_CRUNCHED
    sta.z byteboozer_decrunch.crunched
    lda #>P1_SPRITES_CRUNCHED
    sta.z byteboozer_decrunch.crunched+1
    // [301] call byteboozer_decrunch
    // Decrunch sprites
    jsr byteboozer_decrunch
    // part1_init::@4
    // byteboozer_decrunch(FLIPPER_EASING_CRUNCHED)
    // [302] byteboozer_decrunch::crunched = FLIPPER_EASING_CRUNCHED -- pbuz1=pbuc1 
    lda #<FLIPPER_EASING_CRUNCHED
    sta.z byteboozer_decrunch.crunched
    lda #>FLIPPER_EASING_CRUNCHED
    sta.z byteboozer_decrunch.crunched+1
    // [303] call byteboozer_decrunch
    // Decrunch flipper sine table
    jsr byteboozer_decrunch
    // [304] phi from part1_init::@4 to part1_init::@5 [phi:part1_init::@4->part1_init::@5]
    // part1_init::@5
    // init_rasters()
    // [305] call init_rasters
  // Initialize the badlines
    // [424] phi from part1_init::@5 to init_rasters [phi:part1_init::@5->init_rasters]
    jsr init_rasters
    // [306] phi from part1_init::@5 to part1_init::@6 [phi:part1_init::@5->part1_init::@6]
    // part1_init::@6
    // memset(PIXELS_EMPTY, 0x00, 0x800)
    // [307] call memset
  // Fill some empty pixels
    // [435] phi from part1_init::@6 to memset [phi:part1_init::@6->memset]
    // [435] phi memset::c#7 = 0 [phi:part1_init::@6->memset#0] -- vbuxx=vbuc1 
    ldx #0
    // [435] phi memset::str#6 = (void *)PIXELS_EMPTY [phi:part1_init::@6->memset#1] -- pvoz1=pvoc1 
    lda #<PIXELS_EMPTY
    sta.z memset.str
    lda #>PIXELS_EMPTY
    sta.z memset.str+1
    // [435] phi memset::num#5 = $800 [phi:part1_init::@6->memset#2] -- vwuz1=vwuc1 
    lda #<$800
    sta.z memset.num
    lda #>$800
    sta.z memset.num+1
    jsr memset
    // part1_init::@7
    // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
    // [308] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Enable CHARGEN, Disable kernal & basic
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // *PROCPORT = PROCPORT_RAM_CHARROM
    // [309] *PROCPORT = PROCPORT_RAM_CHARROM -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_CHARROM
    sta PROCPORT
    // memcpy(LOAD_CHARSET, CHARGEN, 0x800)
    // [310] call memcpy
    // [444] phi from part1_init::@7 to memcpy [phi:part1_init::@7->memcpy]
    // [444] phi memcpy::num#6 = $800 [phi:part1_init::@7->memcpy#0] -- vwuz1=vwuc1 
    lda #<$800
    sta.z memcpy.num
    lda #>$800
    sta.z memcpy.num+1
    // [444] phi memcpy::destination#6 = (void *)LOAD_CHARSET [phi:part1_init::@7->memcpy#1] -- pvoz1=pvoc1 
    lda #<LOAD_CHARSET
    sta.z memcpy.destination
    lda #>LOAD_CHARSET
    sta.z memcpy.destination+1
    // [444] phi memcpy::source#6 = (void *)CHARGEN [phi:part1_init::@7->memcpy#2] -- pvoz1=pvoc1 
    lda #<CHARGEN
    sta.z memcpy.source
    lda #>CHARGEN
    sta.z memcpy.source+1
    jsr memcpy
    // part1_init::@8
    // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
    // [311] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Enable IO, Disable kernal & basic
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // *PROCPORT = PROCPORT_RAM_IO
    // [312] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_IO
    sta PROCPORT
    // memcpy(LOAD_SCREEN, DEFAULT_SCREEN, 0x0400)
    // [313] call memcpy
  // Copy loading screen 
    // [444] phi from part1_init::@8 to memcpy [phi:part1_init::@8->memcpy]
    // [444] phi memcpy::num#6 = $400 [phi:part1_init::@8->memcpy#0] -- vwuz1=vwuc1 
    lda #<$400
    sta.z memcpy.num
    lda #>$400
    sta.z memcpy.num+1
    // [444] phi memcpy::destination#6 = (void *)LOAD_SCREEN [phi:part1_init::@8->memcpy#1] -- pvoz1=pvoc1 
    lda #<LOAD_SCREEN
    sta.z memcpy.destination
    lda #>LOAD_SCREEN
    sta.z memcpy.destination+1
    // [444] phi memcpy::source#6 = (void *)DEFAULT_SCREEN [phi:part1_init::@8->memcpy#2] -- pvoz1=pvoc1 
    lda #<DEFAULT_SCREEN
    sta.z memcpy.source
    lda #>DEFAULT_SCREEN
    sta.z memcpy.source+1
    jsr memcpy
    // [314] phi from part1_init::@8 to part1_init::@9 [phi:part1_init::@8->part1_init::@9]
    // part1_init::@9
    // memcpy(LOAD_COLORS, COLS, 1000)
    // [315] call memcpy
  // Copy loading  colors
    // [444] phi from part1_init::@9 to memcpy [phi:part1_init::@9->memcpy]
    // [444] phi memcpy::num#6 = $3e8 [phi:part1_init::@9->memcpy#0] -- vwuz1=vwuc1 
    lda #<$3e8
    sta.z memcpy.num
    lda #>$3e8
    sta.z memcpy.num+1
    // [444] phi memcpy::destination#6 = (void *)LOAD_COLORS [phi:part1_init::@9->memcpy#1] -- pvoz1=pvoc1 
    lda #<LOAD_COLORS
    sta.z memcpy.destination
    lda #>LOAD_COLORS
    sta.z memcpy.destination+1
    // [444] phi memcpy::source#6 = (void *)COLS [phi:part1_init::@9->memcpy#2] -- pvoz1=pvoc1 
    lda #<COLS
    sta.z memcpy.source
    lda #>COLS
    sta.z memcpy.source+1
    jsr memcpy
    // part1_init::@return
    // }
    // [316] return 
    rts
}
  // part1_run
part1_run: {
    .const toSpritePtr1_return = $ff&P1_SPRITES/$40
    // part1_run::SEI1
    // asm
    // asm { sei  }
    sei
    // part1_run::@1
    // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
    // [319] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Disable kernal & basic
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // *PROCPORT = PROCPORT_RAM_IO
    // [320] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_IO
    sta PROCPORT
    // CIA1->INTERRUPT = CIA_INTERRUPT_CLEAR
    // [321] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR -- _deref_pbuc1=vbuc2 
    // Disable CIA 1 Timer IRQ
    lda #CIA_INTERRUPT_CLEAR
    sta CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT
    // asm
    // asm { ldaCIA1_INTERRUPT  }
    // Acknowledge any timer IRQ
    lda CIA1_INTERRUPT
    // *IRQ_STATUS = 0x0f
    // [323] *IRQ_STATUS = $f -- _deref_pbuc1=vbuc2 
    // Acknowledge any VIC IRQ
    lda #$f
    sta IRQ_STATUS
    // *VICII_CONTROL1 |= 0x80
    // [324] *VICII_CONTROL1 = *VICII_CONTROL1 | $80 -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    // Set raster line to 0x136
    lda #$80
    ora VICII_CONTROL1
    sta VICII_CONTROL1
    // *RASTER = IRQ_PART1_TOP_LINE
    // [325] *RASTER = IRQ_PART1_TOP_LINE -- _deref_pbuc1=vbuc2 
    lda #IRQ_PART1_TOP_LINE
    sta RASTER
    // *HARDWARE_IRQ = &irq_part1_top
    // [326] *HARDWARE_IRQ = &irq_part1_top -- _deref_qprc1=pprc2 
    // Set the IRQ routine
    lda #<irq_part1_top
    sta HARDWARE_IRQ
    lda #>irq_part1_top
    sta HARDWARE_IRQ+1
    // *IRQ_ENABLE = IRQ_RASTER
    // [327] *IRQ_ENABLE = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Enable Raster Interrupt
    lda #IRQ_RASTER
    sta IRQ_ENABLE
    // VICII->SPRITES_MC = 0x01
    // [328] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = 1 -- _deref_pbuc1=vbuc2 
    // Show Sparkler 
    lda #1
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC
    // VICII->SPRITE0_COLOR = PINK
    // [329] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR) = PINK -- _deref_pbuc1=vbuc2 
    lda #PINK
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR
    // VICII->SPRITES_MCOLOR1 = YELLOW
    // [330] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1) = YELLOW -- _deref_pbuc1=vbuc2 
    lda #YELLOW
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1
    // VICII->SPRITES_MCOLOR2 = PURPLE
    // [331] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2) = PURPLE -- _deref_pbuc1=vbuc2 
    lda #PURPLE
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2
    // VICII->SPRITES_XMSB = 0x01
    // [332] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = 1 -- _deref_pbuc1=vbuc2 
    lda #1
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB
    // VICII->SPRITE0_X = 22
    // [333] *((char *)VICII) = $16 -- _deref_pbuc1=vbuc2 
    // 262
    lda #$16
    sta VICII
    // VICII->SPRITE0_Y = 190
    // [334] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_Y) = $be -- _deref_pbuc1=vbuc2 
    // 262
    lda #$be
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_Y
    // [335] phi from part1_run::@1 to part1_run::toSpritePtr1 [phi:part1_run::@1->part1_run::toSpritePtr1]
    // part1_run::toSpritePtr1
    // part1_run::@2
    // P1_SCREEN_SPRITE_PTRS[0] = toSpritePtr(P1_SPRITES)
    // [336] *P1_SCREEN_SPRITE_PTRS = part1_run::toSpritePtr1_return#0 -- _deref_pbuc1=vbuc2 
    // 144
    lda #toSpritePtr1_return
    sta P1_SCREEN_SPRITE_PTRS
    // part1_run::CLI1
    // asm
    // asm { cli  }
    cli
    // [338] phi from part1_run::CLI1 to part1_run::@3 [phi:part1_run::CLI1->part1_run::@3]
    // part1_run::@3
    // part1_loop()
    // [339] call part1_loop
    jsr part1_loop
    // part1_run::@return
    // }
    // [340] return 
    rts
}
.segment CodePart2
  // part2_init
part2_init: {
    .const toSpritePtr1_return = $ff&PART2_SPRITES/$40
    // Prepare 8 frames of y-positions into BUCKET_SPRITES
    .label frame = $46
    .label frame_idx = 4
    // byteboozer_decrunch(SPRITES_CRUNCHED)
    // [341] byteboozer_decrunch::crunched = SPRITES_CRUNCHED -- pbuz1=pbuc1 
    lda #<SPRITES_CRUNCHED
    sta.z byteboozer_decrunch.crunched
    lda #>SPRITES_CRUNCHED
    sta.z byteboozer_decrunch.crunched+1
    // [342] call byteboozer_decrunch
    // Decrunch sprites
    jsr byteboozer_decrunch
    // [343] phi from part2_init to part2_init::@13 [phi:part2_init->part2_init::@13]
    // part2_init::@13
    // memcpy(LOGO_DATA_CRUNCHED2, LOGO_DATA_CRUNCHED, LOGO_DATA_CRUNCHED_SIZE)
    // [344] call memcpy
  // Move the crunched logo data out of harms way
    // [444] phi from part2_init::@13 to memcpy [phi:part2_init::@13->memcpy]
    // [444] phi memcpy::num#6 = LOGO_DATA_CRUNCHED_SIZE [phi:part2_init::@13->memcpy#0] -- vwuz1=vwuc1 
    lda #<LOGO_DATA_CRUNCHED_SIZE
    sta.z memcpy.num
    lda #>LOGO_DATA_CRUNCHED_SIZE
    sta.z memcpy.num+1
    // [444] phi memcpy::destination#6 = (void *)LOGO_DATA_CRUNCHED2 [phi:part2_init::@13->memcpy#1] -- pvoz1=pvoc1 
    lda #<LOGO_DATA_CRUNCHED2
    sta.z memcpy.destination
    lda #>LOGO_DATA_CRUNCHED2
    sta.z memcpy.destination+1
    // [444] phi memcpy::source#6 = (void *)LOGO_DATA_CRUNCHED [phi:part2_init::@13->memcpy#2] -- pvoz1=pvoc1 
    lda #<LOGO_DATA_CRUNCHED
    sta.z memcpy.source
    lda #>LOGO_DATA_CRUNCHED
    sta.z memcpy.source+1
    jsr memcpy
    // [345] phi from part2_init::@13 to part2_init::@14 [phi:part2_init::@13->part2_init::@14]
    // part2_init::@14
    // memcpy(PLEX_ID_UPDATERS_CRUNCHED2, PLEX_ID_UPDATERS_CRUNCHED, PLEX_ID_UPDATERS_CRUNCHED_SIZE)
    // [346] call memcpy
  // Move the crunched plex updaters out of harms way
    // [444] phi from part2_init::@14 to memcpy [phi:part2_init::@14->memcpy]
    // [444] phi memcpy::num#6 = PLEX_ID_UPDATERS_CRUNCHED_SIZE [phi:part2_init::@14->memcpy#0] -- vwuz1=vwuc1 
    lda #<PLEX_ID_UPDATERS_CRUNCHED_SIZE
    sta.z memcpy.num
    lda #>PLEX_ID_UPDATERS_CRUNCHED_SIZE
    sta.z memcpy.num+1
    // [444] phi memcpy::destination#6 = (void *)PLEX_ID_UPDATERS_CRUNCHED2 [phi:part2_init::@14->memcpy#1] -- pvoz1=pvoc1 
    lda #<PLEX_ID_UPDATERS_CRUNCHED2
    sta.z memcpy.destination
    lda #>PLEX_ID_UPDATERS_CRUNCHED2
    sta.z memcpy.destination+1
    // [444] phi memcpy::source#6 = (void *)PLEX_ID_UPDATERS_CRUNCHED [phi:part2_init::@14->memcpy#2] -- pvoz1=pvoc1 
    lda #<PLEX_ID_UPDATERS_CRUNCHED
    sta.z memcpy.source
    lda #>PLEX_ID_UPDATERS_CRUNCHED
    sta.z memcpy.source+1
    jsr memcpy
    // part2_init::@15
    // byteboozer_decrunch(PLEX_ID_UPDATERS_CRUNCHED2)
    // [347] byteboozer_decrunch::crunched = PLEX_ID_UPDATERS_CRUNCHED2 -- pbuz1=pbuc1 
    lda #<PLEX_ID_UPDATERS_CRUNCHED2
    sta.z byteboozer_decrunch.crunched
    lda #>PLEX_ID_UPDATERS_CRUNCHED2
    sta.z byteboozer_decrunch.crunched+1
    // [348] call byteboozer_decrunch
    // Decrunch multiplexer frame updaters (from new location)
    jsr byteboozer_decrunch
    // part2_init::@16
    // byteboozer_decrunch(LOGO_DATA_CRUNCHED2)
    // [349] byteboozer_decrunch::crunched = LOGO_DATA_CRUNCHED2 -- pbuz1=pbuc1 
    lda #<LOGO_DATA_CRUNCHED2
    sta.z byteboozer_decrunch.crunched
    lda #>LOGO_DATA_CRUNCHED2
    sta.z byteboozer_decrunch.crunched+1
    // [350] call byteboozer_decrunch
    // Decrunch logo data
    jsr byteboozer_decrunch
    // part2_init::@17
    // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
    // [351] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    // Empty the hidden part of the bitmap   
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // *PROCPORT = PROCPORT_RAM_ALL
    // [352] *PROCPORT = PROCPORT_RAM_ALL -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_ALL
    sta PROCPORT
    // memset(PART2_BITMAP+8000, 0, 192)
    // [353] call memset
    // [435] phi from part2_init::@17 to memset [phi:part2_init::@17->memset]
    // [435] phi memset::c#7 = 0 [phi:part2_init::@17->memset#0] -- vbuxx=vbuc1 
    ldx #0
    // [435] phi memset::str#6 = (void *)PART2_BITMAP+$1f40 [phi:part2_init::@17->memset#1] -- pvoz1=pvoc1 
    lda #<PART2_BITMAP+$1f40
    sta.z memset.str
    lda #>PART2_BITMAP+$1f40
    sta.z memset.str+1
    // [435] phi memset::num#5 = $c0 [phi:part2_init::@17->memset#2] -- vwuz1=vbuc1 
    lda #<$c0
    sta.z memset.num
    lda #>$c0
    sta.z memset.num+1
    jsr memset
    // part2_init::@18
    // *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK
    // [354] *PROCPORT_DDR = PROCPORT_DDR_MEMORY_MASK -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_DDR_MEMORY_MASK
    sta PROCPORT_DDR
    // *PROCPORT = PROCPORT_RAM_IO
    // [355] *PROCPORT = PROCPORT_RAM_IO -- _deref_pbuc1=vbuc2 
    lda #PROCPORT_RAM_IO
    sta PROCPORT
    // memset(COLS, BLACK, 1024)
    // [356] call memset
  // Empty screen & cols
    // [435] phi from part2_init::@18 to memset [phi:part2_init::@18->memset]
    // [435] phi memset::c#7 = BLACK [phi:part2_init::@18->memset#0] -- vbuxx=vbuc1 
    ldx #BLACK
    // [435] phi memset::str#6 = (void *)COLS [phi:part2_init::@18->memset#1] -- pvoz1=pvoc1 
    lda #<COLS
    sta.z memset.str
    lda #>COLS
    sta.z memset.str+1
    // [435] phi memset::num#5 = $400 [phi:part2_init::@18->memset#2] -- vwuz1=vwuc1 
    lda #<$400
    sta.z memset.num
    lda #>$400
    sta.z memset.num+1
    jsr memset
    // [357] phi from part2_init::@18 to part2_init::@19 [phi:part2_init::@18->part2_init::@19]
    // part2_init::@19
    // memset(PART2_SCREEN, BLACK, 1000)
    // [358] call memset
    // [435] phi from part2_init::@19 to memset [phi:part2_init::@19->memset]
    // [435] phi memset::c#7 = BLACK [phi:part2_init::@19->memset#0] -- vbuxx=vbuc1 
    ldx #BLACK
    // [435] phi memset::str#6 = (void *)PART2_SCREEN [phi:part2_init::@19->memset#1] -- pvoz1=pvoc1 
    lda #<PART2_SCREEN
    sta.z memset.str
    lda #>PART2_SCREEN
    sta.z memset.str+1
    // [435] phi memset::num#5 = $3e8 [phi:part2_init::@19->memset#2] -- vwuz1=vwuc1 
    lda #<$3e8
    sta.z memset.num
    lda #>$3e8
    sta.z memset.num+1
    jsr memset
    // part2_init::@20
    // VICII->SPRITE0_COLOR = GREY
    // [359] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR) = GREY -- _deref_pbuc1=vbuc2 
    // Fade the sparkler
    lda #GREY
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITE0_COLOR
    // VICII->SPRITES_MCOLOR1 = BROWN
    // [360] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1) = BROWN -- _deref_pbuc1=vbuc2 
    lda #BROWN
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR1
    // VICII->SPRITES_MCOLOR2 = BLUE
    // [361] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2) = BLUE -- _deref_pbuc1=vbuc2 
    lda #BLUE
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MCOLOR2
    // plexPrepareInit()
    // [362] call plexPrepareInit
  // Initialize PLEX tables
    // [470] phi from part2_init::@20 to plexPrepareInit [phi:part2_init::@20->plexPrepareInit]
    jsr plexPrepareInit
    // [363] phi from part2_init::@20 to part2_init::@1 [phi:part2_init::@20->part2_init::@1]
    // [363] phi part2_init::frame#5 = BUCKET_SPRITES [phi:part2_init::@20->part2_init::@1#0] -- pssz1=pssc1 
    lda #<BUCKET_SPRITES
    sta.z frame
    lda #>BUCKET_SPRITES
    sta.z frame+1
    // [363] phi part2_init::frame_idx#2 = 0 [phi:part2_init::@20->part2_init::@1#1] -- vbuz1=vbuc1 
    lda #0
    sta.z frame_idx
    // part2_init::@1
  __b1:
    // for(char frame_idx=0;frame_idx<8;frame_idx++)
    // [364] if(part2_init::frame_idx#2<8) goto part2_init::@2 -- vbuz1_lt_vbuc1_then_la1 
    lda.z frame_idx
    cmp #8
    bcc __b2
    // [365] phi from part2_init::@1 to part2_init::@3 [phi:part2_init::@1->part2_init::@3]
    // part2_init::@3
    // memcpy(ORIGINAL_BUCKET_SPRITES, BUCKET_SPRITES, sizeof(BUCKET_SPRITES))
    // [366] call memcpy
  // Copy the original buckets 
    // [444] phi from part2_init::@3 to memcpy [phi:part2_init::@3->memcpy]
    // [444] phi memcpy::num#6 = (unsigned int)8*9*8*SIZEOF_STRUCT_BUCKETSPRITE [phi:part2_init::@3->memcpy#0] -- vwuz1=vwuc1 
    lda #<8*9*8*SIZEOF_STRUCT_BUCKETSPRITE
    sta.z memcpy.num
    lda #>8*9*8*SIZEOF_STRUCT_BUCKETSPRITE
    sta.z memcpy.num+1
    // [444] phi memcpy::destination#6 = (void *)ORIGINAL_BUCKET_SPRITES [phi:part2_init::@3->memcpy#1] -- pvoz1=pvoc1 
    lda #<ORIGINAL_BUCKET_SPRITES
    sta.z memcpy.destination
    lda #>ORIGINAL_BUCKET_SPRITES
    sta.z memcpy.destination+1
    // [444] phi memcpy::source#6 = (void *)BUCKET_SPRITES [phi:part2_init::@3->memcpy#2] -- pvoz1=pvoc1 
    lda #<BUCKET_SPRITES
    sta.z memcpy.source
    lda #>BUCKET_SPRITES
    sta.z memcpy.source+1
    jsr memcpy
    // [367] phi from part2_init::@3 to part2_init::@7 [phi:part2_init::@3->part2_init::@7]
    // [367] phi part2_init::s1#2 = 0 [phi:part2_init::@3->part2_init::@7#0] -- vbuxx=vbuc1 
    ldx #0
  // Set the initial sprite pointers
    // part2_init::@7
  __b7:
    // for(char s=0;s<PLEX_COUNT;s++)
    // [368] if(part2_init::s1#2<$20) goto part2_init::toSpritePtr1 -- vbuxx_lt_vbuc1_then_la1 
    cpx #$20
    bcc __b12
    // part2_init::@8
    // VICII->SPRITES_XMSB = 0x00
    // [369] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB) = 0 -- _deref_pbuc1=vbuc2 
    // Disable sparkler
    lda #0
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_XMSB
    // VICII->SPRITE0_X = 0x00
    // [370] *((char *)VICII) = 0 -- _deref_pbuc1=vbuc2 
    sta VICII
    // VICII->SPRITES_ENABLE = 0x00
    // [371] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 0 -- _deref_pbuc1=vbuc2 
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE
    // VICII->SPRITES_MC = 0x00
    // [372] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC) = 0 -- _deref_pbuc1=vbuc2 
    // Set sprite colors
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_MC
    // [373] phi from part2_init::@8 to part2_init::@9 [phi:part2_init::@8->part2_init::@9]
    // [373] phi part2_init::s2#2 = 0 [phi:part2_init::@8->part2_init::@9#0] -- vbuxx=vbuc1 
    tax
    // part2_init::@9
  __b9:
    // for(char s=0;s<8;s++)
    // [374] if(part2_init::s2#2<8) goto part2_init::@10 -- vbuxx_lt_vbuc1_then_la1 
    cpx #8
    bcc __b10
    // [375] phi from part2_init::@9 to part2_init::@11 [phi:part2_init::@9->part2_init::@11]
    // part2_init::@11
    // memset(PART2_SCREEN+1000, BLACK, 24)
    // [376] call memset
  // Empty the rest of the screen    
    // [435] phi from part2_init::@11 to memset [phi:part2_init::@11->memset]
    // [435] phi memset::c#7 = BLACK [phi:part2_init::@11->memset#0] -- vbuxx=vbuc1 
    ldx #BLACK
    // [435] phi memset::str#6 = (void *)PART2_SCREEN+$3e8 [phi:part2_init::@11->memset#1] -- pvoz1=pvoc1 
    lda #<PART2_SCREEN+$3e8
    sta.z memset.str
    lda #>PART2_SCREEN+$3e8
    sta.z memset.str+1
    // [435] phi memset::num#5 = $18 [phi:part2_init::@11->memset#2] -- vwuz1=vbuc1 
    lda #<$18
    sta.z memset.num
    lda #>$18
    sta.z memset.num+1
    jsr memset
    // part2_init::@return
    // }
    // [377] return 
    rts
    // part2_init::@10
  __b10:
    // SPRITES_COLOR[s] = WHITE
    // [378] SPRITES_COLOR[part2_init::s2#2] = WHITE -- pbuc1_derefidx_vbuxx=vbuc2 
    lda #WHITE
    sta SPRITES_COLOR,x
    // for(char s=0;s<8;s++)
    // [379] part2_init::s2#1 = ++ part2_init::s2#2 -- vbuxx=_inc_vbuxx 
    inx
    // [373] phi from part2_init::@10 to part2_init::@9 [phi:part2_init::@10->part2_init::@9]
    // [373] phi part2_init::s2#2 = part2_init::s2#1 [phi:part2_init::@10->part2_init::@9#0] -- register_copy 
    jmp __b9
    // [380] phi from part2_init::@7 to part2_init::toSpritePtr1 [phi:part2_init::@7->part2_init::toSpritePtr1]
    // part2_init::toSpritePtr1
    // part2_init::@12
  __b12:
    // PLEX_PTR[s] = SPRITE_0+' '
    // [381] PLEX_PTR[part2_init::s1#2] = part2_init::toSpritePtr1_return#0+' ' -- pbuc1_derefidx_vbuxx=vbuc2 
    lda #toSpritePtr1_return+' '
    sta PLEX_PTR,x
    // for(char s=0;s<PLEX_COUNT;s++)
    // [382] part2_init::s1#1 = ++ part2_init::s1#2 -- vbuxx=_inc_vbuxx 
    inx
    // [367] phi from part2_init::@12 to part2_init::@7 [phi:part2_init::@12->part2_init::@7]
    // [367] phi part2_init::s1#2 = part2_init::s1#1 [phi:part2_init::@12->part2_init::@7#0] -- register_copy 
    jmp __b7
    // part2_init::@2
  __b2:
    // [383] part2_init::sin_idx#4 = part2_init::frame_idx#2 -- vbuxx=vbuz1 
    ldx.z frame_idx
    // [384] phi from part2_init::@2 to part2_init::@4 [phi:part2_init::@2->part2_init::@4]
    // [384] phi part2_init::sin_idx#2 = part2_init::sin_idx#4 [phi:part2_init::@2->part2_init::@4#0] -- register_copy 
    // [384] phi part2_init::s#2 = 0 [phi:part2_init::@2->part2_init::@4#1] -- vbuyy=vbuc1 
    ldy #0
    // part2_init::@4
  __b4:
    // for(char s=0; s<PLEX_COUNT;s++)
    // [385] if(part2_init::s#2<$20) goto part2_init::@5 -- vbuyy_lt_vbuc1_then_la1 
    cpy #$20
    bcc __b5
    // part2_init::@6
    // plexPrepareFrame(frame)
    // [386] plexPrepareFrame::frame#0 = part2_init::frame#5 -- pssz1=pssz2 
    lda.z frame
    sta.z plexPrepareFrame.frame
    lda.z frame+1
    sta.z plexPrepareFrame.frame+1
    // [387] call plexPrepareFrame
  // Perform bucket sort
    // [476] phi from part2_init::@6 to plexPrepareFrame [phi:part2_init::@6->plexPrepareFrame]
    jsr plexPrepareFrame
    // part2_init::@21
    // frame += BUCKET_SIZE*BUCKET_COUNT
    // [388] part2_init::frame#1 = part2_init::frame#5 + 8*9*SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_plus_vbuc1 
    // Move to Next frame
    lda #8*9*SIZEOF_STRUCT_BUCKETSPRITE
    clc
    adc.z frame
    sta.z frame
    bcc !+
    inc.z frame+1
  !:
    // for(char frame_idx=0;frame_idx<8;frame_idx++)
    // [389] part2_init::frame_idx#1 = ++ part2_init::frame_idx#2 -- vbuz1=_inc_vbuz1 
    inc.z frame_idx
    // [363] phi from part2_init::@21 to part2_init::@1 [phi:part2_init::@21->part2_init::@1]
    // [363] phi part2_init::frame#5 = part2_init::frame#1 [phi:part2_init::@21->part2_init::@1#0] -- register_copy 
    // [363] phi part2_init::frame_idx#2 = part2_init::frame_idx#1 [phi:part2_init::@21->part2_init::@1#1] -- register_copy 
    jmp __b1
    // part2_init::@5
  __b5:
    // PLEX_YPOS[s] = SCROLL_YSIN[sin_idx]
    // [390] PLEX_YPOS[part2_init::s#2] = SCROLL_YSIN[part2_init::sin_idx#2] -- pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuxx 
    lda SCROLL_YSIN,x
    sta PLEX_YPOS,y
    // sin_idx += 8
    // [391] part2_init::sin_idx#1 = part2_init::sin_idx#2 + 8 -- vbuxx=vbuxx_plus_vbuc1 
    txa
    axs #-[8]
    // for(char s=0; s<PLEX_COUNT;s++)
    // [392] part2_init::s#1 = ++ part2_init::s#2 -- vbuyy=_inc_vbuyy 
    iny
    // [384] phi from part2_init::@5 to part2_init::@4 [phi:part2_init::@5->part2_init::@4]
    // [384] phi part2_init::sin_idx#2 = part2_init::sin_idx#1 [phi:part2_init::@5->part2_init::@4#0] -- register_copy 
    // [384] phi part2_init::s#2 = part2_init::s#1 [phi:part2_init::@5->part2_init::@4#1] -- register_copy 
    jmp __b4
}
  // part2_run
part2_run: {
    .const toDd001_return = 0
    .const toD0181_return = >(PART2_SCREEN&$3fff)*4
    // part2_run::SEI1
    // asm
    // asm { sei  }
    sei
    // part2_run::@1
    // VICII->BORDER_COLOR = BLACK
    // [395] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR) = BLACK -- _deref_pbuc1=vbuc2 
    // Colors
    lda #BLACK
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_BORDER_COLOR
    // VICII->BG_COLOR = BLACK
    // [396] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR) = BLACK -- _deref_pbuc1=vbuc2 
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_BG_COLOR
    // [397] phi from part2_run::@1 to part2_run::toDd001 [phi:part2_run::@1->part2_run::toDd001]
    // part2_run::toDd001
    // part2_run::@2
    // CIA2->PORT_A = toDd00(PART2_SCREEN)
    // [398] *((char *)CIA2) = part2_run::toDd001_return#0 -- _deref_pbuc1=vbuc2 
    // Change graphics bank
    lda #toDd001_return
    sta CIA2
    // [399] phi from part2_run::@2 to part2_run::toD0181 [phi:part2_run::@2->part2_run::toD0181]
    // part2_run::toD0181
    // part2_run::@3
    // VICII->MEMORY = toD018(PART2_SCREEN, PART2_BITMAP)
    // [400] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY) = part2_run::toD0181_return#0 -- _deref_pbuc1=vbuc2 
    // Show screen
    lda #toD0181_return
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_MEMORY
    // VICII->CONTROL1 |= VICII_BMM
    // [401] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) = *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1) | VICII_BMM -- _deref_pbuc1=_deref_pbuc1_bor_vbuc2 
    // Set bitmap mode
    lda #VICII_BMM
    ora VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_CONTROL1
    // *SPRITES_ENABLE = 0xff
    // [402] *SPRITES_ENABLE = $ff -- _deref_pbuc1=vbuc2 
    // Enable & initialize sprites
    lda #$ff
    sta SPRITES_ENABLE
    // CIA1->INTERRUPT = CIA_INTERRUPT_CLEAR
    // [403] *((char *)CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT) = CIA_INTERRUPT_CLEAR -- _deref_pbuc1=vbuc2 
    // Disable CIA 1 Timer IRQ
    lda #CIA_INTERRUPT_CLEAR
    sta CIA1+OFFSET_STRUCT_MOS6526_CIA_INTERRUPT
    // asm
    // asm { ldaCIA1_INTERRUPT  }
    // Acknowledge any timer IRQ
    lda CIA1_INTERRUPT
    // *IRQ_STATUS = 0x0f
    // [405] *IRQ_STATUS = $f -- _deref_pbuc1=vbuc2 
    // Acknowledge any VIC IRQ
    lda #$f
    sta IRQ_STATUS
    // *VICII_CONTROL1 &=0x7f
    // [406] *VICII_CONTROL1 = *VICII_CONTROL1 & $7f -- _deref_pbuc1=_deref_pbuc1_band_vbuc2 
    // Set raster line to first bucket
    lda #$7f
    and VICII_CONTROL1
    sta VICII_CONTROL1
    // *RASTER = BUCKET_YPOS[0]
    // [407] *RASTER = *BUCKET_YPOS -- _deref_pbuc1=_deref_pbuc2 
    lda BUCKET_YPOS
    sta RASTER
    // *IRQ_ENABLE = IRQ_RASTER
    // [408] *IRQ_ENABLE = IRQ_RASTER -- _deref_pbuc1=vbuc2 
    // Enable Raster Interrupt
    lda #IRQ_RASTER
    sta IRQ_ENABLE
    // *HARDWARE_IRQ = &irq_swing_top
    // [409] *HARDWARE_IRQ = &irq_swing_top -- _deref_qprc1=pprc2 
    // Set the IRQ routine
    lda #<irq_swing_top
    sta HARDWARE_IRQ
    lda #>irq_swing_top
    sta HARDWARE_IRQ+1
    // part2_run::CLI1
    // asm
    // asm { cli  }
    cli
    // part2_run::@4
    // plex_frame_id = 0
    // [411] plex_frame_id = 0 -- vbuz1=vbuc1 
    // The current frame ID (0-7)
    lda #0
    sta.z plex_frame_id
    // plex_frame = BUCKET_SPRITES
    // [412] plex_frame = BUCKET_SPRITES -- pssz1=pssc1 
    // Pointer to the buckets of the current frame
    lda #<BUCKET_SPRITES
    sta.z plex_frame
    lda #>BUCKET_SPRITES
    sta.z plex_frame+1
    // plex_id_offset = 0
    // [413] plex_id_offset = 0 -- vbuz1=vbuc1 
    // Offset added to plex_id to ensure the sprite cycling works (decreased 1 every time a cycle is complete)
    lda #0
    sta.z plex_id_offset
    // part2_loop()
    // [414] call part2_loop
    jsr part2_loop
    // part2_run::@return
    // }
    // [415] return 
    rts
}
.segment Code
  // sparkler_anim
// Animate the sparkler sprite
sparkler_anim: {
    .const toSpritePtr1_return = $ff&P1_SPRITES/$40
    // if(++sparkler_idx==30)
    // [416] sparkler_idx = ++ sparkler_idx -- vbuz1=_inc_vbuz1 
    inc.z sparkler_idx
    // [417] if(sparkler_idx!=$1e) goto sparkler_anim::toSpritePtr1 -- vbuz1_neq_vbuc1_then_la1 
    lda #$1e
    cmp.z sparkler_idx
    bne __b2
    // sparkler_anim::@1
    // sparkler_idx=0
    // [418] sparkler_idx = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z sparkler_idx
    // [419] phi from sparkler_anim sparkler_anim::@1 to sparkler_anim::toSpritePtr1 [phi:sparkler_anim/sparkler_anim::@1->sparkler_anim::toSpritePtr1]
    // sparkler_anim::toSpritePtr1
    // sparkler_anim::@2
  __b2:
    // sparkler_idx/2
    // [420] sparkler_anim::$3 = sparkler_idx >> 1 -- vbuaa=vbuz1_ror_1 
    lda.z sparkler_idx
    lsr
    // toSpritePtr(P1_SPRITES)+sparkler_idx/2
    // [421] sparkler_anim::$4 = sparkler_anim::toSpritePtr1_return#0 + sparkler_anim::$3 -- vbuaa=vbuc1_plus_vbuaa 
    clc
    adc #toSpritePtr1_return
    // P1_SCREEN_SPRITE_PTRS[0] = toSpritePtr(P1_SPRITES)+sparkler_idx/2
    // [422] *P1_SCREEN_SPRITE_PTRS = sparkler_anim::$4 -- _deref_pbuc1=vbuaa 
    sta P1_SCREEN_SPRITE_PTRS
    // sparkler_anim::@return
    // }
    // [423] return 
    rts
}
.segment CodePart1
  // init_rasters
// Initialize the BADLINES
init_rasters: {
    .label i = $46
    .label __3 = $4c
    // [425] phi from init_rasters to init_rasters::@1 [phi:init_rasters->init_rasters::@1]
    // [425] phi init_rasters::i#2 = 0 [phi:init_rasters->init_rasters::@1#0] -- vwuz1=vwuc1 
    lda #<0
    sta.z i
    sta.z i+1
    // init_rasters::@1
  __b1:
    // for(unsigned int i=0;i<sizeof(RASTER_BADLINES);i++)
    // [426] if(init_rasters::i#2<$130*SIZEOF_CHAR) goto init_rasters::@2 -- vwuz1_lt_vwuc1_then_la1 
    lda.z i+1
    cmp #>$130*SIZEOF_CHAR
    bcc __b2
    bne !+
    lda.z i
    cmp #<$130*SIZEOF_CHAR
    bcc __b2
  !:
    // [427] phi from init_rasters::@1 to init_rasters::@3 [phi:init_rasters::@1->init_rasters::@3]
    // [427] phi init_rasters::b#2 = $32 [phi:init_rasters::@1->init_rasters::@3#0] -- vbuxx=vbuc1 
    ldx #$32
    // init_rasters::@3
  __b3:
    // for(char b=0x32;b<0xfa;b+=8)
    // [428] if(init_rasters::b#2<$fa) goto init_rasters::@4 -- vbuxx_lt_vbuc1_then_la1 
    cpx #$fa
    bcc __b4
    // init_rasters::@return
    // }
    // [429] return 
    rts
    // init_rasters::@4
  __b4:
    // RASTER_BADLINES[b] = 1
    // [430] RASTER_BADLINES[init_rasters::b#2] = 1 -- pbuc1_derefidx_vbuxx=vbuc2 
    lda #1
    sta RASTER_BADLINES,x
    // b+=8
    // [431] init_rasters::b#1 = init_rasters::b#2 + 8 -- vbuxx=vbuxx_plus_vbuc1 
    txa
    axs #-[8]
    // [427] phi from init_rasters::@4 to init_rasters::@3 [phi:init_rasters::@4->init_rasters::@3]
    // [427] phi init_rasters::b#2 = init_rasters::b#1 [phi:init_rasters::@4->init_rasters::@3#0] -- register_copy 
    jmp __b3
    // init_rasters::@2
  __b2:
    // RASTER_BADLINES[i] = 0
    // [432] init_rasters::$3 = RASTER_BADLINES + init_rasters::i#2 -- pbuz1=pbuc1_plus_vwuz2 
    lda.z i
    clc
    adc #<RASTER_BADLINES
    sta.z __3
    lda.z i+1
    adc #>RASTER_BADLINES
    sta.z __3+1
    // [433] *init_rasters::$3 = 0 -- _deref_pbuz1=vbuc1 
    lda #0
    tay
    sta (__3),y
    // for(unsigned int i=0;i<sizeof(RASTER_BADLINES);i++)
    // [434] init_rasters::i#1 = ++ init_rasters::i#2 -- vwuz1=_inc_vwuz1 
    inc.z i
    bne !+
    inc.z i+1
  !:
    // [425] phi from init_rasters::@2 to init_rasters::@1 [phi:init_rasters::@2->init_rasters::@1]
    // [425] phi init_rasters::i#2 = init_rasters::i#1 [phi:init_rasters::@2->init_rasters::@1#0] -- register_copy 
    jmp __b1
}
.segment Code
  // memset
// Copies the character c (an unsigned char) to the first num characters of the object pointed to by the argument str.
// void * memset(__zp($48) void *str, __register(X) char c, __zp($4c) unsigned int num)
memset: {
    .label end = $4c
    .label dst = $48
    .label num = $4c
    .label str = $48
    // if(num>0)
    // [436] if(memset::num#5<=0) goto memset::@return -- vwuz1_le_0_then_la1 
    lda.z num
    bne !+
    lda.z num+1
    beq __breturn
  !:
    // memset::@1
    // char* end = (char*)str + num
    // [437] memset::end#0 = (char *)memset::str#6 + memset::num#5 -- pbuz1=pbuz2_plus_vwuz1 
    clc
    lda.z end
    adc.z str
    sta.z end
    lda.z end+1
    adc.z str+1
    sta.z end+1
    // [438] memset::dst#4 = (char *)memset::str#6
    // [439] phi from memset::@1 memset::@3 to memset::@2 [phi:memset::@1/memset::@3->memset::@2]
    // [439] phi memset::dst#2 = memset::dst#4 [phi:memset::@1/memset::@3->memset::@2#0] -- register_copy 
    // memset::@2
  __b2:
    // for(char* dst = str; dst!=end; dst++)
    // [440] if(memset::dst#2!=memset::end#0) goto memset::@3 -- pbuz1_neq_pbuz2_then_la1 
    lda.z dst+1
    cmp.z end+1
    bne __b3
    lda.z dst
    cmp.z end
    bne __b3
    // memset::@return
  __breturn:
    // }
    // [441] return 
    rts
    // memset::@3
  __b3:
    // *dst = c
    // [442] *memset::dst#2 = memset::c#7 -- _deref_pbuz1=vbuxx 
    txa
    ldy #0
    sta (dst),y
    // for(char* dst = str; dst!=end; dst++)
    // [443] memset::dst#1 = ++ memset::dst#2 -- pbuz1=_inc_pbuz1 
    inc.z dst
    bne !+
    inc.z dst+1
  !:
    jmp __b2
}
  // memcpy
// Copy block of memory (forwards)
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
// void * memcpy(__zp($48) void *destination, __zp($4c) void *source, __zp($4a) unsigned int num)
memcpy: {
    .label src_end = $4a
    .label dst = $48
    .label src = $4c
    .label source = $4c
    .label destination = $48
    .label num = $4a
    // char* src_end = (char*)source+num
    // [445] memcpy::src_end#0 = (char *)memcpy::source#6 + memcpy::num#6 -- pbuz1=pbuz2_plus_vwuz1 
    clc
    lda.z src_end
    adc.z source
    sta.z src_end
    lda.z src_end+1
    adc.z source+1
    sta.z src_end+1
    // [446] memcpy::src#4 = (char *)memcpy::source#6
    // [447] memcpy::dst#4 = (char *)memcpy::destination#6
    // [448] phi from memcpy memcpy::@2 to memcpy::@1 [phi:memcpy/memcpy::@2->memcpy::@1]
    // [448] phi memcpy::dst#2 = memcpy::dst#4 [phi:memcpy/memcpy::@2->memcpy::@1#0] -- register_copy 
    // [448] phi memcpy::src#2 = memcpy::src#4 [phi:memcpy/memcpy::@2->memcpy::@1#1] -- register_copy 
    // memcpy::@1
  __b1:
    // while(src!=src_end)
    // [449] if(memcpy::src#2!=memcpy::src_end#0) goto memcpy::@2 -- pbuz1_neq_pbuz2_then_la1 
    lda.z src+1
    cmp.z src_end+1
    bne __b2
    lda.z src
    cmp.z src_end
    bne __b2
    // memcpy::@return
    // }
    // [450] return 
    rts
    // memcpy::@2
  __b2:
    // *dst++ = *src++
    // [451] *memcpy::dst#2 = *memcpy::src#2 -- _deref_pbuz1=_deref_pbuz2 
    ldy #0
    lda (src),y
    sta (dst),y
    // *dst++ = *src++;
    // [452] memcpy::dst#1 = ++ memcpy::dst#2 -- pbuz1=_inc_pbuz1 
    inc.z dst
    bne !+
    inc.z dst+1
  !:
    // [453] memcpy::src#1 = ++ memcpy::src#2 -- pbuz1=_inc_pbuz1 
    inc.z src
    bne !+
    inc.z src+1
  !:
    jmp __b1
}
.segment CodePart1
  // part1_loop
// Handle some stuff in the main() routine
part1_loop: {
    .label __11 = $46
    // p1_work_ready = 0
    // [454] p1_work_ready = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z p1_work_ready
    // part1_loop::@1
  __b1:
    // while(p1_work_ready==0)
    // [455] if(p1_work_ready==0) goto part1_loop::@1 -- vbuz1_eq_0_then_la1 
    lda.z p1_work_ready
    beq __b1
    // [456] phi from part1_loop::@1 to part1_loop::@2 [phi:part1_loop::@1->part1_loop::@2]
    // part1_loop::@2
    // flipper_fix_colors()
    // [457] call flipper_fix_colors
    // Fix colors
    jsr flipper_fix_colors
    // part1_loop::@7
    // demo_frame_count>9*50-3
    // [458] part1_loop::$11 = demo_frame_count -- vwuz1=vwuz2 
    lda.z demo_frame_count
    sta.z __11
    lda.z demo_frame_count+1
    sta.z __11+1
    // if(!sparkler_active && demo_frame_count>9*50-3)
    // [459] if(0!=sparkler_active) goto part1_loop::@4 -- 0_neq_vbuz1_then_la1 
    lda.z sparkler_active
    bne __b4
    // part1_loop::@9
    // [460] if(part1_loop::$11<=(unsigned int)9*$32-3) goto part1_loop::@4 -- vwuz1_le_vwuc1_then_la1 
    lda.z __11+1
    cmp #>9*$32-3
    bne !+
    lda.z __11
    cmp #<9*$32-3
  !:
    bcc __b4
    beq __b4
    // part1_loop::@3
    // VICII->SPRITES_ENABLE = 0x01
    // [461] *((char *)VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE) = 1 -- _deref_pbuc1=vbuc2 
    lda #1
    sta VICII+OFFSET_STRUCT_MOS6569_VICII_SPRITES_ENABLE
    // sparkler_active = 1
    // [462] sparkler_active = 1 -- vbuz1=vbuc1 
    sta.z sparkler_active
    // [463] phi from part1_loop::@3 part1_loop::@7 part1_loop::@9 to part1_loop::@4 [phi:part1_loop::@3/part1_loop::@7/part1_loop::@9->part1_loop::@4]
    // part1_loop::@4
  __b4:
    // demo_work()
    // [464] call demo_work
    // Perform any demo-wide work
    jsr demo_work
    // part1_loop::@8
    // if(demo_frame_count>14*50)
    // [465] if(demo_frame_count<=(unsigned int)$e*$32) goto part1_loop::@5 -- vwuz1_le_vwuc1_then_la1 
    lda.z demo_frame_count+1
    cmp #>$e*$32
    bne !+
    lda.z demo_frame_count
    cmp #<$e*$32
  !:
    bcc __b5
    beq __b5
    // [466] phi from part1_loop::@8 to part1_loop::@6 [phi:part1_loop::@8->part1_loop::@6]
    // part1_loop::@6
    // demo_start()
    // [467] call demo_start
  // Re-start the demo base IRQ
    // [282] phi from part1_loop::@6 to demo_start [phi:part1_loop::@6->demo_start]
    jsr demo_start
    // part1_loop::@return
    // }
    // [468] return 
    rts
    // part1_loop::@5
  __b5:
    // p1_work_ready = 0
    // [469] p1_work_ready = 0 -- vbuz1=vbuc1 
    // My work is done!
    lda #0
    sta.z p1_work_ready
    jmp __b1
}
.segment CodePart2
  // plexPrepareInit
// Initialize data structures for the multiplexer
plexPrepareInit: {
    // [471] phi from plexPrepareInit to plexPrepareInit::@1 [phi:plexPrepareInit->plexPrepareInit::@1]
    // [471] phi plexPrepareInit::i#2 = 0 [phi:plexPrepareInit->plexPrepareInit::@1#0] -- vbuxx=vbuc1 
    ldx #0
  // Initial sorting is trivial
    // plexPrepareInit::@1
  __b1:
    // for(char i=0; i<PLEX_COUNT;i++)
    // [472] if(plexPrepareInit::i#2<$20) goto plexPrepareInit::@2 -- vbuxx_lt_vbuc1_then_la1 
    cpx #$20
    bcc __b2
    // plexPrepareInit::@return
    // }
    // [473] return 
    rts
    // plexPrepareInit::@2
  __b2:
    // PLEX_SORTED_IDX[i] = i
    // [474] PLEX_SORTED_IDX[plexPrepareInit::i#2] = plexPrepareInit::i#2 -- pbuc1_derefidx_vbuxx=vbuxx 
    txa
    sta PLEX_SORTED_IDX,x
    // for(char i=0; i<PLEX_COUNT;i++)
    // [475] plexPrepareInit::i#1 = ++ plexPrepareInit::i#2 -- vbuxx=_inc_vbuxx 
    inx
    // [471] phi from plexPrepareInit::@2 to plexPrepareInit::@1 [phi:plexPrepareInit::@2->plexPrepareInit::@1]
    // [471] phi plexPrepareInit::i#2 = plexPrepareInit::i#1 [phi:plexPrepareInit::@2->plexPrepareInit::@1#0] -- register_copy 
    jmp __b1
}
  // plexPrepareFrame
// Performs run-time bucket sort of the sprites in the PLEX_ arrays into struct BucketSprite[]
// Starts by performing a true sorting of the sprites based on Y-position (unsing insertion sort)
// void plexPrepareFrame(__zp($4c) struct BucketSprite *frame)
plexPrepareFrame: {
    .label nxt_idx = $44
    .label nxt_y = $45
    .label m = 5
    .label bucket_ypos = 8
    .label plex_id = $42
    .label ypos = $43
    .label bucket = $4a
    .label sprite = $4c
    .label i1 = 6
    // The current bucket idx
    .label bucket_id = 7
    .label sprite_1 = $4a
    .label frame = $4c
    // [477] phi from plexPrepareFrame to plexPrepareFrame::@1 [phi:plexPrepareFrame->plexPrepareFrame::@1]
    // [477] phi plexPrepareFrame::m#2 = 0 [phi:plexPrepareFrame->plexPrepareFrame::@1#0] -- vbuz1=vbuc1 
    lda #0
    sta.z m
  // Sort the sprite indices in PLEX_SORTED_IDX based on the Y-position (using insertion sort)
  // Assumes that the positions are nearly sorted already (as each sprite just moves a bit)
  // 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.
    // plexPrepareFrame::@1
  __b1:
    // for(char m=0;m<PLEX_COUNT-1;m++)
    // [478] if(plexPrepareFrame::m#2<$20-1) goto plexPrepareFrame::@2 -- vbuz1_lt_vbuc1_then_la1 
    lda.z m
    cmp #$20-1
    bcs !__b2+
    jmp __b2
  !__b2:
    // [479] phi from plexPrepareFrame::@1 to plexPrepareFrame::@7 [phi:plexPrepareFrame::@1->plexPrepareFrame::@7]
    // [479] phi plexPrepareFrame::i#2 = 0 [phi:plexPrepareFrame::@1->plexPrepareFrame::@7#0] -- vbuxx=vbuc1 
    ldx #0
  // Initialize real sprite free to the first bucket Y-position
    // plexPrepareFrame::@7
  __b7:
    // for(char i=0;i<8;i++)
    // [480] if(plexPrepareFrame::i#2<8) goto plexPrepareFrame::@8 -- vbuxx_lt_vbuc1_then_la1 
    cpx #8
    bcs !__b8+
    jmp __b8
  !__b8:
    // plexPrepareFrame::@9
    // char bucket_ypos = BUCKET_YPOS[bucket_id]
    // [481] plexPrepareFrame::bucket_ypos#0 = *BUCKET_YPOS -- vbuz1=_deref_pbuc1 
    // The current bucket start y-position
    lda BUCKET_YPOS
    sta.z bucket_ypos
    // [482] plexPrepareFrame::bucket#10 = plexPrepareFrame::frame#0 -- pssz1=pssz2 
    lda.z frame
    sta.z bucket
    lda.z frame+1
    sta.z bucket+1
    // [483] phi from plexPrepareFrame::@9 to plexPrepareFrame::@10 [phi:plexPrepareFrame::@9->plexPrepareFrame::@10]
    // [483] phi plexPrepareFrame::bucket_id#2 = 0 [phi:plexPrepareFrame::@9->plexPrepareFrame::@10#0] -- vbuz1=vbuc1 
    lda #0
    sta.z bucket_id
    // [483] phi plexPrepareFrame::sprite#3 = plexPrepareFrame::frame#0 [phi:plexPrepareFrame::@9->plexPrepareFrame::@10#1] -- register_copy 
    // [483] phi plexPrepareFrame::bucket#3 = plexPrepareFrame::bucket#10 [phi:plexPrepareFrame::@9->plexPrepareFrame::@10#2] -- register_copy 
    // [483] phi plexPrepareFrame::bucket_ypos#3 = plexPrepareFrame::bucket_ypos#0 [phi:plexPrepareFrame::@9->plexPrepareFrame::@10#3] -- register_copy 
    // [483] phi plexPrepareFrame::real_sprite_id#2 = 0 [phi:plexPrepareFrame::@9->plexPrepareFrame::@10#4] -- vbuxx=vbuc1 
    tax
    // [483] phi plexPrepareFrame::i1#2 = 0 [phi:plexPrepareFrame::@9->plexPrepareFrame::@10#5] -- vbuz1=vbuc1 
    sta.z i1
    // plexPrepareFrame::@10
  __b10:
    // for(char i=0;i<PLEX_COUNT; i++)
    // [484] if(plexPrepareFrame::i1#2<$20) goto plexPrepareFrame::@11 -- vbuz1_lt_vbuc1_then_la1 
    lda.z i1
    cmp #$20
    bcc __b11
    // plexPrepareFrame::@12
    // bucket += BUCKET_SIZE
    // [485] plexPrepareFrame::bucket#1 = plexPrepareFrame::bucket#3 + 8*SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_plus_vbuc1 
    // Zero-fill the next sprite in the bucket (if not full)
    lda #8*SIZEOF_STRUCT_BUCKETSPRITE
    clc
    adc.z bucket
    sta.z bucket
    bcc !+
    inc.z bucket+1
  !:
    // if(sprite!=bucket)
    // [486] if(plexPrepareFrame::sprite#3==plexPrepareFrame::bucket#1) goto plexPrepareFrame::@return -- pssz1_eq_pssz2_then_la1 
    lda.z sprite
    cmp.z bucket
    bne !+
    lda.z sprite+1
    cmp.z bucket+1
    beq __breturn
  !:
    // plexPrepareFrame::@17
    // sprite->ypos=0
    // [487] *((char *)plexPrepareFrame::sprite#3) = 0 -- _deref_pbuz1=vbuc1 
    lda #0
    tay
    sta (sprite),y
    // plexPrepareFrame::@return
  __breturn:
    // }
    // [488] return 
    rts
    // plexPrepareFrame::@11
  __b11:
    // char plex_id = PLEX_SORTED_IDX[i]
    // [489] plexPrepareFrame::plex_id#0 = PLEX_SORTED_IDX[plexPrepareFrame::i1#2] -- vbuz1=pbuc1_derefidx_vbuz2 
    ldy.z i1
    lda PLEX_SORTED_IDX,y
    sta.z plex_id
    // unsigned char ypos = PLEX_YPOS[plex_id]
    // [490] plexPrepareFrame::ypos#0 = PLEX_YPOS[plexPrepareFrame::plex_id#0] -- vbuz1=pbuc1_derefidx_vbuz2 
    tay
    lda PLEX_YPOS,y
    sta.z ypos
    // if(real_sprite_free_ypos[real_sprite_id] > bucket_ypos)
    // [491] if(plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::real_sprite_id#2]<=plexPrepareFrame::bucket_ypos#3) goto plexPrepareFrame::@13 -- pbuc1_derefidx_vbuxx_le_vbuz1_then_la1 
    txa
    tay
    lda.z bucket_ypos
    cmp real_sprite_free_ypos,y
    bcs __b13
    // plexPrepareFrame::@15
    // bucket_id++;
    // [492] plexPrepareFrame::bucket_id#1 = ++ plexPrepareFrame::bucket_id#2 -- vbuz1=_inc_vbuz1 
    inc.z bucket_id
    // bucket_ypos = BUCKET_YPOS[bucket_id]
    // [493] plexPrepareFrame::bucket_ypos#2 = BUCKET_YPOS[plexPrepareFrame::bucket_id#1] -- vbuz1=pbuc1_derefidx_vbuz2 
    ldy.z bucket_id
    lda BUCKET_YPOS,y
    sta.z bucket_ypos
    // bucket += BUCKET_SIZE
    // [494] plexPrepareFrame::sprite#2 = plexPrepareFrame::bucket#3 + 8*SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_plus_vbuc1 
    lda #8*SIZEOF_STRUCT_BUCKETSPRITE
    clc
    adc.z sprite_1
    sta.z sprite_1
    bcc !+
    inc.z sprite_1+1
  !:
    // if(sprite!=bucket)
    // [495] if(plexPrepareFrame::sprite#3==plexPrepareFrame::sprite#2) goto plexPrepareFrame::@14 -- pssz1_eq_pssz2_then_la1 
    lda.z sprite
    cmp.z sprite_1
    bne !+
    lda.z sprite+1
    cmp.z sprite_1+1
    beq __b14
  !:
    // plexPrepareFrame::@16
    // sprite->ypos=0
    // [496] *((char *)plexPrepareFrame::sprite#3) = 0 -- _deref_pbuz1=vbuc1 
    lda #0
    tay
    sta (sprite),y
    // plexPrepareFrame::@14
  __b14:
    // [497] plexPrepareFrame::sprite#13 = plexPrepareFrame::sprite#2 -- pssz1=pssz2 
    lda.z sprite_1
    sta.z sprite
    lda.z sprite_1+1
    sta.z sprite+1
    // [498] phi from plexPrepareFrame::@11 plexPrepareFrame::@14 to plexPrepareFrame::@13 [phi:plexPrepareFrame::@11/plexPrepareFrame::@14->plexPrepareFrame::@13]
    // [498] phi plexPrepareFrame::bucket_id#5 = plexPrepareFrame::bucket_id#2 [phi:plexPrepareFrame::@11/plexPrepareFrame::@14->plexPrepareFrame::@13#0] -- register_copy 
    // [498] phi plexPrepareFrame::bucket#9 = plexPrepareFrame::bucket#3 [phi:plexPrepareFrame::@11/plexPrepareFrame::@14->plexPrepareFrame::@13#1] -- register_copy 
    // [498] phi plexPrepareFrame::bucket_ypos#4 = plexPrepareFrame::bucket_ypos#3 [phi:plexPrepareFrame::@11/plexPrepareFrame::@14->plexPrepareFrame::@13#2] -- register_copy 
    // [498] phi plexPrepareFrame::sprite#4 = plexPrepareFrame::sprite#3 [phi:plexPrepareFrame::@11/plexPrepareFrame::@14->plexPrepareFrame::@13#3] -- register_copy 
    // plexPrepareFrame::@13
  __b13:
    // sprite->ypos = ypos
    // [499] *((char *)plexPrepareFrame::sprite#4) = plexPrepareFrame::ypos#0 -- _deref_pbuz1=vbuz2 
    // Identify problems filling buckets
    // Put the sprite into the bucket
    lda.z ypos
    ldy #0
    sta (sprite),y
    // sprite->plex_id = plex_id
    // [500] ((char *)plexPrepareFrame::sprite#4)[OFFSET_STRUCT_BUCKETSPRITE_PLEX_ID] = plexPrepareFrame::plex_id#0 -- pbuz1_derefidx_vbuc1=vbuz2 
    lda.z plex_id
    ldy #OFFSET_STRUCT_BUCKETSPRITE_PLEX_ID
    sta (sprite),y
    // bucket_ypos += 1
    // [501] plexPrepareFrame::bucket_ypos#1 = plexPrepareFrame::bucket_ypos#4 + 1 -- vbuz1=vbuz1_plus_1 
    // Increase bucket ypos to account for time spent placing the sprite
    inc.z bucket_ypos
    // ypos+22
    // [502] plexPrepareFrame::$16 = plexPrepareFrame::ypos#0 + $16 -- vbuaa=vbuz1_plus_vbuc1 
    lda #$16
    clc
    adc.z ypos
    // real_sprite_free_ypos[real_sprite_id] = ypos+22
    // [503] plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::real_sprite_id#2] = plexPrepareFrame::$16 -- pbuc1_derefidx_vbuxx=vbuaa 
    // Update  next free ypos for the real sprite
    sta real_sprite_free_ypos,x
    // real_sprite_id+1
    // [504] plexPrepareFrame::$17 = plexPrepareFrame::real_sprite_id#2 + 1 -- vbuxx=vbuxx_plus_1 
    inx
    // real_sprite_id = (real_sprite_id+1)&7
    // [505] plexPrepareFrame::real_sprite_id#1 = plexPrepareFrame::$17 & 7 -- vbuxx=vbuxx_band_vbuc1 
    lda #7
    axs #0
    // sprite++;
    // [506] plexPrepareFrame::sprite#1 = plexPrepareFrame::sprite#4 + SIZEOF_STRUCT_BUCKETSPRITE -- pssz1=pssz1_plus_vbuc1 
    lda #SIZEOF_STRUCT_BUCKETSPRITE
    clc
    adc.z sprite
    sta.z sprite
    bcc !+
    inc.z sprite+1
  !:
    // for(char i=0;i<PLEX_COUNT; i++)
    // [507] plexPrepareFrame::i1#1 = ++ plexPrepareFrame::i1#2 -- vbuz1=_inc_vbuz1 
    inc.z i1
    // [483] phi from plexPrepareFrame::@13 to plexPrepareFrame::@10 [phi:plexPrepareFrame::@13->plexPrepareFrame::@10]
    // [483] phi plexPrepareFrame::bucket_id#2 = plexPrepareFrame::bucket_id#5 [phi:plexPrepareFrame::@13->plexPrepareFrame::@10#0] -- register_copy 
    // [483] phi plexPrepareFrame::sprite#3 = plexPrepareFrame::sprite#1 [phi:plexPrepareFrame::@13->plexPrepareFrame::@10#1] -- register_copy 
    // [483] phi plexPrepareFrame::bucket#3 = plexPrepareFrame::bucket#9 [phi:plexPrepareFrame::@13->plexPrepareFrame::@10#2] -- register_copy 
    // [483] phi plexPrepareFrame::bucket_ypos#3 = plexPrepareFrame::bucket_ypos#1 [phi:plexPrepareFrame::@13->plexPrepareFrame::@10#3] -- register_copy 
    // [483] phi plexPrepareFrame::real_sprite_id#2 = plexPrepareFrame::real_sprite_id#1 [phi:plexPrepareFrame::@13->plexPrepareFrame::@10#4] -- register_copy 
    // [483] phi plexPrepareFrame::i1#2 = plexPrepareFrame::i1#1 [phi:plexPrepareFrame::@13->plexPrepareFrame::@10#5] -- register_copy 
    jmp __b10
    // plexPrepareFrame::@8
  __b8:
    // real_sprite_free_ypos[i] = BUCKET_YPOS[0]
    // [508] plexPrepareFrame::real_sprite_free_ypos[plexPrepareFrame::i#2] = *BUCKET_YPOS -- pbuc1_derefidx_vbuxx=_deref_pbuc2 
    lda BUCKET_YPOS
    sta real_sprite_free_ypos,x
    // for(char i=0;i<8;i++)
    // [509] plexPrepareFrame::i#1 = ++ plexPrepareFrame::i#2 -- vbuxx=_inc_vbuxx 
    inx
    // [479] phi from plexPrepareFrame::@8 to plexPrepareFrame::@7 [phi:plexPrepareFrame::@8->plexPrepareFrame::@7]
    // [479] phi plexPrepareFrame::i#2 = plexPrepareFrame::i#1 [phi:plexPrepareFrame::@8->plexPrepareFrame::@7#0] -- register_copy 
    jmp __b7
    // plexPrepareFrame::@2
  __b2:
    // char nxt_idx = PLEX_SORTED_IDX[m+1]
    // [510] plexPrepareFrame::nxt_idx#0 = (PLEX_SORTED_IDX+1)[plexPrepareFrame::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]
    // [511] plexPrepareFrame::nxt_y#0 = PLEX_YPOS[plexPrepareFrame::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]])
    // [512] if(plexPrepareFrame::nxt_y#0>=PLEX_YPOS[PLEX_SORTED_IDX[plexPrepareFrame::m#2]]) goto plexPrepareFrame::@3 -- vbuz1_ge_pbuc1_derefidx_(pbuc2_derefidx_vbuz2)_then_la1 
    ldx.z m
    ldy PLEX_SORTED_IDX,x
    cmp PLEX_YPOS,y
    bcs __b3
    // plexPrepareFrame::@6
    // [513] plexPrepareFrame::s#6 = plexPrepareFrame::m#2 -- vbuxx=vbuz1 
    // [514] phi from plexPrepareFrame::@18 plexPrepareFrame::@6 to plexPrepareFrame::@4 [phi:plexPrepareFrame::@18/plexPrepareFrame::@6->plexPrepareFrame::@4]
    // [514] phi plexPrepareFrame::s#3 = plexPrepareFrame::s#1 [phi:plexPrepareFrame::@18/plexPrepareFrame::@6->plexPrepareFrame::@4#0] -- register_copy 
    // plexPrepareFrame::@4
  __b4:
    // PLEX_SORTED_IDX[s+1] = PLEX_SORTED_IDX[s]
    // [515] (PLEX_SORTED_IDX+1)[plexPrepareFrame::s#3] = PLEX_SORTED_IDX[plexPrepareFrame::s#3] -- pbuc1_derefidx_vbuxx=pbuc2_derefidx_vbuxx 
    lda PLEX_SORTED_IDX,x
    sta PLEX_SORTED_IDX+1,x
    // s--;
    // [516] plexPrepareFrame::s#1 = -- plexPrepareFrame::s#3 -- vbuxx=_dec_vbuxx 
    dex
    // while((s!=0xff) && (nxt_y<PLEX_YPOS[PLEX_SORTED_IDX[s]]))
    // [517] if(plexPrepareFrame::s#1==$ff) goto plexPrepareFrame::@5 -- vbuxx_eq_vbuc1_then_la1 
    cpx #$ff
    beq __b5
    // plexPrepareFrame::@18
    // [518] if(plexPrepareFrame::nxt_y#0<PLEX_YPOS[PLEX_SORTED_IDX[plexPrepareFrame::s#1]]) goto plexPrepareFrame::@4 -- vbuz1_lt_pbuc1_derefidx_(pbuc2_derefidx_vbuxx)_then_la1 
    lda.z nxt_y
    ldy PLEX_SORTED_IDX,x
    cmp PLEX_YPOS,y
    bcc __b4
    // plexPrepareFrame::@5
  __b5:
    // s++;
    // [519] plexPrepareFrame::s#2 = ++ plexPrepareFrame::s#1 -- vbuxx=_inc_vbuxx 
    inx
    // PLEX_SORTED_IDX[s] = nxt_idx
    // [520] PLEX_SORTED_IDX[plexPrepareFrame::s#2] = plexPrepareFrame::nxt_idx#0 -- pbuc1_derefidx_vbuxx=vbuz1 
    lda.z nxt_idx
    sta PLEX_SORTED_IDX,x
    // plexPrepareFrame::@3
  __b3:
    // for(char m=0;m<PLEX_COUNT-1;m++)
    // [521] plexPrepareFrame::m#1 = ++ plexPrepareFrame::m#2 -- vbuz1=_inc_vbuz1 
    inc.z m
    // [477] phi from plexPrepareFrame::@3 to plexPrepareFrame::@1 [phi:plexPrepareFrame::@3->plexPrepareFrame::@1]
    // [477] phi plexPrepareFrame::m#2 = plexPrepareFrame::m#1 [phi:plexPrepareFrame::@3->plexPrepareFrame::@1#0] -- register_copy 
    jmp __b1
  .segment DataPart2
    // Y-position where each real sprite is free (used for selecting the best bucket)
    real_sprite_free_ypos: .fill 8, 0
}
.segment CodePart2
  // part2_loop
// Part 2 main loop
part2_loop: {
    .label __23 = $46
    .label __24 = $48
    // p2_work_ready = 0
    // [522] p2_work_ready = 0 -- vbuz1=vbuc1 
    lda #0
    sta.z p2_work_ready
    // part2_loop::@1
  __b1:
    // while(p2_work_ready==0)
    // [523] if(p2_work_ready==0) goto part2_loop::@1 -- vbuz1_eq_0_then_la1 
    lda.z p2_work_ready
    beq __b1
    // [524] phi from part2_loop::@1 to part2_loop::@2 [phi:part2_loop::@1->part2_loop::@2]
    // part2_loop::@2
    // demo_work()
    // [525] call demo_work
    // Play music
    jsr demo_work
    // part2_loop::@11
    // if(p2_logo_revealing && !p2_logo_reveal_done)
    // [526] if(0==p2_logo_revealing) goto part2_loop::@4 -- 0_eq_vbuz1_then_la1 
    lda.z p2_logo_revealing
    beq __b4
    // part2_loop::@12
    // [527] if(0==p2_logo_reveal_done) goto part2_loop::@3 -- 0_eq_vbuz1_then_la1 
    lda.z p2_logo_reveal_done
    beq __b3
    jmp __b4
    // [528] phi from part2_loop::@12 to part2_loop::@3 [phi:part2_loop::@12->part2_loop::@3]
    // part2_loop::@3
  __b3:
    // p2_logo_reveal()
    // [529] call p2_logo_reveal
    jsr p2_logo_reveal
    // part2_loop::@4
  __b4:
    // demo_frame_count>18*50+25
    // [530] part2_loop::$23 = demo_frame_count -- vwuz1=vwuz2 
    lda.z demo_frame_count
    sta.z __23
    lda.z demo_frame_count+1
    sta.z __23+1
    // if(!p2_logo_revealing && demo_frame_count>18*50+25)
    // [531] if(0!=p2_logo_revealing) goto part2_loop::@5 -- 0_neq_vbuz1_then_la1 
    lda.z p2_logo_revealing
    bne __b5
    // part2_loop::@13
    // [532] if(part2_loop::$23<=(unsigned int)$12*$32+$19) goto part2_loop::@5 -- vwuz1_le_vwuc1_then_la1 
    lda.z __23+1
    cmp #>$12*$32+$19
    bne !+
    lda.z __23
    cmp #<$12*$32+$19
  !:
    bcc __b5
    beq __b5
    // part2_loop::@8
    // p2_logo_revealing = 1
    // [533] p2_logo_revealing = 1 -- vbuz1=vbuc1 
    lda #1
    sta.z p2_logo_revealing
    // part2_loop::@5
  __b5:
    // if(!p2_logo_swinging && p2_logo_reveal_done)
    // [534] if(0!=p2_logo_swinging) goto part2_loop::@6 -- 0_neq_vbuz1_then_la1 
    lda.z p2_logo_swinging
    bne __b6
    // part2_loop::@14
    // [535] if(0==p2_logo_reveal_done) goto part2_loop::@6 -- 0_eq_vbuz1_then_la1 
    lda.z p2_logo_reveal_done
    beq __b6
    // part2_loop::@9
    // p2_logo_swinging = 1
    // [536] p2_logo_swinging = 1 -- vbuz1=vbuc1 
    lda #1
    sta.z p2_logo_swinging
    // part2_loop::@6
  __b6:
    // demo_frame_count>26*50
    // [537] part2_loop::$24 = demo_frame_count -- vwuz1=vwuz2 
    lda.z demo_frame_count
    sta.z __24
    lda.z demo_frame_count+1
    sta.z __24+1
    // if(!p2_plex_scroller_moving && demo_frame_count>26*50)
    // [538] if(0!=p2_plex_scroller_moving) goto part2_loop::@7 -- 0_neq_vbuz1_then_la1 
    lda.z p2_plex_scroller_moving
    bne __b7
    // part2_loop::@15
    // [539] if(part2_loop::$24<=(unsigned int)$1a*$32) goto part2_loop::@7 -- vwuz1_le_vwuc1_then_la1 
    lda.z __24+1
    cmp #>$1a*$32
    bne !+
    lda.z __24
    cmp #<$1a*$32
  !:
    bcc __b7
    beq __b7
    // part2_loop::@10
    // p2_plex_scroller_moving = 1
    // [540] p2_plex_scroller_moving = 1 -- vbuz1=vbuc1 
    lda #1
    sta.z p2_plex_scroller_moving
    // part2_loop::@7
  __b7:
    // p2_work_ready = 0
    // [541] p2_work_ready = 0 -- vbuz1=vbuc1 
    // My work is done!
    lda #0
    sta.z p2_work_ready
    jmp __b1
}
.segment CodePart1
  // flipper_fix_colors
// Fixes the colors for the flipper
// Updates with bitmap colors when the bitmap is being shown
flipper_fix_colors: {
    .label __4 = $48
    .label __5 = $48
    .label __12 = $4a
    .label offset = $4a
    .label colors = $4e
    .label happy_cols = $4a
    .label __13 = $4c
    .label __14 = $4a
    // if(irq_flipper_top_line>0x2e && irq_flipper_top_line<0xf6)
    // [542] if(irq_flipper_top_line<$2e+1) goto flipper_fix_colors::@return -- vwuz1_lt_vbuc1_then_la1 
    lda.z irq_flipper_top_line+1
    bne !+
    lda.z irq_flipper_top_line
    cmp #$2e+1
    bcc __breturn
  !:
    // flipper_fix_colors::@6
    // [543] if(irq_flipper_top_line<$f6) goto flipper_fix_colors::@1 -- vwuz1_lt_vbuc1_then_la1 
    lda.z irq_flipper_top_line+1
    bne !+
    lda.z irq_flipper_top_line
    cmp #$f6
    bcc __b1
  !:
    // flipper_fix_colors::@return
  __breturn:
    // }
    // [544] return 
    rts
    // flipper_fix_colors::@1
  __b1:
    // irq_flipper_top_line-0x2e
    // [545] flipper_fix_colors::$4 = irq_flipper_top_line - $2e -- vwuz1=vwuz2_minus_vbuc1 
    sec
    lda.z irq_flipper_top_line
    sbc #$2e
    sta.z __4
    lda.z irq_flipper_top_line+1
    sbc #0
    sta.z __4+1
    // (irq_flipper_top_line-0x2e)/8
    // [546] flipper_fix_colors::$5 = flipper_fix_colors::$4 >> 3 -- vwuz1=vwuz1_ror_3 
    lsr.z __5+1
    ror.z __5
    lsr.z __5+1
    ror.z __5
    lsr.z __5+1
    ror.z __5
    // char charline = (char)((irq_flipper_top_line-0x2e)/8)
    // [547] flipper_fix_colors::charline#0 = (char)flipper_fix_colors::$5 -- vbuaa=_byte_vwuz1 
    lda.z __5
    // if(charline>=flipper_charline)
    // [548] if(flipper_fix_colors::charline#0<flipper_charline) goto flipper_fix_colors::@return -- vbuaa_lt_vbuz1_then_la1 
    cmp.z flipper_charline
    bcc __breturn
    // flipper_fix_colors::@2
    // unsigned int offset = (unsigned int)flipper_charline*40
    // [549] flipper_fix_colors::$12 = (unsigned int)flipper_charline -- vwuz1=_word_vbuz2 
    lda.z flipper_charline
    sta.z __12
    lda #0
    sta.z __12+1
    // [550] flipper_fix_colors::$13 = flipper_fix_colors::$12 << 2 -- vwuz1=vwuz2_rol_2 
    lda.z __12
    asl
    sta.z __13
    lda.z __12+1
    rol
    sta.z __13+1
    asl.z __13
    rol.z __13+1
    // [551] flipper_fix_colors::$14 = flipper_fix_colors::$13 + flipper_fix_colors::$12 -- vwuz1=vwuz2_plus_vwuz1 
    clc
    lda.z __14
    adc.z __13
    sta.z __14
    lda.z __14+1
    adc.z __13+1
    sta.z __14+1
    // [552] flipper_fix_colors::offset#0 = flipper_fix_colors::$14 << 3 -- vwuz1=vwuz1_rol_3 
    asl.z offset
    rol.z offset+1
    asl.z offset
    rol.z offset+1
    asl.z offset
    rol.z offset+1
    // char* colors = COLS+offset
    // [553] flipper_fix_colors::colors#0 = COLS + flipper_fix_colors::offset#0 -- pbuz1=pbuc1_plus_vwuz2 
    // We have to update some colors
    lda.z offset
    clc
    adc #<COLS
    sta.z colors
    lda.z offset+1
    adc #>COLS
    sta.z colors+1
    // char* happy_cols = P1_COLORS+offset
    // [554] flipper_fix_colors::happy_cols#0 = P1_COLORS + flipper_fix_colors::offset#0 -- pbuz1=pbuc1_plus_vwuz1 
    lda.z happy_cols
    clc
    adc #<P1_COLORS
    sta.z happy_cols
    lda.z happy_cols+1
    adc #>P1_COLORS
    sta.z happy_cols+1
    // [555] phi from flipper_fix_colors::@2 to flipper_fix_colors::@3 [phi:flipper_fix_colors::@2->flipper_fix_colors::@3]
    // [555] phi flipper_fix_colors::i#2 = 0 [phi:flipper_fix_colors::@2->flipper_fix_colors::@3#0] -- vbuyy=vbuc1 
    ldy #0
    // flipper_fix_colors::@3
  __b3:
    // for(char i=0;i<40;i++)
    // [556] if(flipper_fix_colors::i#2<$28) goto flipper_fix_colors::@4 -- vbuyy_lt_vbuc1_then_la1 
    cpy #$28
    bcc __b4
    // flipper_fix_colors::@5
    // flipper_charline++;
    // [557] flipper_charline = ++ flipper_charline -- vbuz1=_inc_vbuz1 
    inc.z flipper_charline
    rts
    // flipper_fix_colors::@4
  __b4:
    // colors[i] = happy_cols[i]
    // [558] flipper_fix_colors::colors#0[flipper_fix_colors::i#2] = flipper_fix_colors::happy_cols#0[flipper_fix_colors::i#2] -- pbuz1_derefidx_vbuyy=pbuz2_derefidx_vbuyy 
    lda (happy_cols),y
    sta (colors),y
    // for(char i=0;i<40;i++)
    // [559] flipper_fix_colors::i#1 = ++ flipper_fix_colors::i#2 -- vbuyy=_inc_vbuyy 
    iny
    // [555] phi from flipper_fix_colors::@4 to flipper_fix_colors::@3 [phi:flipper_fix_colors::@4->flipper_fix_colors::@3]
    // [555] phi flipper_fix_colors::i#2 = flipper_fix_colors::i#1 [phi:flipper_fix_colors::@4->flipper_fix_colors::@3#0] -- register_copy 
    jmp __b3
}
.segment CodePart2
  // p2_logo_reveal
// Reveals the logo column by column
p2_logo_reveal: {
    // if(p2_logo_reveal_idx>=40)
    // [560] if(p2_logo_reveal_idx>=$28) goto p2_logo_reveal::@1 -- vbuz1_ge_vbuc1_then_la1 
    lda.z p2_logo_reveal_idx
    cmp #$28
    bcs __b1
    // p2_logo_reveal::@2
    // vsp_update_screen(p2_logo_reveal_idx++)
    // [561] vsp_update_screen::x_offset = p2_logo_reveal_idx -- vbuz1=vbuz2 
    sta.z vsp_update_screen.x_offset
    // [562] call vsp_update_screen
    jsr vsp_update_screen
    // p2_logo_reveal::@3
    // vsp_update_screen(p2_logo_reveal_idx++);
    // [563] p2_logo_reveal_idx = ++ p2_logo_reveal_idx -- vbuz1=_inc_vbuz1 
    inc.z p2_logo_reveal_idx
    // p2_logo_reveal::@return
    // }
    // [564] return 
    rts
    // p2_logo_reveal::@1
  __b1:
    // p2_logo_reveal_done = 1
    // [565] p2_logo_reveal_done = 1 -- vbuz1=vbuc1 
    lda #1
    sta.z p2_logo_reveal_done
    rts
}
  // File Data
.segment Data
  // The byteboozer decruncher
BYTEBOOZER:
.const B2_ZP_BASE = $fc
    #import "byteboozer_decrunch.asm"

.segment InitPart1
  // MC Bitmap Data
P1_PIXELS_CRUNCHED:
.modify B2() {
        .pc = P1_PIXELS "HAPPYNEWYEAR PIXELS"    
        #import "mcbitmap.asm"
        .var mcBmmData1 = getMcBitmapData(LoadPicture("happy-newyear.png"))
        .for (var y=0; y<25; y++)
            .for (var x=0; x<40; x++)
                .fill 8, getMcPixelData(x, y, i, mcBmmData1)
    }

P1_SCREEN_CRUNCHED:
.modify B2() {
        .pc = P1_SCREEN "HAPPYNEWYEAR SCREEN"    
        .for (var y=0; y<25; y++)
            .for (var x=0; x<40; x++)
                .byte getMcScreenData(x, y, mcBmmData1)
    }

P1_COLORS_CRUNCHED:
.modify B2() {
        .pc = P1_COLORS "HAPPYNEWYEAR COLORS"    
        .for (var y=0; y<25; y++)
            .for (var x=0; x<40; x++)
                .byte getMcColorData(x, y, mcBmmData1)
    }

  // Sparkler sprites
P1_SPRITES_CRUNCHED:
.modify B2() {
        .pc = P1_SPRITES "P1_SPRITES"
        // Pixels                                                    11         01     10       11
        .var p1_sprites = LoadPicture("sparklers.png", List().add($000000, $daccc3, $472a24, $957a71))
        .for(var sx=0;sx<15;sx++) {
            .for (var y=0;y<21; y++) {
                .for (var c=0; c<3; c++) {
                    .byte p1_sprites.getMulticolorByte(sx*3+c,y)
                }
            }
            .byte 0
        }
    }

  // An easing curve from 0x000 to 0x130
FLIPPER_EASING_CRUNCHED:
.modify B2() {
        .pc = FLIPPER_EASING "FLIPPER_EASING"
        .fillword $130, round($98+$98*cos(PI+PI*i/$130))
    }

.segment DataPart1
  // 1 if the raster line is a badline
  .align $100
  RASTER_BADLINES: .fill $130, 0
.segment DataPart2
  // The Y-position (IRQ raster line) starting each bucket
  BUCKET_YPOS: .byte $10, $48, $58, $72, $8e, $aa, $c0, $d0, $de
  // The y-positions of the multiplexer sprites. (These are converted to multiplexer buckets)
  PLEX_YPOS: .fill $20, 0
  // The low byte of the x-positions of the multiplexer sprites 
  PLEX_XPOS: .fill $20, 0
  // The MSB of the x-positions of the multiplexer sprites (0/1)
  PLEX_XPOS_MSB: .fill $20, 0
  // The sprite pointers for the multiplexed sprites
  PLEX_PTR: .fill $20, 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 $20, 0
.segment InitPart2
SPRITES_CRUNCHED:
.modify B2() {
            .pc = PART2_SPRITES "PART2_SPRITES"
	        .var p2_sprites = LoadPicture("spritefont.png", List().add($000000, $ffffff))
	        .for(var sy=0;sy<8;sy++) {
    		    .for(var sx=0;sx<8;sx++) {
    	    	    .for (var y=0;y<21; y++) {
	    	    	    .for (var c=0; c<3; c++) {
    	                	.byte p2_sprites.getSinglecolorByte(sx*3+c,sy*21+y)
	                    }
	                }
	    	        .byte 0
	  	        }
	        }
        }

LOGO_DATA_CRUNCHED:
.modify B2() {
            .pc = LOGO_DATA "LOGO DATA"
            #import "mcbitmap.asm"
            .var mcBmmData2 = getMcBitmapData(LoadPicture("logo-bitmap-640.png"))    
            // Screen data
            .for (var y=0; y<LOGO_HEIGHT; y++)
                .for (var x=0; x<LOGO_WIDTH; x++)
                    .byte getMcScreenData(x, y, mcBmmData2)
            // Color Data
            .for (var y=0; y<LOGO_HEIGHT; y++)
                .for (var x=0; x<LOGO_WIDTH; x++)
                    .byte getMcColorData(x, y, mcBmmData2)
            // Bitmap Data (row by row)
            .for (var y=0; y<LOGO_HEIGHT; y++)
                .for (var i=0; i<8; i++)
                    .for (var x=0; x<LOGO_WIDTH; x++)
                        .byte getMcPixelData(x, y, i, mcBmmData2)
        }

.segment DataPart2
  // A sinus table with values [0;320]
  .align $100
VSP_SINTABLE:
.fillword $100, round(160+160*sin(2*PI*i/256))

  // The sequence of colors for the sprites
  SPRITE_COLOR_SEQUENCE: .byte WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, WHITE, YELLOW, CYAN, GREEN, PURPLE, RED, BLUE, RED, PURPLE, GREEN, CYAN, YELLOW, WHITE, WHITE
  .align $100
SCROLL_YSIN:
.fill $100, round(139+89.5*sin(toRadians(360*i/256)))

  // The buckets containing sprites to show. 8 sprites in each bucket.
  .align $100
  BUCKET_SPRITES: .fill 2*8*9*8, 0
  // Copy of the original buckets containing sprites to show. 8 sprites in each bucket. (Used for adding the plex_id_offset)
  .align $100
  ORIGINAL_BUCKET_SPRITES: .fill 2*8*9*8, 0
  .align $100
XMOVEMENT:
//.lohifill $100, round(344-i*344/$100-86*sin(toRadians(360*i/$100)))
    .lohifill $200, round(344-i*344/$100-129*sin(toRadians(360*i/$100)))
    //.lohifill $100, round(344-i*344/$100-86*sin(toRadians(360*i/$80)))
    //.lohifill $100, round(344-i*344/$100 -86*sin(toRadians(360*i/$100)) -43*sin(toRadians(360*i/$80)))
    //.lohifill $100, 344-i*344/$100

  // The scroll text
  SCROLL_TEXT: .text @"* most people will remember 2020 for a long time. for us nerds, it was a chance to dig deep into our hobbies. but we do miss the demoparties, and drinking beers with you crazy people... it is the 30th birthday of camelot, and this virtual greeting card is our way of celebrating with all of you!     credits  *  code: rex  *  music: linus  *  graphics: bizkid, snabel & vic  *    camelot sends love to \$ff  abyss connection  \$ff  algotech  \$ff  ancients  \$ff  arsenic  \$ff  arise  \$ff  artline designs  \$ff  artstate  \$ff  atlantis  \$ff  bonzai  \$ff  booze design  \$ff  censor design  \$ff  cosine  \$ff  crest  \$ff  chorus  \$ff  dekadence  \$ff  delysid  \$ff  desire  \$ff  elysium  \$ff  excess  \$ff  extend  \$ff  faic  \$ff  f4cg  \$ff  fairlight  \$ff  fossil  \$ff  glance  \$ff  genesis project  \$ff  haujobb  \$ff  hitmen  \$ff  hoaxers  \$ff  hokuto force  \$ff  horizon  \$ff  illusion  \$ff  john dillermand  \$ff  laxity  \$ff  lepsi de  \$ff  lethargy  \$ff  mayday  \$ff  megastyle  \$ff  multistyle labs  \$ff  nah-kolor  \$ff  noice  \$ff  offence  \$ff  onslaught  \$ff  oxyron  \$ff  padua  \$ff  panda design  \$ff  panoramic designs  \$ff  performers  \$ff  plush  \$ff  pretzel logic  \$ff  prosonix  \$ff  proxima  \$ff  rabenauge  \$ff  radwar  \$ff  rebels  \$ff  resource  \$ff  samar  \$ff  scenesat  \$ff  shape  \$ff  siesta  \$ff  silicon ltd.  \$ff  singular  \$ff  software of sweden  \$ff  starion  \$ff  success  \$ff  svenonacid  \$ff  the dreams  \$ff  the solution  \$ff  triad  \$ff  tropyx  \$ff  trsi  \$ff  unicess  \$ff  up rough  \$ff  vision  \$ff  xenon  \$ff  xentax  \$ff  ... we hope to see you all again in 2021...                                "
  .byte 0
.segment InitPart2
PLEX_ID_UPDATERS_CRUNCHED:
.modify B2() {
        .pc = PLEX_ID_UPDATERS "PLEX_ID_UPDATERS"
        // First generate a jump table
        .for(var frame=0;frame<8;frame++) 
            .word updaters[frame].updater
        // Generate the 8 unrolled updaters
        updaters: 
        .for(var frame=0;frame<8;frame++) {
            updater:
            ldx #$1f
            .for(var sprite=0; sprite<9*8; sprite++ ) {
                lda ORIGINAL_BUCKET_SPRITES + frame*8*9*2 + sprite*2 +1
                clc
                adc plex_id_offset
                sax BUCKET_SPRITES + frame*8*9*2 + sprite*2 +1
            }
            rts        
        }
    }

.segment InitDemo
// SID tune
DEMO_MUSIC_CRUNCHED:
.modify B2() {
        .pc = DEMO_MUSIC "MUSIC"
        .const music = LoadSid("do-it-again-$AC00-$FA-8580.sid")
        .fill music.size, music.getData(i)
    }


