1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-10-21 17:24:39 +00:00

Added a Goomba and all-directional joy movement.

This commit is contained in:
jespergravgaard 2020-05-26 23:10:50 +02:00
parent d8f6331d38
commit 70d90102bb
8 changed files with 2919 additions and 1586 deletions

View File

@ -46,6 +46,34 @@ void clearVBlankFlag();
// Note: Calling this will destroy the stack, so it only works if called directly inside the reset routine.
void initNES();
// Read Standard Controller #1
// Returns a byte representing the pushed buttons
// - bit 0: right
// - bit 1: left
// - bit 2: down
// - bit 3: up
// - bit 4: start
// - bit 5: select
// - bit 6: B
// - bit 7: A
char readJoy1();
// Standard Controller Right Button
const char JOY_RIGHT = 0b00000001;
// Standard Controller Left Button
const char JOY_LEFT = 0b00000010;
// Standard Controller Down Button
const char JOY_DOWN = 0b00000100;
// Standard Controller Up Button
const char JOY_UP = 0b00001000;
// Standard Controller Start Button
const char JOY_START = 0b00010000;
// Standard Controller Select Button
const char JOY_SELECT = 0b00100000;
// Standard Controller B Button
const char JOY_B = 0b01000000;
// Standard Controller A Button
const char JOY_A = 0b10000000;
// Prepare for transferring data from the CPU to the PPU
// - ppuData : Pointer in the PPU memory

View File

