From a8b58c8a1bea4fdef2e6b32f4a6298c405dfc134 Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Mon, 8 Sep 2025 16:51:25 +0300 Subject: [PATCH] Fixed CHR RAM write --- NesKitSwift/NesSystemSwift.swift | 23 +++++++++++++++++++++++ Package.swift | 29 ++++++++++++++++++++--------- examples/sdl/main.cpp | 3 ++- src/Bus.cpp | 6 ++++-- src/Bus.h | 1 + src/Ppu.cpp | 8 ++++---- src/Ppu.h | 4 ++-- src/include/module.modulemap | 4 ++++ 8 files changed, 60 insertions(+), 18 deletions(-) create mode 100644 NesKitSwift/NesSystemSwift.swift create mode 100644 src/include/module.modulemap diff --git a/NesKitSwift/NesSystemSwift.swift b/NesKitSwift/NesSystemSwift.swift new file mode 100644 index 0000000..5bda4a7 --- /dev/null +++ b/NesKitSwift/NesSystemSwift.swift @@ -0,0 +1,23 @@ +// +// NesSystemSwift.swift +// NesKit +// +// Created by Selim Mustafaev on 08.08.2025. +// + +import Foundation +import NesKitCpp + +class NesSystemSwift { + + var nesSystem: nes.System? + + init() { + + let frameBufferSize = nes.Ppu.SCREEN_WIDTH * nes.Ppu.SCREEN_HEIGHT * MemoryLayout.stride + + nesSystem?.setNewFrameCallback({ frameBuffer in + + }) + } +} diff --git a/Package.swift b/Package.swift index 1cc23d0..534ccf1 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 5.8 +// swift-tools-version: 6.1 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription @@ -6,21 +6,32 @@ import PackageDescription let package = Package( name: "NesKit", platforms: [ - .macOS(.v13), - .iOS(.v16) + .macOS(.v15), + .iOS(.v18) ], products: [ .library(name: "NesKit", targets: ["NesKit"]), + .library(name: "NesKitSwift", targets: ["NesKitSwift"]) ], targets: [ // Targets are the basic building blocks of a package, defining a module or a test suite. // Targets can depend on other targets in this package and products from dependencies. - .target(name: "NesKitCpp", - path: "src", - exclude: ["Logger.cpp", "Logger.h"]), - .target(name: "NesKit", - dependencies: [.target(name: "NesKitCpp")], - path: "NesKit") + .target( + name: "NesKitCpp", + path: "src", + exclude: ["Logger.cpp", "Logger.h"] + ), + .target( + name: "NesKit", + dependencies: [.target(name: "NesKitCpp")], + path: "NesKit" + ), + .target( + name: "NesKitSwift", + dependencies: [.target(name: "NesKitCpp")], + path: "NesKitSwift", + swiftSettings: [.interoperabilityMode(.Cxx)] + ) ], cxxLanguageStandard: .cxx20 ) diff --git a/examples/sdl/main.cpp b/examples/sdl/main.cpp index a945791..3d53d68 100644 --- a/examples/sdl/main.cpp +++ b/examples/sdl/main.cpp @@ -22,7 +22,8 @@ int main() { }); device.connect(std::make_shared()); //device.insertCartridge("/home/selim/Downloads/dk.nes"); - device.insertCartridge("/Users/selim/Documents/drm.nes"); + device.insertCartridge("/Users/selim/Documents/nes/ppu_tests/power_up_palette.nes"); + device.insertCartridge("/Users/selim/Documents/nes/ff.nes"); //device.insertCartridge("C:\\Users\\selim\\Documents\\nestest.nes"); auto frameStart = std::chrono::steady_clock::now(); diff --git a/src/Bus.cpp b/src/Bus.cpp index 49c9810..7076bf3 100644 --- a/src/Bus.cpp +++ b/src/Bus.cpp @@ -5,8 +5,6 @@ #include "Bus.h" #include -#include "../../../../../../opt/homebrew/Cellar/fmt/11.2.0/include/fmt/format.h" - namespace nes { Bus::Bus(uint8_t *ram, @@ -48,6 +46,10 @@ namespace nes { return _cartridge->readChr(address); } + void Bus::writeChr(uint16_t address, uint8_t value) const { + _cartridge->writeChr(address, value); + } + uint8_t Bus::read(uint16_t address) const { if(address < 0x2000) { return _ram[address & 0x07FF]; diff --git a/src/Bus.h b/src/Bus.h index ca0b98d..448bbc6 100644 --- a/src/Bus.h +++ b/src/Bus.h @@ -30,6 +30,7 @@ namespace nes { [[nodiscard]] Cartridge::Mirroring cartridgeMirroring() const; uint8_t readChr(uint16_t address) const; + void writeChr(uint16_t address, uint8_t value) const; uint8_t read(uint16_t address) const; void write(uint16_t address, uint8_t value); diff --git a/src/Ppu.cpp b/src/Ppu.cpp index db8a7fe..3e0d3ae 100644 --- a/src/Ppu.cpp +++ b/src/Ppu.cpp @@ -4,12 +4,12 @@ #include "Ppu.h" -#include "../../../../../../opt/homebrew/Cellar/fmt/11.2.0/include/fmt/base.h" - #ifdef NES_LOGGING #include #endif +#include + namespace nes { Ppu::Ppu(): _column{}, _scanline{}, _status{}, _control{}, _mask{} { @@ -230,7 +230,7 @@ namespace nes { _oam->write(value); break; default: - fmt::println("unknown ppu write"); + //fmt::println("unknown ppu write"); break; } } @@ -304,7 +304,7 @@ namespace nes { address &= 0x3FFF; if(address < 0x2000) { - // Can't write to CHR ROM + _bus->writeChr(address, value); } else if(address >= 0x2000 && address < 0x3F00) { address &= 0x0FFF; diff --git a/src/Ppu.h b/src/Ppu.h index 67b362f..c5d446c 100644 --- a/src/Ppu.h +++ b/src/Ppu.h @@ -28,8 +28,8 @@ namespace nes { class Ppu { public: - static constexpr uint16_t SCREEN_WIDTH = 256; - static constexpr uint16_t SCREEN_HEIGHT = 240; + static const size_t SCREEN_WIDTH = 256; + static const size_t SCREEN_HEIGHT = 240; enum ControlAddress: uint16_t { Control = 0x0000, diff --git a/src/include/module.modulemap b/src/include/module.modulemap new file mode 100644 index 0000000..38df89b --- /dev/null +++ b/src/include/module.modulemap @@ -0,0 +1,4 @@ +module NesKitCpp { + header "NesKitCpp.h" + export * +}