Warning! Adding boolean cast to non-boolean condition *((byte*) strcpy::src)
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*) MEDUSA_SCREEN in (byte*) MEDUSA_SCREEN ← (number) $1000
Adding pointer type conversion cast (byte*) MEDUSA_COLORS in (byte*) MEDUSA_COLORS ← (number) $1400
Adding pointer type conversion cast (byte*) SCREEN in (byte*) SCREEN ← (number) $400
Identified constant variable (byte*) MEDUSA_SCREEN
Identified constant variable (byte*) MEDUSA_COLORS
Identified constant variable (byte*) SCREEN
Inlined call (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) @4
Culled Empty Block (label) memcpy::@3
Culled Empty Block (label) @5
Culled Empty Block (label) @6
Culled Empty Block (label) main::@4
Culled Empty Block (label) main::@3
Culled Empty Block (label) main::@5
Culled Empty Block (label) main::@6

CONTROL FLOW GRAPH SSA
@begin: scope:[]  from
  (byte*) BGCOL#0 ← ((byte*)) (number) $d021
  (byte*) COLS#0 ← ((byte*)) (number) $d800
  (byte) BLACK#0 ← (number) 0
  to:@7
memcpy: scope:[memcpy]  from main main::@7
  (word) memcpy::num#3 ← phi( main/(word) memcpy::num#0 main::@7/(word) memcpy::num#1 )
  (byte*) memcpy::destination#2 ← phi( main/(byte*) memcpy::destination#0 main::@7/(byte*) memcpy::destination#1 )
  (byte*) memcpy::source#2 ← phi( main/(byte*) memcpy::source#0 main::@7/(byte*) memcpy::source#1 )
  (byte*) memcpy::src#0 ← (byte*) memcpy::source#2
  (byte*) memcpy::dst#0 ← (byte*) memcpy::destination#2
  (word) memcpy::i#0 ← (number) 0
  to:memcpy::@1
memcpy::@1: scope:[memcpy]  from memcpy memcpy::@1
  (byte*) memcpy::destination#4 ← phi( memcpy/(byte*) memcpy::destination#2 memcpy::@1/(byte*) memcpy::destination#4 )
  (word) memcpy::num#2 ← phi( memcpy/(word) memcpy::num#3 memcpy::@1/(word) memcpy::num#2 )
  (word) memcpy::i#2 ← phi( memcpy/(word) memcpy::i#0 memcpy::@1/(word) memcpy::i#1 )
  (byte*) memcpy::dst#2 ← phi( memcpy/(byte*) memcpy::dst#0 memcpy::@1/(byte*) memcpy::dst#1 )
  (byte*) memcpy::src#2 ← phi( memcpy/(byte*) memcpy::src#0 memcpy::@1/(byte*) memcpy::src#1 )
  *((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#2)
  (byte*) memcpy::dst#1 ← ++ (byte*) memcpy::dst#2
  (byte*) memcpy::src#1 ← ++ (byte*) memcpy::src#2
  (word) memcpy::i#1 ← ++ (word) memcpy::i#2
  (bool~) memcpy::$0 ← (word) memcpy::i#1 < (word) memcpy::num#2
  if((bool~) memcpy::$0) goto memcpy::@1
  to:memcpy::@2
memcpy::@2: scope:[memcpy]  from memcpy::@1
  (byte*) memcpy::destination#3 ← phi( memcpy::@1/(byte*) memcpy::destination#4 )
  (byte*) memcpy::return#0 ← (byte*) memcpy::destination#3
  to:memcpy::@return
memcpy::@return: scope:[memcpy]  from memcpy::@2
  (byte*) memcpy::return#4 ← phi( memcpy::@2/(byte*) memcpy::return#0 )
  (byte*) memcpy::return#1 ← (byte*) memcpy::return#4
  return 
  to:@return
@7: scope:[]  from @begin
  (byte*) MEDUSA_SCREEN#0 ← ((byte*)) (number) $1000
  (byte*) MEDUSA_COLORS#0 ← ((byte*)) (number) $1400
  (byte*) SCREEN#0 ← ((byte*)) (number) $400
  kickasm(location (byte*) MEDUSA_SCREEN#0) {{ .var fileScreen = LoadBinary("medusas.prg", BF_C64FILE)
    .fill fileScreen.getSize(), fileScreen.get(i)
 }}
  kickasm(location (byte*) MEDUSA_COLORS#0) {{ .var fileCols = LoadBinary("medusac.prg", BF_C64FILE)
    .fill fileCols.getSize(), fileCols.get(i)
 }}
  to:@8
