summaryrefslogtreecommitdiff
path: root/mknes.c
diff options
context:
space:
mode:
Diffstat (limited to 'mknes.c')
-rw-r--r--mknes.c112
1 files changed, 78 insertions, 34 deletions
diff --git a/mknes.c b/mknes.c
index 5fbea56..25e920f 100644
--- a/mknes.c
+++ b/mknes.c
@@ -100,45 +100,88 @@ struct nes_state nstate;
static uint32_t frames;
+
+#define PRG_ROM_SIZE (512 * 1024)
+#define CHR_ROM_SIZE (512 * 1024)
+#define PIXELS_SIZE (256 * 240)
+#define RAM_SIZE 0x800
+#define SRAM_SIZE 0x2000
+#define CIRAM_SIZE 0x1000
+
+static struct nes_state *allocate_nes_state(void) {
+ struct nes_state *state = (struct nes_state*)calloc(1, sizeof(struct nes_state));
+ if(!state) return 0;
+
+ size_t total_size = (PRG_ROM_SIZE + CHR_ROM_SIZE + PIXELS_SIZE + RAM_SIZE + SRAM_SIZE + CIRAM_SIZE + 4095) & ~0xfff;
+
+ uint8_t *m = (uint8_t*)aligned_alloc(4096, total_size);
+ memset(m, 0, total_size);
+
+ size_t offset = 0;
+
+ state->prg_rom = m + offset;
+ offset += PRG_ROM_SIZE;
+
+ state->chr_rom = m + offset;
+ offset += CHR_ROM_SIZE;
+
+ state->pixels = m + offset;
+ offset += PIXELS_SIZE;
+
+ state->ram = m + offset;
+ offset += RAM_SIZE;
+
+ state->sram = m + offset;
+ offset += SRAM_SIZE;
+
+ state->ciram = m + offset;
+ offset += CIRAM_SIZE;
+
+ return state;
+}
+
+
int main(int argc, char **argv) {
#ifdef _WIN32
timeBeginPeriod(1);
#endif
+ struct nes_state *nstate = allocate_nes_state();
+
state.toggle_crt_emulation = 1;
setbuf(stdout, 0);
init_opcode_lut();
init_opcode_ud_lut();
// protect_opcode_lut();
- ppu_reset(&nstate);
- // ines2_load(&nstate, "data/nrom/10-Yard Fight (USA, Europe).nes");
- // ines2_load(&nstate, "data/nrom/Balloon Fight (USA).nes");
- // ines2_load(&nstate, "data/nrom/Excitebike (Japan, USA).nes");
- // ines2_load(&nstate, "data/nrom/Ice Climber (USA, Europe, Korea).nes");
- // ines2_load(&nstate, "data/nrom/Kung Fu (Japan, USA).nes");
- ines2_load(&nstate, "data/nrom/Super Mario Bros. (World) (HVC-SM).nes");
- // ines2_load(&nstate, "data/nrom/Urban Champion (World).nes");
- // ines2_load(&nstate, "data/nrom/Wrecking Crew (World).nes");
- // ines2_load(&nstate, "data/nrom/scanline.nes");
- // ines2_load(&nstate, "data/nrom/Sayoonara!.NES");
- // ines2_load(&nstate, "data/nrom/raster_demos/RasterChromaLuma.NES");
- // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest1.NES");
- // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest2.NES");
- // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest3.NES");
- // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest3a.NES");
- // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest3b.NES");
- // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest3c.NES");
- // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest3d.NES");
- // ines2_load(&nstate, "data/nrom/raster_demos/RasterTest3e.NES");
- // ines2_load(&nstate, "data/nrom/NEStress.NES");
- // ines2_load(&nstate, "data/tv.nes");
- // ines2_load(&nstate, "data/Super Mario Bros. (World) (HVC-SM).zip");
- // ines2_load(&nstate, "data/Super Mario Bros. + Duck Hunt (USA).zip");
-
- mapper_setup(&nstate);
- uint32_t lo = nstate.mapper.prg_read(&nstate, 0xfffc);
- uint32_t hi = nstate.mapper.prg_read(&nstate, 0xfffd);
- nstate.cpu.pc = (hi << 8) | lo;
+ ppu_reset(nstate);
+ // ines2_load(nstate, "data/nrom/10-Yard Fight (USA, Europe).nes");
+ // ines2_load(nstate, "data/nrom/Balloon Fight (USA).nes");
+ // ines2_load(nstate, "data/nrom/Excitebike (Japan, USA).nes");
+ // ines2_load(nstate, "data/nrom/Ice Climber (USA, Europe, Korea).nes");
+ // ines2_load(nstate, "data/nrom/Kung Fu (Japan, USA).nes");
+ ines2_load(nstate, "data/nrom/Super Mario Bros. (World) (HVC-SM).nes");
+ // ines2_load(nstate, "data/nrom/Urban Champion (World).nes");
+ // ines2_load(nstate, "data/nrom/Wrecking Crew (World).nes");
+ // ines2_load(nstate, "data/nrom/scanline.nes");
+ // ines2_load(nstate, "data/nrom/Sayoonara!.NES");
+ // ines2_load(nstate, "data/nrom/raster_demos/RasterChromaLuma.NES");
+ // ines2_load(nstate, "data/nrom/raster_demos/RasterTest1.NES");
+ // ines2_load(nstate, "data/nrom/raster_demos/RasterTest2.NES");
+ // ines2_load(nstate, "data/nrom/raster_demos/RasterTest3.NES");
+ // ines2_load(nstate, "data/nrom/raster_demos/RasterTest3a.NES");
+ // ines2_load(nstate, "data/nrom/raster_demos/RasterTest3b.NES");
+ // ines2_load(nstate, "data/nrom/raster_demos/RasterTest3c.NES");
+ // ines2_load(nstate, "data/nrom/raster_demos/RasterTest3d.NES");
+ // ines2_load(nstate, "data/nrom/raster_demos/RasterTest3e.NES");
+ // ines2_load(nstate, "data/nrom/NEStress.NES");
+ // ines2_load(nstate, "data/tv.nes");
+ // ines2_load(nstate, "data/Super Mario Bros. (World) (HVC-SM).zip");
+ // ines2_load(nstate, "data/Super Mario Bros. + Duck Hunt (USA).zip");
+
+ mapper_setup(nstate);
+ uint32_t lo = nstate->mapper.prg_read(nstate, 0xfffc);
+ uint32_t hi = nstate->mapper.prg_read(nstate, 0xfffd);
+ nstate->cpu.pc = (hi << 8) | lo;
struct timer_handle *timer = timer_new(FRAME_INTERVAL_NS);
if(!timer) {
@@ -178,19 +221,20 @@ int main(int argc, char **argv) {
timer_start(timer);
while(!glfwWindowShouldClose(window)) {
+ // for(uint32_t i = 0; i < 0x5000; ++ i) {
timer_wait(timer);
glfwPollEvents();
// //
- while(!nstate.ppu.frame_ready) {
+ while(!nstate->ppu.frame_ready) {
// PROFILE_NAMED("nes emulator");
- cpu_tick(&nstate);
+ cpu_tick(nstate);
}
- nstate.ppu.frame_ready = 0;
+ nstate->ppu.frame_ready = 0;
frames++;
uint32_t * restrict dst = buffer;
- uint8_t * restrict src = nstate.ppu.pixels;
+ uint8_t * restrict src = nstate->pixels;
for(uint32_t y = 0; y < 240; ++y) {
for(uint32_t x = 0; x < 256; ++x) {
uint8_t val = *src++;
@@ -203,7 +247,7 @@ int main(int argc, char **argv) {
render_frame();
glfwSwapBuffers(window);
}
-printf("total frames: %6.6d total cycles: %ld\n", frames, nstate.cycles);
+printf("total frames: %6.6d total cycles: %ld\n", frames, nstate->cycles);
glfwDestroyWindow(window);
} else {
fprintf(stderr, "Failed to create window\n");