1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-08-07 06:30:04 +00:00
Files
kickc/src/test/ref/examples/nes/nes-demo.log
2020-06-08 00:33:18 +02:00

5630 lines
332 KiB
Plaintext

Resolved forward reference PALETTE to (const byte*) PALETTE
Resolved forward reference PALETTE to (const byte*) PALETTE
Resolved forward reference FLOOR to (const byte*) FLOOR
Resolved forward reference FLAG to (const byte*) FLAG
Resolved forward reference SPRITES to (const struct SpriteData*) SPRITES
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITES to (const struct SpriteData*) SPRITES
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER
Inlined call call disableVideoOutput
Inlined call call disableAudioOutput
Inlined call call clearVBlankFlag
Inlined call call waitForVBlank
Inlined call call waitForVBlank
Inlined call call ppuDataPrepare (nomodify void*) ppuDataFill::ppuData
Inlined call call ppuDataPut (byte) ppuDataFill::val
Inlined call call ppuDataPrepare (nomodify void*) ppuDataTransfer::ppuData
Inlined call call ppuDataPut *((byte*) ppuDataTransfer::cpuSrc)
Inlined call call ppuDataPrepare (nomodify void*) ppuDataFetch::ppuData
Inlined call (byte~) ppuDataFetch::$2 ← call ppuDataRead
Inlined call call ppuDataPrepare (nomodify void*) ppuDataPutTile::ppuData
Inlined call call ppuDataPut *((byte*) ppuDataPutTile::tile + (number) 0)
Inlined call call ppuDataPut *((byte*) ppuDataPutTile::tile + (number) 1)
Inlined call call ppuDataPrepare (void*)(byte*~) ppuDataPutTile::$3
Inlined call call ppuDataPut *((byte*) ppuDataPutTile::tile + (number) 2)
Inlined call call ppuDataPut *((byte*) ppuDataPutTile::tile + (number) 3)
Inlined call call ppuDataPrepare (nomodify void*) ppuDataSet::ppuData
Inlined call call ppuDataPut (byte) ppuDataSet::val
Inlined call call ppuDataPrepare (nomodify void*) ppuDataGet::ppuData
Inlined call (byte~) ppuDataGet::$1 ← call ppuDataRead
Inlined call call initNES
Inlined call call enableVideoOutput
Inlined call call ppuSpriteBufferDmaTransfer (const struct SpriteData*) SPRITE_BUFFER
CONTROL FLOW GRAPH SSA
@begin: scope:[] from
to:@1
(byte()) readJoy1()
readJoy1: scope:[readJoy1] from vblank
(byte*~) readJoy1::$7 ← (byte*)(const struct RICOH_2A03*) APU
(byte*~) readJoy1::$4 ← (byte*~) readJoy1::$7 + (const byte) OFFSET_STRUCT_RICOH_2A03_JOY1
*((byte*~) readJoy1::$4) ← (number) 1
(byte*~) readJoy1::$8 ← (byte*)(const struct RICOH_2A03*) APU
(byte*~) readJoy1::$5 ← (byte*~) readJoy1::$8 + (const byte) OFFSET_STRUCT_RICOH_2A03_JOY1
*((byte*~) readJoy1::$5) ← (number) 0
(byte) readJoy1::joy#0 ← (byte) 0
(byte) readJoy1::i#0 ← (byte) 0
to:readJoy1::@1
readJoy1::@1: scope:[readJoy1] from readJoy1 readJoy1::@2
(byte) readJoy1::joy#4 ← phi( readJoy1/(byte) readJoy1::joy#0 readJoy1::@2/(byte) readJoy1::joy#1 )
(byte) readJoy1::i#2 ← phi( readJoy1/(byte) readJoy1::i#0 readJoy1::@2/(byte) readJoy1::i#1 )
(bool~) readJoy1::$0 ← (byte) readJoy1::i#2 < (number) 8
if((bool~) readJoy1::$0) goto readJoy1::@2
to:readJoy1::@3
readJoy1::@2: scope:[readJoy1] from readJoy1::@1
(byte) readJoy1::i#3 ← phi( readJoy1::@1/(byte) readJoy1::i#2 )
(byte) readJoy1::joy#2 ← phi( readJoy1::@1/(byte) readJoy1::joy#4 )
(byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (number) 1
(byte*~) readJoy1::$9 ← (byte*)(const struct RICOH_2A03*) APU
(byte*~) readJoy1::$6 ← (byte*~) readJoy1::$9 + (const byte) OFFSET_STRUCT_RICOH_2A03_JOY1
(number~) readJoy1::$2 ← *((byte*~) readJoy1::$6) & (number) 1
(number~) readJoy1::$3 ← (byte~) readJoy1::$1 | (number~) readJoy1::$2
(byte) readJoy1::joy#1 ← (number~) readJoy1::$3
(byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#3
to:readJoy1::@1
readJoy1::@3: scope:[readJoy1] from readJoy1::@1
(byte) readJoy1::joy#3 ← phi( readJoy1::@1/(byte) readJoy1::joy#4 )
(byte) readJoy1::return#0 ← (byte) readJoy1::joy#3
to:readJoy1::@return
readJoy1::@return: scope:[readJoy1] from readJoy1::@3
(byte) readJoy1::return#3 ← phi( readJoy1::@3/(byte) readJoy1::return#0 )
(byte) readJoy1::return#1 ← (byte) readJoy1::return#3
return
to:@return
(void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size)
ppuDataFill: scope:[ppuDataFill] from main::@6 main::@7
(byte) ppuDataFill::val#8 ← phi( main::@6/(byte) ppuDataFill::val#0 main::@7/(byte) ppuDataFill::val#1 )
(word) ppuDataFill::size#7 ← phi( main::@6/(word) ppuDataFill::size#0 main::@7/(word) ppuDataFill::size#1 )
(nomodify void*) ppuDataFill::ppuData#2 ← phi( main::@6/(nomodify void*) ppuDataFill::ppuData#0 main::@7/(nomodify void*) ppuDataFill::ppuData#1 )
(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ← (nomodify void*) ppuDataFill::ppuData#2
to:ppuDataFill::ppuDataPrepare1
ppuDataFill::ppuDataPrepare1: scope:[ppuDataFill] from ppuDataFill
(byte) ppuDataFill::val#6 ← phi( ppuDataFill/(byte) ppuDataFill::val#8 )
(word) ppuDataFill::size#5 ← phi( ppuDataFill/(word) ppuDataFill::size#7 )
(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#1 ← phi( ppuDataFill/(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 )
(byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#1
(byte*~) ppuDataFill::ppuDataPrepare1_$4 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) ppuDataFill::ppuDataPrepare1_$2 ← (byte*~) ppuDataFill::ppuDataPrepare1_$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
*((byte*~) ppuDataFill::ppuDataPrepare1_$2) ← (byte~) ppuDataFill::ppuDataPrepare1_$0
(byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#1
(byte*~) ppuDataFill::ppuDataPrepare1_$5 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) ppuDataFill::ppuDataPrepare1_$3 ← (byte*~) ppuDataFill::ppuDataPrepare1_$5 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
*((byte*~) ppuDataFill::ppuDataPrepare1_$3) ← (byte~) ppuDataFill::ppuDataPrepare1_$1
to:ppuDataFill::@3
ppuDataFill::@3: scope:[ppuDataFill] from ppuDataFill::ppuDataPrepare1
(byte) ppuDataFill::val#4 ← phi( ppuDataFill::ppuDataPrepare1/(byte) ppuDataFill::val#6 )
(word) ppuDataFill::size#3 ← phi( ppuDataFill::ppuDataPrepare1/(word) ppuDataFill::size#5 )
(word) ppuDataFill::i#0 ← (word) 0
to:ppuDataFill::@1
ppuDataFill::@1: scope:[ppuDataFill] from ppuDataFill::@3 ppuDataFill::@4
(byte) ppuDataFill::val#3 ← phi( ppuDataFill::@3/(byte) ppuDataFill::val#4 ppuDataFill::@4/(byte) ppuDataFill::val#5 )
(word) ppuDataFill::size#2 ← phi( ppuDataFill::@3/(word) ppuDataFill::size#3 ppuDataFill::@4/(word) ppuDataFill::size#4 )
(word) ppuDataFill::i#2 ← phi( ppuDataFill::@3/(word) ppuDataFill::i#0 ppuDataFill::@4/(word) ppuDataFill::i#1 )
(bool~) ppuDataFill::$1 ← (word) ppuDataFill::i#2 < (word) ppuDataFill::size#2
if((bool~) ppuDataFill::$1) goto ppuDataFill::@2
to:ppuDataFill::@return
ppuDataFill::@2: scope:[ppuDataFill] from ppuDataFill::@1
(word) ppuDataFill::size#8 ← phi( ppuDataFill::@1/(word) ppuDataFill::size#2 )
(word) ppuDataFill::i#5 ← phi( ppuDataFill::@1/(word) ppuDataFill::i#2 )
(byte) ppuDataFill::val#2 ← phi( ppuDataFill::@1/(byte) ppuDataFill::val#3 )
(byte) ppuDataFill::ppuDataPut1_val#0 ← (byte) ppuDataFill::val#2
to:ppuDataFill::ppuDataPut1
ppuDataFill::ppuDataPut1: scope:[ppuDataFill] from ppuDataFill::@2
(byte) ppuDataFill::val#7 ← phi( ppuDataFill::@2/(byte) ppuDataFill::val#2 )
(word) ppuDataFill::size#6 ← phi( ppuDataFill::@2/(word) ppuDataFill::size#8 )
(word) ppuDataFill::i#4 ← phi( ppuDataFill::@2/(word) ppuDataFill::i#5 )
(byte) ppuDataFill::ppuDataPut1_val#1 ← phi( ppuDataFill::@2/(byte) ppuDataFill::ppuDataPut1_val#0 )
(byte*~) ppuDataFill::ppuDataPut1_$1 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) ppuDataFill::ppuDataPut1_$0 ← (byte*~) ppuDataFill::ppuDataPut1_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA
*((byte*~) ppuDataFill::ppuDataPut1_$0) ← (byte) ppuDataFill::ppuDataPut1_val#1
to:ppuDataFill::@4
ppuDataFill::@4: scope:[ppuDataFill] from ppuDataFill::ppuDataPut1
(byte) ppuDataFill::val#5 ← phi( ppuDataFill::ppuDataPut1/(byte) ppuDataFill::val#7 )
(word) ppuDataFill::size#4 ← phi( ppuDataFill::ppuDataPut1/(word) ppuDataFill::size#6 )
(word) ppuDataFill::i#3 ← phi( ppuDataFill::ppuDataPut1/(word) ppuDataFill::i#4 )
(word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#3
to:ppuDataFill::@1
ppuDataFill::@return: scope:[ppuDataFill] from ppuDataFill::@1
return
to:@return
(void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size)
ppuDataTransfer: scope:[ppuDataTransfer] from main::@5
(word) ppuDataTransfer::size#6 ← phi( main::@5/(word) ppuDataTransfer::size#0 )
(nomodify void*) ppuDataTransfer::cpuData#3 ← phi( main::@5/(nomodify void*) ppuDataTransfer::cpuData#0 )
(nomodify void*) ppuDataTransfer::ppuData#1 ← phi( main::@5/(nomodify void*) ppuDataTransfer::ppuData#0 )
(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 ← (nomodify void*) ppuDataTransfer::ppuData#1
to:ppuDataTransfer::ppuDataPrepare1
ppuDataTransfer::ppuDataPrepare1: scope:[ppuDataTransfer] from ppuDataTransfer
(word) ppuDataTransfer::size#4 ← phi( ppuDataTransfer/(word) ppuDataTransfer::size#6 )
(nomodify void*) ppuDataTransfer::cpuData#2 ← phi( ppuDataTransfer/(nomodify void*) ppuDataTransfer::cpuData#3 )
(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#1 ← phi( ppuDataTransfer/(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 )
(byte~) ppuDataTransfer::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#1
(byte*~) ppuDataTransfer::ppuDataPrepare1_$4 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) ppuDataTransfer::ppuDataPrepare1_$2 ← (byte*~) ppuDataTransfer::ppuDataPrepare1_$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
*((byte*~) ppuDataTransfer::ppuDataPrepare1_$2) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$0
(byte~) ppuDataTransfer::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#1
(byte*~) ppuDataTransfer::ppuDataPrepare1_$5 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) ppuDataTransfer::ppuDataPrepare1_$3 ← (byte*~) ppuDataTransfer::ppuDataPrepare1_$5 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
*((byte*~) ppuDataTransfer::ppuDataPrepare1_$3) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$1
to:ppuDataTransfer::@3
ppuDataTransfer::@3: scope:[ppuDataTransfer] from ppuDataTransfer::ppuDataPrepare1
(word) ppuDataTransfer::size#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(word) ppuDataTransfer::size#4 )
(nomodify void*) ppuDataTransfer::cpuData#1 ← phi( ppuDataTransfer::ppuDataPrepare1/(nomodify void*) ppuDataTransfer::cpuData#2 )
(byte*) ppuDataTransfer::cpuSrc#0 ← (byte*)(nomodify void*) ppuDataTransfer::cpuData#1
(word) ppuDataTransfer::i#0 ← (word) 0
to:ppuDataTransfer::@1
ppuDataTransfer::@1: scope:[ppuDataTransfer] from ppuDataTransfer::@3 ppuDataTransfer::@4
(byte*) ppuDataTransfer::cpuSrc#4 ← phi( ppuDataTransfer::@3/(byte*) ppuDataTransfer::cpuSrc#0 ppuDataTransfer::@4/(byte*) ppuDataTransfer::cpuSrc#1 )
(word) ppuDataTransfer::size#1 ← phi( ppuDataTransfer::@3/(word) ppuDataTransfer::size#2 ppuDataTransfer::@4/(word) ppuDataTransfer::size#3 )
(word) ppuDataTransfer::i#2 ← phi( ppuDataTransfer::@3/(word) ppuDataTransfer::i#0 ppuDataTransfer::@4/(word) ppuDataTransfer::i#1 )
(bool~) ppuDataTransfer::$1 ← (word) ppuDataTransfer::i#2 < (word) ppuDataTransfer::size#1
if((bool~) ppuDataTransfer::$1) goto ppuDataTransfer::@2
to:ppuDataTransfer::@return
ppuDataTransfer::@2: scope:[ppuDataTransfer] from ppuDataTransfer::@1
(word) ppuDataTransfer::size#7 ← phi( ppuDataTransfer::@1/(word) ppuDataTransfer::size#1 )
(word) ppuDataTransfer::i#5 ← phi( ppuDataTransfer::@1/(word) ppuDataTransfer::i#2 )
(byte*) ppuDataTransfer::cpuSrc#2 ← phi( ppuDataTransfer::@1/(byte*) ppuDataTransfer::cpuSrc#4 )
(byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2)
to:ppuDataTransfer::ppuDataPut1
ppuDataTransfer::ppuDataPut1: scope:[ppuDataTransfer] from ppuDataTransfer::@2
(word) ppuDataTransfer::size#5 ← phi( ppuDataTransfer::@2/(word) ppuDataTransfer::size#7 )
(word) ppuDataTransfer::i#4 ← phi( ppuDataTransfer::@2/(word) ppuDataTransfer::i#5 )
(byte*) ppuDataTransfer::cpuSrc#5 ← phi( ppuDataTransfer::@2/(byte*) ppuDataTransfer::cpuSrc#2 )
(byte) ppuDataTransfer::ppuDataPut1_val#1 ← phi( ppuDataTransfer::@2/(byte) ppuDataTransfer::ppuDataPut1_val#0 )
(byte*~) ppuDataTransfer::ppuDataPut1_$1 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) ppuDataTransfer::ppuDataPut1_$0 ← (byte*~) ppuDataTransfer::ppuDataPut1_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA
*((byte*~) ppuDataTransfer::ppuDataPut1_$0) ← (byte) ppuDataTransfer::ppuDataPut1_val#1
to:ppuDataTransfer::@4
ppuDataTransfer::@4: scope:[ppuDataTransfer] from ppuDataTransfer::ppuDataPut1
(word) ppuDataTransfer::size#3 ← phi( ppuDataTransfer::ppuDataPut1/(word) ppuDataTransfer::size#5 )
(word) ppuDataTransfer::i#3 ← phi( ppuDataTransfer::ppuDataPut1/(word) ppuDataTransfer::i#4 )
(byte*) ppuDataTransfer::cpuSrc#3 ← phi( ppuDataTransfer::ppuDataPut1/(byte*) ppuDataTransfer::cpuSrc#5 )
(byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#3
(word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#3
to:ppuDataTransfer::@1
ppuDataTransfer::@return: scope:[ppuDataTransfer] from ppuDataTransfer::@1
return
to:@return
(void()) ppuDataPutTile((nomodify void*) ppuDataPutTile::ppuData , (byte*) ppuDataPutTile::tile)
ppuDataPutTile: scope:[ppuDataPutTile] from main::@2 main::@3
(byte*) ppuDataPutTile::tile#10 ← phi( main::@2/(byte*) ppuDataPutTile::tile#0 main::@3/(byte*) ppuDataPutTile::tile#1 )
(nomodify void*) ppuDataPutTile::ppuData#2 ← phi( main::@2/(nomodify void*) ppuDataPutTile::ppuData#0 main::@3/(nomodify void*) ppuDataPutTile::ppuData#1 )
(nomodify void*) ppuDataPutTile::ppuDataPrepare1_ppuData#0 ← (nomodify void*) ppuDataPutTile::ppuData#2
to:ppuDataPutTile::ppuDataPrepare1
ppuDataPutTile::ppuDataPrepare1: scope:[ppuDataPutTile] from ppuDataPutTile
(nomodify void*) ppuDataPutTile::ppuData#8 ← phi( ppuDataPutTile/(nomodify void*) ppuDataPutTile::ppuData#2 )
(byte*) ppuDataPutTile::tile#6 ← phi( ppuDataPutTile/(byte*) ppuDataPutTile::tile#10 )
(nomodify void*) ppuDataPutTile::ppuDataPrepare1_ppuData#1 ← phi( ppuDataPutTile/(nomodify void*) ppuDataPutTile::ppuDataPrepare1_ppuData#0 )
(byte~) ppuDataPutTile::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataPutTile::ppuDataPrepare1_ppuData#1
(byte*~) ppuDataPutTile::ppuDataPrepare1_$4 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) ppuDataPutTile::ppuDataPrepare1_$2 ← (byte*~) ppuDataPutTile::ppuDataPrepare1_$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
*((byte*~) ppuDataPutTile::ppuDataPrepare1_$2) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$0
(byte~) ppuDataPutTile::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataPutTile::ppuDataPrepare1_ppuData#1
(byte*~) ppuDataPutTile::ppuDataPrepare1_$5 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) ppuDataPutTile::ppuDataPrepare1_$3 ← (byte*~) ppuDataPutTile::ppuDataPrepare1_$5 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
*((byte*~) ppuDataPutTile::ppuDataPrepare1_$3) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$1
to:ppuDataPutTile::@1
ppuDataPutTile::@1: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPrepare1
(nomodify void*) ppuDataPutTile::ppuData#7 ← phi( ppuDataPutTile::ppuDataPrepare1/(nomodify void*) ppuDataPutTile::ppuData#8 )
(byte*) ppuDataPutTile::tile#2 ← phi( ppuDataPutTile::ppuDataPrepare1/(byte*) ppuDataPutTile::tile#6 )
(byte) ppuDataPutTile::ppuDataPut1_val#0 ← *((byte*) ppuDataPutTile::tile#2 + (number) 0)
to:ppuDataPutTile::ppuDataPut1
ppuDataPutTile::ppuDataPut1: scope:[ppuDataPutTile] from ppuDataPutTile::@1
(nomodify void*) ppuDataPutTile::ppuData#6 ← phi( ppuDataPutTile::@1/(nomodify void*) ppuDataPutTile::ppuData#7 )
(byte*) ppuDataPutTile::tile#7 ← phi( ppuDataPutTile::@1/(byte*) ppuDataPutTile::tile#2 )
(byte) ppuDataPutTile::ppuDataPut1_val#1 ← phi( ppuDataPutTile::@1/(byte) ppuDataPutTile::ppuDataPut1_val#0 )
(byte*~) ppuDataPutTile::ppuDataPut1_$1 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) ppuDataPutTile::ppuDataPut1_$0 ← (byte*~) ppuDataPutTile::ppuDataPut1_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA
*((byte*~) ppuDataPutTile::ppuDataPut1_$0) ← (byte) ppuDataPutTile::ppuDataPut1_val#1
to:ppuDataPutTile::@2
ppuDataPutTile::@2: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPut1
(nomodify void*) ppuDataPutTile::ppuData#5 ← phi( ppuDataPutTile::ppuDataPut1/(nomodify void*) ppuDataPutTile::ppuData#6 )
(byte*) ppuDataPutTile::tile#3 ← phi( ppuDataPutTile::ppuDataPut1/(byte*) ppuDataPutTile::tile#7 )
(byte) ppuDataPutTile::ppuDataPut2_val#0 ← *((byte*) ppuDataPutTile::tile#3 + (number) 1)
to:ppuDataPutTile::ppuDataPut2
ppuDataPutTile::ppuDataPut2: scope:[ppuDataPutTile] from ppuDataPutTile::@2
(byte*) ppuDataPutTile::tile#12 ← phi( ppuDataPutTile::@2/(byte*) ppuDataPutTile::tile#3 )
(nomodify void*) ppuDataPutTile::ppuData#4 ← phi( ppuDataPutTile::@2/(nomodify void*) ppuDataPutTile::ppuData#5 )
(byte) ppuDataPutTile::ppuDataPut2_val#1 ← phi( ppuDataPutTile::@2/(byte) ppuDataPutTile::ppuDataPut2_val#0 )
(byte*~) ppuDataPutTile::ppuDataPut2_$1 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) ppuDataPutTile::ppuDataPut2_$0 ← (byte*~) ppuDataPutTile::ppuDataPut2_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA
*((byte*~) ppuDataPutTile::ppuDataPut2_$0) ← (byte) ppuDataPutTile::ppuDataPut2_val#1
to:ppuDataPutTile::@3
ppuDataPutTile::@3: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPut2
(byte*) ppuDataPutTile::tile#11 ← phi( ppuDataPutTile::ppuDataPut2/(byte*) ppuDataPutTile::tile#12 )
(nomodify void*) ppuDataPutTile::ppuData#3 ← phi( ppuDataPutTile::ppuDataPut2/(nomodify void*) ppuDataPutTile::ppuData#4 )
(byte*~) ppuDataPutTile::$7 ← (byte*)(nomodify void*) ppuDataPutTile::ppuData#3
(byte*~) ppuDataPutTile::$3 ← (byte*~) ppuDataPutTile::$7 + (number) $20
(nomodify void*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 ← (void*)(byte*~) ppuDataPutTile::$3
to:ppuDataPutTile::ppuDataPrepare2
ppuDataPutTile::ppuDataPrepare2: scope:[ppuDataPutTile] from ppuDataPutTile::@3
(byte*) ppuDataPutTile::tile#8 ← phi( ppuDataPutTile::@3/(byte*) ppuDataPutTile::tile#11 )
(nomodify void*) ppuDataPutTile::ppuDataPrepare2_ppuData#1 ← phi( ppuDataPutTile::@3/(nomodify void*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 )
(byte~) ppuDataPutTile::ppuDataPrepare2_$0 ← > (nomodify void*) ppuDataPutTile::ppuDataPrepare2_ppuData#1
(byte*~) ppuDataPutTile::ppuDataPrepare2_$4 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) ppuDataPutTile::ppuDataPrepare2_$2 ← (byte*~) ppuDataPutTile::ppuDataPrepare2_$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
*((byte*~) ppuDataPutTile::ppuDataPrepare2_$2) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$0
(byte~) ppuDataPutTile::ppuDataPrepare2_$1 ← < (nomodify void*) ppuDataPutTile::ppuDataPrepare2_ppuData#1
(byte*~) ppuDataPutTile::ppuDataPrepare2_$5 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) ppuDataPutTile::ppuDataPrepare2_$3 ← (byte*~) ppuDataPutTile::ppuDataPrepare2_$5 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
*((byte*~) ppuDataPutTile::ppuDataPrepare2_$3) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$1
to:ppuDataPutTile::@4
ppuDataPutTile::@4: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPrepare2
(byte*) ppuDataPutTile::tile#4 ← phi( ppuDataPutTile::ppuDataPrepare2/(byte*) ppuDataPutTile::tile#8 )
(byte) ppuDataPutTile::ppuDataPut3_val#0 ← *((byte*) ppuDataPutTile::tile#4 + (number) 2)
to:ppuDataPutTile::ppuDataPut3
ppuDataPutTile::ppuDataPut3: scope:[ppuDataPutTile] from ppuDataPutTile::@4
(byte*) ppuDataPutTile::tile#9 ← phi( ppuDataPutTile::@4/(byte*) ppuDataPutTile::tile#4 )
(byte) ppuDataPutTile::ppuDataPut3_val#1 ← phi( ppuDataPutTile::@4/(byte) ppuDataPutTile::ppuDataPut3_val#0 )
(byte*~) ppuDataPutTile::ppuDataPut3_$1 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) ppuDataPutTile::ppuDataPut3_$0 ← (byte*~) ppuDataPutTile::ppuDataPut3_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA
*((byte*~) ppuDataPutTile::ppuDataPut3_$0) ← (byte) ppuDataPutTile::ppuDataPut3_val#1
to:ppuDataPutTile::@5
ppuDataPutTile::@5: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPut3
(byte*) ppuDataPutTile::tile#5 ← phi( ppuDataPutTile::ppuDataPut3/(byte*) ppuDataPutTile::tile#9 )
(byte) ppuDataPutTile::ppuDataPut4_val#0 ← *((byte*) ppuDataPutTile::tile#5 + (number) 3)
to:ppuDataPutTile::ppuDataPut4
ppuDataPutTile::ppuDataPut4: scope:[ppuDataPutTile] from ppuDataPutTile::@5
(byte) ppuDataPutTile::ppuDataPut4_val#1 ← phi( ppuDataPutTile::@5/(byte) ppuDataPutTile::ppuDataPut4_val#0 )
(byte*~) ppuDataPutTile::ppuDataPut4_$1 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) ppuDataPutTile::ppuDataPut4_$0 ← (byte*~) ppuDataPutTile::ppuDataPut4_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA
*((byte*~) ppuDataPutTile::ppuDataPut4_$0) ← (byte) ppuDataPutTile::ppuDataPut4_val#1
to:ppuDataPutTile::@return
ppuDataPutTile::@return: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPut4
return
to:@return
(void*()) memcpy((void*) memcpy::destination , (void*) memcpy::source , (word) memcpy::num)
memcpy: scope:[memcpy] from main::@10
(word) memcpy::num#1 ← phi( main::@10/(word) memcpy::num#0 )
(void*) memcpy::destination#1 ← phi( main::@10/(void*) memcpy::destination#0 )
(void*) memcpy::source#1 ← phi( main::@10/(void*) memcpy::source#0 )
(byte*) memcpy::src#0 ← ((byte*)) (void*) memcpy::source#1
(byte*) memcpy::dst#0 ← ((byte*)) (void*) memcpy::destination#1
(byte*~) memcpy::$2 ← (byte*)(void*) memcpy::source#1
(byte*~) memcpy::$0 ← (byte*~) memcpy::$2 + (word) memcpy::num#1
(byte*) memcpy::src_end#0 ← (byte*~) memcpy::$0
to:memcpy::@1
memcpy::@1: scope:[memcpy] from memcpy memcpy::@2
(void*) memcpy::destination#3 ← phi( memcpy/(void*) memcpy::destination#1 memcpy::@2/(void*) memcpy::destination#4 )
(byte*) memcpy::dst#3 ← phi( memcpy/(byte*) memcpy::dst#0 memcpy::@2/(byte*) memcpy::dst#1 )
(byte*) memcpy::src_end#1 ← phi( memcpy/(byte*) memcpy::src_end#0 memcpy::@2/(byte*) memcpy::src_end#2 )
(byte*) memcpy::src#2 ← phi( memcpy/(byte*) memcpy::src#0 memcpy::@2/(byte*) memcpy::src#1 )
(bool~) memcpy::$1 ← (byte*) memcpy::src#2 != (byte*) memcpy::src_end#1
if((bool~) memcpy::$1) goto memcpy::@2
to:memcpy::@3
memcpy::@2: scope:[memcpy] from memcpy::@1
(void*) memcpy::destination#4 ← phi( memcpy::@1/(void*) memcpy::destination#3 )
(byte*) memcpy::src_end#2 ← phi( memcpy::@1/(byte*) memcpy::src_end#1 )
(byte*) memcpy::dst#2 ← phi( memcpy::@1/(byte*) memcpy::dst#3 )
(byte*) memcpy::src#3 ← phi( memcpy::@1/(byte*) memcpy::src#2 )
*((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#3)
(byte*) memcpy::dst#1 ← ++ (byte*) memcpy::dst#2
(byte*) memcpy::src#1 ← ++ (byte*) memcpy::src#3
to:memcpy::@1
memcpy::@3: scope:[memcpy] from memcpy::@1
(void*) memcpy::destination#2 ← phi( memcpy::@1/(void*) memcpy::destination#3 )
(void*) memcpy::return#0 ← (void*) memcpy::destination#2
to:memcpy::@return
memcpy::@return: scope:[memcpy] from memcpy::@3
(void*) memcpy::return#3 ← phi( memcpy::@3/(void*) memcpy::return#0 )
(void*) memcpy::return#1 ← (void*) memcpy::return#3
return
to:@return
(void()) main()
main: scope:[main] from @1
to:main::initNES1
main::initNES1: scope:[main] from main
asm { cld ldx#$ff txs }
to:main::initNES1_disableVideoOutput1
main::initNES1_disableVideoOutput1: scope:[main] from main::initNES1
(byte*~) main::initNES1_disableVideoOutput1_$2 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) main::initNES1_disableVideoOutput1_$0 ← (byte*~) main::initNES1_disableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL
*((byte*~) main::initNES1_disableVideoOutput1_$0) ← (number) 0
(byte*~) main::initNES1_disableVideoOutput1_$3 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) main::initNES1_disableVideoOutput1_$1 ← (byte*~) main::initNES1_disableVideoOutput1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK
*((byte*~) main::initNES1_disableVideoOutput1_$1) ← (number) 0
to:main::initNES1_disableAudioOutput1
main::initNES1_disableAudioOutput1: scope:[main] from main::initNES1_disableVideoOutput1
*((const nomodify byte*) FR_COUNTER) ← (number) $40
(byte*~) main::initNES1_disableAudioOutput1_$1 ← (byte*)(const struct RICOH_2A03*) APU
(byte*~) main::initNES1_disableAudioOutput1_$0 ← (byte*~) main::initNES1_disableAudioOutput1_$1 + (const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ
*((byte*~) main::initNES1_disableAudioOutput1_$0) ← (number) $40
to:main::initNES1_clearVBlankFlag1
main::initNES1_clearVBlankFlag1: scope:[main] from main::initNES1_disableAudioOutput1
asm { ldaPPU_PPUSTATUS }
to:main::initNES1_waitForVBlank1
main::initNES1_waitForVBlank1: scope:[main] from main::initNES1_clearVBlankFlag1
to:main::initNES1_waitForVBlank1_@1
main::initNES1_waitForVBlank1_@1: scope:[main] from main::initNES1_waitForVBlank1 main::initNES1_waitForVBlank1_@1
(byte*~) main::initNES1_waitForVBlank1_$3 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) main::initNES1_waitForVBlank1_$2 ← (byte*~) main::initNES1_waitForVBlank1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS
(number~) main::initNES1_waitForVBlank1_$0 ← *((byte*~) main::initNES1_waitForVBlank1_$2) & (number) $80
(bool~) main::initNES1_waitForVBlank1_$4 ← (number) 0 != (number~) main::initNES1_waitForVBlank1_$0
(bool~) main::initNES1_waitForVBlank1_$1 ← ! (bool~) main::initNES1_waitForVBlank1_$4
if((bool~) main::initNES1_waitForVBlank1_$1) goto main::initNES1_waitForVBlank1_@1
to:main::initNES1_@6
main::initNES1_@6: scope:[main] from main::initNES1_waitForVBlank1_@1
(byte) main::initNES1_i#0 ← (byte) 0
to:main::initNES1_@1
main::initNES1_@1: scope:[main] from main::initNES1_@1 main::initNES1_@6
(byte) main::initNES1_i#2 ← phi( main::initNES1_@1/(byte) main::initNES1_i#1 main::initNES1_@6/(byte) main::initNES1_i#0 )
*((const nomodify byte*) MEMORY+(number) 0 + (byte) main::initNES1_i#2) ← (number) 0
*((const nomodify byte*) MEMORY+(number) $100 + (byte) main::initNES1_i#2) ← (number) 0
*((const nomodify byte*) MEMORY+(number) $200 + (byte) main::initNES1_i#2) ← (number) 0
*((const nomodify byte*) MEMORY+(number) $300 + (byte) main::initNES1_i#2) ← (number) 0
*((const nomodify byte*) MEMORY+(number) $400 + (byte) main::initNES1_i#2) ← (number) 0
*((const nomodify byte*) MEMORY+(number) $500 + (byte) main::initNES1_i#2) ← (number) 0
*((const nomodify byte*) MEMORY+(number) $600 + (byte) main::initNES1_i#2) ← (number) 0
*((const nomodify byte*) MEMORY+(number) $700 + (byte) main::initNES1_i#2) ← (number) 0
(byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2
(bool~) main::initNES1_$5 ← (number) 0 != (byte) main::initNES1_i#1
if((bool~) main::initNES1_$5) goto main::initNES1_@1
to:main::initNES1_waitForVBlank2
main::initNES1_waitForVBlank2: scope:[main] from main::initNES1_@1
to:main::initNES1_waitForVBlank2_@1
main::initNES1_waitForVBlank2_@1: scope:[main] from main::initNES1_waitForVBlank2 main::initNES1_waitForVBlank2_@1
(byte*~) main::initNES1_waitForVBlank2_$3 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) main::initNES1_waitForVBlank2_$2 ← (byte*~) main::initNES1_waitForVBlank2_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS
(number~) main::initNES1_waitForVBlank2_$0 ← *((byte*~) main::initNES1_waitForVBlank2_$2) & (number) $80
(bool~) main::initNES1_waitForVBlank2_$4 ← (number) 0 != (number~) main::initNES1_waitForVBlank2_$0
(bool~) main::initNES1_waitForVBlank2_$1 ← ! (bool~) main::initNES1_waitForVBlank2_$4
if((bool~) main::initNES1_waitForVBlank2_$1) goto main::initNES1_waitForVBlank2_@1
to:main::initNES1_@7
main::initNES1_@7: scope:[main] from main::initNES1_waitForVBlank2_@1
asm { ldaPPU_PPUSTATUS }
to:main::@5
main::@5: scope:[main] from main::initNES1_@7
(byte~) main::$1 ← sizeof (const byte*) PALETTE
(nomodify void*) ppuDataTransfer::ppuData#0 ← (void*)(const nomodify byte*) PPU_PALETTE
(nomodify void*) ppuDataTransfer::cpuData#0 ← (void*)(const byte*) PALETTE
(word) ppuDataTransfer::size#0 ← (byte~) main::$1
call ppuDataTransfer
to:main::@6
main::@6: scope:[main] from main::@5
(nomodify void*) ppuDataFill::ppuData#0 ← (void*)(const nomodify byte*) PPU_NAME_TABLE_0
(byte) ppuDataFill::val#0 ← (number) $fc
(word) ppuDataFill::size#0 ← (number) $3c0
call ppuDataFill
to:main::@7
main::@7: scope:[main] from main::@6
(nomodify void*) ppuDataFill::ppuData#1 ← (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0
(byte) ppuDataFill::val#1 ← (number) 0
(word) ppuDataFill::size#1 ← (number) $40
call ppuDataFill
to:main::@8
main::@8: scope:[main] from main::@7
(byte) main::x#0 ← (byte) 0
to:main::@1
main::@1: scope:[main] from main::@8 main::@9
(byte) main::x#2 ← phi( main::@8/(byte) main::x#0 main::@9/(byte) main::x#1 )
(bool~) main::$9 ← (byte) main::x#2 < (number) $20
if((bool~) main::$9) goto main::@2
to:main::@3
main::@2: scope:[main] from main::@1
(byte) main::x#3 ← phi( main::@1/(byte) main::x#2 )
(byte*~) main::$10 ← (const nomodify byte*) PPU_NAME_TABLE_0+(number) $14*(number) $20 + (byte) main::x#3
(nomodify void*) ppuDataPutTile::ppuData#0 ← (void*)(byte*~) main::$10
(byte*) ppuDataPutTile::tile#0 ← (const byte*) FLOOR
call ppuDataPutTile
to:main::@9
main::@9: scope:[main] from main::@2
(byte) main::x#4 ← phi( main::@2/(byte) main::x#3 )
(byte) main::x#1 ← (byte) main::x#4 + (number) 2
to:main::@1
main::@3: scope:[main] from main::@1
(nomodify void*) ppuDataPutTile::ppuData#1 ← (void*)(const nomodify byte*) PPU_NAME_TABLE_0+(number) $12*(number) $20+(number) $1c
(byte*) ppuDataPutTile::tile#1 ← (const byte*) FLAG
call ppuDataPutTile
to:main::@10
main::@10: scope:[main] from main::@3
(byte~) main::$6 ← sizeof (const struct SpriteData*) SPRITES
(void*) memcpy::destination#0 ← (void*)(const struct SpriteData*) SPRITE_BUFFER
(void*) memcpy::source#0 ← (void*)(const struct SpriteData*) SPRITES
(word) memcpy::num#0 ← (byte~) main::$6
call memcpy
(void*) memcpy::return#2 ← (void*) memcpy::return#1
to:main::@11
main::@11: scope:[main] from main::@10
to:main::enableVideoOutput1
main::enableVideoOutput1: scope:[main] from main::@11
(byte*~) main::enableVideoOutput1_$2 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) main::enableVideoOutput1_$0 ← (byte*~) main::enableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL
*((byte*~) main::enableVideoOutput1_$0) ← (number) $80
(byte*~) main::enableVideoOutput1_$3 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) main::enableVideoOutput1_$1 ← (byte*~) main::enableVideoOutput1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK
*((byte*~) main::enableVideoOutput1_$1) ← (number) $1e
to:main::@4
main::@4: scope:[main] from main::@4 main::enableVideoOutput1
(bool~) main::$12 ← (number) 0 != (number) 1
if((bool~) main::$12) goto main::@4
to:main::@return
main::@return: scope:[main] from main::@4
return
to:@return
interrupt(HARDWARE_STACK)(void()) vblank()
vblank: scope:[vblank] from
call readJoy1
(byte) readJoy1::return#2 ← (byte) readJoy1::return#1
to:vblank::@10
vblank::@10: scope:[vblank] from vblank
(byte) readJoy1::return#4 ← phi( vblank/(byte) readJoy1::return#2 )
(byte~) vblank::$0 ← (byte) readJoy1::return#4
(byte) vblank::joy#0 ← (byte~) vblank::$0
(byte~) vblank::$1 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN
(bool~) vblank::$62 ← (number) 0 != (byte~) vblank::$1
(bool~) vblank::$2 ← ! (bool~) vblank::$62
if((bool~) vblank::$2) goto vblank::@1
to:vblank::@5
vblank::@1: scope:[vblank] from vblank::@10 vblank::@5
(byte) vblank::joy#1 ← phi( vblank::@10/(byte) vblank::joy#0 vblank::@5/(byte) vblank::joy#4 )
(byte~) vblank::$3 ← (byte) vblank::joy#1 & (const nomodify byte) JOY_UP
(bool~) vblank::$63 ← (number) 0 != (byte~) vblank::$3
(bool~) vblank::$4 ← ! (bool~) vblank::$63
if((bool~) vblank::$4) goto vblank::@2
to:vblank::@6
vblank::@5: scope:[vblank] from vblank::@10
(byte) vblank::joy#4 ← phi( vblank::@10/(byte) vblank::joy#0 )
(number~) vblank::$27 ← (number) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$27) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$27)
(number~) vblank::$29 ← (number) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$29) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$29)
(number~) vblank::$31 ← (number) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$31) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$31)
(number~) vblank::$33 ← (number) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$33) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$33)
to:vblank::@1
vblank::@2: scope:[vblank] from vblank::@1 vblank::@6
(byte) vblank::joy#2 ← phi( vblank::@1/(byte) vblank::joy#1 vblank::@6/(byte) vblank::joy#5 )
(byte~) vblank::$5 ← (byte) vblank::joy#2 & (const nomodify byte) JOY_LEFT
(bool~) vblank::$64 ← (number) 0 != (byte~) vblank::$5
(bool~) vblank::$6 ← ! (bool~) vblank::$64
if((bool~) vblank::$6) goto vblank::@3
to:vblank::@7
vblank::@6: scope:[vblank] from vblank::@1
(byte) vblank::joy#5 ← phi( vblank::@1/(byte) vblank::joy#1 )
(number~) vblank::$35 ← (number) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$35) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$35)
(number~) vblank::$37 ← (number) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$37) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$37)
(number~) vblank::$39 ← (number) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$39) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$39)
(number~) vblank::$41 ← (number) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$41) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (number~) vblank::$41)
to:vblank::@2
vblank::@3: scope:[vblank] from vblank::@2 vblank::@7
(byte) vblank::joy#3 ← phi( vblank::@2/(byte) vblank::joy#2 vblank::@7/(byte) vblank::joy#6 )
(byte~) vblank::$7 ← (byte) vblank::joy#3 & (const nomodify byte) JOY_RIGHT
(bool~) vblank::$65 ← (number) 0 != (byte~) vblank::$7
(bool~) vblank::$8 ← ! (bool~) vblank::$65
if((bool~) vblank::$8) goto vblank::@4
to:vblank::@8
vblank::@7: scope:[vblank] from vblank::@2
(byte) vblank::joy#6 ← phi( vblank::@2/(byte) vblank::joy#2 )
(number~) vblank::$43 ← (number) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$43) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$43)
(number~) vblank::$45 ← (number) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$45) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$45)
(number~) vblank::$47 ← (number) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$47) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$47)
(number~) vblank::$49 ← (number) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$49) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$49)
to:vblank::@3
vblank::@4: scope:[vblank] from vblank::@3 vblank::@8
(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 ← (const struct SpriteData*) SPRITE_BUFFER
to:vblank::ppuSpriteBufferDmaTransfer1
vblank::ppuSpriteBufferDmaTransfer1: scope:[vblank] from vblank::@4
(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#1 ← phi( vblank::@4/(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 )
(byte*~) vblank::ppuSpriteBufferDmaTransfer1_$3 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1 ← (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR
*((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1) ← (number) 0
(byte~) vblank::ppuSpriteBufferDmaTransfer1_$0 ← > (struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#1
(byte*~) vblank::ppuSpriteBufferDmaTransfer1_$4 ← (byte*)(const struct RICOH_2A03*) APU
(byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2 ← (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$4 + (const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA
*((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2) ← (byte~) vblank::ppuSpriteBufferDmaTransfer1_$0
to:vblank::@9
vblank::@9: scope:[vblank] from vblank::ppuSpriteBufferDmaTransfer1
(byte*~) vblank::$60 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) vblank::$58 ← (byte*~) vblank::$60 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL
*((byte*~) vblank::$58) ← (number) 0
(byte*~) vblank::$61 ← (byte*)(const struct RICOH_2C02*) PPU
(byte*~) vblank::$59 ← (byte*~) vblank::$61 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL
*((byte*~) vblank::$59) ← (number) -8
to:vblank::@return
vblank::@8: scope:[vblank] from vblank::@3
(number~) vblank::$51 ← (number) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$51) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$51)
(number~) vblank::$53 ← (number) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$53) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$53)
(number~) vblank::$55 ← (number) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$55) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$55)
(number~) vblank::$57 ← (number) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
*((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$57) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (number~) vblank::$57)
to:vblank::@4
vblank::@return: scope:[vblank] from vblank::@9
return
to:@return
@1: scope:[] from @begin
call main
to:@2
@2: scope:[] from @1
to:@end
@end: scope:[] from @2
SYMBOL TABLE SSA
(label) @1
(label) @2
(label) @begin
(label) @end
(const struct RICOH_2A03*) APU = (struct RICOH_2A03*)(number) $4000
(const byte*) FLAG[] = { (byte) $54, (byte) $55, (byte) $56, (byte) $57 }
(const byte*) FLOOR[] = { (byte) $85, (byte) $85, (byte) $86, (byte) $86 }
(const nomodify byte*) FR_COUNTER = (byte*)(number) $4017
(const nomodify byte) JOY_DOWN = (byte) 4
(const nomodify byte) JOY_LEFT = (byte) 2
(const nomodify byte) JOY_RIGHT = (byte) 1
(const nomodify byte) JOY_UP = (byte) 8
(const nomodify byte*) MEMORY = (byte*)(number) 0
(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = (byte) $10
(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1 = (byte) $16
(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA = (byte) $14
(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR = (byte) 3
(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR = (byte) 6
(const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL = (byte) 0
(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA = (byte) 7
(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK = (byte) 1
(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = (byte) 5
(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = (byte) 2
(const byte) OFFSET_STRUCT_SPRITEDATA_X = (byte) 3
(const byte) OFFSET_STRUCT_SPRITEDATA_Y = (byte) 0
(const byte*) PALETTE[(number) $20] = { (byte) $11, (byte) $2d, (byte) 8, (byte) $18, (byte) $11, (byte) 6, (byte) $15, (byte) $36, (byte) $11, (byte) $39, (byte) $4a, (byte) $5b, (byte) $f, (byte) $3d, (byte) $4e, (byte) $5f, (byte) $11, (byte) $f, (byte) $30, (byte) 8, (byte) $11, (byte) $f, (byte) $18, (byte) 8, (byte) $11, (byte) $30, (byte) $37, (byte) $1a, (byte) $f, (byte) $f, (byte) $f, (byte) $f }
(const struct RICOH_2C02*) PPU = (struct RICOH_2C02*)(number) $2000
(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 = (byte*)(number) $23c0
(const nomodify byte*) PPU_NAME_TABLE_0 = (byte*)(number) $2000
(const nomodify byte*) PPU_PALETTE = (byte*)(number) $3f00
(const nomodify to_volatile byte*) PPU_PPUSTATUS = (byte*)(number) $2002
(byte) RICOH_2A03::DMC_FREQ
(byte) RICOH_2A03::DMC_LEN
(byte) RICOH_2A03::DMC_RAW
(byte) RICOH_2A03::DMC_START
(byte) RICOH_2A03::JOY1
(byte) RICOH_2A03::JOY2
(byte) RICOH_2A03::NOISE_HI
(byte) RICOH_2A03::NOISE_LO
(byte) RICOH_2A03::NOISE_VOL
(byte) RICOH_2A03::OAMDMA
(byte) RICOH_2A03::SND_CHN
(byte) RICOH_2A03::SQ1_HI
(byte) RICOH_2A03::SQ1_LO
(byte) RICOH_2A03::SQ1_SWEEP
(byte) RICOH_2A03::SQ1_VOL
(byte) RICOH_2A03::SQ2_HI
(byte) RICOH_2A03::SQ2_LO
(byte) RICOH_2A03::SQ2_SWEEP
(byte) RICOH_2A03::SQ2_VOL
(byte) RICOH_2A03::TRI_HI
(byte) RICOH_2A03::TRI_LINEAR
(byte) RICOH_2A03::TRI_LO
(byte) RICOH_2A03::UNUSED1
(byte) RICOH_2A03::UNUSED2
(byte) RICOH_2C02::OAMADDR
(byte) RICOH_2C02::OAMDATA
(byte) RICOH_2C02::PPUADDR
(byte) RICOH_2C02::PPUCTRL
(byte) RICOH_2C02::PPUDATA
(byte) RICOH_2C02::PPUMASK
(byte) RICOH_2C02::PPUSCROLL
(volatile byte) RICOH_2C02::PPUSTATUS loadstore
(const byte) SIZEOF_STRUCT_SPRITEDATA = (byte) 4
(const struct SpriteData*) SPRITES[] = { { y: (byte) $96, tile: (byte) $36, attributes: (byte) 2, x: (byte) $c }, { y: (byte) $96, tile: (byte) $37, attributes: (byte) 2, x: (byte) $14 }, { y: (byte) $9e, tile: (byte) $38, attributes: (byte) 2, x: (byte) $c }, { y: (byte) $9e, tile: (byte) $39, attributes: (byte) 2, x: (byte) $14 }, { y: (byte) $96, tile: (byte) $70, attributes: (byte) 0, x: (byte) $48 }, { y: (byte) $96, tile: (byte) $71, attributes: (byte) 0, x: (byte) $50 }, { y: (byte) $9e, tile: (byte) $72, attributes: (byte) 1, x: (byte) $48 }, { y: (byte) $9e, tile: (byte) $73, attributes: (byte) 1, x: (byte) $50 } }
(const struct SpriteData*) SPRITE_BUFFER[(number) $40] = { fill( $40, 0) }
(byte) SpriteData::attributes
(byte) SpriteData::tile
(byte) SpriteData::x
(byte) SpriteData::y
(const byte*) TILES[] = kickasm {{ .import binary "smb1_chr.bin"
}}
(const to_nomodify void()**) VECTORS[] = { &interrupt(HARDWARE_STACK)(void()) vblank(), &(void()) main(), (void()*)(number) 0 }
(void()) main()
(byte~) main::$1
(byte*~) main::$10
(bool~) main::$12
(byte~) main::$6
(bool~) main::$9
(label) main::@1
(label) main::@10
(label) main::@11
(label) main::@2
(label) main::@3
(label) main::@4
(label) main::@5
(label) main::@6
(label) main::@7
(label) main::@8
(label) main::@9
(label) main::@return
(label) main::enableVideoOutput1
(byte*~) main::enableVideoOutput1_$0
(byte*~) main::enableVideoOutput1_$1
(byte*~) main::enableVideoOutput1_$2
(byte*~) main::enableVideoOutput1_$3
(label) main::initNES1
(bool~) main::initNES1_$5
(label) main::initNES1_@1
(label) main::initNES1_@6
(label) main::initNES1_@7
(label) main::initNES1_clearVBlankFlag1
(label) main::initNES1_disableAudioOutput1
(byte*~) main::initNES1_disableAudioOutput1_$0
(byte*~) main::initNES1_disableAudioOutput1_$1
(label) main::initNES1_disableVideoOutput1
(byte*~) main::initNES1_disableVideoOutput1_$0
(byte*~) main::initNES1_disableVideoOutput1_$1
(byte*~) main::initNES1_disableVideoOutput1_$2
(byte*~) main::initNES1_disableVideoOutput1_$3
(byte) main::initNES1_i
(byte) main::initNES1_i#0
(byte) main::initNES1_i#1
(byte) main::initNES1_i#2
(label) main::initNES1_waitForVBlank1
(number~) main::initNES1_waitForVBlank1_$0
(bool~) main::initNES1_waitForVBlank1_$1
(byte*~) main::initNES1_waitForVBlank1_$2
(byte*~) main::initNES1_waitForVBlank1_$3
(bool~) main::initNES1_waitForVBlank1_$4
(label) main::initNES1_waitForVBlank1_@1
(label) main::initNES1_waitForVBlank2
(number~) main::initNES1_waitForVBlank2_$0
(bool~) main::initNES1_waitForVBlank2_$1
(byte*~) main::initNES1_waitForVBlank2_$2
(byte*~) main::initNES1_waitForVBlank2_$3
(bool~) main::initNES1_waitForVBlank2_$4
(label) main::initNES1_waitForVBlank2_@1
(byte) main::x
(byte) main::x#0
(byte) main::x#1
(byte) main::x#2
(byte) main::x#3
(byte) main::x#4
(void*()) memcpy((void*) memcpy::destination , (void*) memcpy::source , (word) memcpy::num)
(byte*~) memcpy::$0
(bool~) memcpy::$1
(byte*~) memcpy::$2
(label) memcpy::@1
(label) memcpy::@2
(label) memcpy::@3
(label) memcpy::@return
(void*) memcpy::destination
(void*) memcpy::destination#0
(void*) memcpy::destination#1
(void*) memcpy::destination#2
(void*) memcpy::destination#3
(void*) memcpy::destination#4
(byte*) memcpy::dst
(byte*) memcpy::dst#0
(byte*) memcpy::dst#1
(byte*) memcpy::dst#2
(byte*) memcpy::dst#3
(word) memcpy::num
(word) memcpy::num#0
(word) memcpy::num#1
(void*) memcpy::return
(void*) memcpy::return#0
(void*) memcpy::return#1
(void*) memcpy::return#2
(void*) memcpy::return#3
(void*) memcpy::source
(void*) memcpy::source#0
(void*) memcpy::source#1
(byte*) memcpy::src
(byte*) memcpy::src#0
(byte*) memcpy::src#1
(byte*) memcpy::src#2
(byte*) memcpy::src#3
(byte*) memcpy::src_end
(byte*) memcpy::src_end#0
(byte*) memcpy::src_end#1
(byte*) memcpy::src_end#2
(void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size)
(bool~) ppuDataFill::$1
(label) ppuDataFill::@1
(label) ppuDataFill::@2
(label) ppuDataFill::@3
(label) ppuDataFill::@4
(label) ppuDataFill::@return
(word) ppuDataFill::i
(word) ppuDataFill::i#0
(word) ppuDataFill::i#1
(word) ppuDataFill::i#2
(word) ppuDataFill::i#3
(word) ppuDataFill::i#4
(word) ppuDataFill::i#5
(nomodify void*) ppuDataFill::ppuData
(nomodify void*) ppuDataFill::ppuData#0
(nomodify void*) ppuDataFill::ppuData#1
(nomodify void*) ppuDataFill::ppuData#2
(label) ppuDataFill::ppuDataPrepare1
(byte~) ppuDataFill::ppuDataPrepare1_$0
(byte~) ppuDataFill::ppuDataPrepare1_$1
(byte*~) ppuDataFill::ppuDataPrepare1_$2
(byte*~) ppuDataFill::ppuDataPrepare1_$3
(byte*~) ppuDataFill::ppuDataPrepare1_$4
(byte*~) ppuDataFill::ppuDataPrepare1_$5
(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData
(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0
(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#1
(label) ppuDataFill::ppuDataPut1
(byte*~) ppuDataFill::ppuDataPut1_$0
(byte*~) ppuDataFill::ppuDataPut1_$1
(byte) ppuDataFill::ppuDataPut1_val
(byte) ppuDataFill::ppuDataPut1_val#0
(byte) ppuDataFill::ppuDataPut1_val#1
(word) ppuDataFill::size
(word) ppuDataFill::size#0
(word) ppuDataFill::size#1
(word) ppuDataFill::size#2
(word) ppuDataFill::size#3
(word) ppuDataFill::size#4
(word) ppuDataFill::size#5
(word) ppuDataFill::size#6
(word) ppuDataFill::size#7
(word) ppuDataFill::size#8
(byte) ppuDataFill::val
(byte) ppuDataFill::val#0
(byte) ppuDataFill::val#1
(byte) ppuDataFill::val#2
(byte) ppuDataFill::val#3
(byte) ppuDataFill::val#4
(byte) ppuDataFill::val#5
(byte) ppuDataFill::val#6
(byte) ppuDataFill::val#7
(byte) ppuDataFill::val#8
(void()) ppuDataPutTile((nomodify void*) ppuDataPutTile::ppuData , (byte*) ppuDataPutTile::tile)
(byte*~) ppuDataPutTile::$3
(byte*~) ppuDataPutTile::$7
(label) ppuDataPutTile::@1
(label) ppuDataPutTile::@2
(label) ppuDataPutTile::@3
(label) ppuDataPutTile::@4
(label) ppuDataPutTile::@5
(label) ppuDataPutTile::@return
(nomodify void*) ppuDataPutTile::ppuData
(nomodify void*) ppuDataPutTile::ppuData#0
(nomodify void*) ppuDataPutTile::ppuData#1
(nomodify void*) ppuDataPutTile::ppuData#2
(nomodify void*) ppuDataPutTile::ppuData#3
(nomodify void*) ppuDataPutTile::ppuData#4
(nomodify void*) ppuDataPutTile::ppuData#5
(nomodify void*) ppuDataPutTile::ppuData#6
(nomodify void*) ppuDataPutTile::ppuData#7
(nomodify void*) ppuDataPutTile::ppuData#8
(label) ppuDataPutTile::ppuDataPrepare1
(byte~) ppuDataPutTile::ppuDataPrepare1_$0
(byte~) ppuDataPutTile::ppuDataPrepare1_$1
(byte*~) ppuDataPutTile::ppuDataPrepare1_$2
(byte*~) ppuDataPutTile::ppuDataPrepare1_$3
(byte*~) ppuDataPutTile::ppuDataPrepare1_$4
(byte*~) ppuDataPutTile::ppuDataPrepare1_$5
(nomodify void*) ppuDataPutTile::ppuDataPrepare1_ppuData
(nomodify void*) ppuDataPutTile::ppuDataPrepare1_ppuData#0
(nomodify void*) ppuDataPutTile::ppuDataPrepare1_ppuData#1
(label) ppuDataPutTile::ppuDataPrepare2
(byte~) ppuDataPutTile::ppuDataPrepare2_$0
(byte~) ppuDataPutTile::ppuDataPrepare2_$1
(byte*~) ppuDataPutTile::ppuDataPrepare2_$2
(byte*~) ppuDataPutTile::ppuDataPrepare2_$3
(byte*~) ppuDataPutTile::ppuDataPrepare2_$4
(byte*~) ppuDataPutTile::ppuDataPrepare2_$5
(nomodify void*) ppuDataPutTile::ppuDataPrepare2_ppuData
(nomodify void*) ppuDataPutTile::ppuDataPrepare2_ppuData#0
(nomodify void*) ppuDataPutTile::ppuDataPrepare2_ppuData#1
(label) ppuDataPutTile::ppuDataPut1
(byte*~) ppuDataPutTile::ppuDataPut1_$0
(byte*~) ppuDataPutTile::ppuDataPut1_$1
(byte) ppuDataPutTile::ppuDataPut1_val
(byte) ppuDataPutTile::ppuDataPut1_val#0
(byte) ppuDataPutTile::ppuDataPut1_val#1
(label) ppuDataPutTile::ppuDataPut2
(byte*~) ppuDataPutTile::ppuDataPut2_$0
(byte*~) ppuDataPutTile::ppuDataPut2_$1
(byte) ppuDataPutTile::ppuDataPut2_val
(byte) ppuDataPutTile::ppuDataPut2_val#0
(byte) ppuDataPutTile::ppuDataPut2_val#1
(label) ppuDataPutTile::ppuDataPut3
(byte*~) ppuDataPutTile::ppuDataPut3_$0
(byte*~) ppuDataPutTile::ppuDataPut3_$1
(byte) ppuDataPutTile::ppuDataPut3_val
(byte) ppuDataPutTile::ppuDataPut3_val#0
(byte) ppuDataPutTile::ppuDataPut3_val#1
(label) ppuDataPutTile::ppuDataPut4
(byte*~) ppuDataPutTile::ppuDataPut4_$0
(byte*~) ppuDataPutTile::ppuDataPut4_$1
(byte) ppuDataPutTile::ppuDataPut4_val
(byte) ppuDataPutTile::ppuDataPut4_val#0
(byte) ppuDataPutTile::ppuDataPut4_val#1
(byte*) ppuDataPutTile::tile
(byte*) ppuDataPutTile::tile#0
(byte*) ppuDataPutTile::tile#1
(byte*) ppuDataPutTile::tile#10
(byte*) ppuDataPutTile::tile#11
(byte*) ppuDataPutTile::tile#12
(byte*) ppuDataPutTile::tile#2
(byte*) ppuDataPutTile::tile#3
(byte*) ppuDataPutTile::tile#4
(byte*) ppuDataPutTile::tile#5
(byte*) ppuDataPutTile::tile#6
(byte*) ppuDataPutTile::tile#7
(byte*) ppuDataPutTile::tile#8
(byte*) ppuDataPutTile::tile#9
(void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size)
(bool~) ppuDataTransfer::$1
(label) ppuDataTransfer::@1
(label) ppuDataTransfer::@2
(label) ppuDataTransfer::@3
(label) ppuDataTransfer::@4
(label) ppuDataTransfer::@return
(nomodify void*) ppuDataTransfer::cpuData
(nomodify void*) ppuDataTransfer::cpuData#0
(nomodify void*) ppuDataTransfer::cpuData#1
(nomodify void*) ppuDataTransfer::cpuData#2
(nomodify void*) ppuDataTransfer::cpuData#3
(byte*) ppuDataTransfer::cpuSrc
(byte*) ppuDataTransfer::cpuSrc#0
(byte*) ppuDataTransfer::cpuSrc#1
(byte*) ppuDataTransfer::cpuSrc#2
(byte*) ppuDataTransfer::cpuSrc#3
(byte*) ppuDataTransfer::cpuSrc#4
(byte*) ppuDataTransfer::cpuSrc#5
(word) ppuDataTransfer::i
(word) ppuDataTransfer::i#0
(word) ppuDataTransfer::i#1
(word) ppuDataTransfer::i#2
(word) ppuDataTransfer::i#3
(word) ppuDataTransfer::i#4
(word) ppuDataTransfer::i#5
(nomodify void*) ppuDataTransfer::ppuData
(nomodify void*) ppuDataTransfer::ppuData#0
(nomodify void*) ppuDataTransfer::ppuData#1
(label) ppuDataTransfer::ppuDataPrepare1
(byte~) ppuDataTransfer::ppuDataPrepare1_$0
(byte~) ppuDataTransfer::ppuDataPrepare1_$1
(byte*~) ppuDataTransfer::ppuDataPrepare1_$2
(byte*~) ppuDataTransfer::ppuDataPrepare1_$3
(byte*~) ppuDataTransfer::ppuDataPrepare1_$4
(byte*~) ppuDataTransfer::ppuDataPrepare1_$5
(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData
(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0
(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#1
(label) ppuDataTransfer::ppuDataPut1
(byte*~) ppuDataTransfer::ppuDataPut1_$0
(byte*~) ppuDataTransfer::ppuDataPut1_$1
(byte) ppuDataTransfer::ppuDataPut1_val
(byte) ppuDataTransfer::ppuDataPut1_val#0
(byte) ppuDataTransfer::ppuDataPut1_val#1
(word) ppuDataTransfer::size
(word) ppuDataTransfer::size#0
(word) ppuDataTransfer::size#1
(word) ppuDataTransfer::size#2
(word) ppuDataTransfer::size#3
(word) ppuDataTransfer::size#4
(word) ppuDataTransfer::size#5
(word) ppuDataTransfer::size#6
(word) ppuDataTransfer::size#7
(byte()) readJoy1()
(bool~) readJoy1::$0
(byte~) readJoy1::$1
(number~) readJoy1::$2
(number~) readJoy1::$3
(byte*~) readJoy1::$4
(byte*~) readJoy1::$5
(byte*~) readJoy1::$6
(byte*~) readJoy1::$7
(byte*~) readJoy1::$8
(byte*~) readJoy1::$9
(label) readJoy1::@1
(label) readJoy1::@2
(label) readJoy1::@3
(label) readJoy1::@return
(byte) readJoy1::i
(byte) readJoy1::i#0
(byte) readJoy1::i#1
(byte) readJoy1::i#2
(byte) readJoy1::i#3
(byte) readJoy1::joy
(byte) readJoy1::joy#0
(byte) readJoy1::joy#1
(byte) readJoy1::joy#2
(byte) readJoy1::joy#3
(byte) readJoy1::joy#4
(byte) readJoy1::return
(byte) readJoy1::return#0
(byte) readJoy1::return#1
(byte) readJoy1::return#2
(byte) readJoy1::return#3
(byte) readJoy1::return#4
interrupt(HARDWARE_STACK)(void()) vblank()
(byte~) vblank::$0
(byte~) vblank::$1
(bool~) vblank::$2
(number~) vblank::$27
(number~) vblank::$29
(byte~) vblank::$3
(number~) vblank::$31
(number~) vblank::$33
(number~) vblank::$35
(number~) vblank::$37
(number~) vblank::$39
(bool~) vblank::$4
(number~) vblank::$41
(number~) vblank::$43
(number~) vblank::$45
(number~) vblank::$47
(number~) vblank::$49
(byte~) vblank::$5
(number~) vblank::$51
(number~) vblank::$53
(number~) vblank::$55
(number~) vblank::$57
(byte*~) vblank::$58
(byte*~) vblank::$59
(bool~) vblank::$6
(byte*~) vblank::$60
(byte*~) vblank::$61
(bool~) vblank::$62
(bool~) vblank::$63
(bool~) vblank::$64
(bool~) vblank::$65
(byte~) vblank::$7
(bool~) vblank::$8
(label) vblank::@1
(label) vblank::@10
(label) vblank::@2
(label) vblank::@3
(label) vblank::@4
(label) vblank::@5
(label) vblank::@6
(label) vblank::@7
(label) vblank::@8
(label) vblank::@9
(label) vblank::@return
(byte) vblank::joy
(byte) vblank::joy#0
(byte) vblank::joy#1
(byte) vblank::joy#2
(byte) vblank::joy#3
(byte) vblank::joy#4
(byte) vblank::joy#5
(byte) vblank::joy#6
(label) vblank::ppuSpriteBufferDmaTransfer1
(byte~) vblank::ppuSpriteBufferDmaTransfer1_$0
(byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1
(byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2
(byte*~) vblank::ppuSpriteBufferDmaTransfer1_$3
(byte*~) vblank::ppuSpriteBufferDmaTransfer1_$4
(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer
(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0
(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#1
Adding number conversion cast (unumber) 1 in *((byte*~) readJoy1::$4) ← (number) 1
Adding number conversion cast (unumber) 0 in *((byte*~) readJoy1::$5) ← (number) 0
Adding number conversion cast (unumber) 8 in (bool~) readJoy1::$0 ← (byte) readJoy1::i#2 < (number) 8
Adding number conversion cast (unumber) 1 in (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (number) 1
Adding number conversion cast (unumber) 1 in (number~) readJoy1::$2 ← *((byte*~) readJoy1::$6) & (number) 1
Adding number conversion cast (unumber) readJoy1::$2 in (number~) readJoy1::$2 ← *((byte*~) readJoy1::$6) & (unumber)(number) 1
Adding number conversion cast (unumber) readJoy1::$3 in (number~) readJoy1::$3 ← (byte~) readJoy1::$1 | (unumber~) readJoy1::$2
Adding number conversion cast (unumber) 0 in (byte) ppuDataPutTile::ppuDataPut1_val#0 ← *((byte*) ppuDataPutTile::tile#2 + (number) 0)
Adding number conversion cast (unumber) 1 in (byte) ppuDataPutTile::ppuDataPut2_val#0 ← *((byte*) ppuDataPutTile::tile#3 + (number) 1)
Adding number conversion cast (unumber) $20 in (byte*~) ppuDataPutTile::$3 ← (byte*~) ppuDataPutTile::$7 + (number) $20
Adding number conversion cast (unumber) 2 in (byte) ppuDataPutTile::ppuDataPut3_val#0 ← *((byte*) ppuDataPutTile::tile#4 + (number) 2)
Adding number conversion cast (unumber) 3 in (byte) ppuDataPutTile::ppuDataPut4_val#0 ← *((byte*) ppuDataPutTile::tile#5 + (number) 3)
Adding number conversion cast (unumber) 0 in *((byte*~) main::initNES1_disableVideoOutput1_$0) ← (number) 0
Adding number conversion cast (unumber) 0 in *((byte*~) main::initNES1_disableVideoOutput1_$1) ← (number) 0
Adding number conversion cast (unumber) $40 in *((const nomodify byte*) FR_COUNTER) ← (number) $40
Adding number conversion cast (unumber) $40 in *((byte*~) main::initNES1_disableAudioOutput1_$0) ← (number) $40
Adding number conversion cast (unumber) $80 in (number~) main::initNES1_waitForVBlank1_$0 ← *((byte*~) main::initNES1_waitForVBlank1_$2) & (number) $80
Adding number conversion cast (unumber) main::initNES1_waitForVBlank1_$0 in (number~) main::initNES1_waitForVBlank1_$0 ← *((byte*~) main::initNES1_waitForVBlank1_$2) & (unumber)(number) $80
Adding number conversion cast (unumber) 0 in (bool~) main::initNES1_waitForVBlank1_$4 ← (number) 0 != (unumber~) main::initNES1_waitForVBlank1_$0
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) 0 + (byte) main::initNES1_i#2) ← (number) 0
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) 0 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) $100 + (byte) main::initNES1_i#2) ← (number) 0
Adding number conversion cast (unumber) $100 in *((const nomodify byte*) MEMORY+(number) $100 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) $200 + (byte) main::initNES1_i#2) ← (number) 0
Adding number conversion cast (unumber) $200 in *((const nomodify byte*) MEMORY+(number) $200 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) $300 + (byte) main::initNES1_i#2) ← (number) 0
Adding number conversion cast (unumber) $300 in *((const nomodify byte*) MEMORY+(number) $300 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) $400 + (byte) main::initNES1_i#2) ← (number) 0
Adding number conversion cast (unumber) $400 in *((const nomodify byte*) MEMORY+(number) $400 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) $500 + (byte) main::initNES1_i#2) ← (number) 0
Adding number conversion cast (unumber) $500 in *((const nomodify byte*) MEMORY+(number) $500 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) $600 + (byte) main::initNES1_i#2) ← (number) 0
Adding number conversion cast (unumber) $600 in *((const nomodify byte*) MEMORY+(number) $600 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) $700 + (byte) main::initNES1_i#2) ← (number) 0
Adding number conversion cast (unumber) $700 in *((const nomodify byte*) MEMORY+(number) $700 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0
Adding number conversion cast (unumber) 0 in (bool~) main::initNES1_$5 ← (number) 0 != (byte) main::initNES1_i#1
Adding number conversion cast (unumber) $80 in (number~) main::initNES1_waitForVBlank2_$0 ← *((byte*~) main::initNES1_waitForVBlank2_$2) & (number) $80
Adding number conversion cast (unumber) main::initNES1_waitForVBlank2_$0 in (number~) main::initNES1_waitForVBlank2_$0 ← *((byte*~) main::initNES1_waitForVBlank2_$2) & (unumber)(number) $80
Adding number conversion cast (unumber) 0 in (bool~) main::initNES1_waitForVBlank2_$4 ← (number) 0 != (unumber~) main::initNES1_waitForVBlank2_$0
Adding number conversion cast (unumber) $fc in (byte) ppuDataFill::val#0 ← (number) $fc
Adding number conversion cast (unumber) $3c0 in (word) ppuDataFill::size#0 ← (number) $3c0
Adding number conversion cast (unumber) 0 in (byte) ppuDataFill::val#1 ← (number) 0
Adding number conversion cast (unumber) $40 in (word) ppuDataFill::size#1 ← (number) $40
Adding number conversion cast (unumber) $20 in (bool~) main::$9 ← (byte) main::x#2 < (number) $20
Adding number conversion cast (unumber) $14*$20 in (byte*~) main::$10 ← (const nomodify byte*) PPU_NAME_TABLE_0+(number) $14*(number) $20 + (byte) main::x#3
Adding number conversion cast (unumber) 2 in (byte) main::x#1 ← (byte) main::x#4 + (number) 2
Adding number conversion cast (unumber) $1c in (nomodify void*) ppuDataPutTile::ppuData#1 ← (void*)(const nomodify byte*) PPU_NAME_TABLE_0+(number) $12*(number) $20+(number) $1c
Adding number conversion cast (unumber) $12*$20 in (nomodify void*) ppuDataPutTile::ppuData#1 ← (void*)(const nomodify byte*) PPU_NAME_TABLE_0+(number) $12*(number) $20+(unumber)(number) $1c
Adding number conversion cast (unumber) $80 in *((byte*~) main::enableVideoOutput1_$0) ← (number) $80
Adding number conversion cast (unumber) $1e in *((byte*~) main::enableVideoOutput1_$1) ← (number) $1e
Adding number conversion cast (unumber) 0 in (bool~) vblank::$62 ← (number) 0 != (byte~) vblank::$1
Adding number conversion cast (unumber) 0 in (bool~) vblank::$63 ← (number) 0 != (byte~) vblank::$3
Adding number conversion cast (unumber) 0 in (number~) vblank::$27 ← (number) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$27 in (number~) vblank::$27 ← (unumber)(number) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) 1 in (number~) vblank::$29 ← (number) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$29 in (number~) vblank::$29 ← (unumber)(number) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) 2 in (number~) vblank::$31 ← (number) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$31 in (number~) vblank::$31 ← (unumber)(number) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) 3 in (number~) vblank::$33 ← (number) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$33 in (number~) vblank::$33 ← (unumber)(number) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) 0 in (bool~) vblank::$64 ← (number) 0 != (byte~) vblank::$5
Adding number conversion cast (unumber) 0 in (number~) vblank::$35 ← (number) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$35 in (number~) vblank::$35 ← (unumber)(number) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) 1 in (number~) vblank::$37 ← (number) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$37 in (number~) vblank::$37 ← (unumber)(number) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) 2 in (number~) vblank::$39 ← (number) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$39 in (number~) vblank::$39 ← (unumber)(number) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) 3 in (number~) vblank::$41 ← (number) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$41 in (number~) vblank::$41 ← (unumber)(number) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) 0 in (bool~) vblank::$65 ← (number) 0 != (byte~) vblank::$7
Adding number conversion cast (unumber) 0 in (number~) vblank::$43 ← (number) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$43 in (number~) vblank::$43 ← (unumber)(number) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) 1 in (number~) vblank::$45 ← (number) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$45 in (number~) vblank::$45 ← (unumber)(number) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) 2 in (number~) vblank::$47 ← (number) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$47 in (number~) vblank::$47 ← (unumber)(number) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) 3 in (number~) vblank::$49 ← (number) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$49 in (number~) vblank::$49 ← (unumber)(number) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) 0 in *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1) ← (number) 0
Adding number conversion cast (unumber) 0 in *((byte*~) vblank::$58) ← (number) 0
Adding number conversion cast (unumber) -8 in *((byte*~) vblank::$59) ← (number) -8
Adding number conversion cast (unumber) 0 in (number~) vblank::$51 ← (number) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$51 in (number~) vblank::$51 ← (unumber)(number) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) 1 in (number~) vblank::$53 ← (number) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$53 in (number~) vblank::$53 ← (unumber)(number) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) 2 in (number~) vblank::$55 ← (number) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$55 in (number~) vblank::$55 ← (unumber)(number) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) 3 in (number~) vblank::$57 ← (number) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Adding number conversion cast (unumber) vblank::$57 in (number~) vblank::$57 ← (unumber)(number) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Successful SSA optimization PassNAddNumberTypeConversions
Inlining cast *((byte*~) readJoy1::$4) ← (unumber)(number) 1
Inlining cast *((byte*~) readJoy1::$5) ← (unumber)(number) 0
Inlining cast (byte*) memcpy::src#0 ← (byte*)(void*) memcpy::source#1
Inlining cast (byte*) memcpy::dst#0 ← (byte*)(void*) memcpy::destination#1
Inlining cast *((byte*~) main::initNES1_disableVideoOutput1_$0) ← (unumber)(number) 0
Inlining cast *((byte*~) main::initNES1_disableVideoOutput1_$1) ← (unumber)(number) 0
Inlining cast *((const nomodify byte*) FR_COUNTER) ← (unumber)(number) $40
Inlining cast *((byte*~) main::initNES1_disableAudioOutput1_$0) ← (unumber)(number) $40
Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) 0 + (byte) main::initNES1_i#2) ← (unumber)(number) 0
Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) $100 + (byte) main::initNES1_i#2) ← (unumber)(number) 0
Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) $200 + (byte) main::initNES1_i#2) ← (unumber)(number) 0
Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) $300 + (byte) main::initNES1_i#2) ← (unumber)(number) 0
Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) $400 + (byte) main::initNES1_i#2) ← (unumber)(number) 0
Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) $500 + (byte) main::initNES1_i#2) ← (unumber)(number) 0
Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) $600 + (byte) main::initNES1_i#2) ← (unumber)(number) 0
Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) $700 + (byte) main::initNES1_i#2) ← (unumber)(number) 0
Inlining cast (byte) ppuDataFill::val#0 ← (unumber)(number) $fc
Inlining cast (word) ppuDataFill::size#0 ← (unumber)(number) $3c0
Inlining cast (byte) ppuDataFill::val#1 ← (unumber)(number) 0
Inlining cast (word) ppuDataFill::size#1 ← (unumber)(number) $40
Inlining cast *((byte*~) main::enableVideoOutput1_$0) ← (unumber)(number) $80
Inlining cast *((byte*~) main::enableVideoOutput1_$1) ← (unumber)(number) $1e
Inlining cast *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1) ← (unumber)(number) 0
Inlining cast *((byte*~) vblank::$58) ← (unumber)(number) 0
Inlining cast *((byte*~) vblank::$59) ← (unumber)(number) -8
Successful SSA optimization Pass2InlineCast
Simplifying constant pointer cast (byte*) 8192
Simplifying constant pointer cast (byte*) 9152
Simplifying constant pointer cast (byte*) 16128
Simplifying constant pointer cast (byte*) 8194
Simplifying constant pointer cast (byte*) 16407
Simplifying constant pointer cast (byte*) 0
Simplifying constant pointer cast (void()*) 0
Simplifying constant pointer cast (struct RICOH_2C02*) 8192
Simplifying constant pointer cast (struct RICOH_2A03*) 16384
Simplifying constant integer cast 1
Simplifying constant integer cast 0
Simplifying constant integer cast 8
Simplifying constant integer cast 1
Simplifying constant integer cast 1
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast $20
Simplifying constant integer cast 2
Simplifying constant integer cast 3
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast $40
Simplifying constant integer cast $40
Simplifying constant integer cast $80
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast $100
Simplifying constant integer cast 0
Simplifying constant integer cast $200
Simplifying constant integer cast 0
Simplifying constant integer cast $300
Simplifying constant integer cast 0
Simplifying constant integer cast $400
Simplifying constant integer cast 0
Simplifying constant integer cast $500
Simplifying constant integer cast 0
Simplifying constant integer cast $600
Simplifying constant integer cast 0
Simplifying constant integer cast $700
Simplifying constant integer cast 0
Simplifying constant integer cast $80
Simplifying constant integer cast 0
Simplifying constant integer cast $fc
Simplifying constant integer cast $3c0
Simplifying constant integer cast 0
Simplifying constant integer cast $40
Simplifying constant integer cast $20
Simplifying constant integer cast 2
Simplifying constant integer cast $1c
Simplifying constant integer cast $80
Simplifying constant integer cast $1e
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast 2
Simplifying constant integer cast 3
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast 2
Simplifying constant integer cast 3
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast 2
Simplifying constant integer cast 3
Simplifying constant integer cast 0
Simplifying constant integer cast 0
Simplifying constant integer cast -8
Simplifying constant integer cast 0
Simplifying constant integer cast 1
Simplifying constant integer cast 2
Simplifying constant integer cast 3
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 8
Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) $20
Finalized unsigned number type (byte) 2
Finalized unsigned number type (byte) 3
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) $40
Finalized unsigned number type (byte) $40
Finalized unsigned number type (byte) $80
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 (word) $100
Finalized unsigned number type (byte) 0
Finalized unsigned number type (word) $200
Finalized unsigned number type (byte) 0
Finalized unsigned number type (word) $300
Finalized unsigned number type (byte) 0
Finalized unsigned number type (word) $400
Finalized unsigned number type (byte) 0
Finalized unsigned number type (word) $500
Finalized unsigned number type (byte) 0
Finalized unsigned number type (word) $600
Finalized unsigned number type (byte) 0
Finalized unsigned number type (word) $700
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) $80
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) $fc
Finalized unsigned number type (word) $3c0
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) $40
Finalized unsigned number type (byte) $20
Finalized unsigned number type (byte) 2
Finalized unsigned number type (byte) $1c
Finalized unsigned number type (byte) $80
Finalized unsigned number type (byte) $1e
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) 2
Finalized unsigned number type (byte) 3
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) 2
Finalized unsigned number type (byte) 3
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) 2
Finalized unsigned number type (byte) 3
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) -8
Finalized unsigned number type (byte) 0
Finalized unsigned number type (byte) 1
Finalized unsigned number type (byte) 2
Finalized unsigned number type (byte) 3
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inferred type updated to byte in (unumber~) readJoy1::$2 ← *((byte*~) readJoy1::$6) & (byte) 1
Inferred type updated to byte in (unumber~) readJoy1::$3 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2
Inferred type updated to byte in (unumber~) main::initNES1_waitForVBlank1_$0 ← *((byte*~) main::initNES1_waitForVBlank1_$2) & (byte) $80
Inferred type updated to byte in (unumber~) main::initNES1_waitForVBlank2_$0 ← *((byte*~) main::initNES1_waitForVBlank2_$2) & (byte) $80
Inferred type updated to byte in (unumber~) vblank::$27 ← (byte) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inferred type updated to byte in (unumber~) vblank::$29 ← (byte) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inferred type updated to byte in (unumber~) vblank::$31 ← (byte) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inferred type updated to byte in (unumber~) vblank::$33 ← (byte) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inferred type updated to byte in (unumber~) vblank::$35 ← (byte) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inferred type updated to byte in (unumber~) vblank::$37 ← (byte) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inferred type updated to byte in (unumber~) vblank::$39 ← (byte) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inferred type updated to byte in (unumber~) vblank::$41 ← (byte) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inferred type updated to byte in (unumber~) vblank::$43 ← (byte) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inferred type updated to byte in (unumber~) vblank::$45 ← (byte) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inferred type updated to byte in (unumber~) vblank::$47 ← (byte) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inferred type updated to byte in (unumber~) vblank::$49 ← (byte) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inferred type updated to byte in (unumber~) vblank::$51 ← (byte) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inferred type updated to byte in (unumber~) vblank::$53 ← (byte) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inferred type updated to byte in (unumber~) vblank::$55 ← (byte) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inferred type updated to byte in (unumber~) vblank::$57 ← (byte) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Inversing boolean not [159] (bool~) main::initNES1_waitForVBlank1_$1 ← (byte) 0 == (byte~) main::initNES1_waitForVBlank1_$0 from [158] (bool~) main::initNES1_waitForVBlank1_$4 ← (byte) 0 != (byte~) main::initNES1_waitForVBlank1_$0
Inversing boolean not [178] (bool~) main::initNES1_waitForVBlank2_$1 ← (byte) 0 == (byte~) main::initNES1_waitForVBlank2_$0 from [177] (bool~) main::initNES1_waitForVBlank2_$4 ← (byte) 0 != (byte~) main::initNES1_waitForVBlank2_$0
Inversing boolean not [230] (bool~) vblank::$2 ← (byte) 0 == (byte~) vblank::$1 from [229] (bool~) vblank::$62 ← (byte) 0 != (byte~) vblank::$1
Inversing boolean not [235] (bool~) vblank::$4 ← (byte) 0 == (byte~) vblank::$3 from [234] (bool~) vblank::$63 ← (byte) 0 != (byte~) vblank::$3
Inversing boolean not [249] (bool~) vblank::$6 ← (byte) 0 == (byte~) vblank::$5 from [248] (bool~) vblank::$64 ← (byte) 0 != (byte~) vblank::$5
Inversing boolean not [263] (bool~) vblank::$8 ← (byte) 0 == (byte~) vblank::$7 from [262] (bool~) vblank::$65 ← (byte) 0 != (byte~) vblank::$7
Successful SSA optimization Pass2UnaryNotSimplification
Alias readJoy1::joy#2 = readJoy1::joy#4 readJoy1::joy#3 readJoy1::return#0 readJoy1::return#3 readJoy1::return#1
Alias readJoy1::i#2 = readJoy1::i#3
Alias readJoy1::joy#1 = readJoy1::$3
Alias ppuDataFill::ppuDataPrepare1_ppuData#0 = ppuDataFill::ppuData#2 ppuDataFill::ppuDataPrepare1_ppuData#1
Alias ppuDataFill::size#3 = ppuDataFill::size#5 ppuDataFill::size#7
Alias ppuDataFill::val#4 = ppuDataFill::val#6 ppuDataFill::val#8
Alias ppuDataFill::val#2 = ppuDataFill::val#3 ppuDataFill::ppuDataPut1_val#0 ppuDataFill::ppuDataPut1_val#1 ppuDataFill::val#7 ppuDataFill::val#5
Alias ppuDataFill::i#2 = ppuDataFill::i#5 ppuDataFill::i#4 ppuDataFill::i#3
Alias ppuDataFill::size#2 = ppuDataFill::size#8 ppuDataFill::size#6 ppuDataFill::size#4
Alias ppuDataTransfer::ppuDataPrepare1_ppuData#0 = ppuDataTransfer::ppuData#1 ppuDataTransfer::ppuDataPrepare1_ppuData#1
Alias ppuDataTransfer::cpuData#1 = ppuDataTransfer::cpuData#2 ppuDataTransfer::cpuData#3
Alias ppuDataTransfer::size#2 = ppuDataTransfer::size#4 ppuDataTransfer::size#6
Alias ppuDataTransfer::cpuSrc#2 = ppuDataTransfer::cpuSrc#4 ppuDataTransfer::cpuSrc#5 ppuDataTransfer::cpuSrc#3
Alias ppuDataTransfer::i#2 = ppuDataTransfer::i#5 ppuDataTransfer::i#4 ppuDataTransfer::i#3
Alias ppuDataTransfer::size#1 = ppuDataTransfer::size#7 ppuDataTransfer::size#5 ppuDataTransfer::size#3
Alias ppuDataTransfer::ppuDataPut1_val#0 = ppuDataTransfer::ppuDataPut1_val#1
Alias ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuDataPrepare1_ppuData#0 ppuDataPutTile::ppuDataPrepare1_ppuData#1 ppuDataPutTile::ppuData#8 ppuDataPutTile::ppuData#7 ppuDataPutTile::ppuData#6 ppuDataPutTile::ppuData#5 ppuDataPutTile::ppuData#4 ppuDataPutTile::ppuData#3
Alias ppuDataPutTile::tile#10 = ppuDataPutTile::tile#6 ppuDataPutTile::tile#2 ppuDataPutTile::tile#7 ppuDataPutTile::tile#3 ppuDataPutTile::tile#12 ppuDataPutTile::tile#11 ppuDataPutTile::tile#8 ppuDataPutTile::tile#4 ppuDataPutTile::tile#9 ppuDataPutTile::tile#5
Alias ppuDataPutTile::ppuDataPut1_val#0 = ppuDataPutTile::ppuDataPut1_val#1
Alias ppuDataPutTile::ppuDataPut2_val#0 = ppuDataPutTile::ppuDataPut2_val#1
Alias ppuDataPutTile::ppuDataPrepare2_ppuData#0 = ppuDataPutTile::ppuDataPrepare2_ppuData#1
Alias ppuDataPutTile::ppuDataPut3_val#0 = ppuDataPutTile::ppuDataPut3_val#1
Alias ppuDataPutTile::ppuDataPut4_val#0 = ppuDataPutTile::ppuDataPut4_val#1
Alias memcpy::src_end#0 = memcpy::$0
Alias memcpy::src#2 = memcpy::src#3
Alias memcpy::dst#2 = memcpy::dst#3
Alias memcpy::src_end#1 = memcpy::src_end#2
Alias memcpy::destination#2 = memcpy::destination#4 memcpy::destination#3 memcpy::return#0 memcpy::return#3 memcpy::return#1
Alias ppuDataTransfer::size#0 = main::$1
Alias main::x#2 = main::x#3 main::x#4
Alias memcpy::num#0 = main::$6
Alias readJoy1::return#2 = readJoy1::return#4
Alias vblank::joy#0 = vblank::$0 vblank::joy#4
Alias vblank::joy#1 = vblank::joy#5
Alias vblank::joy#2 = vblank::joy#6
Alias vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 = vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#1
Successful SSA optimization Pass2AliasElimination
Alias vblank::joy#0 = vblank::joy#1 vblank::joy#2 vblank::joy#3
Successful SSA optimization Pass2AliasElimination
Identical Phi Values (word) ppuDataFill::size#2 (word) ppuDataFill::size#3
Identical Phi Values (byte) ppuDataFill::val#2 (byte) ppuDataFill::val#4
Identical Phi Values (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 (nomodify void*) ppuDataTransfer::ppuData#0
Identical Phi Values (nomodify void*) ppuDataTransfer::cpuData#1 (nomodify void*) ppuDataTransfer::cpuData#0
Identical Phi Values (word) ppuDataTransfer::size#2 (word) ppuDataTransfer::size#0
Identical Phi Values (word) ppuDataTransfer::size#1 (word) ppuDataTransfer::size#2
Identical Phi Values (void*) memcpy::source#1 (void*) memcpy::source#0
Identical Phi Values (void*) memcpy::destination#1 (void*) memcpy::destination#0
Identical Phi Values (word) memcpy::num#1 (word) memcpy::num#0
Identical Phi Values (byte*) memcpy::src_end#1 (byte*) memcpy::src_end#0
Identical Phi Values (void*) memcpy::destination#2 (void*) memcpy::destination#1
Successful SSA optimization Pass2IdenticalPhiElimination
Simple Condition (bool~) readJoy1::$0 [10] if((byte) readJoy1::i#2<(byte) 8) goto readJoy1::@2
Simple Condition (bool~) ppuDataFill::$1 [30] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::@2
Simple Condition (bool~) ppuDataTransfer::$1 [49] if((word) ppuDataTransfer::i#2<(word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2
Simple Condition (bool~) memcpy::$1 [101] if((byte*) memcpy::src#2!=(byte*) memcpy::src_end#0) goto memcpy::@2
Simple Condition (bool~) main::initNES1_waitForVBlank1_$1 [122] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1
Simple Condition (bool~) main::initNES1_$5 [135] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1
Simple Condition (bool~) main::initNES1_waitForVBlank2_$1 [140] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1
Simple Condition (bool~) main::$9 [157] if((byte) main::x#2<(byte) $20) goto main::@2
Simple Condition (bool~) main::$12 [178] if((number) 0!=(number) 1) goto main::@4
Simple Condition (bool~) vblank::$2 [185] if((byte) 0==(byte~) vblank::$1) goto vblank::@1
Simple Condition (bool~) vblank::$4 [188] if((byte) 0==(byte~) vblank::$3) goto vblank::@2
Simple Condition (bool~) vblank::$6 [199] if((byte) 0==(byte~) vblank::$5) goto vblank::@3
Simple Condition (bool~) vblank::$8 [210] if((byte) 0==(byte~) vblank::$7) goto vblank::@4
Successful SSA optimization Pass2ConditionalJumpSimplification
Constant right-side identified [0] (byte*~) readJoy1::$7 ← (byte*)(const struct RICOH_2A03*) APU
Constant right-side identified [3] (byte*~) readJoy1::$8 ← (byte*)(const struct RICOH_2A03*) APU
Constant right-side identified [12] (byte*~) readJoy1::$9 ← (byte*)(const struct RICOH_2A03*) APU
Constant right-side identified [20] (byte*~) ppuDataFill::ppuDataPrepare1_$4 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [24] (byte*~) ppuDataFill::ppuDataPrepare1_$5 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [31] (byte*~) ppuDataFill::ppuDataPut1_$1 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [38] (byte*~) ppuDataTransfer::ppuDataPrepare1_$4 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [42] (byte*~) ppuDataTransfer::ppuDataPrepare1_$5 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [51] (byte*~) ppuDataTransfer::ppuDataPut1_$1 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [59] (byte*~) ppuDataPutTile::ppuDataPrepare1_$4 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [63] (byte*~) ppuDataPutTile::ppuDataPrepare1_$5 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [67] (byte*~) ppuDataPutTile::ppuDataPut1_$1 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [71] (byte*~) ppuDataPutTile::ppuDataPut2_$1 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [78] (byte*~) ppuDataPutTile::ppuDataPrepare2_$4 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [82] (byte*~) ppuDataPutTile::ppuDataPrepare2_$5 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [86] (byte*~) ppuDataPutTile::ppuDataPut3_$1 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [90] (byte*~) ppuDataPutTile::ppuDataPut4_$1 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [107] (byte*~) main::initNES1_disableVideoOutput1_$2 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [110] (byte*~) main::initNES1_disableVideoOutput1_$3 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [114] (byte*~) main::initNES1_disableAudioOutput1_$1 ← (byte*)(const struct RICOH_2A03*) APU
Constant right-side identified [118] (byte*~) main::initNES1_waitForVBlank1_$3 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [136] (byte*~) main::initNES1_waitForVBlank2_$3 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [142] (word) ppuDataTransfer::size#0 ← sizeof (const byte*) PALETTE
Constant right-side identified [166] (word) memcpy::num#0 ← sizeof (const struct SpriteData*) SPRITES
Constant right-side identified [171] (byte*~) main::enableVideoOutput1_$2 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [174] (byte*~) main::enableVideoOutput1_$3 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [189] (byte~) vblank::$27 ← (byte) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Constant right-side identified [191] (byte~) vblank::$29 ← (byte) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Constant right-side identified [193] (byte~) vblank::$31 ← (byte) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Constant right-side identified [195] (byte~) vblank::$33 ← (byte) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Constant right-side identified [200] (byte~) vblank::$35 ← (byte) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Constant right-side identified [202] (byte~) vblank::$37 ← (byte) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Constant right-side identified [204] (byte~) vblank::$39 ← (byte) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Constant right-side identified [206] (byte~) vblank::$41 ← (byte) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Constant right-side identified [211] (byte~) vblank::$43 ← (byte) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Constant right-side identified [213] (byte~) vblank::$45 ← (byte) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Constant right-side identified [215] (byte~) vblank::$47 ← (byte) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Constant right-side identified [217] (byte~) vblank::$49 ← (byte) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Constant right-side identified [220] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$3 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [224] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$4 ← (byte*)(const struct RICOH_2A03*) APU
Constant right-side identified [227] (byte*~) vblank::$60 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [230] (byte*~) vblank::$61 ← (byte*)(const struct RICOH_2C02*) PPU
Constant right-side identified [233] (byte~) vblank::$51 ← (byte) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Constant right-side identified [235] (byte~) vblank::$53 ← (byte) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Constant right-side identified [237] (byte~) vblank::$55 ← (byte) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Constant right-side identified [239] (byte~) vblank::$57 ← (byte) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant (const byte*) readJoy1::$7 = (byte*)APU
Constant (const byte*) readJoy1::$8 = (byte*)APU
Constant (const byte) readJoy1::joy#0 = 0
Constant (const byte) readJoy1::i#0 = 0
Constant (const byte*) readJoy1::$9 = (byte*)APU
Constant (const byte*) ppuDataFill::ppuDataPrepare1_$4 = (byte*)PPU
Constant (const byte*) ppuDataFill::ppuDataPrepare1_$5 = (byte*)PPU
Constant (const word) ppuDataFill::i#0 = 0
Constant (const byte*) ppuDataFill::ppuDataPut1_$1 = (byte*)PPU
Constant (const byte*) ppuDataTransfer::ppuDataPrepare1_$4 = (byte*)PPU
Constant (const byte*) ppuDataTransfer::ppuDataPrepare1_$5 = (byte*)PPU
Constant (const word) ppuDataTransfer::i#0 = 0
Constant (const byte*) ppuDataTransfer::ppuDataPut1_$1 = (byte*)PPU
Constant (const byte*) ppuDataPutTile::ppuDataPrepare1_$4 = (byte*)PPU
Constant (const byte*) ppuDataPutTile::ppuDataPrepare1_$5 = (byte*)PPU
Constant (const byte*) ppuDataPutTile::ppuDataPut1_$1 = (byte*)PPU
Constant (const byte*) ppuDataPutTile::ppuDataPut2_$1 = (byte*)PPU
Constant (const byte*) ppuDataPutTile::ppuDataPrepare2_$4 = (byte*)PPU
Constant (const byte*) ppuDataPutTile::ppuDataPrepare2_$5 = (byte*)PPU
Constant (const byte*) ppuDataPutTile::ppuDataPut3_$1 = (byte*)PPU
Constant (const byte*) ppuDataPutTile::ppuDataPut4_$1 = (byte*)PPU
Constant (const byte*) main::initNES1_disableVideoOutput1_$2 = (byte*)PPU
Constant (const byte*) main::initNES1_disableVideoOutput1_$3 = (byte*)PPU
Constant (const byte*) main::initNES1_disableAudioOutput1_$1 = (byte*)APU
Constant (const byte*) main::initNES1_waitForVBlank1_$3 = (byte*)PPU
Constant (const byte) main::initNES1_i#0 = 0
Constant (const byte*) main::initNES1_waitForVBlank2_$3 = (byte*)PPU
Constant (const word) ppuDataTransfer::size#0 = sizeof PALETTE
Constant (const nomodify void*) ppuDataTransfer::ppuData#0 = (void*)PPU_PALETTE
Constant (const nomodify void*) ppuDataTransfer::cpuData#0 = (void*)PALETTE
Constant (const nomodify void*) ppuDataFill::ppuData#0 = (void*)PPU_NAME_TABLE_0
Constant (const byte) ppuDataFill::val#0 = $fc
Constant (const word) ppuDataFill::size#0 = $3c0
Constant (const nomodify void*) ppuDataFill::ppuData#1 = (void*)PPU_ATTRIBUTE_TABLE_0
Constant (const byte) ppuDataFill::val#1 = 0
Constant (const word) ppuDataFill::size#1 = $40
Constant (const byte) main::x#0 = 0
Constant (const byte*) ppuDataPutTile::tile#0 = FLOOR
Constant (const nomodify void*) ppuDataPutTile::ppuData#1 = (void*)PPU_NAME_TABLE_0+(word)$12*$20+$1c
Constant (const byte*) ppuDataPutTile::tile#1 = FLAG
Constant (const word) memcpy::num#0 = sizeof SPRITES
Constant (const void*) memcpy::destination#0 = (void*)SPRITE_BUFFER
Constant (const void*) memcpy::source#0 = (void*)SPRITES
Constant (const byte*) main::enableVideoOutput1_$2 = (byte*)PPU
Constant (const byte*) main::enableVideoOutput1_$3 = (byte*)PPU
Constant (const byte) vblank::$27 = 0*SIZEOF_STRUCT_SPRITEDATA
Constant (const byte) vblank::$29 = 1*SIZEOF_STRUCT_SPRITEDATA
Constant (const byte) vblank::$31 = 2*SIZEOF_STRUCT_SPRITEDATA
Constant (const byte) vblank::$33 = 3*SIZEOF_STRUCT_SPRITEDATA
Constant (const byte) vblank::$35 = 0*SIZEOF_STRUCT_SPRITEDATA
Constant (const byte) vblank::$37 = 1*SIZEOF_STRUCT_SPRITEDATA
Constant (const byte) vblank::$39 = 2*SIZEOF_STRUCT_SPRITEDATA
Constant (const byte) vblank::$41 = 3*SIZEOF_STRUCT_SPRITEDATA
Constant (const byte) vblank::$43 = 0*SIZEOF_STRUCT_SPRITEDATA
Constant (const byte) vblank::$45 = 1*SIZEOF_STRUCT_SPRITEDATA
Constant (const byte) vblank::$47 = 2*SIZEOF_STRUCT_SPRITEDATA
Constant (const byte) vblank::$49 = 3*SIZEOF_STRUCT_SPRITEDATA
Constant (const struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 = SPRITE_BUFFER
Constant (const byte*) vblank::ppuSpriteBufferDmaTransfer1_$3 = (byte*)PPU
Constant (const byte*) vblank::ppuSpriteBufferDmaTransfer1_$4 = (byte*)APU
Constant (const byte*) vblank::$60 = (byte*)PPU
Constant (const byte*) vblank::$61 = (byte*)PPU
Constant (const byte) vblank::$51 = 0*SIZEOF_STRUCT_SPRITEDATA
Constant (const byte) vblank::$53 = 1*SIZEOF_STRUCT_SPRITEDATA
Constant (const byte) vblank::$55 = 2*SIZEOF_STRUCT_SPRITEDATA
Constant (const byte) vblank::$57 = 3*SIZEOF_STRUCT_SPRITEDATA
Successful SSA optimization Pass2ConstantIdentification
Constant (const byte*) ppuDataTransfer::cpuSrc#0 = (byte*)ppuDataTransfer::cpuData#0
Constant (const byte*) memcpy::src#0 = (byte*)memcpy::source#0
Constant (const byte*) memcpy::dst#0 = (byte*)memcpy::destination#0
Constant (const byte*) memcpy::$2 = (byte*)memcpy::source#0
Constant (const void*) memcpy::return#2 = memcpy::destination#0
Successful SSA optimization Pass2ConstantIdentification
if() condition always true - replacing block destination [178] if((number) 0!=(number) 1) goto main::@4
Successful SSA optimization Pass2ConstantIfs
Converting *(pointer+n) to pointer[n] [2] *((byte*~) readJoy1::$4) ← (byte) 1 -- *(readJoy1::$7 + OFFSET_STRUCT_RICOH_2A03_JOY1)
Converting *(pointer+n) to pointer[n] [5] *((byte*~) readJoy1::$5) ← (byte) 0 -- *(readJoy1::$8 + OFFSET_STRUCT_RICOH_2A03_JOY1)
Converting *(pointer+n) to pointer[n] [14] (byte~) readJoy1::$2 ← *((byte*~) readJoy1::$6) & (byte) 1 -- *(readJoy1::$9 + OFFSET_STRUCT_RICOH_2A03_JOY1)
Converting *(pointer+n) to pointer[n] [22] *((byte*~) ppuDataFill::ppuDataPrepare1_$2) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 -- *(ppuDataFill::ppuDataPrepare1_$4 + OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Converting *(pointer+n) to pointer[n] [26] *((byte*~) ppuDataFill::ppuDataPrepare1_$3) ← (byte~) ppuDataFill::ppuDataPrepare1_$1 -- *(ppuDataFill::ppuDataPrepare1_$5 + OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Converting *(pointer+n) to pointer[n] [33] *((byte*~) ppuDataFill::ppuDataPut1_$0) ← (byte) ppuDataFill::val#4 -- *(ppuDataFill::ppuDataPut1_$1 + OFFSET_STRUCT_RICOH_2C02_PPUDATA)
Converting *(pointer+n) to pointer[n] [40] *((byte*~) ppuDataTransfer::ppuDataPrepare1_$2) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$0 -- *(ppuDataTransfer::ppuDataPrepare1_$4 + OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Converting *(pointer+n) to pointer[n] [44] *((byte*~) ppuDataTransfer::ppuDataPrepare1_$3) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$1 -- *(ppuDataTransfer::ppuDataPrepare1_$5 + OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Converting *(pointer+n) to pointer[n] [53] *((byte*~) ppuDataTransfer::ppuDataPut1_$0) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 -- *(ppuDataTransfer::ppuDataPut1_$1 + OFFSET_STRUCT_RICOH_2C02_PPUDATA)
Converting *(pointer+n) to pointer[n] [61] *((byte*~) ppuDataPutTile::ppuDataPrepare1_$2) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$0 -- *(ppuDataPutTile::ppuDataPrepare1_$4 + OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Converting *(pointer+n) to pointer[n] [65] *((byte*~) ppuDataPutTile::ppuDataPrepare1_$3) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$1 -- *(ppuDataPutTile::ppuDataPrepare1_$5 + OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Converting *(pointer+n) to pointer[n] [69] *((byte*~) ppuDataPutTile::ppuDataPut1_$0) ← (byte) ppuDataPutTile::ppuDataPut1_val#0 -- *(ppuDataPutTile::ppuDataPut1_$1 + OFFSET_STRUCT_RICOH_2C02_PPUDATA)
Converting *(pointer+n) to pointer[n] [73] *((byte*~) ppuDataPutTile::ppuDataPut2_$0) ← (byte) ppuDataPutTile::ppuDataPut2_val#0 -- *(ppuDataPutTile::ppuDataPut2_$1 + OFFSET_STRUCT_RICOH_2C02_PPUDATA)
Converting *(pointer+n) to pointer[n] [80] *((byte*~) ppuDataPutTile::ppuDataPrepare2_$2) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$0 -- *(ppuDataPutTile::ppuDataPrepare2_$4 + OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Converting *(pointer+n) to pointer[n] [84] *((byte*~) ppuDataPutTile::ppuDataPrepare2_$3) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$1 -- *(ppuDataPutTile::ppuDataPrepare2_$5 + OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Converting *(pointer+n) to pointer[n] [88] *((byte*~) ppuDataPutTile::ppuDataPut3_$0) ← (byte) ppuDataPutTile::ppuDataPut3_val#0 -- *(ppuDataPutTile::ppuDataPut3_$1 + OFFSET_STRUCT_RICOH_2C02_PPUDATA)
Converting *(pointer+n) to pointer[n] [92] *((byte*~) ppuDataPutTile::ppuDataPut4_$0) ← (byte) ppuDataPutTile::ppuDataPut4_val#0 -- *(ppuDataPutTile::ppuDataPut4_$1 + OFFSET_STRUCT_RICOH_2C02_PPUDATA)
Converting *(pointer+n) to pointer[n] [109] *((byte*~) main::initNES1_disableVideoOutput1_$0) ← (byte) 0 -- *(main::initNES1_disableVideoOutput1_$2 + OFFSET_STRUCT_RICOH_2C02_PPUCTRL)
Converting *(pointer+n) to pointer[n] [112] *((byte*~) main::initNES1_disableVideoOutput1_$1) ← (byte) 0 -- *(main::initNES1_disableVideoOutput1_$3 + OFFSET_STRUCT_RICOH_2C02_PPUMASK)
Converting *(pointer+n) to pointer[n] [116] *((byte*~) main::initNES1_disableAudioOutput1_$0) ← (byte) $40 -- *(main::initNES1_disableAudioOutput1_$1 + OFFSET_STRUCT_RICOH_2A03_DMC_FREQ)
Converting *(pointer+n) to pointer[n] [120] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*~) main::initNES1_waitForVBlank1_$2) & (byte) $80 -- *(main::initNES1_waitForVBlank1_$3 + OFFSET_STRUCT_RICOH_2C02_PPUSTATUS)
Converting *(pointer+n) to pointer[n] [138] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*~) main::initNES1_waitForVBlank2_$2) & (byte) $80 -- *(main::initNES1_waitForVBlank2_$3 + OFFSET_STRUCT_RICOH_2C02_PPUSTATUS)
Converting *(pointer+n) to pointer[n] [173] *((byte*~) main::enableVideoOutput1_$0) ← (byte) $80 -- *(main::enableVideoOutput1_$2 + OFFSET_STRUCT_RICOH_2C02_PPUCTRL)
Converting *(pointer+n) to pointer[n] [176] *((byte*~) main::enableVideoOutput1_$1) ← (byte) $1e -- *(main::enableVideoOutput1_$3 + OFFSET_STRUCT_RICOH_2C02_PPUMASK)
Converting *(pointer+n) to pointer[n] [222] *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1) ← (byte) 0 -- *(vblank::ppuSpriteBufferDmaTransfer1_$3 + OFFSET_STRUCT_RICOH_2C02_OAMADDR)
Converting *(pointer+n) to pointer[n] [226] *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2) ← (byte~) vblank::ppuSpriteBufferDmaTransfer1_$0 -- *(vblank::ppuSpriteBufferDmaTransfer1_$4 + OFFSET_STRUCT_RICOH_2A03_OAMDMA)
Converting *(pointer+n) to pointer[n] [229] *((byte*~) vblank::$58) ← (byte) 0 -- *(vblank::$60 + OFFSET_STRUCT_RICOH_2C02_PPUSCROLL)
Converting *(pointer+n) to pointer[n] [232] *((byte*~) vblank::$59) ← (byte) -8 -- *(vblank::$61 + OFFSET_STRUCT_RICOH_2C02_PPUSCROLL)
Successful SSA optimization Pass2InlineDerefIdx
Simplifying constant evaluating to zero (byte) 0*(const byte) SIZEOF_STRUCT_SPRITEDATA in
Simplifying constant evaluating to zero (byte) 0*(const byte) SIZEOF_STRUCT_SPRITEDATA in
Simplifying constant evaluating to zero (byte) 0*(const byte) SIZEOF_STRUCT_SPRITEDATA in
Simplifying constant evaluating to zero (byte) 0*(const byte) SIZEOF_STRUCT_SPRITEDATA in
Successful SSA optimization PassNSimplifyConstantZero
Simplifying expression containing zero ppuDataPutTile::tile#10 in [66] (byte) ppuDataPutTile::ppuDataPut1_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 0)
Simplifying expression containing zero main::initNES1_disableVideoOutput1_$2 in [108] (byte*~) main::initNES1_disableVideoOutput1_$0 ← (const byte*) main::initNES1_disableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL
Simplifying expression containing zero main::initNES1_disableVideoOutput1_$2 in [109] *((const byte*) main::initNES1_disableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL) ← (byte) 0
Simplifying expression containing zero MEMORY in [125] *((const nomodify byte*) MEMORY+(byte) 0 + (byte) main::initNES1_i#2) ← (byte) 0
Simplifying expression containing zero main::enableVideoOutput1_$2 in [172] (byte*~) main::enableVideoOutput1_$0 ← (const byte*) main::enableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL
Simplifying expression containing zero main::enableVideoOutput1_$2 in [173] *((const byte*) main::enableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL) ← (byte) $80
Simplifying expression containing zero (byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_Y in [190] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$27) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$27)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [190] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$27) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y)
Simplifying expression containing zero (byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_Y in [190] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$27) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [190] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [192] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$29) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$29)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [192] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$29) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (const byte) vblank::$29)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [194] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$31) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$31)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [194] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$31) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (const byte) vblank::$31)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [196] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$33) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$33)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [196] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$33) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (const byte) vblank::$33)
Simplifying expression containing zero (byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_Y in [201] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$35) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$35)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [201] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$35) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y)
Simplifying expression containing zero (byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_Y in [201] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$35) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [201] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [203] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$37) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$37)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [203] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$37) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (const byte) vblank::$37)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [205] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$39) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$39)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [205] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$39) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (const byte) vblank::$39)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [207] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$41) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$41)
Simplifying expression containing zero (byte*)SPRITE_BUFFER in [207] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (const byte) vblank::$41) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (const byte) vblank::$41)
Simplifying expression containing zero (byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X in [212] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (const byte) vblank::$43) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (const byte) vblank::$43)
Simplifying expression containing zero (byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X in [212] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (const byte) vblank::$43) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X)
Simplifying expression containing zero (byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X in [234] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (const byte) vblank::$51) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (const byte) vblank::$51)
Simplifying expression containing zero (byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X in [234] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (const byte) vblank::$51) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X)
Successful SSA optimization PassNSimplifyExpressionWithZero
Eliminating unused variable (byte*~) readJoy1::$4 and assignment [0] (byte*~) readJoy1::$4 ← (const byte*) readJoy1::$7 + (const byte) OFFSET_STRUCT_RICOH_2A03_JOY1
Eliminating unused variable (byte*~) readJoy1::$5 and assignment [2] (byte*~) readJoy1::$5 ← (const byte*) readJoy1::$8 + (const byte) OFFSET_STRUCT_RICOH_2A03_JOY1
Eliminating unused variable (byte*~) readJoy1::$6 and assignment [7] (byte*~) readJoy1::$6 ← (const byte*) readJoy1::$9 + (const byte) OFFSET_STRUCT_RICOH_2A03_JOY1
Eliminating unused variable (byte*~) ppuDataFill::ppuDataPrepare1_$2 and assignment [14] (byte*~) ppuDataFill::ppuDataPrepare1_$2 ← (const byte*) ppuDataFill::ppuDataPrepare1_$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
Eliminating unused variable (byte*~) ppuDataFill::ppuDataPrepare1_$3 and assignment [17] (byte*~) ppuDataFill::ppuDataPrepare1_$3 ← (const byte*) ppuDataFill::ppuDataPrepare1_$5 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
Eliminating unused variable (byte*~) ppuDataFill::ppuDataPut1_$0 and assignment [21] (byte*~) ppuDataFill::ppuDataPut1_$0 ← (const byte*) ppuDataFill::ppuDataPut1_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA
Eliminating unused variable (byte*~) ppuDataTransfer::ppuDataPrepare1_$2 and assignment [26] (byte*~) ppuDataTransfer::ppuDataPrepare1_$2 ← (const byte*) ppuDataTransfer::ppuDataPrepare1_$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
Eliminating unused variable (byte*~) ppuDataTransfer::ppuDataPrepare1_$3 and assignment [29] (byte*~) ppuDataTransfer::ppuDataPrepare1_$3 ← (const byte*) ppuDataTransfer::ppuDataPrepare1_$5 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
Eliminating unused variable (byte*~) ppuDataTransfer::ppuDataPut1_$0 and assignment [34] (byte*~) ppuDataTransfer::ppuDataPut1_$0 ← (const byte*) ppuDataTransfer::ppuDataPut1_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA
Eliminating unused variable (byte*~) ppuDataPutTile::ppuDataPrepare1_$2 and assignment [41] (byte*~) ppuDataPutTile::ppuDataPrepare1_$2 ← (const byte*) ppuDataPutTile::ppuDataPrepare1_$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
Eliminating unused variable (byte*~) ppuDataPutTile::ppuDataPrepare1_$3 and assignment [44] (byte*~) ppuDataPutTile::ppuDataPrepare1_$3 ← (const byte*) ppuDataPutTile::ppuDataPrepare1_$5 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
Eliminating unused variable (byte*~) ppuDataPutTile::ppuDataPut1_$0 and assignment [47] (byte*~) ppuDataPutTile::ppuDataPut1_$0 ← (const byte*) ppuDataPutTile::ppuDataPut1_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA
Eliminating unused variable (byte*~) ppuDataPutTile::ppuDataPut2_$0 and assignment [50] (byte*~) ppuDataPutTile::ppuDataPut2_$0 ← (const byte*) ppuDataPutTile::ppuDataPut2_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA
Eliminating unused variable (byte*~) ppuDataPutTile::ppuDataPrepare2_$2 and assignment [56] (byte*~) ppuDataPutTile::ppuDataPrepare2_$2 ← (const byte*) ppuDataPutTile::ppuDataPrepare2_$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
Eliminating unused variable (byte*~) ppuDataPutTile::ppuDataPrepare2_$3 and assignment [59] (byte*~) ppuDataPutTile::ppuDataPrepare2_$3 ← (const byte*) ppuDataPutTile::ppuDataPrepare2_$5 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR
Eliminating unused variable (byte*~) ppuDataPutTile::ppuDataPut3_$0 and assignment [62] (byte*~) ppuDataPutTile::ppuDataPut3_$0 ← (const byte*) ppuDataPutTile::ppuDataPut3_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA
Eliminating unused variable (byte*~) ppuDataPutTile::ppuDataPut4_$0 and assignment [65] (byte*~) ppuDataPutTile::ppuDataPut4_$0 ← (const byte*) ppuDataPutTile::ppuDataPut4_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA
Eliminating unused variable (byte*~) main::initNES1_disableVideoOutput1_$0 and assignment [76] (byte*~) main::initNES1_disableVideoOutput1_$0 ← (const byte*) main::initNES1_disableVideoOutput1_$2
Eliminating unused variable (byte*~) main::initNES1_disableVideoOutput1_$1 and assignment [78] (byte*~) main::initNES1_disableVideoOutput1_$1 ← (const byte*) main::initNES1_disableVideoOutput1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK
Eliminating unused variable (byte*~) main::initNES1_disableAudioOutput1_$0 and assignment [81] (byte*~) main::initNES1_disableAudioOutput1_$0 ← (const byte*) main::initNES1_disableAudioOutput1_$1 + (const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ
Eliminating unused variable (byte*~) main::initNES1_waitForVBlank1_$2 and assignment [84] (byte*~) main::initNES1_waitForVBlank1_$2 ← (const byte*) main::initNES1_waitForVBlank1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS
Eliminating unused variable (byte*~) main::initNES1_waitForVBlank2_$2 and assignment [98] (byte*~) main::initNES1_waitForVBlank2_$2 ← (const byte*) main::initNES1_waitForVBlank2_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS
Eliminating unused variable (byte*~) main::enableVideoOutput1_$0 and assignment [113] (byte*~) main::enableVideoOutput1_$0 ← (const byte*) main::enableVideoOutput1_$2
Eliminating unused variable (byte*~) main::enableVideoOutput1_$1 and assignment [115] (byte*~) main::enableVideoOutput1_$1 ← (const byte*) main::enableVideoOutput1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK
Eliminating unused variable (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1 and assignment [141] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1 ← (const byte*) vblank::ppuSpriteBufferDmaTransfer1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR
Eliminating unused variable (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2 and assignment [144] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2 ← (const byte*) vblank::ppuSpriteBufferDmaTransfer1_$4 + (const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA
Eliminating unused variable (byte*~) vblank::$58 and assignment [146] (byte*~) vblank::$58 ← (const byte*) vblank::$60 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL
Eliminating unused variable (byte*~) vblank::$59 and assignment [148] (byte*~) vblank::$59 ← (const byte*) vblank::$61 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL
Eliminating unused constant (const void*) memcpy::return#2
Eliminating unused constant (const byte) vblank::$27
Eliminating unused constant (const byte) vblank::$35
Eliminating unused constant (const byte) vblank::$43
Eliminating unused constant (const byte) vblank::$51
Eliminating unused constant (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL
Eliminating unused constant (const byte) OFFSET_STRUCT_SPRITEDATA_Y
Successful SSA optimization PassNEliminateUnusedVars
Removing unused block main::@return
Successful SSA optimization Pass2EliminateUnusedBlocks
Resolving array sizeof() sizeof (const byte*) PALETTE
Resolving array sizeof() sizeof (const struct SpriteData*) SPRITES
Successful SSA optimization PassNSizeOfSimplification
Constant right-side identified [19] (byte~) ppuDataTransfer::ppuDataPrepare1_$0 ← > (const nomodify void*) ppuDataTransfer::ppuData#0
Constant right-side identified [21] (byte~) ppuDataTransfer::ppuDataPrepare1_$1 ← < (const nomodify void*) ppuDataTransfer::ppuData#0
Constant right-side identified [51] (byte*) memcpy::src_end#0 ← (const byte*) memcpy::$2 + (const word) memcpy::num#0
Constant right-side identified [117] (byte~) vblank::ppuSpriteBufferDmaTransfer1_$0 ← > (const struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0
Successful SSA optimization Pass2ConstantRValueConsolidation
Constant (const byte) ppuDataTransfer::ppuDataPrepare1_$0 = >ppuDataTransfer::ppuData#0
Constant (const byte) ppuDataTransfer::ppuDataPrepare1_$1 = <ppuDataTransfer::ppuData#0
Constant (const byte*) memcpy::src_end#0 = memcpy::$2+memcpy::num#0
Constant (const byte) vblank::ppuSpriteBufferDmaTransfer1_$0 = >vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0
Successful SSA optimization Pass2ConstantIdentification
Simplifying constant evaluating to zero <(const nomodify void*) ppuDataTransfer::ppuData#0 in
Successful SSA optimization PassNSimplifyConstantZero
Adding number conversion cast (unumber) $20 in
Adding number conversion cast (unumber) 8 in
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant integer cast $20
Simplifying constant integer cast 8
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (byte) $20
Finalized unsigned number type (byte) 8
Successful SSA optimization PassNFinalizeNumberTypeConversions
Inlining Noop Cast [37] (byte*~) ppuDataPutTile::$7 ← (byte*)(nomodify void*) ppuDataPutTile::ppuData#2 keeping ppuDataPutTile::ppuData#2
Successful SSA optimization Pass2NopCastInlining
Inlining Noop Cast [39] (nomodify void*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 ← (void*)(byte*~) ppuDataPutTile::$3 keeping ppuDataPutTile::ppuDataPrepare2_ppuData#0
Inlining Noop Cast [83] (nomodify void*) ppuDataPutTile::ppuData#0 ← (void*)(byte*~) main::$10 keeping ppuDataPutTile::ppuData#0
Successful SSA optimization Pass2NopCastInlining
Inlining constant with var siblings (const byte) readJoy1::joy#0
Inlining constant with var siblings (const byte) readJoy1::i#0
Inlining constant with var siblings (const word) ppuDataFill::i#0
Inlining constant with different constant siblings (const nomodify void*) ppuDataFill::ppuData#0
Inlining constant with var siblings (const byte) ppuDataFill::val#0
Inlining constant with var siblings (const word) ppuDataFill::size#0
Inlining constant with different constant siblings (const nomodify void*) ppuDataFill::ppuData#1
Inlining constant with var siblings (const byte) ppuDataFill::val#1
Inlining constant with var siblings (const word) ppuDataFill::size#1
Inlining constant with var siblings (const word) ppuDataTransfer::i#0
Inlining constant with var siblings (const byte*) ppuDataTransfer::cpuSrc#0
Inlining constant with var siblings (const byte*) ppuDataPutTile::tile#0
Inlining constant with var siblings (const nomodify void*) ppuDataPutTile::ppuData#1
Inlining constant with var siblings (const byte*) ppuDataPutTile::tile#1
Inlining constant with var siblings (const byte*) memcpy::src#0
Inlining constant with var siblings (const byte*) memcpy::dst#0
Inlining constant with var siblings (const byte) main::initNES1_i#0
Inlining constant with var siblings (const byte) main::x#0
Constant inlined ppuDataPutTile::ppuDataPut4_$1 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined vblank::$47 = (byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA
Constant inlined vblank::$49 = (byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA
Constant inlined ppuDataTransfer::i#0 = (word) 0
Constant inlined ppuDataTransfer::ppuDataPrepare1_$1 = (byte) 0
Constant inlined ppuDataTransfer::ppuDataPrepare1_$0 = >(const nomodify void*) ppuDataTransfer::ppuData#0
Constant inlined vblank::$41 = (byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA
Constant inlined vblank::$45 = (byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA
Constant inlined memcpy::$2 = (byte*)(const void*) memcpy::source#0
Constant inlined main::initNES1_waitForVBlank2_$3 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined ppuDataFill::ppuDataPrepare1_$4 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined ppuDataTransfer::ppuDataPrepare1_$5 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined ppuDataFill::ppuDataPrepare1_$5 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined ppuDataTransfer::ppuDataPrepare1_$4 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined ppuDataFill::ppuData#1 = (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0
Constant inlined ppuDataFill::ppuData#0 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0
Constant inlined ppuDataTransfer::cpuSrc#0 = (byte*)(const nomodify void*) ppuDataTransfer::cpuData#0
Constant inlined vblank::$57 = (byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA
Constant inlined main::initNES1_i#0 = (byte) 0
Constant inlined ppuDataPutTile::ppuDataPut1_$1 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined vblank::$53 = (byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA
Constant inlined vblank::$55 = (byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA
Constant inlined ppuDataPutTile::ppuDataPrepare2_$5 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined ppuDataPutTile::ppuDataPrepare2_$4 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined ppuDataFill::i#0 = (word) 0
Constant inlined memcpy::dst#0 = (byte*)(const void*) memcpy::destination#0
Constant inlined vblank::$29 = (byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA
Constant inlined vblank::$60 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined vblank::$61 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined memcpy::src#0 = (byte*)(const void*) memcpy::source#0
Constant inlined main::enableVideoOutput1_$3 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined main::enableVideoOutput1_$2 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined readJoy1::i#0 = (byte) 0
Constant inlined ppuDataTransfer::ppuDataPut1_$1 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined ppuDataPutTile::ppuDataPut2_$1 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined ppuDataFill::val#1 = (byte) 0
Constant inlined ppuDataFill::ppuDataPut1_$1 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined ppuDataFill::val#0 = (byte) $fc
Constant inlined ppuDataPutTile::ppuDataPrepare1_$5 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined ppuDataPutTile::ppuDataPrepare1_$4 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined main::initNES1_disableVideoOutput1_$3 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined main::initNES1_disableVideoOutput1_$2 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined main::initNES1_disableAudioOutput1_$1 = (byte*)(const struct RICOH_2A03*) APU
Constant inlined readJoy1::joy#0 = (byte) 0
Constant inlined ppuDataPutTile::tile#0 = (const byte*) FLOOR
Constant inlined ppuDataPutTile::tile#1 = (const byte*) FLAG
Constant inlined ppuDataPutTile::ppuDataPut3_$1 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined vblank::$37 = (byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA
Constant inlined vblank::$39 = (byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA
Constant inlined main::x#0 = (byte) 0
Constant inlined vblank::$31 = (byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA
Constant inlined vblank::$33 = (byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA
Constant inlined readJoy1::$9 = (byte*)(const struct RICOH_2A03*) APU
Constant inlined vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 = (const struct SpriteData*) SPRITE_BUFFER
Constant inlined main::initNES1_waitForVBlank1_$3 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined ppuDataPutTile::ppuData#1 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0+(word)(number) $12*(number) $20+(byte) $1c
Constant inlined vblank::ppuSpriteBufferDmaTransfer1_$0 = >(const struct SpriteData*) SPRITE_BUFFER
Constant inlined ppuDataFill::size#1 = (byte) $40
Constant inlined ppuDataFill::size#0 = (word) $3c0
Constant inlined readJoy1::$7 = (byte*)(const struct RICOH_2A03*) APU
Constant inlined vblank::ppuSpriteBufferDmaTransfer1_$3 = (byte*)(const struct RICOH_2C02*) PPU
Constant inlined readJoy1::$8 = (byte*)(const struct RICOH_2A03*) APU
Constant inlined vblank::ppuSpriteBufferDmaTransfer1_$4 = (byte*)(const struct RICOH_2A03*) APU
Successful SSA optimization Pass2ConstantInlining
Consolidated array index constant in *((byte*)APU+OFFSET_STRUCT_RICOH_2A03_JOY1)
Consolidated array index constant in *((byte*)APU+OFFSET_STRUCT_RICOH_2A03_JOY1)
Consolidated array index constant in *((byte*)APU+OFFSET_STRUCT_RICOH_2A03_JOY1)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK)
Consolidated array index constant in *((byte*)APU+OFFSET_STRUCT_RICOH_2A03_DMC_FREQ)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+1*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+1*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+2*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+2*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+3*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+3*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+1*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+1*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+2*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+2*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+3*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+3*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+1*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+1*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+2*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+2*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+3*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+3*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_OAMADDR)
Consolidated array index constant in *((byte*)APU+OFFSET_STRUCT_RICOH_2A03_OAMDMA)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL)
Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+1*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+1*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+2*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+2*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+3*SIZEOF_STRUCT_SPRITEDATA)
Consolidated array index constant in *((byte*)SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+3*SIZEOF_STRUCT_SPRITEDATA)
Successful SSA optimization Pass2ConstantAdditionElimination
Added new block during phi lifting main::@12(between main::initNES1_@1 and main::initNES1_@1)
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @2
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::initNES1_waitForVBlank1
Adding NOP phi() at start of main::initNES1_@6
Adding NOP phi() at start of main::initNES1_waitForVBlank2
Adding NOP phi() at start of main::@5
Adding NOP phi() at start of main::@6
Adding NOP phi() at start of main::@7
Adding NOP phi() at start of main::@8
Adding NOP phi() at start of main::@3
Adding NOP phi() at start of main::@10
Adding NOP phi() at start of main::@11
Adding NOP phi() at start of main::@4
Adding NOP phi() at start of memcpy
Adding NOP phi() at start of memcpy::@3
Adding NOP phi() at start of ppuDataFill::@3
Adding NOP phi() at start of ppuDataFill::@2
Adding NOP phi() at start of ppuDataTransfer
Adding NOP phi() at start of ppuDataTransfer::@3
Adding NOP phi() at start of vblank
Adding NOP phi() at start of vblank::@4
Adding NOP phi() at start of readJoy1::@3
CALL GRAPH
Calls in [] to main:2
Calls in [main] to ppuDataTransfer:32 ppuDataFill:34 ppuDataFill:36 ppuDataPutTile:41 memcpy:43 ppuDataPutTile:50
Calls in [vblank] to readJoy1:110
Created 14 initial phi equivalence classes
Coalesced [52] main::x#5 ← main::x#1
Coalesced [53] main::initNES1_i#3 ← main::initNES1_i#1
Coalesced [81] memcpy::src#4 ← memcpy::src#1
Coalesced [82] memcpy::dst#4 ← memcpy::dst#1
Coalesced [95] ppuDataFill::i#6 ← ppuDataFill::i#1
Coalesced [107] ppuDataTransfer::i#6 ← ppuDataTransfer::i#1
Coalesced [108] ppuDataTransfer::cpuSrc#6 ← ppuDataTransfer::cpuSrc#1
Coalesced [153] readJoy1::i#4 ← readJoy1::i#1
Coalesced [154] readJoy1::joy#5 ← readJoy1::joy#1
Coalesced down to 14 phi equivalence classes
Culled Empty Block (label) @2
Culled Empty Block (label) main::initNES1_@6
Culled Empty Block (label) main::@8
Culled Empty Block (label) main::@11
Culled Empty Block (label) main::@12
Culled Empty Block (label) memcpy::@3
Culled Empty Block (label) ppuDataFill::@3
Culled Empty Block (label) ppuDataFill::@2
Culled Empty Block (label) ppuDataTransfer::@3
Culled Empty Block (label) vblank::@4
Culled Empty Block (label) readJoy1::@3
Renumbering block ppuDataFill::@4 to ppuDataFill::@2
Renumbering block ppuDataTransfer::@4 to ppuDataTransfer::@3
Renumbering block main::@9 to main::@8
Renumbering block main::@10 to main::@9
Renumbering block vblank::@5 to vblank::@4
Renumbering block vblank::@6 to vblank::@5
Renumbering block vblank::@7 to vblank::@6
Renumbering block vblank::@8 to vblank::@7
Renumbering block vblank::@9 to vblank::@8
Renumbering block vblank::@10 to vblank::@9
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
Adding NOP phi() at start of main
Adding NOP phi() at start of main::initNES1_waitForVBlank1
Adding NOP phi() at start of main::initNES1_waitForVBlank2
Adding NOP phi() at start of main::@5
Adding NOP phi() at start of main::@6
Adding NOP phi() at start of main::@7
Adding NOP phi() at start of main::@3
Adding NOP phi() at start of main::@9
Adding NOP phi() at start of main::@4
Adding NOP phi() at start of memcpy
Adding NOP phi() at start of ppuDataTransfer
Adding NOP phi() at start of vblank
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()
(void()) main()
main: scope:[main] from @1
[4] phi()
to:main::initNES1
main::initNES1: scope:[main] from main
asm { cld ldx#$ff txs }
to:main::initNES1_disableVideoOutput1
main::initNES1_disableVideoOutput1: scope:[main] from main::initNES1
[6] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0
[7] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0
to:main::initNES1_disableAudioOutput1
main::initNES1_disableAudioOutput1: scope:[main] from main::initNES1_disableVideoOutput1
[8] *((const nomodify byte*) FR_COUNTER) ← (byte) $40
[9] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40
to:main::initNES1_clearVBlankFlag1
main::initNES1_clearVBlankFlag1: scope:[main] from main::initNES1_disableAudioOutput1
asm { ldaPPU_PPUSTATUS }
to:main::initNES1_waitForVBlank1
main::initNES1_waitForVBlank1: scope:[main] from main::initNES1_clearVBlankFlag1
[11] phi()
to:main::initNES1_waitForVBlank1_@1
main::initNES1_waitForVBlank1_@1: scope:[main] from main::initNES1_waitForVBlank1 main::initNES1_waitForVBlank1_@1
[12] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80
[13] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1
to:main::initNES1_@1
main::initNES1_@1: scope:[main] from main::initNES1_@1 main::initNES1_waitForVBlank1_@1
[14] (byte) main::initNES1_i#2 ← phi( main::initNES1_@1/(byte) main::initNES1_i#1 main::initNES1_waitForVBlank1_@1/(byte) 0 )
[15] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0
[16] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0
[17] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0
[18] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0
[19] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0
[20] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0
[21] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0
[22] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0
[23] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2
[24] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1
to:main::initNES1_waitForVBlank2
main::initNES1_waitForVBlank2: scope:[main] from main::initNES1_@1
[25] phi()
to:main::initNES1_waitForVBlank2_@1
main::initNES1_waitForVBlank2_@1: scope:[main] from main::initNES1_waitForVBlank2 main::initNES1_waitForVBlank2_@1
[26] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80
[27] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1
to:main::initNES1_@7
main::initNES1_@7: scope:[main] from main::initNES1_waitForVBlank2_@1
asm { ldaPPU_PPUSTATUS }
to:main::@5
main::@5: scope:[main] from main::initNES1_@7
[29] phi()
[30] call ppuDataTransfer
to:main::@6
main::@6: scope:[main] from main::@5
[31] phi()
[32] call ppuDataFill
to:main::@7
main::@7: scope:[main] from main::@6
[33] phi()
[34] call ppuDataFill
to:main::@1
main::@1: scope:[main] from main::@7 main::@8
[35] (byte) main::x#2 ← phi( main::@7/(byte) 0 main::@8/(byte) main::x#1 )
[36] if((byte) main::x#2<(byte) $20) goto main::@2
to:main::@3
main::@3: scope:[main] from main::@1
[37] phi()
[38] call ppuDataPutTile
to:main::@9
main::@9: scope:[main] from main::@3
[39] phi()
[40] call memcpy
to:main::enableVideoOutput1
main::enableVideoOutput1: scope:[main] from main::@9
[41] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80
[42] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e
to:main::@4
main::@4: scope:[main] from main::@4 main::enableVideoOutput1
[43] phi()
to:main::@4
main::@2: scope:[main] from main::@1
[44] (nomodify byte*) ppuDataPutTile::ppuData#0 ← (const nomodify byte*) PPU_NAME_TABLE_0+(word)(number) $14*(number) $20 + (byte) main::x#2
[45] (nomodify void*) ppuDataPutTile::ppuData#9 ← (void*)(nomodify byte*) ppuDataPutTile::ppuData#0
[46] call ppuDataPutTile
to:main::@8
main::@8: scope:[main] from main::@2
[47] (byte) main::x#1 ← (byte) main::x#2 + (byte) 2
to:main::@1
(void()) ppuDataPutTile((nomodify void*) ppuDataPutTile::ppuData , (byte*) ppuDataPutTile::tile)
ppuDataPutTile: scope:[ppuDataPutTile] from main::@2 main::@3
[48] (byte*) ppuDataPutTile::tile#10 ← phi( main::@2/(const byte*) FLOOR main::@3/(const byte*) FLAG )
[48] (nomodify void*) ppuDataPutTile::ppuData#2 ← phi( main::@2/(nomodify void*) ppuDataPutTile::ppuData#9 main::@3/(void*)(const nomodify byte*) PPU_NAME_TABLE_0+(word)(number) $12*(number) $20+(byte) $1c )
to:ppuDataPutTile::ppuDataPrepare1
ppuDataPutTile::ppuDataPrepare1: scope:[ppuDataPutTile] from ppuDataPutTile
[49] (byte~) ppuDataPutTile::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataPutTile::ppuData#2
[50] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$0
[51] (byte~) ppuDataPutTile::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataPutTile::ppuData#2
[52] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$1
to:ppuDataPutTile::@1
ppuDataPutTile::@1: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPrepare1
[53] (byte) ppuDataPutTile::ppuDataPut1_val#0 ← *((byte*) ppuDataPutTile::tile#10)
to:ppuDataPutTile::ppuDataPut1
ppuDataPutTile::ppuDataPut1: scope:[ppuDataPutTile] from ppuDataPutTile::@1
[54] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut1_val#0
to:ppuDataPutTile::@2
ppuDataPutTile::@2: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPut1
[55] (byte) ppuDataPutTile::ppuDataPut2_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 1)
to:ppuDataPutTile::ppuDataPut2
ppuDataPutTile::ppuDataPut2: scope:[ppuDataPutTile] from ppuDataPutTile::@2
[56] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut2_val#0
to:ppuDataPutTile::@3
ppuDataPutTile::@3: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPut2
[57] (nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 ← (byte*)(nomodify void*) ppuDataPutTile::ppuData#2 + (byte) $20
to:ppuDataPutTile::ppuDataPrepare2
ppuDataPutTile::ppuDataPrepare2: scope:[ppuDataPutTile] from ppuDataPutTile::@3
[58] (byte~) ppuDataPutTile::ppuDataPrepare2_$0 ← > (void*)(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0
[59] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$0
[60] (byte~) ppuDataPutTile::ppuDataPrepare2_$1 ← < (void*)(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0
[61] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$1
to:ppuDataPutTile::@4
ppuDataPutTile::@4: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPrepare2
[62] (byte) ppuDataPutTile::ppuDataPut3_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 2)
to:ppuDataPutTile::ppuDataPut3
ppuDataPutTile::ppuDataPut3: scope:[ppuDataPutTile] from ppuDataPutTile::@4
[63] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut3_val#0
to:ppuDataPutTile::@5
ppuDataPutTile::@5: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPut3
[64] (byte) ppuDataPutTile::ppuDataPut4_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 3)
to:ppuDataPutTile::ppuDataPut4
ppuDataPutTile::ppuDataPut4: scope:[ppuDataPutTile] from ppuDataPutTile::@5
[65] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut4_val#0
to:ppuDataPutTile::@return
ppuDataPutTile::@return: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPut4
[66] return
to:@return
(void*()) memcpy((void*) memcpy::destination , (void*) memcpy::source , (word) memcpy::num)
memcpy: scope:[memcpy] from main::@9
[67] phi()
to:memcpy::@1
memcpy::@1: scope:[memcpy] from memcpy memcpy::@2
[68] (byte*) memcpy::dst#2 ← phi( memcpy/(byte*)(const void*) memcpy::destination#0 memcpy::@2/(byte*) memcpy::dst#1 )
[68] (byte*) memcpy::src#2 ← phi( memcpy/(byte*)(const void*) memcpy::source#0 memcpy::@2/(byte*) memcpy::src#1 )
[69] if((byte*) memcpy::src#2!=(const byte*) memcpy::src_end#0) goto memcpy::@2
to:memcpy::@return
memcpy::@return: scope:[memcpy] from memcpy::@1
[70] return
to:@return
memcpy::@2: scope:[memcpy] from memcpy::@1
[71] *((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#2)
[72] (byte*) memcpy::dst#1 ← ++ (byte*) memcpy::dst#2
[73] (byte*) memcpy::src#1 ← ++ (byte*) memcpy::src#2
to:memcpy::@1
(void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size)
ppuDataFill: scope:[ppuDataFill] from main::@6 main::@7
[74] (byte) ppuDataFill::val#4 ← phi( main::@6/(byte) $fc main::@7/(byte) 0 )
[74] (word) ppuDataFill::size#3 ← phi( main::@6/(word) $3c0 main::@7/(byte) $40 )
[74] (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ← phi( main::@6/(void*)(const nomodify byte*) PPU_NAME_TABLE_0 main::@7/(void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 )
to:ppuDataFill::ppuDataPrepare1
ppuDataFill::ppuDataPrepare1: scope:[ppuDataFill] from ppuDataFill
[75] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0
[76] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0
[77] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0
[78] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$1
to:ppuDataFill::@1
ppuDataFill::@1: scope:[ppuDataFill] from ppuDataFill::@2 ppuDataFill::ppuDataPrepare1
[79] (word) ppuDataFill::i#2 ← phi( ppuDataFill::ppuDataPrepare1/(word) 0 ppuDataFill::@2/(word) ppuDataFill::i#1 )
[80] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1
to:ppuDataFill::@return
ppuDataFill::@return: scope:[ppuDataFill] from ppuDataFill::@1
[81] return
to:@return
ppuDataFill::ppuDataPut1: scope:[ppuDataFill] from ppuDataFill::@1
[82] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4
to:ppuDataFill::@2
ppuDataFill::@2: scope:[ppuDataFill] from ppuDataFill::ppuDataPut1
[83] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2
to:ppuDataFill::@1
(void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size)
ppuDataTransfer: scope:[ppuDataTransfer] from main::@5
[84] phi()
to:ppuDataTransfer::ppuDataPrepare1
ppuDataTransfer::ppuDataPrepare1: scope:[ppuDataTransfer] from ppuDataTransfer
[85] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0
[86] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0
to:ppuDataTransfer::@1
ppuDataTransfer::@1: scope:[ppuDataTransfer] from ppuDataTransfer::@3 ppuDataTransfer::ppuDataPrepare1
[87] (byte*) ppuDataTransfer::cpuSrc#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 ppuDataTransfer::@3/(byte*) ppuDataTransfer::cpuSrc#1 )
[87] (word) ppuDataTransfer::i#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(word) 0 ppuDataTransfer::@3/(word) ppuDataTransfer::i#1 )
[88] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2
to:ppuDataTransfer::@return
ppuDataTransfer::@return: scope:[ppuDataTransfer] from ppuDataTransfer::@1
[89] return
to:@return
ppuDataTransfer::@2: scope:[ppuDataTransfer] from ppuDataTransfer::@1
[90] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2)
to:ppuDataTransfer::ppuDataPut1
ppuDataTransfer::ppuDataPut1: scope:[ppuDataTransfer] from ppuDataTransfer::@2
[91] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0
to:ppuDataTransfer::@3
ppuDataTransfer::@3: scope:[ppuDataTransfer] from ppuDataTransfer::ppuDataPut1
[92] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2
[93] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2
to:ppuDataTransfer::@1
interrupt(HARDWARE_STACK)(void()) vblank()
vblank: scope:[vblank] from
[94] phi()
[95] call readJoy1
[96] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2
to:vblank::@9
vblank::@9: scope:[vblank] from vblank
[97] (byte) vblank::joy#0 ← (byte) readJoy1::return#2
[98] (byte~) vblank::$1 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN
[99] if((byte) 0==(byte~) vblank::$1) goto vblank::@1
to:vblank::@4
vblank::@4: scope:[vblank] from vblank::@9
[100] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER)
[101] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[102] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[103] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA)
to:vblank::@1
vblank::@1: scope:[vblank] from vblank::@4 vblank::@9
[104] (byte~) vblank::$3 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP
[105] if((byte) 0==(byte~) vblank::$3) goto vblank::@2
to:vblank::@5
vblank::@5: scope:[vblank] from vblank::@1
[106] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER)
[107] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[108] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA)
to:vblank::@2
vblank::@2: scope:[vblank] from vblank::@1 vblank::@5
[110] (byte~) vblank::$5 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_LEFT
[111] if((byte) 0==(byte~) vblank::$5) goto vblank::@3
to:vblank::@6
vblank::@6: scope:[vblank] from vblank::@2
[112] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X)
[113] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[114] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[115] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA)
to:vblank::@3
vblank::@3: scope:[vblank] from vblank::@2 vblank::@6
[116] (byte~) vblank::$7 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_RIGHT
[117] if((byte) 0==(byte~) vblank::$7) goto vblank::ppuSpriteBufferDmaTransfer1
to:vblank::@7
vblank::@7: scope:[vblank] from vblank::@3
[118] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X)
[119] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[120] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[121] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA)
to:vblank::ppuSpriteBufferDmaTransfer1
vblank::ppuSpriteBufferDmaTransfer1: scope:[vblank] from vblank::@3 vblank::@7
[122] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0
[123] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER
to:vblank::@8
vblank::@8: scope:[vblank] from vblank::ppuSpriteBufferDmaTransfer1
[124] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0
[125] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) -8
to:vblank::@return
vblank::@return: scope:[vblank] from vblank::@8
[126] return
to:@return
(byte()) readJoy1()
readJoy1: scope:[readJoy1] from vblank
[127] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1
[128] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0
to:readJoy1::@1
readJoy1::@1: scope:[readJoy1] from readJoy1 readJoy1::@2
[129] (byte) readJoy1::joy#2 ← phi( readJoy1/(byte) 0 readJoy1::@2/(byte) readJoy1::joy#1 )
[129] (byte) readJoy1::i#2 ← phi( readJoy1/(byte) 0 readJoy1::@2/(byte) readJoy1::i#1 )
[130] if((byte) readJoy1::i#2<(byte) 8) goto readJoy1::@2
to:readJoy1::@return
readJoy1::@return: scope:[readJoy1] from readJoy1::@1
[131] return
to:@return
readJoy1::@2: scope:[readJoy1] from readJoy1::@1
[132] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1
[133] (byte~) readJoy1::$2 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1
[134] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2
[135] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2
to:readJoy1::@1
VARIABLE REGISTER WEIGHTS
(byte) RICOH_2A03::DMC_FREQ
(byte) RICOH_2A03::DMC_LEN
(byte) RICOH_2A03::DMC_RAW
(byte) RICOH_2A03::DMC_START
(byte) RICOH_2A03::JOY1
(byte) RICOH_2A03::JOY2
(byte) RICOH_2A03::NOISE_HI
(byte) RICOH_2A03::NOISE_LO
(byte) RICOH_2A03::NOISE_VOL
(byte) RICOH_2A03::OAMDMA
(byte) RICOH_2A03::SND_CHN
(byte) RICOH_2A03::SQ1_HI
(byte) RICOH_2A03::SQ1_LO
(byte) RICOH_2A03::SQ1_SWEEP
(byte) RICOH_2A03::SQ1_VOL
(byte) RICOH_2A03::SQ2_HI
(byte) RICOH_2A03::SQ2_LO
(byte) RICOH_2A03::SQ2_SWEEP
(byte) RICOH_2A03::SQ2_VOL
(byte) RICOH_2A03::TRI_HI
(byte) RICOH_2A03::TRI_LINEAR
(byte) RICOH_2A03::TRI_LO
(byte) RICOH_2A03::UNUSED1
(byte) RICOH_2A03::UNUSED2
(byte) RICOH_2C02::OAMADDR
(byte) RICOH_2C02::OAMDATA
(byte) RICOH_2C02::PPUADDR
(byte) RICOH_2C02::PPUCTRL
(byte) RICOH_2C02::PPUDATA
(byte) RICOH_2C02::PPUMASK
(byte) RICOH_2C02::PPUSCROLL
(volatile byte) RICOH_2C02::PPUSTATUS loadstore
(byte) SpriteData::attributes
(byte) SpriteData::tile
(byte) SpriteData::x
(byte) SpriteData::y
(void()) main()
(byte) main::initNES1_i
(byte) main::initNES1_i#1 151.5
(byte) main::initNES1_i#2 112.22222222222223
(byte~) main::initNES1_waitForVBlank1_$0 202.0
(byte~) main::initNES1_waitForVBlank2_$0 202.0
(byte) main::x
(byte) main::x#1 202.0
(byte) main::x#2 80.8
(void*()) memcpy((void*) memcpy::destination , (void*) memcpy::source , (word) memcpy::num)
(void*) memcpy::destination
(byte*) memcpy::dst
(byte*) memcpy::dst#1 1001.0
(byte*) memcpy::dst#2 1001.0
(word) memcpy::num
(void*) memcpy::return
(void*) memcpy::source
(byte*) memcpy::src
(byte*) memcpy::src#1 2002.0
(byte*) memcpy::src#2 1001.0
(byte*) memcpy::src_end
(void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size)
(word) ppuDataFill::i
(word) ppuDataFill::i#1 2002.0
(word) ppuDataFill::i#2 1001.0
(nomodify void*) ppuDataFill::ppuData
(byte~) ppuDataFill::ppuDataPrepare1_$0 202.0
(byte~) ppuDataFill::ppuDataPrepare1_$1 202.0
(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData
(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 67.33333333333333
(byte) ppuDataFill::ppuDataPut1_val
(word) ppuDataFill::size
(word) ppuDataFill::size#3 111.22222222222223
(byte) ppuDataFill::val
(byte) ppuDataFill::val#4 111.22222222222223
(void()) ppuDataPutTile((nomodify void*) ppuDataPutTile::ppuData , (byte*) ppuDataPutTile::tile)
(nomodify void*) ppuDataPutTile::ppuData
(nomodify byte*) ppuDataPutTile::ppuData#0 101.0
(nomodify void*) ppuDataPutTile::ppuData#2 233.66666666666669
(nomodify void*) ppuDataPutTile::ppuData#9 202.0
(byte~) ppuDataPutTile::ppuDataPrepare1_$0 2002.0
(byte~) ppuDataPutTile::ppuDataPrepare1_$1 2002.0
(nomodify void*) ppuDataPutTile::ppuDataPrepare1_ppuData
(byte~) ppuDataPutTile::ppuDataPrepare2_$0 2002.0
(byte~) ppuDataPutTile::ppuDataPrepare2_$1 2002.0
(nomodify void*) ppuDataPutTile::ppuDataPrepare2_ppuData
(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 333.6666666666667
(byte) ppuDataPutTile::ppuDataPut1_val
(byte) ppuDataPutTile::ppuDataPut1_val#0 2002.0
(byte) ppuDataPutTile::ppuDataPut2_val
(byte) ppuDataPutTile::ppuDataPut2_val#0 2002.0
(byte) ppuDataPutTile::ppuDataPut3_val
(byte) ppuDataPutTile::ppuDataPut3_val#0 2002.0
(byte) ppuDataPutTile::ppuDataPut4_val
(byte) ppuDataPutTile::ppuDataPut4_val#0 2002.0
(byte*) ppuDataPutTile::tile
(byte*) ppuDataPutTile::tile#10 250.25
(void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size)
(nomodify void*) ppuDataTransfer::cpuData
(byte*) ppuDataTransfer::cpuSrc
(byte*) ppuDataTransfer::cpuSrc#1 1001.0
(byte*) ppuDataTransfer::cpuSrc#2 750.75
(word) ppuDataTransfer::i
(word) ppuDataTransfer::i#1 2002.0
(word) ppuDataTransfer::i#2 600.5999999999999
(nomodify void*) ppuDataTransfer::ppuData
(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData
(byte) ppuDataTransfer::ppuDataPut1_val
(byte) ppuDataTransfer::ppuDataPut1_val#0 2002.0
(word) ppuDataTransfer::size
(byte()) readJoy1()
(byte~) readJoy1::$1 101.0
(byte~) readJoy1::$2 202.0
(byte) readJoy1::i
(byte) readJoy1::i#1 202.0
(byte) readJoy1::i#2 60.599999999999994
(byte) readJoy1::joy
(byte) readJoy1::joy#1 101.0
(byte) readJoy1::joy#2 51.0
(byte) readJoy1::return
(byte) readJoy1::return#2 4.0
interrupt(HARDWARE_STACK)(void()) vblank()
(byte~) vblank::$1 4.0
(byte~) vblank::$3 4.0
(byte~) vblank::$5 4.0
(byte~) vblank::$7 4.0
(byte) vblank::joy
(byte) vblank::joy#0 0.5263157894736842
(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer
Initial phi equivalence classes
[ main::initNES1_i#2 main::initNES1_i#1 ]
[ main::x#2 main::x#1 ]
[ ppuDataPutTile::ppuData#2 ppuDataPutTile::ppuData#9 ]
[ ppuDataPutTile::tile#10 ]
[ memcpy::src#2 memcpy::src#1 ]
[ memcpy::dst#2 memcpy::dst#1 ]
[ ppuDataFill::ppuDataPrepare1_ppuData#0 ]
[ ppuDataFill::size#3 ]
[ ppuDataFill::val#4 ]
[ ppuDataFill::i#2 ppuDataFill::i#1 ]
[ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ]
[ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ]
[ readJoy1::i#2 readJoy1::i#1 ]
[ readJoy1::joy#2 readJoy1::joy#1 ]
Added variable main::initNES1_waitForVBlank1_$0 to live range equivalence class [ main::initNES1_waitForVBlank1_$0 ]
Added variable main::initNES1_waitForVBlank2_$0 to live range equivalence class [ main::initNES1_waitForVBlank2_$0 ]
Added variable ppuDataPutTile::ppuData#0 to live range equivalence class [ ppuDataPutTile::ppuData#0 ]
Added variable ppuDataPutTile::ppuDataPrepare1_$0 to live range equivalence class [ ppuDataPutTile::ppuDataPrepare1_$0 ]
Added variable ppuDataPutTile::ppuDataPrepare1_$1 to live range equivalence class [ ppuDataPutTile::ppuDataPrepare1_$1 ]
Added variable ppuDataPutTile::ppuDataPut1_val#0 to live range equivalence class [ ppuDataPutTile::ppuDataPut1_val#0 ]
Added variable ppuDataPutTile::ppuDataPut2_val#0 to live range equivalence class [ ppuDataPutTile::ppuDataPut2_val#0 ]
Added variable ppuDataPutTile::ppuDataPrepare2_ppuData#0 to live range equivalence class [ ppuDataPutTile::ppuDataPrepare2_ppuData#0 ]
Added variable ppuDataPutTile::ppuDataPrepare2_$0 to live range equivalence class [ ppuDataPutTile::ppuDataPrepare2_$0 ]
Added variable ppuDataPutTile::ppuDataPrepare2_$1 to live range equivalence class [ ppuDataPutTile::ppuDataPrepare2_$1 ]
Added variable ppuDataPutTile::ppuDataPut3_val#0 to live range equivalence class [ ppuDataPutTile::ppuDataPut3_val#0 ]
Added variable ppuDataPutTile::ppuDataPut4_val#0 to live range equivalence class [ ppuDataPutTile::ppuDataPut4_val#0 ]
Added variable ppuDataFill::ppuDataPrepare1_$0 to live range equivalence class [ ppuDataFill::ppuDataPrepare1_$0 ]
Added variable ppuDataFill::ppuDataPrepare1_$1 to live range equivalence class [ ppuDataFill::ppuDataPrepare1_$1 ]
Added variable ppuDataTransfer::ppuDataPut1_val#0 to live range equivalence class [ ppuDataTransfer::ppuDataPut1_val#0 ]
Added variable readJoy1::return#2 to live range equivalence class [ readJoy1::return#2 ]
Added variable vblank::joy#0 to live range equivalence class [ vblank::joy#0 ]
Added variable vblank::$1 to live range equivalence class [ vblank::$1 ]
Added variable vblank::$3 to live range equivalence class [ vblank::$3 ]
Added variable vblank::$5 to live range equivalence class [ vblank::$5 ]
Added variable vblank::$7 to live range equivalence class [ vblank::$7 ]
Added variable readJoy1::$1 to live range equivalence class [ readJoy1::$1 ]
Added variable readJoy1::$2 to live range equivalence class [ readJoy1::$2 ]
Complete equivalence classes
[ main::initNES1_i#2 main::initNES1_i#1 ]
[ main::x#2 main::x#1 ]
[ ppuDataPutTile::ppuData#2 ppuDataPutTile::ppuData#9 ]
[ ppuDataPutTile::tile#10 ]
[ memcpy::src#2 memcpy::src#1 ]
[ memcpy::dst#2 memcpy::dst#1 ]
[ ppuDataFill::ppuDataPrepare1_ppuData#0 ]
[ ppuDataFill::size#3 ]
[ ppuDataFill::val#4 ]
[ ppuDataFill::i#2 ppuDataFill::i#1 ]
[ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ]
[ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ]
[ readJoy1::i#2 readJoy1::i#1 ]
[ readJoy1::joy#2 readJoy1::joy#1 ]
[ main::initNES1_waitForVBlank1_$0 ]
[ main::initNES1_waitForVBlank2_$0 ]
[ ppuDataPutTile::ppuData#0 ]
[ ppuDataPutTile::ppuDataPrepare1_$0 ]
[ ppuDataPutTile::ppuDataPrepare1_$1 ]
[ ppuDataPutTile::ppuDataPut1_val#0 ]
[ ppuDataPutTile::ppuDataPut2_val#0 ]
[ ppuDataPutTile::ppuDataPrepare2_ppuData#0 ]
[ ppuDataPutTile::ppuDataPrepare2_$0 ]
[ ppuDataPutTile::ppuDataPrepare2_$1 ]
[ ppuDataPutTile::ppuDataPut3_val#0 ]
[ ppuDataPutTile::ppuDataPut4_val#0 ]
[ ppuDataFill::ppuDataPrepare1_$0 ]
[ ppuDataFill::ppuDataPrepare1_$1 ]
[ ppuDataTransfer::ppuDataPut1_val#0 ]
[ readJoy1::return#2 ]
[ vblank::joy#0 ]
[ vblank::$1 ]
[ vblank::$3 ]
[ vblank::$5 ]
[ vblank::$7 ]
[ readJoy1::$1 ]
[ readJoy1::$2 ]
Allocated zp[1]:2 [ main::initNES1_i#2 main::initNES1_i#1 ]
Allocated zp[1]:3 [ main::x#2 main::x#1 ]
Allocated zp[2]:4 [ ppuDataPutTile::ppuData#2 ppuDataPutTile::ppuData#9 ]
Allocated zp[2]:6 [ ppuDataPutTile::tile#10 ]
Allocated zp[2]:8 [ memcpy::src#2 memcpy::src#1 ]
Allocated zp[2]:10 [ memcpy::dst#2 memcpy::dst#1 ]
Allocated zp[2]:12 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ]
Allocated zp[2]:14 [ ppuDataFill::size#3 ]
Allocated zp[1]:16 [ ppuDataFill::val#4 ]
Allocated zp[2]:17 [ ppuDataFill::i#2 ppuDataFill::i#1 ]
Allocated zp[2]:19 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ]
Allocated zp[2]:21 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ]
Allocated zp[1]:23 [ readJoy1::i#2 readJoy1::i#1 ]
Allocated zp[1]:24 [ readJoy1::joy#2 readJoy1::joy#1 ]
Allocated zp[1]:25 [ main::initNES1_waitForVBlank1_$0 ]
Allocated zp[1]:26 [ main::initNES1_waitForVBlank2_$0 ]
Allocated zp[2]:27 [ ppuDataPutTile::ppuData#0 ]
Allocated zp[1]:29 [ ppuDataPutTile::ppuDataPrepare1_$0 ]
Allocated zp[1]:30 [ ppuDataPutTile::ppuDataPrepare1_$1 ]
Allocated zp[1]:31 [ ppuDataPutTile::ppuDataPut1_val#0 ]
Allocated zp[1]:32 [ ppuDataPutTile::ppuDataPut2_val#0 ]
Allocated zp[2]:33 [ ppuDataPutTile::ppuDataPrepare2_ppuData#0 ]
Allocated zp[1]:35 [ ppuDataPutTile::ppuDataPrepare2_$0 ]
Allocated zp[1]:36 [ ppuDataPutTile::ppuDataPrepare2_$1 ]
Allocated zp[1]:37 [ ppuDataPutTile::ppuDataPut3_val#0 ]
Allocated zp[1]:38 [ ppuDataPutTile::ppuDataPut4_val#0 ]
Allocated zp[1]:39 [ ppuDataFill::ppuDataPrepare1_$0 ]
Allocated zp[1]:40 [ ppuDataFill::ppuDataPrepare1_$1 ]
Allocated zp[1]:41 [ ppuDataTransfer::ppuDataPut1_val#0 ]
Allocated zp[1]:42 [ readJoy1::return#2 ]
Allocated zp[1]:43 [ vblank::joy#0 ]
Allocated zp[1]:44 [ vblank::$1 ]
Allocated zp[1]:45 [ vblank::$3 ]
Allocated zp[1]:46 [ vblank::$5 ]
Allocated zp[1]:47 [ vblank::$7 ]
Allocated zp[1]:48 [ readJoy1::$1 ]
Allocated zp[1]:49 [ readJoy1::$2 ]
INITIAL ASM
Target platform is nes / MOS6502X
// File Comments
// A minimal NES demo
// Based on: https://github.com/gregkrsak/first_nes written by Greg M. Krsak, 2018.
// Nintendo Entertainment System (NES
// https://en.wikipedia.org/wiki/Nintendo_Entertainment_System_(Model_NES-101)
// https://github.com/gregkrsak/first_nes
// Ricoh 2C02 - NES Picture Processing Unit (PPU)
// Ricoh RP2C02 (NTSC version) / RP2C07 (PAL version),
// https://en.wikipedia.org/wiki/Picture_Processing_Unit
// https://wiki.nesdev.com/w/index.php/PPU_registers
// http://nesdev.com/2C02%20technical%20reference.TXT
// Based on: https://github.com/gregkrsak/first_nes written by Greg M. Krsak, 2018.
// Upstart
// Nintendo Entertainment System (NES) ROM
// https://sadistech.com/nesromtool/romdoc.html
// https://forums.nesdev.com/viewtopic.php?f=2&t=9896
// https://github.com/gregkrsak/first_nes
.file [name="nes-demo.nes", type="bin", segments="NesRom"]
.file [name="nes-demo.nes_hdr", type="bin", segments="Header"]
.file [name="nes-demo.nes_prg", type="bin", segments="ProgramRom"]
.file [name="nes-demo.nes_chr", type="bin", segments="CharacterRom"]
.segmentdef Header [ start=$0000, min=$0000, max=$000f, fill ]
.segmentdef Tiles [ start=$0000, min=$0000, max=$1fff, fill ]
.segmentdef Code [ start=$c000, min=$c000, max=$fff9 ]
.segmentdef Data [ startAfter="Code", min=$c000, max=$fff9 ]
.segmentdef Vectors [ start=$fffa, min=$fffa, max=$ffff ]
.segmentdef GameRam [start=$200,max=$7ff, virtual]
.segmentdef ProgramRom [ segments="Code, Data, Vectors" ]
.segmentdef CharacterRom [ segments="Tiles" ]
.segmentdef NesRom
.segment NesRom
.segmentout [ segments="Header" ]
.segmentout [ segments="ProgramRom" ]
.segmentout [ segments="CharacterRom" ]
.segment Header
.text @"NES\$1a"
.byte $01 // 1x 16KB ROM (PRG)
.byte $01 // 1x 8KB VROM (CHR)
.byte %00000001 // Mapper nibble 0000 == No mapping (a simple 16KB PRG + 8KB CHR game)
// Mirroring nibble 0001 == Vertical mirroring only
.segment Code
// Global Constants & labels
// Standard Controller Right Button
.const JOY_RIGHT = 1
// Standard Controller Left Button
.const JOY_LEFT = 2
// Standard Controller Down Button
.const JOY_DOWN = 4
// Standard Controller Up Button
.const JOY_UP = 8
.const SIZEOF_STRUCT_SPRITEDATA = 4
.const OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = $10
.const OFFSET_STRUCT_RICOH_2C02_PPUMASK = 1
.const OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = 2
.const OFFSET_STRUCT_RICOH_2C02_OAMADDR = 3
.const OFFSET_STRUCT_RICOH_2A03_OAMDMA = $14
.const OFFSET_STRUCT_RICOH_2A03_JOY1 = $16
.const OFFSET_STRUCT_RICOH_2C02_PPUADDR = 6
.const OFFSET_STRUCT_RICOH_2C02_PPUDATA = 7
.const OFFSET_STRUCT_SPRITEDATA_X = 3
.const OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = 5
.const SIZEOF_BYTE = 1
// $2000-$23bf $03c0 Name table 0
.label PPU_NAME_TABLE_0 = $2000
// $23c0-$23ff $0040 Attribute table 0
.label PPU_ATTRIBUTE_TABLE_0 = $23c0
// $3000-$3eff $0f00 Mirrors of $2000-$2eff
// $3f00-$3f1f $0020 Palette RAM indexes
.label PPU_PALETTE = $3f00
// PPU Status Register for reading in ASM
.label PPU_PPUSTATUS = $2002
// APU Frame Counter
// generates low-frequency clocks for the channels and an optional 60 Hz interrupt.
// https://wiki.nesdev.com/w/index.php/APU_Frame_Counter
// ------+-----+---------------------------------------------------------------
// $4017 | W | FR_COUNTER Frame Counter Set mode and interrupt
// ------+-----+---------------------------------------------------------------
// | 7 | Sequencer mode: 0 selects 4-step sequence, 1 selects 5-step sequence
// | 6 | Interrupt inhibit flag. If set, the frame interrupt flag is cleared, otherwise it is unaffected.
// ------+-----+---------------------------------------------------------------
// Side effects After 3 or 4 CPU clock cycles*, the timer is reset.
// If the mode flag is set, then both "quarter frame" and "half frame" signals are also generated.
.label FR_COUNTER = $4017
// Pointer to the start of RAM memory
.label MEMORY = 0
// NES Picture Processing Unit (PPU)
.label PPU = $2000
// NES CPU and audion processing unit (APU)
.label APU = $4000
// @begin
__bbegin:
// [1] phi from @begin to @1 [phi:@begin->@1]
__b1_from___bbegin:
jmp __b1
// @1
__b1:
// [2] call main
// [4] phi from @1 to main [phi:@1->main]
main_from___b1:
jsr main
// [3] phi from @1 to @end [phi:@1->@end]
__bend_from___b1:
jmp __bend
// @end
__bend:
.segment Code
// main
// RESET Called when the NES is reset, including when it is turned on.
main: {
.label initNES1_waitForVBlank1___0 = $19
.label initNES1_waitForVBlank2___0 = $1a
.label initNES1_i = 2
.label x = 3
jmp initNES1
// main::initNES1
initNES1:
// asm { cld ldx#$ff txs }
cld
ldx #$ff
txs
jmp initNES1_disableVideoOutput1
// main::initNES1_disableVideoOutput1
initNES1_disableVideoOutput1:
// [6] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0
sta PPU
// [7] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK
jmp initNES1_disableAudioOutput1
// main::initNES1_disableAudioOutput1
initNES1_disableAudioOutput1:
// [8] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 -- _deref_pbuc1=vbuc2
lda #$40
sta FR_COUNTER
// [9] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 -- _deref_pbuc1=vbuc2
lda #$40
sta APU+OFFSET_STRUCT_RICOH_2A03_DMC_FREQ
jmp initNES1_clearVBlankFlag1
// main::initNES1_clearVBlankFlag1
initNES1_clearVBlankFlag1:
// asm { ldaPPU_PPUSTATUS }
lda PPU_PPUSTATUS
// [11] phi from main::initNES1_clearVBlankFlag1 to main::initNES1_waitForVBlank1 [phi:main::initNES1_clearVBlankFlag1->main::initNES1_waitForVBlank1]
initNES1_waitForVBlank1_from_initNES1_clearVBlankFlag1:
jmp initNES1_waitForVBlank1
// main::initNES1_waitForVBlank1
initNES1_waitForVBlank1:
jmp initNES1_waitForVBlank1___b1
// main::initNES1_waitForVBlank1_@1
initNES1_waitForVBlank1___b1:
// [12] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuz1=_deref_pbuc1_band_vbuc2
lda #$80
and PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS
sta.z initNES1_waitForVBlank1___0
// [13] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 -- vbuc1_eq_vbuz1_then_la1
lda #0
cmp.z initNES1_waitForVBlank1___0
beq initNES1_waitForVBlank1___b1
// [14] phi from main::initNES1_waitForVBlank1_@1 to main::initNES1_@1 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1]
initNES1___b1_from_initNES1_waitForVBlank1___b1:
// [14] phi (byte) main::initNES1_i#2 = (byte) 0 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1#0] -- vbuz1=vbuc1
lda #0
sta.z initNES1_i
jmp initNES1___b1
// [14] phi from main::initNES1_@1 to main::initNES1_@1 [phi:main::initNES1_@1->main::initNES1_@1]
initNES1___b1_from_initNES1___b1:
// [14] phi (byte) main::initNES1_i#2 = (byte) main::initNES1_i#1 [phi:main::initNES1_@1->main::initNES1_@1#0] -- register_copy
jmp initNES1___b1
// main::initNES1_@1
initNES1___b1:
// [15] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2
lda #0
ldy.z initNES1_i
sta MEMORY,y
// [16] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2
lda #0
ldy.z initNES1_i
sta MEMORY+$100,y
// [17] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2
lda #0
ldy.z initNES1_i
sta MEMORY+$200,y
// [18] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2
lda #0
ldy.z initNES1_i
sta MEMORY+$300,y
// [19] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2
lda #0
ldy.z initNES1_i
sta MEMORY+$400,y
// [20] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2
lda #0
ldy.z initNES1_i
sta MEMORY+$500,y
// [21] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2
lda #0
ldy.z initNES1_i
sta MEMORY+$600,y
// [22] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2
lda #0
ldy.z initNES1_i
sta MEMORY+$700,y
// [23] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 -- vbuz1=_inc_vbuz1
inc.z initNES1_i
// [24] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 -- vbuc1_neq_vbuz1_then_la1
lda #0
cmp.z initNES1_i
bne initNES1___b1_from_initNES1___b1
// [25] phi from main::initNES1_@1 to main::initNES1_waitForVBlank2 [phi:main::initNES1_@1->main::initNES1_waitForVBlank2]
initNES1_waitForVBlank2_from_initNES1___b1:
jmp initNES1_waitForVBlank2
// main::initNES1_waitForVBlank2
initNES1_waitForVBlank2:
jmp initNES1_waitForVBlank2___b1
// main::initNES1_waitForVBlank2_@1
initNES1_waitForVBlank2___b1:
// [26] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuz1=_deref_pbuc1_band_vbuc2
lda #$80
and PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS
sta.z initNES1_waitForVBlank2___0
// [27] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 -- vbuc1_eq_vbuz1_then_la1
lda #0
cmp.z initNES1_waitForVBlank2___0
beq initNES1_waitForVBlank2___b1
jmp initNES1___b7
// main::initNES1_@7
initNES1___b7:
// asm { ldaPPU_PPUSTATUS }
lda PPU_PPUSTATUS
// [29] phi from main::initNES1_@7 to main::@5 [phi:main::initNES1_@7->main::@5]
__b5_from_initNES1___b7:
jmp __b5
// main::@5
__b5:
// [30] call ppuDataTransfer
// Transfer the palette
// [84] phi from main::@5 to ppuDataTransfer [phi:main::@5->ppuDataTransfer]
ppuDataTransfer_from___b5:
jsr ppuDataTransfer
// [31] phi from main::@5 to main::@6 [phi:main::@5->main::@6]
__b6_from___b5:
jmp __b6
// main::@6
__b6:
// [32] call ppuDataFill
// Clear the name table
// [74] phi from main::@6 to ppuDataFill [phi:main::@6->ppuDataFill]
ppuDataFill_from___b6:
// [74] phi (byte) ppuDataFill::val#4 = (byte) $fc [phi:main::@6->ppuDataFill#0] -- vbuz1=vbuc1
lda #$fc
sta.z ppuDataFill.val
// [74] phi (word) ppuDataFill::size#3 = (word) $3c0 [phi:main::@6->ppuDataFill#1] -- vwuz1=vwuc1
lda #<$3c0
sta.z ppuDataFill.size
lda #>$3c0
sta.z ppuDataFill.size+1
// [74] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0 [phi:main::@6->ppuDataFill#2] -- pvoz1=pvoc1
lda #<PPU_NAME_TABLE_0
sta.z ppuDataFill.ppuDataPrepare1_ppuData
lda #>PPU_NAME_TABLE_0
sta.z ppuDataFill.ppuDataPrepare1_ppuData+1
jsr ppuDataFill
// [33] phi from main::@6 to main::@7 [phi:main::@6->main::@7]
__b7_from___b6:
jmp __b7
// main::@7
__b7:
// [34] call ppuDataFill
// Fill the PPU attribute table
// [74] phi from main::@7 to ppuDataFill [phi:main::@7->ppuDataFill]
ppuDataFill_from___b7:
// [74] phi (byte) ppuDataFill::val#4 = (byte) 0 [phi:main::@7->ppuDataFill#0] -- vbuz1=vbuc1
lda #0
sta.z ppuDataFill.val
// [74] phi (word) ppuDataFill::size#3 = (byte) $40 [phi:main::@7->ppuDataFill#1] -- vwuz1=vbuc1
lda #<$40
sta.z ppuDataFill.size
lda #>$40
sta.z ppuDataFill.size+1
// [74] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 [phi:main::@7->ppuDataFill#2] -- pvoz1=pvoc1
lda #<PPU_ATTRIBUTE_TABLE_0
sta.z ppuDataFill.ppuDataPrepare1_ppuData
lda #>PPU_ATTRIBUTE_TABLE_0
sta.z ppuDataFill.ppuDataPrepare1_ppuData+1
jsr ppuDataFill
// [35] phi from main::@7 to main::@1 [phi:main::@7->main::@1]
__b1_from___b7:
// [35] phi (byte) main::x#2 = (byte) 0 [phi:main::@7->main::@1#0] -- vbuz1=vbuc1
lda #0
sta.z x
jmp __b1
// Show floor
// main::@1
__b1:
// [36] if((byte) main::x#2<(byte) $20) goto main::@2 -- vbuz1_lt_vbuc1_then_la1
lda.z x
cmp #$20
bcc __b2
// [37] phi from main::@1 to main::@3 [phi:main::@1->main::@3]
__b3_from___b1:
jmp __b3
// main::@3
__b3:
// [38] call ppuDataPutTile
// Show flag
// [48] phi from main::@3 to ppuDataPutTile [phi:main::@3->ppuDataPutTile]
ppuDataPutTile_from___b3:
// [48] phi (byte*) ppuDataPutTile::tile#10 = (const byte*) FLAG [phi:main::@3->ppuDataPutTile#0] -- pbuz1=pbuc1
lda #<FLAG
sta.z ppuDataPutTile.tile
lda #>FLAG
sta.z ppuDataPutTile.tile+1
// [48] phi (nomodify void*) ppuDataPutTile::ppuData#2 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0+(word)(number) $12*(number) $20+(byte) $1c [phi:main::@3->ppuDataPutTile#1] -- pvoz1=pvoc1
lda #<PPU_NAME_TABLE_0+$12*$20+$1c
sta.z ppuDataPutTile.ppuData_1
lda #>PPU_NAME_TABLE_0+$12*$20+$1c
sta.z ppuDataPutTile.ppuData_1+1
jsr ppuDataPutTile
// [39] phi from main::@3 to main::@9 [phi:main::@3->main::@9]
__b9_from___b3:
jmp __b9
// main::@9
__b9:
// [40] call memcpy
// Initialize Sprite Buffer with the SPRITE data
// [67] phi from main::@9 to memcpy [phi:main::@9->memcpy]
memcpy_from___b9:
jsr memcpy
jmp enableVideoOutput1
// main::enableVideoOutput1
enableVideoOutput1:
// [41] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 -- _deref_pbuc1=vbuc2
lda #$80
sta PPU
// [42] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e -- _deref_pbuc1=vbuc2
lda #$1e
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK
// [43] phi from main::@4 main::enableVideoOutput1 to main::@4 [phi:main::@4/main::enableVideoOutput1->main::@4]
__b4_from___b4:
__b4_from_enableVideoOutput1:
jmp __b4
// Infinite loop
// main::@4
__b4:
jmp __b4_from___b4
// main::@2
__b2:
// [44] (nomodify byte*) ppuDataPutTile::ppuData#0 ← (const nomodify byte*) PPU_NAME_TABLE_0+(word)(number) $14*(number) $20 + (byte) main::x#2 -- pbuz1=pbuc1_plus_vbuz2
lda.z x
clc
adc #<PPU_NAME_TABLE_0+$14*$20
sta.z ppuDataPutTile.ppuData
lda #>PPU_NAME_TABLE_0+$14*$20
adc #0
sta.z ppuDataPutTile.ppuData+1
// [45] (nomodify void*) ppuDataPutTile::ppuData#9 ← (void*)(nomodify byte*) ppuDataPutTile::ppuData#0 -- pvoz1=pvoz2
lda.z ppuDataPutTile.ppuData
sta.z ppuDataPutTile.ppuData_1
lda.z ppuDataPutTile.ppuData+1
sta.z ppuDataPutTile.ppuData_1+1
// [46] call ppuDataPutTile
// [48] phi from main::@2 to ppuDataPutTile [phi:main::@2->ppuDataPutTile]
ppuDataPutTile_from___b2:
// [48] phi (byte*) ppuDataPutTile::tile#10 = (const byte*) FLOOR [phi:main::@2->ppuDataPutTile#0] -- pbuz1=pbuc1
lda #<FLOOR
sta.z ppuDataPutTile.tile
lda #>FLOOR
sta.z ppuDataPutTile.tile+1
// [48] phi (nomodify void*) ppuDataPutTile::ppuData#2 = (nomodify void*) ppuDataPutTile::ppuData#9 [phi:main::@2->ppuDataPutTile#1] -- register_copy
jsr ppuDataPutTile
jmp __b8
// main::@8
__b8:
// [47] (byte) main::x#1 ← (byte) main::x#2 + (byte) 2 -- vbuz1=vbuz1_plus_2
lda.z x
clc
adc #2
sta.z x
// [35] phi from main::@8 to main::@1 [phi:main::@8->main::@1]
__b1_from___b8:
// [35] phi (byte) main::x#2 = (byte) main::x#1 [phi:main::@8->main::@1#0] -- register_copy
jmp __b1
}
// ppuDataPutTile
// Transfer a 2x2 tile into the PPU memory
// - ppuData : Pointer in the PPU memory
// - tile : The tile to transfer
// ppuDataPutTile(byte* zp($1b) ppuData, byte* zp(6) tile)
ppuDataPutTile: {
.label ppuDataPrepare1___0 = $1d
.label ppuDataPrepare1___1 = $1e
.label ppuDataPrepare2___0 = $23
.label ppuDataPrepare2___1 = $24
.label ppuDataPut1_val = $1f
.label ppuDataPut2_val = $20
.label ppuDataPrepare2_ppuData = $21
.label ppuDataPut3_val = $25
.label ppuDataPut4_val = $26
.label ppuData = $1b
.label ppuData_1 = 4
.label tile = 6
jmp ppuDataPrepare1
// ppuDataPutTile::ppuDataPrepare1
ppuDataPrepare1:
// [49] (byte~) ppuDataPutTile::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataPutTile::ppuData#2 -- vbuz1=_hi_pvoz2
lda.z ppuData_1+1
sta.z ppuDataPrepare1___0
// [50] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$0 -- _deref_pbuc1=vbuz1
lda.z ppuDataPrepare1___0
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// [51] (byte~) ppuDataPutTile::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataPutTile::ppuData#2 -- vbuz1=_lo_pvoz2
lda.z ppuData_1
sta.z ppuDataPrepare1___1
// [52] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$1 -- _deref_pbuc1=vbuz1
lda.z ppuDataPrepare1___1
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
jmp __b1
// ppuDataPutTile::@1
__b1:
// [53] (byte) ppuDataPutTile::ppuDataPut1_val#0 ← *((byte*) ppuDataPutTile::tile#10) -- vbuz1=_deref_pbuz2
ldy #0
lda (tile),y
sta.z ppuDataPut1_val
jmp ppuDataPut1
// ppuDataPutTile::ppuDataPut1
ppuDataPut1:
// [54] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut1_val#0 -- _deref_pbuc1=vbuz1
lda.z ppuDataPut1_val
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
jmp __b2
// ppuDataPutTile::@2
__b2:
// [55] (byte) ppuDataPutTile::ppuDataPut2_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 1) -- vbuz1=pbuz2_derefidx_vbuc1
ldy #1
lda (tile),y
sta.z ppuDataPut2_val
jmp ppuDataPut2
// ppuDataPutTile::ppuDataPut2
ppuDataPut2:
// [56] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut2_val#0 -- _deref_pbuc1=vbuz1
lda.z ppuDataPut2_val
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
jmp __b3
// ppuDataPutTile::@3
__b3:
// [57] (nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 ← (byte*)(nomodify void*) ppuDataPutTile::ppuData#2 + (byte) $20 -- pbuz1=pbuz2_plus_vbuc1
lda #$20
clc
adc.z ppuData_1
sta.z ppuDataPrepare2_ppuData
lda #0
adc.z ppuData_1+1
sta.z ppuDataPrepare2_ppuData+1
jmp ppuDataPrepare2
// ppuDataPutTile::ppuDataPrepare2
ppuDataPrepare2:
// [58] (byte~) ppuDataPutTile::ppuDataPrepare2_$0 ← > (void*)(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 -- vbuz1=_hi_pvoz2
lda.z ppuDataPrepare2_ppuData+1
sta.z ppuDataPrepare2___0
// [59] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$0 -- _deref_pbuc1=vbuz1
lda.z ppuDataPrepare2___0
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// [60] (byte~) ppuDataPutTile::ppuDataPrepare2_$1 ← < (void*)(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 -- vbuz1=_lo_pvoz2
lda.z ppuDataPrepare2_ppuData
sta.z ppuDataPrepare2___1
// [61] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$1 -- _deref_pbuc1=vbuz1
lda.z ppuDataPrepare2___1
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
jmp __b4
// ppuDataPutTile::@4
__b4:
// [62] (byte) ppuDataPutTile::ppuDataPut3_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 2) -- vbuz1=pbuz2_derefidx_vbuc1
ldy #2
lda (tile),y
sta.z ppuDataPut3_val
jmp ppuDataPut3
// ppuDataPutTile::ppuDataPut3
ppuDataPut3:
// [63] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut3_val#0 -- _deref_pbuc1=vbuz1
lda.z ppuDataPut3_val
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
jmp __b5
// ppuDataPutTile::@5
__b5:
// [64] (byte) ppuDataPutTile::ppuDataPut4_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 3) -- vbuz1=pbuz2_derefidx_vbuc1
ldy #3
lda (tile),y
sta.z ppuDataPut4_val
jmp ppuDataPut4
// ppuDataPutTile::ppuDataPut4
ppuDataPut4:
// [65] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut4_val#0 -- _deref_pbuc1=vbuz1
lda.z ppuDataPut4_val
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
jmp __breturn
// ppuDataPutTile::@return
__breturn:
// [66] return
rts
}
// memcpy
// Copy block of memory (forwards)
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
memcpy: {
.const num = 8*SIZEOF_STRUCT_SPRITEDATA
.label destination = SPRITE_BUFFER
.label source = SPRITES
.label src_end = source+num
.label dst = $a
.label src = 8
// [68] phi from memcpy to memcpy::@1 [phi:memcpy->memcpy::@1]
__b1_from_memcpy:
// [68] phi (byte*) memcpy::dst#2 = (byte*)(const void*) memcpy::destination#0 [phi:memcpy->memcpy::@1#0] -- pbuz1=pbuc1
lda #<destination
sta.z dst
lda #>destination
sta.z dst+1
// [68] phi (byte*) memcpy::src#2 = (byte*)(const void*) memcpy::source#0 [phi:memcpy->memcpy::@1#1] -- pbuz1=pbuc1
lda #<source
sta.z src
lda #>source
sta.z src+1
jmp __b1
// memcpy::@1
__b1:
// [69] if((byte*) memcpy::src#2!=(const byte*) memcpy::src_end#0) goto memcpy::@2 -- pbuz1_neq_pbuc1_then_la1
lda.z src+1
cmp #>src_end
bne __b2
lda.z src
cmp #<src_end
bne __b2
jmp __breturn
// memcpy::@return
__breturn:
// [70] return
rts
// memcpy::@2
__b2:
// [71] *((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#2) -- _deref_pbuz1=_deref_pbuz2
ldy #0
lda (src),y
ldy #0
sta (dst),y
// [72] (byte*) memcpy::dst#1 ← ++ (byte*) memcpy::dst#2 -- pbuz1=_inc_pbuz1
inc.z dst
bne !+
inc.z dst+1
!:
// [73] (byte*) memcpy::src#1 ← ++ (byte*) memcpy::src#2 -- pbuz1=_inc_pbuz1
inc.z src
bne !+
inc.z src+1
!:
// [68] phi from memcpy::@2 to memcpy::@1 [phi:memcpy::@2->memcpy::@1]
__b1_from___b2:
// [68] phi (byte*) memcpy::dst#2 = (byte*) memcpy::dst#1 [phi:memcpy::@2->memcpy::@1#0] -- register_copy
// [68] phi (byte*) memcpy::src#2 = (byte*) memcpy::src#1 [phi:memcpy::@2->memcpy::@1#1] -- register_copy
jmp __b1
}
// ppuDataFill
// Fill a number of bytes in the PPU memory
// - ppuData : Pointer in the PPU memory
// - size : The number of bytes to transfer
// ppuDataFill(byte zp($10) val, word zp($e) size)
ppuDataFill: {
.label ppuDataPrepare1___0 = $27
.label ppuDataPrepare1___1 = $28
.label ppuDataPrepare1_ppuData = $c
.label i = $11
.label size = $e
.label val = $10
jmp ppuDataPrepare1
// ppuDataFill::ppuDataPrepare1
ppuDataPrepare1:
// [75] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuz1=_hi_pvoz2
lda.z ppuDataPrepare1_ppuData+1
sta.z ppuDataPrepare1___0
// [76] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 -- _deref_pbuc1=vbuz1
lda.z ppuDataPrepare1___0
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// [77] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuz1=_lo_pvoz2
lda.z ppuDataPrepare1_ppuData
sta.z ppuDataPrepare1___1
// [78] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$1 -- _deref_pbuc1=vbuz1
lda.z ppuDataPrepare1___1
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// [79] phi from ppuDataFill::ppuDataPrepare1 to ppuDataFill::@1 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1]
__b1_from_ppuDataPrepare1:
// [79] phi (word) ppuDataFill::i#2 = (word) 0 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1#0] -- vwuz1=vwuc1
lda #<0
sta.z i
lda #>0
sta.z i+1
jmp __b1
// Transfer to PPU
// ppuDataFill::@1
__b1:
// [80] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 -- vwuz1_lt_vwuz2_then_la1
lda.z i+1
cmp.z size+1
bcc ppuDataPut1
bne !+
lda.z i
cmp.z size
bcc ppuDataPut1
!:
jmp __breturn
// ppuDataFill::@return
__breturn:
// [81] return
rts
// ppuDataFill::ppuDataPut1
ppuDataPut1:
// [82] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4 -- _deref_pbuc1=vbuz1
lda.z val
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
jmp __b2
// ppuDataFill::@2
__b2:
// [83] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2 -- vwuz1=_inc_vwuz1
inc.z i
bne !+
inc.z i+1
!:
// [79] phi from ppuDataFill::@2 to ppuDataFill::@1 [phi:ppuDataFill::@2->ppuDataFill::@1]
__b1_from___b2:
// [79] phi (word) ppuDataFill::i#2 = (word) ppuDataFill::i#1 [phi:ppuDataFill::@2->ppuDataFill::@1#0] -- register_copy
jmp __b1
}
// ppuDataTransfer
// Transfer a number of bytes from the CPU memory to the PPU memory
// - cpuData : Pointer to the CPU memory (RAM of ROM)
// - ppuData : Pointer in the PPU memory
// - size : The number of bytes to transfer
ppuDataTransfer: {
.const size = $20*SIZEOF_BYTE
.label ppuData = PPU_PALETTE
.label cpuData = PALETTE
.label ppuDataPut1_val = $29
// Transfer to PPU
.label cpuSrc = $15
.label i = $13
jmp ppuDataPrepare1
// ppuDataTransfer::ppuDataPrepare1
ppuDataPrepare1:
// [85] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 -- _deref_pbuc1=vbuc2
lda #>ppuData
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// [86] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// [87] phi from ppuDataTransfer::ppuDataPrepare1 to ppuDataTransfer::@1 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1]
__b1_from_ppuDataPrepare1:
// [87] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#0] -- pbuz1=pbuc1
lda #<cpuData
sta.z cpuSrc
lda #>cpuData
sta.z cpuSrc+1
// [87] phi (word) ppuDataTransfer::i#2 = (word) 0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#1] -- vwuz1=vwuc1
lda #<0
sta.z i
lda #>0
sta.z i+1
jmp __b1
// ppuDataTransfer::@1
__b1:
// [88] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 -- vwuz1_lt_vwuc1_then_la1
lda.z i+1
cmp #>size
bcc __b2
bne !+
lda.z i
cmp #<size
bcc __b2
!:
jmp __breturn
// ppuDataTransfer::@return
__breturn:
// [89] return
rts
// ppuDataTransfer::@2
__b2:
// [90] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) -- vbuz1=_deref_pbuz2
ldy #0
lda (cpuSrc),y
sta.z ppuDataPut1_val
jmp ppuDataPut1
// ppuDataTransfer::ppuDataPut1
ppuDataPut1:
// [91] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 -- _deref_pbuc1=vbuz1
lda.z ppuDataPut1_val
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
jmp __b3
// ppuDataTransfer::@3
__b3:
// [92] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 -- pbuz1=_inc_pbuz1
inc.z cpuSrc
bne !+
inc.z cpuSrc+1
!:
// [93] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2 -- vwuz1=_inc_vwuz1
inc.z i
bne !+
inc.z i+1
!:
// [87] phi from ppuDataTransfer::@3 to ppuDataTransfer::@1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1]
__b1_from___b3:
// [87] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*) ppuDataTransfer::cpuSrc#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#0] -- register_copy
// [87] phi (word) ppuDataTransfer::i#2 = (word) ppuDataTransfer::i#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#1] -- register_copy
jmp __b1
}
// vblank
// NMI Called when the PPU refreshes the screen (also known as the V-Blank period)
vblank: {
.label __1 = $2c
.label __3 = $2d
.label __5 = $2e
.label __7 = $2f
.label joy = $2b
// entry interrupt(HARDWARE_STACK)
pha
txa
pha
tya
pha
// [95] call readJoy1
jsr readJoy1
// [96] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2 -- vbuz1=vbuz2
lda.z readJoy1.joy
sta.z readJoy1.return
jmp __b9
// vblank::@9
__b9:
// [97] (byte) vblank::joy#0 ← (byte) readJoy1::return#2 -- vbuz1=vbuz2
lda.z readJoy1.return
sta.z joy
// [98] (byte~) vblank::$1 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN -- vbuz1=vbuz2_band_vbuc1
lda #JOY_DOWN
and.z joy
sta.z __1
// [99] if((byte) 0==(byte~) vblank::$1) goto vblank::@1 -- vbuc1_eq_vbuz1_then_la1
lda #0
cmp.z __1
beq __b1
jmp __b4
// vblank::@4
__b4:
// [100] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER
// [101] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+1*SIZEOF_STRUCT_SPRITEDATA
// [102] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+2*SIZEOF_STRUCT_SPRITEDATA
// [103] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+3*SIZEOF_STRUCT_SPRITEDATA
jmp __b1
// vblank::@1
__b1:
// [104] (byte~) vblank::$3 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP -- vbuz1=vbuz2_band_vbuc1
lda #JOY_UP
and.z joy
sta.z __3
// [105] if((byte) 0==(byte~) vblank::$3) goto vblank::@2 -- vbuc1_eq_vbuz1_then_la1
lda #0
cmp.z __3
beq __b2
jmp __b5
// vblank::@5
__b5:
// [106] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER
// [107] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+1*SIZEOF_STRUCT_SPRITEDATA
// [108] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+2*SIZEOF_STRUCT_SPRITEDATA
// [109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+3*SIZEOF_STRUCT_SPRITEDATA
jmp __b2
// vblank::@2
__b2:
// [110] (byte~) vblank::$5 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_LEFT -- vbuz1=vbuz2_band_vbuc1
lda #JOY_LEFT
and.z joy
sta.z __5
// [111] if((byte) 0==(byte~) vblank::$5) goto vblank::@3 -- vbuc1_eq_vbuz1_then_la1
lda #0
cmp.z __5
beq __b3
jmp __b6
// vblank::@6
__b6:
// [112] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X
// [113] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+1*SIZEOF_STRUCT_SPRITEDATA
// [114] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+2*SIZEOF_STRUCT_SPRITEDATA
// [115] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+3*SIZEOF_STRUCT_SPRITEDATA
jmp __b3
// vblank::@3
__b3:
// [116] (byte~) vblank::$7 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_RIGHT -- vbuz1=vbuz2_band_vbuc1
lda #JOY_RIGHT
and.z joy
sta.z __7
// [117] if((byte) 0==(byte~) vblank::$7) goto vblank::ppuSpriteBufferDmaTransfer1 -- vbuc1_eq_vbuz1_then_la1
lda #0
cmp.z __7
beq ppuSpriteBufferDmaTransfer1
jmp __b7
// vblank::@7
__b7:
// [118] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X
// [119] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+1*SIZEOF_STRUCT_SPRITEDATA
// [120] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+2*SIZEOF_STRUCT_SPRITEDATA
// [121] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+3*SIZEOF_STRUCT_SPRITEDATA
jmp ppuSpriteBufferDmaTransfer1
// vblank::ppuSpriteBufferDmaTransfer1
ppuSpriteBufferDmaTransfer1:
// [122] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0
sta PPU+OFFSET_STRUCT_RICOH_2C02_OAMADDR
// [123] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER -- _deref_pbuc1=vbuc2
lda #>SPRITE_BUFFER
sta APU+OFFSET_STRUCT_RICOH_2A03_OAMDMA
jmp __b8
// vblank::@8
__b8:
// [124] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2
// Set scroll
lda #0
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL
// [125] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) -8 -- _deref_pbuc1=vbuc2
lda #-8
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL
jmp __breturn
// vblank::@return
__breturn:
// [126] return - exit interrupt(HARDWARE_STACK)
pla
tay
pla
tax
pla
rti
}
// readJoy1
// Read Standard Controller #1
// Returns a byte representing the pushed buttons
// - bit 0: right
// - bit 1: left
// - bit 2: down
// - bit 3: up
// - bit 4: start
// - bit 5: select
// - bit 6: B
// - bit 7: A
readJoy1: {
.label __1 = $30
.label __2 = $31
.label joy = $18
.label i = $17
.label return = $2a
// [127] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1 -- _deref_pbuc1=vbuc2
// Latch the controller buttons
lda #1
sta APU+OFFSET_STRUCT_RICOH_2A03_JOY1
// [128] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0
sta APU+OFFSET_STRUCT_RICOH_2A03_JOY1
// [129] phi from readJoy1 to readJoy1::@1 [phi:readJoy1->readJoy1::@1]
__b1_from_readJoy1:
// [129] phi (byte) readJoy1::joy#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#0] -- vbuz1=vbuc1
lda #0
sta.z joy
// [129] phi (byte) readJoy1::i#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#1] -- vbuz1=vbuc1
lda #0
sta.z i
jmp __b1
// readJoy1::@1
__b1:
// [130] if((byte) readJoy1::i#2<(byte) 8) goto readJoy1::@2 -- vbuz1_lt_vbuc1_then_la1
lda.z i
cmp #8
bcc __b2
jmp __breturn
// readJoy1::@return
__breturn:
// [131] return
rts
// readJoy1::@2
__b2:
// [132] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 -- vbuz1=vbuz2_rol_1
lda.z joy
asl
sta.z __1
// [133] (byte~) readJoy1::$2 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1 -- vbuz1=_deref_pbuc1_band_vbuc2
lda #1
and APU+OFFSET_STRUCT_RICOH_2A03_JOY1
sta.z __2
// [134] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2 -- vbuz1=vbuz2_bor_vbuz3
lda.z __1
ora.z __2
sta.z joy
// [135] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2 -- vbuz1=_inc_vbuz1
inc.z i
// [129] phi from readJoy1::@2 to readJoy1::@1 [phi:readJoy1::@2->readJoy1::@1]
__b1_from___b2:
// [129] phi (byte) readJoy1::joy#2 = (byte) readJoy1::joy#1 [phi:readJoy1::@2->readJoy1::@1#0] -- register_copy
// [129] phi (byte) readJoy1::i#2 = (byte) readJoy1::i#1 [phi:readJoy1::@2->readJoy1::@1#1] -- register_copy
jmp __b1
}
// File Data
.segment Data
// Flag tile
FLAG: .byte $54, $55, $56, $57
// Floor tile
FLOOR: .byte $85, $85, $86, $86
// Sprite Data
SPRITES: .byte $96, $36, 2, $c, $96, $37, 2, $14, $9e, $38, 2, $c, $9e, $39, 2, $14, $96, $70, 0, $48, $96, $71, 0, $50, $9e, $72, 1, $48, $9e, $73, 1, $50
// Color Palette
PALETTE: .byte $11, $2d, 8, $18, $11, 6, $15, $36, $11, $39, $4a, $5b, $f, $3d, $4e, $5f, $11, $f, $30, 8, $11, $f, $18, 8, $11, $30, $37, $1a, $f, $f, $f, $f
.segment Tiles
TILES:
.import binary "smb1_chr.bin"
.segment GameRam
.align $100
SPRITE_BUFFER: .fill 4*$40, 0
.segment Vectors
VECTORS: .word vblank, main, 0
REGISTER UPLIFT POTENTIAL REGISTERS
Statement asm { cld ldx#$ff txs } always clobbers reg byte x
Statement [6] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 [ ] ( [ ] { } main:2 [ ] { } ) always clobbers reg byte a
Statement [7] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 [ ] ( [ ] { } main:2 [ ] { } ) always clobbers reg byte a
Statement [8] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 [ ] ( [ ] { } main:2 [ ] { } ) always clobbers reg byte a
Statement [9] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 [ ] ( [ ] { } main:2 [ ] { } ) always clobbers reg byte a
Statement asm { ldaPPU_PPUSTATUS } always clobbers reg byte a
Statement [12] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ main::initNES1_waitForVBlank1_$0 ] ( [ main::initNES1_waitForVBlank1_$0 ] { } main:2 [ main::initNES1_waitForVBlank1_$0 ] { } ) always clobbers reg byte a
Statement [15] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::initNES1_i#2 main::initNES1_i#1 ]
Statement [16] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Statement [17] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Statement [18] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Statement [19] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Statement [20] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Statement [21] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Statement [22] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Statement [26] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ main::initNES1_waitForVBlank2_$0 ] ( [ main::initNES1_waitForVBlank2_$0 ] { } main:2 [ main::initNES1_waitForVBlank2_$0 ] { } ) always clobbers reg byte a
Statement asm { ldaPPU_PPUSTATUS } always clobbers reg byte a
Statement [41] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 [ ] ( [ ] { } main:2 [ ] { } ) always clobbers reg byte a
Statement [42] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e [ ] ( [ ] { } main:2 [ ] { } ) always clobbers reg byte a
Statement [44] (nomodify byte*) ppuDataPutTile::ppuData#0 ← (const nomodify byte*) PPU_NAME_TABLE_0+(word)(number) $14*(number) $20 + (byte) main::x#2 [ main::x#2 ppuDataPutTile::ppuData#0 ] ( [ main::x#2 ppuDataPutTile::ppuData#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } main:2 [ main::x#2 ppuDataPutTile::ppuData#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::x#2 main::x#1 ]
Statement [45] (nomodify void*) ppuDataPutTile::ppuData#9 ← (void*)(nomodify byte*) ppuDataPutTile::ppuData#0 [ main::x#2 ppuDataPutTile::ppuData#9 ] ( [ main::x#2 ppuDataPutTile::ppuData#9 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } main:2 [ main::x#2 ppuDataPutTile::ppuData#9 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } ) always clobbers reg byte a
Statement [53] (byte) ppuDataPutTile::ppuDataPut1_val#0 ← *((byte*) ppuDataPutTile::tile#10) [ ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut1_val#0 ] ( ppuDataPutTile:38 [ ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut1_val#0 ] { } main:2::ppuDataPutTile:38 [ ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut1_val#0 ] { } ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut1_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } main:2::ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut1_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } ) always clobbers reg byte a reg byte y
Removing always clobbered register reg byte y as potential for zp[1]:3 [ main::x#2 main::x#1 ]
Statement [55] (byte) ppuDataPutTile::ppuDataPut2_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 1) [ ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut2_val#0 ] ( ppuDataPutTile:38 [ ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut2_val#0 ] { } main:2::ppuDataPutTile:38 [ ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut2_val#0 ] { } ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut2_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } main:2::ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut2_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } ) always clobbers reg byte a reg byte y
Statement [57] (nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 ← (byte*)(nomodify void*) ppuDataPutTile::ppuData#2 + (byte) $20 [ ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] ( ppuDataPutTile:38 [ ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] { } main:2::ppuDataPutTile:38 [ ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] { } ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } main:2::ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } ) always clobbers reg byte a
Statement [62] (byte) ppuDataPutTile::ppuDataPut3_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 2) [ ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut3_val#0 ] ( ppuDataPutTile:38 [ ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut3_val#0 ] { } main:2::ppuDataPutTile:38 [ ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut3_val#0 ] { } ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut3_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } main:2::ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut3_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } ) always clobbers reg byte a reg byte y
Statement [64] (byte) ppuDataPutTile::ppuDataPut4_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 3) [ ppuDataPutTile::ppuDataPut4_val#0 ] ( ppuDataPutTile:38 [ ppuDataPutTile::ppuDataPut4_val#0 ] { } main:2::ppuDataPutTile:38 [ ppuDataPutTile::ppuDataPut4_val#0 ] { } ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::ppuDataPut4_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } main:2::ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::ppuDataPut4_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } ) always clobbers reg byte a reg byte y
Statement [69] if((byte*) memcpy::src#2!=(const byte*) memcpy::src_end#0) goto memcpy::@2 [ memcpy::src#2 memcpy::dst#2 ] ( memcpy:40 [ memcpy::src#2 memcpy::dst#2 ] { } main:2::memcpy:40 [ memcpy::src#2 memcpy::dst#2 ] { } ) always clobbers reg byte a
Statement [71] *((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#2) [ memcpy::src#2 memcpy::dst#2 ] ( memcpy:40 [ memcpy::src#2 memcpy::dst#2 ] { } main:2::memcpy:40 [ memcpy::src#2 memcpy::dst#2 ] { } ) always clobbers reg byte a reg byte y
Statement [80] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] ( ppuDataFill:32 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } main:2::ppuDataFill:32 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } ppuDataFill:34 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } main:2::ppuDataFill:34 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:16 [ ppuDataFill::val#4 ]
Statement [85] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 [ ] ( ppuDataTransfer:30 [ ] { } main:2::ppuDataTransfer:30 [ ] { } ) always clobbers reg byte a
Statement [86] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 [ ] ( ppuDataTransfer:30 [ ] { } main:2::ppuDataTransfer:30 [ ] { } ) always clobbers reg byte a
Statement [88] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] ( ppuDataTransfer:30 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } main:2::ppuDataTransfer:30 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } ) always clobbers reg byte a
Statement [90] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] ( ppuDataTransfer:30 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } main:2::ppuDataTransfer:30 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } ) always clobbers reg byte a reg byte y
Statement [122] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [123] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER [ ] ( [ ] { } ) always clobbers reg byte a
Statement [124] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [125] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) -8 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [126] return [ ] ( [ ] { } ) always clobbers reg byte a reg byte x reg byte y
Statement [127] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1 [ ] ( readJoy1:95 [ ] { { readJoy1::return#2 = readJoy1::joy#2 } } ) always clobbers reg byte a
Statement [128] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0 [ ] ( readJoy1:95 [ ] { { readJoy1::return#2 = readJoy1::joy#2 } } ) always clobbers reg byte a
Statement [132] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 [ readJoy1::i#2 readJoy1::$1 ] ( readJoy1:95 [ readJoy1::i#2 readJoy1::$1 ] { { readJoy1::return#2 = readJoy1::joy#2 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:23 [ readJoy1::i#2 readJoy1::i#1 ]
Statement [133] (byte~) readJoy1::$2 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1 [ readJoy1::i#2 readJoy1::$1 readJoy1::$2 ] ( readJoy1:95 [ readJoy1::i#2 readJoy1::$1 readJoy1::$2 ] { { readJoy1::return#2 = readJoy1::joy#2 } } ) always clobbers reg byte a
Removing always clobbered register reg byte a as potential for zp[1]:48 [ readJoy1::$1 ]
Statement asm { cld ldx#$ff txs } always clobbers reg byte x
Statement [6] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 [ ] ( [ ] { } main:2 [ ] { } ) always clobbers reg byte a
Statement [7] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 [ ] ( [ ] { } main:2 [ ] { } ) always clobbers reg byte a
Statement [8] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 [ ] ( [ ] { } main:2 [ ] { } ) always clobbers reg byte a
Statement [9] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 [ ] ( [ ] { } main:2 [ ] { } ) always clobbers reg byte a
Statement asm { ldaPPU_PPUSTATUS } always clobbers reg byte a
Statement [12] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ main::initNES1_waitForVBlank1_$0 ] ( [ main::initNES1_waitForVBlank1_$0 ] { } main:2 [ main::initNES1_waitForVBlank1_$0 ] { } ) always clobbers reg byte a
Statement [15] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Statement [16] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Statement [17] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Statement [18] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Statement [19] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Statement [20] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Statement [21] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Statement [22] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:2 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a
Statement [26] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ main::initNES1_waitForVBlank2_$0 ] ( [ main::initNES1_waitForVBlank2_$0 ] { } main:2 [ main::initNES1_waitForVBlank2_$0 ] { } ) always clobbers reg byte a
Statement asm { ldaPPU_PPUSTATUS } always clobbers reg byte a
Statement [41] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 [ ] ( [ ] { } main:2 [ ] { } ) always clobbers reg byte a
Statement [42] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e [ ] ( [ ] { } main:2 [ ] { } ) always clobbers reg byte a
Statement [44] (nomodify byte*) ppuDataPutTile::ppuData#0 ← (const nomodify byte*) PPU_NAME_TABLE_0+(word)(number) $14*(number) $20 + (byte) main::x#2 [ main::x#2 ppuDataPutTile::ppuData#0 ] ( [ main::x#2 ppuDataPutTile::ppuData#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } main:2 [ main::x#2 ppuDataPutTile::ppuData#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } ) always clobbers reg byte a
Statement [45] (nomodify void*) ppuDataPutTile::ppuData#9 ← (void*)(nomodify byte*) ppuDataPutTile::ppuData#0 [ main::x#2 ppuDataPutTile::ppuData#9 ] ( [ main::x#2 ppuDataPutTile::ppuData#9 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } main:2 [ main::x#2 ppuDataPutTile::ppuData#9 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } ) always clobbers reg byte a
Statement [53] (byte) ppuDataPutTile::ppuDataPut1_val#0 ← *((byte*) ppuDataPutTile::tile#10) [ ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut1_val#0 ] ( ppuDataPutTile:38 [ ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut1_val#0 ] { } main:2::ppuDataPutTile:38 [ ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut1_val#0 ] { } ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut1_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } main:2::ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut1_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } ) always clobbers reg byte a reg byte y
Statement [55] (byte) ppuDataPutTile::ppuDataPut2_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 1) [ ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut2_val#0 ] ( ppuDataPutTile:38 [ ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut2_val#0 ] { } main:2::ppuDataPutTile:38 [ ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut2_val#0 ] { } ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut2_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } main:2::ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::ppuData#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut2_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } ) always clobbers reg byte a reg byte y
Statement [57] (nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 ← (byte*)(nomodify void*) ppuDataPutTile::ppuData#2 + (byte) $20 [ ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] ( ppuDataPutTile:38 [ ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] { } main:2::ppuDataPutTile:38 [ ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] { } ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } main:2::ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } ) always clobbers reg byte a
Statement [62] (byte) ppuDataPutTile::ppuDataPut3_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 2) [ ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut3_val#0 ] ( ppuDataPutTile:38 [ ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut3_val#0 ] { } main:2::ppuDataPutTile:38 [ ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut3_val#0 ] { } ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut3_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } main:2::ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::tile#10 ppuDataPutTile::ppuDataPut3_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } ) always clobbers reg byte a reg byte y
Statement [64] (byte) ppuDataPutTile::ppuDataPut4_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 3) [ ppuDataPutTile::ppuDataPut4_val#0 ] ( ppuDataPutTile:38 [ ppuDataPutTile::ppuDataPut4_val#0 ] { } main:2::ppuDataPutTile:38 [ ppuDataPutTile::ppuDataPut4_val#0 ] { } ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::ppuDataPut4_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } main:2::ppuDataPutTile:46 [ main::x#2 ppuDataPutTile::ppuDataPut4_val#0 ] { { ppuDataPutTile::ppuData#2 = ppuDataPutTile::ppuData#9 } } ) always clobbers reg byte a reg byte y
Statement [69] if((byte*) memcpy::src#2!=(const byte*) memcpy::src_end#0) goto memcpy::@2 [ memcpy::src#2 memcpy::dst#2 ] ( memcpy:40 [ memcpy::src#2 memcpy::dst#2 ] { } main:2::memcpy:40 [ memcpy::src#2 memcpy::dst#2 ] { } ) always clobbers reg byte a
Statement [71] *((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#2) [ memcpy::src#2 memcpy::dst#2 ] ( memcpy:40 [ memcpy::src#2 memcpy::dst#2 ] { } main:2::memcpy:40 [ memcpy::src#2 memcpy::dst#2 ] { } ) always clobbers reg byte a reg byte y
Statement [80] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] ( ppuDataFill:32 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } main:2::ppuDataFill:32 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } ppuDataFill:34 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } main:2::ppuDataFill:34 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } ) always clobbers reg byte a
Statement [85] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 [ ] ( ppuDataTransfer:30 [ ] { } main:2::ppuDataTransfer:30 [ ] { } ) always clobbers reg byte a
Statement [86] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 [ ] ( ppuDataTransfer:30 [ ] { } main:2::ppuDataTransfer:30 [ ] { } ) always clobbers reg byte a
Statement [88] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] ( ppuDataTransfer:30 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } main:2::ppuDataTransfer:30 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } ) always clobbers reg byte a
Statement [90] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] ( ppuDataTransfer:30 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } main:2::ppuDataTransfer:30 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } ) always clobbers reg byte a reg byte y
Statement [122] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [123] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER [ ] ( [ ] { } ) always clobbers reg byte a
Statement [124] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [125] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) -8 [ ] ( [ ] { } ) always clobbers reg byte a
Statement [126] return [ ] ( [ ] { } ) always clobbers reg byte a reg byte x reg byte y
Statement [127] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1 [ ] ( readJoy1:95 [ ] { { readJoy1::return#2 = readJoy1::joy#2 } } ) always clobbers reg byte a
Statement [128] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0 [ ] ( readJoy1:95 [ ] { { readJoy1::return#2 = readJoy1::joy#2 } } ) always clobbers reg byte a
Statement [132] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 [ readJoy1::i#2 readJoy1::$1 ] ( readJoy1:95 [ readJoy1::i#2 readJoy1::$1 ] { { readJoy1::return#2 = readJoy1::joy#2 } } ) always clobbers reg byte a
Statement [133] (byte~) readJoy1::$2 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1 [ readJoy1::i#2 readJoy1::$1 readJoy1::$2 ] ( readJoy1:95 [ readJoy1::i#2 readJoy1::$1 readJoy1::$2 ] { { readJoy1::return#2 = readJoy1::joy#2 } } ) always clobbers reg byte a
Potential registers zp[1]:2 [ main::initNES1_i#2 main::initNES1_i#1 ] : zp[1]:2 , reg byte x , reg byte y ,
Potential registers zp[1]:3 [ main::x#2 main::x#1 ] : zp[1]:3 , reg byte x ,
Potential registers zp[2]:4 [ ppuDataPutTile::ppuData#2 ppuDataPutTile::ppuData#9 ] : zp[2]:4 ,
Potential registers zp[2]:6 [ ppuDataPutTile::tile#10 ] : zp[2]:6 ,
Potential registers zp[2]:8 [ memcpy::src#2 memcpy::src#1 ] : zp[2]:8 ,
Potential registers zp[2]:10 [ memcpy::dst#2 memcpy::dst#1 ] : zp[2]:10 ,
Potential registers zp[2]:12 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ] : zp[2]:12 ,
Potential registers zp[2]:14 [ ppuDataFill::size#3 ] : zp[2]:14 ,
Potential registers zp[1]:16 [ ppuDataFill::val#4 ] : zp[1]:16 , reg byte x , reg byte y ,
Potential registers zp[2]:17 [ ppuDataFill::i#2 ppuDataFill::i#1 ] : zp[2]:17 ,
Potential registers zp[2]:19 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] : zp[2]:19 ,
Potential registers zp[2]:21 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ] : zp[2]:21 ,
Potential registers zp[1]:23 [ readJoy1::i#2 readJoy1::i#1 ] : zp[1]:23 , reg byte x , reg byte y ,
Potential registers zp[1]:24 [ readJoy1::joy#2 readJoy1::joy#1 ] : zp[1]:24 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:25 [ main::initNES1_waitForVBlank1_$0 ] : zp[1]:25 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:26 [ main::initNES1_waitForVBlank2_$0 ] : zp[1]:26 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[2]:27 [ ppuDataPutTile::ppuData#0 ] : zp[2]:27 ,
Potential registers zp[1]:29 [ ppuDataPutTile::ppuDataPrepare1_$0 ] : zp[1]:29 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:30 [ ppuDataPutTile::ppuDataPrepare1_$1 ] : zp[1]:30 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:31 [ ppuDataPutTile::ppuDataPut1_val#0 ] : zp[1]:31 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:32 [ ppuDataPutTile::ppuDataPut2_val#0 ] : zp[1]:32 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[2]:33 [ ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] : zp[2]:33 ,
Potential registers zp[1]:35 [ ppuDataPutTile::ppuDataPrepare2_$0 ] : zp[1]:35 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:36 [ ppuDataPutTile::ppuDataPrepare2_$1 ] : zp[1]:36 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:37 [ ppuDataPutTile::ppuDataPut3_val#0 ] : zp[1]:37 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:38 [ ppuDataPutTile::ppuDataPut4_val#0 ] : zp[1]:38 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:39 [ ppuDataFill::ppuDataPrepare1_$0 ] : zp[1]:39 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:40 [ ppuDataFill::ppuDataPrepare1_$1 ] : zp[1]:40 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:41 [ ppuDataTransfer::ppuDataPut1_val#0 ] : zp[1]:41 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:42 [ readJoy1::return#2 ] : zp[1]:42 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:43 [ vblank::joy#0 ] : zp[1]:43 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:44 [ vblank::$1 ] : zp[1]:44 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:45 [ vblank::$3 ] : zp[1]:45 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:46 [ vblank::$5 ] : zp[1]:46 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:47 [ vblank::$7 ] : zp[1]:47 , reg byte a , reg byte x , reg byte y ,
Potential registers zp[1]:48 [ readJoy1::$1 ] : zp[1]:48 , reg byte x , reg byte y ,
Potential registers zp[1]:49 [ readJoy1::$2 ] : zp[1]:49 , reg byte a , reg byte x , reg byte y ,
REGISTER UPLIFT SCOPES
Uplift Scope [ppuDataPutTile] 2,002: zp[1]:29 [ ppuDataPutTile::ppuDataPrepare1_$0 ] 2,002: zp[1]:30 [ ppuDataPutTile::ppuDataPrepare1_$1 ] 2,002: zp[1]:31 [ ppuDataPutTile::ppuDataPut1_val#0 ] 2,002: zp[1]:32 [ ppuDataPutTile::ppuDataPut2_val#0 ] 2,002: zp[1]:35 [ ppuDataPutTile::ppuDataPrepare2_$0 ] 2,002: zp[1]:36 [ ppuDataPutTile::ppuDataPrepare2_$1 ] 2,002: zp[1]:37 [ ppuDataPutTile::ppuDataPut3_val#0 ] 2,002: zp[1]:38 [ ppuDataPutTile::ppuDataPut4_val#0 ] 435.67: zp[2]:4 [ ppuDataPutTile::ppuData#2 ppuDataPutTile::ppuData#9 ] 333.67: zp[2]:33 [ ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] 250.25: zp[2]:6 [ ppuDataPutTile::tile#10 ] 101: zp[2]:27 [ ppuDataPutTile::ppuData#0 ]
Uplift Scope [ppuDataTransfer] 2,602.6: zp[2]:19 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] 2,002: zp[1]:41 [ ppuDataTransfer::ppuDataPut1_val#0 ] 1,751.75: zp[2]:21 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ]
Uplift Scope [memcpy] 3,003: zp[2]:8 [ memcpy::src#2 memcpy::src#1 ] 2,002: zp[2]:10 [ memcpy::dst#2 memcpy::dst#1 ]
Uplift Scope [ppuDataFill] 3,003: zp[2]:17 [ ppuDataFill::i#2 ppuDataFill::i#1 ] 202: zp[1]:39 [ ppuDataFill::ppuDataPrepare1_$0 ] 202: zp[1]:40 [ ppuDataFill::ppuDataPrepare1_$1 ] 111.22: zp[2]:14 [ ppuDataFill::size#3 ] 111.22: zp[1]:16 [ ppuDataFill::val#4 ] 67.33: zp[2]:12 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ]
Uplift Scope [main] 282.8: zp[1]:3 [ main::x#2 main::x#1 ] 263.72: zp[1]:2 [ main::initNES1_i#2 main::initNES1_i#1 ] 202: zp[1]:25 [ main::initNES1_waitForVBlank1_$0 ] 202: zp[1]:26 [ main::initNES1_waitForVBlank2_$0 ]
Uplift Scope [readJoy1] 262.6: zp[1]:23 [ readJoy1::i#2 readJoy1::i#1 ] 202: zp[1]:49 [ readJoy1::$2 ] 152: zp[1]:24 [ readJoy1::joy#2 readJoy1::joy#1 ] 101: zp[1]:48 [ readJoy1::$1 ] 4: zp[1]:42 [ readJoy1::return#2 ]
Uplift Scope [vblank] 4: zp[1]:44 [ vblank::$1 ] 4: zp[1]:45 [ vblank::$3 ] 4: zp[1]:46 [ vblank::$5 ] 4: zp[1]:47 [ vblank::$7 ] 0.53: zp[1]:43 [ vblank::joy#0 ]
Uplift Scope [RICOH_2C02]
Uplift Scope [RICOH_2A03]
Uplift Scope [SpriteData]
Uplift Scope []
Uplifting [ppuDataPutTile] best 6014 combination reg byte a [ ppuDataPutTile::ppuDataPrepare1_$0 ] reg byte a [ ppuDataPutTile::ppuDataPrepare1_$1 ] reg byte a [ ppuDataPutTile::ppuDataPut1_val#0 ] reg byte a [ ppuDataPutTile::ppuDataPut2_val#0 ] zp[1]:35 [ ppuDataPutTile::ppuDataPrepare2_$0 ] zp[1]:36 [ ppuDataPutTile::ppuDataPrepare2_$1 ] zp[1]:37 [ ppuDataPutTile::ppuDataPut3_val#0 ] zp[1]:38 [ ppuDataPutTile::ppuDataPut4_val#0 ] zp[2]:4 [ ppuDataPutTile::ppuData#2 ppuDataPutTile::ppuData#9 ] zp[2]:33 [ ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] zp[2]:6 [ ppuDataPutTile::tile#10 ] zp[2]:27 [ ppuDataPutTile::ppuData#0 ]
Limited combination testing to 100 combinations of 65536 possible.
Uplifting [ppuDataTransfer] best 5954 combination zp[2]:19 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] reg byte a [ ppuDataTransfer::ppuDataPut1_val#0 ] zp[2]:21 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ]
Uplifting [memcpy] best 5954 combination zp[2]:8 [ memcpy::src#2 memcpy::src#1 ] zp[2]:10 [ memcpy::dst#2 memcpy::dst#1 ]
Uplifting [ppuDataFill] best 5906 combination zp[2]:17 [ ppuDataFill::i#2 ppuDataFill::i#1 ] reg byte a [ ppuDataFill::ppuDataPrepare1_$0 ] reg byte a [ ppuDataFill::ppuDataPrepare1_$1 ] zp[2]:14 [ ppuDataFill::size#3 ] reg byte x [ ppuDataFill::val#4 ] zp[2]:12 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ]
Uplifting [main] best 5326 combination reg byte x [ main::x#2 main::x#1 ] reg byte x [ main::initNES1_i#2 main::initNES1_i#1 ] reg byte a [ main::initNES1_waitForVBlank1_$0 ] reg byte a [ main::initNES1_waitForVBlank2_$0 ]
Uplifting [readJoy1] best 5083 combination reg byte x [ readJoy1::i#2 readJoy1::i#1 ] reg byte a [ readJoy1::$2 ] reg byte a [ readJoy1::joy#2 readJoy1::joy#1 ] zp[1]:48 [ readJoy1::$1 ] zp[1]:42 [ readJoy1::return#2 ]
Limited combination testing to 100 combinations of 576 possible.
Uplifting [vblank] best 5059 combination reg byte a [ vblank::$1 ] reg byte a [ vblank::$3 ] reg byte a [ vblank::$5 ] reg byte a [ vblank::$7 ] zp[1]:43 [ vblank::joy#0 ]
Limited combination testing to 100 combinations of 1024 possible.
Uplifting [RICOH_2C02] best 5059 combination
Uplifting [RICOH_2A03] best 5059 combination
Uplifting [SpriteData] best 5059 combination
Uplifting [] best 5059 combination
Attempting to uplift remaining variables inzp[1]:35 [ ppuDataPutTile::ppuDataPrepare2_$0 ]
Uplifting [ppuDataPutTile] best 5053 combination reg byte a [ ppuDataPutTile::ppuDataPrepare2_$0 ]
Attempting to uplift remaining variables inzp[1]:36 [ ppuDataPutTile::ppuDataPrepare2_$1 ]
Uplifting [ppuDataPutTile] best 5047 combination reg byte a [ ppuDataPutTile::ppuDataPrepare2_$1 ]
Attempting to uplift remaining variables inzp[1]:37 [ ppuDataPutTile::ppuDataPut3_val#0 ]
Uplifting [ppuDataPutTile] best 5041 combination reg byte a [ ppuDataPutTile::ppuDataPut3_val#0 ]
Attempting to uplift remaining variables inzp[1]:38 [ ppuDataPutTile::ppuDataPut4_val#0 ]
Uplifting [ppuDataPutTile] best 5035 combination reg byte a [ ppuDataPutTile::ppuDataPut4_val#0 ]
Attempting to uplift remaining variables inzp[1]:48 [ readJoy1::$1 ]
Uplifting [readJoy1] best 5035 combination zp[1]:48 [ readJoy1::$1 ]
Attempting to uplift remaining variables inzp[1]:42 [ readJoy1::return#2 ]
Uplifting [readJoy1] best 5029 combination reg byte a [ readJoy1::return#2 ]
Attempting to uplift remaining variables inzp[1]:43 [ vblank::joy#0 ]
Uplifting [vblank] best 5024 combination reg byte x [ vblank::joy#0 ]
Coalescing zero page register [ zp[2]:4 [ ppuDataPutTile::ppuData#2 ppuDataPutTile::ppuData#9 ] ] with [ zp[2]:27 [ ppuDataPutTile::ppuData#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:4 [ ppuDataPutTile::ppuData#2 ppuDataPutTile::ppuData#9 ppuDataPutTile::ppuData#0 ] ] with [ zp[2]:33 [ ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] ] - score: 1
Coalescing zero page register [ zp[2]:8 [ memcpy::src#2 memcpy::src#1 ] ] with [ zp[2]:4 [ ppuDataPutTile::ppuData#2 ppuDataPutTile::ppuData#9 ppuDataPutTile::ppuData#0 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] ]
Coalescing zero page register [ zp[2]:10 [ memcpy::dst#2 memcpy::dst#1 ] ] with [ zp[2]:6 [ ppuDataPutTile::tile#10 ] ]
Coalescing zero page register [ zp[2]:19 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] ] with [ zp[2]:12 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ] ]
Coalescing zero page register [ zp[2]:21 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ] ] with [ zp[2]:14 [ ppuDataFill::size#3 ] ]
Coalescing zero page register [ zp[2]:17 [ ppuDataFill::i#2 ppuDataFill::i#1 ] ] with [ zp[2]:8 [ memcpy::src#2 memcpy::src#1 ppuDataPutTile::ppuData#2 ppuDataPutTile::ppuData#9 ppuDataPutTile::ppuData#0 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ] ]
Coalescing zero page register [ zp[2]:19 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ppuDataFill::ppuDataPrepare1_ppuData#0 ] ] with [ zp[2]:10 [ memcpy::dst#2 memcpy::dst#1 ppuDataPutTile::tile#10 ] ]
Allocated (was zp[2]:17) zp[2]:2 [ ppuDataFill::i#2 ppuDataFill::i#1 memcpy::src#2 memcpy::src#1 ppuDataPutTile::ppuData#2 ppuDataPutTile::ppuData#9 ppuDataPutTile::ppuData#0 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ]
Allocated (was zp[2]:19) zp[2]:4 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ppuDataFill::ppuDataPrepare1_ppuData#0 memcpy::dst#2 memcpy::dst#1 ppuDataPutTile::tile#10 ]
Allocated (was zp[2]:21) zp[2]:6 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ppuDataFill::size#3 ]
Allocated (was zp[1]:48) zp[1]:8 [ readJoy1::$1 ]
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
// A minimal NES demo
// Based on: https://github.com/gregkrsak/first_nes written by Greg M. Krsak, 2018.
// Nintendo Entertainment System (NES
// https://en.wikipedia.org/wiki/Nintendo_Entertainment_System_(Model_NES-101)
// https://github.com/gregkrsak/first_nes
// Ricoh 2C02 - NES Picture Processing Unit (PPU)
// Ricoh RP2C02 (NTSC version) / RP2C07 (PAL version),
// https://en.wikipedia.org/wiki/Picture_Processing_Unit
// https://wiki.nesdev.com/w/index.php/PPU_registers
// http://nesdev.com/2C02%20technical%20reference.TXT
// Based on: https://github.com/gregkrsak/first_nes written by Greg M. Krsak, 2018.
// Upstart
// Nintendo Entertainment System (NES) ROM
// https://sadistech.com/nesromtool/romdoc.html
// https://forums.nesdev.com/viewtopic.php?f=2&t=9896
// https://github.com/gregkrsak/first_nes
.file [name="nes-demo.nes", type="bin", segments="NesRom"]
.file [name="nes-demo.nes_hdr", type="bin", segments="Header"]
.file [name="nes-demo.nes_prg", type="bin", segments="ProgramRom"]
.file [name="nes-demo.nes_chr", type="bin", segments="CharacterRom"]
.segmentdef Header [ start=$0000, min=$0000, max=$000f, fill ]
.segmentdef Tiles [ start=$0000, min=$0000, max=$1fff, fill ]
.segmentdef Code [ start=$c000, min=$c000, max=$fff9 ]
.segmentdef Data [ startAfter="Code", min=$c000, max=$fff9 ]
.segmentdef Vectors [ start=$fffa, min=$fffa, max=$ffff ]
.segmentdef GameRam [start=$200,max=$7ff, virtual]
.segmentdef ProgramRom [ segments="Code, Data, Vectors" ]
.segmentdef CharacterRom [ segments="Tiles" ]
.segmentdef NesRom
.segment NesRom
.segmentout [ segments="Header" ]
.segmentout [ segments="ProgramRom" ]
.segmentout [ segments="CharacterRom" ]
.segment Header
.text @"NES\$1a"
.byte $01 // 1x 16KB ROM (PRG)
.byte $01 // 1x 8KB VROM (CHR)
.byte %00000001 // Mapper nibble 0000 == No mapping (a simple 16KB PRG + 8KB CHR game)
// Mirroring nibble 0001 == Vertical mirroring only
.segment Code
// Global Constants & labels
// Standard Controller Right Button
.const JOY_RIGHT = 1
// Standard Controller Left Button
.const JOY_LEFT = 2
// Standard Controller Down Button
.const JOY_DOWN = 4
// Standard Controller Up Button
.const JOY_UP = 8
.const SIZEOF_STRUCT_SPRITEDATA = 4
.const OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = $10
.const OFFSET_STRUCT_RICOH_2C02_PPUMASK = 1
.const OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = 2
.const OFFSET_STRUCT_RICOH_2C02_OAMADDR = 3
.const OFFSET_STRUCT_RICOH_2A03_OAMDMA = $14
.const OFFSET_STRUCT_RICOH_2A03_JOY1 = $16
.const OFFSET_STRUCT_RICOH_2C02_PPUADDR = 6
.const OFFSET_STRUCT_RICOH_2C02_PPUDATA = 7
.const OFFSET_STRUCT_SPRITEDATA_X = 3
.const OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = 5
.const SIZEOF_BYTE = 1
// $2000-$23bf $03c0 Name table 0
.label PPU_NAME_TABLE_0 = $2000
// $23c0-$23ff $0040 Attribute table 0
.label PPU_ATTRIBUTE_TABLE_0 = $23c0
// $3000-$3eff $0f00 Mirrors of $2000-$2eff
// $3f00-$3f1f $0020 Palette RAM indexes
.label PPU_PALETTE = $3f00
// PPU Status Register for reading in ASM
.label PPU_PPUSTATUS = $2002
// APU Frame Counter
// generates low-frequency clocks for the channels and an optional 60 Hz interrupt.
// https://wiki.nesdev.com/w/index.php/APU_Frame_Counter
// ------+-----+---------------------------------------------------------------
// $4017 | W | FR_COUNTER Frame Counter Set mode and interrupt
// ------+-----+---------------------------------------------------------------
// | 7 | Sequencer mode: 0 selects 4-step sequence, 1 selects 5-step sequence
// | 6 | Interrupt inhibit flag. If set, the frame interrupt flag is cleared, otherwise it is unaffected.
// ------+-----+---------------------------------------------------------------
// Side effects After 3 or 4 CPU clock cycles*, the timer is reset.
// If the mode flag is set, then both "quarter frame" and "half frame" signals are also generated.
.label FR_COUNTER = $4017
// Pointer to the start of RAM memory
.label MEMORY = 0
// NES Picture Processing Unit (PPU)
.label PPU = $2000
// NES CPU and audion processing unit (APU)
.label APU = $4000
// @begin
__bbegin:
// [1] phi from @begin to @1 [phi:@begin->@1]
__b1_from___bbegin:
jmp __b1
// @1
__b1:
// [2] call main
// [4] phi from @1 to main [phi:@1->main]
main_from___b1:
jsr main
// [3] phi from @1 to @end [phi:@1->@end]
__bend_from___b1:
jmp __bend
// @end
__bend:
.segment Code
// main
// RESET Called when the NES is reset, including when it is turned on.
main: {
jmp initNES1
// main::initNES1
initNES1:
// asm { cld ldx#$ff txs }
cld
ldx #$ff
txs
jmp initNES1_disableVideoOutput1
// main::initNES1_disableVideoOutput1
initNES1_disableVideoOutput1:
// [6] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0
sta PPU
// [7] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK
jmp initNES1_disableAudioOutput1
// main::initNES1_disableAudioOutput1
initNES1_disableAudioOutput1:
// [8] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 -- _deref_pbuc1=vbuc2
lda #$40
sta FR_COUNTER
// [9] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 -- _deref_pbuc1=vbuc2
lda #$40
sta APU+OFFSET_STRUCT_RICOH_2A03_DMC_FREQ
jmp initNES1_clearVBlankFlag1
// main::initNES1_clearVBlankFlag1
initNES1_clearVBlankFlag1:
// asm { ldaPPU_PPUSTATUS }
lda PPU_PPUSTATUS
// [11] phi from main::initNES1_clearVBlankFlag1 to main::initNES1_waitForVBlank1 [phi:main::initNES1_clearVBlankFlag1->main::initNES1_waitForVBlank1]
initNES1_waitForVBlank1_from_initNES1_clearVBlankFlag1:
jmp initNES1_waitForVBlank1
// main::initNES1_waitForVBlank1
initNES1_waitForVBlank1:
jmp initNES1_waitForVBlank1___b1
// main::initNES1_waitForVBlank1_@1
initNES1_waitForVBlank1___b1:
// [12] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuaa=_deref_pbuc1_band_vbuc2
lda #$80
and PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS
// [13] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 -- vbuc1_eq_vbuaa_then_la1
cmp #0
beq initNES1_waitForVBlank1___b1
// [14] phi from main::initNES1_waitForVBlank1_@1 to main::initNES1_@1 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1]
initNES1___b1_from_initNES1_waitForVBlank1___b1:
// [14] phi (byte) main::initNES1_i#2 = (byte) 0 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1#0] -- vbuxx=vbuc1
ldx #0
jmp initNES1___b1
// [14] phi from main::initNES1_@1 to main::initNES1_@1 [phi:main::initNES1_@1->main::initNES1_@1]
initNES1___b1_from_initNES1___b1:
// [14] phi (byte) main::initNES1_i#2 = (byte) main::initNES1_i#1 [phi:main::initNES1_@1->main::initNES1_@1#0] -- register_copy
jmp initNES1___b1
// main::initNES1_@1
initNES1___b1:
// [15] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
lda #0
sta MEMORY,x
// [16] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
lda #0
sta MEMORY+$100,x
// [17] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
lda #0
sta MEMORY+$200,x
// [18] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
lda #0
sta MEMORY+$300,x
// [19] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
lda #0
sta MEMORY+$400,x
// [20] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
lda #0
sta MEMORY+$500,x
// [21] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
lda #0
sta MEMORY+$600,x
// [22] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
lda #0
sta MEMORY+$700,x
// [23] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 -- vbuxx=_inc_vbuxx
inx
// [24] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 -- vbuc1_neq_vbuxx_then_la1
cpx #0
bne initNES1___b1_from_initNES1___b1
// [25] phi from main::initNES1_@1 to main::initNES1_waitForVBlank2 [phi:main::initNES1_@1->main::initNES1_waitForVBlank2]
initNES1_waitForVBlank2_from_initNES1___b1:
jmp initNES1_waitForVBlank2
// main::initNES1_waitForVBlank2
initNES1_waitForVBlank2:
jmp initNES1_waitForVBlank2___b1
// main::initNES1_waitForVBlank2_@1
initNES1_waitForVBlank2___b1:
// [26] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuaa=_deref_pbuc1_band_vbuc2
lda #$80
and PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS
// [27] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 -- vbuc1_eq_vbuaa_then_la1
cmp #0
beq initNES1_waitForVBlank2___b1
jmp initNES1___b7
// main::initNES1_@7
initNES1___b7:
// asm { ldaPPU_PPUSTATUS }
lda PPU_PPUSTATUS
// [29] phi from main::initNES1_@7 to main::@5 [phi:main::initNES1_@7->main::@5]
__b5_from_initNES1___b7:
jmp __b5
// main::@5
__b5:
// [30] call ppuDataTransfer
// Transfer the palette
// [84] phi from main::@5 to ppuDataTransfer [phi:main::@5->ppuDataTransfer]
ppuDataTransfer_from___b5:
jsr ppuDataTransfer
// [31] phi from main::@5 to main::@6 [phi:main::@5->main::@6]
__b6_from___b5:
jmp __b6
// main::@6
__b6:
// [32] call ppuDataFill
// Clear the name table
// [74] phi from main::@6 to ppuDataFill [phi:main::@6->ppuDataFill]
ppuDataFill_from___b6:
// [74] phi (byte) ppuDataFill::val#4 = (byte) $fc [phi:main::@6->ppuDataFill#0] -- vbuxx=vbuc1
ldx #$fc
// [74] phi (word) ppuDataFill::size#3 = (word) $3c0 [phi:main::@6->ppuDataFill#1] -- vwuz1=vwuc1
lda #<$3c0
sta.z ppuDataFill.size
lda #>$3c0
sta.z ppuDataFill.size+1
// [74] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0 [phi:main::@6->ppuDataFill#2] -- pvoz1=pvoc1
lda #<PPU_NAME_TABLE_0
sta.z ppuDataFill.ppuDataPrepare1_ppuData
lda #>PPU_NAME_TABLE_0
sta.z ppuDataFill.ppuDataPrepare1_ppuData+1
jsr ppuDataFill
// [33] phi from main::@6 to main::@7 [phi:main::@6->main::@7]
__b7_from___b6:
jmp __b7
// main::@7
__b7:
// [34] call ppuDataFill
// Fill the PPU attribute table
// [74] phi from main::@7 to ppuDataFill [phi:main::@7->ppuDataFill]
ppuDataFill_from___b7:
// [74] phi (byte) ppuDataFill::val#4 = (byte) 0 [phi:main::@7->ppuDataFill#0] -- vbuxx=vbuc1
ldx #0
// [74] phi (word) ppuDataFill::size#3 = (byte) $40 [phi:main::@7->ppuDataFill#1] -- vwuz1=vbuc1
lda #<$40
sta.z ppuDataFill.size
lda #>$40
sta.z ppuDataFill.size+1
// [74] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 [phi:main::@7->ppuDataFill#2] -- pvoz1=pvoc1
lda #<PPU_ATTRIBUTE_TABLE_0
sta.z ppuDataFill.ppuDataPrepare1_ppuData
lda #>PPU_ATTRIBUTE_TABLE_0
sta.z ppuDataFill.ppuDataPrepare1_ppuData+1
jsr ppuDataFill
// [35] phi from main::@7 to main::@1 [phi:main::@7->main::@1]
__b1_from___b7:
// [35] phi (byte) main::x#2 = (byte) 0 [phi:main::@7->main::@1#0] -- vbuxx=vbuc1
ldx #0
jmp __b1
// Show floor
// main::@1
__b1:
// [36] if((byte) main::x#2<(byte) $20) goto main::@2 -- vbuxx_lt_vbuc1_then_la1
cpx #$20
bcc __b2
// [37] phi from main::@1 to main::@3 [phi:main::@1->main::@3]
__b3_from___b1:
jmp __b3
// main::@3
__b3:
// [38] call ppuDataPutTile
// Show flag
// [48] phi from main::@3 to ppuDataPutTile [phi:main::@3->ppuDataPutTile]
ppuDataPutTile_from___b3:
// [48] phi (byte*) ppuDataPutTile::tile#10 = (const byte*) FLAG [phi:main::@3->ppuDataPutTile#0] -- pbuz1=pbuc1
lda #<FLAG
sta.z ppuDataPutTile.tile
lda #>FLAG
sta.z ppuDataPutTile.tile+1
// [48] phi (nomodify void*) ppuDataPutTile::ppuData#2 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0+(word)(number) $12*(number) $20+(byte) $1c [phi:main::@3->ppuDataPutTile#1] -- pvoz1=pvoc1
lda #<PPU_NAME_TABLE_0+$12*$20+$1c
sta.z ppuDataPutTile.ppuData
lda #>PPU_NAME_TABLE_0+$12*$20+$1c
sta.z ppuDataPutTile.ppuData+1
jsr ppuDataPutTile
// [39] phi from main::@3 to main::@9 [phi:main::@3->main::@9]
__b9_from___b3:
jmp __b9
// main::@9
__b9:
// [40] call memcpy
// Initialize Sprite Buffer with the SPRITE data
// [67] phi from main::@9 to memcpy [phi:main::@9->memcpy]
memcpy_from___b9:
jsr memcpy
jmp enableVideoOutput1
// main::enableVideoOutput1
enableVideoOutput1:
// [41] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 -- _deref_pbuc1=vbuc2
lda #$80
sta PPU
// [42] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e -- _deref_pbuc1=vbuc2
lda #$1e
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK
// [43] phi from main::@4 main::enableVideoOutput1 to main::@4 [phi:main::@4/main::enableVideoOutput1->main::@4]
__b4_from___b4:
__b4_from_enableVideoOutput1:
jmp __b4
// Infinite loop
// main::@4
__b4:
jmp __b4_from___b4
// main::@2
__b2:
// [44] (nomodify byte*) ppuDataPutTile::ppuData#0 ← (const nomodify byte*) PPU_NAME_TABLE_0+(word)(number) $14*(number) $20 + (byte) main::x#2 -- pbuz1=pbuc1_plus_vbuxx
txa
clc
adc #<PPU_NAME_TABLE_0+$14*$20
sta.z ppuDataPutTile.ppuData
lda #>PPU_NAME_TABLE_0+$14*$20
adc #0
sta.z ppuDataPutTile.ppuData+1
// [45] (nomodify void*) ppuDataPutTile::ppuData#9 ← (void*)(nomodify byte*) ppuDataPutTile::ppuData#0
// [46] call ppuDataPutTile
// [48] phi from main::@2 to ppuDataPutTile [phi:main::@2->ppuDataPutTile]
ppuDataPutTile_from___b2:
// [48] phi (byte*) ppuDataPutTile::tile#10 = (const byte*) FLOOR [phi:main::@2->ppuDataPutTile#0] -- pbuz1=pbuc1
lda #<FLOOR
sta.z ppuDataPutTile.tile
lda #>FLOOR
sta.z ppuDataPutTile.tile+1
// [48] phi (nomodify void*) ppuDataPutTile::ppuData#2 = (nomodify void*) ppuDataPutTile::ppuData#9 [phi:main::@2->ppuDataPutTile#1] -- register_copy
jsr ppuDataPutTile
jmp __b8
// main::@8
__b8:
// [47] (byte) main::x#1 ← (byte) main::x#2 + (byte) 2 -- vbuxx=vbuxx_plus_2
inx
inx
// [35] phi from main::@8 to main::@1 [phi:main::@8->main::@1]
__b1_from___b8:
// [35] phi (byte) main::x#2 = (byte) main::x#1 [phi:main::@8->main::@1#0] -- register_copy
jmp __b1
}
// ppuDataPutTile
// Transfer a 2x2 tile into the PPU memory
// - ppuData : Pointer in the PPU memory
// - tile : The tile to transfer
// ppuDataPutTile(byte* zp(2) ppuData, byte* zp(4) tile)
ppuDataPutTile: {
.label ppuDataPrepare2_ppuData = 2
.label ppuData = 2
.label tile = 4
jmp ppuDataPrepare1
// ppuDataPutTile::ppuDataPrepare1
ppuDataPrepare1:
// [49] (byte~) ppuDataPutTile::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataPutTile::ppuData#2 -- vbuaa=_hi_pvoz1
lda.z ppuData+1
// [50] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// [51] (byte~) ppuDataPutTile::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataPutTile::ppuData#2 -- vbuaa=_lo_pvoz1
lda.z ppuData
// [52] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$1 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
jmp __b1
// ppuDataPutTile::@1
__b1:
// [53] (byte) ppuDataPutTile::ppuDataPut1_val#0 ← *((byte*) ppuDataPutTile::tile#10) -- vbuaa=_deref_pbuz1
ldy #0
lda (tile),y
jmp ppuDataPut1
// ppuDataPutTile::ppuDataPut1
ppuDataPut1:
// [54] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut1_val#0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
jmp __b2
// ppuDataPutTile::@2
__b2:
// [55] (byte) ppuDataPutTile::ppuDataPut2_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 1) -- vbuaa=pbuz1_derefidx_vbuc1
ldy #1
lda (tile),y
jmp ppuDataPut2
// ppuDataPutTile::ppuDataPut2
ppuDataPut2:
// [56] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut2_val#0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
jmp __b3
// ppuDataPutTile::@3
__b3:
// [57] (nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 ← (byte*)(nomodify void*) ppuDataPutTile::ppuData#2 + (byte) $20 -- pbuz1=pbuz1_plus_vbuc1
lda #$20
clc
adc.z ppuDataPrepare2_ppuData
sta.z ppuDataPrepare2_ppuData
bcc !+
inc.z ppuDataPrepare2_ppuData+1
!:
jmp ppuDataPrepare2
// ppuDataPutTile::ppuDataPrepare2
ppuDataPrepare2:
// [58] (byte~) ppuDataPutTile::ppuDataPrepare2_$0 ← > (void*)(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 -- vbuaa=_hi_pvoz1
lda.z ppuDataPrepare2_ppuData+1
// [59] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// [60] (byte~) ppuDataPutTile::ppuDataPrepare2_$1 ← < (void*)(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 -- vbuaa=_lo_pvoz1
lda.z ppuDataPrepare2_ppuData
// [61] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$1 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
jmp __b4
// ppuDataPutTile::@4
__b4:
// [62] (byte) ppuDataPutTile::ppuDataPut3_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 2) -- vbuaa=pbuz1_derefidx_vbuc1
ldy #2
lda (tile),y
jmp ppuDataPut3
// ppuDataPutTile::ppuDataPut3
ppuDataPut3:
// [63] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut3_val#0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
jmp __b5
// ppuDataPutTile::@5
__b5:
// [64] (byte) ppuDataPutTile::ppuDataPut4_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 3) -- vbuaa=pbuz1_derefidx_vbuc1
ldy #3
lda (tile),y
jmp ppuDataPut4
// ppuDataPutTile::ppuDataPut4
ppuDataPut4:
// [65] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut4_val#0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
jmp __breturn
// ppuDataPutTile::@return
__breturn:
// [66] return
rts
}
// memcpy
// Copy block of memory (forwards)
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
memcpy: {
.const num = 8*SIZEOF_STRUCT_SPRITEDATA
.label destination = SPRITE_BUFFER
.label source = SPRITES
.label src_end = source+num
.label dst = 4
.label src = 2
// [68] phi from memcpy to memcpy::@1 [phi:memcpy->memcpy::@1]
__b1_from_memcpy:
// [68] phi (byte*) memcpy::dst#2 = (byte*)(const void*) memcpy::destination#0 [phi:memcpy->memcpy::@1#0] -- pbuz1=pbuc1
lda #<destination
sta.z dst
lda #>destination
sta.z dst+1
// [68] phi (byte*) memcpy::src#2 = (byte*)(const void*) memcpy::source#0 [phi:memcpy->memcpy::@1#1] -- pbuz1=pbuc1
lda #<source
sta.z src
lda #>source
sta.z src+1
jmp __b1
// memcpy::@1
__b1:
// [69] if((byte*) memcpy::src#2!=(const byte*) memcpy::src_end#0) goto memcpy::@2 -- pbuz1_neq_pbuc1_then_la1
lda.z src+1
cmp #>src_end
bne __b2
lda.z src
cmp #<src_end
bne __b2
jmp __breturn
// memcpy::@return
__breturn:
// [70] return
rts
// memcpy::@2
__b2:
// [71] *((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#2) -- _deref_pbuz1=_deref_pbuz2
ldy #0
lda (src),y
ldy #0
sta (dst),y
// [72] (byte*) memcpy::dst#1 ← ++ (byte*) memcpy::dst#2 -- pbuz1=_inc_pbuz1
inc.z dst
bne !+
inc.z dst+1
!:
// [73] (byte*) memcpy::src#1 ← ++ (byte*) memcpy::src#2 -- pbuz1=_inc_pbuz1
inc.z src
bne !+
inc.z src+1
!:
// [68] phi from memcpy::@2 to memcpy::@1 [phi:memcpy::@2->memcpy::@1]
__b1_from___b2:
// [68] phi (byte*) memcpy::dst#2 = (byte*) memcpy::dst#1 [phi:memcpy::@2->memcpy::@1#0] -- register_copy
// [68] phi (byte*) memcpy::src#2 = (byte*) memcpy::src#1 [phi:memcpy::@2->memcpy::@1#1] -- register_copy
jmp __b1
}
// ppuDataFill
// Fill a number of bytes in the PPU memory
// - ppuData : Pointer in the PPU memory
// - size : The number of bytes to transfer
// ppuDataFill(byte register(X) val, word zp(6) size)
ppuDataFill: {
.label ppuDataPrepare1_ppuData = 4
.label i = 2
.label size = 6
jmp ppuDataPrepare1
// ppuDataFill::ppuDataPrepare1
ppuDataPrepare1:
// [75] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuaa=_hi_pvoz1
lda.z ppuDataPrepare1_ppuData+1
// [76] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// [77] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuaa=_lo_pvoz1
lda.z ppuDataPrepare1_ppuData
// [78] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$1 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// [79] phi from ppuDataFill::ppuDataPrepare1 to ppuDataFill::@1 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1]
__b1_from_ppuDataPrepare1:
// [79] phi (word) ppuDataFill::i#2 = (word) 0 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1#0] -- vwuz1=vwuc1
lda #<0
sta.z i
lda #>0
sta.z i+1
jmp __b1
// Transfer to PPU
// ppuDataFill::@1
__b1:
// [80] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 -- vwuz1_lt_vwuz2_then_la1
lda.z i+1
cmp.z size+1
bcc ppuDataPut1
bne !+
lda.z i
cmp.z size
bcc ppuDataPut1
!:
jmp __breturn
// ppuDataFill::@return
__breturn:
// [81] return
rts
// ppuDataFill::ppuDataPut1
ppuDataPut1:
// [82] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4 -- _deref_pbuc1=vbuxx
stx PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
jmp __b2
// ppuDataFill::@2
__b2:
// [83] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2 -- vwuz1=_inc_vwuz1
inc.z i
bne !+
inc.z i+1
!:
// [79] phi from ppuDataFill::@2 to ppuDataFill::@1 [phi:ppuDataFill::@2->ppuDataFill::@1]
__b1_from___b2:
// [79] phi (word) ppuDataFill::i#2 = (word) ppuDataFill::i#1 [phi:ppuDataFill::@2->ppuDataFill::@1#0] -- register_copy
jmp __b1
}
// ppuDataTransfer
// Transfer a number of bytes from the CPU memory to the PPU memory
// - cpuData : Pointer to the CPU memory (RAM of ROM)
// - ppuData : Pointer in the PPU memory
// - size : The number of bytes to transfer
ppuDataTransfer: {
.const size = $20*SIZEOF_BYTE
.label ppuData = PPU_PALETTE
.label cpuData = PALETTE
// Transfer to PPU
.label cpuSrc = 6
.label i = 4
jmp ppuDataPrepare1
// ppuDataTransfer::ppuDataPrepare1
ppuDataPrepare1:
// [85] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 -- _deref_pbuc1=vbuc2
lda #>ppuData
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// [86] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// [87] phi from ppuDataTransfer::ppuDataPrepare1 to ppuDataTransfer::@1 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1]
__b1_from_ppuDataPrepare1:
// [87] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#0] -- pbuz1=pbuc1
lda #<cpuData
sta.z cpuSrc
lda #>cpuData
sta.z cpuSrc+1
// [87] phi (word) ppuDataTransfer::i#2 = (word) 0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#1] -- vwuz1=vwuc1
lda #<0
sta.z i
lda #>0
sta.z i+1
jmp __b1
// ppuDataTransfer::@1
__b1:
// [88] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 -- vwuz1_lt_vwuc1_then_la1
lda.z i+1
cmp #>size
bcc __b2
bne !+
lda.z i
cmp #<size
bcc __b2
!:
jmp __breturn
// ppuDataTransfer::@return
__breturn:
// [89] return
rts
// ppuDataTransfer::@2
__b2:
// [90] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) -- vbuaa=_deref_pbuz1
ldy #0
lda (cpuSrc),y
jmp ppuDataPut1
// ppuDataTransfer::ppuDataPut1
ppuDataPut1:
// [91] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
jmp __b3
// ppuDataTransfer::@3
__b3:
// [92] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 -- pbuz1=_inc_pbuz1
inc.z cpuSrc
bne !+
inc.z cpuSrc+1
!:
// [93] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2 -- vwuz1=_inc_vwuz1
inc.z i
bne !+
inc.z i+1
!:
// [87] phi from ppuDataTransfer::@3 to ppuDataTransfer::@1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1]
__b1_from___b3:
// [87] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*) ppuDataTransfer::cpuSrc#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#0] -- register_copy
// [87] phi (word) ppuDataTransfer::i#2 = (word) ppuDataTransfer::i#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#1] -- register_copy
jmp __b1
}
// vblank
// NMI Called when the PPU refreshes the screen (also known as the V-Blank period)
vblank: {
// entry interrupt(HARDWARE_STACK)
pha
txa
pha
tya
pha
// [95] call readJoy1
jsr readJoy1
// [96] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2
jmp __b9
// vblank::@9
__b9:
// [97] (byte) vblank::joy#0 ← (byte) readJoy1::return#2 -- vbuxx=vbuaa
tax
// [98] (byte~) vblank::$1 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN -- vbuaa=vbuxx_band_vbuc1
txa
and #JOY_DOWN
// [99] if((byte) 0==(byte~) vblank::$1) goto vblank::@1 -- vbuc1_eq_vbuaa_then_la1
cmp #0
beq __b1
jmp __b4
// vblank::@4
__b4:
// [100] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER
// [101] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+1*SIZEOF_STRUCT_SPRITEDATA
// [102] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+2*SIZEOF_STRUCT_SPRITEDATA
// [103] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+3*SIZEOF_STRUCT_SPRITEDATA
jmp __b1
// vblank::@1
__b1:
// [104] (byte~) vblank::$3 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP -- vbuaa=vbuxx_band_vbuc1
txa
and #JOY_UP
// [105] if((byte) 0==(byte~) vblank::$3) goto vblank::@2 -- vbuc1_eq_vbuaa_then_la1
cmp #0
beq __b2
jmp __b5
// vblank::@5
__b5:
// [106] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER
// [107] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+1*SIZEOF_STRUCT_SPRITEDATA
// [108] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+2*SIZEOF_STRUCT_SPRITEDATA
// [109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+3*SIZEOF_STRUCT_SPRITEDATA
jmp __b2
// vblank::@2
__b2:
// [110] (byte~) vblank::$5 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_LEFT -- vbuaa=vbuxx_band_vbuc1
txa
and #JOY_LEFT
// [111] if((byte) 0==(byte~) vblank::$5) goto vblank::@3 -- vbuc1_eq_vbuaa_then_la1
cmp #0
beq __b3
jmp __b6
// vblank::@6
__b6:
// [112] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X
// [113] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+1*SIZEOF_STRUCT_SPRITEDATA
// [114] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+2*SIZEOF_STRUCT_SPRITEDATA
// [115] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+3*SIZEOF_STRUCT_SPRITEDATA
jmp __b3
// vblank::@3
__b3:
// [116] (byte~) vblank::$7 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_RIGHT -- vbuaa=vbuxx_band_vbuc1
txa
and #JOY_RIGHT
// [117] if((byte) 0==(byte~) vblank::$7) goto vblank::ppuSpriteBufferDmaTransfer1 -- vbuc1_eq_vbuaa_then_la1
cmp #0
beq ppuSpriteBufferDmaTransfer1
jmp __b7
// vblank::@7
__b7:
// [118] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X
// [119] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+1*SIZEOF_STRUCT_SPRITEDATA
// [120] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+2*SIZEOF_STRUCT_SPRITEDATA
// [121] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+3*SIZEOF_STRUCT_SPRITEDATA
jmp ppuSpriteBufferDmaTransfer1
// vblank::ppuSpriteBufferDmaTransfer1
ppuSpriteBufferDmaTransfer1:
// [122] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0
sta PPU+OFFSET_STRUCT_RICOH_2C02_OAMADDR
// [123] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER -- _deref_pbuc1=vbuc2
lda #>SPRITE_BUFFER
sta APU+OFFSET_STRUCT_RICOH_2A03_OAMDMA
jmp __b8
// vblank::@8
__b8:
// [124] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2
// Set scroll
lda #0
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL
// [125] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) -8 -- _deref_pbuc1=vbuc2
lda #-8
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL
jmp __breturn
// vblank::@return
__breturn:
// [126] return - exit interrupt(HARDWARE_STACK)
pla
tay
pla
tax
pla
rti
}
// readJoy1
// Read Standard Controller #1
// Returns a byte representing the pushed buttons
// - bit 0: right
// - bit 1: left
// - bit 2: down
// - bit 3: up
// - bit 4: start
// - bit 5: select
// - bit 6: B
// - bit 7: A
readJoy1: {
.label __1 = 8
// [127] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1 -- _deref_pbuc1=vbuc2
// Latch the controller buttons
lda #1
sta APU+OFFSET_STRUCT_RICOH_2A03_JOY1
// [128] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0
sta APU+OFFSET_STRUCT_RICOH_2A03_JOY1
// [129] phi from readJoy1 to readJoy1::@1 [phi:readJoy1->readJoy1::@1]
__b1_from_readJoy1:
// [129] phi (byte) readJoy1::joy#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#0] -- vbuaa=vbuc1
lda #0
// [129] phi (byte) readJoy1::i#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#1] -- vbuxx=vbuc1
ldx #0
jmp __b1
// readJoy1::@1
__b1:
// [130] if((byte) readJoy1::i#2<(byte) 8) goto readJoy1::@2 -- vbuxx_lt_vbuc1_then_la1
cpx #8
bcc __b2
jmp __breturn
// readJoy1::@return
__breturn:
// [131] return
rts
// readJoy1::@2
__b2:
// [132] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 -- vbuz1=vbuaa_rol_1
asl
sta.z __1
// [133] (byte~) readJoy1::$2 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1 -- vbuaa=_deref_pbuc1_band_vbuc2
lda #1
and APU+OFFSET_STRUCT_RICOH_2A03_JOY1
// [134] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2 -- vbuaa=vbuz1_bor_vbuaa
ora.z __1
// [135] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2 -- vbuxx=_inc_vbuxx
inx
// [129] phi from readJoy1::@2 to readJoy1::@1 [phi:readJoy1::@2->readJoy1::@1]
__b1_from___b2:
// [129] phi (byte) readJoy1::joy#2 = (byte) readJoy1::joy#1 [phi:readJoy1::@2->readJoy1::@1#0] -- register_copy
// [129] phi (byte) readJoy1::i#2 = (byte) readJoy1::i#1 [phi:readJoy1::@2->readJoy1::@1#1] -- register_copy
jmp __b1
}
// File Data
.segment Data
// Flag tile
FLAG: .byte $54, $55, $56, $57
// Floor tile
FLOOR: .byte $85, $85, $86, $86
// Sprite Data
SPRITES: .byte $96, $36, 2, $c, $96, $37, 2, $14, $9e, $38, 2, $c, $9e, $39, 2, $14, $96, $70, 0, $48, $96, $71, 0, $50, $9e, $72, 1, $48, $9e, $73, 1, $50
// Color Palette
PALETTE: .byte $11, $2d, 8, $18, $11, 6, $15, $36, $11, $39, $4a, $5b, $f, $3d, $4e, $5f, $11, $f, $30, 8, $11, $f, $18, 8, $11, $30, $37, $1a, $f, $f, $f, $f
.segment Tiles
TILES:
.import binary "smb1_chr.bin"
.segment GameRam
.align $100
SPRITE_BUFFER: .fill 4*$40, 0
.segment Vectors
VECTORS: .word vblank, main, 0
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __b1
Removing instruction jmp __bend
Removing instruction jmp initNES1
Removing instruction jmp initNES1_disableVideoOutput1
Removing instruction jmp initNES1_disableAudioOutput1
Removing instruction jmp initNES1_clearVBlankFlag1
Removing instruction jmp initNES1_waitForVBlank1
Removing instruction jmp initNES1_waitForVBlank1___b1
Removing instruction jmp initNES1___b1
Removing instruction jmp initNES1_waitForVBlank2
Removing instruction jmp initNES1_waitForVBlank2___b1
Removing instruction jmp initNES1___b7
Removing instruction jmp __b5
Removing instruction jmp __b6
Removing instruction jmp __b7
Removing instruction jmp __b1
Removing instruction jmp __b3
Removing instruction jmp __b9
Removing instruction jmp enableVideoOutput1
Removing instruction jmp __b4
Removing instruction jmp __b8
Removing instruction jmp ppuDataPrepare1
Removing instruction jmp __b1
Removing instruction jmp ppuDataPut1
Removing instruction jmp __b2
Removing instruction jmp ppuDataPut2
Removing instruction jmp __b3
Removing instruction jmp ppuDataPrepare2
Removing instruction jmp __b4
Removing instruction jmp ppuDataPut3
Removing instruction jmp __b5
Removing instruction jmp ppuDataPut4
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp ppuDataPrepare1
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp __b2
Removing instruction jmp ppuDataPrepare1
Removing instruction jmp __b1
Removing instruction jmp __breturn
Removing instruction jmp ppuDataPut1
Removing instruction jmp __b3
Removing instruction jmp __b9
Removing instruction jmp __b4
Removing instruction jmp __b1
Removing instruction jmp __b5
Removing instruction jmp __b2
Removing instruction jmp __b6
Removing instruction jmp __b3
Removing instruction jmp __b7
Removing instruction jmp ppuSpriteBufferDmaTransfer1
Removing instruction jmp __b8
Removing instruction jmp __breturn
Removing instruction jmp __b1
Removing instruction jmp __breturn
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda #0
Removing instruction lda #$40
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction lda #0
Removing instruction ldy #0
Removing instruction lda #>0
Removing instruction lda #>0
Replacing instruction ldx #0 with TAX
Succesful ASM optimization Pass5UnnecesaryLoadElimination
Replacing label initNES1_waitForVBlank1___b1 with initNES1_waitForVBlank1
Replacing label initNES1___b1_from_initNES1___b1 with initNES1___b1
Replacing label initNES1_waitForVBlank2___b1 with initNES1_waitForVBlank2
Removing instruction __b1_from___bbegin:
Removing instruction __b1:
Removing instruction main_from___b1:
Removing instruction __bend_from___b1:
Removing instruction initNES1_waitForVBlank1_from_initNES1_clearVBlankFlag1:
Removing instruction initNES1_waitForVBlank1___b1:
Removing instruction initNES1___b1_from_initNES1___b1:
Removing instruction initNES1_waitForVBlank2_from_initNES1___b1:
Removing instruction initNES1_waitForVBlank2___b1:
Removing instruction __b5_from_initNES1___b7:
Removing instruction __b6_from___b5:
Removing instruction __b7_from___b6:
Removing instruction __b3_from___b1:
Removing instruction __b9_from___b3:
Removing instruction __b4_from_enableVideoOutput1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction __bbegin:
Removing instruction __bend:
Removing instruction initNES1:
Removing instruction initNES1_disableVideoOutput1:
Removing instruction initNES1_disableAudioOutput1:
Removing instruction initNES1_clearVBlankFlag1:
Removing instruction initNES1___b1_from_initNES1_waitForVBlank1___b1:
Removing instruction initNES1___b7:
Removing instruction __b5:
Removing instruction ppuDataTransfer_from___b5:
Removing instruction __b6:
Removing instruction ppuDataFill_from___b6:
Removing instruction __b7:
Removing instruction ppuDataFill_from___b7:
Removing instruction __b1_from___b7:
Removing instruction __b3:
Removing instruction ppuDataPutTile_from___b3:
Removing instruction __b9:
Removing instruction memcpy_from___b9:
Removing instruction enableVideoOutput1:
Removing instruction __b4:
Removing instruction ppuDataPutTile_from___b2:
Removing instruction __b8:
Removing instruction __b1_from___b8:
Removing instruction ppuDataPrepare1:
Removing instruction __b1:
Removing instruction ppuDataPut1:
Removing instruction __b2:
Removing instruction ppuDataPut2:
Removing instruction __b3:
Removing instruction ppuDataPrepare2:
Removing instruction __b4:
Removing instruction ppuDataPut3:
Removing instruction __b5:
Removing instruction ppuDataPut4:
Removing instruction __breturn:
Removing instruction __b1_from_memcpy:
Removing instruction __breturn:
Removing instruction __b1_from___b2:
Removing instruction ppuDataPrepare1:
Removing instruction __b1_from_ppuDataPrepare1:
Removing instruction __breturn:
Removing instruction __b2:
Removing instruction __b1_from___b2:
Removing instruction ppuDataPrepare1:
Removing instruction __b1_from_ppuDataPrepare1:
Removing instruction __breturn:
Removing instruction ppuDataPut1:
Removing instruction __b3:
Removing instruction __b1_from___b3:
Removing instruction __b9:
Removing instruction __b4:
Removing instruction __b5:
Removing instruction __b6:
Removing instruction __b7:
Removing instruction __b8:
Removing instruction __breturn:
Removing instruction __b1_from_readJoy1:
Removing instruction __breturn:
Removing instruction __b1_from___b2:
Succesful ASM optimization Pass5UnusedLabelElimination
Removing instruction jsr main
Succesful ASM optimization Pass5SkipBegin
Relabelling long label __b4_from___b4 to __b3
Succesful ASM optimization Pass5RelabelLongLabels
Removing instruction jmp initNES1___b1
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction lda #0
Succesful ASM optimization Pass5UnnecesaryLoadElimination
FINAL SYMBOL TABLE
(label) @1
(label) @begin
(label) @end
(const struct RICOH_2A03*) APU = (struct RICOH_2A03*) 16384
(const byte*) FLAG[] = { (byte) $54, (byte) $55, (byte) $56, (byte) $57 }
(const byte*) FLOOR[] = { (byte) $85, (byte) $85, (byte) $86, (byte) $86 }
(const nomodify byte*) FR_COUNTER = (byte*) 16407
(const nomodify byte) JOY_DOWN = (byte) 4
(const nomodify byte) JOY_LEFT = (byte) 2
(const nomodify byte) JOY_RIGHT = (byte) 1
(const nomodify byte) JOY_UP = (byte) 8
(const nomodify byte*) MEMORY = (byte*) 0
(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = (byte) $10
(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1 = (byte) $16
(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA = (byte) $14
(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR = (byte) 3
(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR = (byte) 6
(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA = (byte) 7
(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK = (byte) 1
(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = (byte) 5
(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = (byte) 2
(const byte) OFFSET_STRUCT_SPRITEDATA_X = (byte) 3
(const byte*) PALETTE[(number) $20] = { (byte) $11, (byte) $2d, (byte) 8, (byte) $18, (byte) $11, (byte) 6, (byte) $15, (byte) $36, (byte) $11, (byte) $39, (byte) $4a, (byte) $5b, (byte) $f, (byte) $3d, (byte) $4e, (byte) $5f, (byte) $11, (byte) $f, (byte) $30, (byte) 8, (byte) $11, (byte) $f, (byte) $18, (byte) 8, (byte) $11, (byte) $30, (byte) $37, (byte) $1a, (byte) $f, (byte) $f, (byte) $f, (byte) $f }
(const struct RICOH_2C02*) PPU = (struct RICOH_2C02*) 8192
(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 = (byte*) 9152
(const nomodify byte*) PPU_NAME_TABLE_0 = (byte*) 8192
(const nomodify byte*) PPU_PALETTE = (byte*) 16128
(const nomodify to_volatile byte*) PPU_PPUSTATUS = (byte*) 8194
(byte) RICOH_2A03::DMC_FREQ
(byte) RICOH_2A03::DMC_LEN
(byte) RICOH_2A03::DMC_RAW
(byte) RICOH_2A03::DMC_START
(byte) RICOH_2A03::JOY1
(byte) RICOH_2A03::JOY2
(byte) RICOH_2A03::NOISE_HI
(byte) RICOH_2A03::NOISE_LO
(byte) RICOH_2A03::NOISE_VOL
(byte) RICOH_2A03::OAMDMA
(byte) RICOH_2A03::SND_CHN
(byte) RICOH_2A03::SQ1_HI
(byte) RICOH_2A03::SQ1_LO
(byte) RICOH_2A03::SQ1_SWEEP
(byte) RICOH_2A03::SQ1_VOL
(byte) RICOH_2A03::SQ2_HI
(byte) RICOH_2A03::SQ2_LO
(byte) RICOH_2A03::SQ2_SWEEP
(byte) RICOH_2A03::SQ2_VOL
(byte) RICOH_2A03::TRI_HI
(byte) RICOH_2A03::TRI_LINEAR
(byte) RICOH_2A03::TRI_LO
(byte) RICOH_2A03::UNUSED1
(byte) RICOH_2A03::UNUSED2
(byte) RICOH_2C02::OAMADDR
(byte) RICOH_2C02::OAMDATA
(byte) RICOH_2C02::PPUADDR
(byte) RICOH_2C02::PPUCTRL
(byte) RICOH_2C02::PPUDATA
(byte) RICOH_2C02::PPUMASK
(byte) RICOH_2C02::PPUSCROLL
(volatile byte) RICOH_2C02::PPUSTATUS loadstore
(const byte) SIZEOF_BYTE = (byte) 1
(const byte) SIZEOF_STRUCT_SPRITEDATA = (byte) 4
(const struct SpriteData*) SPRITES[] = { { y: (byte) $96, tile: (byte) $36, attributes: (byte) 2, x: (byte) $c }, { y: (byte) $96, tile: (byte) $37, attributes: (byte) 2, x: (byte) $14 }, { y: (byte) $9e, tile: (byte) $38, attributes: (byte) 2, x: (byte) $c }, { y: (byte) $9e, tile: (byte) $39, attributes: (byte) 2, x: (byte) $14 }, { y: (byte) $96, tile: (byte) $70, attributes: (byte) 0, x: (byte) $48 }, { y: (byte) $96, tile: (byte) $71, attributes: (byte) 0, x: (byte) $50 }, { y: (byte) $9e, tile: (byte) $72, attributes: (byte) 1, x: (byte) $48 }, { y: (byte) $9e, tile: (byte) $73, attributes: (byte) 1, x: (byte) $50 } }
(const struct SpriteData*) SPRITE_BUFFER[(number) $40] = { fill( $40, 0) }
(byte) SpriteData::attributes
(byte) SpriteData::tile
(byte) SpriteData::x
(byte) SpriteData::y
(const byte*) TILES[] = kickasm {{ .import binary "smb1_chr.bin"
}}
(const to_nomodify void()**) VECTORS[] = { &interrupt(HARDWARE_STACK)(void()) vblank(), &(void()) main(), (void()*) 0 }
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@3
(label) main::@4
(label) main::@5
(label) main::@6
(label) main::@7
(label) main::@8
(label) main::@9
(label) main::enableVideoOutput1
(label) main::initNES1
(label) main::initNES1_@1
(label) main::initNES1_@7
(label) main::initNES1_clearVBlankFlag1
(label) main::initNES1_disableAudioOutput1
(label) main::initNES1_disableVideoOutput1
(byte) main::initNES1_i
(byte) main::initNES1_i#1 reg byte x 151.5
(byte) main::initNES1_i#2 reg byte x 112.22222222222223
(label) main::initNES1_waitForVBlank1
(byte~) main::initNES1_waitForVBlank1_$0 reg byte a 202.0
(label) main::initNES1_waitForVBlank1_@1
(label) main::initNES1_waitForVBlank2
(byte~) main::initNES1_waitForVBlank2_$0 reg byte a 202.0
(label) main::initNES1_waitForVBlank2_@1
(byte) main::x
(byte) main::x#1 reg byte x 202.0
(byte) main::x#2 reg byte x 80.8
(void*()) memcpy((void*) memcpy::destination , (void*) memcpy::source , (word) memcpy::num)
(label) memcpy::@1
(label) memcpy::@2
(label) memcpy::@return
(void*) memcpy::destination
(const void*) memcpy::destination#0 destination = (void*)(const struct SpriteData*) SPRITE_BUFFER
(byte*) memcpy::dst
(byte*) memcpy::dst#1 dst zp[2]:4 1001.0
(byte*) memcpy::dst#2 dst zp[2]:4 1001.0
(word) memcpy::num
(const word) memcpy::num#0 num = (byte) 8*(const byte) SIZEOF_STRUCT_SPRITEDATA
(void*) memcpy::return
(void*) memcpy::source
(const void*) memcpy::source#0 source = (void*)(const struct SpriteData*) SPRITES
(byte*) memcpy::src
(byte*) memcpy::src#1 src zp[2]:2 2002.0
(byte*) memcpy::src#2 src zp[2]:2 1001.0
(byte*) memcpy::src_end
(const byte*) memcpy::src_end#0 src_end = (byte*)(const void*) memcpy::source#0+(const word) memcpy::num#0
(void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size)
(label) ppuDataFill::@1
(label) ppuDataFill::@2
(label) ppuDataFill::@return
(word) ppuDataFill::i
(word) ppuDataFill::i#1 i zp[2]:2 2002.0
(word) ppuDataFill::i#2 i zp[2]:2 1001.0
(nomodify void*) ppuDataFill::ppuData
(label) ppuDataFill::ppuDataPrepare1
(byte~) ppuDataFill::ppuDataPrepare1_$0 reg byte a 202.0
(byte~) ppuDataFill::ppuDataPrepare1_$1 reg byte a 202.0
(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData
(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ppuDataPrepare1_ppuData zp[2]:4 67.33333333333333
(label) ppuDataFill::ppuDataPut1
(byte) ppuDataFill::ppuDataPut1_val
(word) ppuDataFill::size
(word) ppuDataFill::size#3 size zp[2]:6 111.22222222222223
(byte) ppuDataFill::val
(byte) ppuDataFill::val#4 reg byte x 111.22222222222223
(void()) ppuDataPutTile((nomodify void*) ppuDataPutTile::ppuData , (byte*) ppuDataPutTile::tile)
(label) ppuDataPutTile::@1
(label) ppuDataPutTile::@2
(label) ppuDataPutTile::@3
(label) ppuDataPutTile::@4
(label) ppuDataPutTile::@5
(label) ppuDataPutTile::@return
(nomodify void*) ppuDataPutTile::ppuData
(nomodify byte*) ppuDataPutTile::ppuData#0 ppuData zp[2]:2 101.0
(nomodify void*) ppuDataPutTile::ppuData#2 ppuData zp[2]:2 233.66666666666669
(nomodify void*) ppuDataPutTile::ppuData#9 ppuData zp[2]:2 202.0
(label) ppuDataPutTile::ppuDataPrepare1
(byte~) ppuDataPutTile::ppuDataPrepare1_$0 reg byte a 2002.0
(byte~) ppuDataPutTile::ppuDataPrepare1_$1 reg byte a 2002.0
(nomodify void*) ppuDataPutTile::ppuDataPrepare1_ppuData
(label) ppuDataPutTile::ppuDataPrepare2
(byte~) ppuDataPutTile::ppuDataPrepare2_$0 reg byte a 2002.0
(byte~) ppuDataPutTile::ppuDataPrepare2_$1 reg byte a 2002.0
(nomodify void*) ppuDataPutTile::ppuDataPrepare2_ppuData
(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 ppuDataPrepare2_ppuData zp[2]:2 333.6666666666667
(label) ppuDataPutTile::ppuDataPut1
(byte) ppuDataPutTile::ppuDataPut1_val
(byte) ppuDataPutTile::ppuDataPut1_val#0 reg byte a 2002.0
(label) ppuDataPutTile::ppuDataPut2
(byte) ppuDataPutTile::ppuDataPut2_val
(byte) ppuDataPutTile::ppuDataPut2_val#0 reg byte a 2002.0
(label) ppuDataPutTile::ppuDataPut3
(byte) ppuDataPutTile::ppuDataPut3_val
(byte) ppuDataPutTile::ppuDataPut3_val#0 reg byte a 2002.0
(label) ppuDataPutTile::ppuDataPut4
(byte) ppuDataPutTile::ppuDataPut4_val
(byte) ppuDataPutTile::ppuDataPut4_val#0 reg byte a 2002.0
(byte*) ppuDataPutTile::tile
(byte*) ppuDataPutTile::tile#10 tile zp[2]:4 250.25
(void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size)
(label) ppuDataTransfer::@1
(label) ppuDataTransfer::@2
(label) ppuDataTransfer::@3
(label) ppuDataTransfer::@return
(nomodify void*) ppuDataTransfer::cpuData
(const nomodify void*) ppuDataTransfer::cpuData#0 cpuData = (void*)(const byte*) PALETTE
(byte*) ppuDataTransfer::cpuSrc
(byte*) ppuDataTransfer::cpuSrc#1 cpuSrc zp[2]:6 1001.0
(byte*) ppuDataTransfer::cpuSrc#2 cpuSrc zp[2]:6 750.75
(word) ppuDataTransfer::i
(word) ppuDataTransfer::i#1 i zp[2]:4 2002.0
(word) ppuDataTransfer::i#2 i zp[2]:4 600.5999999999999
(nomodify void*) ppuDataTransfer::ppuData
(const nomodify void*) ppuDataTransfer::ppuData#0 ppuData = (void*)(const nomodify byte*) PPU_PALETTE
(label) ppuDataTransfer::ppuDataPrepare1
(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData
(label) ppuDataTransfer::ppuDataPut1
(byte) ppuDataTransfer::ppuDataPut1_val
(byte) ppuDataTransfer::ppuDataPut1_val#0 reg byte a 2002.0
(word) ppuDataTransfer::size
(const word) ppuDataTransfer::size#0 size = (byte) $20*(const byte) SIZEOF_BYTE
(byte()) readJoy1()
(byte~) readJoy1::$1 zp[1]:8 101.0
(byte~) readJoy1::$2 reg byte a 202.0
(label) readJoy1::@1
(label) readJoy1::@2
(label) readJoy1::@return
(byte) readJoy1::i
(byte) readJoy1::i#1 reg byte x 202.0
(byte) readJoy1::i#2 reg byte x 60.599999999999994
(byte) readJoy1::joy
(byte) readJoy1::joy#1 reg byte a 101.0
(byte) readJoy1::joy#2 reg byte a 51.0
(byte) readJoy1::return
(byte) readJoy1::return#2 reg byte a 4.0
interrupt(HARDWARE_STACK)(void()) vblank()
(byte~) vblank::$1 reg byte a 4.0
(byte~) vblank::$3 reg byte a 4.0
(byte~) vblank::$5 reg byte a 4.0
(byte~) vblank::$7 reg byte a 4.0
(label) vblank::@1
(label) vblank::@2
(label) vblank::@3
(label) vblank::@4
(label) vblank::@5
(label) vblank::@6
(label) vblank::@7
(label) vblank::@8
(label) vblank::@9
(label) vblank::@return
(byte) vblank::joy
(byte) vblank::joy#0 reg byte x 0.5263157894736842
(label) vblank::ppuSpriteBufferDmaTransfer1
(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer
reg byte x [ main::initNES1_i#2 main::initNES1_i#1 ]
reg byte x [ main::x#2 main::x#1 ]
reg byte x [ ppuDataFill::val#4 ]
zp[2]:2 [ ppuDataFill::i#2 ppuDataFill::i#1 memcpy::src#2 memcpy::src#1 ppuDataPutTile::ppuData#2 ppuDataPutTile::ppuData#9 ppuDataPutTile::ppuData#0 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ]
zp[2]:4 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ppuDataFill::ppuDataPrepare1_ppuData#0 memcpy::dst#2 memcpy::dst#1 ppuDataPutTile::tile#10 ]
zp[2]:6 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ppuDataFill::size#3 ]
reg byte x [ readJoy1::i#2 readJoy1::i#1 ]
reg byte a [ readJoy1::joy#2 readJoy1::joy#1 ]
reg byte a [ main::initNES1_waitForVBlank1_$0 ]
reg byte a [ main::initNES1_waitForVBlank2_$0 ]
reg byte a [ ppuDataPutTile::ppuDataPrepare1_$0 ]
reg byte a [ ppuDataPutTile::ppuDataPrepare1_$1 ]
reg byte a [ ppuDataPutTile::ppuDataPut1_val#0 ]
reg byte a [ ppuDataPutTile::ppuDataPut2_val#0 ]
reg byte a [ ppuDataPutTile::ppuDataPrepare2_$0 ]
reg byte a [ ppuDataPutTile::ppuDataPrepare2_$1 ]
reg byte a [ ppuDataPutTile::ppuDataPut3_val#0 ]
reg byte a [ ppuDataPutTile::ppuDataPut4_val#0 ]
reg byte a [ ppuDataFill::ppuDataPrepare1_$0 ]
reg byte a [ ppuDataFill::ppuDataPrepare1_$1 ]
reg byte a [ ppuDataTransfer::ppuDataPut1_val#0 ]
reg byte a [ readJoy1::return#2 ]
reg byte x [ vblank::joy#0 ]
reg byte a [ vblank::$1 ]
reg byte a [ vblank::$3 ]
reg byte a [ vblank::$5 ]
reg byte a [ vblank::$7 ]
zp[1]:8 [ readJoy1::$1 ]
reg byte a [ readJoy1::$2 ]
FINAL ASSEMBLER
Score: 3905
// File Comments
// A minimal NES demo
// Based on: https://github.com/gregkrsak/first_nes written by Greg M. Krsak, 2018.
// Nintendo Entertainment System (NES
// https://en.wikipedia.org/wiki/Nintendo_Entertainment_System_(Model_NES-101)
// https://github.com/gregkrsak/first_nes
// Ricoh 2C02 - NES Picture Processing Unit (PPU)
// Ricoh RP2C02 (NTSC version) / RP2C07 (PAL version),
// https://en.wikipedia.org/wiki/Picture_Processing_Unit
// https://wiki.nesdev.com/w/index.php/PPU_registers
// http://nesdev.com/2C02%20technical%20reference.TXT
// Based on: https://github.com/gregkrsak/first_nes written by Greg M. Krsak, 2018.
// Upstart
// Nintendo Entertainment System (NES) ROM
// https://sadistech.com/nesromtool/romdoc.html
// https://forums.nesdev.com/viewtopic.php?f=2&t=9896
// https://github.com/gregkrsak/first_nes
.file [name="nes-demo.nes", type="bin", segments="NesRom"]
.file [name="nes-demo.nes_hdr", type="bin", segments="Header"]
.file [name="nes-demo.nes_prg", type="bin", segments="ProgramRom"]
.file [name="nes-demo.nes_chr", type="bin", segments="CharacterRom"]
.segmentdef Header [ start=$0000, min=$0000, max=$000f, fill ]
.segmentdef Tiles [ start=$0000, min=$0000, max=$1fff, fill ]
.segmentdef Code [ start=$c000, min=$c000, max=$fff9 ]
.segmentdef Data [ startAfter="Code", min=$c000, max=$fff9 ]
.segmentdef Vectors [ start=$fffa, min=$fffa, max=$ffff ]
.segmentdef GameRam [start=$200,max=$7ff, virtual]
.segmentdef ProgramRom [ segments="Code, Data, Vectors" ]
.segmentdef CharacterRom [ segments="Tiles" ]
.segmentdef NesRom
.segment NesRom
.segmentout [ segments="Header" ]
.segmentout [ segments="ProgramRom" ]
.segmentout [ segments="CharacterRom" ]
.segment Header
.text @"NES\$1a"
.byte $01 // 1x 16KB ROM (PRG)
.byte $01 // 1x 8KB VROM (CHR)
.byte %00000001 // Mapper nibble 0000 == No mapping (a simple 16KB PRG + 8KB CHR game)
// Mirroring nibble 0001 == Vertical mirroring only
.segment Code
// Global Constants & labels
// Standard Controller Right Button
.const JOY_RIGHT = 1
// Standard Controller Left Button
.const JOY_LEFT = 2
// Standard Controller Down Button
.const JOY_DOWN = 4
// Standard Controller Up Button
.const JOY_UP = 8
.const SIZEOF_STRUCT_SPRITEDATA = 4
.const OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = $10
.const OFFSET_STRUCT_RICOH_2C02_PPUMASK = 1
.const OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = 2
.const OFFSET_STRUCT_RICOH_2C02_OAMADDR = 3
.const OFFSET_STRUCT_RICOH_2A03_OAMDMA = $14
.const OFFSET_STRUCT_RICOH_2A03_JOY1 = $16
.const OFFSET_STRUCT_RICOH_2C02_PPUADDR = 6
.const OFFSET_STRUCT_RICOH_2C02_PPUDATA = 7
.const OFFSET_STRUCT_SPRITEDATA_X = 3
.const OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = 5
.const SIZEOF_BYTE = 1
// $2000-$23bf $03c0 Name table 0
.label PPU_NAME_TABLE_0 = $2000
// $23c0-$23ff $0040 Attribute table 0
.label PPU_ATTRIBUTE_TABLE_0 = $23c0
// $3000-$3eff $0f00 Mirrors of $2000-$2eff
// $3f00-$3f1f $0020 Palette RAM indexes
.label PPU_PALETTE = $3f00
// PPU Status Register for reading in ASM
.label PPU_PPUSTATUS = $2002
// APU Frame Counter
// generates low-frequency clocks for the channels and an optional 60 Hz interrupt.
// https://wiki.nesdev.com/w/index.php/APU_Frame_Counter
// ------+-----+---------------------------------------------------------------
// $4017 | W | FR_COUNTER Frame Counter Set mode and interrupt
// ------+-----+---------------------------------------------------------------
// | 7 | Sequencer mode: 0 selects 4-step sequence, 1 selects 5-step sequence
// | 6 | Interrupt inhibit flag. If set, the frame interrupt flag is cleared, otherwise it is unaffected.
// ------+-----+---------------------------------------------------------------
// Side effects After 3 or 4 CPU clock cycles*, the timer is reset.
// If the mode flag is set, then both "quarter frame" and "half frame" signals are also generated.
.label FR_COUNTER = $4017
// Pointer to the start of RAM memory
.label MEMORY = 0
// NES Picture Processing Unit (PPU)
.label PPU = $2000
// NES CPU and audion processing unit (APU)
.label APU = $4000
// @begin
// [1] phi from @begin to @1 [phi:@begin->@1]
// @1
// [2] call main
// [4] phi from @1 to main [phi:@1->main]
// [3] phi from @1 to @end [phi:@1->@end]
// @end
.segment Code
// main
// RESET Called when the NES is reset, including when it is turned on.
main: {
// main::initNES1
// asm
// asm { cld ldx#$ff txs }
cld
ldx #$ff
txs
// main::initNES1_disableVideoOutput1
// PPU->PPUCTRL = 0
// [6] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0
sta PPU
// PPU->PPUMASK = 0
// [7] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 -- _deref_pbuc1=vbuc2
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK
// main::initNES1_disableAudioOutput1
// *FR_COUNTER = 0b01000000
// [8] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 -- _deref_pbuc1=vbuc2
lda #$40
sta FR_COUNTER
// APU->DMC_FREQ = 0b01000000
// [9] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 -- _deref_pbuc1=vbuc2
sta APU+OFFSET_STRUCT_RICOH_2A03_DMC_FREQ
// main::initNES1_clearVBlankFlag1
// asm
// asm { ldaPPU_PPUSTATUS }
lda PPU_PPUSTATUS
// [11] phi from main::initNES1_clearVBlankFlag1 to main::initNES1_waitForVBlank1 [phi:main::initNES1_clearVBlankFlag1->main::initNES1_waitForVBlank1]
// main::initNES1_waitForVBlank1
initNES1_waitForVBlank1:
// main::initNES1_waitForVBlank1_@1
// PPU->PPUSTATUS&0x80
// [12] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuaa=_deref_pbuc1_band_vbuc2
lda #$80
and PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS
// while(!(PPU->PPUSTATUS&0x80))
// [13] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 -- vbuc1_eq_vbuaa_then_la1
cmp #0
beq initNES1_waitForVBlank1
// [14] phi from main::initNES1_waitForVBlank1_@1 to main::initNES1_@1 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1]
// [14] phi (byte) main::initNES1_i#2 = (byte) 0 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1#0] -- vbuxx=vbuc1
ldx #0
// [14] phi from main::initNES1_@1 to main::initNES1_@1 [phi:main::initNES1_@1->main::initNES1_@1]
// [14] phi (byte) main::initNES1_i#2 = (byte) main::initNES1_i#1 [phi:main::initNES1_@1->main::initNES1_@1#0] -- register_copy
// main::initNES1_@1
initNES1___b1:
// (MEMORY+0x000)[i] = 0
// [15] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
lda #0
sta MEMORY,x
// (MEMORY+0x100)[i] = 0
// [16] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
sta MEMORY+$100,x
// (MEMORY+0x200)[i] = 0
// [17] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
sta MEMORY+$200,x
// (MEMORY+0x300)[i] = 0
// [18] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
sta MEMORY+$300,x
// (MEMORY+0x400)[i] = 0
// [19] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
sta MEMORY+$400,x
// (MEMORY+0x500)[i] = 0
// [20] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
sta MEMORY+$500,x
// (MEMORY+0x600)[i] = 0
// [21] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
sta MEMORY+$600,x
// (MEMORY+0x700)[i] = 0
// [22] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2
sta MEMORY+$700,x
// while (++i)
// [23] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 -- vbuxx=_inc_vbuxx
inx
// [24] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 -- vbuc1_neq_vbuxx_then_la1
cpx #0
bne initNES1___b1
// [25] phi from main::initNES1_@1 to main::initNES1_waitForVBlank2 [phi:main::initNES1_@1->main::initNES1_waitForVBlank2]
// main::initNES1_waitForVBlank2
initNES1_waitForVBlank2:
// main::initNES1_waitForVBlank2_@1
// PPU->PPUSTATUS&0x80
// [26] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuaa=_deref_pbuc1_band_vbuc2
lda #$80
and PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS
// while(!(PPU->PPUSTATUS&0x80))
// [27] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 -- vbuc1_eq_vbuaa_then_la1
cmp #0
beq initNES1_waitForVBlank2
// main::initNES1_@7
// asm
// asm { ldaPPU_PPUSTATUS }
lda PPU_PPUSTATUS
// [29] phi from main::initNES1_@7 to main::@5 [phi:main::initNES1_@7->main::@5]
// main::@5
// ppuDataTransfer(PPU_PALETTE, PALETTE, sizeof(PALETTE))
// [30] call ppuDataTransfer
// Transfer the palette
// [84] phi from main::@5 to ppuDataTransfer [phi:main::@5->ppuDataTransfer]
jsr ppuDataTransfer
// [31] phi from main::@5 to main::@6 [phi:main::@5->main::@6]
// main::@6
// ppuDataFill(PPU_NAME_TABLE_0, 0xfc, 0x3c0)
// [32] call ppuDataFill
// Clear the name table
// [74] phi from main::@6 to ppuDataFill [phi:main::@6->ppuDataFill]
// [74] phi (byte) ppuDataFill::val#4 = (byte) $fc [phi:main::@6->ppuDataFill#0] -- vbuxx=vbuc1
ldx #$fc
// [74] phi (word) ppuDataFill::size#3 = (word) $3c0 [phi:main::@6->ppuDataFill#1] -- vwuz1=vwuc1
lda #<$3c0
sta.z ppuDataFill.size
lda #>$3c0
sta.z ppuDataFill.size+1
// [74] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0 [phi:main::@6->ppuDataFill#2] -- pvoz1=pvoc1
lda #<PPU_NAME_TABLE_0
sta.z ppuDataFill.ppuDataPrepare1_ppuData
lda #>PPU_NAME_TABLE_0
sta.z ppuDataFill.ppuDataPrepare1_ppuData+1
jsr ppuDataFill
// [33] phi from main::@6 to main::@7 [phi:main::@6->main::@7]
// main::@7
// ppuDataFill(PPU_ATTRIBUTE_TABLE_0, 0, 0x40)
// [34] call ppuDataFill
// Fill the PPU attribute table
// [74] phi from main::@7 to ppuDataFill [phi:main::@7->ppuDataFill]
// [74] phi (byte) ppuDataFill::val#4 = (byte) 0 [phi:main::@7->ppuDataFill#0] -- vbuxx=vbuc1
ldx #0
// [74] phi (word) ppuDataFill::size#3 = (byte) $40 [phi:main::@7->ppuDataFill#1] -- vwuz1=vbuc1
lda #<$40
sta.z ppuDataFill.size
lda #>$40
sta.z ppuDataFill.size+1
// [74] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 [phi:main::@7->ppuDataFill#2] -- pvoz1=pvoc1
lda #<PPU_ATTRIBUTE_TABLE_0
sta.z ppuDataFill.ppuDataPrepare1_ppuData
lda #>PPU_ATTRIBUTE_TABLE_0
sta.z ppuDataFill.ppuDataPrepare1_ppuData+1
jsr ppuDataFill
// [35] phi from main::@7 to main::@1 [phi:main::@7->main::@1]
// [35] phi (byte) main::x#2 = (byte) 0 [phi:main::@7->main::@1#0] -- vbuxx=vbuc1
ldx #0
// Show floor
// main::@1
__b1:
// for(char x=0;x<32;x+=2)
// [36] if((byte) main::x#2<(byte) $20) goto main::@2 -- vbuxx_lt_vbuc1_then_la1
cpx #$20
bcc __b2
// [37] phi from main::@1 to main::@3 [phi:main::@1->main::@3]
// main::@3
// ppuDataPutTile(PPU_NAME_TABLE_0+18*32+28, FLAG)
// [38] call ppuDataPutTile
// Show flag
// [48] phi from main::@3 to ppuDataPutTile [phi:main::@3->ppuDataPutTile]
// [48] phi (byte*) ppuDataPutTile::tile#10 = (const byte*) FLAG [phi:main::@3->ppuDataPutTile#0] -- pbuz1=pbuc1
lda #<FLAG
sta.z ppuDataPutTile.tile
lda #>FLAG
sta.z ppuDataPutTile.tile+1
// [48] phi (nomodify void*) ppuDataPutTile::ppuData#2 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0+(word)(number) $12*(number) $20+(byte) $1c [phi:main::@3->ppuDataPutTile#1] -- pvoz1=pvoc1
lda #<PPU_NAME_TABLE_0+$12*$20+$1c
sta.z ppuDataPutTile.ppuData
lda #>PPU_NAME_TABLE_0+$12*$20+$1c
sta.z ppuDataPutTile.ppuData+1
jsr ppuDataPutTile
// [39] phi from main::@3 to main::@9 [phi:main::@3->main::@9]
// main::@9
// memcpy(SPRITE_BUFFER, SPRITES, sizeof(SPRITES))
// [40] call memcpy
// Initialize Sprite Buffer with the SPRITE data
// [67] phi from main::@9 to memcpy [phi:main::@9->memcpy]
jsr memcpy
// main::enableVideoOutput1
// PPU->PPUCTRL = 0b10000000
// [41] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 -- _deref_pbuc1=vbuc2
lda #$80
sta PPU
// PPU->PPUMASK = 0b00011110
// [42] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e -- _deref_pbuc1=vbuc2
lda #$1e
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK
// [43] phi from main::@4 main::enableVideoOutput1 to main::@4 [phi:main::@4/main::enableVideoOutput1->main::@4]
__b3:
// Infinite loop
// main::@4
jmp __b3
// main::@2
__b2:
// PPU_NAME_TABLE_0+20*32+x
// [44] (nomodify byte*) ppuDataPutTile::ppuData#0 ← (const nomodify byte*) PPU_NAME_TABLE_0+(word)(number) $14*(number) $20 + (byte) main::x#2 -- pbuz1=pbuc1_plus_vbuxx
txa
clc
adc #<PPU_NAME_TABLE_0+$14*$20
sta.z ppuDataPutTile.ppuData
lda #>PPU_NAME_TABLE_0+$14*$20
adc #0
sta.z ppuDataPutTile.ppuData+1
// [45] (nomodify void*) ppuDataPutTile::ppuData#9 ← (void*)(nomodify byte*) ppuDataPutTile::ppuData#0
// ppuDataPutTile(PPU_NAME_TABLE_0+20*32+x, FLOOR)
// [46] call ppuDataPutTile
// [48] phi from main::@2 to ppuDataPutTile [phi:main::@2->ppuDataPutTile]
// [48] phi (byte*) ppuDataPutTile::tile#10 = (const byte*) FLOOR [phi:main::@2->ppuDataPutTile#0] -- pbuz1=pbuc1
lda #<FLOOR
sta.z ppuDataPutTile.tile
lda #>FLOOR
sta.z ppuDataPutTile.tile+1
// [48] phi (nomodify void*) ppuDataPutTile::ppuData#2 = (nomodify void*) ppuDataPutTile::ppuData#9 [phi:main::@2->ppuDataPutTile#1] -- register_copy
jsr ppuDataPutTile
// main::@8
// x+=2
// [47] (byte) main::x#1 ← (byte) main::x#2 + (byte) 2 -- vbuxx=vbuxx_plus_2
inx
inx
// [35] phi from main::@8 to main::@1 [phi:main::@8->main::@1]
// [35] phi (byte) main::x#2 = (byte) main::x#1 [phi:main::@8->main::@1#0] -- register_copy
jmp __b1
}
// ppuDataPutTile
// Transfer a 2x2 tile into the PPU memory
// - ppuData : Pointer in the PPU memory
// - tile : The tile to transfer
// ppuDataPutTile(byte* zp(2) ppuData, byte* zp(4) tile)
ppuDataPutTile: {
.label ppuDataPrepare2_ppuData = 2
.label ppuData = 2
.label tile = 4
// ppuDataPutTile::ppuDataPrepare1
// >ppuData
// [49] (byte~) ppuDataPutTile::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataPutTile::ppuData#2 -- vbuaa=_hi_pvoz1
lda.z ppuData+1
// PPU->PPUADDR = >ppuData
// [50] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// <ppuData
// [51] (byte~) ppuDataPutTile::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataPutTile::ppuData#2 -- vbuaa=_lo_pvoz1
lda.z ppuData
// PPU->PPUADDR = <ppuData
// [52] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$1 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// ppuDataPutTile::@1
// ppuDataPut(tile[0])
// [53] (byte) ppuDataPutTile::ppuDataPut1_val#0 ← *((byte*) ppuDataPutTile::tile#10) -- vbuaa=_deref_pbuz1
ldy #0
lda (tile),y
// ppuDataPutTile::ppuDataPut1
// PPU->PPUDATA = val
// [54] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut1_val#0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
// ppuDataPutTile::@2
// ppuDataPut(tile[1])
// [55] (byte) ppuDataPutTile::ppuDataPut2_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 1) -- vbuaa=pbuz1_derefidx_vbuc1
ldy #1
lda (tile),y
// ppuDataPutTile::ppuDataPut2
// PPU->PPUDATA = val
// [56] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut2_val#0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
// ppuDataPutTile::@3
// (char*)ppuData+32
// [57] (nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 ← (byte*)(nomodify void*) ppuDataPutTile::ppuData#2 + (byte) $20 -- pbuz1=pbuz1_plus_vbuc1
lda #$20
clc
adc.z ppuDataPrepare2_ppuData
sta.z ppuDataPrepare2_ppuData
bcc !+
inc.z ppuDataPrepare2_ppuData+1
!:
// ppuDataPutTile::ppuDataPrepare2
// >ppuData
// [58] (byte~) ppuDataPutTile::ppuDataPrepare2_$0 ← > (void*)(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 -- vbuaa=_hi_pvoz1
lda.z ppuDataPrepare2_ppuData+1
// PPU->PPUADDR = >ppuData
// [59] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// <ppuData
// [60] (byte~) ppuDataPutTile::ppuDataPrepare2_$1 ← < (void*)(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 -- vbuaa=_lo_pvoz1
lda.z ppuDataPrepare2_ppuData
// PPU->PPUADDR = <ppuData
// [61] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$1 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// ppuDataPutTile::@4
// ppuDataPut(tile[2])
// [62] (byte) ppuDataPutTile::ppuDataPut3_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 2) -- vbuaa=pbuz1_derefidx_vbuc1
ldy #2
lda (tile),y
// ppuDataPutTile::ppuDataPut3
// PPU->PPUDATA = val
// [63] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut3_val#0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
// ppuDataPutTile::@5
// ppuDataPut(tile[3])
// [64] (byte) ppuDataPutTile::ppuDataPut4_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 3) -- vbuaa=pbuz1_derefidx_vbuc1
ldy #3
lda (tile),y
// ppuDataPutTile::ppuDataPut4
// PPU->PPUDATA = val
// [65] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut4_val#0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
// ppuDataPutTile::@return
// }
// [66] return
rts
}
// memcpy
// Copy block of memory (forwards)
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
memcpy: {
.const num = 8*SIZEOF_STRUCT_SPRITEDATA
.label destination = SPRITE_BUFFER
.label source = SPRITES
.label src_end = source+num
.label dst = 4
.label src = 2
// [68] phi from memcpy to memcpy::@1 [phi:memcpy->memcpy::@1]
// [68] phi (byte*) memcpy::dst#2 = (byte*)(const void*) memcpy::destination#0 [phi:memcpy->memcpy::@1#0] -- pbuz1=pbuc1
lda #<destination
sta.z dst
lda #>destination
sta.z dst+1
// [68] phi (byte*) memcpy::src#2 = (byte*)(const void*) memcpy::source#0 [phi:memcpy->memcpy::@1#1] -- pbuz1=pbuc1
lda #<source
sta.z src
lda #>source
sta.z src+1
// memcpy::@1
__b1:
// while(src!=src_end)
// [69] if((byte*) memcpy::src#2!=(const byte*) memcpy::src_end#0) goto memcpy::@2 -- pbuz1_neq_pbuc1_then_la1
lda.z src+1
cmp #>src_end
bne __b2
lda.z src
cmp #<src_end
bne __b2
// memcpy::@return
// }
// [70] return
rts
// memcpy::@2
__b2:
// *dst++ = *src++
// [71] *((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#2) -- _deref_pbuz1=_deref_pbuz2
ldy #0
lda (src),y
sta (dst),y
// *dst++ = *src++;
// [72] (byte*) memcpy::dst#1 ← ++ (byte*) memcpy::dst#2 -- pbuz1=_inc_pbuz1
inc.z dst
bne !+
inc.z dst+1
!:
// [73] (byte*) memcpy::src#1 ← ++ (byte*) memcpy::src#2 -- pbuz1=_inc_pbuz1
inc.z src
bne !+
inc.z src+1
!:
// [68] phi from memcpy::@2 to memcpy::@1 [phi:memcpy::@2->memcpy::@1]
// [68] phi (byte*) memcpy::dst#2 = (byte*) memcpy::dst#1 [phi:memcpy::@2->memcpy::@1#0] -- register_copy
// [68] phi (byte*) memcpy::src#2 = (byte*) memcpy::src#1 [phi:memcpy::@2->memcpy::@1#1] -- register_copy
jmp __b1
}
// ppuDataFill
// Fill a number of bytes in the PPU memory
// - ppuData : Pointer in the PPU memory
// - size : The number of bytes to transfer
// ppuDataFill(byte register(X) val, word zp(6) size)
ppuDataFill: {
.label ppuDataPrepare1_ppuData = 4
.label i = 2
.label size = 6
// ppuDataFill::ppuDataPrepare1
// >ppuData
// [75] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuaa=_hi_pvoz1
lda.z ppuDataPrepare1_ppuData+1
// PPU->PPUADDR = >ppuData
// [76] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// <ppuData
// [77] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuaa=_lo_pvoz1
lda.z ppuDataPrepare1_ppuData
// PPU->PPUADDR = <ppuData
// [78] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$1 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// [79] phi from ppuDataFill::ppuDataPrepare1 to ppuDataFill::@1 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1]
// [79] phi (word) ppuDataFill::i#2 = (word) 0 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1#0] -- vwuz1=vwuc1
lda #<0
sta.z i
sta.z i+1
// Transfer to PPU
// ppuDataFill::@1
__b1:
// for(unsigned int i=0;i<size;i++)
// [80] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 -- vwuz1_lt_vwuz2_then_la1
lda.z i+1
cmp.z size+1
bcc ppuDataPut1
bne !+
lda.z i
cmp.z size
bcc ppuDataPut1
!:
// ppuDataFill::@return
// }
// [81] return
rts
// ppuDataFill::ppuDataPut1
ppuDataPut1:
// PPU->PPUDATA = val
// [82] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4 -- _deref_pbuc1=vbuxx
stx PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
// ppuDataFill::@2
// for(unsigned int i=0;i<size;i++)
// [83] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2 -- vwuz1=_inc_vwuz1
inc.z i
bne !+
inc.z i+1
!:
// [79] phi from ppuDataFill::@2 to ppuDataFill::@1 [phi:ppuDataFill::@2->ppuDataFill::@1]
// [79] phi (word) ppuDataFill::i#2 = (word) ppuDataFill::i#1 [phi:ppuDataFill::@2->ppuDataFill::@1#0] -- register_copy
jmp __b1
}
// ppuDataTransfer
// Transfer a number of bytes from the CPU memory to the PPU memory
// - cpuData : Pointer to the CPU memory (RAM of ROM)
// - ppuData : Pointer in the PPU memory
// - size : The number of bytes to transfer
ppuDataTransfer: {
.const size = $20*SIZEOF_BYTE
.label ppuData = PPU_PALETTE
.label cpuData = PALETTE
// Transfer to PPU
.label cpuSrc = 6
.label i = 4
// ppuDataTransfer::ppuDataPrepare1
// PPU->PPUADDR = >ppuData
// [85] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 -- _deref_pbuc1=vbuc2
lda #>ppuData
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// PPU->PPUADDR = <ppuData
// [86] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// [87] phi from ppuDataTransfer::ppuDataPrepare1 to ppuDataTransfer::@1 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1]
// [87] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#0] -- pbuz1=pbuc1
lda #<cpuData
sta.z cpuSrc
lda #>cpuData
sta.z cpuSrc+1
// [87] phi (word) ppuDataTransfer::i#2 = (word) 0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#1] -- vwuz1=vwuc1
lda #<0
sta.z i
sta.z i+1
// ppuDataTransfer::@1
__b1:
// for(unsigned int i=0;i<size;i++)
// [88] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 -- vwuz1_lt_vwuc1_then_la1
lda.z i+1
cmp #>size
bcc __b2
bne !+
lda.z i
cmp #<size
bcc __b2
!:
// ppuDataTransfer::@return
// }
// [89] return
rts
// ppuDataTransfer::@2
__b2:
// ppuDataPut(*cpuSrc++)
// [90] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) -- vbuaa=_deref_pbuz1
ldy #0
lda (cpuSrc),y
// ppuDataTransfer::ppuDataPut1
// PPU->PPUDATA = val
// [91] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 -- _deref_pbuc1=vbuaa
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
// ppuDataTransfer::@3
// ppuDataPut(*cpuSrc++);
// [92] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 -- pbuz1=_inc_pbuz1
inc.z cpuSrc
bne !+
inc.z cpuSrc+1
!:
// for(unsigned int i=0;i<size;i++)
// [93] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2 -- vwuz1=_inc_vwuz1
inc.z i
bne !+
inc.z i+1
!:
// [87] phi from ppuDataTransfer::@3 to ppuDataTransfer::@1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1]
// [87] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*) ppuDataTransfer::cpuSrc#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#0] -- register_copy
// [87] phi (word) ppuDataTransfer::i#2 = (word) ppuDataTransfer::i#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#1] -- register_copy
jmp __b1
}
// vblank
// NMI Called when the PPU refreshes the screen (also known as the V-Blank period)
vblank: {
// entry interrupt(HARDWARE_STACK)
pha
txa
pha
tya
pha
// readJoy1()
// [95] call readJoy1
jsr readJoy1
// [96] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2
// vblank::@9
// joy = readJoy1()
// [97] (byte) vblank::joy#0 ← (byte) readJoy1::return#2 -- vbuxx=vbuaa
tax
// joy&JOY_DOWN
// [98] (byte~) vblank::$1 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN -- vbuaa=vbuxx_band_vbuc1
txa
and #JOY_DOWN
// if(joy&JOY_DOWN)
// [99] if((byte) 0==(byte~) vblank::$1) goto vblank::@1 -- vbuc1_eq_vbuaa_then_la1
cmp #0
beq __b1
// vblank::@4
// SPRITE_BUFFER[0].y++;
// [100] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER
// SPRITE_BUFFER[1].y++;
// [101] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+1*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[2].y++;
// [102] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+2*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[3].y++;
// [103] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+3*SIZEOF_STRUCT_SPRITEDATA
// vblank::@1
__b1:
// joy&JOY_UP
// [104] (byte~) vblank::$3 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP -- vbuaa=vbuxx_band_vbuc1
txa
and #JOY_UP
// if(joy&JOY_UP)
// [105] if((byte) 0==(byte~) vblank::$3) goto vblank::@2 -- vbuc1_eq_vbuaa_then_la1
cmp #0
beq __b2
// vblank::@5
// SPRITE_BUFFER[0].y--;
// [106] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER
// SPRITE_BUFFER[1].y--;
// [107] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+1*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[2].y--;
// [108] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+2*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[3].y--;
// [109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+3*SIZEOF_STRUCT_SPRITEDATA
// vblank::@2
__b2:
// joy&JOY_LEFT
// [110] (byte~) vblank::$5 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_LEFT -- vbuaa=vbuxx_band_vbuc1
txa
and #JOY_LEFT
// if(joy&JOY_LEFT)
// [111] if((byte) 0==(byte~) vblank::$5) goto vblank::@3 -- vbuc1_eq_vbuaa_then_la1
cmp #0
beq __b3
// vblank::@6
// SPRITE_BUFFER[0].x--;
// [112] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X
// SPRITE_BUFFER[1].x--;
// [113] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+1*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[2].x--;
// [114] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+2*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[3].x--;
// [115] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_dec__deref_pbuc1
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+3*SIZEOF_STRUCT_SPRITEDATA
// vblank::@3
__b3:
// joy&JOY_RIGHT
// [116] (byte~) vblank::$7 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_RIGHT -- vbuaa=vbuxx_band_vbuc1
txa
and #JOY_RIGHT
// if(joy&JOY_RIGHT)
// [117] if((byte) 0==(byte~) vblank::$7) goto vblank::ppuSpriteBufferDmaTransfer1 -- vbuc1_eq_vbuaa_then_la1
cmp #0
beq ppuSpriteBufferDmaTransfer1
// vblank::@7
// SPRITE_BUFFER[0].x++;
// [118] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X
// SPRITE_BUFFER[1].x++;
// [119] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+1*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[2].x++;
// [120] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+2*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[3].x++;
// [121] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) -- _deref_pbuc1=_inc__deref_pbuc1
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+3*SIZEOF_STRUCT_SPRITEDATA
// vblank::ppuSpriteBufferDmaTransfer1
ppuSpriteBufferDmaTransfer1:
// PPU->OAMADDR = 0
// [122] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0
sta PPU+OFFSET_STRUCT_RICOH_2C02_OAMADDR
// APU->OAMDMA = >spriteBuffer
// [123] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER -- _deref_pbuc1=vbuc2
lda #>SPRITE_BUFFER
sta APU+OFFSET_STRUCT_RICOH_2A03_OAMDMA
// vblank::@8
// PPU->PPUSCROLL = 0
// [124] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2
// Set scroll
lda #0
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL
// PPU->PPUSCROLL = -8
// [125] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) -8 -- _deref_pbuc1=vbuc2
lda #-8
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL
// vblank::@return
// }
// [126] return - exit interrupt(HARDWARE_STACK)
pla
tay
pla
tax
pla
rti
}
// readJoy1
// Read Standard Controller #1
// Returns a byte representing the pushed buttons
// - bit 0: right
// - bit 1: left
// - bit 2: down
// - bit 3: up
// - bit 4: start
// - bit 5: select
// - bit 6: B
// - bit 7: A
readJoy1: {
.label __1 = 8
// APU->JOY1 = 1
// [127] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1 -- _deref_pbuc1=vbuc2
// Latch the controller buttons
lda #1
sta APU+OFFSET_STRUCT_RICOH_2A03_JOY1
// APU->JOY1 = 0
// [128] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0 -- _deref_pbuc1=vbuc2
lda #0
sta APU+OFFSET_STRUCT_RICOH_2A03_JOY1
// [129] phi from readJoy1 to readJoy1::@1 [phi:readJoy1->readJoy1::@1]
// [129] phi (byte) readJoy1::joy#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#0] -- vbuaa=vbuc1
// [129] phi (byte) readJoy1::i#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#1] -- vbuxx=vbuc1
tax
// readJoy1::@1
__b1:
// for(char i=0;i<8;i++)
// [130] if((byte) readJoy1::i#2<(byte) 8) goto readJoy1::@2 -- vbuxx_lt_vbuc1_then_la1
cpx #8
bcc __b2
// readJoy1::@return
// }
// [131] return
rts
// readJoy1::@2
__b2:
// joy<<1
// [132] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 -- vbuz1=vbuaa_rol_1
asl
sta.z __1
// APU->JOY1&1
// [133] (byte~) readJoy1::$2 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1 -- vbuaa=_deref_pbuc1_band_vbuc2
lda #1
and APU+OFFSET_STRUCT_RICOH_2A03_JOY1
// joy = joy<<1 | APU->JOY1&1
// [134] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2 -- vbuaa=vbuz1_bor_vbuaa
ora.z __1
// for(char i=0;i<8;i++)
// [135] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2 -- vbuxx=_inc_vbuxx
inx
// [129] phi from readJoy1::@2 to readJoy1::@1 [phi:readJoy1::@2->readJoy1::@1]
// [129] phi (byte) readJoy1::joy#2 = (byte) readJoy1::joy#1 [phi:readJoy1::@2->readJoy1::@1#0] -- register_copy
// [129] phi (byte) readJoy1::i#2 = (byte) readJoy1::i#1 [phi:readJoy1::@2->readJoy1::@1#1] -- register_copy
jmp __b1
}
// File Data
.segment Data
// Flag tile
FLAG: .byte $54, $55, $56, $57
// Floor tile
FLOOR: .byte $85, $85, $86, $86
// Sprite Data
SPRITES: .byte $96, $36, 2, $c, $96, $37, 2, $14, $9e, $38, 2, $c, $9e, $39, 2, $14, $96, $70, 0, $48, $96, $71, 0, $50, $9e, $72, 1, $48, $9e, $73, 1, $50
// Color Palette
PALETTE: .byte $11, $2d, 8, $18, $11, 6, $15, $36, $11, $39, $4a, $5b, $f, $3d, $4e, $5f, $11, $f, $30, 8, $11, $f, $18, 8, $11, $30, $37, $1a, $f, $f, $f, $f
.segment Tiles
TILES:
.import binary "smb1_chr.bin"
.segment GameRam
.align $100
SPRITE_BUFFER: .fill 4*$40, 0
.segment Vectors
VECTORS: .word vblank, main, 0