From cb1c0f4ab6a6f304a8867e00321682ce805bdb72 Mon Sep 17 00:00:00 2001 From: NoxyMe Date: Tue, 29 Aug 2023 23:59:37 +0100 Subject: [PATCH 1/2] Cleaned up and renamed mappers.and added a expermental "Terebi Oekaki" mapper Cleaned up and renamed mappers so its more clear whats what. Also added a expermental "Terebi Oekaki" mapper --- ares/sg/cartridge/board/board.cpp | 5 +- .../board/{taiwan-b.cpp => no_mapper.cpp} | 2 +- .../board/{taiwan-a.cpp => ram_adapter.cpp} | 2 +- ares/sg/cartridge/board/tvoekaki.cpp | 61 +++++++++ ares/sg/cartridge/cartridge.cpp | 5 +- mia/medium/sg-1000.cpp | 118 +++++++++++------- 6 files changed, 140 insertions(+), 53 deletions(-) rename ares/sg/cartridge/board/{taiwan-b.cpp => no_mapper.cpp} (96%) rename ares/sg/cartridge/board/{taiwan-a.cpp => ram_adapter.cpp} (96%) create mode 100644 ares/sg/cartridge/board/tvoekaki.cpp diff --git a/ares/sg/cartridge/board/board.cpp b/ares/sg/cartridge/board/board.cpp index 8e1cc8b341..578df69036 100644 --- a/ares/sg/cartridge/board/board.cpp +++ b/ares/sg/cartridge/board/board.cpp @@ -1,8 +1,9 @@ namespace Board { #include "linear.cpp" -#include "taiwan-a.cpp" -#include "taiwan-b.cpp" +#include "ram_adapter.cpp" +#include "no_mapper.cpp" +#include "tvoekaki.cpp" auto Interface::load(Memory::Readable& memory, string name) -> bool { if(auto fp = pak->read(name)) { diff --git a/ares/sg/cartridge/board/taiwan-b.cpp b/ares/sg/cartridge/board/no_mapper.cpp similarity index 96% rename from ares/sg/cartridge/board/taiwan-b.cpp rename to ares/sg/cartridge/board/no_mapper.cpp index 7dc19772f0..dc65fcb330 100644 --- a/ares/sg/cartridge/board/taiwan-b.cpp +++ b/ares/sg/cartridge/board/no_mapper.cpp @@ -1,4 +1,4 @@ -struct TaiwanB : Interface { +struct NoMapper : Interface { using Interface::Interface; Memory::Readable rom; Memory::Writable ram; diff --git a/ares/sg/cartridge/board/taiwan-a.cpp b/ares/sg/cartridge/board/ram_adapter.cpp similarity index 96% rename from ares/sg/cartridge/board/taiwan-a.cpp rename to ares/sg/cartridge/board/ram_adapter.cpp index 7109de902a..7cb014bf80 100644 --- a/ares/sg/cartridge/board/taiwan-a.cpp +++ b/ares/sg/cartridge/board/ram_adapter.cpp @@ -1,4 +1,4 @@ -struct TaiwanA : Interface { +struct Ram_Adapter_8kB : Interface { using Interface::Interface; Memory::Readable rom; Memory::Writable ram; diff --git a/ares/sg/cartridge/board/tvoekaki.cpp b/ares/sg/cartridge/board/tvoekaki.cpp new file mode 100644 index 0000000000..a2911bd9de --- /dev/null +++ b/ares/sg/cartridge/board/tvoekaki.cpp @@ -0,0 +1,61 @@ +struct TVOekaki : Interface { + using Interface::Interface; + Memory::Readable rom; + Memory::Writable ram; + + auto load() -> void override { + Interface::load(rom, "program.rom"); + Interface::load(ram, "save.ram"); + } + + auto save() -> void override { + Interface::save(ram, "save.ram"); + } + + auto unload() -> void override { + } + + auto read(n16 address) -> maybe override { + + + switch (address) { + case 0x8000: // Pen Pressure, Pen Position Ready + print("Pen Pressure, Pen Position Ready\n"); + return (n8)1; + case 0xA000: + print("PTEST\n"); + return (n8)0; + } + + //////////////////// + if(address >= 0x0000 && (address <= 0x7fff || address < rom.size())) { + return rom.read(address - 0x0000); + } + + if(address >= 0x8000 && address <= 0xbfff) { + return ram.read(address - 0x8000); + } + + return nothing; + } + + auto write(n16 address, n8 data) -> bool override { + if(address >= 0x0000 && (address <= 0x7fff || address < rom.size())) { + return rom.write(address - 0x0000, data), true; + } + + if(address >= 0x8000 && address <= 0xbfff) { + return ram.write(address - 0x8000, data), true; + } + + return false; + } + + auto power() -> void override { + + } + + auto serialize(serializer& s) -> void override { + s(ram); + } +}; diff --git a/ares/sg/cartridge/cartridge.cpp b/ares/sg/cartridge/cartridge.cpp index 1d1c680970..9a99a72ea7 100644 --- a/ares/sg/cartridge/cartridge.cpp +++ b/ares/sg/cartridge/cartridge.cpp @@ -21,8 +21,9 @@ auto Cartridge::connect() -> void { if(information.board == "Linear") board = new Board::Linear{*this}; - if(information.board == "Taiwan-A") board = new Board::TaiwanA{*this}; - if(information.board == "Taiwan-B") board = new Board::TaiwanB{*this}; + if(information.board == "Ram Adapter 8kB") board = new Board::Ram_Adapter_8kB{*this}; + if(information.board == "NoMapper") board = new Board::NoMapper{*this}; + if(information.board == "TVOekaki") board = new Board::TVOekaki{*this}; if(!board) board = new Board::Interface{*this}; board->pak = pak; diff --git a/mia/medium/sg-1000.cpp b/mia/medium/sg-1000.cpp index 52c7899390..3f8e14c825 100644 --- a/mia/medium/sg-1000.cpp +++ b/mia/medium/sg-1000.cpp @@ -48,84 +48,108 @@ auto SG1000::analyze(vector& rom) -> string { string hash = Hash::SHA256(rom).digest(); string board = "Linear"; - // Bomberman Special (Taiwan) (Chinese Logo) (Unl) + //TODO: + // The Castle [This cartridge contains a onboard 8 kb RAM chip.] + // Othello [This cartridge contains a onboard 2 kb RAM chip.] + // Right now all games have 8kb RAM. (doesnt seem to cause probblems but isnt correct.) + + + + //Ram Adapter 8kB + //===== + + // Cant find: The Goonies (DahJee) [crc32: 40414556] + + // Adventure Island (DahJee) if (hash == "30417fcd412ad281cd6f72c77ecc107b2c13c719bff2d045dde05ea760c757ff") { - board = "Taiwan-A"; + board = "Ram Adapter 8kB"; } - // Bomberman Special (Taiwan) (English Logo) (Unl) - if (hash == "3eff3d6f1f74041f7b732455799d0978ab49724552ff2985f34b76478cd91721") { - board = "Taiwan-B"; - } - - // Castle, The (Taiwan) (Unl) (Pirate) - if (hash =="f071cdc34673e48decf2862f70e443558d916bac5e63553e61d0dda50101342a") { - board = "Taiwan-B"; - } - - // King's Valley (Taiwan) + // King's Valley (DahJee) if (hash == "490b01e157172cb06a7234d2675df22fbd3dccad3f7d23db11dd5e73a5659c59") { - board = "Taiwan-A"; + board = "Ram Adapter 8kB"; } - // Knightmare (Taiwan) + // Knightmare (Jumbo) if (hash == "3106c32c31eb16d9a9534b3975e204a0876c583f48d7a735c325710f03e31f89") { - board = "Taiwan-A"; + board = "Ram Adapter 8kB"; } - // Legend of Kage, The (Taiwan) + // Legend of Kage, The (Taiwan)??? if (hash == "cecc0658956ca46dbc37159a7cd29a12a14b6cb7de91ccea03000cbc5034d0dc") { - board = "Taiwan-A"; - } - - // Magical Kid Wiz (Taiwan) - if (hash == "2f443c61e9e6a55dc609de4c789dde4a9243ec6817d0ff4bfb7b6762cabe4e98") { - board = "Taiwan-B"; + board = "Ram Adapter 8kB"; } - // Pippols (Taiwan) + // Pippols (Jumbo) if (hash == "2c01a3383d55b21bda938aaac7889ce6ceeed2ef46452535f30ba9d578cc54e1") { - board = "Taiwan-A"; + board = "Ram Adapter 8kB"; } - // Rally-X (Taiwan) (Chinese Logo) + // Rally-X (DahJee) if (hash == "952c8e1788590b1d09c23368e133e76d3db59444787f1afa90be6ab075049734") { - board = "Taiwan-A"; - } - - // Rally-X (Taiwan) (English Logo) - if (hash == "f10416a655b2de101ad324695831468de7d9ae5690bdc1106f72c0e78f3fd9fb") { - board = "Taiwan-B"; + board = "Ram Adapter 8kB"; } - // Road Fighter (Taiwan) (Chinese Logo) + // Road Fighter (Jumbo) if (hash == "ead9e34e1b4f3f029f99dd0446641056e30a28596b30500bcd5134ac5c968633") { - board = "Taiwan-A"; + board = "Ram Adapter 8kB"; } - // Road Fighter (Taiwan) (English Logo) - if (hash == "f604b1374673b28e289ecacb85514c6b33a7516b82c8f53c2ec979eada505a60") { - board = "Taiwan-B"; - } - - // Star Soldier (Taiwan) + // Star Soldier (DahJee) if (hash == "dfcc8ac91e6f8004b9cf3d78b3879fcee1f071a97da00578ecd389bf1c954c1d") { - board = "Taiwan-A"; + board = "Ram Adapter 8kB"; } - // Tank Battalion (Taiwan) + // Tank Battalion (DahJee) if (hash == "1a74c2a02adf19104a319a507d88181337eb5314c558d6696ddcdddf243681e9") { - board = "Taiwan-A"; + board = "Ram Adapter 8kB"; } - // TwinBee (Taiwan) + // TwinBee (Jumbo) if (hash == "24f25236f743b5aab10dba38b182e52028e99c0093f004406c6973510d2b0875") { - board = "Taiwan-A"; + board = "Ram Adapter 8kB"; } - // Yie Ar Kung-Fu II (Taiwan) + // Yie Ar Kung-Fu II (DahJee) if (hash == "eb34e17ed22f0f23a13b39b3c78ecd9fe608d3f9ebd55f025d9812dfbbbf3e2f") { - board = "Taiwan-A"; + board = "Ram Adapter 8kB"; + } + + //No Mapper + //===== + + // Bomberman Special (Taiwan) (English Logo) (Unl) + if (hash == "3eff3d6f1f74041f7b732455799d0978ab49724552ff2985f34b76478cd91721") { + board = "NoMapper"; + } + + // Castle, The (Taiwan) (Unl) (Pirate) + if (hash =="f071cdc34673e48decf2862f70e443558d916bac5e63553e61d0dda50101342a") { + board = "NoMapper"; + } + + // Magical Kid Wiz (Taiwan) + if (hash == "2f443c61e9e6a55dc609de4c789dde4a9243ec6817d0ff4bfb7b6762cabe4e98") { + board = "NoMapper"; + } + + // Rally-X (Taiwan) (English Logo) + if (hash == "f10416a655b2de101ad324695831468de7d9ae5690bdc1106f72c0e78f3fd9fb") { + board = "NoMapper"; + } + + // Road Fighter (Taiwan) (English Logo) + if (hash == "f604b1374673b28e289ecacb85514c6b33a7516b82c8f53c2ec979eada505a60") { + board = "NoMapper"; + } + + //TVOekaki (Terebi Oekaki) + //TODO: Add controller + //===== + + // Terebi Oekaki + if (hash == "fd2991f6c0fd3e4ca478ed16b73aef25746c9482c8896fd3bc3ae712dc166ee0") { + board = "TVOekaki"; } From 6e9a4ee178430f0e9b1dedd668ac7b2d011d39b5 Mon Sep 17 00:00:00 2001 From: NoxyMe Date: Thu, 31 Aug 2023 11:50:27 +0100 Subject: [PATCH 2/2] Some extra code for TVOekaki --- ares/sg/cartridge/board/tvoekaki.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/ares/sg/cartridge/board/tvoekaki.cpp b/ares/sg/cartridge/board/tvoekaki.cpp index a2911bd9de..c4c675cce7 100644 --- a/ares/sg/cartridge/board/tvoekaki.cpp +++ b/ares/sg/cartridge/board/tvoekaki.cpp @@ -20,8 +20,7 @@ struct TVOekaki : Interface { switch (address) { case 0x8000: // Pen Pressure, Pen Position Ready - print("Pen Pressure, Pen Position Ready\n"); - return (n8)1; + return pendown; case 0xA000: print("PTEST\n"); return (n8)0; @@ -52,10 +51,22 @@ struct TVOekaki : Interface { } auto power() -> void override { - + pendown = 1; + penx = 1; + peny = 1; } auto serialize(serializer& s) -> void override { s(ram); + s(pendown); + s(penx); + s(peny); } + n8 pendown; + n8 penx; + n8 peny; }; + + + +