diff --git a/ares/sg/cartridge/cartridge.cpp b/ares/sg/cartridge/cartridge.cpp index d86ddc770..f1d423c5e 100644 --- a/ares/sg/cartridge/cartridge.cpp +++ b/ares/sg/cartridge/cartridge.cpp @@ -23,7 +23,7 @@ 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 == "sg1000a" ) board = new Board::ArcadeRom{*this}; + if(information.board == "sega/sg1000a") board = new Board::ArcadeRom{*this}; if(!board) board = new Board::Interface{*this}; board->pak = pak; diff --git a/desktop-ui/emulator/arcade.cpp b/desktop-ui/emulator/arcade.cpp index be3268015..c9cb96a3a 100644 --- a/desktop-ui/emulator/arcade.cpp +++ b/desktop-ui/emulator/arcade.cpp @@ -42,7 +42,7 @@ auto Arcade::load() -> bool { //Determine from the game manifest which core to use for the given arcade rom #ifdef CORE_SG - if(game->pak->attribute("board") == "sg1000a") { + if(game->pak->attribute("board") == "sega/sg1000a") { if(!ares::SG1000::load(root, {"[Sega] SG-1000A"})) return false; systemPakName = "SG-1000A"; gamePakName = "Arcade Cartridge"; diff --git a/mia/Database/Arcade.bml b/mia/Database/Arcade.bml index d9c6beb6d..69ec8efb9 100644 --- a/mia/Database/Arcade.bml +++ b/mia/Database/Arcade.bml @@ -1,10 +1,10 @@ database - revision: 2023-07-19 - + revision: 2024-04-03 + romset: 0.258 (mame0258) game - name: chboxing - title: Champion Boxing - board: sg1000a + name: chboxing + title: Champion Boxing + board: sega/sg1000a maincpu rom name: cb6105.bin @@ -25,9 +25,9 @@ game crc: c2f8e522 sha1: 932276e7ad33aa9efbb4cd10bc3071d88cb082cb game - name: chwrestl - title: Champion Pro Wrestling - board: sg1000a + name: chwrestl + title: Champion Pro Wrestling + board: sega/sg1000a maincpu rom name: 5732 @@ -48,9 +48,9 @@ game crc: d99b6301 sha1: 5e762ed45cde08d5223828c6b1d3569b2240462c game - name: dokidoki - title: Doki Doki Penguin Land - board: sg1000a + name: dokidoki + title: Doki Doki Penguin Land + board: sega/sg1000a maincpu rom name: epr-7356.ic1 @@ -70,3 +70,31 @@ game size: 16384 crc: c6f26b0b sha1: 3753e05b6e77159832dbe88562ba7a818120d1a3 +game + name: sderby2s + title: Super Derby II (satellite board) + board: sega/sg1000a + maincpu + rom + name: epr-6450d.ic10 + offset: 0x0 + size: 16384 + crc: e56986d3 + sha1: a2dbdc95128cc94a1492e080aeea402f2d4b89fe + rom + name: epr-6504d.ic11 + offset: 0x4000 + size: 16384 + crc: 7bb364b9 + sha1: 9f93572b6d999422d93ad5f7a251b4695565651f +game + name: sderbys + title: Super Derby (satellite board) + board: sega/sg1000a + maincpu + rom + name: v1.2.ic10 + offset: 0x0 + size: 16384 + crc: cf29b579 + sha1: e695da9c61167d1d30b32bd70d342ac23b29f087 diff --git a/mia/medium/arcade.cpp b/mia/medium/arcade.cpp index e75336b64..9898462ca 100644 --- a/mia/medium/arcade.cpp +++ b/mia/medium/arcade.cpp @@ -13,7 +13,7 @@ auto Arcade::load(string location) -> bool { if(!document) return false; //Sega SG-1000 based arcade - if(document["game/board"].string() == "sg1000a") { + if(document["game/board"].string() == "sega/sg1000a") { vector rom = loadRoms(location, document, "maincpu"); if(!rom) return false; diff --git a/scripts/update-arcade-rom-db.sh b/scripts/update-arcade-rom-db.sh new file mode 100644 index 000000000..1b3002407 --- /dev/null +++ b/scripts/update-arcade-rom-db.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +# Updates the Arcade ROM database to the latest version from MAME. +# This script requires MAME to be in your PATH, or you can pass the path to MAME as an argument. +# mame2bml is also required to be present and up-to-date. + +# Specify the mame drivers to include in the database +export CORES="sega/sg1000a.cpp" + +export PATH=$PATH:$(pwd)/tools/mame2bml/out +if ! command -v mame2bml &> /dev/null +then + echo "mame2bml could not be found. Please build it first." + exit 1 +fi + +if [ -z "$1" ] +then + if ! command -v mame &> /dev/null + then + echo "MAME could not be found. Please install it first." + exit 1 + fi +else + export PATH=$PATH:$1 +fi + +# Extract mame.xml +mame -listxml > mame.xml + +# Convert MAME XML to BML +mame2bml mame.xml mia/Database/Arcade.bml $CORES +rm mame.xml \ No newline at end of file diff --git a/tools/mame2bml/mame2bml.cpp b/tools/mame2bml/mame2bml.cpp index 1bdc4d8fa..2dc4bfcf9 100644 --- a/tools/mame2bml/mame2bml.cpp +++ b/tools/mame2bml/mame2bml.cpp @@ -13,26 +13,19 @@ private: auto Mame2BML::main(Arguments arguments) -> void { if(arguments.size() < 2) { - return print("usage: mame2bml softwarelist.xml output.bml core - convert a mame software list xml to bml\n" - " mame2bml machinelist.xml output.bml core driver - convert a mame machine list xml to bml\n"); + return print("usage: mame2bml softwarelist.xml output.bml ares_core - convert a mame software list xml to bml\n" + " mame2bml machinelist.xml output.bml mame_driver - convert a mame machine list xml to bml\n"); } string markupName = arguments.take(); string outputName = arguments.take(); - string driverName = {}; - string systemName = {}; + vector driverNames = {}; if(!markupName.endsWith(".xml")) return print("error: arguments in incorrect order\n"); if(!outputName.endsWith(".bml")) return print("error: arguments in incorrect order\n"); - if(arguments.size()) { - systemName = arguments.take(); - } else { - return print("ares core not specified\n"); - } - - if(arguments.size()) { - driverName = arguments.take(); - if(!driverName.iendsWith(".cpp")) return print("error: driver does not appear to be a mame src filename (eg: sega/segae.cpp)\n"); + while(arguments.size()) { + string driverName = arguments.take(); + driverNames.append(driverName); } string markup = string::read(markupName); @@ -41,7 +34,7 @@ auto Mame2BML::main(Arguments arguments) -> void { if(!output.open(outputName, file::mode::write)) return print("error: unable to write output file\n"); output.print("database\n"); - output.print(" revision: ", chrono::local::date(), "\n\n"); + output.print(" revision: ", chrono::local::date(), "\n"); pathname = Location::path(markupName); auto document = XML::unserialize(markup); @@ -49,16 +42,19 @@ auto Mame2BML::main(Arguments arguments) -> void { for(auto header : document) { // machine list xml (from mame.exe -listxml) if(header.name() == "mame") { + output.print(" romset: ", header["build"].string(), "\n"); + for(auto machine : header) { if(machine.name() != "machine") continue; - if(machine["sourcefile"].string() != driverName) continue; + string driverName = machine["sourcefile"].string(); + if(!driverNames.find(driverName)) continue; print("found game: ", machine["name"].string(), " (", machine["description"].string(), ")\n"); output.print("game\n"); - output.print(" name: ", machine["name"].string(), "\n"); - output.print(" title: ", machine["description"].string(), "\n"); - output.print(" board: ", systemName, "\n"); + output.print(" name: ", machine["name"].string(), "\n"); + output.print(" title: ", machine["description"].string(), "\n"); + output.print(" board: ", driverName.trimRight(".cpp"), "\n"); string region = ""; for(auto rom : machine) { @@ -90,7 +86,7 @@ auto Mame2BML::main(Arguments arguments) -> void { output.print("game\n"); output.print(" name: ", software["name"].string(), "\n"); output.print(" title: ", software["description"].string(), "\n"); - output.print(" board: ", systemName, "\n"); + output.print(" board: ", driverNames.first(), "\n"); for(auto sub : software["part"]){ if(sub.name() == "feature") {