diff --git a/machines/machinecatalyst.cpp b/machines/machinecatalyst.cpp
new file mode 100644
index 0000000..3455bdb
--- /dev/null
+++ b/machines/machinecatalyst.cpp
@@ -0,0 +1,101 @@
+/*
+DingusPPC - The Experimental PowerPC Macintosh emulator
+Copyright (C) 2018-22 divingkatae and maximum
+ (theweirdo) spatium
+
+(Contact divingkatae#1017 or powermax#2286 on Discord for more info)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see .
+*/
+
+/** @file Constructs a Catalyst (Power Macintosh 7200) machine. */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+int create_catalyst(std::string& id)
+{
+ PlatinumCtrl* platinum_obj;
+
+ if (gMachineObj) {
+ LOG_F(ERROR, "Global machine object not empty!");
+ return -1;
+ }
+
+ LOG_F(INFO, "Initializing the Catalyst hardware...");
+
+ // initialize the global machine object
+ gMachineObj.reset(new MachineBase("Catalyst"));
+
+ // add memory controller
+ gMachineObj->add_component("Platinum", new PlatinumCtrl());
+
+ // add the ARBus-to-PCI bridge
+ gMachineObj->add_component("Bandit1", new Bandit(1, "Bandit-PCI1"));
+
+ PCIHost *pci_host = dynamic_cast(gMachineObj->get_comp_by_name("Bandit1"));
+
+ // start the sound server
+ gMachineObj->add_component("SoundServer", new SoundServer());
+
+ // add the GrandCentral I/O controller
+ gMachineObj->add_component("GrandCentral", new GrandCentral());
+ pci_host->pci_register_device(
+ 32, dynamic_cast(gMachineObj->get_comp_by_name("GrandCentral")));
+
+ // HACK: attach temporary ATI Mach64 video card
+ gMachineObj->add_component("AtiMach64", new AtiMach64Gx);
+ pci_host->pci_register_device(
+ 4, dynamic_cast(gMachineObj->get_comp_by_name("AtiMach64")));
+
+ // get (raw) pointer to the memory controller
+ platinum_obj = dynamic_cast(gMachineObj->get_comp_by_name("Platinum"));
+
+ // allocate ROM region
+ if (!platinum_obj->add_rom_region(0xFFC00000, 0x400000)) {
+ LOG_F(ERROR, "Could not allocate ROM region!\n");
+ return -1;
+ }
+
+ // plug 8MB RAM DIMM into slot #0
+ platinum_obj->insert_ram_dimm(0, Platinum::DRAM_CAP_8MB);
+
+ // allocate and map physical RAM
+ platinum_obj->map_phys_ram();
+
+ // add single SCSI bus
+ gMachineObj->add_component("SCSI0", new ScsiBus);
+
+ // init virtual CPU and request MPC601
+ ppc_cpu_init(platinum_obj, PPC_VER::MPC601, 7833600ULL);
+
+ // post-initialize all devices
+ if (gMachineObj->postinit_devices()) {
+ LOG_F(ERROR, "Could not post-initialize devices!\n");
+ return -1;
+ }
+
+ LOG_F(INFO, "Initialization complete.\n");
+
+ return 0;
+}
diff --git a/machines/machinefactory.cpp b/machines/machinefactory.cpp
index 84c1297..aba3044 100644
--- a/machines/machinefactory.cpp
+++ b/machines/machinefactory.cpp
@@ -69,6 +69,23 @@ static const map> rom_identity = {
static const vector WriteToggle = {"ON", "on", "OFF", "off"};
+static const PropMap CatalystSettings = {
+ {"rambank1_size",
+ new IntProperty(16, vector({4, 8, 16, 32, 64, 128}))},
+ {"rambank2_size",
+ new IntProperty( 0, vector({0, 4, 8, 16, 32, 64, 128}))},
+ {"rambank3_size",
+ new IntProperty( 0, vector({0, 4, 8, 16, 32, 64, 128}))},
+ {"rambank4_size",
+ new IntProperty( 0, vector({0, 4, 8, 16, 32, 64, 128}))},
+ {"gfxmem_size",
+ new IntProperty( 1, vector({1, 2, 4}))},
+ {"mon_id",
+ new StrProperty("")},
+ {"fdd_img",
+ new StrProperty("")},
+};
+
static const PropMap GossamerSettings = {
{"rambank1_size",
new IntProperty(256, vector({8, 16, 32, 64, 128, 256}))},
@@ -102,7 +119,7 @@ static const PropMap PDMSettings = {
new StrProperty("HiRes12-14in", PDMBuiltinMonitorIDs)},
{"fdd_img",
new StrProperty("")},
- {"fdd_wr_prot",
+ {"fdd_wr_prot",
new StrProperty("OFF", WriteToggle)},
};
@@ -110,6 +127,7 @@ static const map PropHelp = {
{"rambank1_size", "specifies RAM bank 1 size in MB"},
{"rambank2_size", "specifies RAM bank 2 size in MB"},
{"rambank3_size", "specifies RAM bank 3 size in MB"},
+ {"rambank4_size", "specifies RAM bank 4 size in MB"},
{"gfxmem_size", "specifies video memory size in MB"},
{"fdd_img", "specifies path to floppy disk image"},
{"fdd_wr_prot", "toggles floppy disks write protection"},
@@ -118,6 +136,7 @@ static const map PropHelp = {
static const map, string>> machines = {
{"pm6100", {PDMSettings, create_pdm, "PowerMacintosh 6100"}},
+ {"pm7200", {CatalystSettings, create_catalyst, "PowerMacintosh 7200"}},
{"pmg3", {GossamerSettings, create_gossamer, "Power Macintosh G3 (Beige)"}},
};
diff --git a/machines/machinefactory.h b/machines/machinefactory.h
index 507cc65..57460c2 100644
--- a/machines/machinefactory.h
+++ b/machines/machinefactory.h
@@ -43,6 +43,7 @@ void list_machines(void);
void list_properties(void);
/* Machine-specific factory functions. */
+int create_catalyst(string& id);
int create_gossamer(string& id);
int create_pdm(string& id);