srctree

Johan parent 18bdfed5 029d25b2 0e778ff1
Merge pull request #376 from johnor/vga-palette

Add vga palette
core/include/nes/core/pixel.h added: 122, removed: 10, total 112
@@ -4,10 +4,20 @@
 
namespace n_e_s::core {
 
struct Color {
uint8_t r{0u};
uint8_t g{0u};
uint8_t b{0u};
 
[[nodiscard]] constexpr bool operator==(const Color &) const = default;
};
 
struct Pixel {
uint8_t x;
uint8_t y;
uint32_t color;
uint8_t x{0u};
uint8_t y{0u};
Color color;
 
[[nodiscard]] constexpr bool operator==(const Pixel &) const = default;
};
 
} // namespace n_e_s::core
 
core/src/ppu.cpp added: 122, removed: 10, total 112
@@ -1,10 +1,89 @@
#include "ppu.h"
 
#include <array>
#include <tuple>
 
#include "nes/core/invalid_address.h"
#include "nes/core/pixel.h"
 
namespace {
 
using n_e_s::core::Color;
 
// 2C02 VGA Palette from:
// https://wiki.nesdev.org/w/index.php?title=PPU_palettes#2C02
constexpr std::array kPalette{
Color{84, 84, 84},
Color{0, 30, 116},
Color{8, 16, 144},
Color{48, 0, 136},
Color{68, 0, 100},
Color{92, 0, 48},
Color{84, 4, 0},
Color{60, 24, 0},
Color{32, 42, 0},
Color{8, 58, 0},
Color{0, 64, 0},
Color{0, 60, 0},
Color{0, 50, 60},
Color{0, 0, 0},
Color{0, 0, 0},
Color{0, 0, 0},
 
Color{152, 150, 152}, // 10
Color{8, 76, 196},
Color{48, 50, 236},
Color{92, 30, 228},
Color{136, 20, 176},
Color{160, 20, 100},
Color{152, 34, 32},
Color{120, 60, 0},
Color{84, 90, 0},
Color{40, 114, 0},
Color{8, 124, 0},
Color{0, 118, 40},
Color{0, 102, 120},
Color{0, 0, 0},
Color{0, 0, 0},
Color{0, 0, 0},
 
Color{236, 238, 236}, // 20
Color{76, 154, 236},
Color{120, 124, 236},
Color{176, 98, 236},
Color{228, 84, 236},
Color{236, 88, 180},
Color{236, 106, 100},
Color{212, 136, 32},
Color{160, 170, 0},
Color{116, 196, 0},
Color{76, 208, 32},
Color{56, 204, 108},
Color{56, 180, 204},
Color{60, 60, 60},
Color{0, 0, 0},
Color{0, 0, 0},
 
Color{236, 238, 236}, // 30
Color{168, 204, 236},
Color{188, 188, 236},
Color{212, 178, 236},
Color{236, 174, 236},
Color{236, 174, 212},
Color{236, 180, 176},
Color{228, 196, 144},
Color{204, 210, 120},
Color{180, 222, 120},
Color{168, 226, 144},
Color{152, 226, 180},
Color{160, 214, 228},
Color{160, 162, 160},
Color{0, 0, 0},
Color{0, 0, 0},
};
 
static_assert(kPalette.size() == 64u);
 
const uint16_t kPpuCtrl = 0x2000;
const uint16_t kPpuMask = 0x2001;
const uint16_t kPpuStatus = 0x2002;
@@ -376,4 +455,8 @@ void Ppu::fetch() {
}
}
 
Color Ppu::get_color_from_palette_index(uint8_t index) const {
return kPalette[index % kPalette.size()];
}
 
} // namespace n_e_s::core
 
core/src/ppu.h added: 122, removed: 10, total 112
@@ -68,6 +68,8 @@ private:
void shift_registers();
void increase_scroll_counters();
void fetch();
 
Color get_color_from_palette_index(uint8_t index) const;
};
 
} // namespace n_e_s::core
 
core/test/src/ippu_helpers.cpp added: 122, removed: 10, total 112
@@ -38,4 +38,15 @@ void PrintTo(const PpuRegisters &r, std::ostream *os) {
r.attribute_table_latch);
}
 
// Required by gtest to use pascal case.
// NOLINTNEXTLINE(readability-identifier-naming)
void PrintTo(const Pixel &p, std::ostream *os) {
*os << fmt::format("x: {} y: {} color: {{r: {} g: {} b: {}}}\n",
p.x,
p.y,
p.color.r,
p.color.g,
p.color.b);
}
 
} // namespace n_e_s::core
 
core/test/src/ippu_helpers.h added: 122, removed: 10, total 112
@@ -1,6 +1,7 @@
#pragma once
 
#include "nes/core/ippu.h"
#include "nes/core/pixel.h"
#include "nes/core/ppu_registers.h"
 
#include <iosfwd>
 
@@ -10,4 +11,8 @@ namespace n_e_s::core {
// NOLINTNEXTLINE(readability-identifier-naming)
void PrintTo(const PpuRegisters &r, std::ostream *os);
 
// Required by gtest to use pascal case.
// NOLINTNEXTLINE(readability-identifier-naming)
void PrintTo(const Pixel &p, std::ostream *os);
 
} // namespace n_e_s::core
 
core/test/src/test_mmu.cpp added: 122, removed: 10, total 112
@@ -1,3 +1,4 @@
#include "ippu_helpers.h"
#include "nes/core/imembank.h"
#include "nes/core/invalid_address.h"
#include "nes/core/membank_factory.h"