@ -84,6 +84,26 @@ inline void ppuSpriteBufferDmaTransfer(struct SpriteData* spriteBuffer) {
APU->OAMDMA = >spriteBuffer;
}
// Read Standard Controller #1
// Returns a byte representing the pushed buttons
// - bit 0: right
// - bit 1: left
// - bit 2: down
// - bit 3: up
// - bit 4: start
// - bit 5: select
// - bit 6: B
// - bit 7: A
char readJoy1() {
// Latch the controller buttons
APU->JOY1 = 1;
APU->JOY1 = 0;
char joy = 0;
for(char i=0;i<8;i++)
joy = joy<<1 | APU->JOY1&1;
return joy;
}
// Prepare for transfering data from the CPU to the PPU
// - ppuData : Pointer in the PPU memory
inline void ppuDataPrepare(void* const ppuData) {

View File

@ -11,6 +11,7 @@
.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

View File

@ -4,10 +4,6 @@
#include <nes.h>
#include <string.h>
// Sprite OAM Buffer
// Will be transfered to the PPU via DMA during vblank
struct SpriteData * const OAM_BUFFER = 0x0200;
// RESET Called when the NES is reset, including when it is turned on.
void main() {
// Initialize NES after RESET
@ -18,24 +14,14 @@ void main() {
ppuDataFill(PPU_NAME_TABLE_0, 0xfc, 0x3c0);
// Fill the PPU attribute table
ppuDataFill(PPU_ATTRIBUTE_TABLE_0, 0, 0x40);
// Show the entire tile set
//char ch=0;
//for(char y=0;y!=16;y++) {
// ppuDataPrepare(PPU_NAME_TABLE_0+32*4+4+(unsigned int)y*32);
// for(char x=0;x!=16;x++)
// ppuDataPut(ch++);
//}
// Show floor
for(char x=0;x<32;x+=2)
ppuDataPutTile(PPU_NAME_TABLE_0+20*32+x, FLOOR);
// Show flag
ppuDataPutTile(PPU_NAME_TABLE_0+18*32+28, FLAG);
// Initialize Sprite OAM Buffer with the SPRITE data
for(char i=0;i<sizeof(SPRITES); i++)
((char*)OAM_BUFFER)[i] = ((char*)SPRITES)[i];
// Set initial scroll
PPU->PPUSCROLL = 0;
PPU->PPUSCROLL = -8;
// Initialize Sprite Buffer with the SPRITE data
memcpy(SPRITE_BUFFER, SPRITES, sizeof(SPRITES));
// Enable screen rendering and vblank
enableVideoOutput();
// Infinite loop
@ -47,68 +33,94 @@ void main() {
interrupt(hardware_stack) void vblank() {
// DMA transfer the entire sprite buffer to the PPU
ppuSpriteBufferDmaTransfer(OAM_BUFFER);
ppuSpriteBufferDmaTransfer(SPRITE_BUFFER);
// Latch the controller buttons
APU->JOY1 = 1;
APU->JOY1 = 0;
// Controllers for first and second player are now latched and will not change
// Read controller 1
char joy = readJoy1();
// Read button A on controller 1
if(APU->JOY1&0b00000001) {
// move the Luigi sprites right
OAM_BUFFER[0].y++;
OAM_BUFFER[1].y++;
OAM_BUFFER[2].y++;
OAM_BUFFER[3].y++;
if(joy&JOY_DOWN) {
SPRITE_BUFFER[0].y++;
SPRITE_BUFFER[1].y++;
SPRITE_BUFFER[2].y++;
SPRITE_BUFFER[3].y++;
}
// Read button B on controller 1
if(APU->JOY1&0b00000001) {
// move the Luigi sprites left
OAM_BUFFER[0].y--;
OAM_BUFFER[1].y--;
OAM_BUFFER[2].y--;
OAM_BUFFER[3].y--;
if(joy&JOY_UP) {
SPRITE_BUFFER[0].y--;
SPRITE_BUFFER[1].y--;
SPRITE_BUFFER[2].y--;
SPRITE_BUFFER[3].y--;
}
if(joy&JOY_LEFT) {
SPRITE_BUFFER[0].x--;
SPRITE_BUFFER[1].x--;
SPRITE_BUFFER[2].x--;
SPRITE_BUFFER[3].x--;
}
if(joy&JOY_RIGHT) {
SPRITE_BUFFER[0].x++;
SPRITE_BUFFER[1].x++;
SPRITE_BUFFER[2].x++;
SPRITE_BUFFER[3].x++;
}
// Set scroll
PPU->PPUSCROLL = 0;
PPU->PPUSCROLL = -8;
}
// Data (in PRG ROM)
#pragma data_seg(Data)
// Flag tile
char FLAG[] = { 0x54, 0x55, 0x56, 0x57};
// Floor tile
char FLOOR[] = { 0x85, 0x85, 0x86, 0x86};
// Small Luigi Sprite Data
// Sprite Data
struct SpriteData SPRITES[] = {
// Y , TILE, ATTR , X
{ 128, 0x36, 0b00000010, 128 }, // Sprite 0
{ 128, 0x37, 0b00000010, 136 }, // Sprite 1
{ 136, 0x38, 0b00000010, 128 }, // Sprite 2
{ 136, 0x39, 0b00000010, 136 } // Sprite 3
// Small Luigi
{ 150, 0x36, 0b00000010, 12 }, // Sprite 0
{ 150, 0x37, 0b00000010, 20 }, // Sprite 1
{ 158, 0x38, 0b00000010, 12 }, // Sprite 2
{ 158, 0x39, 0b00000010, 20 }, // Sprite 3
// Small Goomba
{ 150, 0x70, 0b00000000, 72 }, // Sprite 0
{ 150, 0x71, 0b00000000, 80 }, // Sprite 1
{ 158, 0x72, 0b00000001, 72 }, // Sprite 2
{ 158, 0x73, 0b00000001, 80 } // Sprite 3
};
// Color Palette
char PALETTE[0x20] = {
// Background palettes
0x0f, 0x13, 0x23, 0x33,
0x0f, 0x2d, 0x08, 0x18,
0x0f, 0x06, 0x15, 0x36,
0x0f, 0x39, 0x4a, 0x5b,
0x0f, 0x3d, 0x4e, 0x5f,
// Sprite palettes (selected by the attribute bits 0-1 of the sprites)
0x0f, 0x1c, 0x15, 0x14,
0x0f, 0x02, 0x38, 0x3c,
0x0f, 0x30, 0x37, 0x1a, // Luigi-like colors
0x11, 0x0f, 0x30, 0x08, // Goomba upper colors
0x11, 0x0f, 0x18, 0x08, // Goomba lower colors
0x11, 0x30, 0x37, 0x1a, // Luigi-like colors
0x0f, 0x0f, 0x0f, 0x0f // All black
};
// Tile Set
// Tile Set (in CHR ROM)
#pragma data_seg(Tiles)
export char TILES[] = kickasm(resource "smb1_chr.bin") {{
.import binary "smb1_chr.bin"
}};
// Interrupt Vectors
// Sprite Buffer (in GAME RAM)
// Will be transfered to the PPU via DMA during vblank
#pragma data_seg(GameRam)
struct SpriteData align(0x100) SPRITE_BUFFER[0x40];
// 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)

View File

@ -13,6 +13,7 @@
.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
@ -28,16 +29,25 @@
// Mirroring nibble 0001 == Vertical mirroring only
.segment Code
// Standard Controller Right Button
.const JOY_RIGHT = 1
// Standard Controller Left Button
.const JOY_LEFT = 2
// Standard Controller Down Button
.const JOY_DOWN = 4
// Standard Controller Up Button
.const JOY_UP = 8
.const SIZEOF_STRUCT_SPRITEDATA = 4
.const OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = $10
.const OFFSET_STRUCT_RICOH_2C02_PPUMASK = 1
.const OFFSET_STRUCT_RICOH_2C02_PPUSTATUS = 2
.const OFFSET_STRUCT_RICOH_2C02_OAMADDR = 3
.const OFFSET_STRUCT_RICOH_2A03_OAMDMA = $14
.const OFFSET_STRUCT_RICOH_2A03_JOY1 = $16
.const OFFSET_STRUCT_RICOH_2C02_PPUADDR = 6
.const OFFSET_STRUCT_RICOH_2C02_PPUDATA = 7
.const OFFSET_STRUCT_SPRITEDATA_X = 3
.const OFFSET_STRUCT_RICOH_2C02_PPUSCROLL = 5
.const OFFSET_STRUCT_RICOH_2A03_JOY1 = $16
.const SIZEOF_BYTE = 1
// $2000-$23bf $03c0 Name table 0
.label PPU_NAME_TABLE_0 = $2000
@ -60,9 +70,6 @@
.label FR_COUNTER = $4017
// Pointer to the start of RAM memory
.label MEMORY = 0
// Sprite OAM Buffer
// Will be transfered to the PPU via DMA during vblank
.label OAM_BUFFER = $200
// PPU Status Register for reading in ASM
.label PPU_PPUSTATUS = $2002
// NES Picture Processing Unit (PPU)
@ -155,13 +162,6 @@ main: {
sta.z ppuDataFill.ppuDataPrepare1_ppuData+1
jsr ppuDataFill
ldx #0
// Show the entire tile set
//char ch=0;
//for(char y=0;y!=16;y++) {
// ppuDataPrepare(PPU_NAME_TABLE_0+32*4+4+(unsigned int)y*32);
// for(char x=0;x!=16;x++)
// ppuDataPut(ch++);
//}
// Show floor
__b1:
// for(char x=0;x<32;x+=2)
@ -178,19 +178,9 @@ main: {
lda #>PPU_NAME_TABLE_0+$12*$20+$1c
sta.z ppuDataPutTile.ppuData+1
jsr ppuDataPutTile
ldx #0
// Initialize Sprite OAM Buffer with the SPRITE data
__b4:
// for(char i=0;i<sizeof(SPRITES); i++)
cpx #4*SIZEOF_STRUCT_SPRITEDATA
bcc __b5
// PPU->PPUSCROLL = 0
// Set initial scroll
lda #0
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL
// PPU->PPUSCROLL = -8
lda #-8
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL
// memcpy(SPRITE_BUFFER, SPRITES, sizeof(SPRITES))
// Initialize Sprite Buffer with the SPRITE data
jsr memcpy
// PPU->PPUCTRL = 0b10000000
lda #$80
sta PPU
@ -200,13 +190,6 @@ main: {
__b3:
// Infinite loop
jmp __b3
__b5:
// ((char*)OAM_BUFFER)[i] = ((char*)SPRITES)[i]
lda SPRITES,x
sta OAM_BUFFER,x
// for(char i=0;i<sizeof(SPRITES); i++)
inx
jmp __b4
__b2:
// PPU_NAME_TABLE_0+20*32+x
txa
@ -230,11 +213,11 @@ main: {
// Transfer a 2x2 tile into the PPU memory
// - ppuData : Pointer in the PPU memory
// - tile : The tile to transfer
// ppuDataPutTile(byte* zp(6) ppuData, byte* zp(2) tile)
// ppuDataPutTile(byte* zp(2) ppuData, byte* zp(4) tile)
ppuDataPutTile: {
.label ppuDataPrepare2_ppuData = 6
.label ppuData = 6
.label tile = 2
.label ppuDataPrepare2_ppuData = 2
.label ppuData = 2
.label tile = 4
// >ppuData
lda.z ppuData+1
// PPU->PPUADDR = >ppuData
@ -282,14 +265,57 @@ ppuDataPutTile: {
// }
rts
}
// Copy block of memory (forwards)
// Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.
memcpy: {
.const num = 8*SIZEOF_STRUCT_SPRITEDATA
.label destination = SPRITE_BUFFER
.label source = SPRITES
.label src_end = source+num
.label dst = 4
.label src = 2
lda #<destination
sta.z dst
lda #>destination
sta.z dst+1
lda #<source
sta.z src
lda #>source
sta.z src+1
__b1:
// while(src!=src_end)
lda.z src+1
cmp #>src_end
bne __b2
lda.z src
cmp #<src_end
bne __b2
// }
rts
__b2:
// *dst++ = *src++
ldy #0
lda (src),y
sta (dst),y
// *dst++ = *src++;
inc.z dst
bne !+
inc.z dst+1
!:
inc.z src
bne !+
inc.z src+1
!:
jmp __b1
}
// Fill a number of bytes in the PPU memory
// - ppuData : Pointer in the PPU memory
// - size : The number of bytes to transfer
// ppuDataFill(byte register(X) val, word zp(2) size)
// ppuDataFill(byte register(X) val, word zp(6) size)
ppuDataFill: {
.label ppuDataPrepare1_ppuData = 6
.label i = 4
.label size = 2
.label ppuDataPrepare1_ppuData = 4
.label i = 2
.label size = 6
// >ppuData
lda.z ppuDataPrepare1_ppuData+1
// PPU->PPUADDR = >ppuData
@ -389,45 +415,79 @@ vblank: {
lda #0
sta PPU+OFFSET_STRUCT_RICOH_2C02_OAMADDR
// APU->OAMDMA = >spriteBuffer
lda #>OAM_BUFFER
lda #>SPRITE_BUFFER
sta APU+OFFSET_STRUCT_RICOH_2A03_OAMDMA
// APU->JOY1 = 1
// Latch the controller buttons
lda #1
sta APU+OFFSET_STRUCT_RICOH_2A03_JOY1
// APU->JOY1 = 0
lda #0
sta APU+OFFSET_STRUCT_RICOH_2A03_JOY1
// APU->JOY1&0b00000001
lda #1
and APU+OFFSET_STRUCT_RICOH_2A03_JOY1
// if(APU->JOY1&0b00000001)
// readJoy1()
jsr readJoy1
// joy = readJoy1()
tax
// joy&JOY_DOWN
txa
and #JOY_DOWN
// if(joy&JOY_DOWN)
cmp #0
beq __b1
// OAM_BUFFER[0].y++;
inc OAM_BUFFER
// OAM_BUFFER[1].y++;
inc OAM_BUFFER+1*SIZEOF_STRUCT_SPRITEDATA
// OAM_BUFFER[2].y++;
inc OAM_BUFFER+2*SIZEOF_STRUCT_SPRITEDATA
// OAM_BUFFER[3].y++;
inc OAM_BUFFER+3*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[0].y++;
inc SPRITE_BUFFER
// SPRITE_BUFFER[1].y++;
inc SPRITE_BUFFER+1*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[2].y++;
inc SPRITE_BUFFER+2*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[3].y++;
inc SPRITE_BUFFER+3*SIZEOF_STRUCT_SPRITEDATA
__b1:
// APU->JOY1&0b00000001
lda #1
and APU+OFFSET_STRUCT_RICOH_2A03_JOY1
// if(APU->JOY1&0b00000001)
// joy&JOY_UP
txa
and #JOY_UP
// if(joy&JOY_UP)
cmp #0
beq __breturn
// OAM_BUFFER[0].y--;
dec OAM_BUFFER
// OAM_BUFFER[1].y--;
dec OAM_BUFFER+1*SIZEOF_STRUCT_SPRITEDATA
// OAM_BUFFER[2].y--;
dec OAM_BUFFER+2*SIZEOF_STRUCT_SPRITEDATA
// OAM_BUFFER[3].y--;
dec OAM_BUFFER+3*SIZEOF_STRUCT_SPRITEDATA
__breturn:
beq __b2
// SPRITE_BUFFER[0].y--;
dec SPRITE_BUFFER
// SPRITE_BUFFER[1].y--;
dec SPRITE_BUFFER+1*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[2].y--;
dec SPRITE_BUFFER+2*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[3].y--;
dec SPRITE_BUFFER+3*SIZEOF_STRUCT_SPRITEDATA
__b2:
// joy&JOY_LEFT
txa
and #JOY_LEFT
// if(joy&JOY_LEFT)
cmp #0
beq __b3
// SPRITE_BUFFER[0].x--;
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X
// SPRITE_BUFFER[1].x--;
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+1*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[2].x--;
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+2*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[3].x--;
dec SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+3*SIZEOF_STRUCT_SPRITEDATA
__b3:
// joy&JOY_RIGHT
txa
and #JOY_RIGHT
// if(joy&JOY_RIGHT)
cmp #0
beq __b4
// SPRITE_BUFFER[0].x++;
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X
// SPRITE_BUFFER[1].x++;
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+1*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[2].x++;
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+2*SIZEOF_STRUCT_SPRITEDATA
// SPRITE_BUFFER[3].x++;
inc SPRITE_BUFFER+OFFSET_STRUCT_SPRITEDATA_X+3*SIZEOF_STRUCT_SPRITEDATA
__b4:
// PPU->PPUSCROLL = 0
// Set scroll
lda #0
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL
// PPU->PPUSCROLL = -8
lda #-8
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUSCROLL
// }
pla
tay
@ -436,18 +496,60 @@ vblank: {
pla
rti
}
// Read Standard Controller #1
// Returns a byte representing the pushed buttons
// - bit 0: right
// - bit 1: left
// - bit 2: down
// - bit 3: up
// - bit 4: start
// - bit 5: select
// - bit 6: B
// - bit 7: A
readJoy1: {
.label __1 = 8
// APU->JOY1 = 1
// Latch the controller buttons
lda #1
sta APU+OFFSET_STRUCT_RICOH_2A03_JOY1
// APU->JOY1 = 0
lda #0
sta APU+OFFSET_STRUCT_RICOH_2A03_JOY1
tax
__b1:
// for(char i=0;i<8;i++)
cpx #8
bcc __b2
// }
rts
__b2:
// joy<<1
asl
sta.z __1
// APU->JOY1&1
lda #1
and APU+OFFSET_STRUCT_RICOH_2A03_JOY1
// joy = joy<<1 | APU->JOY1&1
ora.z __1
// for(char i=0;i<8;i++)
inx
jmp __b1
}
.segment Data
// Flag tile
FLAG: .byte $54, $55, $56, $57
// Floor tile
FLOOR: .byte $85, $85, $86, $86
// Small Luigi Sprite Data
SPRITES: .byte $80, $36, 2, $80, $80, $37, 2, $88, $88, $38, 2, $80, $88, $39, 2, $88
// Sprite Data
SPRITES: .byte $96, $36, 2, $c, $96, $37, 2, $14, $9e, $38, 2, $c, $9e, $39, 2, $14, $96, $70, 0, $48, $96, $71, 0, $50, $9e, $72, 1, $48, $9e, $73, 1, $50
// Color Palette
PALETTE: .byte $f, $13, $23, $33, $f, 6, $15, $36, $f, $39, $4a, $5b, $f, $3d, $4e, $5f, $f, $1c, $15, $14, $f, 2, $38, $3c, $f, $30, $37, $1a, $f, $f, $f, $f
PALETTE: .byte $f, $2d, 8, $18, $f, 6, $15, $36, $f, $39, $4a, $5b, $f, $3d, $4e, $5f, $11, $f, $30, 8, $11, $f, $18, 8, $11, $30, $37, $1a, $f, $f, $f, $f
.segment Tiles
TILES:
.import binary "smb1_chr.bin"
.segment GameRam
.align $100
SPRITE_BUFFER: .fill 4*$40, 0
.segment Vectors
VECTORS: .word vblank, main, 0

View File

@ -55,186 +55,244 @@ main::initNES1_waitForVBlank2_@1: scope:[main] from main::initNES1_waitForVBlan
to:main::initNES1_@7
main::initNES1_@7: scope:[main] from main::initNES1_waitForVBlank2_@1
asm { ldaPPU_PPUSTATUS }
to:main::@8
main::@8: scope:[main] from main::initNES1_@7
to:main::@5
main::@5: scope:[main] from main::initNES1_@7
[29] phi()
[30] call ppuDataTransfer
to:main::@9
main::@9: scope:[main] from main::@8
to:main::@6
main::@6: scope:[main] from main::@5
[31] phi()
[32] call ppuDataFill
to:main::@10
main::@10: scope:[main] from main::@9
to:main::@7
main::@7: scope:[main] from main::@6
[33] phi()
[34] call ppuDataFill
to:main::@1
main::@1: scope:[main] from main::@10 main::@11
[35] (byte) main::x#2 ← phi( main::@10/(byte) 0 main::@11/(byte) main::x#1 )
main::@1: scope:[main] from main::@7 main::@8
[35] (byte) main::x#2 ← phi( main::@7/(byte) 0 main::@8/(byte) main::x#1 )
[36] if((byte) main::x#2<(byte) $20) goto main::@2
to:main::@3
main::@3: scope:[main] from main::@1
[37] phi()
[38] call ppuDataPutTile
to:main::@4
main::@4: scope:[main] from main::@3 main::@5
[39] (byte) main::i#2 ← phi( main::@3/(byte) 0 main::@5/(byte) main::i#1 )
[40] if((byte) main::i#2<(byte) 4*(const byte) SIZEOF_STRUCT_SPRITEDATA) goto main::@5
to:main::@6
main::@6: scope:[main] from main::@4
[41] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0
[42] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) -8
to:main::@9
main::@9: scope:[main] from main::@3
[39] phi()
[40] call memcpy
to:main::enableVideoOutput1
main::enableVideoOutput1: scope:[main] from main::@6
[43] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80
[44] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $18
to:main::@7
main::@7: scope:[main] from main::@7 main::enableVideoOutput1
[45] phi()
to:main::@7
main::@5: scope:[main] from main::@4
[46] *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER + (byte) main::i#2) ← *((byte*)(const struct SpriteData*) SPRITES + (byte) main::i#2)
[47] (byte) main::i#1 ← ++ (byte) main::i#2
main::enableVideoOutput1: scope:[main] from main::@9
[41] *((byte*)(const struct RICOH_2C02*) PPU) ← (byte) $80
[42] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUMASK) ← (byte) $18
to:main::@4
main::@4: scope:[main] from main::@4 main::enableVideoOutput1
[43] phi()
to:main::@4
main::@2: scope:[main] from main::@1
[48] (nomodify byte*) ppuDataPutTile::ppuData#0 ← (const nomodify byte*) PPU_NAME_TABLE_0+(word)(number) $14*(number) $20 + (byte) main::x#2
[49] (nomodify void*) ppuDataPutTile::ppuData#9 ← (void*)(nomodify byte*) ppuDataPutTile::ppuData#0
[50] call ppuDataPutTile
to:main::@11
main::@11: scope:[main] from main::@2
[51] (byte) main::x#1 ← (byte) main::x#2 + (byte) 2
[44] (nomodify byte*) ppuDataPutTile::ppuData#0 ← (const nomodify byte*) PPU_NAME_TABLE_0+(word)(number) $14*(number) $20 + (byte) main::x#2
[45] (nomodify void*) ppuDataPutTile::ppuData#9 ← (void*)(nomodify byte*) ppuDataPutTile::ppuData#0
[46] call ppuDataPutTile
to:main::@8
main::@8: scope:[main] from main::@2
[47] (byte) main::x#1 ← (byte) main::x#2 + (byte) 2
to:main::@1
(void()) ppuDataPutTile((nomodify void*) ppuDataPutTile::ppuData , (byte*) ppuDataPutTile::tile)
ppuDataPutTile: scope:[ppuDataPutTile] from main::@2 main::@3
[52] (byte*) ppuDataPutTile::tile#10 ← phi( main::@2/(const byte*) FLOOR main::@3/(const byte*) FLAG )
[52] (nomodify void*) ppuDataPutTile::ppuData#2 ← phi( main::@2/(nomodify void*) ppuDataPutTile::ppuData#9 main::@3/(void*)(const nomodify byte*) PPU_NAME_TABLE_0+(word)(number) $12*(number) $20+(byte) $1c )
[48] (byte*) ppuDataPutTile::tile#10 ← phi( main::@2/(const byte*) FLOOR main::@3/(const byte*) FLAG )
[48] (nomodify void*) ppuDataPutTile::ppuData#2 ← phi( main::@2/(nomodify void*) ppuDataPutTile::ppuData#9 main::@3/(void*)(const nomodify byte*) PPU_NAME_TABLE_0+(word)(number) $12*(number) $20+(byte) $1c )
to:ppuDataPutTile::ppuDataPrepare1
ppuDataPutTile::ppuDataPrepare1: scope:[ppuDataPutTile] from ppuDataPutTile
[53] (byte~) ppuDataPutTile::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataPutTile::ppuData#2
[54] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$0
[55] (byte~) ppuDataPutTile::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataPutTile::ppuData#2
[56] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$1
[49] (byte~) ppuDataPutTile::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataPutTile::ppuData#2
[50] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$0
[51] (byte~) ppuDataPutTile::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataPutTile::ppuData#2
[52] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare1_$1
to:ppuDataPutTile::@1
ppuDataPutTile::@1: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPrepare1
[57] (byte) ppuDataPutTile::ppuDataPut1_val#0 ← *((byte*) ppuDataPutTile::tile#10)
[53] (byte) ppuDataPutTile::ppuDataPut1_val#0 ← *((byte*) ppuDataPutTile::tile#10)
to:ppuDataPutTile::ppuDataPut1
ppuDataPutTile::ppuDataPut1: scope:[ppuDataPutTile] from ppuDataPutTile::@1
[58] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut1_val#0
[54] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut1_val#0
to:ppuDataPutTile::@2
ppuDataPutTile::@2: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPut1
[59] (byte) ppuDataPutTile::ppuDataPut2_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 1)
[55] (byte) ppuDataPutTile::ppuDataPut2_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 1)
to:ppuDataPutTile::ppuDataPut2
ppuDataPutTile::ppuDataPut2: scope:[ppuDataPutTile] from ppuDataPutTile::@2
[60] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut2_val#0
[56] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut2_val#0
to:ppuDataPutTile::@3
ppuDataPutTile::@3: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPut2
[61] (nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 ← (byte*)(nomodify void*) ppuDataPutTile::ppuData#2 + (byte) $20
[57] (nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 ← (byte*)(nomodify void*) ppuDataPutTile::ppuData#2 + (byte) $20
to:ppuDataPutTile::ppuDataPrepare2
ppuDataPutTile::ppuDataPrepare2: scope:[ppuDataPutTile] from ppuDataPutTile::@3
[62] (byte~) ppuDataPutTile::ppuDataPrepare2_$0 ← > (void*)(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0
[63] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$0
[64] (byte~) ppuDataPutTile::ppuDataPrepare2_$1 ← < (void*)(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0
[65] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$1
[58] (byte~) ppuDataPutTile::ppuDataPrepare2_$0 ← > (void*)(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0
[59] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$0
[60] (byte~) ppuDataPutTile::ppuDataPrepare2_$1 ← < (void*)(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0
[61] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataPutTile::ppuDataPrepare2_$1
to:ppuDataPutTile::@4
ppuDataPutTile::@4: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPrepare2
[66] (byte) ppuDataPutTile::ppuDataPut3_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 2)
[62] (byte) ppuDataPutTile::ppuDataPut3_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 2)
to:ppuDataPutTile::ppuDataPut3
ppuDataPutTile::ppuDataPut3: scope:[ppuDataPutTile] from ppuDataPutTile::@4
[67] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut3_val#0
[63] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut3_val#0
to:ppuDataPutTile::@5
ppuDataPutTile::@5: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPut3
[68] (byte) ppuDataPutTile::ppuDataPut4_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 3)
[64] (byte) ppuDataPutTile::ppuDataPut4_val#0 ← *((byte*) ppuDataPutTile::tile#10 + (byte) 3)
to:ppuDataPutTile::ppuDataPut4
ppuDataPutTile::ppuDataPut4: scope:[ppuDataPutTile] from ppuDataPutTile::@5
[69] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut4_val#0
[65] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataPutTile::ppuDataPut4_val#0
to:ppuDataPutTile::@return
ppuDataPutTile::@return: scope:[ppuDataPutTile] from ppuDataPutTile::ppuDataPut4
[70] return
[66] return
to:@return
(void*()) memcpy((void*) memcpy::destination , (void*) memcpy::source , (word) memcpy::num)
memcpy: scope:[memcpy] from main::@9
[67] phi()
to:memcpy::@1
memcpy::@1: scope:[memcpy] from memcpy memcpy::@2
[68] (byte*) memcpy::dst#2 ← phi( memcpy/(byte*)(const void*) memcpy::destination#0 memcpy::@2/(byte*) memcpy::dst#1 )
[68] (byte*) memcpy::src#2 ← phi( memcpy/(byte*)(const void*) memcpy::source#0 memcpy::@2/(byte*) memcpy::src#1 )
[69] if((byte*) memcpy::src#2!=(const byte*) memcpy::src_end#0) goto memcpy::@2
to:memcpy::@return
memcpy::@return: scope:[memcpy] from memcpy::@1
[70] return
to:@return
memcpy::@2: scope:[memcpy] from memcpy::@1
[71] *((byte*) memcpy::dst#2) ← *((byte*) memcpy::src#2)
[72] (byte*) memcpy::dst#1 ← ++ (byte*) memcpy::dst#2
[73] (byte*) memcpy::src#1 ← ++ (byte*) memcpy::src#2
to:memcpy::@1
(void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size)
ppuDataFill: scope:[ppuDataFill] from main::@10 main::@9
[71] (byte) ppuDataFill::val#4 ← phi( main::@10/(byte) 0 main::@9/(byte) $fc )
[71] (word) ppuDataFill::size#3 ← phi( main::@10/(byte) $40 main::@9/(word) $3c0 )
[71] (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ← phi( main::@10/(void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 main::@9/(void*)(const nomodify byte*) PPU_NAME_TABLE_0 )
ppuDataFill: scope:[ppuDataFill] from main::@6 main::@7
[74] (byte) ppuDataFill::val#4 ← phi( main::@6/(byte) $fc main::@7/(byte) 0 )
[74] (word) ppuDataFill::size#3 ← phi( main::@6/(word) $3c0 main::@7/(byte) $40 )
[74] (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ← phi( main::@6/(void*)(const nomodify byte*) PPU_NAME_TABLE_0 main::@7/(void*)(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 )
to:ppuDataFill::ppuDataPrepare1
ppuDataFill::ppuDataPrepare1: scope:[ppuDataFill] from ppuDataFill
[72] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0
[73] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0
[74] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0
[75] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$1
[75] (byte~) ppuDataFill::ppuDataPrepare1_$0 ← > (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0
[76] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$0
[77] (byte~) ppuDataFill::ppuDataPrepare1_$1 ← < (nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0
[78] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte~) ppuDataFill::ppuDataPrepare1_$1
to:ppuDataFill::@1
ppuDataFill::@1: scope:[ppuDataFill] from ppuDataFill::@2 ppuDataFill::ppuDataPrepare1
[76] (word) ppuDataFill::i#2 ← phi( ppuDataFill::ppuDataPrepare1/(word) 0 ppuDataFill::@2/(word) ppuDataFill::i#1 )
[77] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1
[79] (word) ppuDataFill::i#2 ← phi( ppuDataFill::ppuDataPrepare1/(word) 0 ppuDataFill::@2/(word) ppuDataFill::i#1 )
[80] if((word) ppuDataFill::i#2<(word) ppuDataFill::size#3) goto ppuDataFill::ppuDataPut1
to:ppuDataFill::@return
ppuDataFill::@return: scope:[ppuDataFill] from ppuDataFill::@1
[78] return
[81] return
to:@return
ppuDataFill::ppuDataPut1: scope:[ppuDataFill] from ppuDataFill::@1
[79] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4
[82] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataFill::val#4
to:ppuDataFill::@2
ppuDataFill::@2: scope:[ppuDataFill] from ppuDataFill::ppuDataPut1
[80] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2
[83] (word) ppuDataFill::i#1 ← ++ (word) ppuDataFill::i#2
to:ppuDataFill::@1
(void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size)
ppuDataTransfer: scope:[ppuDataTransfer] from main::@8
[81] phi()
ppuDataTransfer: scope:[ppuDataTransfer] from main::@5
[84] phi()
to:ppuDataTransfer::ppuDataPrepare1
ppuDataTransfer::ppuDataPrepare1: scope:[ppuDataTransfer] from ppuDataTransfer
[82] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0
[83] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0
[85] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← >(const nomodify void*) ppuDataTransfer::ppuData#0
[86] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUADDR) ← (byte) 0
to:ppuDataTransfer::@1
ppuDataTransfer::@1: scope:[ppuDataTransfer] from ppuDataTransfer::@3 ppuDataTransfer::ppuDataPrepare1
[84] (byte*) ppuDataTransfer::cpuSrc#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 ppuDataTransfer::@3/(byte*) ppuDataTransfer::cpuSrc#1 )
[84] (word) ppuDataTransfer::i#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(word) 0 ppuDataTransfer::@3/(word) ppuDataTransfer::i#1 )
[85] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2
[87] (byte*) ppuDataTransfer::cpuSrc#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(byte*)(const nomodify void*) ppuDataTransfer::cpuData#0 ppuDataTransfer::@3/(byte*) ppuDataTransfer::cpuSrc#1 )
[87] (word) ppuDataTransfer::i#2 ← phi( ppuDataTransfer::ppuDataPrepare1/(word) 0 ppuDataTransfer::@3/(word) ppuDataTransfer::i#1 )
[88] if((word) ppuDataTransfer::i#2<(const word) ppuDataTransfer::size#0) goto ppuDataTransfer::@2
to:ppuDataTransfer::@return
ppuDataTransfer::@return: scope:[ppuDataTransfer] from ppuDataTransfer::@1
[86] return
[89] return
to:@return
ppuDataTransfer::@2: scope:[ppuDataTransfer] from ppuDataTransfer::@1
[87] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2)
[90] (byte) ppuDataTransfer::ppuDataPut1_val#0 ← *((byte*) ppuDataTransfer::cpuSrc#2)
to:ppuDataTransfer::ppuDataPut1
ppuDataTransfer::ppuDataPut1: scope:[ppuDataTransfer] from ppuDataTransfer::@2
[88] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0
[91] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUDATA) ← (byte) ppuDataTransfer::ppuDataPut1_val#0
to:ppuDataTransfer::@3
ppuDataTransfer::@3: scope:[ppuDataTransfer] from ppuDataTransfer::ppuDataPut1
[89] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2
[90] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2
[92] (byte*) ppuDataTransfer::cpuSrc#1 ← ++ (byte*) ppuDataTransfer::cpuSrc#2
[93] (word) ppuDataTransfer::i#1 ← ++ (word) ppuDataTransfer::i#2
to:ppuDataTransfer::@1
interrupt(HARDWARE_STACK)(void()) vblank()
vblank: scope:[vblank] from
[91] phi()
[94] phi()
to:vblank::ppuSpriteBufferDmaTransfer1
vblank::ppuSpriteBufferDmaTransfer1: scope:[vblank] from vblank
[92] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0
[93] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const nomodify struct SpriteData*) OAM_BUFFER
to:vblank::@4
vblank::@4: scope:[vblank] from vblank::ppuSpriteBufferDmaTransfer1
[94] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1
[95] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0
[96] (byte~) vblank::$1 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1
[97] if((byte) 0==(byte~) vblank::$1) goto vblank::@1
to:vblank::@2
vblank::@2: scope:[vblank] from vblank::@4
[98] *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER) ← ++ *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER)
[99] *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[100] *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[101] *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[95] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_OAMADDR) ← (byte) 0
[96] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA) ← >(const struct SpriteData*) SPRITE_BUFFER
to:vblank::@9
vblank::@9: scope:[vblank] from vblank::ppuSpriteBufferDmaTransfer1
[97] phi()
[98] call readJoy1
[99] (byte) readJoy1::return#2 ← (byte) readJoy1::joy#2
to:vblank::@10
vblank::@10: scope:[vblank] from vblank::@9
[100] (byte) vblank::joy#0 ← (byte) readJoy1::return#2
[101] (byte~) vblank::$2 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_DOWN
[102] if((byte) 0==(byte~) vblank::$2) goto vblank::@1
to:vblank::@5
vblank::@5: scope:[vblank] from vblank::@10
[103] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER)
[104] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[105] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[106] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA)
to:vblank::@1
vblank::@1: scope:[vblank] from vblank::@2 vblank::@4
[102] (byte~) vblank::$3 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1
[103] if((byte) 0==(byte~) vblank::$3) goto vblank::@return
vblank::@1: scope:[vblank] from vblank::@10 vblank::@5
[107] (byte~) vblank::$4 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_UP
[108] if((byte) 0==(byte~) vblank::$4) goto vblank::@2
to:vblank::@6
vblank::@6: scope:[vblank] from vblank::@1
[109] *((byte*)(const struct SpriteData*) SPRITE_BUFFER) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER)
[110] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[111] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[112] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA)
to:vblank::@2
vblank::@2: scope:[vblank] from vblank::@1 vblank::@6
[113] (byte~) vblank::$6 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_LEFT
[114] if((byte) 0==(byte~) vblank::$6) goto vblank::@3
to:vblank::@7
vblank::@7: scope:[vblank] from vblank::@2
[115] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X)
[116] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[117] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[118] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA)
to:vblank::@3
vblank::@3: scope:[vblank] from vblank::@1
[104] *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER) ← -- *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER)
[105] *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[106] *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[107] *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← -- *((byte*)(const nomodify struct SpriteData*) OAM_BUFFER+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA)
vblank::@3: scope:[vblank] from vblank::@2 vblank::@7
[119] (byte~) vblank::$8 ← (byte) vblank::joy#0 & (const nomodify byte) JOY_RIGHT
[120] if((byte) 0==(byte~) vblank::$8) goto vblank::@4
to:vblank::@8
vblank::@8: scope:[vblank] from vblank::@3
[121] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X)
[122] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 1*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[123] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 2*(const byte) SIZEOF_STRUCT_SPRITEDATA)
[124] *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA) ← ++ *((byte*)(const struct SpriteData*) SPRITE_BUFFER+(const byte) OFFSET_STRUCT_SPRITEDATA_X+(byte) 3*(const byte) SIZEOF_STRUCT_SPRITEDATA)
to:vblank::@4
vblank::@4: scope:[vblank] from vblank::@3 vblank::@8
[125] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) 0
[126] *((byte*)(const struct RICOH_2C02*) PPU+(const byte) OFFSET_STRUCT_RICOH_2C02_PPUSCROLL) ← (byte) -8
to:vblank::@return
vblank::@return: scope:[vblank] from vblank::@1 vblank::@3
[108] return
vblank::@return: scope:[vblank] from vblank::@4
[127] return
to:@return
(byte()) readJoy1()
readJoy1: scope:[readJoy1] from vblank::@9
[128] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 1
[129] *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) ← (byte) 0
to:readJoy1::@1
readJoy1::@1: scope:[readJoy1] from readJoy1 readJoy1::@2
[130] (byte) readJoy1::joy#2 ← phi( readJoy1/(byte) 0 readJoy1::@2/(byte) readJoy1::joy#1 )
[130] (byte) readJoy1::i#2 ← phi( readJoy1/(byte) 0 readJoy1::@2/(byte) readJoy1::i#1 )
[131] if((byte) readJoy1::i#2<(byte) 8) goto readJoy1::@2
to:readJoy1::@return
readJoy1::@return: scope:[readJoy1] from readJoy1::@1
[132] return
to:@return
readJoy1::@2: scope:[readJoy1] from readJoy1::@1
[133] (byte~) readJoy1::$1 ← (byte) readJoy1::joy#2 << (byte) 1
[134] (byte~) readJoy1::$2 ← *((byte*)(const struct RICOH_2A03*) APU+(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1) & (byte) 1
[135] (byte) readJoy1::joy#1 ← (byte~) readJoy1::$1 | (byte~) readJoy1::$2
[136] (byte) readJoy1::i#1 ← ++ (byte) readJoy1::i#2
to:readJoy1::@1

File diff suppressed because it is too large Load Diff

View File

@ -5,8 +5,11 @@
(const byte*) FLAG[] = { (byte) $54, (byte) $55, (byte) $56, (byte) $57 }
(const byte*) FLOOR[] = { (byte) $85, (byte) $85, (byte) $86, (byte) $86 }
(const nomodify byte*) FR_COUNTER = (byte*) 16407
(const nomodify byte) JOY_DOWN = (byte) 4
(const nomodify byte) JOY_LEFT = (byte) 2
(const nomodify byte) JOY_RIGHT = (byte) 1
(const nomodify byte) JOY_UP = (byte) 8
(const nomodify byte*) MEMORY = (byte*) 0
(const nomodify struct SpriteData*) OAM_BUFFER = (struct SpriteData*) 512
(const byte) OFFSET_STRUCT_RICOH_2A03_DMC_FREQ = (byte) $10
(const byte) OFFSET_STRUCT_RICOH_2A03_JOY1 = (byte) $16
(const byte) OFFSET_STRUCT_RICOH_2A03_OAMDMA = (byte) $14
@ -16,7 +19,8 @@
(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*) PALETTE[(number) $20] = { (byte) $f, (byte) $13, (byte) $23, (byte) $33, (byte) $f, (byte) 6, (byte) $15, (byte) $36, (byte) $f, (byte) $39, (byte) $4a, (byte) $5b, (byte) $f, (byte) $3d, (byte) $4e, (byte) $5f, (byte) $f, (byte) $1c, (byte) $15, (byte) $14, (byte) $f, (byte) 2, (byte) $38, (byte) $3c, (byte) $f, (byte) $30, (byte) $37, (byte) $1a, (byte) $f, (byte) $f, (byte) $f, (byte) $f }
(const byte) OFFSET_STRUCT_SPRITEDATA_X = (byte) 3
(const byte*) PALETTE[(number) $20] = { (byte) $f, (byte) $2d, (byte) 8, (byte) $18, (byte) $f, (byte) 6, (byte) $15, (byte) $36, (byte) $f, (byte) $39, (byte) $4a, (byte) $5b, (byte) $f, (byte) $3d, (byte) $4e, (byte) $5f, (byte) $11, (byte) $f, (byte) $30, (byte) 8, (byte) $11, (byte) $f, (byte) $18, (byte) 8, (byte) $11, (byte) $30, (byte) $37, (byte) $1a, (byte) $f, (byte) $f, (byte) $f, (byte) $f }
(const struct RICOH_2C02*) PPU = (struct RICOH_2C02*) 8192
(const nomodify byte*) PPU_ATTRIBUTE_TABLE_0 = (byte*) 9152
(const nomodify byte*) PPU_NAME_TABLE_0 = (byte*) 8192
@ -56,7 +60,8 @@
(volatile byte) RICOH_2C02::PPUSTATUS loadstore
(const byte) SIZEOF_BYTE = (byte) 1
(const byte) SIZEOF_STRUCT_SPRITEDATA = (byte) 4
(const struct SpriteData*) SPRITES[] = { { y: (byte) $80, tile: (byte) $36, attributes: (byte) 2, x: (byte) $80 }, { y: (byte) $80, tile: (byte) $37, attributes: (byte) 2, x: (byte) $88 }, { y: (byte) $88, tile: (byte) $38, attributes: (byte) 2, x: (byte) $80 }, { y: (byte) $88, tile: (byte) $39, attributes: (byte) 2, x: (byte) $88 } }
(const struct SpriteData*) SPRITES[] = { { y: (byte) $96, tile: (byte) $36, attributes: (byte) 2, x: (byte) $c }, { y: (byte) $96, tile: (byte) $37, attributes: (byte) 2, x: (byte) $14 }, { y: (byte) $9e, tile: (byte) $38, attributes: (byte) 2, x: (byte) $c }, { y: (byte) $9e, tile: (byte) $39, attributes: (byte) 2, x: (byte) $14 }, { y: (byte) $96, tile: (byte) $70, attributes: (byte) 0, x: (byte) $48 }, { y: (byte) $96, tile: (byte) $71, attributes: (byte) 0, x: (byte) $50 }, { y: (byte) $9e, tile: (byte) $72, attributes: (byte) 1, x: (byte) $48 }, { y: (byte) $9e, tile: (byte) $73, attributes: (byte) 1, x: (byte) $50 } }
(const struct SpriteData*) SPRITE_BUFFER[(number) $40] = { fill( $40, 0) }
(byte) SpriteData::attributes
(byte) SpriteData::tile
(byte) SpriteData::x
@ -66,8 +71,6 @@
(const to_nomodify void()**) VECTORS[] = { &interrupt(HARDWARE_STACK)(void()) vblank(), &(void()) main(), (void()*) 0 }
(void()) main()
(label) main::@1
(label) main::@10
(label) main::@11
(label) main::@2
(label) main::@3
(label) main::@4
@ -77,9 +80,6 @@
(label) main::@8
(label) main::@9
(label) main::enableVideoOutput1
(byte) main::i
(byte) main::i#1 reg byte x 202.0
(byte) main::i#2 reg byte x 168.33333333333331
(label) main::initNES1
(label) main::initNES1_@1
(label) main::initNES1_@7
@ -98,23 +98,42 @@
(byte) main::x
(byte) main::x#1 reg byte x 202.0
(byte) main::x#2 reg byte x 80.8
(void*()) memcpy((void*) memcpy::destination , (void*) memcpy::source , (word) memcpy::num)
(label) memcpy::@1
(label) memcpy::@2
(label) memcpy::@return
(void*) memcpy::destination
(const void*) memcpy::destination#0 destination = (void*)(const struct SpriteData*) SPRITE_BUFFER
(byte*) memcpy::dst
(byte*) memcpy::dst#1 dst zp[2]:4 1001.0
(byte*) memcpy::dst#2 dst zp[2]:4 1001.0
(word) memcpy::num
(const word) memcpy::num#0 num = (byte) 8*(const byte) SIZEOF_STRUCT_SPRITEDATA
(void*) memcpy::return
(void*) memcpy::source
(const void*) memcpy::source#0 source = (void*)(const struct SpriteData*) SPRITES
(byte*) memcpy::src
(byte*) memcpy::src#1 src zp[2]:2 2002.0
(byte*) memcpy::src#2 src zp[2]:2 1001.0
(byte*) memcpy::src_end
(const byte*) memcpy::src_end#0 src_end = (byte*)(const void*) memcpy::source#0+(const word) memcpy::num#0
(void()) ppuDataFill((nomodify void*) ppuDataFill::ppuData , (byte) ppuDataFill::val , (word) ppuDataFill::size)
(label) ppuDataFill::@1
(label) ppuDataFill::@2
(label) ppuDataFill::@return
(word) ppuDataFill::i
(word) ppuDataFill::i#1 i zp[2]:4 2002.0
(word) ppuDataFill::i#2 i zp[2]:4 1001.0
(word) ppuDataFill::i#1 i zp[2]:2 2002.0
(word) ppuDataFill::i#2 i zp[2]:2 1001.0
(nomodify void*) ppuDataFill::ppuData
(label) ppuDataFill::ppuDataPrepare1
(byte~) ppuDataFill::ppuDataPrepare1_$0 reg byte a 202.0
(byte~) ppuDataFill::ppuDataPrepare1_$1 reg byte a 202.0
(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData
(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ppuDataPrepare1_ppuData zp[2]:6 67.33333333333333
(nomodify void*) ppuDataFill::ppuDataPrepare1_ppuData#0 ppuDataPrepare1_ppuData zp[2]:4 67.33333333333333
(label) ppuDataFill::ppuDataPut1
(byte) ppuDataFill::ppuDataPut1_val
(word) ppuDataFill::size
(word) ppuDataFill::size#3 size zp[2]:2 111.22222222222223
(word) ppuDataFill::size#3 size zp[2]:6 111.22222222222223
(byte) ppuDataFill::val
(byte) ppuDataFill::val#4 reg byte x 111.22222222222223
(void()) ppuDataPutTile((nomodify void*) ppuDataPutTile::ppuData , (byte*) ppuDataPutTile::tile)
@ -125,9 +144,9 @@
(label) ppuDataPutTile::@5
(label) ppuDataPutTile::@return
(nomodify void*) ppuDataPutTile::ppuData
(nomodify byte*) ppuDataPutTile::ppuData#0 ppuData zp[2]:6 101.0
(nomodify void*) ppuDataPutTile::ppuData#2 ppuData zp[2]:6 233.66666666666669
(nomodify void*) ppuDataPutTile::ppuData#9 ppuData zp[2]:6 202.0
(nomodify byte*) ppuDataPutTile::ppuData#0 ppuData zp[2]:2 101.0
(nomodify void*) ppuDataPutTile::ppuData#2 ppuData zp[2]:2 233.66666666666669
(nomodify void*) ppuDataPutTile::ppuData#9 ppuData zp[2]:2 202.0
(label) ppuDataPutTile::ppuDataPrepare1
(byte~) ppuDataPutTile::ppuDataPrepare1_$0 reg byte a 2002.0
(byte~) ppuDataPutTile::ppuDataPrepare1_$1 reg byte a 2002.0
@ -136,7 +155,7 @@
(byte~) ppuDataPutTile::ppuDataPrepare2_$0 reg byte a 2002.0
(byte~) ppuDataPutTile::ppuDataPrepare2_$1 reg byte a 2002.0
(nomodify void*) ppuDataPutTile::ppuDataPrepare2_ppuData
(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 ppuDataPrepare2_ppuData zp[2]:6 333.6666666666667
(nomodify byte*) ppuDataPutTile::ppuDataPrepare2_ppuData#0 ppuDataPrepare2_ppuData zp[2]:2 333.6666666666667
(label) ppuDataPutTile::ppuDataPut1
(byte) ppuDataPutTile::ppuDataPut1_val
(byte) ppuDataPutTile::ppuDataPut1_val#0 reg byte a 2002.0
@ -150,7 +169,7 @@
(byte) ppuDataPutTile::ppuDataPut4_val
(byte) ppuDataPutTile::ppuDataPut4_val#0 reg byte a 2002.0
(byte*) ppuDataPutTile::tile
(byte*) ppuDataPutTile::tile#10 tile zp[2]:2 250.25
(byte*) ppuDataPutTile::tile#10 tile zp[2]:4 250.25
(void()) ppuDataTransfer((nomodify void*) ppuDataTransfer::ppuData , (nomodify void*) ppuDataTransfer::cpuData , (word) ppuDataTransfer::size)
(label) ppuDataTransfer::@1
(label) ppuDataTransfer::@2
@ -173,24 +192,49 @@
(byte) ppuDataTransfer::ppuDataPut1_val#0 reg byte a 2002.0
(word) ppuDataTransfer::size
(const word) ppuDataTransfer::size#0 size = (byte) $20*(const byte) SIZEOF_BYTE
(byte()) readJoy1()
(byte~) readJoy1::$1 zp[1]:8 101.0
(byte~) readJoy1::$2 reg byte a 202.0
(label) readJoy1::@1
(label) readJoy1::@2
(label) readJoy1::@return
(byte) readJoy1::i
(byte) readJoy1::i#1 reg byte x 202.0
(byte) readJoy1::i#2 reg byte x 60.599999999999994
(byte) readJoy1::joy
(byte) readJoy1::joy#1 reg byte a 101.0
(byte) readJoy1::joy#2 reg byte a 51.0
(byte) readJoy1::return
(byte) readJoy1::return#2 reg byte a 4.0
interrupt(HARDWARE_STACK)(void()) vblank()
(byte~) vblank::$1 reg byte a 4.0
(byte~) vblank::$3 reg byte a 4.0
(byte~) vblank::$2 reg byte a 4.0
(byte~) vblank::$4 reg byte a 4.0
(byte~) vblank::$6 reg byte a 4.0
(byte~) vblank::$8 reg byte a 4.0
(label) vblank::@1
(label) vblank::@10
(label) vblank::@2
(label) vblank::@3
(label) vblank::@4
(label) vblank::@5
(label) vblank::@6
(label) vblank::@7
(label) vblank::@8
(label) vblank::@9
(label) vblank::@return
(byte) vblank::joy
(byte) vblank::joy#0 reg byte x 0.5263157894736842
(label) vblank::ppuSpriteBufferDmaTransfer1
(struct SpriteData*) vblank::ppuSpriteBufferDmaTransfer1_spriteBuffer
reg byte x [ main::initNES1_i#2 main::initNES1_i#1 ]
reg byte x [ main::x#2 main::x#1 ]
reg byte x [ main::i#2 main::i#1 ]
zp[2]:2 [ ppuDataFill::size#3 ppuDataPutTile::tile#10 ]
reg byte x [ ppuDataFill::val#4 ]
zp[2]:4 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ppuDataFill::i#2 ppuDataFill::i#1 ]
zp[2]:6 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ppuDataFill::ppuDataPrepare1_ppuData#0 ppuDataPutTile::ppuData#2 ppuDataPutTile::ppuData#9 ppuDataPutTile::ppuData#0 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ]
zp[2]:2 [ ppuDataFill::i#2 ppuDataFill::i#1 memcpy::src#2 memcpy::src#1 ppuDataPutTile::ppuData#2 ppuDataPutTile::ppuData#9 ppuDataPutTile::ppuData#0 ppuDataPutTile::ppuDataPrepare2_ppuData#0 ]
zp[2]:4 [ ppuDataTransfer::i#2 ppuDataTransfer::i#1 ppuDataFill::ppuDataPrepare1_ppuData#0 memcpy::dst#2 memcpy::dst#1 ppuDataPutTile::tile#10 ]
zp[2]:6 [ ppuDataTransfer::cpuSrc#2 ppuDataTransfer::cpuSrc#1 ppuDataFill::size#3 ]
reg byte x [ readJoy1::i#2 readJoy1::i#1 ]
reg byte a [ readJoy1::joy#2 readJoy1::joy#1 ]
reg byte a [ main::initNES1_waitForVBlank1_$0 ]
reg byte a [ main::initNES1_waitForVBlank2_$0 ]
reg byte a [ ppuDataPutTile::ppuDataPrepare1_$0 ]
@ -204,5 +248,11 @@ reg byte a [ ppuDataPutTile::ppuDataPut4_val#0 ]
reg byte a [ ppuDataFill::ppuDataPrepare1_$0 ]
reg byte a [ ppuDataFill::ppuDataPrepare1_$1 ]
reg byte a [ ppuDataTransfer::ppuDataPut1_val#0 ]
reg byte a [ vblank::$1 ]
reg byte a [ vblank::$3 ]
reg byte a [ readJoy1::return#2 ]
reg byte x [ vblank::joy#0 ]
reg byte a [ vblank::$2 ]
reg byte a [ vblank::$4 ]
reg byte a [ vblank::$6 ]
reg byte a [ vblank::$8 ]
zp[1]:8 [ readJoy1::$1 ]
reg byte a [ readJoy1::$2 ]