From 9262adf09f7f95b3d2c821c393b692ac29241345 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Thu, 1 Oct 2020 00:54:08 +0200 Subject: [PATCH] Added nesballs-3 test --- .../cache/fragment-cache-mos6502x.asm | 45 + .../dk/camelot64/kickc/test/TestPrograms.java | 5 + src/test/kc/complex/nes-balls/kickballs-3.c | 161 + .../ref/complex/nes-balls/kickballs-3.asm | 927 +++ .../ref/complex/nes-balls/kickballs-3.cfg | 308 + .../ref/complex/nes-balls/kickballs-3.log | 7286 +++++++++++++++++ .../ref/complex/nes-balls/kickballs-3.sym | 310 + 7 files changed, 9042 insertions(+) create mode 100644 src/test/kc/complex/nes-balls/kickballs-3.c create mode 100644 src/test/ref/complex/nes-balls/kickballs-3.asm create mode 100644 src/test/ref/complex/nes-balls/kickballs-3.cfg create mode 100644 src/test/ref/complex/nes-balls/kickballs-3.log create mode 100644 src/test/ref/complex/nes-balls/kickballs-3.sym diff --git a/src/main/fragment/cache/fragment-cache-mos6502x.asm b/src/main/fragment/cache/fragment-cache-mos6502x.asm index 0774c0039..9ff33a371 100644 --- a/src/main/fragment/cache/fragment-cache-mos6502x.asm +++ b/src/main/fragment/cache/fragment-cache-mos6502x.asm @@ -18617,3 +18617,48 @@ stx {z1} ldy {z1} dey dey +//FRAGMENT _deref_pwuz1=_deref_pwuz2_plus__deref_pwuz3 +ldy #0 +lda ({z2}),y +clc +adc ({z3}),y +sta ({z1}),y +iny +lda ({z2}),y +adc ({z3}),y +sta ({z1}),y +//FRAGMENT _deref_pwuz1=_deref_pwuz2_plus_vbuc1 +NO_SYNTHESIS +//FRAGMENT _deref_pwuz1=_deref_pwuz2_plus_vbsc1 +NO_SYNTHESIS +//FRAGMENT _deref_pwuz1=_deref_pwuz2_plus_vwuc1 +ldy #0 +lda ({z2}),y +clc +adc #<{c1} +sta ({z1}),y +iny +lda ({z2}),y +adc #>{c1} +sta ({z1}),y +//FRAGMENT vwuz1=_deref_pwuz2_ror_8 +ldy #1 +lda ({z2}),y +sta {z1} +lda #0 +sta {z1}+1 +//FRAGMENT _deref_pwuz1=_deref_pwuz2_bxor_vwuc1 +ldy #0 +lda #<{c1} +eor ({z2}),y +sta ({z1}),y +iny +lda #>{c1} +eor ({z2}),y +sta ({z1}),y +//FRAGMENT vwuz1=_deref_pwuz1_ror_8 +ldy #1 +lda ({z1}),y +sta {z1} +dey +sty {z1}+1 diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java index 4e309d012..25a1e837f 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java @@ -244,6 +244,11 @@ public class TestPrograms { compileAndCompare("complex/nes-balls/kickballs-2.c"); } + @Test + public void testNesBalls3() throws IOException, URISyntaxException { + compileAndCompare("complex/nes-balls/kickballs-3.c"); + } + @Test public void testNesDxycp() throws IOException, URISyntaxException { compileAndCompare("examples/nes/nes-dxycp.c"); diff --git a/src/test/kc/complex/nes-balls/kickballs-3.c b/src/test/kc/complex/nes-balls/kickballs-3.c new file mode 100644 index 000000000..b9ea8f423 --- /dev/null +++ b/src/test/kc/complex/nes-balls/kickballs-3.c @@ -0,0 +1,161 @@ +#pragma target(nes) +//#pragma emulator("java -jar /Applications/Nintaco_bin_2020-05-01/Nintaco.jar") +#include +#include + +#define MAX_BALLS 50 +#define WEIGHT 0x0010 +#define RELEASE_TIMER 0x09 + +#define poke(addr) (*(unsigned byte *)(addr)) + +typedef struct +{ + unsigned short x_position; + unsigned short y_position; + unsigned short x_velocity; + unsigned short y_velocity; +} ball; + +#pragma data_seg(GameRam) +// Moving balls (in GameRAM) +ball balls[64]; + +#pragma data_seg(Data) + + static const unsigned char sine_table[256] = { + 0x40,0x42,0x43,0x45,0x46,0x48,0x49,0x4b,0x4c,0x4e,0x50,0x51,0x53,0x54,0x56,0x57, + 0x58,0x5a,0x5b,0x5d,0x5e,0x60,0x61,0x62,0x64,0x65,0x66,0x67,0x69,0x6a,0x6b,0x6c, + 0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x78,0x79,0x7a,0x7b, + 0x7b,0x7c,0x7c,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f,0x7f,0x80,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0x7f,0x7f,0x7f,0x7e,0x7e,0x7e,0x7d,0x7d,0x7c,0x7c, + 0x7b,0x7b,0x7a,0x79,0x78,0x78,0x77,0x76,0x75,0x74,0x73,0x72,0x71,0x70,0x6f,0x6e, + 0x6d,0x6c,0x6b,0x6a,0x69,0x67,0x66,0x65,0x64,0x62,0x61,0x60,0x5e,0x5d,0x5b,0x5a, + 0x58,0x57,0x56,0x54,0x53,0x51,0x50,0x4e,0x4c,0x4b,0x49,0x48,0x46,0x45,0x43,0x42, + 0x40,0x3e,0x3d,0x3b,0x3a,0x38,0x37,0x35,0x34,0x32,0x30,0x2f,0x2d,0x2c,0x2a,0x29, + 0x28,0x26,0x25,0x23,0x22,0x20,0x1f,0x1e,0x1c,0x1b,0x1a,0x19,0x17,0x16,0x15,0x14, + 0x13,0x12,0x11,0x10,0xf,0xe,0xd,0xc,0xb,0xa,0x9,0x8,0x8,0x7,0x6,0x5, + 0x5,0x4,0x4,0x3,0x3,0x2,0x2,0x2,0x1,0x1,0x1,0x0,0x0,0x0,0x0,0x0, + 0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x1,0x2,0x2,0x2,0x3,0x3,0x4,0x4, + 0x5,0x5,0x6,0x7,0x8,0x8,0x9,0xa,0xb,0xc,0xd,0xe,0xf,0x10,0x11,0x12, + 0x13,0x14,0x15,0x16,0x17,0x19,0x1a,0x1b,0x1c,0x1e,0x1f,0x20,0x22,0x23,0x25,0x26, + 0x28,0x29,0x2a,0x2c,0x2d,0x2f,0x30,0x32,0x34,0x35,0x37,0x38,0x3a,0x3b,0x3d,0x3e + }; + + static const unsigned char object[5] = { 0, 0, 10, 3, 128 }; + + const unsigned char palette[] = { 0x34,0x24,0x14,0x04, 0x34,0x24,0x14,0x04, 0x34,0x24,0x14,0x04, 0x34,0x24,0x14,0x04, 0x34,0x24,0x14,0x04, 0x34,0x24,0x14,0x04, 0x34,0x24,0x14,0x04, 0x34,0x24,0x14,0x04 }; + + const unsigned char h_bar_tilemap[] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 }; + + volatile unsigned char scroll_y = 0; + volatile unsigned char vblank_hit = 0; + +int main(void) +{ + // Initialize NES after RESET + initNES(); + // Transfer the palette + ppuDataTransfer(PPU_PALETTE, palette, sizeof(palette)); + // Fill the PPU attribute table + ppuDataFill(PPU_NAME_TABLE_0, 0, 32*30); + ppuDataFill(PPU_ATTRIBUTE_TABLE_0, 0, 0x40); + ppuDataTransfer(0x2040, h_bar_tilemap, sizeof(h_bar_tilemap)); + // Enable screen rendering and vblank + enableVideoOutput(); + // Enable vertical blank interrupt, select sprite pattern table 1 + PPU->PPUCTRL = 0b10001000; + + unsigned short i; + unsigned char active_balls = 0; + unsigned char timer = 0; + unsigned char timer_2 = 0; + unsigned char h_bar = 0x80; + unsigned char sprite_idx = 0; + + for (i = 0; i < MAX_BALLS; i++) + { + balls[i].x_velocity = rand() & 0x3FF; + balls[i].y_velocity = rand() & 0x0FF; + } + + while (1) + { + timer_2++; + h_bar = sine_table[timer_2] + 0x60; + scroll_y = h_bar ^ 0xFF; + + if (active_balls < MAX_BALLS) + { + if (timer++ == RELEASE_TIMER) + { + timer = 0; + active_balls++; + balls[active_balls].x_position = 0; + balls[active_balls].y_position = 0; + } + } + + sprite_idx = 0; + for (i = 0; i < active_balls; i++) + { + balls[i].x_position += balls[i].x_velocity; + balls[i].y_position += (balls[i].y_velocity += WEIGHT); + + if ((balls[i].x_position >> 8) < 8) + { + balls[i].x_velocity ^= 0xFFFF; + } + + if (((balls[i].y_position >> 8) >= h_bar) && (balls[i].y_position >> 8) < h_bar + 8) + { + balls[i].y_velocity ^= 0xFFFF; + balls[i].y_position = ((unsigned short)(h_bar - 2) << 8); + } + + SPRITE_BUFFER[sprite_idx].y = (unsigned char) (balls[i].y_position >> 8); + SPRITE_BUFFER[sprite_idx].tile = 0x0a; + SPRITE_BUFFER[sprite_idx].attributes = 3; + SPRITE_BUFFER[sprite_idx].x = (unsigned char) (balls[i].x_position >> 8); + sprite_idx++; + } + + poke(0x2001) = 0x98; + while (!vblank_hit); // wait for vblank + vblank_hit = 0; + poke(0x2001) = 0x18; + } + return 0; +} + +// NMI Called when the PPU refreshes the screen (also known as the V-Blank period) +interrupt(hardware_stack) void vblank() { + // Set scroll + PPU->PPUSCROLL = 0; + PPU->PPUSCROLL = scroll_y; + // DMA transfer the entire sprite buffer to the PPU + ppuSpriteBufferDmaTransfer(SPRITE_BUFFER); + vblank_hit++; +} + +// Tile Set (in CHR ROM) +#pragma data_seg(Tiles) +export char TILES[] = kickasm(resource "lazydata.chr") {{ + .import binary "lazydata.chr" +}}; + +// Sprite Buffer (in GAME RAM) +// Will be transferred to the PPU via DMA during vblank +#pragma data_seg(GameRam) +struct SpriteData align(0x100) SPRITE_BUFFER[0x100]; + +// Interrupt Vectors (in PRG ROM) +#pragma data_seg(Vectors) +export void()* const VECTORS[] = { + // NMI Called when the PPU refreshes the screen (also known as the V-Blank period) + &vblank, + // RESET Called when the NES is reset, including when it is turned on. + &main, + // IRQ Called when a BRK instruction is executed. + 0 +}; \ No newline at end of file diff --git a/src/test/ref/complex/nes-balls/kickballs-3.asm b/src/test/ref/complex/nes-balls/kickballs-3.asm new file mode 100644 index 000000000..3a1b73290 --- /dev/null +++ b/src/test/ref/complex/nes-balls/kickballs-3.asm @@ -0,0 +1,927 @@ +//#pragma emulator("java -jar /Applications/Nintaco_bin_2020-05-01/Nintaco.jar") +// Nintendo Entertainment System (NES +// https://en.wikipedia.org/wiki/Nintendo_Entertainment_System_(Model_NES-101) +// https://github.com/gregkrsak/first_nes +// Ricoh 2C02 - NES Picture Processing Unit (PPU) +// Ricoh RP2C02 (NTSC version) / RP2C07 (PAL version), +// https://en.wikipedia.org/wiki/Picture_Processing_Unit +// https://wiki.nesdev.com/w/index.php/PPU_registers +// http://nesdev.com/2C02%20technical%20reference.TXT +// Based on: https://github.com/gregkrsak/first_nes written by Greg M. Krsak, 2018. + // Nintendo Entertainment System (NES) ROM (Mapper 0 NROM, Vertical Mirroring) +// https://sadistech.com/nesromtool/romdoc.html +// https://forums.nesdev.com/viewtopic.php?f=2&t=9896 +// https://github.com/gregkrsak/first_nes +.file [name="kickballs-3.nes", type="bin", segments="NesRom"] +.file [name="kickballs-3.nes_hdr", type="bin", segments="Header"] +.file [name="kickballs-3.nes_prg", type="bin", segments="ProgramRom"] +.file [name="kickballs-3.nes_chr", type="bin", segments="CharacterRom"] +.segmentdef Header [ start=$0000, min=$0000, max=$000f, fill ] +.segmentdef Tiles [ start=$0000, min=$0000, max=$1fff, fill ] +.segmentdef Code [ start=$c000, min=$c000, max=$fff9 ] +.segmentdef Data [ startAfter="Code", min=$c000, max=$fff9 ] +.segmentdef Vectors [ start=$fffa, min=$fffa, max=$ffff ] +.segmentdef GameRam [start=$200,max=$7ff, virtual] +.segmentdef ProgramRom [ segments="Code, Data, Vectors" ] +.segmentdef CharacterRom [ segments="Tiles" ] +.segmentdef NesRom +.segment NesRom +.segmentout [ segments="Header" ] +.segmentout [ segments="ProgramRom" ] +.segmentout [ segments="CharacterRom" ] +.segment Header +.text @"NES\$1a" +.byte $01 // 1x 16KB ROM (PRG) +.byte $01 // 1x 8KB VROM (CHR) +.byte %00000001 // Mapper nibble 0000 == No mapping (a simple 16KB PRG + 8KB CHR game) + // Mirroring nibble 0001 == Vertical mirroring only +.segment Code + + .const OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = $10 + .const OFFSET_STRUCT_RICOH_2C02_PPUMASK = 1 + .const OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = 2 + .const OFFSET_STRUCT_RICOH_2C02_OAMADDR = 3 + .const OFFSET_STRUCT_RICOH_2A03_OAMDMA = $14 + .const OFFSET_STRUCT_RICOH_2C02_PPUADDR = 6 + .const OFFSET_STRUCT_RICOH_2C02_PPUDATA = 7 + .const OFFSET_STRUCT_SPRITEDATA_TILE = 1 + .const OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES = 2 + .const OFFSET_STRUCT_SPRITEDATA_X = 3 + .const OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = 5 + .const SIZEOF_BYTE = 1 + // $2000-$23bf $03c0 Name table 0 + .label PPU_NAME_TABLE_0 = $2000 + // $23c0-$23ff $0040 Attribute table 0 + .label PPU_ATTRIBUTE_TABLE_0 = $23c0 + // $3000-$3eff $0f00 Mirrors of $2000-$2eff + // $3f00-$3f1f $0020 Palette RAM indexes + .label PPU_PALETTE = $3f00 + // PPU Status Register for reading in ASM + .label PPU_PPUSTATUS = $2002 + // APU Frame Counter + // generates low-frequency clocks for the channels and an optional 60 Hz interrupt. + // https://wiki.nesdev.com/w/index.php/APU_Frame_Counter + // ------+-----+--------------------------------------------------------------- + // $4017 | W | FR_COUNTER Frame Counter Set mode and interrupt + // ------+-----+--------------------------------------------------------------- + // | 7 | Sequencer mode: 0 selects 4-step sequence, 1 selects 5-step sequence + // | 6 | Interrupt inhibit flag. If set, the frame interrupt flag is cleared, otherwise it is unaffected. + // ------+-----+--------------------------------------------------------------- + // Side effects After 3 or 4 CPU clock cycles*, the timer is reset. + // If the mode flag is set, then both "quarter frame" and "half frame" signals are also generated. + .label FR_COUNTER = $4017 + // Pointer to the start of RAM memory + .label MEMORY = 0 + // NES Picture Processing Unit (PPU) + .label PPU = $2000 + // NES CPU and audion processing unit (APU) + .label APU = $4000 + .label scroll_y = $c + .label vblank_hit = $d + // The random state variable + .label rand_state = $a +.segment Code +__start: { + // scroll_y = 0 + lda #0 + sta.z scroll_y + // vblank_hit = 0 + sta.z vblank_hit + jsr main + rts +} +// NMI Called when the PPU refreshes the screen (also known as the V-Blank period) +vblank: { + pha + txa + pha + tya + pha + // PPU->PPUSCROLL = 0 + // Set scroll + lda #0 + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL + // PPU->PPUSCROLL = scroll_y + lda.z scroll_y + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL + // PPU->OAMADDR = 0 + lda #0 + sta PPU+OFFSET_STRUCT_RICOH_2C02_OAMADDR + // APU->OAMDMA = >spriteBuffer + lda #>SPRITE_BUFFER + sta APU+OFFSET_STRUCT_RICOH_2A03_OAMDMA + // vblank_hit++; + inc.z vblank_hit + // } + pla + tay + pla + tax + pla + rti +} +main: { + .label __9 = $36 + .label __10 = $36 + .label __11 = $36 + .label __20 = $f + .label __23 = $27 + .label __25 = $25 + .label __26 = $29 + .label __31 = $30 + .label __32 = $34 + .label __33 = $32 + .label __35 = $38 + .label __36 = $3a + .label __40 = $f + .label __44 = $25 + .label __45 = $21 + .label __50 = $32 + .label __53 = $2a + .label __56 = $30 + .label i = 2 + .label timer_2 = 4 + .label h_bar = $e + .label active_balls = 5 + .label sprite_idx = 9 + .label i_1 = 7 + .label timer = 6 + .label __59 = $38 + .label __60 = $3a + .label __61 = $11 + .label __62 = $13 + .label __63 = $15 + .label __64 = $17 + .label __65 = $19 + .label __66 = $1b + .label __67 = $1d + .label __68 = $1f + .label __69 = $f + .label __70 = $27 + .label __71 = $25 + .label __72 = $23 + .label __73 = $21 + .label __74 = $34 + .label __75 = $32 + .label __76 = $2c + .label __77 = $2e + .label __78 = $2a + // asm + cld + ldx #$ff + txs + // PPU->PPUCTRL = 0 + lda #0 + sta PPU + // PPU->PPUMASK = 0 + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK + // *FR_COUNTER = 0b01000000 + lda #$40 + sta FR_COUNTER + // APU->DMC_FREQ = 0b01000000 + sta APU+OFFSET_STRUCT_RICOH_2A03_DMC_FREQ + // asm + lda PPU_PPUSTATUS + initNES1_waitForVBlank1: + // PPU->PPUSTATUS&0x80 + lda #$80 + and PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS + // while(!(PPU->PPUSTATUS&0x80)) + cmp #0 + beq initNES1_waitForVBlank1 + ldx #0 + initNES1___b1: + // (MEMORY+0x000)[i] = 0 + lda #0 + sta MEMORY,x + // (MEMORY+0x100)[i] = 0 + sta MEMORY+$100,x + // (MEMORY+0x200)[i] = 0 + sta MEMORY+$200,x + // (MEMORY+0x300)[i] = 0 + sta MEMORY+$300,x + // (MEMORY+0x400)[i] = 0 + sta MEMORY+$400,x + // (MEMORY+0x500)[i] = 0 + sta MEMORY+$500,x + // (MEMORY+0x600)[i] = 0 + sta MEMORY+$600,x + // (MEMORY+0x700)[i] = 0 + sta MEMORY+$700,x + // while (++i) + inx + cpx #0 + bne initNES1___b1 + initNES1_waitForVBlank2: + // PPU->PPUSTATUS&0x80 + lda #$80 + and PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS + // while(!(PPU->PPUSTATUS&0x80)) + cmp #0 + beq initNES1_waitForVBlank2 + // asm + lda PPU_PPUSTATUS + // ppuDataTransfer(PPU_PALETTE, palette, sizeof(palette)) + // Transfer the palette + lda #palette + sta.z ppuDataTransfer.cpuData+1 + lda #PPU_PALETTE + sta.z ppuDataTransfer.ppuDataPrepare1_ppuData+1 + jsr ppuDataTransfer + // ppuDataFill(PPU_NAME_TABLE_0, 0, 32*30) + // Fill the PPU attribute table + lda #<$20*$1e + sta.z ppuDataFill.size + lda #>$20*$1e + sta.z ppuDataFill.size+1 + lda #PPU_NAME_TABLE_0 + sta.z ppuDataFill.ppuDataPrepare1_ppuData+1 + jsr ppuDataFill + // ppuDataFill(PPU_ATTRIBUTE_TABLE_0, 0, 0x40) + lda #<$40 + sta.z ppuDataFill.size + lda #>$40 + sta.z ppuDataFill.size+1 + lda #PPU_ATTRIBUTE_TABLE_0 + sta.z ppuDataFill.ppuDataPrepare1_ppuData+1 + jsr ppuDataFill + // ppuDataTransfer(0x2040, h_bar_tilemap, sizeof(h_bar_tilemap)) + lda #h_bar_tilemap + sta.z ppuDataTransfer.cpuData+1 + lda #<$2040 + sta.z ppuDataTransfer.ppuDataPrepare1_ppuData + lda #>$2040 + sta.z ppuDataTransfer.ppuDataPrepare1_ppuData+1 + jsr ppuDataTransfer + // PPU->PPUCTRL = 0b10000000 + lda #$80 + sta PPU + // PPU->PPUMASK = 0b00011110 + lda #$1e + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK + // PPU->PPUCTRL = 0b10001000 + // Enable vertical blank interrupt, select sprite pattern table 1 + lda #$88 + sta PPU + lda #<1 + sta.z rand_state + lda #>1 + sta.z rand_state+1 + sta.z i + sta.z i+1 + __b1: + // for (i = 0; i < MAX_BALLS; i++) + lda.z i+1 + bne !+ + lda.z i + cmp #$32 + bcs !__b2+ + jmp __b2 + !__b2: + !: + lda #0 + sta.z timer + sta.z active_balls + sta.z timer_2 + __b4: + // timer_2++; + inc.z timer_2 + // h_bar = sine_table[timer_2] + 0x60 + lda #$60 + ldy.z timer_2 + clc + adc sine_table,y + sta.z h_bar + // h_bar ^ 0xFF + lda #$ff + eor.z h_bar + // scroll_y = h_bar ^ 0xFF + sta.z scroll_y + // if (active_balls < MAX_BALLS) + lda.z active_balls + cmp #$32 + bcs __b5 + // if (timer++ == RELEASE_TIMER) + ldx.z timer + inx + lda #9 + cmp.z timer + beq !__b25+ + jmp __b25 + !__b25: + // active_balls++; + inc.z active_balls + // balls[active_balls].x_position = 0 + lda.z active_balls + asl + asl + asl + tax + lda #0 + sta balls,x + sta balls+1,x + // balls[active_balls].y_position = 0 + sta balls+2,x + sta balls+2+1,x + sta.z timer + __b5: + lda #0 + sta.z sprite_idx + sta.z i_1 + sta.z i_1+1 + __b6: + // for (i = 0; i < active_balls; i++) + lda.z i_1+1 + bne !+ + lda.z i_1 + cmp.z active_balls + bcc __b7 + !: + // poke(0x2001) = 0x98 + lda #$98 + sta $2001 + __b13: + // while (!vblank_hit) + lda #0 + cmp.z vblank_hit + beq __b13 + // vblank_hit = 0 + // wait for vblank + sta.z vblank_hit + // poke(0x2001) = 0x18 + lda #$18 + sta $2001 + jmp __b4 + __b7: + // balls[i].x_position += balls[i].x_velocity + lda.z i_1 + asl + sta.z __40 + lda.z i_1+1 + rol + sta.z __40+1 + asl.z __40 + rol.z __40+1 + asl.z __40 + rol.z __40+1 + lda.z __40 + clc + adc #balls + sta.z __61+1 + lda.z __40 + clc + adc #balls+4 + sta.z __62+1 + lda.z __40 + clc + adc #balls + sta.z __63+1 + ldy #0 + lda (__61),y + clc + adc (__62),y + sta (__63),y + iny + lda (__61),y + adc (__62),y + sta (__63),y + // balls[i].y_velocity += WEIGHT + lda.z __40 + clc + adc #balls+6 + sta.z __64+1 + lda.z __40 + clc + adc #balls+6 + sta.z __65+1 + ldy #0 + lda (__64),y + clc + adc #<$10 + sta (__65),y + iny + lda (__64),y + adc #>$10 + sta (__65),y + // balls[i].y_position += (balls[i].y_velocity += WEIGHT) + lda.z __40 + clc + adc #balls+2 + sta.z __66+1 + lda.z __40 + clc + adc #balls+6 + sta.z __67+1 + lda.z __40 + clc + adc #balls+2 + sta.z __68+1 + ldy #0 + lda (__66),y + clc + adc (__67),y + sta (__68),y + iny + lda (__66),y + adc (__67),y + sta (__68),y + // balls[i].x_position >> 8 + clc + lda.z __69 + adc #balls + sta.z __69+1 + ldy #1 + lda (__20),y + sta.z __20 + dey + sty.z __20+1 + // if ((balls[i].x_position >> 8) < 8) + tya + bne __b9 + lda.z __20 + cmp #8 + bcs __b9 + !: + // balls[i].x_velocity ^= 0xFFFF + lda.z i_1 + asl + sta.z __45 + lda.z i_1+1 + rol + sta.z __45+1 + asl.z __45 + rol.z __45+1 + asl.z __45 + rol.z __45+1 + lda.z __45 + clc + adc #balls+4 + sta.z __72+1 + clc + lda.z __73 + adc #balls+4 + sta.z __73+1 + ldy #0 + lda #<$ffff + eor (__72),y + sta (__73),y + iny + lda #>$ffff + eor (__72),y + sta (__73),y + __b9: + // balls[i].y_position >> 8 + lda.z i_1 + asl + sta.z __44 + lda.z i_1+1 + rol + sta.z __44+1 + asl.z __44 + rol.z __44+1 + asl.z __44 + rol.z __44+1 + lda.z __44 + clc + adc #balls+2 + sta.z __70+1 + ldy #1 + lda (__23),y + sta.z __23 + dey + sty.z __23+1 + clc + lda.z __71 + adc #balls+2 + sta.z __71+1 + ldy #1 + lda (__25),y + sta.z __25 + dey + sty.z __25+1 + // h_bar + 8 + lax.z h_bar + axs #-[8] + stx.z __26 + // if (((balls[i].y_position >> 8) >= h_bar) && (balls[i].y_position >> 8) < h_bar + 8) + lda.z __23+1 + bne !+ + lda.z __23 + cmp.z h_bar + bcc __b10 + !: + lda.z __25+1 + bne __b10 + lda.z __25 + cmp.z __26 + bcs __b10 + !: + // balls[i].y_velocity ^= 0xFFFF + lda.z i_1 + asl + sta.z __53 + lda.z i_1+1 + rol + sta.z __53+1 + asl.z __53 + rol.z __53+1 + asl.z __53 + rol.z __53+1 + lda.z __53 + clc + adc #balls+6 + sta.z __76+1 + lda.z __53 + clc + adc #balls+6 + sta.z __77+1 + ldy #0 + lda #<$ffff + eor (__76),y + sta (__77),y + iny + lda #>$ffff + eor (__76),y + sta (__77),y + // h_bar - 2 + lda.z h_bar + sec + sbc #2 + // (unsigned short)(h_bar - 2) << 8 + sta.z __56 + lda #0 + sta.z __56+1 + lda.z __31 + sta.z __31+1 + lda #0 + sta.z __31 + // balls[i].y_position = ((unsigned short)(h_bar - 2) << 8) + clc + lda.z __78 + adc #balls+2 + sta.z __78+1 + ldy #0 + lda.z __31 + sta (__78),y + iny + lda.z __31+1 + sta (__78),y + __b10: + // balls[i].y_position >> 8 + lda.z i_1 + asl + sta.z __50 + lda.z i_1+1 + rol + sta.z __50+1 + asl.z __50 + rol.z __50+1 + asl.z __50 + rol.z __50+1 + lda.z __50 + clc + adc #balls+2 + sta.z __74+1 + ldy #1 + lda (__32),y + sta.z __32 + dey + sty.z __32+1 + // SPRITE_BUFFER[sprite_idx].y = (unsigned char) (balls[i].y_position >> 8) + lda.z sprite_idx + asl + asl + tax + lda.z __32 + sta SPRITE_BUFFER,x + // SPRITE_BUFFER[sprite_idx].tile = 0x0a + lda #$a + sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_TILE,x + // SPRITE_BUFFER[sprite_idx].attributes = 3 + lda #3 + sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES,x + // balls[i].x_position >> 8 + clc + lda.z __75 + adc #balls + sta.z __75+1 + ldy #1 + lda (__33),y + sta.z __33 + dey + sty.z __33+1 + // SPRITE_BUFFER[sprite_idx].x = (unsigned char) (balls[i].x_position >> 8) + sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X,x + // sprite_idx++; + inc.z sprite_idx + // for (i = 0; i < active_balls; i++) + inc.z i_1 + bne !+ + inc.z i_1+1 + !: + jmp __b6 + __b25: + stx.z timer + jmp __b5 + __b2: + // rand() + jsr rand + // rand() + // rand() & 0x3FF + lda.z __10 + and #<$3ff + sta.z __10 + lda.z __10+1 + and #>$3ff + sta.z __10+1 + // balls[i].x_velocity = rand() & 0x3FF + lda.z i + asl + sta.z __35 + lda.z i+1 + rol + sta.z __35+1 + asl.z __35 + rol.z __35+1 + asl.z __35 + rol.z __35+1 + clc + lda.z __59 + adc #balls+4 + sta.z __59+1 + ldy #0 + lda.z __10 + sta (__59),y + iny + lda.z __10+1 + sta (__59),y + // rand() + jsr rand + // rand() + // rand() & 0x0FF + lda #$ff + and.z __11 + tax + // balls[i].y_velocity = rand() & 0x0FF + lda.z i + asl + sta.z __36 + lda.z i+1 + rol + sta.z __36+1 + asl.z __36 + rol.z __36+1 + asl.z __36 + rol.z __36+1 + clc + lda.z __60 + adc #balls+6 + sta.z __60+1 + txa + ldy #0 + sta (__60),y + tya + iny + sta (__60),y + // for (i = 0; i < MAX_BALLS; i++) + inc.z i + bne !+ + inc.z i+1 + !: + jmp __b1 +} +// Transfer a number of bytes from the CPU memory to the PPU memory +// - ppuData : Pointer in the PPU memory +// - cpuData : Pointer to the CPU memory (RAM of ROM) +// - size : The number of bytes to transfer +// ppuDataTransfer(void* zp($11) cpuData) +ppuDataTransfer: { + .label ppuDataPrepare1_ppuData = $f + .label cpuSrc = $11 + .label i = $13 + .label cpuData = $11 + // >ppuData + lda.z ppuDataPrepare1_ppuData+1 + // PPU->PPUADDR = >ppuData + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR + // PPUADDR = PPUDATA = val + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA + // ppuDataPut(*cpuSrc++); + inc.z cpuSrc + bne !+ + inc.z cpuSrc+1 + !: + // for(unsigned int i=0;ippuData + lda.z ppuDataPrepare1_ppuData+1 + // PPU->PPUADDR = >ppuData + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR + // PPUADDR = PPUDATA = val + lda #0 + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA + // for(unsigned int i=0;i> 9 + lsr + sta.z __1 + lda #0 + sta.z __1+1 + // rand_state ^= rand_state >> 9 + lda.z rand_state + eor.z __1 + sta.z rand_state + lda.z rand_state+1 + eor.z __1+1 + sta.z rand_state+1 + // rand_state << 8 + lda.z rand_state + sta.z __2+1 + lda #0 + sta.z __2 + // rand_state ^= rand_state << 8 + lda.z rand_state + eor.z __2 + sta.z rand_state + lda.z rand_state+1 + eor.z __2+1 + sta.z rand_state+1 + // return rand_state; + lda.z rand_state + sta.z return + lda.z rand_state+1 + sta.z return+1 + // } + rts +} +.segment GameRam + // Moving balls (in GameRAM) + balls: .fill 8*$40, 0 +.segment Data + sine_table: .byte $40, $42, $43, $45, $46, $48, $49, $4b, $4c, $4e, $50, $51, $53, $54, $56, $57, $58, $5a, $5b, $5d, $5e, $60, $61, $62, $64, $65, $66, $67, $69, $6a, $6b, $6c, $6d, $6e, $6f, $70, $71, $72, $73, $74, $75, $76, $77, $78, $78, $79, $7a, $7b, $7b, $7c, $7c, $7d, $7d, $7e, $7e, $7e, $7f, $7f, $7f, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $7f, $7f, $7f, $7e, $7e, $7e, $7d, $7d, $7c, $7c, $7b, $7b, $7a, $79, $78, $78, $77, $76, $75, $74, $73, $72, $71, $70, $6f, $6e, $6d, $6c, $6b, $6a, $69, $67, $66, $65, $64, $62, $61, $60, $5e, $5d, $5b, $5a, $58, $57, $56, $54, $53, $51, $50, $4e, $4c, $4b, $49, $48, $46, $45, $43, $42, $40, $3e, $3d, $3b, $3a, $38, $37, $35, $34, $32, $30, $2f, $2d, $2c, $2a, $29, $28, $26, $25, $23, $22, $20, $1f, $1e, $1c, $1b, $1a, $19, $17, $16, $15, $14, $13, $12, $11, $10, $f, $e, $d, $c, $b, $a, 9, 8, 8, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, $a, $b, $c, $d, $e, $f, $10, $11, $12, $13, $14, $15, $16, $17, $19, $1a, $1b, $1c, $1e, $1f, $20, $22, $23, $25, $26, $28, $29, $2a, $2c, $2d, $2f, $30, $32, $34, $35, $37, $38, $3a, $3b, $3d, $3e + palette: .byte $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4 + h_bar_tilemap: .byte 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +.segment Tiles +TILES: +.import binary "lazydata.chr" + +.segment GameRam + .align $100 + SPRITE_BUFFER: .fill 4*$100, 0 +.segment Vectors + VECTORS: .word vblank, main, 0 diff --git a/src/test/ref/complex/nes-balls/kickballs-3.cfg b/src/test/ref/complex/nes-balls/kickballs-3.cfg new file mode 100644 index 000000000..8202bc853 --- /dev/null +++ b/src/test/ref/complex/nes-balls/kickballs-3.cfg @@ -0,0 +1,308 @@ + +(void()) __start() +__start: scope:[__start] from + [0] phi() + to:__start::__init1 +__start::__init1: scope:[__start] from __start + [1] (volatile byte) scroll_y ← (byte) 0 + [2] (volatile byte) vblank_hit ← (byte) 0 + to:__start::@1 +__start::@1: scope:[__start] from __start::__init1 + [3] phi() + [4] call main + to:__start::@return +__start::@return: scope:[__start] from __start::@1 + [5] return + to:@return + +interrupt(HARDWARE_STACK)(void()) vblank() +vblank: scope:[vblank] from + [6] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 + [7] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (volatile byte) scroll_y + to:vblank::ppuSpriteBufferDmaTransfer1 +vblank::ppuSpriteBufferDmaTransfer1: scope:[vblank] from vblank + [8] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 + [9] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER + to:vblank::@1 +vblank::@1: scope:[vblank] from vblank::ppuSpriteBufferDmaTransfer1 + [10] (volatile byte) vblank_hit ← ++ (volatile byte) vblank_hit + to:vblank::@return +vblank::@return: scope:[vblank] from vblank::@1 + [11] return + to:@return + +(signed word()) main() +main: scope:[main] from __start::@1 + [12] 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 + [14] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 + [15] *((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 + [16] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 + [17] *((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 + [19] phi() + to:main::initNES1_waitForVBlank1_@1 +main::initNES1_waitForVBlank1_@1: scope:[main] from main::initNES1_waitForVBlank1 main::initNES1_waitForVBlank1_@1 + [20] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 + [21] 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 + [22] (byte) main::initNES1_i#2 ← phi( main::initNES1_@1/(byte) main::initNES1_i#1 main::initNES1_waitForVBlank1_@1/(byte) 0 ) + [23] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 + [24] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 + [25] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 + [26] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 + [27] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 + [28] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 + [29] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 + [30] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 + [31] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 + [32] 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 + [33] phi() + to:main::initNES1_waitForVBlank2_@1 +main::initNES1_waitForVBlank2_@1: scope:[main] from main::initNES1_waitForVBlank2 main::initNES1_waitForVBlank2_@1 + [34] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 + [35] 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::@17 +main::@17: scope:[main] from main::initNES1_@7 + [37] phi() + [38] call ppuDataTransfer + to:main::@19 +main::@19: scope:[main] from main::@17 + [39] phi() + [40] call ppuDataFill + to:main::@20 +main::@20: scope:[main] from main::@19 + [41] phi() + [42] call ppuDataFill + to:main::@21 +main::@21: scope:[main] from main::@20 + [43] phi() + [44] call ppuDataTransfer + to:main::enableVideoOutput1 +main::enableVideoOutput1: scope:[main] from main::@21 + [45] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 + [46] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e + to:main::@18 +main::@18: scope:[main] from main::enableVideoOutput1 + [47] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $88 + to:main::@1 +main::@1: scope:[main] from main::@18 main::@23 + [48] (word) rand_state#17 ← phi( main::@18/(word) 1 main::@23/(word) rand_state#11 ) + [48] (word) main::i#14 ← phi( main::@18/(byte) 0 main::@23/(word) main::i#2 ) + [49] if((word) main::i#14<(byte) $32) goto main::@2 + to:main::@3 +main::@3: scope:[main] from main::@1 main::@14 + [50] (byte) main::timer#3 ← phi( main::@1/(byte) 0 main::@14/(byte) main::timer#15 ) + [50] (byte) main::active_balls#2 ← phi( main::@1/(byte) 0 main::@14/(byte) main::active_balls#8 ) + [50] (byte) main::timer_2#2 ← phi( main::@1/(byte) 0 main::@14/(byte) main::timer_2#1 ) + to:main::@4 +main::@4: scope:[main] from main::@3 + [51] (byte) main::timer_2#1 ← ++ (byte) main::timer_2#2 + [52] (byte) main::h_bar#1 ← *((const to_nomodify byte*) sine_table + (byte) main::timer_2#1) + (byte) $60 + [53] (byte~) main::$14 ← (byte) main::h_bar#1 ^ (byte) $ff + [54] (volatile byte) scroll_y ← (byte~) main::$14 + [55] if((byte) main::active_balls#2>=(byte) $32) goto main::@5 + to:main::@15 +main::@15: scope:[main] from main::@4 + [56] (byte) main::timer#1 ← ++ (byte) main::timer#3 + [57] if((byte) main::timer#3!=(byte) 9) goto main::@25 + to:main::@16 +main::@16: scope:[main] from main::@15 + [58] (byte) main::active_balls#1 ← ++ (byte) main::active_balls#2 + [59] (byte~) main::$38 ← (byte) main::active_balls#1 << (byte) 3 + [60] *((word*)(const struct $0*) balls + (byte~) main::$38) ← (byte) 0 + [61] *((word*)(const struct $0*) balls+(byte) 2 + (byte~) main::$38) ← (byte) 0 + to:main::@5 +main::@5: scope:[main] from main::@16 main::@25 main::@4 + [62] (byte) main::timer#15 ← phi( main::@25/(byte) main::timer#21 main::@16/(byte) 0 main::@4/(byte) main::timer#3 ) + [62] (byte) main::active_balls#8 ← phi( main::@25/(byte) main::active_balls#2 main::@16/(byte) main::active_balls#1 main::@4/(byte) main::active_balls#2 ) + to:main::@6 +main::@6: scope:[main] from main::@10 main::@5 + [63] (byte) main::sprite_idx#3 ← phi( main::@10/(byte) main::sprite_idx#2 main::@5/(byte) 0 ) + [63] (word) main::i#10 ← phi( main::@10/(word) main::i#4 main::@5/(byte) 0 ) + [64] if((word) main::i#10<(byte) main::active_balls#8) goto main::@7 + to:main::@8 +main::@8: scope:[main] from main::@6 + [65] *((byte*) 8193) ← (byte) $98 + to:main::@13 +main::@13: scope:[main] from main::@13 main::@8 + [66] if((byte) 0==(volatile byte) vblank_hit) goto main::@13 + to:main::@14 +main::@14: scope:[main] from main::@13 + [67] (volatile byte) vblank_hit ← (byte) 0 + [68] *((byte*) 8193) ← (byte) $18 + to:main::@3 +main::@7: scope:[main] from main::@6 + [69] (word~) main::$40 ← (word) main::i#10 << (byte) 3 + [70] (word*~) main::$61 ← (word*)(const struct $0*) balls + (word~) main::$40 + [71] (word*~) main::$62 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$40 + [72] (word*~) main::$63 ← (word*)(const struct $0*) balls + (word~) main::$40 + [73] *((word*~) main::$63) ← *((word*~) main::$61) + *((word*~) main::$62) + [74] (word*~) main::$64 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 + [75] (word*~) main::$65 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 + [76] *((word*~) main::$65) ← *((word*~) main::$64) + (byte) $10 + [77] (word*~) main::$66 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$40 + [78] (word*~) main::$67 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 + [79] (word*~) main::$68 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$40 + [80] *((word*~) main::$68) ← *((word*~) main::$66) + *((word*~) main::$67) + [81] (word*~) main::$69 ← (word*)(const struct $0*) balls + (word~) main::$40 + [82] (word~) main::$20 ← *((word*~) main::$69) >> (byte) 8 + [83] if((word~) main::$20>=(byte) 8) goto main::@9 + to:main::@11 +main::@11: scope:[main] from main::@7 + [84] (word~) main::$45 ← (word) main::i#10 << (byte) 3 + [85] (word*~) main::$72 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$45 + [86] (word*~) main::$73 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$45 + [87] *((word*~) main::$73) ← *((word*~) main::$72) ^ (word) $ffff + to:main::@9 +main::@9: scope:[main] from main::@11 main::@7 + [88] (word~) main::$44 ← (word) main::i#10 << (byte) 3 + [89] (word*~) main::$70 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$44 + [90] (word~) main::$23 ← *((word*~) main::$70) >> (byte) 8 + [91] (word*~) main::$71 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$44 + [92] (word~) main::$25 ← *((word*~) main::$71) >> (byte) 8 + [93] (byte~) main::$26 ← (byte) main::h_bar#1 + (byte) 8 + [94] if((word~) main::$23<(byte) main::h_bar#1) goto main::@10 + to:main::@24 +main::@24: scope:[main] from main::@9 + [95] if((word~) main::$25>=(byte~) main::$26) goto main::@10 + to:main::@12 +main::@12: scope:[main] from main::@24 + [96] (word~) main::$53 ← (word) main::i#10 << (byte) 3 + [97] (word*~) main::$76 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$53 + [98] (word*~) main::$77 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$53 + [99] *((word*~) main::$77) ← *((word*~) main::$76) ^ (word) $ffff + [100] (byte~) main::$30 ← (byte) main::h_bar#1 - (byte) 2 + [101] (word~) main::$56 ← (word)(byte~) main::$30 + [102] (word~) main::$31 ← (word~) main::$56 << (byte) 8 + [103] (word*~) main::$78 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$53 + [104] *((word*~) main::$78) ← (word~) main::$31 + to:main::@10 +main::@10: scope:[main] from main::@12 main::@24 main::@9 + [105] (word~) main::$50 ← (word) main::i#10 << (byte) 3 + [106] (word*~) main::$74 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$50 + [107] (word~) main::$32 ← *((word*~) main::$74) >> (byte) 8 + [108] (byte~) main::$48 ← (byte) main::sprite_idx#3 << (byte) 2 + [109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$48) ← (byte)(word~) main::$32 + [110] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$48) ← (byte) $a + [111] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$48) ← (byte) 3 + [112] (word*~) main::$75 ← (word*)(const struct $0*) balls + (word~) main::$50 + [113] (word~) main::$33 ← *((word*~) main::$75) >> (byte) 8 + [114] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$48) ← (byte)(word~) main::$33 + [115] (byte) main::sprite_idx#2 ← ++ (byte) main::sprite_idx#3 + [116] (word) main::i#4 ← ++ (word) main::i#10 + to:main::@6 +main::@25: scope:[main] from main::@15 + [117] (byte) main::timer#21 ← (byte) main::timer#1 + to:main::@5 +main::@2: scope:[main] from main::@1 + [118] phi() + [119] call rand + [120] (word) rand::return#2 ← (word) rand::return#0 + to:main::@22 +main::@22: scope:[main] from main::@2 + [121] (word~) main::$9 ← (word) rand::return#2 + [122] (word~) main::$10 ← (word~) main::$9 & (word) $3ff + [123] (word~) main::$35 ← (word) main::i#14 << (byte) 3 + [124] (word*~) main::$59 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$35 + [125] *((word*~) main::$59) ← (word~) main::$10 + [126] call rand + [127] (word) rand::return#3 ← (word) rand::return#0 + to:main::@23 +main::@23: scope:[main] from main::@22 + [128] (word~) main::$11 ← (word) rand::return#3 + [129] (byte~) main::$12 ← (word~) main::$11 & (byte) $ff + [130] (word~) main::$36 ← (word) main::i#14 << (byte) 3 + [131] (word*~) main::$60 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$36 + [132] *((word*~) main::$60) ← (byte~) main::$12 + [133] (word) main::i#2 ← ++ (word) main::i#14 + to:main::@1 + +(void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size) +ppuDataTransfer: scope:[ppuDataTransfer] from main::@17 main::@21 + [134] (nomodify void*) ppuDataTransfer::cpuData#2 ← phi( main::@17/(void*)(const to_nomodify byte*) palette main::@21/(void*)(const to_nomodify byte*) h_bar_tilemap ) + [134] (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 ← phi( main::@17/(void*)(const nomodify byte*) PPU_PALETTE main::@21/(void*) 8256 ) + to:ppuDataTransfer::ppuDataPrepare1 +ppuDataTransfer::ppuDataPrepare1: scope:[ppuDataTransfer] from ppuDataTransfer + [135] (byte~) ppuDataTransfer::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 + [136] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$0 + [137] (byte~) ppuDataTransfer::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 + [138] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$1 + to:ppuDataTransfer::@3 +ppuDataTransfer::@3: scope:[ppuDataTransfer] from ppuDataTransfer::ppuDataPrepare1 + [139] (byte*) ppuDataTransfer::cpuSrc#6 ← (byte*)(nomodify void*) ppuDataTransfer::cpuData#2 + to:ppuDataTransfer::@1 +ppuDataTransfer::@1: scope:[ppuDataTransfer] from ppuDataTransfer::@3 ppuDataTransfer::@4 + [140] (byte*) ppuDataTransfer::cpuSrc#2 ← phi( ppuDataTransfer::@3/(byte*) ppuDataTransfer::cpuSrc#6 ppuDataTransfer::@4/(byte*) ppuDataTransfer::cpuSrc#1 ) + [140] (word) ppuDataTransfer::i#2 ← phi( ppuDataTransfer::@3/(word) 0 ppuDataTransfer::@4/(word) ppuDataTransfer::i#1 ) + [141] if((word) ppuDataTransfer::i#2<(byte) $20*(const byte) SIZEOF_BYTE) goto ppuDataTransfer::@2 + to:ppuDataTransfer::@return +ppuDataTransfer::@return: scope:[ppuDataTransfer] from ppuDataTransfer::@1 + [142] return + to:@return +ppuDataTransfer::@2: scope:[ppuDataTransfer] from ppuDataTransfer::@1 + [143] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) + to:ppuDataTransfer::ppuDataPut1 +ppuDataTransfer::ppuDataPut1: scope:[ppuDataTransfer] from ppuDataTransfer::@2 + [144] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 + to:ppuDataTransfer::@4 +ppuDataTransfer::@4: scope:[ppuDataTransfer] from ppuDataTransfer::ppuDataPut1 + [145] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 + [146] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2 + to:ppuDataTransfer::@1 + +(void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size) +ppuDataFill: scope:[ppuDataFill] from main::@19 main::@20 + [147] (word) ppuDataFill::size#3 ← phi( main::@19/(word)(number) $20*(number) $1e main::@20/(byte) $40 ) + [147] (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ← phi( main::@19/(void*)(const nomodify byte*) PPU_NAME_TABLE_0 main::@20/(void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 ) + to:ppuDataFill::ppuDataPrepare1 +ppuDataFill::ppuDataPrepare1: scope:[ppuDataFill] from ppuDataFill + [148] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 + [149] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 + [150] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 + [151] *((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 + [152] (word) ppuDataFill::i#2 ← phi( ppuDataFill::ppuDataPrepare1/(word) 0 ppuDataFill::@2/(word) ppuDataFill::i#1 ) + [153] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 + to:ppuDataFill::@return +ppuDataFill::@return: scope:[ppuDataFill] from ppuDataFill::@1 + [154] return + to:@return +ppuDataFill::ppuDataPut1: scope:[ppuDataFill] from ppuDataFill::@1 + [155] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) 0 + to:ppuDataFill::@2 +ppuDataFill::@2: scope:[ppuDataFill] from ppuDataFill::ppuDataPut1 + [156] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2 + to:ppuDataFill::@1 + +(word()) rand() +rand: scope:[rand] from main::@2 main::@22 + [157] (word) rand_state#10 ← phi( main::@2/(word) rand_state#17 main::@22/(word) rand_state#11 ) + [158] (word~) rand::$0 ← (word) rand_state#10 << (byte) 7 + [159] (word) rand_state#0 ← (word) rand_state#10 ^ (word~) rand::$0 + [160] (word~) rand::$1 ← (word) rand_state#0 >> (byte) 9 + [161] (word) rand_state#1 ← (word) rand_state#0 ^ (word~) rand::$1 + [162] (word~) rand::$2 ← (word) rand_state#1 << (byte) 8 + [163] (word) rand_state#11 ← (word) rand_state#1 ^ (word~) rand::$2 + [164] (word) rand::return#0 ← (word) rand_state#11 + to:rand::@return +rand::@return: scope:[rand] from rand + [165] return + to:@return diff --git a/src/test/ref/complex/nes-balls/kickballs-3.log b/src/test/ref/complex/nes-balls/kickballs-3.log new file mode 100644 index 000000000..b3cda8771 --- /dev/null +++ b/src/test/ref/complex/nes-balls/kickballs-3.log @@ -0,0 +1,7286 @@ +Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER +Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER +Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER +Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER +Resolved forward reference SPRITE_BUFFER to (const struct SpriteData*) SPRITE_BUFFER +Fixing struct type size struct printf_buffer_number to 12 +Fixing struct type size struct printf_buffer_number to 12 +Fixing struct type SIZE_OF struct printf_buffer_number to 12 +Fixing struct type SIZE_OF struct printf_buffer_number to 12 +Inlined call call disableVideoOutput +Inlined call call disableAudioOutput +Inlined call call clearVBlankFlag +Inlined call call waitForVBlank +Inlined call call waitForVBlank +Inlined call call ppuDataPrepare (nomodify void*) ppuDataFill::ppuData +Inlined call call ppuDataPut (byte) ppuDataFill::val +Inlined call call ppuDataPrepare (nomodify void*) ppuDataTransfer::ppuData +Inlined call call ppuDataPut *((byte*) ppuDataTransfer::cpuSrc) +Inlined call call ppuDataPrepare (nomodify void*) ppuDataFetch::ppuData +Inlined call (byte~) ppuDataFetch::$2 ← call ppuDataRead +Inlined call call ppuDataPrepare (nomodify void*) ppuDataPutTile::ppuData +Inlined call call ppuDataPut *((byte*) ppuDataPutTile::tile + (number) 0) +Inlined call call ppuDataPut *((byte*) ppuDataPutTile::tile + (number) 1) +Inlined call call ppuDataPrepare (void*)(byte*~) ppuDataPutTile::$3 +Inlined call call ppuDataPut *((byte*) ppuDataPutTile::tile + (number) 2) +Inlined call call ppuDataPut *((byte*) ppuDataPutTile::tile + (number) 3) +Inlined call call ppuDataPrepare (nomodify void*) ppuDataSet::ppuData +Inlined call call ppuDataPut (byte) ppuDataSet::val +Inlined call call ppuDataPrepare (nomodify void*) ppuDataGet::ppuData +Inlined call (byte~) ppuDataGet::$1 ← call ppuDataRead +Inlined call call initNES +Inlined call call enableVideoOutput +Inlined call call ppuSpriteBufferDmaTransfer (const struct SpriteData*) SPRITE_BUFFER +Inlined call call __init +Eliminating unused variable with no statement (struct printf_buffer_number) printf_buffer + +CONTROL FLOW GRAPH SSA + +(void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size) +ppuDataFill: scope:[ppuDataFill] from main::@20 main::@21 + (byte) ppuDataFill::val#8 ← phi( main::@20/(byte) ppuDataFill::val#0 main::@21/(byte) ppuDataFill::val#1 ) + (word) ppuDataFill::size#7 ← phi( main::@20/(word) ppuDataFill::size#0 main::@21/(word) ppuDataFill::size#1 ) + (nomodify void*) ppuDataFill::ppuData#2 ← phi( main::@20/(nomodify void*) ppuDataFill::ppuData#0 main::@21/(nomodify void*) ppuDataFill::ppuData#1 ) + (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ← (nomodify void*) ppuDataFill::ppuData#2 + to:ppuDataFill::ppuDataPrepare1 +ppuDataFill::ppuDataPrepare1: scope:[ppuDataFill] from ppuDataFill + (byte) ppuDataFill::val#6 ← phi( ppuDataFill/(byte) ppuDataFill::val#8 ) + (word) ppuDataFill::size#5 ← phi( ppuDataFill/(word) ppuDataFill::size#7 ) + (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#1 ← phi( ppuDataFill/(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ) + (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#1 + (byte*~) ppuDataFill::ppuDataPrepare1_$4 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) ppuDataFill::ppuDataPrepare1_$2 ← (byte*~) ppuDataFill::ppuDataPrepare1_$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR + *((byte*~) ppuDataFill::ppuDataPrepare1_$2) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 + (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#1 + (byte*~) ppuDataFill::ppuDataPrepare1_$5 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) ppuDataFill::ppuDataPrepare1_$3 ← (byte*~) ppuDataFill::ppuDataPrepare1_$5 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR + *((byte*~) ppuDataFill::ppuDataPrepare1_$3) ← (byte~) ppuDataFill::ppuDataPrepare1_$1 + to:ppuDataFill::@3 +ppuDataFill::@3: scope:[ppuDataFill] from ppuDataFill::ppuDataPrepare1 + (byte) ppuDataFill::val#4 ← phi( ppuDataFill::ppuDataPrepare1/(byte) ppuDataFill::val#6 ) + (word) ppuDataFill::size#3 ← phi( ppuDataFill::ppuDataPrepare1/(word) ppuDataFill::size#5 ) + (word) ppuDataFill::i#0 ← (word) 0 + to:ppuDataFill::@1 +ppuDataFill::@1: scope:[ppuDataFill] from ppuDataFill::@3 ppuDataFill::@4 + (byte) ppuDataFill::val#3 ← phi( ppuDataFill::@3/(byte) ppuDataFill::val#4 ppuDataFill::@4/(byte) ppuDataFill::val#5 ) + (word) ppuDataFill::size#2 ← phi( ppuDataFill::@3/(word) ppuDataFill::size#3 ppuDataFill::@4/(word) ppuDataFill::size#4 ) + (word) ppuDataFill::i#2 ← phi( ppuDataFill::@3/(word) ppuDataFill::i#0 ppuDataFill::@4/(word) ppuDataFill::i#1 ) + (bool~) ppuDataFill::$1 ← (word) ppuDataFill::i#2 < (word) ppuDataFill::size#2 + if((bool~) ppuDataFill::$1) goto ppuDataFill::@2 + to:ppuDataFill::@return +ppuDataFill::@2: scope:[ppuDataFill] from ppuDataFill::@1 + (word) ppuDataFill::size#8 ← phi( ppuDataFill::@1/(word) ppuDataFill::size#2 ) + (word) ppuDataFill::i#5 ← phi( ppuDataFill::@1/(word) ppuDataFill::i#2 ) + (byte) ppuDataFill::val#2 ← phi( ppuDataFill::@1/(byte) ppuDataFill::val#3 ) + (byte) ppuDataFill::ppuDataPut1_val#0 ← (byte) ppuDataFill::val#2 + to:ppuDataFill::ppuDataPut1 +ppuDataFill::ppuDataPut1: scope:[ppuDataFill] from ppuDataFill::@2 + (byte) ppuDataFill::val#7 ← phi( ppuDataFill::@2/(byte) ppuDataFill::val#2 ) + (word) ppuDataFill::size#6 ← phi( ppuDataFill::@2/(word) ppuDataFill::size#8 ) + (word) ppuDataFill::i#4 ← phi( ppuDataFill::@2/(word) ppuDataFill::i#5 ) + (byte) ppuDataFill::ppuDataPut1_val#1 ← phi( ppuDataFill::@2/(byte) ppuDataFill::ppuDataPut1_val#0 ) + (byte*~) ppuDataFill::ppuDataPut1_$1 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) ppuDataFill::ppuDataPut1_$0 ← (byte*~) ppuDataFill::ppuDataPut1_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA + *((byte*~) ppuDataFill::ppuDataPut1_$0) ← (byte) ppuDataFill::ppuDataPut1_val#1 + to:ppuDataFill::@4 +ppuDataFill::@4: scope:[ppuDataFill] from ppuDataFill::ppuDataPut1 + (byte) ppuDataFill::val#5 ← phi( ppuDataFill::ppuDataPut1/(byte) ppuDataFill::val#7 ) + (word) ppuDataFill::size#4 ← phi( ppuDataFill::ppuDataPut1/(word) ppuDataFill::size#6 ) + (word) ppuDataFill::i#3 ← phi( ppuDataFill::ppuDataPut1/(word) ppuDataFill::i#4 ) + (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#3 + to:ppuDataFill::@1 +ppuDataFill::@return: scope:[ppuDataFill] from ppuDataFill::@1 + return + to:@return + +(void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size) +ppuDataTransfer: scope:[ppuDataTransfer] from main::@18 main::@22 + (word) ppuDataTransfer::size#7 ← phi( main::@18/(word) ppuDataTransfer::size#0 main::@22/(word) ppuDataTransfer::size#1 ) + (nomodify void*) ppuDataTransfer::cpuData#4 ← phi( main::@18/(nomodify void*) ppuDataTransfer::cpuData#0 main::@22/(nomodify void*) ppuDataTransfer::cpuData#1 ) + (nomodify void*) ppuDataTransfer::ppuData#2 ← phi( main::@18/(nomodify void*) ppuDataTransfer::ppuData#0 main::@22/(nomodify void*) ppuDataTransfer::ppuData#1 ) + (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 ← (nomodify void*) ppuDataTransfer::ppuData#2 + to:ppuDataTransfer::ppuDataPrepare1 +ppuDataTransfer::ppuDataPrepare1: scope:[ppuDataTransfer] from ppuDataTransfer + (word) ppuDataTransfer::size#5 ← phi( ppuDataTransfer/(word) ppuDataTransfer::size#7 ) + (nomodify void*) ppuDataTransfer::cpuData#3 ← phi( ppuDataTransfer/(nomodify void*) ppuDataTransfer::cpuData#4 ) + (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#1 ← phi( ppuDataTransfer/(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 ) + (byte~) ppuDataTransfer::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#1 + (byte*~) ppuDataTransfer::ppuDataPrepare1_$4 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) ppuDataTransfer::ppuDataPrepare1_$2 ← (byte*~) ppuDataTransfer::ppuDataPrepare1_$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR + *((byte*~) ppuDataTransfer::ppuDataPrepare1_$2) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$0 + (byte~) ppuDataTransfer::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#1 + (byte*~) ppuDataTransfer::ppuDataPrepare1_$5 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) ppuDataTransfer::ppuDataPrepare1_$3 ← (byte*~) ppuDataTransfer::ppuDataPrepare1_$5 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR + *((byte*~) ppuDataTransfer::ppuDataPrepare1_$3) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$1 + to:ppuDataTransfer::@3 +ppuDataTransfer::@3: scope:[ppuDataTransfer] from ppuDataTransfer::ppuDataPrepare1 + (word) ppuDataTransfer::size#3 ← phi( ppuDataTransfer::ppuDataPrepare1/(word) ppuDataTransfer::size#5 ) + (nomodify void*) ppuDataTransfer::cpuData#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(nomodify void*) ppuDataTransfer::cpuData#3 ) + (byte*) ppuDataTransfer::cpuSrc#0 ← (byte*)(nomodify void*) ppuDataTransfer::cpuData#2 + (word) ppuDataTransfer::i#0 ← (word) 0 + to:ppuDataTransfer::@1 +ppuDataTransfer::@1: scope:[ppuDataTransfer] from ppuDataTransfer::@3 ppuDataTransfer::@4 + (byte*) ppuDataTransfer::cpuSrc#4 ← phi( ppuDataTransfer::@3/(byte*) ppuDataTransfer::cpuSrc#0 ppuDataTransfer::@4/(byte*) ppuDataTransfer::cpuSrc#1 ) + (word) ppuDataTransfer::size#2 ← phi( ppuDataTransfer::@3/(word) ppuDataTransfer::size#3 ppuDataTransfer::@4/(word) ppuDataTransfer::size#4 ) + (word) ppuDataTransfer::i#2 ← phi( ppuDataTransfer::@3/(word) ppuDataTransfer::i#0 ppuDataTransfer::@4/(word) ppuDataTransfer::i#1 ) + (bool~) ppuDataTransfer::$1 ← (word) ppuDataTransfer::i#2 < (word) ppuDataTransfer::size#2 + if((bool~) ppuDataTransfer::$1) goto ppuDataTransfer::@2 + to:ppuDataTransfer::@return +ppuDataTransfer::@2: scope:[ppuDataTransfer] from ppuDataTransfer::@1 + (word) ppuDataTransfer::size#8 ← phi( ppuDataTransfer::@1/(word) ppuDataTransfer::size#2 ) + (word) ppuDataTransfer::i#5 ← phi( ppuDataTransfer::@1/(word) ppuDataTransfer::i#2 ) + (byte*) ppuDataTransfer::cpuSrc#2 ← phi( ppuDataTransfer::@1/(byte*) ppuDataTransfer::cpuSrc#4 ) + (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) + to:ppuDataTransfer::ppuDataPut1 +ppuDataTransfer::ppuDataPut1: scope:[ppuDataTransfer] from ppuDataTransfer::@2 + (word) ppuDataTransfer::size#6 ← phi( ppuDataTransfer::@2/(word) ppuDataTransfer::size#8 ) + (word) ppuDataTransfer::i#4 ← phi( ppuDataTransfer::@2/(word) ppuDataTransfer::i#5 ) + (byte*) ppuDataTransfer::cpuSrc#5 ← phi( ppuDataTransfer::@2/(byte*) ppuDataTransfer::cpuSrc#2 ) + (byte) ppuDataTransfer::ppuDataPut1_val#1 ← phi( ppuDataTransfer::@2/(byte) ppuDataTransfer::ppuDataPut1_val#0 ) + (byte*~) ppuDataTransfer::ppuDataPut1_$1 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) ppuDataTransfer::ppuDataPut1_$0 ← (byte*~) ppuDataTransfer::ppuDataPut1_$1 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA + *((byte*~) ppuDataTransfer::ppuDataPut1_$0) ← (byte) ppuDataTransfer::ppuDataPut1_val#1 + to:ppuDataTransfer::@4 +ppuDataTransfer::@4: scope:[ppuDataTransfer] from ppuDataTransfer::ppuDataPut1 + (word) ppuDataTransfer::size#4 ← phi( ppuDataTransfer::ppuDataPut1/(word) ppuDataTransfer::size#6 ) + (word) ppuDataTransfer::i#3 ← phi( ppuDataTransfer::ppuDataPut1/(word) ppuDataTransfer::i#4 ) + (byte*) ppuDataTransfer::cpuSrc#3 ← phi( ppuDataTransfer::ppuDataPut1/(byte*) ppuDataTransfer::cpuSrc#5 ) + (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#3 + (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#3 + to:ppuDataTransfer::@1 +ppuDataTransfer::@return: scope:[ppuDataTransfer] from ppuDataTransfer::@1 + return + to:@return + +(word()) rand() +rand: scope:[rand] from main::@2 main::@24 + (word) rand_state#10 ← phi( main::@2/(word) rand_state#17 main::@24/(word) rand_state#4 ) + (word~) rand::$0 ← (word) rand_state#10 << (number) 7 + (word) rand_state#0 ← (word) rand_state#10 ^ (word~) rand::$0 + (word~) rand::$1 ← (word) rand_state#0 >> (number) 9 + (word) rand_state#1 ← (word) rand_state#0 ^ (word~) rand::$1 + (word~) rand::$2 ← (word) rand_state#1 << (number) 8 + (word) rand_state#2 ← (word) rand_state#1 ^ (word~) rand::$2 + (word) rand::return#0 ← (word) rand_state#2 + to:rand::@return +rand::@return: scope:[rand] from rand + (word) rand_state#11 ← phi( rand/(word) rand_state#2 ) + (word) rand::return#4 ← phi( rand/(word) rand::return#0 ) + (word) rand::return#1 ← (word) rand::return#4 + (word) rand_state#3 ← (word) rand_state#11 + return + to:@return + +(signed word()) main() +main: scope:[main] from __start::@1 + (word) rand_state#53 ← phi( __start::@1/(word) rand_state#19 ) + to:main::initNES1 +main::initNES1: scope:[main] from main + (word) rand_state#52 ← phi( main/(word) rand_state#53 ) + asm { cld ldx#$ff txs } + to:main::initNES1_disableVideoOutput1 +main::initNES1_disableVideoOutput1: scope:[main] from main::initNES1 + (word) rand_state#51 ← phi( main::initNES1/(word) rand_state#52 ) + (byte*~) main::initNES1_disableVideoOutput1_$2 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) main::initNES1_disableVideoOutput1_$0 ← (byte*~) main::initNES1_disableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL + *((byte*~) main::initNES1_disableVideoOutput1_$0) ← (number) 0 + (byte*~) main::initNES1_disableVideoOutput1_$3 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) main::initNES1_disableVideoOutput1_$1 ← (byte*~) main::initNES1_disableVideoOutput1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK + *((byte*~) main::initNES1_disableVideoOutput1_$1) ← (number) 0 + to:main::initNES1_disableAudioOutput1 +main::initNES1_disableAudioOutput1: scope:[main] from main::initNES1_disableVideoOutput1 + (word) rand_state#50 ← phi( main::initNES1_disableVideoOutput1/(word) rand_state#51 ) + *((const nomodify byte*) FR_COUNTER) ← (number) $40 + (byte*~) main::initNES1_disableAudioOutput1_$1 ← (byte*)(const struct RICOH_2A03*) APU + (byte*~) main::initNES1_disableAudioOutput1_$0 ← (byte*~) main::initNES1_disableAudioOutput1_$1 + (const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ + *((byte*~) main::initNES1_disableAudioOutput1_$0) ← (number) $40 + to:main::initNES1_clearVBlankFlag1 +main::initNES1_clearVBlankFlag1: scope:[main] from main::initNES1_disableAudioOutput1 + (word) rand_state#49 ← phi( main::initNES1_disableAudioOutput1/(word) rand_state#50 ) + asm { ldaPPU_PPUSTATUS } + to:main::initNES1_waitForVBlank1 +main::initNES1_waitForVBlank1: scope:[main] from main::initNES1_clearVBlankFlag1 + (word) rand_state#48 ← phi( main::initNES1_clearVBlankFlag1/(word) rand_state#49 ) + to:main::initNES1_waitForVBlank1_@1 +main::initNES1_waitForVBlank1_@1: scope:[main] from main::initNES1_waitForVBlank1 main::initNES1_waitForVBlank1_@1 + (word) rand_state#47 ← phi( main::initNES1_waitForVBlank1/(word) rand_state#48 main::initNES1_waitForVBlank1_@1/(word) rand_state#47 ) + (byte*~) main::initNES1_waitForVBlank1_$3 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) main::initNES1_waitForVBlank1_$2 ← (byte*~) main::initNES1_waitForVBlank1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS + (number~) main::initNES1_waitForVBlank1_$0 ← *((byte*~) main::initNES1_waitForVBlank1_$2) & (number) $80 + (bool~) main::initNES1_waitForVBlank1_$4 ← (number) 0 != (number~) main::initNES1_waitForVBlank1_$0 + (bool~) main::initNES1_waitForVBlank1_$1 ← ! (bool~) main::initNES1_waitForVBlank1_$4 + if((bool~) main::initNES1_waitForVBlank1_$1) goto main::initNES1_waitForVBlank1_@1 + to:main::initNES1_@6 +main::initNES1_@6: scope:[main] from main::initNES1_waitForVBlank1_@1 + (word) rand_state#46 ← phi( main::initNES1_waitForVBlank1_@1/(word) rand_state#47 ) + (byte) main::initNES1_i#0 ← (byte) 0 + to:main::initNES1_@1 +main::initNES1_@1: scope:[main] from main::initNES1_@1 main::initNES1_@6 + (word) rand_state#45 ← phi( main::initNES1_@1/(word) rand_state#45 main::initNES1_@6/(word) rand_state#46 ) + (byte) main::initNES1_i#2 ← phi( main::initNES1_@1/(byte) main::initNES1_i#1 main::initNES1_@6/(byte) main::initNES1_i#0 ) + *((const nomodify byte*) MEMORY+(number) 0 + (byte) main::initNES1_i#2) ← (number) 0 + *((const nomodify byte*) MEMORY+(number) $100 + (byte) main::initNES1_i#2) ← (number) 0 + *((const nomodify byte*) MEMORY+(number) $200 + (byte) main::initNES1_i#2) ← (number) 0 + *((const nomodify byte*) MEMORY+(number) $300 + (byte) main::initNES1_i#2) ← (number) 0 + *((const nomodify byte*) MEMORY+(number) $400 + (byte) main::initNES1_i#2) ← (number) 0 + *((const nomodify byte*) MEMORY+(number) $500 + (byte) main::initNES1_i#2) ← (number) 0 + *((const nomodify byte*) MEMORY+(number) $600 + (byte) main::initNES1_i#2) ← (number) 0 + *((const nomodify byte*) MEMORY+(number) $700 + (byte) main::initNES1_i#2) ← (number) 0 + (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 + (bool~) main::initNES1_$5 ← (number) 0 != (byte) main::initNES1_i#1 + if((bool~) main::initNES1_$5) goto main::initNES1_@1 + to:main::initNES1_waitForVBlank2 +main::initNES1_waitForVBlank2: scope:[main] from main::initNES1_@1 + (word) rand_state#44 ← phi( main::initNES1_@1/(word) rand_state#45 ) + to:main::initNES1_waitForVBlank2_@1 +main::initNES1_waitForVBlank2_@1: scope:[main] from main::initNES1_waitForVBlank2 main::initNES1_waitForVBlank2_@1 + (word) rand_state#43 ← phi( main::initNES1_waitForVBlank2/(word) rand_state#44 main::initNES1_waitForVBlank2_@1/(word) rand_state#43 ) + (byte*~) main::initNES1_waitForVBlank2_$3 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) main::initNES1_waitForVBlank2_$2 ← (byte*~) main::initNES1_waitForVBlank2_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS + (number~) main::initNES1_waitForVBlank2_$0 ← *((byte*~) main::initNES1_waitForVBlank2_$2) & (number) $80 + (bool~) main::initNES1_waitForVBlank2_$4 ← (number) 0 != (number~) main::initNES1_waitForVBlank2_$0 + (bool~) main::initNES1_waitForVBlank2_$1 ← ! (bool~) main::initNES1_waitForVBlank2_$4 + if((bool~) main::initNES1_waitForVBlank2_$1) goto main::initNES1_waitForVBlank2_@1 + to:main::initNES1_@7 +main::initNES1_@7: scope:[main] from main::initNES1_waitForVBlank2_@1 + (word) rand_state#42 ← phi( main::initNES1_waitForVBlank2_@1/(word) rand_state#43 ) + asm { ldaPPU_PPUSTATUS } + to:main::@18 +main::@18: scope:[main] from main::initNES1_@7 + (word) rand_state#39 ← phi( main::initNES1_@7/(word) rand_state#42 ) + (byte~) main::$1 ← sizeof (const to_nomodify byte*) palette + (nomodify void*) ppuDataTransfer::ppuData#0 ← (void*)(const nomodify byte*) PPU_PALETTE + (nomodify void*) ppuDataTransfer::cpuData#0 ← (void*)(const to_nomodify byte*) palette + (word) ppuDataTransfer::size#0 ← (byte~) main::$1 + call ppuDataTransfer + to:main::@20 +main::@20: scope:[main] from main::@18 + (word) rand_state#33 ← phi( main::@18/(word) rand_state#39 ) + (nomodify void*) ppuDataFill::ppuData#0 ← (void*)(const nomodify byte*) PPU_NAME_TABLE_0 + (byte) ppuDataFill::val#0 ← (number) 0 + (word) ppuDataFill::size#0 ← (number) $20*(number) $1e + call ppuDataFill + to:main::@21 +main::@21: scope:[main] from main::@20 + (word) rand_state#30 ← phi( main::@20/(word) rand_state#33 ) + (nomodify void*) ppuDataFill::ppuData#1 ← (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 + (byte) ppuDataFill::val#1 ← (number) 0 + (word) ppuDataFill::size#1 ← (number) $40 + call ppuDataFill + to:main::@22 +main::@22: scope:[main] from main::@21 + (word) rand_state#28 ← phi( main::@21/(word) rand_state#30 ) + (byte~) main::$5 ← sizeof (const to_nomodify byte*) h_bar_tilemap + (nomodify void*) ppuDataTransfer::ppuData#1 ← (void*)(number) $2040 + (nomodify void*) ppuDataTransfer::cpuData#1 ← (void*)(const to_nomodify byte*) h_bar_tilemap + (word) ppuDataTransfer::size#1 ← (byte~) main::$5 + call ppuDataTransfer + to:main::@23 +main::@23: scope:[main] from main::@22 + (word) rand_state#26 ← phi( main::@22/(word) rand_state#28 ) + to:main::enableVideoOutput1 +main::enableVideoOutput1: scope:[main] from main::@23 + (word) rand_state#24 ← phi( main::@23/(word) rand_state#26 ) + (byte*~) main::enableVideoOutput1_$2 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) main::enableVideoOutput1_$0 ← (byte*~) main::enableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL + *((byte*~) main::enableVideoOutput1_$0) ← (number) $80 + (byte*~) main::enableVideoOutput1_$3 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) main::enableVideoOutput1_$1 ← (byte*~) main::enableVideoOutput1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK + *((byte*~) main::enableVideoOutput1_$1) ← (number) $1e + to:main::@19 +main::@19: scope:[main] from main::enableVideoOutput1 + (word) rand_state#22 ← phi( main::enableVideoOutput1/(word) rand_state#24 ) + (byte*~) main::$55 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) main::$54 ← (byte*~) main::$55 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL + *((byte*~) main::$54) ← (number) $88 + (word) main::i#0 ← (word) 0 + (byte) main::active_balls#0 ← (byte) 0 + (byte) main::timer#0 ← (byte) 0 + (byte) main::timer_2#0 ← (byte) 0 + (byte) main::h_bar#0 ← (byte) $80 + (byte) main::sprite_idx#0 ← (byte) 0 + (word) main::i#1 ← (number) 0 + to:main::@1 +main::@1: scope:[main] from main::@19 main::@25 + (byte) main::timer#6 ← phi( main::@19/(byte) main::timer#0 main::@25/(byte) main::timer#8 ) + (byte) main::active_balls#9 ← phi( main::@19/(byte) main::active_balls#0 main::@25/(byte) main::active_balls#13 ) + (byte) main::timer_2#4 ← phi( main::@19/(byte) main::timer_2#0 main::@25/(byte) main::timer_2#6 ) + (word) rand_state#20 ← phi( main::@19/(word) rand_state#22 main::@25/(word) rand_state#5 ) + (word) main::i#5 ← phi( main::@19/(word) main::i#1 main::@25/(word) main::i#2 ) + (bool~) main::$8 ← (word) main::i#5 < (number) $32 + if((bool~) main::$8) goto main::@2 + to:main::@3 +main::@2: scope:[main] from main::@1 + (byte) main::timer#12 ← phi( main::@1/(byte) main::timer#6 ) + (byte) main::active_balls#19 ← phi( main::@1/(byte) main::active_balls#9 ) + (byte) main::timer_2#10 ← phi( main::@1/(byte) main::timer_2#4 ) + (word) main::i#14 ← phi( main::@1/(word) main::i#5 ) + (word) rand_state#17 ← phi( main::@1/(word) rand_state#20 ) + call rand + (word) rand::return#2 ← (word) rand::return#1 + to:main::@24 +main::@24: scope:[main] from main::@2 + (byte) main::timer#10 ← phi( main::@2/(byte) main::timer#12 ) + (byte) main::active_balls#17 ← phi( main::@2/(byte) main::active_balls#19 ) + (byte) main::timer_2#8 ← phi( main::@2/(byte) main::timer_2#10 ) + (word) main::i#6 ← phi( main::@2/(word) main::i#14 ) + (word) rand_state#12 ← phi( main::@2/(word) rand_state#3 ) + (word) rand::return#5 ← phi( main::@2/(word) rand::return#2 ) + (word~) main::$9 ← (word) rand::return#5 + (word) rand_state#4 ← (word) rand_state#12 + (number~) main::$10 ← (word~) main::$9 & (number) $3ff + (word~) main::$35 ← (word) main::i#6 * (const byte) SIZEOF_STRUCT_$0 + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_VELOCITY + (word~) main::$35) ← (number~) main::$10 + call rand + (word) rand::return#3 ← (word) rand::return#1 + to:main::@25 +main::@25: scope:[main] from main::@24 + (byte) main::timer#8 ← phi( main::@24/(byte) main::timer#10 ) + (byte) main::active_balls#13 ← phi( main::@24/(byte) main::active_balls#17 ) + (byte) main::timer_2#6 ← phi( main::@24/(byte) main::timer_2#8 ) + (word) main::i#7 ← phi( main::@24/(word) main::i#6 ) + (word) rand_state#13 ← phi( main::@24/(word) rand_state#3 ) + (word) rand::return#6 ← phi( main::@24/(word) rand::return#3 ) + (word~) main::$11 ← (word) rand::return#6 + (word) rand_state#5 ← (word) rand_state#13 + (number~) main::$12 ← (word~) main::$11 & (number) $ff + (word~) main::$36 ← (word) main::i#7 * (const byte) SIZEOF_STRUCT_$0 + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$36) ← (number~) main::$12 + (word) main::i#2 ← ++ (word) main::i#7 + to:main::@1 +main::@3: scope:[main] from main::@1 main::@15 + (word) rand_state#21 ← phi( main::@1/(word) rand_state#20 main::@15/(word) rand_state#23 ) + (byte) main::timer#5 ← phi( main::@1/(byte) main::timer#6 main::@15/(byte) main::timer#7 ) + (byte) main::active_balls#5 ← phi( main::@1/(byte) main::active_balls#9 main::@15/(byte) main::active_balls#10 ) + (byte) main::timer_2#3 ← phi( main::@1/(byte) main::timer_2#4 main::@15/(byte) main::timer_2#5 ) + (bool~) main::$57 ← (number) 0 != (number) 1 + if((bool~) main::$57) goto main::@4 + to:main::@5 +main::@4: scope:[main] from main::@3 + (word) rand_state#36 ← phi( main::@3/(word) rand_state#21 ) + (byte) main::timer#4 ← phi( main::@3/(byte) main::timer#5 ) + (byte) main::active_balls#2 ← phi( main::@3/(byte) main::active_balls#5 ) + (byte) main::timer_2#2 ← phi( main::@3/(byte) main::timer_2#3 ) + (byte) main::timer_2#1 ← ++ (byte) main::timer_2#2 + (number~) main::$13 ← *((const to_nomodify byte*) sine_table + (byte) main::timer_2#1) + (number) $60 + (byte) main::h_bar#1 ← (number~) main::$13 + (number~) main::$14 ← (byte) main::h_bar#1 ^ (number) $ff + (volatile byte) scroll_y ← (number~) main::$14 + (bool~) main::$15 ← (byte) main::active_balls#2 < (number) $32 + (bool~) main::$16 ← ! (bool~) main::$15 + if((bool~) main::$16) goto main::@6 + to:main::@16 +main::@5: scope:[main] from main::@3 + (word) rand_state#18 ← phi( main::@3/(word) rand_state#21 ) + (signed word) main::return#0 ← (number) 0 + to:main::@return +main::@6: scope:[main] from main::@16 main::@17 main::@4 + (word) rand_state#32 ← phi( main::@16/(word) rand_state#34 main::@17/(word) rand_state#35 main::@4/(word) rand_state#36 ) + (byte) main::timer#15 ← phi( main::@16/(byte) main::timer#1 main::@17/(byte) main::timer#2 main::@4/(byte) main::timer#4 ) + (byte) main::timer_2#13 ← phi( main::@16/(byte) main::timer_2#14 main::@17/(byte) main::timer_2#15 main::@4/(byte) main::timer_2#1 ) + (byte) main::h_bar#8 ← phi( main::@16/(byte) main::h_bar#9 main::@17/(byte) main::h_bar#10 main::@4/(byte) main::h_bar#1 ) + (byte) main::active_balls#8 ← phi( main::@16/(byte) main::active_balls#6 main::@17/(byte) main::active_balls#1 main::@4/(byte) main::active_balls#2 ) + (byte) main::sprite_idx#1 ← (number) 0 + (word) main::i#3 ← (number) 0 + to:main::@7 +main::@16: scope:[main] from main::@4 + (word) rand_state#34 ← phi( main::@4/(word) rand_state#36 ) + (byte) main::timer_2#14 ← phi( main::@4/(byte) main::timer_2#1 ) + (byte) main::h_bar#9 ← phi( main::@4/(byte) main::h_bar#1 ) + (byte) main::active_balls#6 ← phi( main::@4/(byte) main::active_balls#2 ) + (byte) main::timer#3 ← phi( main::@4/(byte) main::timer#4 ) + (bool~) main::$17 ← (byte) main::timer#3 == (number) 9 + (byte) main::timer#1 ← ++ (byte) main::timer#3 + (bool~) main::$18 ← ! (bool~) main::$17 + if((bool~) main::$18) goto main::@6 + to:main::@17 +main::@17: scope:[main] from main::@16 + (word) rand_state#35 ← phi( main::@16/(word) rand_state#34 ) + (byte) main::timer_2#15 ← phi( main::@16/(byte) main::timer_2#14 ) + (byte) main::h_bar#10 ← phi( main::@16/(byte) main::h_bar#9 ) + (byte) main::active_balls#3 ← phi( main::@16/(byte) main::active_balls#6 ) + (byte) main::timer#2 ← (number) 0 + (byte) main::active_balls#1 ← ++ (byte) main::active_balls#3 + (byte~) main::$37 ← (byte) main::active_balls#1 * (const byte) SIZEOF_STRUCT_$0 + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (byte~) main::$37) ← (number) 0 + (byte~) main::$38 ← (byte) main::active_balls#1 * (const byte) SIZEOF_STRUCT_$0 + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (byte~) main::$38) ← (number) 0 + to:main::@6 +main::@7: scope:[main] from main::@11 main::@6 + (word) rand_state#29 ← phi( main::@11/(word) rand_state#31 main::@6/(word) rand_state#32 ) + (byte) main::timer#13 ← phi( main::@11/(byte) main::timer#14 main::@6/(byte) main::timer#15 ) + (byte) main::timer_2#11 ← phi( main::@11/(byte) main::timer_2#12 main::@6/(byte) main::timer_2#13 ) + (byte) main::sprite_idx#8 ← phi( main::@11/(byte) main::sprite_idx#2 main::@6/(byte) main::sprite_idx#1 ) + (byte) main::h_bar#6 ← phi( main::@11/(byte) main::h_bar#7 main::@6/(byte) main::h_bar#8 ) + (byte) main::active_balls#4 ← phi( main::@11/(byte) main::active_balls#7 main::@6/(byte) main::active_balls#8 ) + (word) main::i#8 ← phi( main::@11/(word) main::i#4 main::@6/(word) main::i#3 ) + (bool~) main::$19 ← (word) main::i#8 < (byte) main::active_balls#4 + if((bool~) main::$19) goto main::@8 + to:main::@9 +main::@8: scope:[main] from main::@7 + (word) rand_state#41 ← phi( main::@7/(word) rand_state#29 ) + (byte) main::timer#19 ← phi( main::@7/(byte) main::timer#13 ) + (byte) main::timer_2#19 ← phi( main::@7/(byte) main::timer_2#11 ) + (byte) main::active_balls#15 ← phi( main::@7/(byte) main::active_balls#4 ) + (byte) main::sprite_idx#7 ← phi( main::@7/(byte) main::sprite_idx#8 ) + (byte) main::h_bar#5 ← phi( main::@7/(byte) main::h_bar#6 ) + (word) main::i#9 ← phi( main::@7/(word) main::i#8 ) + (word~) main::$39 ← (word) main::i#9 * (const byte) SIZEOF_STRUCT_$0 + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$39) ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$39) + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_VELOCITY + (word~) main::$39) + (word~) main::$40 ← (word) main::i#9 * (const byte) SIZEOF_STRUCT_$0 + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$40) ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$40) + (number) $10 + (word~) main::$41 ← (word) main::i#9 * (const byte) SIZEOF_STRUCT_$0 + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$41) ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$41) + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$41) + (word~) main::$42 ← (word) main::i#9 * (const byte) SIZEOF_STRUCT_$0 + (word~) main::$20 ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$42) >> (number) 8 + (bool~) main::$21 ← (word~) main::$20 < (number) 8 + (bool~) main::$22 ← ! (bool~) main::$21 + if((bool~) main::$22) goto main::@10 + to:main::@12 +main::@9: scope:[main] from main::@7 + (word) rand_state#27 ← phi( main::@7/(word) rand_state#29 ) + (byte) main::timer#11 ← phi( main::@7/(byte) main::timer#13 ) + (byte) main::active_balls#18 ← phi( main::@7/(byte) main::active_balls#4 ) + (byte) main::timer_2#9 ← phi( main::@7/(byte) main::timer_2#11 ) + *((byte*)(number) $2001) ← (number) $98 + to:main::@14 +main::@10: scope:[main] from main::@12 main::@8 + (word) rand_state#37 ← phi( main::@12/(word) rand_state#40 main::@8/(word) rand_state#41 ) + (byte) main::timer#16 ← phi( main::@12/(byte) main::timer#18 main::@8/(byte) main::timer#19 ) + (byte) main::timer_2#16 ← phi( main::@12/(byte) main::timer_2#18 main::@8/(byte) main::timer_2#19 ) + (byte) main::active_balls#11 ← phi( main::@12/(byte) main::active_balls#14 main::@8/(byte) main::active_balls#15 ) + (byte) main::sprite_idx#4 ← phi( main::@12/(byte) main::sprite_idx#6 main::@8/(byte) main::sprite_idx#7 ) + (byte) main::h_bar#2 ← phi( main::@12/(byte) main::h_bar#4 main::@8/(byte) main::h_bar#5 ) + (word) main::i#10 ← phi( main::@12/(word) main::i#11 main::@8/(word) main::i#9 ) + (word~) main::$43 ← (word) main::i#10 * (const byte) SIZEOF_STRUCT_$0 + (word~) main::$23 ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$43) >> (number) 8 + (bool~) main::$24 ← (word~) main::$23 >= (byte) main::h_bar#2 + (word~) main::$44 ← (word) main::i#10 * (const byte) SIZEOF_STRUCT_$0 + (word~) main::$25 ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$44) >> (number) 8 + (number~) main::$26 ← (byte) main::h_bar#2 + (number) 8 + (bool~) main::$27 ← (word~) main::$25 < (number~) main::$26 + (bool~) main::$28 ← (bool~) main::$24 && (bool~) main::$27 + (bool~) main::$29 ← ! (bool~) main::$28 + if((bool~) main::$29) goto main::@11 + to:main::@13 +main::@12: scope:[main] from main::@8 + (word) rand_state#40 ← phi( main::@8/(word) rand_state#41 ) + (byte) main::timer#18 ← phi( main::@8/(byte) main::timer#19 ) + (byte) main::timer_2#18 ← phi( main::@8/(byte) main::timer_2#19 ) + (byte) main::active_balls#14 ← phi( main::@8/(byte) main::active_balls#15 ) + (byte) main::sprite_idx#6 ← phi( main::@8/(byte) main::sprite_idx#7 ) + (byte) main::h_bar#4 ← phi( main::@8/(byte) main::h_bar#5 ) + (word) main::i#11 ← phi( main::@8/(word) main::i#9 ) + (word~) main::$45 ← (word) main::i#11 * (const byte) SIZEOF_STRUCT_$0 + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_VELOCITY + (word~) main::$45) ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_VELOCITY + (word~) main::$45) ^ (number) $ffff + to:main::@10 +main::@11: scope:[main] from main::@10 main::@13 + (word) rand_state#31 ← phi( main::@10/(word) rand_state#37 main::@13/(word) rand_state#38 ) + (byte) main::timer#14 ← phi( main::@10/(byte) main::timer#16 main::@13/(byte) main::timer#17 ) + (byte) main::timer_2#12 ← phi( main::@10/(byte) main::timer_2#16 main::@13/(byte) main::timer_2#17 ) + (byte) main::h_bar#7 ← phi( main::@10/(byte) main::h_bar#2 main::@13/(byte) main::h_bar#3 ) + (byte) main::active_balls#7 ← phi( main::@10/(byte) main::active_balls#11 main::@13/(byte) main::active_balls#12 ) + (byte) main::sprite_idx#3 ← phi( main::@10/(byte) main::sprite_idx#4 main::@13/(byte) main::sprite_idx#5 ) + (word) main::i#12 ← phi( main::@10/(word) main::i#10 main::@13/(word) main::i#13 ) + (word~) main::$46 ← (word) main::i#12 * (const byte) SIZEOF_STRUCT_$0 + (word~) main::$32 ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$46) >> (number) 8 + (byte~) main::$47 ← (byte) main::sprite_idx#3 * (const byte) SIZEOF_STRUCT_SPRITEDATA + *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (byte~) main::$47) ← (byte)(word~) main::$32 + (byte~) main::$48 ← (byte) main::sprite_idx#3 * (const byte) SIZEOF_STRUCT_SPRITEDATA + *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$48) ← (number) $a + (byte~) main::$49 ← (byte) main::sprite_idx#3 * (const byte) SIZEOF_STRUCT_SPRITEDATA + *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$49) ← (number) 3 + (word~) main::$50 ← (word) main::i#12 * (const byte) SIZEOF_STRUCT_$0 + (word~) main::$33 ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$50) >> (number) 8 + (byte~) main::$51 ← (byte) main::sprite_idx#3 * (const byte) SIZEOF_STRUCT_SPRITEDATA + *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$51) ← (byte)(word~) main::$33 + (byte) main::sprite_idx#2 ← ++ (byte) main::sprite_idx#3 + (word) main::i#4 ← ++ (word) main::i#12 + to:main::@7 +main::@13: scope:[main] from main::@10 + (word) rand_state#38 ← phi( main::@10/(word) rand_state#37 ) + (byte) main::timer#17 ← phi( main::@10/(byte) main::timer#16 ) + (byte) main::timer_2#17 ← phi( main::@10/(byte) main::timer_2#16 ) + (byte) main::active_balls#12 ← phi( main::@10/(byte) main::active_balls#11 ) + (byte) main::sprite_idx#5 ← phi( main::@10/(byte) main::sprite_idx#4 ) + (byte) main::h_bar#3 ← phi( main::@10/(byte) main::h_bar#2 ) + (word) main::i#13 ← phi( main::@10/(word) main::i#10 ) + (word~) main::$52 ← (word) main::i#13 * (const byte) SIZEOF_STRUCT_$0 + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$52) ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$52) ^ (number) $ffff + (number~) main::$30 ← (byte) main::h_bar#3 - (number) 2 + (word~) main::$56 ← (word)(number~) main::$30 + (word~) main::$31 ← (word~) main::$56 << (number) 8 + (word~) main::$53 ← (word) main::i#13 * (const byte) SIZEOF_STRUCT_$0 + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$53) ← (word~) main::$31 + to:main::@11 +main::@14: scope:[main] from main::@14 main::@9 + (word) rand_state#25 ← phi( main::@14/(word) rand_state#25 main::@9/(word) rand_state#27 ) + (byte) main::timer#9 ← phi( main::@14/(byte) main::timer#9 main::@9/(byte) main::timer#11 ) + (byte) main::active_balls#16 ← phi( main::@14/(byte) main::active_balls#16 main::@9/(byte) main::active_balls#18 ) + (byte) main::timer_2#7 ← phi( main::@14/(byte) main::timer_2#7 main::@9/(byte) main::timer_2#9 ) + (bool~) main::$58 ← (number) 0 != (volatile byte) vblank_hit + (bool~) main::$34 ← ! (bool~) main::$58 + if((bool~) main::$34) goto main::@14 + to:main::@15 +main::@15: scope:[main] from main::@14 + (word) rand_state#23 ← phi( main::@14/(word) rand_state#25 ) + (byte) main::timer#7 ← phi( main::@14/(byte) main::timer#9 ) + (byte) main::active_balls#10 ← phi( main::@14/(byte) main::active_balls#16 ) + (byte) main::timer_2#5 ← phi( main::@14/(byte) main::timer_2#7 ) + (volatile byte) vblank_hit ← (number) 0 + *((byte*)(number) $2001) ← (number) $18 + to:main::@3 +main::@return: scope:[main] from main::@5 + (word) rand_state#14 ← phi( main::@5/(word) rand_state#18 ) + (signed word) main::return#3 ← phi( main::@5/(signed word) main::return#0 ) + (signed word) main::return#1 ← (signed word) main::return#3 + (word) rand_state#6 ← (word) rand_state#14 + return + to:@return + +interrupt(HARDWARE_STACK)(void()) vblank() +vblank: scope:[vblank] from + (byte*~) vblank::$3 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) vblank::$1 ← (byte*~) vblank::$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL + *((byte*~) vblank::$1) ← (number) 0 + (byte*~) vblank::$4 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) vblank::$2 ← (byte*~) vblank::$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL + *((byte*~) vblank::$2) ← (volatile byte) scroll_y + (struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 ← (const struct SpriteData*) SPRITE_BUFFER + to:vblank::ppuSpriteBufferDmaTransfer1 +vblank::ppuSpriteBufferDmaTransfer1: scope:[vblank] from vblank + (struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#1 ← phi( vblank/(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 ) + (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$3 ← (byte*)(const struct RICOH_2C02*) PPU + (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1 ← (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR + *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1) ← (number) 0 + (byte~) vblank::ppuSpriteBufferDmaTransfer1_$0 ← > (struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#1 + (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$4 ← (byte*)(const struct RICOH_2A03*) APU + (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2 ← (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$4 + (const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA + *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2) ← (byte~) vblank::ppuSpriteBufferDmaTransfer1_$0 + to:vblank::@1 +vblank::@1: scope:[vblank] from vblank::ppuSpriteBufferDmaTransfer1 + (volatile byte) vblank_hit ← ++ (volatile byte) vblank_hit + to:vblank::@return +vblank::@return: scope:[vblank] from vblank::@1 + return + to:@return + +(void()) __start() +__start: scope:[__start] from + to:__start::__init1 +__start::__init1: scope:[__start] from __start + (word) rand_state#7 ← (word) 1 + (volatile byte) scroll_y ← (byte) 0 + (volatile byte) vblank_hit ← (byte) 0 + to:__start::@1 +__start::@1: scope:[__start] from __start::__init1 + (word) rand_state#19 ← phi( __start::__init1/(word) rand_state#7 ) + call main + (signed word) main::return#2 ← (signed word) main::return#1 + to:__start::@2 +__start::@2: scope:[__start] from __start::@1 + (word) rand_state#15 ← phi( __start::@1/(word) rand_state#6 ) + (word) rand_state#8 ← (word) rand_state#15 + to:__start::@return +__start::@return: scope:[__start] from __start::@2 + (word) rand_state#16 ← phi( __start::@2/(word) rand_state#8 ) + (word) rand_state#9 ← (word) rand_state#16 + return + to:@return + +SYMBOL TABLE SSA +(word) $0::x_position +(word) $0::x_velocity +(word) $0::y_position +(word) $0::y_velocity +(const struct RICOH_2A03*) APU = (struct RICOH_2A03*)(number) $4000 +(const nomodify byte*) FR_COUNTER = (byte*)(number) $4017 +(const nomodify byte*) MEMORY = (byte*)(number) 0 +(const byte) OFFSET_STRUCT_$0_X_POSITION = (byte) 0 +(const byte) OFFSET_STRUCT_$0_X_VELOCITY = (byte) 4 +(const byte) OFFSET_STRUCT_$0_Y_POSITION = (byte) 2 +(const byte) OFFSET_STRUCT_$0_Y_VELOCITY = (byte) 6 +(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = (byte) $10 +(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA = (byte) $14 +(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR = (byte) 3 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR = (byte) 6 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL = (byte) 0 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA = (byte) 7 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK = (byte) 1 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = (byte) 5 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = (byte) 2 +(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES = (byte) 2 +(const byte) OFFSET_STRUCT_SPRITEDATA_TILE = (byte) 1 +(const byte) OFFSET_STRUCT_SPRITEDATA_X = (byte) 3 +(const byte) OFFSET_STRUCT_SPRITEDATA_Y = (byte) 0 +(const struct RICOH_2C02*) PPU = (struct RICOH_2C02*)(number) $2000 +(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 = (byte*)(number) $23c0 +(const nomodify byte*) PPU_NAME_TABLE_0 = (byte*)(number) $2000 +(const nomodify byte*) PPU_PALETTE = (byte*)(number) $3f00 +(const nomodify to_volatile byte*) PPU_PPUSTATUS = (byte*)(number) $2002 +(const byte) RADIX::BINARY = (number) 2 +(const byte) RADIX::DECIMAL = (number) $a +(const byte) RADIX::HEXADECIMAL = (number) $10 +(const byte) RADIX::OCTAL = (number) 8 +(byte) RICOH_2A03::DMC_FREQ +(byte) RICOH_2A03::DMC_LEN +(byte) RICOH_2A03::DMC_RAW +(byte) RICOH_2A03::DMC_START +(byte) RICOH_2A03::JOY1 +(byte) RICOH_2A03::JOY2 +(byte) RICOH_2A03::NOISE_HI +(byte) RICOH_2A03::NOISE_LO +(byte) RICOH_2A03::NOISE_VOL +(byte) RICOH_2A03::OAMDMA +(byte) RICOH_2A03::SND_CHN +(byte) RICOH_2A03::SQ1_HI +(byte) RICOH_2A03::SQ1_LO +(byte) RICOH_2A03::SQ1_SWEEP +(byte) RICOH_2A03::SQ1_VOL +(byte) RICOH_2A03::SQ2_HI +(byte) RICOH_2A03::SQ2_LO +(byte) RICOH_2A03::SQ2_SWEEP +(byte) RICOH_2A03::SQ2_VOL +(byte) RICOH_2A03::TRI_HI +(byte) RICOH_2A03::TRI_LINEAR +(byte) RICOH_2A03::TRI_LO +(byte) RICOH_2A03::UNUSED1 +(byte) RICOH_2A03::UNUSED2 +(byte) RICOH_2C02::OAMADDR +(byte) RICOH_2C02::OAMDATA +(byte) RICOH_2C02::PPUADDR +(byte) RICOH_2C02::PPUCTRL +(byte) RICOH_2C02::PPUDATA +(byte) RICOH_2C02::PPUMASK +(byte) RICOH_2C02::PPUSCROLL +(volatile byte) RICOH_2C02::PPUSTATUS loadstore +(const byte) SIZEOF_STRUCT_$0 = (byte) 8 +(const byte) SIZEOF_STRUCT_SPRITEDATA = (byte) 4 +(const struct SpriteData*) SPRITE_BUFFER[(number) $100] = { fill( $100, 0) } +(byte) SpriteData::attributes +(byte) SpriteData::tile +(byte) SpriteData::x +(byte) SpriteData::y +(const byte*) TILES[] = kickasm {{ .import binary "lazydata.chr" + }} +(const to_nomodify void()**) VECTORS[] = { &interrupt(HARDWARE_STACK)(void()) vblank(), &(signed word()) main(), (void()*)(number) 0 } +(void()) __start() +(label) __start::@1 +(label) __start::@2 +(label) __start::@return +(label) __start::__init1 +(const struct $0*) balls[(number) $40] = { fill( $40, 0) } +(const to_nomodify byte*) h_bar_tilemap[] = { (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1 } +(signed word()) main() +(byte~) main::$1 +(number~) main::$10 +(word~) main::$11 +(number~) main::$12 +(number~) main::$13 +(number~) main::$14 +(bool~) main::$15 +(bool~) main::$16 +(bool~) main::$17 +(bool~) main::$18 +(bool~) main::$19 +(word~) main::$20 +(bool~) main::$21 +(bool~) main::$22 +(word~) main::$23 +(bool~) main::$24 +(word~) main::$25 +(number~) main::$26 +(bool~) main::$27 +(bool~) main::$28 +(bool~) main::$29 +(number~) main::$30 +(word~) main::$31 +(word~) main::$32 +(word~) main::$33 +(bool~) main::$34 +(word~) main::$35 +(word~) main::$36 +(byte~) main::$37 +(byte~) main::$38 +(word~) main::$39 +(word~) main::$40 +(word~) main::$41 +(word~) main::$42 +(word~) main::$43 +(word~) main::$44 +(word~) main::$45 +(word~) main::$46 +(byte~) main::$47 +(byte~) main::$48 +(byte~) main::$49 +(byte~) main::$5 +(word~) main::$50 +(byte~) main::$51 +(word~) main::$52 +(word~) main::$53 +(byte*~) main::$54 +(byte*~) main::$55 +(word~) main::$56 +(bool~) main::$57 +(bool~) main::$58 +(bool~) main::$8 +(word~) main::$9 +(label) main::@1 +(label) main::@10 +(label) main::@11 +(label) main::@12 +(label) main::@13 +(label) main::@14 +(label) main::@15 +(label) main::@16 +(label) main::@17 +(label) main::@18 +(label) main::@19 +(label) main::@2 +(label) main::@20 +(label) main::@21 +(label) main::@22 +(label) main::@23 +(label) main::@24 +(label) main::@25 +(label) main::@3 +(label) main::@4 +(label) main::@5 +(label) main::@6 +(label) main::@7 +(label) main::@8 +(label) main::@9 +(label) main::@return +(byte) main::active_balls +(byte) main::active_balls#0 +(byte) main::active_balls#1 +(byte) main::active_balls#10 +(byte) main::active_balls#11 +(byte) main::active_balls#12 +(byte) main::active_balls#13 +(byte) main::active_balls#14 +(byte) main::active_balls#15 +(byte) main::active_balls#16 +(byte) main::active_balls#17 +(byte) main::active_balls#18 +(byte) main::active_balls#19 +(byte) main::active_balls#2 +(byte) main::active_balls#3 +(byte) main::active_balls#4 +(byte) main::active_balls#5 +(byte) main::active_balls#6 +(byte) main::active_balls#7 +(byte) main::active_balls#8 +(byte) main::active_balls#9 +(label) main::enableVideoOutput1 +(byte*~) main::enableVideoOutput1_$0 +(byte*~) main::enableVideoOutput1_$1 +(byte*~) main::enableVideoOutput1_$2 +(byte*~) main::enableVideoOutput1_$3 +(byte) main::h_bar +(byte) main::h_bar#0 +(byte) main::h_bar#1 +(byte) main::h_bar#10 +(byte) main::h_bar#2 +(byte) main::h_bar#3 +(byte) main::h_bar#4 +(byte) main::h_bar#5 +(byte) main::h_bar#6 +(byte) main::h_bar#7 +(byte) main::h_bar#8 +(byte) main::h_bar#9 +(word) main::i +(word) main::i#0 +(word) main::i#1 +(word) main::i#10 +(word) main::i#11 +(word) main::i#12 +(word) main::i#13 +(word) main::i#14 +(word) main::i#2 +(word) main::i#3 +(word) main::i#4 +(word) main::i#5 +(word) main::i#6 +(word) main::i#7 +(word) main::i#8 +(word) main::i#9 +(label) main::initNES1 +(bool~) main::initNES1_$5 +(label) main::initNES1_@1 +(label) main::initNES1_@6 +(label) main::initNES1_@7 +(label) main::initNES1_clearVBlankFlag1 +(label) main::initNES1_disableAudioOutput1 +(byte*~) main::initNES1_disableAudioOutput1_$0 +(byte*~) main::initNES1_disableAudioOutput1_$1 +(label) main::initNES1_disableVideoOutput1 +(byte*~) main::initNES1_disableVideoOutput1_$0 +(byte*~) main::initNES1_disableVideoOutput1_$1 +(byte*~) main::initNES1_disableVideoOutput1_$2 +(byte*~) main::initNES1_disableVideoOutput1_$3 +(byte) main::initNES1_i +(byte) main::initNES1_i#0 +(byte) main::initNES1_i#1 +(byte) main::initNES1_i#2 +(label) main::initNES1_waitForVBlank1 +(number~) main::initNES1_waitForVBlank1_$0 +(bool~) main::initNES1_waitForVBlank1_$1 +(byte*~) main::initNES1_waitForVBlank1_$2 +(byte*~) main::initNES1_waitForVBlank1_$3 +(bool~) main::initNES1_waitForVBlank1_$4 +(label) main::initNES1_waitForVBlank1_@1 +(label) main::initNES1_waitForVBlank2 +(number~) main::initNES1_waitForVBlank2_$0 +(bool~) main::initNES1_waitForVBlank2_$1 +(byte*~) main::initNES1_waitForVBlank2_$2 +(byte*~) main::initNES1_waitForVBlank2_$3 +(bool~) main::initNES1_waitForVBlank2_$4 +(label) main::initNES1_waitForVBlank2_@1 +(signed word) main::return +(signed word) main::return#0 +(signed word) main::return#1 +(signed word) main::return#2 +(signed word) main::return#3 +(byte) main::sprite_idx +(byte) main::sprite_idx#0 +(byte) main::sprite_idx#1 +(byte) main::sprite_idx#2 +(byte) main::sprite_idx#3 +(byte) main::sprite_idx#4 +(byte) main::sprite_idx#5 +(byte) main::sprite_idx#6 +(byte) main::sprite_idx#7 +(byte) main::sprite_idx#8 +(byte) main::timer +(byte) main::timer#0 +(byte) main::timer#1 +(byte) main::timer#10 +(byte) main::timer#11 +(byte) main::timer#12 +(byte) main::timer#13 +(byte) main::timer#14 +(byte) main::timer#15 +(byte) main::timer#16 +(byte) main::timer#17 +(byte) main::timer#18 +(byte) main::timer#19 +(byte) main::timer#2 +(byte) main::timer#3 +(byte) main::timer#4 +(byte) main::timer#5 +(byte) main::timer#6 +(byte) main::timer#7 +(byte) main::timer#8 +(byte) main::timer#9 +(byte) main::timer_2 +(byte) main::timer_2#0 +(byte) main::timer_2#1 +(byte) main::timer_2#10 +(byte) main::timer_2#11 +(byte) main::timer_2#12 +(byte) main::timer_2#13 +(byte) main::timer_2#14 +(byte) main::timer_2#15 +(byte) main::timer_2#16 +(byte) main::timer_2#17 +(byte) main::timer_2#18 +(byte) main::timer_2#19 +(byte) main::timer_2#2 +(byte) main::timer_2#3 +(byte) main::timer_2#4 +(byte) main::timer_2#5 +(byte) main::timer_2#6 +(byte) main::timer_2#7 +(byte) main::timer_2#8 +(byte) main::timer_2#9 +(const to_nomodify byte*) palette[] = { (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4 } +(void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size) +(bool~) ppuDataFill::$1 +(label) ppuDataFill::@1 +(label) ppuDataFill::@2 +(label) ppuDataFill::@3 +(label) ppuDataFill::@4 +(label) ppuDataFill::@return +(word) ppuDataFill::i +(word) ppuDataFill::i#0 +(word) ppuDataFill::i#1 +(word) ppuDataFill::i#2 +(word) ppuDataFill::i#3 +(word) ppuDataFill::i#4 +(word) ppuDataFill::i#5 +(nomodify void*) ppuDataFill::ppuData +(nomodify void*) ppuDataFill::ppuData#0 +(nomodify void*) ppuDataFill::ppuData#1 +(nomodify void*) ppuDataFill::ppuData#2 +(label) ppuDataFill::ppuDataPrepare1 +(byte~) ppuDataFill::ppuDataPrepare1_$0 +(byte~) ppuDataFill::ppuDataPrepare1_$1 +(byte*~) ppuDataFill::ppuDataPrepare1_$2 +(byte*~) ppuDataFill::ppuDataPrepare1_$3 +(byte*~) ppuDataFill::ppuDataPrepare1_$4 +(byte*~) ppuDataFill::ppuDataPrepare1_$5 +(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData +(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 +(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#1 +(label) ppuDataFill::ppuDataPut1 +(byte*~) ppuDataFill::ppuDataPut1_$0 +(byte*~) ppuDataFill::ppuDataPut1_$1 +(byte) ppuDataFill::ppuDataPut1_val +(byte) ppuDataFill::ppuDataPut1_val#0 +(byte) ppuDataFill::ppuDataPut1_val#1 +(word) ppuDataFill::size +(word) ppuDataFill::size#0 +(word) ppuDataFill::size#1 +(word) ppuDataFill::size#2 +(word) ppuDataFill::size#3 +(word) ppuDataFill::size#4 +(word) ppuDataFill::size#5 +(word) ppuDataFill::size#6 +(word) ppuDataFill::size#7 +(word) ppuDataFill::size#8 +(byte) ppuDataFill::val +(byte) ppuDataFill::val#0 +(byte) ppuDataFill::val#1 +(byte) ppuDataFill::val#2 +(byte) ppuDataFill::val#3 +(byte) ppuDataFill::val#4 +(byte) ppuDataFill::val#5 +(byte) ppuDataFill::val#6 +(byte) ppuDataFill::val#7 +(byte) ppuDataFill::val#8 +(void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size) +(bool~) ppuDataTransfer::$1 +(label) ppuDataTransfer::@1 +(label) ppuDataTransfer::@2 +(label) ppuDataTransfer::@3 +(label) ppuDataTransfer::@4 +(label) ppuDataTransfer::@return +(nomodify void*) ppuDataTransfer::cpuData +(nomodify void*) ppuDataTransfer::cpuData#0 +(nomodify void*) ppuDataTransfer::cpuData#1 +(nomodify void*) ppuDataTransfer::cpuData#2 +(nomodify void*) ppuDataTransfer::cpuData#3 +(nomodify void*) ppuDataTransfer::cpuData#4 +(byte*) ppuDataTransfer::cpuSrc +(byte*) ppuDataTransfer::cpuSrc#0 +(byte*) ppuDataTransfer::cpuSrc#1 +(byte*) ppuDataTransfer::cpuSrc#2 +(byte*) ppuDataTransfer::cpuSrc#3 +(byte*) ppuDataTransfer::cpuSrc#4 +(byte*) ppuDataTransfer::cpuSrc#5 +(word) ppuDataTransfer::i +(word) ppuDataTransfer::i#0 +(word) ppuDataTransfer::i#1 +(word) ppuDataTransfer::i#2 +(word) ppuDataTransfer::i#3 +(word) ppuDataTransfer::i#4 +(word) ppuDataTransfer::i#5 +(nomodify void*) ppuDataTransfer::ppuData +(nomodify void*) ppuDataTransfer::ppuData#0 +(nomodify void*) ppuDataTransfer::ppuData#1 +(nomodify void*) ppuDataTransfer::ppuData#2 +(label) ppuDataTransfer::ppuDataPrepare1 +(byte~) ppuDataTransfer::ppuDataPrepare1_$0 +(byte~) ppuDataTransfer::ppuDataPrepare1_$1 +(byte*~) ppuDataTransfer::ppuDataPrepare1_$2 +(byte*~) ppuDataTransfer::ppuDataPrepare1_$3 +(byte*~) ppuDataTransfer::ppuDataPrepare1_$4 +(byte*~) ppuDataTransfer::ppuDataPrepare1_$5 +(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData +(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 +(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#1 +(label) ppuDataTransfer::ppuDataPut1 +(byte*~) ppuDataTransfer::ppuDataPut1_$0 +(byte*~) ppuDataTransfer::ppuDataPut1_$1 +(byte) ppuDataTransfer::ppuDataPut1_val +(byte) ppuDataTransfer::ppuDataPut1_val#0 +(byte) ppuDataTransfer::ppuDataPut1_val#1 +(word) ppuDataTransfer::size +(word) ppuDataTransfer::size#0 +(word) ppuDataTransfer::size#1 +(word) ppuDataTransfer::size#2 +(word) ppuDataTransfer::size#3 +(word) ppuDataTransfer::size#4 +(word) ppuDataTransfer::size#5 +(word) ppuDataTransfer::size#6 +(word) ppuDataTransfer::size#7 +(word) ppuDataTransfer::size#8 +(const byte*) printf_buffer_number::digits[(number) $b] = { fill( $b, 0) } +(byte) printf_buffer_number::sign +(byte) printf_format_number::justify_left +(byte) printf_format_number::min_length +(byte) printf_format_number::radix +(byte) printf_format_number::sign_always +(byte) printf_format_number::upper_case +(byte) printf_format_number::zero_padding +(byte) printf_format_string::justify_left +(byte) printf_format_string::min_length +(word()) rand() +(word~) rand::$0 +(word~) rand::$1 +(word~) rand::$2 +(label) rand::@return +(word) rand::return +(word) rand::return#0 +(word) rand::return#1 +(word) rand::return#2 +(word) rand::return#3 +(word) rand::return#4 +(word) rand::return#5 +(word) rand::return#6 +(word) rand_state +(word) rand_state#0 +(word) rand_state#1 +(word) rand_state#10 +(word) rand_state#11 +(word) rand_state#12 +(word) rand_state#13 +(word) rand_state#14 +(word) rand_state#15 +(word) rand_state#16 +(word) rand_state#17 +(word) rand_state#18 +(word) rand_state#19 +(word) rand_state#2 +(word) rand_state#20 +(word) rand_state#21 +(word) rand_state#22 +(word) rand_state#23 +(word) rand_state#24 +(word) rand_state#25 +(word) rand_state#26 +(word) rand_state#27 +(word) rand_state#28 +(word) rand_state#29 +(word) rand_state#3 +(word) rand_state#30 +(word) rand_state#31 +(word) rand_state#32 +(word) rand_state#33 +(word) rand_state#34 +(word) rand_state#35 +(word) rand_state#36 +(word) rand_state#37 +(word) rand_state#38 +(word) rand_state#39 +(word) rand_state#4 +(word) rand_state#40 +(word) rand_state#41 +(word) rand_state#42 +(word) rand_state#43 +(word) rand_state#44 +(word) rand_state#45 +(word) rand_state#46 +(word) rand_state#47 +(word) rand_state#48 +(word) rand_state#49 +(word) rand_state#5 +(word) rand_state#50 +(word) rand_state#51 +(word) rand_state#52 +(word) rand_state#53 +(word) rand_state#6 +(word) rand_state#7 +(word) rand_state#8 +(word) rand_state#9 +(volatile byte) scroll_y loadstore +(const to_nomodify byte*) sine_table[(number) $100] = { (byte) $40, (byte) $42, (byte) $43, (byte) $45, (byte) $46, (byte) $48, (byte) $49, (byte) $4b, (byte) $4c, (byte) $4e, (byte) $50, (byte) $51, (byte) $53, (byte) $54, (byte) $56, (byte) $57, (byte) $58, (byte) $5a, (byte) $5b, (byte) $5d, (byte) $5e, (byte) $60, (byte) $61, (byte) $62, (byte) $64, (byte) $65, (byte) $66, (byte) $67, (byte) $69, (byte) $6a, (byte) $6b, (byte) $6c, (byte) $6d, (byte) $6e, (byte) $6f, (byte) $70, (byte) $71, (byte) $72, (byte) $73, (byte) $74, (byte) $75, (byte) $76, (byte) $77, (byte) $78, (byte) $78, (byte) $79, (byte) $7a, (byte) $7b, (byte) $7b, (byte) $7c, (byte) $7c, (byte) $7d, (byte) $7d, (byte) $7e, (byte) $7e, (byte) $7e, (byte) $7f, (byte) $7f, (byte) $7f, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $7f, (byte) $7f, (byte) $7f, (byte) $7e, (byte) $7e, (byte) $7e, (byte) $7d, (byte) $7d, (byte) $7c, (byte) $7c, (byte) $7b, (byte) $7b, (byte) $7a, (byte) $79, (byte) $78, (byte) $78, (byte) $77, (byte) $76, (byte) $75, (byte) $74, (byte) $73, (byte) $72, (byte) $71, (byte) $70, (byte) $6f, (byte) $6e, (byte) $6d, (byte) $6c, (byte) $6b, (byte) $6a, (byte) $69, (byte) $67, (byte) $66, (byte) $65, (byte) $64, (byte) $62, (byte) $61, (byte) $60, (byte) $5e, (byte) $5d, (byte) $5b, (byte) $5a, (byte) $58, (byte) $57, (byte) $56, (byte) $54, (byte) $53, (byte) $51, (byte) $50, (byte) $4e, (byte) $4c, (byte) $4b, (byte) $49, (byte) $48, (byte) $46, (byte) $45, (byte) $43, (byte) $42, (byte) $40, (byte) $3e, (byte) $3d, (byte) $3b, (byte) $3a, (byte) $38, (byte) $37, (byte) $35, (byte) $34, (byte) $32, (byte) $30, (byte) $2f, (byte) $2d, (byte) $2c, (byte) $2a, (byte) $29, (byte) $28, (byte) $26, (byte) $25, (byte) $23, (byte) $22, (byte) $20, (byte) $1f, (byte) $1e, (byte) $1c, (byte) $1b, (byte) $1a, (byte) $19, (byte) $17, (byte) $16, (byte) $15, (byte) $14, (byte) $13, (byte) $12, (byte) $11, (byte) $10, (byte) $f, (byte) $e, (byte) $d, (byte) $c, (byte) $b, (byte) $a, (byte) 9, (byte) 8, (byte) 8, (byte) 7, (byte) 6, (byte) 5, (byte) 5, (byte) 4, (byte) 4, (byte) 3, (byte) 3, (byte) 2, (byte) 2, (byte) 2, (byte) 1, (byte) 1, (byte) 1, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 1, (byte) 1, (byte) 1, (byte) 2, (byte) 2, (byte) 2, (byte) 3, (byte) 3, (byte) 4, (byte) 4, (byte) 5, (byte) 5, (byte) 6, (byte) 7, (byte) 8, (byte) 8, (byte) 9, (byte) $a, (byte) $b, (byte) $c, (byte) $d, (byte) $e, (byte) $f, (byte) $10, (byte) $11, (byte) $12, (byte) $13, (byte) $14, (byte) $15, (byte) $16, (byte) $17, (byte) $19, (byte) $1a, (byte) $1b, (byte) $1c, (byte) $1e, (byte) $1f, (byte) $20, (byte) $22, (byte) $23, (byte) $25, (byte) $26, (byte) $28, (byte) $29, (byte) $2a, (byte) $2c, (byte) $2d, (byte) $2f, (byte) $30, (byte) $32, (byte) $34, (byte) $35, (byte) $37, (byte) $38, (byte) $3a, (byte) $3b, (byte) $3d, (byte) $3e } +interrupt(HARDWARE_STACK)(void()) vblank() +(byte*~) vblank::$1 +(byte*~) vblank::$2 +(byte*~) vblank::$3 +(byte*~) vblank::$4 +(label) vblank::@1 +(label) vblank::@return +(label) vblank::ppuSpriteBufferDmaTransfer1 +(byte~) vblank::ppuSpriteBufferDmaTransfer1_$0 +(byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1 +(byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2 +(byte*~) vblank::ppuSpriteBufferDmaTransfer1_$3 +(byte*~) vblank::ppuSpriteBufferDmaTransfer1_$4 +(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer +(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 +(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#1 +(volatile byte) vblank_hit loadstore + +Adding number conversion cast (unumber) 7 in (word~) rand::$0 ← (word) rand_state#10 << (number) 7 +Adding number conversion cast (unumber) 9 in (word~) rand::$1 ← (word) rand_state#0 >> (number) 9 +Adding number conversion cast (unumber) 8 in (word~) rand::$2 ← (word) rand_state#1 << (number) 8 +Adding number conversion cast (unumber) 0 in *((byte*~) main::initNES1_disableVideoOutput1_$0) ← (number) 0 +Adding number conversion cast (unumber) 0 in *((byte*~) main::initNES1_disableVideoOutput1_$1) ← (number) 0 +Adding number conversion cast (unumber) $40 in *((const nomodify byte*) FR_COUNTER) ← (number) $40 +Adding number conversion cast (unumber) $40 in *((byte*~) main::initNES1_disableAudioOutput1_$0) ← (number) $40 +Adding number conversion cast (unumber) $80 in (number~) main::initNES1_waitForVBlank1_$0 ← *((byte*~) main::initNES1_waitForVBlank1_$2) & (number) $80 +Adding number conversion cast (unumber) main::initNES1_waitForVBlank1_$0 in (number~) main::initNES1_waitForVBlank1_$0 ← *((byte*~) main::initNES1_waitForVBlank1_$2) & (unumber)(number) $80 +Adding number conversion cast (unumber) 0 in (bool~) main::initNES1_waitForVBlank1_$4 ← (number) 0 != (unumber~) main::initNES1_waitForVBlank1_$0 +Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) 0 + (byte) main::initNES1_i#2) ← (number) 0 +Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) 0 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0 +Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) $100 + (byte) main::initNES1_i#2) ← (number) 0 +Adding number conversion cast (unumber) $100 in *((const nomodify byte*) MEMORY+(number) $100 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0 +Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) $200 + (byte) main::initNES1_i#2) ← (number) 0 +Adding number conversion cast (unumber) $200 in *((const nomodify byte*) MEMORY+(number) $200 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0 +Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) $300 + (byte) main::initNES1_i#2) ← (number) 0 +Adding number conversion cast (unumber) $300 in *((const nomodify byte*) MEMORY+(number) $300 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0 +Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) $400 + (byte) main::initNES1_i#2) ← (number) 0 +Adding number conversion cast (unumber) $400 in *((const nomodify byte*) MEMORY+(number) $400 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0 +Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) $500 + (byte) main::initNES1_i#2) ← (number) 0 +Adding number conversion cast (unumber) $500 in *((const nomodify byte*) MEMORY+(number) $500 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0 +Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) $600 + (byte) main::initNES1_i#2) ← (number) 0 +Adding number conversion cast (unumber) $600 in *((const nomodify byte*) MEMORY+(number) $600 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0 +Adding number conversion cast (unumber) 0 in *((const nomodify byte*) MEMORY+(number) $700 + (byte) main::initNES1_i#2) ← (number) 0 +Adding number conversion cast (unumber) $700 in *((const nomodify byte*) MEMORY+(number) $700 + (byte) main::initNES1_i#2) ← ((unumber)) (number) 0 +Adding number conversion cast (unumber) 0 in (bool~) main::initNES1_$5 ← (number) 0 != (byte) main::initNES1_i#1 +Adding number conversion cast (unumber) $80 in (number~) main::initNES1_waitForVBlank2_$0 ← *((byte*~) main::initNES1_waitForVBlank2_$2) & (number) $80 +Adding number conversion cast (unumber) main::initNES1_waitForVBlank2_$0 in (number~) main::initNES1_waitForVBlank2_$0 ← *((byte*~) main::initNES1_waitForVBlank2_$2) & (unumber)(number) $80 +Adding number conversion cast (unumber) 0 in (bool~) main::initNES1_waitForVBlank2_$4 ← (number) 0 != (unumber~) main::initNES1_waitForVBlank2_$0 +Adding number conversion cast (unumber) 0 in (byte) ppuDataFill::val#0 ← (number) 0 +Adding number conversion cast (unumber) $20*$1e in (word) ppuDataFill::size#0 ← (number) $20*(number) $1e +Adding number conversion cast (unumber) 0 in (byte) ppuDataFill::val#1 ← (number) 0 +Adding number conversion cast (unumber) $40 in (word) ppuDataFill::size#1 ← (number) $40 +Adding number conversion cast (unumber) $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) $88 in *((byte*~) main::$54) ← (number) $88 +Adding number conversion cast (unumber) 0 in (word) main::i#1 ← (number) 0 +Adding number conversion cast (unumber) $32 in (bool~) main::$8 ← (word) main::i#5 < (number) $32 +Adding number conversion cast (unumber) $3ff in (number~) main::$10 ← (word~) main::$9 & (number) $3ff +Adding number conversion cast (unumber) main::$10 in (number~) main::$10 ← (word~) main::$9 & (unumber)(number) $3ff +Adding number conversion cast (unumber) $ff in (number~) main::$12 ← (word~) main::$11 & (number) $ff +Adding number conversion cast (unumber) main::$12 in (number~) main::$12 ← (word~) main::$11 & (unumber)(number) $ff +Adding number conversion cast (unumber) $60 in (number~) main::$13 ← *((const to_nomodify byte*) sine_table + (byte) main::timer_2#1) + (number) $60 +Adding number conversion cast (unumber) main::$13 in (number~) main::$13 ← *((const to_nomodify byte*) sine_table + (byte) main::timer_2#1) + (unumber)(number) $60 +Adding number conversion cast (unumber) $ff in (number~) main::$14 ← (byte) main::h_bar#1 ^ (number) $ff +Adding number conversion cast (unumber) main::$14 in (number~) main::$14 ← (byte) main::h_bar#1 ^ (unumber)(number) $ff +Adding number conversion cast (unumber) $32 in (bool~) main::$15 ← (byte) main::active_balls#2 < (number) $32 +Adding number conversion cast (snumber) 0 in (signed word) main::return#0 ← (number) 0 +Adding number conversion cast (unumber) 0 in (byte) main::sprite_idx#1 ← (number) 0 +Adding number conversion cast (unumber) 0 in (word) main::i#3 ← (number) 0 +Adding number conversion cast (unumber) 9 in (bool~) main::$17 ← (byte) main::timer#3 == (number) 9 +Adding number conversion cast (unumber) 0 in (byte) main::timer#2 ← (number) 0 +Adding number conversion cast (unumber) 0 in *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (byte~) main::$37) ← (number) 0 +Adding number conversion cast (unumber) 0 in *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (byte~) main::$38) ← (number) 0 +Adding number conversion cast (unumber) $10 in *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$40) ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$40) + (number) $10 +Adding number conversion cast (unumber) 8 in (word~) main::$20 ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$42) >> (number) 8 +Adding number conversion cast (unumber) 8 in (bool~) main::$21 ← (word~) main::$20 < (number) 8 +Adding number conversion cast (unumber) $98 in *((byte*)(number) $2001) ← (number) $98 +Adding number conversion cast (unumber) 8 in (word~) main::$23 ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$43) >> (number) 8 +Adding number conversion cast (unumber) 8 in (word~) main::$25 ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$44) >> (number) 8 +Adding number conversion cast (unumber) 8 in (number~) main::$26 ← (byte) main::h_bar#2 + (number) 8 +Adding number conversion cast (unumber) main::$26 in (number~) main::$26 ← (byte) main::h_bar#2 + (unumber)(number) 8 +Adding number conversion cast (unumber) $ffff in *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_VELOCITY + (word~) main::$45) ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_VELOCITY + (word~) main::$45) ^ (number) $ffff +Adding number conversion cast (unumber) 8 in (word~) main::$32 ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$46) >> (number) 8 +Adding number conversion cast (unumber) $a in *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$48) ← (number) $a +Adding number conversion cast (unumber) 3 in *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$49) ← (number) 3 +Adding number conversion cast (unumber) 8 in (word~) main::$33 ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$50) >> (number) 8 +Adding number conversion cast (unumber) $ffff in *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$52) ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$52) ^ (number) $ffff +Adding number conversion cast (unumber) 2 in (number~) main::$30 ← (byte) main::h_bar#3 - (number) 2 +Adding number conversion cast (unumber) main::$30 in (number~) main::$30 ← (byte) main::h_bar#3 - (unumber)(number) 2 +Adding number conversion cast (unumber) 8 in (word~) main::$31 ← (word~) main::$56 << (number) 8 +Adding number conversion cast (unumber) 0 in (bool~) main::$58 ← (number) 0 != (volatile byte) vblank_hit +Adding number conversion cast (unumber) 0 in (volatile byte) vblank_hit ← (number) 0 +Adding number conversion cast (unumber) $18 in *((byte*)(number) $2001) ← (number) $18 +Adding number conversion cast (unumber) 0 in *((byte*~) vblank::$1) ← (number) 0 +Adding number conversion cast (unumber) 0 in *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1) ← (number) 0 +Successful SSA optimization PassNAddNumberTypeConversions +Inlining cast *((byte*~) main::initNES1_disableVideoOutput1_$0) ← (unumber)(number) 0 +Inlining cast *((byte*~) main::initNES1_disableVideoOutput1_$1) ← (unumber)(number) 0 +Inlining cast *((const nomodify byte*) FR_COUNTER) ← (unumber)(number) $40 +Inlining cast *((byte*~) main::initNES1_disableAudioOutput1_$0) ← (unumber)(number) $40 +Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) 0 + (byte) main::initNES1_i#2) ← (unumber)(number) 0 +Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) $100 + (byte) main::initNES1_i#2) ← (unumber)(number) 0 +Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) $200 + (byte) main::initNES1_i#2) ← (unumber)(number) 0 +Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) $300 + (byte) main::initNES1_i#2) ← (unumber)(number) 0 +Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) $400 + (byte) main::initNES1_i#2) ← (unumber)(number) 0 +Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) $500 + (byte) main::initNES1_i#2) ← (unumber)(number) 0 +Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) $600 + (byte) main::initNES1_i#2) ← (unumber)(number) 0 +Inlining cast *((const nomodify byte*) MEMORY+(unumber)(number) $700 + (byte) main::initNES1_i#2) ← (unumber)(number) 0 +Inlining cast (byte) ppuDataFill::val#0 ← (unumber)(number) 0 +Inlining cast (word) ppuDataFill::size#0 ← (unumber)(number) $20*(number) $1e +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*~) main::$54) ← (unumber)(number) $88 +Inlining cast (word) main::i#1 ← (unumber)(number) 0 +Inlining cast (signed word) main::return#0 ← (snumber)(number) 0 +Inlining cast (byte) main::sprite_idx#1 ← (unumber)(number) 0 +Inlining cast (word) main::i#3 ← (unumber)(number) 0 +Inlining cast (byte) main::timer#2 ← (unumber)(number) 0 +Inlining cast *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (byte~) main::$37) ← (unumber)(number) 0 +Inlining cast *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (byte~) main::$38) ← (unumber)(number) 0 +Inlining cast *((byte*)(number) $2001) ← (unumber)(number) $98 +Inlining cast *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$48) ← (unumber)(number) $a +Inlining cast *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$49) ← (unumber)(number) 3 +Inlining cast (volatile byte) vblank_hit ← (unumber)(number) 0 +Inlining cast *((byte*)(number) $2001) ← (unumber)(number) $18 +Inlining cast *((byte*~) vblank::$1) ← (unumber)(number) 0 +Inlining cast *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1) ← (unumber)(number) 0 +Successful SSA optimization Pass2InlineCast +Simplifying constant pointer cast (byte*) 8192 +Simplifying constant pointer cast (byte*) 9152 +Simplifying constant pointer cast (byte*) 16128 +Simplifying constant pointer cast (byte*) 8194 +Simplifying constant pointer cast (byte*) 16407 +Simplifying constant pointer cast (byte*) 0 +Simplifying constant pointer cast (void()*) 0 +Simplifying constant pointer cast (struct RICOH_2C02*) 8192 +Simplifying constant pointer cast (struct RICOH_2A03*) 16384 +Simplifying constant integer cast 7 +Simplifying constant integer cast 9 +Simplifying constant integer cast 8 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast $40 +Simplifying constant integer cast $40 +Simplifying constant integer cast $80 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast $100 +Simplifying constant integer cast 0 +Simplifying constant integer cast $200 +Simplifying constant integer cast 0 +Simplifying constant integer cast $300 +Simplifying constant integer cast 0 +Simplifying constant integer cast $400 +Simplifying constant integer cast 0 +Simplifying constant integer cast $500 +Simplifying constant integer cast 0 +Simplifying constant integer cast $600 +Simplifying constant integer cast 0 +Simplifying constant integer cast $700 +Simplifying constant integer cast 0 +Simplifying constant integer cast $80 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast $40 +Simplifying constant pointer cast (void*) 8256 +Simplifying constant integer cast $80 +Simplifying constant integer cast $1e +Simplifying constant integer cast $88 +Simplifying constant integer cast 0 +Simplifying constant integer cast $32 +Simplifying constant integer cast $3ff +Simplifying constant integer cast $ff +Simplifying constant integer cast $60 +Simplifying constant integer cast $ff +Simplifying constant integer cast $32 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 9 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast $10 +Simplifying constant integer cast 8 +Simplifying constant integer cast 8 +Simplifying constant integer cast $98 +Simplifying constant pointer cast (byte*) 8193 +Simplifying constant integer cast 8 +Simplifying constant integer cast 8 +Simplifying constant integer cast 8 +Simplifying constant integer cast $ffff +Simplifying constant integer cast 8 +Simplifying constant integer cast $a +Simplifying constant integer cast 3 +Simplifying constant integer cast 8 +Simplifying constant integer cast $ffff +Simplifying constant integer cast 2 +Simplifying constant integer cast 8 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Simplifying constant integer cast $18 +Simplifying constant pointer cast (byte*) 8193 +Simplifying constant integer cast 0 +Simplifying constant integer cast 0 +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type (byte) 7 +Finalized unsigned number type (byte) 9 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) $40 +Finalized unsigned number type (byte) $40 +Finalized unsigned number type (byte) $80 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (word) $100 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (word) $200 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (word) $300 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (word) $400 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (word) $500 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (word) $600 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (word) $700 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) $80 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) $40 +Finalized unsigned number type (byte) $80 +Finalized unsigned number type (byte) $1e +Finalized unsigned number type (byte) $88 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) $32 +Finalized unsigned number type (word) $3ff +Finalized unsigned number type (byte) $ff +Finalized unsigned number type (byte) $60 +Finalized unsigned number type (byte) $ff +Finalized unsigned number type (byte) $32 +Finalized signed number type (signed byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 9 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) $10 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) $98 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (word) $ffff +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) $a +Finalized unsigned number type (byte) 3 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (word) $ffff +Finalized unsigned number type (byte) 2 +Finalized unsigned number type (byte) 8 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) $18 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 0 +Successful SSA optimization PassNFinalizeNumberTypeConversions +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 word in (unumber~) main::$10 ← (word~) main::$9 & (word) $3ff +Inferred type updated to byte in (unumber~) main::$12 ← (word~) main::$11 & (byte) $ff +Inferred type updated to byte in (unumber~) main::$13 ← *((const to_nomodify byte*) sine_table + (byte) main::timer_2#1) + (byte) $60 +Inferred type updated to byte in (unumber~) main::$14 ← (byte) main::h_bar#1 ^ (byte) $ff +Inferred type updated to byte in (unumber~) main::$26 ← (byte) main::h_bar#2 + (byte) 8 +Inferred type updated to byte in (unumber~) main::$30 ← (byte) main::h_bar#3 - (byte) 2 +Inversing boolean not [87] (bool~) main::initNES1_waitForVBlank1_$1 ← (byte) 0 == (byte~) main::initNES1_waitForVBlank1_$0 from [86] (bool~) main::initNES1_waitForVBlank1_$4 ← (byte) 0 != (byte~) main::initNES1_waitForVBlank1_$0 +Inversing boolean not [109] (bool~) main::initNES1_waitForVBlank2_$1 ← (byte) 0 == (byte~) main::initNES1_waitForVBlank2_$0 from [108] (bool~) main::initNES1_waitForVBlank2_$4 ← (byte) 0 != (byte~) main::initNES1_waitForVBlank2_$0 +Inversing boolean not [185] (bool~) main::$16 ← (byte) main::active_balls#2 >= (byte) $32 from [184] (bool~) main::$15 ← (byte) main::active_balls#2 < (byte) $32 +Inversing boolean not [195] (bool~) main::$18 ← (byte) main::timer#3 != (byte) 9 from [193] (bool~) main::$17 ← (byte) main::timer#3 == (byte) 9 +Inversing boolean not [217] (bool~) main::$22 ← (word~) main::$20 >= (byte) 8 from [216] (bool~) main::$21 ← (word~) main::$20 < (byte) 8 +Inversing boolean not [260] (bool~) main::$34 ← (byte) 0 == (volatile byte) vblank_hit from [259] (bool~) main::$58 ← (byte) 0 != (volatile byte) vblank_hit +Successful SSA optimization Pass2UnaryNotSimplification +Alias candidate removed (volatile)scroll_y = main::$14 +Alias ppuDataFill::ppuDataPrepare1_ppuData#0 = ppuDataFill::ppuData#2 ppuDataFill::ppuDataPrepare1_ppuData#1 +Alias ppuDataFill::size#3 = ppuDataFill::size#5 ppuDataFill::size#7 +Alias ppuDataFill::val#4 = ppuDataFill::val#6 ppuDataFill::val#8 +Alias ppuDataFill::val#2 = ppuDataFill::val#3 ppuDataFill::ppuDataPut1_val#0 ppuDataFill::ppuDataPut1_val#1 ppuDataFill::val#7 ppuDataFill::val#5 +Alias ppuDataFill::i#2 = ppuDataFill::i#5 ppuDataFill::i#4 ppuDataFill::i#3 +Alias ppuDataFill::size#2 = ppuDataFill::size#8 ppuDataFill::size#6 ppuDataFill::size#4 +Alias ppuDataTransfer::ppuDataPrepare1_ppuData#0 = ppuDataTransfer::ppuData#2 ppuDataTransfer::ppuDataPrepare1_ppuData#1 +Alias ppuDataTransfer::cpuData#2 = ppuDataTransfer::cpuData#3 ppuDataTransfer::cpuData#4 +Alias ppuDataTransfer::size#3 = ppuDataTransfer::size#5 ppuDataTransfer::size#7 +Alias ppuDataTransfer::cpuSrc#2 = ppuDataTransfer::cpuSrc#4 ppuDataTransfer::cpuSrc#5 ppuDataTransfer::cpuSrc#3 +Alias ppuDataTransfer::i#2 = ppuDataTransfer::i#5 ppuDataTransfer::i#4 ppuDataTransfer::i#3 +Alias ppuDataTransfer::size#2 = ppuDataTransfer::size#8 ppuDataTransfer::size#6 ppuDataTransfer::size#4 +Alias ppuDataTransfer::ppuDataPut1_val#0 = ppuDataTransfer::ppuDataPut1_val#1 +Alias rand::return#0 = rand::return#4 rand::return#1 +Alias rand_state#11 = rand_state#2 rand_state#3 +Alias rand_state#48 = rand_state#52 rand_state#53 rand_state#51 rand_state#50 rand_state#49 +Alias rand_state#46 = rand_state#47 +Alias rand_state#44 = rand_state#45 +Alias rand_state#22 = rand_state#42 rand_state#43 rand_state#39 rand_state#33 rand_state#30 rand_state#28 rand_state#26 rand_state#24 +Alias ppuDataTransfer::size#0 = main::$1 +Alias ppuDataTransfer::size#1 = main::$5 +Alias rand_state#17 = rand_state#20 +Alias main::i#14 = main::i#5 main::i#6 main::i#7 +Alias main::timer_2#10 = main::timer_2#4 main::timer_2#8 main::timer_2#6 +Alias main::active_balls#13 = main::active_balls#19 main::active_balls#9 main::active_balls#17 +Alias main::timer#10 = main::timer#12 main::timer#6 main::timer#8 +Alias rand::return#2 = rand::return#5 +Alias rand_state#12 = rand_state#4 +Alias rand::return#3 = rand::return#6 +Alias rand_state#13 = rand_state#5 +Alias main::timer_2#2 = main::timer_2#3 +Alias main::active_balls#2 = main::active_balls#5 main::active_balls#6 main::active_balls#3 +Alias main::timer#3 = main::timer#4 main::timer#5 +Alias rand_state#14 = rand_state#36 rand_state#21 rand_state#18 rand_state#34 rand_state#35 rand_state#6 +Alias main::h_bar#1 = main::$13 main::h_bar#9 main::h_bar#10 +Alias main::timer_2#1 = main::timer_2#14 main::timer_2#15 +Alias main::i#11 = main::i#9 main::i#8 +Alias main::h_bar#4 = main::h_bar#5 main::h_bar#6 +Alias main::sprite_idx#6 = main::sprite_idx#7 main::sprite_idx#8 +Alias main::active_balls#14 = main::active_balls#15 main::active_balls#4 main::active_balls#18 +Alias main::timer_2#11 = main::timer_2#19 main::timer_2#9 main::timer_2#18 +Alias main::timer#11 = main::timer#19 main::timer#13 main::timer#18 +Alias rand_state#27 = rand_state#41 rand_state#29 rand_state#40 +Alias main::i#10 = main::i#13 +Alias main::h_bar#2 = main::h_bar#3 +Alias main::sprite_idx#4 = main::sprite_idx#5 +Alias main::active_balls#11 = main::active_balls#12 +Alias main::timer_2#16 = main::timer_2#17 +Alias main::timer#16 = main::timer#17 +Alias rand_state#37 = rand_state#38 +Alias main::timer_2#5 = main::timer_2#7 +Alias main::active_balls#10 = main::active_balls#16 +Alias main::timer#7 = main::timer#9 +Alias rand_state#23 = rand_state#25 +Alias main::return#0 = main::return#3 main::return#1 +Alias vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 = vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#1 +Alias rand_state#19 = rand_state#7 +Alias rand_state#15 = rand_state#8 rand_state#16 rand_state#9 +Successful SSA optimization Pass2AliasElimination +Alias candidate removed (volatile)scroll_y = main::$14 +Alias main::h_bar#1 = main::h_bar#8 +Alias main::timer_2#1 = main::timer_2#13 +Alias rand_state#14 = rand_state#32 +Alias main::i#10 = main::i#11 main::i#12 +Alias main::h_bar#2 = main::h_bar#4 main::h_bar#7 +Alias main::sprite_idx#3 = main::sprite_idx#4 main::sprite_idx#6 +Alias main::active_balls#11 = main::active_balls#14 main::active_balls#7 +Alias main::timer_2#11 = main::timer_2#16 main::timer_2#12 +Alias main::timer#11 = main::timer#16 main::timer#14 +Alias rand_state#27 = rand_state#37 rand_state#31 +Successful SSA optimization Pass2AliasElimination +Alias candidate removed (volatile)scroll_y = main::$14 +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 (word) ppuDataTransfer::size#2 (word) ppuDataTransfer::size#3 +Identical Phi Values (word) rand_state#48 (word) rand_state#19 +Identical Phi Values (word) rand_state#46 (word) rand_state#48 +Identical Phi Values (word) rand_state#44 (word) rand_state#46 +Identical Phi Values (word) rand_state#22 (word) rand_state#44 +Identical Phi Values (byte) main::timer_2#10 (byte) main::timer_2#0 +Identical Phi Values (byte) main::active_balls#13 (byte) main::active_balls#0 +Identical Phi Values (byte) main::timer#10 (byte) main::timer#0 +Identical Phi Values (word) rand_state#12 (word) rand_state#11 +Identical Phi Values (word) rand_state#13 (word) rand_state#11 +Identical Phi Values (byte) main::active_balls#11 (byte) main::active_balls#8 +Identical Phi Values (byte) main::h_bar#2 (byte) main::h_bar#1 +Identical Phi Values (byte) main::timer_2#11 (byte) main::timer_2#1 +Identical Phi Values (byte) main::timer#11 (byte) main::timer#15 +Identical Phi Values (word) rand_state#27 (word) rand_state#14 +Identical Phi Values (byte) main::timer_2#5 (byte) main::timer_2#11 +Identical Phi Values (byte) main::active_balls#10 (byte) main::active_balls#11 +Identical Phi Values (byte) main::timer#7 (byte) main::timer#11 +Identical Phi Values (word) rand_state#23 (word) rand_state#27 +Identical Phi Values (word) rand_state#15 (word) rand_state#14 +Successful SSA optimization Pass2IdenticalPhiElimination +Identical Phi Values (word) rand_state#14 (word) rand_state#17 +Successful SSA optimization Pass2IdenticalPhiElimination +Identified duplicate assignment right side [202] (byte~) main::$38 ← (byte) main::active_balls#1 * (const byte) SIZEOF_STRUCT_$0 +Identified duplicate assignment right side [210] (word~) main::$40 ← (word) main::i#10 * (const byte) SIZEOF_STRUCT_$0 +Identified duplicate assignment right side [212] (word~) main::$41 ← (word) main::i#10 * (const byte) SIZEOF_STRUCT_$0 +Identified duplicate assignment right side [214] (word~) main::$42 ← (word) main::i#10 * (const byte) SIZEOF_STRUCT_$0 +Identified duplicate assignment right side [225] (word~) main::$44 ← (word) main::i#10 * (const byte) SIZEOF_STRUCT_$0 +Identified duplicate assignment right side [240] (byte~) main::$48 ← (byte) main::sprite_idx#3 * (const byte) SIZEOF_STRUCT_SPRITEDATA +Identified duplicate assignment right side [242] (byte~) main::$49 ← (byte) main::sprite_idx#3 * (const byte) SIZEOF_STRUCT_SPRITEDATA +Identified duplicate assignment right side [244] (word~) main::$50 ← (word) main::i#10 * (const byte) SIZEOF_STRUCT_$0 +Identified duplicate assignment right side [246] (byte~) main::$51 ← (byte) main::sprite_idx#3 * (const byte) SIZEOF_STRUCT_SPRITEDATA +Identified duplicate assignment right side [256] (word~) main::$53 ← (word) main::i#10 * (const byte) SIZEOF_STRUCT_$0 +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#3) goto ppuDataTransfer::@2 +Simple Condition (bool~) main::initNES1_waitForVBlank1_$1 [66] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 +Simple Condition (bool~) main::initNES1_$5 [79] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 +Simple Condition (bool~) main::initNES1_waitForVBlank2_$1 [85] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 +Simple Condition (bool~) main::$8 [121] if((word) main::i#14<(byte) $32) goto main::@2 +Simple Condition (bool~) main::$57 [139] if((number) 0!=(number) 1) goto main::@4 +Simple Condition (bool~) main::$16 [145] if((byte) main::active_balls#2>=(byte) $32) goto main::@6 +Simple Condition (bool~) main::$18 [152] if((byte) main::timer#3!=(byte) 9) goto main::@6 +Simple Condition (bool~) main::$19 [161] if((word) main::i#10<(byte) main::active_balls#8) goto main::@8 +Simple Condition (bool~) main::$22 [171] if((word~) main::$20>=(byte) 8) goto main::@10 +Simple Condition (bool~) main::$34 [208] if((byte) 0==(volatile byte) vblank_hit) goto main::@14 +Successful SSA optimization Pass2ConditionalJumpSimplification +Rewriting ! if()-condition to reversed if() [181] (bool~) main::$29 ← ! (bool~) main::$28 +Rewriting && if()-condition to two if()s [180] (bool~) main::$28 ← (bool~) main::$24 && (bool~) main::$27 +Successful SSA optimization Pass2ConditionalAndOrRewriting +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 [50] (byte*~) main::initNES1_disableVideoOutput1_$2 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [53] (byte*~) main::initNES1_disableVideoOutput1_$3 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [57] (byte*~) main::initNES1_disableAudioOutput1_$1 ← (byte*)(const struct RICOH_2A03*) APU +Constant right-side identified [62] (byte*~) main::initNES1_waitForVBlank1_$3 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [81] (byte*~) main::initNES1_waitForVBlank2_$3 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [87] (word) ppuDataTransfer::size#0 ← sizeof (const to_nomodify byte*) palette +Constant right-side identified [93] (word) ppuDataFill::size#0 ← (unumber)(number) $20*(number) $1e +Constant right-side identified [99] (word) ppuDataTransfer::size#1 ← sizeof (const to_nomodify byte*) h_bar_tilemap +Constant right-side identified [103] (byte*~) main::enableVideoOutput1_$2 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [106] (byte*~) main::enableVideoOutput1_$3 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [109] (byte*~) main::$55 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [212] (byte*~) vblank::$3 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [215] (byte*~) vblank::$4 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [219] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$3 ← (byte*)(const struct RICOH_2C02*) PPU +Constant right-side identified [223] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$4 ← (byte*)(const struct RICOH_2A03*) APU +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant (const byte*) ppuDataFill::ppuDataPrepare1_$4 = (byte*)PPU +Constant (const byte*) ppuDataFill::ppuDataPrepare1_$5 = (byte*)PPU +Constant (const word) ppuDataFill::i#0 = 0 +Constant (const byte*) ppuDataFill::ppuDataPut1_$1 = (byte*)PPU +Constant (const byte*) ppuDataTransfer::ppuDataPrepare1_$4 = (byte*)PPU +Constant (const byte*) ppuDataTransfer::ppuDataPrepare1_$5 = (byte*)PPU +Constant (const word) ppuDataTransfer::i#0 = 0 +Constant (const byte*) ppuDataTransfer::ppuDataPut1_$1 = (byte*)PPU +Constant (const byte*) main::initNES1_disableVideoOutput1_$2 = (byte*)PPU +Constant (const byte*) main::initNES1_disableVideoOutput1_$3 = (byte*)PPU +Constant (const byte*) main::initNES1_disableAudioOutput1_$1 = (byte*)APU +Constant (const byte*) main::initNES1_waitForVBlank1_$3 = (byte*)PPU +Constant (const byte) main::initNES1_i#0 = 0 +Constant (const byte*) main::initNES1_waitForVBlank2_$3 = (byte*)PPU +Constant (const word) ppuDataTransfer::size#0 = sizeof palette +Constant (const nomodify void*) ppuDataTransfer::ppuData#0 = (void*)PPU_PALETTE +Constant (const nomodify void*) ppuDataTransfer::cpuData#0 = (void*)palette +Constant (const nomodify void*) ppuDataFill::ppuData#0 = (void*)PPU_NAME_TABLE_0 +Constant (const byte) ppuDataFill::val#0 = 0 +Constant (const word) ppuDataFill::size#0 = (unumber)$20*$1e +Constant (const nomodify void*) ppuDataFill::ppuData#1 = (void*)PPU_ATTRIBUTE_TABLE_0 +Constant (const byte) ppuDataFill::val#1 = 0 +Constant (const word) ppuDataFill::size#1 = $40 +Constant (const word) ppuDataTransfer::size#1 = sizeof h_bar_tilemap +Constant (const nomodify void*) ppuDataTransfer::ppuData#1 = (void*) 8256 +Constant (const nomodify void*) ppuDataTransfer::cpuData#1 = (void*)h_bar_tilemap +Constant (const byte*) main::enableVideoOutput1_$2 = (byte*)PPU +Constant (const byte*) main::enableVideoOutput1_$3 = (byte*)PPU +Constant (const byte*) main::$55 = (byte*)PPU +Constant (const word) main::i#0 = 0 +Constant (const byte) main::active_balls#0 = 0 +Constant (const byte) main::timer#0 = 0 +Constant (const byte) main::timer_2#0 = 0 +Constant (const byte) main::h_bar#0 = $80 +Constant (const byte) main::sprite_idx#0 = 0 +Constant (const word) main::i#1 = 0 +Constant (const signed word) main::return#0 = 0 +Constant (const byte) main::sprite_idx#1 = 0 +Constant (const word) main::i#3 = 0 +Constant (const byte) main::timer#2 = 0 +Constant (const byte*) vblank::$3 = (byte*)PPU +Constant (const byte*) vblank::$4 = (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 word) rand_state#19 = 1 +Successful SSA optimization Pass2ConstantIdentification +Constant (const signed word) main::return#2 = main::return#0 +Successful SSA optimization Pass2ConstantIdentification +if() condition always true - replacing block destination [139] if((number) 0!=(number) 1) goto main::@4 +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] [52] *((byte*~) main::initNES1_disableVideoOutput1_$0) ← (byte) 0 -- *(main::initNES1_disableVideoOutput1_$2 + OFFSET_STRUCT_RICOH_2C02_PPUCTRL) +Converting *(pointer+n) to pointer[n] [55] *((byte*~) main::initNES1_disableVideoOutput1_$1) ← (byte) 0 -- *(main::initNES1_disableVideoOutput1_$3 + OFFSET_STRUCT_RICOH_2C02_PPUMASK) +Converting *(pointer+n) to pointer[n] [59] *((byte*~) main::initNES1_disableAudioOutput1_$0) ← (byte) $40 -- *(main::initNES1_disableAudioOutput1_$1 + OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) +Converting *(pointer+n) to pointer[n] [64] (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] [83] (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] [105] *((byte*~) main::enableVideoOutput1_$0) ← (byte) $80 -- *(main::enableVideoOutput1_$2 + OFFSET_STRUCT_RICOH_2C02_PPUCTRL) +Converting *(pointer+n) to pointer[n] [108] *((byte*~) main::enableVideoOutput1_$1) ← (byte) $1e -- *(main::enableVideoOutput1_$3 + OFFSET_STRUCT_RICOH_2C02_PPUMASK) +Converting *(pointer+n) to pointer[n] [111] *((byte*~) main::$54) ← (byte) $88 -- *(main::$55 + OFFSET_STRUCT_RICOH_2C02_PPUCTRL) +Converting *(pointer+n) to pointer[n] [214] *((byte*~) vblank::$1) ← (byte) 0 -- *(vblank::$3 + OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) +Converting *(pointer+n) to pointer[n] [217] *((byte*~) vblank::$2) ← (volatile byte) scroll_y -- *(vblank::$4 + OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) +Converting *(pointer+n) to pointer[n] [221] *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1) ← (byte) 0 -- *(vblank::ppuSpriteBufferDmaTransfer1_$3 + OFFSET_STRUCT_RICOH_2C02_OAMADDR) +Converting *(pointer+n) to pointer[n] [225] *((byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2) ← (byte~) vblank::ppuSpriteBufferDmaTransfer1_$0 -- *(vblank::ppuSpriteBufferDmaTransfer1_$4 + OFFSET_STRUCT_RICOH_2A03_OAMDMA) +Successful SSA optimization Pass2InlineDerefIdx +De-inlining pointer[w] to *(pointer+w) [128] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_VELOCITY + (word~) main::$35) ← (word~) main::$10 +De-inlining pointer[w] to *(pointer+w) [135] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$36) ← (byte~) main::$12 +De-inlining pointer[w] to *(pointer+w) [163] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$39) ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$39) + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_VELOCITY + (word~) main::$39) +De-inlining pointer[w] to *(pointer+w) [163] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$39) ← *((word*~) main::$61) + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_VELOCITY + (word~) main::$39) +De-inlining pointer[w] to *(pointer+w) [163] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$39) ← *((word*~) main::$61) + *((word*~) main::$62) +De-inlining pointer[w] to *(pointer+w) [165] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$40) ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$40) + (byte) $10 +De-inlining pointer[w] to *(pointer+w) [165] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$40) ← *((word*~) main::$64) + (byte) $10 +De-inlining pointer[w] to *(pointer+w) [167] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$41) ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$41) + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$41) +De-inlining pointer[w] to *(pointer+w) [167] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$41) ← *((word*~) main::$66) + *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$41) +De-inlining pointer[w] to *(pointer+w) [167] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$41) ← *((word*~) main::$66) + *((word*~) main::$67) +De-inlining pointer[w] to *(pointer+w) [169] (word~) main::$20 ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$42) >> (byte) 8 +De-inlining pointer[w] to *(pointer+w) [174] (word~) main::$23 ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$43) >> (byte) 8 +De-inlining pointer[w] to *(pointer+w) [177] (word~) main::$25 ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$44) >> (byte) 8 +De-inlining pointer[w] to *(pointer+w) [184] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_VELOCITY + (word~) main::$45) ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_VELOCITY + (word~) main::$45) ^ (word) $ffff +De-inlining pointer[w] to *(pointer+w) [184] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_VELOCITY + (word~) main::$45) ← *((word*~) main::$72) ^ (word) $ffff +De-inlining pointer[w] to *(pointer+w) [186] (word~) main::$32 ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$46) >> (byte) 8 +De-inlining pointer[w] to *(pointer+w) [194] (word~) main::$33 ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$50) >> (byte) 8 +De-inlining pointer[w] to *(pointer+w) [200] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$52) ← *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$52) ^ (word) $ffff +De-inlining pointer[w] to *(pointer+w) [200] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_VELOCITY + (word~) main::$52) ← *((word*~) main::$76) ^ (word) $ffff +De-inlining pointer[w] to *(pointer+w) [205] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_Y_POSITION + (word~) main::$53) ← (word~) main::$31 +Successful SSA optimization Pass2DeInlineWordDerefIdx +Simplifying expression containing zero main::initNES1_disableVideoOutput1_$2 in [51] (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 [52] *((const byte*) main::initNES1_disableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL) ← (byte) 0 +Simplifying expression containing zero MEMORY in [69] *((const nomodify byte*) MEMORY+(byte) 0 + (byte) main::initNES1_i#2) ← (byte) 0 +Simplifying expression containing zero main::enableVideoOutput1_$2 in [104] (byte*~) main::enableVideoOutput1_$0 ← (const byte*) main::enableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL +Simplifying expression containing zero main::enableVideoOutput1_$2 in [105] *((const byte*) main::enableVideoOutput1_$2 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL) ← (byte) $80 +Simplifying expression containing zero main::$55 in [110] (byte*~) main::$54 ← (const byte*) main::$55 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL +Simplifying expression containing zero main::$55 in [111] *((const byte*) main::$55 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL) ← (byte) $88 +Simplifying expression containing zero (word*)balls in [156] *((word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (byte~) main::$37) ← (byte) 0 +Simplifying expression containing zero (word*)balls in (word*~) main::$61 ← (word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$39 +Simplifying expression containing zero (word*)balls in (word*~) main::$63 ← (word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$39 +Simplifying expression containing zero (word*)balls in (word*~) main::$69 ← (word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$42 +Simplifying expression containing zero (byte*)SPRITE_BUFFER in [188] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_Y + (byte~) main::$47) ← (byte)(word~) main::$32 +Simplifying expression containing zero (word*)balls in (word*~) main::$75 ← (word*)(const struct $0*) balls+(const byte) OFFSET_STRUCT_$0_X_POSITION + (word~) main::$50 +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 [15] (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 [18] (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 [24] (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 [39] (byte*~) main::initNES1_disableVideoOutput1_$0 ← (const byte*) main::initNES1_disableVideoOutput1_$2 +Eliminating unused variable (byte*~) main::initNES1_disableVideoOutput1_$1 and assignment [41] (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 [44] (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 [47] (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 [61] (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 [69] (byte*~) main::enableVideoOutput1_$0 ← (const byte*) main::enableVideoOutput1_$2 +Eliminating unused variable (byte*~) main::enableVideoOutput1_$1 and assignment [71] (byte*~) main::enableVideoOutput1_$1 ← (const byte*) main::enableVideoOutput1_$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK +Eliminating unused variable (byte*~) main::$54 and assignment [73] (byte*~) main::$54 ← (const byte*) main::$55 +Eliminating unused variable (byte*~) vblank::$1 and assignment [171] (byte*~) vblank::$1 ← (const byte*) vblank::$3 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL +Eliminating unused variable (byte*~) vblank::$2 and assignment [173] (byte*~) vblank::$2 ← (const byte*) vblank::$4 + (const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL +Eliminating unused variable (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$1 and assignment [175] (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 [178] (byte*~) vblank::ppuSpriteBufferDmaTransfer1_$2 ← (const byte*) vblank::ppuSpriteBufferDmaTransfer1_$4 + (const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA +Eliminating unused constant (const word) main::i#0 +Eliminating unused constant (const byte) main::h_bar#0 +Eliminating unused constant (const byte) main::sprite_idx#0 +Eliminating unused constant (const signed word) main::return#2 +Eliminating unused constant (const byte) OFFSET_STRUCT_RICOH_2C02_PPUCTRL +Eliminating unused constant (const byte) OFFSET_STRUCT_$0_X_POSITION +Eliminating unused constant (const byte) OFFSET_STRUCT_SPRITEDATA_Y +Successful SSA optimization PassNEliminateUnusedVars +Eliminating unused constant (const signed word) main::return#0 +Successful SSA optimization PassNEliminateUnusedVars +Removing unused block main::@5 +Removing unused block main::@return +Successful SSA optimization Pass2EliminateUnusedBlocks +Resolving array sizeof() sizeof (const to_nomodify byte*) palette +Resolving array sizeof() sizeof (const to_nomodify byte*) h_bar_tilemap +Successful SSA optimization PassNSizeOfSimplification +Alias candidate removed (volatile)scroll_y = main::$14 +Alias main::$38 = main::$37 +Alias main::$40 = main::$39 main::$41 main::$42 +Alias main::$44 = main::$43 +Alias main::$48 = main::$47 main::$49 main::$51 +Alias main::$50 = main::$46 +Alias main::$53 = main::$52 +Successful SSA optimization Pass2AliasElimination +Alias candidate removed (volatile)scroll_y = main::$14 +Simple Condition (bool~) main::$24 [117] if((word~) main::$23>=(byte) main::h_bar#1) goto main::@26 +Simple Condition (bool~) main::$27 [157] if((word~) main::$25<(byte~) main::$26) goto main::@13 +Successful SSA optimization Pass2ConditionalJumpSimplification +Negating conditional jump and destination [117] if((word~) main::$23<(byte) main::h_bar#1) goto main::@11 +Negating conditional jump and destination [157] if((word~) main::$25>=(byte~) main::$26) goto main::@11 +Successful SSA optimization Pass2ConditionalJumpSequenceImprovement +Constant right-side identified [149] (byte~) vblank::ppuSpriteBufferDmaTransfer1_$0 ← > (const struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 +Successful SSA optimization Pass2ConstantRValueConsolidation +Constant (const byte) vblank::ppuSpriteBufferDmaTransfer1_$0 = >vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 +Successful SSA optimization Pass2ConstantIdentification +Adding number conversion cast (unumber) $20 in +Adding number conversion cast (unumber) $20 in +Successful SSA optimization PassNAddNumberTypeConversions +Simplifying constant integer cast $20 +Simplifying constant integer cast $20 +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type (byte) $20 +Finalized unsigned number type (byte) $20 +Successful SSA optimization PassNFinalizeNumberTypeConversions +Alias candidate removed (volatile)scroll_y = main::$14 +Alias candidate removed (volatile)scroll_y = main::$14 +Inlining Noop Cast [15] (byte*) ppuDataTransfer::cpuSrc#0 ← (byte*)(nomodify void*) ppuDataTransfer::cpuData#2 keeping ppuDataTransfer::cpuData#2 +Successful SSA optimization Pass2NopCastInlining +Rewriting multiplication to use shift [67] (word~) main::$35 ← (word) main::i#14 * (const byte) SIZEOF_STRUCT_$0 +Rewriting multiplication to use shift [74] (word~) main::$36 ← (word) main::i#14 * (const byte) SIZEOF_STRUCT_$0 +Rewriting multiplication to use shift [88] (byte~) main::$38 ← (byte) main::active_balls#1 * (const byte) SIZEOF_STRUCT_$0 +Rewriting multiplication to use shift [93] (word~) main::$40 ← (word) main::i#10 * (const byte) SIZEOF_STRUCT_$0 +Rewriting multiplication to use shift [109] (word~) main::$44 ← (word) main::i#10 * (const byte) SIZEOF_STRUCT_$0 +Rewriting multiplication to use shift [116] (word~) main::$45 ← (word) main::i#10 * (const byte) SIZEOF_STRUCT_$0 +Rewriting multiplication to use shift [120] (word~) main::$50 ← (word) main::i#10 * (const byte) SIZEOF_STRUCT_$0 +Rewriting multiplication to use shift [123] (byte~) main::$48 ← (byte) main::sprite_idx#3 * (const byte) SIZEOF_STRUCT_SPRITEDATA +Rewriting multiplication to use shift [132] (word~) main::$53 ← (word) main::i#10 * (const byte) SIZEOF_STRUCT_$0 +Successful SSA optimization Pass2MultiplyToShiftRewriting +Inlining constant with var siblings (const word) ppuDataFill::i#0 +Inlining constant with different constant siblings (const nomodify void*) ppuDataFill::ppuData#0 +Inlining constant with var siblings (const byte) ppuDataFill::val#0 +Inlining constant with var siblings (const word) ppuDataFill::size#0 +Inlining constant with different constant siblings (const nomodify void*) ppuDataFill::ppuData#1 +Inlining constant with var siblings (const byte) ppuDataFill::val#1 +Inlining constant with var siblings (const word) ppuDataFill::size#1 +Inlining constant with var siblings (const word) ppuDataTransfer::i#0 +Inlining constant with var siblings (const word) ppuDataTransfer::size#0 +Inlining constant with different constant siblings (const nomodify void*) ppuDataTransfer::ppuData#0 +Inlining constant with var siblings (const nomodify void*) ppuDataTransfer::cpuData#0 +Inlining constant with var siblings (const word) ppuDataTransfer::size#1 +Inlining constant with different constant siblings (const nomodify void*) ppuDataTransfer::ppuData#1 +Inlining constant with var siblings (const nomodify void*) ppuDataTransfer::cpuData#1 +Inlining constant with var siblings (const byte) main::initNES1_i#0 +Inlining constant with var siblings (const byte) main::active_balls#0 +Inlining constant with var siblings (const byte) main::timer#0 +Inlining constant with var siblings (const byte) main::timer_2#0 +Inlining constant with var siblings (const word) main::i#1 +Inlining constant with var siblings (const byte) main::sprite_idx#1 +Inlining constant with var siblings (const word) main::i#3 +Inlining constant with var siblings (const byte) main::timer#2 +Inlining constant with var siblings (const word) rand_state#19 +Constant inlined OFFSET_STRUCT_$0_Y_POSITION = (byte) 2 +Constant inlined ppuDataTransfer::i#0 = (word) 0 +Constant inlined main::active_balls#0 = (byte) 0 +Constant inlined OFFSET_STRUCT_$0_X_VELOCITY = (byte) 4 +Constant inlined main::enableVideoOutput1_$3 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined main::enableVideoOutput1_$2 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined ppuDataTransfer::ppuDataPut1_$1 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined ppuDataFill::val#1 = (byte) 0 +Constant inlined ppuDataFill::ppuDataPut1_$1 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined main::$55 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined ppuDataFill::val#0 = (byte) 0 +Constant inlined vblank::$3 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined OFFSET_STRUCT_$0_Y_VELOCITY = (byte) 6 +Constant inlined vblank::$4 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined main::initNES1_waitForVBlank2_$3 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined ppuDataFill::ppuDataPrepare1_$4 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined ppuDataTransfer::ppuDataPrepare1_$5 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined ppuDataFill::ppuDataPrepare1_$5 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined ppuDataTransfer::ppuDataPrepare1_$4 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined main::initNES1_disableVideoOutput1_$3 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined main::initNES1_disableVideoOutput1_$2 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined ppuDataFill::ppuData#1 = (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 +Constant inlined ppuDataFill::ppuData#0 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0 +Constant inlined main::i#1 = (byte) 0 +Constant inlined main::initNES1_disableAudioOutput1_$1 = (byte*)(const struct RICOH_2A03*) APU +Constant inlined ppuDataTransfer::cpuData#1 = (void*)(const to_nomodify byte*) h_bar_tilemap +Constant inlined ppuDataTransfer::cpuData#0 = (void*)(const to_nomodify byte*) palette +Constant inlined ppuDataTransfer::ppuData#1 = (void*) 8256 +Constant inlined ppuDataTransfer::ppuData#0 = (void*)(const nomodify byte*) PPU_PALETTE +Constant inlined main::timer_2#0 = (byte) 0 +Constant inlined main::i#3 = (byte) 0 +Constant inlined main::initNES1_i#0 = (byte) 0 +Constant inlined rand_state#19 = (word) 1 +Constant inlined ppuDataTransfer::size#1 = (byte) $20*(const byte) SIZEOF_BYTE +Constant inlined ppuDataTransfer::size#0 = (byte) $20*(const byte) SIZEOF_BYTE +Constant inlined main::timer#0 = (byte) 0 +Constant inlined vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer#0 = (const struct SpriteData*) SPRITE_BUFFER +Constant inlined main::timer#2 = (byte) 0 +Constant inlined main::initNES1_waitForVBlank1_$3 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined SIZEOF_STRUCT_$0 = (byte) 8 +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 main::sprite_idx#1 = (byte) 0 +Constant inlined vblank::ppuSpriteBufferDmaTransfer1_$3 = (byte*)(const struct RICOH_2C02*) PPU +Constant inlined ppuDataFill::i#0 = (word) 0 +Constant inlined vblank::ppuSpriteBufferDmaTransfer1_$4 = (byte*)(const struct RICOH_2A03*) APU +Successful SSA optimization Pass2ConstantInlining +Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR) +Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR) +Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA) +Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR) +Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR) +Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA) +Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK) +Consolidated array index constant in *((byte*)APU+OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) +Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) +Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) +Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUMASK) +Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) +Consolidated array index constant in *((byte*)PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) +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)scroll_y = main::$14 +Identical Phi Values (byte) ppuDataFill::val#4 (byte) 0 +Identical Phi Values (word) ppuDataTransfer::size#3 (byte) $20*(const byte) SIZEOF_BYTE +Successful SSA optimization Pass2IdenticalPhiElimination +Eliminating unused constant (const byte) SIZEOF_STRUCT_SPRITEDATA +Successful SSA optimization PassNEliminateUnusedVars +Alias candidate removed (volatile)scroll_y = main::$14 +Added new block during phi lifting main::@27(between main::initNES1_@1 and main::initNES1_@1) +Added new block during phi lifting main::@28(between main::@16 and main::@6) +Added new block during phi lifting main::@29(between main::@4 and main::@6) +Adding NOP phi() at start of __start +Adding NOP phi() at start of __start::@1 +Adding NOP phi() at start of __start::@2 +Adding NOP phi() at start of main +Adding NOP phi() at start of main::initNES1_waitForVBlank1 +Adding NOP phi() at start of main::initNES1_@6 +Adding NOP phi() at start of main::initNES1_waitForVBlank2 +Adding NOP phi() at start of main::@18 +Adding NOP phi() at start of main::@20 +Adding NOP phi() at start of main::@21 +Adding NOP phi() at start of main::@22 +Adding NOP phi() at start of main::@23 +Adding NOP phi() at start of ppuDataFill::@3 +Adding NOP phi() at start of ppuDataFill::@2 +CALL GRAPH +Calls in [__start] to main:4 +Calls in [main] to ppuDataTransfer:40 ppuDataFill:42 ppuDataFill:44 ppuDataTransfer:46 rand:131 rand:139 + +Created 18 initial phi equivalence classes +Coalesced [65] main::active_balls#22 ← main::active_balls#1 +Coalesced [73] main::timer_2#20 ← main::timer_2#1 +Coalesced [74] main::active_balls#20 ← main::active_balls#8 +Coalesced [75] main::timer#20 ← main::timer#15 +Coalesced [124] main::i#16 ← main::i#4 +Coalesced [125] main::sprite_idx#9 ← main::sprite_idx#2 +Coalesced (already) [126] main::active_balls#21 ← main::active_balls#2 +Not coalescing [127] main::timer#21 ← main::timer#1 +Coalesced (already) [128] main::active_balls#23 ← main::active_balls#2 +Coalesced (already) [129] main::timer#22 ← main::timer#3 +Coalesced [130] rand_state#54 ← rand_state#17 +Coalesced [138] rand_state#55 ← rand_state#11 +Coalesced [147] main::i#15 ← main::i#2 +Coalesced (already) [148] rand_state#56 ← rand_state#11 +Coalesced [149] main::initNES1_i#3 ← main::initNES1_i#1 +Coalesced [163] ppuDataTransfer::i#6 ← ppuDataTransfer::i#1 +Coalesced [164] ppuDataTransfer::cpuSrc#7 ← ppuDataTransfer::cpuSrc#1 +Coalesced [177] ppuDataFill::i#6 ← ppuDataFill::i#1 +Coalesced down to 16 phi equivalence classes +Culled Empty Block (label) __start::@2 +Culled Empty Block (label) main::initNES1_@6 +Culled Empty Block (label) main::@23 +Culled Empty Block (label) main::@29 +Culled Empty Block (label) main::@27 +Culled Empty Block (label) ppuDataFill::@3 +Culled Empty Block (label) ppuDataFill::@2 +Renumbering block ppuDataFill::@4 to ppuDataFill::@2 +Renumbering block main::@6 to main::@5 +Renumbering block main::@7 to main::@6 +Renumbering block main::@8 to main::@7 +Renumbering block main::@9 to main::@8 +Renumbering block main::@10 to main::@9 +Renumbering block main::@11 to main::@10 +Renumbering block main::@12 to main::@11 +Renumbering block main::@13 to main::@12 +Renumbering block main::@14 to main::@13 +Renumbering block main::@15 to main::@14 +Renumbering block main::@16 to main::@15 +Renumbering block main::@17 to main::@16 +Renumbering block main::@18 to main::@17 +Renumbering block main::@19 to main::@18 +Renumbering block main::@20 to main::@19 +Renumbering block main::@21 to main::@20 +Renumbering block main::@22 to main::@21 +Renumbering block main::@24 to main::@22 +Renumbering block main::@25 to main::@23 +Renumbering block main::@26 to main::@24 +Renumbering block main::@28 to main::@25 +Adding NOP phi() at start of __start +Adding NOP phi() at start of __start::@1 +Adding NOP phi() at start of main +Adding NOP phi() at start of main::initNES1_waitForVBlank1 +Adding NOP phi() at start of main::initNES1_waitForVBlank2 +Adding NOP phi() at start of main::@17 +Adding NOP phi() at start of main::@19 +Adding NOP phi() at start of main::@20 +Adding NOP phi() at start of main::@21 +Adding NOP phi() at start of main::@2 + +FINAL CONTROL FLOW GRAPH + +(void()) __start() +__start: scope:[__start] from + [0] phi() + to:__start::__init1 +__start::__init1: scope:[__start] from __start + [1] (volatile byte) scroll_y ← (byte) 0 + [2] (volatile byte) vblank_hit ← (byte) 0 + to:__start::@1 +__start::@1: scope:[__start] from __start::__init1 + [3] phi() + [4] call main + to:__start::@return +__start::@return: scope:[__start] from __start::@1 + [5] return + to:@return + +interrupt(HARDWARE_STACK)(void()) vblank() +vblank: scope:[vblank] from + [6] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 + [7] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (volatile byte) scroll_y + to:vblank::ppuSpriteBufferDmaTransfer1 +vblank::ppuSpriteBufferDmaTransfer1: scope:[vblank] from vblank + [8] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 + [9] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER + to:vblank::@1 +vblank::@1: scope:[vblank] from vblank::ppuSpriteBufferDmaTransfer1 + [10] (volatile byte) vblank_hit ← ++ (volatile byte) vblank_hit + to:vblank::@return +vblank::@return: scope:[vblank] from vblank::@1 + [11] return + to:@return + +(signed word()) main() +main: scope:[main] from __start::@1 + [12] 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 + [14] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 + [15] *((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 + [16] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 + [17] *((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 + [19] phi() + to:main::initNES1_waitForVBlank1_@1 +main::initNES1_waitForVBlank1_@1: scope:[main] from main::initNES1_waitForVBlank1 main::initNES1_waitForVBlank1_@1 + [20] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 + [21] 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 + [22] (byte) main::initNES1_i#2 ← phi( main::initNES1_@1/(byte) main::initNES1_i#1 main::initNES1_waitForVBlank1_@1/(byte) 0 ) + [23] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 + [24] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 + [25] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 + [26] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 + [27] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 + [28] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 + [29] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 + [30] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 + [31] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 + [32] 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 + [33] phi() + to:main::initNES1_waitForVBlank2_@1 +main::initNES1_waitForVBlank2_@1: scope:[main] from main::initNES1_waitForVBlank2 main::initNES1_waitForVBlank2_@1 + [34] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 + [35] 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::@17 +main::@17: scope:[main] from main::initNES1_@7 + [37] phi() + [38] call ppuDataTransfer + to:main::@19 +main::@19: scope:[main] from main::@17 + [39] phi() + [40] call ppuDataFill + to:main::@20 +main::@20: scope:[main] from main::@19 + [41] phi() + [42] call ppuDataFill + to:main::@21 +main::@21: scope:[main] from main::@20 + [43] phi() + [44] call ppuDataTransfer + to:main::enableVideoOutput1 +main::enableVideoOutput1: scope:[main] from main::@21 + [45] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 + [46] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e + to:main::@18 +main::@18: scope:[main] from main::enableVideoOutput1 + [47] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $88 + to:main::@1 +main::@1: scope:[main] from main::@18 main::@23 + [48] (word) rand_state#17 ← phi( main::@18/(word) 1 main::@23/(word) rand_state#11 ) + [48] (word) main::i#14 ← phi( main::@18/(byte) 0 main::@23/(word) main::i#2 ) + [49] if((word) main::i#14<(byte) $32) goto main::@2 + to:main::@3 +main::@3: scope:[main] from main::@1 main::@14 + [50] (byte) main::timer#3 ← phi( main::@1/(byte) 0 main::@14/(byte) main::timer#15 ) + [50] (byte) main::active_balls#2 ← phi( main::@1/(byte) 0 main::@14/(byte) main::active_balls#8 ) + [50] (byte) main::timer_2#2 ← phi( main::@1/(byte) 0 main::@14/(byte) main::timer_2#1 ) + to:main::@4 +main::@4: scope:[main] from main::@3 + [51] (byte) main::timer_2#1 ← ++ (byte) main::timer_2#2 + [52] (byte) main::h_bar#1 ← *((const to_nomodify byte*) sine_table + (byte) main::timer_2#1) + (byte) $60 + [53] (byte~) main::$14 ← (byte) main::h_bar#1 ^ (byte) $ff + [54] (volatile byte) scroll_y ← (byte~) main::$14 + [55] if((byte) main::active_balls#2>=(byte) $32) goto main::@5 + to:main::@15 +main::@15: scope:[main] from main::@4 + [56] (byte) main::timer#1 ← ++ (byte) main::timer#3 + [57] if((byte) main::timer#3!=(byte) 9) goto main::@25 + to:main::@16 +main::@16: scope:[main] from main::@15 + [58] (byte) main::active_balls#1 ← ++ (byte) main::active_balls#2 + [59] (byte~) main::$38 ← (byte) main::active_balls#1 << (byte) 3 + [60] *((word*)(const struct $0*) balls + (byte~) main::$38) ← (byte) 0 + [61] *((word*)(const struct $0*) balls+(byte) 2 + (byte~) main::$38) ← (byte) 0 + to:main::@5 +main::@5: scope:[main] from main::@16 main::@25 main::@4 + [62] (byte) main::timer#15 ← phi( main::@25/(byte) main::timer#21 main::@16/(byte) 0 main::@4/(byte) main::timer#3 ) + [62] (byte) main::active_balls#8 ← phi( main::@25/(byte) main::active_balls#2 main::@16/(byte) main::active_balls#1 main::@4/(byte) main::active_balls#2 ) + to:main::@6 +main::@6: scope:[main] from main::@10 main::@5 + [63] (byte) main::sprite_idx#3 ← phi( main::@10/(byte) main::sprite_idx#2 main::@5/(byte) 0 ) + [63] (word) main::i#10 ← phi( main::@10/(word) main::i#4 main::@5/(byte) 0 ) + [64] if((word) main::i#10<(byte) main::active_balls#8) goto main::@7 + to:main::@8 +main::@8: scope:[main] from main::@6 + [65] *((byte*) 8193) ← (byte) $98 + to:main::@13 +main::@13: scope:[main] from main::@13 main::@8 + [66] if((byte) 0==(volatile byte) vblank_hit) goto main::@13 + to:main::@14 +main::@14: scope:[main] from main::@13 + [67] (volatile byte) vblank_hit ← (byte) 0 + [68] *((byte*) 8193) ← (byte) $18 + to:main::@3 +main::@7: scope:[main] from main::@6 + [69] (word~) main::$40 ← (word) main::i#10 << (byte) 3 + [70] (word*~) main::$61 ← (word*)(const struct $0*) balls + (word~) main::$40 + [71] (word*~) main::$62 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$40 + [72] (word*~) main::$63 ← (word*)(const struct $0*) balls + (word~) main::$40 + [73] *((word*~) main::$63) ← *((word*~) main::$61) + *((word*~) main::$62) + [74] (word*~) main::$64 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 + [75] (word*~) main::$65 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 + [76] *((word*~) main::$65) ← *((word*~) main::$64) + (byte) $10 + [77] (word*~) main::$66 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$40 + [78] (word*~) main::$67 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 + [79] (word*~) main::$68 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$40 + [80] *((word*~) main::$68) ← *((word*~) main::$66) + *((word*~) main::$67) + [81] (word*~) main::$69 ← (word*)(const struct $0*) balls + (word~) main::$40 + [82] (word~) main::$20 ← *((word*~) main::$69) >> (byte) 8 + [83] if((word~) main::$20>=(byte) 8) goto main::@9 + to:main::@11 +main::@11: scope:[main] from main::@7 + [84] (word~) main::$45 ← (word) main::i#10 << (byte) 3 + [85] (word*~) main::$72 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$45 + [86] (word*~) main::$73 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$45 + [87] *((word*~) main::$73) ← *((word*~) main::$72) ^ (word) $ffff + to:main::@9 +main::@9: scope:[main] from main::@11 main::@7 + [88] (word~) main::$44 ← (word) main::i#10 << (byte) 3 + [89] (word*~) main::$70 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$44 + [90] (word~) main::$23 ← *((word*~) main::$70) >> (byte) 8 + [91] (word*~) main::$71 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$44 + [92] (word~) main::$25 ← *((word*~) main::$71) >> (byte) 8 + [93] (byte~) main::$26 ← (byte) main::h_bar#1 + (byte) 8 + [94] if((word~) main::$23<(byte) main::h_bar#1) goto main::@10 + to:main::@24 +main::@24: scope:[main] from main::@9 + [95] if((word~) main::$25>=(byte~) main::$26) goto main::@10 + to:main::@12 +main::@12: scope:[main] from main::@24 + [96] (word~) main::$53 ← (word) main::i#10 << (byte) 3 + [97] (word*~) main::$76 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$53 + [98] (word*~) main::$77 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$53 + [99] *((word*~) main::$77) ← *((word*~) main::$76) ^ (word) $ffff + [100] (byte~) main::$30 ← (byte) main::h_bar#1 - (byte) 2 + [101] (word~) main::$56 ← (word)(byte~) main::$30 + [102] (word~) main::$31 ← (word~) main::$56 << (byte) 8 + [103] (word*~) main::$78 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$53 + [104] *((word*~) main::$78) ← (word~) main::$31 + to:main::@10 +main::@10: scope:[main] from main::@12 main::@24 main::@9 + [105] (word~) main::$50 ← (word) main::i#10 << (byte) 3 + [106] (word*~) main::$74 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$50 + [107] (word~) main::$32 ← *((word*~) main::$74) >> (byte) 8 + [108] (byte~) main::$48 ← (byte) main::sprite_idx#3 << (byte) 2 + [109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$48) ← (byte)(word~) main::$32 + [110] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$48) ← (byte) $a + [111] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$48) ← (byte) 3 + [112] (word*~) main::$75 ← (word*)(const struct $0*) balls + (word~) main::$50 + [113] (word~) main::$33 ← *((word*~) main::$75) >> (byte) 8 + [114] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$48) ← (byte)(word~) main::$33 + [115] (byte) main::sprite_idx#2 ← ++ (byte) main::sprite_idx#3 + [116] (word) main::i#4 ← ++ (word) main::i#10 + to:main::@6 +main::@25: scope:[main] from main::@15 + [117] (byte) main::timer#21 ← (byte) main::timer#1 + to:main::@5 +main::@2: scope:[main] from main::@1 + [118] phi() + [119] call rand + [120] (word) rand::return#2 ← (word) rand::return#0 + to:main::@22 +main::@22: scope:[main] from main::@2 + [121] (word~) main::$9 ← (word) rand::return#2 + [122] (word~) main::$10 ← (word~) main::$9 & (word) $3ff + [123] (word~) main::$35 ← (word) main::i#14 << (byte) 3 + [124] (word*~) main::$59 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$35 + [125] *((word*~) main::$59) ← (word~) main::$10 + [126] call rand + [127] (word) rand::return#3 ← (word) rand::return#0 + to:main::@23 +main::@23: scope:[main] from main::@22 + [128] (word~) main::$11 ← (word) rand::return#3 + [129] (byte~) main::$12 ← (word~) main::$11 & (byte) $ff + [130] (word~) main::$36 ← (word) main::i#14 << (byte) 3 + [131] (word*~) main::$60 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$36 + [132] *((word*~) main::$60) ← (byte~) main::$12 + [133] (word) main::i#2 ← ++ (word) main::i#14 + to:main::@1 + +(void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size) +ppuDataTransfer: scope:[ppuDataTransfer] from main::@17 main::@21 + [134] (nomodify void*) ppuDataTransfer::cpuData#2 ← phi( main::@17/(void*)(const to_nomodify byte*) palette main::@21/(void*)(const to_nomodify byte*) h_bar_tilemap ) + [134] (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 ← phi( main::@17/(void*)(const nomodify byte*) PPU_PALETTE main::@21/(void*) 8256 ) + to:ppuDataTransfer::ppuDataPrepare1 +ppuDataTransfer::ppuDataPrepare1: scope:[ppuDataTransfer] from ppuDataTransfer + [135] (byte~) ppuDataTransfer::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 + [136] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$0 + [137] (byte~) ppuDataTransfer::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 + [138] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$1 + to:ppuDataTransfer::@3 +ppuDataTransfer::@3: scope:[ppuDataTransfer] from ppuDataTransfer::ppuDataPrepare1 + [139] (byte*) ppuDataTransfer::cpuSrc#6 ← (byte*)(nomodify void*) ppuDataTransfer::cpuData#2 + to:ppuDataTransfer::@1 +ppuDataTransfer::@1: scope:[ppuDataTransfer] from ppuDataTransfer::@3 ppuDataTransfer::@4 + [140] (byte*) ppuDataTransfer::cpuSrc#2 ← phi( ppuDataTransfer::@3/(byte*) ppuDataTransfer::cpuSrc#6 ppuDataTransfer::@4/(byte*) ppuDataTransfer::cpuSrc#1 ) + [140] (word) ppuDataTransfer::i#2 ← phi( ppuDataTransfer::@3/(word) 0 ppuDataTransfer::@4/(word) ppuDataTransfer::i#1 ) + [141] if((word) ppuDataTransfer::i#2<(byte) $20*(const byte) SIZEOF_BYTE) goto ppuDataTransfer::@2 + to:ppuDataTransfer::@return +ppuDataTransfer::@return: scope:[ppuDataTransfer] from ppuDataTransfer::@1 + [142] return + to:@return +ppuDataTransfer::@2: scope:[ppuDataTransfer] from ppuDataTransfer::@1 + [143] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) + to:ppuDataTransfer::ppuDataPut1 +ppuDataTransfer::ppuDataPut1: scope:[ppuDataTransfer] from ppuDataTransfer::@2 + [144] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0 + to:ppuDataTransfer::@4 +ppuDataTransfer::@4: scope:[ppuDataTransfer] from ppuDataTransfer::ppuDataPut1 + [145] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 + [146] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2 + to:ppuDataTransfer::@1 + +(void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size) +ppuDataFill: scope:[ppuDataFill] from main::@19 main::@20 + [147] (word) ppuDataFill::size#3 ← phi( main::@19/(word)(number) $20*(number) $1e main::@20/(byte) $40 ) + [147] (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ← phi( main::@19/(void*)(const nomodify byte*) PPU_NAME_TABLE_0 main::@20/(void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 ) + to:ppuDataFill::ppuDataPrepare1 +ppuDataFill::ppuDataPrepare1: scope:[ppuDataFill] from ppuDataFill + [148] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 + [149] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0 + [150] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 + [151] *((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 + [152] (word) ppuDataFill::i#2 ← phi( ppuDataFill::ppuDataPrepare1/(word) 0 ppuDataFill::@2/(word) ppuDataFill::i#1 ) + [153] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 + to:ppuDataFill::@return +ppuDataFill::@return: scope:[ppuDataFill] from ppuDataFill::@1 + [154] return + to:@return +ppuDataFill::ppuDataPut1: scope:[ppuDataFill] from ppuDataFill::@1 + [155] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) 0 + to:ppuDataFill::@2 +ppuDataFill::@2: scope:[ppuDataFill] from ppuDataFill::ppuDataPut1 + [156] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2 + to:ppuDataFill::@1 + +(word()) rand() +rand: scope:[rand] from main::@2 main::@22 + [157] (word) rand_state#10 ← phi( main::@2/(word) rand_state#17 main::@22/(word) rand_state#11 ) + [158] (word~) rand::$0 ← (word) rand_state#10 << (byte) 7 + [159] (word) rand_state#0 ← (word) rand_state#10 ^ (word~) rand::$0 + [160] (word~) rand::$1 ← (word) rand_state#0 >> (byte) 9 + [161] (word) rand_state#1 ← (word) rand_state#0 ^ (word~) rand::$1 + [162] (word~) rand::$2 ← (word) rand_state#1 << (byte) 8 + [163] (word) rand_state#11 ← (word) rand_state#1 ^ (word~) rand::$2 + [164] (word) rand::return#0 ← (word) rand_state#11 + to:rand::@return +rand::@return: scope:[rand] from rand + [165] return + to:@return + + +VARIABLE REGISTER WEIGHTS +(word) $0::x_position +(word) $0::x_velocity +(word) $0::y_position +(word) $0::y_velocity +(byte) RICOH_2A03::DMC_FREQ +(byte) RICOH_2A03::DMC_LEN +(byte) RICOH_2A03::DMC_RAW +(byte) RICOH_2A03::DMC_START +(byte) RICOH_2A03::JOY1 +(byte) RICOH_2A03::JOY2 +(byte) RICOH_2A03::NOISE_HI +(byte) RICOH_2A03::NOISE_LO +(byte) RICOH_2A03::NOISE_VOL +(byte) RICOH_2A03::OAMDMA +(byte) RICOH_2A03::SND_CHN +(byte) RICOH_2A03::SQ1_HI +(byte) RICOH_2A03::SQ1_LO +(byte) RICOH_2A03::SQ1_SWEEP +(byte) RICOH_2A03::SQ1_VOL +(byte) RICOH_2A03::SQ2_HI +(byte) RICOH_2A03::SQ2_LO +(byte) RICOH_2A03::SQ2_SWEEP +(byte) RICOH_2A03::SQ2_VOL +(byte) RICOH_2A03::TRI_HI +(byte) RICOH_2A03::TRI_LINEAR +(byte) RICOH_2A03::TRI_LO +(byte) RICOH_2A03::UNUSED1 +(byte) RICOH_2A03::UNUSED2 +(byte) RICOH_2C02::OAMADDR +(byte) RICOH_2C02::OAMDATA +(byte) RICOH_2C02::PPUADDR +(byte) RICOH_2C02::PPUCTRL +(byte) RICOH_2C02::PPUDATA +(byte) RICOH_2C02::PPUMASK +(byte) RICOH_2C02::PPUSCROLL +(volatile byte) RICOH_2C02::PPUSTATUS loadstore +(byte) SpriteData::attributes +(byte) SpriteData::tile +(byte) SpriteData::x +(byte) SpriteData::y +(void()) __start() +(signed word()) main() +(word~) main::$10 67.33333333333333 +(word~) main::$11 202.0 +(byte~) main::$12 67.33333333333333 +(byte~) main::$14 202.0 +(word~) main::$20 2002.0 +(word~) main::$23 500.5 +(word~) main::$25 667.3333333333334 +(byte~) main::$26 1001.0 +(byte~) main::$30 1001.0 +(word~) main::$31 1001.0 +(word~) main::$32 500.5 +(word~) main::$33 1001.0 +(word~) main::$35 202.0 +(word~) main::$36 202.0 +(byte~) main::$38 151.5 +(word~) main::$40 834.1666666666666 +(word~) main::$44 1001.0 +(word~) main::$45 1501.5 +(byte~) main::$48 834.1666666666667 +(word~) main::$50 429.0 +(word~) main::$53 572.0 +(word~) main::$56 2002.0 +(word*~) main::$59 202.0 +(word*~) main::$60 202.0 +(word*~) main::$61 667.3333333333334 +(word*~) main::$62 1001.0 +(word*~) main::$63 2002.0 +(word*~) main::$64 1001.0 +(word*~) main::$65 2002.0 +(word*~) main::$66 667.3333333333334 +(word*~) main::$67 1001.0 +(word*~) main::$68 2002.0 +(word*~) main::$69 2002.0 +(word*~) main::$70 2002.0 +(word*~) main::$71 2002.0 +(word*~) main::$72 1001.0 +(word*~) main::$73 2002.0 +(word*~) main::$74 2002.0 +(word*~) main::$75 2002.0 +(word*~) main::$76 1001.0 +(word*~) main::$77 2002.0 +(word*~) main::$78 2002.0 +(word~) main::$9 202.0 +(byte) main::active_balls +(byte) main::active_balls#1 75.75 +(byte) main::active_balls#2 56.11111111111111 +(byte) main::active_balls#8 25.545454545454547 +(byte) main::h_bar +(byte) main::h_bar#1 51.69354838709677 +(word) main::i +(word) main::i#10 163.42857142857142 +(word) main::i#14 29.705882352941178 +(word) main::i#2 202.0 +(word) main::i#4 2002.0 +(byte) main::initNES1_i +(byte) main::initNES1_i#1 151.5 +(byte) main::initNES1_i#2 112.22222222222223 +(byte~) main::initNES1_waitForVBlank1_$0 202.0 +(byte~) main::initNES1_waitForVBlank2_$0 202.0 +(signed word) main::return +(byte) main::sprite_idx +(byte) main::sprite_idx#2 1001.0 +(byte) main::sprite_idx#3 62.5625 +(byte) main::timer +(byte) main::timer#1 101.0 +(byte) main::timer#15 5.50909090909091 +(byte) main::timer#21 202.0 +(byte) main::timer#3 57.714285714285715 +(byte) main::timer_2 +(byte) main::timer_2#1 4.522388059701492 +(byte) main::timer_2#2 202.0 +(void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size) +(word) ppuDataFill::i +(word) ppuDataFill::i#1 2002.0 +(word) ppuDataFill::i#2 1001.0 +(nomodify void*) ppuDataFill::ppuData +(byte~) ppuDataFill::ppuDataPrepare1_$0 202.0 +(byte~) ppuDataFill::ppuDataPrepare1_$1 202.0 +(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData +(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 67.33333333333333 +(byte) ppuDataFill::ppuDataPut1_val +(word) ppuDataFill::size +(word) ppuDataFill::size#3 111.22222222222223 +(byte) ppuDataFill::val +(void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size) +(nomodify void*) ppuDataTransfer::cpuData +(nomodify void*) ppuDataTransfer::cpuData#2 +(byte*) ppuDataTransfer::cpuSrc +(byte*) ppuDataTransfer::cpuSrc#1 1001.0 +(byte*) ppuDataTransfer::cpuSrc#2 776.0 +(byte*) ppuDataTransfer::cpuSrc#6 202.0 +(word) ppuDataTransfer::i +(word) ppuDataTransfer::i#1 2002.0 +(word) ppuDataTransfer::i#2 600.5999999999999 +(nomodify void*) ppuDataTransfer::ppuData +(byte~) ppuDataTransfer::ppuDataPrepare1_$0 202.0 +(byte~) ppuDataTransfer::ppuDataPrepare1_$1 202.0 +(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData +(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 67.33333333333333 +(byte) ppuDataTransfer::ppuDataPut1_val +(byte) ppuDataTransfer::ppuDataPut1_val#0 2002.0 +(word) ppuDataTransfer::size +(byte) printf_buffer_number::sign +(byte) printf_format_number::justify_left +(byte) printf_format_number::min_length +(byte) printf_format_number::radix +(byte) printf_format_number::sign_always +(byte) printf_format_number::upper_case +(byte) printf_format_number::zero_padding +(byte) printf_format_string::justify_left +(byte) printf_format_string::min_length +(word()) rand() +(word~) rand::$0 2002.0 +(word~) rand::$1 2002.0 +(word~) rand::$2 2002.0 +(word) rand::return +(word) rand::return#0 300.75 +(word) rand::return#2 202.0 +(word) rand::return#3 202.0 +(word) rand_state +(word) rand_state#0 1501.5 +(word) rand_state#1 1501.5 +(word) rand_state#10 1102.0 +(word) rand_state#11 122.44444444444446 +(word) rand_state#17 67.33333333333333 +(volatile byte) scroll_y loadstore 105.0 +interrupt(HARDWARE_STACK)(void()) vblank() +(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer +(volatile byte) vblank_hit loadstore 8.65625 + +Initial phi equivalence classes +[ main::initNES1_i#2 main::initNES1_i#1 ] +[ main::i#14 main::i#2 ] +[ main::timer_2#2 main::timer_2#1 ] +[ main::active_balls#2 main::active_balls#8 main::active_balls#1 ] +[ main::timer#3 main::timer#15 main::timer#21 ] +[ main::i#10 main::i#4 ] +[ main::sprite_idx#3 main::sprite_idx#2 ] +[ ppuDataTransfer::ppuDataPrepare1_ppuData#0 ] +[ ppuDataTransfer::cpuData#2 ] +[ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] +[ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#6 ppuDataTransfer::cpuSrc#1 ] +[ ppuDataFill::ppuDataPrepare1_ppuData#0 ] +[ ppuDataFill::size#3 ] +[ ppuDataFill::i#2 ppuDataFill::i#1 ] +[ rand_state#10 rand_state#17 rand_state#11 ] +Added variable scroll_y to live range equivalence class [ scroll_y ] +Added variable vblank_hit to live range equivalence class [ vblank_hit ] +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::h_bar#1 to live range equivalence class [ main::h_bar#1 ] +Added variable main::$14 to live range equivalence class [ main::$14 ] +Added variable main::timer#1 to live range equivalence class [ main::timer#1 ] +Added variable main::$38 to live range equivalence class [ main::$38 ] +Added variable main::$40 to live range equivalence class [ main::$40 ] +Added variable main::$61 to live range equivalence class [ main::$61 ] +Added variable main::$62 to live range equivalence class [ main::$62 ] +Added variable main::$63 to live range equivalence class [ main::$63 ] +Added variable main::$64 to live range equivalence class [ main::$64 ] +Added variable main::$65 to live range equivalence class [ main::$65 ] +Added variable main::$66 to live range equivalence class [ main::$66 ] +Added variable main::$67 to live range equivalence class [ main::$67 ] +Added variable main::$68 to live range equivalence class [ main::$68 ] +Added variable main::$69 to live range equivalence class [ main::$69 ] +Added variable main::$20 to live range equivalence class [ main::$20 ] +Added variable main::$45 to live range equivalence class [ main::$45 ] +Added variable main::$72 to live range equivalence class [ main::$72 ] +Added variable main::$73 to live range equivalence class [ main::$73 ] +Added variable main::$44 to live range equivalence class [ main::$44 ] +Added variable main::$70 to live range equivalence class [ main::$70 ] +Added variable main::$23 to live range equivalence class [ main::$23 ] +Added variable main::$71 to live range equivalence class [ main::$71 ] +Added variable main::$25 to live range equivalence class [ main::$25 ] +Added variable main::$26 to live range equivalence class [ main::$26 ] +Added variable main::$53 to live range equivalence class [ main::$53 ] +Added variable main::$76 to live range equivalence class [ main::$76 ] +Added variable main::$77 to live range equivalence class [ main::$77 ] +Added variable main::$30 to live range equivalence class [ main::$30 ] +Added variable main::$56 to live range equivalence class [ main::$56 ] +Added variable main::$31 to live range equivalence class [ main::$31 ] +Added variable main::$78 to live range equivalence class [ main::$78 ] +Added variable main::$50 to live range equivalence class [ main::$50 ] +Added variable main::$74 to live range equivalence class [ main::$74 ] +Added variable main::$32 to live range equivalence class [ main::$32 ] +Added variable main::$48 to live range equivalence class [ main::$48 ] +Added variable main::$75 to live range equivalence class [ main::$75 ] +Added variable main::$33 to live range equivalence class [ main::$33 ] +Added variable rand::return#2 to live range equivalence class [ rand::return#2 ] +Added variable main::$9 to live range equivalence class [ main::$9 ] +Added variable main::$10 to live range equivalence class [ main::$10 ] +Added variable main::$35 to live range equivalence class [ main::$35 ] +Added variable main::$59 to live range equivalence class [ main::$59 ] +Added variable rand::return#3 to live range equivalence class [ rand::return#3 ] +Added variable main::$11 to live range equivalence class [ main::$11 ] +Added variable main::$12 to live range equivalence class [ main::$12 ] +Added variable main::$36 to live range equivalence class [ main::$36 ] +Added variable main::$60 to live range equivalence class [ main::$60 ] +Added variable ppuDataTransfer::ppuDataPrepare1_$0 to live range equivalence class [ ppuDataTransfer::ppuDataPrepare1_$0 ] +Added variable ppuDataTransfer::ppuDataPrepare1_$1 to live range equivalence class [ ppuDataTransfer::ppuDataPrepare1_$1 ] +Added variable ppuDataTransfer::ppuDataPut1_val#0 to live range equivalence class [ ppuDataTransfer::ppuDataPut1_val#0 ] +Added variable ppuDataFill::ppuDataPrepare1_$0 to live range equivalence class [ ppuDataFill::ppuDataPrepare1_$0 ] +Added variable ppuDataFill::ppuDataPrepare1_$1 to live range equivalence class [ ppuDataFill::ppuDataPrepare1_$1 ] +Added variable rand::$0 to live range equivalence class [ rand::$0 ] +Added variable rand_state#0 to live range equivalence class [ rand_state#0 ] +Added variable rand::$1 to live range equivalence class [ rand::$1 ] +Added variable rand_state#1 to live range equivalence class [ rand_state#1 ] +Added variable rand::$2 to live range equivalence class [ rand::$2 ] +Added variable rand::return#0 to live range equivalence class [ rand::return#0 ] +Complete equivalence classes +[ main::initNES1_i#2 main::initNES1_i#1 ] +[ main::i#14 main::i#2 ] +[ main::timer_2#2 main::timer_2#1 ] +[ main::active_balls#2 main::active_balls#8 main::active_balls#1 ] +[ main::timer#3 main::timer#15 main::timer#21 ] +[ main::i#10 main::i#4 ] +[ main::sprite_idx#3 main::sprite_idx#2 ] +[ ppuDataTransfer::ppuDataPrepare1_ppuData#0 ] +[ ppuDataTransfer::cpuData#2 ] +[ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] +[ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#6 ppuDataTransfer::cpuSrc#1 ] +[ ppuDataFill::ppuDataPrepare1_ppuData#0 ] +[ ppuDataFill::size#3 ] +[ ppuDataFill::i#2 ppuDataFill::i#1 ] +[ rand_state#10 rand_state#17 rand_state#11 ] +[ scroll_y ] +[ vblank_hit ] +[ main::initNES1_waitForVBlank1_$0 ] +[ main::initNES1_waitForVBlank2_$0 ] +[ main::h_bar#1 ] +[ main::$14 ] +[ main::timer#1 ] +[ main::$38 ] +[ main::$40 ] +[ main::$61 ] +[ main::$62 ] +[ main::$63 ] +[ main::$64 ] +[ main::$65 ] +[ main::$66 ] +[ main::$67 ] +[ main::$68 ] +[ main::$69 ] +[ main::$20 ] +[ main::$45 ] +[ main::$72 ] +[ main::$73 ] +[ main::$44 ] +[ main::$70 ] +[ main::$23 ] +[ main::$71 ] +[ main::$25 ] +[ main::$26 ] +[ main::$53 ] +[ main::$76 ] +[ main::$77 ] +[ main::$30 ] +[ main::$56 ] +[ main::$31 ] +[ main::$78 ] +[ main::$50 ] +[ main::$74 ] +[ main::$32 ] +[ main::$48 ] +[ main::$75 ] +[ main::$33 ] +[ rand::return#2 ] +[ main::$9 ] +[ main::$10 ] +[ main::$35 ] +[ main::$59 ] +[ rand::return#3 ] +[ main::$11 ] +[ main::$12 ] +[ main::$36 ] +[ main::$60 ] +[ ppuDataTransfer::ppuDataPrepare1_$0 ] +[ ppuDataTransfer::ppuDataPrepare1_$1 ] +[ ppuDataTransfer::ppuDataPut1_val#0 ] +[ ppuDataFill::ppuDataPrepare1_$0 ] +[ ppuDataFill::ppuDataPrepare1_$1 ] +[ rand::$0 ] +[ rand_state#0 ] +[ rand::$1 ] +[ rand_state#1 ] +[ rand::$2 ] +[ rand::return#0 ] +Allocated zp[1]:2 [ main::initNES1_i#2 main::initNES1_i#1 ] +Allocated zp[2]:3 [ main::i#14 main::i#2 ] +Allocated zp[1]:5 [ main::timer_2#2 main::timer_2#1 ] +Allocated zp[1]:6 [ main::active_balls#2 main::active_balls#8 main::active_balls#1 ] +Allocated zp[1]:7 [ main::timer#3 main::timer#15 main::timer#21 ] +Allocated zp[2]:8 [ main::i#10 main::i#4 ] +Allocated zp[1]:10 [ main::sprite_idx#3 main::sprite_idx#2 ] +Allocated zp[2]:11 [ ppuDataTransfer::ppuDataPrepare1_ppuData#0 ] +Allocated zp[2]:13 [ ppuDataTransfer::cpuData#2 ] +Allocated zp[2]:15 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] +Allocated zp[2]:17 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#6 ppuDataTransfer::cpuSrc#1 ] +Allocated zp[2]:19 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ] +Allocated zp[2]:21 [ ppuDataFill::size#3 ] +Allocated zp[2]:23 [ ppuDataFill::i#2 ppuDataFill::i#1 ] +Allocated zp[2]:25 [ rand_state#10 rand_state#17 rand_state#11 ] +Allocated zp[1]:27 [ scroll_y ] +Allocated zp[1]:28 [ vblank_hit ] +Allocated zp[1]:29 [ main::initNES1_waitForVBlank1_$0 ] +Allocated zp[1]:30 [ main::initNES1_waitForVBlank2_$0 ] +Allocated zp[1]:31 [ main::h_bar#1 ] +Allocated zp[1]:32 [ main::$14 ] +Allocated zp[1]:33 [ main::timer#1 ] +Allocated zp[1]:34 [ main::$38 ] +Allocated zp[2]:35 [ main::$40 ] +Allocated zp[2]:37 [ main::$61 ] +Allocated zp[2]:39 [ main::$62 ] +Allocated zp[2]:41 [ main::$63 ] +Allocated zp[2]:43 [ main::$64 ] +Allocated zp[2]:45 [ main::$65 ] +Allocated zp[2]:47 [ main::$66 ] +Allocated zp[2]:49 [ main::$67 ] +Allocated zp[2]:51 [ main::$68 ] +Allocated zp[2]:53 [ main::$69 ] +Allocated zp[2]:55 [ main::$20 ] +Allocated zp[2]:57 [ main::$45 ] +Allocated zp[2]:59 [ main::$72 ] +Allocated zp[2]:61 [ main::$73 ] +Allocated zp[2]:63 [ main::$44 ] +Allocated zp[2]:65 [ main::$70 ] +Allocated zp[2]:67 [ main::$23 ] +Allocated zp[2]:69 [ main::$71 ] +Allocated zp[2]:71 [ main::$25 ] +Allocated zp[1]:73 [ main::$26 ] +Allocated zp[2]:74 [ main::$53 ] +Allocated zp[2]:76 [ main::$76 ] +Allocated zp[2]:78 [ main::$77 ] +Allocated zp[1]:80 [ main::$30 ] +Allocated zp[2]:81 [ main::$56 ] +Allocated zp[2]:83 [ main::$31 ] +Allocated zp[2]:85 [ main::$78 ] +Allocated zp[2]:87 [ main::$50 ] +Allocated zp[2]:89 [ main::$74 ] +Allocated zp[2]:91 [ main::$32 ] +Allocated zp[1]:93 [ main::$48 ] +Allocated zp[2]:94 [ main::$75 ] +Allocated zp[2]:96 [ main::$33 ] +Allocated zp[2]:98 [ rand::return#2 ] +Allocated zp[2]:100 [ main::$9 ] +Allocated zp[2]:102 [ main::$10 ] +Allocated zp[2]:104 [ main::$35 ] +Allocated zp[2]:106 [ main::$59 ] +Allocated zp[2]:108 [ rand::return#3 ] +Allocated zp[2]:110 [ main::$11 ] +Allocated zp[1]:112 [ main::$12 ] +Allocated zp[2]:113 [ main::$36 ] +Allocated zp[2]:115 [ main::$60 ] +Allocated zp[1]:117 [ ppuDataTransfer::ppuDataPrepare1_$0 ] +Allocated zp[1]:118 [ ppuDataTransfer::ppuDataPrepare1_$1 ] +Allocated zp[1]:119 [ ppuDataTransfer::ppuDataPut1_val#0 ] +Allocated zp[1]:120 [ ppuDataFill::ppuDataPrepare1_$0 ] +Allocated zp[1]:121 [ ppuDataFill::ppuDataPrepare1_$1 ] +Allocated zp[2]:122 [ rand::$0 ] +Allocated zp[2]:124 [ rand_state#0 ] +Allocated zp[2]:126 [ rand::$1 ] +Allocated zp[2]:128 [ rand_state#1 ] +Allocated zp[2]:130 [ rand::$2 ] +Allocated zp[2]:132 [ rand::return#0 ] + +INITIAL ASM +Target platform is nes / MOS6502X + // File Comments +//#pragma emulator("java -jar /Applications/Nintaco_bin_2020-05-01/Nintaco.jar") +// Nintendo Entertainment System (NES +// https://en.wikipedia.org/wiki/Nintendo_Entertainment_System_(Model_NES-101) +// https://github.com/gregkrsak/first_nes +// Ricoh 2C02 - NES Picture Processing Unit (PPU) +// Ricoh RP2C02 (NTSC version) / RP2C07 (PAL version), +// https://en.wikipedia.org/wiki/Picture_Processing_Unit +// https://wiki.nesdev.com/w/index.php/PPU_registers +// http://nesdev.com/2C02%20technical%20reference.TXT +// Based on: https://github.com/gregkrsak/first_nes written by Greg M. Krsak, 2018. + // Upstart + // Nintendo Entertainment System (NES) ROM (Mapper 0 NROM, Vertical Mirroring) +// https://sadistech.com/nesromtool/romdoc.html +// https://forums.nesdev.com/viewtopic.php?f=2&t=9896 +// https://github.com/gregkrsak/first_nes +.file [name="kickballs-3.nes", type="bin", segments="NesRom"] +.file [name="kickballs-3.nes_hdr", type="bin", segments="Header"] +.file [name="kickballs-3.nes_prg", type="bin", segments="ProgramRom"] +.file [name="kickballs-3.nes_chr", type="bin", segments="CharacterRom"] +.segmentdef Header [ start=$0000, min=$0000, max=$000f, fill ] +.segmentdef Tiles [ start=$0000, min=$0000, max=$1fff, fill ] +.segmentdef Code [ start=$c000, min=$c000, max=$fff9 ] +.segmentdef Data [ startAfter="Code", min=$c000, max=$fff9 ] +.segmentdef Vectors [ start=$fffa, min=$fffa, max=$ffff ] +.segmentdef GameRam [start=$200,max=$7ff, virtual] +.segmentdef ProgramRom [ segments="Code, Data, Vectors" ] +.segmentdef CharacterRom [ segments="Tiles" ] +.segmentdef NesRom +.segment NesRom +.segmentout [ segments="Header" ] +.segmentout [ segments="ProgramRom" ] +.segmentout [ segments="CharacterRom" ] +.segment Header +.text @"NES\$1a" +.byte $01 // 1x 16KB ROM (PRG) +.byte $01 // 1x 8KB VROM (CHR) +.byte %00000001 // Mapper nibble 0000 == No mapping (a simple 16KB PRG + 8KB CHR game) + // Mirroring nibble 0001 == Vertical mirroring only +.segment Code + + // Global Constants & labels + .const OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = $10 + .const OFFSET_STRUCT_RICOH_2C02_PPUMASK = 1 + .const OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = 2 + .const OFFSET_STRUCT_RICOH_2C02_OAMADDR = 3 + .const OFFSET_STRUCT_RICOH_2A03_OAMDMA = $14 + .const OFFSET_STRUCT_RICOH_2C02_PPUADDR = 6 + .const OFFSET_STRUCT_RICOH_2C02_PPUDATA = 7 + .const OFFSET_STRUCT_SPRITEDATA_TILE = 1 + .const OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES = 2 + .const OFFSET_STRUCT_SPRITEDATA_X = 3 + .const OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = 5 + .const SIZEOF_BYTE = 1 + // $2000-$23bf $03c0 Name table 0 + .label PPU_NAME_TABLE_0 = $2000 + // $23c0-$23ff $0040 Attribute table 0 + .label PPU_ATTRIBUTE_TABLE_0 = $23c0 + // $3000-$3eff $0f00 Mirrors of $2000-$2eff + // $3f00-$3f1f $0020 Palette RAM indexes + .label PPU_PALETTE = $3f00 + // PPU Status Register for reading in ASM + .label PPU_PPUSTATUS = $2002 + // APU Frame Counter + // generates low-frequency clocks for the channels and an optional 60 Hz interrupt. + // https://wiki.nesdev.com/w/index.php/APU_Frame_Counter + // ------+-----+--------------------------------------------------------------- + // $4017 | W | FR_COUNTER Frame Counter Set mode and interrupt + // ------+-----+--------------------------------------------------------------- + // | 7 | Sequencer mode: 0 selects 4-step sequence, 1 selects 5-step sequence + // | 6 | Interrupt inhibit flag. If set, the frame interrupt flag is cleared, otherwise it is unaffected. + // ------+-----+--------------------------------------------------------------- + // Side effects After 3 or 4 CPU clock cycles*, the timer is reset. + // If the mode flag is set, then both "quarter frame" and "half frame" signals are also generated. + .label FR_COUNTER = $4017 + // Pointer to the start of RAM memory + .label MEMORY = 0 + // NES Picture Processing Unit (PPU) + .label PPU = $2000 + // NES CPU and audion processing unit (APU) + .label APU = $4000 + .label scroll_y = $1b + .label vblank_hit = $1c + // The random state variable + .label rand_state = $7c + // The random state variable + .label rand_state_1 = $80 + // The random state variable + .label rand_state_2 = $19 +.segment Code + // __start +__start: { + jmp __init1 + // __start::__init1 + __init1: + // [1] (volatile byte) scroll_y ← (byte) 0 -- vbuz1=vbuc1 + lda #0 + sta.z scroll_y + // [2] (volatile byte) vblank_hit ← (byte) 0 -- vbuz1=vbuc1 + lda #0 + sta.z vblank_hit + // [3] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1] + __b1_from___init1: + jmp __b1 + // __start::@1 + __b1: + // [4] call main + // [12] phi from __start::@1 to main [phi:__start::@1->main] + main_from___b1: + jsr main + jmp __breturn + // __start::@return + __breturn: + // [5] return + rts +} + // vblank +// NMI Called when the PPU refreshes the screen (also known as the V-Blank period) +vblank: { + // entry interrupt(HARDWARE_STACK) + pha + txa + pha + tya + pha + // [6] *((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 + // [7] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (volatile byte) scroll_y -- _deref_pbuc1=vbuz1 + lda.z scroll_y + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL + jmp ppuSpriteBufferDmaTransfer1 + // vblank::ppuSpriteBufferDmaTransfer1 + ppuSpriteBufferDmaTransfer1: + // [8] *((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 + // [9] *((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 __b1 + // vblank::@1 + __b1: + // [10] (volatile byte) vblank_hit ← ++ (volatile byte) vblank_hit -- vbuz1=_inc_vbuz1 + inc.z vblank_hit + jmp __breturn + // vblank::@return + __breturn: + // [11] return - exit interrupt(HARDWARE_STACK) + pla + tay + pla + tax + pla + rti +} + // main +main: { + .label __9 = $64 + .label __10 = $66 + .label __11 = $6e + .label __12 = $70 + .label __14 = $20 + .label __20 = $37 + .label __23 = $43 + .label __25 = $47 + .label __26 = $49 + .label __30 = $50 + .label __31 = $53 + .label __32 = $5b + .label __33 = $60 + .label __35 = $68 + .label __36 = $71 + .label __38 = $22 + .label __40 = $23 + .label __44 = $3f + .label __45 = $39 + .label __48 = $5d + .label __50 = $57 + .label __53 = $4a + .label __56 = $51 + .label initNES1_waitForVBlank1___0 = $1d + .label initNES1_waitForVBlank2___0 = $1e + .label initNES1_i = 2 + .label i = 3 + .label timer_2 = 5 + .label h_bar = $1f + .label timer = $21 + .label active_balls = 6 + .label sprite_idx = $a + .label i_1 = 8 + .label timer_1 = 7 + .label __59 = $6a + .label __60 = $73 + .label __61 = $25 + .label __62 = $27 + .label __63 = $29 + .label __64 = $2b + .label __65 = $2d + .label __66 = $2f + .label __67 = $31 + .label __68 = $33 + .label __69 = $35 + .label __70 = $41 + .label __71 = $45 + .label __72 = $3b + .label __73 = $3d + .label __74 = $59 + .label __75 = $5e + .label __76 = $4c + .label __77 = $4e + .label __78 = $55 + jmp initNES1 + // main::initNES1 + initNES1: + // asm { cld ldx#$ff txs } + cld + ldx #$ff + txs + jmp initNES1_disableVideoOutput1 + // main::initNES1_disableVideoOutput1 + initNES1_disableVideoOutput1: + // [14] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta PPU + // [15] *((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: + // [16] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 -- _deref_pbuc1=vbuc2 + lda #$40 + sta FR_COUNTER + // [17] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 -- _deref_pbuc1=vbuc2 + lda #$40 + sta APU+OFFSET_STRUCT_RICOH_2A03_DMC_FREQ + jmp initNES1_clearVBlankFlag1 + // main::initNES1_clearVBlankFlag1 + initNES1_clearVBlankFlag1: + // asm { ldaPPU_PPUSTATUS } + lda PPU_PPUSTATUS + // [19] phi from main::initNES1_clearVBlankFlag1 to main::initNES1_waitForVBlank1 [phi:main::initNES1_clearVBlankFlag1->main::initNES1_waitForVBlank1] + initNES1_waitForVBlank1_from_initNES1_clearVBlankFlag1: + jmp initNES1_waitForVBlank1 + // main::initNES1_waitForVBlank1 + initNES1_waitForVBlank1: + jmp initNES1_waitForVBlank1___b1 + // main::initNES1_waitForVBlank1_@1 + initNES1_waitForVBlank1___b1: + // [20] (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 + // [21] 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 + // [22] phi from main::initNES1_waitForVBlank1_@1 to main::initNES1_@1 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1] + initNES1___b1_from_initNES1_waitForVBlank1___b1: + // [22] 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 + // [22] phi from main::initNES1_@1 to main::initNES1_@1 [phi:main::initNES1_@1->main::initNES1_@1] + initNES1___b1_from_initNES1___b1: + // [22] 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: + // [23] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuz1=vbuc2 + lda #0 + ldy.z initNES1_i + sta MEMORY,y + // [24] *((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 + // [25] *((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 + // [26] *((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 + // [27] *((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 + // [28] *((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 + // [29] *((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 + // [30] *((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 + // [31] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 -- vbuz1=_inc_vbuz1 + inc.z initNES1_i + // [32] 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 + // [33] phi from main::initNES1_@1 to main::initNES1_waitForVBlank2 [phi:main::initNES1_@1->main::initNES1_waitForVBlank2] + initNES1_waitForVBlank2_from_initNES1___b1: + jmp initNES1_waitForVBlank2 + // main::initNES1_waitForVBlank2 + initNES1_waitForVBlank2: + jmp initNES1_waitForVBlank2___b1 + // main::initNES1_waitForVBlank2_@1 + initNES1_waitForVBlank2___b1: + // [34] (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 + // [35] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 -- vbuc1_eq_vbuz1_then_la1 + lda #0 + cmp.z initNES1_waitForVBlank2___0 + beq initNES1_waitForVBlank2___b1 + jmp initNES1___b7 + // main::initNES1_@7 + initNES1___b7: + // asm { ldaPPU_PPUSTATUS } + lda PPU_PPUSTATUS + // [37] phi from main::initNES1_@7 to main::@17 [phi:main::initNES1_@7->main::@17] + __b17_from_initNES1___b7: + jmp __b17 + // main::@17 + __b17: + // [38] call ppuDataTransfer + // Transfer the palette + // [134] phi from main::@17 to ppuDataTransfer [phi:main::@17->ppuDataTransfer] + ppuDataTransfer_from___b17: + // [134] phi (nomodify void*) ppuDataTransfer::cpuData#2 = (void*)(const to_nomodify byte*) palette [phi:main::@17->ppuDataTransfer#0] -- pvoz1=pvoc1 + lda #palette + sta.z ppuDataTransfer.cpuData+1 + // [134] phi (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_PALETTE [phi:main::@17->ppuDataTransfer#1] -- pvoz1=pvoc1 + lda #PPU_PALETTE + sta.z ppuDataTransfer.ppuDataPrepare1_ppuData+1 + jsr ppuDataTransfer + // [39] phi from main::@17 to main::@19 [phi:main::@17->main::@19] + __b19_from___b17: + jmp __b19 + // main::@19 + __b19: + // [40] call ppuDataFill + // Fill the PPU attribute table + // [147] phi from main::@19 to ppuDataFill [phi:main::@19->ppuDataFill] + ppuDataFill_from___b19: + // [147] phi (word) ppuDataFill::size#3 = (word)(number) $20*(number) $1e [phi:main::@19->ppuDataFill#0] -- vwuz1=vwuc1 + lda #<$20*$1e + sta.z ppuDataFill.size + lda #>$20*$1e + sta.z ppuDataFill.size+1 + // [147] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0 [phi:main::@19->ppuDataFill#1] -- pvoz1=pvoc1 + lda #PPU_NAME_TABLE_0 + sta.z ppuDataFill.ppuDataPrepare1_ppuData+1 + jsr ppuDataFill + // [41] phi from main::@19 to main::@20 [phi:main::@19->main::@20] + __b20_from___b19: + jmp __b20 + // main::@20 + __b20: + // [42] call ppuDataFill + // [147] phi from main::@20 to ppuDataFill [phi:main::@20->ppuDataFill] + ppuDataFill_from___b20: + // [147] phi (word) ppuDataFill::size#3 = (byte) $40 [phi:main::@20->ppuDataFill#0] -- vwuz1=vbuc1 + lda #<$40 + sta.z ppuDataFill.size + lda #>$40 + sta.z ppuDataFill.size+1 + // [147] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 [phi:main::@20->ppuDataFill#1] -- pvoz1=pvoc1 + lda #PPU_ATTRIBUTE_TABLE_0 + sta.z ppuDataFill.ppuDataPrepare1_ppuData+1 + jsr ppuDataFill + // [43] phi from main::@20 to main::@21 [phi:main::@20->main::@21] + __b21_from___b20: + jmp __b21 + // main::@21 + __b21: + // [44] call ppuDataTransfer + // [134] phi from main::@21 to ppuDataTransfer [phi:main::@21->ppuDataTransfer] + ppuDataTransfer_from___b21: + // [134] phi (nomodify void*) ppuDataTransfer::cpuData#2 = (void*)(const to_nomodify byte*) h_bar_tilemap [phi:main::@21->ppuDataTransfer#0] -- pvoz1=pvoc1 + lda #h_bar_tilemap + sta.z ppuDataTransfer.cpuData+1 + // [134] phi (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 = (void*) 8256 [phi:main::@21->ppuDataTransfer#1] -- pvoz1=pvoc1 + lda #<$2040 + sta.z ppuDataTransfer.ppuDataPrepare1_ppuData + lda #>$2040 + sta.z ppuDataTransfer.ppuDataPrepare1_ppuData+1 + jsr ppuDataTransfer + jmp enableVideoOutput1 + // main::enableVideoOutput1 + enableVideoOutput1: + // [45] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 -- _deref_pbuc1=vbuc2 + lda #$80 + sta PPU + // [46] *((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 + jmp __b18 + // main::@18 + __b18: + // [47] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $88 -- _deref_pbuc1=vbuc2 + // Enable vertical blank interrupt, select sprite pattern table 1 + lda #$88 + sta PPU + // [48] phi from main::@18 to main::@1 [phi:main::@18->main::@1] + __b1_from___b18: + // [48] phi (word) rand_state#17 = (word) 1 [phi:main::@18->main::@1#0] -- vwuz1=vwuc1 + lda #<1 + sta.z rand_state_2 + lda #>1 + sta.z rand_state_2+1 + // [48] phi (word) main::i#14 = (byte) 0 [phi:main::@18->main::@1#1] -- vwuz1=vbuc1 + lda #<0 + sta.z i + lda #>0 + sta.z i+1 + jmp __b1 + // main::@1 + __b1: + // [49] if((word) main::i#14<(byte) $32) goto main::@2 -- vwuz1_lt_vbuc1_then_la1 + lda.z i+1 + bne !+ + lda.z i + cmp #$32 + bcc __b2_from___b1 + !: + // [50] phi from main::@1 to main::@3 [phi:main::@1->main::@3] + __b3_from___b1: + // [50] phi (byte) main::timer#3 = (byte) 0 [phi:main::@1->main::@3#0] -- vbuz1=vbuc1 + lda #0 + sta.z timer_1 + // [50] phi (byte) main::active_balls#2 = (byte) 0 [phi:main::@1->main::@3#1] -- vbuz1=vbuc1 + lda #0 + sta.z active_balls + // [50] phi (byte) main::timer_2#2 = (byte) 0 [phi:main::@1->main::@3#2] -- vbuz1=vbuc1 + lda #0 + sta.z timer_2 + jmp __b3 + // main::@3 + __b3: + jmp __b4 + // main::@4 + __b4: + // [51] (byte) main::timer_2#1 ← ++ (byte) main::timer_2#2 -- vbuz1=_inc_vbuz1 + inc.z timer_2 + // [52] (byte) main::h_bar#1 ← *((const to_nomodify byte*) sine_table + (byte) main::timer_2#1) + (byte) $60 -- vbuz1=pbuc1_derefidx_vbuz2_plus_vbuc2 + lda #$60 + ldy.z timer_2 + clc + adc sine_table,y + sta.z h_bar + // [53] (byte~) main::$14 ← (byte) main::h_bar#1 ^ (byte) $ff -- vbuz1=vbuz2_bxor_vbuc1 + lda #$ff + eor.z h_bar + sta.z __14 + // [54] (volatile byte) scroll_y ← (byte~) main::$14 -- vbuz1=vbuz2 + lda.z __14 + sta.z scroll_y + // [55] if((byte) main::active_balls#2>=(byte) $32) goto main::@5 -- vbuz1_ge_vbuc1_then_la1 + lda.z active_balls + cmp #$32 + bcs __b5_from___b4 + jmp __b15 + // main::@15 + __b15: + // [56] (byte) main::timer#1 ← ++ (byte) main::timer#3 -- vbuz1=_inc_vbuz2 + ldy.z timer_1 + iny + sty.z timer + // [57] if((byte) main::timer#3!=(byte) 9) goto main::@25 -- vbuz1_neq_vbuc1_then_la1 + lda #9 + cmp.z timer_1 + bne __b25 + jmp __b16 + // main::@16 + __b16: + // [58] (byte) main::active_balls#1 ← ++ (byte) main::active_balls#2 -- vbuz1=_inc_vbuz1 + inc.z active_balls + // [59] (byte~) main::$38 ← (byte) main::active_balls#1 << (byte) 3 -- vbuz1=vbuz2_rol_3 + lda.z active_balls + asl + asl + asl + sta.z __38 + // [60] *((word*)(const struct $0*) balls + (byte~) main::$38) ← (byte) 0 -- pwuc1_derefidx_vbuz1=vbuc2 + lda #0 + ldy.z __38 + sta balls,y + lda #0 + sta balls+1,y + // [61] *((word*)(const struct $0*) balls+(byte) 2 + (byte~) main::$38) ← (byte) 0 -- pwuc1_derefidx_vbuz1=vbuc2 + lda #0 + ldy.z __38 + sta balls+2,y + lda #0 + sta balls+2+1,y + // [62] phi from main::@16 to main::@5 [phi:main::@16->main::@5] + __b5_from___b16: + // [62] phi (byte) main::timer#15 = (byte) 0 [phi:main::@16->main::@5#0] -- vbuz1=vbuc1 + lda #0 + sta.z timer_1 + // [62] phi (byte) main::active_balls#8 = (byte) main::active_balls#1 [phi:main::@16->main::@5#1] -- register_copy + jmp __b5 + // [62] phi from main::@25 main::@4 to main::@5 [phi:main::@25/main::@4->main::@5] + __b5_from___b25: + __b5_from___b4: + // [62] phi (byte) main::timer#15 = (byte) main::timer#21 [phi:main::@25/main::@4->main::@5#0] -- register_copy + // [62] phi (byte) main::active_balls#8 = (byte) main::active_balls#2 [phi:main::@25/main::@4->main::@5#1] -- register_copy + jmp __b5 + // main::@5 + __b5: + // [63] phi from main::@5 to main::@6 [phi:main::@5->main::@6] + __b6_from___b5: + // [63] phi (byte) main::sprite_idx#3 = (byte) 0 [phi:main::@5->main::@6#0] -- vbuz1=vbuc1 + lda #0 + sta.z sprite_idx + // [63] phi (word) main::i#10 = (byte) 0 [phi:main::@5->main::@6#1] -- vwuz1=vbuc1 + lda #<0 + sta.z i_1 + lda #>0 + sta.z i_1+1 + jmp __b6 + // main::@6 + __b6: + // [64] if((word) main::i#10<(byte) main::active_balls#8) goto main::@7 -- vwuz1_lt_vbuz2_then_la1 + lda.z i_1+1 + bne !+ + lda.z i_1 + cmp.z active_balls + bcc __b7 + !: + jmp __b8 + // main::@8 + __b8: + // [65] *((byte*) 8193) ← (byte) $98 -- _deref_pbuc1=vbuc2 + lda #$98 + sta $2001 + jmp __b13 + // main::@13 + __b13: + // [66] if((byte) 0==(volatile byte) vblank_hit) goto main::@13 -- vbuc1_eq_vbuz1_then_la1 + lda #0 + cmp.z vblank_hit + beq __b13 + jmp __b14 + // main::@14 + __b14: + // [67] (volatile byte) vblank_hit ← (byte) 0 -- vbuz1=vbuc1 + // wait for vblank + lda #0 + sta.z vblank_hit + // [68] *((byte*) 8193) ← (byte) $18 -- _deref_pbuc1=vbuc2 + lda #$18 + sta $2001 + // [50] phi from main::@14 to main::@3 [phi:main::@14->main::@3] + __b3_from___b14: + // [50] phi (byte) main::timer#3 = (byte) main::timer#15 [phi:main::@14->main::@3#0] -- register_copy + // [50] phi (byte) main::active_balls#2 = (byte) main::active_balls#8 [phi:main::@14->main::@3#1] -- register_copy + // [50] phi (byte) main::timer_2#2 = (byte) main::timer_2#1 [phi:main::@14->main::@3#2] -- register_copy + jmp __b3 + // main::@7 + __b7: + // [69] (word~) main::$40 ← (word) main::i#10 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i_1 + asl + sta.z __40 + lda.z i_1+1 + rol + sta.z __40+1 + asl.z __40 + rol.z __40+1 + asl.z __40 + rol.z __40+1 + // [70] (word*~) main::$61 ← (word*)(const struct $0*) balls + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls + sta.z __61+1 + // [71] (word*~) main::$62 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+4 + sta.z __62+1 + // [72] (word*~) main::$63 ← (word*)(const struct $0*) balls + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls + sta.z __63+1 + // [73] *((word*~) main::$63) ← *((word*~) main::$61) + *((word*~) main::$62) -- _deref_pwuz1=_deref_pwuz2_plus__deref_pwuz3 + ldy #0 + lda (__61),y + clc + adc (__62),y + sta (__63),y + iny + lda (__61),y + adc (__62),y + sta (__63),y + // [74] (word*~) main::$64 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+6 + sta.z __64+1 + // [75] (word*~) main::$65 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+6 + sta.z __65+1 + // [76] *((word*~) main::$65) ← *((word*~) main::$64) + (byte) $10 -- _deref_pwuz1=_deref_pwuz2_plus_vwuc1 + ldy #0 + lda (__64),y + clc + adc #<$10 + sta (__65),y + iny + lda (__64),y + adc #>$10 + sta (__65),y + // [77] (word*~) main::$66 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+2 + sta.z __66+1 + // [78] (word*~) main::$67 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+6 + sta.z __67+1 + // [79] (word*~) main::$68 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+2 + sta.z __68+1 + // [80] *((word*~) main::$68) ← *((word*~) main::$66) + *((word*~) main::$67) -- _deref_pwuz1=_deref_pwuz2_plus__deref_pwuz3 + ldy #0 + lda (__66),y + clc + adc (__67),y + sta (__68),y + iny + lda (__66),y + adc (__67),y + sta (__68),y + // [81] (word*~) main::$69 ← (word*)(const struct $0*) balls + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls + sta.z __69+1 + // [82] (word~) main::$20 ← *((word*~) main::$69) >> (byte) 8 -- vwuz1=_deref_pwuz2_ror_8 + ldy #1 + lda (__69),y + sta.z __20 + lda #0 + sta.z __20+1 + // [83] if((word~) main::$20>=(byte) 8) goto main::@9 -- vwuz1_ge_vbuc1_then_la1 + lda.z __20+1 + bne __b9 + lda.z __20 + cmp #8 + bcs __b9 + !: + jmp __b11 + // main::@11 + __b11: + // [84] (word~) main::$45 ← (word) main::i#10 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i_1 + asl + sta.z __45 + lda.z i_1+1 + rol + sta.z __45+1 + asl.z __45 + rol.z __45+1 + asl.z __45 + rol.z __45+1 + // [85] (word*~) main::$72 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$45 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __45 + clc + adc #balls+4 + sta.z __72+1 + // [86] (word*~) main::$73 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$45 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __45 + clc + adc #balls+4 + sta.z __73+1 + // [87] *((word*~) main::$73) ← *((word*~) main::$72) ^ (word) $ffff -- _deref_pwuz1=_deref_pwuz2_bxor_vwuc1 + ldy #0 + lda #<$ffff + eor (__72),y + sta (__73),y + iny + lda #>$ffff + eor (__72),y + sta (__73),y + jmp __b9 + // main::@9 + __b9: + // [88] (word~) main::$44 ← (word) main::i#10 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i_1 + asl + sta.z __44 + lda.z i_1+1 + rol + sta.z __44+1 + asl.z __44 + rol.z __44+1 + asl.z __44 + rol.z __44+1 + // [89] (word*~) main::$70 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$44 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __44 + clc + adc #balls+2 + sta.z __70+1 + // [90] (word~) main::$23 ← *((word*~) main::$70) >> (byte) 8 -- vwuz1=_deref_pwuz2_ror_8 + ldy #1 + lda (__70),y + sta.z __23 + lda #0 + sta.z __23+1 + // [91] (word*~) main::$71 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$44 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __44 + clc + adc #balls+2 + sta.z __71+1 + // [92] (word~) main::$25 ← *((word*~) main::$71) >> (byte) 8 -- vwuz1=_deref_pwuz2_ror_8 + ldy #1 + lda (__71),y + sta.z __25 + lda #0 + sta.z __25+1 + // [93] (byte~) main::$26 ← (byte) main::h_bar#1 + (byte) 8 -- vbuz1=vbuz2_plus_vbuc1 + lax.z h_bar + axs #-[8] + stx.z __26 + // [94] if((word~) main::$23<(byte) main::h_bar#1) goto main::@10 -- vwuz1_lt_vbuz2_then_la1 + lda.z __23+1 + bne !+ + lda.z __23 + cmp.z h_bar + bcc __b10 + !: + jmp __b24 + // main::@24 + __b24: + // [95] if((word~) main::$25>=(byte~) main::$26) goto main::@10 -- vwuz1_ge_vbuz2_then_la1 + lda.z __25+1 + bne __b10 + lda.z __25 + cmp.z __26 + bcs __b10 + !: + jmp __b12 + // main::@12 + __b12: + // [96] (word~) main::$53 ← (word) main::i#10 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i_1 + asl + sta.z __53 + lda.z i_1+1 + rol + sta.z __53+1 + asl.z __53 + rol.z __53+1 + asl.z __53 + rol.z __53+1 + // [97] (word*~) main::$76 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$53 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __53 + clc + adc #balls+6 + sta.z __76+1 + // [98] (word*~) main::$77 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$53 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __53 + clc + adc #balls+6 + sta.z __77+1 + // [99] *((word*~) main::$77) ← *((word*~) main::$76) ^ (word) $ffff -- _deref_pwuz1=_deref_pwuz2_bxor_vwuc1 + ldy #0 + lda #<$ffff + eor (__76),y + sta (__77),y + iny + lda #>$ffff + eor (__76),y + sta (__77),y + // [100] (byte~) main::$30 ← (byte) main::h_bar#1 - (byte) 2 -- vbuz1=vbuz2_minus_2 + lda.z h_bar + sec + sbc #2 + sta.z __30 + // [101] (word~) main::$56 ← (word)(byte~) main::$30 -- vwuz1=_word_vbuz2 + lda.z __30 + sta.z __56 + lda #0 + sta.z __56+1 + // [102] (word~) main::$31 ← (word~) main::$56 << (byte) 8 -- vwuz1=vwuz2_rol_8 + lda.z __56 + sta.z __31+1 + lda #0 + sta.z __31 + // [103] (word*~) main::$78 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$53 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __53 + clc + adc #balls+2 + sta.z __78+1 + // [104] *((word*~) main::$78) ← (word~) main::$31 -- _deref_pwuz1=vwuz2 + ldy #0 + lda.z __31 + sta (__78),y + iny + lda.z __31+1 + sta (__78),y + jmp __b10 + // main::@10 + __b10: + // [105] (word~) main::$50 ← (word) main::i#10 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i_1 + asl + sta.z __50 + lda.z i_1+1 + rol + sta.z __50+1 + asl.z __50 + rol.z __50+1 + asl.z __50 + rol.z __50+1 + // [106] (word*~) main::$74 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$50 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __50 + clc + adc #balls+2 + sta.z __74+1 + // [107] (word~) main::$32 ← *((word*~) main::$74) >> (byte) 8 -- vwuz1=_deref_pwuz2_ror_8 + ldy #1 + lda (__74),y + sta.z __32 + lda #0 + sta.z __32+1 + // [108] (byte~) main::$48 ← (byte) main::sprite_idx#3 << (byte) 2 -- vbuz1=vbuz2_rol_2 + lda.z sprite_idx + asl + asl + sta.z __48 + // [109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$48) ← (byte)(word~) main::$32 -- pbuc1_derefidx_vbuz1=_byte_vwuz2 + ldy.z __48 + lda.z __32 + sta SPRITE_BUFFER,y + // [110] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$48) ← (byte) $a -- pbuc1_derefidx_vbuz1=vbuc2 + lda #$a + ldy.z __48 + sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_TILE,y + // [111] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$48) ← (byte) 3 -- pbuc1_derefidx_vbuz1=vbuc2 + lda #3 + ldy.z __48 + sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES,y + // [112] (word*~) main::$75 ← (word*)(const struct $0*) balls + (word~) main::$50 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __50 + clc + adc #balls + sta.z __75+1 + // [113] (word~) main::$33 ← *((word*~) main::$75) >> (byte) 8 -- vwuz1=_deref_pwuz2_ror_8 + ldy #1 + lda (__75),y + sta.z __33 + lda #0 + sta.z __33+1 + // [114] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$48) ← (byte)(word~) main::$33 -- pbuc1_derefidx_vbuz1=_byte_vwuz2 + ldy.z __48 + lda.z __33 + sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X,y + // [115] (byte) main::sprite_idx#2 ← ++ (byte) main::sprite_idx#3 -- vbuz1=_inc_vbuz1 + inc.z sprite_idx + // [116] (word) main::i#4 ← ++ (word) main::i#10 -- vwuz1=_inc_vwuz1 + inc.z i_1 + bne !+ + inc.z i_1+1 + !: + // [63] phi from main::@10 to main::@6 [phi:main::@10->main::@6] + __b6_from___b10: + // [63] phi (byte) main::sprite_idx#3 = (byte) main::sprite_idx#2 [phi:main::@10->main::@6#0] -- register_copy + // [63] phi (word) main::i#10 = (word) main::i#4 [phi:main::@10->main::@6#1] -- register_copy + jmp __b6 + // main::@25 + __b25: + // [117] (byte) main::timer#21 ← (byte) main::timer#1 -- vbuz1=vbuz2 + lda.z timer + sta.z timer_1 + jmp __b5_from___b25 + // [118] phi from main::@1 to main::@2 [phi:main::@1->main::@2] + __b2_from___b1: + jmp __b2 + // main::@2 + __b2: + // [119] call rand + // [157] phi from main::@2 to rand [phi:main::@2->rand] + rand_from___b2: + // [157] phi (word) rand_state#10 = (word) rand_state#17 [phi:main::@2->rand#0] -- register_copy + jsr rand + // [120] (word) rand::return#2 ← (word) rand::return#0 -- vwuz1=vwuz2 + lda.z rand.return + sta.z rand.return_1 + lda.z rand.return+1 + sta.z rand.return_1+1 + jmp __b22 + // main::@22 + __b22: + // [121] (word~) main::$9 ← (word) rand::return#2 -- vwuz1=vwuz2 + lda.z rand.return_1 + sta.z __9 + lda.z rand.return_1+1 + sta.z __9+1 + // [122] (word~) main::$10 ← (word~) main::$9 & (word) $3ff -- vwuz1=vwuz2_band_vwuc1 + lda.z __9 + and #<$3ff + sta.z __10 + lda.z __9+1 + and #>$3ff + sta.z __10+1 + // [123] (word~) main::$35 ← (word) main::i#14 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i + asl + sta.z __35 + lda.z i+1 + rol + sta.z __35+1 + asl.z __35 + rol.z __35+1 + asl.z __35 + rol.z __35+1 + // [124] (word*~) main::$59 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$35 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __35 + clc + adc #balls+4 + sta.z __59+1 + // [125] *((word*~) main::$59) ← (word~) main::$10 -- _deref_pwuz1=vwuz2 + ldy #0 + lda.z __10 + sta (__59),y + iny + lda.z __10+1 + sta (__59),y + // [126] call rand + // [157] phi from main::@22 to rand [phi:main::@22->rand] + rand_from___b22: + // [157] phi (word) rand_state#10 = (word) rand_state#11 [phi:main::@22->rand#0] -- register_copy + jsr rand + // [127] (word) rand::return#3 ← (word) rand::return#0 -- vwuz1=vwuz2 + lda.z rand.return + sta.z rand.return_2 + lda.z rand.return+1 + sta.z rand.return_2+1 + jmp __b23 + // main::@23 + __b23: + // [128] (word~) main::$11 ← (word) rand::return#3 -- vwuz1=vwuz2 + lda.z rand.return_2 + sta.z __11 + lda.z rand.return_2+1 + sta.z __11+1 + // [129] (byte~) main::$12 ← (word~) main::$11 & (byte) $ff -- vbuz1=vwuz2_band_vbuc1 + lda #$ff + and.z __11 + sta.z __12 + // [130] (word~) main::$36 ← (word) main::i#14 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i + asl + sta.z __36 + lda.z i+1 + rol + sta.z __36+1 + asl.z __36 + rol.z __36+1 + asl.z __36 + rol.z __36+1 + // [131] (word*~) main::$60 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$36 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __36 + clc + adc #balls+6 + sta.z __60+1 + // [132] *((word*~) main::$60) ← (byte~) main::$12 -- _deref_pwuz1=vbuz2 + lda.z __12 + ldy #0 + sta (__60),y + tya + iny + sta (__60),y + // [133] (word) main::i#2 ← ++ (word) main::i#14 -- vwuz1=_inc_vwuz1 + inc.z i + bne !+ + inc.z i+1 + !: + // [48] phi from main::@23 to main::@1 [phi:main::@23->main::@1] + __b1_from___b23: + // [48] phi (word) rand_state#17 = (word) rand_state#11 [phi:main::@23->main::@1#0] -- register_copy + // [48] phi (word) main::i#14 = (word) main::i#2 [phi:main::@23->main::@1#1] -- register_copy + jmp __b1 +} + // ppuDataTransfer +// Transfer a number of bytes from the CPU memory to the PPU memory +// - ppuData : Pointer in the PPU memory +// - cpuData : Pointer to the CPU memory (RAM of ROM) +// - size : The number of bytes to transfer +// ppuDataTransfer(void* zp($d) cpuData) +ppuDataTransfer: { + .label ppuDataPrepare1___0 = $75 + .label ppuDataPrepare1___1 = $76 + .label ppuDataPrepare1_ppuData = $b + .label ppuDataPut1_val = $77 + .label cpuSrc = $11 + .label i = $f + .label cpuData = $d + jmp ppuDataPrepare1 + // ppuDataTransfer::ppuDataPrepare1 + ppuDataPrepare1: + // [135] (byte~) ppuDataTransfer::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 -- vbuz1=_hi_pvoz2 + lda.z ppuDataPrepare1_ppuData+1 + sta.z ppuDataPrepare1___0 + // [136] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$0 -- _deref_pbuc1=vbuz1 + lda.z ppuDataPrepare1___0 + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR + // [137] (byte~) ppuDataTransfer::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 -- vbuz1=_lo_pvoz2 + lda.z ppuDataPrepare1_ppuData + sta.z ppuDataPrepare1___1 + // [138] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$1 -- _deref_pbuc1=vbuz1 + lda.z ppuDataPrepare1___1 + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR + jmp __b3 + // ppuDataTransfer::@3 + __b3: + // [139] (byte*) ppuDataTransfer::cpuSrc#6 ← (byte*)(nomodify void*) ppuDataTransfer::cpuData#2 -- pbuz1=pbuz2 + lda.z cpuData + sta.z cpuSrc + lda.z cpuData+1 + sta.z cpuSrc+1 + // [140] phi from ppuDataTransfer::@3 to ppuDataTransfer::@1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1] + __b1_from___b3: + // [140] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*) ppuDataTransfer::cpuSrc#6 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#0] -- register_copy + // [140] phi (word) ppuDataTransfer::i#2 = (word) 0 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#1] -- vwuz1=vwuc1 + lda #<0 + sta.z i + lda #>0 + sta.z i+1 + jmp __b1 + // ppuDataTransfer::@1 + __b1: + // [141] if((word) ppuDataTransfer::i#2<(byte) $20*(const byte) SIZEOF_BYTE) goto ppuDataTransfer::@2 -- vwuz1_lt_vbuc1_then_la1 + lda.z i+1 + bne !+ + lda.z i + cmp #$20*SIZEOF_BYTE + bcc __b2 + !: + jmp __breturn + // ppuDataTransfer::@return + __breturn: + // [142] return + rts + // ppuDataTransfer::@2 + __b2: + // [143] (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: + // [144] *((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 __b4 + // ppuDataTransfer::@4 + __b4: + // [145] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 -- pbuz1=_inc_pbuz1 + inc.z cpuSrc + bne !+ + inc.z cpuSrc+1 + !: + // [146] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2 -- vwuz1=_inc_vwuz1 + inc.z i + bne !+ + inc.z i+1 + !: + // [140] phi from ppuDataTransfer::@4 to ppuDataTransfer::@1 [phi:ppuDataTransfer::@4->ppuDataTransfer::@1] + __b1_from___b4: + // [140] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*) ppuDataTransfer::cpuSrc#1 [phi:ppuDataTransfer::@4->ppuDataTransfer::@1#0] -- register_copy + // [140] phi (word) ppuDataTransfer::i#2 = (word) ppuDataTransfer::i#1 [phi:ppuDataTransfer::@4->ppuDataTransfer::@1#1] -- register_copy + jmp __b1 +} + // ppuDataFill +// Fill a number of bytes in the PPU memory +// - ppuData : Pointer in the PPU memory +// - size : The number of bytes to transfer +// ppuDataFill(word zp($15) size) +ppuDataFill: { + .label ppuDataPrepare1___0 = $78 + .label ppuDataPrepare1___1 = $79 + .label ppuDataPrepare1_ppuData = $13 + .label i = $17 + .label size = $15 + jmp ppuDataPrepare1 + // ppuDataFill::ppuDataPrepare1 + ppuDataPrepare1: + // [148] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuz1=_hi_pvoz2 + lda.z ppuDataPrepare1_ppuData+1 + sta.z ppuDataPrepare1___0 + // [149] *((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 + // [150] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuz1=_lo_pvoz2 + lda.z ppuDataPrepare1_ppuData + sta.z ppuDataPrepare1___1 + // [151] *((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 + // [152] phi from ppuDataFill::ppuDataPrepare1 to ppuDataFill::@1 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1] + __b1_from_ppuDataPrepare1: + // [152] phi (word) ppuDataFill::i#2 = (word) 0 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1#0] -- vwuz1=vwuc1 + lda #<0 + sta.z i + lda #>0 + sta.z i+1 + jmp __b1 + // Transfer to PPU + // ppuDataFill::@1 + __b1: + // [153] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 -- vwuz1_lt_vwuz2_then_la1 + lda.z i+1 + cmp.z size+1 + bcc ppuDataPut1 + bne !+ + lda.z i + cmp.z size + bcc ppuDataPut1 + !: + jmp __breturn + // ppuDataFill::@return + __breturn: + // [154] return + rts + // ppuDataFill::ppuDataPut1 + ppuDataPut1: + // [155] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA + jmp __b2 + // ppuDataFill::@2 + __b2: + // [156] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2 -- vwuz1=_inc_vwuz1 + inc.z i + bne !+ + inc.z i+1 + !: + // [152] phi from ppuDataFill::@2 to ppuDataFill::@1 [phi:ppuDataFill::@2->ppuDataFill::@1] + __b1_from___b2: + // [152] phi (word) ppuDataFill::i#2 = (word) ppuDataFill::i#1 [phi:ppuDataFill::@2->ppuDataFill::@1#0] -- register_copy + jmp __b1 +} + // rand +// Returns a pseudo-random number in the range of 0 to RAND_MAX (65535) +// Uses an xorshift pseudorandom number generator that hits all different values +// Information https://en.wikipedia.org/wiki/Xorshift +// Source http://www.retroprogramming.com/2017/07/xorshift-pseudorandom-numbers-in-z80.html +rand: { + .label __0 = $7a + .label __1 = $7e + .label __2 = $82 + .label return = $84 + .label return_1 = $62 + .label return_2 = $6c + // [158] (word~) rand::$0 ← (word) rand_state#10 << (byte) 7 -- vwuz1=vwuz2_rol_7 + lda.z rand_state_2+1 + lsr + lda.z rand_state_2 + ror + sta.z __0+1 + lda #0 + ror + sta.z __0 + // [159] (word) rand_state#0 ← (word) rand_state#10 ^ (word~) rand::$0 -- vwuz1=vwuz2_bxor_vwuz3 + lda.z rand_state_2 + eor.z __0 + sta.z rand_state + lda.z rand_state_2+1 + eor.z __0+1 + sta.z rand_state+1 + // [160] (word~) rand::$1 ← (word) rand_state#0 >> (byte) 9 -- vwuz1=vwuz2_ror_9 + lda.z rand_state+1 + lsr + sta.z __1 + lda #0 + sta.z __1+1 + // [161] (word) rand_state#1 ← (word) rand_state#0 ^ (word~) rand::$1 -- vwuz1=vwuz2_bxor_vwuz3 + lda.z rand_state + eor.z __1 + sta.z rand_state_1 + lda.z rand_state+1 + eor.z __1+1 + sta.z rand_state_1+1 + // [162] (word~) rand::$2 ← (word) rand_state#1 << (byte) 8 -- vwuz1=vwuz2_rol_8 + lda.z rand_state_1 + sta.z __2+1 + lda #0 + sta.z __2 + // [163] (word) rand_state#11 ← (word) rand_state#1 ^ (word~) rand::$2 -- vwuz1=vwuz2_bxor_vwuz3 + lda.z rand_state_1 + eor.z __2 + sta.z rand_state_2 + lda.z rand_state_1+1 + eor.z __2+1 + sta.z rand_state_2+1 + // [164] (word) rand::return#0 ← (word) rand_state#11 -- vwuz1=vwuz2 + lda.z rand_state_2 + sta.z return + lda.z rand_state_2+1 + sta.z return+1 + jmp __breturn + // rand::@return + __breturn: + // [165] return + rts +} + // File Data +.segment GameRam + // Moving balls (in GameRAM) + balls: .fill 8*$40, 0 +.segment Data + sine_table: .byte $40, $42, $43, $45, $46, $48, $49, $4b, $4c, $4e, $50, $51, $53, $54, $56, $57, $58, $5a, $5b, $5d, $5e, $60, $61, $62, $64, $65, $66, $67, $69, $6a, $6b, $6c, $6d, $6e, $6f, $70, $71, $72, $73, $74, $75, $76, $77, $78, $78, $79, $7a, $7b, $7b, $7c, $7c, $7d, $7d, $7e, $7e, $7e, $7f, $7f, $7f, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $7f, $7f, $7f, $7e, $7e, $7e, $7d, $7d, $7c, $7c, $7b, $7b, $7a, $79, $78, $78, $77, $76, $75, $74, $73, $72, $71, $70, $6f, $6e, $6d, $6c, $6b, $6a, $69, $67, $66, $65, $64, $62, $61, $60, $5e, $5d, $5b, $5a, $58, $57, $56, $54, $53, $51, $50, $4e, $4c, $4b, $49, $48, $46, $45, $43, $42, $40, $3e, $3d, $3b, $3a, $38, $37, $35, $34, $32, $30, $2f, $2d, $2c, $2a, $29, $28, $26, $25, $23, $22, $20, $1f, $1e, $1c, $1b, $1a, $19, $17, $16, $15, $14, $13, $12, $11, $10, $f, $e, $d, $c, $b, $a, 9, 8, 8, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, $a, $b, $c, $d, $e, $f, $10, $11, $12, $13, $14, $15, $16, $17, $19, $1a, $1b, $1c, $1e, $1f, $20, $22, $23, $25, $26, $28, $29, $2a, $2c, $2d, $2f, $30, $32, $34, $35, $37, $38, $3a, $3b, $3d, $3e + palette: .byte $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4 + h_bar_tilemap: .byte 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +.segment Tiles +TILES: +.import binary "lazydata.chr" + +.segment GameRam + .align $100 + SPRITE_BUFFER: .fill 4*$100, 0 +.segment Vectors + VECTORS: .word vblank, main, 0 + +REGISTER UPLIFT POTENTIAL REGISTERS +Statement [1] (volatile byte) scroll_y ← (byte) 0 [ ] ( [ ] { } ) always clobbers reg byte a +Statement [2] (volatile byte) vblank_hit ← (byte) 0 [ vblank_hit ] ( [ vblank_hit ] { } ) always clobbers reg byte a +Statement [6] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [ scroll_y vblank_hit ] ( [ scroll_y vblank_hit ] { } ) always clobbers reg byte a +Statement [7] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (volatile byte) scroll_y [ vblank_hit ] ( [ vblank_hit ] { } ) always clobbers reg byte a +Statement [8] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 [ vblank_hit ] ( [ vblank_hit ] { } ) always clobbers reg byte a +Statement [9] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER [ vblank_hit ] ( [ vblank_hit ] { } ) always clobbers reg byte a +Statement [11] return [ ] ( [ ] { } ) always clobbers reg byte a reg byte x reg byte y +Statement asm { cld ldx#$ff txs } always clobbers reg byte x +Statement [14] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 [ vblank_hit ] ( [ vblank_hit ] { } main:4 [ vblank_hit ] { } ) always clobbers reg byte a +Statement [15] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 [ vblank_hit ] ( [ vblank_hit ] { } main:4 [ vblank_hit ] { } ) always clobbers reg byte a +Statement [16] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 [ vblank_hit ] ( [ vblank_hit ] { } main:4 [ vblank_hit ] { } ) always clobbers reg byte a +Statement [17] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 [ vblank_hit ] ( [ vblank_hit ] { } main:4 [ vblank_hit ] { } ) always clobbers reg byte a +Statement asm { ldaPPU_PPUSTATUS } always clobbers reg byte a +Statement [20] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ vblank_hit main::initNES1_waitForVBlank1_$0 ] ( [ vblank_hit main::initNES1_waitForVBlank1_$0 ] { } main:4 [ vblank_hit main::initNES1_waitForVBlank1_$0 ] { } ) always clobbers reg byte a +Statement [23] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit 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 [24] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [25] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [26] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [27] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [28] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [29] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [30] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [34] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ vblank_hit main::initNES1_waitForVBlank2_$0 ] ( [ vblank_hit main::initNES1_waitForVBlank2_$0 ] { } main:4 [ vblank_hit main::initNES1_waitForVBlank2_$0 ] { } ) always clobbers reg byte a +Statement asm { ldaPPU_PPUSTATUS } always clobbers reg byte a +Statement [45] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 [ vblank_hit ] ( [ vblank_hit ] { } main:4 [ vblank_hit ] { } ) always clobbers reg byte a +Statement [46] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e [ vblank_hit ] ( [ vblank_hit ] { } main:4 [ vblank_hit ] { } ) always clobbers reg byte a +Statement [47] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $88 [ vblank_hit ] ( [ vblank_hit ] { } main:4 [ vblank_hit ] { } ) always clobbers reg byte a +Statement [49] if((word) main::i#14<(byte) $32) goto main::@2 [ vblank_hit main::i#14 rand_state#17 ] ( [ vblank_hit main::i#14 rand_state#17 ] { } main:4 [ vblank_hit main::i#14 rand_state#17 ] { } ) always clobbers reg byte a +Statement [52] (byte) main::h_bar#1 ← *((const to_nomodify byte*) sine_table + (byte) main::timer_2#1) + (byte) $60 [ vblank_hit main::active_balls#2 main::timer#3 main::timer_2#1 main::h_bar#1 ] ( [ vblank_hit main::active_balls#2 main::timer#3 main::timer_2#1 main::h_bar#1 ] { } main:4 [ vblank_hit main::active_balls#2 main::timer#3 main::timer_2#1 main::h_bar#1 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:6 [ main::active_balls#2 main::active_balls#8 main::active_balls#1 ] +Removing always clobbered register reg byte a as potential for zp[1]:7 [ main::timer#3 main::timer#15 main::timer#21 ] +Removing always clobbered register reg byte a as potential for zp[1]:5 [ main::timer_2#2 main::timer_2#1 ] +Statement [53] (byte~) main::$14 ← (byte) main::h_bar#1 ^ (byte) $ff [ vblank_hit main::active_balls#2 main::timer#3 main::timer_2#1 main::h_bar#1 main::$14 ] ( [ vblank_hit main::active_balls#2 main::timer#3 main::timer_2#1 main::h_bar#1 main::$14 ] { } main:4 [ vblank_hit main::active_balls#2 main::timer#3 main::timer_2#1 main::h_bar#1 main::$14 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:31 [ main::h_bar#1 ] +Statement [59] (byte~) main::$38 ← (byte) main::active_balls#1 << (byte) 3 [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 main::$38 ] ( [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 main::$38 ] { } main:4 [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 main::$38 ] { } ) always clobbers reg byte a +Statement [60] *((word*)(const struct $0*) balls + (byte~) main::$38) ← (byte) 0 [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 main::$38 ] ( [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 main::$38 ] { } main:4 [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 main::$38 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:34 [ main::$38 ] +Statement [61] *((word*)(const struct $0*) balls+(byte) 2 + (byte~) main::$38) ← (byte) 0 [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 ] ( [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 ] { } main:4 [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 ] { } ) always clobbers reg byte a +Statement [64] if((word) main::i#10<(byte) main::active_balls#8) goto main::@7 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:10 [ main::sprite_idx#3 main::sprite_idx#2 ] +Statement [65] *((byte*) 8193) ← (byte) $98 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } ) always clobbers reg byte a +Statement [66] if((byte) 0==(volatile byte) vblank_hit) goto main::@13 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } ) always clobbers reg byte a +Statement [67] (volatile byte) vblank_hit ← (byte) 0 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } ) always clobbers reg byte a +Statement [68] *((byte*) 8193) ← (byte) $18 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } ) always clobbers reg byte a +Statement [69] (word~) main::$40 ← (word) main::i#10 << (byte) 3 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } ) always clobbers reg byte a +Statement [70] (word*~) main::$61 ← (word*)(const struct $0*) balls + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 ] { } ) always clobbers reg byte a +Statement [71] (word*~) main::$62 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 main::$62 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 main::$62 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 main::$62 ] { } ) always clobbers reg byte a +Statement [72] (word*~) main::$63 ← (word*)(const struct $0*) balls + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 main::$62 main::$63 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 main::$62 main::$63 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 main::$62 main::$63 ] { } ) always clobbers reg byte a +Statement [73] *((word*~) main::$63) ← *((word*~) main::$61) + *((word*~) main::$62) [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } ) always clobbers reg byte a reg byte y +Removing always clobbered register reg byte y as potential for zp[1]:5 [ main::timer_2#2 main::timer_2#1 ] +Removing always clobbered register reg byte y as potential for zp[1]:6 [ main::active_balls#2 main::active_balls#8 main::active_balls#1 ] +Removing always clobbered register reg byte y as potential for zp[1]:7 [ main::timer#3 main::timer#15 main::timer#21 ] +Removing always clobbered register reg byte y as potential for zp[1]:31 [ main::h_bar#1 ] +Removing always clobbered register reg byte y as potential for zp[1]:10 [ main::sprite_idx#3 main::sprite_idx#2 ] +Statement [74] (word*~) main::$64 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$64 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$64 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$64 ] { } ) always clobbers reg byte a +Statement [75] (word*~) main::$65 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$64 main::$65 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$64 main::$65 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$64 main::$65 ] { } ) always clobbers reg byte a +Statement [76] *((word*~) main::$65) ← *((word*~) main::$64) + (byte) $10 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } ) always clobbers reg byte a reg byte y +Statement [77] (word*~) main::$66 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 ] { } ) always clobbers reg byte a +Statement [78] (word*~) main::$67 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 main::$67 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 main::$67 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 main::$67 ] { } ) always clobbers reg byte a +Statement [79] (word*~) main::$68 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 main::$67 main::$68 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 main::$67 main::$68 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 main::$67 main::$68 ] { } ) always clobbers reg byte a +Statement [80] *((word*~) main::$68) ← *((word*~) main::$66) + *((word*~) main::$67) [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } ) always clobbers reg byte a reg byte y +Statement [81] (word*~) main::$69 ← (word*)(const struct $0*) balls + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$69 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$69 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$69 ] { } ) always clobbers reg byte a +Statement [82] (word~) main::$20 ← *((word*~) main::$69) >> (byte) 8 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$20 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$20 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$20 ] { } ) always clobbers reg byte a reg byte y +Statement [83] if((word~) main::$20>=(byte) 8) goto main::@9 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } ) always clobbers reg byte a +Statement [84] (word~) main::$45 ← (word) main::i#10 << (byte) 3 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$45 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$45 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$45 ] { } ) always clobbers reg byte a +Statement [85] (word*~) main::$72 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$45 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$45 main::$72 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$45 main::$72 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$45 main::$72 ] { } ) always clobbers reg byte a +Statement [86] (word*~) main::$73 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$45 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$72 main::$73 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$72 main::$73 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$72 main::$73 ] { } ) always clobbers reg byte a +Statement [87] *((word*~) main::$73) ← *((word*~) main::$72) ^ (word) $ffff [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } ) always clobbers reg byte a reg byte y +Statement [88] (word~) main::$44 ← (word) main::i#10 << (byte) 3 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 ] { } ) always clobbers reg byte a +Statement [89] (word*~) main::$70 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$44 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 main::$70 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 main::$70 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 main::$70 ] { } ) always clobbers reg byte a +Statement [90] (word~) main::$23 ← *((word*~) main::$70) >> (byte) 8 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 main::$23 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 main::$23 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 main::$23 ] { } ) always clobbers reg byte a reg byte y +Statement [91] (word*~) main::$71 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$44 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$71 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$71 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$71 ] { } ) always clobbers reg byte a +Statement [92] (word~) main::$25 ← *((word*~) main::$71) >> (byte) 8 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$25 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$25 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$25 ] { } ) always clobbers reg byte a reg byte y +Statement [93] (byte~) main::$26 ← (byte) main::h_bar#1 + (byte) 8 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$25 main::$26 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$25 main::$26 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$25 main::$26 ] { } ) always clobbers reg byte a +Statement [94] if((word~) main::$23<(byte) main::h_bar#1) goto main::@10 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$25 main::$26 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$25 main::$26 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$25 main::$26 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:73 [ main::$26 ] +Statement [95] if((word~) main::$25>=(byte~) main::$26) goto main::@10 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } ) always clobbers reg byte a +Statement [96] (word~) main::$53 ← (word) main::i#10 << (byte) 3 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 ] { } ) always clobbers reg byte a +Statement [97] (word*~) main::$76 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$53 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$76 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$76 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$76 ] { } ) always clobbers reg byte a +Statement [98] (word*~) main::$77 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$53 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$76 main::$77 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$76 main::$77 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$76 main::$77 ] { } ) always clobbers reg byte a +Statement [99] *((word*~) main::$77) ← *((word*~) main::$76) ^ (word) $ffff [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 ] { } ) always clobbers reg byte a reg byte y +Statement [101] (word~) main::$56 ← (word)(byte~) main::$30 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$56 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$56 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$56 ] { } ) always clobbers reg byte a +Statement [102] (word~) main::$31 ← (word~) main::$56 << (byte) 8 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$31 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$31 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$31 ] { } ) always clobbers reg byte a +Statement [103] (word*~) main::$78 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$53 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$31 main::$78 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$31 main::$78 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$31 main::$78 ] { } ) always clobbers reg byte a +Statement [104] *((word*~) main::$78) ← (word~) main::$31 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } ) always clobbers reg byte a reg byte y +Statement [105] (word~) main::$50 ← (word) main::i#10 << (byte) 3 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 ] { } ) always clobbers reg byte a +Statement [106] (word*~) main::$74 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$50 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$74 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$74 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$74 ] { } ) always clobbers reg byte a +Statement [107] (word~) main::$32 ← *((word*~) main::$74) >> (byte) 8 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$32 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$32 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$32 ] { } ) always clobbers reg byte a reg byte y +Statement [108] (byte~) main::$48 ← (byte) main::sprite_idx#3 << (byte) 2 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$32 main::$48 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$32 main::$48 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$32 main::$48 ] { } ) always clobbers reg byte a +Statement [109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$48) ← (byte)(word~) main::$32 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:93 [ main::$48 ] +Statement [110] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$48) ← (byte) $a [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] { } ) always clobbers reg byte a +Statement [111] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$48) ← (byte) 3 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] { } ) always clobbers reg byte a +Statement [112] (word*~) main::$75 ← (word*)(const struct $0*) balls + (word~) main::$50 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$48 main::$75 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$48 main::$75 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$48 main::$75 ] { } ) always clobbers reg byte a +Statement [113] (word~) main::$33 ← *((word*~) main::$75) >> (byte) 8 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$48 main::$33 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$48 main::$33 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$48 main::$33 ] { } ) always clobbers reg byte a reg byte y +Removing always clobbered register reg byte y as potential for zp[1]:93 [ main::$48 ] +Statement [114] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$48) ← (byte)(word~) main::$33 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } ) always clobbers reg byte a +Statement [120] (word) rand::return#2 ← (word) rand::return#0 [ vblank_hit main::i#14 rand_state#11 rand::return#2 ] ( [ vblank_hit main::i#14 rand_state#11 rand::return#2 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4 [ vblank_hit main::i#14 rand_state#11 rand::return#2 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a +Statement [121] (word~) main::$9 ← (word) rand::return#2 [ vblank_hit main::i#14 rand_state#11 main::$9 ] ( [ vblank_hit main::i#14 rand_state#11 main::$9 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4 [ vblank_hit main::i#14 rand_state#11 main::$9 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [122] (word~) main::$10 ← (word~) main::$9 & (word) $3ff [ vblank_hit main::i#14 rand_state#11 main::$10 ] ( [ vblank_hit main::i#14 rand_state#11 main::$10 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4 [ vblank_hit main::i#14 rand_state#11 main::$10 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [123] (word~) main::$35 ← (word) main::i#14 << (byte) 3 [ vblank_hit main::i#14 rand_state#11 main::$10 main::$35 ] ( [ vblank_hit main::i#14 rand_state#11 main::$10 main::$35 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4 [ vblank_hit main::i#14 rand_state#11 main::$10 main::$35 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [124] (word*~) main::$59 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$35 [ vblank_hit main::i#14 rand_state#11 main::$10 main::$59 ] ( [ vblank_hit main::i#14 rand_state#11 main::$10 main::$59 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4 [ vblank_hit main::i#14 rand_state#11 main::$10 main::$59 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [125] *((word*~) main::$59) ← (word~) main::$10 [ vblank_hit main::i#14 rand_state#11 ] ( [ vblank_hit main::i#14 rand_state#11 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4 [ vblank_hit main::i#14 rand_state#11 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a reg byte y +Statement [127] (word) rand::return#3 ← (word) rand::return#0 [ vblank_hit main::i#14 rand_state#11 rand::return#3 ] ( [ vblank_hit main::i#14 rand_state#11 rand::return#3 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4 [ vblank_hit main::i#14 rand_state#11 rand::return#3 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [128] (word~) main::$11 ← (word) rand::return#3 [ vblank_hit main::i#14 rand_state#11 main::$11 ] ( [ vblank_hit main::i#14 rand_state#11 main::$11 ] { } main:4 [ vblank_hit main::i#14 rand_state#11 main::$11 ] { } ) always clobbers reg byte a +Statement [129] (byte~) main::$12 ← (word~) main::$11 & (byte) $ff [ vblank_hit main::i#14 rand_state#11 main::$12 ] ( [ vblank_hit main::i#14 rand_state#11 main::$12 ] { } main:4 [ vblank_hit main::i#14 rand_state#11 main::$12 ] { } ) always clobbers reg byte a +Statement [130] (word~) main::$36 ← (word) main::i#14 << (byte) 3 [ vblank_hit main::i#14 rand_state#11 main::$12 main::$36 ] ( [ vblank_hit main::i#14 rand_state#11 main::$12 main::$36 ] { } main:4 [ vblank_hit main::i#14 rand_state#11 main::$12 main::$36 ] { } ) always clobbers reg byte a +Removing always clobbered register reg byte a as potential for zp[1]:112 [ main::$12 ] +Statement [131] (word*~) main::$60 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$36 [ vblank_hit main::i#14 rand_state#11 main::$12 main::$60 ] ( [ vblank_hit main::i#14 rand_state#11 main::$12 main::$60 ] { } main:4 [ vblank_hit main::i#14 rand_state#11 main::$12 main::$60 ] { } ) always clobbers reg byte a +Statement [132] *((word*~) main::$60) ← (byte~) main::$12 [ vblank_hit main::i#14 rand_state#11 ] ( [ vblank_hit main::i#14 rand_state#11 ] { } main:4 [ vblank_hit main::i#14 rand_state#11 ] { } ) always clobbers reg byte a reg byte y +Statement [139] (byte*) ppuDataTransfer::cpuSrc#6 ← (byte*)(nomodify void*) ppuDataTransfer::cpuData#2 [ ppuDataTransfer::cpuSrc#6 ] ( ppuDataTransfer:38 [ vblank_hit ppuDataTransfer::cpuSrc#6 ] { } main:4::ppuDataTransfer:38 [ vblank_hit ppuDataTransfer::cpuSrc#6 ] { } ppuDataTransfer:44 [ vblank_hit ppuDataTransfer::cpuSrc#6 ] { } main:4::ppuDataTransfer:44 [ vblank_hit ppuDataTransfer::cpuSrc#6 ] { } ) always clobbers reg byte a +Statement [141] if((word) ppuDataTransfer::i#2<(byte) $20*(const byte) SIZEOF_BYTE) goto ppuDataTransfer::@2 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] ( ppuDataTransfer:38 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } main:4::ppuDataTransfer:38 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } ppuDataTransfer:44 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } main:4::ppuDataTransfer:44 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } ) always clobbers reg byte a +Statement [143] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] ( ppuDataTransfer:38 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } main:4::ppuDataTransfer:38 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } ppuDataTransfer:44 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } main:4::ppuDataTransfer:44 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } ) always clobbers reg byte a reg byte y +Statement [153] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 [ ppuDataFill::size#3 ppuDataFill::i#2 ] ( ppuDataFill:40 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } main:4::ppuDataFill:40 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } ppuDataFill:42 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } main:4::ppuDataFill:42 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } ) always clobbers reg byte a +Statement [155] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) 0 [ ppuDataFill::size#3 ppuDataFill::i#2 ] ( ppuDataFill:40 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } main:4::ppuDataFill:40 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } ppuDataFill:42 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } main:4::ppuDataFill:42 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } ) always clobbers reg byte a +Statement [158] (word~) rand::$0 ← (word) rand_state#10 << (byte) 7 [ rand_state#10 rand::$0 ] ( rand:119 [ vblank_hit main::i#14 rand_state#10 rand::$0 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4::rand:119 [ vblank_hit main::i#14 rand_state#10 rand::$0 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } rand:126 [ vblank_hit main::i#14 rand_state#10 rand::$0 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4::rand:126 [ vblank_hit main::i#14 rand_state#10 rand::$0 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [159] (word) rand_state#0 ← (word) rand_state#10 ^ (word~) rand::$0 [ rand_state#0 ] ( rand:119 [ vblank_hit main::i#14 rand_state#0 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4::rand:119 [ vblank_hit main::i#14 rand_state#0 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } rand:126 [ vblank_hit main::i#14 rand_state#0 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4::rand:126 [ vblank_hit main::i#14 rand_state#0 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [160] (word~) rand::$1 ← (word) rand_state#0 >> (byte) 9 [ rand_state#0 rand::$1 ] ( rand:119 [ vblank_hit main::i#14 rand_state#0 rand::$1 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4::rand:119 [ vblank_hit main::i#14 rand_state#0 rand::$1 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } rand:126 [ vblank_hit main::i#14 rand_state#0 rand::$1 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4::rand:126 [ vblank_hit main::i#14 rand_state#0 rand::$1 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [161] (word) rand_state#1 ← (word) rand_state#0 ^ (word~) rand::$1 [ rand_state#1 ] ( rand:119 [ vblank_hit main::i#14 rand_state#1 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4::rand:119 [ vblank_hit main::i#14 rand_state#1 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } rand:126 [ vblank_hit main::i#14 rand_state#1 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4::rand:126 [ vblank_hit main::i#14 rand_state#1 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [162] (word~) rand::$2 ← (word) rand_state#1 << (byte) 8 [ rand_state#1 rand::$2 ] ( rand:119 [ vblank_hit main::i#14 rand_state#1 rand::$2 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4::rand:119 [ vblank_hit main::i#14 rand_state#1 rand::$2 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } rand:126 [ vblank_hit main::i#14 rand_state#1 rand::$2 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4::rand:126 [ vblank_hit main::i#14 rand_state#1 rand::$2 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [163] (word) rand_state#11 ← (word) rand_state#1 ^ (word~) rand::$2 [ rand_state#11 ] ( rand:119 [ vblank_hit main::i#14 rand_state#11 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4::rand:119 [ vblank_hit main::i#14 rand_state#11 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } rand:126 [ vblank_hit main::i#14 rand_state#11 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4::rand:126 [ vblank_hit main::i#14 rand_state#11 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [164] (word) rand::return#0 ← (word) rand_state#11 [ rand_state#11 rand::return#0 ] ( rand:119 [ vblank_hit main::i#14 rand_state#11 rand::return#0 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4::rand:119 [ vblank_hit main::i#14 rand_state#11 rand::return#0 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } rand:126 [ vblank_hit main::i#14 rand_state#11 rand::return#0 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4::rand:126 [ vblank_hit main::i#14 rand_state#11 rand::return#0 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [1] (volatile byte) scroll_y ← (byte) 0 [ ] ( [ ] { } ) always clobbers reg byte a +Statement [2] (volatile byte) vblank_hit ← (byte) 0 [ vblank_hit ] ( [ vblank_hit ] { } ) always clobbers reg byte a +Statement [6] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 [ scroll_y vblank_hit ] ( [ scroll_y vblank_hit ] { } ) always clobbers reg byte a +Statement [7] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (volatile byte) scroll_y [ vblank_hit ] ( [ vblank_hit ] { } ) always clobbers reg byte a +Statement [8] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 [ vblank_hit ] ( [ vblank_hit ] { } ) always clobbers reg byte a +Statement [9] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER [ vblank_hit ] ( [ vblank_hit ] { } ) always clobbers reg byte a +Statement [11] return [ ] ( [ ] { } ) always clobbers reg byte a reg byte x reg byte y +Statement asm { cld ldx#$ff txs } always clobbers reg byte x +Statement [14] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 [ vblank_hit ] ( [ vblank_hit ] { } main:4 [ vblank_hit ] { } ) always clobbers reg byte a +Statement [15] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) 0 [ vblank_hit ] ( [ vblank_hit ] { } main:4 [ vblank_hit ] { } ) always clobbers reg byte a +Statement [16] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 [ vblank_hit ] ( [ vblank_hit ] { } main:4 [ vblank_hit ] { } ) always clobbers reg byte a +Statement [17] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 [ vblank_hit ] ( [ vblank_hit ] { } main:4 [ vblank_hit ] { } ) always clobbers reg byte a +Statement asm { ldaPPU_PPUSTATUS } always clobbers reg byte a +Statement [20] (byte~) main::initNES1_waitForVBlank1_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ vblank_hit main::initNES1_waitForVBlank1_$0 ] ( [ vblank_hit main::initNES1_waitForVBlank1_$0 ] { } main:4 [ vblank_hit main::initNES1_waitForVBlank1_$0 ] { } ) always clobbers reg byte a +Statement [23] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [24] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [25] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [26] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [27] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [28] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [29] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [30] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 [ vblank_hit main::initNES1_i#2 ] ( [ vblank_hit main::initNES1_i#2 ] { } main:4 [ vblank_hit main::initNES1_i#2 ] { } ) always clobbers reg byte a +Statement [34] (byte~) main::initNES1_waitForVBlank2_$0 ← *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS) & (byte) $80 [ vblank_hit main::initNES1_waitForVBlank2_$0 ] ( [ vblank_hit main::initNES1_waitForVBlank2_$0 ] { } main:4 [ vblank_hit main::initNES1_waitForVBlank2_$0 ] { } ) always clobbers reg byte a +Statement asm { ldaPPU_PPUSTATUS } always clobbers reg byte a +Statement [45] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 [ vblank_hit ] ( [ vblank_hit ] { } main:4 [ vblank_hit ] { } ) always clobbers reg byte a +Statement [46] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $1e [ vblank_hit ] ( [ vblank_hit ] { } main:4 [ vblank_hit ] { } ) always clobbers reg byte a +Statement [47] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $88 [ vblank_hit ] ( [ vblank_hit ] { } main:4 [ vblank_hit ] { } ) always clobbers reg byte a +Statement [49] if((word) main::i#14<(byte) $32) goto main::@2 [ vblank_hit main::i#14 rand_state#17 ] ( [ vblank_hit main::i#14 rand_state#17 ] { } main:4 [ vblank_hit main::i#14 rand_state#17 ] { } ) always clobbers reg byte a +Statement [52] (byte) main::h_bar#1 ← *((const to_nomodify byte*) sine_table + (byte) main::timer_2#1) + (byte) $60 [ vblank_hit main::active_balls#2 main::timer#3 main::timer_2#1 main::h_bar#1 ] ( [ vblank_hit main::active_balls#2 main::timer#3 main::timer_2#1 main::h_bar#1 ] { } main:4 [ vblank_hit main::active_balls#2 main::timer#3 main::timer_2#1 main::h_bar#1 ] { } ) always clobbers reg byte a +Statement [53] (byte~) main::$14 ← (byte) main::h_bar#1 ^ (byte) $ff [ vblank_hit main::active_balls#2 main::timer#3 main::timer_2#1 main::h_bar#1 main::$14 ] ( [ vblank_hit main::active_balls#2 main::timer#3 main::timer_2#1 main::h_bar#1 main::$14 ] { } main:4 [ vblank_hit main::active_balls#2 main::timer#3 main::timer_2#1 main::h_bar#1 main::$14 ] { } ) always clobbers reg byte a +Statement [59] (byte~) main::$38 ← (byte) main::active_balls#1 << (byte) 3 [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 main::$38 ] ( [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 main::$38 ] { } main:4 [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 main::$38 ] { } ) always clobbers reg byte a +Statement [60] *((word*)(const struct $0*) balls + (byte~) main::$38) ← (byte) 0 [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 main::$38 ] ( [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 main::$38 ] { } main:4 [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 main::$38 ] { } ) always clobbers reg byte a +Statement [61] *((word*)(const struct $0*) balls+(byte) 2 + (byte~) main::$38) ← (byte) 0 [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 ] ( [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 ] { } main:4 [ vblank_hit main::timer_2#1 main::h_bar#1 main::active_balls#1 ] { } ) always clobbers reg byte a +Statement [64] if((word) main::i#10<(byte) main::active_balls#8) goto main::@7 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } ) always clobbers reg byte a +Statement [65] *((byte*) 8193) ← (byte) $98 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } ) always clobbers reg byte a +Statement [66] if((byte) 0==(volatile byte) vblank_hit) goto main::@13 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } ) always clobbers reg byte a +Statement [67] (volatile byte) vblank_hit ← (byte) 0 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } ) always clobbers reg byte a +Statement [68] *((byte*) 8193) ← (byte) $18 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 ] { } ) always clobbers reg byte a +Statement [69] (word~) main::$40 ← (word) main::i#10 << (byte) 3 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } ) always clobbers reg byte a +Statement [70] (word*~) main::$61 ← (word*)(const struct $0*) balls + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 ] { } ) always clobbers reg byte a +Statement [71] (word*~) main::$62 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 main::$62 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 main::$62 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 main::$62 ] { } ) always clobbers reg byte a +Statement [72] (word*~) main::$63 ← (word*)(const struct $0*) balls + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 main::$62 main::$63 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 main::$62 main::$63 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$61 main::$62 main::$63 ] { } ) always clobbers reg byte a +Statement [73] *((word*~) main::$63) ← *((word*~) main::$61) + *((word*~) main::$62) [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } ) always clobbers reg byte a reg byte y +Statement [74] (word*~) main::$64 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$64 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$64 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$64 ] { } ) always clobbers reg byte a +Statement [75] (word*~) main::$65 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$64 main::$65 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$64 main::$65 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$64 main::$65 ] { } ) always clobbers reg byte a +Statement [76] *((word*~) main::$65) ← *((word*~) main::$64) + (byte) $10 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } ) always clobbers reg byte a reg byte y +Statement [77] (word*~) main::$66 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 ] { } ) always clobbers reg byte a +Statement [78] (word*~) main::$67 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 main::$67 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 main::$67 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 main::$67 ] { } ) always clobbers reg byte a +Statement [79] (word*~) main::$68 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 main::$67 main::$68 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 main::$67 main::$68 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 main::$66 main::$67 main::$68 ] { } ) always clobbers reg byte a +Statement [80] *((word*~) main::$68) ← *((word*~) main::$66) + *((word*~) main::$67) [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$40 ] { } ) always clobbers reg byte a reg byte y +Statement [81] (word*~) main::$69 ← (word*)(const struct $0*) balls + (word~) main::$40 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$69 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$69 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$69 ] { } ) always clobbers reg byte a +Statement [82] (word~) main::$20 ← *((word*~) main::$69) >> (byte) 8 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$20 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$20 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$20 ] { } ) always clobbers reg byte a reg byte y +Statement [83] if((word~) main::$20>=(byte) 8) goto main::@9 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } ) always clobbers reg byte a +Statement [84] (word~) main::$45 ← (word) main::i#10 << (byte) 3 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$45 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$45 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$45 ] { } ) always clobbers reg byte a +Statement [85] (word*~) main::$72 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$45 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$45 main::$72 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$45 main::$72 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$45 main::$72 ] { } ) always clobbers reg byte a +Statement [86] (word*~) main::$73 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$45 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$72 main::$73 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$72 main::$73 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$72 main::$73 ] { } ) always clobbers reg byte a +Statement [87] *((word*~) main::$73) ← *((word*~) main::$72) ^ (word) $ffff [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } ) always clobbers reg byte a reg byte y +Statement [88] (word~) main::$44 ← (word) main::i#10 << (byte) 3 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 ] { } ) always clobbers reg byte a +Statement [89] (word*~) main::$70 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$44 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 main::$70 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 main::$70 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 main::$70 ] { } ) always clobbers reg byte a +Statement [90] (word~) main::$23 ← *((word*~) main::$70) >> (byte) 8 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 main::$23 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 main::$23 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$44 main::$23 ] { } ) always clobbers reg byte a reg byte y +Statement [91] (word*~) main::$71 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$44 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$71 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$71 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$71 ] { } ) always clobbers reg byte a +Statement [92] (word~) main::$25 ← *((word*~) main::$71) >> (byte) 8 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$25 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$25 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$25 ] { } ) always clobbers reg byte a reg byte y +Statement [93] (byte~) main::$26 ← (byte) main::h_bar#1 + (byte) 8 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$25 main::$26 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$25 main::$26 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$23 main::$25 main::$26 ] { } ) always clobbers reg byte a +Statement [94] if((word~) main::$23<(byte) main::h_bar#1) goto main::@10 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$25 main::$26 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$25 main::$26 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$25 main::$26 ] { } ) always clobbers reg byte a +Statement [95] if((word~) main::$25>=(byte~) main::$26) goto main::@10 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } ) always clobbers reg byte a +Statement [96] (word~) main::$53 ← (word) main::i#10 << (byte) 3 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 ] { } ) always clobbers reg byte a +Statement [97] (word*~) main::$76 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$53 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$76 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$76 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$76 ] { } ) always clobbers reg byte a +Statement [98] (word*~) main::$77 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$53 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$76 main::$77 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$76 main::$77 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$76 main::$77 ] { } ) always clobbers reg byte a +Statement [99] *((word*~) main::$77) ← *((word*~) main::$76) ^ (word) $ffff [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 ] { } ) always clobbers reg byte a reg byte y +Statement [101] (word~) main::$56 ← (word)(byte~) main::$30 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$56 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$56 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$56 ] { } ) always clobbers reg byte a +Statement [102] (word~) main::$31 ← (word~) main::$56 << (byte) 8 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$31 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$31 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$53 main::$31 ] { } ) always clobbers reg byte a +Statement [103] (word*~) main::$78 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$53 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$31 main::$78 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$31 main::$78 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$31 main::$78 ] { } ) always clobbers reg byte a +Statement [104] *((word*~) main::$78) ← (word~) main::$31 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } ) always clobbers reg byte a reg byte y +Statement [105] (word~) main::$50 ← (word) main::i#10 << (byte) 3 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 ] { } ) always clobbers reg byte a +Statement [106] (word*~) main::$74 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$50 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$74 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$74 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$74 ] { } ) always clobbers reg byte a +Statement [107] (word~) main::$32 ← *((word*~) main::$74) >> (byte) 8 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$32 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$32 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$32 ] { } ) always clobbers reg byte a reg byte y +Statement [108] (byte~) main::$48 ← (byte) main::sprite_idx#3 << (byte) 2 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$32 main::$48 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$32 main::$48 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$32 main::$48 ] { } ) always clobbers reg byte a +Statement [109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$48) ← (byte)(word~) main::$32 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] { } ) always clobbers reg byte a +Statement [110] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$48) ← (byte) $a [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] { } ) always clobbers reg byte a +Statement [111] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$48) ← (byte) 3 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$50 main::$48 ] { } ) always clobbers reg byte a +Statement [112] (word*~) main::$75 ← (word*)(const struct $0*) balls + (word~) main::$50 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$48 main::$75 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$48 main::$75 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$48 main::$75 ] { } ) always clobbers reg byte a +Statement [113] (word~) main::$33 ← *((word*~) main::$75) >> (byte) 8 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$48 main::$33 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$48 main::$33 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 main::$48 main::$33 ] { } ) always clobbers reg byte a reg byte y +Statement [114] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$48) ← (byte)(word~) main::$33 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] ( [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } main:4 [ vblank_hit main::timer_2#1 main::active_balls#8 main::timer#15 main::h_bar#1 main::i#10 main::sprite_idx#3 ] { } ) always clobbers reg byte a +Statement [120] (word) rand::return#2 ← (word) rand::return#0 [ vblank_hit main::i#14 rand_state#11 rand::return#2 ] ( [ vblank_hit main::i#14 rand_state#11 rand::return#2 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4 [ vblank_hit main::i#14 rand_state#11 rand::return#2 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } ) always clobbers reg byte a +Statement [121] (word~) main::$9 ← (word) rand::return#2 [ vblank_hit main::i#14 rand_state#11 main::$9 ] ( [ vblank_hit main::i#14 rand_state#11 main::$9 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4 [ vblank_hit main::i#14 rand_state#11 main::$9 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [122] (word~) main::$10 ← (word~) main::$9 & (word) $3ff [ vblank_hit main::i#14 rand_state#11 main::$10 ] ( [ vblank_hit main::i#14 rand_state#11 main::$10 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4 [ vblank_hit main::i#14 rand_state#11 main::$10 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [123] (word~) main::$35 ← (word) main::i#14 << (byte) 3 [ vblank_hit main::i#14 rand_state#11 main::$10 main::$35 ] ( [ vblank_hit main::i#14 rand_state#11 main::$10 main::$35 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4 [ vblank_hit main::i#14 rand_state#11 main::$10 main::$35 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [124] (word*~) main::$59 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$35 [ vblank_hit main::i#14 rand_state#11 main::$10 main::$59 ] ( [ vblank_hit main::i#14 rand_state#11 main::$10 main::$59 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4 [ vblank_hit main::i#14 rand_state#11 main::$10 main::$59 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [125] *((word*~) main::$59) ← (word~) main::$10 [ vblank_hit main::i#14 rand_state#11 ] ( [ vblank_hit main::i#14 rand_state#11 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4 [ vblank_hit main::i#14 rand_state#11 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a reg byte y +Statement [127] (word) rand::return#3 ← (word) rand::return#0 [ vblank_hit main::i#14 rand_state#11 rand::return#3 ] ( [ vblank_hit main::i#14 rand_state#11 rand::return#3 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4 [ vblank_hit main::i#14 rand_state#11 rand::return#3 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [128] (word~) main::$11 ← (word) rand::return#3 [ vblank_hit main::i#14 rand_state#11 main::$11 ] ( [ vblank_hit main::i#14 rand_state#11 main::$11 ] { } main:4 [ vblank_hit main::i#14 rand_state#11 main::$11 ] { } ) always clobbers reg byte a +Statement [129] (byte~) main::$12 ← (word~) main::$11 & (byte) $ff [ vblank_hit main::i#14 rand_state#11 main::$12 ] ( [ vblank_hit main::i#14 rand_state#11 main::$12 ] { } main:4 [ vblank_hit main::i#14 rand_state#11 main::$12 ] { } ) always clobbers reg byte a +Statement [130] (word~) main::$36 ← (word) main::i#14 << (byte) 3 [ vblank_hit main::i#14 rand_state#11 main::$12 main::$36 ] ( [ vblank_hit main::i#14 rand_state#11 main::$12 main::$36 ] { } main:4 [ vblank_hit main::i#14 rand_state#11 main::$12 main::$36 ] { } ) always clobbers reg byte a +Statement [131] (word*~) main::$60 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$36 [ vblank_hit main::i#14 rand_state#11 main::$12 main::$60 ] ( [ vblank_hit main::i#14 rand_state#11 main::$12 main::$60 ] { } main:4 [ vblank_hit main::i#14 rand_state#11 main::$12 main::$60 ] { } ) always clobbers reg byte a +Statement [132] *((word*~) main::$60) ← (byte~) main::$12 [ vblank_hit main::i#14 rand_state#11 ] ( [ vblank_hit main::i#14 rand_state#11 ] { } main:4 [ vblank_hit main::i#14 rand_state#11 ] { } ) always clobbers reg byte a reg byte y +Statement [139] (byte*) ppuDataTransfer::cpuSrc#6 ← (byte*)(nomodify void*) ppuDataTransfer::cpuData#2 [ ppuDataTransfer::cpuSrc#6 ] ( ppuDataTransfer:38 [ vblank_hit ppuDataTransfer::cpuSrc#6 ] { } main:4::ppuDataTransfer:38 [ vblank_hit ppuDataTransfer::cpuSrc#6 ] { } ppuDataTransfer:44 [ vblank_hit ppuDataTransfer::cpuSrc#6 ] { } main:4::ppuDataTransfer:44 [ vblank_hit ppuDataTransfer::cpuSrc#6 ] { } ) always clobbers reg byte a +Statement [141] if((word) ppuDataTransfer::i#2<(byte) $20*(const byte) SIZEOF_BYTE) goto ppuDataTransfer::@2 [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] ( ppuDataTransfer:38 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } main:4::ppuDataTransfer:38 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } ppuDataTransfer:44 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } main:4::ppuDataTransfer:44 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ] { } ) always clobbers reg byte a +Statement [143] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) [ ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] ( ppuDataTransfer:38 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } main:4::ppuDataTransfer:38 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } ppuDataTransfer:44 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } main:4::ppuDataTransfer:44 [ vblank_hit ppuDataTransfer::i#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::ppuDataPut1_val#0 ] { } ) always clobbers reg byte a reg byte y +Statement [153] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 [ ppuDataFill::size#3 ppuDataFill::i#2 ] ( ppuDataFill:40 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } main:4::ppuDataFill:40 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } ppuDataFill:42 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } main:4::ppuDataFill:42 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } ) always clobbers reg byte a +Statement [155] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) 0 [ ppuDataFill::size#3 ppuDataFill::i#2 ] ( ppuDataFill:40 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } main:4::ppuDataFill:40 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } ppuDataFill:42 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } main:4::ppuDataFill:42 [ vblank_hit ppuDataFill::size#3 ppuDataFill::i#2 ] { } ) always clobbers reg byte a +Statement [158] (word~) rand::$0 ← (word) rand_state#10 << (byte) 7 [ rand_state#10 rand::$0 ] ( rand:119 [ vblank_hit main::i#14 rand_state#10 rand::$0 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4::rand:119 [ vblank_hit main::i#14 rand_state#10 rand::$0 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } rand:126 [ vblank_hit main::i#14 rand_state#10 rand::$0 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4::rand:126 [ vblank_hit main::i#14 rand_state#10 rand::$0 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [159] (word) rand_state#0 ← (word) rand_state#10 ^ (word~) rand::$0 [ rand_state#0 ] ( rand:119 [ vblank_hit main::i#14 rand_state#0 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4::rand:119 [ vblank_hit main::i#14 rand_state#0 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } rand:126 [ vblank_hit main::i#14 rand_state#0 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4::rand:126 [ vblank_hit main::i#14 rand_state#0 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [160] (word~) rand::$1 ← (word) rand_state#0 >> (byte) 9 [ rand_state#0 rand::$1 ] ( rand:119 [ vblank_hit main::i#14 rand_state#0 rand::$1 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4::rand:119 [ vblank_hit main::i#14 rand_state#0 rand::$1 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } rand:126 [ vblank_hit main::i#14 rand_state#0 rand::$1 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4::rand:126 [ vblank_hit main::i#14 rand_state#0 rand::$1 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [161] (word) rand_state#1 ← (word) rand_state#0 ^ (word~) rand::$1 [ rand_state#1 ] ( rand:119 [ vblank_hit main::i#14 rand_state#1 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4::rand:119 [ vblank_hit main::i#14 rand_state#1 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } rand:126 [ vblank_hit main::i#14 rand_state#1 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4::rand:126 [ vblank_hit main::i#14 rand_state#1 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [162] (word~) rand::$2 ← (word) rand_state#1 << (byte) 8 [ rand_state#1 rand::$2 ] ( rand:119 [ vblank_hit main::i#14 rand_state#1 rand::$2 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4::rand:119 [ vblank_hit main::i#14 rand_state#1 rand::$2 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } rand:126 [ vblank_hit main::i#14 rand_state#1 rand::$2 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4::rand:126 [ vblank_hit main::i#14 rand_state#1 rand::$2 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [163] (word) rand_state#11 ← (word) rand_state#1 ^ (word~) rand::$2 [ rand_state#11 ] ( rand:119 [ vblank_hit main::i#14 rand_state#11 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4::rand:119 [ vblank_hit main::i#14 rand_state#11 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } rand:126 [ vblank_hit main::i#14 rand_state#11 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4::rand:126 [ vblank_hit main::i#14 rand_state#11 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) always clobbers reg byte a +Statement [164] (word) rand::return#0 ← (word) rand_state#11 [ rand_state#11 rand::return#0 ] ( rand:119 [ vblank_hit main::i#14 rand_state#11 rand::return#0 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } main:4::rand:119 [ vblank_hit main::i#14 rand_state#11 rand::return#0 ] { { rand_state#10 = rand_state#17 } { rand::return#0 = rand::return#2 } } rand:126 [ vblank_hit main::i#14 rand_state#11 rand::return#0 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } main:4::rand:126 [ vblank_hit main::i#14 rand_state#11 rand::return#0 ] { { rand_state#10 = rand_state#11 } { rand::return#0 = rand::return#3 } } ) 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[2]:3 [ main::i#14 main::i#2 ] : zp[2]:3 , +Potential registers zp[1]:5 [ main::timer_2#2 main::timer_2#1 ] : zp[1]:5 , reg byte x , +Potential registers zp[1]:6 [ main::active_balls#2 main::active_balls#8 main::active_balls#1 ] : zp[1]:6 , reg byte x , +Potential registers zp[1]:7 [ main::timer#3 main::timer#15 main::timer#21 ] : zp[1]:7 , reg byte x , +Potential registers zp[2]:8 [ main::i#10 main::i#4 ] : zp[2]:8 , +Potential registers zp[1]:10 [ main::sprite_idx#3 main::sprite_idx#2 ] : zp[1]:10 , reg byte x , +Potential registers zp[2]:11 [ ppuDataTransfer::ppuDataPrepare1_ppuData#0 ] : zp[2]:11 , +Potential registers zp[2]:13 [ ppuDataTransfer::cpuData#2 ] : zp[2]:13 , +Potential registers zp[2]:15 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] : zp[2]:15 , +Potential registers zp[2]:17 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#6 ppuDataTransfer::cpuSrc#1 ] : zp[2]:17 , +Potential registers zp[2]:19 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ] : zp[2]:19 , +Potential registers zp[2]:21 [ ppuDataFill::size#3 ] : zp[2]:21 , +Potential registers zp[2]:23 [ ppuDataFill::i#2 ppuDataFill::i#1 ] : zp[2]:23 , +Potential registers zp[2]:25 [ rand_state#10 rand_state#17 rand_state#11 ] : zp[2]:25 , +Potential registers zp[1]:27 [ scroll_y ] : zp[1]:27 , +Potential registers zp[1]:28 [ vblank_hit ] : zp[1]:28 , +Potential registers zp[1]:29 [ main::initNES1_waitForVBlank1_$0 ] : zp[1]:29 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:30 [ main::initNES1_waitForVBlank2_$0 ] : zp[1]:30 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:31 [ main::h_bar#1 ] : zp[1]:31 , reg byte x , +Potential registers zp[1]:32 [ main::$14 ] : zp[1]:32 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:33 [ main::timer#1 ] : zp[1]:33 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:34 [ main::$38 ] : zp[1]:34 , reg byte x , reg byte y , +Potential registers zp[2]:35 [ main::$40 ] : zp[2]:35 , +Potential registers zp[2]:37 [ main::$61 ] : zp[2]:37 , +Potential registers zp[2]:39 [ main::$62 ] : zp[2]:39 , +Potential registers zp[2]:41 [ main::$63 ] : zp[2]:41 , +Potential registers zp[2]:43 [ main::$64 ] : zp[2]:43 , +Potential registers zp[2]:45 [ main::$65 ] : zp[2]:45 , +Potential registers zp[2]:47 [ main::$66 ] : zp[2]:47 , +Potential registers zp[2]:49 [ main::$67 ] : zp[2]:49 , +Potential registers zp[2]:51 [ main::$68 ] : zp[2]:51 , +Potential registers zp[2]:53 [ main::$69 ] : zp[2]:53 , +Potential registers zp[2]:55 [ main::$20 ] : zp[2]:55 , +Potential registers zp[2]:57 [ main::$45 ] : zp[2]:57 , +Potential registers zp[2]:59 [ main::$72 ] : zp[2]:59 , +Potential registers zp[2]:61 [ main::$73 ] : zp[2]:61 , +Potential registers zp[2]:63 [ main::$44 ] : zp[2]:63 , +Potential registers zp[2]:65 [ main::$70 ] : zp[2]:65 , +Potential registers zp[2]:67 [ main::$23 ] : zp[2]:67 , +Potential registers zp[2]:69 [ main::$71 ] : zp[2]:69 , +Potential registers zp[2]:71 [ main::$25 ] : zp[2]:71 , +Potential registers zp[1]:73 [ main::$26 ] : zp[1]:73 , reg byte x , reg byte y , +Potential registers zp[2]:74 [ main::$53 ] : zp[2]:74 , +Potential registers zp[2]:76 [ main::$76 ] : zp[2]:76 , +Potential registers zp[2]:78 [ main::$77 ] : zp[2]:78 , +Potential registers zp[1]:80 [ main::$30 ] : zp[1]:80 , reg byte a , reg byte x , reg byte y , +Potential registers zp[2]:81 [ main::$56 ] : zp[2]:81 , +Potential registers zp[2]:83 [ main::$31 ] : zp[2]:83 , +Potential registers zp[2]:85 [ main::$78 ] : zp[2]:85 , +Potential registers zp[2]:87 [ main::$50 ] : zp[2]:87 , +Potential registers zp[2]:89 [ main::$74 ] : zp[2]:89 , +Potential registers zp[2]:91 [ main::$32 ] : zp[2]:91 , +Potential registers zp[1]:93 [ main::$48 ] : zp[1]:93 , reg byte x , +Potential registers zp[2]:94 [ main::$75 ] : zp[2]:94 , +Potential registers zp[2]:96 [ main::$33 ] : zp[2]:96 , +Potential registers zp[2]:98 [ rand::return#2 ] : zp[2]:98 , +Potential registers zp[2]:100 [ main::$9 ] : zp[2]:100 , +Potential registers zp[2]:102 [ main::$10 ] : zp[2]:102 , +Potential registers zp[2]:104 [ main::$35 ] : zp[2]:104 , +Potential registers zp[2]:106 [ main::$59 ] : zp[2]:106 , +Potential registers zp[2]:108 [ rand::return#3 ] : zp[2]:108 , +Potential registers zp[2]:110 [ main::$11 ] : zp[2]:110 , +Potential registers zp[1]:112 [ main::$12 ] : zp[1]:112 , reg byte x , reg byte y , +Potential registers zp[2]:113 [ main::$36 ] : zp[2]:113 , +Potential registers zp[2]:115 [ main::$60 ] : zp[2]:115 , +Potential registers zp[1]:117 [ ppuDataTransfer::ppuDataPrepare1_$0 ] : zp[1]:117 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:118 [ ppuDataTransfer::ppuDataPrepare1_$1 ] : zp[1]:118 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:119 [ ppuDataTransfer::ppuDataPut1_val#0 ] : zp[1]:119 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:120 [ ppuDataFill::ppuDataPrepare1_$0 ] : zp[1]:120 , reg byte a , reg byte x , reg byte y , +Potential registers zp[1]:121 [ ppuDataFill::ppuDataPrepare1_$1 ] : zp[1]:121 , reg byte a , reg byte x , reg byte y , +Potential registers zp[2]:122 [ rand::$0 ] : zp[2]:122 , +Potential registers zp[2]:124 [ rand_state#0 ] : zp[2]:124 , +Potential registers zp[2]:126 [ rand::$1 ] : zp[2]:126 , +Potential registers zp[2]:128 [ rand_state#1 ] : zp[2]:128 , +Potential registers zp[2]:130 [ rand::$2 ] : zp[2]:130 , +Potential registers zp[2]:132 [ rand::return#0 ] : zp[2]:132 , + +REGISTER UPLIFT SCOPES +Uplift Scope [main] 2,165.43: zp[2]:8 [ main::i#10 main::i#4 ] 2,002: zp[2]:41 [ main::$63 ] 2,002: zp[2]:45 [ main::$65 ] 2,002: zp[2]:51 [ main::$68 ] 2,002: zp[2]:53 [ main::$69 ] 2,002: zp[2]:55 [ main::$20 ] 2,002: zp[2]:61 [ main::$73 ] 2,002: zp[2]:65 [ main::$70 ] 2,002: zp[2]:69 [ main::$71 ] 2,002: zp[2]:78 [ main::$77 ] 2,002: zp[2]:81 [ main::$56 ] 2,002: zp[2]:85 [ main::$78 ] 2,002: zp[2]:89 [ main::$74 ] 2,002: zp[2]:94 [ main::$75 ] 1,501.5: zp[2]:57 [ main::$45 ] 1,063.56: zp[1]:10 [ main::sprite_idx#3 main::sprite_idx#2 ] 1,001: zp[2]:39 [ main::$62 ] 1,001: zp[2]:43 [ main::$64 ] 1,001: zp[2]:49 [ main::$67 ] 1,001: zp[2]:59 [ main::$72 ] 1,001: zp[2]:63 [ main::$44 ] 1,001: zp[1]:73 [ main::$26 ] 1,001: zp[2]:76 [ main::$76 ] 1,001: zp[1]:80 [ main::$30 ] 1,001: zp[2]:83 [ main::$31 ] 1,001: zp[2]:96 [ main::$33 ] 834.17: zp[1]:93 [ main::$48 ] 834.17: zp[2]:35 [ main::$40 ] 667.33: zp[2]:37 [ main::$61 ] 667.33: zp[2]:47 [ main::$66 ] 667.33: zp[2]:71 [ main::$25 ] 572: zp[2]:74 [ main::$53 ] 500.5: zp[2]:67 [ main::$23 ] 500.5: zp[2]:91 [ main::$32 ] 429: zp[2]:87 [ main::$50 ] 265.22: zp[1]:7 [ main::timer#3 main::timer#15 main::timer#21 ] 263.72: zp[1]:2 [ main::initNES1_i#2 main::initNES1_i#1 ] 231.71: zp[2]:3 [ main::i#14 main::i#2 ] 206.52: zp[1]:5 [ main::timer_2#2 main::timer_2#1 ] 202: zp[1]:29 [ main::initNES1_waitForVBlank1_$0 ] 202: zp[1]:30 [ main::initNES1_waitForVBlank2_$0 ] 202: zp[1]:32 [ main::$14 ] 202: zp[2]:100 [ main::$9 ] 202: zp[2]:104 [ main::$35 ] 202: zp[2]:106 [ main::$59 ] 202: zp[2]:110 [ main::$11 ] 202: zp[2]:113 [ main::$36 ] 202: zp[2]:115 [ main::$60 ] 157.41: zp[1]:6 [ main::active_balls#2 main::active_balls#8 main::active_balls#1 ] 151.5: zp[1]:34 [ main::$38 ] 101: zp[1]:33 [ main::timer#1 ] 67.33: zp[2]:102 [ main::$10 ] 67.33: zp[1]:112 [ main::$12 ] 51.69: zp[1]:31 [ main::h_bar#1 ] +Uplift Scope [ppuDataTransfer] 2,602.6: zp[2]:15 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] 2,002: zp[1]:119 [ ppuDataTransfer::ppuDataPut1_val#0 ] 1,979: zp[2]:17 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#6 ppuDataTransfer::cpuSrc#1 ] 202: zp[1]:117 [ ppuDataTransfer::ppuDataPrepare1_$0 ] 202: zp[1]:118 [ ppuDataTransfer::ppuDataPrepare1_$1 ] 67.33: zp[2]:11 [ ppuDataTransfer::ppuDataPrepare1_ppuData#0 ] 0: zp[2]:13 [ ppuDataTransfer::cpuData#2 ] +Uplift Scope [rand] 2,002: zp[2]:122 [ rand::$0 ] 2,002: zp[2]:126 [ rand::$1 ] 2,002: zp[2]:130 [ rand::$2 ] 300.75: zp[2]:132 [ rand::return#0 ] 202: zp[2]:98 [ rand::return#2 ] 202: zp[2]:108 [ rand::return#3 ] +Uplift Scope [] 1,501.5: zp[2]:124 [ rand_state#0 ] 1,501.5: zp[2]:128 [ rand_state#1 ] 1,291.78: zp[2]:25 [ rand_state#10 rand_state#17 rand_state#11 ] 105: zp[1]:27 [ scroll_y ] 8.66: zp[1]:28 [ vblank_hit ] +Uplift Scope [ppuDataFill] 3,003: zp[2]:23 [ ppuDataFill::i#2 ppuDataFill::i#1 ] 202: zp[1]:120 [ ppuDataFill::ppuDataPrepare1_$0 ] 202: zp[1]:121 [ ppuDataFill::ppuDataPrepare1_$1 ] 111.22: zp[2]:21 [ ppuDataFill::size#3 ] 67.33: zp[2]:19 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ] +Uplift Scope [RICOH_2C02] +Uplift Scope [RICOH_2A03] +Uplift Scope [SpriteData] +Uplift Scope [RADIX] +Uplift Scope [printf_format_number] +Uplift Scope [printf_buffer_number] +Uplift Scope [printf_format_string] +Uplift Scope [$0] +Uplift Scope [vblank] +Uplift Scope [__start] + +Uplifting [main] best 105562 combination zp[2]:8 [ main::i#10 main::i#4 ] zp[2]:41 [ main::$63 ] zp[2]:45 [ main::$65 ] zp[2]:51 [ main::$68 ] zp[2]:53 [ main::$69 ] zp[2]:55 [ main::$20 ] zp[2]:61 [ main::$73 ] zp[2]:65 [ main::$70 ] zp[2]:69 [ main::$71 ] zp[2]:78 [ main::$77 ] zp[2]:81 [ main::$56 ] zp[2]:85 [ main::$78 ] zp[2]:89 [ main::$74 ] zp[2]:94 [ main::$75 ] zp[2]:57 [ main::$45 ] zp[1]:10 [ main::sprite_idx#3 main::sprite_idx#2 ] zp[2]:39 [ main::$62 ] zp[2]:43 [ main::$64 ] zp[2]:49 [ main::$67 ] zp[2]:59 [ main::$72 ] zp[2]:63 [ main::$44 ] zp[1]:73 [ main::$26 ] zp[2]:76 [ main::$76 ] reg byte a [ main::$30 ] zp[2]:83 [ main::$31 ] zp[2]:96 [ main::$33 ] reg byte x [ main::$48 ] zp[2]:35 [ main::$40 ] zp[2]:37 [ main::$61 ] zp[2]:47 [ main::$66 ] zp[2]:71 [ main::$25 ] zp[2]:74 [ main::$53 ] zp[2]:67 [ main::$23 ] zp[2]:91 [ main::$32 ] zp[2]:87 [ main::$50 ] zp[1]:7 [ main::timer#3 main::timer#15 main::timer#21 ] zp[1]:2 [ main::initNES1_i#2 main::initNES1_i#1 ] zp[2]:3 [ main::i#14 main::i#2 ] zp[1]:5 [ main::timer_2#2 main::timer_2#1 ] zp[1]:29 [ main::initNES1_waitForVBlank1_$0 ] zp[1]:30 [ main::initNES1_waitForVBlank2_$0 ] zp[1]:32 [ main::$14 ] zp[2]:100 [ main::$9 ] zp[2]:104 [ main::$35 ] zp[2]:106 [ main::$59 ] zp[2]:110 [ main::$11 ] zp[2]:113 [ main::$36 ] zp[2]:115 [ main::$60 ] zp[1]:6 [ main::active_balls#2 main::active_balls#8 main::active_balls#1 ] zp[1]:34 [ main::$38 ] zp[1]:33 [ main::timer#1 ] zp[2]:102 [ main::$10 ] zp[1]:112 [ main::$12 ] zp[1]:31 [ main::h_bar#1 ] +Limited combination testing to 100 combinations of 5308416 possible. +Uplifting [ppuDataTransfer] best 105490 combination zp[2]:15 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] reg byte a [ ppuDataTransfer::ppuDataPut1_val#0 ] zp[2]:17 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#6 ppuDataTransfer::cpuSrc#1 ] reg byte a [ ppuDataTransfer::ppuDataPrepare1_$0 ] reg byte a [ ppuDataTransfer::ppuDataPrepare1_$1 ] zp[2]:11 [ ppuDataTransfer::ppuDataPrepare1_ppuData#0 ] zp[2]:13 [ ppuDataTransfer::cpuData#2 ] +Uplifting [rand] best 105490 combination zp[2]:122 [ rand::$0 ] zp[2]:126 [ rand::$1 ] zp[2]:130 [ rand::$2 ] zp[2]:132 [ rand::return#0 ] zp[2]:98 [ rand::return#2 ] zp[2]:108 [ rand::return#3 ] +Uplifting [] best 105490 combination zp[2]:124 [ rand_state#0 ] zp[2]:128 [ rand_state#1 ] zp[2]:25 [ rand_state#10 rand_state#17 rand_state#11 ] zp[1]:27 [ scroll_y ] zp[1]:28 [ vblank_hit ] +Uplifting [ppuDataFill] best 105478 combination zp[2]:23 [ ppuDataFill::i#2 ppuDataFill::i#1 ] reg byte a [ ppuDataFill::ppuDataPrepare1_$0 ] reg byte a [ ppuDataFill::ppuDataPrepare1_$1 ] zp[2]:21 [ ppuDataFill::size#3 ] zp[2]:19 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ] +Uplifting [RICOH_2C02] best 105478 combination +Uplifting [RICOH_2A03] best 105478 combination +Uplifting [SpriteData] best 105478 combination +Uplifting [RADIX] best 105478 combination +Uplifting [printf_format_number] best 105478 combination +Uplifting [printf_buffer_number] best 105478 combination +Uplifting [printf_format_string] best 105478 combination +Uplifting [$0] best 105478 combination +Uplifting [vblank] best 105478 combination +Uplifting [__start] best 105478 combination +Attempting to uplift remaining variables inzp[1]:10 [ main::sprite_idx#3 main::sprite_idx#2 ] +Uplifting [main] best 105478 combination zp[1]:10 [ main::sprite_idx#3 main::sprite_idx#2 ] +Attempting to uplift remaining variables inzp[1]:73 [ main::$26 ] +Uplifting [main] best 105478 combination zp[1]:73 [ main::$26 ] +Attempting to uplift remaining variables inzp[1]:7 [ main::timer#3 main::timer#15 main::timer#21 ] +Uplifting [main] best 105478 combination zp[1]:7 [ main::timer#3 main::timer#15 main::timer#21 ] +Attempting to uplift remaining variables inzp[1]:2 [ main::initNES1_i#2 main::initNES1_i#1 ] +Uplifting [main] best 105148 combination reg byte x [ main::initNES1_i#2 main::initNES1_i#1 ] +Attempting to uplift remaining variables inzp[1]:5 [ main::timer_2#2 main::timer_2#1 ] +Uplifting [main] best 105148 combination zp[1]:5 [ main::timer_2#2 main::timer_2#1 ] +Attempting to uplift remaining variables inzp[1]:29 [ main::initNES1_waitForVBlank1_$0 ] +Uplifting [main] best 105088 combination reg byte a [ main::initNES1_waitForVBlank1_$0 ] +Attempting to uplift remaining variables inzp[1]:30 [ main::initNES1_waitForVBlank2_$0 ] +Uplifting [main] best 105028 combination reg byte a [ main::initNES1_waitForVBlank2_$0 ] +Attempting to uplift remaining variables inzp[1]:32 [ main::$14 ] +Uplifting [main] best 104968 combination reg byte a [ main::$14 ] +Attempting to uplift remaining variables inzp[1]:6 [ main::active_balls#2 main::active_balls#8 main::active_balls#1 ] +Uplifting [main] best 104968 combination zp[1]:6 [ main::active_balls#2 main::active_balls#8 main::active_balls#1 ] +Attempting to uplift remaining variables inzp[1]:34 [ main::$38 ] +Uplifting [main] best 104898 combination reg byte x [ main::$38 ] +Attempting to uplift remaining variables inzp[1]:27 [ scroll_y ] +Uplifting [] best 104898 combination zp[1]:27 [ scroll_y ] +Attempting to uplift remaining variables inzp[1]:33 [ main::timer#1 ] +Uplifting [main] best 104838 combination reg byte x [ main::timer#1 ] +Attempting to uplift remaining variables inzp[1]:112 [ main::$12 ] +Uplifting [main] best 104818 combination reg byte x [ main::$12 ] +Attempting to uplift remaining variables inzp[1]:31 [ main::h_bar#1 ] +Uplifting [main] best 104818 combination zp[1]:31 [ main::h_bar#1 ] +Attempting to uplift remaining variables inzp[1]:28 [ vblank_hit ] +Uplifting [] best 104818 combination zp[1]:28 [ vblank_hit ] +Coalescing zero page register [ zp[2]:13 [ ppuDataTransfer::cpuData#2 ] ] with [ zp[2]:17 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#6 ppuDataTransfer::cpuSrc#1 ] ] - score: 1 +Coalescing zero page register [ zp[2]:25 [ rand_state#10 rand_state#17 rand_state#11 ] ] with [ zp[2]:124 [ rand_state#0 ] ] - score: 1 +Coalescing zero page register [ zp[2]:25 [ rand_state#10 rand_state#17 rand_state#11 rand_state#0 ] ] with [ zp[2]:128 [ rand_state#1 ] ] - score: 1 +Coalescing zero page register [ zp[2]:35 [ main::$40 ] ] with [ zp[2]:53 [ main::$69 ] ] - score: 1 +Coalescing zero page register [ zp[2]:57 [ main::$45 ] ] with [ zp[2]:61 [ main::$73 ] ] - score: 1 +Coalescing zero page register [ zp[2]:63 [ main::$44 ] ] with [ zp[2]:69 [ main::$71 ] ] - score: 1 +Coalescing zero page register [ zp[2]:65 [ main::$70 ] ] with [ zp[2]:67 [ main::$23 ] ] - score: 1 +Coalescing zero page register [ zp[2]:74 [ main::$53 ] ] with [ zp[2]:85 [ main::$78 ] ] - score: 1 +Coalescing zero page register [ zp[2]:81 [ main::$56 ] ] with [ zp[2]:83 [ main::$31 ] ] - score: 1 +Coalescing zero page register [ zp[2]:87 [ main::$50 ] ] with [ zp[2]:94 [ main::$75 ] ] - score: 1 +Coalescing zero page register [ zp[2]:89 [ main::$74 ] ] with [ zp[2]:91 [ main::$32 ] ] - score: 1 +Coalescing zero page register [ zp[2]:98 [ rand::return#2 ] ] with [ zp[2]:100 [ main::$9 ] ] - score: 1 +Coalescing zero page register [ zp[2]:98 [ rand::return#2 main::$9 ] ] with [ zp[2]:132 [ rand::return#0 ] ] - score: 1 +Coalescing zero page register [ zp[2]:104 [ main::$35 ] ] with [ zp[2]:106 [ main::$59 ] ] - score: 1 +Coalescing zero page register [ zp[2]:108 [ rand::return#3 ] ] with [ zp[2]:110 [ main::$11 ] ] - score: 1 +Coalescing zero page register [ zp[2]:113 [ main::$36 ] ] with [ zp[2]:115 [ main::$60 ] ] - score: 1 +Coalescing zero page register [ zp[2]:35 [ main::$40 main::$69 ] ] with [ zp[2]:55 [ main::$20 ] ] - score: 1 +Coalescing zero page register [ zp[2]:63 [ main::$44 main::$71 ] ] with [ zp[2]:71 [ main::$25 ] ] - score: 1 +Coalescing zero page register [ zp[2]:87 [ main::$50 main::$75 ] ] with [ zp[2]:96 [ main::$33 ] ] - score: 1 +Coalescing zero page register [ zp[2]:98 [ rand::return#2 main::$9 rand::return#0 ] ] with [ zp[2]:102 [ main::$10 ] ] - score: 1 +Coalescing zero page register [ zp[2]:98 [ rand::return#2 main::$9 rand::return#0 main::$10 ] ] with [ zp[2]:108 [ rand::return#3 main::$11 ] ] - score: 1 +Coalescing zero page register [ zp[2]:19 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ] ] with [ zp[2]:11 [ ppuDataTransfer::ppuDataPrepare1_ppuData#0 ] ] +Coalescing zero page register [ zp[2]:21 [ ppuDataFill::size#3 ] ] with [ zp[2]:13 [ ppuDataTransfer::cpuData#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#6 ppuDataTransfer::cpuSrc#1 ] ] +Coalescing zero page register [ zp[2]:23 [ ppuDataFill::i#2 ppuDataFill::i#1 ] ] with [ zp[2]:15 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] ] +Coalescing zero page register [ zp[2]:35 [ main::$40 main::$69 main::$20 ] ] with [ zp[2]:19 [ ppuDataFill::ppuDataPrepare1_ppuData#0 ppuDataTransfer::ppuDataPrepare1_ppuData#0 ] ] +Coalescing zero page register [ zp[2]:37 [ main::$61 ] ] with [ zp[2]:21 [ ppuDataFill::size#3 ppuDataTransfer::cpuData#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#6 ppuDataTransfer::cpuSrc#1 ] ] +Coalescing zero page register [ zp[2]:39 [ main::$62 ] ] with [ zp[2]:23 [ ppuDataFill::i#2 ppuDataFill::i#1 ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] ] +Allocated (was zp[2]:3) zp[2]:2 [ main::i#14 main::i#2 ] +Allocated (was zp[1]:5) zp[1]:4 [ main::timer_2#2 main::timer_2#1 ] +Allocated (was zp[1]:6) zp[1]:5 [ main::active_balls#2 main::active_balls#8 main::active_balls#1 ] +Allocated (was zp[1]:7) zp[1]:6 [ main::timer#3 main::timer#15 main::timer#21 ] +Allocated (was zp[2]:8) zp[2]:7 [ main::i#10 main::i#4 ] +Allocated (was zp[1]:10) zp[1]:9 [ main::sprite_idx#3 main::sprite_idx#2 ] +Allocated (was zp[2]:25) zp[2]:10 [ rand_state#10 rand_state#17 rand_state#11 rand_state#0 rand_state#1 ] +Allocated (was zp[1]:27) zp[1]:12 [ scroll_y ] +Allocated (was zp[1]:28) zp[1]:13 [ vblank_hit ] +Allocated (was zp[1]:31) zp[1]:14 [ main::h_bar#1 ] +Allocated (was zp[2]:35) zp[2]:15 [ main::$40 main::$69 main::$20 ppuDataFill::ppuDataPrepare1_ppuData#0 ppuDataTransfer::ppuDataPrepare1_ppuData#0 ] +Allocated (was zp[2]:37) zp[2]:17 [ main::$61 ppuDataFill::size#3 ppuDataTransfer::cpuData#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#6 ppuDataTransfer::cpuSrc#1 ] +Allocated (was zp[2]:39) zp[2]:19 [ main::$62 ppuDataFill::i#2 ppuDataFill::i#1 ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] +Allocated (was zp[2]:41) zp[2]:21 [ main::$63 ] +Allocated (was zp[2]:43) zp[2]:23 [ main::$64 ] +Allocated (was zp[2]:45) zp[2]:25 [ main::$65 ] +Allocated (was zp[2]:47) zp[2]:27 [ main::$66 ] +Allocated (was zp[2]:49) zp[2]:29 [ main::$67 ] +Allocated (was zp[2]:51) zp[2]:31 [ main::$68 ] +Allocated (was zp[2]:57) zp[2]:33 [ main::$45 main::$73 ] +Allocated (was zp[2]:59) zp[2]:35 [ main::$72 ] +Allocated (was zp[2]:63) zp[2]:37 [ main::$44 main::$71 main::$25 ] +Allocated (was zp[2]:65) zp[2]:39 [ main::$70 main::$23 ] +Allocated (was zp[1]:73) zp[1]:41 [ main::$26 ] +Allocated (was zp[2]:74) zp[2]:42 [ main::$53 main::$78 ] +Allocated (was zp[2]:76) zp[2]:44 [ main::$76 ] +Allocated (was zp[2]:78) zp[2]:46 [ main::$77 ] +Allocated (was zp[2]:81) zp[2]:48 [ main::$56 main::$31 ] +Allocated (was zp[2]:87) zp[2]:50 [ main::$50 main::$75 main::$33 ] +Allocated (was zp[2]:89) zp[2]:52 [ main::$74 main::$32 ] +Allocated (was zp[2]:98) zp[2]:54 [ rand::return#2 main::$9 rand::return#0 main::$10 rand::return#3 main::$11 ] +Allocated (was zp[2]:104) zp[2]:56 [ main::$35 main::$59 ] +Allocated (was zp[2]:113) zp[2]:58 [ main::$36 main::$60 ] +Allocated (was zp[2]:122) zp[2]:60 [ rand::$0 ] +Allocated (was zp[2]:126) zp[2]:62 [ rand::$1 ] +Allocated (was zp[2]:130) zp[2]:64 [ rand::$2 ] + +ASSEMBLER BEFORE OPTIMIZATION + // File Comments +//#pragma emulator("java -jar /Applications/Nintaco_bin_2020-05-01/Nintaco.jar") +// Nintendo Entertainment System (NES +// https://en.wikipedia.org/wiki/Nintendo_Entertainment_System_(Model_NES-101) +// https://github.com/gregkrsak/first_nes +// Ricoh 2C02 - NES Picture Processing Unit (PPU) +// Ricoh RP2C02 (NTSC version) / RP2C07 (PAL version), +// https://en.wikipedia.org/wiki/Picture_Processing_Unit +// https://wiki.nesdev.com/w/index.php/PPU_registers +// http://nesdev.com/2C02%20technical%20reference.TXT +// Based on: https://github.com/gregkrsak/first_nes written by Greg M. Krsak, 2018. + // Upstart + // Nintendo Entertainment System (NES) ROM (Mapper 0 NROM, Vertical Mirroring) +// https://sadistech.com/nesromtool/romdoc.html +// https://forums.nesdev.com/viewtopic.php?f=2&t=9896 +// https://github.com/gregkrsak/first_nes +.file [name="kickballs-3.nes", type="bin", segments="NesRom"] +.file [name="kickballs-3.nes_hdr", type="bin", segments="Header"] +.file [name="kickballs-3.nes_prg", type="bin", segments="ProgramRom"] +.file [name="kickballs-3.nes_chr", type="bin", segments="CharacterRom"] +.segmentdef Header [ start=$0000, min=$0000, max=$000f, fill ] +.segmentdef Tiles [ start=$0000, min=$0000, max=$1fff, fill ] +.segmentdef Code [ start=$c000, min=$c000, max=$fff9 ] +.segmentdef Data [ startAfter="Code", min=$c000, max=$fff9 ] +.segmentdef Vectors [ start=$fffa, min=$fffa, max=$ffff ] +.segmentdef GameRam [start=$200,max=$7ff, virtual] +.segmentdef ProgramRom [ segments="Code, Data, Vectors" ] +.segmentdef CharacterRom [ segments="Tiles" ] +.segmentdef NesRom +.segment NesRom +.segmentout [ segments="Header" ] +.segmentout [ segments="ProgramRom" ] +.segmentout [ segments="CharacterRom" ] +.segment Header +.text @"NES\$1a" +.byte $01 // 1x 16KB ROM (PRG) +.byte $01 // 1x 8KB VROM (CHR) +.byte %00000001 // Mapper nibble 0000 == No mapping (a simple 16KB PRG + 8KB CHR game) + // Mirroring nibble 0001 == Vertical mirroring only +.segment Code + + // Global Constants & labels + .const OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = $10 + .const OFFSET_STRUCT_RICOH_2C02_PPUMASK = 1 + .const OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = 2 + .const OFFSET_STRUCT_RICOH_2C02_OAMADDR = 3 + .const OFFSET_STRUCT_RICOH_2A03_OAMDMA = $14 + .const OFFSET_STRUCT_RICOH_2C02_PPUADDR = 6 + .const OFFSET_STRUCT_RICOH_2C02_PPUDATA = 7 + .const OFFSET_STRUCT_SPRITEDATA_TILE = 1 + .const OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES = 2 + .const OFFSET_STRUCT_SPRITEDATA_X = 3 + .const OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = 5 + .const SIZEOF_BYTE = 1 + // $2000-$23bf $03c0 Name table 0 + .label PPU_NAME_TABLE_0 = $2000 + // $23c0-$23ff $0040 Attribute table 0 + .label PPU_ATTRIBUTE_TABLE_0 = $23c0 + // $3000-$3eff $0f00 Mirrors of $2000-$2eff + // $3f00-$3f1f $0020 Palette RAM indexes + .label PPU_PALETTE = $3f00 + // PPU Status Register for reading in ASM + .label PPU_PPUSTATUS = $2002 + // APU Frame Counter + // generates low-frequency clocks for the channels and an optional 60 Hz interrupt. + // https://wiki.nesdev.com/w/index.php/APU_Frame_Counter + // ------+-----+--------------------------------------------------------------- + // $4017 | W | FR_COUNTER Frame Counter Set mode and interrupt + // ------+-----+--------------------------------------------------------------- + // | 7 | Sequencer mode: 0 selects 4-step sequence, 1 selects 5-step sequence + // | 6 | Interrupt inhibit flag. If set, the frame interrupt flag is cleared, otherwise it is unaffected. + // ------+-----+--------------------------------------------------------------- + // Side effects After 3 or 4 CPU clock cycles*, the timer is reset. + // If the mode flag is set, then both "quarter frame" and "half frame" signals are also generated. + .label FR_COUNTER = $4017 + // Pointer to the start of RAM memory + .label MEMORY = 0 + // NES Picture Processing Unit (PPU) + .label PPU = $2000 + // NES CPU and audion processing unit (APU) + .label APU = $4000 + .label scroll_y = $c + .label vblank_hit = $d + // The random state variable + .label rand_state = $a +.segment Code + // __start +__start: { + jmp __init1 + // __start::__init1 + __init1: + // [1] (volatile byte) scroll_y ← (byte) 0 -- vbuz1=vbuc1 + lda #0 + sta.z scroll_y + // [2] (volatile byte) vblank_hit ← (byte) 0 -- vbuz1=vbuc1 + lda #0 + sta.z vblank_hit + // [3] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1] + __b1_from___init1: + jmp __b1 + // __start::@1 + __b1: + // [4] call main + // [12] phi from __start::@1 to main [phi:__start::@1->main] + main_from___b1: + jsr main + jmp __breturn + // __start::@return + __breturn: + // [5] return + rts +} + // vblank +// NMI Called when the PPU refreshes the screen (also known as the V-Blank period) +vblank: { + // entry interrupt(HARDWARE_STACK) + pha + txa + pha + tya + pha + // [6] *((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 + // [7] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (volatile byte) scroll_y -- _deref_pbuc1=vbuz1 + lda.z scroll_y + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL + jmp ppuSpriteBufferDmaTransfer1 + // vblank::ppuSpriteBufferDmaTransfer1 + ppuSpriteBufferDmaTransfer1: + // [8] *((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 + // [9] *((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 __b1 + // vblank::@1 + __b1: + // [10] (volatile byte) vblank_hit ← ++ (volatile byte) vblank_hit -- vbuz1=_inc_vbuz1 + inc.z vblank_hit + jmp __breturn + // vblank::@return + __breturn: + // [11] return - exit interrupt(HARDWARE_STACK) + pla + tay + pla + tax + pla + rti +} + // main +main: { + .label __9 = $36 + .label __10 = $36 + .label __11 = $36 + .label __20 = $f + .label __23 = $27 + .label __25 = $25 + .label __26 = $29 + .label __31 = $30 + .label __32 = $34 + .label __33 = $32 + .label __35 = $38 + .label __36 = $3a + .label __40 = $f + .label __44 = $25 + .label __45 = $21 + .label __50 = $32 + .label __53 = $2a + .label __56 = $30 + .label i = 2 + .label timer_2 = 4 + .label h_bar = $e + .label active_balls = 5 + .label sprite_idx = 9 + .label i_1 = 7 + .label timer = 6 + .label __59 = $38 + .label __60 = $3a + .label __61 = $11 + .label __62 = $13 + .label __63 = $15 + .label __64 = $17 + .label __65 = $19 + .label __66 = $1b + .label __67 = $1d + .label __68 = $1f + .label __69 = $f + .label __70 = $27 + .label __71 = $25 + .label __72 = $23 + .label __73 = $21 + .label __74 = $34 + .label __75 = $32 + .label __76 = $2c + .label __77 = $2e + .label __78 = $2a + jmp initNES1 + // main::initNES1 + initNES1: + // asm { cld ldx#$ff txs } + cld + ldx #$ff + txs + jmp initNES1_disableVideoOutput1 + // main::initNES1_disableVideoOutput1 + initNES1_disableVideoOutput1: + // [14] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta PPU + // [15] *((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: + // [16] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 -- _deref_pbuc1=vbuc2 + lda #$40 + sta FR_COUNTER + // [17] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ) ← (byte) $40 -- _deref_pbuc1=vbuc2 + lda #$40 + sta APU+OFFSET_STRUCT_RICOH_2A03_DMC_FREQ + jmp initNES1_clearVBlankFlag1 + // main::initNES1_clearVBlankFlag1 + initNES1_clearVBlankFlag1: + // asm { ldaPPU_PPUSTATUS } + lda PPU_PPUSTATUS + // [19] phi from main::initNES1_clearVBlankFlag1 to main::initNES1_waitForVBlank1 [phi:main::initNES1_clearVBlankFlag1->main::initNES1_waitForVBlank1] + initNES1_waitForVBlank1_from_initNES1_clearVBlankFlag1: + jmp initNES1_waitForVBlank1 + // main::initNES1_waitForVBlank1 + initNES1_waitForVBlank1: + jmp initNES1_waitForVBlank1___b1 + // main::initNES1_waitForVBlank1_@1 + initNES1_waitForVBlank1___b1: + // [20] (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 + // [21] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 -- vbuc1_eq_vbuaa_then_la1 + cmp #0 + beq initNES1_waitForVBlank1___b1 + // [22] phi from main::initNES1_waitForVBlank1_@1 to main::initNES1_@1 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1] + initNES1___b1_from_initNES1_waitForVBlank1___b1: + // [22] phi (byte) main::initNES1_i#2 = (byte) 0 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1#0] -- vbuxx=vbuc1 + ldx #0 + jmp initNES1___b1 + // [22] phi from main::initNES1_@1 to main::initNES1_@1 [phi:main::initNES1_@1->main::initNES1_@1] + initNES1___b1_from_initNES1___b1: + // [22] 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: + // [23] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + lda #0 + sta MEMORY,x + // [24] *((const nomodify byte*) MEMORY+(word) $100 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + lda #0 + sta MEMORY+$100,x + // [25] *((const nomodify byte*) MEMORY+(word) $200 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + lda #0 + sta MEMORY+$200,x + // [26] *((const nomodify byte*) MEMORY+(word) $300 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + lda #0 + sta MEMORY+$300,x + // [27] *((const nomodify byte*) MEMORY+(word) $400 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + lda #0 + sta MEMORY+$400,x + // [28] *((const nomodify byte*) MEMORY+(word) $500 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + lda #0 + sta MEMORY+$500,x + // [29] *((const nomodify byte*) MEMORY+(word) $600 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + lda #0 + sta MEMORY+$600,x + // [30] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + lda #0 + sta MEMORY+$700,x + // [31] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 -- vbuxx=_inc_vbuxx + inx + // [32] 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 + // [33] phi from main::initNES1_@1 to main::initNES1_waitForVBlank2 [phi:main::initNES1_@1->main::initNES1_waitForVBlank2] + initNES1_waitForVBlank2_from_initNES1___b1: + jmp initNES1_waitForVBlank2 + // main::initNES1_waitForVBlank2 + initNES1_waitForVBlank2: + jmp initNES1_waitForVBlank2___b1 + // main::initNES1_waitForVBlank2_@1 + initNES1_waitForVBlank2___b1: + // [34] (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 + // [35] if((byte) 0==(byte~) main::initNES1_waitForVBlank2_$0) goto main::initNES1_waitForVBlank2_@1 -- vbuc1_eq_vbuaa_then_la1 + cmp #0 + beq initNES1_waitForVBlank2___b1 + jmp initNES1___b7 + // main::initNES1_@7 + initNES1___b7: + // asm { ldaPPU_PPUSTATUS } + lda PPU_PPUSTATUS + // [37] phi from main::initNES1_@7 to main::@17 [phi:main::initNES1_@7->main::@17] + __b17_from_initNES1___b7: + jmp __b17 + // main::@17 + __b17: + // [38] call ppuDataTransfer + // Transfer the palette + // [134] phi from main::@17 to ppuDataTransfer [phi:main::@17->ppuDataTransfer] + ppuDataTransfer_from___b17: + // [134] phi (nomodify void*) ppuDataTransfer::cpuData#2 = (void*)(const to_nomodify byte*) palette [phi:main::@17->ppuDataTransfer#0] -- pvoz1=pvoc1 + lda #palette + sta.z ppuDataTransfer.cpuData+1 + // [134] phi (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_PALETTE [phi:main::@17->ppuDataTransfer#1] -- pvoz1=pvoc1 + lda #PPU_PALETTE + sta.z ppuDataTransfer.ppuDataPrepare1_ppuData+1 + jsr ppuDataTransfer + // [39] phi from main::@17 to main::@19 [phi:main::@17->main::@19] + __b19_from___b17: + jmp __b19 + // main::@19 + __b19: + // [40] call ppuDataFill + // Fill the PPU attribute table + // [147] phi from main::@19 to ppuDataFill [phi:main::@19->ppuDataFill] + ppuDataFill_from___b19: + // [147] phi (word) ppuDataFill::size#3 = (word)(number) $20*(number) $1e [phi:main::@19->ppuDataFill#0] -- vwuz1=vwuc1 + lda #<$20*$1e + sta.z ppuDataFill.size + lda #>$20*$1e + sta.z ppuDataFill.size+1 + // [147] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0 [phi:main::@19->ppuDataFill#1] -- pvoz1=pvoc1 + lda #PPU_NAME_TABLE_0 + sta.z ppuDataFill.ppuDataPrepare1_ppuData+1 + jsr ppuDataFill + // [41] phi from main::@19 to main::@20 [phi:main::@19->main::@20] + __b20_from___b19: + jmp __b20 + // main::@20 + __b20: + // [42] call ppuDataFill + // [147] phi from main::@20 to ppuDataFill [phi:main::@20->ppuDataFill] + ppuDataFill_from___b20: + // [147] phi (word) ppuDataFill::size#3 = (byte) $40 [phi:main::@20->ppuDataFill#0] -- vwuz1=vbuc1 + lda #<$40 + sta.z ppuDataFill.size + lda #>$40 + sta.z ppuDataFill.size+1 + // [147] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 [phi:main::@20->ppuDataFill#1] -- pvoz1=pvoc1 + lda #PPU_ATTRIBUTE_TABLE_0 + sta.z ppuDataFill.ppuDataPrepare1_ppuData+1 + jsr ppuDataFill + // [43] phi from main::@20 to main::@21 [phi:main::@20->main::@21] + __b21_from___b20: + jmp __b21 + // main::@21 + __b21: + // [44] call ppuDataTransfer + // [134] phi from main::@21 to ppuDataTransfer [phi:main::@21->ppuDataTransfer] + ppuDataTransfer_from___b21: + // [134] phi (nomodify void*) ppuDataTransfer::cpuData#2 = (void*)(const to_nomodify byte*) h_bar_tilemap [phi:main::@21->ppuDataTransfer#0] -- pvoz1=pvoc1 + lda #h_bar_tilemap + sta.z ppuDataTransfer.cpuData+1 + // [134] phi (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 = (void*) 8256 [phi:main::@21->ppuDataTransfer#1] -- pvoz1=pvoc1 + lda #<$2040 + sta.z ppuDataTransfer.ppuDataPrepare1_ppuData + lda #>$2040 + sta.z ppuDataTransfer.ppuDataPrepare1_ppuData+1 + jsr ppuDataTransfer + jmp enableVideoOutput1 + // main::enableVideoOutput1 + enableVideoOutput1: + // [45] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 -- _deref_pbuc1=vbuc2 + lda #$80 + sta PPU + // [46] *((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 + jmp __b18 + // main::@18 + __b18: + // [47] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $88 -- _deref_pbuc1=vbuc2 + // Enable vertical blank interrupt, select sprite pattern table 1 + lda #$88 + sta PPU + // [48] phi from main::@18 to main::@1 [phi:main::@18->main::@1] + __b1_from___b18: + // [48] phi (word) rand_state#17 = (word) 1 [phi:main::@18->main::@1#0] -- vwuz1=vwuc1 + lda #<1 + sta.z rand_state + lda #>1 + sta.z rand_state+1 + // [48] phi (word) main::i#14 = (byte) 0 [phi:main::@18->main::@1#1] -- vwuz1=vbuc1 + lda #<0 + sta.z i + lda #>0 + sta.z i+1 + jmp __b1 + // main::@1 + __b1: + // [49] if((word) main::i#14<(byte) $32) goto main::@2 -- vwuz1_lt_vbuc1_then_la1 + lda.z i+1 + bne !+ + lda.z i + cmp #$32 + bcc __b2_from___b1 + !: + // [50] phi from main::@1 to main::@3 [phi:main::@1->main::@3] + __b3_from___b1: + // [50] phi (byte) main::timer#3 = (byte) 0 [phi:main::@1->main::@3#0] -- vbuz1=vbuc1 + lda #0 + sta.z timer + // [50] phi (byte) main::active_balls#2 = (byte) 0 [phi:main::@1->main::@3#1] -- vbuz1=vbuc1 + lda #0 + sta.z active_balls + // [50] phi (byte) main::timer_2#2 = (byte) 0 [phi:main::@1->main::@3#2] -- vbuz1=vbuc1 + lda #0 + sta.z timer_2 + jmp __b3 + // main::@3 + __b3: + jmp __b4 + // main::@4 + __b4: + // [51] (byte) main::timer_2#1 ← ++ (byte) main::timer_2#2 -- vbuz1=_inc_vbuz1 + inc.z timer_2 + // [52] (byte) main::h_bar#1 ← *((const to_nomodify byte*) sine_table + (byte) main::timer_2#1) + (byte) $60 -- vbuz1=pbuc1_derefidx_vbuz2_plus_vbuc2 + lda #$60 + ldy.z timer_2 + clc + adc sine_table,y + sta.z h_bar + // [53] (byte~) main::$14 ← (byte) main::h_bar#1 ^ (byte) $ff -- vbuaa=vbuz1_bxor_vbuc1 + lda #$ff + eor.z h_bar + // [54] (volatile byte) scroll_y ← (byte~) main::$14 -- vbuz1=vbuaa + sta.z scroll_y + // [55] if((byte) main::active_balls#2>=(byte) $32) goto main::@5 -- vbuz1_ge_vbuc1_then_la1 + lda.z active_balls + cmp #$32 + bcs __b5_from___b4 + jmp __b15 + // main::@15 + __b15: + // [56] (byte) main::timer#1 ← ++ (byte) main::timer#3 -- vbuxx=_inc_vbuz1 + ldx.z timer + inx + // [57] if((byte) main::timer#3!=(byte) 9) goto main::@25 -- vbuz1_neq_vbuc1_then_la1 + lda #9 + cmp.z timer + bne __b25 + jmp __b16 + // main::@16 + __b16: + // [58] (byte) main::active_balls#1 ← ++ (byte) main::active_balls#2 -- vbuz1=_inc_vbuz1 + inc.z active_balls + // [59] (byte~) main::$38 ← (byte) main::active_balls#1 << (byte) 3 -- vbuxx=vbuz1_rol_3 + lda.z active_balls + asl + asl + asl + tax + // [60] *((word*)(const struct $0*) balls + (byte~) main::$38) ← (byte) 0 -- pwuc1_derefidx_vbuxx=vbuc2 + lda #0 + sta balls,x + lda #0 + sta balls+1,x + // [61] *((word*)(const struct $0*) balls+(byte) 2 + (byte~) main::$38) ← (byte) 0 -- pwuc1_derefidx_vbuxx=vbuc2 + lda #0 + sta balls+2,x + lda #0 + sta balls+2+1,x + // [62] phi from main::@16 to main::@5 [phi:main::@16->main::@5] + __b5_from___b16: + // [62] phi (byte) main::timer#15 = (byte) 0 [phi:main::@16->main::@5#0] -- vbuz1=vbuc1 + lda #0 + sta.z timer + // [62] phi (byte) main::active_balls#8 = (byte) main::active_balls#1 [phi:main::@16->main::@5#1] -- register_copy + jmp __b5 + // [62] phi from main::@25 main::@4 to main::@5 [phi:main::@25/main::@4->main::@5] + __b5_from___b25: + __b5_from___b4: + // [62] phi (byte) main::timer#15 = (byte) main::timer#21 [phi:main::@25/main::@4->main::@5#0] -- register_copy + // [62] phi (byte) main::active_balls#8 = (byte) main::active_balls#2 [phi:main::@25/main::@4->main::@5#1] -- register_copy + jmp __b5 + // main::@5 + __b5: + // [63] phi from main::@5 to main::@6 [phi:main::@5->main::@6] + __b6_from___b5: + // [63] phi (byte) main::sprite_idx#3 = (byte) 0 [phi:main::@5->main::@6#0] -- vbuz1=vbuc1 + lda #0 + sta.z sprite_idx + // [63] phi (word) main::i#10 = (byte) 0 [phi:main::@5->main::@6#1] -- vwuz1=vbuc1 + lda #<0 + sta.z i_1 + lda #>0 + sta.z i_1+1 + jmp __b6 + // main::@6 + __b6: + // [64] if((word) main::i#10<(byte) main::active_balls#8) goto main::@7 -- vwuz1_lt_vbuz2_then_la1 + lda.z i_1+1 + bne !+ + lda.z i_1 + cmp.z active_balls + bcc __b7 + !: + jmp __b8 + // main::@8 + __b8: + // [65] *((byte*) 8193) ← (byte) $98 -- _deref_pbuc1=vbuc2 + lda #$98 + sta $2001 + jmp __b13 + // main::@13 + __b13: + // [66] if((byte) 0==(volatile byte) vblank_hit) goto main::@13 -- vbuc1_eq_vbuz1_then_la1 + lda #0 + cmp.z vblank_hit + beq __b13 + jmp __b14 + // main::@14 + __b14: + // [67] (volatile byte) vblank_hit ← (byte) 0 -- vbuz1=vbuc1 + // wait for vblank + lda #0 + sta.z vblank_hit + // [68] *((byte*) 8193) ← (byte) $18 -- _deref_pbuc1=vbuc2 + lda #$18 + sta $2001 + // [50] phi from main::@14 to main::@3 [phi:main::@14->main::@3] + __b3_from___b14: + // [50] phi (byte) main::timer#3 = (byte) main::timer#15 [phi:main::@14->main::@3#0] -- register_copy + // [50] phi (byte) main::active_balls#2 = (byte) main::active_balls#8 [phi:main::@14->main::@3#1] -- register_copy + // [50] phi (byte) main::timer_2#2 = (byte) main::timer_2#1 [phi:main::@14->main::@3#2] -- register_copy + jmp __b3 + // main::@7 + __b7: + // [69] (word~) main::$40 ← (word) main::i#10 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i_1 + asl + sta.z __40 + lda.z i_1+1 + rol + sta.z __40+1 + asl.z __40 + rol.z __40+1 + asl.z __40 + rol.z __40+1 + // [70] (word*~) main::$61 ← (word*)(const struct $0*) balls + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls + sta.z __61+1 + // [71] (word*~) main::$62 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+4 + sta.z __62+1 + // [72] (word*~) main::$63 ← (word*)(const struct $0*) balls + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls + sta.z __63+1 + // [73] *((word*~) main::$63) ← *((word*~) main::$61) + *((word*~) main::$62) -- _deref_pwuz1=_deref_pwuz2_plus__deref_pwuz3 + ldy #0 + lda (__61),y + clc + adc (__62),y + sta (__63),y + iny + lda (__61),y + adc (__62),y + sta (__63),y + // [74] (word*~) main::$64 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+6 + sta.z __64+1 + // [75] (word*~) main::$65 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+6 + sta.z __65+1 + // [76] *((word*~) main::$65) ← *((word*~) main::$64) + (byte) $10 -- _deref_pwuz1=_deref_pwuz2_plus_vwuc1 + ldy #0 + lda (__64),y + clc + adc #<$10 + sta (__65),y + iny + lda (__64),y + adc #>$10 + sta (__65),y + // [77] (word*~) main::$66 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+2 + sta.z __66+1 + // [78] (word*~) main::$67 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+6 + sta.z __67+1 + // [79] (word*~) main::$68 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+2 + sta.z __68+1 + // [80] *((word*~) main::$68) ← *((word*~) main::$66) + *((word*~) main::$67) -- _deref_pwuz1=_deref_pwuz2_plus__deref_pwuz3 + ldy #0 + lda (__66),y + clc + adc (__67),y + sta (__68),y + iny + lda (__66),y + adc (__67),y + sta (__68),y + // [81] (word*~) main::$69 ← (word*)(const struct $0*) balls + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz1 + clc + lda.z __69 + adc #balls + sta.z __69+1 + // [82] (word~) main::$20 ← *((word*~) main::$69) >> (byte) 8 -- vwuz1=_deref_pwuz1_ror_8 + ldy #1 + lda (__20),y + sta.z __20 + dey + sty.z __20+1 + // [83] if((word~) main::$20>=(byte) 8) goto main::@9 -- vwuz1_ge_vbuc1_then_la1 + lda.z __20+1 + bne __b9 + lda.z __20 + cmp #8 + bcs __b9 + !: + jmp __b11 + // main::@11 + __b11: + // [84] (word~) main::$45 ← (word) main::i#10 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i_1 + asl + sta.z __45 + lda.z i_1+1 + rol + sta.z __45+1 + asl.z __45 + rol.z __45+1 + asl.z __45 + rol.z __45+1 + // [85] (word*~) main::$72 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$45 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __45 + clc + adc #balls+4 + sta.z __72+1 + // [86] (word*~) main::$73 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$45 -- pwuz1=pwuc1_plus_vwuz1 + clc + lda.z __73 + adc #balls+4 + sta.z __73+1 + // [87] *((word*~) main::$73) ← *((word*~) main::$72) ^ (word) $ffff -- _deref_pwuz1=_deref_pwuz2_bxor_vwuc1 + ldy #0 + lda #<$ffff + eor (__72),y + sta (__73),y + iny + lda #>$ffff + eor (__72),y + sta (__73),y + jmp __b9 + // main::@9 + __b9: + // [88] (word~) main::$44 ← (word) main::i#10 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i_1 + asl + sta.z __44 + lda.z i_1+1 + rol + sta.z __44+1 + asl.z __44 + rol.z __44+1 + asl.z __44 + rol.z __44+1 + // [89] (word*~) main::$70 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$44 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __44 + clc + adc #balls+2 + sta.z __70+1 + // [90] (word~) main::$23 ← *((word*~) main::$70) >> (byte) 8 -- vwuz1=_deref_pwuz1_ror_8 + ldy #1 + lda (__23),y + sta.z __23 + dey + sty.z __23+1 + // [91] (word*~) main::$71 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$44 -- pwuz1=pwuc1_plus_vwuz1 + clc + lda.z __71 + adc #balls+2 + sta.z __71+1 + // [92] (word~) main::$25 ← *((word*~) main::$71) >> (byte) 8 -- vwuz1=_deref_pwuz1_ror_8 + ldy #1 + lda (__25),y + sta.z __25 + dey + sty.z __25+1 + // [93] (byte~) main::$26 ← (byte) main::h_bar#1 + (byte) 8 -- vbuz1=vbuz2_plus_vbuc1 + lax.z h_bar + axs #-[8] + stx.z __26 + // [94] if((word~) main::$23<(byte) main::h_bar#1) goto main::@10 -- vwuz1_lt_vbuz2_then_la1 + lda.z __23+1 + bne !+ + lda.z __23 + cmp.z h_bar + bcc __b10 + !: + jmp __b24 + // main::@24 + __b24: + // [95] if((word~) main::$25>=(byte~) main::$26) goto main::@10 -- vwuz1_ge_vbuz2_then_la1 + lda.z __25+1 + bne __b10 + lda.z __25 + cmp.z __26 + bcs __b10 + !: + jmp __b12 + // main::@12 + __b12: + // [96] (word~) main::$53 ← (word) main::i#10 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i_1 + asl + sta.z __53 + lda.z i_1+1 + rol + sta.z __53+1 + asl.z __53 + rol.z __53+1 + asl.z __53 + rol.z __53+1 + // [97] (word*~) main::$76 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$53 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __53 + clc + adc #balls+6 + sta.z __76+1 + // [98] (word*~) main::$77 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$53 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __53 + clc + adc #balls+6 + sta.z __77+1 + // [99] *((word*~) main::$77) ← *((word*~) main::$76) ^ (word) $ffff -- _deref_pwuz1=_deref_pwuz2_bxor_vwuc1 + ldy #0 + lda #<$ffff + eor (__76),y + sta (__77),y + iny + lda #>$ffff + eor (__76),y + sta (__77),y + // [100] (byte~) main::$30 ← (byte) main::h_bar#1 - (byte) 2 -- vbuaa=vbuz1_minus_2 + lda.z h_bar + sec + sbc #2 + // [101] (word~) main::$56 ← (word)(byte~) main::$30 -- vwuz1=_word_vbuaa + sta.z __56 + lda #0 + sta.z __56+1 + // [102] (word~) main::$31 ← (word~) main::$56 << (byte) 8 -- vwuz1=vwuz1_rol_8 + lda.z __31 + sta.z __31+1 + lda #0 + sta.z __31 + // [103] (word*~) main::$78 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$53 -- pwuz1=pwuc1_plus_vwuz1 + clc + lda.z __78 + adc #balls+2 + sta.z __78+1 + // [104] *((word*~) main::$78) ← (word~) main::$31 -- _deref_pwuz1=vwuz2 + ldy #0 + lda.z __31 + sta (__78),y + iny + lda.z __31+1 + sta (__78),y + jmp __b10 + // main::@10 + __b10: + // [105] (word~) main::$50 ← (word) main::i#10 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i_1 + asl + sta.z __50 + lda.z i_1+1 + rol + sta.z __50+1 + asl.z __50 + rol.z __50+1 + asl.z __50 + rol.z __50+1 + // [106] (word*~) main::$74 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$50 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __50 + clc + adc #balls+2 + sta.z __74+1 + // [107] (word~) main::$32 ← *((word*~) main::$74) >> (byte) 8 -- vwuz1=_deref_pwuz1_ror_8 + ldy #1 + lda (__32),y + sta.z __32 + dey + sty.z __32+1 + // [108] (byte~) main::$48 ← (byte) main::sprite_idx#3 << (byte) 2 -- vbuxx=vbuz1_rol_2 + lda.z sprite_idx + asl + asl + tax + // [109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$48) ← (byte)(word~) main::$32 -- pbuc1_derefidx_vbuxx=_byte_vwuz1 + lda.z __32 + sta SPRITE_BUFFER,x + // [110] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$48) ← (byte) $a -- pbuc1_derefidx_vbuxx=vbuc2 + lda #$a + sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_TILE,x + // [111] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$48) ← (byte) 3 -- pbuc1_derefidx_vbuxx=vbuc2 + lda #3 + sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES,x + // [112] (word*~) main::$75 ← (word*)(const struct $0*) balls + (word~) main::$50 -- pwuz1=pwuc1_plus_vwuz1 + clc + lda.z __75 + adc #balls + sta.z __75+1 + // [113] (word~) main::$33 ← *((word*~) main::$75) >> (byte) 8 -- vwuz1=_deref_pwuz1_ror_8 + ldy #1 + lda (__33),y + sta.z __33 + dey + sty.z __33+1 + // [114] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$48) ← (byte)(word~) main::$33 -- pbuc1_derefidx_vbuxx=_byte_vwuz1 + lda.z __33 + sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X,x + // [115] (byte) main::sprite_idx#2 ← ++ (byte) main::sprite_idx#3 -- vbuz1=_inc_vbuz1 + inc.z sprite_idx + // [116] (word) main::i#4 ← ++ (word) main::i#10 -- vwuz1=_inc_vwuz1 + inc.z i_1 + bne !+ + inc.z i_1+1 + !: + // [63] phi from main::@10 to main::@6 [phi:main::@10->main::@6] + __b6_from___b10: + // [63] phi (byte) main::sprite_idx#3 = (byte) main::sprite_idx#2 [phi:main::@10->main::@6#0] -- register_copy + // [63] phi (word) main::i#10 = (word) main::i#4 [phi:main::@10->main::@6#1] -- register_copy + jmp __b6 + // main::@25 + __b25: + // [117] (byte) main::timer#21 ← (byte) main::timer#1 -- vbuz1=vbuxx + stx.z timer + jmp __b5_from___b25 + // [118] phi from main::@1 to main::@2 [phi:main::@1->main::@2] + __b2_from___b1: + jmp __b2 + // main::@2 + __b2: + // [119] call rand + // [157] phi from main::@2 to rand [phi:main::@2->rand] + rand_from___b2: + // [157] phi (word) rand_state#10 = (word) rand_state#17 [phi:main::@2->rand#0] -- register_copy + jsr rand + // [120] (word) rand::return#2 ← (word) rand::return#0 + jmp __b22 + // main::@22 + __b22: + // [121] (word~) main::$9 ← (word) rand::return#2 + // [122] (word~) main::$10 ← (word~) main::$9 & (word) $3ff -- vwuz1=vwuz1_band_vwuc1 + lda.z __10 + and #<$3ff + sta.z __10 + lda.z __10+1 + and #>$3ff + sta.z __10+1 + // [123] (word~) main::$35 ← (word) main::i#14 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i + asl + sta.z __35 + lda.z i+1 + rol + sta.z __35+1 + asl.z __35 + rol.z __35+1 + asl.z __35 + rol.z __35+1 + // [124] (word*~) main::$59 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$35 -- pwuz1=pwuc1_plus_vwuz1 + clc + lda.z __59 + adc #balls+4 + sta.z __59+1 + // [125] *((word*~) main::$59) ← (word~) main::$10 -- _deref_pwuz1=vwuz2 + ldy #0 + lda.z __10 + sta (__59),y + iny + lda.z __10+1 + sta (__59),y + // [126] call rand + // [157] phi from main::@22 to rand [phi:main::@22->rand] + rand_from___b22: + // [157] phi (word) rand_state#10 = (word) rand_state#11 [phi:main::@22->rand#0] -- register_copy + jsr rand + // [127] (word) rand::return#3 ← (word) rand::return#0 + jmp __b23 + // main::@23 + __b23: + // [128] (word~) main::$11 ← (word) rand::return#3 + // [129] (byte~) main::$12 ← (word~) main::$11 & (byte) $ff -- vbuxx=vwuz1_band_vbuc1 + lda #$ff + and.z __11 + tax + // [130] (word~) main::$36 ← (word) main::i#14 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i + asl + sta.z __36 + lda.z i+1 + rol + sta.z __36+1 + asl.z __36 + rol.z __36+1 + asl.z __36 + rol.z __36+1 + // [131] (word*~) main::$60 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$36 -- pwuz1=pwuc1_plus_vwuz1 + clc + lda.z __60 + adc #balls+6 + sta.z __60+1 + // [132] *((word*~) main::$60) ← (byte~) main::$12 -- _deref_pwuz1=vbuxx + txa + ldy #0 + sta (__60),y + tya + iny + sta (__60),y + // [133] (word) main::i#2 ← ++ (word) main::i#14 -- vwuz1=_inc_vwuz1 + inc.z i + bne !+ + inc.z i+1 + !: + // [48] phi from main::@23 to main::@1 [phi:main::@23->main::@1] + __b1_from___b23: + // [48] phi (word) rand_state#17 = (word) rand_state#11 [phi:main::@23->main::@1#0] -- register_copy + // [48] phi (word) main::i#14 = (word) main::i#2 [phi:main::@23->main::@1#1] -- register_copy + jmp __b1 +} + // ppuDataTransfer +// Transfer a number of bytes from the CPU memory to the PPU memory +// - ppuData : Pointer in the PPU memory +// - cpuData : Pointer to the CPU memory (RAM of ROM) +// - size : The number of bytes to transfer +// ppuDataTransfer(void* zp($11) cpuData) +ppuDataTransfer: { + .label ppuDataPrepare1_ppuData = $f + .label cpuSrc = $11 + .label i = $13 + .label cpuData = $11 + jmp ppuDataPrepare1 + // ppuDataTransfer::ppuDataPrepare1 + ppuDataPrepare1: + // [135] (byte~) ppuDataTransfer::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 -- vbuaa=_hi_pvoz1 + lda.z ppuDataPrepare1_ppuData+1 + // [136] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$0 -- _deref_pbuc1=vbuaa + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR + // [137] (byte~) ppuDataTransfer::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 -- vbuaa=_lo_pvoz1 + lda.z ppuDataPrepare1_ppuData + // [138] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$1 -- _deref_pbuc1=vbuaa + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR + jmp __b3 + // ppuDataTransfer::@3 + __b3: + // [139] (byte*) ppuDataTransfer::cpuSrc#6 ← (byte*)(nomodify void*) ppuDataTransfer::cpuData#2 + // [140] phi from ppuDataTransfer::@3 to ppuDataTransfer::@1 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1] + __b1_from___b3: + // [140] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*) ppuDataTransfer::cpuSrc#6 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#0] -- register_copy + // [140] phi (word) ppuDataTransfer::i#2 = (word) 0 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#1] -- vwuz1=vwuc1 + lda #<0 + sta.z i + lda #>0 + sta.z i+1 + jmp __b1 + // ppuDataTransfer::@1 + __b1: + // [141] if((word) ppuDataTransfer::i#2<(byte) $20*(const byte) SIZEOF_BYTE) goto ppuDataTransfer::@2 -- vwuz1_lt_vbuc1_then_la1 + lda.z i+1 + bne !+ + lda.z i + cmp #$20*SIZEOF_BYTE + bcc __b2 + !: + jmp __breturn + // ppuDataTransfer::@return + __breturn: + // [142] return + rts + // ppuDataTransfer::@2 + __b2: + // [143] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2) -- vbuaa=_deref_pbuz1 + ldy #0 + lda (cpuSrc),y + jmp ppuDataPut1 + // ppuDataTransfer::ppuDataPut1 + ppuDataPut1: + // [144] *((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 __b4 + // ppuDataTransfer::@4 + __b4: + // [145] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2 -- pbuz1=_inc_pbuz1 + inc.z cpuSrc + bne !+ + inc.z cpuSrc+1 + !: + // [146] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2 -- vwuz1=_inc_vwuz1 + inc.z i + bne !+ + inc.z i+1 + !: + // [140] phi from ppuDataTransfer::@4 to ppuDataTransfer::@1 [phi:ppuDataTransfer::@4->ppuDataTransfer::@1] + __b1_from___b4: + // [140] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*) ppuDataTransfer::cpuSrc#1 [phi:ppuDataTransfer::@4->ppuDataTransfer::@1#0] -- register_copy + // [140] phi (word) ppuDataTransfer::i#2 = (word) ppuDataTransfer::i#1 [phi:ppuDataTransfer::@4->ppuDataTransfer::@1#1] -- register_copy + jmp __b1 +} + // ppuDataFill +// Fill a number of bytes in the PPU memory +// - ppuData : Pointer in the PPU memory +// - size : The number of bytes to transfer +// ppuDataFill(word zp($11) size) +ppuDataFill: { + .label ppuDataPrepare1_ppuData = $f + .label i = $13 + .label size = $11 + jmp ppuDataPrepare1 + // ppuDataFill::ppuDataPrepare1 + ppuDataPrepare1: + // [148] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuaa=_hi_pvoz1 + lda.z ppuDataPrepare1_ppuData+1 + // [149] *((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 + // [150] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuaa=_lo_pvoz1 + lda.z ppuDataPrepare1_ppuData + // [151] *((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 + // [152] phi from ppuDataFill::ppuDataPrepare1 to ppuDataFill::@1 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1] + __b1_from_ppuDataPrepare1: + // [152] phi (word) ppuDataFill::i#2 = (word) 0 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1#0] -- vwuz1=vwuc1 + lda #<0 + sta.z i + lda #>0 + sta.z i+1 + jmp __b1 + // Transfer to PPU + // ppuDataFill::@1 + __b1: + // [153] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1 -- vwuz1_lt_vwuz2_then_la1 + lda.z i+1 + cmp.z size+1 + bcc ppuDataPut1 + bne !+ + lda.z i + cmp.z size + bcc ppuDataPut1 + !: + jmp __breturn + // ppuDataFill::@return + __breturn: + // [154] return + rts + // ppuDataFill::ppuDataPut1 + ppuDataPut1: + // [155] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA + jmp __b2 + // ppuDataFill::@2 + __b2: + // [156] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2 -- vwuz1=_inc_vwuz1 + inc.z i + bne !+ + inc.z i+1 + !: + // [152] phi from ppuDataFill::@2 to ppuDataFill::@1 [phi:ppuDataFill::@2->ppuDataFill::@1] + __b1_from___b2: + // [152] phi (word) ppuDataFill::i#2 = (word) ppuDataFill::i#1 [phi:ppuDataFill::@2->ppuDataFill::@1#0] -- register_copy + jmp __b1 +} + // rand +// Returns a pseudo-random number in the range of 0 to RAND_MAX (65535) +// Uses an xorshift pseudorandom number generator that hits all different values +// Information https://en.wikipedia.org/wiki/Xorshift +// Source http://www.retroprogramming.com/2017/07/xorshift-pseudorandom-numbers-in-z80.html +rand: { + .label __0 = $3c + .label __1 = $3e + .label __2 = $40 + .label return = $36 + // [158] (word~) rand::$0 ← (word) rand_state#10 << (byte) 7 -- vwuz1=vwuz2_rol_7 + lda.z rand_state+1 + lsr + lda.z rand_state + ror + sta.z __0+1 + lda #0 + ror + sta.z __0 + // [159] (word) rand_state#0 ← (word) rand_state#10 ^ (word~) rand::$0 -- vwuz1=vwuz1_bxor_vwuz2 + lda.z rand_state + eor.z __0 + sta.z rand_state + lda.z rand_state+1 + eor.z __0+1 + sta.z rand_state+1 + // [160] (word~) rand::$1 ← (word) rand_state#0 >> (byte) 9 -- vwuz1=vwuz2_ror_9 + lda.z rand_state+1 + lsr + sta.z __1 + lda #0 + sta.z __1+1 + // [161] (word) rand_state#1 ← (word) rand_state#0 ^ (word~) rand::$1 -- vwuz1=vwuz1_bxor_vwuz2 + lda.z rand_state + eor.z __1 + sta.z rand_state + lda.z rand_state+1 + eor.z __1+1 + sta.z rand_state+1 + // [162] (word~) rand::$2 ← (word) rand_state#1 << (byte) 8 -- vwuz1=vwuz2_rol_8 + lda.z rand_state + sta.z __2+1 + lda #0 + sta.z __2 + // [163] (word) rand_state#11 ← (word) rand_state#1 ^ (word~) rand::$2 -- vwuz1=vwuz1_bxor_vwuz2 + lda.z rand_state + eor.z __2 + sta.z rand_state + lda.z rand_state+1 + eor.z __2+1 + sta.z rand_state+1 + // [164] (word) rand::return#0 ← (word) rand_state#11 -- vwuz1=vwuz2 + lda.z rand_state + sta.z return + lda.z rand_state+1 + sta.z return+1 + jmp __breturn + // rand::@return + __breturn: + // [165] return + rts +} + // File Data +.segment GameRam + // Moving balls (in GameRAM) + balls: .fill 8*$40, 0 +.segment Data + sine_table: .byte $40, $42, $43, $45, $46, $48, $49, $4b, $4c, $4e, $50, $51, $53, $54, $56, $57, $58, $5a, $5b, $5d, $5e, $60, $61, $62, $64, $65, $66, $67, $69, $6a, $6b, $6c, $6d, $6e, $6f, $70, $71, $72, $73, $74, $75, $76, $77, $78, $78, $79, $7a, $7b, $7b, $7c, $7c, $7d, $7d, $7e, $7e, $7e, $7f, $7f, $7f, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $7f, $7f, $7f, $7e, $7e, $7e, $7d, $7d, $7c, $7c, $7b, $7b, $7a, $79, $78, $78, $77, $76, $75, $74, $73, $72, $71, $70, $6f, $6e, $6d, $6c, $6b, $6a, $69, $67, $66, $65, $64, $62, $61, $60, $5e, $5d, $5b, $5a, $58, $57, $56, $54, $53, $51, $50, $4e, $4c, $4b, $49, $48, $46, $45, $43, $42, $40, $3e, $3d, $3b, $3a, $38, $37, $35, $34, $32, $30, $2f, $2d, $2c, $2a, $29, $28, $26, $25, $23, $22, $20, $1f, $1e, $1c, $1b, $1a, $19, $17, $16, $15, $14, $13, $12, $11, $10, $f, $e, $d, $c, $b, $a, 9, 8, 8, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, $a, $b, $c, $d, $e, $f, $10, $11, $12, $13, $14, $15, $16, $17, $19, $1a, $1b, $1c, $1e, $1f, $20, $22, $23, $25, $26, $28, $29, $2a, $2c, $2d, $2f, $30, $32, $34, $35, $37, $38, $3a, $3b, $3d, $3e + palette: .byte $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4 + h_bar_tilemap: .byte 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +.segment Tiles +TILES: +.import binary "lazydata.chr" + +.segment GameRam + .align $100 + SPRITE_BUFFER: .fill 4*$100, 0 +.segment Vectors + VECTORS: .word vblank, main, 0 + +ASSEMBLER OPTIMIZATIONS +Removing instruction jmp __init1 +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Removing instruction jmp ppuSpriteBufferDmaTransfer1 +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Removing instruction jmp initNES1 +Removing instruction jmp initNES1_disableVideoOutput1 +Removing instruction jmp initNES1_disableAudioOutput1 +Removing instruction jmp initNES1_clearVBlankFlag1 +Removing instruction jmp initNES1_waitForVBlank1 +Removing instruction jmp initNES1_waitForVBlank1___b1 +Removing instruction jmp initNES1___b1 +Removing instruction jmp initNES1_waitForVBlank2 +Removing instruction jmp initNES1_waitForVBlank2___b1 +Removing instruction jmp initNES1___b7 +Removing instruction jmp __b17 +Removing instruction jmp __b19 +Removing instruction jmp __b20 +Removing instruction jmp __b21 +Removing instruction jmp enableVideoOutput1 +Removing instruction jmp __b18 +Removing instruction jmp __b1 +Removing instruction jmp __b3 +Removing instruction jmp __b4 +Removing instruction jmp __b15 +Removing instruction jmp __b16 +Removing instruction jmp __b5 +Removing instruction jmp __b6 +Removing instruction jmp __b8 +Removing instruction jmp __b13 +Removing instruction jmp __b14 +Removing instruction jmp __b11 +Removing instruction jmp __b9 +Removing instruction jmp __b24 +Removing instruction jmp __b12 +Removing instruction jmp __b10 +Removing instruction jmp __b2 +Removing instruction jmp __b22 +Removing instruction jmp __b23 +Removing instruction jmp ppuDataPrepare1 +Removing instruction jmp __b3 +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Removing instruction jmp ppuDataPut1 +Removing instruction jmp __b4 +Removing instruction jmp ppuDataPrepare1 +Removing instruction jmp __b1 +Removing instruction jmp __breturn +Removing instruction jmp __b2 +Removing instruction jmp __breturn +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction lda #0 +Removing instruction lda #0 +Removing instruction lda #$40 +Removing instruction lda #0 +Removing instruction lda #0 +Removing instruction lda #0 +Removing instruction lda #0 +Removing instruction lda #0 +Removing instruction lda #0 +Removing instruction lda #0 +Removing instruction lda #<0 +Removing instruction lda #>0 +Removing instruction lda #0 +Removing instruction lda #0 +Removing instruction lda #0 +Removing instruction lda #0 +Removing instruction lda #0 +Removing instruction lda #<0 +Removing instruction lda #>0 +Replacing instruction lda.z __20+1 with TYA +Removing instruction lda.z __33 +Removing instruction lda #>0 +Removing instruction lda #>0 +Removing instruction lda.z rand_state+1 +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 __b2_from___b1 with __b2 +Replacing label __b5_from___b4 with __b5 +Replacing label __b3 with __b4 +Replacing label __b5_from___b25 with __b5 +Removing instruction __b1_from___init1: +Removing instruction main_from___b1: +Removing instruction initNES1_waitForVBlank1_from_initNES1_clearVBlankFlag1: +Removing instruction initNES1_waitForVBlank1___b1: +Removing instruction initNES1___b1_from_initNES1___b1: +Removing instruction initNES1_waitForVBlank2_from_initNES1___b1: +Removing instruction initNES1_waitForVBlank2___b1: +Removing instruction __b17_from_initNES1___b7: +Removing instruction __b19_from___b17: +Removing instruction __b20_from___b19: +Removing instruction ppuDataFill_from___b20: +Removing instruction __b21_from___b20: +Removing instruction ppuDataTransfer_from___b21: +Removing instruction __b3: +Removing instruction __b5_from___b25: +Removing instruction __b5_from___b4: +Removing instruction __b6_from___b5: +Removing instruction __b2_from___b1: +Removing instruction rand_from___b2: +Removing instruction __b1_from___b3: +Succesful ASM optimization Pass5RedundantLabelElimination +Removing instruction __init1: +Removing instruction __b1: +Removing instruction __breturn: +Removing instruction ppuSpriteBufferDmaTransfer1: +Removing instruction __b1: +Removing instruction __breturn: +Removing instruction initNES1: +Removing instruction initNES1_disableVideoOutput1: +Removing instruction initNES1_disableAudioOutput1: +Removing instruction initNES1_clearVBlankFlag1: +Removing instruction initNES1___b1_from_initNES1_waitForVBlank1___b1: +Removing instruction initNES1___b7: +Removing instruction __b17: +Removing instruction ppuDataTransfer_from___b17: +Removing instruction __b19: +Removing instruction ppuDataFill_from___b19: +Removing instruction __b20: +Removing instruction __b21: +Removing instruction enableVideoOutput1: +Removing instruction __b18: +Removing instruction __b1_from___b18: +Removing instruction __b3_from___b1: +Removing instruction __b15: +Removing instruction __b16: +Removing instruction __b5_from___b16: +Removing instruction __b8: +Removing instruction __b14: +Removing instruction __b3_from___b14: +Removing instruction __b11: +Removing instruction __b24: +Removing instruction __b12: +Removing instruction __b6_from___b10: +Removing instruction __b22: +Removing instruction rand_from___b22: +Removing instruction __b23: +Removing instruction __b1_from___b23: +Removing instruction ppuDataPrepare1: +Removing instruction __b3: +Removing instruction __breturn: +Removing instruction ppuDataPut1: +Removing instruction __b4: +Removing instruction __b1_from___b4: +Removing instruction ppuDataPrepare1: +Removing instruction __b1_from_ppuDataPrepare1: +Removing instruction __breturn: +Removing instruction __b2: +Removing instruction __b1_from___b2: +Removing instruction __breturn: +Succesful ASM optimization Pass5UnusedLabelElimination +Removing instruction jmp initNES1___b1 +Removing instruction jmp __b5 +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction lda #0 +Removing instruction lda #0 +Succesful ASM optimization Pass5UnnecesaryLoadElimination +Fixing long branch [251] bcc __b2 to bcs +Fixing long branch [276] bne __b25 to beq + +FINAL SYMBOL TABLE +(word) $0::x_position +(word) $0::x_velocity +(word) $0::y_position +(word) $0::y_velocity +(const struct RICOH_2A03*) APU = (struct RICOH_2A03*) 16384 +(const nomodify byte*) FR_COUNTER = (byte*) 16407 +(const nomodify byte*) MEMORY = (byte*) 0 +(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = (byte) $10 +(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA = (byte) $14 +(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR = (byte) 3 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR = (byte) 6 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA = (byte) 7 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK = (byte) 1 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = (byte) 5 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = (byte) 2 +(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES = (byte) 2 +(const byte) OFFSET_STRUCT_SPRITEDATA_TILE = (byte) 1 +(const byte) OFFSET_STRUCT_SPRITEDATA_X = (byte) 3 +(const struct RICOH_2C02*) PPU = (struct RICOH_2C02*) 8192 +(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 = (byte*) 9152 +(const nomodify byte*) PPU_NAME_TABLE_0 = (byte*) 8192 +(const nomodify byte*) PPU_PALETTE = (byte*) 16128 +(const nomodify to_volatile byte*) PPU_PPUSTATUS = (byte*) 8194 +(const byte) RADIX::BINARY = (number) 2 +(const byte) RADIX::DECIMAL = (number) $a +(const byte) RADIX::HEXADECIMAL = (number) $10 +(const byte) RADIX::OCTAL = (number) 8 +(byte) RICOH_2A03::DMC_FREQ +(byte) RICOH_2A03::DMC_LEN +(byte) RICOH_2A03::DMC_RAW +(byte) RICOH_2A03::DMC_START +(byte) RICOH_2A03::JOY1 +(byte) RICOH_2A03::JOY2 +(byte) RICOH_2A03::NOISE_HI +(byte) RICOH_2A03::NOISE_LO +(byte) RICOH_2A03::NOISE_VOL +(byte) RICOH_2A03::OAMDMA +(byte) RICOH_2A03::SND_CHN +(byte) RICOH_2A03::SQ1_HI +(byte) RICOH_2A03::SQ1_LO +(byte) RICOH_2A03::SQ1_SWEEP +(byte) RICOH_2A03::SQ1_VOL +(byte) RICOH_2A03::SQ2_HI +(byte) RICOH_2A03::SQ2_LO +(byte) RICOH_2A03::SQ2_SWEEP +(byte) RICOH_2A03::SQ2_VOL +(byte) RICOH_2A03::TRI_HI +(byte) RICOH_2A03::TRI_LINEAR +(byte) RICOH_2A03::TRI_LO +(byte) RICOH_2A03::UNUSED1 +(byte) RICOH_2A03::UNUSED2 +(byte) RICOH_2C02::OAMADDR +(byte) RICOH_2C02::OAMDATA +(byte) RICOH_2C02::PPUADDR +(byte) RICOH_2C02::PPUCTRL +(byte) RICOH_2C02::PPUDATA +(byte) RICOH_2C02::PPUMASK +(byte) RICOH_2C02::PPUSCROLL +(volatile byte) RICOH_2C02::PPUSTATUS loadstore +(const byte) SIZEOF_BYTE = (byte) 1 +(const struct SpriteData*) SPRITE_BUFFER[(number) $100] = { fill( $100, 0) } +(byte) SpriteData::attributes +(byte) SpriteData::tile +(byte) SpriteData::x +(byte) SpriteData::y +(const byte*) TILES[] = kickasm {{ .import binary "lazydata.chr" + }} +(const to_nomodify void()**) VECTORS[] = { &interrupt(HARDWARE_STACK)(void()) vblank(), &(signed word()) main(), (void()*) 0 } +(void()) __start() +(label) __start::@1 +(label) __start::@return +(label) __start::__init1 +(const struct $0*) balls[(number) $40] = { fill( $40, 0) } +(const to_nomodify byte*) h_bar_tilemap[] = { (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1 } +(signed word()) main() +(word~) main::$10 zp[2]:54 67.33333333333333 +(word~) main::$11 zp[2]:54 202.0 +(byte~) main::$12 reg byte x 67.33333333333333 +(byte~) main::$14 reg byte a 202.0 +(word~) main::$20 zp[2]:15 2002.0 +(word~) main::$23 zp[2]:39 500.5 +(word~) main::$25 zp[2]:37 667.3333333333334 +(byte~) main::$26 zp[1]:41 1001.0 +(byte~) main::$30 reg byte a 1001.0 +(word~) main::$31 zp[2]:48 1001.0 +(word~) main::$32 zp[2]:52 500.5 +(word~) main::$33 zp[2]:50 1001.0 +(word~) main::$35 zp[2]:56 202.0 +(word~) main::$36 zp[2]:58 202.0 +(byte~) main::$38 reg byte x 151.5 +(word~) main::$40 zp[2]:15 834.1666666666666 +(word~) main::$44 zp[2]:37 1001.0 +(word~) main::$45 zp[2]:33 1501.5 +(byte~) main::$48 reg byte x 834.1666666666667 +(word~) main::$50 zp[2]:50 429.0 +(word~) main::$53 zp[2]:42 572.0 +(word~) main::$56 zp[2]:48 2002.0 +(word*~) main::$59 zp[2]:56 202.0 +(word*~) main::$60 zp[2]:58 202.0 +(word*~) main::$61 zp[2]:17 667.3333333333334 +(word*~) main::$62 zp[2]:19 1001.0 +(word*~) main::$63 zp[2]:21 2002.0 +(word*~) main::$64 zp[2]:23 1001.0 +(word*~) main::$65 zp[2]:25 2002.0 +(word*~) main::$66 zp[2]:27 667.3333333333334 +(word*~) main::$67 zp[2]:29 1001.0 +(word*~) main::$68 zp[2]:31 2002.0 +(word*~) main::$69 zp[2]:15 2002.0 +(word*~) main::$70 zp[2]:39 2002.0 +(word*~) main::$71 zp[2]:37 2002.0 +(word*~) main::$72 zp[2]:35 1001.0 +(word*~) main::$73 zp[2]:33 2002.0 +(word*~) main::$74 zp[2]:52 2002.0 +(word*~) main::$75 zp[2]:50 2002.0 +(word*~) main::$76 zp[2]:44 1001.0 +(word*~) main::$77 zp[2]:46 2002.0 +(word*~) main::$78 zp[2]:42 2002.0 +(word~) main::$9 zp[2]:54 202.0 +(label) main::@1 +(label) main::@10 +(label) main::@11 +(label) main::@12 +(label) main::@13 +(label) main::@14 +(label) main::@15 +(label) main::@16 +(label) main::@17 +(label) main::@18 +(label) main::@19 +(label) main::@2 +(label) main::@20 +(label) main::@21 +(label) main::@22 +(label) main::@23 +(label) main::@24 +(label) main::@25 +(label) main::@3 +(label) main::@4 +(label) main::@5 +(label) main::@6 +(label) main::@7 +(label) main::@8 +(label) main::@9 +(byte) main::active_balls +(byte) main::active_balls#1 active_balls zp[1]:5 75.75 +(byte) main::active_balls#2 active_balls zp[1]:5 56.11111111111111 +(byte) main::active_balls#8 active_balls zp[1]:5 25.545454545454547 +(label) main::enableVideoOutput1 +(byte) main::h_bar +(byte) main::h_bar#1 h_bar zp[1]:14 51.69354838709677 +(word) main::i +(word) main::i#10 i_1 zp[2]:7 163.42857142857142 +(word) main::i#14 i zp[2]:2 29.705882352941178 +(word) main::i#2 i zp[2]:2 202.0 +(word) main::i#4 i_1 zp[2]:7 2002.0 +(label) main::initNES1 +(label) main::initNES1_@1 +(label) main::initNES1_@7 +(label) main::initNES1_clearVBlankFlag1 +(label) main::initNES1_disableAudioOutput1 +(label) main::initNES1_disableVideoOutput1 +(byte) main::initNES1_i +(byte) main::initNES1_i#1 reg byte x 151.5 +(byte) main::initNES1_i#2 reg byte x 112.22222222222223 +(label) main::initNES1_waitForVBlank1 +(byte~) main::initNES1_waitForVBlank1_$0 reg byte a 202.0 +(label) main::initNES1_waitForVBlank1_@1 +(label) main::initNES1_waitForVBlank2 +(byte~) main::initNES1_waitForVBlank2_$0 reg byte a 202.0 +(label) main::initNES1_waitForVBlank2_@1 +(signed word) main::return +(byte) main::sprite_idx +(byte) main::sprite_idx#2 sprite_idx zp[1]:9 1001.0 +(byte) main::sprite_idx#3 sprite_idx zp[1]:9 62.5625 +(byte) main::timer +(byte) main::timer#1 reg byte x 101.0 +(byte) main::timer#15 timer zp[1]:6 5.50909090909091 +(byte) main::timer#21 timer zp[1]:6 202.0 +(byte) main::timer#3 timer zp[1]:6 57.714285714285715 +(byte) main::timer_2 +(byte) main::timer_2#1 timer_2 zp[1]:4 4.522388059701492 +(byte) main::timer_2#2 timer_2 zp[1]:4 202.0 +(const to_nomodify byte*) palette[] = { (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4 } +(void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size) +(label) ppuDataFill::@1 +(label) ppuDataFill::@2 +(label) ppuDataFill::@return +(word) ppuDataFill::i +(word) ppuDataFill::i#1 i zp[2]:19 2002.0 +(word) ppuDataFill::i#2 i zp[2]:19 1001.0 +(nomodify void*) ppuDataFill::ppuData +(label) ppuDataFill::ppuDataPrepare1 +(byte~) ppuDataFill::ppuDataPrepare1_$0 reg byte a 202.0 +(byte~) ppuDataFill::ppuDataPrepare1_$1 reg byte a 202.0 +(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData +(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ppuDataPrepare1_ppuData zp[2]:15 67.33333333333333 +(label) ppuDataFill::ppuDataPut1 +(byte) ppuDataFill::ppuDataPut1_val +(word) ppuDataFill::size +(word) ppuDataFill::size#3 size zp[2]:17 111.22222222222223 +(byte) ppuDataFill::val +(void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size) +(label) ppuDataTransfer::@1 +(label) ppuDataTransfer::@2 +(label) ppuDataTransfer::@3 +(label) ppuDataTransfer::@4 +(label) ppuDataTransfer::@return +(nomodify void*) ppuDataTransfer::cpuData +(nomodify void*) ppuDataTransfer::cpuData#2 cpuData zp[2]:17 +(byte*) ppuDataTransfer::cpuSrc +(byte*) ppuDataTransfer::cpuSrc#1 cpuSrc zp[2]:17 1001.0 +(byte*) ppuDataTransfer::cpuSrc#2 cpuSrc zp[2]:17 776.0 +(byte*) ppuDataTransfer::cpuSrc#6 cpuSrc zp[2]:17 202.0 +(word) ppuDataTransfer::i +(word) ppuDataTransfer::i#1 i zp[2]:19 2002.0 +(word) ppuDataTransfer::i#2 i zp[2]:19 600.5999999999999 +(nomodify void*) ppuDataTransfer::ppuData +(label) ppuDataTransfer::ppuDataPrepare1 +(byte~) ppuDataTransfer::ppuDataPrepare1_$0 reg byte a 202.0 +(byte~) ppuDataTransfer::ppuDataPrepare1_$1 reg byte a 202.0 +(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData +(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 ppuDataPrepare1_ppuData zp[2]:15 67.33333333333333 +(label) ppuDataTransfer::ppuDataPut1 +(byte) ppuDataTransfer::ppuDataPut1_val +(byte) ppuDataTransfer::ppuDataPut1_val#0 reg byte a 2002.0 +(word) ppuDataTransfer::size +(const byte*) printf_buffer_number::digits[(number) $b] = { fill( $b, 0) } +(byte) printf_buffer_number::sign +(byte) printf_format_number::justify_left +(byte) printf_format_number::min_length +(byte) printf_format_number::radix +(byte) printf_format_number::sign_always +(byte) printf_format_number::upper_case +(byte) printf_format_number::zero_padding +(byte) printf_format_string::justify_left +(byte) printf_format_string::min_length +(word()) rand() +(word~) rand::$0 zp[2]:60 2002.0 +(word~) rand::$1 zp[2]:62 2002.0 +(word~) rand::$2 zp[2]:64 2002.0 +(label) rand::@return +(word) rand::return +(word) rand::return#0 return zp[2]:54 300.75 +(word) rand::return#2 return zp[2]:54 202.0 +(word) rand::return#3 return zp[2]:54 202.0 +(word) rand_state +(word) rand_state#0 rand_state zp[2]:10 1501.5 +(word) rand_state#1 rand_state zp[2]:10 1501.5 +(word) rand_state#10 rand_state zp[2]:10 1102.0 +(word) rand_state#11 rand_state zp[2]:10 122.44444444444446 +(word) rand_state#17 rand_state zp[2]:10 67.33333333333333 +(volatile byte) scroll_y loadstore zp[1]:12 105.0 +(const to_nomodify byte*) sine_table[(number) $100] = { (byte) $40, (byte) $42, (byte) $43, (byte) $45, (byte) $46, (byte) $48, (byte) $49, (byte) $4b, (byte) $4c, (byte) $4e, (byte) $50, (byte) $51, (byte) $53, (byte) $54, (byte) $56, (byte) $57, (byte) $58, (byte) $5a, (byte) $5b, (byte) $5d, (byte) $5e, (byte) $60, (byte) $61, (byte) $62, (byte) $64, (byte) $65, (byte) $66, (byte) $67, (byte) $69, (byte) $6a, (byte) $6b, (byte) $6c, (byte) $6d, (byte) $6e, (byte) $6f, (byte) $70, (byte) $71, (byte) $72, (byte) $73, (byte) $74, (byte) $75, (byte) $76, (byte) $77, (byte) $78, (byte) $78, (byte) $79, (byte) $7a, (byte) $7b, (byte) $7b, (byte) $7c, (byte) $7c, (byte) $7d, (byte) $7d, (byte) $7e, (byte) $7e, (byte) $7e, (byte) $7f, (byte) $7f, (byte) $7f, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $7f, (byte) $7f, (byte) $7f, (byte) $7e, (byte) $7e, (byte) $7e, (byte) $7d, (byte) $7d, (byte) $7c, (byte) $7c, (byte) $7b, (byte) $7b, (byte) $7a, (byte) $79, (byte) $78, (byte) $78, (byte) $77, (byte) $76, (byte) $75, (byte) $74, (byte) $73, (byte) $72, (byte) $71, (byte) $70, (byte) $6f, (byte) $6e, (byte) $6d, (byte) $6c, (byte) $6b, (byte) $6a, (byte) $69, (byte) $67, (byte) $66, (byte) $65, (byte) $64, (byte) $62, (byte) $61, (byte) $60, (byte) $5e, (byte) $5d, (byte) $5b, (byte) $5a, (byte) $58, (byte) $57, (byte) $56, (byte) $54, (byte) $53, (byte) $51, (byte) $50, (byte) $4e, (byte) $4c, (byte) $4b, (byte) $49, (byte) $48, (byte) $46, (byte) $45, (byte) $43, (byte) $42, (byte) $40, (byte) $3e, (byte) $3d, (byte) $3b, (byte) $3a, (byte) $38, (byte) $37, (byte) $35, (byte) $34, (byte) $32, (byte) $30, (byte) $2f, (byte) $2d, (byte) $2c, (byte) $2a, (byte) $29, (byte) $28, (byte) $26, (byte) $25, (byte) $23, (byte) $22, (byte) $20, (byte) $1f, (byte) $1e, (byte) $1c, (byte) $1b, (byte) $1a, (byte) $19, (byte) $17, (byte) $16, (byte) $15, (byte) $14, (byte) $13, (byte) $12, (byte) $11, (byte) $10, (byte) $f, (byte) $e, (byte) $d, (byte) $c, (byte) $b, (byte) $a, (byte) 9, (byte) 8, (byte) 8, (byte) 7, (byte) 6, (byte) 5, (byte) 5, (byte) 4, (byte) 4, (byte) 3, (byte) 3, (byte) 2, (byte) 2, (byte) 2, (byte) 1, (byte) 1, (byte) 1, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 1, (byte) 1, (byte) 1, (byte) 2, (byte) 2, (byte) 2, (byte) 3, (byte) 3, (byte) 4, (byte) 4, (byte) 5, (byte) 5, (byte) 6, (byte) 7, (byte) 8, (byte) 8, (byte) 9, (byte) $a, (byte) $b, (byte) $c, (byte) $d, (byte) $e, (byte) $f, (byte) $10, (byte) $11, (byte) $12, (byte) $13, (byte) $14, (byte) $15, (byte) $16, (byte) $17, (byte) $19, (byte) $1a, (byte) $1b, (byte) $1c, (byte) $1e, (byte) $1f, (byte) $20, (byte) $22, (byte) $23, (byte) $25, (byte) $26, (byte) $28, (byte) $29, (byte) $2a, (byte) $2c, (byte) $2d, (byte) $2f, (byte) $30, (byte) $32, (byte) $34, (byte) $35, (byte) $37, (byte) $38, (byte) $3a, (byte) $3b, (byte) $3d, (byte) $3e } +interrupt(HARDWARE_STACK)(void()) vblank() +(label) vblank::@1 +(label) vblank::@return +(label) vblank::ppuSpriteBufferDmaTransfer1 +(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer +(volatile byte) vblank_hit loadstore zp[1]:13 8.65625 + +reg byte x [ main::initNES1_i#2 main::initNES1_i#1 ] +zp[2]:2 [ main::i#14 main::i#2 ] +zp[1]:4 [ main::timer_2#2 main::timer_2#1 ] +zp[1]:5 [ main::active_balls#2 main::active_balls#8 main::active_balls#1 ] +zp[1]:6 [ main::timer#3 main::timer#15 main::timer#21 ] +zp[2]:7 [ main::i#10 main::i#4 ] +zp[1]:9 [ main::sprite_idx#3 main::sprite_idx#2 ] +zp[2]:10 [ rand_state#10 rand_state#17 rand_state#11 rand_state#0 rand_state#1 ] +zp[1]:12 [ scroll_y ] +zp[1]:13 [ vblank_hit ] +reg byte a [ main::initNES1_waitForVBlank1_$0 ] +reg byte a [ main::initNES1_waitForVBlank2_$0 ] +zp[1]:14 [ main::h_bar#1 ] +reg byte a [ main::$14 ] +reg byte x [ main::timer#1 ] +reg byte x [ main::$38 ] +zp[2]:15 [ main::$40 main::$69 main::$20 ppuDataFill::ppuDataPrepare1_ppuData#0 ppuDataTransfer::ppuDataPrepare1_ppuData#0 ] +zp[2]:17 [ main::$61 ppuDataFill::size#3 ppuDataTransfer::cpuData#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#6 ppuDataTransfer::cpuSrc#1 ] +zp[2]:19 [ main::$62 ppuDataFill::i#2 ppuDataFill::i#1 ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] +zp[2]:21 [ main::$63 ] +zp[2]:23 [ main::$64 ] +zp[2]:25 [ main::$65 ] +zp[2]:27 [ main::$66 ] +zp[2]:29 [ main::$67 ] +zp[2]:31 [ main::$68 ] +zp[2]:33 [ main::$45 main::$73 ] +zp[2]:35 [ main::$72 ] +zp[2]:37 [ main::$44 main::$71 main::$25 ] +zp[2]:39 [ main::$70 main::$23 ] +zp[1]:41 [ main::$26 ] +zp[2]:42 [ main::$53 main::$78 ] +zp[2]:44 [ main::$76 ] +zp[2]:46 [ main::$77 ] +reg byte a [ main::$30 ] +zp[2]:48 [ main::$56 main::$31 ] +zp[2]:50 [ main::$50 main::$75 main::$33 ] +zp[2]:52 [ main::$74 main::$32 ] +reg byte x [ main::$48 ] +zp[2]:54 [ rand::return#2 main::$9 rand::return#0 main::$10 rand::return#3 main::$11 ] +zp[2]:56 [ main::$35 main::$59 ] +reg byte x [ main::$12 ] +zp[2]:58 [ main::$36 main::$60 ] +reg byte a [ ppuDataTransfer::ppuDataPrepare1_$0 ] +reg byte a [ ppuDataTransfer::ppuDataPrepare1_$1 ] +reg byte a [ ppuDataTransfer::ppuDataPut1_val#0 ] +reg byte a [ ppuDataFill::ppuDataPrepare1_$0 ] +reg byte a [ ppuDataFill::ppuDataPrepare1_$1 ] +zp[2]:60 [ rand::$0 ] +zp[2]:62 [ rand::$1 ] +zp[2]:64 [ rand::$2 ] + + +FINAL ASSEMBLER +Score: 99953 + + // File Comments +//#pragma emulator("java -jar /Applications/Nintaco_bin_2020-05-01/Nintaco.jar") +// Nintendo Entertainment System (NES +// https://en.wikipedia.org/wiki/Nintendo_Entertainment_System_(Model_NES-101) +// https://github.com/gregkrsak/first_nes +// Ricoh 2C02 - NES Picture Processing Unit (PPU) +// Ricoh RP2C02 (NTSC version) / RP2C07 (PAL version), +// https://en.wikipedia.org/wiki/Picture_Processing_Unit +// https://wiki.nesdev.com/w/index.php/PPU_registers +// http://nesdev.com/2C02%20technical%20reference.TXT +// Based on: https://github.com/gregkrsak/first_nes written by Greg M. Krsak, 2018. + // Upstart + // Nintendo Entertainment System (NES) ROM (Mapper 0 NROM, Vertical Mirroring) +// https://sadistech.com/nesromtool/romdoc.html +// https://forums.nesdev.com/viewtopic.php?f=2&t=9896 +// https://github.com/gregkrsak/first_nes +.file [name="kickballs-3.nes", type="bin", segments="NesRom"] +.file [name="kickballs-3.nes_hdr", type="bin", segments="Header"] +.file [name="kickballs-3.nes_prg", type="bin", segments="ProgramRom"] +.file [name="kickballs-3.nes_chr", type="bin", segments="CharacterRom"] +.segmentdef Header [ start=$0000, min=$0000, max=$000f, fill ] +.segmentdef Tiles [ start=$0000, min=$0000, max=$1fff, fill ] +.segmentdef Code [ start=$c000, min=$c000, max=$fff9 ] +.segmentdef Data [ startAfter="Code", min=$c000, max=$fff9 ] +.segmentdef Vectors [ start=$fffa, min=$fffa, max=$ffff ] +.segmentdef GameRam [start=$200,max=$7ff, virtual] +.segmentdef ProgramRom [ segments="Code, Data, Vectors" ] +.segmentdef CharacterRom [ segments="Tiles" ] +.segmentdef NesRom +.segment NesRom +.segmentout [ segments="Header" ] +.segmentout [ segments="ProgramRom" ] +.segmentout [ segments="CharacterRom" ] +.segment Header +.text @"NES\$1a" +.byte $01 // 1x 16KB ROM (PRG) +.byte $01 // 1x 8KB VROM (CHR) +.byte %00000001 // Mapper nibble 0000 == No mapping (a simple 16KB PRG + 8KB CHR game) + // Mirroring nibble 0001 == Vertical mirroring only +.segment Code + + // Global Constants & labels + .const OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = $10 + .const OFFSET_STRUCT_RICOH_2C02_PPUMASK = 1 + .const OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = 2 + .const OFFSET_STRUCT_RICOH_2C02_OAMADDR = 3 + .const OFFSET_STRUCT_RICOH_2A03_OAMDMA = $14 + .const OFFSET_STRUCT_RICOH_2C02_PPUADDR = 6 + .const OFFSET_STRUCT_RICOH_2C02_PPUDATA = 7 + .const OFFSET_STRUCT_SPRITEDATA_TILE = 1 + .const OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES = 2 + .const OFFSET_STRUCT_SPRITEDATA_X = 3 + .const OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = 5 + .const SIZEOF_BYTE = 1 + // $2000-$23bf $03c0 Name table 0 + .label PPU_NAME_TABLE_0 = $2000 + // $23c0-$23ff $0040 Attribute table 0 + .label PPU_ATTRIBUTE_TABLE_0 = $23c0 + // $3000-$3eff $0f00 Mirrors of $2000-$2eff + // $3f00-$3f1f $0020 Palette RAM indexes + .label PPU_PALETTE = $3f00 + // PPU Status Register for reading in ASM + .label PPU_PPUSTATUS = $2002 + // APU Frame Counter + // generates low-frequency clocks for the channels and an optional 60 Hz interrupt. + // https://wiki.nesdev.com/w/index.php/APU_Frame_Counter + // ------+-----+--------------------------------------------------------------- + // $4017 | W | FR_COUNTER Frame Counter Set mode and interrupt + // ------+-----+--------------------------------------------------------------- + // | 7 | Sequencer mode: 0 selects 4-step sequence, 1 selects 5-step sequence + // | 6 | Interrupt inhibit flag. If set, the frame interrupt flag is cleared, otherwise it is unaffected. + // ------+-----+--------------------------------------------------------------- + // Side effects After 3 or 4 CPU clock cycles*, the timer is reset. + // If the mode flag is set, then both "quarter frame" and "half frame" signals are also generated. + .label FR_COUNTER = $4017 + // Pointer to the start of RAM memory + .label MEMORY = 0 + // NES Picture Processing Unit (PPU) + .label PPU = $2000 + // NES CPU and audion processing unit (APU) + .label APU = $4000 + .label scroll_y = $c + .label vblank_hit = $d + // The random state variable + .label rand_state = $a +.segment Code + // __start +__start: { + // __start::__init1 + // scroll_y = 0 + // [1] (volatile byte) scroll_y ← (byte) 0 -- vbuz1=vbuc1 + lda #0 + sta.z scroll_y + // vblank_hit = 0 + // [2] (volatile byte) vblank_hit ← (byte) 0 -- vbuz1=vbuc1 + sta.z vblank_hit + // [3] phi from __start::__init1 to __start::@1 [phi:__start::__init1->__start::@1] + // __start::@1 + // [4] call main + // [12] phi from __start::@1 to main [phi:__start::@1->main] + jsr main + // __start::@return + // [5] return + rts +} + // vblank +// NMI Called when the PPU refreshes the screen (also known as the V-Blank period) +vblank: { + // entry interrupt(HARDWARE_STACK) + pha + txa + pha + tya + pha + // PPU->PPUSCROLL = 0 + // [6] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0 -- _deref_pbuc1=vbuc2 + // Set scroll + lda #0 + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL + // PPU->PPUSCROLL = scroll_y + // [7] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (volatile byte) scroll_y -- _deref_pbuc1=vbuz1 + lda.z scroll_y + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL + // vblank::ppuSpriteBufferDmaTransfer1 + // PPU->OAMADDR = 0 + // [8] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta PPU+OFFSET_STRUCT_RICOH_2C02_OAMADDR + // APU->OAMDMA = >spriteBuffer + // [9] *((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::@1 + // vblank_hit++; + // [10] (volatile byte) vblank_hit ← ++ (volatile byte) vblank_hit -- vbuz1=_inc_vbuz1 + inc.z vblank_hit + // vblank::@return + // } + // [11] return - exit interrupt(HARDWARE_STACK) + pla + tay + pla + tax + pla + rti +} + // main +main: { + .label __9 = $36 + .label __10 = $36 + .label __11 = $36 + .label __20 = $f + .label __23 = $27 + .label __25 = $25 + .label __26 = $29 + .label __31 = $30 + .label __32 = $34 + .label __33 = $32 + .label __35 = $38 + .label __36 = $3a + .label __40 = $f + .label __44 = $25 + .label __45 = $21 + .label __50 = $32 + .label __53 = $2a + .label __56 = $30 + .label i = 2 + .label timer_2 = 4 + .label h_bar = $e + .label active_balls = 5 + .label sprite_idx = 9 + .label i_1 = 7 + .label timer = 6 + .label __59 = $38 + .label __60 = $3a + .label __61 = $11 + .label __62 = $13 + .label __63 = $15 + .label __64 = $17 + .label __65 = $19 + .label __66 = $1b + .label __67 = $1d + .label __68 = $1f + .label __69 = $f + .label __70 = $27 + .label __71 = $25 + .label __72 = $23 + .label __73 = $21 + .label __74 = $34 + .label __75 = $32 + .label __76 = $2c + .label __77 = $2e + .label __78 = $2a + // main::initNES1 + // asm + // asm { cld ldx#$ff txs } + cld + ldx #$ff + txs + // main::initNES1_disableVideoOutput1 + // PPU->PPUCTRL = 0 + // [14] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta PPU + // PPU->PPUMASK = 0 + // [15] *((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 + // [16] *((const nomodify byte*) FR_COUNTER) ← (byte) $40 -- _deref_pbuc1=vbuc2 + lda #$40 + sta FR_COUNTER + // APU->DMC_FREQ = 0b01000000 + // [17] *((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 + // [19] 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 + // [20] (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)) + // [21] if((byte) 0==(byte~) main::initNES1_waitForVBlank1_$0) goto main::initNES1_waitForVBlank1_@1 -- vbuc1_eq_vbuaa_then_la1 + cmp #0 + beq initNES1_waitForVBlank1 + // [22] phi from main::initNES1_waitForVBlank1_@1 to main::initNES1_@1 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1] + // [22] phi (byte) main::initNES1_i#2 = (byte) 0 [phi:main::initNES1_waitForVBlank1_@1->main::initNES1_@1#0] -- vbuxx=vbuc1 + ldx #0 + // [22] phi from main::initNES1_@1 to main::initNES1_@1 [phi:main::initNES1_@1->main::initNES1_@1] + // [22] 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 + // [23] *((const nomodify byte*) MEMORY + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + lda #0 + sta MEMORY,x + // (MEMORY+0x100)[i] = 0 + // [24] *((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 + // [25] *((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 + // [26] *((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 + // [27] *((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 + // [28] *((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 + // [29] *((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 + // [30] *((const nomodify byte*) MEMORY+(word) $700 + (byte) main::initNES1_i#2) ← (byte) 0 -- pbuc1_derefidx_vbuxx=vbuc2 + sta MEMORY+$700,x + // while (++i) + // [31] (byte) main::initNES1_i#1 ← ++ (byte) main::initNES1_i#2 -- vbuxx=_inc_vbuxx + inx + // [32] if((byte) 0!=(byte) main::initNES1_i#1) goto main::initNES1_@1 -- vbuc1_neq_vbuxx_then_la1 + cpx #0 + bne initNES1___b1 + // [33] 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 + // [34] (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)) + // [35] 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 + // [37] phi from main::initNES1_@7 to main::@17 [phi:main::initNES1_@7->main::@17] + // main::@17 + // ppuDataTransfer(PPU_PALETTE, palette, sizeof(palette)) + // [38] call ppuDataTransfer + // Transfer the palette + // [134] phi from main::@17 to ppuDataTransfer [phi:main::@17->ppuDataTransfer] + // [134] phi (nomodify void*) ppuDataTransfer::cpuData#2 = (void*)(const to_nomodify byte*) palette [phi:main::@17->ppuDataTransfer#0] -- pvoz1=pvoc1 + lda #palette + sta.z ppuDataTransfer.cpuData+1 + // [134] phi (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_PALETTE [phi:main::@17->ppuDataTransfer#1] -- pvoz1=pvoc1 + lda #PPU_PALETTE + sta.z ppuDataTransfer.ppuDataPrepare1_ppuData+1 + jsr ppuDataTransfer + // [39] phi from main::@17 to main::@19 [phi:main::@17->main::@19] + // main::@19 + // ppuDataFill(PPU_NAME_TABLE_0, 0, 32*30) + // [40] call ppuDataFill + // Fill the PPU attribute table + // [147] phi from main::@19 to ppuDataFill [phi:main::@19->ppuDataFill] + // [147] phi (word) ppuDataFill::size#3 = (word)(number) $20*(number) $1e [phi:main::@19->ppuDataFill#0] -- vwuz1=vwuc1 + lda #<$20*$1e + sta.z ppuDataFill.size + lda #>$20*$1e + sta.z ppuDataFill.size+1 + // [147] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_NAME_TABLE_0 [phi:main::@19->ppuDataFill#1] -- pvoz1=pvoc1 + lda #PPU_NAME_TABLE_0 + sta.z ppuDataFill.ppuDataPrepare1_ppuData+1 + jsr ppuDataFill + // [41] phi from main::@19 to main::@20 [phi:main::@19->main::@20] + // main::@20 + // ppuDataFill(PPU_ATTRIBUTE_TABLE_0, 0, 0x40) + // [42] call ppuDataFill + // [147] phi from main::@20 to ppuDataFill [phi:main::@20->ppuDataFill] + // [147] phi (word) ppuDataFill::size#3 = (byte) $40 [phi:main::@20->ppuDataFill#0] -- vwuz1=vbuc1 + lda #<$40 + sta.z ppuDataFill.size + lda #>$40 + sta.z ppuDataFill.size+1 + // [147] phi (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 = (void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 [phi:main::@20->ppuDataFill#1] -- pvoz1=pvoc1 + lda #PPU_ATTRIBUTE_TABLE_0 + sta.z ppuDataFill.ppuDataPrepare1_ppuData+1 + jsr ppuDataFill + // [43] phi from main::@20 to main::@21 [phi:main::@20->main::@21] + // main::@21 + // ppuDataTransfer(0x2040, h_bar_tilemap, sizeof(h_bar_tilemap)) + // [44] call ppuDataTransfer + // [134] phi from main::@21 to ppuDataTransfer [phi:main::@21->ppuDataTransfer] + // [134] phi (nomodify void*) ppuDataTransfer::cpuData#2 = (void*)(const to_nomodify byte*) h_bar_tilemap [phi:main::@21->ppuDataTransfer#0] -- pvoz1=pvoc1 + lda #h_bar_tilemap + sta.z ppuDataTransfer.cpuData+1 + // [134] phi (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 = (void*) 8256 [phi:main::@21->ppuDataTransfer#1] -- pvoz1=pvoc1 + lda #<$2040 + sta.z ppuDataTransfer.ppuDataPrepare1_ppuData + lda #>$2040 + sta.z ppuDataTransfer.ppuDataPrepare1_ppuData+1 + jsr ppuDataTransfer + // main::enableVideoOutput1 + // PPU->PPUCTRL = 0b10000000 + // [45] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80 -- _deref_pbuc1=vbuc2 + lda #$80 + sta PPU + // PPU->PPUMASK = 0b00011110 + // [46] *((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 + // main::@18 + // PPU->PPUCTRL = 0b10001000 + // [47] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $88 -- _deref_pbuc1=vbuc2 + // Enable vertical blank interrupt, select sprite pattern table 1 + lda #$88 + sta PPU + // [48] phi from main::@18 to main::@1 [phi:main::@18->main::@1] + // [48] phi (word) rand_state#17 = (word) 1 [phi:main::@18->main::@1#0] -- vwuz1=vwuc1 + lda #<1 + sta.z rand_state + lda #>1 + sta.z rand_state+1 + // [48] phi (word) main::i#14 = (byte) 0 [phi:main::@18->main::@1#1] -- vwuz1=vbuc1 + sta.z i + sta.z i+1 + // main::@1 + __b1: + // for (i = 0; i < MAX_BALLS; i++) + // [49] if((word) main::i#14<(byte) $32) goto main::@2 -- vwuz1_lt_vbuc1_then_la1 + lda.z i+1 + bne !+ + lda.z i + cmp #$32 + bcs !__b2+ + jmp __b2 + !__b2: + !: + // [50] phi from main::@1 to main::@3 [phi:main::@1->main::@3] + // [50] phi (byte) main::timer#3 = (byte) 0 [phi:main::@1->main::@3#0] -- vbuz1=vbuc1 + lda #0 + sta.z timer + // [50] phi (byte) main::active_balls#2 = (byte) 0 [phi:main::@1->main::@3#1] -- vbuz1=vbuc1 + sta.z active_balls + // [50] phi (byte) main::timer_2#2 = (byte) 0 [phi:main::@1->main::@3#2] -- vbuz1=vbuc1 + sta.z timer_2 + // main::@3 + // main::@4 + __b4: + // timer_2++; + // [51] (byte) main::timer_2#1 ← ++ (byte) main::timer_2#2 -- vbuz1=_inc_vbuz1 + inc.z timer_2 + // h_bar = sine_table[timer_2] + 0x60 + // [52] (byte) main::h_bar#1 ← *((const to_nomodify byte*) sine_table + (byte) main::timer_2#1) + (byte) $60 -- vbuz1=pbuc1_derefidx_vbuz2_plus_vbuc2 + lda #$60 + ldy.z timer_2 + clc + adc sine_table,y + sta.z h_bar + // h_bar ^ 0xFF + // [53] (byte~) main::$14 ← (byte) main::h_bar#1 ^ (byte) $ff -- vbuaa=vbuz1_bxor_vbuc1 + lda #$ff + eor.z h_bar + // scroll_y = h_bar ^ 0xFF + // [54] (volatile byte) scroll_y ← (byte~) main::$14 -- vbuz1=vbuaa + sta.z scroll_y + // if (active_balls < MAX_BALLS) + // [55] if((byte) main::active_balls#2>=(byte) $32) goto main::@5 -- vbuz1_ge_vbuc1_then_la1 + lda.z active_balls + cmp #$32 + bcs __b5 + // main::@15 + // if (timer++ == RELEASE_TIMER) + // [56] (byte) main::timer#1 ← ++ (byte) main::timer#3 -- vbuxx=_inc_vbuz1 + ldx.z timer + inx + // [57] if((byte) main::timer#3!=(byte) 9) goto main::@25 -- vbuz1_neq_vbuc1_then_la1 + lda #9 + cmp.z timer + beq !__b25+ + jmp __b25 + !__b25: + // main::@16 + // active_balls++; + // [58] (byte) main::active_balls#1 ← ++ (byte) main::active_balls#2 -- vbuz1=_inc_vbuz1 + inc.z active_balls + // balls[active_balls].x_position = 0 + // [59] (byte~) main::$38 ← (byte) main::active_balls#1 << (byte) 3 -- vbuxx=vbuz1_rol_3 + lda.z active_balls + asl + asl + asl + tax + // [60] *((word*)(const struct $0*) balls + (byte~) main::$38) ← (byte) 0 -- pwuc1_derefidx_vbuxx=vbuc2 + lda #0 + sta balls,x + sta balls+1,x + // balls[active_balls].y_position = 0 + // [61] *((word*)(const struct $0*) balls+(byte) 2 + (byte~) main::$38) ← (byte) 0 -- pwuc1_derefidx_vbuxx=vbuc2 + sta balls+2,x + sta balls+2+1,x + // [62] phi from main::@16 to main::@5 [phi:main::@16->main::@5] + // [62] phi (byte) main::timer#15 = (byte) 0 [phi:main::@16->main::@5#0] -- vbuz1=vbuc1 + sta.z timer + // [62] phi (byte) main::active_balls#8 = (byte) main::active_balls#1 [phi:main::@16->main::@5#1] -- register_copy + // [62] phi from main::@25 main::@4 to main::@5 [phi:main::@25/main::@4->main::@5] + // [62] phi (byte) main::timer#15 = (byte) main::timer#21 [phi:main::@25/main::@4->main::@5#0] -- register_copy + // [62] phi (byte) main::active_balls#8 = (byte) main::active_balls#2 [phi:main::@25/main::@4->main::@5#1] -- register_copy + // main::@5 + __b5: + // [63] phi from main::@5 to main::@6 [phi:main::@5->main::@6] + // [63] phi (byte) main::sprite_idx#3 = (byte) 0 [phi:main::@5->main::@6#0] -- vbuz1=vbuc1 + lda #0 + sta.z sprite_idx + // [63] phi (word) main::i#10 = (byte) 0 [phi:main::@5->main::@6#1] -- vwuz1=vbuc1 + sta.z i_1 + sta.z i_1+1 + // main::@6 + __b6: + // for (i = 0; i < active_balls; i++) + // [64] if((word) main::i#10<(byte) main::active_balls#8) goto main::@7 -- vwuz1_lt_vbuz2_then_la1 + lda.z i_1+1 + bne !+ + lda.z i_1 + cmp.z active_balls + bcc __b7 + !: + // main::@8 + // poke(0x2001) = 0x98 + // [65] *((byte*) 8193) ← (byte) $98 -- _deref_pbuc1=vbuc2 + lda #$98 + sta $2001 + // main::@13 + __b13: + // while (!vblank_hit) + // [66] if((byte) 0==(volatile byte) vblank_hit) goto main::@13 -- vbuc1_eq_vbuz1_then_la1 + lda #0 + cmp.z vblank_hit + beq __b13 + // main::@14 + // vblank_hit = 0 + // [67] (volatile byte) vblank_hit ← (byte) 0 -- vbuz1=vbuc1 + // wait for vblank + sta.z vblank_hit + // poke(0x2001) = 0x18 + // [68] *((byte*) 8193) ← (byte) $18 -- _deref_pbuc1=vbuc2 + lda #$18 + sta $2001 + // [50] phi from main::@14 to main::@3 [phi:main::@14->main::@3] + // [50] phi (byte) main::timer#3 = (byte) main::timer#15 [phi:main::@14->main::@3#0] -- register_copy + // [50] phi (byte) main::active_balls#2 = (byte) main::active_balls#8 [phi:main::@14->main::@3#1] -- register_copy + // [50] phi (byte) main::timer_2#2 = (byte) main::timer_2#1 [phi:main::@14->main::@3#2] -- register_copy + jmp __b4 + // main::@7 + __b7: + // balls[i].x_position += balls[i].x_velocity + // [69] (word~) main::$40 ← (word) main::i#10 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i_1 + asl + sta.z __40 + lda.z i_1+1 + rol + sta.z __40+1 + asl.z __40 + rol.z __40+1 + asl.z __40 + rol.z __40+1 + // [70] (word*~) main::$61 ← (word*)(const struct $0*) balls + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls + sta.z __61+1 + // [71] (word*~) main::$62 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+4 + sta.z __62+1 + // [72] (word*~) main::$63 ← (word*)(const struct $0*) balls + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls + sta.z __63+1 + // [73] *((word*~) main::$63) ← *((word*~) main::$61) + *((word*~) main::$62) -- _deref_pwuz1=_deref_pwuz2_plus__deref_pwuz3 + ldy #0 + lda (__61),y + clc + adc (__62),y + sta (__63),y + iny + lda (__61),y + adc (__62),y + sta (__63),y + // balls[i].y_velocity += WEIGHT + // [74] (word*~) main::$64 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+6 + sta.z __64+1 + // [75] (word*~) main::$65 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+6 + sta.z __65+1 + // [76] *((word*~) main::$65) ← *((word*~) main::$64) + (byte) $10 -- _deref_pwuz1=_deref_pwuz2_plus_vwuc1 + ldy #0 + lda (__64),y + clc + adc #<$10 + sta (__65),y + iny + lda (__64),y + adc #>$10 + sta (__65),y + // balls[i].y_position += (balls[i].y_velocity += WEIGHT) + // [77] (word*~) main::$66 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+2 + sta.z __66+1 + // [78] (word*~) main::$67 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+6 + sta.z __67+1 + // [79] (word*~) main::$68 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __40 + clc + adc #balls+2 + sta.z __68+1 + // [80] *((word*~) main::$68) ← *((word*~) main::$66) + *((word*~) main::$67) -- _deref_pwuz1=_deref_pwuz2_plus__deref_pwuz3 + ldy #0 + lda (__66),y + clc + adc (__67),y + sta (__68),y + iny + lda (__66),y + adc (__67),y + sta (__68),y + // balls[i].x_position >> 8 + // [81] (word*~) main::$69 ← (word*)(const struct $0*) balls + (word~) main::$40 -- pwuz1=pwuc1_plus_vwuz1 + clc + lda.z __69 + adc #balls + sta.z __69+1 + // [82] (word~) main::$20 ← *((word*~) main::$69) >> (byte) 8 -- vwuz1=_deref_pwuz1_ror_8 + ldy #1 + lda (__20),y + sta.z __20 + dey + sty.z __20+1 + // if ((balls[i].x_position >> 8) < 8) + // [83] if((word~) main::$20>=(byte) 8) goto main::@9 -- vwuz1_ge_vbuc1_then_la1 + tya + bne __b9 + lda.z __20 + cmp #8 + bcs __b9 + !: + // main::@11 + // balls[i].x_velocity ^= 0xFFFF + // [84] (word~) main::$45 ← (word) main::i#10 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i_1 + asl + sta.z __45 + lda.z i_1+1 + rol + sta.z __45+1 + asl.z __45 + rol.z __45+1 + asl.z __45 + rol.z __45+1 + // [85] (word*~) main::$72 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$45 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __45 + clc + adc #balls+4 + sta.z __72+1 + // [86] (word*~) main::$73 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$45 -- pwuz1=pwuc1_plus_vwuz1 + clc + lda.z __73 + adc #balls+4 + sta.z __73+1 + // [87] *((word*~) main::$73) ← *((word*~) main::$72) ^ (word) $ffff -- _deref_pwuz1=_deref_pwuz2_bxor_vwuc1 + ldy #0 + lda #<$ffff + eor (__72),y + sta (__73),y + iny + lda #>$ffff + eor (__72),y + sta (__73),y + // main::@9 + __b9: + // balls[i].y_position >> 8 + // [88] (word~) main::$44 ← (word) main::i#10 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i_1 + asl + sta.z __44 + lda.z i_1+1 + rol + sta.z __44+1 + asl.z __44 + rol.z __44+1 + asl.z __44 + rol.z __44+1 + // [89] (word*~) main::$70 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$44 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __44 + clc + adc #balls+2 + sta.z __70+1 + // [90] (word~) main::$23 ← *((word*~) main::$70) >> (byte) 8 -- vwuz1=_deref_pwuz1_ror_8 + ldy #1 + lda (__23),y + sta.z __23 + dey + sty.z __23+1 + // [91] (word*~) main::$71 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$44 -- pwuz1=pwuc1_plus_vwuz1 + clc + lda.z __71 + adc #balls+2 + sta.z __71+1 + // [92] (word~) main::$25 ← *((word*~) main::$71) >> (byte) 8 -- vwuz1=_deref_pwuz1_ror_8 + ldy #1 + lda (__25),y + sta.z __25 + dey + sty.z __25+1 + // h_bar + 8 + // [93] (byte~) main::$26 ← (byte) main::h_bar#1 + (byte) 8 -- vbuz1=vbuz2_plus_vbuc1 + lax.z h_bar + axs #-[8] + stx.z __26 + // if (((balls[i].y_position >> 8) >= h_bar) && (balls[i].y_position >> 8) < h_bar + 8) + // [94] if((word~) main::$23<(byte) main::h_bar#1) goto main::@10 -- vwuz1_lt_vbuz2_then_la1 + lda.z __23+1 + bne !+ + lda.z __23 + cmp.z h_bar + bcc __b10 + !: + // main::@24 + // [95] if((word~) main::$25>=(byte~) main::$26) goto main::@10 -- vwuz1_ge_vbuz2_then_la1 + lda.z __25+1 + bne __b10 + lda.z __25 + cmp.z __26 + bcs __b10 + !: + // main::@12 + // balls[i].y_velocity ^= 0xFFFF + // [96] (word~) main::$53 ← (word) main::i#10 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i_1 + asl + sta.z __53 + lda.z i_1+1 + rol + sta.z __53+1 + asl.z __53 + rol.z __53+1 + asl.z __53 + rol.z __53+1 + // [97] (word*~) main::$76 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$53 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __53 + clc + adc #balls+6 + sta.z __76+1 + // [98] (word*~) main::$77 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$53 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __53 + clc + adc #balls+6 + sta.z __77+1 + // [99] *((word*~) main::$77) ← *((word*~) main::$76) ^ (word) $ffff -- _deref_pwuz1=_deref_pwuz2_bxor_vwuc1 + ldy #0 + lda #<$ffff + eor (__76),y + sta (__77),y + iny + lda #>$ffff + eor (__76),y + sta (__77),y + // h_bar - 2 + // [100] (byte~) main::$30 ← (byte) main::h_bar#1 - (byte) 2 -- vbuaa=vbuz1_minus_2 + lda.z h_bar + sec + sbc #2 + // (unsigned short)(h_bar - 2) << 8 + // [101] (word~) main::$56 ← (word)(byte~) main::$30 -- vwuz1=_word_vbuaa + sta.z __56 + lda #0 + sta.z __56+1 + // [102] (word~) main::$31 ← (word~) main::$56 << (byte) 8 -- vwuz1=vwuz1_rol_8 + lda.z __31 + sta.z __31+1 + lda #0 + sta.z __31 + // balls[i].y_position = ((unsigned short)(h_bar - 2) << 8) + // [103] (word*~) main::$78 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$53 -- pwuz1=pwuc1_plus_vwuz1 + clc + lda.z __78 + adc #balls+2 + sta.z __78+1 + // [104] *((word*~) main::$78) ← (word~) main::$31 -- _deref_pwuz1=vwuz2 + ldy #0 + lda.z __31 + sta (__78),y + iny + lda.z __31+1 + sta (__78),y + // main::@10 + __b10: + // balls[i].y_position >> 8 + // [105] (word~) main::$50 ← (word) main::i#10 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i_1 + asl + sta.z __50 + lda.z i_1+1 + rol + sta.z __50+1 + asl.z __50 + rol.z __50+1 + asl.z __50 + rol.z __50+1 + // [106] (word*~) main::$74 ← (word*)(const struct $0*) balls+(byte) 2 + (word~) main::$50 -- pwuz1=pwuc1_plus_vwuz2 + lda.z __50 + clc + adc #balls+2 + sta.z __74+1 + // [107] (word~) main::$32 ← *((word*~) main::$74) >> (byte) 8 -- vwuz1=_deref_pwuz1_ror_8 + ldy #1 + lda (__32),y + sta.z __32 + dey + sty.z __32+1 + // SPRITE_BUFFER[sprite_idx].y = (unsigned char) (balls[i].y_position >> 8) + // [108] (byte~) main::$48 ← (byte) main::sprite_idx#3 << (byte) 2 -- vbuxx=vbuz1_rol_2 + lda.z sprite_idx + asl + asl + tax + // [109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER + (byte~) main::$48) ← (byte)(word~) main::$32 -- pbuc1_derefidx_vbuxx=_byte_vwuz1 + lda.z __32 + sta SPRITE_BUFFER,x + // SPRITE_BUFFER[sprite_idx].tile = 0x0a + // [110] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_TILE + (byte~) main::$48) ← (byte) $a -- pbuc1_derefidx_vbuxx=vbuc2 + lda #$a + sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_TILE,x + // SPRITE_BUFFER[sprite_idx].attributes = 3 + // [111] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES + (byte~) main::$48) ← (byte) 3 -- pbuc1_derefidx_vbuxx=vbuc2 + lda #3 + sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES,x + // balls[i].x_position >> 8 + // [112] (word*~) main::$75 ← (word*)(const struct $0*) balls + (word~) main::$50 -- pwuz1=pwuc1_plus_vwuz1 + clc + lda.z __75 + adc #balls + sta.z __75+1 + // [113] (word~) main::$33 ← *((word*~) main::$75) >> (byte) 8 -- vwuz1=_deref_pwuz1_ror_8 + ldy #1 + lda (__33),y + sta.z __33 + dey + sty.z __33+1 + // SPRITE_BUFFER[sprite_idx].x = (unsigned char) (balls[i].x_position >> 8) + // [114] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X + (byte~) main::$48) ← (byte)(word~) main::$33 -- pbuc1_derefidx_vbuxx=_byte_vwuz1 + sta SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X,x + // sprite_idx++; + // [115] (byte) main::sprite_idx#2 ← ++ (byte) main::sprite_idx#3 -- vbuz1=_inc_vbuz1 + inc.z sprite_idx + // for (i = 0; i < active_balls; i++) + // [116] (word) main::i#4 ← ++ (word) main::i#10 -- vwuz1=_inc_vwuz1 + inc.z i_1 + bne !+ + inc.z i_1+1 + !: + // [63] phi from main::@10 to main::@6 [phi:main::@10->main::@6] + // [63] phi (byte) main::sprite_idx#3 = (byte) main::sprite_idx#2 [phi:main::@10->main::@6#0] -- register_copy + // [63] phi (word) main::i#10 = (word) main::i#4 [phi:main::@10->main::@6#1] -- register_copy + jmp __b6 + // main::@25 + __b25: + // [117] (byte) main::timer#21 ← (byte) main::timer#1 -- vbuz1=vbuxx + stx.z timer + jmp __b5 + // [118] phi from main::@1 to main::@2 [phi:main::@1->main::@2] + // main::@2 + __b2: + // rand() + // [119] call rand + // [157] phi from main::@2 to rand [phi:main::@2->rand] + // [157] phi (word) rand_state#10 = (word) rand_state#17 [phi:main::@2->rand#0] -- register_copy + jsr rand + // rand() + // [120] (word) rand::return#2 ← (word) rand::return#0 + // main::@22 + // [121] (word~) main::$9 ← (word) rand::return#2 + // rand() & 0x3FF + // [122] (word~) main::$10 ← (word~) main::$9 & (word) $3ff -- vwuz1=vwuz1_band_vwuc1 + lda.z __10 + and #<$3ff + sta.z __10 + lda.z __10+1 + and #>$3ff + sta.z __10+1 + // balls[i].x_velocity = rand() & 0x3FF + // [123] (word~) main::$35 ← (word) main::i#14 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i + asl + sta.z __35 + lda.z i+1 + rol + sta.z __35+1 + asl.z __35 + rol.z __35+1 + asl.z __35 + rol.z __35+1 + // [124] (word*~) main::$59 ← (word*)(const struct $0*) balls+(byte) 4 + (word~) main::$35 -- pwuz1=pwuc1_plus_vwuz1 + clc + lda.z __59 + adc #balls+4 + sta.z __59+1 + // [125] *((word*~) main::$59) ← (word~) main::$10 -- _deref_pwuz1=vwuz2 + ldy #0 + lda.z __10 + sta (__59),y + iny + lda.z __10+1 + sta (__59),y + // rand() + // [126] call rand + // [157] phi from main::@22 to rand [phi:main::@22->rand] + // [157] phi (word) rand_state#10 = (word) rand_state#11 [phi:main::@22->rand#0] -- register_copy + jsr rand + // rand() + // [127] (word) rand::return#3 ← (word) rand::return#0 + // main::@23 + // [128] (word~) main::$11 ← (word) rand::return#3 + // rand() & 0x0FF + // [129] (byte~) main::$12 ← (word~) main::$11 & (byte) $ff -- vbuxx=vwuz1_band_vbuc1 + lda #$ff + and.z __11 + tax + // balls[i].y_velocity = rand() & 0x0FF + // [130] (word~) main::$36 ← (word) main::i#14 << (byte) 3 -- vwuz1=vwuz2_rol_3 + lda.z i + asl + sta.z __36 + lda.z i+1 + rol + sta.z __36+1 + asl.z __36 + rol.z __36+1 + asl.z __36 + rol.z __36+1 + // [131] (word*~) main::$60 ← (word*)(const struct $0*) balls+(byte) 6 + (word~) main::$36 -- pwuz1=pwuc1_plus_vwuz1 + clc + lda.z __60 + adc #balls+6 + sta.z __60+1 + // [132] *((word*~) main::$60) ← (byte~) main::$12 -- _deref_pwuz1=vbuxx + txa + ldy #0 + sta (__60),y + tya + iny + sta (__60),y + // for (i = 0; i < MAX_BALLS; i++) + // [133] (word) main::i#2 ← ++ (word) main::i#14 -- vwuz1=_inc_vwuz1 + inc.z i + bne !+ + inc.z i+1 + !: + // [48] phi from main::@23 to main::@1 [phi:main::@23->main::@1] + // [48] phi (word) rand_state#17 = (word) rand_state#11 [phi:main::@23->main::@1#0] -- register_copy + // [48] phi (word) main::i#14 = (word) main::i#2 [phi:main::@23->main::@1#1] -- register_copy + jmp __b1 +} + // ppuDataTransfer +// Transfer a number of bytes from the CPU memory to the PPU memory +// - ppuData : Pointer in the PPU memory +// - cpuData : Pointer to the CPU memory (RAM of ROM) +// - size : The number of bytes to transfer +// ppuDataTransfer(void* zp($11) cpuData) +ppuDataTransfer: { + .label ppuDataPrepare1_ppuData = $f + .label cpuSrc = $11 + .label i = $13 + .label cpuData = $11 + // ppuDataTransfer::ppuDataPrepare1 + // >ppuData + // [135] (byte~) ppuDataTransfer::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 -- vbuaa=_hi_pvoz1 + lda.z ppuDataPrepare1_ppuData+1 + // PPU->PPUADDR = >ppuData + // [136] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataTransfer::ppuDataPrepare1_$0 -- _deref_pbuc1=vbuaa + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR + // PPUADDR = ppuDataTransfer::@1] + // [140] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*) ppuDataTransfer::cpuSrc#6 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#0] -- register_copy + // [140] phi (word) ppuDataTransfer::i#2 = (word) 0 [phi:ppuDataTransfer::@3->ppuDataTransfer::@1#1] -- vwuz1=vwuc1 + lda #<0 + sta.z i + sta.z i+1 + // ppuDataTransfer::@1 + __b1: + // for(unsigned int i=0;iPPUDATA = val + // [144] *((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::@4 + // ppuDataPut(*cpuSrc++); + // [145] (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] + // [140] phi (byte*) ppuDataTransfer::cpuSrc#2 = (byte*) ppuDataTransfer::cpuSrc#1 [phi:ppuDataTransfer::@4->ppuDataTransfer::@1#0] -- register_copy + // [140] phi (word) ppuDataTransfer::i#2 = (word) ppuDataTransfer::i#1 [phi:ppuDataTransfer::@4->ppuDataTransfer::@1#1] -- register_copy + jmp __b1 +} + // ppuDataFill +// Fill a number of bytes in the PPU memory +// - ppuData : Pointer in the PPU memory +// - size : The number of bytes to transfer +// ppuDataFill(word zp($11) size) +ppuDataFill: { + .label ppuDataPrepare1_ppuData = $f + .label i = $13 + .label size = $11 + // ppuDataFill::ppuDataPrepare1 + // >ppuData + // [148] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 -- vbuaa=_hi_pvoz1 + lda.z ppuDataPrepare1_ppuData+1 + // PPU->PPUADDR = >ppuData + // [149] *((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] + // [152] phi (word) ppuDataFill::i#2 = (word) 0 [phi:ppuDataFill::ppuDataPrepare1->ppuDataFill::@1#0] -- vwuz1=vwuc1 + lda #<0 + sta.z i + sta.z i+1 + // Transfer to PPU + // ppuDataFill::@1 + __b1: + // for(unsigned int i=0;iPPUDATA = val + // [155] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) 0 -- _deref_pbuc1=vbuc2 + lda #0 + sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA + // ppuDataFill::@2 + // for(unsigned int i=0;ippuDataFill::@1] + // [152] phi (word) ppuDataFill::i#2 = (word) ppuDataFill::i#1 [phi:ppuDataFill::@2->ppuDataFill::@1#0] -- register_copy + jmp __b1 +} + // rand +// Returns a pseudo-random number in the range of 0 to RAND_MAX (65535) +// Uses an xorshift pseudorandom number generator that hits all different values +// Information https://en.wikipedia.org/wiki/Xorshift +// Source http://www.retroprogramming.com/2017/07/xorshift-pseudorandom-numbers-in-z80.html +rand: { + .label __0 = $3c + .label __1 = $3e + .label __2 = $40 + .label return = $36 + // rand_state << 7 + // [158] (word~) rand::$0 ← (word) rand_state#10 << (byte) 7 -- vwuz1=vwuz2_rol_7 + lda.z rand_state+1 + lsr + lda.z rand_state + ror + sta.z __0+1 + lda #0 + ror + sta.z __0 + // rand_state ^= rand_state << 7 + // [159] (word) rand_state#0 ← (word) rand_state#10 ^ (word~) rand::$0 -- vwuz1=vwuz1_bxor_vwuz2 + lda.z rand_state + eor.z __0 + sta.z rand_state + lda.z rand_state+1 + eor.z __0+1 + sta.z rand_state+1 + // rand_state >> 9 + // [160] (word~) rand::$1 ← (word) rand_state#0 >> (byte) 9 -- vwuz1=vwuz2_ror_9 + lsr + sta.z __1 + lda #0 + sta.z __1+1 + // rand_state ^= rand_state >> 9 + // [161] (word) rand_state#1 ← (word) rand_state#0 ^ (word~) rand::$1 -- vwuz1=vwuz1_bxor_vwuz2 + lda.z rand_state + eor.z __1 + sta.z rand_state + lda.z rand_state+1 + eor.z __1+1 + sta.z rand_state+1 + // rand_state << 8 + // [162] (word~) rand::$2 ← (word) rand_state#1 << (byte) 8 -- vwuz1=vwuz2_rol_8 + lda.z rand_state + sta.z __2+1 + lda #0 + sta.z __2 + // rand_state ^= rand_state << 8 + // [163] (word) rand_state#11 ← (word) rand_state#1 ^ (word~) rand::$2 -- vwuz1=vwuz1_bxor_vwuz2 + lda.z rand_state + eor.z __2 + sta.z rand_state + lda.z rand_state+1 + eor.z __2+1 + sta.z rand_state+1 + // return rand_state; + // [164] (word) rand::return#0 ← (word) rand_state#11 -- vwuz1=vwuz2 + lda.z rand_state + sta.z return + lda.z rand_state+1 + sta.z return+1 + // rand::@return + // } + // [165] return + rts +} + // File Data +.segment GameRam + // Moving balls (in GameRAM) + balls: .fill 8*$40, 0 +.segment Data + sine_table: .byte $40, $42, $43, $45, $46, $48, $49, $4b, $4c, $4e, $50, $51, $53, $54, $56, $57, $58, $5a, $5b, $5d, $5e, $60, $61, $62, $64, $65, $66, $67, $69, $6a, $6b, $6c, $6d, $6e, $6f, $70, $71, $72, $73, $74, $75, $76, $77, $78, $78, $79, $7a, $7b, $7b, $7c, $7c, $7d, $7d, $7e, $7e, $7e, $7f, $7f, $7f, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $80, $7f, $7f, $7f, $7e, $7e, $7e, $7d, $7d, $7c, $7c, $7b, $7b, $7a, $79, $78, $78, $77, $76, $75, $74, $73, $72, $71, $70, $6f, $6e, $6d, $6c, $6b, $6a, $69, $67, $66, $65, $64, $62, $61, $60, $5e, $5d, $5b, $5a, $58, $57, $56, $54, $53, $51, $50, $4e, $4c, $4b, $49, $48, $46, $45, $43, $42, $40, $3e, $3d, $3b, $3a, $38, $37, $35, $34, $32, $30, $2f, $2d, $2c, $2a, $29, $28, $26, $25, $23, $22, $20, $1f, $1e, $1c, $1b, $1a, $19, $17, $16, $15, $14, $13, $12, $11, $10, $f, $e, $d, $c, $b, $a, 9, 8, 8, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, $a, $b, $c, $d, $e, $f, $10, $11, $12, $13, $14, $15, $16, $17, $19, $1a, $1b, $1c, $1e, $1f, $20, $22, $23, $25, $26, $28, $29, $2a, $2c, $2d, $2f, $30, $32, $34, $35, $37, $38, $3a, $3b, $3d, $3e + palette: .byte $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4, $34, $24, $14, 4 + h_bar_tilemap: .byte 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +.segment Tiles +TILES: +.import binary "lazydata.chr" + +.segment GameRam + .align $100 + SPRITE_BUFFER: .fill 4*$100, 0 +.segment Vectors + VECTORS: .word vblank, main, 0 + diff --git a/src/test/ref/complex/nes-balls/kickballs-3.sym b/src/test/ref/complex/nes-balls/kickballs-3.sym new file mode 100644 index 000000000..b295d8373 --- /dev/null +++ b/src/test/ref/complex/nes-balls/kickballs-3.sym @@ -0,0 +1,310 @@ +(word) $0::x_position +(word) $0::x_velocity +(word) $0::y_position +(word) $0::y_velocity +(const struct RICOH_2A03*) APU = (struct RICOH_2A03*) 16384 +(const nomodify byte*) FR_COUNTER = (byte*) 16407 +(const nomodify byte*) MEMORY = (byte*) 0 +(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = (byte) $10 +(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA = (byte) $14 +(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR = (byte) 3 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR = (byte) 6 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA = (byte) 7 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK = (byte) 1 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = (byte) 5 +(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = (byte) 2 +(const byte) OFFSET_STRUCT_SPRITEDATA_ATTRIBUTES = (byte) 2 +(const byte) OFFSET_STRUCT_SPRITEDATA_TILE = (byte) 1 +(const byte) OFFSET_STRUCT_SPRITEDATA_X = (byte) 3 +(const struct RICOH_2C02*) PPU = (struct RICOH_2C02*) 8192 +(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 = (byte*) 9152 +(const nomodify byte*) PPU_NAME_TABLE_0 = (byte*) 8192 +(const nomodify byte*) PPU_PALETTE = (byte*) 16128 +(const nomodify to_volatile byte*) PPU_PPUSTATUS = (byte*) 8194 +(const byte) RADIX::BINARY = (number) 2 +(const byte) RADIX::DECIMAL = (number) $a +(const byte) RADIX::HEXADECIMAL = (number) $10 +(const byte) RADIX::OCTAL = (number) 8 +(byte) RICOH_2A03::DMC_FREQ +(byte) RICOH_2A03::DMC_LEN +(byte) RICOH_2A03::DMC_RAW +(byte) RICOH_2A03::DMC_START +(byte) RICOH_2A03::JOY1 +(byte) RICOH_2A03::JOY2 +(byte) RICOH_2A03::NOISE_HI +(byte) RICOH_2A03::NOISE_LO +(byte) RICOH_2A03::NOISE_VOL +(byte) RICOH_2A03::OAMDMA +(byte) RICOH_2A03::SND_CHN +(byte) RICOH_2A03::SQ1_HI +(byte) RICOH_2A03::SQ1_LO +(byte) RICOH_2A03::SQ1_SWEEP +(byte) RICOH_2A03::SQ1_VOL +(byte) RICOH_2A03::SQ2_HI +(byte) RICOH_2A03::SQ2_LO +(byte) RICOH_2A03::SQ2_SWEEP +(byte) RICOH_2A03::SQ2_VOL +(byte) RICOH_2A03::TRI_HI +(byte) RICOH_2A03::TRI_LINEAR +(byte) RICOH_2A03::TRI_LO +(byte) RICOH_2A03::UNUSED1 +(byte) RICOH_2A03::UNUSED2 +(byte) RICOH_2C02::OAMADDR +(byte) RICOH_2C02::OAMDATA +(byte) RICOH_2C02::PPUADDR +(byte) RICOH_2C02::PPUCTRL +(byte) RICOH_2C02::PPUDATA +(byte) RICOH_2C02::PPUMASK +(byte) RICOH_2C02::PPUSCROLL +(volatile byte) RICOH_2C02::PPUSTATUS loadstore +(const byte) SIZEOF_BYTE = (byte) 1 +(const struct SpriteData*) SPRITE_BUFFER[(number) $100] = { fill( $100, 0) } +(byte) SpriteData::attributes +(byte) SpriteData::tile +(byte) SpriteData::x +(byte) SpriteData::y +(const byte*) TILES[] = kickasm {{ .import binary "lazydata.chr" + }} +(const to_nomodify void()**) VECTORS[] = { &interrupt(HARDWARE_STACK)(void()) vblank(), &(signed word()) main(), (void()*) 0 } +(void()) __start() +(label) __start::@1 +(label) __start::@return +(label) __start::__init1 +(const struct $0*) balls[(number) $40] = { fill( $40, 0) } +(const to_nomodify byte*) h_bar_tilemap[] = { (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1, (byte) 1 } +(signed word()) main() +(word~) main::$10 zp[2]:54 67.33333333333333 +(word~) main::$11 zp[2]:54 202.0 +(byte~) main::$12 reg byte x 67.33333333333333 +(byte~) main::$14 reg byte a 202.0 +(word~) main::$20 zp[2]:15 2002.0 +(word~) main::$23 zp[2]:39 500.5 +(word~) main::$25 zp[2]:37 667.3333333333334 +(byte~) main::$26 zp[1]:41 1001.0 +(byte~) main::$30 reg byte a 1001.0 +(word~) main::$31 zp[2]:48 1001.0 +(word~) main::$32 zp[2]:52 500.5 +(word~) main::$33 zp[2]:50 1001.0 +(word~) main::$35 zp[2]:56 202.0 +(word~) main::$36 zp[2]:58 202.0 +(byte~) main::$38 reg byte x 151.5 +(word~) main::$40 zp[2]:15 834.1666666666666 +(word~) main::$44 zp[2]:37 1001.0 +(word~) main::$45 zp[2]:33 1501.5 +(byte~) main::$48 reg byte x 834.1666666666667 +(word~) main::$50 zp[2]:50 429.0 +(word~) main::$53 zp[2]:42 572.0 +(word~) main::$56 zp[2]:48 2002.0 +(word*~) main::$59 zp[2]:56 202.0 +(word*~) main::$60 zp[2]:58 202.0 +(word*~) main::$61 zp[2]:17 667.3333333333334 +(word*~) main::$62 zp[2]:19 1001.0 +(word*~) main::$63 zp[2]:21 2002.0 +(word*~) main::$64 zp[2]:23 1001.0 +(word*~) main::$65 zp[2]:25 2002.0 +(word*~) main::$66 zp[2]:27 667.3333333333334 +(word*~) main::$67 zp[2]:29 1001.0 +(word*~) main::$68 zp[2]:31 2002.0 +(word*~) main::$69 zp[2]:15 2002.0 +(word*~) main::$70 zp[2]:39 2002.0 +(word*~) main::$71 zp[2]:37 2002.0 +(word*~) main::$72 zp[2]:35 1001.0 +(word*~) main::$73 zp[2]:33 2002.0 +(word*~) main::$74 zp[2]:52 2002.0 +(word*~) main::$75 zp[2]:50 2002.0 +(word*~) main::$76 zp[2]:44 1001.0 +(word*~) main::$77 zp[2]:46 2002.0 +(word*~) main::$78 zp[2]:42 2002.0 +(word~) main::$9 zp[2]:54 202.0 +(label) main::@1 +(label) main::@10 +(label) main::@11 +(label) main::@12 +(label) main::@13 +(label) main::@14 +(label) main::@15 +(label) main::@16 +(label) main::@17 +(label) main::@18 +(label) main::@19 +(label) main::@2 +(label) main::@20 +(label) main::@21 +(label) main::@22 +(label) main::@23 +(label) main::@24 +(label) main::@25 +(label) main::@3 +(label) main::@4 +(label) main::@5 +(label) main::@6 +(label) main::@7 +(label) main::@8 +(label) main::@9 +(byte) main::active_balls +(byte) main::active_balls#1 active_balls zp[1]:5 75.75 +(byte) main::active_balls#2 active_balls zp[1]:5 56.11111111111111 +(byte) main::active_balls#8 active_balls zp[1]:5 25.545454545454547 +(label) main::enableVideoOutput1 +(byte) main::h_bar +(byte) main::h_bar#1 h_bar zp[1]:14 51.69354838709677 +(word) main::i +(word) main::i#10 i_1 zp[2]:7 163.42857142857142 +(word) main::i#14 i zp[2]:2 29.705882352941178 +(word) main::i#2 i zp[2]:2 202.0 +(word) main::i#4 i_1 zp[2]:7 2002.0 +(label) main::initNES1 +(label) main::initNES1_@1 +(label) main::initNES1_@7 +(label) main::initNES1_clearVBlankFlag1 +(label) main::initNES1_disableAudioOutput1 +(label) main::initNES1_disableVideoOutput1 +(byte) main::initNES1_i +(byte) main::initNES1_i#1 reg byte x 151.5 +(byte) main::initNES1_i#2 reg byte x 112.22222222222223 +(label) main::initNES1_waitForVBlank1 +(byte~) main::initNES1_waitForVBlank1_$0 reg byte a 202.0 +(label) main::initNES1_waitForVBlank1_@1 +(label) main::initNES1_waitForVBlank2 +(byte~) main::initNES1_waitForVBlank2_$0 reg byte a 202.0 +(label) main::initNES1_waitForVBlank2_@1 +(signed word) main::return +(byte) main::sprite_idx +(byte) main::sprite_idx#2 sprite_idx zp[1]:9 1001.0 +(byte) main::sprite_idx#3 sprite_idx zp[1]:9 62.5625 +(byte) main::timer +(byte) main::timer#1 reg byte x 101.0 +(byte) main::timer#15 timer zp[1]:6 5.50909090909091 +(byte) main::timer#21 timer zp[1]:6 202.0 +(byte) main::timer#3 timer zp[1]:6 57.714285714285715 +(byte) main::timer_2 +(byte) main::timer_2#1 timer_2 zp[1]:4 4.522388059701492 +(byte) main::timer_2#2 timer_2 zp[1]:4 202.0 +(const to_nomodify byte*) palette[] = { (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4, (byte) $34, (byte) $24, (byte) $14, (byte) 4 } +(void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size) +(label) ppuDataFill::@1 +(label) ppuDataFill::@2 +(label) ppuDataFill::@return +(word) ppuDataFill::i +(word) ppuDataFill::i#1 i zp[2]:19 2002.0 +(word) ppuDataFill::i#2 i zp[2]:19 1001.0 +(nomodify void*) ppuDataFill::ppuData +(label) ppuDataFill::ppuDataPrepare1 +(byte~) ppuDataFill::ppuDataPrepare1_$0 reg byte a 202.0 +(byte~) ppuDataFill::ppuDataPrepare1_$1 reg byte a 202.0 +(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData +(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ppuDataPrepare1_ppuData zp[2]:15 67.33333333333333 +(label) ppuDataFill::ppuDataPut1 +(byte) ppuDataFill::ppuDataPut1_val +(word) ppuDataFill::size +(word) ppuDataFill::size#3 size zp[2]:17 111.22222222222223 +(byte) ppuDataFill::val +(void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size) +(label) ppuDataTransfer::@1 +(label) ppuDataTransfer::@2 +(label) ppuDataTransfer::@3 +(label) ppuDataTransfer::@4 +(label) ppuDataTransfer::@return +(nomodify void*) ppuDataTransfer::cpuData +(nomodify void*) ppuDataTransfer::cpuData#2 cpuData zp[2]:17 +(byte*) ppuDataTransfer::cpuSrc +(byte*) ppuDataTransfer::cpuSrc#1 cpuSrc zp[2]:17 1001.0 +(byte*) ppuDataTransfer::cpuSrc#2 cpuSrc zp[2]:17 776.0 +(byte*) ppuDataTransfer::cpuSrc#6 cpuSrc zp[2]:17 202.0 +(word) ppuDataTransfer::i +(word) ppuDataTransfer::i#1 i zp[2]:19 2002.0 +(word) ppuDataTransfer::i#2 i zp[2]:19 600.5999999999999 +(nomodify void*) ppuDataTransfer::ppuData +(label) ppuDataTransfer::ppuDataPrepare1 +(byte~) ppuDataTransfer::ppuDataPrepare1_$0 reg byte a 202.0 +(byte~) ppuDataTransfer::ppuDataPrepare1_$1 reg byte a 202.0 +(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData +(nomodify void*) ppuDataTransfer::ppuDataPrepare1_ppuData#0 ppuDataPrepare1_ppuData zp[2]:15 67.33333333333333 +(label) ppuDataTransfer::ppuDataPut1 +(byte) ppuDataTransfer::ppuDataPut1_val +(byte) ppuDataTransfer::ppuDataPut1_val#0 reg byte a 2002.0 +(word) ppuDataTransfer::size +(const byte*) printf_buffer_number::digits[(number) $b] = { fill( $b, 0) } +(byte) printf_buffer_number::sign +(byte) printf_format_number::justify_left +(byte) printf_format_number::min_length +(byte) printf_format_number::radix +(byte) printf_format_number::sign_always +(byte) printf_format_number::upper_case +(byte) printf_format_number::zero_padding +(byte) printf_format_string::justify_left +(byte) printf_format_string::min_length +(word()) rand() +(word~) rand::$0 zp[2]:60 2002.0 +(word~) rand::$1 zp[2]:62 2002.0 +(word~) rand::$2 zp[2]:64 2002.0 +(label) rand::@return +(word) rand::return +(word) rand::return#0 return zp[2]:54 300.75 +(word) rand::return#2 return zp[2]:54 202.0 +(word) rand::return#3 return zp[2]:54 202.0 +(word) rand_state +(word) rand_state#0 rand_state zp[2]:10 1501.5 +(word) rand_state#1 rand_state zp[2]:10 1501.5 +(word) rand_state#10 rand_state zp[2]:10 1102.0 +(word) rand_state#11 rand_state zp[2]:10 122.44444444444446 +(word) rand_state#17 rand_state zp[2]:10 67.33333333333333 +(volatile byte) scroll_y loadstore zp[1]:12 105.0 +(const to_nomodify byte*) sine_table[(number) $100] = { (byte) $40, (byte) $42, (byte) $43, (byte) $45, (byte) $46, (byte) $48, (byte) $49, (byte) $4b, (byte) $4c, (byte) $4e, (byte) $50, (byte) $51, (byte) $53, (byte) $54, (byte) $56, (byte) $57, (byte) $58, (byte) $5a, (byte) $5b, (byte) $5d, (byte) $5e, (byte) $60, (byte) $61, (byte) $62, (byte) $64, (byte) $65, (byte) $66, (byte) $67, (byte) $69, (byte) $6a, (byte) $6b, (byte) $6c, (byte) $6d, (byte) $6e, (byte) $6f, (byte) $70, (byte) $71, (byte) $72, (byte) $73, (byte) $74, (byte) $75, (byte) $76, (byte) $77, (byte) $78, (byte) $78, (byte) $79, (byte) $7a, (byte) $7b, (byte) $7b, (byte) $7c, (byte) $7c, (byte) $7d, (byte) $7d, (byte) $7e, (byte) $7e, (byte) $7e, (byte) $7f, (byte) $7f, (byte) $7f, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $80, (byte) $7f, (byte) $7f, (byte) $7f, (byte) $7e, (byte) $7e, (byte) $7e, (byte) $7d, (byte) $7d, (byte) $7c, (byte) $7c, (byte) $7b, (byte) $7b, (byte) $7a, (byte) $79, (byte) $78, (byte) $78, (byte) $77, (byte) $76, (byte) $75, (byte) $74, (byte) $73, (byte) $72, (byte) $71, (byte) $70, (byte) $6f, (byte) $6e, (byte) $6d, (byte) $6c, (byte) $6b, (byte) $6a, (byte) $69, (byte) $67, (byte) $66, (byte) $65, (byte) $64, (byte) $62, (byte) $61, (byte) $60, (byte) $5e, (byte) $5d, (byte) $5b, (byte) $5a, (byte) $58, (byte) $57, (byte) $56, (byte) $54, (byte) $53, (byte) $51, (byte) $50, (byte) $4e, (byte) $4c, (byte) $4b, (byte) $49, (byte) $48, (byte) $46, (byte) $45, (byte) $43, (byte) $42, (byte) $40, (byte) $3e, (byte) $3d, (byte) $3b, (byte) $3a, (byte) $38, (byte) $37, (byte) $35, (byte) $34, (byte) $32, (byte) $30, (byte) $2f, (byte) $2d, (byte) $2c, (byte) $2a, (byte) $29, (byte) $28, (byte) $26, (byte) $25, (byte) $23, (byte) $22, (byte) $20, (byte) $1f, (byte) $1e, (byte) $1c, (byte) $1b, (byte) $1a, (byte) $19, (byte) $17, (byte) $16, (byte) $15, (byte) $14, (byte) $13, (byte) $12, (byte) $11, (byte) $10, (byte) $f, (byte) $e, (byte) $d, (byte) $c, (byte) $b, (byte) $a, (byte) 9, (byte) 8, (byte) 8, (byte) 7, (byte) 6, (byte) 5, (byte) 5, (byte) 4, (byte) 4, (byte) 3, (byte) 3, (byte) 2, (byte) 2, (byte) 2, (byte) 1, (byte) 1, (byte) 1, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 0, (byte) 1, (byte) 1, (byte) 1, (byte) 2, (byte) 2, (byte) 2, (byte) 3, (byte) 3, (byte) 4, (byte) 4, (byte) 5, (byte) 5, (byte) 6, (byte) 7, (byte) 8, (byte) 8, (byte) 9, (byte) $a, (byte) $b, (byte) $c, (byte) $d, (byte) $e, (byte) $f, (byte) $10, (byte) $11, (byte) $12, (byte) $13, (byte) $14, (byte) $15, (byte) $16, (byte) $17, (byte) $19, (byte) $1a, (byte) $1b, (byte) $1c, (byte) $1e, (byte) $1f, (byte) $20, (byte) $22, (byte) $23, (byte) $25, (byte) $26, (byte) $28, (byte) $29, (byte) $2a, (byte) $2c, (byte) $2d, (byte) $2f, (byte) $30, (byte) $32, (byte) $34, (byte) $35, (byte) $37, (byte) $38, (byte) $3a, (byte) $3b, (byte) $3d, (byte) $3e } +interrupt(HARDWARE_STACK)(void()) vblank() +(label) vblank::@1 +(label) vblank::@return +(label) vblank::ppuSpriteBufferDmaTransfer1 +(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer +(volatile byte) vblank_hit loadstore zp[1]:13 8.65625 + +reg byte x [ main::initNES1_i#2 main::initNES1_i#1 ] +zp[2]:2 [ main::i#14 main::i#2 ] +zp[1]:4 [ main::timer_2#2 main::timer_2#1 ] +zp[1]:5 [ main::active_balls#2 main::active_balls#8 main::active_balls#1 ] +zp[1]:6 [ main::timer#3 main::timer#15 main::timer#21 ] +zp[2]:7 [ main::i#10 main::i#4 ] +zp[1]:9 [ main::sprite_idx#3 main::sprite_idx#2 ] +zp[2]:10 [ rand_state#10 rand_state#17 rand_state#11 rand_state#0 rand_state#1 ] +zp[1]:12 [ scroll_y ] +zp[1]:13 [ vblank_hit ] +reg byte a [ main::initNES1_waitForVBlank1_$0 ] +reg byte a [ main::initNES1_waitForVBlank2_$0 ] +zp[1]:14 [ main::h_bar#1 ] +reg byte a [ main::$14 ] +reg byte x [ main::timer#1 ] +reg byte x [ main::$38 ] +zp[2]:15 [ main::$40 main::$69 main::$20 ppuDataFill::ppuDataPrepare1_ppuData#0 ppuDataTransfer::ppuDataPrepare1_ppuData#0 ] +zp[2]:17 [ main::$61 ppuDataFill::size#3 ppuDataTransfer::cpuData#2 ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#6 ppuDataTransfer::cpuSrc#1 ] +zp[2]:19 [ main::$62 ppuDataFill::i#2 ppuDataFill::i#1 ppuDataTransfer::i#2 ppuDataTransfer::i#1 ] +zp[2]:21 [ main::$63 ] +zp[2]:23 [ main::$64 ] +zp[2]:25 [ main::$65 ] +zp[2]:27 [ main::$66 ] +zp[2]:29 [ main::$67 ] +zp[2]:31 [ main::$68 ] +zp[2]:33 [ main::$45 main::$73 ] +zp[2]:35 [ main::$72 ] +zp[2]:37 [ main::$44 main::$71 main::$25 ] +zp[2]:39 [ main::$70 main::$23 ] +zp[1]:41 [ main::$26 ] +zp[2]:42 [ main::$53 main::$78 ] +zp[2]:44 [ main::$76 ] +zp[2]:46 [ main::$77 ] +reg byte a [ main::$30 ] +zp[2]:48 [ main::$56 main::$31 ] +zp[2]:50 [ main::$50 main::$75 main::$33 ] +zp[2]:52 [ main::$74 main::$32 ] +reg byte x [ main::$48 ] +zp[2]:54 [ rand::return#2 main::$9 rand::return#0 main::$10 rand::return#3 main::$11 ] +zp[2]:56 [ main::$35 main::$59 ] +reg byte x [ main::$12 ] +zp[2]:58 [ main::$36 main::$60 ] +reg byte a [ ppuDataTransfer::ppuDataPrepare1_$0 ] +reg byte a [ ppuDataTransfer::ppuDataPrepare1_$1 ] +reg byte a [ ppuDataTransfer::ppuDataPut1_val#0 ] +reg byte a [ ppuDataFill::ppuDataPrepare1_$0 ] +reg byte a [ ppuDataFill::ppuDataPrepare1_$1 ] +zp[2]:60 [ rand::$0 ] +zp[2]:62 [ rand::$1 ] +zp[2]:64 [ rand::$2 ]