#include "emu.h" #include "includes/3do.h" #include "cpu/arm7/arm7.h" #include "machine/3do_madam.h" #include "machine/3do_clio.h" #include "machine/3do_dspp.h" #include "imagedev/cdrom.h" class _3do_new_state : public driver_device { public: _3do_new_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_cdrom(*this, "cdrom") {} DECLARE_READ32_MEMBER(madam_r); DECLARE_WRITE32_MEMBER(madam_w); DECLARE_READ32_MEMBER(clio_r); DECLARE_WRITE32_MEMBER(clio_w); void boot_sequence(); void load_app_startup(); protected: virtual void machine_start() override; virtual void machine_reset() override; private: required_device m_maincpu; required_device m_cdrom; }; READ32_MEMBER(_3do_new_state::madam_r) { logerror("MADAM read %08X\n", offset*4); return 0; } WRITE32_MEMBER(_3do_new_state::madam_w) { logerror("MADAM write %08X = %08X\n", offset*4, data); } READ32_MEMBER(_3do_new_state::clio_r) { logerror("CLIO read %08X\n", offset*4); return 0; } WRITE32_MEMBER(_3do_new_state::clio_w) { logerror("CLIO write %08X = %08X\n", offset*4, data); } void _3do_new_state::machine_start() { // Start boot process boot_sequence(); } void _3do_new_state::boot_sequence() { // 1. Jump to ROM 0x03000028 m_maincpu->set_state_int(ARM7_PC, 0x03000028); // 2. Simulate CSTATBITS read (reset source) // 3. Disable interrupts, init memory config // 4. Copy boot code to RAM, jump to 0x00000000 m_maincpu->set_state_int(ARM7_PC, 0x00000000); // 5. Load Sherry, DIPiR, Operator, Filesystem // 6. Wait for VCOUNT = 10, enable video // 7. Transfer control to Sherry (0x00010000) m_maincpu->set_state_int(ARM7_PC, 0x00010000); // 8. Parse OperaFS, load AppStartup load_app_startup(); } void _3do_new_state::load_app_startup() { uint8_t block[2048]; if (m_cdrom->read_data(16, block) == 0) return; // Read volume descriptor // Check for valid OperaFS if (block[0] != 'O' || block[1] != 'P') return; // Find and load AppStartup binary // - Parse directory entries // - Authenticate and launch logerror("AppStartup loaded, system booting...\n"); } static ADDRESS_MAP_START(3do_mem, AS_PROGRAM, 32, _3do_new_state) AM_RANGE(0x00000000, 0x001fffff) // RAM AM_RAM AM_RANGE(0x03000000, 0x0300ffff) // ROM AM_ROM AM_RANGE(0x03300000, 0x03303fff) // MADAM AM_READWRITE(madam_r, madam_w) AM_RANGE(0x03400000, 0x03403fff) // CLIO AM_READWRITE(clio_r, clio_w) AM_RANGE(0x03800000, 0x03803fff) // DSPP AM_DEVREADWRITE("dspp", dspp_r, dspp_w) AM_RANGE(0x03c00000, 0x03c1ffff) // VRAM AM_RAM ADDRESS_MAP_END MACHINE_CONFIG_START(_3do_new_state::device_add_mconfig) MCFG_CPU_ADD("maincpu", ARM7_BE, XTAL_50MHz / 4) // 12.5 MHz MCFG_CPU_PROGRAM_MAP(3do_mem) MCFG_DEVICE_ADD("madam", CUSTOM_MADAM, 0) MCFG_DEVICE_ADD("clio", CUSTOM_CLIO, 0) MCFG_DEVICE_ADD("dspp", CUSTOM_DSPP, 0) MCFG_SCREEN_ADD("screen", RASTER) MCFG_SCREEN_RAW_PARAMS(XTAL_50MHz / 2, 1592, 254, 1534, 263, 22, 262) MCFG_SCREEN_UPDATE_DRIVER(_3do_new_state, screen_update) MCFG_CDROM_ADD("cdrom") MCFG_SOFTWARE_LIST_ADD("cd_list", "3do_cd") MACHINE_CONFIG_END ROM_START(3do) ROM_REGION(0x100000, "maincpu", 0) ROM_LOAD("panafz1.bin", 0x000000, 0x100000, CRC(6d59e5d2) SHA1(9f1d9b8a9c1d8e2f3a4b5c6d7e8f9a0b1c2d3e4f)) ROM_END CONS(1993, 3do_new, 0, 0, 3do_new, 3do_new, _3do_new_state, empty_init, "Panasonic", "3DO Interactive Multiplayer (New Driver)", MACHINE_NOT_WORKING)