main: scope:[main]  from @8
  *((byte*) BGCOL#0) ← (byte) BLACK#0
  (byte*) memcpy::destination#0 ← (byte*) SCREEN#0
  (byte*) memcpy::source#0 ← (byte*) MEDUSA_SCREEN#0
  (word) memcpy::num#0 ← (number) $3e8
  call memcpy 
  (byte*) memcpy::return#2 ← (byte*) memcpy::return#1
  to:main::@7
main::@7: scope:[main]  from main
  (byte*) memcpy::destination#1 ← (byte*) COLS#0
  (byte*) memcpy::source#1 ← (byte*) MEDUSA_COLORS#0
  (word) memcpy::num#1 ← (number) $3e8
  call memcpy 
  (byte*) memcpy::return#3 ← (byte*) memcpy::return#1
  to:main::@8
main::@8: scope:[main]  from main::@7
  to:main::@1
main::@1: scope:[main]  from main::@2 main::@8
  if(true) goto main::@2
  to:main::@return
main::@2: scope:[main]  from main::@1
  (byte*~) main::$2 ← (byte*) SCREEN#0 + (number) $3e7
  *((byte*~) main::$2) ← *((byte*~) main::$2) ^ (number) $e
  to:main::@1
main::@return: scope:[main]  from main::@1
  return 
  to:@return
@8: scope:[]  from @7
  call main 
  to:@9
@9: scope:[]  from @8
  to:@end
@end: scope:[]  from @9

SYMBOL TABLE SSA
(label) @7
(label) @8
(label) @9
(label) @begin
(label) @end
(byte*) BGCOL
(byte*) BGCOL#0
(byte) BLACK
(byte) BLACK#0
(byte*) COLS
(byte*) COLS#0
(byte*) MEDUSA_COLORS
(byte*) MEDUSA_COLORS#0
(byte*) MEDUSA_SCREEN
(byte*) MEDUSA_SCREEN#0
(byte*) SCREEN
(byte*) SCREEN#0
(void()) main()
(byte*~) main::$2
(label) main::@1
(label) main::@2
(label) main::@7
(label) main::@8
(label) main::@return
(byte*()) memcpy((byte*) memcpy::destination , (byte*) memcpy::source , (word) memcpy::num)
(bool~) memcpy::$0
(label) memcpy::@1
(label) memcpy::@2
(label) memcpy::@return
(byte*) memcpy::destination
(byte*) memcpy::destination#0
(byte*) memcpy::destination#1
(byte*) memcpy::destination#2
(byte*) memcpy::destination#3
(byte*) memcpy::destination#4
(byte*) memcpy::dst
(byte*) memcpy::dst#0
(byte*) memcpy::dst#1
(byte*) memcpy::dst#2
(word) memcpy::i
(word) memcpy::i#0
(word) memcpy::i#1
(word) memcpy::i#2
(word) memcpy::num
(word) memcpy::num#0
(word) memcpy::num#1
(word) memcpy::num#2
(word) memcpy::num#3
(byte*) memcpy::return
(byte*) memcpy::return#0
(byte*) memcpy::return#1
(byte*) memcpy::return#2
(byte*) memcpy::return#3
(byte*) memcpy::return#4
(byte*) memcpy::source
(byte*) memcpy::source#0
(byte*) memcpy::source#1
(byte*) memcpy::source#2
(byte*) memcpy::src
(byte*) memcpy::src#0
(byte*) memcpy::src#1
(byte*) memcpy::src#2

Adding number conversion cast (unumber) 0 in (byte) BLACK#0 ← (number) 0
Adding number conversion cast (unumber) 0 in (word) memcpy::i#0 ← (number) 0
Adding number conversion cast (unumber) $3e8 in (word) memcpy::num#0 ← (number) $3e8
Adding number conversion cast (unumber) $3e8 in (word) memcpy::num#1 ← (number) $3e8
Adding number conversion cast (unumber) $3e7 in (byte*~) main::$2 ← (byte*) SCREEN#0 + (number) $3e7
Adding number conversion cast (unumber) $e in *((byte*~) main::$2) ← *((byte*~) main::$2) ^ (number) $e
Successful SSA optimization PassNAddNumberTypeConversions
Inlining cast (byte*) BGCOL#0 ← (byte*)(number) $d021
Inlining cast (byte*) COLS#0 ← (byte*)(number) $d800
Inlining cast (byte) BLACK#0 ← (unumber)(number) 0
Inlining cast (word) memcpy::i#0 ← (unumber)(number) 0
Inlining cast (byte*) MEDUSA_SCREEN#0 ← (byte*)(number) $1000
Inlining cast (byte*) MEDUSA_COLORS#0 ← (byte*)(number) $1400
Inlining cast (byte*) SCREEN#0 ← (byte*)(number) $400
Inlining cast (word) memcpy::num#0 ← (unumber)(number) $3e8
Inlining cast (word) memcpy::num#1 ← (unumber)(number) $3e8
Successful SSA optimization Pass2InlineCast
Simplifying constant pointer cast (byte*) 53281
Simplifying constant pointer cast (byte*) 55296
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant pointer cast (byte*) 4096
Simplifying constant pointer cast (byte*) 5120
Simplifying constant pointer cast (byte*) 1024
Simplifying constant integer cast $3e8
Simplifying constant integer cast $3e8
Simplifying constant integer cast $3e7
Simplifying constant integer cast $e
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 0
Finalized unsigned number type (word) $3e8
Finalized unsigned number type (word) $3e8
Finalized unsigned number type (word) $3e7
Finalized unsigned number type (byte) $e
Successful SSA optimization PassNFinalizeNumberTypeConversions
Alias (byte*) memcpy::src#0 = (byte*) memcpy::source#2 
Alias (byte*) memcpy::dst#0 = (byte*) memcpy::destination#2 
Alias (byte*) memcpy::return#0 = (byte*) memcpy::destination#3 (byte*) memcpy::destination#4 (byte*) memcpy::return#4 (byte*) memcpy::return#1 
Successful SSA optimization Pass2AliasElimination
Self Phi Eliminated (word) memcpy::num#2
Self Phi Eliminated (byte*) memcpy::return#0
Successful SSA optimization Pass2SelfPhiElimination
Identical Phi Values (word) memcpy::num#2 (word) memcpy::num#3
Identical Phi Values (byte*) memcpy::return#0 (byte*) memcpy::dst#0
Successful SSA optimization Pass2IdenticalPhiElimination
Simple Condition (bool~) memcpy::$0 [13] if((word) memcpy::i#1<(word) memcpy::num#3) goto memcpy::@1
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant (const byte*) BGCOL#0 = (byte*) 53281
Constant (const byte*) COLS#0 = (byte*) 55296
Constant (const byte) BLACK#0 = 0
Constant (const word) memcpy::i#0 = 0
Constant (const byte*) MEDUSA_SCREEN#0 = (byte*) 4096
Constant (const byte*) MEDUSA_COLORS#0 = (byte*) 5120
Constant (const byte*) SCREEN#0 = (byte*) 1024
Constant (const word) memcpy::num#0 = $3e8
Constant (const word) memcpy::num#1 = $3e8
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte*) memcpy::destination#0 = SCREEN#0
Constant (const byte*) memcpy::source#0 = MEDUSA_SCREEN#0
Constant (const byte*) memcpy::destination#1 = COLS#0
Constant (const byte*) memcpy::source#1 = MEDUSA_COLORS#0
Successful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination [35] if(true) goto main::@2
Successful SSA optimization Pass2ConstantIfs
Eliminating unused variable (byte*) memcpy::return#2 and assignment [12] (byte*) memcpy::return#2 ← (byte*) memcpy::dst#0
Eliminating unused variable (byte*) memcpy::return#3 and assignment [14] (byte*) memcpy::return#3 ← (byte*) memcpy::dst#0
Successful SSA optimization PassNEliminateUnusedVars
Removing unused block main::@return
Successful SSA optimization Pass2EliminateUnusedBlocks
Constant right-side identified [13] (byte*~) main::$2 ← (const byte*) SCREEN#0 + (word) $3e7
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant (const byte*) main::$2 = SCREEN#0+$3e7
Successful SSA optimization Pass2ConstantIdentification
Inlining constant with var siblings (const word) memcpy::i#0
Inlining constant with var siblings (const word) memcpy::num#0
Inlining constant with var siblings (const word) memcpy::num#1
Constant inlined memcpy::num#1 = (word) $3e8
Constant inlined memcpy::num#0 = (word) $3e8
Constant inlined memcpy::source#1 = (const byte*) MEDUSA_COLORS#0
Constant inlined main::$2 = (const byte*) SCREEN#0+(word) $3e7
Constant inlined memcpy::destination#0 = (const byte*) SCREEN#0
Constant inlined memcpy::destination#1 = (const byte*) COLS#0
Constant inlined memcpy::source#0 = (const byte*) MEDUSA_SCREEN#0
Constant inlined memcpy::i#0 = (byte) 0
Successful SSA optimization Pass2ConstantInlining
Identical Phi Values (word) memcpy::num#3 (word) $3e8
Successful SSA optimization Pass2IdenticalPhiElimination
Added new block during phi lifting memcpy::@4(between memcpy::@1 and memcpy::@1)
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @8
Adding NOP phi() at start of @9
Adding NOP phi() at start of @end
Adding NOP phi() at start of main::@7
Adding NOP phi() at start of main::@8
Adding NOP phi() at start of main::@1
Adding NOP phi() at start of memcpy::@2
CALL GRAPH
Calls in [] to main:4 
Calls in [main] to memcpy:8 memcpy:10 

Created 5 initial phi equivalence classes
Coalesced [15] memcpy::src#3 ← memcpy::src#0
Coalesced [16] memcpy::dst#3 ← memcpy::dst#0
Coalesced [25] memcpy::src#4 ← memcpy::src#1
Coalesced [26] memcpy::dst#4 ← memcpy::dst#1
Coalesced [27] memcpy::i#3 ← memcpy::i#1
Coalesced down to 3 phi equivalence classes
Culled Empty Block (label) @9
Culled Empty Block (label) main::@8
Culled Empty Block (label) main::@1
Culled Empty Block (label) memcpy::@2
Culled Empty Block (label) memcpy::@4
Renumbering block @7 to @1
Renumbering block @8 to @2
Renumbering block main::@2 to main::@1
Renumbering block main::@7 to main::@2
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @2
Adding NOP phi() at start of @end
Adding NOP phi() at start of main::@2

FINAL CONTROL FLOW GRAPH
@begin: scope:[]  from
  [0] phi()
  to:@1
@1: scope:[]  from @begin
  kickasm(location (const byte*) MEDUSA_SCREEN#0) {{ .var fileScreen = LoadBinary("medusas.prg", BF_C64FILE)
    .fill fileScreen.getSize(), fileScreen.get(i)
 }}
  kickasm(location (const byte*) MEDUSA_COLORS#0) {{ .var fileCols = LoadBinary("medusac.prg", BF_C64FILE)
    .fill fileCols.getSize(), fileCols.get(i)
 }}
  to:@2
