diff --git a/src/test/kc/examples/nes/nes-demo.c b/src/test/kc/examples/nes/nes-demo.c
index ba5e50518..e64269e96 100644
--- a/src/test/kc/examples/nes/nes-demo.c
+++ b/src/test/kc/examples/nes/nes-demo.c
@@ -32,33 +32,26 @@ void main() {
 // NMI Called when the PPU refreshes the screen (also known as the V-Blank period)
 interrupt(hardware_stack) void vblank() {
 
-    // DMA transfer the entire sprite buffer to the PPU
-    ppuSpriteBufferDmaTransfer(SPRITE_BUFFER);
-
    // Read controller 1
     char joy = readJoy1();
-
     if(joy&JOY_DOWN) {
         SPRITE_BUFFER[0].y++;
         SPRITE_BUFFER[1].y++;
         SPRITE_BUFFER[2].y++;
         SPRITE_BUFFER[3].y++;
     }
-
     if(joy&JOY_UP) {
         SPRITE_BUFFER[0].y--;
         SPRITE_BUFFER[1].y--;
         SPRITE_BUFFER[2].y--;
         SPRITE_BUFFER[3].y--;    
     }
-
     if(joy&JOY_LEFT) {
         SPRITE_BUFFER[0].x--;
         SPRITE_BUFFER[1].x--;
         SPRITE_BUFFER[2].x--;
         SPRITE_BUFFER[3].x--;    
     }
-
     if(joy&JOY_RIGHT) {
         SPRITE_BUFFER[0].x++;
         SPRITE_BUFFER[1].x++;
@@ -66,6 +59,9 @@ interrupt(hardware_stack) void vblank() {
         SPRITE_BUFFER[3].x++;    
     }
 
+    // DMA transfer the entire sprite buffer to the PPU
+    ppuSpriteBufferDmaTransfer(SPRITE_BUFFER);
+
     // Set scroll
     PPU->PPUSCROLL = 0;
     PPU->PPUSCROLL = -8;
@@ -82,13 +78,14 @@ char FLOOR[] = { 0x85, 0x85, 0x86, 0x86};
 
 // Sprite Data
 struct SpriteData SPRITES[] = {
-//     Y ,  TILE,  ATTR      ,  X
-    // Small Luigi 
+    // Small Luigi
+    // Y ,  TILE,  ATTR      ,  X
     { 150,  0x36,  0b00000010,  12 },		// Sprite 0
     { 150,  0x37,  0b00000010,  20 },		// Sprite 1
     { 158,  0x38,  0b00000010,  12 },		// Sprite 2
     { 158,  0x39,  0b00000010,  20 },		// Sprite 3
     // Small Goomba 
+    // Y ,  TILE,  ATTR      ,  X
     { 150,  0x70,  0b00000000,  72 },		// Sprite 0
     { 150,  0x71,  0b00000000,  80 },		// Sprite 1
     { 158,  0x72,  0b00000001,  72 },		// Sprite 2
@@ -116,7 +113,7 @@ export char TILES[] = kickasm(resource "smb1_chr.bin") {{
 }};
 
 // Sprite Buffer (in GAME RAM)
-// Will be transfered to the PPU via DMA during vblank
+// Will be transferred to the PPU via DMA during vblank
 #pragma data_seg(GameRam)
 struct SpriteData align(0x100) SPRITE_BUFFER[0x40];
 
diff --git a/src/test/ref/examples/nes/nes-demo.asm b/src/test/ref/examples/nes/nes-demo.asm
index 11b65feb1..f7fd6efd3 100644
--- a/src/test/ref/examples/nes/nes-demo.asm
+++ b/src/test/ref/examples/nes/nes-demo.asm
@@ -411,12 +411,6 @@ vblank: {
     pha
     tya
     pha
-    // PPU->OAMADDR = 0
-    lda #0
-    sta PPU+OFFSET_STRUCT_RICOH_2C02_OAMADDR
-    // APU->OAMDMA = >spriteBuffer
-    lda #>SPRITE_BUFFER
-    sta APU+OFFSET_STRUCT_RICOH_2A03_OAMDMA
     // readJoy1()
     jsr readJoy1
     // joy = readJoy1()
@@ -471,7 +465,7 @@ vblank: {
     and #JOY_RIGHT
     // if(joy&JOY_RIGHT)
     cmp #0
-    beq __b4
+    beq ppuSpriteBufferDmaTransfer1
     // SPRITE_BUFFER[0].x++;
     inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X
     // SPRITE_BUFFER[1].x++;
@@ -480,7 +474,13 @@ vblank: {
     inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+2*SIZEOF_STRUCT_SPRITEDATA
     // SPRITE_BUFFER[3].x++;
     inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+3*SIZEOF_STRUCT_SPRITEDATA
-  __b4:
+  ppuSpriteBufferDmaTransfer1:
+    // PPU->OAMADDR = 0
+    lda #0
+    sta PPU+OFFSET_STRUCT_RICOH_2C02_OAMADDR
+    // APU->OAMDMA = >spriteBuffer
+    lda #>SPRITE_BUFFER
+    sta APU+OFFSET_STRUCT_RICOH_2A03_OAMDMA
     // PPU->PPUSCROLL = 0
     // Set scroll
     lda #0
diff --git a/src/test/ref/examples/nes/nes-demo.cfg b/src/test/ref/examples/nes/nes-demo.cfg
index 924e784fb..a0f03dc15 100644
--- a/src/test/ref/examples/nes/nes-demo.cfg
+++ b/src/test/ref/examples/nes/nes-demo.cfg
@@ -218,81 +218,78 @@ ppuDataTransfer::@3: scope:[ppuDataTransfer]  from ppuDataTransfer::ppuDataPut1
 interrupt(HARDWARE_STACK)(void()) vblank()
 vblank: scope:[vblank]  from
   [94] phi()
-  to:vblank::ppuSpriteBufferDmaTransfer1
-vblank::ppuSpriteBufferDmaTransfer1: scope:[vblank]  from vblank
-  [95] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0
-  [96] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER
+  [95] call readJoy1 
+  [96] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2
   to:vblank::@9
-vblank::@9: scope:[vblank]  from vblank::ppuSpriteBufferDmaTransfer1
-  [97] phi()
-  [98] call readJoy1 
-  [99] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2
-  to:vblank::@10
-vblank::@10: scope:[vblank]  from vblank::@9
-  [100] (byte) vblank::joy#0 ← (byte) readJoy1::return#2
-  [101] (byte~) vblank::$2 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN
-  [102] if((byte) 0==(byte~) vblank::$2) goto vblank::@1
-  to:vblank::@5
-vblank::@5: scope:[vblank]  from vblank::@10
-  [103] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER)
-  [104] *((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)
-  [105] *((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)
-  [106] *((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::@10 vblank::@5
-  [107] (byte~) vblank::$4 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP
-  [108] if((byte) 0==(byte~) vblank::$4) goto vblank::@2
-  to:vblank::@6
-vblank::@6: scope:[vblank]  from vblank::@1
-  [109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER)
-  [110] *((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)
-  [111] *((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)
-  [112] *((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::@6
-  [113] (byte~) vblank::$6 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_LEFT
-  [114] if((byte) 0==(byte~) vblank::$6) goto vblank::@3
-  to:vblank::@7
-vblank::@7: scope:[vblank]  from vblank::@2
-  [115] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X)
-  [116] *((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)
-  [117] *((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)
-  [118] *((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::@7
-  [119] (byte~) vblank::$8 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_RIGHT
-  [120] if((byte) 0==(byte~) vblank::$8) goto vblank::@4
-  to:vblank::@8
-vblank::@8: scope:[vblank]  from vblank::@3
-  [121] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X)
-  [122] *((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)
-  [123] *((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)
-  [124] *((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)
+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::@3 vblank::@8
-  [125] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0
-  [126] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) -8
+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::@4
-  [127] return 
+vblank::@return: scope:[vblank]  from vblank::@8
+  [126] return 
   to:@return
 
 (byte()) readJoy1()
-readJoy1: scope:[readJoy1]  from vblank::@9
-  [128] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1
-  [129] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0
+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
-  [130] (byte) readJoy1::joy#2 ← phi( readJoy1/(byte) 0 readJoy1::@2/(byte) readJoy1::joy#1 )
-  [130] (byte) readJoy1::i#2 ← phi( readJoy1/(byte) 0 readJoy1::@2/(byte) readJoy1::i#1 )
-  [131] if((byte) readJoy1::i#2<(byte) 8) goto 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
-  [132] return 
+  [131] return 
   to:@return
 readJoy1::@2: scope:[readJoy1]  from readJoy1::@1
-  [133] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1
-  [134] (byte~) readJoy1::$2 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1
-  [135] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2
-  [136] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2
+  [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
diff --git a/src/test/ref/examples/nes/nes-demo.log b/src/test/ref/examples/nes/nes-demo.log
index 0e7d541d6..3afd19af2 100644
--- a/src/test/ref/examples/nes/nes-demo.log
+++ b/src/test/ref/examples/nes/nes-demo.log
@@ -80,7 +80,7 @@ CONTROL FLOW GRAPH SSA
   to:@1
 
 (byte()) readJoy1()
-readJoy1: scope:[readJoy1]  from vblank::@9
+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
@@ -494,37 +494,24 @@ main::@return: scope:[main]  from main::@4
 
 interrupt(HARDWARE_STACK)(void()) vblank()
 vblank: scope:[vblank]  from
-  (struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 ← (const struct SpriteData*) SPRITE_BUFFER
-  to:vblank::ppuSpriteBufferDmaTransfer1
-vblank::ppuSpriteBufferDmaTransfer1: scope:[vblank]  from vblank
-  (struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#1 ← phi( vblank/(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
   call readJoy1 
   (byte) readJoy1::return#2 ← (byte) readJoy1::return#1
   to:vblank::@10
-vblank::@10: scope:[vblank]  from vblank::@9
-  (byte) readJoy1::return#4 ← phi( vblank::@9/(byte) readJoy1::return#2 )
-  (byte~) vblank::$1 ← (byte) readJoy1::return#4
-  (byte) vblank::joy#0 ← (byte~) vblank::$1
-  (byte~) vblank::$2 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN
-  (bool~) vblank::$62 ← (number) 0 != (byte~) vblank::$2
-  (bool~) vblank::$3 ← ! (bool~) vblank::$62
-  if((bool~) vblank::$3) goto vblank::@1
+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::$4 ← (byte) vblank::joy#1 & (const nomodify byte) JOY_UP
-  (bool~) vblank::$63 ← (number) 0 != (byte~) vblank::$4
-  (bool~) vblank::$5 ← ! (bool~) vblank::$63
-  if((bool~) vblank::$5) goto vblank::@2
+  (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 )
@@ -539,10 +526,10 @@ vblank::@5: scope:[vblank]  from vblank::@10
   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::$6 ← (byte) vblank::joy#2 & (const nomodify byte) JOY_LEFT
-  (bool~) vblank::$64 ← (number) 0 != (byte~) vblank::$6
-  (bool~) vblank::$7 ← ! (bool~) vblank::$64
-  if((bool~) vblank::$7) goto vblank::@3
+  (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 )
@@ -557,10 +544,10 @@ vblank::@6: scope:[vblank]  from vblank::@1
   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::$8 ← (byte) vblank::joy#3 & (const nomodify byte) JOY_RIGHT
-  (bool~) vblank::$65 ← (number) 0 != (byte~) vblank::$8
-  (bool~) vblank::$9 ← ! (bool~) vblank::$65
-  if((bool~) vblank::$9) goto vblank::@4
+  (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 )
@@ -574,6 +561,19 @@ vblank::@7: scope:[vblank]  from vblank::@2
   *((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
@@ -591,7 +591,7 @@ vblank::@8: scope:[vblank]  from vblank::@3
   (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::@4
+vblank::@return: scope:[vblank]  from vblank::@9
   return 
   to:@return
 @1: scope:[]  from @begin
@@ -993,39 +993,39 @@ SYMBOL TABLE SSA
 (byte) readJoy1::return#3
 (byte) readJoy1::return#4
 interrupt(HARDWARE_STACK)(void()) vblank()
+(byte~) vblank::$0
 (byte~) vblank::$1
-(byte~) vblank::$2
+(bool~) vblank::$2
 (number~) vblank::$27
 (number~) vblank::$29
-(bool~) vblank::$3
+(byte~) vblank::$3
 (number~) vblank::$31
 (number~) vblank::$33
 (number~) vblank::$35
 (number~) vblank::$37
 (number~) vblank::$39
-(byte~) vblank::$4
+(bool~) vblank::$4
 (number~) vblank::$41
 (number~) vblank::$43
 (number~) vblank::$45
 (number~) vblank::$47
 (number~) vblank::$49
-(bool~) vblank::$5
+(byte~) vblank::$5
 (number~) vblank::$51
 (number~) vblank::$53
 (number~) vblank::$55
 (number~) vblank::$57
 (byte*~) vblank::$58
 (byte*~) vblank::$59
-(byte~) vblank::$6
+(bool~) vblank::$6
 (byte*~) vblank::$60
 (byte*~) vblank::$61
 (bool~) vblank::$62
 (bool~) vblank::$63
 (bool~) vblank::$64
 (bool~) vblank::$65
-(bool~) vblank::$7
-(byte~) vblank::$8
-(bool~) vblank::$9
+(byte~) vblank::$7
+(bool~) vblank::$8
 (label) vblank::@1
 (label) vblank::@10
 (label) vblank::@2
@@ -1105,9 +1105,8 @@ Adding number conversion cast (unumber) $1c in (nomodify void*) ppuDataPutTile::
 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) $18 in *((byte*~) main::enableVideoOutput1_$1) ← (number) $18
-Adding number conversion cast (unumber) 0 in *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1) ← (number) 0
-Adding number conversion cast (unumber) 0 in (bool~) vblank::$62 ← (number) 0 != (byte~) vblank::$2
-Adding number conversion cast (unumber) 0 in (bool~) vblank::$63 ← (number) 0 != (byte~) vblank::$4
+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
@@ -1116,7 +1115,7 @@ Adding number conversion cast (unumber) 2 in (number~) vblank::$31 ← (number)
 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::$6
+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
@@ -1125,7 +1124,7 @@ Adding number conversion cast (unumber) 2 in (number~) vblank::$39 ← (number)
 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::$8
+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
@@ -1134,6 +1133,7 @@ Adding number conversion cast (unumber) 2 in (number~) vblank::$47 ← (number)
 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
@@ -1227,7 +1227,6 @@ Simplifying constant integer cast $18
 Simplifying constant integer cast 0
 Simplifying constant integer cast 0
 Simplifying constant integer cast 0
-Simplifying constant integer cast 0
 Simplifying constant integer cast 1
 Simplifying constant integer cast 2
 Simplifying constant integer cast 3
@@ -1242,6 +1241,7 @@ 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
@@ -1295,7 +1295,6 @@ Finalized unsigned number type (byte) $18
 Finalized unsigned number type (byte) 0
 Finalized unsigned number type (byte) 0
 Finalized unsigned number type (byte) 0
-Finalized unsigned number type (byte) 0
 Finalized unsigned number type (byte) 1
 Finalized unsigned number type (byte) 2
 Finalized unsigned number type (byte) 3
@@ -1310,6 +1309,7 @@ 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
@@ -1338,10 +1338,10 @@ Inferred type updated to byte in (unumber~) vblank::$55 ← (byte) 2 * (const by
 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 [239] (bool~) vblank::$3 ← (byte) 0 == (byte~) vblank::$2 from [238] (bool~) vblank::$62 ← (byte) 0 != (byte~) vblank::$2
-Inversing boolean not [244] (bool~) vblank::$5 ← (byte) 0 == (byte~) vblank::$4 from [243] (bool~) vblank::$63 ← (byte) 0 != (byte~) vblank::$4
-Inversing boolean not [258] (bool~) vblank::$7 ← (byte) 0 == (byte~) vblank::$6 from [257] (bool~) vblank::$64 ← (byte) 0 != (byte~) vblank::$6
-Inversing boolean not [272] (bool~) vblank::$9 ← (byte) 0 == (byte~) vblank::$8 from [271] (bool~) vblank::$65 ← (byte) 0 != (byte~) vblank::$8
+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 
@@ -1374,11 +1374,11 @@ Alias memcpy::destination#2 = memcpy::destination#4 memcpy::destination#3 memcpy
 Alias ppuDataTransfer::size#0 = main::$1 
 Alias main::x#2 = main::x#3 main::x#4 
 Alias memcpy::num#0 = main::$6 
-Alias vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 = vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#1 
 Alias readJoy1::return#2 = readJoy1::return#4 
-Alias vblank::joy#0 = vblank::$1 vblank::joy#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
@@ -1403,10 +1403,10 @@ Simple Condition (bool~) main::initNES1_$5 [135] if((byte) 0!=(byte) main::initN
 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::$3 [193] if((byte) 0==(byte~) vblank::$2) goto vblank::@1
-Simple Condition (bool~) vblank::$5 [196] if((byte) 0==(byte~) vblank::$4) goto vblank::@2
-Simple Condition (bool~) vblank::$7 [207] if((byte) 0==(byte~) vblank::$6) goto vblank::@3
-Simple Condition (bool~) vblank::$9 [218] if((byte) 0==(byte~) vblank::$8) goto vblank::@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
@@ -1434,20 +1434,20 @@ Constant right-side identified [142] (word) ppuDataTransfer::size#0 ← sizeof
 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 [181] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$3 ← (byte*)(const struct RICOH_2C02*) PPU
-Constant right-side identified [185] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$4 ← (byte*)(const struct RICOH_2A03*) APU
-Constant right-side identified [197] (byte~) vblank::$27 ← (byte) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
-Constant right-side identified [199] (byte~) vblank::$29 ← (byte) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
-Constant right-side identified [201] (byte~) vblank::$31 ← (byte) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
-Constant right-side identified [203] (byte~) vblank::$33 ← (byte) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
-Constant right-side identified [208] (byte~) vblank::$35 ← (byte) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
-Constant right-side identified [210] (byte~) vblank::$37 ← (byte) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
-Constant right-side identified [212] (byte~) vblank::$39 ← (byte) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
-Constant right-side identified [214] (byte~) vblank::$41 ← (byte) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
-Constant right-side identified [219] (byte~) vblank::$43 ← (byte) 0 * (const byte) SIZEOF_STRUCT_SPRITEDATA
-Constant right-side identified [221] (byte~) vblank::$45 ← (byte) 1 * (const byte) SIZEOF_STRUCT_SPRITEDATA
-Constant right-side identified [223] (byte~) vblank::$47 ← (byte) 2 * (const byte) SIZEOF_STRUCT_SPRITEDATA
-Constant right-side identified [225] (byte~) vblank::$49 ← (byte) 3 * (const byte) SIZEOF_STRUCT_SPRITEDATA
+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
@@ -1500,9 +1500,6 @@ 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 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::$27 = 0*SIZEOF_STRUCT_SPRITEDATA
 Constant (const byte) vblank::$29 = 1*SIZEOF_STRUCT_SPRITEDATA
 Constant (const byte) vblank::$31 = 2*SIZEOF_STRUCT_SPRITEDATA
@@ -1515,6 +1512,9 @@ 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
@@ -1554,8 +1554,8 @@ Converting *(pointer+n) to pointer[n] [120] (byte~) main::initNES1_waitForVBlank
 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) $18  -- *(main::enableVideoOutput1_$3 + OFFSET_STRUCT_RICOH_2C02_PPUMASK)
-Converting *(pointer+n) to pointer[n] [183] *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1) ← (byte) 0  -- *(vblank::ppuSpriteBufferDmaTransfer1_$3 + OFFSET_STRUCT_RICOH_2C02_OAMADDR)
-Converting *(pointer+n) to pointer[n] [187] *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2) ← (byte~) vblank::ppuSpriteBufferDmaTransfer1_$0  -- *(vblank::ppuSpriteBufferDmaTransfer1_$4 + OFFSET_STRUCT_RICOH_2A03_OAMDMA)
+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
@@ -1570,28 +1570,28 @@ Simplifying expression containing zero main::initNES1_disableVideoOutput1_$2 in
 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 [198] *((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 [198] *((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 [198] *((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 [198] *((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 [200] *((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 [200] *((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 [202] *((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 [202] *((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 [204] *((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 [204] *((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 [209] *((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 [209] *((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 [209] *((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 [209] *((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 [211] *((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 [211] *((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 [213] *((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 [213] *((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 [215] *((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 [215] *((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 [220] *((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 [220] *((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_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
@@ -1619,8 +1619,8 @@ Eliminating unused variable (byte*~) main::initNES1_waitForVBlank1_$2 and assign
 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 [118] (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 [121] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2 ← (const byte*) vblank::ppuSpriteBufferDmaTransfer1_$4 + (const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA
+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
@@ -1639,7 +1639,7 @@ 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 [94] (byte~) vblank::ppuSpriteBufferDmaTransfer1_$0 ← > (const struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#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
@@ -1766,26 +1766,26 @@ Consolidated array index constant in *((byte*)APU+OFFSET_STRUCT_RICOH_2A03_DMC_F
 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*)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_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)
@@ -1819,12 +1819,12 @@ 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::@9
+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:113 
+Calls in [vblank] to readJoy1:110 
 
 Created 14 initial phi equivalence classes
 Coalesced [52] main::x#5 ← main::x#1
@@ -1846,11 +1846,18 @@ 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
@@ -1866,7 +1873,6 @@ 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
-Adding NOP phi() at start of vblank::@9
 
 FINAL CONTROL FLOW GRAPH
 @begin: scope:[]  from
@@ -2089,83 +2095,80 @@ ppuDataTransfer::@3: scope:[ppuDataTransfer]  from ppuDataTransfer::ppuDataPut1
 interrupt(HARDWARE_STACK)(void()) vblank()
 vblank: scope:[vblank]  from
   [94] phi()
-  to:vblank::ppuSpriteBufferDmaTransfer1
-vblank::ppuSpriteBufferDmaTransfer1: scope:[vblank]  from vblank
-  [95] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0
-  [96] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER
+  [95] call readJoy1 
+  [96] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2
   to:vblank::@9
-vblank::@9: scope:[vblank]  from vblank::ppuSpriteBufferDmaTransfer1
-  [97] phi()
-  [98] call readJoy1 
-  [99] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2
-  to:vblank::@10
-vblank::@10: scope:[vblank]  from vblank::@9
-  [100] (byte) vblank::joy#0 ← (byte) readJoy1::return#2
-  [101] (byte~) vblank::$2 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN
-  [102] if((byte) 0==(byte~) vblank::$2) goto vblank::@1
-  to:vblank::@5
-vblank::@5: scope:[vblank]  from vblank::@10
-  [103] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER)
-  [104] *((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)
-  [105] *((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)
-  [106] *((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::@10 vblank::@5
-  [107] (byte~) vblank::$4 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP
-  [108] if((byte) 0==(byte~) vblank::$4) goto vblank::@2
-  to:vblank::@6
-vblank::@6: scope:[vblank]  from vblank::@1
-  [109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER)
-  [110] *((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)
-  [111] *((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)
-  [112] *((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::@6
-  [113] (byte~) vblank::$6 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_LEFT
-  [114] if((byte) 0==(byte~) vblank::$6) goto vblank::@3
-  to:vblank::@7
-vblank::@7: scope:[vblank]  from vblank::@2
-  [115] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X)
-  [116] *((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)
-  [117] *((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)
-  [118] *((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::@7
-  [119] (byte~) vblank::$8 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_RIGHT
-  [120] if((byte) 0==(byte~) vblank::$8) goto vblank::@4
-  to:vblank::@8
-vblank::@8: scope:[vblank]  from vblank::@3
-  [121] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X)
-  [122] *((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)
-  [123] *((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)
-  [124] *((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)
+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::@3 vblank::@8
-  [125] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0
-  [126] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) -8
+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::@4
-  [127] return 
+vblank::@return: scope:[vblank]  from vblank::@8
+  [126] return 
   to:@return
 
 (byte()) readJoy1()
-readJoy1: scope:[readJoy1]  from vblank::@9
-  [128] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1
-  [129] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0
+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
-  [130] (byte) readJoy1::joy#2 ← phi( readJoy1/(byte) 0 readJoy1::@2/(byte) readJoy1::joy#1 )
-  [130] (byte) readJoy1::i#2 ← phi( readJoy1/(byte) 0 readJoy1::@2/(byte) readJoy1::i#1 )
-  [131] if((byte) readJoy1::i#2<(byte) 8) goto 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
-  [132] return 
+  [131] return 
   to:@return
 readJoy1::@2: scope:[readJoy1]  from readJoy1::@1
-  [133] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1
-  [134] (byte~) readJoy1::$2 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1
-  [135] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2
-  [136] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2
+  [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
 
 
@@ -2288,10 +2291,10 @@ VARIABLE REGISTER WEIGHTS
 (byte) readJoy1::return
 (byte) readJoy1::return#2 4.0
 interrupt(HARDWARE_STACK)(void()) vblank()
-(byte~) vblank::$2 4.0
-(byte~) vblank::$4 4.0
-(byte~) vblank::$6 4.0
-(byte~) vblank::$8 4.0
+(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
@@ -2328,10 +2331,10 @@ Added variable ppuDataFill::ppuDataPrepare1_$1 to live range equivalence class [
 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::$2 to live range equivalence class [ vblank::$2 ]
-Added variable vblank::$4 to live range equivalence class [ vblank::$4 ]
-Added variable vblank::$6 to live range equivalence class [ vblank::$6 ]
-Added variable vblank::$8 to live range equivalence class [ vblank::$8 ]
+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
@@ -2366,10 +2369,10 @@ Complete equivalence classes
 [ ppuDataTransfer::ppuDataPut1_val#0 ]
 [ readJoy1::return#2 ]
 [ vblank::joy#0 ]
-[ vblank::$2 ]
-[ vblank::$4 ]
-[ vblank::$6 ]
-[ vblank::$8 ]
+[ vblank::$1 ]
+[ vblank::$3 ]
+[ vblank::$5 ]
+[ vblank::$7 ]
 [ readJoy1::$1 ]
 [ readJoy1::$2 ]
 Allocated zp[1]:2 [ main::initNES1_i#2 main::initNES1_i#1 ]
@@ -2403,10 +2406,10 @@ 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::$2 ]
-Allocated zp[1]:45 [ vblank::$4 ]
-Allocated zp[1]:46 [ vblank::$6 ]
-Allocated zp[1]:47 [ vblank::$8 ]
+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 ]
 
@@ -3120,10 +3123,10 @@ ppuDataTransfer: {
   // vblank
 // NMI Called when the PPU refreshes the screen (also known as the V-Blank period)
 vblank: {
-    .label __2 = $2c
-    .label __4 = $2d
-    .label __6 = $2e
-    .label __8 = $2f
+    .label __1 = $2c
+    .label __3 = $2d
+    .label __5 = $2e
+    .label __7 = $2f
     .label joy = $2b
     // entry interrupt(HARDWARE_STACK)
     pha
@@ -3131,130 +3134,125 @@ vblank: {
     pha
     tya
     pha
-    jmp ppuSpriteBufferDmaTransfer1
-    // vblank::ppuSpriteBufferDmaTransfer1
-  ppuSpriteBufferDmaTransfer1:
-    // [95] *((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
-    // [96] *((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
-    // [97] phi from vblank::ppuSpriteBufferDmaTransfer1 to vblank::@9 [phi:vblank::ppuSpriteBufferDmaTransfer1->vblank::@9]
-  __b9_from_ppuSpriteBufferDmaTransfer1:
+    // [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:
-    // [98] call readJoy1 
-    jsr readJoy1
-    // [99] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2 -- vbuz1=vbuz2 
-    lda.z readJoy1.joy
-    sta.z readJoy1.return
-    jmp __b10
-    // vblank::@10
-  __b10:
-    // [100] (byte) vblank::joy#0 ← (byte) readJoy1::return#2 -- vbuz1=vbuz2 
+    // [97] (byte) vblank::joy#0 ← (byte) readJoy1::return#2 -- vbuz1=vbuz2 
     lda.z readJoy1.return
     sta.z joy
-    // [101] (byte~) vblank::$2 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN -- vbuz1=vbuz2_band_vbuc1 
+    // [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 __2
-    // [102] if((byte) 0==(byte~) vblank::$2) goto vblank::@1 -- vbuc1_eq_vbuz1_then_la1 
+    sta.z __1
+    // [99] if((byte) 0==(byte~) vblank::$1) goto vblank::@1 -- vbuc1_eq_vbuz1_then_la1 
     lda #0
-    cmp.z __2
+    cmp.z __1
     beq __b1
-    jmp __b5
-    // vblank::@5
-  __b5:
-    // [103] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER) -- _deref_pbuc1=_inc__deref_pbuc1 
+    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
-    // [104] *((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 
+    // [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
-    // [105] *((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 
+    // [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
-    // [106] *((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 
+    // [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:
-    // [107] (byte~) vblank::$4 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP -- vbuz1=vbuz2_band_vbuc1 
+    // [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 __4
-    // [108] if((byte) 0==(byte~) vblank::$4) goto vblank::@2 -- vbuc1_eq_vbuz1_then_la1 
+    sta.z __3
+    // [105] if((byte) 0==(byte~) vblank::$3) goto vblank::@2 -- vbuc1_eq_vbuz1_then_la1 
     lda #0
-    cmp.z __4
+    cmp.z __3
     beq __b2
-    jmp __b6
-    // vblank::@6
-  __b6:
-    // [109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER) -- _deref_pbuc1=_dec__deref_pbuc1 
+    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
-    // [110] *((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 
+    // [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
-    // [111] *((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 
+    // [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
-    // [112] *((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 
+    // [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:
-    // [113] (byte~) vblank::$6 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_LEFT -- vbuz1=vbuz2_band_vbuc1 
+    // [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 __6
-    // [114] if((byte) 0==(byte~) vblank::$6) goto vblank::@3 -- vbuc1_eq_vbuz1_then_la1 
+    sta.z __5
+    // [111] if((byte) 0==(byte~) vblank::$5) goto vblank::@3 -- vbuc1_eq_vbuz1_then_la1 
     lda #0
-    cmp.z __6
+    cmp.z __5
     beq __b3
-    jmp __b7
-    // vblank::@7
-  __b7:
-    // [115] *((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 
+    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
-    // [116] *((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 
+    // [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
-    // [117] *((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 
+    // [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
-    // [118] *((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 
+    // [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:
-    // [119] (byte~) vblank::$8 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_RIGHT -- vbuz1=vbuz2_band_vbuc1 
+    // [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 __8
-    // [120] if((byte) 0==(byte~) vblank::$8) goto vblank::@4 -- vbuc1_eq_vbuz1_then_la1 
+    sta.z __7
+    // [117] if((byte) 0==(byte~) vblank::$7) goto vblank::ppuSpriteBufferDmaTransfer1 -- vbuc1_eq_vbuz1_then_la1 
     lda #0
-    cmp.z __8
-    beq __b4
+    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:
-    // [121] *((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
-    // [122] *((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
-    // [123] *((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
-    // [124] *((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 __b4
-    // vblank::@4
-  __b4:
-    // [125] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2 
+    // [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
-    // [126] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) -8 -- _deref_pbuc1=vbuc2 
+    // [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:
-    // [127] return  - exit interrupt(HARDWARE_STACK)
+    // [126] return  - exit interrupt(HARDWARE_STACK)
     pla
     tay
     pla
@@ -3279,53 +3277,53 @@ readJoy1: {
     .label joy = $18
     .label i = $17
     .label return = $2a
-    // [128] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1 -- _deref_pbuc1=vbuc2 
+    // [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
-    // [129] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0 -- _deref_pbuc1=vbuc2 
+    // [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
-    // [130] phi from readJoy1 to readJoy1::@1 [phi:readJoy1->readJoy1::@1]
+    // [129] phi from readJoy1 to readJoy1::@1 [phi:readJoy1->readJoy1::@1]
   __b1_from_readJoy1:
-    // [130] phi (byte) readJoy1::joy#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#0] -- vbuz1=vbuc1 
+    // [129] phi (byte) readJoy1::joy#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#0] -- vbuz1=vbuc1 
     lda #0
     sta.z joy
-    // [130] phi (byte) readJoy1::i#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#1] -- vbuz1=vbuc1 
+    // [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:
-    // [131] if((byte) readJoy1::i#2<(byte) 8) goto readJoy1::@2 -- vbuz1_lt_vbuc1_then_la1 
+    // [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:
-    // [132] return 
+    // [131] return 
     rts
     // readJoy1::@2
   __b2:
-    // [133] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 -- vbuz1=vbuz2_rol_1 
+    // [132] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 -- vbuz1=vbuz2_rol_1 
     lda.z joy
     asl
     sta.z __1
-    // [134] (byte~) readJoy1::$2 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1 -- vbuz1=_deref_pbuc1_band_vbuc2 
+    // [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
-    // [135] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2 -- vbuz1=vbuz2_bor_vbuz3 
+    // [134] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2 -- vbuz1=vbuz2_bor_vbuz3 
     lda.z __1
     ora.z __2
     sta.z joy
-    // [136] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2 -- vbuz1=_inc_vbuz1 
+    // [135] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2 -- vbuz1=_inc_vbuz1 
     inc.z i
-    // [130] phi from readJoy1::@2 to readJoy1::@1 [phi:readJoy1::@2->readJoy1::@1]
+    // [129] phi from readJoy1::@2 to readJoy1::@1 [phi:readJoy1::@2->readJoy1::@1]
   __b1_from___b2:
-    // [130] phi (byte) readJoy1::joy#2 = (byte) readJoy1::joy#1 [phi:readJoy1::@2->readJoy1::@1#0] -- register_copy 
-    // [130] phi (byte) readJoy1::i#2 = (byte) readJoy1::i#1 [phi:readJoy1::@2->readJoy1::@1#1] -- register_copy 
+    // [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
@@ -3392,21 +3390,21 @@ Statement [85] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUC
 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 [95] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
-Statement [96] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER [ ] (  [ ] { }  ) always clobbers reg byte a 
-Statement [101] (byte~) vblank::$2 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN [ vblank::joy#0 vblank::$2 ] (  [ vblank::joy#0 vblank::$2 ] { }  ) always clobbers reg byte a 
+Statement [98] (byte~) vblank::$1 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN [ vblank::joy#0 vblank::$1 ] (  [ vblank::joy#0 vblank::$1 ] { }  ) always clobbers reg byte a 
 Removing always clobbered register reg byte a as potential for zp[1]:43 [ vblank::joy#0 ]
-Statement [107] (byte~) vblank::$4 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP [ vblank::joy#0 vblank::$4 ] (  [ vblank::joy#0 vblank::$4 ] { }  ) always clobbers reg byte a 
-Statement [113] (byte~) vblank::$6 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_LEFT [ vblank::joy#0 vblank::$6 ] (  [ vblank::joy#0 vblank::$6 ] { }  ) always clobbers reg byte a 
-Statement [119] (byte~) vblank::$8 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_RIGHT [ vblank::$8 ] (  [ vblank::$8 ] { }  ) always clobbers reg byte a 
-Statement [125] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
-Statement [126] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) -8 [ ] (  [ ] { }  ) always clobbers reg byte a 
-Statement [127] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
-Statement [128] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1 [ ] ( readJoy1:98 [ ] { { readJoy1::return#2 = readJoy1::joy#2 } }  ) always clobbers reg byte a 
-Statement [129] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0 [ ] ( readJoy1:98 [ ] { { readJoy1::return#2 = readJoy1::joy#2 } }  ) always clobbers reg byte a 
-Statement [133] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 [ readJoy1::i#2 readJoy1::$1 ] ( readJoy1:98 [ readJoy1::i#2 readJoy1::$1 ] { { readJoy1::return#2 = readJoy1::joy#2 } }  ) always clobbers reg byte a 
+Statement [104] (byte~) vblank::$3 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP [ vblank::joy#0 vblank::$3 ] (  [ vblank::joy#0 vblank::$3 ] { }  ) always clobbers reg byte a 
+Statement [110] (byte~) vblank::$5 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_LEFT [ vblank::joy#0 vblank::$5 ] (  [ vblank::joy#0 vblank::$5 ] { }  ) always clobbers reg byte a 
+Statement [116] (byte~) vblank::$7 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_RIGHT [ vblank::$7 ] (  [ vblank::$7 ] { }  ) always clobbers reg byte a 
+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 [134] (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:98 [ readJoy1::i#2 readJoy1::$1 readJoy1::$2 ] { { 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 
 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 
@@ -3447,19 +3445,19 @@ Statement [85] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUC
 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 [95] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
-Statement [96] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER [ ] (  [ ] { }  ) always clobbers reg byte a 
-Statement [101] (byte~) vblank::$2 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN [ vblank::joy#0 vblank::$2 ] (  [ vblank::joy#0 vblank::$2 ] { }  ) always clobbers reg byte a 
-Statement [107] (byte~) vblank::$4 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP [ vblank::joy#0 vblank::$4 ] (  [ vblank::joy#0 vblank::$4 ] { }  ) always clobbers reg byte a 
-Statement [113] (byte~) vblank::$6 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_LEFT [ vblank::joy#0 vblank::$6 ] (  [ vblank::joy#0 vblank::$6 ] { }  ) always clobbers reg byte a 
-Statement [119] (byte~) vblank::$8 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_RIGHT [ vblank::$8 ] (  [ vblank::$8 ] { }  ) always clobbers reg byte a 
-Statement [125] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [ ] (  [ ] { }  ) always clobbers reg byte a 
-Statement [126] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) -8 [ ] (  [ ] { }  ) always clobbers reg byte a 
-Statement [127] return  [ ] (  [ ] { }  ) always clobbers reg byte a reg byte x reg byte y 
-Statement [128] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1 [ ] ( readJoy1:98 [ ] { { readJoy1::return#2 = readJoy1::joy#2 } }  ) always clobbers reg byte a 
-Statement [129] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0 [ ] ( readJoy1:98 [ ] { { readJoy1::return#2 = readJoy1::joy#2 } }  ) always clobbers reg byte a 
-Statement [133] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 [ readJoy1::i#2 readJoy1::$1 ] ( readJoy1:98 [ readJoy1::i#2 readJoy1::$1 ] { { readJoy1::return#2 = readJoy1::joy#2 } }  ) always clobbers reg byte a 
-Statement [134] (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:98 [ readJoy1::i#2 readJoy1::$1 readJoy1::$2 ] { { readJoy1::return#2 = readJoy1::joy#2 } }  ) always clobbers reg byte a 
+Statement [98] (byte~) vblank::$1 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN [ vblank::joy#0 vblank::$1 ] (  [ vblank::joy#0 vblank::$1 ] { }  ) always clobbers reg byte a 
+Statement [104] (byte~) vblank::$3 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP [ vblank::joy#0 vblank::$3 ] (  [ vblank::joy#0 vblank::$3 ] { }  ) always clobbers reg byte a 
+Statement [110] (byte~) vblank::$5 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_LEFT [ vblank::joy#0 vblank::$5 ] (  [ vblank::joy#0 vblank::$5 ] { }  ) always clobbers reg byte a 
+Statement [116] (byte~) vblank::$7 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_RIGHT [ vblank::$7 ] (  [ vblank::$7 ] { }  ) always clobbers reg byte a 
+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 , 
@@ -3491,10 +3489,10 @@ Potential registers zp[1]:40 [ ppuDataFill::ppuDataPrepare1_$1 ] : zp[1]:40 , re
 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 x , reg byte y , 
-Potential registers zp[1]:44 [ vblank::$2 ] : zp[1]:44 , reg byte a , reg byte x , reg byte y , 
-Potential registers zp[1]:45 [ vblank::$4 ] : zp[1]:45 , reg byte a , reg byte x , reg byte y , 
-Potential registers zp[1]:46 [ vblank::$6 ] : zp[1]:46 , reg byte a , reg byte x , reg byte y , 
-Potential registers zp[1]:47 [ vblank::$8 ] : zp[1]:47 , 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 , 
 
@@ -3505,40 +3503,40 @@ Uplift Scope [memcpy] 3,003: zp[2]:8 [ memcpy::src#2 memcpy::src#1 ] 2,002: zp[2
 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::$2 ] 4: zp[1]:45 [ vblank::$4 ] 4: zp[1]:46 [ vblank::$6 ] 4: zp[1]:47 [ vblank::$8 ] 0.53: zp[1]:43 [ vblank::joy#0 ] 
+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 6044 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 ] 
+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 5984 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 5984 combination zp[2]:8 [ memcpy::src#2 memcpy::src#1 ] zp[2]:10 [ memcpy::dst#2 memcpy::dst#1 ] 
-Uplifting [ppuDataFill] best 5936 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 5356 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 5113 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 ] 
+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 5089 combination reg byte a [ vblank::$2 ] reg byte a [ vblank::$4 ] reg byte a [ vblank::$6 ] reg byte a [ vblank::$8 ] zp[1]:43 [ vblank::joy#0 ] 
+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 768 possible.
-Uplifting [RICOH_2C02] best 5089 combination 
-Uplifting [RICOH_2A03] best 5089 combination 
-Uplifting [SpriteData] best 5089 combination 
-Uplifting [] best 5089 combination 
+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 5083 combination reg byte a [ 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 5077 combination reg byte a [ 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 5071 combination reg byte a [ 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 5065 combination reg byte a [ 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 5065 combination zp[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 5059 combination reg byte a [ 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 5054 combination reg byte x [ 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 ] ]
@@ -4203,119 +4201,114 @@ vblank: {
     pha
     tya
     pha
-    jmp ppuSpriteBufferDmaTransfer1
-    // vblank::ppuSpriteBufferDmaTransfer1
-  ppuSpriteBufferDmaTransfer1:
-    // [95] *((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
-    // [96] *((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
-    // [97] phi from vblank::ppuSpriteBufferDmaTransfer1 to vblank::@9 [phi:vblank::ppuSpriteBufferDmaTransfer1->vblank::@9]
-  __b9_from_ppuSpriteBufferDmaTransfer1:
+    // [95] call readJoy1 
+    jsr readJoy1
+    // [96] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2
     jmp __b9
     // vblank::@9
   __b9:
-    // [98] call readJoy1 
-    jsr readJoy1
-    // [99] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2
-    jmp __b10
-    // vblank::@10
-  __b10:
-    // [100] (byte) vblank::joy#0 ← (byte) readJoy1::return#2 -- vbuxx=vbuaa 
+    // [97] (byte) vblank::joy#0 ← (byte) readJoy1::return#2 -- vbuxx=vbuaa 
     tax
-    // [101] (byte~) vblank::$2 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN -- vbuaa=vbuxx_band_vbuc1 
+    // [98] (byte~) vblank::$1 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN -- vbuaa=vbuxx_band_vbuc1 
     txa
     and #JOY_DOWN
-    // [102] if((byte) 0==(byte~) vblank::$2) goto vblank::@1 -- vbuc1_eq_vbuaa_then_la1 
+    // [99] if((byte) 0==(byte~) vblank::$1) goto vblank::@1 -- vbuc1_eq_vbuaa_then_la1 
     cmp #0
     beq __b1
-    jmp __b5
-    // vblank::@5
-  __b5:
-    // [103] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER) -- _deref_pbuc1=_inc__deref_pbuc1 
+    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
-    // [104] *((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 
+    // [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
-    // [105] *((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 
+    // [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
-    // [106] *((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 
+    // [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:
-    // [107] (byte~) vblank::$4 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP -- vbuaa=vbuxx_band_vbuc1 
+    // [104] (byte~) vblank::$3 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP -- vbuaa=vbuxx_band_vbuc1 
     txa
     and #JOY_UP
-    // [108] if((byte) 0==(byte~) vblank::$4) goto vblank::@2 -- vbuc1_eq_vbuaa_then_la1 
+    // [105] if((byte) 0==(byte~) vblank::$3) goto vblank::@2 -- vbuc1_eq_vbuaa_then_la1 
     cmp #0
     beq __b2
-    jmp __b6
-    // vblank::@6
-  __b6:
-    // [109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER) -- _deref_pbuc1=_dec__deref_pbuc1 
+    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
-    // [110] *((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 
+    // [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
-    // [111] *((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 
+    // [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
-    // [112] *((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 
+    // [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:
-    // [113] (byte~) vblank::$6 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_LEFT -- vbuaa=vbuxx_band_vbuc1 
+    // [110] (byte~) vblank::$5 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_LEFT -- vbuaa=vbuxx_band_vbuc1 
     txa
     and #JOY_LEFT
-    // [114] if((byte) 0==(byte~) vblank::$6) goto vblank::@3 -- vbuc1_eq_vbuaa_then_la1 
+    // [111] if((byte) 0==(byte~) vblank::$5) goto vblank::@3 -- vbuc1_eq_vbuaa_then_la1 
     cmp #0
     beq __b3
-    jmp __b7
-    // vblank::@7
-  __b7:
-    // [115] *((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 
+    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
-    // [116] *((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 
+    // [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
-    // [117] *((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 
+    // [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
-    // [118] *((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 
+    // [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:
-    // [119] (byte~) vblank::$8 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_RIGHT -- vbuaa=vbuxx_band_vbuc1 
+    // [116] (byte~) vblank::$7 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_RIGHT -- vbuaa=vbuxx_band_vbuc1 
     txa
     and #JOY_RIGHT
-    // [120] if((byte) 0==(byte~) vblank::$8) goto vblank::@4 -- vbuc1_eq_vbuaa_then_la1 
+    // [117] if((byte) 0==(byte~) vblank::$7) goto vblank::ppuSpriteBufferDmaTransfer1 -- vbuc1_eq_vbuaa_then_la1 
     cmp #0
-    beq __b4
+    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:
-    // [121] *((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
-    // [122] *((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
-    // [123] *((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
-    // [124] *((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 __b4
-    // vblank::@4
-  __b4:
-    // [125] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2 
+    // [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
-    // [126] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) -8 -- _deref_pbuc1=vbuc2 
+    // [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:
-    // [127] return  - exit interrupt(HARDWARE_STACK)
+    // [126] return  - exit interrupt(HARDWARE_STACK)
     pla
     tay
     pla
@@ -4336,46 +4329,46 @@ vblank: {
 // - bit 7: A
 readJoy1: {
     .label __1 = 8
-    // [128] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1 -- _deref_pbuc1=vbuc2 
+    // [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
-    // [129] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0 -- _deref_pbuc1=vbuc2 
+    // [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
-    // [130] phi from readJoy1 to readJoy1::@1 [phi:readJoy1->readJoy1::@1]
+    // [129] phi from readJoy1 to readJoy1::@1 [phi:readJoy1->readJoy1::@1]
   __b1_from_readJoy1:
-    // [130] phi (byte) readJoy1::joy#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#0] -- vbuaa=vbuc1 
+    // [129] phi (byte) readJoy1::joy#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#0] -- vbuaa=vbuc1 
     lda #0
-    // [130] phi (byte) readJoy1::i#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#1] -- vbuxx=vbuc1 
+    // [129] phi (byte) readJoy1::i#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#1] -- vbuxx=vbuc1 
     ldx #0
     jmp __b1
     // readJoy1::@1
   __b1:
-    // [131] if((byte) readJoy1::i#2<(byte) 8) goto readJoy1::@2 -- vbuxx_lt_vbuc1_then_la1 
+    // [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:
-    // [132] return 
+    // [131] return 
     rts
     // readJoy1::@2
   __b2:
-    // [133] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 -- vbuz1=vbuaa_rol_1 
+    // [132] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 -- vbuz1=vbuaa_rol_1 
     asl
     sta.z __1
-    // [134] (byte~) readJoy1::$2 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1 -- vbuaa=_deref_pbuc1_band_vbuc2 
+    // [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
-    // [135] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2 -- vbuaa=vbuz1_bor_vbuaa 
+    // [134] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2 -- vbuaa=vbuz1_bor_vbuaa 
     ora.z __1
-    // [136] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2 -- vbuxx=_inc_vbuxx 
+    // [135] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2 -- vbuxx=_inc_vbuxx 
     inx
-    // [130] phi from readJoy1::@2 to readJoy1::@1 [phi:readJoy1::@2->readJoy1::@1]
+    // [129] phi from readJoy1::@2 to readJoy1::@1 [phi:readJoy1::@2->readJoy1::@1]
   __b1_from___b2:
-    // [130] phi (byte) readJoy1::joy#2 = (byte) readJoy1::joy#1 [phi:readJoy1::@2->readJoy1::@1#0] -- register_copy 
-    // [130] phi (byte) readJoy1::i#2 = (byte) readJoy1::i#1 [phi:readJoy1::@2->readJoy1::@1#1] -- register_copy 
+    // [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
@@ -4443,17 +4436,16 @@ Removing instruction jmp __b1
 Removing instruction jmp __breturn
 Removing instruction jmp ppuDataPut1
 Removing instruction jmp __b3
-Removing instruction jmp ppuSpriteBufferDmaTransfer1
 Removing instruction jmp __b9
-Removing instruction jmp __b10
-Removing instruction jmp __b5
-Removing instruction jmp __b1
-Removing instruction jmp __b6
-Removing instruction jmp __b2
-Removing instruction jmp __b7
-Removing instruction jmp __b3
-Removing instruction jmp __b8
 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
@@ -4490,7 +4482,6 @@ Removing instruction __b7_from___b6:
 Removing instruction __b3_from___b1:
 Removing instruction __b9_from___b3:
 Removing instruction __b4_from_enableVideoOutput1:
-Removing instruction __b9_from_ppuSpriteBufferDmaTransfer1:
 Succesful ASM optimization Pass5RedundantLabelElimination
 Removing instruction __bbegin:
 Removing instruction __bend:
@@ -4542,9 +4533,8 @@ Removing instruction __breturn:
 Removing instruction ppuDataPut1:
 Removing instruction __b3:
 Removing instruction __b1_from___b3:
-Removing instruction ppuSpriteBufferDmaTransfer1:
 Removing instruction __b9:
-Removing instruction __b10:
+Removing instruction __b4:
 Removing instruction __b5:
 Removing instruction __b6:
 Removing instruction __b7:
@@ -4773,12 +4763,11 @@ FINAL SYMBOL TABLE
 (byte) readJoy1::return
 (byte) readJoy1::return#2 reg byte a 4.0
 interrupt(HARDWARE_STACK)(void()) vblank()
-(byte~) vblank::$2 reg byte a 4.0
-(byte~) vblank::$4 reg byte a 4.0
-(byte~) vblank::$6 reg byte a 4.0
-(byte~) vblank::$8 reg byte a 4.0
+(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::@10
 (label) vblank::@2
 (label) vblank::@3
 (label) vblank::@4
@@ -4816,10 +4805,10 @@ 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::$2 ]
-reg byte a [ vblank::$4 ]
-reg byte a [ vblank::$6 ]
-reg byte a [ vblank::$8 ]
+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 ]
 
@@ -5423,129 +5412,127 @@ vblank: {
     pha
     tya
     pha
-    // vblank::ppuSpriteBufferDmaTransfer1
-    // PPU->OAMADDR = 0
-    // [95] *((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
-    // [96] *((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
-    // [97] phi from vblank::ppuSpriteBufferDmaTransfer1 to vblank::@9 [phi:vblank::ppuSpriteBufferDmaTransfer1->vblank::@9]
-    // vblank::@9
     // readJoy1()
-    // [98] call readJoy1 
+    // [95] call readJoy1 
     jsr readJoy1
-    // [99] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2
-    // vblank::@10
+    // [96] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2
+    // vblank::@9
     // joy = readJoy1()
-    // [100] (byte) vblank::joy#0 ← (byte) readJoy1::return#2 -- vbuxx=vbuaa 
+    // [97] (byte) vblank::joy#0 ← (byte) readJoy1::return#2 -- vbuxx=vbuaa 
     tax
     // joy&JOY_DOWN
-    // [101] (byte~) vblank::$2 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN -- vbuaa=vbuxx_band_vbuc1 
+    // [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)
-    // [102] if((byte) 0==(byte~) vblank::$2) goto vblank::@1 -- vbuc1_eq_vbuaa_then_la1 
+    // [99] if((byte) 0==(byte~) vblank::$1) goto vblank::@1 -- vbuc1_eq_vbuaa_then_la1 
     cmp #0
     beq __b1
-    // vblank::@5
+    // vblank::@4
     // SPRITE_BUFFER[0].y++;
-    // [103] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER) -- _deref_pbuc1=_inc__deref_pbuc1 
+    // [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++;
-    // [104] *((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 
+    // [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++;
-    // [105] *((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 
+    // [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++;
-    // [106] *((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 
+    // [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
-    // [107] (byte~) vblank::$4 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP -- vbuaa=vbuxx_band_vbuc1 
+    // [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)
-    // [108] if((byte) 0==(byte~) vblank::$4) goto vblank::@2 -- vbuc1_eq_vbuaa_then_la1 
+    // [105] if((byte) 0==(byte~) vblank::$3) goto vblank::@2 -- vbuc1_eq_vbuaa_then_la1 
     cmp #0
     beq __b2
-    // vblank::@6
+    // vblank::@5
     // SPRITE_BUFFER[0].y--;
-    // [109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER) -- _deref_pbuc1=_dec__deref_pbuc1 
+    // [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--;
-    // [110] *((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 
+    // [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--;
-    // [111] *((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 
+    // [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--;
-    // [112] *((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 
+    // [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
-    // [113] (byte~) vblank::$6 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_LEFT -- vbuaa=vbuxx_band_vbuc1 
+    // [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)
-    // [114] if((byte) 0==(byte~) vblank::$6) goto vblank::@3 -- vbuc1_eq_vbuaa_then_la1 
+    // [111] if((byte) 0==(byte~) vblank::$5) goto vblank::@3 -- vbuc1_eq_vbuaa_then_la1 
     cmp #0
     beq __b3
-    // vblank::@7
+    // vblank::@6
     // SPRITE_BUFFER[0].x--;
-    // [115] *((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 
+    // [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--;
-    // [116] *((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 
+    // [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--;
-    // [117] *((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 
+    // [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--;
-    // [118] *((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 
+    // [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
-    // [119] (byte~) vblank::$8 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_RIGHT -- vbuaa=vbuxx_band_vbuc1 
+    // [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)
-    // [120] if((byte) 0==(byte~) vblank::$8) goto vblank::@4 -- vbuc1_eq_vbuaa_then_la1 
+    // [117] if((byte) 0==(byte~) vblank::$7) goto vblank::ppuSpriteBufferDmaTransfer1 -- vbuc1_eq_vbuaa_then_la1 
     cmp #0
-    beq __b4
-    // vblank::@8
+    beq ppuSpriteBufferDmaTransfer1
+    // vblank::@7
     // SPRITE_BUFFER[0].x++;
-    // [121] *((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 
+    // [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++;
-    // [122] *((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 
+    // [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++;
-    // [123] *((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 
+    // [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++;
-    // [124] *((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 
+    // [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::@4
-  __b4:
+    // 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
-    // [125] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2 
+    // [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
-    // [126] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) -8 -- _deref_pbuc1=vbuc2 
+    // [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
     // }
-    // [127] return  - exit interrupt(HARDWARE_STACK)
+    // [126] return  - exit interrupt(HARDWARE_STACK)
     pla
     tay
     pla
@@ -5567,47 +5554,47 @@ vblank: {
 readJoy1: {
     .label __1 = 8
     // APU->JOY1 = 1
-    // [128] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1 -- _deref_pbuc1=vbuc2 
+    // [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
-    // [129] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0 -- _deref_pbuc1=vbuc2 
+    // [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
-    // [130] phi from readJoy1 to readJoy1::@1 [phi:readJoy1->readJoy1::@1]
-    // [130] phi (byte) readJoy1::joy#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#0] -- vbuaa=vbuc1 
-    // [130] phi (byte) readJoy1::i#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#1] -- vbuxx=vbuc1 
+    // [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++)
-    // [131] if((byte) readJoy1::i#2<(byte) 8) goto readJoy1::@2 -- vbuxx_lt_vbuc1_then_la1 
+    // [130] if((byte) readJoy1::i#2<(byte) 8) goto readJoy1::@2 -- vbuxx_lt_vbuc1_then_la1 
     cpx #8
     bcc __b2
     // readJoy1::@return
     // }
-    // [132] return 
+    // [131] return 
     rts
     // readJoy1::@2
   __b2:
     // joy<<1
-    // [133] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 -- vbuz1=vbuaa_rol_1 
+    // [132] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 -- vbuz1=vbuaa_rol_1 
     asl
     sta.z __1
     // APU->JOY1&1
-    // [134] (byte~) readJoy1::$2 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1 -- vbuaa=_deref_pbuc1_band_vbuc2 
+    // [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
-    // [135] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2 -- vbuaa=vbuz1_bor_vbuaa 
+    // [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++)
-    // [136] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2 -- vbuxx=_inc_vbuxx 
+    // [135] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2 -- vbuxx=_inc_vbuxx 
     inx
-    // [130] phi from readJoy1::@2 to readJoy1::@1 [phi:readJoy1::@2->readJoy1::@1]
-    // [130] phi (byte) readJoy1::joy#2 = (byte) readJoy1::joy#1 [phi:readJoy1::@2->readJoy1::@1#0] -- register_copy 
-    // [130] phi (byte) readJoy1::i#2 = (byte) readJoy1::i#1 [phi:readJoy1::@2->readJoy1::@1#1] -- register_copy 
+    // [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
diff --git a/src/test/ref/examples/nes/nes-demo.sym b/src/test/ref/examples/nes/nes-demo.sym
index cf24a577f..ef64da553 100644
--- a/src/test/ref/examples/nes/nes-demo.sym
+++ b/src/test/ref/examples/nes/nes-demo.sym
@@ -207,12 +207,11 @@
 (byte) readJoy1::return
 (byte) readJoy1::return#2 reg byte a 4.0
 interrupt(HARDWARE_STACK)(void()) vblank()
-(byte~) vblank::$2 reg byte a 4.0
-(byte~) vblank::$4 reg byte a 4.0
-(byte~) vblank::$6 reg byte a 4.0
-(byte~) vblank::$8 reg byte a 4.0
+(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::@10
 (label) vblank::@2
 (label) vblank::@3
 (label) vblank::@4
@@ -250,9 +249,9 @@ 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::$2 ]
-reg byte a [ vblank::$4 ]
-reg byte a [ vblank::$6 ]
-reg byte a [ vblank::$8 ]
+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 ]