1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-12-24 20:32:39 +00:00

Merged nesballs 3

This commit is contained in:
jespergravgaard 2020-10-01 00:55:47 +02:00
commit 31b0a500a1
6 changed files with 8997 additions and 0 deletions

View File

@ -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");

View File

@ -0,0 +1,161 @@
#pragma target(nes)
//#pragma emulator("java -jar /Applications/Nintaco_bin_2020-05-01/Nintaco.jar")
#include <nes.h>
#include <stdio.h>
#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
};

View File

@ -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
lda #>palette
sta.z ppuDataTransfer.cpuData+1
lda #<PPU_PALETTE
sta.z ppuDataTransfer.ppuDataPrepare1_ppuData
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
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
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
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
lda.z __40+1
adc #>balls
sta.z __61+1
lda.z __40
clc
adc #<balls+4
sta.z __62
lda.z __40+1
adc #>balls+4
sta.z __62+1
lda.z __40
clc
adc #<balls
sta.z __63
lda.z __40+1
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
lda.z __40+1
adc #>balls+6
sta.z __64+1
lda.z __40
clc
adc #<balls+6
sta.z __65
lda.z __40+1
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
lda.z __40+1
adc #>balls+2
sta.z __66+1
lda.z __40
clc
adc #<balls+6
sta.z __67
lda.z __40+1
adc #>balls+6
sta.z __67+1
lda.z __40
clc
adc #<balls+2
sta.z __68
lda.z __40+1
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
lda.z __69+1
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
lda.z __45+1
adc #>balls+4
sta.z __72+1
clc
lda.z __73
adc #<balls+4
sta.z __73
lda.z __73+1
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
lda.z __44+1
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
lda.z __71+1
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
lda.z __53+1
adc #>balls+6
sta.z __76+1
lda.z __53
clc
adc #<balls+6
sta.z __77
lda.z __53+1
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
lda.z __78+1
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
lda.z __50+1
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
lda.z __75+1
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
lda.z __59+1
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
lda.z __60+1
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
// <ppuData
lda.z ppuDataPrepare1_ppuData
// PPU->PPUADDR = <ppuData
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
lda #<0
sta.z i
sta.z i+1
__b1:
// for(unsigned int i=0;i<size;i++)
lda.z i+1
bne !+
lda.z i
cmp #$20*SIZEOF_BYTE
bcc __b2
!:
// }
rts
__b2:
// ppuDataPut(*cpuSrc++)
ldy #0
lda (cpuSrc),y
// PPU->PPUDATA = val
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
// ppuDataPut(*cpuSrc++);
inc.z cpuSrc
bne !+
inc.z cpuSrc+1
!:
// for(unsigned int i=0;i<size;i++)
inc.z i
bne !+
inc.z i+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(word zp($11) size)
ppuDataFill: {
.label ppuDataPrepare1_ppuData = $f
.label i = $13
.label size = $11
// >ppuData
lda.z ppuDataPrepare1_ppuData+1
// PPU->PPUADDR = >ppuData
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
// <ppuData
lda.z ppuDataPrepare1_ppuData
// PPU->PPUADDR = <ppuData
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUADDR
lda #<0
sta.z i
sta.z i+1
// Transfer to PPU
__b1:
// for(unsigned int i=0;i<size;i++)
lda.z i+1
cmp.z size+1
bcc ppuDataPut1
bne !+
lda.z i
cmp.z size
bcc ppuDataPut1
!:
// }
rts
ppuDataPut1:
// PPU->PPUDATA = val
lda #0
sta PPU+OFFSET_STRUCT_RICOH_2C02_PPUDATA
// for(unsigned int i=0;i<size;i++)
inc.z i
bne !+
inc.z i+1
!:
jmp __b1
}
// 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
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
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
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

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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 ]