From 42328080e6f56ba30af0451321870ef836f22c07 Mon Sep 17 00:00:00 2001 From: Ta180m Date: Mon, 18 May 2020 14:42:11 -0500 Subject: [PATCH] Initial commit --- .gitignore | 2 ++ src/apu.cpp | 22 +++++++++---------- src/cartridge.cpp | 4 +++- src/cpu.cpp | 2 +- src/gui.cpp | 13 +++++------ src/include/apu.hpp | 6 ++--- src/include/gui.hpp | 3 +-- src/include/mappers/mapper7.hpp | 19 ++++++++++++++++ src/include/ppu.hpp | 3 +-- src/mappers/mapper1.cpp | 6 +++-- src/mappers/mapper7.cpp | 39 +++++++++++++++++++++++++++++++++ src/ppu.cpp | 3 +++ 12 files changed, 93 insertions(+), 29 deletions(-) create mode 100644 src/include/mappers/mapper7.hpp create mode 100644 src/mappers/mapper7.cpp diff --git a/.gitignore b/.gitignore index 481a5b8..4a22f5f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .sconsign.dblite laines *.o +roms +.nes \ No newline at end of file diff --git a/src/apu.cpp b/src/apu.cpp index 1a22e10..070b01e 100644 --- a/src/apu.cpp +++ b/src/apu.cpp @@ -5,46 +5,46 @@ namespace APU { -Nes_Apu apu; -Blip_Buffer buf; +//Nes_Apu apu; +//Blip_Buffer buf; const int OUT_SIZE = 4096; -blip_sample_t outBuf[OUT_SIZE]; +//blip_sample_t outBuf[OUT_SIZE]; -void init() +/*void init() { buf.sample_rate(96000); buf.clock_rate(1789773); apu.output(&buf); apu.dmc_reader(CPU::dmc_read); -} +}*/ -void reset() +/*void reset() { apu.reset(); buf.clear(); -} +}*/ template u8 access(int elapsed, u16 addr, u8 v) { - if (write) + /*if (write) apu.write_register(elapsed, addr, v); else if (addr == apu.status_addr) - v = apu.read_status(elapsed); + v = apu.read_status(elapsed);*/ return v; } template u8 access<0>(int, u16, u8); template u8 access<1>(int, u16, u8); -void run_frame(int elapsed) +/*void run_frame(int elapsed) { apu.end_frame(elapsed); buf.end_frame(elapsed); if (buf.samples_avail() >= OUT_SIZE) GUI::new_samples(outBuf, buf.read_samples(outBuf, OUT_SIZE)); -} +}*/ } diff --git a/src/cartridge.cpp b/src/cartridge.cpp index 29673ca..c75d3c8 100644 --- a/src/cartridge.cpp +++ b/src/cartridge.cpp @@ -6,6 +6,7 @@ #include "mappers/mapper2.hpp" #include "mappers/mapper3.hpp" #include "mappers/mapper4.hpp" +#include "mappers/mapper7.hpp" #include "ppu.hpp" #include "cartridge.hpp" @@ -57,11 +58,12 @@ void load(const char* fileName) case 2: mapper = new Mapper2(rom); break; case 3: mapper = new Mapper3(rom); break; case 4: mapper = new Mapper4(rom); break; + case 7: mapper = new Mapper7(rom); break; } CPU::power(); PPU::reset(); - APU::reset(); + //APU::reset(); } bool loaded() diff --git a/src/cpu.cpp b/src/cpu.cpp index 444cfdf..9b45466 100644 --- a/src/cpu.cpp +++ b/src/cpu.cpp @@ -275,7 +275,7 @@ void run_frame() exec(); } - APU::run_frame(elapsed()); + //APU::run_frame(elapsed()); } diff --git a/src/gui.cpp b/src/gui.cpp index dd0692f..9898e5c 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -1,7 +1,6 @@ #include #include #include -#include "Sound_Queue.h" #include "apu.hpp" #include "cartridge.hpp" #include "cpu.hpp" @@ -18,7 +17,7 @@ SDL_Texture* gameTexture; SDL_Texture* background; TTF_Font* font; u8 const* keys; -Sound_Queue* soundQueue; +//Sound_Queue* soundQueue; SDL_Joystick* joystick[] = { nullptr, nullptr }; // Menus: @@ -51,9 +50,9 @@ void init() for (int i = 0; i < SDL_NumJoysticks(); i++) joystick[i] = SDL_JoystickOpen(i); - APU::init(); - soundQueue = new Sound_Queue; - soundQueue->init(96000); + //APU::init(); + //soundQueue = new Sound_Queue; + //soundQueue->init(96000); // Initialize graphics structures: window = SDL_CreateWindow ("LaiNES", @@ -203,10 +202,10 @@ void new_frame(u32* pixels) SDL_UpdateTexture(gameTexture, NULL, pixels, WIDTH * sizeof(u32)); } -void new_samples(const blip_sample_t* samples, size_t count) +/*void new_samples(const blip_sample_t* samples, size_t count) { soundQueue->write(samples, count); -} +}*/ /* Render the screen */ void render() diff --git a/src/include/apu.hpp b/src/include/apu.hpp index a5d15cb..794810d 100644 --- a/src/include/apu.hpp +++ b/src/include/apu.hpp @@ -5,9 +5,9 @@ namespace APU { template u8 access(int elapsed, u16 addr, u8 v = 0); -void run_frame(int elapsed); -void reset(); -void init(); +//void run_frame(int elapsed); +//void reset(); +//void init(); } diff --git a/src/include/gui.hpp b/src/include/gui.hpp index 297d34e..47beabb 100644 --- a/src/include/gui.hpp +++ b/src/include/gui.hpp @@ -1,7 +1,6 @@ #pragma once #include #include -#include #include "common.hpp" namespace GUI { @@ -24,7 +23,7 @@ void render_texture(SDL_Texture* texture, int x, int y); u8 get_joypad_state(int n); void new_frame(u32* pixels); -void new_samples(const blip_sample_t* samples, size_t count); +//void new_samples(const blip_sample_t* samples, size_t count); void set_size(int mul); } diff --git a/src/include/mappers/mapper7.hpp b/src/include/mappers/mapper7.hpp new file mode 100644 index 0000000..d1dcc0d --- /dev/null +++ b/src/include/mappers/mapper7.hpp @@ -0,0 +1,19 @@ +#pragma once +#include "mapper.hpp" +#include "ppu.hpp" + +class Mapper7 : public Mapper +{ + u8 regs[1]; + void apply(); + + public: + Mapper7(u8* rom) : Mapper(rom) + { + regs[0] = 0; + apply(); + } + + u8 write(u16 addr, u8 v); + u8 chr_write(u16 addr, u8 v); +}; \ No newline at end of file diff --git a/src/include/ppu.hpp b/src/include/ppu.hpp index e3f5e14..38f036e 100644 --- a/src/include/ppu.hpp +++ b/src/include/ppu.hpp @@ -5,8 +5,7 @@ namespace PPU { enum Scanline { VISIBLE, POST, NMI, PRE }; -enum Mirroring { VERTICAL, HORIZONTAL }; - +enum Mirroring { VERTICAL, HORIZONTAL, ONE_SCREEN_HI, ONE_SCREEN_LO, FOUR_SCREEN }; /* Sprite buffer */ struct Sprite { diff --git a/src/mappers/mapper1.cpp b/src/mappers/mapper1.cpp index 827962d..ae17179 100644 --- a/src/mappers/mapper1.cpp +++ b/src/mappers/mapper1.cpp @@ -38,8 +38,10 @@ void Mapper1::apply() // Set mirroring: switch (regs[0] & 0b11) { - case 2: set_mirroring(PPU::VERTICAL); break; - case 3: set_mirroring(PPU::HORIZONTAL); break; + case 0: set_mirroring(PPU::ONE_SCREEN_LO); break; + case 1: set_mirroring(PPU::ONE_SCREEN_HI); break; + case 2: set_mirroring(PPU::VERTICAL); break; + case 3: set_mirroring(PPU::HORIZONTAL); break; } } diff --git a/src/mappers/mapper7.cpp b/src/mappers/mapper7.cpp new file mode 100644 index 0000000..dbd5378 --- /dev/null +++ b/src/mappers/mapper7.cpp @@ -0,0 +1,39 @@ +#include "ppu.hpp" +#include "mappers/mapper7.hpp" + +/* Based off of https://wiki.nesdev.com/w/index.php/AxROM */ + +/* Apply the registers state */ +void Mapper7::apply() +{ + /* + * 32 kb PRG ROM Banks + * 0x8000 - 0xFFFF swappable + */ + map_prg<32>(0, regs[0] & 0b00001111); + + /* 8k of CHR (ram) */ + map_chr<8>(0, 0); + + /* Mirroring based on bit 5 */ + set_mirroring((regs[0] & 0b00010000) ? PPU::ONE_SCREEN_HI : PPU::ONE_SCREEN_LO); +} + +u8 Mapper7::write(u16 addr, u8 v) +{ + /* check for bus contingency? (addr & 0x8000 == v?) + * Seems not neccesary */ + + /* bank switching */ + if (addr & 0x8000) + { + regs[0] = v; + apply(); + } + return v; +} + +u8 Mapper7::chr_write(u16 addr, u8 v) +{ + return chr[addr] = v; +} \ No newline at end of file diff --git a/src/ppu.cpp b/src/ppu.cpp index 4ec4ec5..411f7b0 100644 --- a/src/ppu.cpp +++ b/src/ppu.cpp @@ -42,6 +42,9 @@ u16 nt_mirror(u16 addr) { case VERTICAL: return addr % 0x800; case HORIZONTAL: return ((addr / 2) & 0x400) + (addr % 0x400); + case ONE_SCREEN_LO: + case ONE_SCREEN_HI: + return ((addr & 0x3ff) + ((mirroring == ONE_SCREEN_HI) ? 0x400 : 0x0)) - 0x2000; default: return addr - 0x2000; } }