Adding pointer type conversion cast (byte*) PROCPORT_DDR in (byte*) PROCPORT_DDR ← (number) 0 Adding pointer type conversion cast (byte*) PROCPORT in (byte*) PROCPORT ← (number) 1 Adding pointer type conversion cast (byte*) CHARGEN in (byte*) CHARGEN ← (number) $d000 Adding pointer type conversion cast (byte*) SPRITES_XPOS in (byte*) SPRITES_XPOS ← (number) $d000 Adding pointer type conversion cast (byte*) SPRITES_YPOS in (byte*) SPRITES_YPOS ← (number) $d001 Adding pointer type conversion cast (byte*) SPRITES_XMSB in (byte*) SPRITES_XMSB ← (number) $d010 Adding pointer type conversion cast (byte*) RASTER in (byte*) RASTER ← (number) $d012 Adding pointer type conversion cast (byte*) SPRITES_ENABLE in (byte*) SPRITES_ENABLE ← (number) $d015 Adding pointer type conversion cast (byte*) SPRITES_EXPAND_Y in (byte*) SPRITES_EXPAND_Y ← (number) $d017 Adding pointer type conversion cast (byte*) SPRITES_PRIORITY in (byte*) SPRITES_PRIORITY ← (number) $d01b Adding pointer type conversion cast (byte*) SPRITES_MC in (byte*) SPRITES_MC ← (number) $d01c Adding pointer type conversion cast (byte*) SPRITES_EXPAND_X in (byte*) SPRITES_EXPAND_X ← (number) $d01d Adding pointer type conversion cast (byte*) BORDERCOL in (byte*) BORDERCOL ← (number) $d020 Adding pointer type conversion cast (byte*) BGCOL in (byte*) BGCOL ← (number) $d021 Adding pointer type conversion cast (byte*) BGCOL1 in (byte*) BGCOL1 ← (number) $d021 Adding pointer type conversion cast (byte*) BGCOL2 in (byte*) BGCOL2 ← (number) $d022 Adding pointer type conversion cast (byte*) BGCOL3 in (byte*) BGCOL3 ← (number) $d023 Adding pointer type conversion cast (byte*) BGCOL4 in (byte*) BGCOL4 ← (number) $d024 Adding pointer type conversion cast (byte*) SPRITES_MC1 in (byte*) SPRITES_MC1 ← (number) $d025 Adding pointer type conversion cast (byte*) SPRITES_MC2 in (byte*) SPRITES_MC2 ← (number) $d026 Adding pointer type conversion cast (byte*) SPRITES_COLS in (byte*) SPRITES_COLS ← (number) $d027 Adding pointer type conversion cast (byte*) VIC_CONTROL in (byte*) VIC_CONTROL ← (number) $d011 Adding pointer type conversion cast (byte*) D011 in (byte*) D011 ← (number) $d011 Adding pointer type conversion cast (byte*) VIC_CONTROL2 in (byte*) VIC_CONTROL2 ← (number) $d016 Adding pointer type conversion cast (byte*) D016 in (byte*) D016 ← (number) $d016 Adding pointer type conversion cast (byte*) D018 in (byte*) D018 ← (number) $d018 Adding pointer type conversion cast (byte*) VIC_MEMORY in (byte*) VIC_MEMORY ← (number) $d018 Adding pointer type conversion cast (byte*) LIGHTPEN_X in (byte*) LIGHTPEN_X ← (number) $d013 Adding pointer type conversion cast (byte*) LIGHTPEN_Y in (byte*) LIGHTPEN_Y ← (number) $d014 Adding pointer type conversion cast (byte*) IRQ_STATUS in (byte*) IRQ_STATUS ← (number) $d019 Adding pointer type conversion cast (byte*) IRQ_ENABLE in (byte*) IRQ_ENABLE ← (number) $d01a Adding pointer type conversion cast (byte*) COLS in (byte*) COLS ← (number) $d800 Adding pointer type conversion cast (byte*) CIA1_PORT_A in (byte*) CIA1_PORT_A ← (number) $dc00 Adding pointer type conversion cast (byte*) CIA1_PORT_B in (byte*) CIA1_PORT_B ← (number) $dc01 Adding pointer type conversion cast (byte*) CIA1_PORT_A_DDR in (byte*) CIA1_PORT_A_DDR ← (number) $dc02 Adding pointer type conversion cast (byte*) CIA1_PORT_B_DDR in (byte*) CIA1_PORT_B_DDR ← (number) $dc03 Adding pointer type conversion cast (byte*) CIA1_INTERRUPT in (byte*) CIA1_INTERRUPT ← (number) $dc0d Adding pointer type conversion cast (byte*) CIA2_PORT_A in (byte*) CIA2_PORT_A ← (number) $dd00 Adding pointer type conversion cast (byte*) CIA2_PORT_B in (byte*) CIA2_PORT_B ← (number) $dd01 Adding pointer type conversion cast (byte*) CIA2_PORT_A_DDR in (byte*) CIA2_PORT_A_DDR ← (number) $dd02 Adding pointer type conversion cast (byte*) CIA2_PORT_B_DDR in (byte*) CIA2_PORT_B_DDR ← (number) $dd03 Adding pointer type conversion cast (byte*) CIA2_INTERRUPT in (byte*) CIA2_INTERRUPT ← (number) $dd0d Adding pointer type conversion cast (void()**) KERNEL_IRQ in (void()**) KERNEL_IRQ ← (number) $314 Adding pointer type conversion cast (void()**) HARDWARE_IRQ in (void()**) HARDWARE_IRQ ← (number) $fffe Adding pointer type conversion cast (byte*) DTV_FEATURE in (byte*) DTV_FEATURE ← (number) $d03f Adding pointer type conversion cast (byte*) DTV_CONTROL in (byte*) DTV_CONTROL ← (number) $d03c Adding pointer type conversion cast (byte*) DTV_PALETTE in (byte*) DTV_PALETTE ← (number) $d200 Adding pointer type conversion cast (byte*) DTV_PLANEA_START_LO in (byte*) DTV_PLANEA_START_LO ← (number) $d03a Adding pointer type conversion cast (byte*) DTV_PLANEA_START_MI in (byte*) DTV_PLANEA_START_MI ← (number) $d03b Adding pointer type conversion cast (byte*) DTV_PLANEA_START_HI in (byte*) DTV_PLANEA_START_HI ← (number) $d045 Adding pointer type conversion cast (byte*) DTV_PLANEA_STEP in (byte*) DTV_PLANEA_STEP ← (number) $d046 Adding pointer type conversion cast (byte*) DTV_PLANEA_MODULO_LO in (byte*) DTV_PLANEA_MODULO_LO ← (number) $d038 Adding pointer type conversion cast (byte*) DTV_PLANEA_MODULO_HI in (byte*) DTV_PLANEA_MODULO_HI ← (number) $d039 Adding pointer type conversion cast (byte*) DTV_PLANEB_START_LO in (byte*) DTV_PLANEB_START_LO ← (number) $d049 Adding pointer type conversion cast (byte*) DTV_PLANEB_START_MI in (byte*) DTV_PLANEB_START_MI ← (number) $d04a Adding pointer type conversion cast (byte*) DTV_PLANEB_START_HI in (byte*) DTV_PLANEB_START_HI ← (number) $d04b Adding pointer type conversion cast (byte*) DTV_PLANEB_STEP in (byte*) DTV_PLANEB_STEP ← (number) $d04c Adding pointer type conversion cast (byte*) DTV_PLANEB_MODULO_LO in (byte*) DTV_PLANEB_MODULO_LO ← (number) $d047 Adding pointer type conversion cast (byte*) DTV_PLANEB_MODULO_HI in (byte*) DTV_PLANEB_MODULO_HI ← (number) $d048 Adding pointer type conversion cast (byte*) DTV_SPRITE_BANK in (byte*) DTV_SPRITE_BANK ← (number) $d04d Adding pointer type conversion cast (byte*) DTV_COLOR_BANK_LO in (byte*) DTV_COLOR_BANK_LO ← (number) $d036 Adding pointer type conversion cast (byte*) DTV_COLOR_BANK_HI in (byte*) DTV_COLOR_BANK_HI ← (number) $d037 Adding pointer type conversion cast (byte*) DTV_GRAPHICS_VIC_BANK in (byte*) DTV_GRAPHICS_VIC_BANK ← (number) $d03d Adding pointer type conversion cast (byte*) DTV_GRAPHICS_HICOL_BANK in (byte*) DTV_GRAPHICS_HICOL_BANK ← (number) $d03e Adding pointer type conversion cast (byte*) dtvSetCpuBankSegment1::cpuBank in (byte*) dtvSetCpuBankSegment1::cpuBank ← (number) $ff Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCA_LO in (byte*) DTV_BLITTER_SRCA_LO ← (number) $d320 Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCA_MI in (byte*) DTV_BLITTER_SRCA_MI ← (number) $d321 Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCA_HI in (byte*) DTV_BLITTER_SRCA_HI ← (number) $d322 Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCA_MOD_LO in (byte*) DTV_BLITTER_SRCA_MOD_LO ← (number) $d323 Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCA_MOD_HI in (byte*) DTV_BLITTER_SRCA_MOD_HI ← (number) $d324 Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCA_LIN_LO in (byte*) DTV_BLITTER_SRCA_LIN_LO ← (number) $d325 Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCA_LIN_HI in (byte*) DTV_BLITTER_SRCA_LIN_HI ← (number) $d326 Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCA_STEP in (byte*) DTV_BLITTER_SRCA_STEP ← (number) $d327 Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCB_LO in (byte*) DTV_BLITTER_SRCB_LO ← (number) $d328 Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCB_MI in (byte*) DTV_BLITTER_SRCB_MI ← (number) $d329 Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCB_HI in (byte*) DTV_BLITTER_SRCB_HI ← (number) $d32a Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCB_MOD_LO in (byte*) DTV_BLITTER_SRCB_MOD_LO ← (number) $d32b Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCB_MOD_HI in (byte*) DTV_BLITTER_SRCB_MOD_HI ← (number) $d32c Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCB_LIN_LO in (byte*) DTV_BLITTER_SRCB_LIN_LO ← (number) $d32d Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCB_LIN_HI in (byte*) DTV_BLITTER_SRCB_LIN_HI ← (number) $d32e Adding pointer type conversion cast (byte*) DTV_BLITTER_SRCB_STEP in (byte*) DTV_BLITTER_SRCB_STEP ← (number) $d32f Adding pointer type conversion cast (byte*) DTV_BLITTER_DEST_LO in (byte*) DTV_BLITTER_DEST_LO ← (number) $d330 Adding pointer type conversion cast (byte*) DTV_BLITTER_DEST_MI in (byte*) DTV_BLITTER_DEST_MI ← (number) $d331 Adding pointer type conversion cast (byte*) DTV_BLITTER_DEST_HI in (byte*) DTV_BLITTER_DEST_HI ← (number) $d332 Adding pointer type conversion cast (byte*) DTV_BLITTER_DEST_MOD_LO in (byte*) DTV_BLITTER_DEST_MOD_LO ← (number) $d333 Adding pointer type conversion cast (byte*) DTV_BLITTER_DEST_MOD_HI in (byte*) DTV_BLITTER_DEST_MOD_HI ← (number) $d334 Adding pointer type conversion cast (byte*) DTV_BLITTER_DEST_LIN_LO in (byte*) DTV_BLITTER_DEST_LIN_LO ← (number) $d335 Adding pointer type conversion cast (byte*) DTV_BLITTER_DEST_LIN_HI in (byte*) DTV_BLITTER_DEST_LIN_HI ← (number) $d336 Adding pointer type conversion cast (byte*) DTV_BLITTER_DEST_STEP in (byte*) DTV_BLITTER_DEST_STEP ← (number) $d337 Adding pointer type conversion cast (byte*) DTV_BLITTER_LEN_LO in (byte*) DTV_BLITTER_LEN_LO ← (number) $d338 Adding pointer type conversion cast (byte*) DTV_BLITTER_LEN_HI in (byte*) DTV_BLITTER_LEN_HI ← (number) $d339 Adding pointer type conversion cast (byte*) DTV_BLITTER_CONTROL in (byte*) DTV_BLITTER_CONTROL ← (number) $d33a Adding pointer type conversion cast (byte*) DTV_BLITTER_TRANSPARANCY in (byte*) DTV_BLITTER_TRANSPARANCY ← (number) $d33b Adding pointer type conversion cast (byte*) DTV_BLITTER_ALU in (byte*) DTV_BLITTER_ALU ← (number) $d33e Adding pointer type conversion cast (byte*) DTV_BLITTER_CONTROL2 in (byte*) DTV_BLITTER_CONTROL2 ← (number) $d33f Adding pointer type conversion cast (byte*) SCREEN in (byte*) SCREEN ← (number) $400 Identified constant variable (byte*) dtvSetCpuBankSegment1::cpuBank Identified constant variable (byte*) DTV_BLITTER_ALU Inlined call [105] (byte~) vicSelectGfxBank::$0 ← call toDd00 (byte*) vicSelectGfxBank::gfx Culled Empty Block (label) @1 Culled Empty Block (label) @2 Culled Empty Block (label) @3 Culled Empty Block (label) main::@2 CONTROL FLOW GRAPH SSA @begin: scope:[] from to:@4 @4: scope:[] from @begin (byte*) DTV_FEATURE#0 ← ((byte*)) (number) $d03f (byte) DTV_FEATURE_ENABLE#0 ← (number) 1 to:@5 @5: scope:[] from @4 (byte*) DTV_BLITTER_SRCA_LO#0 ← ((byte*)) (number) $d320 (byte*) DTV_BLITTER_SRCA_MI#0 ← ((byte*)) (number) $d321 (byte*) DTV_BLITTER_SRCA_HI#0 ← ((byte*)) (number) $d322 (byte*) DTV_BLITTER_SRCA_MOD_LO#0 ← ((byte*)) (number) $d323 (byte*) DTV_BLITTER_SRCA_MOD_HI#0 ← ((byte*)) (number) $d324 (byte*) DTV_BLITTER_SRCA_LIN_LO#0 ← ((byte*)) (number) $d325 (byte*) DTV_BLITTER_SRCA_LIN_HI#0 ← ((byte*)) (number) $d326 (byte*) DTV_BLITTER_SRCA_STEP#0 ← ((byte*)) (number) $d327 (byte*) DTV_BLITTER_SRCB_LO#0 ← ((byte*)) (number) $d328 (byte*) DTV_BLITTER_SRCB_MI#0 ← ((byte*)) (number) $d329 (byte*) DTV_BLITTER_SRCB_HI#0 ← ((byte*)) (number) $d32a (byte*) DTV_BLITTER_SRCB_MOD_LO#0 ← ((byte*)) (number) $d32b (byte*) DTV_BLITTER_SRCB_MOD_HI#0 ← ((byte*)) (number) $d32c (byte*) DTV_BLITTER_SRCB_LIN_LO#0 ← ((byte*)) (number) $d32d (byte*) DTV_BLITTER_SRCB_LIN_HI#0 ← ((byte*)) (number) $d32e (byte*) DTV_BLITTER_SRCB_STEP#0 ← ((byte*)) (number) $d32f (byte*) DTV_BLITTER_DEST_LO#0 ← ((byte*)) (number) $d330 (byte*) DTV_BLITTER_DEST_MI#0 ← ((byte*)) (number) $d331 (byte*) DTV_BLITTER_DEST_HI#0 ← ((byte*)) (number) $d332 (byte*) DTV_BLITTER_DEST_MOD_LO#0 ← ((byte*)) (number) $d333 (byte*) DTV_BLITTER_DEST_MOD_HI#0 ← ((byte*)) (number) $d334 (byte*) DTV_BLITTER_DEST_LIN_LO#0 ← ((byte*)) (number) $d335 (byte*) DTV_BLITTER_DEST_LIN_HI#0 ← ((byte*)) (number) $d336 (byte*) DTV_BLITTER_DEST_STEP#0 ← ((byte*)) (number) $d337 (byte*) DTV_BLITTER_LEN_LO#0 ← ((byte*)) (number) $d338 (byte*) DTV_BLITTER_LEN_HI#0 ← ((byte*)) (number) $d339 (byte*) DTV_BLITTER_CONTROL#0 ← ((byte*)) (number) $d33a (byte) DTV_BLIT_FORCE_START#0 ← (number) 1 (byte) DTV_BLIT_SRCA_FWD#0 ← (number) 2 (byte) DTV_BLIT_SRCB_FWD#0 ← (number) 4 (byte) DTV_BLIT_DEST_FWD#0 ← (number) 8 (byte*) DTV_BLITTER_TRANSPARANCY#0 ← ((byte*)) (number) $d33b (byte) DTV_BLIT_TRANSPARANCY_NONE#0 ← (number) 0 (byte*) DTV_BLITTER_ALU#0 ← ((byte*)) (number) $d33e (byte) DTV_BLIT_ADD#0 ← (number) $30 (byte*) DTV_BLITTER_CONTROL2#0 ← ((byte*)) (number) $d33f (byte) DTV_BLIT_CLEAR_IRQ#0 ← (number) 1 (byte) DTV_BLIT_DEST_CONT#0 ← (number) 8 (byte) DTV_BLIT_STATUS_BUSY#0 ← (number) 1 (byte*) SCREEN#0 ← ((byte*)) (number) $400 (byte[]) SRCA#0 ← (const string) $0 (byte[]) SRCB#0 ← { (number) $80 } to:@6 main: scope:[main] from @6 *((byte*) DTV_FEATURE#0) ← (byte) DTV_FEATURE_ENABLE#0 *((byte*) DTV_BLITTER_CONTROL2#0) ← (byte) DTV_BLIT_CLEAR_IRQ#0 (byte~) main::$0 ← < (byte[]) SRCA#0 *((byte*) DTV_BLITTER_SRCA_LO#0) ← (byte~) main::$0 (byte~) main::$1 ← > (byte[]) SRCA#0 *((byte*) DTV_BLITTER_SRCA_MI#0) ← (byte~) main::$1 *((byte*) DTV_BLITTER_SRCA_HI#0) ← (number) 0 *((byte*) DTV_BLITTER_SRCA_MOD_LO#0) ← (number) 0 *((byte*) DTV_BLITTER_SRCA_MOD_HI#0) ← (number) 0 (byte~) main::$2 ← < (word) $100 *((byte*) DTV_BLITTER_SRCA_LIN_LO#0) ← (byte~) main::$2 (byte~) main::$3 ← > (word) $100 *((byte*) DTV_BLITTER_SRCA_LIN_HI#0) ← (byte~) main::$3 *((byte*) DTV_BLITTER_SRCA_STEP#0) ← (number) 1 (byte~) main::$4 ← < (byte[]) SRCB#0 *((byte*) DTV_BLITTER_SRCB_LO#0) ← (byte~) main::$4 (byte~) main::$5 ← > (byte[]) SRCB#0 *((byte*) DTV_BLITTER_SRCB_MI#0) ← (byte~) main::$5 *((byte*) DTV_BLITTER_SRCB_HI#0) ← (number) 0 *((byte*) DTV_BLITTER_SRCB_MOD_LO#0) ← (number) 0 *((byte*) DTV_BLITTER_SRCB_MOD_HI#0) ← (number) 0 (byte~) main::$6 ← < (word) $100 *((byte*) DTV_BLITTER_SRCB_LIN_LO#0) ← (byte~) main::$6 (byte~) main::$7 ← > (word) $100 *((byte*) DTV_BLITTER_SRCB_LIN_HI#0) ← (byte~) main::$7 *((byte*) DTV_BLITTER_SRCB_STEP#0) ← (number) 0 (byte*~) main::$8 ← (byte*) SCREEN#0 + (number) $28 (byte*~) main::$9 ← (byte*~) main::$8 + (number) 5 (byte~) main::$10 ← < (byte*~) main::$9 *((byte*) DTV_BLITTER_DEST_LO#0) ← (byte~) main::$10 (byte*~) main::$11 ← (byte*) SCREEN#0 + (number) $28 (byte*~) main::$12 ← (byte*~) main::$11 + (number) 5 (byte~) main::$13 ← > (byte*~) main::$12 *((byte*) DTV_BLITTER_DEST_MI#0) ← (byte~) main::$13 *((byte*) DTV_BLITTER_DEST_HI#0) ← (number) 0 (byte~) main::$14 ← < (word) $15 *((byte*) DTV_BLITTER_DEST_MOD_LO#0) ← (byte~) main::$14 (byte~) main::$15 ← > (word) $15 *((byte*) DTV_BLITTER_DEST_MOD_HI#0) ← (byte~) main::$15 (byte~) main::$16 ← < (word) $13 *((byte*) DTV_BLITTER_DEST_LIN_LO#0) ← (byte~) main::$16 (byte~) main::$17 ← > (word) $13 *((byte*) DTV_BLITTER_DEST_LIN_HI#0) ← (byte~) main::$17 *((byte*) DTV_BLITTER_DEST_STEP#0) ← (number) $10 (number~) main::$18 ← (number) $14 * (word) $a (number~) main::$19 ← < (number~) main::$18 *((byte*) DTV_BLITTER_LEN_LO#0) ← (number~) main::$19 (number~) main::$20 ← (number) $14 * (word) $a (number~) main::$21 ← > (number~) main::$20 *((byte*) DTV_BLITTER_LEN_HI#0) ← (number~) main::$21 *((byte*) DTV_BLITTER_ALU#0) ← (byte) DTV_BLIT_ADD#0 *((byte*) DTV_BLITTER_TRANSPARANCY#0) ← (byte) DTV_BLIT_TRANSPARANCY_NONE#0 (byte~) main::$22 ← (byte) DTV_BLIT_FORCE_START#0 | (byte) DTV_BLIT_SRCA_FWD#0 (byte~) main::$23 ← (byte~) main::$22 | (byte) DTV_BLIT_SRCB_FWD#0 (byte~) main::$24 ← (byte~) main::$23 | (byte) DTV_BLIT_DEST_FWD#0 *((byte*) DTV_BLITTER_CONTROL#0) ← (byte~) main::$24 *((byte*) DTV_BLITTER_CONTROL2#0) ← (byte) DTV_BLIT_DEST_CONT#0 to:main::@1 main::@1: scope:[main] from main main::@1 (byte~) main::$25 ← *((byte*) DTV_BLITTER_CONTROL2#0) & (byte) DTV_BLIT_STATUS_BUSY#0 (bool~) main::$26 ← (byte~) main::$25 != (number) 0 if((bool~) main::$26) goto main::@1 to:main::@return main::@return: scope:[main] from main::@1 return to:@return @6: scope:[] from @5 call main to:@7 @7: scope:[] from @6 to:@end @end: scope:[] from @7 SYMBOL TABLE SSA (const string) $0 = (string) "camelot rules!@" (label) @4 (label) @5 (label) @6 (label) @7 (label) @begin (label) @end (byte*) DTV_BLITTER_ALU (byte*) DTV_BLITTER_ALU#0 (byte*) DTV_BLITTER_CONTROL (byte*) DTV_BLITTER_CONTROL#0 (byte*) DTV_BLITTER_CONTROL2 (byte*) DTV_BLITTER_CONTROL2#0 (byte*) DTV_BLITTER_DEST_HI (byte*) DTV_BLITTER_DEST_HI#0 (byte*) DTV_BLITTER_DEST_LIN_HI (byte*) DTV_BLITTER_DEST_LIN_HI#0 (byte*) DTV_BLITTER_DEST_LIN_LO (byte*) DTV_BLITTER_DEST_LIN_LO#0 (byte*) DTV_BLITTER_DEST_LO (byte*) DTV_BLITTER_DEST_LO#0 (byte*) DTV_BLITTER_DEST_MI (byte*) DTV_BLITTER_DEST_MI#0 (byte*) DTV_BLITTER_DEST_MOD_HI (byte*) DTV_BLITTER_DEST_MOD_HI#0 (byte*) DTV_BLITTER_DEST_MOD_LO (byte*) DTV_BLITTER_DEST_MOD_LO#0 (byte*) DTV_BLITTER_DEST_STEP (byte*) DTV_BLITTER_DEST_STEP#0 (byte*) DTV_BLITTER_LEN_HI (byte*) DTV_BLITTER_LEN_HI#0 (byte*) DTV_BLITTER_LEN_LO (byte*) DTV_BLITTER_LEN_LO#0 (byte*) DTV_BLITTER_SRCA_HI (byte*) DTV_BLITTER_SRCA_HI#0 (byte*) DTV_BLITTER_SRCA_LIN_HI (byte*) DTV_BLITTER_SRCA_LIN_HI#0 (byte*) DTV_BLITTER_SRCA_LIN_LO (byte*) DTV_BLITTER_SRCA_LIN_LO#0 (byte*) DTV_BLITTER_SRCA_LO (byte*) DTV_BLITTER_SRCA_LO#0 (byte*) DTV_BLITTER_SRCA_MI (byte*) DTV_BLITTER_SRCA_MI#0 (byte*) DTV_BLITTER_SRCA_MOD_HI (byte*) DTV_BLITTER_SRCA_MOD_HI#0 (byte*) DTV_BLITTER_SRCA_MOD_LO (byte*) DTV_BLITTER_SRCA_MOD_LO#0 (byte*) DTV_BLITTER_SRCA_STEP (byte*) DTV_BLITTER_SRCA_STEP#0 (byte*) DTV_BLITTER_SRCB_HI (byte*) DTV_BLITTER_SRCB_HI#0 (byte*) DTV_BLITTER_SRCB_LIN_HI (byte*) DTV_BLITTER_SRCB_LIN_HI#0 (byte*) DTV_BLITTER_SRCB_LIN_LO (byte*) DTV_BLITTER_SRCB_LIN_LO#0 (byte*) DTV_BLITTER_SRCB_LO (byte*) DTV_BLITTER_SRCB_LO#0 (byte*) DTV_BLITTER_SRCB_MI (byte*) DTV_BLITTER_SRCB_MI#0 (byte*) DTV_BLITTER_SRCB_MOD_HI (byte*) DTV_BLITTER_SRCB_MOD_HI#0 (byte*) DTV_BLITTER_SRCB_MOD_LO (byte*) DTV_BLITTER_SRCB_MOD_LO#0 (byte*) DTV_BLITTER_SRCB_STEP (byte*) DTV_BLITTER_SRCB_STEP#0 (byte*) DTV_BLITTER_TRANSPARANCY (byte*) DTV_BLITTER_TRANSPARANCY#0 (byte) DTV_BLIT_ADD (byte) DTV_BLIT_ADD#0 (byte) DTV_BLIT_CLEAR_IRQ (byte) DTV_BLIT_CLEAR_IRQ#0 (byte) DTV_BLIT_DEST_CONT (byte) DTV_BLIT_DEST_CONT#0 (byte) DTV_BLIT_DEST_FWD (byte) DTV_BLIT_DEST_FWD#0 (byte) DTV_BLIT_FORCE_START (byte) DTV_BLIT_FORCE_START#0 (byte) DTV_BLIT_SRCA_FWD (byte) DTV_BLIT_SRCA_FWD#0 (byte) DTV_BLIT_SRCB_FWD (byte) DTV_BLIT_SRCB_FWD#0 (byte) DTV_BLIT_STATUS_BUSY (byte) DTV_BLIT_STATUS_BUSY#0 (byte) DTV_BLIT_TRANSPARANCY_NONE (byte) DTV_BLIT_TRANSPARANCY_NONE#0 (byte*) DTV_FEATURE (byte*) DTV_FEATURE#0 (byte) DTV_FEATURE_ENABLE (byte) DTV_FEATURE_ENABLE#0 (byte*) SCREEN (byte*) SCREEN#0 (byte[]) SRCA (byte[]) SRCA#0 (byte[]) SRCB (byte[]) SRCB#0 (void()) main() (byte~) main::$0 (byte~) main::$1 (byte~) main::$10 (byte*~) main::$11 (byte*~) main::$12 (byte~) main::$13 (byte~) main::$14 (byte~) main::$15 (byte~) main::$16 (byte~) main::$17 (number~) main::$18 (number~) main::$19 (byte~) main::$2 (number~) main::$20 (number~) main::$21 (byte~) main::$22 (byte~) main::$23 (byte~) main::$24 (byte~) main::$25 (bool~) main::$26 (byte~) main::$3 (byte~) main::$4 (byte~) main::$5 (byte~) main::$6 (byte~) main::$7 (byte*~) main::$8 (byte*~) main::$9 (label) main::@1 (label) main::@return Adding number conversion cast (unumber) 1 in (byte) DTV_FEATURE_ENABLE#0 ← (number) 1 Adding number conversion cast (unumber) 1 in (byte) DTV_BLIT_FORCE_START#0 ← (number) 1 Adding number conversion cast (unumber) 2 in (byte) DTV_BLIT_SRCA_FWD#0 ← (number) 2 Adding number conversion cast (unumber) 4 in (byte) DTV_BLIT_SRCB_FWD#0 ← (number) 4 Adding number conversion cast (unumber) 8 in (byte) DTV_BLIT_DEST_FWD#0 ← (number) 8 Adding number conversion cast (unumber) 0 in (byte) DTV_BLIT_TRANSPARANCY_NONE#0 ← (number) 0 Adding number conversion cast (unumber) $30 in (byte) DTV_BLIT_ADD#0 ← (number) $30 Adding number conversion cast (unumber) 1 in (byte) DTV_BLIT_CLEAR_IRQ#0 ← (number) 1 Adding number conversion cast (unumber) 8 in (byte) DTV_BLIT_DEST_CONT#0 ← (number) 8 Adding number conversion cast (unumber) 1 in (byte) DTV_BLIT_STATUS_BUSY#0 ← (number) 1 Adding number conversion cast (unumber) 0 in *((byte*) DTV_BLITTER_SRCA_HI#0) ← (number) 0 Adding number conversion cast (unumber) 0 in *((byte*) DTV_BLITTER_SRCA_MOD_LO#0) ← (number) 0 Adding number conversion cast (unumber) 0 in *((byte*) DTV_BLITTER_SRCA_MOD_HI#0) ← (number) 0 Adding number conversion cast (unumber) 1 in *((byte*) DTV_BLITTER_SRCA_STEP#0) ← (number) 1 Adding number conversion cast (unumber) 0 in *((byte*) DTV_BLITTER_SRCB_HI#0) ← (number) 0 Adding number conversion cast (unumber) 0 in *((byte*) DTV_BLITTER_SRCB_MOD_LO#0) ← (number) 0 Adding number conversion cast (unumber) 0 in *((byte*) DTV_BLITTER_SRCB_MOD_HI#0) ← (number) 0 Adding number conversion cast (unumber) 0 in *((byte*) DTV_BLITTER_SRCB_STEP#0) ← (number) 0 Adding number conversion cast (unumber) $28 in (byte*~) main::$8 ← (byte*) SCREEN#0 + (number) $28 Adding number conversion cast (unumber) 5 in (byte*~) main::$9 ← (byte*~) main::$8 + (number) 5 Adding number conversion cast (unumber) $28 in (byte*~) main::$11 ← (byte*) SCREEN#0 + (number) $28 Adding number conversion cast (unumber) 5 in (byte*~) main::$12 ← (byte*~) main::$11 + (number) 5 Adding number conversion cast (unumber) 0 in *((byte*) DTV_BLITTER_DEST_HI#0) ← (number) 0 Adding number conversion cast (unumber) $10 in *((byte*) DTV_BLITTER_DEST_STEP#0) ← (number) $10 Adding number conversion cast (unumber) $14 in (number~) main::$18 ← (number) $14 * (word) $a Adding number conversion cast (unumber) main::$18 in (number~) main::$18 ← (unumber)(number) $14 * (word) $a Adding number conversion cast (unumber) main::$19 in (number~) main::$19 ← < (unumber~) main::$18 Adding number conversion cast (unumber) $14 in (number~) main::$20 ← (number) $14 * (word) $a Adding number conversion cast (unumber) main::$20 in (number~) main::$20 ← (unumber)(number) $14 * (word) $a Adding number conversion cast (unumber) main::$21 in (number~) main::$21 ← > (unumber~) main::$20 Adding number conversion cast (unumber) 0 in (bool~) main::$26 ← (byte~) main::$25 != (number) 0 Successful SSA optimization PassNAddNumberTypeConversions Adding number conversion cast (byte) to elements in (byte[]) SRCB#0 ← { (byte)(number) $80 } Successful SSA optimization PassNAddArrayNumberTypeConversions Inlining cast (byte*) DTV_FEATURE#0 ← (byte*)(number) $d03f Inlining cast (byte) DTV_FEATURE_ENABLE#0 ← (unumber)(number) 1 Inlining cast (byte*) DTV_BLITTER_SRCA_LO#0 ← (byte*)(number) $d320 Inlining cast (byte*) DTV_BLITTER_SRCA_MI#0 ← (byte*)(number) $d321 Inlining cast (byte*) DTV_BLITTER_SRCA_HI#0 ← (byte*)(number) $d322 Inlining cast (byte*) DTV_BLITTER_SRCA_MOD_LO#0 ← (byte*)(number) $d323 Inlining cast (byte*) DTV_BLITTER_SRCA_MOD_HI#0 ← (byte*)(number) $d324 Inlining cast (byte*) DTV_BLITTER_SRCA_LIN_LO#0 ← (byte*)(number) $d325 Inlining cast (byte*) DTV_BLITTER_SRCA_LIN_HI#0 ← (byte*)(number) $d326 Inlining cast (byte*) DTV_BLITTER_SRCA_STEP#0 ← (byte*)(number) $d327 Inlining cast (byte*) DTV_BLITTER_SRCB_LO#0 ← (byte*)(number) $d328 Inlining cast (byte*) DTV_BLITTER_SRCB_MI#0 ← (byte*)(number) $d329 Inlining cast (byte*) DTV_BLITTER_SRCB_HI#0 ← (byte*)(number) $d32a Inlining cast (byte*) DTV_BLITTER_SRCB_MOD_LO#0 ← (byte*)(number) $d32b Inlining cast (byte*) DTV_BLITTER_SRCB_MOD_HI#0 ← (byte*)(number) $d32c Inlining cast (byte*) DTV_BLITTER_SRCB_LIN_LO#0 ← (byte*)(number) $d32d Inlining cast (byte*) DTV_BLITTER_SRCB_LIN_HI#0 ← (byte*)(number) $d32e Inlining cast (byte*) DTV_BLITTER_SRCB_STEP#0 ← (byte*)(number) $d32f Inlining cast (byte*) DTV_BLITTER_DEST_LO#0 ← (byte*)(number) $d330 Inlining cast (byte*) DTV_BLITTER_DEST_MI#0 ← (byte*)(number) $d331 Inlining cast (byte*) DTV_BLITTER_DEST_HI#0 ← (byte*)(number) $d332 Inlining cast (byte*) DTV_BLITTER_DEST_MOD_LO#0 ← (byte*)(number) $d333 Inlining cast (byte*) DTV_BLITTER_DEST_MOD_HI#0 ← (byte*)(number) $d334 Inlining cast (byte*) DTV_BLITTER_DEST_LIN_LO#0 ← (byte*)(number) $d335 Inlining cast (byte*) DTV_BLITTER_DEST_LIN_HI#0 ← (byte*)(number) $d336 Inlining cast (byte*) DTV_BLITTER_DEST_STEP#0 ← (byte*)(number) $d337 Inlining cast (byte*) DTV_BLITTER_LEN_LO#0 ← (byte*)(number) $d338 Inlining cast (byte*) DTV_BLITTER_LEN_HI#0 ← (byte*)(number) $d339 Inlining cast (byte*) DTV_BLITTER_CONTROL#0 ← (byte*)(number) $d33a Inlining cast (byte) DTV_BLIT_FORCE_START#0 ← (unumber)(number) 1 Inlining cast (byte) DTV_BLIT_SRCA_FWD#0 ← (unumber)(number) 2 Inlining cast (byte) DTV_BLIT_SRCB_FWD#0 ← (unumber)(number) 4 Inlining cast (byte) DTV_BLIT_DEST_FWD#0 ← (unumber)(number) 8 Inlining cast (byte*) DTV_BLITTER_TRANSPARANCY#0 ← (byte*)(number) $d33b Inlining cast (byte) DTV_BLIT_TRANSPARANCY_NONE#0 ← (unumber)(number) 0 Inlining cast (byte*) DTV_BLITTER_ALU#0 ← (byte*)(number) $d33e Inlining cast (byte) DTV_BLIT_ADD#0 ← (unumber)(number) $30 Inlining cast (byte*) DTV_BLITTER_CONTROL2#0 ← (byte*)(number) $d33f Inlining cast (byte) DTV_BLIT_CLEAR_IRQ#0 ← (unumber)(number) 1 Inlining cast (byte) DTV_BLIT_DEST_CONT#0 ← (unumber)(number) 8 Inlining cast (byte) DTV_BLIT_STATUS_BUSY#0 ← (unumber)(number) 1 Inlining cast (byte*) SCREEN#0 ← (byte*)(number) $400 Inlining cast *((byte*) DTV_BLITTER_SRCA_HI#0) ← (unumber)(number) 0 Inlining cast *((byte*) DTV_BLITTER_SRCA_MOD_LO#0) ← (unumber)(number) 0 Inlining cast *((byte*) DTV_BLITTER_SRCA_MOD_HI#0) ← (unumber)(number) 0 Inlining cast *((byte*) DTV_BLITTER_SRCA_STEP#0) ← (unumber)(number) 1 Inlining cast *((byte*) DTV_BLITTER_SRCB_HI#0) ← (unumber)(number) 0 Inlining cast *((byte*) DTV_BLITTER_SRCB_MOD_LO#0) ← (unumber)(number) 0 Inlining cast *((byte*) DTV_BLITTER_SRCB_MOD_HI#0) ← (unumber)(number) 0 Inlining cast *((byte*) DTV_BLITTER_SRCB_STEP#0) ← (unumber)(number) 0 Inlining cast *((byte*) DTV_BLITTER_DEST_HI#0) ← (unumber)(number) 0 Inlining cast *((byte*) DTV_BLITTER_DEST_STEP#0) ← (unumber)(number) $10 Successful SSA optimization Pass2InlineCast Simplifying constant pointer cast (byte*) 53311 Simplifying constant integer cast 1 Simplifying constant pointer cast (byte*) 54048 Simplifying constant pointer cast (byte*) 54049 Simplifying constant pointer cast (byte*) 54050 Simplifying constant pointer cast (byte*) 54051 Simplifying constant pointer cast (byte*) 54052 Simplifying constant pointer cast (byte*) 54053 Simplifying constant pointer cast (byte*) 54054 Simplifying constant pointer cast (byte*) 54055 Simplifying constant pointer cast (byte*) 54056 Simplifying constant pointer cast (byte*) 54057 Simplifying constant pointer cast (byte*) 54058 Simplifying constant pointer cast (byte*) 54059 Simplifying constant pointer cast (byte*) 54060 Simplifying constant pointer cast (byte*) 54061 Simplifying constant pointer cast (byte*) 54062 Simplifying constant pointer cast (byte*) 54063 Simplifying constant pointer cast (byte*) 54064 Simplifying constant pointer cast (byte*) 54065 Simplifying constant pointer cast (byte*) 54066 Simplifying constant pointer cast (byte*) 54067 Simplifying constant pointer cast (byte*) 54068 Simplifying constant pointer cast (byte*) 54069 Simplifying constant pointer cast (byte*) 54070 Simplifying constant pointer cast (byte*) 54071 Simplifying constant pointer cast (byte*) 54072 Simplifying constant pointer cast (byte*) 54073 Simplifying constant pointer cast (byte*) 54074 Simplifying constant integer cast 1 Simplifying constant integer cast 2 Simplifying constant integer cast 4 Simplifying constant integer cast 8 Simplifying constant pointer cast (byte*) 54075 Simplifying constant integer cast 0 Simplifying constant pointer cast (byte*) 54078 Simplifying constant integer cast $30 Simplifying constant pointer cast (byte*) 54079 Simplifying constant integer cast 1 Simplifying constant integer cast 8 Simplifying constant integer cast 1 Simplifying constant pointer cast (byte*) 1024 Simplifying constant integer cast $80 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 0 Simplifying constant integer cast 0 Simplifying constant integer cast 0 Simplifying constant integer cast $28 Simplifying constant integer cast 5 Simplifying constant integer cast $28 Simplifying constant integer cast 5 Simplifying constant integer cast 0 Simplifying constant integer cast $10 Simplifying constant integer cast $14 Simplifying constant integer cast $14 Simplifying constant integer cast 0 Successful SSA optimization PassNCastSimplification Finalized unsigned number type (byte) 1 Finalized unsigned number type (byte) 1 Finalized unsigned number type (byte) 2 Finalized unsigned number type (byte) 4 Finalized unsigned number type (byte) 8 Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) $30 Finalized unsigned number type (byte) 1 Finalized unsigned number type (byte) 8 Finalized unsigned number type (byte) 1 Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) 1 Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) $28 Finalized unsigned number type (byte) 5 Finalized unsigned number type (byte) $28 Finalized unsigned number type (byte) 5 Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) $10 Finalized unsigned number type (byte) $14 Finalized unsigned number type (byte) $14 Finalized unsigned number type (byte) 0 Successful SSA optimization PassNFinalizeNumberTypeConversions Inferred type updated to word in (unumber~) main::$18 ← (byte) $14 * (word) $a Inferred type updated to byte in (unumber~) main::$19 ← < (word~) main::$18 Inferred type updated to word in (unumber~) main::$20 ← (byte) $14 * (word) $a Inferred type updated to byte in (unumber~) main::$21 ← > (word~) main::$20 Simple Condition (bool~) main::$26 [103] if((byte~) main::$25!=(byte) 0) goto main::@1 Successful SSA optimization Pass2ConditionalJumpSimplification Constant right-side identified [43] (byte[]) SRCB#0 ← { (byte) $80 } Constant right-side identified [53] (byte~) main::$2 ← < (word) $100 Constant right-side identified [55] (byte~) main::$3 ← > (word) $100 Constant right-side identified [65] (byte~) main::$6 ← < (word) $100 Constant right-side identified [67] (byte~) main::$7 ← > (word) $100 Constant right-side identified [79] (byte~) main::$14 ← < (word) $15 Constant right-side identified [81] (byte~) main::$15 ← > (word) $15 Constant right-side identified [83] (byte~) main::$16 ← < (word) $13 Constant right-side identified [85] (byte~) main::$17 ← > (word) $13 Constant right-side identified [88] (word~) main::$18 ← (byte) $14 * (word) $a Constant right-side identified [91] (word~) main::$20 ← (byte) $14 * (word) $a Successful SSA optimization Pass2ConstantRValueConsolidation Constant (const byte*) DTV_FEATURE#0 = (byte*) 53311 Constant (const byte) DTV_FEATURE_ENABLE#0 = 1 Constant (const byte*) DTV_BLITTER_SRCA_LO#0 = (byte*) 54048 Constant (const byte*) DTV_BLITTER_SRCA_MI#0 = (byte*) 54049 Constant (const byte*) DTV_BLITTER_SRCA_HI#0 = (byte*) 54050 Constant (const byte*) DTV_BLITTER_SRCA_MOD_LO#0 = (byte*) 54051 Constant (const byte*) DTV_BLITTER_SRCA_MOD_HI#0 = (byte*) 54052 Constant (const byte*) DTV_BLITTER_SRCA_LIN_LO#0 = (byte*) 54053 Constant (const byte*) DTV_BLITTER_SRCA_LIN_HI#0 = (byte*) 54054 Constant (const byte*) DTV_BLITTER_SRCA_STEP#0 = (byte*) 54055 Constant (const byte*) DTV_BLITTER_SRCB_LO#0 = (byte*) 54056 Constant (const byte*) DTV_BLITTER_SRCB_MI#0 = (byte*) 54057 Constant (const byte*) DTV_BLITTER_SRCB_HI#0 = (byte*) 54058 Constant (const byte*) DTV_BLITTER_SRCB_MOD_LO#0 = (byte*) 54059 Constant (const byte*) DTV_BLITTER_SRCB_MOD_HI#0 = (byte*) 54060 Constant (const byte*) DTV_BLITTER_SRCB_LIN_LO#0 = (byte*) 54061 Constant (const byte*) DTV_BLITTER_SRCB_LIN_HI#0 = (byte*) 54062 Constant (const byte*) DTV_BLITTER_SRCB_STEP#0 = (byte*) 54063 Constant (const byte*) DTV_BLITTER_DEST_LO#0 = (byte*) 54064 Constant (const byte*) DTV_BLITTER_DEST_MI#0 = (byte*) 54065 Constant (const byte*) DTV_BLITTER_DEST_HI#0 = (byte*) 54066 Constant (const byte*) DTV_BLITTER_DEST_MOD_LO#0 = (byte*) 54067 Constant (const byte*) DTV_BLITTER_DEST_MOD_HI#0 = (byte*) 54068 Constant (const byte*) DTV_BLITTER_DEST_LIN_LO#0 = (byte*) 54069 Constant (const byte*) DTV_BLITTER_DEST_LIN_HI#0 = (byte*) 54070 Constant (const byte*) DTV_BLITTER_DEST_STEP#0 = (byte*) 54071 Constant (const byte*) DTV_BLITTER_LEN_LO#0 = (byte*) 54072 Constant (const byte*) DTV_BLITTER_LEN_HI#0 = (byte*) 54073 Constant (const byte*) DTV_BLITTER_CONTROL#0 = (byte*) 54074 Constant (const byte) DTV_BLIT_FORCE_START#0 = 1 Constant (const byte) DTV_BLIT_SRCA_FWD#0 = 2 Constant (const byte) DTV_BLIT_SRCB_FWD#0 = 4 Constant (const byte) DTV_BLIT_DEST_FWD#0 = 8 Constant (const byte*) DTV_BLITTER_TRANSPARANCY#0 = (byte*) 54075 Constant (const byte) DTV_BLIT_TRANSPARANCY_NONE#0 = 0 Constant (const byte*) DTV_BLITTER_ALU#0 = (byte*) 54078 Constant (const byte) DTV_BLIT_ADD#0 = $30 Constant (const byte*) DTV_BLITTER_CONTROL2#0 = (byte*) 54079 Constant (const byte) DTV_BLIT_CLEAR_IRQ#0 = 1 Constant (const byte) DTV_BLIT_DEST_CONT#0 = 8 Constant (const byte) DTV_BLIT_STATUS_BUSY#0 = 1 Constant (const byte*) SCREEN#0 = (byte*) 1024 Constant (const byte[]) SRCA#0 = $0 Constant (const byte[]) SRCB#0 = { $80 } Constant (const byte) main::$2 = <$100 Constant (const byte) main::$3 = >$100 Constant (const byte) main::$6 = <$100 Constant (const byte) main::$7 = >$100 Constant (const byte) main::$14 = <$15 Constant (const byte) main::$15 = >$15 Constant (const byte) main::$16 = <$13 Constant (const byte) main::$17 = >$13 Constant (const word) main::$18 = $14*$a Constant (const word) main::$20 = $14*$a Successful SSA optimization Pass2ConstantIdentification Simplifying constant evaluating to zero <(word) $100 in Simplifying constant evaluating to zero <(word) $100 in Simplifying constant evaluating to zero >(word) $15 in Simplifying constant evaluating to zero >(word) $13 in Successful SSA optimization PassNSimplifyConstantZero Constant right-side identified [2] (byte~) main::$0 ← < (const byte[]) SRCA#0 Constant right-side identified [4] (byte~) main::$1 ← > (const byte[]) SRCA#0 Constant right-side identified [12] (byte~) main::$4 ← < (const byte[]) SRCB#0 Constant right-side identified [14] (byte~) main::$5 ← > (const byte[]) SRCB#0 Constant right-side identified [22] (byte*~) main::$8 ← (const byte*) SCREEN#0 + (byte) $28 Constant right-side identified [26] (byte*~) main::$11 ← (const byte*) SCREEN#0 + (byte) $28 Constant right-side identified [36] (byte~) main::$19 ← < (const word) main::$18 Constant right-side identified [38] (byte~) main::$21 ← > (const word) main::$20 Constant right-side identified [42] (byte~) main::$22 ← (const byte) DTV_BLIT_FORCE_START#0 | (const byte) DTV_BLIT_SRCA_FWD#0 Successful SSA optimization Pass2ConstantRValueConsolidation Constant (const byte) main::$0 = SRCA#0 Constant (const byte) main::$4 = SRCB#0 Constant (const byte*) main::$8 = SCREEN#0+$28 Constant (const byte*) main::$11 = SCREEN#0+$28 Constant (const byte) main::$19 = main::$20 Constant (const byte) main::$22 = DTV_BLIT_FORCE_START#0|DTV_BLIT_SRCA_FWD#0 Successful SSA optimization Pass2ConstantIdentification Simplifying constant evaluating to zero >(const word) main::$20 in Successful SSA optimization PassNSimplifyConstantZero Eliminating unused constant (const word) main::$20 Successful SSA optimization PassNEliminateUnusedVars Constant right-side identified [18] (byte*~) main::$9 ← (const byte*) main::$8 + (byte) 5 Constant right-side identified [21] (byte*~) main::$12 ← (const byte*) main::$11 + (byte) 5 Constant right-side identified [34] (byte~) main::$23 ← (const byte) main::$22 | (const byte) DTV_BLIT_SRCB_FWD#0 Successful SSA optimization Pass2ConstantRValueConsolidation Constant (const byte*) main::$9 = main::$8+5 Constant (const byte*) main::$12 = main::$11+5 Constant (const byte) main::$23 = main::$22|DTV_BLIT_SRCB_FWD#0 Successful SSA optimization Pass2ConstantIdentification Constant right-side identified [18] (byte~) main::$10 ← < (const byte*) main::$9 Constant right-side identified [20] (byte~) main::$13 ← > (const byte*) main::$12 Constant right-side identified [32] (byte~) main::$24 ← (const byte) main::$23 | (const byte) DTV_BLIT_DEST_FWD#0 Successful SSA optimization Pass2ConstantRValueConsolidation Constant (const byte) main::$10 = main::$12 Constant (const byte) main::$24 = main::$23|DTV_BLIT_DEST_FWD#0 Successful SSA optimization Pass2ConstantIdentification Constant inlined main::$12 = (const byte*) SCREEN#0+(byte) $28+(byte) 5 Constant inlined main::$13 = >(const byte*) SCREEN#0+(byte) $28+(byte) 5 Constant inlined main::$14 = <(word) $15 Constant inlined main::$15 = (byte) 0 Constant inlined $0 = (const byte[]) SRCA#0 Constant inlined main::$10 = <(const byte*) SCREEN#0+(byte) $28+(byte) 5 Constant inlined main::$11 = (const byte*) SCREEN#0+(byte) $28 Constant inlined main::$16 = <(word) $13 Constant inlined main::$17 = (byte) 0 Constant inlined main::$18 = (byte) $14*(word) $a Constant inlined main::$19 = <(byte) $14*(word) $a Constant inlined main::$23 = (const byte) DTV_BLIT_FORCE_START#0|(const byte) DTV_BLIT_SRCA_FWD#0|(const byte) DTV_BLIT_SRCB_FWD#0 Constant inlined main::$24 = (const byte) DTV_BLIT_FORCE_START#0|(const byte) DTV_BLIT_SRCA_FWD#0|(const byte) DTV_BLIT_SRCB_FWD#0|(const byte) DTV_BLIT_DEST_FWD#0 Constant inlined main::$21 = (byte) 0 Constant inlined main::$22 = (const byte) DTV_BLIT_FORCE_START#0|(const byte) DTV_BLIT_SRCA_FWD#0 Constant inlined main::$1 = >(const byte[]) SRCA#0 Constant inlined main::$2 = (byte) 0 Constant inlined main::$0 = <(const byte[]) SRCA#0 Constant inlined main::$5 = >(const byte[]) SRCB#0 Constant inlined main::$6 = (byte) 0 Constant inlined main::$3 = >(word) $100 Constant inlined main::$4 = <(const byte[]) SRCB#0 Constant inlined main::$9 = (const byte*) SCREEN#0+(byte) $28+(byte) 5 Constant inlined main::$7 = >(word) $100 Constant inlined main::$8 = (const byte*) SCREEN#0+(byte) $28 Successful SSA optimization Pass2ConstantInlining Adding NOP phi() at start of @begin Adding NOP phi() at start of @4 Adding NOP phi() at start of @5 Adding NOP phi() at start of @6 Adding NOP phi() at start of @7 Adding NOP phi() at start of @end CALL GRAPH Calls in [] to main:4 Created 0 initial phi equivalence classes Coalesced down to 0 phi equivalence classes Culled Empty Block (label) @4 Culled Empty Block (label) @5 Culled Empty Block (label) @7 Renumbering block @6 to @1 Adding NOP phi() at start of @begin Adding NOP phi() at start of @1 Adding NOP phi() at start of @end FINAL CONTROL FLOW GRAPH @begin: scope:[] from [0] phi() to:@1 @1: scope:[] from @begin [1] phi() [2] call main to:@end @end: scope:[] from @1 [3] phi() main: scope:[main] from @1 [4] *((const byte*) DTV_FEATURE#0) ← (const byte) DTV_FEATURE_ENABLE#0 [5] *((const byte*) DTV_BLITTER_CONTROL2#0) ← (const byte) DTV_BLIT_CLEAR_IRQ#0 [6] *((const byte*) DTV_BLITTER_SRCA_LO#0) ← <(const byte[]) SRCA#0 [7] *((const byte*) DTV_BLITTER_SRCA_MI#0) ← >(const byte[]) SRCA#0 [8] *((const byte*) DTV_BLITTER_SRCA_HI#0) ← (byte) 0 [9] *((const byte*) DTV_BLITTER_SRCA_MOD_LO#0) ← (byte) 0 [10] *((const byte*) DTV_BLITTER_SRCA_MOD_HI#0) ← (byte) 0 [11] *((const byte*) DTV_BLITTER_SRCA_LIN_LO#0) ← (byte) 0 [12] *((const byte*) DTV_BLITTER_SRCA_LIN_HI#0) ← >(word) $100 [13] *((const byte*) DTV_BLITTER_SRCA_STEP#0) ← (byte) 1 [14] *((const byte*) DTV_BLITTER_SRCB_LO#0) ← <(const byte[]) SRCB#0 [15] *((const byte*) DTV_BLITTER_SRCB_MI#0) ← >(const byte[]) SRCB#0 [16] *((const byte*) DTV_BLITTER_SRCB_HI#0) ← (byte) 0 [17] *((const byte*) DTV_BLITTER_SRCB_MOD_LO#0) ← (byte) 0 [18] *((const byte*) DTV_BLITTER_SRCB_MOD_HI#0) ← (byte) 0 [19] *((const byte*) DTV_BLITTER_SRCB_LIN_LO#0) ← (byte) 0 [20] *((const byte*) DTV_BLITTER_SRCB_LIN_HI#0) ← >(word) $100 [21] *((const byte*) DTV_BLITTER_SRCB_STEP#0) ← (byte) 0 [22] *((const byte*) DTV_BLITTER_DEST_LO#0) ← <(const byte*) SCREEN#0+(byte) $28+(byte) 5 [23] *((const byte*) DTV_BLITTER_DEST_MI#0) ← >(const byte*) SCREEN#0+(byte) $28+(byte) 5 [24] *((const byte*) DTV_BLITTER_DEST_HI#0) ← (byte) 0 [25] *((const byte*) DTV_BLITTER_DEST_MOD_LO#0) ← <(word) $15 [26] *((const byte*) DTV_BLITTER_DEST_MOD_HI#0) ← (byte) 0 [27] *((const byte*) DTV_BLITTER_DEST_LIN_LO#0) ← <(word) $13 [28] *((const byte*) DTV_BLITTER_DEST_LIN_HI#0) ← (byte) 0 [29] *((const byte*) DTV_BLITTER_DEST_STEP#0) ← (byte) $10 [30] *((const byte*) DTV_BLITTER_LEN_LO#0) ← <(byte) $14*(word) $a [31] *((const byte*) DTV_BLITTER_LEN_HI#0) ← (byte) 0 [32] *((const byte*) DTV_BLITTER_ALU#0) ← (const byte) DTV_BLIT_ADD#0 [33] *((const byte*) DTV_BLITTER_TRANSPARANCY#0) ← (const byte) DTV_BLIT_TRANSPARANCY_NONE#0 [34] *((const byte*) DTV_BLITTER_CONTROL#0) ← (const byte) DTV_BLIT_FORCE_START#0|(const byte) DTV_BLIT_SRCA_FWD#0|(const byte) DTV_BLIT_SRCB_FWD#0|(const byte) DTV_BLIT_DEST_FWD#0 [35] *((const byte*) DTV_BLITTER_CONTROL2#0) ← (const byte) DTV_BLIT_DEST_CONT#0 to:main::@1 main::@1: scope:[main] from main main::@1 [36] (byte~) main::$25 ← *((const byte*) DTV_BLITTER_CONTROL2#0) & (const byte) DTV_BLIT_STATUS_BUSY#0 [37] if((byte~) main::$25!=(byte) 0) goto main::@1 to:main::@return main::@return: scope:[main] from main::@1 [38] return to:@return VARIABLE REGISTER WEIGHTS (byte*) DTV_BLITTER_ALU (byte*) DTV_BLITTER_CONTROL (byte*) DTV_BLITTER_CONTROL2 (byte*) DTV_BLITTER_DEST_HI (byte*) DTV_BLITTER_DEST_LIN_HI (byte*) DTV_BLITTER_DEST_LIN_LO (byte*) DTV_BLITTER_DEST_LO (byte*) DTV_BLITTER_DEST_MI (byte*) DTV_BLITTER_DEST_MOD_HI (byte*) DTV_BLITTER_DEST_MOD_LO (byte*) DTV_BLITTER_DEST_STEP (byte*) DTV_BLITTER_LEN_HI (byte*) DTV_BLITTER_LEN_LO (byte*) DTV_BLITTER_SRCA_HI (byte*) DTV_BLITTER_SRCA_LIN_HI (byte*) DTV_BLITTER_SRCA_LIN_LO (byte*) DTV_BLITTER_SRCA_LO (byte*) DTV_BLITTER_SRCA_MI (byte*) DTV_BLITTER_SRCA_MOD_HI (byte*) DTV_BLITTER_SRCA_MOD_LO (byte*) DTV_BLITTER_SRCA_STEP (byte*) DTV_BLITTER_SRCB_HI (byte*) DTV_BLITTER_SRCB_LIN_HI (byte*) DTV_BLITTER_SRCB_LIN_LO (byte*) DTV_BLITTER_SRCB_LO (byte*) DTV_BLITTER_SRCB_MI (byte*) DTV_BLITTER_SRCB_MOD_HI (byte*) DTV_BLITTER_SRCB_MOD_LO (byte*) DTV_BLITTER_SRCB_STEP (byte*) DTV_BLITTER_TRANSPARANCY (byte) DTV_BLIT_ADD (byte) DTV_BLIT_CLEAR_IRQ (byte) DTV_BLIT_DEST_CONT (byte) DTV_BLIT_DEST_FWD (byte) DTV_BLIT_FORCE_START (byte) DTV_BLIT_SRCA_FWD (byte) DTV_BLIT_SRCB_FWD (byte) DTV_BLIT_STATUS_BUSY (byte) DTV_BLIT_TRANSPARANCY_NONE (byte*) DTV_FEATURE (byte) DTV_FEATURE_ENABLE (byte*) SCREEN (byte[]) SRCA (byte[]) SRCB (void()) main() (byte~) main::$25 22.0 Initial phi equivalence classes Added variable main::$25 to zero page equivalence class [ main::$25 ] Complete equivalence classes [ main::$25 ] Allocated zp ZP_BYTE:2 [ main::$25 ] INITIAL ASM //SEG0 File Comments // Fill a box on the screen using the blitter //SEG1 Basic Upstart .pc = $801 "Basic" :BasicUpstart(bbegin) .pc = $80d "Program" //SEG2 Global Constants & labels // Feature enables or disables the extra C64 DTV features .label DTV_FEATURE = $d03f .const DTV_FEATURE_ENABLE = 1 // Blitter Source A Start .label DTV_BLITTER_SRCA_LO = $d320 .label DTV_BLITTER_SRCA_MI = $d321 .label DTV_BLITTER_SRCA_HI = $d322 // Blitter Source A Modulo .label DTV_BLITTER_SRCA_MOD_LO = $d323 .label DTV_BLITTER_SRCA_MOD_HI = $d324 // Blitter Source A Line Length .label DTV_BLITTER_SRCA_LIN_LO = $d325 .label DTV_BLITTER_SRCA_LIN_HI = $d326 // Blitter Source A Step ([7:4] integral part, [3:0] fractional part) .label DTV_BLITTER_SRCA_STEP = $d327 // Blitter Source B Start .label DTV_BLITTER_SRCB_LO = $d328 .label DTV_BLITTER_SRCB_MI = $d329 .label DTV_BLITTER_SRCB_HI = $d32a // Blitter Source B Modulo .label DTV_BLITTER_SRCB_MOD_LO = $d32b .label DTV_BLITTER_SRCB_MOD_HI = $d32c // Blitter Source B Line Length .label DTV_BLITTER_SRCB_LIN_LO = $d32d .label DTV_BLITTER_SRCB_LIN_HI = $d32e // Blitter Source B Step ([7:4] integral part, [3:0] fractional part) .label DTV_BLITTER_SRCB_STEP = $d32f // Blitter Destination Start .label DTV_BLITTER_DEST_LO = $d330 .label DTV_BLITTER_DEST_MI = $d331 .label DTV_BLITTER_DEST_HI = $d332 // Blitter Source B Modulo .label DTV_BLITTER_DEST_MOD_LO = $d333 .label DTV_BLITTER_DEST_MOD_HI = $d334 // Blitter Source B Line Length .label DTV_BLITTER_DEST_LIN_LO = $d335 .label DTV_BLITTER_DEST_LIN_HI = $d336 // Blitter Source B Step ([7:4] integral part, [3:0] fractional part) .label DTV_BLITTER_DEST_STEP = $d337 // Blitter Blit Length .label DTV_BLITTER_LEN_LO = $d338 .label DTV_BLITTER_LEN_HI = $d339 // Blitter Control .label DTV_BLITTER_CONTROL = $d33a // Bit[0] Force Start Strobe when set .const DTV_BLIT_FORCE_START = 1 // Bit[1] Source A Direction Positive when set .const DTV_BLIT_SRCA_FWD = 2 // Bit[2] Source B Direction Positive when set .const DTV_BLIT_SRCB_FWD = 4 // Bit[3] Destination Direction Positive when set .const DTV_BLIT_DEST_FWD = 8 // Blitter Transparency .label DTV_BLITTER_TRANSPARANCY = $d33b // No transparancy // Bit[2]==Bit[1]==0: write in any case .const DTV_BLIT_TRANSPARANCY_NONE = 0 // Controls the ALU operation .label DTV_BLITTER_ALU = $d33e .const DTV_BLIT_ADD = $30 // Blitter Control 2 .label DTV_BLITTER_CONTROL2 = $d33f // Bit[0] Clear Blitter IRQ .const DTV_BLIT_CLEAR_IRQ = 1 // Bit[3] Destination Continue .const DTV_BLIT_DEST_CONT = 8 // Bit[0] Busy when set (When reading) .const DTV_BLIT_STATUS_BUSY = 1 .label SCREEN = $400 //SEG3 @begin bbegin: //SEG4 [1] phi from @begin to @1 [phi:@begin->@1] b1_from_bbegin: jmp b1 //SEG5 @1 b1: //SEG6 [2] call main jsr main //SEG7 [3] phi from @1 to @end [phi:@1->@end] bend_from_b1: jmp bend //SEG8 @end bend: //SEG9 main main: { .label _25 = 2 //SEG10 [4] *((const byte*) DTV_FEATURE#0) ← (const byte) DTV_FEATURE_ENABLE#0 -- _deref_pbuc1=vbuc2 lda #DTV_FEATURE_ENABLE sta DTV_FEATURE //SEG11 [5] *((const byte*) DTV_BLITTER_CONTROL2#0) ← (const byte) DTV_BLIT_CLEAR_IRQ#0 -- _deref_pbuc1=vbuc2 // Instruct blitter not to continue previous blit lda #DTV_BLIT_CLEAR_IRQ sta DTV_BLITTER_CONTROL2 //SEG12 [6] *((const byte*) DTV_BLITTER_SRCA_LO#0) ← <(const byte[]) SRCA#0 -- _deref_pbuc1=vbuc2 lda #(const byte[]) SRCA#0 -- _deref_pbuc1=vbuc2 lda #>SRCA sta DTV_BLITTER_SRCA_MI //SEG14 [8] *((const byte*) DTV_BLITTER_SRCA_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCA_HI //SEG15 [9] *((const byte*) DTV_BLITTER_SRCA_MOD_LO#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCA_MOD_LO //SEG16 [10] *((const byte*) DTV_BLITTER_SRCA_MOD_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCA_MOD_HI //SEG17 [11] *((const byte*) DTV_BLITTER_SRCA_LIN_LO#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCA_LIN_LO //SEG18 [12] *((const byte*) DTV_BLITTER_SRCA_LIN_HI#0) ← >(word) $100 -- _deref_pbuc1=vbuc2 lda #>$100 sta DTV_BLITTER_SRCA_LIN_HI //SEG19 [13] *((const byte*) DTV_BLITTER_SRCA_STEP#0) ← (byte) 1 -- _deref_pbuc1=vbuc2 lda #1 sta DTV_BLITTER_SRCA_STEP //SEG20 [14] *((const byte*) DTV_BLITTER_SRCB_LO#0) ← <(const byte[]) SRCB#0 -- _deref_pbuc1=vbuc2 // Step 0.0 lda #(const byte[]) SRCB#0 -- _deref_pbuc1=vbuc2 lda #>SRCB sta DTV_BLITTER_SRCB_MI //SEG22 [16] *((const byte*) DTV_BLITTER_SRCB_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCB_HI //SEG23 [17] *((const byte*) DTV_BLITTER_SRCB_MOD_LO#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCB_MOD_LO //SEG24 [18] *((const byte*) DTV_BLITTER_SRCB_MOD_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCB_MOD_HI //SEG25 [19] *((const byte*) DTV_BLITTER_SRCB_LIN_LO#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCB_LIN_LO //SEG26 [20] *((const byte*) DTV_BLITTER_SRCB_LIN_HI#0) ← >(word) $100 -- _deref_pbuc1=vbuc2 lda #>$100 sta DTV_BLITTER_SRCB_LIN_HI //SEG27 [21] *((const byte*) DTV_BLITTER_SRCB_STEP#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCB_STEP //SEG28 [22] *((const byte*) DTV_BLITTER_DEST_LO#0) ← <(const byte*) SCREEN#0+(byte) $28+(byte) 5 -- _deref_pbuc1=vbuc2 // Step 0.0 lda #(const byte*) SCREEN#0+(byte) $28+(byte) 5 -- _deref_pbuc1=vbuc2 lda #>SCREEN+$28+5 sta DTV_BLITTER_DEST_MI //SEG30 [24] *((const byte*) DTV_BLITTER_DEST_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_DEST_HI //SEG31 [25] *((const byte*) DTV_BLITTER_DEST_MOD_LO#0) ← <(word) $15 -- _deref_pbuc1=vbuc2 lda #<$15 sta DTV_BLITTER_DEST_MOD_LO //SEG32 [26] *((const byte*) DTV_BLITTER_DEST_MOD_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_DEST_MOD_HI //SEG33 [27] *((const byte*) DTV_BLITTER_DEST_LIN_LO#0) ← <(word) $13 -- _deref_pbuc1=vbuc2 lda #<$13 sta DTV_BLITTER_DEST_LIN_LO //SEG34 [28] *((const byte*) DTV_BLITTER_DEST_LIN_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_DEST_LIN_HI //SEG35 [29] *((const byte*) DTV_BLITTER_DEST_STEP#0) ← (byte) $10 -- _deref_pbuc1=vbuc2 lda #$10 sta DTV_BLITTER_DEST_STEP //SEG36 [30] *((const byte*) DTV_BLITTER_LEN_LO#0) ← <(byte) $14*(word) $a -- _deref_pbuc1=vbuc2 // Step 1.0 lda #<$14*$a sta DTV_BLITTER_LEN_LO //SEG37 [31] *((const byte*) DTV_BLITTER_LEN_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_LEN_HI //SEG38 [32] *((const byte*) DTV_BLITTER_ALU#0) ← (const byte) DTV_BLIT_ADD#0 -- _deref_pbuc1=vbuc2 lda #DTV_BLIT_ADD sta DTV_BLITTER_ALU //SEG39 [33] *((const byte*) DTV_BLITTER_TRANSPARANCY#0) ← (const byte) DTV_BLIT_TRANSPARANCY_NONE#0 -- _deref_pbuc1=vbuc2 lda #DTV_BLIT_TRANSPARANCY_NONE sta DTV_BLITTER_TRANSPARANCY //SEG40 [34] *((const byte*) DTV_BLITTER_CONTROL#0) ← (const byte) DTV_BLIT_FORCE_START#0|(const byte) DTV_BLIT_SRCA_FWD#0|(const byte) DTV_BLIT_SRCB_FWD#0|(const byte) DTV_BLIT_DEST_FWD#0 -- _deref_pbuc1=vbuc2 // Start blitter lda #DTV_BLIT_FORCE_START|DTV_BLIT_SRCA_FWD|DTV_BLIT_SRCB_FWD|DTV_BLIT_DEST_FWD sta DTV_BLITTER_CONTROL //SEG41 [35] *((const byte*) DTV_BLITTER_CONTROL2#0) ← (const byte) DTV_BLIT_DEST_CONT#0 -- _deref_pbuc1=vbuc2 // Instruct blitter to continue at DEST and restart SRC A/B lda #DTV_BLIT_DEST_CONT sta DTV_BLITTER_CONTROL2 jmp b1 // wait til blitter is ready //SEG42 main::@1 b1: //SEG43 [36] (byte~) main::$25 ← *((const byte*) DTV_BLITTER_CONTROL2#0) & (const byte) DTV_BLIT_STATUS_BUSY#0 -- vbuz1=_deref_pbuc1_band_vbuc2 lda #DTV_BLIT_STATUS_BUSY and DTV_BLITTER_CONTROL2 sta _25 //SEG44 [37] if((byte~) main::$25!=(byte) 0) goto main::@1 -- vbuz1_neq_0_then_la1 lda _25 cmp #0 bne b1 jmp breturn //SEG45 main::@return breturn: //SEG46 [38] return rts } SRCA: .text "camelot rules!@" SRCB: .byte $80 REGISTER UPLIFT POTENTIAL REGISTERS Statement [4] *((const byte*) DTV_FEATURE#0) ← (const byte) DTV_FEATURE_ENABLE#0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [5] *((const byte*) DTV_BLITTER_CONTROL2#0) ← (const byte) DTV_BLIT_CLEAR_IRQ#0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [6] *((const byte*) DTV_BLITTER_SRCA_LO#0) ← <(const byte[]) SRCA#0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [7] *((const byte*) DTV_BLITTER_SRCA_MI#0) ← >(const byte[]) SRCA#0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [8] *((const byte*) DTV_BLITTER_SRCA_HI#0) ← (byte) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [9] *((const byte*) DTV_BLITTER_SRCA_MOD_LO#0) ← (byte) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [10] *((const byte*) DTV_BLITTER_SRCA_MOD_HI#0) ← (byte) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [11] *((const byte*) DTV_BLITTER_SRCA_LIN_LO#0) ← (byte) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [12] *((const byte*) DTV_BLITTER_SRCA_LIN_HI#0) ← >(word) $100 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [13] *((const byte*) DTV_BLITTER_SRCA_STEP#0) ← (byte) 1 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [14] *((const byte*) DTV_BLITTER_SRCB_LO#0) ← <(const byte[]) SRCB#0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [15] *((const byte*) DTV_BLITTER_SRCB_MI#0) ← >(const byte[]) SRCB#0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [16] *((const byte*) DTV_BLITTER_SRCB_HI#0) ← (byte) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [17] *((const byte*) DTV_BLITTER_SRCB_MOD_LO#0) ← (byte) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [18] *((const byte*) DTV_BLITTER_SRCB_MOD_HI#0) ← (byte) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [19] *((const byte*) DTV_BLITTER_SRCB_LIN_LO#0) ← (byte) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [20] *((const byte*) DTV_BLITTER_SRCB_LIN_HI#0) ← >(word) $100 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [21] *((const byte*) DTV_BLITTER_SRCB_STEP#0) ← (byte) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [22] *((const byte*) DTV_BLITTER_DEST_LO#0) ← <(const byte*) SCREEN#0+(byte) $28+(byte) 5 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [23] *((const byte*) DTV_BLITTER_DEST_MI#0) ← >(const byte*) SCREEN#0+(byte) $28+(byte) 5 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [24] *((const byte*) DTV_BLITTER_DEST_HI#0) ← (byte) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [25] *((const byte*) DTV_BLITTER_DEST_MOD_LO#0) ← <(word) $15 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [26] *((const byte*) DTV_BLITTER_DEST_MOD_HI#0) ← (byte) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [27] *((const byte*) DTV_BLITTER_DEST_LIN_LO#0) ← <(word) $13 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [28] *((const byte*) DTV_BLITTER_DEST_LIN_HI#0) ← (byte) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [29] *((const byte*) DTV_BLITTER_DEST_STEP#0) ← (byte) $10 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [30] *((const byte*) DTV_BLITTER_LEN_LO#0) ← <(byte) $14*(word) $a [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [31] *((const byte*) DTV_BLITTER_LEN_HI#0) ← (byte) 0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [32] *((const byte*) DTV_BLITTER_ALU#0) ← (const byte) DTV_BLIT_ADD#0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [33] *((const byte*) DTV_BLITTER_TRANSPARANCY#0) ← (const byte) DTV_BLIT_TRANSPARANCY_NONE#0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [34] *((const byte*) DTV_BLITTER_CONTROL#0) ← (const byte) DTV_BLIT_FORCE_START#0|(const byte) DTV_BLIT_SRCA_FWD#0|(const byte) DTV_BLIT_SRCB_FWD#0|(const byte) DTV_BLIT_DEST_FWD#0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [35] *((const byte*) DTV_BLITTER_CONTROL2#0) ← (const byte) DTV_BLIT_DEST_CONT#0 [ ] ( main:2 [ ] ) always clobbers reg byte a Statement [36] (byte~) main::$25 ← *((const byte*) DTV_BLITTER_CONTROL2#0) & (const byte) DTV_BLIT_STATUS_BUSY#0 [ main::$25 ] ( main:2 [ main::$25 ] ) always clobbers reg byte a Potential registers zp ZP_BYTE:2 [ main::$25 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y , REGISTER UPLIFT SCOPES Uplift Scope [main] 22: zp ZP_BYTE:2 [ main::$25 ] Uplift Scope [] Uplifting [main] best 348 combination reg byte a [ main::$25 ] Uplifting [] best 348 combination ASSEMBLER BEFORE OPTIMIZATION //SEG0 File Comments // Fill a box on the screen using the blitter //SEG1 Basic Upstart .pc = $801 "Basic" :BasicUpstart(bbegin) .pc = $80d "Program" //SEG2 Global Constants & labels // Feature enables or disables the extra C64 DTV features .label DTV_FEATURE = $d03f .const DTV_FEATURE_ENABLE = 1 // Blitter Source A Start .label DTV_BLITTER_SRCA_LO = $d320 .label DTV_BLITTER_SRCA_MI = $d321 .label DTV_BLITTER_SRCA_HI = $d322 // Blitter Source A Modulo .label DTV_BLITTER_SRCA_MOD_LO = $d323 .label DTV_BLITTER_SRCA_MOD_HI = $d324 // Blitter Source A Line Length .label DTV_BLITTER_SRCA_LIN_LO = $d325 .label DTV_BLITTER_SRCA_LIN_HI = $d326 // Blitter Source A Step ([7:4] integral part, [3:0] fractional part) .label DTV_BLITTER_SRCA_STEP = $d327 // Blitter Source B Start .label DTV_BLITTER_SRCB_LO = $d328 .label DTV_BLITTER_SRCB_MI = $d329 .label DTV_BLITTER_SRCB_HI = $d32a // Blitter Source B Modulo .label DTV_BLITTER_SRCB_MOD_LO = $d32b .label DTV_BLITTER_SRCB_MOD_HI = $d32c // Blitter Source B Line Length .label DTV_BLITTER_SRCB_LIN_LO = $d32d .label DTV_BLITTER_SRCB_LIN_HI = $d32e // Blitter Source B Step ([7:4] integral part, [3:0] fractional part) .label DTV_BLITTER_SRCB_STEP = $d32f // Blitter Destination Start .label DTV_BLITTER_DEST_LO = $d330 .label DTV_BLITTER_DEST_MI = $d331 .label DTV_BLITTER_DEST_HI = $d332 // Blitter Source B Modulo .label DTV_BLITTER_DEST_MOD_LO = $d333 .label DTV_BLITTER_DEST_MOD_HI = $d334 // Blitter Source B Line Length .label DTV_BLITTER_DEST_LIN_LO = $d335 .label DTV_BLITTER_DEST_LIN_HI = $d336 // Blitter Source B Step ([7:4] integral part, [3:0] fractional part) .label DTV_BLITTER_DEST_STEP = $d337 // Blitter Blit Length .label DTV_BLITTER_LEN_LO = $d338 .label DTV_BLITTER_LEN_HI = $d339 // Blitter Control .label DTV_BLITTER_CONTROL = $d33a // Bit[0] Force Start Strobe when set .const DTV_BLIT_FORCE_START = 1 // Bit[1] Source A Direction Positive when set .const DTV_BLIT_SRCA_FWD = 2 // Bit[2] Source B Direction Positive when set .const DTV_BLIT_SRCB_FWD = 4 // Bit[3] Destination Direction Positive when set .const DTV_BLIT_DEST_FWD = 8 // Blitter Transparency .label DTV_BLITTER_TRANSPARANCY = $d33b // No transparancy // Bit[2]==Bit[1]==0: write in any case .const DTV_BLIT_TRANSPARANCY_NONE = 0 // Controls the ALU operation .label DTV_BLITTER_ALU = $d33e .const DTV_BLIT_ADD = $30 // Blitter Control 2 .label DTV_BLITTER_CONTROL2 = $d33f // Bit[0] Clear Blitter IRQ .const DTV_BLIT_CLEAR_IRQ = 1 // Bit[3] Destination Continue .const DTV_BLIT_DEST_CONT = 8 // Bit[0] Busy when set (When reading) .const DTV_BLIT_STATUS_BUSY = 1 .label SCREEN = $400 //SEG3 @begin bbegin: //SEG4 [1] phi from @begin to @1 [phi:@begin->@1] b1_from_bbegin: jmp b1 //SEG5 @1 b1: //SEG6 [2] call main jsr main //SEG7 [3] phi from @1 to @end [phi:@1->@end] bend_from_b1: jmp bend //SEG8 @end bend: //SEG9 main main: { //SEG10 [4] *((const byte*) DTV_FEATURE#0) ← (const byte) DTV_FEATURE_ENABLE#0 -- _deref_pbuc1=vbuc2 lda #DTV_FEATURE_ENABLE sta DTV_FEATURE //SEG11 [5] *((const byte*) DTV_BLITTER_CONTROL2#0) ← (const byte) DTV_BLIT_CLEAR_IRQ#0 -- _deref_pbuc1=vbuc2 // Instruct blitter not to continue previous blit lda #DTV_BLIT_CLEAR_IRQ sta DTV_BLITTER_CONTROL2 //SEG12 [6] *((const byte*) DTV_BLITTER_SRCA_LO#0) ← <(const byte[]) SRCA#0 -- _deref_pbuc1=vbuc2 lda #(const byte[]) SRCA#0 -- _deref_pbuc1=vbuc2 lda #>SRCA sta DTV_BLITTER_SRCA_MI //SEG14 [8] *((const byte*) DTV_BLITTER_SRCA_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCA_HI //SEG15 [9] *((const byte*) DTV_BLITTER_SRCA_MOD_LO#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCA_MOD_LO //SEG16 [10] *((const byte*) DTV_BLITTER_SRCA_MOD_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCA_MOD_HI //SEG17 [11] *((const byte*) DTV_BLITTER_SRCA_LIN_LO#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCA_LIN_LO //SEG18 [12] *((const byte*) DTV_BLITTER_SRCA_LIN_HI#0) ← >(word) $100 -- _deref_pbuc1=vbuc2 lda #>$100 sta DTV_BLITTER_SRCA_LIN_HI //SEG19 [13] *((const byte*) DTV_BLITTER_SRCA_STEP#0) ← (byte) 1 -- _deref_pbuc1=vbuc2 lda #1 sta DTV_BLITTER_SRCA_STEP //SEG20 [14] *((const byte*) DTV_BLITTER_SRCB_LO#0) ← <(const byte[]) SRCB#0 -- _deref_pbuc1=vbuc2 // Step 0.0 lda #(const byte[]) SRCB#0 -- _deref_pbuc1=vbuc2 lda #>SRCB sta DTV_BLITTER_SRCB_MI //SEG22 [16] *((const byte*) DTV_BLITTER_SRCB_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCB_HI //SEG23 [17] *((const byte*) DTV_BLITTER_SRCB_MOD_LO#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCB_MOD_LO //SEG24 [18] *((const byte*) DTV_BLITTER_SRCB_MOD_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCB_MOD_HI //SEG25 [19] *((const byte*) DTV_BLITTER_SRCB_LIN_LO#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCB_LIN_LO //SEG26 [20] *((const byte*) DTV_BLITTER_SRCB_LIN_HI#0) ← >(word) $100 -- _deref_pbuc1=vbuc2 lda #>$100 sta DTV_BLITTER_SRCB_LIN_HI //SEG27 [21] *((const byte*) DTV_BLITTER_SRCB_STEP#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCB_STEP //SEG28 [22] *((const byte*) DTV_BLITTER_DEST_LO#0) ← <(const byte*) SCREEN#0+(byte) $28+(byte) 5 -- _deref_pbuc1=vbuc2 // Step 0.0 lda #(const byte*) SCREEN#0+(byte) $28+(byte) 5 -- _deref_pbuc1=vbuc2 lda #>SCREEN+$28+5 sta DTV_BLITTER_DEST_MI //SEG30 [24] *((const byte*) DTV_BLITTER_DEST_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_DEST_HI //SEG31 [25] *((const byte*) DTV_BLITTER_DEST_MOD_LO#0) ← <(word) $15 -- _deref_pbuc1=vbuc2 lda #<$15 sta DTV_BLITTER_DEST_MOD_LO //SEG32 [26] *((const byte*) DTV_BLITTER_DEST_MOD_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_DEST_MOD_HI //SEG33 [27] *((const byte*) DTV_BLITTER_DEST_LIN_LO#0) ← <(word) $13 -- _deref_pbuc1=vbuc2 lda #<$13 sta DTV_BLITTER_DEST_LIN_LO //SEG34 [28] *((const byte*) DTV_BLITTER_DEST_LIN_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_DEST_LIN_HI //SEG35 [29] *((const byte*) DTV_BLITTER_DEST_STEP#0) ← (byte) $10 -- _deref_pbuc1=vbuc2 lda #$10 sta DTV_BLITTER_DEST_STEP //SEG36 [30] *((const byte*) DTV_BLITTER_LEN_LO#0) ← <(byte) $14*(word) $a -- _deref_pbuc1=vbuc2 // Step 1.0 lda #<$14*$a sta DTV_BLITTER_LEN_LO //SEG37 [31] *((const byte*) DTV_BLITTER_LEN_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_LEN_HI //SEG38 [32] *((const byte*) DTV_BLITTER_ALU#0) ← (const byte) DTV_BLIT_ADD#0 -- _deref_pbuc1=vbuc2 lda #DTV_BLIT_ADD sta DTV_BLITTER_ALU //SEG39 [33] *((const byte*) DTV_BLITTER_TRANSPARANCY#0) ← (const byte) DTV_BLIT_TRANSPARANCY_NONE#0 -- _deref_pbuc1=vbuc2 lda #DTV_BLIT_TRANSPARANCY_NONE sta DTV_BLITTER_TRANSPARANCY //SEG40 [34] *((const byte*) DTV_BLITTER_CONTROL#0) ← (const byte) DTV_BLIT_FORCE_START#0|(const byte) DTV_BLIT_SRCA_FWD#0|(const byte) DTV_BLIT_SRCB_FWD#0|(const byte) DTV_BLIT_DEST_FWD#0 -- _deref_pbuc1=vbuc2 // Start blitter lda #DTV_BLIT_FORCE_START|DTV_BLIT_SRCA_FWD|DTV_BLIT_SRCB_FWD|DTV_BLIT_DEST_FWD sta DTV_BLITTER_CONTROL //SEG41 [35] *((const byte*) DTV_BLITTER_CONTROL2#0) ← (const byte) DTV_BLIT_DEST_CONT#0 -- _deref_pbuc1=vbuc2 // Instruct blitter to continue at DEST and restart SRC A/B lda #DTV_BLIT_DEST_CONT sta DTV_BLITTER_CONTROL2 jmp b1 // wait til blitter is ready //SEG42 main::@1 b1: //SEG43 [36] (byte~) main::$25 ← *((const byte*) DTV_BLITTER_CONTROL2#0) & (const byte) DTV_BLIT_STATUS_BUSY#0 -- vbuaa=_deref_pbuc1_band_vbuc2 lda #DTV_BLIT_STATUS_BUSY and DTV_BLITTER_CONTROL2 //SEG44 [37] if((byte~) main::$25!=(byte) 0) goto main::@1 -- vbuaa_neq_0_then_la1 cmp #0 bne b1 jmp breturn //SEG45 main::@return breturn: //SEG46 [38] return rts } SRCA: .text "camelot rules!@" SRCB: .byte $80 ASSEMBLER OPTIMIZATIONS Removing instruction jmp b1 Removing instruction jmp bend Removing instruction jmp b1 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 Succesful ASM optimization Pass5UnnecesaryLoadElimination Removing instruction b1_from_bbegin: Removing instruction b1: Removing instruction bend_from_b1: Succesful ASM optimization Pass5RedundantLabelElimination Removing instruction bend: Removing instruction breturn: Succesful ASM optimization Pass5UnusedLabelElimination Updating BasicUpstart to call main directly Removing instruction jsr main Succesful ASM optimization Pass5SkipBegin Removing instruction bbegin: Succesful ASM optimization Pass5UnusedLabelElimination FINAL SYMBOL TABLE (label) @1 (label) @begin (label) @end (byte*) DTV_BLITTER_ALU (const byte*) DTV_BLITTER_ALU#0 DTV_BLITTER_ALU = (byte*) 54078 (byte*) DTV_BLITTER_CONTROL (const byte*) DTV_BLITTER_CONTROL#0 DTV_BLITTER_CONTROL = (byte*) 54074 (byte*) DTV_BLITTER_CONTROL2 (const byte*) DTV_BLITTER_CONTROL2#0 DTV_BLITTER_CONTROL2 = (byte*) 54079 (byte*) DTV_BLITTER_DEST_HI (const byte*) DTV_BLITTER_DEST_HI#0 DTV_BLITTER_DEST_HI = (byte*) 54066 (byte*) DTV_BLITTER_DEST_LIN_HI (const byte*) DTV_BLITTER_DEST_LIN_HI#0 DTV_BLITTER_DEST_LIN_HI = (byte*) 54070 (byte*) DTV_BLITTER_DEST_LIN_LO (const byte*) DTV_BLITTER_DEST_LIN_LO#0 DTV_BLITTER_DEST_LIN_LO = (byte*) 54069 (byte*) DTV_BLITTER_DEST_LO (const byte*) DTV_BLITTER_DEST_LO#0 DTV_BLITTER_DEST_LO = (byte*) 54064 (byte*) DTV_BLITTER_DEST_MI (const byte*) DTV_BLITTER_DEST_MI#0 DTV_BLITTER_DEST_MI = (byte*) 54065 (byte*) DTV_BLITTER_DEST_MOD_HI (const byte*) DTV_BLITTER_DEST_MOD_HI#0 DTV_BLITTER_DEST_MOD_HI = (byte*) 54068 (byte*) DTV_BLITTER_DEST_MOD_LO (const byte*) DTV_BLITTER_DEST_MOD_LO#0 DTV_BLITTER_DEST_MOD_LO = (byte*) 54067 (byte*) DTV_BLITTER_DEST_STEP (const byte*) DTV_BLITTER_DEST_STEP#0 DTV_BLITTER_DEST_STEP = (byte*) 54071 (byte*) DTV_BLITTER_LEN_HI (const byte*) DTV_BLITTER_LEN_HI#0 DTV_BLITTER_LEN_HI = (byte*) 54073 (byte*) DTV_BLITTER_LEN_LO (const byte*) DTV_BLITTER_LEN_LO#0 DTV_BLITTER_LEN_LO = (byte*) 54072 (byte*) DTV_BLITTER_SRCA_HI (const byte*) DTV_BLITTER_SRCA_HI#0 DTV_BLITTER_SRCA_HI = (byte*) 54050 (byte*) DTV_BLITTER_SRCA_LIN_HI (const byte*) DTV_BLITTER_SRCA_LIN_HI#0 DTV_BLITTER_SRCA_LIN_HI = (byte*) 54054 (byte*) DTV_BLITTER_SRCA_LIN_LO (const byte*) DTV_BLITTER_SRCA_LIN_LO#0 DTV_BLITTER_SRCA_LIN_LO = (byte*) 54053 (byte*) DTV_BLITTER_SRCA_LO (const byte*) DTV_BLITTER_SRCA_LO#0 DTV_BLITTER_SRCA_LO = (byte*) 54048 (byte*) DTV_BLITTER_SRCA_MI (const byte*) DTV_BLITTER_SRCA_MI#0 DTV_BLITTER_SRCA_MI = (byte*) 54049 (byte*) DTV_BLITTER_SRCA_MOD_HI (const byte*) DTV_BLITTER_SRCA_MOD_HI#0 DTV_BLITTER_SRCA_MOD_HI = (byte*) 54052 (byte*) DTV_BLITTER_SRCA_MOD_LO (const byte*) DTV_BLITTER_SRCA_MOD_LO#0 DTV_BLITTER_SRCA_MOD_LO = (byte*) 54051 (byte*) DTV_BLITTER_SRCA_STEP (const byte*) DTV_BLITTER_SRCA_STEP#0 DTV_BLITTER_SRCA_STEP = (byte*) 54055 (byte*) DTV_BLITTER_SRCB_HI (const byte*) DTV_BLITTER_SRCB_HI#0 DTV_BLITTER_SRCB_HI = (byte*) 54058 (byte*) DTV_BLITTER_SRCB_LIN_HI (const byte*) DTV_BLITTER_SRCB_LIN_HI#0 DTV_BLITTER_SRCB_LIN_HI = (byte*) 54062 (byte*) DTV_BLITTER_SRCB_LIN_LO (const byte*) DTV_BLITTER_SRCB_LIN_LO#0 DTV_BLITTER_SRCB_LIN_LO = (byte*) 54061 (byte*) DTV_BLITTER_SRCB_LO (const byte*) DTV_BLITTER_SRCB_LO#0 DTV_BLITTER_SRCB_LO = (byte*) 54056 (byte*) DTV_BLITTER_SRCB_MI (const byte*) DTV_BLITTER_SRCB_MI#0 DTV_BLITTER_SRCB_MI = (byte*) 54057 (byte*) DTV_BLITTER_SRCB_MOD_HI (const byte*) DTV_BLITTER_SRCB_MOD_HI#0 DTV_BLITTER_SRCB_MOD_HI = (byte*) 54060 (byte*) DTV_BLITTER_SRCB_MOD_LO (const byte*) DTV_BLITTER_SRCB_MOD_LO#0 DTV_BLITTER_SRCB_MOD_LO = (byte*) 54059 (byte*) DTV_BLITTER_SRCB_STEP (const byte*) DTV_BLITTER_SRCB_STEP#0 DTV_BLITTER_SRCB_STEP = (byte*) 54063 (byte*) DTV_BLITTER_TRANSPARANCY (const byte*) DTV_BLITTER_TRANSPARANCY#0 DTV_BLITTER_TRANSPARANCY = (byte*) 54075 (byte) DTV_BLIT_ADD (const byte) DTV_BLIT_ADD#0 DTV_BLIT_ADD = (byte) $30 (byte) DTV_BLIT_CLEAR_IRQ (const byte) DTV_BLIT_CLEAR_IRQ#0 DTV_BLIT_CLEAR_IRQ = (byte) 1 (byte) DTV_BLIT_DEST_CONT (const byte) DTV_BLIT_DEST_CONT#0 DTV_BLIT_DEST_CONT = (byte) 8 (byte) DTV_BLIT_DEST_FWD (const byte) DTV_BLIT_DEST_FWD#0 DTV_BLIT_DEST_FWD = (byte) 8 (byte) DTV_BLIT_FORCE_START (const byte) DTV_BLIT_FORCE_START#0 DTV_BLIT_FORCE_START = (byte) 1 (byte) DTV_BLIT_SRCA_FWD (const byte) DTV_BLIT_SRCA_FWD#0 DTV_BLIT_SRCA_FWD = (byte) 2 (byte) DTV_BLIT_SRCB_FWD (const byte) DTV_BLIT_SRCB_FWD#0 DTV_BLIT_SRCB_FWD = (byte) 4 (byte) DTV_BLIT_STATUS_BUSY (const byte) DTV_BLIT_STATUS_BUSY#0 DTV_BLIT_STATUS_BUSY = (byte) 1 (byte) DTV_BLIT_TRANSPARANCY_NONE (const byte) DTV_BLIT_TRANSPARANCY_NONE#0 DTV_BLIT_TRANSPARANCY_NONE = (byte) 0 (byte*) DTV_FEATURE (const byte*) DTV_FEATURE#0 DTV_FEATURE = (byte*) 53311 (byte) DTV_FEATURE_ENABLE (const byte) DTV_FEATURE_ENABLE#0 DTV_FEATURE_ENABLE = (byte) 1 (byte*) SCREEN (const byte*) SCREEN#0 SCREEN = (byte*) 1024 (byte[]) SRCA (const byte[]) SRCA#0 SRCA = (string) "camelot rules!@" (byte[]) SRCB (const byte[]) SRCB#0 SRCB = { (byte) $80 } (void()) main() (byte~) main::$25 reg byte a 22.0 (label) main::@1 (label) main::@return reg byte a [ main::$25 ] FINAL ASSEMBLER Score: 291 //SEG0 File Comments // Fill a box on the screen using the blitter //SEG1 Basic Upstart .pc = $801 "Basic" :BasicUpstart(main) .pc = $80d "Program" //SEG2 Global Constants & labels // Feature enables or disables the extra C64 DTV features .label DTV_FEATURE = $d03f .const DTV_FEATURE_ENABLE = 1 // Blitter Source A Start .label DTV_BLITTER_SRCA_LO = $d320 .label DTV_BLITTER_SRCA_MI = $d321 .label DTV_BLITTER_SRCA_HI = $d322 // Blitter Source A Modulo .label DTV_BLITTER_SRCA_MOD_LO = $d323 .label DTV_BLITTER_SRCA_MOD_HI = $d324 // Blitter Source A Line Length .label DTV_BLITTER_SRCA_LIN_LO = $d325 .label DTV_BLITTER_SRCA_LIN_HI = $d326 // Blitter Source A Step ([7:4] integral part, [3:0] fractional part) .label DTV_BLITTER_SRCA_STEP = $d327 // Blitter Source B Start .label DTV_BLITTER_SRCB_LO = $d328 .label DTV_BLITTER_SRCB_MI = $d329 .label DTV_BLITTER_SRCB_HI = $d32a // Blitter Source B Modulo .label DTV_BLITTER_SRCB_MOD_LO = $d32b .label DTV_BLITTER_SRCB_MOD_HI = $d32c // Blitter Source B Line Length .label DTV_BLITTER_SRCB_LIN_LO = $d32d .label DTV_BLITTER_SRCB_LIN_HI = $d32e // Blitter Source B Step ([7:4] integral part, [3:0] fractional part) .label DTV_BLITTER_SRCB_STEP = $d32f // Blitter Destination Start .label DTV_BLITTER_DEST_LO = $d330 .label DTV_BLITTER_DEST_MI = $d331 .label DTV_BLITTER_DEST_HI = $d332 // Blitter Source B Modulo .label DTV_BLITTER_DEST_MOD_LO = $d333 .label DTV_BLITTER_DEST_MOD_HI = $d334 // Blitter Source B Line Length .label DTV_BLITTER_DEST_LIN_LO = $d335 .label DTV_BLITTER_DEST_LIN_HI = $d336 // Blitter Source B Step ([7:4] integral part, [3:0] fractional part) .label DTV_BLITTER_DEST_STEP = $d337 // Blitter Blit Length .label DTV_BLITTER_LEN_LO = $d338 .label DTV_BLITTER_LEN_HI = $d339 // Blitter Control .label DTV_BLITTER_CONTROL = $d33a // Bit[0] Force Start Strobe when set .const DTV_BLIT_FORCE_START = 1 // Bit[1] Source A Direction Positive when set .const DTV_BLIT_SRCA_FWD = 2 // Bit[2] Source B Direction Positive when set .const DTV_BLIT_SRCB_FWD = 4 // Bit[3] Destination Direction Positive when set .const DTV_BLIT_DEST_FWD = 8 // Blitter Transparency .label DTV_BLITTER_TRANSPARANCY = $d33b // No transparancy // Bit[2]==Bit[1]==0: write in any case .const DTV_BLIT_TRANSPARANCY_NONE = 0 // Controls the ALU operation .label DTV_BLITTER_ALU = $d33e .const DTV_BLIT_ADD = $30 // Blitter Control 2 .label DTV_BLITTER_CONTROL2 = $d33f // Bit[0] Clear Blitter IRQ .const DTV_BLIT_CLEAR_IRQ = 1 // Bit[3] Destination Continue .const DTV_BLIT_DEST_CONT = 8 // Bit[0] Busy when set (When reading) .const DTV_BLIT_STATUS_BUSY = 1 .label SCREEN = $400 //SEG3 @begin //SEG4 [1] phi from @begin to @1 [phi:@begin->@1] //SEG5 @1 //SEG6 [2] call main //SEG7 [3] phi from @1 to @end [phi:@1->@end] //SEG8 @end //SEG9 main main: { //SEG10 [4] *((const byte*) DTV_FEATURE#0) ← (const byte) DTV_FEATURE_ENABLE#0 -- _deref_pbuc1=vbuc2 lda #DTV_FEATURE_ENABLE sta DTV_FEATURE //SEG11 [5] *((const byte*) DTV_BLITTER_CONTROL2#0) ← (const byte) DTV_BLIT_CLEAR_IRQ#0 -- _deref_pbuc1=vbuc2 // Instruct blitter not to continue previous blit lda #DTV_BLIT_CLEAR_IRQ sta DTV_BLITTER_CONTROL2 //SEG12 [6] *((const byte*) DTV_BLITTER_SRCA_LO#0) ← <(const byte[]) SRCA#0 -- _deref_pbuc1=vbuc2 lda #(const byte[]) SRCA#0 -- _deref_pbuc1=vbuc2 lda #>SRCA sta DTV_BLITTER_SRCA_MI //SEG14 [8] *((const byte*) DTV_BLITTER_SRCA_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCA_HI //SEG15 [9] *((const byte*) DTV_BLITTER_SRCA_MOD_LO#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 sta DTV_BLITTER_SRCA_MOD_LO //SEG16 [10] *((const byte*) DTV_BLITTER_SRCA_MOD_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 sta DTV_BLITTER_SRCA_MOD_HI //SEG17 [11] *((const byte*) DTV_BLITTER_SRCA_LIN_LO#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 sta DTV_BLITTER_SRCA_LIN_LO //SEG18 [12] *((const byte*) DTV_BLITTER_SRCA_LIN_HI#0) ← >(word) $100 -- _deref_pbuc1=vbuc2 lda #>$100 sta DTV_BLITTER_SRCA_LIN_HI //SEG19 [13] *((const byte*) DTV_BLITTER_SRCA_STEP#0) ← (byte) 1 -- _deref_pbuc1=vbuc2 lda #1 sta DTV_BLITTER_SRCA_STEP //SEG20 [14] *((const byte*) DTV_BLITTER_SRCB_LO#0) ← <(const byte[]) SRCB#0 -- _deref_pbuc1=vbuc2 // Step 0.0 lda #(const byte[]) SRCB#0 -- _deref_pbuc1=vbuc2 lda #>SRCB sta DTV_BLITTER_SRCB_MI //SEG22 [16] *((const byte*) DTV_BLITTER_SRCB_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCB_HI //SEG23 [17] *((const byte*) DTV_BLITTER_SRCB_MOD_LO#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 sta DTV_BLITTER_SRCB_MOD_LO //SEG24 [18] *((const byte*) DTV_BLITTER_SRCB_MOD_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 sta DTV_BLITTER_SRCB_MOD_HI //SEG25 [19] *((const byte*) DTV_BLITTER_SRCB_LIN_LO#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 sta DTV_BLITTER_SRCB_LIN_LO //SEG26 [20] *((const byte*) DTV_BLITTER_SRCB_LIN_HI#0) ← >(word) $100 -- _deref_pbuc1=vbuc2 lda #>$100 sta DTV_BLITTER_SRCB_LIN_HI //SEG27 [21] *((const byte*) DTV_BLITTER_SRCB_STEP#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_SRCB_STEP //SEG28 [22] *((const byte*) DTV_BLITTER_DEST_LO#0) ← <(const byte*) SCREEN#0+(byte) $28+(byte) 5 -- _deref_pbuc1=vbuc2 // Step 0.0 lda #(const byte*) SCREEN#0+(byte) $28+(byte) 5 -- _deref_pbuc1=vbuc2 lda #>SCREEN+$28+5 sta DTV_BLITTER_DEST_MI //SEG30 [24] *((const byte*) DTV_BLITTER_DEST_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_DEST_HI //SEG31 [25] *((const byte*) DTV_BLITTER_DEST_MOD_LO#0) ← <(word) $15 -- _deref_pbuc1=vbuc2 lda #<$15 sta DTV_BLITTER_DEST_MOD_LO //SEG32 [26] *((const byte*) DTV_BLITTER_DEST_MOD_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_DEST_MOD_HI //SEG33 [27] *((const byte*) DTV_BLITTER_DEST_LIN_LO#0) ← <(word) $13 -- _deref_pbuc1=vbuc2 lda #<$13 sta DTV_BLITTER_DEST_LIN_LO //SEG34 [28] *((const byte*) DTV_BLITTER_DEST_LIN_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_DEST_LIN_HI //SEG35 [29] *((const byte*) DTV_BLITTER_DEST_STEP#0) ← (byte) $10 -- _deref_pbuc1=vbuc2 lda #$10 sta DTV_BLITTER_DEST_STEP //SEG36 [30] *((const byte*) DTV_BLITTER_LEN_LO#0) ← <(byte) $14*(word) $a -- _deref_pbuc1=vbuc2 // Step 1.0 lda #<$14*$a sta DTV_BLITTER_LEN_LO //SEG37 [31] *((const byte*) DTV_BLITTER_LEN_HI#0) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta DTV_BLITTER_LEN_HI //SEG38 [32] *((const byte*) DTV_BLITTER_ALU#0) ← (const byte) DTV_BLIT_ADD#0 -- _deref_pbuc1=vbuc2 lda #DTV_BLIT_ADD sta DTV_BLITTER_ALU //SEG39 [33] *((const byte*) DTV_BLITTER_TRANSPARANCY#0) ← (const byte) DTV_BLIT_TRANSPARANCY_NONE#0 -- _deref_pbuc1=vbuc2 lda #DTV_BLIT_TRANSPARANCY_NONE sta DTV_BLITTER_TRANSPARANCY //SEG40 [34] *((const byte*) DTV_BLITTER_CONTROL#0) ← (const byte) DTV_BLIT_FORCE_START#0|(const byte) DTV_BLIT_SRCA_FWD#0|(const byte) DTV_BLIT_SRCB_FWD#0|(const byte) DTV_BLIT_DEST_FWD#0 -- _deref_pbuc1=vbuc2 // Start blitter lda #DTV_BLIT_FORCE_START|DTV_BLIT_SRCA_FWD|DTV_BLIT_SRCB_FWD|DTV_BLIT_DEST_FWD sta DTV_BLITTER_CONTROL //SEG41 [35] *((const byte*) DTV_BLITTER_CONTROL2#0) ← (const byte) DTV_BLIT_DEST_CONT#0 -- _deref_pbuc1=vbuc2 // Instruct blitter to continue at DEST and restart SRC A/B lda #DTV_BLIT_DEST_CONT sta DTV_BLITTER_CONTROL2 // wait til blitter is ready //SEG42 main::@1 b1: //SEG43 [36] (byte~) main::$25 ← *((const byte*) DTV_BLITTER_CONTROL2#0) & (const byte) DTV_BLIT_STATUS_BUSY#0 -- vbuaa=_deref_pbuc1_band_vbuc2 lda #DTV_BLIT_STATUS_BUSY and DTV_BLITTER_CONTROL2 //SEG44 [37] if((byte~) main::$25!=(byte) 0) goto main::@1 -- vbuaa_neq_0_then_la1 cmp #0 bne b1 //SEG45 main::@return //SEG46 [38] return rts } SRCA: .text "camelot rules!@" SRCB: .byte $80