
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