@2: scope:[]  from @1
  [3] phi()
  [4] call main 
  to:@end
@end: scope:[]  from @2
  [5] phi()
main: scope:[main]  from @2
  [6] *((const byte*) BGCOL#0) ← (const byte) BLACK#0
  [7] call memcpy 
  to:main::@2
main::@2: scope:[main]  from main
  [8] phi()
  [9] call memcpy 
  to:main::@1
main::@1: scope:[main]  from main::@1 main::@2
  [10] *((const byte*) SCREEN#0+(word) $3e7) ← *((const byte*) SCREEN#0+(word) $3e7) ^ (byte) $e
  to:main::@1
memcpy: scope:[memcpy]  from main main::@2
  [11] (byte*) memcpy::dst#0 ← phi( main/(const byte*) SCREEN#0 main::@2/(const byte*) COLS#0 )
  [11] (byte*) memcpy::src#0 ← phi( main/(const byte*) MEDUSA_SCREEN#0 main::@2/(const byte*) MEDUSA_COLORS#0 )
  to:memcpy::@1
memcpy::@1: scope:[memcpy]  from memcpy memcpy::@1
  [12] (word) memcpy::i#2 ← phi( memcpy/(byte) 0 memcpy::@1/(word) memcpy::i#1 )
  [12] (byte*) memcpy::dst#2 ← phi( memcpy/(byte*) memcpy::dst#0 memcpy::@1/(byte*) memcpy::dst#1 )
  [12] (byte*) memcpy::src#2 ← phi( memcpy/(byte*) memcpy::src#0 memcpy::@1/(byte*) memcpy::src#1 )
  [13] *((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#2)
  [14] (byte*) memcpy::dst#1 ← ++ (byte*) memcpy::dst#2
  [15] (byte*) memcpy::src#1 ← ++ (byte*) memcpy::src#2
  [16] (word) memcpy::i#1 ← ++ (word) memcpy::i#2
  [17] if((word) memcpy::i#1<(word) $3e8) goto memcpy::@1
  to:memcpy::@return
memcpy::@return: scope:[memcpy]  from memcpy::@1
  [18] return 
  to:@return


VARIABLE REGISTER WEIGHTS
(byte*) BGCOL
(byte) BLACK
(byte*) COLS
(byte*) MEDUSA_COLORS
(byte*) MEDUSA_SCREEN
(byte*) SCREEN
(void()) main()
(byte*()) memcpy((byte*) memcpy::destination , (byte*) memcpy::source , (word) memcpy::num)
(byte*) memcpy::destination
(byte*) memcpy::dst
(byte*) memcpy::dst#0 2.0
(byte*) memcpy::dst#1 5.5
(byte*) memcpy::dst#2 17.5
(word) memcpy::i
(word) memcpy::i#1 16.5
(word) memcpy::i#2 5.5
(word) memcpy::num
(byte*) memcpy::return
(byte*) memcpy::source
(byte*) memcpy::src
(byte*) memcpy::src#0 2.0
(byte*) memcpy::src#1 7.333333333333333
(byte*) memcpy::src#2 11.666666666666666

Initial phi equivalence classes
[ memcpy::src#2 memcpy::src#0 memcpy::src#1 ]
[ memcpy::dst#2 memcpy::dst#0 memcpy::dst#1 ]
[ memcpy::i#2 memcpy::i#1 ]
Complete equivalence classes
[ memcpy::src#2 memcpy::src#0 memcpy::src#1 ]
[ memcpy::dst#2 memcpy::dst#0 memcpy::dst#1 ]
[ memcpy::i#2 memcpy::i#1 ]
Allocated zp ZP_WORD:2 [ memcpy::src#2 memcpy::src#0 memcpy::src#1 ]
Allocated zp ZP_WORD:4 [ memcpy::dst#2 memcpy::dst#0 memcpy::dst#1 ]
Allocated zp ZP_WORD:6 [ memcpy::i#2 memcpy::i#1 ]

INITIAL ASM
//SEG0 File Comments
// Display  MEDUSA PETSCII by Buzz_clik
// https://csdb.dk/release/?id=178673
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
//SEG2 Global Constants & labels
  .label BGCOL = $d021
  // Color Ram
  .label COLS = $d800
  // The colors of the C64
  .const BLACK = 0
  .label MEDUSA_SCREEN = $1000
  .label MEDUSA_COLORS = $1400
  .label SCREEN = $400
//SEG3 @begin
bbegin:
  jmp b1
//SEG4 @1
b1:
//SEG5 kickasm(location (const byte*) MEDUSA_SCREEN#0) {{ .var fileScreen = LoadBinary("medusas.prg", BF_C64FILE)     .fill fileScreen.getSize(), fileScreen.get(i)  }}
//SEG6 kickasm(location (const byte*) MEDUSA_COLORS#0) {{ .var fileCols = LoadBinary("medusac.prg", BF_C64FILE)     .fill fileCols.getSize(), fileCols.get(i)  }}
//SEG7 [3] phi from @1 to @2 [phi:@1->@2]
b2_from_b1:
  jmp b2
//SEG8 @2
b2:
//SEG9 [4] call main 
  jsr main
//SEG10 [5] phi from @2 to @end [phi:@2->@end]
bend_from_b2:
  jmp bend
//SEG11 @end
bend:
//SEG12 main
main: {
  //SEG13 [6] *((const byte*) BGCOL#0) ← (const byte) BLACK#0 -- _deref_pbuc1=vbuc2 
    lda #BLACK
    sta BGCOL
  //SEG14 [7] call memcpy 
  //SEG15 [11] phi from main to memcpy [phi:main->memcpy]
  memcpy_from_main:
  //SEG16 [11] phi (byte*) memcpy::dst#0 = (const byte*) SCREEN#0 [phi:main->memcpy#0] -- pbuz1=pbuc1 
    lda #<SCREEN
    sta memcpy.dst
    lda #>SCREEN
    sta memcpy.dst+1
  //SEG17 [11] phi (byte*) memcpy::src#0 = (const byte*) MEDUSA_SCREEN#0 [phi:main->memcpy#1] -- pbuz1=pbuc1 
    lda #<MEDUSA_SCREEN
    sta memcpy.src
    lda #>MEDUSA_SCREEN
    sta memcpy.src+1
    jsr memcpy
  //SEG18 [8] phi from main to main::@2 [phi:main->main::@2]
  b2_from_main:
    jmp b2
  //SEG19 main::@2
  b2:
  //SEG20 [9] call memcpy 
  //SEG21 [11] phi from main::@2 to memcpy [phi:main::@2->memcpy]
  memcpy_from_b2:
  //SEG22 [11] phi (byte*) memcpy::dst#0 = (const byte*) COLS#0 [phi:main::@2->memcpy#0] -- pbuz1=pbuc1 
    lda #<COLS
    sta memcpy.dst
    lda #>COLS
    sta memcpy.dst+1
  //SEG23 [11] phi (byte*) memcpy::src#0 = (const byte*) MEDUSA_COLORS#0 [phi:main::@2->memcpy#1] -- pbuz1=pbuc1 
    lda #<MEDUSA_COLORS
    sta memcpy.src
    lda #>MEDUSA_COLORS
    sta memcpy.src+1
    jsr memcpy
    jmp b1
  //SEG24 main::@1
  b1:
  //SEG25 [10] *((const byte*) SCREEN#0+(word) $3e7) ← *((const byte*) SCREEN#0+(word) $3e7) ^ (byte) $e -- _deref_pbuc1=_deref_pbuc1_bxor_vbuc2 
    lda #$e
    eor SCREEN+$3e7
    sta SCREEN+$3e7
    jmp b1
}
//SEG26 memcpy
// Copy block of memory
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
memcpy: {
    .label src = 2
    .label dst = 4
    .label i = 6
  //SEG27 [12] phi from memcpy to memcpy::@1 [phi:memcpy->memcpy::@1]
  b1_from_memcpy:
  //SEG28 [12] phi (word) memcpy::i#2 = (byte) 0 [phi:memcpy->memcpy::@1#0] -- vwuz1=vbuc1 
    lda #0
    sta i
    lda #0
    sta i+1
  //SEG29 [12] phi (byte*) memcpy::dst#2 = (byte*) memcpy::dst#0 [phi:memcpy->memcpy::@1#1] -- register_copy 
  //SEG30 [12] phi (byte*) memcpy::src#2 = (byte*) memcpy::src#0 [phi:memcpy->memcpy::@1#2] -- register_copy 
    jmp b1
  //SEG31 [12] phi from memcpy::@1 to memcpy::@1 [phi:memcpy::@1->memcpy::@1]
  b1_from_b1:
  //SEG32 [12] phi (word) memcpy::i#2 = (word) memcpy::i#1 [phi:memcpy::@1->memcpy::@1#0] -- register_copy 
  //SEG33 [12] phi (byte*) memcpy::dst#2 = (byte*) memcpy::dst#1 [phi:memcpy::@1->memcpy::@1#1] -- register_copy 
  //SEG34 [12] phi (byte*) memcpy::src#2 = (byte*) memcpy::src#1 [phi:memcpy::@1->memcpy::@1#2] -- register_copy 
    jmp b1
  //SEG35 memcpy::@1
  b1:
  //SEG36 [13] *((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#2) -- _deref_pbuz1=_deref_pbuz2 
    ldy #0
    lda (src),y
    ldy #0
    sta (dst),y
  //SEG37 [14] (byte*) memcpy::dst#1 ← ++ (byte*) memcpy::dst#2 -- pbuz1=_inc_pbuz1 
    inc dst
    bne !+
    inc dst+1
  !:
  //SEG38 [15] (byte*) memcpy::src#1 ← ++ (byte*) memcpy::src#2 -- pbuz1=_inc_pbuz1 
    inc src
    bne !+
    inc src+1
  !:
  //SEG39 [16] (word) memcpy::i#1 ← ++ (word) memcpy::i#2 -- vwuz1=_inc_vwuz1 
    inc i
    bne !+
    inc i+1
  !:
  //SEG40 [17] if((word) memcpy::i#1<(word) $3e8) goto memcpy::@1 -- vwuz1_lt_vwuc1_then_la1 
    lda i+1
    cmp #>$3e8
    bcc b1_from_b1
    bne !+
    lda i
    cmp #<$3e8
    bcc b1_from_b1
  !:
    jmp breturn
  //SEG41 memcpy::@return
  breturn:
  //SEG42 [18] return 
    rts
}
.pc = MEDUSA_SCREEN "MEDUSA_SCREEN"
  .var fileScreen = LoadBinary("medusas.prg", BF_C64FILE)
    .fill fileScreen.getSize(), fileScreen.get(i)

.pc = MEDUSA_COLORS "MEDUSA_COLORS"
  .var fileCols = LoadBinary("medusac.prg", BF_C64FILE)
    .fill fileCols.getSize(), fileCols.get(i)


REGISTER UPLIFT POTENTIAL REGISTERS
Statement [6] *((const byte*) BGCOL#0) ← (const byte) BLACK#0 [ ] ( main:4 [ ] ) always clobbers reg byte a 
Statement [10] *((const byte*) SCREEN#0+(word) $3e7) ← *((const byte*) SCREEN#0+(word) $3e7) ^ (byte) $e [ ] ( main:4 [ ] ) always clobbers reg byte a 
Statement [13] *((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#2) [ memcpy::src#2 memcpy::dst#2 memcpy::i#2 ] ( main:4::memcpy:7 [ memcpy::src#2 memcpy::dst#2 memcpy::i#2 ] main:4::memcpy:9 [ memcpy::src#2 memcpy::dst#2 memcpy::i#2 ] ) always clobbers reg byte a reg byte y 
Statement [17] if((word) memcpy::i#1<(word) $3e8) goto memcpy::@1 [ memcpy::src#1 memcpy::dst#1 memcpy::i#1 ] ( main:4::memcpy:7 [ memcpy::src#1 memcpy::dst#1 memcpy::i#1 ] main:4::memcpy:9 [ memcpy::src#1 memcpy::dst#1 memcpy::i#1 ] ) always clobbers reg byte a 
Potential registers zp ZP_WORD:2 [ memcpy::src#2 memcpy::src#0 memcpy::src#1 ] : zp ZP_WORD:2 , 
Potential registers zp ZP_WORD:4 [ memcpy::dst#2 memcpy::dst#0 memcpy::dst#1 ] : zp ZP_WORD:4 , 
Potential registers zp ZP_WORD:6 [ memcpy::i#2 memcpy::i#1 ] : zp ZP_WORD:6 , 

REGISTER UPLIFT SCOPES
Uplift Scope [memcpy] 25: zp ZP_WORD:4 [ memcpy::dst#2 memcpy::dst#0 memcpy::dst#1 ] 22: zp ZP_WORD:6 [ memcpy::i#2 memcpy::i#1 ] 21: zp ZP_WORD:2 [ memcpy::src#2 memcpy::src#0 memcpy::src#1 ] 
Uplift Scope [main] 
Uplift Scope [] 

Uplifting [memcpy] best 1649 combination zp ZP_WORD:4 [ memcpy::dst#2 memcpy::dst#0 memcpy::dst#1 ] zp ZP_WORD:6 [ memcpy::i#2 memcpy::i#1 ] zp ZP_WORD:2 [ memcpy::src#2 memcpy::src#0 memcpy::src#1 ] 
Uplifting [main] best 1649 combination 
Uplifting [] best 1649 combination 

ASSEMBLER BEFORE OPTIMIZATION
//SEG0 File Comments
// Display  MEDUSA PETSCII by Buzz_clik
// https://csdb.dk/release/?id=178673
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(bbegin)
.pc = $80d "Program"
//SEG2 Global Constants & labels
  .label BGCOL = $d021
  // Color Ram
  .label COLS = $d800
  // The colors of the C64
  .const BLACK = 0
  .label MEDUSA_SCREEN = $1000
  .label MEDUSA_COLORS = $1400
  .label SCREEN = $400
//SEG3 @begin
bbegin:
  jmp b1
//SEG4 @1
b1:
//SEG5 kickasm(location (const byte*) MEDUSA_SCREEN#0) {{ .var fileScreen = LoadBinary("medusas.prg", BF_C64FILE)     .fill fileScreen.getSize(), fileScreen.get(i)  }}
//SEG6 kickasm(location (const byte*) MEDUSA_COLORS#0) {{ .var fileCols = LoadBinary("medusac.prg", BF_C64FILE)     .fill fileCols.getSize(), fileCols.get(i)  }}
//SEG7 [3] phi from @1 to @2 [phi:@1->@2]
b2_from_b1:
  jmp b2
//SEG8 @2
b2:
//SEG9 [4] call main 
  jsr main
//SEG10 [5] phi from @2 to @end [phi:@2->@end]
bend_from_b2:
  jmp bend
//SEG11 @end
bend:
//SEG12 main
main: {
  //SEG13 [6] *((const byte*) BGCOL#0) ← (const byte) BLACK#0 -- _deref_pbuc1=vbuc2 
    lda #BLACK
    sta BGCOL
  //SEG14 [7] call memcpy 
  //SEG15 [11] phi from main to memcpy [phi:main->memcpy]
  memcpy_from_main:
  //SEG16 [11] phi (byte*) memcpy::dst#0 = (const byte*) SCREEN#0 [phi:main->memcpy#0] -- pbuz1=pbuc1 
    lda #<SCREEN
    sta memcpy.dst
    lda #>SCREEN
    sta memcpy.dst+1
  //SEG17 [11] phi (byte*) memcpy::src#0 = (const byte*) MEDUSA_SCREEN#0 [phi:main->memcpy#1] -- pbuz1=pbuc1 
    lda #<MEDUSA_SCREEN
    sta memcpy.src
    lda #>MEDUSA_SCREEN
    sta memcpy.src+1
    jsr memcpy
  //SEG18 [8] phi from main to main::@2 [phi:main->main::@2]
  b2_from_main:
    jmp b2
  //SEG19 main::@2
  b2:
  //SEG20 [9] call memcpy 
  //SEG21 [11] phi from main::@2 to memcpy [phi:main::@2->memcpy]
  memcpy_from_b2:
  //SEG22 [11] phi (byte*) memcpy::dst#0 = (const byte*) COLS#0 [phi:main::@2->memcpy#0] -- pbuz1=pbuc1 
    lda #<COLS
    sta memcpy.dst
    lda #>COLS
    sta memcpy.dst+1
  //SEG23 [11] phi (byte*) memcpy::src#0 = (const byte*) MEDUSA_COLORS#0 [phi:main::@2->memcpy#1] -- pbuz1=pbuc1 
    lda #<MEDUSA_COLORS
    sta memcpy.src
    lda #>MEDUSA_COLORS
    sta memcpy.src+1
    jsr memcpy
    jmp b1
  //SEG24 main::@1
  b1:
  //SEG25 [10] *((const byte*) SCREEN#0+(word) $3e7) ← *((const byte*) SCREEN#0+(word) $3e7) ^ (byte) $e -- _deref_pbuc1=_deref_pbuc1_bxor_vbuc2 
    lda #$e
    eor SCREEN+$3e7
    sta SCREEN+$3e7
    jmp b1
}
//SEG26 memcpy
// Copy block of memory
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
memcpy: {
    .label src = 2
    .label dst = 4
    .label i = 6
  //SEG27 [12] phi from memcpy to memcpy::@1 [phi:memcpy->memcpy::@1]
  b1_from_memcpy:
  //SEG28 [12] phi (word) memcpy::i#2 = (byte) 0 [phi:memcpy->memcpy::@1#0] -- vwuz1=vbuc1 
    lda #0
    sta i
    lda #0
    sta i+1
  //SEG29 [12] phi (byte*) memcpy::dst#2 = (byte*) memcpy::dst#0 [phi:memcpy->memcpy::@1#1] -- register_copy 
  //SEG30 [12] phi (byte*) memcpy::src#2 = (byte*) memcpy::src#0 [phi:memcpy->memcpy::@1#2] -- register_copy 
    jmp b1
  //SEG31 [12] phi from memcpy::@1 to memcpy::@1 [phi:memcpy::@1->memcpy::@1]
  b1_from_b1:
  //SEG32 [12] phi (word) memcpy::i#2 = (word) memcpy::i#1 [phi:memcpy::@1->memcpy::@1#0] -- register_copy 
  //SEG33 [12] phi (byte*) memcpy::dst#2 = (byte*) memcpy::dst#1 [phi:memcpy::@1->memcpy::@1#1] -- register_copy 
  //SEG34 [12] phi (byte*) memcpy::src#2 = (byte*) memcpy::src#1 [phi:memcpy::@1->memcpy::@1#2] -- register_copy 
    jmp b1
  //SEG35 memcpy::@1
  b1:
  //SEG36 [13] *((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#2) -- _deref_pbuz1=_deref_pbuz2 
    ldy #0
    lda (src),y
    ldy #0
    sta (dst),y
  //SEG37 [14] (byte*) memcpy::dst#1 ← ++ (byte*) memcpy::dst#2 -- pbuz1=_inc_pbuz1 
    inc dst
    bne !+
    inc dst+1
  !:
  //SEG38 [15] (byte*) memcpy::src#1 ← ++ (byte*) memcpy::src#2 -- pbuz1=_inc_pbuz1 
    inc src
    bne !+
    inc src+1
  !:
  //SEG39 [16] (word) memcpy::i#1 ← ++ (word) memcpy::i#2 -- vwuz1=_inc_vwuz1 
    inc i
    bne !+
    inc i+1
  !:
  //SEG40 [17] if((word) memcpy::i#1<(word) $3e8) goto memcpy::@1 -- vwuz1_lt_vwuc1_then_la1 
    lda i+1
    cmp #>$3e8
    bcc b1_from_b1
    bne !+
    lda i
    cmp #<$3e8
    bcc b1_from_b1
  !:
    jmp breturn
  //SEG41 memcpy::@return
  breturn:
  //SEG42 [18] return 
    rts
}
.pc = MEDUSA_SCREEN "MEDUSA_SCREEN"
  .var fileScreen = LoadBinary("medusas.prg", BF_C64FILE)
    .fill fileScreen.getSize(), fileScreen.get(i)

.pc = MEDUSA_COLORS "MEDUSA_COLORS"
  .var fileCols = LoadBinary("medusac.prg", BF_C64FILE)
    .fill fileCols.getSize(), fileCols.get(i)


ASSEMBLER OPTIMIZATIONS
Removing instruction jmp b1
Removing instruction jmp b2
Removing instruction jmp bend
Removing instruction jmp b2
Removing instruction jmp b1
Removing instruction jmp b1
Removing instruction jmp breturn
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda #0
Removing instruction ldy #0
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Replacing label b1_from_b1 with b1
Replacing label b1_from_b1 with b1
Removing instruction b1:
Removing instruction b2_from_b1:
Removing instruction b2:
Removing instruction bend_from_b2:
Removing instruction b2_from_main:
Removing instruction memcpy_from_b2:
Removing instruction b1_from_b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction bend:
Removing instruction memcpy_from_main:
Removing instruction b2:
Removing instruction b1_from_memcpy:
Removing instruction breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Updating BasicUpstart to call main directly
Removing instruction jsr main
Succesful ASM optimization Pass5SkipBegin
Removing instruction jmp b1
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction bbegin:
Succesful ASM optimization Pass5UnusedLabelElimination

FINAL SYMBOL TABLE
(label) @1
(label) @2
(label) @begin
(label) @end
(byte*) BGCOL
(const byte*) BGCOL#0 BGCOL = (byte*) 53281
(byte) BLACK
(const byte) BLACK#0 BLACK = (byte) 0
(byte*) COLS
(const byte*) COLS#0 COLS = (byte*) 55296
(byte*) MEDUSA_COLORS
(const byte*) MEDUSA_COLORS#0 MEDUSA_COLORS = (byte*) 5120
(byte*) MEDUSA_SCREEN
(const byte*) MEDUSA_SCREEN#0 MEDUSA_SCREEN = (byte*) 4096
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = (byte*) 1024
(void()) main()
(label) main::@1
(label) main::@2
(byte*()) memcpy((byte*) memcpy::destination , (byte*) memcpy::source , (word) memcpy::num)
(label) memcpy::@1
(label) memcpy::@return
(byte*) memcpy::destination
(byte*) memcpy::dst
(byte*) memcpy::dst#0 dst zp ZP_WORD:4 2.0
(byte*) memcpy::dst#1 dst zp ZP_WORD:4 5.5
(byte*) memcpy::dst#2 dst zp ZP_WORD:4 17.5
(word) memcpy::i
(word) memcpy::i#1 i zp ZP_WORD:6 16.5
(word) memcpy::i#2 i zp ZP_WORD:6 5.5
(word) memcpy::num
(byte*) memcpy::return
(byte*) memcpy::source
(byte*) memcpy::src
(byte*) memcpy::src#0 src zp ZP_WORD:2 2.0
(byte*) memcpy::src#1 src zp ZP_WORD:2 7.333333333333333
(byte*) memcpy::src#2 src zp ZP_WORD:2 11.666666666666666

zp ZP_WORD:2 [ memcpy::src#2 memcpy::src#0 memcpy::src#1 ]
zp ZP_WORD:4 [ memcpy::dst#2 memcpy::dst#0 memcpy::dst#1 ]
zp ZP_WORD:6 [ memcpy::i#2 memcpy::i#1 ]


FINAL ASSEMBLER
Score: 1471

//SEG0 File Comments
// Display  MEDUSA PETSCII by Buzz_clik
// https://csdb.dk/release/?id=178673
//SEG1 Basic Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
//SEG2 Global Constants & labels
  .label BGCOL = $d021
  // Color Ram
  .label COLS = $d800
  // The colors of the C64
  .const BLACK = 0
  .label MEDUSA_SCREEN = $1000
  .label MEDUSA_COLORS = $1400
  .label SCREEN = $400
//SEG3 @begin
//SEG4 @1
//SEG5 kickasm(location (const byte*) MEDUSA_SCREEN#0) {{ .var fileScreen = LoadBinary("medusas.prg", BF_C64FILE)     .fill fileScreen.getSize(), fileScreen.get(i)  }}
//SEG6 kickasm(location (const byte*) MEDUSA_COLORS#0) {{ .var fileCols = LoadBinary("medusac.prg", BF_C64FILE)     .fill fileCols.getSize(), fileCols.get(i)  }}
//SEG7 [3] phi from @1 to @2 [phi:@1->@2]
//SEG8 @2
//SEG9 [4] call main 
//SEG10 [5] phi from @2 to @end [phi:@2->@end]
//SEG11 @end
//SEG12 main
main: {
  //SEG13 [6] *((const byte*) BGCOL#0) ← (const byte) BLACK#0 -- _deref_pbuc1=vbuc2 
    lda #BLACK
    sta BGCOL
  //SEG14 [7] call memcpy 
  //SEG15 [11] phi from main to memcpy [phi:main->memcpy]
  //SEG16 [11] phi (byte*) memcpy::dst#0 = (const byte*) SCREEN#0 [phi:main->memcpy#0] -- pbuz1=pbuc1 
    lda #<SCREEN
    sta memcpy.dst
    lda #>SCREEN
    sta memcpy.dst+1
  //SEG17 [11] phi (byte*) memcpy::src#0 = (const byte*) MEDUSA_SCREEN#0 [phi:main->memcpy#1] -- pbuz1=pbuc1 
    lda #<MEDUSA_SCREEN
    sta memcpy.src
    lda #>MEDUSA_SCREEN
    sta memcpy.src+1
    jsr memcpy
  //SEG18 [8] phi from main to main::@2 [phi:main->main::@2]
  //SEG19 main::@2
  //SEG20 [9] call memcpy 
  //SEG21 [11] phi from main::@2 to memcpy [phi:main::@2->memcpy]
  //SEG22 [11] phi (byte*) memcpy::dst#0 = (const byte*) COLS#0 [phi:main::@2->memcpy#0] -- pbuz1=pbuc1 
    lda #<COLS
    sta memcpy.dst
    lda #>COLS
    sta memcpy.dst+1
  //SEG23 [11] phi (byte*) memcpy::src#0 = (const byte*) MEDUSA_COLORS#0 [phi:main::@2->memcpy#1] -- pbuz1=pbuc1 
    lda #<MEDUSA_COLORS
    sta memcpy.src
    lda #>MEDUSA_COLORS
    sta memcpy.src+1
    jsr memcpy
  //SEG24 main::@1
  b1:
  //SEG25 [10] *((const byte*) SCREEN#0+(word) $3e7) ← *((const byte*) SCREEN#0+(word) $3e7) ^ (byte) $e -- _deref_pbuc1=_deref_pbuc1_bxor_vbuc2 
    lda #$e
    eor SCREEN+$3e7
    sta SCREEN+$3e7
    jmp b1
}
//SEG26 memcpy
// Copy block of memory
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
memcpy: {
    .label src = 2
    .label dst = 4
    .label i = 6
  //SEG27 [12] phi from memcpy to memcpy::@1 [phi:memcpy->memcpy::@1]
  //SEG28 [12] phi (word) memcpy::i#2 = (byte) 0 [phi:memcpy->memcpy::@1#0] -- vwuz1=vbuc1 
    lda #0
    sta i
    sta i+1
  //SEG29 [12] phi (byte*) memcpy::dst#2 = (byte*) memcpy::dst#0 [phi:memcpy->memcpy::@1#1] -- register_copy 
  //SEG30 [12] phi (byte*) memcpy::src#2 = (byte*) memcpy::src#0 [phi:memcpy->memcpy::@1#2] -- register_copy 
  //SEG31 [12] phi from memcpy::@1 to memcpy::@1 [phi:memcpy::@1->memcpy::@1]
  //SEG32 [12] phi (word) memcpy::i#2 = (word) memcpy::i#1 [phi:memcpy::@1->memcpy::@1#0] -- register_copy 
  //SEG33 [12] phi (byte*) memcpy::dst#2 = (byte*) memcpy::dst#1 [phi:memcpy::@1->memcpy::@1#1] -- register_copy 
  //SEG34 [12] phi (byte*) memcpy::src#2 = (byte*) memcpy::src#1 [phi:memcpy::@1->memcpy::@1#2] -- register_copy 
  //SEG35 memcpy::@1
  b1:
  //SEG36 [13] *((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#2) -- _deref_pbuz1=_deref_pbuz2 
    ldy #0
    lda (src),y
    sta (dst),y
  //SEG37 [14] (byte*) memcpy::dst#1 ← ++ (byte*) memcpy::dst#2 -- pbuz1=_inc_pbuz1 
    inc dst
    bne !+
    inc dst+1
  !:
  //SEG38 [15] (byte*) memcpy::src#1 ← ++ (byte*) memcpy::src#2 -- pbuz1=_inc_pbuz1 
    inc src
    bne !+
    inc src+1
  !:
  //SEG39 [16] (word) memcpy::i#1 ← ++ (word) memcpy::i#2 -- vwuz1=_inc_vwuz1 
    inc i
    bne !+
    inc i+1
  !:
  //SEG40 [17] if((word) memcpy::i#1<(word) $3e8) goto memcpy::@1 -- vwuz1_lt_vwuc1_then_la1 
    lda i+1
    cmp #>$3e8
    bcc b1
    bne !+
    lda i
    cmp #<$3e8
    bcc b1
  !:
  //SEG41 memcpy::@return
  //SEG42 [18] return 
    rts
}
.pc = MEDUSA_SCREEN "MEDUSA_SCREEN"
  .var fileScreen = LoadBinary("medusas.prg", BF_C64FILE)
    .fill fileScreen.getSize(), fileScreen.get(i)

.pc = MEDUSA_COLORS "MEDUSA_COLORS"
  .var fileCols = LoadBinary("medusac.prg", BF_C64FILE)
    .fill fileCols.getSize(), fileCols.get(i)


