mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-12-24 04:31:02 +00:00
Merged nesballs 3
This commit is contained in:
commit
31b0a500a1
@ -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");
|
||||
|
161
src/test/kc/complex/nes-balls/kickballs-3.c
Normal file
161
src/test/kc/complex/nes-balls/kickballs-3.c
Normal 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
|
||||
};
|
927
src/test/ref/complex/nes-balls/kickballs-3.asm
Normal file
927
src/test/ref/complex/nes-balls/kickballs-3.asm
Normal 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
|
308
src/test/ref/complex/nes-balls/kickballs-3.cfg
Normal file
308
src/test/ref/complex/nes-balls/kickballs-3.cfg
Normal 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
|
7286
src/test/ref/complex/nes-balls/kickballs-3.log
Normal file
7286
src/test/ref/complex/nes-balls/kickballs-3.log
Normal file
File diff suppressed because it is too large
Load Diff
310
src/test/ref/complex/nes-balls/kickballs-3.sym
Normal file
310
src/test/ref/complex/nes-balls/kickballs-3.sym
Normal 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 ]
|
Loading…
Reference in New Issue
Block a user