diff --git a/src/main/kc/target/nes.tgt b/src/main/kc/target/nes.tgt index a2e8cda9c..76c3b9f8b 100644 --- a/src/main/kc/target/nes.tgt +++ b/src/main/kc/target/nes.tgt @@ -1,7 +1,7 @@ { "extension": "nes", "link": "nes.ld", - "cpu": "MOS6502", + "cpu": "MOS6502X", "emulator": "nestopia", "zp_reserve": [ ], "defines": { diff --git a/src/test/kc/examples/nes-dxycp/nes-dxycp.c b/src/test/kc/examples/nes-dxycp/nes-dxycp.c index a38e8c210..574701617 100644 --- a/src/test/kc/examples/nes-dxycp/nes-dxycp.c +++ b/src/test/kc/examples/nes-dxycp/nes-dxycp.c @@ -27,6 +27,8 @@ void main() { volatile char y_sin_idx = 0; // Index into the X sine volatile char x_sin_idx = 73; +// Index into the small X sine +volatile char x_sin_idx_2 = 82; // NMI Called when the PPU refreshes the screen (also known as the V-Blank period) interrupt(hardware_stack) void vblank() { @@ -35,14 +37,25 @@ interrupt(hardware_stack) void vblank() { PPU->PPUSCROLL = 0; // DMA transfer the entire sprite buffer to the PPU ppuSpriteBufferDmaTransfer(SPRITE_BUFFER); + + // Read controller 1 + char joy = readJoy1(); + // If anything pressed - pause + if(joy) + return; + // Update sprite positions - char y_idx = y_sin_idx++; - char x_idx = x_sin_idx++; + char y_idx = y_sin_idx++; + x_sin_idx = (x_sin_idx==238) ? 0 : x_sin_idx+1; + char x_idx = x_sin_idx; + x_sin_idx_2 = (x_sin_idx_2==88) ? 0 : x_sin_idx_2+1; + char x_idx_2 = x_sin_idx_2; for(char s=0;s<0x40;s++) { - SPRITE_BUFFER[s].y = SINTABLE[y_idx]; - SPRITE_BUFFER[s].x = SINTABLE[x_idx]+8; - y_idx += 4; - x_idx -= 7; + SPRITE_BUFFER[s].y = SINTABLE_240[y_idx]; + y_idx -= 4; + SPRITE_BUFFER[s].x = SINTABLE_184[x_idx] + SINTABLE_64[x_idx_2]; + x_idx = (x_idx<3) ? x_idx+236 : x_idx-3; + x_idx_2 = (x_idx_2>=86) ? x_idx_2-86 : x_idx_2+3 ; } } @@ -67,10 +80,21 @@ char PALETTE[0x20] = { }; // Sinus Table (0-239) -const char SINTABLE[0x100] = kickasm {{ +const char SINTABLE_240[0x100] = kickasm {{ .fill $100, round(115.5+107.5*sin(2*PI*i/256)) }}; +// Sinus Table (0-63) +const char SINTABLE_64[89] = kickasm {{ + .fill 89, round(52.5+52.5*sin(2*PI*i/89)) +}}; + +// Sinus Table (0-183) +const char SINTABLE_184[239] = kickasm {{ + .fill 239, round(71.5+71.5*sin(2*PI*i/239)) +}}; + + // Tile Set (in CHR ROM) - A C64 charset from http://www.zimmers.net/anonftp/pub/cbm/firmware/computers/c64/ #pragma data_seg(Tiles) export char TILES[] = kickasm(resource "characters.901225-01.bin") {{ diff --git a/src/test/ref/examples/nes-conio/nes-conio.log b/src/test/ref/examples/nes-conio/nes-conio.log index e712313e8..c4f45f812 100644 --- a/src/test/ref/examples/nes-conio/nes-conio.log +++ b/src/test/ref/examples/nes-conio/nes-conio.log @@ -4038,7 +4038,7 @@ Allocated zp[1]:94 [ readJoy1::$1 ] Allocated zp[1]:95 [ readJoy1::$2 ] INITIAL ASM -Target platform is nes / MOS6502 +Target platform is nes / MOS6502X // File Comments // NES conio printing // Nintendo Entertainment System (NES @@ -5792,12 +5792,11 @@ Statement [48] (volatile byte) x_scroll ← (byte) 0 [ ] ( [ ] { } main:7 [ ] Statement [49] (volatile byte) y_scroll ← (byte) -8 [ ] ( [ ] { } main:7 [ ] { } ) always clobbers reg byte a Statement [50] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 [ ] ( [ ] { } main:7 [ ] { } ) always clobbers reg byte a Statement [51] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e [ ] ( [ ] { } main:7 [ ] { } ) always clobbers reg byte a -Statement [53] (byte) uctoa::value#1 ← (byte) main::i#2 & (byte) $f [ main::i#2 uctoa::value#1 ] ( [ main::i#2 uctoa::value#1 ] { } main:7 [ main::i#2 uctoa::value#1 ] { } ) always clobbers reg byte a -Removing always clobbered register reg byte a as potential for zp[1]:5 [ main::i#2 main::i#1 ] Statement [80] (nomodify byte*) ppuDataSet::ppuData#0 ← (byte*) conio_line_text + (byte) conio_cursor_x [ conio_cursor_x conio_cursor_y conio_line_text cputc::c#2 ppuDataSet::ppuData#0 ] ( cputcxy:60::cputc:76 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text cputc::c#2 ppuDataSet::ppuData#0 ] { { cputcxy::y#2 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 ppuDataSet::val#0 } } main:7::cputcxy:60::cputc:76 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text cputc::c#2 ppuDataSet::ppuData#0 ] { { cputcxy::y#2 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 ppuDataSet::val#0 } } cputcxy:63::cputc:76 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text cputc::c#2 ppuDataSet::ppuData#0 ] { { cputcxy::y#3 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 ppuDataSet::val#0 } } main:7::cputcxy:63::cputc:76 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text cputc::c#2 ppuDataSet::ppuData#0 ] { { cputcxy::y#3 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 ppuDataSet::val#0 } } cputcxy:66::cputc:76 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text cputc::c#2 ppuDataSet::ppuData#0 ] { { cputcxy::x#0 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 ppuDataSet::val#0 } } main:7::cputcxy:66::cputc:76 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text cputc::c#2 ppuDataSet::ppuData#0 ] { { cputcxy::x#0 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 ppuDataSet::val#0 } } cputcxy:69::cputc:76 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text cputc::c#2 ppuDataSet::ppuData#0 ] { { cputcxy::x#1 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 ppuDataSet::val#0 } } main:7::cputcxy:69::cputc:76 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text cputc::c#2 ppuDataSet::ppuData#0 ] { { cputcxy::x#1 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 ppuDataSet::val#0 } } cputsxy:57::cputs:171::cputc:180 [ main::i#2 cputs::s#0 conio_cursor_x conio_cursor_y conio_line_text cputc::c#2 ppuDataSet::ppuData#0 ] { { cputsxy::x#0 = main::i#2 cputsxy::y#0 } { cputc::c#0 = cputc::c#2 cputs::c#1 ppuDataSet::val#0 } } main:7::cputsxy:57::cputs:171::cputc:180 [ main::i#2 cputs::s#0 conio_cursor_x conio_cursor_y conio_line_text cputc::c#2 ppuDataSet::ppuData#0 ] { { cputsxy::x#0 = main::i#2 cputsxy::y#0 } { cputc::c#0 = cputc::c#2 cputs::c#1 ppuDataSet::val#0 } } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:4 [ main::y#10 main::y#1 ] Removing always clobbered register reg byte a as potential for zp[1]:9 [ cputc::c#2 cputc::c#1 cputc::c#0 ] Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::x#10 main::x#1 ] +Removing always clobbered register reg byte a as potential for zp[1]:5 [ main::i#2 main::i#1 ] Statement [84] if((byte) conio_cursor_x!=(byte) $20) goto cputc::@return [ conio_cursor_x conio_cursor_y conio_line_text ] ( cputcxy:60::cputc:76 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::y#2 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:60::cputc:76 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::y#2 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputcxy:63::cputc:76 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::y#3 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:63::cputc:76 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::y#3 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputcxy:66::cputc:76 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::x#0 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:66::cputc:76 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::x#0 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputcxy:69::cputc:76 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::x#1 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:69::cputc:76 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::x#1 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputsxy:57::cputs:171::cputc:180 [ main::i#2 cputs::s#0 conio_cursor_x conio_cursor_y conio_line_text ] { { cputsxy::x#0 = main::i#2 cputsxy::y#0 } { cputc::c#0 = cputc::c#2 cputs::c#1 } } main:7::cputsxy:57::cputs:171::cputc:180 [ main::i#2 cputs::s#0 conio_cursor_x conio_cursor_y conio_line_text ] { { cputsxy::x#0 = main::i#2 cputsxy::y#0 } { cputc::c#0 = cputc::c#2 cputs::c#1 } } ) always clobbers reg byte a Statement [90] (byte*) conio_line_text ← (byte*) conio_line_text + (byte) $20 [ conio_cursor_y conio_line_text ] ( cputcxy:60::cputc:76::cputln:86 [ main::y#10 conio_cursor_y conio_line_text ] { { cputcxy::y#2 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:60::cputc:76::cputln:86 [ main::y#10 conio_cursor_y conio_line_text ] { { cputcxy::y#2 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputcxy:63::cputc:76::cputln:86 [ main::y#10 conio_cursor_y conio_line_text ] { { cputcxy::y#3 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:63::cputc:76::cputln:86 [ main::y#10 conio_cursor_y conio_line_text ] { { cputcxy::y#3 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputcxy:66::cputc:76::cputln:86 [ main::x#10 conio_cursor_y conio_line_text ] { { cputcxy::x#0 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:66::cputc:76::cputln:86 [ main::x#10 conio_cursor_y conio_line_text ] { { cputcxy::x#0 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputcxy:69::cputc:76::cputln:86 [ main::x#10 conio_cursor_y conio_line_text ] { { cputcxy::x#1 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:69::cputc:76::cputln:86 [ main::x#10 conio_cursor_y conio_line_text ] { { cputcxy::x#1 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputsxy:57::cputs:171::cputc:180::cputln:86 [ main::i#2 cputs::s#0 conio_cursor_y conio_line_text ] { { cputsxy::x#0 = main::i#2 cputsxy::y#0 } { cputc::c#0 = cputc::c#2 cputs::c#1 } } main:7::cputsxy:57::cputs:171::cputc:180::cputln:86 [ main::i#2 cputs::s#0 conio_cursor_y conio_line_text ] { { cputsxy::x#0 = main::i#2 cputsxy::y#0 } { cputc::c#0 = cputc::c#2 cputs::c#1 } } cputcxy:60::cputc:76::cputln:89 [ main::y#10 conio_cursor_y conio_line_text ] { { cputcxy::y#2 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:60::cputc:76::cputln:89 [ main::y#10 conio_cursor_y conio_line_text ] { { cputcxy::y#2 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputcxy:63::cputc:76::cputln:89 [ main::y#10 conio_cursor_y conio_line_text ] { { cputcxy::y#3 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:63::cputc:76::cputln:89 [ main::y#10 conio_cursor_y conio_line_text ] { { cputcxy::y#3 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputcxy:66::cputc:76::cputln:89 [ main::x#10 conio_cursor_y conio_line_text ] { { cputcxy::x#0 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:66::cputc:76::cputln:89 [ main::x#10 conio_cursor_y conio_line_text ] { { cputcxy::x#0 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputcxy:69::cputc:76::cputln:89 [ main::x#10 conio_cursor_y conio_line_text ] { { cputcxy::x#1 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:69::cputc:76::cputln:89 [ main::x#10 conio_cursor_y conio_line_text ] { { cputcxy::x#1 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputsxy:57::cputs:171::cputc:180::cputln:89 [ main::i#2 cputs::s#0 conio_cursor_y conio_line_text ] { { cputsxy::x#0 = main::i#2 cputsxy::y#0 } { cputc::c#0 = cputc::c#2 cputs::c#1 } } main:7::cputsxy:57::cputs:171::cputc:180::cputln:89 [ main::i#2 cputs::s#0 conio_cursor_y conio_line_text ] { { cputsxy::x#0 = main::i#2 cputsxy::y#0 } { cputc::c#0 = cputc::c#2 cputs::c#1 } } ) always clobbers reg byte a Statement [91] (byte) conio_cursor_x ← (byte) 0 [ conio_cursor_x conio_cursor_y conio_line_text ] ( cputcxy:60::cputc:76::cputln:86 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::y#2 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:60::cputc:76::cputln:86 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::y#2 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputcxy:63::cputc:76::cputln:86 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::y#3 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:63::cputc:76::cputln:86 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::y#3 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputcxy:66::cputc:76::cputln:86 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::x#0 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:66::cputc:76::cputln:86 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::x#0 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputcxy:69::cputc:76::cputln:86 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::x#1 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:69::cputc:76::cputln:86 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::x#1 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputsxy:57::cputs:171::cputc:180::cputln:86 [ main::i#2 cputs::s#0 conio_cursor_x conio_cursor_y conio_line_text ] { { cputsxy::x#0 = main::i#2 cputsxy::y#0 } { cputc::c#0 = cputc::c#2 cputs::c#1 } } main:7::cputsxy:57::cputs:171::cputc:180::cputln:86 [ main::i#2 cputs::s#0 conio_cursor_x conio_cursor_y conio_line_text ] { { cputsxy::x#0 = main::i#2 cputsxy::y#0 } { cputc::c#0 = cputc::c#2 cputs::c#1 } } cputcxy:60::cputc:76::cputln:89 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::y#2 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:60::cputc:76::cputln:89 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::y#2 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputcxy:63::cputc:76::cputln:89 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::y#3 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:63::cputc:76::cputln:89 [ main::y#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::y#3 = cputcxy::y#4 main::y#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputcxy:66::cputc:76::cputln:89 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::x#0 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:66::cputc:76::cputln:89 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::x#0 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputcxy:69::cputc:76::cputln:89 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::x#1 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } main:7::cputcxy:69::cputc:76::cputln:89 [ main::x#10 conio_cursor_x conio_cursor_y conio_line_text ] { { cputcxy::x#1 = cputcxy::x#4 main::x#10 } { cputc::c#1 = cputc::c#2 cputcxy::c#4 } } cputsxy:57::cputs:171::cputc:180::cputln:89 [ main::i#2 cputs::s#0 conio_cursor_x conio_cursor_y conio_line_text ] { { cputsxy::x#0 = main::i#2 cputsxy::y#0 } { cputc::c#0 = cputc::c#2 cputs::c#1 } } main:7::cputsxy:57::cputs:171::cputc:180::cputln:89 [ main::i#2 cputs::s#0 conio_cursor_x conio_cursor_y conio_line_text ] { { cputsxy::x#0 = main::i#2 cputsxy::y#0 } { cputc::c#0 = cputc::c#2 cputs::c#1 } } ) always clobbers reg byte a @@ -5843,9 +5842,8 @@ Removing always clobbered register reg byte a as potential for zp[1]:46 [ uctoa_ Statement [209] (byte) conio_cursor_x ← (byte) 0 [ ] ( clrscr:41 [ ] { } main:7::clrscr:41 [ ] { } ) always clobbers reg byte a Statement [210] (byte) conio_cursor_y ← (byte) 0 [ ] ( clrscr:41 [ ] { } main:7::clrscr:41 [ ] { } ) always clobbers reg byte a Statement [211] (byte*) conio_line_text ← (const nomodify byte*) PPU_NAME_TABLE_0 [ ] ( clrscr:41 [ ] { } main:7::clrscr:41 [ ] { } ) always clobbers reg byte a -Statement [217] (byte~) vblank::$1 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN [ x_scroll y_scroll vblank::joy#0 vblank::$1 ] ( [ x_scroll y_scroll vblank::joy#0 vblank::$1 ] { } ) always clobbers reg byte a -Removing always clobbered register reg byte a as potential for zp[1]:89 [ vblank::joy#0 ] Statement [220] if((volatile byte) y_scroll!=(byte) $f0) goto vblank::@1 [ x_scroll y_scroll vblank::joy#0 ] ( [ x_scroll y_scroll vblank::joy#0 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:89 [ vblank::joy#0 ] Statement [221] (volatile byte) y_scroll ← (byte) 0 [ x_scroll y_scroll vblank::joy#0 ] ( [ x_scroll y_scroll vblank::joy#0 ] { } ) always clobbers reg byte a Statement [222] (byte~) vblank::$3 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP [ x_scroll y_scroll vblank::joy#0 vblank::$3 ] ( [ x_scroll y_scroll vblank::joy#0 vblank::$3 ] { } ) always clobbers reg byte a Statement [225] if((volatile byte) y_scroll!=(byte) $ff) goto vblank::@2 [ x_scroll y_scroll vblank::joy#0 ] ( [ x_scroll y_scroll vblank::joy#0 ] { } ) always clobbers reg byte a diff --git a/src/test/ref/examples/nes-dxycp/nes-dxycp.asm b/src/test/ref/examples/nes-dxycp/nes-dxycp.asm index 5efffdab3..2088f02ce 100644 --- a/src/test/ref/examples/nes-dxycp/nes-dxycp.asm +++ b/src/test/ref/examples/nes-dxycp/nes-dxycp.asm @@ -45,6 +45,7 @@ .const OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = 2 .const OFFSET_STRUCT_RICOH_2C02_OAMADDR = 3 .const OFFSET_STRUCT_RICOH_2A03_OAMDMA = $14 + .const OFFSET_STRUCT_RICOH_2A03_JOY1 = $16 .const OFFSET_STRUCT_RICOH_2C02_PPUADDR = 6 .const OFFSET_STRUCT_RICOH_2C02_PPUDATA = 7 .const OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = 5 @@ -76,8 +77,9 @@ .label PPU = $2000 // NES CPU and audion processing unit (APU) .label APU = $4000 - .label y_sin_idx = $a - .label x_sin_idx = $b + .label y_sin_idx = $c + .label x_sin_idx = $d + .label x_sin_idx_2 = $e __bbegin: // y_sin_idx = 0 // Index into the Y sine @@ -87,6 +89,10 @@ __bbegin: // Index into the X sine lda #$49 sta.z x_sin_idx + // x_sin_idx_2 = 82 + // Index into the small X sine + lda #$52 + sta.z x_sin_idx_2 jsr main rts .segment Code @@ -304,9 +310,15 @@ ppuDataTransfer: { } // NMI Called when the PPU refreshes the screen (also known as the V-Blank period) vblank: { - .label __4 = $c - .label y_idx = 8 - .label x_idx = 9 + .label __17 = $a + .label __19 = $a + .label __23 = $b + .label __25 = $b + .label __28 = $f + .label y_idx = 9 + .label x_idx = $a + .label x_idx_2 = $b + .label s = 8 pha txa pha @@ -322,20 +334,13 @@ vblank: { // APU->OAMDMA = >spriteBuffer lda #>SPRITE_BUFFER sta APU+OFFSET_STRUCT_RICOH_2A03_OAMDMA - // y_idx = y_sin_idx++ - // Update sprite positions - lda.z y_sin_idx - sta.z y_idx - inc.z y_sin_idx - // x_idx = x_sin_idx++ - lda.z x_sin_idx - sta.z x_idx - inc.z x_sin_idx - ldx #0 - __b1: - // for(char s=0;s<0x40;s++) - cpx #$40 - bcc __b2 + // readJoy1() + jsr readJoy1 + // joy = readJoy1() + // if(joy) + cmp #0 + beq __b1 + __breturn: // } pla tay @@ -343,35 +348,141 @@ vblank: { tax pla rti - __b2: - // SPRITE_BUFFER[s].y = SINTABLE[y_idx] - txa - asl - asl - sta.z __4 - ldy.z y_idx - lda SINTABLE,y - ldy.z __4 - sta SPRITE_BUFFER,y - // SINTABLE[x_idx]+8 - lda #8 - ldy.z x_idx - clc - adc SINTABLE,y - // SPRITE_BUFFER[s].x = SINTABLE[x_idx]+8 - ldy.z __4 - sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X,y - // y_idx += 4 - lda #4 - clc - adc.z y_idx + __b1: + // y_idx = y_sin_idx++ + // Update sprite positions + lda.z y_sin_idx sta.z y_idx - // x_idx -= 7 - lda.z x_idx - sec - sbc #7 + inc.z y_sin_idx + // (x_sin_idx==238) ? 0 : x_sin_idx+1 + lda #$ee + cmp.z x_sin_idx + beq __b2 + ldx.z x_sin_idx + inx + jmp __b3 + __b2: + ldx #0 + __b3: + // x_sin_idx = (x_sin_idx==238) ? 0 : x_sin_idx+1 + stx.z x_sin_idx + // x_idx = x_sin_idx + txa sta.z x_idx + // (x_sin_idx_2==88) ? 0 : x_sin_idx_2+1 + lda #$58 + cmp.z x_sin_idx_2 + beq __b4 + ldx.z x_sin_idx_2 + inx + jmp __b5 + __b4: + ldx #0 + __b5: + // x_sin_idx_2 = (x_sin_idx_2==88) ? 0 : x_sin_idx_2+1 + stx.z x_sin_idx_2 + // x_idx_2 = x_sin_idx_2 + txa + sta.z x_idx_2 + lda #0 + sta.z s + __b6: // for(char s=0;s<0x40;s++) + lda.z s + cmp #$40 + bcc __b7 + jmp __breturn + __b7: + // SPRITE_BUFFER[s].y = SINTABLE_240[y_idx] + lda.z s + asl + asl + sta.z __28 + ldy.z y_idx + lda SINTABLE_240,y + ldy.z __28 + sta SPRITE_BUFFER,y + // y_idx -= 4 + lax.z y_idx + axs #4 + stx.z y_idx + // SINTABLE_184[x_idx] + SINTABLE_64[x_idx_2] + ldy.z x_idx + lda SINTABLE_184,y + ldy.z x_idx_2 + clc + adc SINTABLE_64,y + // SPRITE_BUFFER[s].x = SINTABLE_184[x_idx] + SINTABLE_64[x_idx_2] + ldy.z __28 + sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X,y + // (x_idx<3) ? x_idx+236 : x_idx-3 + lda.z x_idx + cmp #3 + bcc __b8 + lax.z __17 + axs #3 + stx.z __17 + __b10: + // (x_idx_2>=86) ? x_idx_2-86 : x_idx_2+3 + lda.z x_idx_2 + cmp #$56 + bcs __b11 + lax.z __23 + axs #-[3] + stx.z __23 + __b13: + // for(char s=0;s<0x40;s++) + inc.z s + jmp __b6 + __b11: + // (x_idx_2>=86) ? x_idx_2-86 : x_idx_2+3 + lax.z __25 + axs #$56 + stx.z __25 + jmp __b13 + __b8: + // (x_idx<3) ? x_idx+236 : x_idx-3 + lax.z __19 + axs #-[$ec] + stx.z __19 + jmp __b10 +} +// Read Standard Controller #1 +// Returns a byte representing the pushed buttons +// - bit 0: right +// - bit 1: left +// - bit 2: down +// - bit 3: up +// - bit 4: start +// - bit 5: select +// - bit 6: B +// - bit 7: A +readJoy1: { + .label __1 = $10 + // APU->JOY1 = 1 + // Latch the controller buttons + lda #1 + sta APU+OFFSET_STRUCT_RICOH_2A03_JOY1 + // APU->JOY1 = 0 + lda #0 + sta APU+OFFSET_STRUCT_RICOH_2A03_JOY1 + tax + __b1: + // for(char i=0;i<8;i++) + cpx #8 + bcc __b2 + // } + rts + __b2: + // joy<<1 + asl + sta.z __1 + // APU->JOY1&1 + lda #1 + and APU+OFFSET_STRUCT_RICOH_2A03_JOY1 + // joy = joy<<1 | APU->JOY1&1 + ora.z __1 + // for(char i=0;i<8;i++) inx jmp __b1 } @@ -381,9 +492,17 @@ vblank: { // Color Palette PALETTE: .byte 1, $21, $f, $30, 1, $21, $f, $30, 1, $21, $f, $30, 1, $21, $f, $30, 1, $f, $30, 8, 1, $f, $18, 8, 1, $30, $37, $1a, $f, $f, $f, $f // Sinus Table (0-239) -SINTABLE: +SINTABLE_240: .fill $100, round(115.5+107.5*sin(2*PI*i/256)) + // Sinus Table (0-63) +SINTABLE_64: +.fill 89, round(52.5+52.5*sin(2*PI*i/89)) + + // Sinus Table (0-183) +SINTABLE_184: +.fill 239, round(71.5+71.5*sin(2*PI*i/239)) + .segment Tiles TILES: .var filechargen = LoadBinary("characters.901225-01.bin") diff --git a/src/test/ref/examples/nes-dxycp/nes-dxycp.cfg b/src/test/ref/examples/nes-dxycp/nes-dxycp.cfg index 27a207003..309d0071b 100644 --- a/src/test/ref/examples/nes-dxycp/nes-dxycp.cfg +++ b/src/test/ref/examples/nes-dxycp/nes-dxycp.cfg @@ -4,177 +4,243 @@ @1: scope:[] from @begin [1] (volatile byte) y_sin_idx ← (byte) 0 [2] (volatile byte) x_sin_idx ← (byte) $49 + [3] (volatile byte) x_sin_idx_2 ← (byte) $52 to:@2 @2: scope:[] from @1 - [3] phi() - [4] call main + [4] phi() + [5] call main to:@end @end: scope:[] from @2 - [5] phi() + [6] phi() (void()) main() main: scope:[main] from @2 - [6] phi() + [7] phi() to:main::initNES1 main::initNES1: scope:[main] from main asm { cld ldx#$ff txs } to:main::initNES1_disableVideoOutput1 main::initNES1_disableVideoOutput1: scope:[main] from main::initNES1 - [8] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 - [9] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 + [9] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 + [10] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 to:main::initNES1_disableAudioOutput1 main::initNES1_disableAudioOutput1: scope:[main] from main::initNES1_disableVideoOutput1 - [10] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 - [11] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 + [11] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 + [12] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 to:main::initNES1_clearVBlankFlag1 main::initNES1_clearVBlankFlag1: scope:[main] from main::initNES1_disableAudioOutput1 asm { ldaPPU_PPUSTATUS } to:main::initNES1_waitForVBlank1 main::initNES1_waitForVBlank1: scope:[main] from main::initNES1_clearVBlankFlag1 - [13] phi() + [14] phi() to:main::initNES1_waitForVBlank1_@1 main::initNES1_waitForVBlank1_@1: scope:[main] from main::initNES1_waitForVBlank1 main::initNES1_waitForVBlank1_@1 - [14] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 - [15] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 + [15] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 + [16] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 to:main::initNES1_@1 main::initNES1_@1: scope:[main] from main::initNES1_@1 main::initNES1_waitForVBlank1_@1 - [16] (byte) main::initNES1_i#2 ← phi( main::initNES1_@1/(byte) main::initNES1_i#1 main::initNES1_waitForVBlank1_@1/(byte) 0 ) - [17] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 - [18] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 - [19] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 - [20] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 - [21] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 - [22] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 - [23] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 - [24] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 - [25] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 - [26] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 + [17] (byte) main::initNES1_i#2 ← phi( main::initNES1_@1/(byte) main::initNES1_i#1 main::initNES1_waitForVBlank1_@1/(byte) 0 ) + [18] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 + [19] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 + [20] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 + [21] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 + [22] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 + [23] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 + [24] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 + [25] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 + [26] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 + [27] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 to:main::initNES1_waitForVBlank2 main::initNES1_waitForVBlank2: scope:[main] from main::initNES1_@1 - [27] phi() + [28] phi() to:main::initNES1_waitForVBlank2_@1 main::initNES1_waitForVBlank2_@1: scope:[main] from main::initNES1_waitForVBlank2 main::initNES1_waitForVBlank2_@1 - [28] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 - [29] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 + [29] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 + [30] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 to:main::initNES1_@7 main::initNES1_@7: scope:[main] from main::initNES1_waitForVBlank2_@1 asm { ldaPPU_PPUSTATUS } to:main::@4 main::@4: scope:[main] from main::initNES1_@7 - [31] phi() - [32] call ppuDataTransfer + [32] phi() + [33] call ppuDataTransfer to:main::@5 main::@5: scope:[main] from main::@4 - [33] phi() - [34] call ppuDataFill + [34] phi() + [35] call ppuDataFill to:main::@6 main::@6: scope:[main] from main::@5 - [35] phi() - [36] call ppuDataFill + [36] phi() + [37] call ppuDataFill to:main::@1 main::@1: scope:[main] from main::@2 main::@6 - [37] (byte) main::s#2 ← phi( main::@2/(byte) main::s#1 main::@6/(byte) 0 ) - [38] if((byte) main::s#2<(byte) $40) goto main::@2 + [38] (byte) main::s#2 ← phi( main::@2/(byte) main::s#1 main::@6/(byte) 0 ) + [39] if((byte) main::s#2<(byte) $40) goto main::@2 to:main::enableVideoOutput1 main::enableVideoOutput1: scope:[main] from main::@1 - [39] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 - [40] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e + [40] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 + [41] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e to:main::@3 main::@3: scope:[main] from main::@3 main::enableVideoOutput1 - [41] phi() + [42] phi() to:main::@3 main::@2: scope:[main] from main::@1 - [42] (byte~) main::$7 ← (byte) main::s#2 << (byte) 2 - [43] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$7) ← (byte) 0 - [44] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$7) ← *((const byte*) MESSAGE + (byte) main::s#2) - [45] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$7) ← (byte) 2 - [46] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$7) ← (byte) 0 - [47] (byte) main::s#1 ← ++ (byte) main::s#2 + [43] (byte~) main::$7 ← (byte) main::s#2 << (byte) 2 + [44] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$7) ← (byte) 0 + [45] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$7) ← *((const byte*) MESSAGE + (byte) main::s#2) + [46] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$7) ← (byte) 2 + [47] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$7) ← (byte) 0 + [48] (byte) main::s#1 ← ++ (byte) main::s#2 to:main::@1 (void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size) ppuDataFill: scope:[ppuDataFill] from main::@5 main::@6 - [48] (byte) ppuDataFill::val#4 ← phi( main::@5/(byte) '*' main::@6/(byte) 0 ) - [48] (word) ppuDataFill::size#3 ← phi( main::@5/(word)(number) $20*(number) $1e main::@6/(byte) $40 ) - [48] (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ← phi( main::@5/(void*)(const nomodify byte*) PPU_NAME_TABLE_0 main::@6/(void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 ) + [49] (byte) ppuDataFill::val#4 ← phi( main::@5/(byte) '*' main::@6/(byte) 0 ) + [49] (word) ppuDataFill::size#3 ← phi( main::@5/(word)(number) $20*(number) $1e main::@6/(byte) $40 ) + [49] (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ← phi( main::@5/(void*)(const nomodify byte*) PPU_NAME_TABLE_0 main::@6/(void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 ) to:ppuDataFill::ppuDataPrepare1 ppuDataFill::ppuDataPrepare1: scope:[ppuDataFill] from ppuDataFill - [49] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 - [50] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 - [51] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 - [52] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$1 + [50] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 + [51] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 + [52] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 + [53] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$1 to:ppuDataFill::@1 ppuDataFill::@1: scope:[ppuDataFill] from ppuDataFill::@2 ppuDataFill::ppuDataPrepare1 - [53] (word) ppuDataFill::i#2 ← phi( ppuDataFill::ppuDataPrepare1/(word) 0 ppuDataFill::@2/(word) ppuDataFill::i#1 ) - [54] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 + [54] (word) ppuDataFill::i#2 ← phi( ppuDataFill::ppuDataPrepare1/(word) 0 ppuDataFill::@2/(word) ppuDataFill::i#1 ) + [55] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 to:ppuDataFill::@return ppuDataFill::@return: scope:[ppuDataFill] from ppuDataFill::@1 - [55] return + [56] return to:@return ppuDataFill::ppuDataPut1: scope:[ppuDataFill] from ppuDataFill::@1 - [56] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4 + [57] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4 to:ppuDataFill::@2 ppuDataFill::@2: scope:[ppuDataFill] from ppuDataFill::ppuDataPut1 - [57] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2 + [58] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2 to:ppuDataFill::@1 (void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size) ppuDataTransfer: scope:[ppuDataTransfer] from main::@4 - [58] phi() + [59] phi() to:ppuDataTransfer::ppuDataPrepare1 ppuDataTransfer::ppuDataPrepare1: scope:[ppuDataTransfer] from ppuDataTransfer - [59] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 - [60] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 + [60] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 + [61] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 to:ppuDataTransfer::@1 ppuDataTransfer::@1: scope:[ppuDataTransfer] from ppuDataTransfer::@3 ppuDataTransfer::ppuDataPrepare1 - [61] (byte*) ppuDataTransfer::cpuSrc#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 ppuDataTransfer::@3/(byte*) ppuDataTransfer::cpuSrc#1 ) - [61] (word) ppuDataTransfer::i#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(word) 0 ppuDataTransfer::@3/(word) ppuDataTransfer::i#1 ) - [62] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 + [62] (byte*) ppuDataTransfer::cpuSrc#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 ppuDataTransfer::@3/(byte*) ppuDataTransfer::cpuSrc#1 ) + [62] (word) ppuDataTransfer::i#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(word) 0 ppuDataTransfer::@3/(word) ppuDataTransfer::i#1 ) + [63] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 to:ppuDataTransfer::@return ppuDataTransfer::@return: scope:[ppuDataTransfer] from ppuDataTransfer::@1 - [63] return + [64] return to:@return ppuDataTransfer::@2: scope:[ppuDataTransfer] from ppuDataTransfer::@1 - [64] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) + [65] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) to:ppuDataTransfer::ppuDataPut1 ppuDataTransfer::ppuDataPut1: scope:[ppuDataTransfer] from ppuDataTransfer::@2 - [65] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 + [66] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 to:ppuDataTransfer::@3 ppuDataTransfer::@3: scope:[ppuDataTransfer] from ppuDataTransfer::ppuDataPut1 - [66] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 - [67] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2 + [67] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 + [68] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2 to:ppuDataTransfer::@1 interrupt(HARDWARE_STACK)(void()) vblank() vblank: scope:[vblank] from - [68] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [69] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 + [70] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 to:vblank::ppuSpriteBufferDmaTransfer1 vblank::ppuSpriteBufferDmaTransfer1: scope:[vblank] from vblank - [70] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 - [71] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER - to:vblank::@3 -vblank::@3: scope:[vblank] from vblank::ppuSpriteBufferDmaTransfer1 - [72] (byte) vblank::y_idx#0 ← (volatile byte) y_sin_idx - [73] (volatile byte) y_sin_idx ← ++ (volatile byte) y_sin_idx - [74] (byte) vblank::x_idx#0 ← (volatile byte) x_sin_idx - [75] (volatile byte) x_sin_idx ← ++ (volatile byte) x_sin_idx - to:vblank::@1 -vblank::@1: scope:[vblank] from vblank::@2 vblank::@3 - [76] (byte) vblank::x_idx#2 ← phi( vblank::@2/(byte) vblank::x_idx#1 vblank::@3/(byte) vblank::x_idx#0 ) - [76] (byte) vblank::y_idx#2 ← phi( vblank::@2/(byte) vblank::y_idx#1 vblank::@3/(byte) vblank::y_idx#0 ) - [76] (byte) vblank::s#2 ← phi( vblank::@2/(byte) vblank::s#1 vblank::@3/(byte) 0 ) - [77] if((byte) vblank::s#2<(byte) $40) goto vblank::@2 + [71] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 + [72] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER + to:vblank::@14 +vblank::@14: scope:[vblank] from vblank::ppuSpriteBufferDmaTransfer1 + [73] phi() + [74] call readJoy1 + [75] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2 + to:vblank::@15 +vblank::@15: scope:[vblank] from vblank::@14 + [76] (byte) vblank::joy#0 ← (byte) readJoy1::return#2 + [77] if((byte) 0==(byte) vblank::joy#0) goto vblank::@1 to:vblank::@return -vblank::@return: scope:[vblank] from vblank::@1 +vblank::@return: scope:[vblank] from vblank::@15 vblank::@6 [78] return to:@return +vblank::@1: scope:[vblank] from vblank::@15 + [79] (byte) vblank::y_idx#0 ← (volatile byte) y_sin_idx + [80] (volatile byte) y_sin_idx ← ++ (volatile byte) y_sin_idx + [81] if((volatile byte) x_sin_idx==(byte) $ee) goto vblank::@3 + to:vblank::@2 vblank::@2: scope:[vblank] from vblank::@1 - [79] (byte~) vblank::$4 ← (byte) vblank::s#2 << (byte) 2 - [80] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) vblank::$4) ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::y_idx#2) - [81] (byte~) vblank::$2 ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::x_idx#2) + (byte) 8 - [82] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) vblank::$4) ← (byte~) vblank::$2 - [83] (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 + (byte) 4 - [84] (byte) vblank::x_idx#1 ← (byte) vblank::x_idx#2 - (byte) 7 - [85] (byte) vblank::s#1 ← ++ (byte) vblank::s#2 - to:vblank::@1 + [82] (byte~) vblank::$5 ← (volatile byte) x_sin_idx + (byte) 1 + to:vblank::@3 +vblank::@3: scope:[vblank] from vblank::@1 vblank::@2 + [83] (byte~) vblank::$7 ← phi( vblank::@1/(byte) 0 vblank::@2/(byte~) vblank::$5 ) + [84] (volatile byte) x_sin_idx ← (byte~) vblank::$7 + [85] (byte) vblank::x_idx#0 ← (volatile byte) x_sin_idx + [86] if((volatile byte) x_sin_idx_2==(byte) $58) goto vblank::@5 + to:vblank::@4 +vblank::@4: scope:[vblank] from vblank::@3 + [87] (byte~) vblank::$10 ← (volatile byte) x_sin_idx_2 + (byte) 1 + to:vblank::@5 +vblank::@5: scope:[vblank] from vblank::@3 vblank::@4 + [88] (byte~) vblank::$12 ← phi( vblank::@3/(byte) 0 vblank::@4/(byte~) vblank::$10 ) + [89] (volatile byte) x_sin_idx_2 ← (byte~) vblank::$12 + [90] (byte) vblank::x_idx_2#0 ← (volatile byte) x_sin_idx_2 + to:vblank::@6 +vblank::@6: scope:[vblank] from vblank::@13 vblank::@5 + [91] (byte) vblank::x_idx_2#2 ← phi( vblank::@13/(byte) vblank::x_idx_2#1 vblank::@5/(byte) vblank::x_idx_2#0 ) + [91] (byte) vblank::x_idx#2 ← phi( vblank::@13/(byte) vblank::x_idx#1 vblank::@5/(byte) vblank::x_idx#0 ) + [91] (byte) vblank::y_idx#2 ← phi( vblank::@13/(byte) vblank::y_idx#1 vblank::@5/(byte) vblank::y_idx#0 ) + [91] (byte) vblank::s#2 ← phi( vblank::@13/(byte) vblank::s#1 vblank::@5/(byte) 0 ) + [92] if((byte) vblank::s#2<(byte) $40) goto vblank::@7 + to:vblank::@return +vblank::@7: scope:[vblank] from vblank::@6 + [93] (byte~) vblank::$28 ← (byte) vblank::s#2 << (byte) 2 + [94] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) vblank::$28) ← *((const to_nomodify byte*) SINTABLE_240 + (byte) vblank::y_idx#2) + [95] (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 - (byte) 4 + [96] (byte~) vblank::$14 ← *((const to_nomodify byte*) SINTABLE_184 + (byte) vblank::x_idx#2) + *((const to_nomodify byte*) SINTABLE_64 + (byte) vblank::x_idx_2#2) + [97] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) vblank::$28) ← (byte~) vblank::$14 + [98] if((byte) vblank::x_idx#2<(byte) 3) goto vblank::@8 + to:vblank::@9 +vblank::@9: scope:[vblank] from vblank::@7 + [99] (byte~) vblank::$17 ← (byte) vblank::x_idx#2 - (byte) 3 + to:vblank::@10 +vblank::@10: scope:[vblank] from vblank::@8 vblank::@9 + [100] (byte) vblank::x_idx#1 ← phi( vblank::@8/(byte~) vblank::$19 vblank::@9/(byte~) vblank::$17 ) + [101] if((byte) vblank::x_idx_2#2>=(byte) $56) goto vblank::@11 + to:vblank::@12 +vblank::@12: scope:[vblank] from vblank::@10 + [102] (byte~) vblank::$23 ← (byte) vblank::x_idx_2#2 + (byte) 3 + to:vblank::@13 +vblank::@13: scope:[vblank] from vblank::@11 vblank::@12 + [103] (byte) vblank::x_idx_2#1 ← phi( vblank::@11/(byte~) vblank::$25 vblank::@12/(byte~) vblank::$23 ) + [104] (byte) vblank::s#1 ← ++ (byte) vblank::s#2 + to:vblank::@6 +vblank::@11: scope:[vblank] from vblank::@10 + [105] (byte~) vblank::$25 ← (byte) vblank::x_idx_2#2 - (byte) $56 + to:vblank::@13 +vblank::@8: scope:[vblank] from vblank::@7 + [106] (byte~) vblank::$19 ← (byte) vblank::x_idx#2 + (byte) $ec + to:vblank::@10 + +(byte()) readJoy1() +readJoy1: scope:[readJoy1] from vblank::@14 + [107] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1 + [108] *((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 + [109] (byte) readJoy1::joy#2 ← phi( readJoy1/(byte) 0 readJoy1::@2/(byte) readJoy1::joy#1 ) + [109] (byte) readJoy1::i#2 ← phi( readJoy1/(byte) 0 readJoy1::@2/(byte) readJoy1::i#1 ) + [110] if((byte) readJoy1::i#2<(byte) 8) goto readJoy1::@2 + to:readJoy1::@return +readJoy1::@return: scope:[readJoy1] from readJoy1::@1 + [111] return + to:@return +readJoy1::@2: scope:[readJoy1] from readJoy1::@1 + [112] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 + [113] (byte~) readJoy1::$2 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1 + [114] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2 + [115] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2 + to:readJoy1::@1 diff --git a/src/test/ref/examples/nes-dxycp/nes-dxycp.log b/src/test/ref/examples/nes-dxycp/nes-dxycp.log index 9dad3f465..f7d7889e1 100644 --- a/src/test/ref/examples/nes-dxycp/nes-dxycp.log +++ b/src/test/ref/examples/nes-dxycp/nes-dxycp.log @@ -3,9 +3,10 @@ Resolved forward reference PALETTE to (const byte*) PALETTE Resolved forward reference MESSAGE to (const byte*) MESSAGE Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER -Resolved forward reference SINTABLE to (const to_nomodify byte*) SINTABLE +Resolved forward reference SINTABLE_240 to (const to_nomodify byte*) SINTABLE_240 Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER -Resolved forward reference SINTABLE to (const to_nomodify byte*) SINTABLE +Resolved forward reference SINTABLE_184 to (const to_nomodify byte*) SINTABLE_184 +Resolved forward reference SINTABLE_64 to (const to_nomodify byte*) SINTABLE_64 Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER Constantified RValue *((const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$7) ← (struct SpriteData){ (byte) 0, *((const byte*) MESSAGE + (byte) main::s), (byte) 2, (byte) 0 } Inlined call call disableVideoOutput @@ -37,6 +38,44 @@ CONTROL FLOW GRAPH SSA @begin: scope:[] from to:@1 +(byte()) readJoy1() +readJoy1: scope:[readJoy1] from vblank::@16 + (byte*~) readJoy1::$7 ← (byte*)(const struct RICOH_2A03*) APU + (byte*~) readJoy1::$4 ← (byte*~) readJoy1::$7 + (const byte) OFFSET_STRUCT_RICOH_2A03_JOY1 + *((byte*~) readJoy1::$4) ← (number) 1 + (byte*~) readJoy1::$8 ← (byte*)(const struct RICOH_2A03*) APU + (byte*~) readJoy1::$5 ← (byte*~) readJoy1::$8 + (const byte) OFFSET_STRUCT_RICOH_2A03_JOY1 + *((byte*~) readJoy1::$5) ← (number) 0 + (byte) readJoy1::joy#0 ← (byte) 0 + (byte) readJoy1::i#0 ← (byte) 0 + to:readJoy1::@1 +readJoy1::@1: scope:[readJoy1] from readJoy1 readJoy1::@2 + (byte) readJoy1::joy#4 ← phi( readJoy1/(byte) readJoy1::joy#0 readJoy1::@2/(byte) readJoy1::joy#1 ) + (byte) readJoy1::i#2 ← phi( readJoy1/(byte) readJoy1::i#0 readJoy1::@2/(byte) readJoy1::i#1 ) + (bool~) readJoy1::$0 ← (byte) readJoy1::i#2 < (number) 8 + if((bool~) readJoy1::$0) goto readJoy1::@2 + to:readJoy1::@3 +readJoy1::@2: scope:[readJoy1] from readJoy1::@1 + (byte) readJoy1::i#3 ← phi( readJoy1::@1/(byte) readJoy1::i#2 ) + (byte) readJoy1::joy#2 ← phi( readJoy1::@1/(byte) readJoy1::joy#4 ) + (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (number) 1 + (byte*~) readJoy1::$9 ← (byte*)(const struct RICOH_2A03*) APU + (byte*~) readJoy1::$6 ← (byte*~) readJoy1::$9 + (const byte) OFFSET_STRUCT_RICOH_2A03_JOY1 + (number~) readJoy1::$2 ← *((byte*~) readJoy1::$6) & (number) 1 + (number~) readJoy1::$3 ← (byte~) readJoy1::$1 | (number~) readJoy1::$2 + (byte) readJoy1::joy#1 ← (number~) readJoy1::$3 + (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#3 + to:readJoy1::@1 +readJoy1::@3: scope:[readJoy1] from readJoy1::@1 + (byte) readJoy1::joy#3 ← phi( readJoy1::@1/(byte) readJoy1::joy#4 ) + (byte) readJoy1::return#0 ← (byte) readJoy1::joy#3 + to:readJoy1::@return +readJoy1::@return: scope:[readJoy1] from readJoy1::@3 + (byte) readJoy1::return#3 ← phi( readJoy1::@3/(byte) readJoy1::return#0 ) + (byte) readJoy1::return#1 ← (byte) readJoy1::return#3 + return + to:@return + (void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size) ppuDataFill: scope:[ppuDataFill] from main::@5 main::@6 (byte) ppuDataFill::val#8 ← phi( main::@5/(byte) ppuDataFill::val#0 main::@6/(byte) ppuDataFill::val#1 ) @@ -270,16 +309,17 @@ main::@return: scope:[main] from main::@3 @1: scope:[] from @begin (volatile byte) y_sin_idx ← (byte) 0 (volatile byte) x_sin_idx ← (byte) $49 + (volatile byte) x_sin_idx_2 ← (byte) $52 to:@2 interrupt(HARDWARE_STACK)(void()) vblank() vblank: scope:[vblank] from - (byte*~) vblank::$7 ← (byte*)(const struct RICOH_2C02*) PPU - (byte*~) vblank::$5 ← (byte*~) vblank::$7 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL - *((byte*~) vblank::$5) ← (number) 0 - (byte*~) vblank::$8 ← (byte*)(const struct RICOH_2C02*) PPU - (byte*~) vblank::$6 ← (byte*~) vblank::$8 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL - *((byte*~) vblank::$6) ← (number) 0 + (byte*~) vblank::$31 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) vblank::$29 ← (byte*~) vblank::$31 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL + *((byte*~) vblank::$29) ← (number) 0 + (byte*~) vblank::$32 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) vblank::$30 ← (byte*~) vblank::$32 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL + *((byte*~) vblank::$30) ← (number) 0 (struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 ← (const struct SpriteData*) SPRITE_BUFFER to:vblank::ppuSpriteBufferDmaTransfer1 vblank::ppuSpriteBufferDmaTransfer1: scope:[vblank] from vblank @@ -291,37 +331,135 @@ vblank::ppuSpriteBufferDmaTransfer1: scope:[vblank] from vblank (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::@3 -vblank::@3: scope:[vblank] from vblank::ppuSpriteBufferDmaTransfer1 + to:vblank::@16 +vblank::@16: scope:[vblank] from vblank::ppuSpriteBufferDmaTransfer1 + call readJoy1 + (byte) readJoy1::return#2 ← (byte) readJoy1::return#1 + to:vblank::@17 +vblank::@17: scope:[vblank] from vblank::@16 + (byte) readJoy1::return#4 ← phi( vblank::@16/(byte) readJoy1::return#2 ) + (byte~) vblank::$1 ← (byte) readJoy1::return#4 + (byte) vblank::joy#0 ← (byte~) vblank::$1 + (bool~) vblank::$33 ← (number) 0 != (byte) vblank::joy#0 + (bool~) vblank::$2 ← ! (bool~) vblank::$33 + if((bool~) vblank::$2) goto vblank::@1 + to:vblank::@return +vblank::@1: scope:[vblank] from vblank::@17 (byte) vblank::y_idx#0 ← (volatile byte) y_sin_idx (volatile byte) y_sin_idx ← ++ (volatile byte) y_sin_idx - (byte) vblank::x_idx#0 ← (volatile byte) x_sin_idx - (volatile byte) x_sin_idx ← ++ (volatile byte) x_sin_idx - (byte) vblank::s#0 ← (byte) 0 - to:vblank::@1 -vblank::@1: scope:[vblank] from vblank::@2 vblank::@3 - (byte) vblank::x_idx#3 ← phi( vblank::@2/(byte) vblank::x_idx#1 vblank::@3/(byte) vblank::x_idx#0 ) - (byte) vblank::y_idx#3 ← phi( vblank::@2/(byte) vblank::y_idx#1 vblank::@3/(byte) vblank::y_idx#0 ) - (byte) vblank::s#2 ← phi( vblank::@2/(byte) vblank::s#1 vblank::@3/(byte) vblank::s#0 ) - (bool~) vblank::$1 ← (byte) vblank::s#2 < (number) $40 - if((bool~) vblank::$1) goto vblank::@2 - to:vblank::@return -vblank::@2: scope:[vblank] from vblank::@1 - (byte) vblank::x_idx#2 ← phi( vblank::@1/(byte) vblank::x_idx#3 ) - (byte) vblank::y_idx#2 ← phi( vblank::@1/(byte) vblank::y_idx#3 ) - (byte) vblank::s#3 ← phi( vblank::@1/(byte) vblank::s#2 ) - (byte~) vblank::$3 ← (byte) vblank::s#3 * (const byte) SIZEOF_STRUCT_SPRITEDATA - *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (byte~) vblank::$3) ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::y_idx#2) - (number~) vblank::$2 ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::x_idx#2) + (number) 8 - (byte~) vblank::$4 ← (byte) vblank::s#3 * (const byte) SIZEOF_STRUCT_SPRITEDATA - *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) vblank::$4) ← (number~) vblank::$2 - (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 + (number) 4 - (byte) vblank::x_idx#1 ← (byte) vblank::x_idx#2 - (number) 7 - (byte) vblank::s#1 ← ++ (byte) vblank::s#3 - to:vblank::@1 -vblank::@return: scope:[vblank] from vblank::@1 + (bool~) vblank::$3 ← (volatile byte) x_sin_idx == (number) $ee + if((bool~) vblank::$3) goto vblank::@2 + to:vblank::@3 +vblank::@return: scope:[vblank] from vblank::@17 vblank::@8 return to:@return +vblank::@2: scope:[vblank] from vblank::@1 + (byte) vblank::y_idx#12 ← phi( vblank::@1/(byte) vblank::y_idx#0 ) + (number~) vblank::$6 ← (number) 0 + to:vblank::@4 +vblank::@3: scope:[vblank] from vblank::@1 + (byte) vblank::y_idx#13 ← phi( vblank::@1/(byte) vblank::y_idx#0 ) + (number~) vblank::$4 ← (volatile byte) x_sin_idx + (number) 1 + (number~) vblank::$5 ← (number~) vblank::$4 + to:vblank::@4 +vblank::@4: scope:[vblank] from vblank::@2 vblank::@3 + (byte) vblank::y_idx#10 ← phi( vblank::@2/(byte) vblank::y_idx#12 vblank::@3/(byte) vblank::y_idx#13 ) + (number~) vblank::$7 ← phi( vblank::@2/(number~) vblank::$6 vblank::@3/(number~) vblank::$5 ) + (volatile byte) x_sin_idx ← (number~) vblank::$7 + (byte) vblank::x_idx#0 ← (volatile byte) x_sin_idx + (bool~) vblank::$8 ← (volatile byte) x_sin_idx_2 == (number) $58 + if((bool~) vblank::$8) goto vblank::@5 + to:vblank::@6 +vblank::@5: scope:[vblank] from vblank::@4 + (byte) vblank::x_idx#8 ← phi( vblank::@4/(byte) vblank::x_idx#0 ) + (byte) vblank::y_idx#6 ← phi( vblank::@4/(byte) vblank::y_idx#10 ) + (number~) vblank::$11 ← (number) 0 + to:vblank::@7 +vblank::@6: scope:[vblank] from vblank::@4 + (byte) vblank::x_idx#9 ← phi( vblank::@4/(byte) vblank::x_idx#0 ) + (byte) vblank::y_idx#7 ← phi( vblank::@4/(byte) vblank::y_idx#10 ) + (number~) vblank::$9 ← (volatile byte) x_sin_idx_2 + (number) 1 + (number~) vblank::$10 ← (number~) vblank::$9 + to:vblank::@7 +vblank::@7: scope:[vblank] from vblank::@5 vblank::@6 + (byte) vblank::x_idx#7 ← phi( vblank::@5/(byte) vblank::x_idx#8 vblank::@6/(byte) vblank::x_idx#9 ) + (byte) vblank::y_idx#5 ← phi( vblank::@5/(byte) vblank::y_idx#6 vblank::@6/(byte) vblank::y_idx#7 ) + (number~) vblank::$12 ← phi( vblank::@5/(number~) vblank::$11 vblank::@6/(number~) vblank::$10 ) + (volatile byte) x_sin_idx_2 ← (number~) vblank::$12 + (byte) vblank::x_idx_2#0 ← (volatile byte) x_sin_idx_2 + (byte) vblank::s#0 ← (byte) 0 + to:vblank::@8 +vblank::@8: scope:[vblank] from vblank::@15 vblank::@7 + (byte) vblank::x_idx_2#6 ← phi( vblank::@15/(byte) vblank::x_idx_2#1 vblank::@7/(byte) vblank::x_idx_2#0 ) + (byte) vblank::x_idx#5 ← phi( vblank::@15/(byte) vblank::x_idx#6 vblank::@7/(byte) vblank::x_idx#7 ) + (byte) vblank::y_idx#3 ← phi( vblank::@15/(byte) vblank::y_idx#4 vblank::@7/(byte) vblank::y_idx#5 ) + (byte) vblank::s#2 ← phi( vblank::@15/(byte) vblank::s#1 vblank::@7/(byte) vblank::s#0 ) + (bool~) vblank::$13 ← (byte) vblank::s#2 < (number) $40 + if((bool~) vblank::$13) goto vblank::@9 + to:vblank::@return +vblank::@9: scope:[vblank] from vblank::@8 + (byte) vblank::x_idx_2#2 ← phi( vblank::@8/(byte) vblank::x_idx_2#6 ) + (byte) vblank::x_idx#2 ← phi( vblank::@8/(byte) vblank::x_idx#5 ) + (byte) vblank::y_idx#2 ← phi( vblank::@8/(byte) vblank::y_idx#3 ) + (byte) vblank::s#3 ← phi( vblank::@8/(byte) vblank::s#2 ) + (byte~) vblank::$27 ← (byte) vblank::s#3 * (const byte) SIZEOF_STRUCT_SPRITEDATA + *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (byte~) vblank::$27) ← *((const to_nomodify byte*) SINTABLE_240 + (byte) vblank::y_idx#2) + (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 - (number) 4 + (byte~) vblank::$14 ← *((const to_nomodify byte*) SINTABLE_184 + (byte) vblank::x_idx#2) + *((const to_nomodify byte*) SINTABLE_64 + (byte) vblank::x_idx_2#2) + (byte~) vblank::$28 ← (byte) vblank::s#3 * (const byte) SIZEOF_STRUCT_SPRITEDATA + *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) vblank::$28) ← (byte~) vblank::$14 + (bool~) vblank::$15 ← (byte) vblank::x_idx#2 < (number) 3 + if((bool~) vblank::$15) goto vblank::@10 + to:vblank::@11 +vblank::@10: scope:[vblank] from vblank::@9 + (byte) vblank::y_idx#14 ← phi( vblank::@9/(byte) vblank::y_idx#1 ) + (byte) vblank::s#8 ← phi( vblank::@9/(byte) vblank::s#3 ) + (byte) vblank::x_idx_2#7 ← phi( vblank::@9/(byte) vblank::x_idx_2#2 ) + (byte) vblank::x_idx#3 ← phi( vblank::@9/(byte) vblank::x_idx#2 ) + (number~) vblank::$18 ← (byte) vblank::x_idx#3 + (number) $ec + (number~) vblank::$19 ← (number~) vblank::$18 + to:vblank::@12 +vblank::@11: scope:[vblank] from vblank::@9 + (byte) vblank::y_idx#15 ← phi( vblank::@9/(byte) vblank::y_idx#1 ) + (byte) vblank::s#9 ← phi( vblank::@9/(byte) vblank::s#3 ) + (byte) vblank::x_idx_2#8 ← phi( vblank::@9/(byte) vblank::x_idx_2#2 ) + (byte) vblank::x_idx#4 ← phi( vblank::@9/(byte) vblank::x_idx#2 ) + (number~) vblank::$16 ← (byte) vblank::x_idx#4 - (number) 3 + (number~) vblank::$17 ← (number~) vblank::$16 + to:vblank::@12 +vblank::@12: scope:[vblank] from vblank::@10 vblank::@11 + (byte) vblank::y_idx#11 ← phi( vblank::@10/(byte) vblank::y_idx#14 vblank::@11/(byte) vblank::y_idx#15 ) + (byte) vblank::s#7 ← phi( vblank::@10/(byte) vblank::s#8 vblank::@11/(byte) vblank::s#9 ) + (byte) vblank::x_idx_2#3 ← phi( vblank::@10/(byte) vblank::x_idx_2#7 vblank::@11/(byte) vblank::x_idx_2#8 ) + (number~) vblank::$20 ← phi( vblank::@10/(number~) vblank::$19 vblank::@11/(number~) vblank::$17 ) + (byte) vblank::x_idx#1 ← (number~) vblank::$20 + (bool~) vblank::$21 ← (byte) vblank::x_idx_2#3 >= (number) $56 + if((bool~) vblank::$21) goto vblank::@13 + to:vblank::@14 +vblank::@13: scope:[vblank] from vblank::@12 + (byte) vblank::x_idx#10 ← phi( vblank::@12/(byte) vblank::x_idx#1 ) + (byte) vblank::y_idx#8 ← phi( vblank::@12/(byte) vblank::y_idx#11 ) + (byte) vblank::s#5 ← phi( vblank::@12/(byte) vblank::s#7 ) + (byte) vblank::x_idx_2#4 ← phi( vblank::@12/(byte) vblank::x_idx_2#3 ) + (number~) vblank::$24 ← (byte) vblank::x_idx_2#4 - (number) $56 + (number~) vblank::$25 ← (number~) vblank::$24 + to:vblank::@15 +vblank::@14: scope:[vblank] from vblank::@12 + (byte) vblank::x_idx#11 ← phi( vblank::@12/(byte) vblank::x_idx#1 ) + (byte) vblank::y_idx#9 ← phi( vblank::@12/(byte) vblank::y_idx#11 ) + (byte) vblank::s#6 ← phi( vblank::@12/(byte) vblank::s#7 ) + (byte) vblank::x_idx_2#5 ← phi( vblank::@12/(byte) vblank::x_idx_2#3 ) + (number~) vblank::$22 ← (byte) vblank::x_idx_2#5 + (number) 3 + (number~) vblank::$23 ← (number~) vblank::$22 + to:vblank::@15 +vblank::@15: scope:[vblank] from vblank::@13 vblank::@14 + (byte) vblank::x_idx#6 ← phi( vblank::@13/(byte) vblank::x_idx#10 vblank::@14/(byte) vblank::x_idx#11 ) + (byte) vblank::y_idx#4 ← phi( vblank::@13/(byte) vblank::y_idx#8 vblank::@14/(byte) vblank::y_idx#9 ) + (byte) vblank::s#4 ← phi( vblank::@13/(byte) vblank::s#5 vblank::@14/(byte) vblank::s#6 ) + (number~) vblank::$26 ← phi( vblank::@13/(number~) vblank::$25 vblank::@14/(number~) vblank::$23 ) + (byte) vblank::x_idx_2#1 ← (number~) vblank::$26 + (byte) vblank::s#1 ← ++ (byte) vblank::s#4 + to:vblank::@8 @2: scope:[] from @1 call main to:@3 @@ -340,6 +478,7 @@ SYMBOL TABLE SSA (const nomodify byte*) MEMORY = (byte*)(number) 0 (const byte*) MESSAGE[(number) $40] = (byte*) "rex-of-camelot-presents-a-dxycp-on-nintendo-entertainment-system"z (const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = (byte) $10 +(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1 = (byte) $16 (const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA = (byte) $14 (const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR = (byte) 3 (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR = (byte) 6 @@ -390,7 +529,11 @@ SYMBOL TABLE SSA (byte) RICOH_2C02::PPUMASK (byte) RICOH_2C02::PPUSCROLL (volatile byte) RICOH_2C02::PPUSTATUS loadstore -(const to_nomodify byte*) SINTABLE[(number) $100] = kickasm {{ .fill $100, round(115.5+107.5*sin(2*PI*i/256)) +(const to_nomodify byte*) SINTABLE_184[(number) $ef] = kickasm {{ .fill 239, round(71.5+71.5*sin(2*PI*i/239)) + }} +(const to_nomodify byte*) SINTABLE_240[(number) $100] = kickasm {{ .fill $100, round(115.5+107.5*sin(2*PI*i/256)) + }} +(const to_nomodify byte*) SINTABLE_64[(number) $59] = kickasm {{ .fill 89, round(52.5+52.5*sin(2*PI*i/89)) }} (const byte) SIZEOF_STRUCT_SPRITEDATA = (byte) 4 (const struct SpriteData*) SPRITE_BUFFER[(number) $100] = { fill( $100, 0) } @@ -570,19 +713,92 @@ SYMBOL TABLE SSA (word) ppuDataTransfer::size#5 (word) ppuDataTransfer::size#6 (word) ppuDataTransfer::size#7 +(byte()) readJoy1() +(bool~) readJoy1::$0 +(byte~) readJoy1::$1 +(number~) readJoy1::$2 +(number~) readJoy1::$3 +(byte*~) readJoy1::$4 +(byte*~) readJoy1::$5 +(byte*~) readJoy1::$6 +(byte*~) readJoy1::$7 +(byte*~) readJoy1::$8 +(byte*~) readJoy1::$9 +(label) readJoy1::@1 +(label) readJoy1::@2 +(label) readJoy1::@3 +(label) readJoy1::@return +(byte) readJoy1::i +(byte) readJoy1::i#0 +(byte) readJoy1::i#1 +(byte) readJoy1::i#2 +(byte) readJoy1::i#3 +(byte) readJoy1::joy +(byte) readJoy1::joy#0 +(byte) readJoy1::joy#1 +(byte) readJoy1::joy#2 +(byte) readJoy1::joy#3 +(byte) readJoy1::joy#4 +(byte) readJoy1::return +(byte) readJoy1::return#0 +(byte) readJoy1::return#1 +(byte) readJoy1::return#2 +(byte) readJoy1::return#3 +(byte) readJoy1::return#4 interrupt(HARDWARE_STACK)(void()) vblank() -(bool~) vblank::$1 -(number~) vblank::$2 -(byte~) vblank::$3 -(byte~) vblank::$4 -(byte*~) vblank::$5 -(byte*~) vblank::$6 -(byte*~) vblank::$7 -(byte*~) vblank::$8 +(byte~) vblank::$1 +(number~) vblank::$10 +(number~) vblank::$11 +(number~) vblank::$12 +(bool~) vblank::$13 +(byte~) vblank::$14 +(bool~) vblank::$15 +(number~) vblank::$16 +(number~) vblank::$17 +(number~) vblank::$18 +(number~) vblank::$19 +(bool~) vblank::$2 +(number~) vblank::$20 +(bool~) vblank::$21 +(number~) vblank::$22 +(number~) vblank::$23 +(number~) vblank::$24 +(number~) vblank::$25 +(number~) vblank::$26 +(byte~) vblank::$27 +(byte~) vblank::$28 +(byte*~) vblank::$29 +(bool~) vblank::$3 +(byte*~) vblank::$30 +(byte*~) vblank::$31 +(byte*~) vblank::$32 +(bool~) vblank::$33 +(number~) vblank::$4 +(number~) vblank::$5 +(number~) vblank::$6 +(number~) vblank::$7 +(bool~) vblank::$8 +(number~) vblank::$9 (label) vblank::@1 +(label) vblank::@10 +(label) vblank::@11 +(label) vblank::@12 +(label) vblank::@13 +(label) vblank::@14 +(label) vblank::@15 +(label) vblank::@16 +(label) vblank::@17 (label) vblank::@2 (label) vblank::@3 +(label) vblank::@4 +(label) vblank::@5 +(label) vblank::@6 +(label) vblank::@7 +(label) vblank::@8 +(label) vblank::@9 (label) vblank::@return +(byte) vblank::joy +(byte) vblank::joy#0 (label) vblank::ppuSpriteBufferDmaTransfer1 (byte~) vblank::ppuSpriteBufferDmaTransfer1_$0 (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1 @@ -597,19 +813,63 @@ interrupt(HARDWARE_STACK)(void()) vblank() (byte) vblank::s#1 (byte) vblank::s#2 (byte) vblank::s#3 +(byte) vblank::s#4 +(byte) vblank::s#5 +(byte) vblank::s#6 +(byte) vblank::s#7 +(byte) vblank::s#8 +(byte) vblank::s#9 (byte) vblank::x_idx (byte) vblank::x_idx#0 (byte) vblank::x_idx#1 +(byte) vblank::x_idx#10 +(byte) vblank::x_idx#11 (byte) vblank::x_idx#2 (byte) vblank::x_idx#3 +(byte) vblank::x_idx#4 +(byte) vblank::x_idx#5 +(byte) vblank::x_idx#6 +(byte) vblank::x_idx#7 +(byte) vblank::x_idx#8 +(byte) vblank::x_idx#9 +(byte) vblank::x_idx_2 +(byte) vblank::x_idx_2#0 +(byte) vblank::x_idx_2#1 +(byte) vblank::x_idx_2#2 +(byte) vblank::x_idx_2#3 +(byte) vblank::x_idx_2#4 +(byte) vblank::x_idx_2#5 +(byte) vblank::x_idx_2#6 +(byte) vblank::x_idx_2#7 +(byte) vblank::x_idx_2#8 (byte) vblank::y_idx (byte) vblank::y_idx#0 (byte) vblank::y_idx#1 +(byte) vblank::y_idx#10 +(byte) vblank::y_idx#11 +(byte) vblank::y_idx#12 +(byte) vblank::y_idx#13 +(byte) vblank::y_idx#14 +(byte) vblank::y_idx#15 (byte) vblank::y_idx#2 (byte) vblank::y_idx#3 +(byte) vblank::y_idx#4 +(byte) vblank::y_idx#5 +(byte) vblank::y_idx#6 +(byte) vblank::y_idx#7 +(byte) vblank::y_idx#8 +(byte) vblank::y_idx#9 (volatile byte) x_sin_idx loadstore +(volatile byte) x_sin_idx_2 loadstore (volatile byte) y_sin_idx loadstore +Adding number conversion cast (unumber) 1 in *((byte*~) readJoy1::$4) ← (number) 1 +Adding number conversion cast (unumber) 0 in *((byte*~) readJoy1::$5) ← (number) 0 +Adding number conversion cast (unumber) 8 in (bool~) readJoy1::$0 ← (byte) readJoy1::i#2 < (number) 8 +Adding number conversion cast (unumber) 1 in (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (number) 1 +Adding number conversion cast (unumber) 1 in (number~) readJoy1::$2 ← *((byte*~) readJoy1::$6) & (number) 1 +Adding number conversion cast (unumber) readJoy1::$2 in (number~) readJoy1::$2 ← *((byte*~) readJoy1::$6) & (unumber)(number) 1 +Adding number conversion cast (unumber) readJoy1::$3 in (number~) readJoy1::$3 ← (byte~) readJoy1::$1 | (unumber~) readJoy1::$2 Adding number conversion cast (unumber) 0 in *((byte*~) main::initNES1_disableVideoOutput1_$0) ← (number) 0 Adding number conversion cast (unumber) 0 in *((byte*~) main::initNES1_disableVideoOutput1_$1) ← (number) 0 Adding number conversion cast (unumber) $40 in *((const nomodify byte*) FR_COUNTER) ← (number) $40 @@ -643,15 +903,59 @@ Adding number conversion cast (unumber) $40 in (word) ppuDataFill::size#1 ← (n Adding number conversion cast (unumber) $40 in (bool~) main::$6 ← (byte) main::s#2 < (number) $40 Adding number conversion cast (unumber) $80 in *((byte*~) main::enableVideoOutput1_$0) ← (number) $80 Adding number conversion cast (unumber) $1e in *((byte*~) main::enableVideoOutput1_$1) ← (number) $1e -Adding number conversion cast (unumber) 0 in *((byte*~) vblank::$5) ← (number) 0 -Adding number conversion cast (unumber) 0 in *((byte*~) vblank::$6) ← (number) 0 +Adding number conversion cast (unumber) 0 in *((byte*~) vblank::$29) ← (number) 0 +Adding number conversion cast (unumber) 0 in *((byte*~) vblank::$30) ← (number) 0 Adding number conversion cast (unumber) 0 in *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1) ← (number) 0 -Adding number conversion cast (unumber) $40 in (bool~) vblank::$1 ← (byte) vblank::s#2 < (number) $40 -Adding number conversion cast (unumber) 8 in (number~) vblank::$2 ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::x_idx#2) + (number) 8 -Adding number conversion cast (unumber) vblank::$2 in (number~) vblank::$2 ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::x_idx#2) + (unumber)(number) 8 -Adding number conversion cast (unumber) 4 in (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 + (number) 4 -Adding number conversion cast (unumber) 7 in (byte) vblank::x_idx#1 ← (byte) vblank::x_idx#2 - (number) 7 +Adding number conversion cast (unumber) 0 in (bool~) vblank::$33 ← (number) 0 != (byte) vblank::joy#0 +Adding number conversion cast (unumber) $ee in (bool~) vblank::$3 ← (volatile byte) x_sin_idx == (number) $ee +Adding number conversion cast (unumber) 1 in (number~) vblank::$4 ← (volatile byte) x_sin_idx + (number) 1 +Adding number conversion cast (unumber) vblank::$4 in (number~) vblank::$4 ← (volatile byte) x_sin_idx + (unumber)(number) 1 +Adding number conversion cast (unumber) vblank::$5 in (number~) vblank::$5 ← (unumber~) vblank::$4 +Adding number conversion cast (unumber) vblank::$7 in (byte) vblank::y_idx#10 ← phi( vblank::@2/(byte) vblank::y_idx#12 vblank::@3/(byte) vblank::y_idx#13 ) + (number~) vblank::$7 ← phi( vblank::@2/(number~) vblank::$6 vblank::@3/(unumber~) vblank::$5 ) +Adding number conversion cast (unumber) $58 in (bool~) vblank::$8 ← (volatile byte) x_sin_idx_2 == (number) $58 +Adding number conversion cast (unumber) 1 in (number~) vblank::$9 ← (volatile byte) x_sin_idx_2 + (number) 1 +Adding number conversion cast (unumber) vblank::$9 in (number~) vblank::$9 ← (volatile byte) x_sin_idx_2 + (unumber)(number) 1 +Adding number conversion cast (unumber) vblank::$10 in (number~) vblank::$10 ← (unumber~) vblank::$9 +Adding number conversion cast (unumber) vblank::$12 in (byte) vblank::x_idx#7 ← phi( vblank::@5/(byte) vblank::x_idx#8 vblank::@6/(byte) vblank::x_idx#9 ) + (byte) vblank::y_idx#5 ← phi( vblank::@5/(byte) vblank::y_idx#6 vblank::@6/(byte) vblank::y_idx#7 ) + (number~) vblank::$12 ← phi( vblank::@5/(number~) vblank::$11 vblank::@6/(unumber~) vblank::$10 ) +Adding number conversion cast (unumber) $40 in (bool~) vblank::$13 ← (byte) vblank::s#2 < (number) $40 +Adding number conversion cast (unumber) 4 in (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 - (number) 4 +Adding number conversion cast (unumber) 3 in (bool~) vblank::$15 ← (byte) vblank::x_idx#2 < (number) 3 +Adding number conversion cast (unumber) $ec in (number~) vblank::$18 ← (byte) vblank::x_idx#3 + (number) $ec +Adding number conversion cast (unumber) vblank::$18 in (number~) vblank::$18 ← (byte) vblank::x_idx#3 + (unumber)(number) $ec +Adding number conversion cast (unumber) vblank::$19 in (number~) vblank::$19 ← (unumber~) vblank::$18 +Adding number conversion cast (unumber) 3 in (number~) vblank::$16 ← (byte) vblank::x_idx#4 - (number) 3 +Adding number conversion cast (unumber) vblank::$16 in (number~) vblank::$16 ← (byte) vblank::x_idx#4 - (unumber)(number) 3 +Adding number conversion cast (unumber) vblank::$17 in (number~) vblank::$17 ← (unumber~) vblank::$16 +Adding number conversion cast (unumber) vblank::$20 in (byte) vblank::y_idx#11 ← phi( vblank::@10/(byte) vblank::y_idx#14 vblank::@11/(byte) vblank::y_idx#15 ) + (byte) vblank::s#7 ← phi( vblank::@10/(byte) vblank::s#8 vblank::@11/(byte) vblank::s#9 ) + (byte) vblank::x_idx_2#3 ← phi( vblank::@10/(byte) vblank::x_idx_2#7 vblank::@11/(byte) vblank::x_idx_2#8 ) + (number~) vblank::$20 ← phi( vblank::@10/(unumber~) vblank::$19 vblank::@11/(unumber~) vblank::$17 ) +Adding number conversion cast (unumber) $56 in (bool~) vblank::$21 ← (byte) vblank::x_idx_2#3 >= (number) $56 +Adding number conversion cast (unumber) $56 in (number~) vblank::$24 ← (byte) vblank::x_idx_2#4 - (number) $56 +Adding number conversion cast (unumber) vblank::$24 in (number~) vblank::$24 ← (byte) vblank::x_idx_2#4 - (unumber)(number) $56 +Adding number conversion cast (unumber) vblank::$25 in (number~) vblank::$25 ← (unumber~) vblank::$24 +Adding number conversion cast (unumber) 3 in (number~) vblank::$22 ← (byte) vblank::x_idx_2#5 + (number) 3 +Adding number conversion cast (unumber) vblank::$22 in (number~) vblank::$22 ← (byte) vblank::x_idx_2#5 + (unumber)(number) 3 +Adding number conversion cast (unumber) vblank::$23 in (number~) vblank::$23 ← (unumber~) vblank::$22 +Adding number conversion cast (unumber) vblank::$26 in (byte) vblank::x_idx#6 ← phi( vblank::@13/(byte) vblank::x_idx#10 vblank::@14/(byte) vblank::x_idx#11 ) + (byte) vblank::y_idx#4 ← phi( vblank::@13/(byte) vblank::y_idx#8 vblank::@14/(byte) vblank::y_idx#9 ) + (byte) vblank::s#4 ← phi( vblank::@13/(byte) vblank::s#5 vblank::@14/(byte) vblank::s#6 ) + (number~) vblank::$26 ← phi( vblank::@13/(unumber~) vblank::$25 vblank::@14/(unumber~) vblank::$23 ) Successful SSA optimization PassNAddNumberTypeConversions +Adding number conversion cast (unumber) vblank::$6 in (byte) vblank::y_idx#10 ← phi( vblank::@2/(byte) vblank::y_idx#12 vblank::@3/(byte) vblank::y_idx#13 ) + (unumber~) vblank::$7 ← phi( vblank::@2/(number~) vblank::$6 vblank::@3/(unumber~) vblank::$5 ) +Adding number conversion cast (unumber) vblank::$11 in (byte) vblank::x_idx#7 ← phi( vblank::@5/(byte) vblank::x_idx#8 vblank::@6/(byte) vblank::x_idx#9 ) + (byte) vblank::y_idx#5 ← phi( vblank::@5/(byte) vblank::y_idx#6 vblank::@6/(byte) vblank::y_idx#7 ) + (unumber~) vblank::$12 ← phi( vblank::@5/(number~) vblank::$11 vblank::@6/(unumber~) vblank::$10 ) +Successful SSA optimization PassNAddNumberTypeConversions +Adding number conversion cast (unumber) 0 in (unumber~) vblank::$6 ← (number) 0 +Adding number conversion cast (unumber) 0 in (unumber~) vblank::$11 ← (number) 0 +Successful SSA optimization PassNAddNumberTypeConversions +Inlining cast *((byte*~) readJoy1::$4) ← (unumber)(number) 1 +Inlining cast *((byte*~) readJoy1::$5) ← (unumber)(number) 0 Inlining cast *((byte*~) main::initNES1_disableVideoOutput1_$0) ← (unumber)(number) 0 Inlining cast *((byte*~) main::initNES1_disableVideoOutput1_$1) ← (unumber)(number) 0 Inlining cast *((const nomodify byte*) FR_COUNTER) ← (unumber)(number) $40 @@ -669,9 +973,11 @@ Inlining cast (byte) ppuDataFill::val#1 ← (unumber)(number) 0 Inlining cast (word) ppuDataFill::size#1 ← (unumber)(number) $40 Inlining cast *((byte*~) main::enableVideoOutput1_$0) ← (unumber)(number) $80 Inlining cast *((byte*~) main::enableVideoOutput1_$1) ← (unumber)(number) $1e -Inlining cast *((byte*~) vblank::$5) ← (unumber)(number) 0 -Inlining cast *((byte*~) vblank::$6) ← (unumber)(number) 0 +Inlining cast *((byte*~) vblank::$29) ← (unumber)(number) 0 +Inlining cast *((byte*~) vblank::$30) ← (unumber)(number) 0 Inlining cast *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1) ← (unumber)(number) 0 +Inlining cast (unumber~) vblank::$6 ← (unumber)(number) 0 +Inlining cast (unumber~) vblank::$11 ← (unumber)(number) 0 Successful SSA optimization Pass2InlineCast Simplifying constant pointer cast (byte*) 8192 Simplifying constant pointer cast (byte*) 9152 @@ -682,6 +988,11 @@ Simplifying constant pointer cast (byte*) 0 Simplifying constant pointer cast (void()*) 0 Simplifying constant pointer cast (struct RICOH_2C02*) 8192 Simplifying constant pointer cast (struct RICOH_2A03*) 16384 +Simplifying constant integer cast 1 +Simplifying constant integer cast 0 +Simplifying constant integer cast 8 +Simplifying constant integer cast 1 +Simplifying constant integer cast 1 Simplifying constant integer cast 0 Simplifying constant integer cast 0 Simplifying constant integer cast $40 @@ -715,11 +1026,27 @@ Simplifying constant integer cast $1e Simplifying constant integer cast 0 Simplifying constant integer cast 0 Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast $ee +Simplifying constant integer cast 0 +Simplifying constant integer cast 1 +Simplifying constant integer cast $58 +Simplifying constant integer cast 0 +Simplifying constant integer cast 1 Simplifying constant integer cast $40 -Simplifying constant integer cast 8 Simplifying constant integer cast 4 -Simplifying constant integer cast 7 +Simplifying constant integer cast 3 +Simplifying constant integer cast $ec +Simplifying constant integer cast 3 +Simplifying constant integer cast $56 +Simplifying constant integer cast $56 +Simplifying constant integer cast 3 Successful SSA optimization PassNCastSimplification +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) 1 Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) $40 @@ -753,17 +1080,53 @@ Finalized unsigned number type (byte) $1e Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) 0 Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) $ee +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 1 +Finalized unsigned number type (byte) $58 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 1 Finalized unsigned number type (byte) $40 -Finalized unsigned number type (byte) 8 Finalized unsigned number type (byte) 4 -Finalized unsigned number type (byte) 7 +Finalized unsigned number type (byte) 3 +Finalized unsigned number type (byte) $ec +Finalized unsigned number type (byte) 3 +Finalized unsigned number type (byte) $56 +Finalized unsigned number type (byte) $56 +Finalized unsigned number type (byte) 3 Successful SSA optimization PassNFinalizeNumberTypeConversions +Inferred type updated to byte in (unumber~) readJoy1::$2 ← *((byte*~) readJoy1::$6) & (byte) 1 +Inferred type updated to byte in (unumber~) readJoy1::$3 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2 Inferred type updated to byte in (unumber~) main::initNES1_waitForVBlank1_$0 ← *((byte*~) main::initNES1_waitForVBlank1_$2) & (byte) $80 Inferred type updated to byte in (unumber~) main::initNES1_waitForVBlank2_$0 ← *((byte*~) main::initNES1_waitForVBlank2_$2) & (byte) $80 -Inferred type updated to byte in (unumber~) vblank::$2 ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::x_idx#2) + (byte) 8 -Inversing boolean not [68] (bool~) main::initNES1_waitForVBlank1_$1 ← (byte) 0 == (byte~) main::initNES1_waitForVBlank1_$0 from [67] (bool~) main::initNES1_waitForVBlank1_$4 ← (byte) 0 != (byte~) main::initNES1_waitForVBlank1_$0 -Inversing boolean not [87] (bool~) main::initNES1_waitForVBlank2_$1 ← (byte) 0 == (byte~) main::initNES1_waitForVBlank2_$0 from [86] (bool~) main::initNES1_waitForVBlank2_$4 ← (byte) 0 != (byte~) main::initNES1_waitForVBlank2_$0 +Inferred type updated to byte in (unumber~) vblank::$6 ← (byte) 0 +Inferred type updated to byte in (unumber~) vblank::$4 ← (volatile byte) x_sin_idx + (byte) 1 +Inferred type updated to byte in (unumber~) vblank::$5 ← (byte~) vblank::$4 +Inferred type updated to byte for (unumber~) vblank::$7 +Inferred type updated to byte in (unumber~) vblank::$11 ← (byte) 0 +Inferred type updated to byte in (unumber~) vblank::$9 ← (volatile byte) x_sin_idx_2 + (byte) 1 +Inferred type updated to byte in (unumber~) vblank::$10 ← (byte~) vblank::$9 +Inferred type updated to byte for (unumber~) vblank::$12 +Inferred type updated to byte in (unumber~) vblank::$18 ← (byte) vblank::x_idx#3 + (byte) $ec +Inferred type updated to byte in (unumber~) vblank::$19 ← (byte~) vblank::$18 +Inferred type updated to byte in (unumber~) vblank::$16 ← (byte) vblank::x_idx#4 - (byte) 3 +Inferred type updated to byte in (unumber~) vblank::$17 ← (byte~) vblank::$16 +Inferred type updated to byte for (unumber~) vblank::$20 +Inferred type updated to byte in (unumber~) vblank::$24 ← (byte) vblank::x_idx_2#4 - (byte) $56 +Inferred type updated to byte in (unumber~) vblank::$25 ← (byte~) vblank::$24 +Inferred type updated to byte in (unumber~) vblank::$22 ← (byte) vblank::x_idx_2#5 + (byte) 3 +Inferred type updated to byte in (unumber~) vblank::$23 ← (byte~) vblank::$22 +Inferred type updated to byte for (unumber~) vblank::$26 +Inversing boolean not [92] (bool~) main::initNES1_waitForVBlank1_$1 ← (byte) 0 == (byte~) main::initNES1_waitForVBlank1_$0 from [91] (bool~) main::initNES1_waitForVBlank1_$4 ← (byte) 0 != (byte~) main::initNES1_waitForVBlank1_$0 +Inversing boolean not [111] (bool~) main::initNES1_waitForVBlank2_$1 ← (byte) 0 == (byte~) main::initNES1_waitForVBlank2_$0 from [110] (bool~) main::initNES1_waitForVBlank2_$4 ← (byte) 0 != (byte~) main::initNES1_waitForVBlank2_$0 +Inversing boolean not [171] (bool~) vblank::$2 ← (byte) 0 == (byte) vblank::joy#0 from [170] (bool~) vblank::$33 ← (byte) 0 != (byte) vblank::joy#0 Successful SSA optimization Pass2UnaryNotSimplification +Alias candidate removed (volatile)x_sin_idx = vblank::$7 +Alias candidate removed (volatile)x_sin_idx_2 = vblank::$12 +Alias readJoy1::joy#2 = readJoy1::joy#4 readJoy1::joy#3 readJoy1::return#0 readJoy1::return#3 readJoy1::return#1 +Alias readJoy1::i#2 = readJoy1::i#3 +Alias readJoy1::joy#1 = readJoy1::$3 Alias ppuDataFill::ppuDataPrepare1_ppuData#0 = ppuDataFill::ppuData#2 ppuDataFill::ppuDataPrepare1_ppuData#1 Alias ppuDataFill::size#3 = ppuDataFill::size#5 ppuDataFill::size#7 Alias ppuDataFill::val#4 = ppuDataFill::val#6 ppuDataFill::val#8 @@ -780,10 +1143,39 @@ Alias ppuDataTransfer::ppuDataPut1_val#0 = ppuDataTransfer::ppuDataPut1_val#1 Alias ppuDataTransfer::size#0 = main::$1 Alias main::s#2 = main::s#3 Alias vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 = vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#1 -Alias vblank::s#2 = vblank::s#3 +Alias readJoy1::return#2 = readJoy1::return#4 +Alias vblank::joy#0 = vblank::$1 +Alias vblank::y_idx#0 = vblank::y_idx#12 vblank::y_idx#13 +Alias vblank::$5 = vblank::$4 +Alias vblank::y_idx#10 = vblank::y_idx#6 vblank::y_idx#7 +Alias vblank::x_idx#0 = vblank::x_idx#8 vblank::x_idx#9 +Alias vblank::$10 = vblank::$9 +Alias vblank::s#2 = vblank::s#3 vblank::s#8 vblank::s#9 Alias vblank::y_idx#2 = vblank::y_idx#3 -Alias vblank::x_idx#2 = vblank::x_idx#3 +Alias vblank::x_idx#2 = vblank::x_idx#5 vblank::x_idx#3 vblank::x_idx#4 +Alias vblank::x_idx_2#2 = vblank::x_idx_2#6 vblank::x_idx_2#7 vblank::x_idx_2#8 +Alias vblank::y_idx#1 = vblank::y_idx#14 vblank::y_idx#15 +Alias vblank::$19 = vblank::$18 +Alias vblank::$17 = vblank::$16 +Alias vblank::x_idx#1 = vblank::$20 vblank::x_idx#10 vblank::x_idx#11 +Alias vblank::x_idx_2#3 = vblank::x_idx_2#4 vblank::x_idx_2#5 +Alias vblank::s#5 = vblank::s#7 vblank::s#6 +Alias vblank::y_idx#11 = vblank::y_idx#8 vblank::y_idx#9 +Alias vblank::$25 = vblank::$24 +Alias vblank::$23 = vblank::$22 +Alias vblank::x_idx_2#1 = vblank::$26 Successful SSA optimization Pass2AliasElimination +Alias candidate removed (volatile)x_sin_idx = vblank::$7 +Alias candidate removed (volatile)x_sin_idx_2 = vblank::$12 +Alias vblank::y_idx#0 = vblank::y_idx#10 vblank::y_idx#5 +Alias vblank::x_idx#0 = vblank::x_idx#7 +Alias vblank::x_idx_2#2 = vblank::x_idx_2#3 +Alias vblank::s#2 = vblank::s#5 vblank::s#4 +Alias vblank::y_idx#1 = vblank::y_idx#11 vblank::y_idx#4 +Alias vblank::x_idx#1 = vblank::x_idx#6 +Successful SSA optimization Pass2AliasElimination +Alias candidate removed (volatile)x_sin_idx = vblank::$7 +Alias candidate removed (volatile)x_sin_idx_2 = vblank::$12 Identical Phi Values (word) ppuDataFill::size#2 (word) ppuDataFill::size#3 Identical Phi Values (byte) ppuDataFill::val#2 (byte) ppuDataFill::val#4 Identical Phi Values (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 (nomodify void*) ppuDataTransfer::ppuData#0 @@ -791,37 +1183,51 @@ Identical Phi Values (nomodify void*) ppuDataTransfer::cpuData#1 (nomodify void* Identical Phi Values (word) ppuDataTransfer::size#2 (word) ppuDataTransfer::size#0 Identical Phi Values (word) ppuDataTransfer::size#1 (word) ppuDataTransfer::size#2 Successful SSA optimization Pass2IdenticalPhiElimination -Identified duplicate assignment right side [152] (byte~) vblank::$4 ← (byte) vblank::s#2 * (const byte) SIZEOF_STRUCT_SPRITEDATA +Identified duplicate assignment right side [205] (byte~) vblank::$28 ← (byte) vblank::s#2 * (const byte) SIZEOF_STRUCT_SPRITEDATA Successful SSA optimization Pass2DuplicateRValueIdentification -Simple Condition (bool~) ppuDataFill::$1 [12] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::@2 -Simple Condition (bool~) ppuDataTransfer::$1 [31] if((word) ppuDataTransfer::i#2<(word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 -Simple Condition (bool~) main::initNES1_waitForVBlank1_$1 [55] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 -Simple Condition (bool~) main::initNES1_$5 [68] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 -Simple Condition (bool~) main::initNES1_waitForVBlank2_$1 [73] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 -Simple Condition (bool~) main::$6 [90] if((byte) main::s#2<(byte) $40) goto main::@2 -Simple Condition (bool~) main::$8 [104] if((number) 0!=(number) 1) goto main::@3 -Simple Condition (bool~) vblank::$1 [129] if((byte) vblank::s#2<(byte) $40) goto vblank::@2 +Simple Condition (bool~) readJoy1::$0 [10] if((byte) readJoy1::i#2<(byte) 8) goto readJoy1::@2 +Simple Condition (bool~) ppuDataFill::$1 [30] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::@2 +Simple Condition (bool~) ppuDataTransfer::$1 [49] if((word) ppuDataTransfer::i#2<(word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 +Simple Condition (bool~) main::initNES1_waitForVBlank1_$1 [73] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 +Simple Condition (bool~) main::initNES1_$5 [86] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 +Simple Condition (bool~) main::initNES1_waitForVBlank2_$1 [91] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 +Simple Condition (bool~) main::$6 [108] if((byte) main::s#2<(byte) $40) goto main::@2 +Simple Condition (bool~) main::$8 [122] if((number) 0!=(number) 1) goto main::@3 +Simple Condition (bool~) vblank::$2 [145] if((byte) 0==(byte) vblank::joy#0) goto vblank::@1 +Simple Condition (bool~) vblank::$3 [149] if((volatile byte) x_sin_idx==(byte) $ee) goto vblank::@2 +Simple Condition (bool~) vblank::$8 [157] if((volatile byte) x_sin_idx_2==(byte) $58) goto vblank::@5 +Simple Condition (bool~) vblank::$13 [166] if((byte) vblank::s#2<(byte) $40) goto vblank::@9 +Simple Condition (bool~) vblank::$15 [174] if((byte) vblank::x_idx#2<(byte) 3) goto vblank::@10 +Simple Condition (bool~) vblank::$21 [179] if((byte) vblank::x_idx_2#2>=(byte) $56) goto vblank::@13 Successful SSA optimization Pass2ConditionalJumpSimplification -Constant right-side identified [2] (byte*~) ppuDataFill::ppuDataPrepare1_$4 ← (byte*)(const struct RICOH_2C02*) PPU -Constant right-side identified [6] (byte*~) ppuDataFill::ppuDataPrepare1_$5 ← (byte*)(const struct RICOH_2C02*) PPU -Constant right-side identified [13] (byte*~) ppuDataFill::ppuDataPut1_$1 ← (byte*)(const struct RICOH_2C02*) PPU -Constant right-side identified [20] (byte*~) ppuDataTransfer::ppuDataPrepare1_$4 ← (byte*)(const struct RICOH_2C02*) PPU -Constant right-side identified [24] (byte*~) ppuDataTransfer::ppuDataPrepare1_$5 ← (byte*)(const struct RICOH_2C02*) PPU -Constant right-side identified [33] (byte*~) ppuDataTransfer::ppuDataPut1_$1 ← (byte*)(const struct RICOH_2C02*) PPU -Constant right-side identified [40] (byte*~) main::initNES1_disableVideoOutput1_$2 ← (byte*)(const struct RICOH_2C02*) PPU -Constant right-side identified [43] (byte*~) main::initNES1_disableVideoOutput1_$3 ← (byte*)(const struct RICOH_2C02*) PPU -Constant right-side identified [47] (byte*~) main::initNES1_disableAudioOutput1_$1 ← (byte*)(const struct RICOH_2A03*) APU -Constant right-side identified [51] (byte*~) main::initNES1_waitForVBlank1_$3 ← (byte*)(const struct RICOH_2C02*) PPU -Constant right-side identified [69] (byte*~) main::initNES1_waitForVBlank2_$3 ← (byte*)(const struct RICOH_2C02*) PPU -Constant right-side identified [75] (word) ppuDataTransfer::size#0 ← sizeof (const byte*) PALETTE -Constant right-side identified [81] (word) ppuDataFill::size#0 ← (unumber)(number) $20*(number) $1e -Constant right-side identified [97] (byte*~) main::enableVideoOutput1_$2 ← (byte*)(const struct RICOH_2C02*) PPU -Constant right-side identified [100] (byte*~) main::enableVideoOutput1_$3 ← (byte*)(const struct RICOH_2C02*) PPU -Constant right-side identified [108] (byte*~) vblank::$7 ← (byte*)(const struct RICOH_2C02*) PPU -Constant right-side identified [111] (byte*~) vblank::$8 ← (byte*)(const struct RICOH_2C02*) PPU -Constant right-side identified [115] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$3 ← (byte*)(const struct RICOH_2C02*) PPU -Constant right-side identified [119] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$4 ← (byte*)(const struct RICOH_2A03*) APU +Constant right-side identified [0] (byte*~) readJoy1::$7 ← (byte*)(const struct RICOH_2A03*) APU +Constant right-side identified [3] (byte*~) readJoy1::$8 ← (byte*)(const struct RICOH_2A03*) APU +Constant right-side identified [12] (byte*~) readJoy1::$9 ← (byte*)(const struct RICOH_2A03*) APU +Constant right-side identified [20] (byte*~) ppuDataFill::ppuDataPrepare1_$4 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [24] (byte*~) ppuDataFill::ppuDataPrepare1_$5 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [31] (byte*~) ppuDataFill::ppuDataPut1_$1 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [38] (byte*~) ppuDataTransfer::ppuDataPrepare1_$4 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [42] (byte*~) ppuDataTransfer::ppuDataPrepare1_$5 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [51] (byte*~) ppuDataTransfer::ppuDataPut1_$1 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [58] (byte*~) main::initNES1_disableVideoOutput1_$2 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [61] (byte*~) main::initNES1_disableVideoOutput1_$3 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [65] (byte*~) main::initNES1_disableAudioOutput1_$1 ← (byte*)(const struct RICOH_2A03*) APU +Constant right-side identified [69] (byte*~) main::initNES1_waitForVBlank1_$3 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [87] (byte*~) main::initNES1_waitForVBlank2_$3 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [93] (word) ppuDataTransfer::size#0 ← sizeof (const byte*) PALETTE +Constant right-side identified [99] (word) ppuDataFill::size#0 ← (unumber)(number) $20*(number) $1e +Constant right-side identified [115] (byte*~) main::enableVideoOutput1_$2 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [118] (byte*~) main::enableVideoOutput1_$3 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [127] (byte*~) vblank::$31 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [130] (byte*~) vblank::$32 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [134] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$3 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [138] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$4 ← (byte*)(const struct RICOH_2A03*) APU Successful SSA optimization Pass2ConstantRValueConsolidation +Constant (const byte*) readJoy1::$7 = (byte*)APU +Constant (const byte*) readJoy1::$8 = (byte*)APU +Constant (const byte) readJoy1::joy#0 = 0 +Constant (const byte) readJoy1::i#0 = 0 +Constant (const byte*) readJoy1::$9 = (byte*)APU Constant (const byte*) ppuDataFill::ppuDataPrepare1_$4 = (byte*)PPU Constant (const byte*) ppuDataFill::ppuDataPrepare1_$5 = (byte*)PPU Constant (const word) ppuDataFill::i#0 = 0 @@ -848,60 +1254,68 @@ Constant (const word) ppuDataFill::size#1 = $40 Constant (const byte) main::s#0 = 0 Constant (const byte*) main::enableVideoOutput1_$2 = (byte*)PPU Constant (const byte*) main::enableVideoOutput1_$3 = (byte*)PPU -Constant (const byte*) vblank::$7 = (byte*)PPU -Constant (const byte*) vblank::$8 = (byte*)PPU +Constant (const byte*) vblank::$31 = (byte*)PPU +Constant (const byte*) vblank::$32 = (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::$6 = 0 +Constant (const byte) vblank::$11 = 0 Constant (const byte) vblank::s#0 = 0 Successful SSA optimization Pass2ConstantIdentification Constant (const byte*) ppuDataTransfer::cpuSrc#0 = (byte*)ppuDataTransfer::cpuData#0 Successful SSA optimization Pass2ConstantIdentification -if() condition always true - replacing block destination [104] if((number) 0!=(number) 1) goto main::@3 +if() condition always true - replacing block destination [122] if((number) 0!=(number) 1) goto main::@3 Successful SSA optimization Pass2ConstantIfs -Converting *(pointer+n) to pointer[n] [4] *((byte*~) ppuDataFill::ppuDataPrepare1_$2) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 -- *(ppuDataFill::ppuDataPrepare1_$4 + OFFSET_STRUCT_RICOH_2C02_PPUADDR) -Converting *(pointer+n) to pointer[n] [8] *((byte*~) ppuDataFill::ppuDataPrepare1_$3) ← (byte~) ppuDataFill::ppuDataPrepare1_$1 -- *(ppuDataFill::ppuDataPrepare1_$5 + OFFSET_STRUCT_RICOH_2C02_PPUADDR) -Converting *(pointer+n) to pointer[n] [15] *((byte*~) ppuDataFill::ppuDataPut1_$0) ← (byte) ppuDataFill::val#4 -- *(ppuDataFill::ppuDataPut1_$1 + OFFSET_STRUCT_RICOH_2C02_PPUDATA) -Converting *(pointer+n) to pointer[n] [22] *((byte*~) ppuDataTransfer::ppuDataPrepare1_$2) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$0 -- *(ppuDataTransfer::ppuDataPrepare1_$4 + OFFSET_STRUCT_RICOH_2C02_PPUADDR) -Converting *(pointer+n) to pointer[n] [26] *((byte*~) ppuDataTransfer::ppuDataPrepare1_$3) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$1 -- *(ppuDataTransfer::ppuDataPrepare1_$5 + OFFSET_STRUCT_RICOH_2C02_PPUADDR) -Converting *(pointer+n) to pointer[n] [35] *((byte*~) ppuDataTransfer::ppuDataPut1_$0) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 -- *(ppuDataTransfer::ppuDataPut1_$1 + OFFSET_STRUCT_RICOH_2C02_PPUDATA) -Converting *(pointer+n) to pointer[n] [42] *((byte*~) main::initNES1_disableVideoOutput1_$0) ← (byte) 0 -- *(main::initNES1_disableVideoOutput1_$2 + OFFSET_STRUCT_RICOH_2C02_PPUCTRL) -Converting *(pointer+n) to pointer[n] [45] *((byte*~) main::initNES1_disableVideoOutput1_$1) ← (byte) 0 -- *(main::initNES1_disableVideoOutput1_$3 + OFFSET_STRUCT_RICOH_2C02_PPUMASK) -Converting *(pointer+n) to pointer[n] [49] *((byte*~) main::initNES1_disableAudioOutput1_$0) ← (byte) $40 -- *(main::initNES1_disableAudioOutput1_$1 + OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) -Converting *(pointer+n) to pointer[n] [53] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*~) main::initNES1_waitForVBlank1_$2) & (byte) $80 -- *(main::initNES1_waitForVBlank1_$3 + OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) -Converting *(pointer+n) to pointer[n] [71] (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] [99] *((byte*~) main::enableVideoOutput1_$0) ← (byte) $80 -- *(main::enableVideoOutput1_$2 + OFFSET_STRUCT_RICOH_2C02_PPUCTRL) -Converting *(pointer+n) to pointer[n] [102] *((byte*~) main::enableVideoOutput1_$1) ← (byte) $1e -- *(main::enableVideoOutput1_$3 + OFFSET_STRUCT_RICOH_2C02_PPUMASK) -Converting *(pointer+n) to pointer[n] [110] *((byte*~) vblank::$5) ← (byte) 0 -- *(vblank::$7 + OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) -Converting *(pointer+n) to pointer[n] [113] *((byte*~) vblank::$6) ← (byte) 0 -- *(vblank::$8 + OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) -Converting *(pointer+n) to pointer[n] [117] *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1) ← (byte) 0 -- *(vblank::ppuSpriteBufferDmaTransfer1_$3 + OFFSET_STRUCT_RICOH_2C02_OAMADDR) -Converting *(pointer+n) to pointer[n] [121] *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2) ← (byte~) vblank::ppuSpriteBufferDmaTransfer1_$0 -- *(vblank::ppuSpriteBufferDmaTransfer1_$4 + OFFSET_STRUCT_RICOH_2A03_OAMDMA) +Converting *(pointer+n) to pointer[n] [2] *((byte*~) readJoy1::$4) ← (byte) 1 -- *(readJoy1::$7 + OFFSET_STRUCT_RICOH_2A03_JOY1) +Converting *(pointer+n) to pointer[n] [5] *((byte*~) readJoy1::$5) ← (byte) 0 -- *(readJoy1::$8 + OFFSET_STRUCT_RICOH_2A03_JOY1) +Converting *(pointer+n) to pointer[n] [14] (byte~) readJoy1::$2 ← *((byte*~) readJoy1::$6) & (byte) 1 -- *(readJoy1::$9 + OFFSET_STRUCT_RICOH_2A03_JOY1) +Converting *(pointer+n) to pointer[n] [22] *((byte*~) ppuDataFill::ppuDataPrepare1_$2) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 -- *(ppuDataFill::ppuDataPrepare1_$4 + OFFSET_STRUCT_RICOH_2C02_PPUADDR) +Converting *(pointer+n) to pointer[n] [26] *((byte*~) ppuDataFill::ppuDataPrepare1_$3) ← (byte~) ppuDataFill::ppuDataPrepare1_$1 -- *(ppuDataFill::ppuDataPrepare1_$5 + OFFSET_STRUCT_RICOH_2C02_PPUADDR) +Converting *(pointer+n) to pointer[n] [33] *((byte*~) ppuDataFill::ppuDataPut1_$0) ← (byte) ppuDataFill::val#4 -- *(ppuDataFill::ppuDataPut1_$1 + OFFSET_STRUCT_RICOH_2C02_PPUDATA) +Converting *(pointer+n) to pointer[n] [40] *((byte*~) ppuDataTransfer::ppuDataPrepare1_$2) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$0 -- *(ppuDataTransfer::ppuDataPrepare1_$4 + OFFSET_STRUCT_RICOH_2C02_PPUADDR) +Converting *(pointer+n) to pointer[n] [44] *((byte*~) ppuDataTransfer::ppuDataPrepare1_$3) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$1 -- *(ppuDataTransfer::ppuDataPrepare1_$5 + OFFSET_STRUCT_RICOH_2C02_PPUADDR) +Converting *(pointer+n) to pointer[n] [53] *((byte*~) ppuDataTransfer::ppuDataPut1_$0) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 -- *(ppuDataTransfer::ppuDataPut1_$1 + OFFSET_STRUCT_RICOH_2C02_PPUDATA) +Converting *(pointer+n) to pointer[n] [60] *((byte*~) main::initNES1_disableVideoOutput1_$0) ← (byte) 0 -- *(main::initNES1_disableVideoOutput1_$2 + OFFSET_STRUCT_RICOH_2C02_PPUCTRL) +Converting *(pointer+n) to pointer[n] [63] *((byte*~) main::initNES1_disableVideoOutput1_$1) ← (byte) 0 -- *(main::initNES1_disableVideoOutput1_$3 + OFFSET_STRUCT_RICOH_2C02_PPUMASK) +Converting *(pointer+n) to pointer[n] [67] *((byte*~) main::initNES1_disableAudioOutput1_$0) ← (byte) $40 -- *(main::initNES1_disableAudioOutput1_$1 + OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) +Converting *(pointer+n) to pointer[n] [71] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*~) main::initNES1_waitForVBlank1_$2) & (byte) $80 -- *(main::initNES1_waitForVBlank1_$3 + OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) +Converting *(pointer+n) to pointer[n] [89] (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] [117] *((byte*~) main::enableVideoOutput1_$0) ← (byte) $80 -- *(main::enableVideoOutput1_$2 + OFFSET_STRUCT_RICOH_2C02_PPUCTRL) +Converting *(pointer+n) to pointer[n] [120] *((byte*~) main::enableVideoOutput1_$1) ← (byte) $1e -- *(main::enableVideoOutput1_$3 + OFFSET_STRUCT_RICOH_2C02_PPUMASK) +Converting *(pointer+n) to pointer[n] [129] *((byte*~) vblank::$29) ← (byte) 0 -- *(vblank::$31 + OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) +Converting *(pointer+n) to pointer[n] [132] *((byte*~) vblank::$30) ← (byte) 0 -- *(vblank::$32 + OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) +Converting *(pointer+n) to pointer[n] [136] *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1) ← (byte) 0 -- *(vblank::ppuSpriteBufferDmaTransfer1_$3 + OFFSET_STRUCT_RICOH_2C02_OAMADDR) +Converting *(pointer+n) to pointer[n] [140] *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2) ← (byte~) vblank::ppuSpriteBufferDmaTransfer1_$0 -- *(vblank::ppuSpriteBufferDmaTransfer1_$4 + OFFSET_STRUCT_RICOH_2A03_OAMDMA) Successful SSA optimization Pass2InlineDerefIdx -Simplifying expression containing zero main::initNES1_disableVideoOutput1_$2 in [41] (byte*~) main::initNES1_disableVideoOutput1_$0 ← (const byte*) main::initNES1_disableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL -Simplifying expression containing zero main::initNES1_disableVideoOutput1_$2 in [42] *((const byte*) main::initNES1_disableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL) ← (byte) 0 -Simplifying expression containing zero MEMORY in [58] *((const nomodify byte*) MEMORY+(byte) 0 + (byte) main::initNES1_i#2) ← (byte) 0 -Simplifying expression containing zero (byte*)SPRITE_BUFFER in [92] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (byte~) main::$7) ← (byte) 0 -Simplifying expression containing zero main::enableVideoOutput1_$2 in [98] (byte*~) main::enableVideoOutput1_$0 ← (const byte*) main::enableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL -Simplifying expression containing zero main::enableVideoOutput1_$2 in [99] *((const byte*) main::enableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL) ← (byte) $80 -Simplifying expression containing zero (byte*)SPRITE_BUFFER in [131] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (byte~) vblank::$3) ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::y_idx#2) +Simplifying expression containing zero main::initNES1_disableVideoOutput1_$2 in [59] (byte*~) main::initNES1_disableVideoOutput1_$0 ← (const byte*) main::initNES1_disableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL +Simplifying expression containing zero main::initNES1_disableVideoOutput1_$2 in [60] *((const byte*) main::initNES1_disableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL) ← (byte) 0 +Simplifying expression containing zero MEMORY in [76] *((const nomodify byte*) MEMORY+(byte) 0 + (byte) main::initNES1_i#2) ← (byte) 0 +Simplifying expression containing zero (byte*)SPRITE_BUFFER in [110] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (byte~) main::$7) ← (byte) 0 +Simplifying expression containing zero main::enableVideoOutput1_$2 in [116] (byte*~) main::enableVideoOutput1_$0 ← (const byte*) main::enableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL +Simplifying expression containing zero main::enableVideoOutput1_$2 in [117] *((const byte*) main::enableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL) ← (byte) $80 +Simplifying expression containing zero (byte*)SPRITE_BUFFER in [168] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (byte~) vblank::$27) ← *((const to_nomodify byte*) SINTABLE_240 + (byte) vblank::y_idx#2) Successful SSA optimization PassNSimplifyExpressionWithZero -Eliminating unused variable (byte*~) ppuDataFill::ppuDataPrepare1_$2 and assignment [2] (byte*~) ppuDataFill::ppuDataPrepare1_$2 ← (const byte*) ppuDataFill::ppuDataPrepare1_$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR -Eliminating unused variable (byte*~) ppuDataFill::ppuDataPrepare1_$3 and assignment [5] (byte*~) ppuDataFill::ppuDataPrepare1_$3 ← (const byte*) ppuDataFill::ppuDataPrepare1_$5 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR -Eliminating unused variable (byte*~) ppuDataFill::ppuDataPut1_$0 and assignment [9] (byte*~) ppuDataFill::ppuDataPut1_$0 ← (const byte*) ppuDataFill::ppuDataPut1_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA -Eliminating unused variable (byte*~) ppuDataTransfer::ppuDataPrepare1_$2 and assignment [14] (byte*~) ppuDataTransfer::ppuDataPrepare1_$2 ← (const byte*) ppuDataTransfer::ppuDataPrepare1_$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR -Eliminating unused variable (byte*~) ppuDataTransfer::ppuDataPrepare1_$3 and assignment [17] (byte*~) ppuDataTransfer::ppuDataPrepare1_$3 ← (const byte*) ppuDataTransfer::ppuDataPrepare1_$5 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR -Eliminating unused variable (byte*~) ppuDataTransfer::ppuDataPut1_$0 and assignment [22] (byte*~) ppuDataTransfer::ppuDataPut1_$0 ← (const byte*) ppuDataTransfer::ppuDataPut1_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA -Eliminating unused variable (byte*~) main::initNES1_disableVideoOutput1_$0 and assignment [28] (byte*~) main::initNES1_disableVideoOutput1_$0 ← (const byte*) main::initNES1_disableVideoOutput1_$2 -Eliminating unused variable (byte*~) main::initNES1_disableVideoOutput1_$1 and assignment [30] (byte*~) main::initNES1_disableVideoOutput1_$1 ← (const byte*) main::initNES1_disableVideoOutput1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK -Eliminating unused variable (byte*~) main::initNES1_disableAudioOutput1_$0 and assignment [33] (byte*~) main::initNES1_disableAudioOutput1_$0 ← (const byte*) main::initNES1_disableAudioOutput1_$1 + (const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ -Eliminating unused variable (byte*~) main::initNES1_waitForVBlank1_$2 and assignment [36] (byte*~) main::initNES1_waitForVBlank1_$2 ← (const byte*) main::initNES1_waitForVBlank1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS -Eliminating unused variable (byte*~) main::initNES1_waitForVBlank2_$2 and assignment [50] (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 [65] (byte*~) main::enableVideoOutput1_$0 ← (const byte*) main::enableVideoOutput1_$2 -Eliminating unused variable (byte*~) main::enableVideoOutput1_$1 and assignment [67] (byte*~) main::enableVideoOutput1_$1 ← (const byte*) main::enableVideoOutput1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK -Eliminating unused variable (byte*~) vblank::$5 and assignment [72] (byte*~) vblank::$5 ← (const byte*) vblank::$7 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL -Eliminating unused variable (byte*~) vblank::$6 and assignment [74] (byte*~) vblank::$6 ← (const byte*) vblank::$8 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL -Eliminating unused variable (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1 and assignment [76] (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 [79] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2 ← (const byte*) vblank::ppuSpriteBufferDmaTransfer1_$4 + (const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA +Eliminating unused variable (byte*~) readJoy1::$4 and assignment [0] (byte*~) readJoy1::$4 ← (const byte*) readJoy1::$7 + (const byte) OFFSET_STRUCT_RICOH_2A03_JOY1 +Eliminating unused variable (byte*~) readJoy1::$5 and assignment [2] (byte*~) readJoy1::$5 ← (const byte*) readJoy1::$8 + (const byte) OFFSET_STRUCT_RICOH_2A03_JOY1 +Eliminating unused variable (byte*~) readJoy1::$6 and assignment [7] (byte*~) readJoy1::$6 ← (const byte*) readJoy1::$9 + (const byte) OFFSET_STRUCT_RICOH_2A03_JOY1 +Eliminating unused variable (byte*~) ppuDataFill::ppuDataPrepare1_$2 and assignment [14] (byte*~) ppuDataFill::ppuDataPrepare1_$2 ← (const byte*) ppuDataFill::ppuDataPrepare1_$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR +Eliminating unused variable (byte*~) ppuDataFill::ppuDataPrepare1_$3 and assignment [17] (byte*~) ppuDataFill::ppuDataPrepare1_$3 ← (const byte*) ppuDataFill::ppuDataPrepare1_$5 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR +Eliminating unused variable (byte*~) ppuDataFill::ppuDataPut1_$0 and assignment [21] (byte*~) ppuDataFill::ppuDataPut1_$0 ← (const byte*) ppuDataFill::ppuDataPut1_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA +Eliminating unused variable (byte*~) ppuDataTransfer::ppuDataPrepare1_$2 and assignment [26] (byte*~) ppuDataTransfer::ppuDataPrepare1_$2 ← (const byte*) ppuDataTransfer::ppuDataPrepare1_$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR +Eliminating unused variable (byte*~) ppuDataTransfer::ppuDataPrepare1_$3 and assignment [29] (byte*~) ppuDataTransfer::ppuDataPrepare1_$3 ← (const byte*) ppuDataTransfer::ppuDataPrepare1_$5 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR +Eliminating unused variable (byte*~) ppuDataTransfer::ppuDataPut1_$0 and assignment [34] (byte*~) ppuDataTransfer::ppuDataPut1_$0 ← (const byte*) ppuDataTransfer::ppuDataPut1_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA +Eliminating unused variable (byte*~) main::initNES1_disableVideoOutput1_$0 and assignment [40] (byte*~) main::initNES1_disableVideoOutput1_$0 ← (const byte*) main::initNES1_disableVideoOutput1_$2 +Eliminating unused variable (byte*~) main::initNES1_disableVideoOutput1_$1 and assignment [42] (byte*~) main::initNES1_disableVideoOutput1_$1 ← (const byte*) main::initNES1_disableVideoOutput1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK +Eliminating unused variable (byte*~) main::initNES1_disableAudioOutput1_$0 and assignment [45] (byte*~) main::initNES1_disableAudioOutput1_$0 ← (const byte*) main::initNES1_disableAudioOutput1_$1 + (const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ +Eliminating unused variable (byte*~) main::initNES1_waitForVBlank1_$2 and assignment [48] (byte*~) main::initNES1_waitForVBlank1_$2 ← (const byte*) main::initNES1_waitForVBlank1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS +Eliminating unused variable (byte*~) main::initNES1_waitForVBlank2_$2 and assignment [62] (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 [77] (byte*~) main::enableVideoOutput1_$0 ← (const byte*) main::enableVideoOutput1_$2 +Eliminating unused variable (byte*~) main::enableVideoOutput1_$1 and assignment [79] (byte*~) main::enableVideoOutput1_$1 ← (const byte*) main::enableVideoOutput1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK +Eliminating unused variable (byte*~) vblank::$29 and assignment [85] (byte*~) vblank::$29 ← (const byte*) vblank::$31 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL +Eliminating unused variable (byte*~) vblank::$30 and assignment [87] (byte*~) vblank::$30 ← (const byte*) vblank::$32 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL +Eliminating unused variable (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1 and assignment [89] (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 [92] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2 ← (const byte*) vblank::ppuSpriteBufferDmaTransfer1_$4 + (const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA Eliminating unused constant (const byte) OFFSET_STRUCT_SPRITEDATA_Y Eliminating unused constant (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL Successful SSA optimization PassNEliminateUnusedVars @@ -909,11 +1323,15 @@ Removing unused block main::@return Successful SSA optimization Pass2EliminateUnusedBlocks Resolving array sizeof() sizeof (const byte*) PALETTE Successful SSA optimization PassNSizeOfSimplification -Alias vblank::$4 = vblank::$3 +Alias candidate removed (volatile)x_sin_idx = vblank::$7 +Alias candidate removed (volatile)x_sin_idx_2 = vblank::$12 +Alias vblank::$28 = vblank::$27 Successful SSA optimization Pass2AliasElimination -Constant right-side identified [10] (byte~) ppuDataTransfer::ppuDataPrepare1_$0 ← > (const nomodify void*) ppuDataTransfer::ppuData#0 -Constant right-side identified [12] (byte~) ppuDataTransfer::ppuDataPrepare1_$1 ← < (const nomodify void*) ppuDataTransfer::ppuData#0 -Constant right-side identified [61] (byte~) vblank::ppuSpriteBufferDmaTransfer1_$0 ← > (const struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 +Alias candidate removed (volatile)x_sin_idx = vblank::$7 +Alias candidate removed (volatile)x_sin_idx_2 = vblank::$12 +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 [71] (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 = (const nomodify void*) ppuDataTransfer::ppuData#0 Constant inlined vblank::s#0 = (byte) 0 Constant inlined main::enableVideoOutput1_$3 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined vblank::$6 = (byte) 0 Constant inlined main::enableVideoOutput1_$2 = (byte*)(const struct RICOH_2C02*) PPU -Constant inlined vblank::$7 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined readJoy1::i#0 = (byte) 0 Constant inlined ppuDataTransfer::ppuDataPut1_$1 = (byte*)(const struct RICOH_2C02*) PPU -Constant inlined vblank::$8 = (byte*)(const struct RICOH_2C02*) PPU Constant inlined ppuDataFill::val#1 = (byte) 0 Constant inlined ppuDataFill::ppuDataPut1_$1 = (byte*)(const struct RICOH_2C02*) PPU Constant inlined ppuDataFill::val#0 = (byte) '*' @@ -964,18 +1388,28 @@ Constant inlined main::initNES1_disableVideoOutput1_$2 = (byte*)(const struct RI Constant inlined ppuDataFill::ppuData#1 = (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 Constant inlined ppuDataFill::ppuData#0 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0 Constant inlined main::initNES1_disableAudioOutput1_$1 = (byte*)(const struct RICOH_2A03*) APU +Constant inlined readJoy1::joy#0 = (byte) 0 Constant inlined ppuDataTransfer::cpuSrc#0 = (byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 Constant inlined main::s#0 = (byte) 0 Constant inlined main::initNES1_i#0 = (byte) 0 +Constant inlined vblank::$31 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined vblank::$32 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined vblank::$11 = (byte) 0 +Constant inlined readJoy1::$9 = (byte*)(const struct RICOH_2A03*) APU Constant inlined vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 = (const struct SpriteData*) SPRITE_BUFFER Constant inlined main::initNES1_waitForVBlank1_$3 = (byte*)(const struct RICOH_2C02*) PPU Constant inlined vblank::ppuSpriteBufferDmaTransfer1_$0 = >(const struct SpriteData*) SPRITE_BUFFER Constant inlined ppuDataFill::size#1 = (byte) $40 Constant inlined ppuDataFill::size#0 = (word)(number) $20*(number) $1e +Constant inlined readJoy1::$7 = (byte*)(const struct RICOH_2A03*) APU Constant inlined vblank::ppuSpriteBufferDmaTransfer1_$3 = (byte*)(const struct RICOH_2C02*) PPU Constant inlined ppuDataFill::i#0 = (word) 0 +Constant inlined readJoy1::$8 = (byte*)(const struct RICOH_2A03*) APU Constant inlined vblank::ppuSpriteBufferDmaTransfer1_$4 = (byte*)(const struct RICOH_2A03*) APU Successful SSA optimization Pass2ConstantInlining +Consolidated array index constant in *((byte*)APU+OFFSET_STRUCT_RICOH_2A03_JOY1) +Consolidated array index constant in *((byte*)APU+OFFSET_STRUCT_RICOH_2A03_JOY1) +Consolidated array index constant in *((byte*)APU+OFFSET_STRUCT_RICOH_2A03_JOY1) Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR) Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR) Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA) @@ -992,8 +1426,12 @@ Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUSC Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_OAMADDR) Consolidated array index constant in *((byte*)APU+OFFSET_STRUCT_RICOH_2A03_OAMDMA) Successful SSA optimization Pass2ConstantAdditionElimination +Alias candidate removed (volatile)x_sin_idx = vblank::$7 +Alias candidate removed (volatile)x_sin_idx_2 = vblank::$12 Eliminating unused constant (const byte) SIZEOF_STRUCT_SPRITEDATA Successful SSA optimization PassNEliminateUnusedVars +Alias candidate removed (volatile)x_sin_idx = vblank::$7 +Alias candidate removed (volatile)x_sin_idx_2 = vblank::$12 Added new block during phi lifting main::@8(between main::initNES1_@1 and main::initNES1_@1) Adding NOP phi() at start of @begin Adding NOP phi() at start of @2 @@ -1012,22 +1450,37 @@ Adding NOP phi() at start of ppuDataFill::@3 Adding NOP phi() at start of ppuDataFill::@2 Adding NOP phi() at start of ppuDataTransfer Adding NOP phi() at start of ppuDataTransfer::@3 +Adding NOP phi() at start of vblank::@16 +Adding NOP phi() at start of vblank::@5 +Adding NOP phi() at start of vblank::@2 +Adding NOP phi() at start of readJoy1::@3 CALL GRAPH -Calls in [] to main:4 -Calls in [main] to ppuDataTransfer:34 ppuDataFill:36 ppuDataFill:38 +Calls in [] to main:5 +Calls in [main] to ppuDataTransfer:35 ppuDataFill:37 ppuDataFill:39 +Calls in [vblank] to readJoy1:85 -Created 11 initial phi equivalence classes -Coalesced [51] main::s#4 ← main::s#1 -Coalesced [52] main::initNES1_i#3 ← main::initNES1_i#1 -Coalesced [65] ppuDataFill::i#6 ← ppuDataFill::i#1 -Coalesced [77] ppuDataTransfer::i#6 ← ppuDataTransfer::i#1 -Coalesced [78] ppuDataTransfer::cpuSrc#6 ← ppuDataTransfer::cpuSrc#1 -Coalesced [87] vblank::y_idx#5 ← vblank::y_idx#0 -Coalesced [88] vblank::x_idx#5 ← vblank::x_idx#0 -Coalesced [99] vblank::s#4 ← vblank::s#1 -Coalesced [100] vblank::y_idx#4 ← vblank::y_idx#1 -Coalesced [101] vblank::x_idx#4 ← vblank::x_idx#1 -Coalesced down to 11 phi equivalence classes +Created 18 initial phi equivalence classes +Coalesced [52] main::s#4 ← main::s#1 +Coalesced [53] main::initNES1_i#3 ← main::initNES1_i#1 +Coalesced [66] ppuDataFill::i#6 ← ppuDataFill::i#1 +Coalesced [78] ppuDataTransfer::i#6 ← ppuDataTransfer::i#1 +Coalesced [79] ppuDataTransfer::cpuSrc#6 ← ppuDataTransfer::cpuSrc#1 +Coalesced [94] vblank::$34 ← vblank::$5 +Coalesced [100] vblank::$35 ← vblank::$10 +Coalesced [104] vblank::y_idx#17 ← vblank::y_idx#0 +Coalesced [105] vblank::x_idx#13 ← vblank::x_idx#0 +Coalesced [106] vblank::x_idx_2#10 ← vblank::x_idx_2#0 +Coalesced [116] vblank::x_idx#15 ← vblank::$17 +Coalesced [120] vblank::x_idx_2#12 ← vblank::$23 +Coalesced [123] vblank::s#10 ← vblank::s#1 +Coalesced [124] vblank::y_idx#16 ← vblank::y_idx#1 +Coalesced [125] vblank::x_idx#12 ← vblank::x_idx#1 +Coalesced [126] vblank::x_idx_2#9 ← vblank::x_idx_2#1 +Coalesced [128] vblank::x_idx_2#11 ← vblank::$25 +Coalesced [130] vblank::x_idx#14 ← vblank::$19 +Coalesced [143] readJoy1::i#4 ← readJoy1::i#1 +Coalesced [144] readJoy1::joy#5 ← readJoy1::joy#1 +Coalesced down to 16 phi equivalence classes Culled Empty Block (label) @3 Culled Empty Block (label) main::initNES1_@6 Culled Empty Block (label) main::@7 @@ -1035,8 +1488,25 @@ Culled Empty Block (label) main::@8 Culled Empty Block (label) ppuDataFill::@3 Culled Empty Block (label) ppuDataFill::@2 Culled Empty Block (label) ppuDataTransfer::@3 +Culled Empty Block (label) vblank::@5 +Culled Empty Block (label) vblank::@2 +Culled Empty Block (label) readJoy1::@3 Renumbering block ppuDataFill::@4 to ppuDataFill::@2 Renumbering block ppuDataTransfer::@4 to ppuDataTransfer::@3 +Renumbering block vblank::@3 to vblank::@2 +Renumbering block vblank::@4 to vblank::@3 +Renumbering block vblank::@6 to vblank::@4 +Renumbering block vblank::@7 to vblank::@5 +Renumbering block vblank::@8 to vblank::@6 +Renumbering block vblank::@9 to vblank::@7 +Renumbering block vblank::@10 to vblank::@8 +Renumbering block vblank::@11 to vblank::@9 +Renumbering block vblank::@12 to vblank::@10 +Renumbering block vblank::@13 to vblank::@11 +Renumbering block vblank::@14 to vblank::@12 +Renumbering block vblank::@15 to vblank::@13 +Renumbering block vblank::@16 to vblank::@14 +Renumbering block vblank::@17 to vblank::@15 Adding NOP phi() at start of @begin Adding NOP phi() at start of @2 Adding NOP phi() at start of @end @@ -1048,6 +1518,7 @@ Adding NOP phi() at start of main::@5 Adding NOP phi() at start of main::@6 Adding NOP phi() at start of main::@3 Adding NOP phi() at start of ppuDataTransfer +Adding NOP phi() at start of vblank::@14 FINAL CONTROL FLOW GRAPH @begin: scope:[] from @@ -1056,180 +1527,246 @@ FINAL CONTROL FLOW GRAPH @1: scope:[] from @begin [1] (volatile byte) y_sin_idx ← (byte) 0 [2] (volatile byte) x_sin_idx ← (byte) $49 + [3] (volatile byte) x_sin_idx_2 ← (byte) $52 to:@2 @2: scope:[] from @1 - [3] phi() - [4] call main + [4] phi() + [5] call main to:@end @end: scope:[] from @2 - [5] phi() + [6] phi() (void()) main() main: scope:[main] from @2 - [6] phi() + [7] phi() to:main::initNES1 main::initNES1: scope:[main] from main asm { cld ldx#$ff txs } to:main::initNES1_disableVideoOutput1 main::initNES1_disableVideoOutput1: scope:[main] from main::initNES1 - [8] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 - [9] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 + [9] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 + [10] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 to:main::initNES1_disableAudioOutput1 main::initNES1_disableAudioOutput1: scope:[main] from main::initNES1_disableVideoOutput1 - [10] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 - [11] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 + [11] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 + [12] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 to:main::initNES1_clearVBlankFlag1 main::initNES1_clearVBlankFlag1: scope:[main] from main::initNES1_disableAudioOutput1 asm { ldaPPU_PPUSTATUS } to:main::initNES1_waitForVBlank1 main::initNES1_waitForVBlank1: scope:[main] from main::initNES1_clearVBlankFlag1 - [13] phi() + [14] phi() to:main::initNES1_waitForVBlank1_@1 main::initNES1_waitForVBlank1_@1: scope:[main] from main::initNES1_waitForVBlank1 main::initNES1_waitForVBlank1_@1 - [14] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 - [15] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 + [15] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 + [16] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 to:main::initNES1_@1 main::initNES1_@1: scope:[main] from main::initNES1_@1 main::initNES1_waitForVBlank1_@1 - [16] (byte) main::initNES1_i#2 ← phi( main::initNES1_@1/(byte) main::initNES1_i#1 main::initNES1_waitForVBlank1_@1/(byte) 0 ) - [17] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 - [18] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 - [19] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 - [20] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 - [21] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 - [22] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 - [23] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 - [24] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 - [25] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 - [26] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 + [17] (byte) main::initNES1_i#2 ← phi( main::initNES1_@1/(byte) main::initNES1_i#1 main::initNES1_waitForVBlank1_@1/(byte) 0 ) + [18] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 + [19] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 + [20] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 + [21] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 + [22] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 + [23] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 + [24] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 + [25] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 + [26] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 + [27] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 to:main::initNES1_waitForVBlank2 main::initNES1_waitForVBlank2: scope:[main] from main::initNES1_@1 - [27] phi() + [28] phi() to:main::initNES1_waitForVBlank2_@1 main::initNES1_waitForVBlank2_@1: scope:[main] from main::initNES1_waitForVBlank2 main::initNES1_waitForVBlank2_@1 - [28] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 - [29] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 + [29] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 + [30] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 to:main::initNES1_@7 main::initNES1_@7: scope:[main] from main::initNES1_waitForVBlank2_@1 asm { ldaPPU_PPUSTATUS } to:main::@4 main::@4: scope:[main] from main::initNES1_@7 - [31] phi() - [32] call ppuDataTransfer + [32] phi() + [33] call ppuDataTransfer to:main::@5 main::@5: scope:[main] from main::@4 - [33] phi() - [34] call ppuDataFill + [34] phi() + [35] call ppuDataFill to:main::@6 main::@6: scope:[main] from main::@5 - [35] phi() - [36] call ppuDataFill + [36] phi() + [37] call ppuDataFill to:main::@1 main::@1: scope:[main] from main::@2 main::@6 - [37] (byte) main::s#2 ← phi( main::@2/(byte) main::s#1 main::@6/(byte) 0 ) - [38] if((byte) main::s#2<(byte) $40) goto main::@2 + [38] (byte) main::s#2 ← phi( main::@2/(byte) main::s#1 main::@6/(byte) 0 ) + [39] if((byte) main::s#2<(byte) $40) goto main::@2 to:main::enableVideoOutput1 main::enableVideoOutput1: scope:[main] from main::@1 - [39] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 - [40] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e + [40] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 + [41] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e to:main::@3 main::@3: scope:[main] from main::@3 main::enableVideoOutput1 - [41] phi() + [42] phi() to:main::@3 main::@2: scope:[main] from main::@1 - [42] (byte~) main::$7 ← (byte) main::s#2 << (byte) 2 - [43] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$7) ← (byte) 0 - [44] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$7) ← *((const byte*) MESSAGE + (byte) main::s#2) - [45] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$7) ← (byte) 2 - [46] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$7) ← (byte) 0 - [47] (byte) main::s#1 ← ++ (byte) main::s#2 + [43] (byte~) main::$7 ← (byte) main::s#2 << (byte) 2 + [44] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$7) ← (byte) 0 + [45] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$7) ← *((const byte*) MESSAGE + (byte) main::s#2) + [46] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$7) ← (byte) 2 + [47] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$7) ← (byte) 0 + [48] (byte) main::s#1 ← ++ (byte) main::s#2 to:main::@1 (void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size) ppuDataFill: scope:[ppuDataFill] from main::@5 main::@6 - [48] (byte) ppuDataFill::val#4 ← phi( main::@5/(byte) '*' main::@6/(byte) 0 ) - [48] (word) ppuDataFill::size#3 ← phi( main::@5/(word)(number) $20*(number) $1e main::@6/(byte) $40 ) - [48] (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ← phi( main::@5/(void*)(const nomodify byte*) PPU_NAME_TABLE_0 main::@6/(void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 ) + [49] (byte) ppuDataFill::val#4 ← phi( main::@5/(byte) '*' main::@6/(byte) 0 ) + [49] (word) ppuDataFill::size#3 ← phi( main::@5/(word)(number) $20*(number) $1e main::@6/(byte) $40 ) + [49] (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ← phi( main::@5/(void*)(const nomodify byte*) PPU_NAME_TABLE_0 main::@6/(void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 ) to:ppuDataFill::ppuDataPrepare1 ppuDataFill::ppuDataPrepare1: scope:[ppuDataFill] from ppuDataFill - [49] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 - [50] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 - [51] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 - [52] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$1 + [50] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 + [51] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 + [52] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 + [53] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$1 to:ppuDataFill::@1 ppuDataFill::@1: scope:[ppuDataFill] from ppuDataFill::@2 ppuDataFill::ppuDataPrepare1 - [53] (word) ppuDataFill::i#2 ← phi( ppuDataFill::ppuDataPrepare1/(word) 0 ppuDataFill::@2/(word) ppuDataFill::i#1 ) - [54] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 + [54] (word) ppuDataFill::i#2 ← phi( ppuDataFill::ppuDataPrepare1/(word) 0 ppuDataFill::@2/(word) ppuDataFill::i#1 ) + [55] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 to:ppuDataFill::@return ppuDataFill::@return: scope:[ppuDataFill] from ppuDataFill::@1 - [55] return + [56] return to:@return ppuDataFill::ppuDataPut1: scope:[ppuDataFill] from ppuDataFill::@1 - [56] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4 + [57] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4 to:ppuDataFill::@2 ppuDataFill::@2: scope:[ppuDataFill] from ppuDataFill::ppuDataPut1 - [57] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2 + [58] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2 to:ppuDataFill::@1 (void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size) ppuDataTransfer: scope:[ppuDataTransfer] from main::@4 - [58] phi() + [59] phi() to:ppuDataTransfer::ppuDataPrepare1 ppuDataTransfer::ppuDataPrepare1: scope:[ppuDataTransfer] from ppuDataTransfer - [59] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 - [60] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 + [60] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 + [61] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 to:ppuDataTransfer::@1 ppuDataTransfer::@1: scope:[ppuDataTransfer] from ppuDataTransfer::@3 ppuDataTransfer::ppuDataPrepare1 - [61] (byte*) ppuDataTransfer::cpuSrc#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 ppuDataTransfer::@3/(byte*) ppuDataTransfer::cpuSrc#1 ) - [61] (word) ppuDataTransfer::i#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(word) 0 ppuDataTransfer::@3/(word) ppuDataTransfer::i#1 ) - [62] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 + [62] (byte*) ppuDataTransfer::cpuSrc#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 ppuDataTransfer::@3/(byte*) ppuDataTransfer::cpuSrc#1 ) + [62] (word) ppuDataTransfer::i#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(word) 0 ppuDataTransfer::@3/(word) ppuDataTransfer::i#1 ) + [63] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 to:ppuDataTransfer::@return ppuDataTransfer::@return: scope:[ppuDataTransfer] from ppuDataTransfer::@1 - [63] return + [64] return to:@return ppuDataTransfer::@2: scope:[ppuDataTransfer] from ppuDataTransfer::@1 - [64] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) + [65] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) to:ppuDataTransfer::ppuDataPut1 ppuDataTransfer::ppuDataPut1: scope:[ppuDataTransfer] from ppuDataTransfer::@2 - [65] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 + [66] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 to:ppuDataTransfer::@3 ppuDataTransfer::@3: scope:[ppuDataTransfer] from ppuDataTransfer::ppuDataPut1 - [66] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 - [67] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2 + [67] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 + [68] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2 to:ppuDataTransfer::@1 interrupt(HARDWARE_STACK)(void()) vblank() vblank: scope:[vblank] from - [68] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [69] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 + [70] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 to:vblank::ppuSpriteBufferDmaTransfer1 vblank::ppuSpriteBufferDmaTransfer1: scope:[vblank] from vblank - [70] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 - [71] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER - to:vblank::@3 -vblank::@3: scope:[vblank] from vblank::ppuSpriteBufferDmaTransfer1 - [72] (byte) vblank::y_idx#0 ← (volatile byte) y_sin_idx - [73] (volatile byte) y_sin_idx ← ++ (volatile byte) y_sin_idx - [74] (byte) vblank::x_idx#0 ← (volatile byte) x_sin_idx - [75] (volatile byte) x_sin_idx ← ++ (volatile byte) x_sin_idx - to:vblank::@1 -vblank::@1: scope:[vblank] from vblank::@2 vblank::@3 - [76] (byte) vblank::x_idx#2 ← phi( vblank::@2/(byte) vblank::x_idx#1 vblank::@3/(byte) vblank::x_idx#0 ) - [76] (byte) vblank::y_idx#2 ← phi( vblank::@2/(byte) vblank::y_idx#1 vblank::@3/(byte) vblank::y_idx#0 ) - [76] (byte) vblank::s#2 ← phi( vblank::@2/(byte) vblank::s#1 vblank::@3/(byte) 0 ) - [77] if((byte) vblank::s#2<(byte) $40) goto vblank::@2 + [71] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 + [72] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER + to:vblank::@14 +vblank::@14: scope:[vblank] from vblank::ppuSpriteBufferDmaTransfer1 + [73] phi() + [74] call readJoy1 + [75] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2 + to:vblank::@15 +vblank::@15: scope:[vblank] from vblank::@14 + [76] (byte) vblank::joy#0 ← (byte) readJoy1::return#2 + [77] if((byte) 0==(byte) vblank::joy#0) goto vblank::@1 to:vblank::@return -vblank::@return: scope:[vblank] from vblank::@1 +vblank::@return: scope:[vblank] from vblank::@15 vblank::@6 [78] return to:@return +vblank::@1: scope:[vblank] from vblank::@15 + [79] (byte) vblank::y_idx#0 ← (volatile byte) y_sin_idx + [80] (volatile byte) y_sin_idx ← ++ (volatile byte) y_sin_idx + [81] if((volatile byte) x_sin_idx==(byte) $ee) goto vblank::@3 + to:vblank::@2 vblank::@2: scope:[vblank] from vblank::@1 - [79] (byte~) vblank::$4 ← (byte) vblank::s#2 << (byte) 2 - [80] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) vblank::$4) ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::y_idx#2) - [81] (byte~) vblank::$2 ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::x_idx#2) + (byte) 8 - [82] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) vblank::$4) ← (byte~) vblank::$2 - [83] (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 + (byte) 4 - [84] (byte) vblank::x_idx#1 ← (byte) vblank::x_idx#2 - (byte) 7 - [85] (byte) vblank::s#1 ← ++ (byte) vblank::s#2 - to:vblank::@1 + [82] (byte~) vblank::$5 ← (volatile byte) x_sin_idx + (byte) 1 + to:vblank::@3 +vblank::@3: scope:[vblank] from vblank::@1 vblank::@2 + [83] (byte~) vblank::$7 ← phi( vblank::@1/(byte) 0 vblank::@2/(byte~) vblank::$5 ) + [84] (volatile byte) x_sin_idx ← (byte~) vblank::$7 + [85] (byte) vblank::x_idx#0 ← (volatile byte) x_sin_idx + [86] if((volatile byte) x_sin_idx_2==(byte) $58) goto vblank::@5 + to:vblank::@4 +vblank::@4: scope:[vblank] from vblank::@3 + [87] (byte~) vblank::$10 ← (volatile byte) x_sin_idx_2 + (byte) 1 + to:vblank::@5 +vblank::@5: scope:[vblank] from vblank::@3 vblank::@4 + [88] (byte~) vblank::$12 ← phi( vblank::@3/(byte) 0 vblank::@4/(byte~) vblank::$10 ) + [89] (volatile byte) x_sin_idx_2 ← (byte~) vblank::$12 + [90] (byte) vblank::x_idx_2#0 ← (volatile byte) x_sin_idx_2 + to:vblank::@6 +vblank::@6: scope:[vblank] from vblank::@13 vblank::@5 + [91] (byte) vblank::x_idx_2#2 ← phi( vblank::@13/(byte) vblank::x_idx_2#1 vblank::@5/(byte) vblank::x_idx_2#0 ) + [91] (byte) vblank::x_idx#2 ← phi( vblank::@13/(byte) vblank::x_idx#1 vblank::@5/(byte) vblank::x_idx#0 ) + [91] (byte) vblank::y_idx#2 ← phi( vblank::@13/(byte) vblank::y_idx#1 vblank::@5/(byte) vblank::y_idx#0 ) + [91] (byte) vblank::s#2 ← phi( vblank::@13/(byte) vblank::s#1 vblank::@5/(byte) 0 ) + [92] if((byte) vblank::s#2<(byte) $40) goto vblank::@7 + to:vblank::@return +vblank::@7: scope:[vblank] from vblank::@6 + [93] (byte~) vblank::$28 ← (byte) vblank::s#2 << (byte) 2 + [94] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) vblank::$28) ← *((const to_nomodify byte*) SINTABLE_240 + (byte) vblank::y_idx#2) + [95] (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 - (byte) 4 + [96] (byte~) vblank::$14 ← *((const to_nomodify byte*) SINTABLE_184 + (byte) vblank::x_idx#2) + *((const to_nomodify byte*) SINTABLE_64 + (byte) vblank::x_idx_2#2) + [97] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) vblank::$28) ← (byte~) vblank::$14 + [98] if((byte) vblank::x_idx#2<(byte) 3) goto vblank::@8 + to:vblank::@9 +vblank::@9: scope:[vblank] from vblank::@7 + [99] (byte~) vblank::$17 ← (byte) vblank::x_idx#2 - (byte) 3 + to:vblank::@10 +vblank::@10: scope:[vblank] from vblank::@8 vblank::@9 + [100] (byte) vblank::x_idx#1 ← phi( vblank::@8/(byte~) vblank::$19 vblank::@9/(byte~) vblank::$17 ) + [101] if((byte) vblank::x_idx_2#2>=(byte) $56) goto vblank::@11 + to:vblank::@12 +vblank::@12: scope:[vblank] from vblank::@10 + [102] (byte~) vblank::$23 ← (byte) vblank::x_idx_2#2 + (byte) 3 + to:vblank::@13 +vblank::@13: scope:[vblank] from vblank::@11 vblank::@12 + [103] (byte) vblank::x_idx_2#1 ← phi( vblank::@11/(byte~) vblank::$25 vblank::@12/(byte~) vblank::$23 ) + [104] (byte) vblank::s#1 ← ++ (byte) vblank::s#2 + to:vblank::@6 +vblank::@11: scope:[vblank] from vblank::@10 + [105] (byte~) vblank::$25 ← (byte) vblank::x_idx_2#2 - (byte) $56 + to:vblank::@13 +vblank::@8: scope:[vblank] from vblank::@7 + [106] (byte~) vblank::$19 ← (byte) vblank::x_idx#2 + (byte) $ec + to:vblank::@10 + +(byte()) readJoy1() +readJoy1: scope:[readJoy1] from vblank::@14 + [107] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1 + [108] *((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 + [109] (byte) readJoy1::joy#2 ← phi( readJoy1/(byte) 0 readJoy1::@2/(byte) readJoy1::joy#1 ) + [109] (byte) readJoy1::i#2 ← phi( readJoy1/(byte) 0 readJoy1::@2/(byte) readJoy1::i#1 ) + [110] if((byte) readJoy1::i#2<(byte) 8) goto readJoy1::@2 + to:readJoy1::@return +readJoy1::@return: scope:[readJoy1] from readJoy1::@1 + [111] return + to:@return +readJoy1::@2: scope:[readJoy1] from readJoy1::@1 + [112] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 + [113] (byte~) readJoy1::$2 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1 + [114] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2 + [115] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2 + to:readJoy1::@1 VARIABLE REGISTER WEIGHTS @@ -1306,23 +1843,49 @@ VARIABLE REGISTER WEIGHTS (byte) ppuDataTransfer::ppuDataPut1_val (byte) ppuDataTransfer::ppuDataPut1_val#0 2002.0 (word) ppuDataTransfer::size +(byte()) readJoy1() +(byte~) readJoy1::$1 101.0 +(byte~) readJoy1::$2 202.0 +(byte) readJoy1::i +(byte) readJoy1::i#1 202.0 +(byte) readJoy1::i#2 60.599999999999994 +(byte) readJoy1::joy +(byte) readJoy1::joy#1 101.0 +(byte) readJoy1::joy#2 51.0 +(byte) readJoy1::return +(byte) readJoy1::return#2 4.0 interrupt(HARDWARE_STACK)(void()) vblank() -(byte~) vblank::$2 22.0 -(byte~) vblank::$4 11.0 +(byte~) vblank::$10 4.0 +(byte~) vblank::$12 4.0 +(byte~) vblank::$14 22.0 +(byte~) vblank::$17 22.0 +(byte~) vblank::$19 22.0 +(byte~) vblank::$23 22.0 +(byte~) vblank::$25 22.0 +(byte~) vblank::$28 8.25 +(byte~) vblank::$5 4.0 +(byte~) vblank::$7 4.0 +(byte) vblank::joy +(byte) vblank::joy#0 4.0 (struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer (byte) vblank::s (byte) vblank::s#1 22.0 -(byte) vblank::s#2 5.5 +(byte) vblank::s#2 2.933333333333333 (byte) vblank::x_idx -(byte) vblank::x_idx#0 2.0 -(byte) vblank::x_idx#1 11.0 -(byte) vblank::x_idx#2 5.0 +(byte) vblank::x_idx#0 0.6666666666666666 +(byte) vblank::x_idx#1 5.5 +(byte) vblank::x_idx#2 7.125 +(byte) vblank::x_idx_2 +(byte) vblank::x_idx_2#0 4.0 +(byte) vblank::x_idx_2#1 16.5 +(byte) vblank::x_idx_2#2 4.75 (byte) vblank::y_idx -(byte) vblank::y_idx#0 1.0 -(byte) vblank::y_idx#1 7.333333333333333 -(byte) vblank::y_idx#2 5.833333333333333 -(volatile byte) x_sin_idx loadstore 1.1428571428571428 -(volatile byte) y_sin_idx loadstore 1.6 +(byte) vblank::y_idx#0 0.3333333333333333 +(byte) vblank::y_idx#1 1.8333333333333333 +(byte) vblank::y_idx#2 8.75 +(volatile byte) x_sin_idx loadstore 0.7692307692307693 +(volatile byte) x_sin_idx_2 loadstore 0.5555555555555556 +(volatile byte) y_sin_idx loadstore 0.8 Initial phi equivalence classes [ main::initNES1_i#2 main::initNES1_i#1 ] @@ -1333,19 +1896,29 @@ Initial phi equivalence classes [ ppuDataFill::i#2 ppuDataFill::i#1 ] [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ] +[ vblank::$7 vblank::$5 ] +[ vblank::$12 vblank::$10 ] [ vblank::s#2 vblank::s#1 ] [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] -[ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 ] +[ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 vblank::$19 vblank::$17 ] +[ vblank::x_idx_2#2 vblank::x_idx_2#1 vblank::x_idx_2#0 vblank::$25 vblank::$23 ] +[ readJoy1::i#2 readJoy1::i#1 ] +[ readJoy1::joy#2 readJoy1::joy#1 ] Added variable y_sin_idx to live range equivalence class [ y_sin_idx ] Added variable x_sin_idx to live range equivalence class [ x_sin_idx ] +Added variable x_sin_idx_2 to live range equivalence class [ x_sin_idx_2 ] Added variable main::initNES1_waitForVBlank1_$0 to live range equivalence class [ main::initNES1_waitForVBlank1_$0 ] Added variable main::initNES1_waitForVBlank2_$0 to live range equivalence class [ main::initNES1_waitForVBlank2_$0 ] Added variable main::$7 to live range equivalence class [ main::$7 ] Added variable ppuDataFill::ppuDataPrepare1_$0 to live range equivalence class [ ppuDataFill::ppuDataPrepare1_$0 ] Added variable ppuDataFill::ppuDataPrepare1_$1 to live range equivalence class [ ppuDataFill::ppuDataPrepare1_$1 ] Added variable ppuDataTransfer::ppuDataPut1_val#0 to live range equivalence class [ ppuDataTransfer::ppuDataPut1_val#0 ] -Added variable vblank::$4 to live range equivalence class [ vblank::$4 ] -Added variable vblank::$2 to live range equivalence class [ vblank::$2 ] +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::$28 to live range equivalence class [ vblank::$28 ] +Added variable vblank::$14 to live range equivalence class [ vblank::$14 ] +Added variable readJoy1::$1 to live range equivalence class [ readJoy1::$1 ] +Added variable readJoy1::$2 to live range equivalence class [ readJoy1::$2 ] Complete equivalence classes [ main::initNES1_i#2 main::initNES1_i#1 ] [ main::s#2 main::s#1 ] @@ -1355,19 +1928,29 @@ Complete equivalence classes [ ppuDataFill::i#2 ppuDataFill::i#1 ] [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ] +[ vblank::$7 vblank::$5 ] +[ vblank::$12 vblank::$10 ] [ vblank::s#2 vblank::s#1 ] [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] -[ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 ] +[ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 vblank::$19 vblank::$17 ] +[ vblank::x_idx_2#2 vblank::x_idx_2#1 vblank::x_idx_2#0 vblank::$25 vblank::$23 ] +[ readJoy1::i#2 readJoy1::i#1 ] +[ readJoy1::joy#2 readJoy1::joy#1 ] [ y_sin_idx ] [ x_sin_idx ] +[ x_sin_idx_2 ] [ main::initNES1_waitForVBlank1_$0 ] [ main::initNES1_waitForVBlank2_$0 ] [ main::$7 ] [ ppuDataFill::ppuDataPrepare1_$0 ] [ ppuDataFill::ppuDataPrepare1_$1 ] [ ppuDataTransfer::ppuDataPut1_val#0 ] -[ vblank::$4 ] -[ vblank::$2 ] +[ readJoy1::return#2 ] +[ vblank::joy#0 ] +[ vblank::$28 ] +[ vblank::$14 ] +[ readJoy1::$1 ] +[ readJoy1::$2 ] Allocated zp[1]:2 [ main::initNES1_i#2 main::initNES1_i#1 ] Allocated zp[1]:3 [ main::s#2 main::s#1 ] Allocated zp[2]:4 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ] @@ -1376,22 +1959,32 @@ Allocated zp[1]:8 [ ppuDataFill::val#4 ] Allocated zp[2]:9 [ ppuDataFill::i#2 ppuDataFill::i#1 ] Allocated zp[2]:11 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] Allocated zp[2]:13 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ] -Allocated zp[1]:15 [ vblank::s#2 vblank::s#1 ] -Allocated zp[1]:16 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] -Allocated zp[1]:17 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 ] -Allocated zp[1]:18 [ y_sin_idx ] -Allocated zp[1]:19 [ x_sin_idx ] -Allocated zp[1]:20 [ main::initNES1_waitForVBlank1_$0 ] -Allocated zp[1]:21 [ main::initNES1_waitForVBlank2_$0 ] -Allocated zp[1]:22 [ main::$7 ] -Allocated zp[1]:23 [ ppuDataFill::ppuDataPrepare1_$0 ] -Allocated zp[1]:24 [ ppuDataFill::ppuDataPrepare1_$1 ] -Allocated zp[1]:25 [ ppuDataTransfer::ppuDataPut1_val#0 ] -Allocated zp[1]:26 [ vblank::$4 ] -Allocated zp[1]:27 [ vblank::$2 ] +Allocated zp[1]:15 [ vblank::$7 vblank::$5 ] +Allocated zp[1]:16 [ vblank::$12 vblank::$10 ] +Allocated zp[1]:17 [ vblank::s#2 vblank::s#1 ] +Allocated zp[1]:18 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] +Allocated zp[1]:19 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 vblank::$19 vblank::$17 ] +Allocated zp[1]:20 [ vblank::x_idx_2#2 vblank::x_idx_2#1 vblank::x_idx_2#0 vblank::$25 vblank::$23 ] +Allocated zp[1]:21 [ readJoy1::i#2 readJoy1::i#1 ] +Allocated zp[1]:22 [ readJoy1::joy#2 readJoy1::joy#1 ] +Allocated zp[1]:23 [ y_sin_idx ] +Allocated zp[1]:24 [ x_sin_idx ] +Allocated zp[1]:25 [ x_sin_idx_2 ] +Allocated zp[1]:26 [ main::initNES1_waitForVBlank1_$0 ] +Allocated zp[1]:27 [ main::initNES1_waitForVBlank2_$0 ] +Allocated zp[1]:28 [ main::$7 ] +Allocated zp[1]:29 [ ppuDataFill::ppuDataPrepare1_$0 ] +Allocated zp[1]:30 [ ppuDataFill::ppuDataPrepare1_$1 ] +Allocated zp[1]:31 [ ppuDataTransfer::ppuDataPut1_val#0 ] +Allocated zp[1]:32 [ readJoy1::return#2 ] +Allocated zp[1]:33 [ vblank::joy#0 ] +Allocated zp[1]:34 [ vblank::$28 ] +Allocated zp[1]:35 [ vblank::$14 ] +Allocated zp[1]:36 [ readJoy1::$1 ] +Allocated zp[1]:37 [ readJoy1::$2 ] INITIAL ASM -Target platform is nes / MOS6502 +Target platform is nes / MOS6502X // File Comments // NES DXYCP using sprites // Nintendo Entertainment System (NES @@ -1442,6 +2035,7 @@ Target platform is nes / MOS6502 .const OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = 2 .const OFFSET_STRUCT_RICOH_2C02_OAMADDR = 3 .const OFFSET_STRUCT_RICOH_2A03_OAMDMA = $14 + .const OFFSET_STRUCT_RICOH_2A03_JOY1 = $16 .const OFFSET_STRUCT_RICOH_2C02_PPUADDR = 6 .const OFFSET_STRUCT_RICOH_2C02_PPUDATA = 7 .const OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = 5 @@ -1473,8 +2067,9 @@ Target platform is nes / MOS6502 .label PPU = $2000 // NES CPU and audion processing unit (APU) .label APU = $4000 - .label y_sin_idx = $12 - .label x_sin_idx = $13 + .label y_sin_idx = $17 + .label x_sin_idx = $18 + .label x_sin_idx_2 = $19 // @begin __bbegin: jmp __b1 @@ -1488,16 +2083,20 @@ __b1: // Index into the X sine lda #$49 sta.z x_sin_idx - // [3] phi from @1 to @2 [phi:@1->@2] + // [3] (volatile byte) x_sin_idx_2 ← (byte) $52 -- vbuz1=vbuc1 + // Index into the small X sine + lda #$52 + sta.z x_sin_idx_2 + // [4] phi from @1 to @2 [phi:@1->@2] __b2_from___b1: jmp __b2 // @2 __b2: - // [4] call main - // [6] phi from @2 to main [phi:@2->main] + // [5] call main + // [7] phi from @2 to main [phi:@2->main] main_from___b2: jsr main - // [5] phi from @2 to @end [phi:@2->@end] + // [6] phi from @2 to @end [phi:@2->@end] __bend_from___b2: jmp __bend // @end @@ -1506,9 +2105,9 @@ __bend: // main // RESET Called when the NES is reset, including when it is turned on. main: { - .label __7 = $16 - .label initNES1_waitForVBlank1___0 = $14 - .label initNES1_waitForVBlank2___0 = $15 + .label __7 = $1c + .label initNES1_waitForVBlank1___0 = $1a + .label initNES1_waitForVBlank2___0 = $1b .label initNES1_i = 2 .label s = 3 jmp initNES1 @@ -1521,19 +2120,19 @@ main: { jmp initNES1_disableVideoOutput1 // main::initNES1_disableVideoOutput1 initNES1_disableVideoOutput1: - // [8] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [9] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta PPU - // [9] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [10] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK jmp initNES1_disableAudioOutput1 // main::initNES1_disableAudioOutput1 initNES1_disableAudioOutput1: - // [10] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 -- _deref_pbuc1=vbuc2 + // [11] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 -- _deref_pbuc1=vbuc2 lda #$40 sta FR_COUNTER - // [11] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 -- _deref_pbuc1=vbuc2 + // [12] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 -- _deref_pbuc1=vbuc2 lda #$40 sta APU+OFFSET_STRUCT_RICOH_2A03_DMC_FREQ jmp initNES1_clearVBlankFlag1 @@ -1541,7 +2140,7 @@ main: { initNES1_clearVBlankFlag1: // asm { ldaPPU_PPUSTATUS } lda PPU_PPUSTATUS - // [13] phi from main::initNES1_clearVBlankFlag1 to main::initNES1_waitForVBlank1 [phi:main::initNES1_clearVBlankFlag1->main::initNES1_waitForVBlank1] + // [14] phi from main::initNES1_clearVBlankFlag1 to main::initNES1_waitForVBlank1 [phi:main::initNES1_clearVBlankFlag1->main::initNES1_waitForVBlank1] initNES1_waitForVBlank1_from_initNES1_clearVBlankFlag1: jmp initNES1_waitForVBlank1 // main::initNES1_waitForVBlank1 @@ -1549,65 +2148,65 @@ main: { jmp initNES1_waitForVBlank1___b1 // main::initNES1_waitForVBlank1_@1 initNES1_waitForVBlank1___b1: - // [14] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuz1=_deref_pbuc1_band_vbuc2 + // [15] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuz1=_deref_pbuc1_band_vbuc2 lda #$80 and PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS sta.z initNES1_waitForVBlank1___0 - // [15] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 -- vbuc1_eq_vbuz1_then_la1 + // [16] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 -- vbuc1_eq_vbuz1_then_la1 lda #0 cmp.z initNES1_waitForVBlank1___0 beq initNES1_waitForVBlank1___b1 - // [16] phi from main::initNES1_waitForVBlank1_@1 to main::initNES1_@1 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1] + // [17] phi from main::initNES1_waitForVBlank1_@1 to main::initNES1_@1 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1] initNES1___b1_from_initNES1_waitForVBlank1___b1: - // [16] phi (byte) main::initNES1_i#2 = (byte) 0 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1#0] -- vbuz1=vbuc1 + // [17] phi (byte) main::initNES1_i#2 = (byte) 0 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1#0] -- vbuz1=vbuc1 lda #0 sta.z initNES1_i jmp initNES1___b1 - // [16] phi from main::initNES1_@1 to main::initNES1_@1 [phi:main::initNES1_@1->main::initNES1_@1] + // [17] phi from main::initNES1_@1 to main::initNES1_@1 [phi:main::initNES1_@1->main::initNES1_@1] initNES1___b1_from_initNES1___b1: - // [16] phi (byte) main::initNES1_i#2 = (byte) main::initNES1_i#1 [phi:main::initNES1_@1->main::initNES1_@1#0] -- register_copy + // [17] phi (byte) main::initNES1_i#2 = (byte) main::initNES1_i#1 [phi:main::initNES1_@1->main::initNES1_@1#0] -- register_copy jmp initNES1___b1 // main::initNES1_@1 initNES1___b1: - // [17] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 + // [18] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 lda #0 ldy.z initNES1_i sta MEMORY,y - // [18] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 + // [19] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 lda #0 ldy.z initNES1_i sta MEMORY+$100,y - // [19] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 + // [20] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 lda #0 ldy.z initNES1_i sta MEMORY+$200,y - // [20] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 + // [21] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 lda #0 ldy.z initNES1_i sta MEMORY+$300,y - // [21] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 + // [22] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 lda #0 ldy.z initNES1_i sta MEMORY+$400,y - // [22] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 + // [23] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 lda #0 ldy.z initNES1_i sta MEMORY+$500,y - // [23] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 + // [24] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 lda #0 ldy.z initNES1_i sta MEMORY+$600,y - // [24] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 + // [25] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 lda #0 ldy.z initNES1_i sta MEMORY+$700,y - // [25] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 -- vbuz1=_inc_vbuz1 + // [26] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 -- vbuz1=_inc_vbuz1 inc.z initNES1_i - // [26] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 -- vbuc1_neq_vbuz1_then_la1 + // [27] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 -- vbuc1_neq_vbuz1_then_la1 lda #0 cmp.z initNES1_i bne initNES1___b1_from_initNES1___b1 - // [27] phi from main::initNES1_@1 to main::initNES1_waitForVBlank2 [phi:main::initNES1_@1->main::initNES1_waitForVBlank2] + // [28] phi from main::initNES1_@1 to main::initNES1_waitForVBlank2 [phi:main::initNES1_@1->main::initNES1_waitForVBlank2] initNES1_waitForVBlank2_from_initNES1___b1: jmp initNES1_waitForVBlank2 // main::initNES1_waitForVBlank2 @@ -1615,11 +2214,11 @@ main: { jmp initNES1_waitForVBlank2___b1 // main::initNES1_waitForVBlank2_@1 initNES1_waitForVBlank2___b1: - // [28] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuz1=_deref_pbuc1_band_vbuc2 + // [29] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuz1=_deref_pbuc1_band_vbuc2 lda #$80 and PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS sta.z initNES1_waitForVBlank2___0 - // [29] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 -- vbuc1_eq_vbuz1_then_la1 + // [30] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 -- vbuc1_eq_vbuz1_then_la1 lda #0 cmp.z initNES1_waitForVBlank2___0 beq initNES1_waitForVBlank2___b1 @@ -1628,84 +2227,84 @@ main: { initNES1___b7: // asm { ldaPPU_PPUSTATUS } lda PPU_PPUSTATUS - // [31] phi from main::initNES1_@7 to main::@4 [phi:main::initNES1_@7->main::@4] + // [32] phi from main::initNES1_@7 to main::@4 [phi:main::initNES1_@7->main::@4] __b4_from_initNES1___b7: jmp __b4 // main::@4 __b4: - // [32] call ppuDataTransfer + // [33] call ppuDataTransfer // Transfer the palette - // [58] phi from main::@4 to ppuDataTransfer [phi:main::@4->ppuDataTransfer] + // [59] phi from main::@4 to ppuDataTransfer [phi:main::@4->ppuDataTransfer] ppuDataTransfer_from___b4: jsr ppuDataTransfer - // [33] phi from main::@4 to main::@5 [phi:main::@4->main::@5] + // [34] phi from main::@4 to main::@5 [phi:main::@4->main::@5] __b5_from___b4: jmp __b5 // main::@5 __b5: - // [34] call ppuDataFill + // [35] call ppuDataFill // Fill the PPU attribute table - // [48] phi from main::@5 to ppuDataFill [phi:main::@5->ppuDataFill] + // [49] phi from main::@5 to ppuDataFill [phi:main::@5->ppuDataFill] ppuDataFill_from___b5: - // [48] phi (byte) ppuDataFill::val#4 = (byte) '*' [phi:main::@5->ppuDataFill#0] -- vbuz1=vbuc1 + // [49] phi (byte) ppuDataFill::val#4 = (byte) '*' [phi:main::@5->ppuDataFill#0] -- vbuz1=vbuc1 lda #'*' sta.z ppuDataFill.val - // [48] phi (word) ppuDataFill::size#3 = (word)(number) $20*(number) $1e [phi:main::@5->ppuDataFill#1] -- vwuz1=vwuc1 + // [49] phi (word) ppuDataFill::size#3 = (word)(number) $20*(number) $1e [phi:main::@5->ppuDataFill#1] -- vwuz1=vwuc1 lda #<$20*$1e sta.z ppuDataFill.size lda #>$20*$1e sta.z ppuDataFill.size+1 - // [48] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0 [phi:main::@5->ppuDataFill#2] -- pvoz1=pvoc1 + // [49] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0 [phi:main::@5->ppuDataFill#2] -- pvoz1=pvoc1 lda #PPU_NAME_TABLE_0 sta.z ppuDataFill.ppuDataPrepare1_ppuData+1 jsr ppuDataFill - // [35] phi from main::@5 to main::@6 [phi:main::@5->main::@6] + // [36] phi from main::@5 to main::@6 [phi:main::@5->main::@6] __b6_from___b5: jmp __b6 // main::@6 __b6: - // [36] call ppuDataFill - // [48] phi from main::@6 to ppuDataFill [phi:main::@6->ppuDataFill] + // [37] call ppuDataFill + // [49] phi from main::@6 to ppuDataFill [phi:main::@6->ppuDataFill] ppuDataFill_from___b6: - // [48] phi (byte) ppuDataFill::val#4 = (byte) 0 [phi:main::@6->ppuDataFill#0] -- vbuz1=vbuc1 + // [49] phi (byte) ppuDataFill::val#4 = (byte) 0 [phi:main::@6->ppuDataFill#0] -- vbuz1=vbuc1 lda #0 sta.z ppuDataFill.val - // [48] phi (word) ppuDataFill::size#3 = (byte) $40 [phi:main::@6->ppuDataFill#1] -- vwuz1=vbuc1 + // [49] phi (word) ppuDataFill::size#3 = (byte) $40 [phi:main::@6->ppuDataFill#1] -- vwuz1=vbuc1 lda #<$40 sta.z ppuDataFill.size lda #>$40 sta.z ppuDataFill.size+1 - // [48] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 [phi:main::@6->ppuDataFill#2] -- pvoz1=pvoc1 + // [49] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 [phi:main::@6->ppuDataFill#2] -- pvoz1=pvoc1 lda #PPU_ATTRIBUTE_TABLE_0 sta.z ppuDataFill.ppuDataPrepare1_ppuData+1 jsr ppuDataFill - // [37] phi from main::@6 to main::@1 [phi:main::@6->main::@1] + // [38] phi from main::@6 to main::@1 [phi:main::@6->main::@1] __b1_from___b6: - // [37] phi (byte) main::s#2 = (byte) 0 [phi:main::@6->main::@1#0] -- vbuz1=vbuc1 + // [38] phi (byte) main::s#2 = (byte) 0 [phi:main::@6->main::@1#0] -- vbuz1=vbuc1 lda #0 sta.z s jmp __b1 // Initialize Sprite Buffer with the SPRITE data // main::@1 __b1: - // [38] if((byte) main::s#2<(byte) $40) goto main::@2 -- vbuz1_lt_vbuc1_then_la1 + // [39] if((byte) main::s#2<(byte) $40) goto main::@2 -- vbuz1_lt_vbuc1_then_la1 lda.z s cmp #$40 bcc __b2 jmp enableVideoOutput1 // main::enableVideoOutput1 enableVideoOutput1: - // [39] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 -- _deref_pbuc1=vbuc2 + // [40] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 -- _deref_pbuc1=vbuc2 lda #$80 sta PPU - // [40] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e -- _deref_pbuc1=vbuc2 + // [41] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e -- _deref_pbuc1=vbuc2 lda #$1e sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK - // [41] phi from main::@3 main::enableVideoOutput1 to main::@3 [phi:main::@3/main::enableVideoOutput1->main::@3] + // [42] phi from main::@3 main::enableVideoOutput1 to main::@3 [phi:main::@3/main::enableVideoOutput1->main::@3] __b3_from___b3: __b3_from_enableVideoOutput1: jmp __b3 @@ -1715,33 +2314,33 @@ main: { jmp __b3_from___b3 // main::@2 __b2: - // [42] (byte~) main::$7 ← (byte) main::s#2 << (byte) 2 -- vbuz1=vbuz2_rol_2 + // [43] (byte~) main::$7 ← (byte) main::s#2 << (byte) 2 -- vbuz1=vbuz2_rol_2 lda.z s asl asl sta.z __7 - // [43] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$7) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 + // [44] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$7) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 lda #0 ldy.z __7 sta SPRITE_BUFFER,y - // [44] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$7) ← *((const byte*) MESSAGE + (byte) main::s#2) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2 + // [45] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$7) ← *((const byte*) MESSAGE + (byte) main::s#2) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2 ldy.z s lda MESSAGE,y ldy.z __7 sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_TILE,y - // [45] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$7) ← (byte) 2 -- pbuc1_derefidx_vbuz1=vbuc2 + // [46] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$7) ← (byte) 2 -- pbuc1_derefidx_vbuz1=vbuc2 lda #2 ldy.z __7 sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES,y - // [46] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$7) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 + // [47] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$7) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 lda #0 ldy.z __7 sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X,y - // [47] (byte) main::s#1 ← ++ (byte) main::s#2 -- vbuz1=_inc_vbuz1 + // [48] (byte) main::s#1 ← ++ (byte) main::s#2 -- vbuz1=_inc_vbuz1 inc.z s - // [37] phi from main::@2 to main::@1 [phi:main::@2->main::@1] + // [38] phi from main::@2 to main::@1 [phi:main::@2->main::@1] __b1_from___b2: - // [37] phi (byte) main::s#2 = (byte) main::s#1 [phi:main::@2->main::@1#0] -- register_copy + // [38] phi (byte) main::s#2 = (byte) main::s#1 [phi:main::@2->main::@1#0] -- register_copy jmp __b1 } // ppuDataFill @@ -1750,8 +2349,8 @@ main: { // - size : The number of bytes to transfer // ppuDataFill(byte zp(8) val, word zp(6) size) ppuDataFill: { - .label ppuDataPrepare1___0 = $17 - .label ppuDataPrepare1___1 = $18 + .label ppuDataPrepare1___0 = $1d + .label ppuDataPrepare1___1 = $1e .label ppuDataPrepare1_ppuData = 4 .label i = 9 .label size = 6 @@ -1759,21 +2358,21 @@ ppuDataFill: { jmp ppuDataPrepare1 // ppuDataFill::ppuDataPrepare1 ppuDataPrepare1: - // [49] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuz1=_hi_pvoz2 + // [50] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuz1=_hi_pvoz2 lda.z ppuDataPrepare1_ppuData+1 sta.z ppuDataPrepare1___0 - // [50] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 -- _deref_pbuc1=vbuz1 + // [51] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 -- _deref_pbuc1=vbuz1 lda.z ppuDataPrepare1___0 sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR - // [51] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuz1=_lo_pvoz2 + // [52] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuz1=_lo_pvoz2 lda.z ppuDataPrepare1_ppuData sta.z ppuDataPrepare1___1 - // [52] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$1 -- _deref_pbuc1=vbuz1 + // [53] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$1 -- _deref_pbuc1=vbuz1 lda.z ppuDataPrepare1___1 sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR - // [53] phi from ppuDataFill::ppuDataPrepare1 to ppuDataFill::@1 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1] + // [54] phi from ppuDataFill::ppuDataPrepare1 to ppuDataFill::@1 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1] __b1_from_ppuDataPrepare1: - // [53] phi (word) ppuDataFill::i#2 = (word) 0 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1#0] -- vwuz1=vwuc1 + // [54] phi (word) ppuDataFill::i#2 = (word) 0 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1#0] -- vwuz1=vwuc1 lda #<0 sta.z i lda #>0 @@ -1782,7 +2381,7 @@ ppuDataFill: { // Transfer to PPU // ppuDataFill::@1 __b1: - // [54] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 -- vwuz1_lt_vwuz2_then_la1 + // [55] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 -- vwuz1_lt_vwuz2_then_la1 lda.z i+1 cmp.z size+1 bcc ppuDataPut1 @@ -1794,24 +2393,24 @@ ppuDataFill: { jmp __breturn // ppuDataFill::@return __breturn: - // [55] return + // [56] return rts // ppuDataFill::ppuDataPut1 ppuDataPut1: - // [56] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4 -- _deref_pbuc1=vbuz1 + // [57] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4 -- _deref_pbuc1=vbuz1 lda.z val sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA jmp __b2 // ppuDataFill::@2 __b2: - // [57] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2 -- vwuz1=_inc_vwuz1 + // [58] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2 -- vwuz1=_inc_vwuz1 inc.z i bne !+ inc.z i+1 !: - // [53] phi from ppuDataFill::@2 to ppuDataFill::@1 [phi:ppuDataFill::@2->ppuDataFill::@1] + // [54] phi from ppuDataFill::@2 to ppuDataFill::@1 [phi:ppuDataFill::@2->ppuDataFill::@1] __b1_from___b2: - // [53] phi (word) ppuDataFill::i#2 = (word) ppuDataFill::i#1 [phi:ppuDataFill::@2->ppuDataFill::@1#0] -- register_copy + // [54] phi (word) ppuDataFill::i#2 = (word) ppuDataFill::i#1 [phi:ppuDataFill::@2->ppuDataFill::@1#0] -- register_copy jmp __b1 } // ppuDataTransfer @@ -1823,27 +2422,27 @@ ppuDataTransfer: { .const size = $20*SIZEOF_BYTE .label ppuData = PPU_PALETTE .label cpuData = PALETTE - .label ppuDataPut1_val = $19 + .label ppuDataPut1_val = $1f // Transfer to PPU .label cpuSrc = $d .label i = $b jmp ppuDataPrepare1 // ppuDataTransfer::ppuDataPrepare1 ppuDataPrepare1: - // [59] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 -- _deref_pbuc1=vbuc2 + // [60] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 -- _deref_pbuc1=vbuc2 lda #>ppuData sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR - // [60] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [61] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR - // [61] phi from ppuDataTransfer::ppuDataPrepare1 to ppuDataTransfer::@1 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1] + // [62] phi from ppuDataTransfer::ppuDataPrepare1 to ppuDataTransfer::@1 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1] __b1_from_ppuDataPrepare1: - // [61] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#0] -- pbuz1=pbuc1 + // [62] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#0] -- pbuz1=pbuc1 lda #cpuData sta.z cpuSrc+1 - // [61] phi (word) ppuDataTransfer::i#2 = (word) 0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#1] -- vwuz1=vwuc1 + // [62] phi (word) ppuDataTransfer::i#2 = (word) 0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#1] -- vwuz1=vwuc1 lda #<0 sta.z i lda #>0 @@ -1851,7 +2450,7 @@ ppuDataTransfer: { jmp __b1 // ppuDataTransfer::@1 __b1: - // [62] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 -- vwuz1_lt_vwuc1_then_la1 + // [63] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 -- vwuz1_lt_vwuc1_then_la1 lda.z i+1 cmp #>size bcc __b2 @@ -1863,97 +2462,99 @@ ppuDataTransfer: { jmp __breturn // ppuDataTransfer::@return __breturn: - // [63] return + // [64] return rts // ppuDataTransfer::@2 __b2: - // [64] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) -- vbuz1=_deref_pbuz2 + // [65] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) -- vbuz1=_deref_pbuz2 ldy #0 lda (cpuSrc),y sta.z ppuDataPut1_val jmp ppuDataPut1 // ppuDataTransfer::ppuDataPut1 ppuDataPut1: - // [65] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 -- _deref_pbuc1=vbuz1 + // [66] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 -- _deref_pbuc1=vbuz1 lda.z ppuDataPut1_val sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA jmp __b3 // ppuDataTransfer::@3 __b3: - // [66] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 -- pbuz1=_inc_pbuz1 + // [67] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 -- pbuz1=_inc_pbuz1 inc.z cpuSrc bne !+ inc.z cpuSrc+1 !: - // [67] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2 -- vwuz1=_inc_vwuz1 + // [68] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2 -- vwuz1=_inc_vwuz1 inc.z i bne !+ inc.z i+1 !: - // [61] phi from ppuDataTransfer::@3 to ppuDataTransfer::@1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1] + // [62] phi from ppuDataTransfer::@3 to ppuDataTransfer::@1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1] __b1_from___b3: - // [61] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*) ppuDataTransfer::cpuSrc#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#0] -- register_copy - // [61] phi (word) ppuDataTransfer::i#2 = (word) ppuDataTransfer::i#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#1] -- register_copy + // [62] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*) ppuDataTransfer::cpuSrc#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#0] -- register_copy + // [62] phi (word) ppuDataTransfer::i#2 = (word) ppuDataTransfer::i#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#1] -- register_copy jmp __b1 } // vblank // NMI Called when the PPU refreshes the screen (also known as the V-Blank period) vblank: { - .label __2 = $1b - .label __4 = $1a - .label y_idx = $10 - .label x_idx = $11 - .label s = $f + .label __5 = $f + .label __7 = $f + .label __10 = $10 + .label __12 = $10 + .label __14 = $23 + .label __17 = $13 + .label __19 = $13 + .label __23 = $14 + .label __25 = $14 + .label __28 = $22 + .label joy = $21 + .label y_idx = $12 + .label x_idx = $13 + .label x_idx_2 = $14 + .label s = $11 // entry interrupt(HARDWARE_STACK) pha txa pha tya pha - // [68] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [69] *((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 - // [69] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [70] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL jmp ppuSpriteBufferDmaTransfer1 // vblank::ppuSpriteBufferDmaTransfer1 ppuSpriteBufferDmaTransfer1: - // [70] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [71] *((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 - // [71] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER -- _deref_pbuc1=vbuc2 + // [72] *((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 __b3 - // vblank::@3 - __b3: - // [72] (byte) vblank::y_idx#0 ← (volatile byte) y_sin_idx -- vbuz1=vbuz2 - // Update sprite positions - lda.z y_sin_idx - sta.z y_idx - // [73] (volatile byte) y_sin_idx ← ++ (volatile byte) y_sin_idx -- vbuz1=_inc_vbuz1 - inc.z y_sin_idx - // [74] (byte) vblank::x_idx#0 ← (volatile byte) x_sin_idx -- vbuz1=vbuz2 - lda.z x_sin_idx - sta.z x_idx - // [75] (volatile byte) x_sin_idx ← ++ (volatile byte) x_sin_idx -- vbuz1=_inc_vbuz1 - inc.z x_sin_idx - // [76] phi from vblank::@3 to vblank::@1 [phi:vblank::@3->vblank::@1] - __b1_from___b3: - // [76] phi (byte) vblank::x_idx#2 = (byte) vblank::x_idx#0 [phi:vblank::@3->vblank::@1#0] -- register_copy - // [76] phi (byte) vblank::y_idx#2 = (byte) vblank::y_idx#0 [phi:vblank::@3->vblank::@1#1] -- register_copy - // [76] phi (byte) vblank::s#2 = (byte) 0 [phi:vblank::@3->vblank::@1#2] -- vbuz1=vbuc1 + // [73] phi from vblank::ppuSpriteBufferDmaTransfer1 to vblank::@14 [phi:vblank::ppuSpriteBufferDmaTransfer1->vblank::@14] + __b14_from_ppuSpriteBufferDmaTransfer1: + jmp __b14 + // vblank::@14 + __b14: + // [74] call readJoy1 + jsr readJoy1 + // [75] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2 -- vbuz1=vbuz2 + lda.z readJoy1.joy + sta.z readJoy1.return + jmp __b15 + // vblank::@15 + __b15: + // [76] (byte) vblank::joy#0 ← (byte) readJoy1::return#2 -- vbuz1=vbuz2 + lda.z readJoy1.return + sta.z joy + // [77] if((byte) 0==(byte) vblank::joy#0) goto vblank::@1 -- vbuc1_eq_vbuz1_then_la1 lda #0 - sta.z s - jmp __b1 - // vblank::@1 - __b1: - // [77] if((byte) vblank::s#2<(byte) $40) goto vblank::@2 -- vbuz1_lt_vbuc1_then_la1 - lda.z s - cmp #$40 - bcc __b2 + cmp.z joy + beq __b1 jmp __breturn // vblank::@return __breturn: @@ -1964,45 +2565,239 @@ vblank: { tax pla rti + // vblank::@1 + __b1: + // [79] (byte) vblank::y_idx#0 ← (volatile byte) y_sin_idx -- vbuz1=vbuz2 + // Update sprite positions + lda.z y_sin_idx + sta.z y_idx + // [80] (volatile byte) y_sin_idx ← ++ (volatile byte) y_sin_idx -- vbuz1=_inc_vbuz1 + inc.z y_sin_idx + // [81] if((volatile byte) x_sin_idx==(byte) $ee) goto vblank::@3 -- vbuz1_eq_vbuc1_then_la1 + lda #$ee + cmp.z x_sin_idx + beq __b3_from___b1 + jmp __b2 // vblank::@2 __b2: - // [79] (byte~) vblank::$4 ← (byte) vblank::s#2 << (byte) 2 -- vbuz1=vbuz2_rol_2 + // [82] (byte~) vblank::$5 ← (volatile byte) x_sin_idx + (byte) 1 -- vbuz1=vbuz2_plus_1 + ldy.z x_sin_idx + iny + sty.z __5 + // [83] phi from vblank::@2 to vblank::@3 [phi:vblank::@2->vblank::@3] + __b3_from___b2: + // [83] phi (byte~) vblank::$7 = (byte~) vblank::$5 [phi:vblank::@2->vblank::@3#0] -- register_copy + jmp __b3 + // [83] phi from vblank::@1 to vblank::@3 [phi:vblank::@1->vblank::@3] + __b3_from___b1: + // [83] phi (byte~) vblank::$7 = (byte) 0 [phi:vblank::@1->vblank::@3#0] -- vbuz1=vbuc1 + lda #0 + sta.z __7 + jmp __b3 + // vblank::@3 + __b3: + // [84] (volatile byte) x_sin_idx ← (byte~) vblank::$7 -- vbuz1=vbuz2 + lda.z __7 + sta.z x_sin_idx + // [85] (byte) vblank::x_idx#0 ← (volatile byte) x_sin_idx -- vbuz1=vbuz2 + lda.z x_sin_idx + sta.z x_idx + // [86] if((volatile byte) x_sin_idx_2==(byte) $58) goto vblank::@5 -- vbuz1_eq_vbuc1_then_la1 + lda #$58 + cmp.z x_sin_idx_2 + beq __b5_from___b3 + jmp __b4 + // vblank::@4 + __b4: + // [87] (byte~) vblank::$10 ← (volatile byte) x_sin_idx_2 + (byte) 1 -- vbuz1=vbuz2_plus_1 + ldy.z x_sin_idx_2 + iny + sty.z __10 + // [88] phi from vblank::@4 to vblank::@5 [phi:vblank::@4->vblank::@5] + __b5_from___b4: + // [88] phi (byte~) vblank::$12 = (byte~) vblank::$10 [phi:vblank::@4->vblank::@5#0] -- register_copy + jmp __b5 + // [88] phi from vblank::@3 to vblank::@5 [phi:vblank::@3->vblank::@5] + __b5_from___b3: + // [88] phi (byte~) vblank::$12 = (byte) 0 [phi:vblank::@3->vblank::@5#0] -- vbuz1=vbuc1 + lda #0 + sta.z __12 + jmp __b5 + // vblank::@5 + __b5: + // [89] (volatile byte) x_sin_idx_2 ← (byte~) vblank::$12 -- vbuz1=vbuz2 + lda.z __12 + sta.z x_sin_idx_2 + // [90] (byte) vblank::x_idx_2#0 ← (volatile byte) x_sin_idx_2 -- vbuz1=vbuz2 + lda.z x_sin_idx_2 + sta.z x_idx_2 + // [91] phi from vblank::@5 to vblank::@6 [phi:vblank::@5->vblank::@6] + __b6_from___b5: + // [91] phi (byte) vblank::x_idx_2#2 = (byte) vblank::x_idx_2#0 [phi:vblank::@5->vblank::@6#0] -- register_copy + // [91] phi (byte) vblank::x_idx#2 = (byte) vblank::x_idx#0 [phi:vblank::@5->vblank::@6#1] -- register_copy + // [91] phi (byte) vblank::y_idx#2 = (byte) vblank::y_idx#0 [phi:vblank::@5->vblank::@6#2] -- register_copy + // [91] phi (byte) vblank::s#2 = (byte) 0 [phi:vblank::@5->vblank::@6#3] -- vbuz1=vbuc1 + lda #0 + sta.z s + jmp __b6 + // vblank::@6 + __b6: + // [92] if((byte) vblank::s#2<(byte) $40) goto vblank::@7 -- vbuz1_lt_vbuc1_then_la1 + lda.z s + cmp #$40 + bcc __b7 + jmp __breturn + // vblank::@7 + __b7: + // [93] (byte~) vblank::$28 ← (byte) vblank::s#2 << (byte) 2 -- vbuz1=vbuz2_rol_2 lda.z s asl asl - sta.z __4 - // [80] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) vblank::$4) ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::y_idx#2) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2 + sta.z __28 + // [94] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) vblank::$28) ← *((const to_nomodify byte*) SINTABLE_240 + (byte) vblank::y_idx#2) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2 ldy.z y_idx - lda SINTABLE,y - ldy.z __4 + lda SINTABLE_240,y + ldy.z __28 sta SPRITE_BUFFER,y - // [81] (byte~) vblank::$2 ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::x_idx#2) + (byte) 8 -- vbuz1=pbuc1_derefidx_vbuz2_plus_vbuc2 - lda #8 + // [95] (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 - (byte) 4 -- vbuz1=vbuz1_minus_vbuc1 + lax.z y_idx + axs #4 + stx.z y_idx + // [96] (byte~) vblank::$14 ← *((const to_nomodify byte*) SINTABLE_184 + (byte) vblank::x_idx#2) + *((const to_nomodify byte*) SINTABLE_64 + (byte) vblank::x_idx_2#2) -- vbuz1=pbuc1_derefidx_vbuz2_plus_pbuc2_derefidx_vbuz3 ldy.z x_idx + lda SINTABLE_184,y + ldy.z x_idx_2 clc - adc SINTABLE,y - sta.z __2 - // [82] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) vblank::$4) ← (byte~) vblank::$2 -- pbuc1_derefidx_vbuz1=vbuz2 - lda.z __2 - ldy.z __4 + adc SINTABLE_64,y + sta.z __14 + // [97] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) vblank::$28) ← (byte~) vblank::$14 -- pbuc1_derefidx_vbuz1=vbuz2 + lda.z __14 + ldy.z __28 sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X,y - // [83] (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 + (byte) 4 -- vbuz1=vbuz1_plus_vbuc1 - lda #4 - clc - adc.z y_idx - sta.z y_idx - // [84] (byte) vblank::x_idx#1 ← (byte) vblank::x_idx#2 - (byte) 7 -- vbuz1=vbuz1_minus_vbuc1 + // [98] if((byte) vblank::x_idx#2<(byte) 3) goto vblank::@8 -- vbuz1_lt_vbuc1_then_la1 lda.z x_idx - sec - sbc #7 - sta.z x_idx - // [85] (byte) vblank::s#1 ← ++ (byte) vblank::s#2 -- vbuz1=_inc_vbuz1 + cmp #3 + bcc __b8 + jmp __b9 + // vblank::@9 + __b9: + // [99] (byte~) vblank::$17 ← (byte) vblank::x_idx#2 - (byte) 3 -- vbuz1=vbuz1_minus_vbuc1 + lax.z __17 + axs #3 + stx.z __17 + // [100] phi from vblank::@8 vblank::@9 to vblank::@10 [phi:vblank::@8/vblank::@9->vblank::@10] + __b10_from___b8: + __b10_from___b9: + // [100] phi (byte) vblank::x_idx#1 = (byte~) vblank::$19 [phi:vblank::@8/vblank::@9->vblank::@10#0] -- register_copy + jmp __b10 + // vblank::@10 + __b10: + // [101] if((byte) vblank::x_idx_2#2>=(byte) $56) goto vblank::@11 -- vbuz1_ge_vbuc1_then_la1 + lda.z x_idx_2 + cmp #$56 + bcs __b11 + jmp __b12 + // vblank::@12 + __b12: + // [102] (byte~) vblank::$23 ← (byte) vblank::x_idx_2#2 + (byte) 3 -- vbuz1=vbuz1_plus_vbuc1 + lax.z __23 + axs #-[3] + stx.z __23 + // [103] phi from vblank::@11 vblank::@12 to vblank::@13 [phi:vblank::@11/vblank::@12->vblank::@13] + __b13_from___b11: + __b13_from___b12: + // [103] phi (byte) vblank::x_idx_2#1 = (byte~) vblank::$25 [phi:vblank::@11/vblank::@12->vblank::@13#0] -- register_copy + jmp __b13 + // vblank::@13 + __b13: + // [104] (byte) vblank::s#1 ← ++ (byte) vblank::s#2 -- vbuz1=_inc_vbuz1 inc.z s - // [76] phi from vblank::@2 to vblank::@1 [phi:vblank::@2->vblank::@1] + // [91] phi from vblank::@13 to vblank::@6 [phi:vblank::@13->vblank::@6] + __b6_from___b13: + // [91] phi (byte) vblank::x_idx_2#2 = (byte) vblank::x_idx_2#1 [phi:vblank::@13->vblank::@6#0] -- register_copy + // [91] phi (byte) vblank::x_idx#2 = (byte) vblank::x_idx#1 [phi:vblank::@13->vblank::@6#1] -- register_copy + // [91] phi (byte) vblank::y_idx#2 = (byte) vblank::y_idx#1 [phi:vblank::@13->vblank::@6#2] -- register_copy + // [91] phi (byte) vblank::s#2 = (byte) vblank::s#1 [phi:vblank::@13->vblank::@6#3] -- register_copy + jmp __b6 + // vblank::@11 + __b11: + // [105] (byte~) vblank::$25 ← (byte) vblank::x_idx_2#2 - (byte) $56 -- vbuz1=vbuz1_minus_vbuc1 + lax.z __25 + axs #$56 + stx.z __25 + jmp __b13_from___b11 + // vblank::@8 + __b8: + // [106] (byte~) vblank::$19 ← (byte) vblank::x_idx#2 + (byte) $ec -- vbuz1=vbuz1_plus_vbuc1 + lax.z __19 + axs #-[$ec] + stx.z __19 + jmp __b10_from___b8 +} + // readJoy1 +// Read Standard Controller #1 +// Returns a byte representing the pushed buttons +// - bit 0: right +// - bit 1: left +// - bit 2: down +// - bit 3: up +// - bit 4: start +// - bit 5: select +// - bit 6: B +// - bit 7: A +readJoy1: { + .label __1 = $24 + .label __2 = $25 + .label joy = $16 + .label i = $15 + .label return = $20 + // [107] *((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 + // [108] *((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 + // [109] phi from readJoy1 to readJoy1::@1 [phi:readJoy1->readJoy1::@1] + __b1_from_readJoy1: + // [109] phi (byte) readJoy1::joy#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#0] -- vbuz1=vbuc1 + lda #0 + sta.z joy + // [109] phi (byte) readJoy1::i#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#1] -- vbuz1=vbuc1 + lda #0 + sta.z i + jmp __b1 + // readJoy1::@1 + __b1: + // [110] 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: + // [111] return + rts + // readJoy1::@2 + __b2: + // [112] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 -- vbuz1=vbuz2_rol_1 + lda.z joy + asl + sta.z __1 + // [113] (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 + // [114] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2 -- vbuz1=vbuz2_bor_vbuz3 + lda.z __1 + ora.z __2 + sta.z joy + // [115] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2 -- vbuz1=_inc_vbuz1 + inc.z i + // [109] phi from readJoy1::@2 to readJoy1::@1 [phi:readJoy1::@2->readJoy1::@1] __b1_from___b2: - // [76] phi (byte) vblank::x_idx#2 = (byte) vblank::x_idx#1 [phi:vblank::@2->vblank::@1#0] -- register_copy - // [76] phi (byte) vblank::y_idx#2 = (byte) vblank::y_idx#1 [phi:vblank::@2->vblank::@1#1] -- register_copy - // [76] phi (byte) vblank::s#2 = (byte) vblank::s#1 [phi:vblank::@2->vblank::@1#2] -- register_copy + // [109] phi (byte) readJoy1::joy#2 = (byte) readJoy1::joy#1 [phi:readJoy1::@2->readJoy1::@1#0] -- register_copy + // [109] phi (byte) readJoy1::i#2 = (byte) readJoy1::i#1 [phi:readJoy1::@2->readJoy1::@1#1] -- register_copy jmp __b1 } // File Data @@ -2012,9 +2807,17 @@ vblank: { // Color Palette PALETTE: .byte 1, $21, $f, $30, 1, $21, $f, $30, 1, $21, $f, $30, 1, $21, $f, $30, 1, $f, $30, 8, 1, $f, $18, 8, 1, $30, $37, $1a, $f, $f, $f, $f // Sinus Table (0-239) -SINTABLE: +SINTABLE_240: .fill $100, round(115.5+107.5*sin(2*PI*i/256)) + // Sinus Table (0-63) +SINTABLE_64: +.fill 89, round(52.5+52.5*sin(2*PI*i/89)) + + // Sinus Table (0-183) +SINTABLE_184: +.fill 239, round(71.5+71.5*sin(2*PI*i/239)) + .segment Tiles TILES: .var filechargen = LoadBinary("characters.901225-01.bin") @@ -2034,94 +2837,117 @@ TILES: REGISTER UPLIFT POTENTIAL REGISTERS Statement [1] (volatile byte) y_sin_idx ← (byte) 0 [ ] ( [ ] { } ) always clobbers reg byte a Statement [2] (volatile byte) x_sin_idx ← (byte) $49 [ ] ( [ ] { } ) always clobbers reg byte a +Statement [3] (volatile byte) x_sin_idx_2 ← (byte) $52 [ ] ( [ ] { } ) always clobbers reg byte a Statement asm { cld ldx#$ff txs } always clobbers reg byte x -Statement [8] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 [ ] ( [ ] { } main:4 [ ] { } ) always clobbers reg byte a -Statement [9] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 [ ] ( [ ] { } main:4 [ ] { } ) always clobbers reg byte a -Statement [10] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 [ ] ( [ ] { } main:4 [ ] { } ) always clobbers reg byte a -Statement [11] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 [ ] ( [ ] { } main:4 [ ] { } ) always clobbers reg byte a +Statement [9] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 [ ] ( [ ] { } main:5 [ ] { } ) always clobbers reg byte a +Statement [10] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 [ ] ( [ ] { } main:5 [ ] { } ) always clobbers reg byte a +Statement [11] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 [ ] ( [ ] { } main:5 [ ] { } ) always clobbers reg byte a +Statement [12] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 [ ] ( [ ] { } main:5 [ ] { } ) always clobbers reg byte a Statement asm { ldaPPU_PPUSTATUS } always clobbers reg byte a -Statement [14] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ main::initNES1_waitForVBlank1_$0 ] ( [ main::initNES1_waitForVBlank1_$0 ] { } main:4 [ main::initNES1_waitForVBlank1_$0 ] { } ) always clobbers reg byte a -Statement [17] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [15] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ main::initNES1_waitForVBlank1_$0 ] ( [ main::initNES1_waitForVBlank1_$0 ] { } main:5 [ main::initNES1_waitForVBlank1_$0 ] { } ) always clobbers reg byte a +Statement [18] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::initNES1_i#2 main::initNES1_i#1 ] -Statement [18] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a -Statement [19] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a -Statement [20] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a -Statement [21] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a -Statement [22] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a -Statement [23] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a -Statement [24] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a -Statement [28] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ main::initNES1_waitForVBlank2_$0 ] ( [ main::initNES1_waitForVBlank2_$0 ] { } main:4 [ main::initNES1_waitForVBlank2_$0 ] { } ) always clobbers reg byte a +Statement [19] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [20] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [21] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [22] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [23] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [24] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [25] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [29] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ main::initNES1_waitForVBlank2_$0 ] ( [ main::initNES1_waitForVBlank2_$0 ] { } main:5 [ main::initNES1_waitForVBlank2_$0 ] { } ) always clobbers reg byte a Statement asm { ldaPPU_PPUSTATUS } always clobbers reg byte a -Statement [39] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 [ ] ( [ ] { } main:4 [ ] { } ) always clobbers reg byte a -Statement [40] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e [ ] ( [ ] { } main:4 [ ] { } ) always clobbers reg byte a -Statement [42] (byte~) main::$7 ← (byte) main::s#2 << (byte) 2 [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:4 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a +Statement [40] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 [ ] ( [ ] { } main:5 [ ] { } ) always clobbers reg byte a +Statement [41] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e [ ] ( [ ] { } main:5 [ ] { } ) always clobbers reg byte a +Statement [43] (byte~) main::$7 ← (byte) main::s#2 << (byte) 2 [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:5 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::s#2 main::s#1 ] -Statement [43] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$7) ← (byte) 0 [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:4 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a -Removing always clobbered register reg byte a as potential for zp[1]:22 [ main::$7 ] -Statement [44] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$7) ← *((const byte*) MESSAGE + (byte) main::s#2) [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:4 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a -Statement [45] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$7) ← (byte) 2 [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:4 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a -Statement [46] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$7) ← (byte) 0 [ main::s#2 ] ( [ main::s#2 ] { } main:4 [ main::s#2 ] { } ) always clobbers reg byte a -Statement [54] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] ( ppuDataFill:34 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } main:4::ppuDataFill:34 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } ppuDataFill:36 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } main:4::ppuDataFill:36 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } ) always clobbers reg byte a +Statement [44] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$7) ← (byte) 0 [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:5 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:28 [ main::$7 ] +Statement [45] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$7) ← *((const byte*) MESSAGE + (byte) main::s#2) [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:5 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a +Statement [46] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$7) ← (byte) 2 [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:5 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a +Statement [47] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$7) ← (byte) 0 [ main::s#2 ] ( [ main::s#2 ] { } main:5 [ main::s#2 ] { } ) always clobbers reg byte a +Statement [55] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] ( ppuDataFill:35 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } main:5::ppuDataFill:35 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } ppuDataFill:37 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } main:5::ppuDataFill:37 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } ) always clobbers reg byte a Removing always clobbered register reg byte a as potential for zp[1]:8 [ ppuDataFill::val#4 ] -Statement [59] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 [ ] ( ppuDataTransfer:32 [ ] { } main:4::ppuDataTransfer:32 [ ] { } ) always clobbers reg byte a -Statement [60] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 [ ] ( ppuDataTransfer:32 [ ] { } main:4::ppuDataTransfer:32 [ ] { } ) always clobbers reg byte a -Statement [62] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] ( ppuDataTransfer:32 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } main:4::ppuDataTransfer:32 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } ) always clobbers reg byte a -Statement [64] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] ( ppuDataTransfer:32 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } main:4::ppuDataTransfer:32 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } ) always clobbers reg byte a reg byte y -Statement [68] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [ y_sin_idx x_sin_idx ] ( [ y_sin_idx x_sin_idx ] { } ) always clobbers reg byte a -Statement [69] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [ y_sin_idx x_sin_idx ] ( [ y_sin_idx x_sin_idx ] { } ) always clobbers reg byte a -Statement [70] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 [ y_sin_idx x_sin_idx ] ( [ y_sin_idx x_sin_idx ] { } ) always clobbers reg byte a -Statement [71] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER [ y_sin_idx x_sin_idx ] ( [ y_sin_idx x_sin_idx ] { } ) always clobbers reg byte a +Statement [60] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 [ ] ( ppuDataTransfer:33 [ ] { } main:5::ppuDataTransfer:33 [ ] { } ) always clobbers reg byte a +Statement [61] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 [ ] ( ppuDataTransfer:33 [ ] { } main:5::ppuDataTransfer:33 [ ] { } ) always clobbers reg byte a +Statement [63] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] ( ppuDataTransfer:33 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } main:5::ppuDataTransfer:33 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } ) always clobbers reg byte a +Statement [65] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] ( ppuDataTransfer:33 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } main:5::ppuDataTransfer:33 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } ) always clobbers reg byte a reg byte y +Statement [69] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [ y_sin_idx x_sin_idx x_sin_idx_2 ] ( [ y_sin_idx x_sin_idx x_sin_idx_2 ] { } ) always clobbers reg byte a +Statement [70] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [ y_sin_idx x_sin_idx x_sin_idx_2 ] ( [ y_sin_idx x_sin_idx x_sin_idx_2 ] { } ) always clobbers reg byte a +Statement [71] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 [ y_sin_idx x_sin_idx x_sin_idx_2 ] ( [ y_sin_idx x_sin_idx x_sin_idx_2 ] { } ) always clobbers reg byte a +Statement [72] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER [ y_sin_idx x_sin_idx x_sin_idx_2 ] ( [ y_sin_idx x_sin_idx x_sin_idx_2 ] { } ) always clobbers reg byte a Statement [78] return [ ] ( [ ] { } ) always clobbers reg byte a reg byte x reg byte y -Statement [79] (byte~) vblank::$4 ← (byte) vblank::s#2 << (byte) 2 [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::$4 ] ( [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::$4 ] { } ) always clobbers reg byte a -Removing always clobbered register reg byte a as potential for zp[1]:15 [ vblank::s#2 vblank::s#1 ] -Removing always clobbered register reg byte a as potential for zp[1]:16 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] -Removing always clobbered register reg byte a as potential for zp[1]:17 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 ] -Statement [80] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) vblank::$4) ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::y_idx#2) [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::$4 ] ( [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::$4 ] { } ) always clobbers reg byte a -Removing always clobbered register reg byte a as potential for zp[1]:26 [ vblank::$4 ] -Statement [81] (byte~) vblank::$2 ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::x_idx#2) + (byte) 8 [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::$4 vblank::$2 ] ( [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::$4 vblank::$2 ] { } ) always clobbers reg byte a -Statement [83] (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 + (byte) 4 [ vblank::s#2 vblank::x_idx#2 vblank::y_idx#1 ] ( [ vblank::s#2 vblank::x_idx#2 vblank::y_idx#1 ] { } ) always clobbers reg byte a -Statement [84] (byte) vblank::x_idx#1 ← (byte) vblank::x_idx#2 - (byte) 7 [ vblank::s#2 vblank::y_idx#1 vblank::x_idx#1 ] ( [ vblank::s#2 vblank::y_idx#1 vblank::x_idx#1 ] { } ) always clobbers reg byte a +Statement [81] if((volatile byte) x_sin_idx==(byte) $ee) goto vblank::@3 [ x_sin_idx x_sin_idx_2 vblank::y_idx#0 ] ( [ x_sin_idx x_sin_idx_2 vblank::y_idx#0 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:18 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] +Statement [86] if((volatile byte) x_sin_idx_2==(byte) $58) goto vblank::@5 [ x_sin_idx_2 vblank::y_idx#0 vblank::x_idx#0 ] ( [ x_sin_idx_2 vblank::y_idx#0 vblank::x_idx#0 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:19 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 vblank::$19 vblank::$17 ] +Statement [93] (byte~) vblank::$28 ← (byte) vblank::s#2 << (byte) 2 [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::$28 ] ( [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::$28 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:17 [ vblank::s#2 vblank::s#1 ] +Removing always clobbered register reg byte a as potential for zp[1]:20 [ vblank::x_idx_2#2 vblank::x_idx_2#1 vblank::x_idx_2#0 vblank::$25 vblank::$23 ] +Statement [94] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) vblank::$28) ← *((const to_nomodify byte*) SINTABLE_240 + (byte) vblank::y_idx#2) [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::$28 ] ( [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::$28 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:34 [ vblank::$28 ] +Statement [95] (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 - (byte) 4 [ vblank::s#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$28 ] ( [ vblank::s#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$28 ] { } ) always clobbers reg byte a +Statement [96] (byte~) vblank::$14 ← *((const to_nomodify byte*) SINTABLE_184 + (byte) vblank::x_idx#2) + *((const to_nomodify byte*) SINTABLE_64 + (byte) vblank::x_idx_2#2) [ vblank::s#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$28 vblank::$14 ] ( [ vblank::s#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$28 vblank::$14 ] { } ) always clobbers reg byte a +Statement [99] (byte~) vblank::$17 ← (byte) vblank::x_idx#2 - (byte) 3 [ vblank::s#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$17 ] ( [ vblank::s#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$17 ] { } ) always clobbers reg byte a +Statement [102] (byte~) vblank::$23 ← (byte) vblank::x_idx_2#2 + (byte) 3 [ vblank::s#2 vblank::y_idx#1 vblank::x_idx#1 vblank::$23 ] ( [ vblank::s#2 vblank::y_idx#1 vblank::x_idx#1 vblank::$23 ] { } ) always clobbers reg byte a +Statement [105] (byte~) vblank::$25 ← (byte) vblank::x_idx_2#2 - (byte) $56 [ vblank::s#2 vblank::y_idx#1 vblank::x_idx#1 vblank::$25 ] ( [ vblank::s#2 vblank::y_idx#1 vblank::x_idx#1 vblank::$25 ] { } ) always clobbers reg byte a +Statement [106] (byte~) vblank::$19 ← (byte) vblank::x_idx#2 + (byte) $ec [ vblank::s#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$19 ] ( [ vblank::s#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$19 ] { } ) always clobbers reg byte a +Statement [107] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1 [ ] ( readJoy1:74 [ y_sin_idx x_sin_idx x_sin_idx_2 ] { { readJoy1::return#2 = readJoy1::joy#2 } } ) always clobbers reg byte a +Statement [108] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0 [ ] ( readJoy1:74 [ y_sin_idx x_sin_idx x_sin_idx_2 ] { { readJoy1::return#2 = readJoy1::joy#2 } } ) always clobbers reg byte a +Statement [112] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 [ readJoy1::i#2 readJoy1::$1 ] ( readJoy1:74 [ y_sin_idx x_sin_idx x_sin_idx_2 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]:21 [ readJoy1::i#2 readJoy1::i#1 ] +Statement [113] (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:74 [ y_sin_idx x_sin_idx x_sin_idx_2 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]:36 [ readJoy1::$1 ] Statement [1] (volatile byte) y_sin_idx ← (byte) 0 [ ] ( [ ] { } ) always clobbers reg byte a Statement [2] (volatile byte) x_sin_idx ← (byte) $49 [ ] ( [ ] { } ) always clobbers reg byte a +Statement [3] (volatile byte) x_sin_idx_2 ← (byte) $52 [ ] ( [ ] { } ) always clobbers reg byte a Statement asm { cld ldx#$ff txs } always clobbers reg byte x -Statement [8] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 [ ] ( [ ] { } main:4 [ ] { } ) always clobbers reg byte a -Statement [9] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 [ ] ( [ ] { } main:4 [ ] { } ) always clobbers reg byte a -Statement [10] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 [ ] ( [ ] { } main:4 [ ] { } ) always clobbers reg byte a -Statement [11] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 [ ] ( [ ] { } main:4 [ ] { } ) always clobbers reg byte a +Statement [9] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 [ ] ( [ ] { } main:5 [ ] { } ) always clobbers reg byte a +Statement [10] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 [ ] ( [ ] { } main:5 [ ] { } ) always clobbers reg byte a +Statement [11] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 [ ] ( [ ] { } main:5 [ ] { } ) always clobbers reg byte a +Statement [12] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 [ ] ( [ ] { } main:5 [ ] { } ) always clobbers reg byte a Statement asm { ldaPPU_PPUSTATUS } always clobbers reg byte a -Statement [14] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ main::initNES1_waitForVBlank1_$0 ] ( [ main::initNES1_waitForVBlank1_$0 ] { } main:4 [ main::initNES1_waitForVBlank1_$0 ] { } ) always clobbers reg byte a -Statement [17] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a -Statement [18] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a -Statement [19] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a -Statement [20] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a -Statement [21] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a -Statement [22] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a -Statement [23] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a -Statement [24] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:4 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a -Statement [28] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ main::initNES1_waitForVBlank2_$0 ] ( [ main::initNES1_waitForVBlank2_$0 ] { } main:4 [ main::initNES1_waitForVBlank2_$0 ] { } ) always clobbers reg byte a +Statement [15] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ main::initNES1_waitForVBlank1_$0 ] ( [ main::initNES1_waitForVBlank1_$0 ] { } main:5 [ main::initNES1_waitForVBlank1_$0 ] { } ) always clobbers reg byte a +Statement [18] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [19] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [20] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [21] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [22] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [23] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [24] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [25] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 [ main::initNES1_i#2 ] ( [ main::initNES1_i#2 ] { } main:5 [ main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [29] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ main::initNES1_waitForVBlank2_$0 ] ( [ main::initNES1_waitForVBlank2_$0 ] { } main:5 [ main::initNES1_waitForVBlank2_$0 ] { } ) always clobbers reg byte a Statement asm { ldaPPU_PPUSTATUS } always clobbers reg byte a -Statement [39] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 [ ] ( [ ] { } main:4 [ ] { } ) always clobbers reg byte a -Statement [40] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e [ ] ( [ ] { } main:4 [ ] { } ) always clobbers reg byte a -Statement [42] (byte~) main::$7 ← (byte) main::s#2 << (byte) 2 [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:4 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a -Statement [43] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$7) ← (byte) 0 [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:4 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a -Statement [44] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$7) ← *((const byte*) MESSAGE + (byte) main::s#2) [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:4 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a -Statement [45] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$7) ← (byte) 2 [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:4 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a -Statement [46] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$7) ← (byte) 0 [ main::s#2 ] ( [ main::s#2 ] { } main:4 [ main::s#2 ] { } ) always clobbers reg byte a -Statement [54] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] ( ppuDataFill:34 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } main:4::ppuDataFill:34 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } ppuDataFill:36 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } main:4::ppuDataFill:36 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } ) always clobbers reg byte a -Statement [59] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 [ ] ( ppuDataTransfer:32 [ ] { } main:4::ppuDataTransfer:32 [ ] { } ) always clobbers reg byte a -Statement [60] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 [ ] ( ppuDataTransfer:32 [ ] { } main:4::ppuDataTransfer:32 [ ] { } ) always clobbers reg byte a -Statement [62] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] ( ppuDataTransfer:32 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } main:4::ppuDataTransfer:32 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } ) always clobbers reg byte a -Statement [64] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] ( ppuDataTransfer:32 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } main:4::ppuDataTransfer:32 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } ) always clobbers reg byte a reg byte y -Statement [68] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [ y_sin_idx x_sin_idx ] ( [ y_sin_idx x_sin_idx ] { } ) always clobbers reg byte a -Statement [69] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [ y_sin_idx x_sin_idx ] ( [ y_sin_idx x_sin_idx ] { } ) always clobbers reg byte a -Statement [70] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 [ y_sin_idx x_sin_idx ] ( [ y_sin_idx x_sin_idx ] { } ) always clobbers reg byte a -Statement [71] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER [ y_sin_idx x_sin_idx ] ( [ y_sin_idx x_sin_idx ] { } ) always clobbers reg byte a +Statement [40] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 [ ] ( [ ] { } main:5 [ ] { } ) always clobbers reg byte a +Statement [41] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e [ ] ( [ ] { } main:5 [ ] { } ) always clobbers reg byte a +Statement [43] (byte~) main::$7 ← (byte) main::s#2 << (byte) 2 [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:5 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a +Statement [44] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$7) ← (byte) 0 [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:5 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a +Statement [45] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$7) ← *((const byte*) MESSAGE + (byte) main::s#2) [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:5 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a +Statement [46] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$7) ← (byte) 2 [ main::s#2 main::$7 ] ( [ main::s#2 main::$7 ] { } main:5 [ main::s#2 main::$7 ] { } ) always clobbers reg byte a +Statement [47] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$7) ← (byte) 0 [ main::s#2 ] ( [ main::s#2 ] { } main:5 [ main::s#2 ] { } ) always clobbers reg byte a +Statement [55] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] ( ppuDataFill:35 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } main:5::ppuDataFill:35 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } ppuDataFill:37 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } main:5::ppuDataFill:37 [ ppuDataFill::size#3 ppuDataFill::val#4 ppuDataFill::i#2 ] { } ) always clobbers reg byte a +Statement [60] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 [ ] ( ppuDataTransfer:33 [ ] { } main:5::ppuDataTransfer:33 [ ] { } ) always clobbers reg byte a +Statement [61] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 [ ] ( ppuDataTransfer:33 [ ] { } main:5::ppuDataTransfer:33 [ ] { } ) always clobbers reg byte a +Statement [63] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] ( ppuDataTransfer:33 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } main:5::ppuDataTransfer:33 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } ) always clobbers reg byte a +Statement [65] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] ( ppuDataTransfer:33 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } main:5::ppuDataTransfer:33 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } ) always clobbers reg byte a reg byte y +Statement [69] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [ y_sin_idx x_sin_idx x_sin_idx_2 ] ( [ y_sin_idx x_sin_idx x_sin_idx_2 ] { } ) always clobbers reg byte a +Statement [70] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [ y_sin_idx x_sin_idx x_sin_idx_2 ] ( [ y_sin_idx x_sin_idx x_sin_idx_2 ] { } ) always clobbers reg byte a +Statement [71] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 [ y_sin_idx x_sin_idx x_sin_idx_2 ] ( [ y_sin_idx x_sin_idx x_sin_idx_2 ] { } ) always clobbers reg byte a +Statement [72] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER [ y_sin_idx x_sin_idx x_sin_idx_2 ] ( [ y_sin_idx x_sin_idx x_sin_idx_2 ] { } ) always clobbers reg byte a Statement [78] return [ ] ( [ ] { } ) always clobbers reg byte a reg byte x reg byte y -Statement [79] (byte~) vblank::$4 ← (byte) vblank::s#2 << (byte) 2 [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::$4 ] ( [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::$4 ] { } ) always clobbers reg byte a -Statement [80] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) vblank::$4) ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::y_idx#2) [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::$4 ] ( [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::$4 ] { } ) always clobbers reg byte a -Statement [81] (byte~) vblank::$2 ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::x_idx#2) + (byte) 8 [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::$4 vblank::$2 ] ( [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::$4 vblank::$2 ] { } ) always clobbers reg byte a -Statement [83] (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 + (byte) 4 [ vblank::s#2 vblank::x_idx#2 vblank::y_idx#1 ] ( [ vblank::s#2 vblank::x_idx#2 vblank::y_idx#1 ] { } ) always clobbers reg byte a -Statement [84] (byte) vblank::x_idx#1 ← (byte) vblank::x_idx#2 - (byte) 7 [ vblank::s#2 vblank::y_idx#1 vblank::x_idx#1 ] ( [ vblank::s#2 vblank::y_idx#1 vblank::x_idx#1 ] { } ) always clobbers reg byte a +Statement [81] if((volatile byte) x_sin_idx==(byte) $ee) goto vblank::@3 [ x_sin_idx x_sin_idx_2 vblank::y_idx#0 ] ( [ x_sin_idx x_sin_idx_2 vblank::y_idx#0 ] { } ) always clobbers reg byte a +Statement [86] if((volatile byte) x_sin_idx_2==(byte) $58) goto vblank::@5 [ x_sin_idx_2 vblank::y_idx#0 vblank::x_idx#0 ] ( [ x_sin_idx_2 vblank::y_idx#0 vblank::x_idx#0 ] { } ) always clobbers reg byte a +Statement [93] (byte~) vblank::$28 ← (byte) vblank::s#2 << (byte) 2 [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::$28 ] ( [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::$28 ] { } ) always clobbers reg byte a +Statement [94] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) vblank::$28) ← *((const to_nomodify byte*) SINTABLE_240 + (byte) vblank::y_idx#2) [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::$28 ] ( [ vblank::s#2 vblank::y_idx#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::$28 ] { } ) always clobbers reg byte a +Statement [95] (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 - (byte) 4 [ vblank::s#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$28 ] ( [ vblank::s#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$28 ] { } ) always clobbers reg byte a +Statement [96] (byte~) vblank::$14 ← *((const to_nomodify byte*) SINTABLE_184 + (byte) vblank::x_idx#2) + *((const to_nomodify byte*) SINTABLE_64 + (byte) vblank::x_idx_2#2) [ vblank::s#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$28 vblank::$14 ] ( [ vblank::s#2 vblank::x_idx#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$28 vblank::$14 ] { } ) always clobbers reg byte a +Statement [99] (byte~) vblank::$17 ← (byte) vblank::x_idx#2 - (byte) 3 [ vblank::s#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$17 ] ( [ vblank::s#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$17 ] { } ) always clobbers reg byte a +Statement [102] (byte~) vblank::$23 ← (byte) vblank::x_idx_2#2 + (byte) 3 [ vblank::s#2 vblank::y_idx#1 vblank::x_idx#1 vblank::$23 ] ( [ vblank::s#2 vblank::y_idx#1 vblank::x_idx#1 vblank::$23 ] { } ) always clobbers reg byte a +Statement [105] (byte~) vblank::$25 ← (byte) vblank::x_idx_2#2 - (byte) $56 [ vblank::s#2 vblank::y_idx#1 vblank::x_idx#1 vblank::$25 ] ( [ vblank::s#2 vblank::y_idx#1 vblank::x_idx#1 vblank::$25 ] { } ) always clobbers reg byte a +Statement [106] (byte~) vblank::$19 ← (byte) vblank::x_idx#2 + (byte) $ec [ vblank::s#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$19 ] ( [ vblank::s#2 vblank::x_idx_2#2 vblank::y_idx#1 vblank::$19 ] { } ) always clobbers reg byte a +Statement [107] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1 [ ] ( readJoy1:74 [ y_sin_idx x_sin_idx x_sin_idx_2 ] { { readJoy1::return#2 = readJoy1::joy#2 } } ) always clobbers reg byte a +Statement [108] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0 [ ] ( readJoy1:74 [ y_sin_idx x_sin_idx x_sin_idx_2 ] { { readJoy1::return#2 = readJoy1::joy#2 } } ) always clobbers reg byte a +Statement [112] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 [ readJoy1::i#2 readJoy1::$1 ] ( readJoy1:74 [ y_sin_idx x_sin_idx x_sin_idx_2 readJoy1::i#2 readJoy1::$1 ] { { readJoy1::return#2 = readJoy1::joy#2 } } ) always clobbers reg byte a +Statement [113] (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:74 [ y_sin_idx x_sin_idx x_sin_idx_2 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::s#2 main::s#1 ] : zp[1]:3 , reg byte x , reg byte y , Potential registers zp[2]:4 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ] : zp[2]:4 , @@ -2130,62 +2956,95 @@ Potential registers zp[1]:8 [ ppuDataFill::val#4 ] : zp[1]:8 , reg byte x , reg Potential registers zp[2]:9 [ ppuDataFill::i#2 ppuDataFill::i#1 ] : zp[2]:9 , Potential registers zp[2]:11 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] : zp[2]:11 , Potential registers zp[2]:13 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ] : zp[2]:13 , -Potential registers zp[1]:15 [ vblank::s#2 vblank::s#1 ] : zp[1]:15 , reg byte x , reg byte y , -Potential registers zp[1]:16 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] : zp[1]:16 , reg byte x , reg byte y , -Potential registers zp[1]:17 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 ] : zp[1]:17 , reg byte x , reg byte y , -Potential registers zp[1]:18 [ y_sin_idx ] : zp[1]:18 , -Potential registers zp[1]:19 [ x_sin_idx ] : zp[1]:19 , -Potential registers zp[1]:20 [ main::initNES1_waitForVBlank1_$0 ] : zp[1]:20 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:21 [ main::initNES1_waitForVBlank2_$0 ] : zp[1]:21 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:22 [ main::$7 ] : zp[1]:22 , reg byte x , reg byte y , -Potential registers zp[1]:23 [ ppuDataFill::ppuDataPrepare1_$0 ] : zp[1]:23 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:24 [ ppuDataFill::ppuDataPrepare1_$1 ] : zp[1]:24 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:25 [ ppuDataTransfer::ppuDataPut1_val#0 ] : zp[1]:25 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:26 [ vblank::$4 ] : zp[1]:26 , reg byte x , reg byte y , -Potential registers zp[1]:27 [ vblank::$2 ] : zp[1]:27 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:15 [ vblank::$7 vblank::$5 ] : zp[1]:15 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:16 [ vblank::$12 vblank::$10 ] : zp[1]:16 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:17 [ vblank::s#2 vblank::s#1 ] : zp[1]:17 , reg byte x , reg byte y , +Potential registers zp[1]:18 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] : zp[1]:18 , reg byte x , reg byte y , +Potential registers zp[1]:19 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 vblank::$19 vblank::$17 ] : zp[1]:19 , reg byte x , reg byte y , +Potential registers zp[1]:20 [ vblank::x_idx_2#2 vblank::x_idx_2#1 vblank::x_idx_2#0 vblank::$25 vblank::$23 ] : zp[1]:20 , reg byte x , reg byte y , +Potential registers zp[1]:21 [ readJoy1::i#2 readJoy1::i#1 ] : zp[1]:21 , reg byte x , reg byte y , +Potential registers zp[1]:22 [ readJoy1::joy#2 readJoy1::joy#1 ] : zp[1]:22 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:23 [ y_sin_idx ] : zp[1]:23 , +Potential registers zp[1]:24 [ x_sin_idx ] : zp[1]:24 , +Potential registers zp[1]:25 [ x_sin_idx_2 ] : zp[1]:25 , +Potential registers zp[1]:26 [ main::initNES1_waitForVBlank1_$0 ] : zp[1]:26 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:27 [ main::initNES1_waitForVBlank2_$0 ] : zp[1]:27 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:28 [ main::$7 ] : zp[1]:28 , reg byte x , reg byte y , +Potential registers zp[1]:29 [ ppuDataFill::ppuDataPrepare1_$0 ] : zp[1]:29 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:30 [ ppuDataFill::ppuDataPrepare1_$1 ] : zp[1]:30 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:31 [ ppuDataTransfer::ppuDataPut1_val#0 ] : zp[1]:31 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:32 [ readJoy1::return#2 ] : zp[1]:32 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:33 [ vblank::joy#0 ] : zp[1]:33 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:34 [ vblank::$28 ] : zp[1]:34 , reg byte x , reg byte y , +Potential registers zp[1]:35 [ vblank::$14 ] : zp[1]:35 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:36 [ readJoy1::$1 ] : zp[1]:36 , reg byte x , reg byte y , +Potential registers zp[1]:37 [ readJoy1::$2 ] : zp[1]:37 , reg byte a , reg byte x , reg byte y , REGISTER UPLIFT SCOPES -Uplift Scope [ppuDataTransfer] 2,602.6: zp[2]:11 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] 2,002: zp[1]:25 [ ppuDataTransfer::ppuDataPut1_val#0 ] 1,751.75: zp[2]:13 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ] -Uplift Scope [ppuDataFill] 3,003: zp[2]:9 [ ppuDataFill::i#2 ppuDataFill::i#1 ] 202: zp[1]:23 [ ppuDataFill::ppuDataPrepare1_$0 ] 202: zp[1]:24 [ ppuDataFill::ppuDataPrepare1_$1 ] 111.22: zp[2]:6 [ ppuDataFill::size#3 ] 111.22: zp[1]:8 [ ppuDataFill::val#4 ] 67.33: zp[2]:4 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ] -Uplift Scope [main] 274.14: zp[1]:3 [ main::s#2 main::s#1 ] 263.72: zp[1]:2 [ main::initNES1_i#2 main::initNES1_i#1 ] 202: zp[1]:20 [ main::initNES1_waitForVBlank1_$0 ] 202: zp[1]:21 [ main::initNES1_waitForVBlank2_$0 ] 126.25: zp[1]:22 [ main::$7 ] -Uplift Scope [vblank] 27.5: zp[1]:15 [ vblank::s#2 vblank::s#1 ] 22: zp[1]:27 [ vblank::$2 ] 18: zp[1]:17 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 ] 14.17: zp[1]:16 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] 11: zp[1]:26 [ vblank::$4 ] -Uplift Scope [] 1.6: zp[1]:18 [ y_sin_idx ] 1.14: zp[1]:19 [ x_sin_idx ] +Uplift Scope [ppuDataTransfer] 2,602.6: zp[2]:11 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] 2,002: zp[1]:31 [ ppuDataTransfer::ppuDataPut1_val#0 ] 1,751.75: zp[2]:13 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ] +Uplift Scope [ppuDataFill] 3,003: zp[2]:9 [ ppuDataFill::i#2 ppuDataFill::i#1 ] 202: zp[1]:29 [ ppuDataFill::ppuDataPrepare1_$0 ] 202: zp[1]:30 [ ppuDataFill::ppuDataPrepare1_$1 ] 111.22: zp[2]:6 [ ppuDataFill::size#3 ] 111.22: zp[1]:8 [ ppuDataFill::val#4 ] 67.33: zp[2]:4 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ] +Uplift Scope [main] 274.14: zp[1]:3 [ main::s#2 main::s#1 ] 263.72: zp[1]:2 [ main::initNES1_i#2 main::initNES1_i#1 ] 202: zp[1]:26 [ main::initNES1_waitForVBlank1_$0 ] 202: zp[1]:27 [ main::initNES1_waitForVBlank2_$0 ] 126.25: zp[1]:28 [ main::$7 ] +Uplift Scope [readJoy1] 262.6: zp[1]:21 [ readJoy1::i#2 readJoy1::i#1 ] 202: zp[1]:37 [ readJoy1::$2 ] 152: zp[1]:22 [ readJoy1::joy#2 readJoy1::joy#1 ] 101: zp[1]:36 [ readJoy1::$1 ] 4: zp[1]:32 [ readJoy1::return#2 ] +Uplift Scope [vblank] 69.25: zp[1]:20 [ vblank::x_idx_2#2 vblank::x_idx_2#1 vblank::x_idx_2#0 vblank::$25 vblank::$23 ] 57.29: zp[1]:19 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 vblank::$19 vblank::$17 ] 24.93: zp[1]:17 [ vblank::s#2 vblank::s#1 ] 22: zp[1]:35 [ vblank::$14 ] 10.92: zp[1]:18 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] 8.25: zp[1]:34 [ vblank::$28 ] 8: zp[1]:15 [ vblank::$7 vblank::$5 ] 8: zp[1]:16 [ vblank::$12 vblank::$10 ] 4: zp[1]:33 [ vblank::joy#0 ] +Uplift Scope [] 0.8: zp[1]:23 [ y_sin_idx ] 0.77: zp[1]:24 [ x_sin_idx ] 0.56: zp[1]:25 [ x_sin_idx_2 ] Uplift Scope [RICOH_2C02] Uplift Scope [RICOH_2A03] Uplift Scope [SpriteData] -Uplifting [ppuDataTransfer] best 5348 combination zp[2]:11 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] reg byte a [ ppuDataTransfer::ppuDataPut1_val#0 ] zp[2]:13 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ] -Uplifting [ppuDataFill] best 5300 combination zp[2]:9 [ ppuDataFill::i#2 ppuDataFill::i#1 ] reg byte a [ ppuDataFill::ppuDataPrepare1_$0 ] reg byte a [ ppuDataFill::ppuDataPrepare1_$1 ] zp[2]:6 [ ppuDataFill::size#3 ] reg byte x [ ppuDataFill::val#4 ] zp[2]:4 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ] -Uplifting [main] best 4720 combination reg byte x [ main::s#2 main::s#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 ] zp[1]:22 [ main::$7 ] +Uplifting [ppuDataTransfer] best 6633 combination zp[2]:11 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] reg byte a [ ppuDataTransfer::ppuDataPut1_val#0 ] zp[2]:13 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ] +Uplifting [ppuDataFill] best 6585 combination zp[2]:9 [ ppuDataFill::i#2 ppuDataFill::i#1 ] reg byte a [ ppuDataFill::ppuDataPrepare1_$0 ] reg byte a [ ppuDataFill::ppuDataPrepare1_$1 ] zp[2]:6 [ ppuDataFill::size#3 ] reg byte x [ ppuDataFill::val#4 ] zp[2]:4 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ] +Uplifting [main] best 6005 combination reg byte x [ main::s#2 main::s#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 ] zp[1]:28 [ main::$7 ] Limited combination testing to 100 combinations of 432 possible. -Uplifting [vblank] best 4560 combination reg byte x [ vblank::s#2 vblank::s#1 ] reg byte a [ vblank::$2 ] zp[1]:17 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 ] zp[1]:16 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] zp[1]:26 [ vblank::$4 ] -Limited combination testing to 100 combinations of 324 possible. -Uplifting [] best 4560 combination zp[1]:18 [ y_sin_idx ] zp[1]:19 [ x_sin_idx ] -Uplifting [RICOH_2C02] best 4560 combination -Uplifting [RICOH_2A03] best 4560 combination -Uplifting [SpriteData] best 4560 combination -Attempting to uplift remaining variables inzp[1]:22 [ main::$7 ] -Uplifting [main] best 4430 combination reg byte y [ main::$7 ] -Attempting to uplift remaining variables inzp[1]:17 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 ] -Uplifting [vblank] best 4430 combination zp[1]:17 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 ] -Attempting to uplift remaining variables inzp[1]:16 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] -Uplifting [vblank] best 4430 combination zp[1]:16 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] -Attempting to uplift remaining variables inzp[1]:26 [ vblank::$4 ] -Uplifting [vblank] best 4430 combination zp[1]:26 [ vblank::$4 ] -Attempting to uplift remaining variables inzp[1]:18 [ y_sin_idx ] -Uplifting [] best 4430 combination zp[1]:18 [ y_sin_idx ] -Attempting to uplift remaining variables inzp[1]:19 [ x_sin_idx ] -Uplifting [] best 4430 combination zp[1]:19 [ x_sin_idx ] +Uplifting [readJoy1] best 5762 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]:36 [ readJoy1::$1 ] zp[1]:32 [ readJoy1::return#2 ] +Limited combination testing to 100 combinations of 576 possible. +Uplifting [vblank] best 5702 combination zp[1]:20 [ vblank::x_idx_2#2 vblank::x_idx_2#1 vblank::x_idx_2#0 vblank::$25 vblank::$23 ] zp[1]:19 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 vblank::$19 vblank::$17 ] zp[1]:17 [ vblank::s#2 vblank::s#1 ] reg byte a [ vblank::$14 ] zp[1]:18 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] zp[1]:34 [ vblank::$28 ] zp[1]:15 [ vblank::$7 vblank::$5 ] zp[1]:16 [ vblank::$12 vblank::$10 ] zp[1]:33 [ vblank::joy#0 ] +Limited combination testing to 100 combinations of 62208 possible. +Uplifting [] best 5702 combination zp[1]:23 [ y_sin_idx ] zp[1]:24 [ x_sin_idx ] zp[1]:25 [ x_sin_idx_2 ] +Uplifting [RICOH_2C02] best 5702 combination +Uplifting [RICOH_2A03] best 5702 combination +Uplifting [SpriteData] best 5702 combination +Attempting to uplift remaining variables inzp[1]:28 [ main::$7 ] +Uplifting [main] best 5572 combination reg byte y [ main::$7 ] +Attempting to uplift remaining variables inzp[1]:36 [ readJoy1::$1 ] +Uplifting [readJoy1] best 5572 combination zp[1]:36 [ readJoy1::$1 ] +Attempting to uplift remaining variables inzp[1]:20 [ vblank::x_idx_2#2 vblank::x_idx_2#1 vblank::x_idx_2#0 vblank::$25 vblank::$23 ] +Uplifting [vblank] best 5572 combination zp[1]:20 [ vblank::x_idx_2#2 vblank::x_idx_2#1 vblank::x_idx_2#0 vblank::$25 vblank::$23 ] +Attempting to uplift remaining variables inzp[1]:19 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 vblank::$19 vblank::$17 ] +Uplifting [vblank] best 5572 combination zp[1]:19 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 vblank::$19 vblank::$17 ] +Attempting to uplift remaining variables inzp[1]:17 [ vblank::s#2 vblank::s#1 ] +Uplifting [vblank] best 5572 combination zp[1]:17 [ vblank::s#2 vblank::s#1 ] +Attempting to uplift remaining variables inzp[1]:18 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] +Uplifting [vblank] best 5572 combination zp[1]:18 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] +Attempting to uplift remaining variables inzp[1]:34 [ vblank::$28 ] +Uplifting [vblank] best 5572 combination zp[1]:34 [ vblank::$28 ] +Attempting to uplift remaining variables inzp[1]:15 [ vblank::$7 vblank::$5 ] +Uplifting [vblank] best 5563 combination reg byte x [ vblank::$7 vblank::$5 ] +Attempting to uplift remaining variables inzp[1]:16 [ vblank::$12 vblank::$10 ] +Uplifting [vblank] best 5554 combination reg byte x [ vblank::$12 vblank::$10 ] +Attempting to uplift remaining variables inzp[1]:32 [ readJoy1::return#2 ] +Uplifting [readJoy1] best 5548 combination reg byte a [ readJoy1::return#2 ] +Attempting to uplift remaining variables inzp[1]:33 [ vblank::joy#0 ] +Uplifting [vblank] best 5542 combination reg byte a [ vblank::joy#0 ] +Attempting to uplift remaining variables inzp[1]:23 [ y_sin_idx ] +Uplifting [] best 5542 combination zp[1]:23 [ y_sin_idx ] +Attempting to uplift remaining variables inzp[1]:24 [ x_sin_idx ] +Uplifting [] best 5542 combination zp[1]:24 [ x_sin_idx ] +Attempting to uplift remaining variables inzp[1]:25 [ x_sin_idx_2 ] +Uplifting [] best 5542 combination zp[1]:25 [ x_sin_idx_2 ] Coalescing zero page register [ zp[2]:11 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] ] with [ zp[2]:4 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ] ] Coalescing zero page register [ zp[2]:13 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ] ] with [ zp[2]:6 [ ppuDataFill::size#3 ] ] Allocated (was zp[2]:9) zp[2]:2 [ ppuDataFill::i#2 ppuDataFill::i#1 ] Allocated (was zp[2]:11) zp[2]:4 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ppuDataFill::ppuDataPrepare1_ppuData#0 ] Allocated (was zp[2]:13) zp[2]:6 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ppuDataFill::size#3 ] -Allocated (was zp[1]:16) zp[1]:8 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] -Allocated (was zp[1]:17) zp[1]:9 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 ] -Allocated (was zp[1]:18) zp[1]:10 [ y_sin_idx ] -Allocated (was zp[1]:19) zp[1]:11 [ x_sin_idx ] -Allocated (was zp[1]:26) zp[1]:12 [ vblank::$4 ] +Allocated (was zp[1]:17) zp[1]:8 [ vblank::s#2 vblank::s#1 ] +Allocated (was zp[1]:18) zp[1]:9 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] +Allocated (was zp[1]:19) zp[1]:10 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 vblank::$19 vblank::$17 ] +Allocated (was zp[1]:20) zp[1]:11 [ vblank::x_idx_2#2 vblank::x_idx_2#1 vblank::x_idx_2#0 vblank::$25 vblank::$23 ] +Allocated (was zp[1]:23) zp[1]:12 [ y_sin_idx ] +Allocated (was zp[1]:24) zp[1]:13 [ x_sin_idx ] +Allocated (was zp[1]:25) zp[1]:14 [ x_sin_idx_2 ] +Allocated (was zp[1]:34) zp[1]:15 [ vblank::$28 ] +Allocated (was zp[1]:36) zp[1]:16 [ readJoy1::$1 ] ASSEMBLER BEFORE OPTIMIZATION // File Comments @@ -2238,6 +3097,7 @@ ASSEMBLER BEFORE OPTIMIZATION .const OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = 2 .const OFFSET_STRUCT_RICOH_2C02_OAMADDR = 3 .const OFFSET_STRUCT_RICOH_2A03_OAMDMA = $14 + .const OFFSET_STRUCT_RICOH_2A03_JOY1 = $16 .const OFFSET_STRUCT_RICOH_2C02_PPUADDR = 6 .const OFFSET_STRUCT_RICOH_2C02_PPUDATA = 7 .const OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = 5 @@ -2269,8 +3129,9 @@ ASSEMBLER BEFORE OPTIMIZATION .label PPU = $2000 // NES CPU and audion processing unit (APU) .label APU = $4000 - .label y_sin_idx = $a - .label x_sin_idx = $b + .label y_sin_idx = $c + .label x_sin_idx = $d + .label x_sin_idx_2 = $e // @begin __bbegin: jmp __b1 @@ -2284,16 +3145,20 @@ __b1: // Index into the X sine lda #$49 sta.z x_sin_idx - // [3] phi from @1 to @2 [phi:@1->@2] + // [3] (volatile byte) x_sin_idx_2 ← (byte) $52 -- vbuz1=vbuc1 + // Index into the small X sine + lda #$52 + sta.z x_sin_idx_2 + // [4] phi from @1 to @2 [phi:@1->@2] __b2_from___b1: jmp __b2 // @2 __b2: - // [4] call main - // [6] phi from @2 to main [phi:@2->main] + // [5] call main + // [7] phi from @2 to main [phi:@2->main] main_from___b2: jsr main - // [5] phi from @2 to @end [phi:@2->@end] + // [6] phi from @2 to @end [phi:@2->@end] __bend_from___b2: jmp __bend // @end @@ -2312,19 +3177,19 @@ main: { jmp initNES1_disableVideoOutput1 // main::initNES1_disableVideoOutput1 initNES1_disableVideoOutput1: - // [8] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [9] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta PPU - // [9] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [10] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK jmp initNES1_disableAudioOutput1 // main::initNES1_disableAudioOutput1 initNES1_disableAudioOutput1: - // [10] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 -- _deref_pbuc1=vbuc2 + // [11] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 -- _deref_pbuc1=vbuc2 lda #$40 sta FR_COUNTER - // [11] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 -- _deref_pbuc1=vbuc2 + // [12] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 -- _deref_pbuc1=vbuc2 lda #$40 sta APU+OFFSET_STRUCT_RICOH_2A03_DMC_FREQ jmp initNES1_clearVBlankFlag1 @@ -2332,7 +3197,7 @@ main: { initNES1_clearVBlankFlag1: // asm { ldaPPU_PPUSTATUS } lda PPU_PPUSTATUS - // [13] phi from main::initNES1_clearVBlankFlag1 to main::initNES1_waitForVBlank1 [phi:main::initNES1_clearVBlankFlag1->main::initNES1_waitForVBlank1] + // [14] phi from main::initNES1_clearVBlankFlag1 to main::initNES1_waitForVBlank1 [phi:main::initNES1_clearVBlankFlag1->main::initNES1_waitForVBlank1] initNES1_waitForVBlank1_from_initNES1_clearVBlankFlag1: jmp initNES1_waitForVBlank1 // main::initNES1_waitForVBlank1 @@ -2340,53 +3205,53 @@ main: { jmp initNES1_waitForVBlank1___b1 // main::initNES1_waitForVBlank1_@1 initNES1_waitForVBlank1___b1: - // [14] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuaa=_deref_pbuc1_band_vbuc2 + // [15] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuaa=_deref_pbuc1_band_vbuc2 lda #$80 and PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS - // [15] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 -- vbuc1_eq_vbuaa_then_la1 + // [16] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 -- vbuc1_eq_vbuaa_then_la1 cmp #0 beq initNES1_waitForVBlank1___b1 - // [16] phi from main::initNES1_waitForVBlank1_@1 to main::initNES1_@1 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1] + // [17] phi from main::initNES1_waitForVBlank1_@1 to main::initNES1_@1 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1] initNES1___b1_from_initNES1_waitForVBlank1___b1: - // [16] phi (byte) main::initNES1_i#2 = (byte) 0 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1#0] -- vbuxx=vbuc1 + // [17] phi (byte) main::initNES1_i#2 = (byte) 0 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1#0] -- vbuxx=vbuc1 ldx #0 jmp initNES1___b1 - // [16] phi from main::initNES1_@1 to main::initNES1_@1 [phi:main::initNES1_@1->main::initNES1_@1] + // [17] phi from main::initNES1_@1 to main::initNES1_@1 [phi:main::initNES1_@1->main::initNES1_@1] initNES1___b1_from_initNES1___b1: - // [16] phi (byte) main::initNES1_i#2 = (byte) main::initNES1_i#1 [phi:main::initNES1_@1->main::initNES1_@1#0] -- register_copy + // [17] phi (byte) main::initNES1_i#2 = (byte) main::initNES1_i#1 [phi:main::initNES1_@1->main::initNES1_@1#0] -- register_copy jmp initNES1___b1 // main::initNES1_@1 initNES1___b1: - // [17] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [18] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 lda #0 sta MEMORY,x - // [18] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [19] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 lda #0 sta MEMORY+$100,x - // [19] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [20] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 lda #0 sta MEMORY+$200,x - // [20] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [21] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 lda #0 sta MEMORY+$300,x - // [21] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [22] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 lda #0 sta MEMORY+$400,x - // [22] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [23] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 lda #0 sta MEMORY+$500,x - // [23] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [24] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 lda #0 sta MEMORY+$600,x - // [24] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [25] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 lda #0 sta MEMORY+$700,x - // [25] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 -- vbuxx=_inc_vbuxx + // [26] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 -- vbuxx=_inc_vbuxx inx - // [26] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 -- vbuc1_neq_vbuxx_then_la1 + // [27] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 -- vbuc1_neq_vbuxx_then_la1 cpx #0 bne initNES1___b1_from_initNES1___b1 - // [27] phi from main::initNES1_@1 to main::initNES1_waitForVBlank2 [phi:main::initNES1_@1->main::initNES1_waitForVBlank2] + // [28] phi from main::initNES1_@1 to main::initNES1_waitForVBlank2 [phi:main::initNES1_@1->main::initNES1_waitForVBlank2] initNES1_waitForVBlank2_from_initNES1___b1: jmp initNES1_waitForVBlank2 // main::initNES1_waitForVBlank2 @@ -2394,10 +3259,10 @@ main: { jmp initNES1_waitForVBlank2___b1 // main::initNES1_waitForVBlank2_@1 initNES1_waitForVBlank2___b1: - // [28] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuaa=_deref_pbuc1_band_vbuc2 + // [29] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuaa=_deref_pbuc1_band_vbuc2 lda #$80 and PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS - // [29] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 -- vbuc1_eq_vbuaa_then_la1 + // [30] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 -- vbuc1_eq_vbuaa_then_la1 cmp #0 beq initNES1_waitForVBlank2___b1 jmp initNES1___b7 @@ -2405,80 +3270,80 @@ main: { initNES1___b7: // asm { ldaPPU_PPUSTATUS } lda PPU_PPUSTATUS - // [31] phi from main::initNES1_@7 to main::@4 [phi:main::initNES1_@7->main::@4] + // [32] phi from main::initNES1_@7 to main::@4 [phi:main::initNES1_@7->main::@4] __b4_from_initNES1___b7: jmp __b4 // main::@4 __b4: - // [32] call ppuDataTransfer + // [33] call ppuDataTransfer // Transfer the palette - // [58] phi from main::@4 to ppuDataTransfer [phi:main::@4->ppuDataTransfer] + // [59] phi from main::@4 to ppuDataTransfer [phi:main::@4->ppuDataTransfer] ppuDataTransfer_from___b4: jsr ppuDataTransfer - // [33] phi from main::@4 to main::@5 [phi:main::@4->main::@5] + // [34] phi from main::@4 to main::@5 [phi:main::@4->main::@5] __b5_from___b4: jmp __b5 // main::@5 __b5: - // [34] call ppuDataFill + // [35] call ppuDataFill // Fill the PPU attribute table - // [48] phi from main::@5 to ppuDataFill [phi:main::@5->ppuDataFill] + // [49] phi from main::@5 to ppuDataFill [phi:main::@5->ppuDataFill] ppuDataFill_from___b5: - // [48] phi (byte) ppuDataFill::val#4 = (byte) '*' [phi:main::@5->ppuDataFill#0] -- vbuxx=vbuc1 + // [49] phi (byte) ppuDataFill::val#4 = (byte) '*' [phi:main::@5->ppuDataFill#0] -- vbuxx=vbuc1 ldx #'*' - // [48] phi (word) ppuDataFill::size#3 = (word)(number) $20*(number) $1e [phi:main::@5->ppuDataFill#1] -- vwuz1=vwuc1 + // [49] phi (word) ppuDataFill::size#3 = (word)(number) $20*(number) $1e [phi:main::@5->ppuDataFill#1] -- vwuz1=vwuc1 lda #<$20*$1e sta.z ppuDataFill.size lda #>$20*$1e sta.z ppuDataFill.size+1 - // [48] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0 [phi:main::@5->ppuDataFill#2] -- pvoz1=pvoc1 + // [49] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0 [phi:main::@5->ppuDataFill#2] -- pvoz1=pvoc1 lda #PPU_NAME_TABLE_0 sta.z ppuDataFill.ppuDataPrepare1_ppuData+1 jsr ppuDataFill - // [35] phi from main::@5 to main::@6 [phi:main::@5->main::@6] + // [36] phi from main::@5 to main::@6 [phi:main::@5->main::@6] __b6_from___b5: jmp __b6 // main::@6 __b6: - // [36] call ppuDataFill - // [48] phi from main::@6 to ppuDataFill [phi:main::@6->ppuDataFill] + // [37] call ppuDataFill + // [49] phi from main::@6 to ppuDataFill [phi:main::@6->ppuDataFill] ppuDataFill_from___b6: - // [48] phi (byte) ppuDataFill::val#4 = (byte) 0 [phi:main::@6->ppuDataFill#0] -- vbuxx=vbuc1 + // [49] phi (byte) ppuDataFill::val#4 = (byte) 0 [phi:main::@6->ppuDataFill#0] -- vbuxx=vbuc1 ldx #0 - // [48] phi (word) ppuDataFill::size#3 = (byte) $40 [phi:main::@6->ppuDataFill#1] -- vwuz1=vbuc1 + // [49] phi (word) ppuDataFill::size#3 = (byte) $40 [phi:main::@6->ppuDataFill#1] -- vwuz1=vbuc1 lda #<$40 sta.z ppuDataFill.size lda #>$40 sta.z ppuDataFill.size+1 - // [48] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 [phi:main::@6->ppuDataFill#2] -- pvoz1=pvoc1 + // [49] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 [phi:main::@6->ppuDataFill#2] -- pvoz1=pvoc1 lda #PPU_ATTRIBUTE_TABLE_0 sta.z ppuDataFill.ppuDataPrepare1_ppuData+1 jsr ppuDataFill - // [37] phi from main::@6 to main::@1 [phi:main::@6->main::@1] + // [38] phi from main::@6 to main::@1 [phi:main::@6->main::@1] __b1_from___b6: - // [37] phi (byte) main::s#2 = (byte) 0 [phi:main::@6->main::@1#0] -- vbuxx=vbuc1 + // [38] phi (byte) main::s#2 = (byte) 0 [phi:main::@6->main::@1#0] -- vbuxx=vbuc1 ldx #0 jmp __b1 // Initialize Sprite Buffer with the SPRITE data // main::@1 __b1: - // [38] if((byte) main::s#2<(byte) $40) goto main::@2 -- vbuxx_lt_vbuc1_then_la1 + // [39] if((byte) main::s#2<(byte) $40) goto main::@2 -- vbuxx_lt_vbuc1_then_la1 cpx #$40 bcc __b2 jmp enableVideoOutput1 // main::enableVideoOutput1 enableVideoOutput1: - // [39] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 -- _deref_pbuc1=vbuc2 + // [40] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 -- _deref_pbuc1=vbuc2 lda #$80 sta PPU - // [40] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e -- _deref_pbuc1=vbuc2 + // [41] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e -- _deref_pbuc1=vbuc2 lda #$1e sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK - // [41] phi from main::@3 main::enableVideoOutput1 to main::@3 [phi:main::@3/main::enableVideoOutput1->main::@3] + // [42] phi from main::@3 main::enableVideoOutput1 to main::@3 [phi:main::@3/main::enableVideoOutput1->main::@3] __b3_from___b3: __b3_from_enableVideoOutput1: jmp __b3 @@ -2488,28 +3353,28 @@ main: { jmp __b3_from___b3 // main::@2 __b2: - // [42] (byte~) main::$7 ← (byte) main::s#2 << (byte) 2 -- vbuyy=vbuxx_rol_2 + // [43] (byte~) main::$7 ← (byte) main::s#2 << (byte) 2 -- vbuyy=vbuxx_rol_2 txa asl asl tay - // [43] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$7) ← (byte) 0 -- pbuc1_derefidx_vbuyy=vbuc2 + // [44] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$7) ← (byte) 0 -- pbuc1_derefidx_vbuyy=vbuc2 lda #0 sta SPRITE_BUFFER,y - // [44] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$7) ← *((const byte*) MESSAGE + (byte) main::s#2) -- pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuxx + // [45] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$7) ← *((const byte*) MESSAGE + (byte) main::s#2) -- pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuxx lda MESSAGE,x sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_TILE,y - // [45] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$7) ← (byte) 2 -- pbuc1_derefidx_vbuyy=vbuc2 + // [46] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$7) ← (byte) 2 -- pbuc1_derefidx_vbuyy=vbuc2 lda #2 sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES,y - // [46] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$7) ← (byte) 0 -- pbuc1_derefidx_vbuyy=vbuc2 + // [47] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$7) ← (byte) 0 -- pbuc1_derefidx_vbuyy=vbuc2 lda #0 sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X,y - // [47] (byte) main::s#1 ← ++ (byte) main::s#2 -- vbuxx=_inc_vbuxx + // [48] (byte) main::s#1 ← ++ (byte) main::s#2 -- vbuxx=_inc_vbuxx inx - // [37] phi from main::@2 to main::@1 [phi:main::@2->main::@1] + // [38] phi from main::@2 to main::@1 [phi:main::@2->main::@1] __b1_from___b2: - // [37] phi (byte) main::s#2 = (byte) main::s#1 [phi:main::@2->main::@1#0] -- register_copy + // [38] phi (byte) main::s#2 = (byte) main::s#1 [phi:main::@2->main::@1#0] -- register_copy jmp __b1 } // ppuDataFill @@ -2524,17 +3389,17 @@ ppuDataFill: { jmp ppuDataPrepare1 // ppuDataFill::ppuDataPrepare1 ppuDataPrepare1: - // [49] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuaa=_hi_pvoz1 + // [50] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuaa=_hi_pvoz1 lda.z ppuDataPrepare1_ppuData+1 - // [50] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 -- _deref_pbuc1=vbuaa + // [51] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 -- _deref_pbuc1=vbuaa sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR - // [51] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuaa=_lo_pvoz1 + // [52] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuaa=_lo_pvoz1 lda.z ppuDataPrepare1_ppuData - // [52] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$1 -- _deref_pbuc1=vbuaa + // [53] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$1 -- _deref_pbuc1=vbuaa sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR - // [53] phi from ppuDataFill::ppuDataPrepare1 to ppuDataFill::@1 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1] + // [54] phi from ppuDataFill::ppuDataPrepare1 to ppuDataFill::@1 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1] __b1_from_ppuDataPrepare1: - // [53] phi (word) ppuDataFill::i#2 = (word) 0 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1#0] -- vwuz1=vwuc1 + // [54] phi (word) ppuDataFill::i#2 = (word) 0 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1#0] -- vwuz1=vwuc1 lda #<0 sta.z i lda #>0 @@ -2543,7 +3408,7 @@ ppuDataFill: { // Transfer to PPU // ppuDataFill::@1 __b1: - // [54] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 -- vwuz1_lt_vwuz2_then_la1 + // [55] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 -- vwuz1_lt_vwuz2_then_la1 lda.z i+1 cmp.z size+1 bcc ppuDataPut1 @@ -2555,23 +3420,23 @@ ppuDataFill: { jmp __breturn // ppuDataFill::@return __breturn: - // [55] return + // [56] return rts // ppuDataFill::ppuDataPut1 ppuDataPut1: - // [56] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4 -- _deref_pbuc1=vbuxx + // [57] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4 -- _deref_pbuc1=vbuxx stx PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA jmp __b2 // ppuDataFill::@2 __b2: - // [57] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2 -- vwuz1=_inc_vwuz1 + // [58] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2 -- vwuz1=_inc_vwuz1 inc.z i bne !+ inc.z i+1 !: - // [53] phi from ppuDataFill::@2 to ppuDataFill::@1 [phi:ppuDataFill::@2->ppuDataFill::@1] + // [54] phi from ppuDataFill::@2 to ppuDataFill::@1 [phi:ppuDataFill::@2->ppuDataFill::@1] __b1_from___b2: - // [53] phi (word) ppuDataFill::i#2 = (word) ppuDataFill::i#1 [phi:ppuDataFill::@2->ppuDataFill::@1#0] -- register_copy + // [54] phi (word) ppuDataFill::i#2 = (word) ppuDataFill::i#1 [phi:ppuDataFill::@2->ppuDataFill::@1#0] -- register_copy jmp __b1 } // ppuDataTransfer @@ -2589,20 +3454,20 @@ ppuDataTransfer: { jmp ppuDataPrepare1 // ppuDataTransfer::ppuDataPrepare1 ppuDataPrepare1: - // [59] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 -- _deref_pbuc1=vbuc2 + // [60] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 -- _deref_pbuc1=vbuc2 lda #>ppuData sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR - // [60] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [61] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR - // [61] phi from ppuDataTransfer::ppuDataPrepare1 to ppuDataTransfer::@1 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1] + // [62] phi from ppuDataTransfer::ppuDataPrepare1 to ppuDataTransfer::@1 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1] __b1_from_ppuDataPrepare1: - // [61] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#0] -- pbuz1=pbuc1 + // [62] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#0] -- pbuz1=pbuc1 lda #cpuData sta.z cpuSrc+1 - // [61] phi (word) ppuDataTransfer::i#2 = (word) 0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#1] -- vwuz1=vwuc1 + // [62] phi (word) ppuDataTransfer::i#2 = (word) 0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#1] -- vwuz1=vwuc1 lda #<0 sta.z i lda #>0 @@ -2610,7 +3475,7 @@ ppuDataTransfer: { jmp __b1 // ppuDataTransfer::@1 __b1: - // [62] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 -- vwuz1_lt_vwuc1_then_la1 + // [63] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2 -- vwuz1_lt_vwuc1_then_la1 lda.z i+1 cmp #>size bcc __b2 @@ -2622,91 +3487,86 @@ ppuDataTransfer: { jmp __breturn // ppuDataTransfer::@return __breturn: - // [63] return + // [64] return rts // ppuDataTransfer::@2 __b2: - // [64] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) -- vbuaa=_deref_pbuz1 + // [65] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) -- vbuaa=_deref_pbuz1 ldy #0 lda (cpuSrc),y jmp ppuDataPut1 // ppuDataTransfer::ppuDataPut1 ppuDataPut1: - // [65] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 -- _deref_pbuc1=vbuaa + // [66] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 -- _deref_pbuc1=vbuaa sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA jmp __b3 // ppuDataTransfer::@3 __b3: - // [66] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 -- pbuz1=_inc_pbuz1 + // [67] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 -- pbuz1=_inc_pbuz1 inc.z cpuSrc bne !+ inc.z cpuSrc+1 !: - // [67] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2 -- vwuz1=_inc_vwuz1 + // [68] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2 -- vwuz1=_inc_vwuz1 inc.z i bne !+ inc.z i+1 !: - // [61] phi from ppuDataTransfer::@3 to ppuDataTransfer::@1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1] + // [62] phi from ppuDataTransfer::@3 to ppuDataTransfer::@1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1] __b1_from___b3: - // [61] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*) ppuDataTransfer::cpuSrc#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#0] -- register_copy - // [61] phi (word) ppuDataTransfer::i#2 = (word) ppuDataTransfer::i#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#1] -- register_copy + // [62] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*) ppuDataTransfer::cpuSrc#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#0] -- register_copy + // [62] phi (word) ppuDataTransfer::i#2 = (word) ppuDataTransfer::i#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#1] -- register_copy jmp __b1 } // vblank // NMI Called when the PPU refreshes the screen (also known as the V-Blank period) vblank: { - .label __4 = $c - .label y_idx = 8 - .label x_idx = 9 + .label __17 = $a + .label __19 = $a + .label __23 = $b + .label __25 = $b + .label __28 = $f + .label y_idx = 9 + .label x_idx = $a + .label x_idx_2 = $b + .label s = 8 // entry interrupt(HARDWARE_STACK) pha txa pha tya pha - // [68] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [69] *((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 - // [69] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [70] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL jmp ppuSpriteBufferDmaTransfer1 // vblank::ppuSpriteBufferDmaTransfer1 ppuSpriteBufferDmaTransfer1: - // [70] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [71] *((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 - // [71] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER -- _deref_pbuc1=vbuc2 + // [72] *((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 __b3 - // vblank::@3 - __b3: - // [72] (byte) vblank::y_idx#0 ← (volatile byte) y_sin_idx -- vbuz1=vbuz2 - // Update sprite positions - lda.z y_sin_idx - sta.z y_idx - // [73] (volatile byte) y_sin_idx ← ++ (volatile byte) y_sin_idx -- vbuz1=_inc_vbuz1 - inc.z y_sin_idx - // [74] (byte) vblank::x_idx#0 ← (volatile byte) x_sin_idx -- vbuz1=vbuz2 - lda.z x_sin_idx - sta.z x_idx - // [75] (volatile byte) x_sin_idx ← ++ (volatile byte) x_sin_idx -- vbuz1=_inc_vbuz1 - inc.z x_sin_idx - // [76] phi from vblank::@3 to vblank::@1 [phi:vblank::@3->vblank::@1] - __b1_from___b3: - // [76] phi (byte) vblank::x_idx#2 = (byte) vblank::x_idx#0 [phi:vblank::@3->vblank::@1#0] -- register_copy - // [76] phi (byte) vblank::y_idx#2 = (byte) vblank::y_idx#0 [phi:vblank::@3->vblank::@1#1] -- register_copy - // [76] phi (byte) vblank::s#2 = (byte) 0 [phi:vblank::@3->vblank::@1#2] -- vbuxx=vbuc1 - ldx #0 - jmp __b1 - // vblank::@1 - __b1: - // [77] if((byte) vblank::s#2<(byte) $40) goto vblank::@2 -- vbuxx_lt_vbuc1_then_la1 - cpx #$40 - bcc __b2 + // [73] phi from vblank::ppuSpriteBufferDmaTransfer1 to vblank::@14 [phi:vblank::ppuSpriteBufferDmaTransfer1->vblank::@14] + __b14_from_ppuSpriteBufferDmaTransfer1: + jmp __b14 + // vblank::@14 + __b14: + // [74] call readJoy1 + jsr readJoy1 + // [75] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2 + jmp __b15 + // vblank::@15 + __b15: + // [76] (byte) vblank::joy#0 ← (byte) readJoy1::return#2 + // [77] if((byte) 0==(byte) vblank::joy#0) goto vblank::@1 -- vbuc1_eq_vbuaa_then_la1 + cmp #0 + beq __b1 jmp __breturn // vblank::@return __breturn: @@ -2717,43 +3577,220 @@ vblank: { tax pla rti + // vblank::@1 + __b1: + // [79] (byte) vblank::y_idx#0 ← (volatile byte) y_sin_idx -- vbuz1=vbuz2 + // Update sprite positions + lda.z y_sin_idx + sta.z y_idx + // [80] (volatile byte) y_sin_idx ← ++ (volatile byte) y_sin_idx -- vbuz1=_inc_vbuz1 + inc.z y_sin_idx + // [81] if((volatile byte) x_sin_idx==(byte) $ee) goto vblank::@3 -- vbuz1_eq_vbuc1_then_la1 + lda #$ee + cmp.z x_sin_idx + beq __b3_from___b1 + jmp __b2 // vblank::@2 __b2: - // [79] (byte~) vblank::$4 ← (byte) vblank::s#2 << (byte) 2 -- vbuz1=vbuxx_rol_2 - txa - asl - asl - sta.z __4 - // [80] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) vblank::$4) ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::y_idx#2) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2 - ldy.z y_idx - lda SINTABLE,y - ldy.z __4 - sta SPRITE_BUFFER,y - // [81] (byte~) vblank::$2 ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::x_idx#2) + (byte) 8 -- vbuaa=pbuc1_derefidx_vbuz1_plus_vbuc2 - lda #8 - ldy.z x_idx - clc - adc SINTABLE,y - // [82] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) vblank::$4) ← (byte~) vblank::$2 -- pbuc1_derefidx_vbuz1=vbuaa - ldy.z __4 - sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X,y - // [83] (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 + (byte) 4 -- vbuz1=vbuz1_plus_vbuc1 - lda #4 - clc - adc.z y_idx - sta.z y_idx - // [84] (byte) vblank::x_idx#1 ← (byte) vblank::x_idx#2 - (byte) 7 -- vbuz1=vbuz1_minus_vbuc1 - lda.z x_idx - sec - sbc #7 - sta.z x_idx - // [85] (byte) vblank::s#1 ← ++ (byte) vblank::s#2 -- vbuxx=_inc_vbuxx + // [82] (byte~) vblank::$5 ← (volatile byte) x_sin_idx + (byte) 1 -- vbuxx=vbuz1_plus_1 + ldx.z x_sin_idx inx - // [76] phi from vblank::@2 to vblank::@1 [phi:vblank::@2->vblank::@1] + // [83] phi from vblank::@2 to vblank::@3 [phi:vblank::@2->vblank::@3] + __b3_from___b2: + // [83] phi (byte~) vblank::$7 = (byte~) vblank::$5 [phi:vblank::@2->vblank::@3#0] -- register_copy + jmp __b3 + // [83] phi from vblank::@1 to vblank::@3 [phi:vblank::@1->vblank::@3] + __b3_from___b1: + // [83] phi (byte~) vblank::$7 = (byte) 0 [phi:vblank::@1->vblank::@3#0] -- vbuxx=vbuc1 + ldx #0 + jmp __b3 + // vblank::@3 + __b3: + // [84] (volatile byte) x_sin_idx ← (byte~) vblank::$7 -- vbuz1=vbuxx + stx.z x_sin_idx + // [85] (byte) vblank::x_idx#0 ← (volatile byte) x_sin_idx -- vbuz1=vbuz2 + lda.z x_sin_idx + sta.z x_idx + // [86] if((volatile byte) x_sin_idx_2==(byte) $58) goto vblank::@5 -- vbuz1_eq_vbuc1_then_la1 + lda #$58 + cmp.z x_sin_idx_2 + beq __b5_from___b3 + jmp __b4 + // vblank::@4 + __b4: + // [87] (byte~) vblank::$10 ← (volatile byte) x_sin_idx_2 + (byte) 1 -- vbuxx=vbuz1_plus_1 + ldx.z x_sin_idx_2 + inx + // [88] phi from vblank::@4 to vblank::@5 [phi:vblank::@4->vblank::@5] + __b5_from___b4: + // [88] phi (byte~) vblank::$12 = (byte~) vblank::$10 [phi:vblank::@4->vblank::@5#0] -- register_copy + jmp __b5 + // [88] phi from vblank::@3 to vblank::@5 [phi:vblank::@3->vblank::@5] + __b5_from___b3: + // [88] phi (byte~) vblank::$12 = (byte) 0 [phi:vblank::@3->vblank::@5#0] -- vbuxx=vbuc1 + ldx #0 + jmp __b5 + // vblank::@5 + __b5: + // [89] (volatile byte) x_sin_idx_2 ← (byte~) vblank::$12 -- vbuz1=vbuxx + stx.z x_sin_idx_2 + // [90] (byte) vblank::x_idx_2#0 ← (volatile byte) x_sin_idx_2 -- vbuz1=vbuz2 + lda.z x_sin_idx_2 + sta.z x_idx_2 + // [91] phi from vblank::@5 to vblank::@6 [phi:vblank::@5->vblank::@6] + __b6_from___b5: + // [91] phi (byte) vblank::x_idx_2#2 = (byte) vblank::x_idx_2#0 [phi:vblank::@5->vblank::@6#0] -- register_copy + // [91] phi (byte) vblank::x_idx#2 = (byte) vblank::x_idx#0 [phi:vblank::@5->vblank::@6#1] -- register_copy + // [91] phi (byte) vblank::y_idx#2 = (byte) vblank::y_idx#0 [phi:vblank::@5->vblank::@6#2] -- register_copy + // [91] phi (byte) vblank::s#2 = (byte) 0 [phi:vblank::@5->vblank::@6#3] -- vbuz1=vbuc1 + lda #0 + sta.z s + jmp __b6 + // vblank::@6 + __b6: + // [92] if((byte) vblank::s#2<(byte) $40) goto vblank::@7 -- vbuz1_lt_vbuc1_then_la1 + lda.z s + cmp #$40 + bcc __b7 + jmp __breturn + // vblank::@7 + __b7: + // [93] (byte~) vblank::$28 ← (byte) vblank::s#2 << (byte) 2 -- vbuz1=vbuz2_rol_2 + lda.z s + asl + asl + sta.z __28 + // [94] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) vblank::$28) ← *((const to_nomodify byte*) SINTABLE_240 + (byte) vblank::y_idx#2) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2 + ldy.z y_idx + lda SINTABLE_240,y + ldy.z __28 + sta SPRITE_BUFFER,y + // [95] (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 - (byte) 4 -- vbuz1=vbuz1_minus_vbuc1 + lax.z y_idx + axs #4 + stx.z y_idx + // [96] (byte~) vblank::$14 ← *((const to_nomodify byte*) SINTABLE_184 + (byte) vblank::x_idx#2) + *((const to_nomodify byte*) SINTABLE_64 + (byte) vblank::x_idx_2#2) -- vbuaa=pbuc1_derefidx_vbuz1_plus_pbuc2_derefidx_vbuz2 + ldy.z x_idx + lda SINTABLE_184,y + ldy.z x_idx_2 + clc + adc SINTABLE_64,y + // [97] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) vblank::$28) ← (byte~) vblank::$14 -- pbuc1_derefidx_vbuz1=vbuaa + ldy.z __28 + sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X,y + // [98] if((byte) vblank::x_idx#2<(byte) 3) goto vblank::@8 -- vbuz1_lt_vbuc1_then_la1 + lda.z x_idx + cmp #3 + bcc __b8 + jmp __b9 + // vblank::@9 + __b9: + // [99] (byte~) vblank::$17 ← (byte) vblank::x_idx#2 - (byte) 3 -- vbuz1=vbuz1_minus_vbuc1 + lax.z __17 + axs #3 + stx.z __17 + // [100] phi from vblank::@8 vblank::@9 to vblank::@10 [phi:vblank::@8/vblank::@9->vblank::@10] + __b10_from___b8: + __b10_from___b9: + // [100] phi (byte) vblank::x_idx#1 = (byte~) vblank::$19 [phi:vblank::@8/vblank::@9->vblank::@10#0] -- register_copy + jmp __b10 + // vblank::@10 + __b10: + // [101] if((byte) vblank::x_idx_2#2>=(byte) $56) goto vblank::@11 -- vbuz1_ge_vbuc1_then_la1 + lda.z x_idx_2 + cmp #$56 + bcs __b11 + jmp __b12 + // vblank::@12 + __b12: + // [102] (byte~) vblank::$23 ← (byte) vblank::x_idx_2#2 + (byte) 3 -- vbuz1=vbuz1_plus_vbuc1 + lax.z __23 + axs #-[3] + stx.z __23 + // [103] phi from vblank::@11 vblank::@12 to vblank::@13 [phi:vblank::@11/vblank::@12->vblank::@13] + __b13_from___b11: + __b13_from___b12: + // [103] phi (byte) vblank::x_idx_2#1 = (byte~) vblank::$25 [phi:vblank::@11/vblank::@12->vblank::@13#0] -- register_copy + jmp __b13 + // vblank::@13 + __b13: + // [104] (byte) vblank::s#1 ← ++ (byte) vblank::s#2 -- vbuz1=_inc_vbuz1 + inc.z s + // [91] phi from vblank::@13 to vblank::@6 [phi:vblank::@13->vblank::@6] + __b6_from___b13: + // [91] phi (byte) vblank::x_idx_2#2 = (byte) vblank::x_idx_2#1 [phi:vblank::@13->vblank::@6#0] -- register_copy + // [91] phi (byte) vblank::x_idx#2 = (byte) vblank::x_idx#1 [phi:vblank::@13->vblank::@6#1] -- register_copy + // [91] phi (byte) vblank::y_idx#2 = (byte) vblank::y_idx#1 [phi:vblank::@13->vblank::@6#2] -- register_copy + // [91] phi (byte) vblank::s#2 = (byte) vblank::s#1 [phi:vblank::@13->vblank::@6#3] -- register_copy + jmp __b6 + // vblank::@11 + __b11: + // [105] (byte~) vblank::$25 ← (byte) vblank::x_idx_2#2 - (byte) $56 -- vbuz1=vbuz1_minus_vbuc1 + lax.z __25 + axs #$56 + stx.z __25 + jmp __b13_from___b11 + // vblank::@8 + __b8: + // [106] (byte~) vblank::$19 ← (byte) vblank::x_idx#2 + (byte) $ec -- vbuz1=vbuz1_plus_vbuc1 + lax.z __19 + axs #-[$ec] + stx.z __19 + jmp __b10_from___b8 +} + // readJoy1 +// Read Standard Controller #1 +// Returns a byte representing the pushed buttons +// - bit 0: right +// - bit 1: left +// - bit 2: down +// - bit 3: up +// - bit 4: start +// - bit 5: select +// - bit 6: B +// - bit 7: A +readJoy1: { + .label __1 = $10 + // [107] *((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 + // [108] *((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 + // [109] phi from readJoy1 to readJoy1::@1 [phi:readJoy1->readJoy1::@1] + __b1_from_readJoy1: + // [109] phi (byte) readJoy1::joy#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#0] -- vbuaa=vbuc1 + lda #0 + // [109] phi (byte) readJoy1::i#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#1] -- vbuxx=vbuc1 + ldx #0 + jmp __b1 + // readJoy1::@1 + __b1: + // [110] if((byte) readJoy1::i#2<(byte) 8) goto readJoy1::@2 -- vbuxx_lt_vbuc1_then_la1 + cpx #8 + bcc __b2 + jmp __breturn + // readJoy1::@return + __breturn: + // [111] return + rts + // readJoy1::@2 + __b2: + // [112] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 -- vbuz1=vbuaa_rol_1 + asl + sta.z __1 + // [113] (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 + // [114] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2 -- vbuaa=vbuz1_bor_vbuaa + ora.z __1 + // [115] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2 -- vbuxx=_inc_vbuxx + inx + // [109] phi from readJoy1::@2 to readJoy1::@1 [phi:readJoy1::@2->readJoy1::@1] __b1_from___b2: - // [76] phi (byte) vblank::x_idx#2 = (byte) vblank::x_idx#1 [phi:vblank::@2->vblank::@1#0] -- register_copy - // [76] phi (byte) vblank::y_idx#2 = (byte) vblank::y_idx#1 [phi:vblank::@2->vblank::@1#1] -- register_copy - // [76] phi (byte) vblank::s#2 = (byte) vblank::s#1 [phi:vblank::@2->vblank::@1#2] -- register_copy + // [109] phi (byte) readJoy1::joy#2 = (byte) readJoy1::joy#1 [phi:readJoy1::@2->readJoy1::@1#0] -- register_copy + // [109] phi (byte) readJoy1::i#2 = (byte) readJoy1::i#1 [phi:readJoy1::@2->readJoy1::@1#1] -- register_copy jmp __b1 } // File Data @@ -2763,9 +3800,17 @@ vblank: { // Color Palette PALETTE: .byte 1, $21, $f, $30, 1, $21, $f, $30, 1, $21, $f, $30, 1, $21, $f, $30, 1, $f, $30, 8, 1, $f, $18, 8, 1, $30, $37, $1a, $f, $f, $f, $f // Sinus Table (0-239) -SINTABLE: +SINTABLE_240: .fill $100, round(115.5+107.5*sin(2*PI*i/256)) + // Sinus Table (0-63) +SINTABLE_64: +.fill 89, round(52.5+52.5*sin(2*PI*i/89)) + + // Sinus Table (0-183) +SINTABLE_184: +.fill 239, round(71.5+71.5*sin(2*PI*i/239)) + .segment Tiles TILES: .var filechargen = LoadBinary("characters.901225-01.bin") @@ -2812,7 +3857,18 @@ Removing instruction jmp __breturn Removing instruction jmp ppuDataPut1 Removing instruction jmp __b3 Removing instruction jmp ppuSpriteBufferDmaTransfer1 +Removing instruction jmp __b14 +Removing instruction jmp __b15 +Removing instruction jmp __breturn +Removing instruction jmp __b2 Removing instruction jmp __b3 +Removing instruction jmp __b4 +Removing instruction jmp __b5 +Removing instruction jmp __b6 +Removing instruction jmp __b9 +Removing instruction jmp __b10 +Removing instruction jmp __b12 +Removing instruction jmp __b13 Removing instruction jmp __b1 Removing instruction jmp __breturn Succesful ASM optimization Pass5NextJumpElimination @@ -2828,10 +3884,15 @@ Removing instruction lda #0 Removing instruction lda #>0 Removing instruction lda #>0 Removing instruction lda #0 +Replacing instruction lda.z x_sin_idx with TXA +Replacing instruction lda.z x_sin_idx_2 with TXA +Replacing instruction ldx #0 with TAX Succesful ASM optimization Pass5UnnecesaryLoadElimination Replacing label initNES1_waitForVBlank1___b1 with initNES1_waitForVBlank1 Replacing label initNES1___b1_from_initNES1___b1 with initNES1___b1 Replacing label initNES1_waitForVBlank2___b1 with initNES1_waitForVBlank2 +Replacing label __b13_from___b11 with __b13 +Replacing label __b10_from___b8 with __b10 Removing instruction __b1: Removing instruction __b2_from___b1: Removing instruction main_from___b2: @@ -2846,6 +3907,11 @@ Removing instruction __b5_from___b4: Removing instruction __b6_from___b5: Removing instruction ppuDataFill_from___b6: Removing instruction __b3_from_enableVideoOutput1: +Removing instruction __b14_from_ppuSpriteBufferDmaTransfer1: +Removing instruction __b10_from___b8: +Removing instruction __b10_from___b9: +Removing instruction __b13_from___b11: +Removing instruction __b13_from___b12: Succesful ASM optimization Pass5RedundantLabelElimination Removing instruction __b2: Removing instruction __bend: @@ -2876,18 +3942,30 @@ Removing instruction ppuDataPut1: Removing instruction __b3: Removing instruction __b1_from___b3: Removing instruction ppuSpriteBufferDmaTransfer1: -Removing instruction __b3: -Removing instruction __b1_from___b3: +Removing instruction __b14: +Removing instruction __b15: +Removing instruction __b2: +Removing instruction __b3_from___b2: +Removing instruction __b4: +Removing instruction __b5_from___b4: +Removing instruction __b6_from___b5: +Removing instruction __b9: +Removing instruction __b12: +Removing instruction __b6_from___b13: +Removing instruction __b1_from_readJoy1: Removing instruction __breturn: Removing instruction __b1_from___b2: Succesful ASM optimization Pass5UnusedLabelElimination Relabelling long label __b3_from___b3 to __b3 +Relabelling long label __b3_from___b1 to __b2 +Relabelling long label __b5_from___b3 to __b4 Succesful ASM optimization Pass5RelabelLongLabels Adding RTS to root block Succesful ASM optimization Pass5AddMainRts Removing instruction jmp initNES1___b1 Succesful ASM optimization Pass5NextJumpElimination Removing instruction lda #0 +Removing instruction lda #0 Succesful ASM optimization Pass5UnnecesaryLoadElimination FINAL SYMBOL TABLE @@ -2900,6 +3978,7 @@ FINAL SYMBOL TABLE (const nomodify byte*) MEMORY = (byte*) 0 (const byte*) MESSAGE[(number) $40] = (byte*) "rex-of-camelot-presents-a-dxycp-on-nintendo-entertainment-system"z (const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = (byte) $10 +(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1 = (byte) $16 (const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA = (byte) $14 (const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR = (byte) 3 (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR = (byte) 6 @@ -2948,7 +4027,11 @@ FINAL SYMBOL TABLE (byte) RICOH_2C02::PPUMASK (byte) RICOH_2C02::PPUSCROLL (volatile byte) RICOH_2C02::PPUSTATUS loadstore -(const to_nomodify byte*) SINTABLE[(number) $100] = kickasm {{ .fill $100, round(115.5+107.5*sin(2*PI*i/256)) +(const to_nomodify byte*) SINTABLE_184[(number) $ef] = kickasm {{ .fill 239, round(71.5+71.5*sin(2*PI*i/239)) + }} +(const to_nomodify byte*) SINTABLE_240[(number) $100] = kickasm {{ .fill $100, round(115.5+107.5*sin(2*PI*i/256)) + }} +(const to_nomodify byte*) SINTABLE_64[(number) $59] = kickasm {{ .fill 89, round(52.5+52.5*sin(2*PI*i/89)) }} (const byte) SIZEOF_BYTE = (byte) 1 (const struct SpriteData*) SPRITE_BUFFER[(number) $100] = { fill( $100, 0) } @@ -3033,28 +4116,69 @@ FINAL SYMBOL TABLE (byte) ppuDataTransfer::ppuDataPut1_val#0 reg byte a 2002.0 (word) ppuDataTransfer::size (const word) ppuDataTransfer::size#0 size = (byte) $20*(const byte) SIZEOF_BYTE +(byte()) readJoy1() +(byte~) readJoy1::$1 zp[1]:16 101.0 +(byte~) readJoy1::$2 reg byte a 202.0 +(label) readJoy1::@1 +(label) readJoy1::@2 +(label) readJoy1::@return +(byte) readJoy1::i +(byte) readJoy1::i#1 reg byte x 202.0 +(byte) readJoy1::i#2 reg byte x 60.599999999999994 +(byte) readJoy1::joy +(byte) readJoy1::joy#1 reg byte a 101.0 +(byte) readJoy1::joy#2 reg byte a 51.0 +(byte) readJoy1::return +(byte) readJoy1::return#2 reg byte a 4.0 interrupt(HARDWARE_STACK)(void()) vblank() -(byte~) vblank::$2 reg byte a 22.0 -(byte~) vblank::$4 zp[1]:12 11.0 +(byte~) vblank::$10 reg byte x 4.0 +(byte~) vblank::$12 reg byte x 4.0 +(byte~) vblank::$14 reg byte a 22.0 +(byte~) vblank::$17 zp[1]:10 22.0 +(byte~) vblank::$19 zp[1]:10 22.0 +(byte~) vblank::$23 zp[1]:11 22.0 +(byte~) vblank::$25 zp[1]:11 22.0 +(byte~) vblank::$28 zp[1]:15 8.25 +(byte~) vblank::$5 reg byte x 4.0 +(byte~) vblank::$7 reg byte x 4.0 (label) vblank::@1 +(label) vblank::@10 +(label) vblank::@11 +(label) vblank::@12 +(label) vblank::@13 +(label) vblank::@14 +(label) vblank::@15 (label) vblank::@2 (label) vblank::@3 +(label) vblank::@4 +(label) vblank::@5 +(label) vblank::@6 +(label) vblank::@7 +(label) vblank::@8 +(label) vblank::@9 (label) vblank::@return +(byte) vblank::joy +(byte) vblank::joy#0 reg byte a 4.0 (label) vblank::ppuSpriteBufferDmaTransfer1 (struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer (byte) vblank::s -(byte) vblank::s#1 reg byte x 22.0 -(byte) vblank::s#2 reg byte x 5.5 +(byte) vblank::s#1 s zp[1]:8 22.0 +(byte) vblank::s#2 s zp[1]:8 2.933333333333333 (byte) vblank::x_idx -(byte) vblank::x_idx#0 x_idx zp[1]:9 2.0 -(byte) vblank::x_idx#1 x_idx zp[1]:9 11.0 -(byte) vblank::x_idx#2 x_idx zp[1]:9 5.0 +(byte) vblank::x_idx#0 x_idx zp[1]:10 0.6666666666666666 +(byte) vblank::x_idx#1 x_idx zp[1]:10 5.5 +(byte) vblank::x_idx#2 x_idx zp[1]:10 7.125 +(byte) vblank::x_idx_2 +(byte) vblank::x_idx_2#0 x_idx_2 zp[1]:11 4.0 +(byte) vblank::x_idx_2#1 x_idx_2 zp[1]:11 16.5 +(byte) vblank::x_idx_2#2 x_idx_2 zp[1]:11 4.75 (byte) vblank::y_idx -(byte) vblank::y_idx#0 y_idx zp[1]:8 1.0 -(byte) vblank::y_idx#1 y_idx zp[1]:8 7.333333333333333 -(byte) vblank::y_idx#2 y_idx zp[1]:8 5.833333333333333 -(volatile byte) x_sin_idx loadstore zp[1]:11 1.1428571428571428 -(volatile byte) y_sin_idx loadstore zp[1]:10 1.6 +(byte) vblank::y_idx#0 y_idx zp[1]:9 0.3333333333333333 +(byte) vblank::y_idx#1 y_idx zp[1]:9 1.8333333333333333 +(byte) vblank::y_idx#2 y_idx zp[1]:9 8.75 +(volatile byte) x_sin_idx loadstore zp[1]:13 0.7692307692307693 +(volatile byte) x_sin_idx_2 loadstore zp[1]:14 0.5555555555555556 +(volatile byte) y_sin_idx loadstore zp[1]:12 0.8 reg byte x [ main::initNES1_i#2 main::initNES1_i#1 ] reg byte x [ main::s#2 main::s#1 ] @@ -3062,23 +4186,33 @@ reg byte x [ ppuDataFill::val#4 ] zp[2]:2 [ ppuDataFill::i#2 ppuDataFill::i#1 ] zp[2]:4 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ppuDataFill::ppuDataPrepare1_ppuData#0 ] zp[2]:6 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ppuDataFill::size#3 ] -reg byte x [ vblank::s#2 vblank::s#1 ] -zp[1]:8 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] -zp[1]:9 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 ] -zp[1]:10 [ y_sin_idx ] -zp[1]:11 [ x_sin_idx ] +reg byte x [ vblank::$7 vblank::$5 ] +reg byte x [ vblank::$12 vblank::$10 ] +zp[1]:8 [ vblank::s#2 vblank::s#1 ] +zp[1]:9 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] +zp[1]:10 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 vblank::$19 vblank::$17 ] +zp[1]:11 [ vblank::x_idx_2#2 vblank::x_idx_2#1 vblank::x_idx_2#0 vblank::$25 vblank::$23 ] +reg byte x [ readJoy1::i#2 readJoy1::i#1 ] +reg byte a [ readJoy1::joy#2 readJoy1::joy#1 ] +zp[1]:12 [ y_sin_idx ] +zp[1]:13 [ x_sin_idx ] +zp[1]:14 [ x_sin_idx_2 ] reg byte a [ main::initNES1_waitForVBlank1_$0 ] reg byte a [ main::initNES1_waitForVBlank2_$0 ] reg byte y [ main::$7 ] reg byte a [ ppuDataFill::ppuDataPrepare1_$0 ] reg byte a [ ppuDataFill::ppuDataPrepare1_$1 ] reg byte a [ ppuDataTransfer::ppuDataPut1_val#0 ] -zp[1]:12 [ vblank::$4 ] -reg byte a [ vblank::$2 ] +reg byte a [ readJoy1::return#2 ] +reg byte a [ vblank::joy#0 ] +zp[1]:15 [ vblank::$28 ] +reg byte a [ vblank::$14 ] +zp[1]:16 [ readJoy1::$1 ] +reg byte a [ readJoy1::$2 ] FINAL ASSEMBLER -Score: 3582 +Score: 4504 // File Comments // NES DXYCP using sprites @@ -3130,6 +4264,7 @@ Score: 3582 .const OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = 2 .const OFFSET_STRUCT_RICOH_2C02_OAMADDR = 3 .const OFFSET_STRUCT_RICOH_2A03_OAMDMA = $14 + .const OFFSET_STRUCT_RICOH_2A03_JOY1 = $16 .const OFFSET_STRUCT_RICOH_2C02_PPUADDR = 6 .const OFFSET_STRUCT_RICOH_2C02_PPUDATA = 7 .const OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = 5 @@ -3161,8 +4296,9 @@ Score: 3582 .label PPU = $2000 // NES CPU and audion processing unit (APU) .label APU = $4000 - .label y_sin_idx = $a - .label x_sin_idx = $b + .label y_sin_idx = $c + .label x_sin_idx = $d + .label x_sin_idx_2 = $e // @begin __bbegin: // @1 @@ -3176,13 +4312,18 @@ __bbegin: // Index into the X sine lda #$49 sta.z x_sin_idx - // [3] phi from @1 to @2 [phi:@1->@2] + // x_sin_idx_2 = 82 + // [3] (volatile byte) x_sin_idx_2 ← (byte) $52 -- vbuz1=vbuc1 + // Index into the small X sine + lda #$52 + sta.z x_sin_idx_2 + // [4] phi from @1 to @2 [phi:@1->@2] // @2 - // [4] call main - // [6] phi from @2 to main [phi:@2->main] + // [5] call main + // [7] phi from @2 to main [phi:@2->main] jsr main rts - // [5] phi from @2 to @end [phi:@2->@end] + // [6] phi from @2 to @end [phi:@2->@end] // @end .segment Code // main @@ -3196,154 +4337,154 @@ main: { txs // main::initNES1_disableVideoOutput1 // PPU->PPUCTRL = 0 - // [8] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [9] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 -- _deref_pbuc1=vbuc2 lda #0 sta PPU // PPU->PPUMASK = 0 - // [9] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [10] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 -- _deref_pbuc1=vbuc2 sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK // main::initNES1_disableAudioOutput1 // *FR_COUNTER = 0b01000000 - // [10] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 -- _deref_pbuc1=vbuc2 + // [11] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 -- _deref_pbuc1=vbuc2 lda #$40 sta FR_COUNTER // APU->DMC_FREQ = 0b01000000 - // [11] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 -- _deref_pbuc1=vbuc2 + // [12] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 -- _deref_pbuc1=vbuc2 sta APU+OFFSET_STRUCT_RICOH_2A03_DMC_FREQ // main::initNES1_clearVBlankFlag1 // asm // asm { ldaPPU_PPUSTATUS } lda PPU_PPUSTATUS - // [13] phi from main::initNES1_clearVBlankFlag1 to main::initNES1_waitForVBlank1 [phi:main::initNES1_clearVBlankFlag1->main::initNES1_waitForVBlank1] + // [14] phi from main::initNES1_clearVBlankFlag1 to main::initNES1_waitForVBlank1 [phi:main::initNES1_clearVBlankFlag1->main::initNES1_waitForVBlank1] // main::initNES1_waitForVBlank1 initNES1_waitForVBlank1: // main::initNES1_waitForVBlank1_@1 // PPU->PPUSTATUS&0x80 - // [14] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuaa=_deref_pbuc1_band_vbuc2 + // [15] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuaa=_deref_pbuc1_band_vbuc2 lda #$80 and PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS // while(!(PPU->PPUSTATUS&0x80)) - // [15] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 -- vbuc1_eq_vbuaa_then_la1 + // [16] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 -- vbuc1_eq_vbuaa_then_la1 cmp #0 beq initNES1_waitForVBlank1 - // [16] phi from main::initNES1_waitForVBlank1_@1 to main::initNES1_@1 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1] - // [16] phi (byte) main::initNES1_i#2 = (byte) 0 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1#0] -- vbuxx=vbuc1 + // [17] phi from main::initNES1_waitForVBlank1_@1 to main::initNES1_@1 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1] + // [17] phi (byte) main::initNES1_i#2 = (byte) 0 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1#0] -- vbuxx=vbuc1 ldx #0 - // [16] phi from main::initNES1_@1 to main::initNES1_@1 [phi:main::initNES1_@1->main::initNES1_@1] - // [16] phi (byte) main::initNES1_i#2 = (byte) main::initNES1_i#1 [phi:main::initNES1_@1->main::initNES1_@1#0] -- register_copy + // [17] phi from main::initNES1_@1 to main::initNES1_@1 [phi:main::initNES1_@1->main::initNES1_@1] + // [17] phi (byte) main::initNES1_i#2 = (byte) main::initNES1_i#1 [phi:main::initNES1_@1->main::initNES1_@1#0] -- register_copy // main::initNES1_@1 initNES1___b1: // (MEMORY+0x000)[i] = 0 - // [17] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [18] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 lda #0 sta MEMORY,x // (MEMORY+0x100)[i] = 0 - // [18] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [19] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 sta MEMORY+$100,x // (MEMORY+0x200)[i] = 0 - // [19] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [20] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 sta MEMORY+$200,x // (MEMORY+0x300)[i] = 0 - // [20] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [21] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 sta MEMORY+$300,x // (MEMORY+0x400)[i] = 0 - // [21] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [22] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 sta MEMORY+$400,x // (MEMORY+0x500)[i] = 0 - // [22] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [23] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 sta MEMORY+$500,x // (MEMORY+0x600)[i] = 0 - // [23] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [24] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 sta MEMORY+$600,x // (MEMORY+0x700)[i] = 0 - // [24] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + // [25] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 sta MEMORY+$700,x // while (++i) - // [25] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 -- vbuxx=_inc_vbuxx + // [26] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 -- vbuxx=_inc_vbuxx inx - // [26] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 -- vbuc1_neq_vbuxx_then_la1 + // [27] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 -- vbuc1_neq_vbuxx_then_la1 cpx #0 bne initNES1___b1 - // [27] phi from main::initNES1_@1 to main::initNES1_waitForVBlank2 [phi:main::initNES1_@1->main::initNES1_waitForVBlank2] + // [28] phi from main::initNES1_@1 to main::initNES1_waitForVBlank2 [phi:main::initNES1_@1->main::initNES1_waitForVBlank2] // main::initNES1_waitForVBlank2 initNES1_waitForVBlank2: // main::initNES1_waitForVBlank2_@1 // PPU->PPUSTATUS&0x80 - // [28] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuaa=_deref_pbuc1_band_vbuc2 + // [29] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 -- vbuaa=_deref_pbuc1_band_vbuc2 lda #$80 and PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS // while(!(PPU->PPUSTATUS&0x80)) - // [29] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 -- vbuc1_eq_vbuaa_then_la1 + // [30] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 -- vbuc1_eq_vbuaa_then_la1 cmp #0 beq initNES1_waitForVBlank2 // main::initNES1_@7 // asm // asm { ldaPPU_PPUSTATUS } lda PPU_PPUSTATUS - // [31] phi from main::initNES1_@7 to main::@4 [phi:main::initNES1_@7->main::@4] + // [32] phi from main::initNES1_@7 to main::@4 [phi:main::initNES1_@7->main::@4] // main::@4 // ppuDataTransfer(PPU_PALETTE, PALETTE, sizeof(PALETTE)) - // [32] call ppuDataTransfer + // [33] call ppuDataTransfer // Transfer the palette - // [58] phi from main::@4 to ppuDataTransfer [phi:main::@4->ppuDataTransfer] + // [59] phi from main::@4 to ppuDataTransfer [phi:main::@4->ppuDataTransfer] jsr ppuDataTransfer - // [33] phi from main::@4 to main::@5 [phi:main::@4->main::@5] + // [34] phi from main::@4 to main::@5 [phi:main::@4->main::@5] // main::@5 // ppuDataFill(PPU_NAME_TABLE_0, '*', 32*30) - // [34] call ppuDataFill + // [35] call ppuDataFill // Fill the PPU attribute table - // [48] phi from main::@5 to ppuDataFill [phi:main::@5->ppuDataFill] - // [48] phi (byte) ppuDataFill::val#4 = (byte) '*' [phi:main::@5->ppuDataFill#0] -- vbuxx=vbuc1 + // [49] phi from main::@5 to ppuDataFill [phi:main::@5->ppuDataFill] + // [49] phi (byte) ppuDataFill::val#4 = (byte) '*' [phi:main::@5->ppuDataFill#0] -- vbuxx=vbuc1 ldx #'*' - // [48] phi (word) ppuDataFill::size#3 = (word)(number) $20*(number) $1e [phi:main::@5->ppuDataFill#1] -- vwuz1=vwuc1 + // [49] phi (word) ppuDataFill::size#3 = (word)(number) $20*(number) $1e [phi:main::@5->ppuDataFill#1] -- vwuz1=vwuc1 lda #<$20*$1e sta.z ppuDataFill.size lda #>$20*$1e sta.z ppuDataFill.size+1 - // [48] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0 [phi:main::@5->ppuDataFill#2] -- pvoz1=pvoc1 + // [49] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0 [phi:main::@5->ppuDataFill#2] -- pvoz1=pvoc1 lda #PPU_NAME_TABLE_0 sta.z ppuDataFill.ppuDataPrepare1_ppuData+1 jsr ppuDataFill - // [35] phi from main::@5 to main::@6 [phi:main::@5->main::@6] + // [36] phi from main::@5 to main::@6 [phi:main::@5->main::@6] // main::@6 // ppuDataFill(PPU_ATTRIBUTE_TABLE_0, 0, 0x40) - // [36] call ppuDataFill - // [48] phi from main::@6 to ppuDataFill [phi:main::@6->ppuDataFill] - // [48] phi (byte) ppuDataFill::val#4 = (byte) 0 [phi:main::@6->ppuDataFill#0] -- vbuxx=vbuc1 + // [37] call ppuDataFill + // [49] phi from main::@6 to ppuDataFill [phi:main::@6->ppuDataFill] + // [49] phi (byte) ppuDataFill::val#4 = (byte) 0 [phi:main::@6->ppuDataFill#0] -- vbuxx=vbuc1 ldx #0 - // [48] phi (word) ppuDataFill::size#3 = (byte) $40 [phi:main::@6->ppuDataFill#1] -- vwuz1=vbuc1 + // [49] phi (word) ppuDataFill::size#3 = (byte) $40 [phi:main::@6->ppuDataFill#1] -- vwuz1=vbuc1 lda #<$40 sta.z ppuDataFill.size lda #>$40 sta.z ppuDataFill.size+1 - // [48] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 [phi:main::@6->ppuDataFill#2] -- pvoz1=pvoc1 + // [49] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 [phi:main::@6->ppuDataFill#2] -- pvoz1=pvoc1 lda #PPU_ATTRIBUTE_TABLE_0 sta.z ppuDataFill.ppuDataPrepare1_ppuData+1 jsr ppuDataFill - // [37] phi from main::@6 to main::@1 [phi:main::@6->main::@1] - // [37] phi (byte) main::s#2 = (byte) 0 [phi:main::@6->main::@1#0] -- vbuxx=vbuc1 + // [38] phi from main::@6 to main::@1 [phi:main::@6->main::@1] + // [38] phi (byte) main::s#2 = (byte) 0 [phi:main::@6->main::@1#0] -- vbuxx=vbuc1 ldx #0 // Initialize Sprite Buffer with the SPRITE data // main::@1 __b1: // for(char s=0;s<0x40;s++) - // [38] if((byte) main::s#2<(byte) $40) goto main::@2 -- vbuxx_lt_vbuc1_then_la1 + // [39] if((byte) main::s#2<(byte) $40) goto main::@2 -- vbuxx_lt_vbuc1_then_la1 cpx #$40 bcc __b2 // main::enableVideoOutput1 // PPU->PPUCTRL = 0b10000000 - // [39] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 -- _deref_pbuc1=vbuc2 + // [40] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 -- _deref_pbuc1=vbuc2 lda #$80 sta PPU // PPU->PPUMASK = 0b00011110 - // [40] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e -- _deref_pbuc1=vbuc2 + // [41] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e -- _deref_pbuc1=vbuc2 lda #$1e sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK - // [41] phi from main::@3 main::enableVideoOutput1 to main::@3 [phi:main::@3/main::enableVideoOutput1->main::@3] + // [42] phi from main::@3 main::enableVideoOutput1 to main::@3 [phi:main::@3/main::enableVideoOutput1->main::@3] __b3: // Infinite loop // main::@3 @@ -3351,28 +4492,28 @@ main: { // main::@2 __b2: // SPRITE_BUFFER[s] = { 0, MESSAGE[s], 0b00000010, 0 } - // [42] (byte~) main::$7 ← (byte) main::s#2 << (byte) 2 -- vbuyy=vbuxx_rol_2 + // [43] (byte~) main::$7 ← (byte) main::s#2 << (byte) 2 -- vbuyy=vbuxx_rol_2 txa asl asl tay - // [43] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$7) ← (byte) 0 -- pbuc1_derefidx_vbuyy=vbuc2 + // [44] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$7) ← (byte) 0 -- pbuc1_derefidx_vbuyy=vbuc2 lda #0 sta SPRITE_BUFFER,y - // [44] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$7) ← *((const byte*) MESSAGE + (byte) main::s#2) -- pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuxx + // [45] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$7) ← *((const byte*) MESSAGE + (byte) main::s#2) -- pbuc1_derefidx_vbuyy=pbuc2_derefidx_vbuxx lda MESSAGE,x sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_TILE,y - // [45] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$7) ← (byte) 2 -- pbuc1_derefidx_vbuyy=vbuc2 + // [46] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$7) ← (byte) 2 -- pbuc1_derefidx_vbuyy=vbuc2 lda #2 sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES,y - // [46] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$7) ← (byte) 0 -- pbuc1_derefidx_vbuyy=vbuc2 + // [47] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$7) ← (byte) 0 -- pbuc1_derefidx_vbuyy=vbuc2 lda #0 sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X,y // for(char s=0;s<0x40;s++) - // [47] (byte) main::s#1 ← ++ (byte) main::s#2 -- vbuxx=_inc_vbuxx + // [48] (byte) main::s#1 ← ++ (byte) main::s#2 -- vbuxx=_inc_vbuxx inx - // [37] phi from main::@2 to main::@1 [phi:main::@2->main::@1] - // [37] phi (byte) main::s#2 = (byte) main::s#1 [phi:main::@2->main::@1#0] -- register_copy + // [38] phi from main::@2 to main::@1 [phi:main::@2->main::@1] + // [38] phi (byte) main::s#2 = (byte) main::s#1 [phi:main::@2->main::@1#0] -- register_copy jmp __b1 } // ppuDataFill @@ -3386,19 +4527,19 @@ ppuDataFill: { .label size = 6 // ppuDataFill::ppuDataPrepare1 // >ppuData - // [49] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuaa=_hi_pvoz1 + // [50] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuaa=_hi_pvoz1 lda.z ppuDataPrepare1_ppuData+1 // PPU->PPUADDR = >ppuData - // [50] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 -- _deref_pbuc1=vbuaa + // [51] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 -- _deref_pbuc1=vbuaa sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR // PPUADDR = ppuDataFill::@1] - // [53] phi (word) ppuDataFill::i#2 = (word) 0 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1#0] -- vwuz1=vwuc1 + // [54] phi from ppuDataFill::ppuDataPrepare1 to ppuDataFill::@1 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1] + // [54] phi (word) ppuDataFill::i#2 = (word) 0 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1#0] -- vwuz1=vwuc1 lda #<0 sta.z i sta.z i+1 @@ -3406,7 +4547,7 @@ ppuDataFill: { // ppuDataFill::@1 __b1: // for(unsigned int i=0;iPPUDATA = val - // [56] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4 -- _deref_pbuc1=vbuxx + // [57] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4 -- _deref_pbuc1=vbuxx stx PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA // ppuDataFill::@2 // for(unsigned int i=0;ippuDataFill::@1] - // [53] phi (word) ppuDataFill::i#2 = (word) ppuDataFill::i#1 [phi:ppuDataFill::@2->ppuDataFill::@1#0] -- register_copy + // [54] phi from ppuDataFill::@2 to ppuDataFill::@1 [phi:ppuDataFill::@2->ppuDataFill::@1] + // [54] phi (word) ppuDataFill::i#2 = (word) ppuDataFill::i#1 [phi:ppuDataFill::@2->ppuDataFill::@1#0] -- register_copy jmp __b1 } // ppuDataTransfer @@ -3449,27 +4590,27 @@ ppuDataTransfer: { .label i = 4 // ppuDataTransfer::ppuDataPrepare1 // PPU->PPUADDR = >ppuData - // [59] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 -- _deref_pbuc1=vbuc2 + // [60] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0 -- _deref_pbuc1=vbuc2 lda #>ppuData sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR // PPU->PPUADDR = ppuDataTransfer::@1] - // [61] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#0] -- pbuz1=pbuc1 + // [62] phi from ppuDataTransfer::ppuDataPrepare1 to ppuDataTransfer::@1 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1] + // [62] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#0] -- pbuz1=pbuc1 lda #cpuData sta.z cpuSrc+1 - // [61] phi (word) ppuDataTransfer::i#2 = (word) 0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#1] -- vwuz1=vwuc1 + // [62] phi (word) ppuDataTransfer::i#2 = (word) 0 [phi:ppuDataTransfer::ppuDataPrepare1->ppuDataTransfer::@1#1] -- vwuz1=vwuc1 lda #<0 sta.z i sta.z i+1 // ppuDataTransfer::@1 __b1: // for(unsigned int i=0;isize bcc __b2 @@ -3480,42 +4621,48 @@ ppuDataTransfer: { !: // ppuDataTransfer::@return // } - // [63] return + // [64] return rts // ppuDataTransfer::@2 __b2: // ppuDataPut(*cpuSrc++) - // [64] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) -- vbuaa=_deref_pbuz1 + // [65] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) -- vbuaa=_deref_pbuz1 ldy #0 lda (cpuSrc),y // ppuDataTransfer::ppuDataPut1 // PPU->PPUDATA = val - // [65] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 -- _deref_pbuc1=vbuaa + // [66] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 -- _deref_pbuc1=vbuaa sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA // ppuDataTransfer::@3 // ppuDataPut(*cpuSrc++); - // [66] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 -- pbuz1=_inc_pbuz1 + // [67] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 -- pbuz1=_inc_pbuz1 inc.z cpuSrc bne !+ inc.z cpuSrc+1 !: // for(unsigned int i=0;ippuDataTransfer::@1] - // [61] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*) ppuDataTransfer::cpuSrc#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#0] -- register_copy - // [61] phi (word) ppuDataTransfer::i#2 = (word) ppuDataTransfer::i#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#1] -- register_copy + // [62] phi from ppuDataTransfer::@3 to ppuDataTransfer::@1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1] + // [62] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*) ppuDataTransfer::cpuSrc#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#0] -- register_copy + // [62] phi (word) ppuDataTransfer::i#2 = (word) ppuDataTransfer::i#1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#1] -- register_copy jmp __b1 } // vblank // NMI Called when the PPU refreshes the screen (also known as the V-Blank period) vblank: { - .label __4 = $c - .label y_idx = 8 - .label x_idx = 9 + .label __17 = $a + .label __19 = $a + .label __23 = $b + .label __25 = $b + .label __28 = $f + .label y_idx = 9 + .label x_idx = $a + .label x_idx_2 = $b + .label s = 8 // entry interrupt(HARDWARE_STACK) pha txa @@ -3523,46 +4670,35 @@ vblank: { tya pha // PPU->PPUSCROLL = 0 - // [68] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [69] *((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 - // [69] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [70] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2 sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL // vblank::ppuSpriteBufferDmaTransfer1 // PPU->OAMADDR = 0 - // [70] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // [71] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 -- _deref_pbuc1=vbuc2 sta PPU+OFFSET_STRUCT_RICOH_2C02_OAMADDR // APU->OAMDMA = >spriteBuffer - // [71] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER -- _deref_pbuc1=vbuc2 + // [72] *((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::@3 - // y_idx = y_sin_idx++ - // [72] (byte) vblank::y_idx#0 ← (volatile byte) y_sin_idx -- vbuz1=vbuz2 - // Update sprite positions - lda.z y_sin_idx - sta.z y_idx - // [73] (volatile byte) y_sin_idx ← ++ (volatile byte) y_sin_idx -- vbuz1=_inc_vbuz1 - inc.z y_sin_idx - // x_idx = x_sin_idx++ - // [74] (byte) vblank::x_idx#0 ← (volatile byte) x_sin_idx -- vbuz1=vbuz2 - lda.z x_sin_idx - sta.z x_idx - // [75] (volatile byte) x_sin_idx ← ++ (volatile byte) x_sin_idx -- vbuz1=_inc_vbuz1 - inc.z x_sin_idx - // [76] phi from vblank::@3 to vblank::@1 [phi:vblank::@3->vblank::@1] - // [76] phi (byte) vblank::x_idx#2 = (byte) vblank::x_idx#0 [phi:vblank::@3->vblank::@1#0] -- register_copy - // [76] phi (byte) vblank::y_idx#2 = (byte) vblank::y_idx#0 [phi:vblank::@3->vblank::@1#1] -- register_copy - // [76] phi (byte) vblank::s#2 = (byte) 0 [phi:vblank::@3->vblank::@1#2] -- vbuxx=vbuc1 - ldx #0 - // vblank::@1 - __b1: - // for(char s=0;s<0x40;s++) - // [77] if((byte) vblank::s#2<(byte) $40) goto vblank::@2 -- vbuxx_lt_vbuc1_then_la1 - cpx #$40 - bcc __b2 + // [73] phi from vblank::ppuSpriteBufferDmaTransfer1 to vblank::@14 [phi:vblank::ppuSpriteBufferDmaTransfer1->vblank::@14] + // vblank::@14 + // readJoy1() + // [74] call readJoy1 + jsr readJoy1 + // [75] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2 + // vblank::@15 + // joy = readJoy1() + // [76] (byte) vblank::joy#0 ← (byte) readJoy1::return#2 + // if(joy) + // [77] if((byte) 0==(byte) vblank::joy#0) goto vblank::@1 -- vbuc1_eq_vbuaa_then_la1 + cmp #0 + beq __b1 // vblank::@return + __breturn: // } // [78] return - exit interrupt(HARDWARE_STACK) pla @@ -3571,48 +4707,218 @@ vblank: { tax pla rti - // vblank::@2 - __b2: - // SPRITE_BUFFER[s].y = SINTABLE[y_idx] - // [79] (byte~) vblank::$4 ← (byte) vblank::s#2 << (byte) 2 -- vbuz1=vbuxx_rol_2 - txa - asl - asl - sta.z __4 - // [80] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) vblank::$4) ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::y_idx#2) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2 - ldy.z y_idx - lda SINTABLE,y - ldy.z __4 - sta SPRITE_BUFFER,y - // SINTABLE[x_idx]+8 - // [81] (byte~) vblank::$2 ← *((const to_nomodify byte*) SINTABLE + (byte) vblank::x_idx#2) + (byte) 8 -- vbuaa=pbuc1_derefidx_vbuz1_plus_vbuc2 - lda #8 - ldy.z x_idx - clc - adc SINTABLE,y - // SPRITE_BUFFER[s].x = SINTABLE[x_idx]+8 - // [82] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) vblank::$4) ← (byte~) vblank::$2 -- pbuc1_derefidx_vbuz1=vbuaa - ldy.z __4 - sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X,y - // y_idx += 4 - // [83] (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 + (byte) 4 -- vbuz1=vbuz1_plus_vbuc1 - lda #4 - clc - adc.z y_idx + // vblank::@1 + __b1: + // y_idx = y_sin_idx++ + // [79] (byte) vblank::y_idx#0 ← (volatile byte) y_sin_idx -- vbuz1=vbuz2 + // Update sprite positions + lda.z y_sin_idx sta.z y_idx - // x_idx -= 7 - // [84] (byte) vblank::x_idx#1 ← (byte) vblank::x_idx#2 - (byte) 7 -- vbuz1=vbuz1_minus_vbuc1 - lda.z x_idx - sec - sbc #7 - sta.z x_idx - // for(char s=0;s<0x40;s++) - // [85] (byte) vblank::s#1 ← ++ (byte) vblank::s#2 -- vbuxx=_inc_vbuxx + // [80] (volatile byte) y_sin_idx ← ++ (volatile byte) y_sin_idx -- vbuz1=_inc_vbuz1 + inc.z y_sin_idx + // (x_sin_idx==238) ? 0 : x_sin_idx+1 + // [81] if((volatile byte) x_sin_idx==(byte) $ee) goto vblank::@3 -- vbuz1_eq_vbuc1_then_la1 + lda #$ee + cmp.z x_sin_idx + beq __b2 + // vblank::@2 + // [82] (byte~) vblank::$5 ← (volatile byte) x_sin_idx + (byte) 1 -- vbuxx=vbuz1_plus_1 + ldx.z x_sin_idx inx - // [76] phi from vblank::@2 to vblank::@1 [phi:vblank::@2->vblank::@1] - // [76] phi (byte) vblank::x_idx#2 = (byte) vblank::x_idx#1 [phi:vblank::@2->vblank::@1#0] -- register_copy - // [76] phi (byte) vblank::y_idx#2 = (byte) vblank::y_idx#1 [phi:vblank::@2->vblank::@1#1] -- register_copy - // [76] phi (byte) vblank::s#2 = (byte) vblank::s#1 [phi:vblank::@2->vblank::@1#2] -- register_copy + // [83] phi from vblank::@2 to vblank::@3 [phi:vblank::@2->vblank::@3] + // [83] phi (byte~) vblank::$7 = (byte~) vblank::$5 [phi:vblank::@2->vblank::@3#0] -- register_copy + jmp __b3 + // [83] phi from vblank::@1 to vblank::@3 [phi:vblank::@1->vblank::@3] + __b2: + // [83] phi (byte~) vblank::$7 = (byte) 0 [phi:vblank::@1->vblank::@3#0] -- vbuxx=vbuc1 + ldx #0 + // vblank::@3 + __b3: + // x_sin_idx = (x_sin_idx==238) ? 0 : x_sin_idx+1 + // [84] (volatile byte) x_sin_idx ← (byte~) vblank::$7 -- vbuz1=vbuxx + stx.z x_sin_idx + // x_idx = x_sin_idx + // [85] (byte) vblank::x_idx#0 ← (volatile byte) x_sin_idx -- vbuz1=vbuz2 + txa + sta.z x_idx + // (x_sin_idx_2==88) ? 0 : x_sin_idx_2+1 + // [86] if((volatile byte) x_sin_idx_2==(byte) $58) goto vblank::@5 -- vbuz1_eq_vbuc1_then_la1 + lda #$58 + cmp.z x_sin_idx_2 + beq __b4 + // vblank::@4 + // [87] (byte~) vblank::$10 ← (volatile byte) x_sin_idx_2 + (byte) 1 -- vbuxx=vbuz1_plus_1 + ldx.z x_sin_idx_2 + inx + // [88] phi from vblank::@4 to vblank::@5 [phi:vblank::@4->vblank::@5] + // [88] phi (byte~) vblank::$12 = (byte~) vblank::$10 [phi:vblank::@4->vblank::@5#0] -- register_copy + jmp __b5 + // [88] phi from vblank::@3 to vblank::@5 [phi:vblank::@3->vblank::@5] + __b4: + // [88] phi (byte~) vblank::$12 = (byte) 0 [phi:vblank::@3->vblank::@5#0] -- vbuxx=vbuc1 + ldx #0 + // vblank::@5 + __b5: + // x_sin_idx_2 = (x_sin_idx_2==88) ? 0 : x_sin_idx_2+1 + // [89] (volatile byte) x_sin_idx_2 ← (byte~) vblank::$12 -- vbuz1=vbuxx + stx.z x_sin_idx_2 + // x_idx_2 = x_sin_idx_2 + // [90] (byte) vblank::x_idx_2#0 ← (volatile byte) x_sin_idx_2 -- vbuz1=vbuz2 + txa + sta.z x_idx_2 + // [91] phi from vblank::@5 to vblank::@6 [phi:vblank::@5->vblank::@6] + // [91] phi (byte) vblank::x_idx_2#2 = (byte) vblank::x_idx_2#0 [phi:vblank::@5->vblank::@6#0] -- register_copy + // [91] phi (byte) vblank::x_idx#2 = (byte) vblank::x_idx#0 [phi:vblank::@5->vblank::@6#1] -- register_copy + // [91] phi (byte) vblank::y_idx#2 = (byte) vblank::y_idx#0 [phi:vblank::@5->vblank::@6#2] -- register_copy + // [91] phi (byte) vblank::s#2 = (byte) 0 [phi:vblank::@5->vblank::@6#3] -- vbuz1=vbuc1 + lda #0 + sta.z s + // vblank::@6 + __b6: + // for(char s=0;s<0x40;s++) + // [92] if((byte) vblank::s#2<(byte) $40) goto vblank::@7 -- vbuz1_lt_vbuc1_then_la1 + lda.z s + cmp #$40 + bcc __b7 + jmp __breturn + // vblank::@7 + __b7: + // SPRITE_BUFFER[s].y = SINTABLE_240[y_idx] + // [93] (byte~) vblank::$28 ← (byte) vblank::s#2 << (byte) 2 -- vbuz1=vbuz2_rol_2 + lda.z s + asl + asl + sta.z __28 + // [94] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) vblank::$28) ← *((const to_nomodify byte*) SINTABLE_240 + (byte) vblank::y_idx#2) -- pbuc1_derefidx_vbuz1=pbuc2_derefidx_vbuz2 + ldy.z y_idx + lda SINTABLE_240,y + ldy.z __28 + sta SPRITE_BUFFER,y + // y_idx -= 4 + // [95] (byte) vblank::y_idx#1 ← (byte) vblank::y_idx#2 - (byte) 4 -- vbuz1=vbuz1_minus_vbuc1 + lax.z y_idx + axs #4 + stx.z y_idx + // SINTABLE_184[x_idx] + SINTABLE_64[x_idx_2] + // [96] (byte~) vblank::$14 ← *((const to_nomodify byte*) SINTABLE_184 + (byte) vblank::x_idx#2) + *((const to_nomodify byte*) SINTABLE_64 + (byte) vblank::x_idx_2#2) -- vbuaa=pbuc1_derefidx_vbuz1_plus_pbuc2_derefidx_vbuz2 + ldy.z x_idx + lda SINTABLE_184,y + ldy.z x_idx_2 + clc + adc SINTABLE_64,y + // SPRITE_BUFFER[s].x = SINTABLE_184[x_idx] + SINTABLE_64[x_idx_2] + // [97] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) vblank::$28) ← (byte~) vblank::$14 -- pbuc1_derefidx_vbuz1=vbuaa + ldy.z __28 + sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X,y + // (x_idx<3) ? x_idx+236 : x_idx-3 + // [98] if((byte) vblank::x_idx#2<(byte) 3) goto vblank::@8 -- vbuz1_lt_vbuc1_then_la1 + lda.z x_idx + cmp #3 + bcc __b8 + // vblank::@9 + // [99] (byte~) vblank::$17 ← (byte) vblank::x_idx#2 - (byte) 3 -- vbuz1=vbuz1_minus_vbuc1 + lax.z __17 + axs #3 + stx.z __17 + // [100] phi from vblank::@8 vblank::@9 to vblank::@10 [phi:vblank::@8/vblank::@9->vblank::@10] + // [100] phi (byte) vblank::x_idx#1 = (byte~) vblank::$19 [phi:vblank::@8/vblank::@9->vblank::@10#0] -- register_copy + // vblank::@10 + __b10: + // (x_idx_2>=86) ? x_idx_2-86 : x_idx_2+3 + // [101] if((byte) vblank::x_idx_2#2>=(byte) $56) goto vblank::@11 -- vbuz1_ge_vbuc1_then_la1 + lda.z x_idx_2 + cmp #$56 + bcs __b11 + // vblank::@12 + // [102] (byte~) vblank::$23 ← (byte) vblank::x_idx_2#2 + (byte) 3 -- vbuz1=vbuz1_plus_vbuc1 + lax.z __23 + axs #-[3] + stx.z __23 + // [103] phi from vblank::@11 vblank::@12 to vblank::@13 [phi:vblank::@11/vblank::@12->vblank::@13] + // [103] phi (byte) vblank::x_idx_2#1 = (byte~) vblank::$25 [phi:vblank::@11/vblank::@12->vblank::@13#0] -- register_copy + // vblank::@13 + __b13: + // for(char s=0;s<0x40;s++) + // [104] (byte) vblank::s#1 ← ++ (byte) vblank::s#2 -- vbuz1=_inc_vbuz1 + inc.z s + // [91] phi from vblank::@13 to vblank::@6 [phi:vblank::@13->vblank::@6] + // [91] phi (byte) vblank::x_idx_2#2 = (byte) vblank::x_idx_2#1 [phi:vblank::@13->vblank::@6#0] -- register_copy + // [91] phi (byte) vblank::x_idx#2 = (byte) vblank::x_idx#1 [phi:vblank::@13->vblank::@6#1] -- register_copy + // [91] phi (byte) vblank::y_idx#2 = (byte) vblank::y_idx#1 [phi:vblank::@13->vblank::@6#2] -- register_copy + // [91] phi (byte) vblank::s#2 = (byte) vblank::s#1 [phi:vblank::@13->vblank::@6#3] -- register_copy + jmp __b6 + // vblank::@11 + __b11: + // (x_idx_2>=86) ? x_idx_2-86 : x_idx_2+3 + // [105] (byte~) vblank::$25 ← (byte) vblank::x_idx_2#2 - (byte) $56 -- vbuz1=vbuz1_minus_vbuc1 + lax.z __25 + axs #$56 + stx.z __25 + jmp __b13 + // vblank::@8 + __b8: + // (x_idx<3) ? x_idx+236 : x_idx-3 + // [106] (byte~) vblank::$19 ← (byte) vblank::x_idx#2 + (byte) $ec -- vbuz1=vbuz1_plus_vbuc1 + lax.z __19 + axs #-[$ec] + stx.z __19 + jmp __b10 +} + // readJoy1 +// Read Standard Controller #1 +// Returns a byte representing the pushed buttons +// - bit 0: right +// - bit 1: left +// - bit 2: down +// - bit 3: up +// - bit 4: start +// - bit 5: select +// - bit 6: B +// - bit 7: A +readJoy1: { + .label __1 = $10 + // APU->JOY1 = 1 + // [107] *((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 + // [108] *((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 + // [109] phi from readJoy1 to readJoy1::@1 [phi:readJoy1->readJoy1::@1] + // [109] phi (byte) readJoy1::joy#2 = (byte) 0 [phi:readJoy1->readJoy1::@1#0] -- vbuaa=vbuc1 + // [109] 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++) + // [110] if((byte) readJoy1::i#2<(byte) 8) goto readJoy1::@2 -- vbuxx_lt_vbuc1_then_la1 + cpx #8 + bcc __b2 + // readJoy1::@return + // } + // [111] return + rts + // readJoy1::@2 + __b2: + // joy<<1 + // [112] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1 -- vbuz1=vbuaa_rol_1 + asl + sta.z __1 + // APU->JOY1&1 + // [113] (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 + // [114] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2 -- vbuaa=vbuz1_bor_vbuaa + ora.z __1 + // for(char i=0;i<8;i++) + // [115] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2 -- vbuxx=_inc_vbuxx + inx + // [109] phi from readJoy1::@2 to readJoy1::@1 [phi:readJoy1::@2->readJoy1::@1] + // [109] phi (byte) readJoy1::joy#2 = (byte) readJoy1::joy#1 [phi:readJoy1::@2->readJoy1::@1#0] -- register_copy + // [109] phi (byte) readJoy1::i#2 = (byte) readJoy1::i#1 [phi:readJoy1::@2->readJoy1::@1#1] -- register_copy jmp __b1 } // File Data @@ -3622,9 +4928,17 @@ vblank: { // Color Palette PALETTE: .byte 1, $21, $f, $30, 1, $21, $f, $30, 1, $21, $f, $30, 1, $21, $f, $30, 1, $f, $30, 8, 1, $f, $18, 8, 1, $30, $37, $1a, $f, $f, $f, $f // Sinus Table (0-239) -SINTABLE: +SINTABLE_240: .fill $100, round(115.5+107.5*sin(2*PI*i/256)) + // Sinus Table (0-63) +SINTABLE_64: +.fill 89, round(52.5+52.5*sin(2*PI*i/89)) + + // Sinus Table (0-183) +SINTABLE_184: +.fill 239, round(71.5+71.5*sin(2*PI*i/239)) + .segment Tiles TILES: .var filechargen = LoadBinary("characters.901225-01.bin") diff --git a/src/test/ref/examples/nes-dxycp/nes-dxycp.sym b/src/test/ref/examples/nes-dxycp/nes-dxycp.sym index fff6ac4c2..f74068912 100644 --- a/src/test/ref/examples/nes-dxycp/nes-dxycp.sym +++ b/src/test/ref/examples/nes-dxycp/nes-dxycp.sym @@ -7,6 +7,7 @@ (const nomodify byte*) MEMORY = (byte*) 0 (const byte*) MESSAGE[(number) $40] = (byte*) "rex-of-camelot-presents-a-dxycp-on-nintendo-entertainment-system"z (const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = (byte) $10 +(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1 = (byte) $16 (const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA = (byte) $14 (const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR = (byte) 3 (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR = (byte) 6 @@ -55,7 +56,11 @@ (byte) RICOH_2C02::PPUMASK (byte) RICOH_2C02::PPUSCROLL (volatile byte) RICOH_2C02::PPUSTATUS loadstore -(const to_nomodify byte*) SINTABLE[(number) $100] = kickasm {{ .fill $100, round(115.5+107.5*sin(2*PI*i/256)) +(const to_nomodify byte*) SINTABLE_184[(number) $ef] = kickasm {{ .fill 239, round(71.5+71.5*sin(2*PI*i/239)) + }} +(const to_nomodify byte*) SINTABLE_240[(number) $100] = kickasm {{ .fill $100, round(115.5+107.5*sin(2*PI*i/256)) + }} +(const to_nomodify byte*) SINTABLE_64[(number) $59] = kickasm {{ .fill 89, round(52.5+52.5*sin(2*PI*i/89)) }} (const byte) SIZEOF_BYTE = (byte) 1 (const struct SpriteData*) SPRITE_BUFFER[(number) $100] = { fill( $100, 0) } @@ -140,28 +145,69 @@ (byte) ppuDataTransfer::ppuDataPut1_val#0 reg byte a 2002.0 (word) ppuDataTransfer::size (const word) ppuDataTransfer::size#0 size = (byte) $20*(const byte) SIZEOF_BYTE +(byte()) readJoy1() +(byte~) readJoy1::$1 zp[1]:16 101.0 +(byte~) readJoy1::$2 reg byte a 202.0 +(label) readJoy1::@1 +(label) readJoy1::@2 +(label) readJoy1::@return +(byte) readJoy1::i +(byte) readJoy1::i#1 reg byte x 202.0 +(byte) readJoy1::i#2 reg byte x 60.599999999999994 +(byte) readJoy1::joy +(byte) readJoy1::joy#1 reg byte a 101.0 +(byte) readJoy1::joy#2 reg byte a 51.0 +(byte) readJoy1::return +(byte) readJoy1::return#2 reg byte a 4.0 interrupt(HARDWARE_STACK)(void()) vblank() -(byte~) vblank::$2 reg byte a 22.0 -(byte~) vblank::$4 zp[1]:12 11.0 +(byte~) vblank::$10 reg byte x 4.0 +(byte~) vblank::$12 reg byte x 4.0 +(byte~) vblank::$14 reg byte a 22.0 +(byte~) vblank::$17 zp[1]:10 22.0 +(byte~) vblank::$19 zp[1]:10 22.0 +(byte~) vblank::$23 zp[1]:11 22.0 +(byte~) vblank::$25 zp[1]:11 22.0 +(byte~) vblank::$28 zp[1]:15 8.25 +(byte~) vblank::$5 reg byte x 4.0 +(byte~) vblank::$7 reg byte x 4.0 (label) vblank::@1 +(label) vblank::@10 +(label) vblank::@11 +(label) vblank::@12 +(label) vblank::@13 +(label) vblank::@14 +(label) vblank::@15 (label) vblank::@2 (label) vblank::@3 +(label) vblank::@4 +(label) vblank::@5 +(label) vblank::@6 +(label) vblank::@7 +(label) vblank::@8 +(label) vblank::@9 (label) vblank::@return +(byte) vblank::joy +(byte) vblank::joy#0 reg byte a 4.0 (label) vblank::ppuSpriteBufferDmaTransfer1 (struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer (byte) vblank::s -(byte) vblank::s#1 reg byte x 22.0 -(byte) vblank::s#2 reg byte x 5.5 +(byte) vblank::s#1 s zp[1]:8 22.0 +(byte) vblank::s#2 s zp[1]:8 2.933333333333333 (byte) vblank::x_idx -(byte) vblank::x_idx#0 x_idx zp[1]:9 2.0 -(byte) vblank::x_idx#1 x_idx zp[1]:9 11.0 -(byte) vblank::x_idx#2 x_idx zp[1]:9 5.0 +(byte) vblank::x_idx#0 x_idx zp[1]:10 0.6666666666666666 +(byte) vblank::x_idx#1 x_idx zp[1]:10 5.5 +(byte) vblank::x_idx#2 x_idx zp[1]:10 7.125 +(byte) vblank::x_idx_2 +(byte) vblank::x_idx_2#0 x_idx_2 zp[1]:11 4.0 +(byte) vblank::x_idx_2#1 x_idx_2 zp[1]:11 16.5 +(byte) vblank::x_idx_2#2 x_idx_2 zp[1]:11 4.75 (byte) vblank::y_idx -(byte) vblank::y_idx#0 y_idx zp[1]:8 1.0 -(byte) vblank::y_idx#1 y_idx zp[1]:8 7.333333333333333 -(byte) vblank::y_idx#2 y_idx zp[1]:8 5.833333333333333 -(volatile byte) x_sin_idx loadstore zp[1]:11 1.1428571428571428 -(volatile byte) y_sin_idx loadstore zp[1]:10 1.6 +(byte) vblank::y_idx#0 y_idx zp[1]:9 0.3333333333333333 +(byte) vblank::y_idx#1 y_idx zp[1]:9 1.8333333333333333 +(byte) vblank::y_idx#2 y_idx zp[1]:9 8.75 +(volatile byte) x_sin_idx loadstore zp[1]:13 0.7692307692307693 +(volatile byte) x_sin_idx_2 loadstore zp[1]:14 0.5555555555555556 +(volatile byte) y_sin_idx loadstore zp[1]:12 0.8 reg byte x [ main::initNES1_i#2 main::initNES1_i#1 ] reg byte x [ main::s#2 main::s#1 ] @@ -169,16 +215,26 @@ reg byte x [ ppuDataFill::val#4 ] zp[2]:2 [ ppuDataFill::i#2 ppuDataFill::i#1 ] zp[2]:4 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ppuDataFill::ppuDataPrepare1_ppuData#0 ] zp[2]:6 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ppuDataFill::size#3 ] -reg byte x [ vblank::s#2 vblank::s#1 ] -zp[1]:8 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] -zp[1]:9 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 ] -zp[1]:10 [ y_sin_idx ] -zp[1]:11 [ x_sin_idx ] +reg byte x [ vblank::$7 vblank::$5 ] +reg byte x [ vblank::$12 vblank::$10 ] +zp[1]:8 [ vblank::s#2 vblank::s#1 ] +zp[1]:9 [ vblank::y_idx#2 vblank::y_idx#1 vblank::y_idx#0 ] +zp[1]:10 [ vblank::x_idx#2 vblank::x_idx#1 vblank::x_idx#0 vblank::$19 vblank::$17 ] +zp[1]:11 [ vblank::x_idx_2#2 vblank::x_idx_2#1 vblank::x_idx_2#0 vblank::$25 vblank::$23 ] +reg byte x [ readJoy1::i#2 readJoy1::i#1 ] +reg byte a [ readJoy1::joy#2 readJoy1::joy#1 ] +zp[1]:12 [ y_sin_idx ] +zp[1]:13 [ x_sin_idx ] +zp[1]:14 [ x_sin_idx_2 ] reg byte a [ main::initNES1_waitForVBlank1_$0 ] reg byte a [ main::initNES1_waitForVBlank2_$0 ] reg byte y [ main::$7 ] reg byte a [ ppuDataFill::ppuDataPrepare1_$0 ] reg byte a [ ppuDataFill::ppuDataPrepare1_$1 ] reg byte a [ ppuDataTransfer::ppuDataPut1_val#0 ] -zp[1]:12 [ vblank::$4 ] -reg byte a [ vblank::$2 ] +reg byte a [ readJoy1::return#2 ] +reg byte a [ vblank::joy#0 ] +zp[1]:15 [ vblank::$28 ] +reg byte a [ vblank::$14 ] +zp[1]:16 [ readJoy1::$1 ] +reg byte a [ readJoy1::$2 ] diff --git a/src/test/ref/examples/nes/nes-demo.log b/src/test/ref/examples/nes/nes-demo.log index da5c3252b..957317f62 100644 --- a/src/test/ref/examples/nes/nes-demo.log +++ b/src/test/ref/examples/nes/nes-demo.log @@ -2418,7 +2418,7 @@ Allocated zp[1]:48 [ readJoy1::$1 ] Allocated zp[1]:49 [ readJoy1::$2 ] INITIAL ASM -Target platform is nes / MOS6502 +Target platform is nes / MOS6502X // File Comments // A minimal NES demo // Based on: https://github.com/gregkrsak/first_nes written by Greg M. Krsak, 2018. @@ -3397,11 +3397,6 @@ 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 [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 [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 @@ -3446,10 +3441,6 @@ 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 [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 @@ -3489,7 +3480,7 @@ Potential registers zp[1]:39 [ ppuDataFill::ppuDataPrepare1_$0 ] : zp[1]:39 , re Potential registers zp[1]:40 [ ppuDataFill::ppuDataPrepare1_$1 ] : zp[1]:40 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:41 [ ppuDataTransfer::ppuDataPut1_val#0 ] : zp[1]:41 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:42 [ readJoy1::return#2 ] : zp[1]:42 , reg byte a , reg byte x , reg byte y , -Potential registers zp[1]:43 [ vblank::joy#0 ] : zp[1]:43 , reg byte x , reg byte y , +Potential registers zp[1]:43 [ vblank::joy#0 ] : zp[1]:43 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:44 [ vblank::$1 ] : zp[1]:44 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:45 [ vblank::$3 ] : zp[1]:45 , reg byte a , reg byte x , reg byte y , Potential registers zp[1]:46 [ vblank::$5 ] : zp[1]:46 , reg byte a , reg byte x , reg byte y , @@ -3519,7 +3510,7 @@ Uplifting [main] best 5326 combination reg byte x [ main::x#2 main::x#1 ] reg by Uplifting [readJoy1] best 5083 combination reg byte x [ readJoy1::i#2 readJoy1::i#1 ] reg byte a [ readJoy1::$2 ] reg byte a [ readJoy1::joy#2 readJoy1::joy#1 ] zp[1]:48 [ readJoy1::$1 ] zp[1]:42 [ readJoy1::return#2 ] Limited combination testing to 100 combinations of 576 possible. Uplifting [vblank] best 5059 combination reg byte a [ vblank::$1 ] reg byte a [ vblank::$3 ] reg byte a [ vblank::$5 ] reg byte a [ vblank::$7 ] zp[1]:43 [ vblank::joy#0 ] -Limited combination testing to 100 combinations of 768 possible. +Limited combination testing to 100 combinations of 1024 possible. Uplifting [RICOH_2C02] best 5059 combination Uplifting [RICOH_2A03] best 5059 combination Uplifting [SpriteData] best 5059 combination