diff options
Diffstat (limited to 'src/devices/bus/ti99x/gromport.cpp')
-rw-r--r-- | src/devices/bus/ti99x/gromport.cpp | 342 |
1 files changed, 237 insertions, 105 deletions
diff --git a/src/devices/bus/ti99x/gromport.cpp b/src/devices/bus/ti99x/gromport.cpp index 849a0fc498d..e9d3e7a4523 100644 --- a/src/devices/bus/ti99x/gromport.cpp +++ b/src/devices/bus/ti99x/gromport.cpp @@ -132,8 +132,140 @@ #define GKRACKER_ROM_TAG "gkracker_rom" #define GKRACKER_NVRAM_TAG "gkracker_nvram" -gromport_device::gromport_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : bus8z_device(mconfig, GROMPORT, "Cartridge port", tag, owner, clock, "gromport", __FILE__), +namespace { + +enum rpk_open_error +{ + RPK_OK, + RPK_NOT_ZIP_FORMAT, + RPK_CORRUPT, + RPK_OUT_OF_MEMORY, + RPK_XML_ERROR, + RPK_INVALID_FILE_REF, + RPK_ZIP_ERROR, + RPK_ZIP_UNSUPPORTED, + RPK_MISSING_RAM_LENGTH, + RPK_INVALID_RAM_SPEC, + RPK_UNKNOWN_RESOURCE_TYPE, + RPK_INVALID_RESOURCE_REF, + RPK_INVALID_LAYOUT, + RPK_MISSING_LAYOUT, + RPK_NO_PCB_OR_RESOURCES, + RPK_UNKNOWN_PCB_TYPE +}; + + +const char *const error_text[16] = +{ + "No error", + "Not a RPK (zip) file", + "Module definition corrupt", + "Out of memory", + "XML format error", + "Invalid file reference", + "Zip file error", + "Unsupported zip version", + "Missing RAM length", + "Invalid RAM specification", + "Unknown resource type", + "Invalid resource reference", + "layout.xml not valid", + "Missing layout", + "No pcb or resource found", + "Unknown pcb type" +}; + + +class rpk_exception +{ +public: + rpk_exception(rpk_open_error value): m_err(value), m_detail(nullptr) { } + rpk_exception(rpk_open_error value, const char* detail) : m_err(value), m_detail(detail) { } + + const char* to_string() + { + // FIXME: this leaks memory - in some cases it returns a new buffer, in other cases it returns a pointer to a static string, so the caller can't know whether it needs to be cleaned up + if (m_detail==nullptr) return error_text[(int)m_err]; + std::string errormsg = std::string(error_text[(int)m_err]).append(": ").append(m_detail); + return core_strdup(errormsg.c_str()); + } + +private: + rpk_open_error m_err; + const char* m_detail; +}; + +struct pcb_type +{ + int id; + const char* name; +}; + +} // anonymous namespace + + +/************************************************************************* + RPK support +*************************************************************************/ + +class ti99_cartridge_device::rpk_socket +{ +public: + rpk_socket(const char *id, int length, uint8_t *contents); + rpk_socket(const char *id, int length, uint8_t *contents, const char *pathname); + ~rpk_socket() {} + + const char* id() { return m_id; } + int get_content_length() { return m_length; } + uint8_t* get_contents() { return m_contents; } + bool persistent_ram() { return m_pathname != nullptr; } + const char* get_pathname() { return m_pathname; } + void cleanup() { if (m_contents != nullptr) global_free_array(m_contents); } + +private: + const char* m_id; + uint32_t m_length; + uint8_t* m_contents; + const char* m_pathname; +}; + +class ti99_cartridge_device::rpk_reader +{ +public: + rpk_reader(const pcb_type *types) : m_types(types) { } + + rpk *open(emu_options &options, const char *filename, const char *system_name); + +private: + int find_file(util::archive_file &zip, const char *filename, uint32_t crc); + std::unique_ptr<rpk_socket> load_rom_resource(util::archive_file &zip, util::xml::data_node const* rom_resource_node, const char* socketname); + std::unique_ptr<rpk_socket> load_ram_resource(emu_options &options, util::xml::data_node const* ram_resource_node, const char* socketname, const char* system_name); + const pcb_type* m_types; +}; + +class ti99_cartridge_device::rpk +{ + friend class rpk_reader; +public: + rpk(emu_options& options, const char* sysname); + ~rpk(); + + int get_type(void) { return m_type; } + uint8_t* get_contents_of_socket(const char *socket_name); + int get_resource_length(const char *socket_name); + void close(); + +private: + emu_options& m_options; // need this to find the path to the nvram files + int m_type; + //const char* m_system_name; // need this to find the path to the nvram files + std::unordered_map<std::string,std::unique_ptr<rpk_socket>> m_sockets; + + void add_socket(const char* id, std::unique_ptr<rpk_socket> newsock); +}; + +ti99_gromport_device::ti99_gromport_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : bus8z_device(mconfig, TI99_GROMPORT, tag, owner, clock), device_slot_interface(mconfig, *this), m_connector(nullptr), m_reset_on_insert(true), @@ -145,7 +277,7 @@ gromport_device::gromport_device(const machine_config &mconfig, const char *tag, Reading via the GROM port. Only 13 address lines are passed through on the TI-99/4A, and 14 lines on the TI-99/8. */ -READ8Z_MEMBER(gromport_device::readz) +READ8Z_MEMBER(ti99_gromport_device::readz) { if (m_connector != nullptr) { @@ -158,7 +290,7 @@ READ8Z_MEMBER(gromport_device::readz) Writing via the GROM port. Only 13 address lines are passed through on the TI-99/4A, and 14 lines on the TI-99/8. */ -WRITE8_MEMBER(gromport_device::write) +WRITE8_MEMBER(ti99_gromport_device::write) { if (m_connector != nullptr) { @@ -167,19 +299,19 @@ WRITE8_MEMBER(gromport_device::write) } } -READ8Z_MEMBER(gromport_device::crureadz) +READ8Z_MEMBER(ti99_gromport_device::crureadz) { if (m_connector != nullptr) m_connector->crureadz(space, offset, value); } -WRITE8_MEMBER(gromport_device::cruwrite) +WRITE8_MEMBER(ti99_gromport_device::cruwrite) { if (m_connector != nullptr) m_connector->cruwrite(space, offset, data); } -WRITE_LINE_MEMBER(gromport_device::ready_line) +WRITE_LINE_MEMBER(ti99_gromport_device::ready_line) { m_console_ready(state); } @@ -187,14 +319,14 @@ WRITE_LINE_MEMBER(gromport_device::ready_line) /* Asserted when the console addresses cartridge rom. */ -WRITE_LINE_MEMBER(gromport_device::romgq_line) +WRITE_LINE_MEMBER(ti99_gromport_device::romgq_line) { m_romgq = state; if (m_connector != nullptr) m_connector->romgq_line(state); } -WRITE_LINE_MEMBER(gromport_device::gclock_in) +WRITE_LINE_MEMBER(ti99_gromport_device::gclock_in) { if (m_connector != nullptr) m_connector->gclock_in(state); @@ -203,13 +335,13 @@ WRITE_LINE_MEMBER(gromport_device::gclock_in) /* Combined GROM control lines. */ -WRITE8_MEMBER( gromport_device::set_gromlines ) +WRITE8_MEMBER( ti99_gromport_device::set_gromlines ) { if (m_connector != nullptr) m_connector->set_gromlines(space, offset, data); } -void gromport_device::device_start() +void ti99_gromport_device::device_start() { m_console_ready.resolve(); m_console_reset.resolve(); @@ -217,7 +349,7 @@ void gromport_device::device_start() save_item(NAME(m_romgq)); } -void gromport_device::device_reset() +void ti99_gromport_device::device_reset() { m_reset_on_insert = (ioport("CARTRESET")->read()==0x01); } @@ -229,7 +361,7 @@ void gromport_device::device_reset() reset, which is useful when we want to swap the cartridges while a program is runnning. */ -void gromport_device::cartridge_inserted() +void ti99_gromport_device::cartridge_inserted() { if (m_reset_on_insert) { @@ -242,7 +374,7 @@ void gromport_device::cartridge_inserted() Find out whether the GROMs in the cartridge are idle. In that case, cut the clock line. */ -bool gromport_device::is_grom_idle() +bool ti99_gromport_device::is_grom_idle() { if (m_connector != nullptr) return m_connector->is_grom_idle(); @@ -250,20 +382,20 @@ bool gromport_device::is_grom_idle() return false; } -void gromport_device::device_config_complete() +void ti99_gromport_device::device_config_complete() { - m_connector = static_cast<ti99_cartridge_connector_device*>(subdevices().first()); + m_connector = downcast<ti99_cartridge_connector_device*>(subdevices().first()); } SLOT_INTERFACE_START( gromport4 ) - SLOT_INTERFACE("single", GROMPORT_SINGLE) - SLOT_INTERFACE("multi", GROMPORT_MULTI) - SLOT_INTERFACE("gkracker", GROMPORT_GK) + SLOT_INTERFACE("single", TI99_GROMPORT_SINGLE) + SLOT_INTERFACE("multi", TI99_GROMPORT_MULTI) + SLOT_INTERFACE("gkracker", TI99_GROMPORT_GK) SLOT_INTERFACE_END SLOT_INTERFACE_START( gromport8 ) - SLOT_INTERFACE("single", GROMPORT_SINGLE) - SLOT_INTERFACE("multi", GROMPORT_MULTI) + SLOT_INTERFACE("single", TI99_GROMPORT_SINGLE) + SLOT_INTERFACE("multi", TI99_GROMPORT_MULTI) SLOT_INTERFACE_END INPUT_PORTS_START(gromport) @@ -273,12 +405,12 @@ INPUT_PORTS_START(gromport) PORT_CONFSETTING( 0x01, DEF_STR( On ) ) INPUT_PORTS_END -ioport_constructor gromport_device::device_input_ports() const +ioport_constructor ti99_gromport_device::device_input_ports() const { return INPUT_PORTS_NAME(gromport); } -const device_type GROMPORT = device_creator<gromport_device>; +DEFINE_DEVICE_TYPE(TI99_GROMPORT, ti99_gromport_device, "ti99_gromport", "TI-99 Cartridge port") /*************************************************************************** Different versions of cartridge connections @@ -291,12 +423,12 @@ const device_type GROMPORT = device_creator<gromport_device>; ***************************************************************************/ -const device_type GROMPORT_SINGLE = device_creator<single_conn_device>; -const device_type GROMPORT_MULTI = device_creator<multi_conn_device>; -const device_type GROMPORT_GK = device_creator<gkracker_device>; +DEFINE_DEVICE_TYPE(TI99_GROMPORT_SINGLE, ti99_single_cart_conn_device, "ti99_scartconn", "TI-99 Standard cartridge connector") +DEFINE_DEVICE_TYPE(TI99_GROMPORT_MULTI, ti99_multi_cart_conn_device, "ti99_mcartconn", "TI-99 Multi-cartridge extender") +DEFINE_DEVICE_TYPE(TI99_GROMPORT_GK, ti99_gkracker_device, "ti99_gkracker", "Miller's Graphics GRAM Kracker") -ti99_cartridge_connector_device::ti99_cartridge_connector_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) - : bus8z_device(mconfig, type, name, tag, owner, clock, shortname, source), +ti99_cartridge_connector_device::ti99_cartridge_connector_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) + : bus8z_device(mconfig, type, tag, owner, clock), m_gromport(nullptr) { } @@ -308,40 +440,40 @@ WRITE_LINE_MEMBER( ti99_cartridge_connector_device::ready_line ) void ti99_cartridge_connector_device::device_config_complete() { - m_gromport = static_cast<gromport_device*>(owner()); + m_gromport = static_cast<ti99_gromport_device*>(owner()); } -single_conn_device::single_conn_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ti99_cartridge_connector_device(mconfig, GROMPORT_SINGLE, "Standard cartridge connector", tag, owner, clock, "single", __FILE__), +ti99_single_cart_conn_device::ti99_single_cart_conn_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : ti99_cartridge_connector_device(mconfig, TI99_GROMPORT_SINGLE, tag, owner, clock), m_cartridge(nullptr) { } -READ8Z_MEMBER(single_conn_device::readz) +READ8Z_MEMBER(ti99_single_cart_conn_device::readz) { // Pass through m_cartridge->readz(space, offset, value); } -WRITE8_MEMBER(single_conn_device::write) +WRITE8_MEMBER(ti99_single_cart_conn_device::write) { // Pass through m_cartridge->write(space, offset, data); } -READ8Z_MEMBER(single_conn_device::crureadz) +READ8Z_MEMBER(ti99_single_cart_conn_device::crureadz) { // Pass through m_cartridge->crureadz(space, offset, value); } -WRITE8_MEMBER(single_conn_device::cruwrite) +WRITE8_MEMBER(ti99_single_cart_conn_device::cruwrite) { // Pass through m_cartridge->cruwrite(space, offset, data); } -WRITE_LINE_MEMBER(single_conn_device::romgq_line) +WRITE_LINE_MEMBER(ti99_single_cart_conn_device::romgq_line) { // Pass through m_cartridge->romgq_line(state); @@ -350,14 +482,14 @@ WRITE_LINE_MEMBER(single_conn_device::romgq_line) /* Combined select lines */ -WRITE8_MEMBER(single_conn_device::set_gromlines) +WRITE8_MEMBER(ti99_single_cart_conn_device::set_gromlines) { // Pass through m_cartridge->set_gromlines(space, offset, data); } -WRITE_LINE_MEMBER(single_conn_device::gclock_in) +WRITE_LINE_MEMBER(ti99_single_cart_conn_device::gclock_in) { // Pass through m_cartridge->gclock_in(state); @@ -366,17 +498,17 @@ WRITE_LINE_MEMBER(single_conn_device::gclock_in) /* Check whether the GROMs are idle. */ -bool single_conn_device::is_grom_idle() +bool ti99_single_cart_conn_device::is_grom_idle() { return m_cartridge->is_grom_idle(); } -void single_conn_device::device_start() +void ti99_single_cart_conn_device::device_start() { m_cartridge = static_cast<ti99_cartridge_device*>(subdevices().first()); } -void single_conn_device::device_reset() +void ti99_single_cart_conn_device::device_reset() { m_cartridge->set_slot(0); } @@ -385,7 +517,7 @@ static MACHINE_CONFIG_FRAGMENT( single_slot ) MCFG_DEVICE_ADD("cartridge", TI99CART, 0) MACHINE_CONFIG_END -machine_config_constructor single_conn_device::device_mconfig_additions() const +machine_config_constructor ti99_single_cart_conn_device::device_mconfig_additions() const { return MACHINE_CONFIG_NAME( single_slot ); } @@ -434,8 +566,8 @@ machine_config_constructor single_conn_device::device_mconfig_additions() const #define AUTO -1 -multi_conn_device::multi_conn_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ti99_cartridge_connector_device(mconfig, GROMPORT_MULTI, "Multi-cartridge extender", tag, owner, clock, "multi", __FILE__), +ti99_multi_cart_conn_device::ti99_multi_cart_conn_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : ti99_cartridge_connector_device(mconfig, TI99_GROMPORT_MULTI, tag, owner, clock), m_active_slot(0), m_fixed_slot(0), m_next_free_slot(0) @@ -480,7 +612,7 @@ multi_conn_device::multi_conn_device(const machine_config &mconfig, const char * Interestingly, cartridge subroutines are found nevertheless, even when the cartridge is plugged into a higher slot. */ -void multi_conn_device::set_slot(int slotnumber) +void ti99_multi_cart_conn_device::set_slot(int slotnumber) { if (TRACE_CHANGE) if (m_active_slot != slotnumber) logerror("Setting cartslot to %d\n", slotnumber); @@ -491,7 +623,7 @@ void multi_conn_device::set_slot(int slotnumber) m_active_slot = m_fixed_slot; } -int multi_conn_device::get_active_slot(bool changebase, offs_t offset) +int ti99_multi_cart_conn_device::get_active_slot(bool changebase, offs_t offset) { int slot; if (changebase) @@ -503,20 +635,20 @@ int multi_conn_device::get_active_slot(bool changebase, offs_t offset) return slot; } -void multi_conn_device::insert(int index, ti99_cartridge_device* cart) +void ti99_multi_cart_conn_device::insert(int index, ti99_cartridge_device* cart) { if (TRACE_CHANGE) logerror("Insert slot %d\n", index); m_cartridge[index] = cart; m_gromport->cartridge_inserted(); } -void multi_conn_device::remove(int index) +void ti99_multi_cart_conn_device::remove(int index) { if (TRACE_CHANGE) logerror("Remove slot %d\n", index); m_cartridge[index] = nullptr; } -WRITE_LINE_MEMBER(multi_conn_device::romgq_line) +WRITE_LINE_MEMBER(ti99_multi_cart_conn_device::romgq_line) { m_readrom = state; @@ -533,7 +665,7 @@ WRITE_LINE_MEMBER(multi_conn_device::romgq_line) /* Combined select lines */ -WRITE8_MEMBER(multi_conn_device::set_gromlines) +WRITE8_MEMBER(ti99_multi_cart_conn_device::set_gromlines) { // GROM selected? m_grom_selected = (data != 0); @@ -548,7 +680,7 @@ WRITE8_MEMBER(multi_conn_device::set_gromlines) } } -WRITE_LINE_MEMBER(multi_conn_device::gclock_in) +WRITE_LINE_MEMBER(ti99_multi_cart_conn_device::gclock_in) { // Propagate to all slots for (int i=0; i < NUMBER_OF_CARTRIDGE_SLOTS; i++) @@ -560,7 +692,7 @@ WRITE_LINE_MEMBER(multi_conn_device::gclock_in) } } -READ8Z_MEMBER(multi_conn_device::readz) +READ8Z_MEMBER(ti99_multi_cart_conn_device::readz) { int slot = get_active_slot(true, offset); @@ -591,7 +723,7 @@ READ8Z_MEMBER(multi_conn_device::readz) } } -WRITE8_MEMBER(multi_conn_device::write) +WRITE8_MEMBER(ti99_multi_cart_conn_device::write) { // Same issue as above (read) // We don't have GRAM cartridges, anyway, so it's just used for setting the address. @@ -616,7 +748,7 @@ WRITE8_MEMBER(multi_conn_device::write) } } -READ8Z_MEMBER(multi_conn_device::crureadz) +READ8Z_MEMBER(ti99_multi_cart_conn_device::crureadz) { int slot = get_active_slot(false, offset); /* Sanity check. Higher slots are always empty. */ @@ -629,7 +761,7 @@ READ8Z_MEMBER(multi_conn_device::crureadz) } } -WRITE8_MEMBER(multi_conn_device::cruwrite) +WRITE8_MEMBER(ti99_multi_cart_conn_device::cruwrite) { int slot = get_active_slot(true, offset); @@ -647,7 +779,7 @@ WRITE8_MEMBER(multi_conn_device::cruwrite) Check whether the GROMs are idle. Just ask the currently active cartridge. */ -bool multi_conn_device::is_grom_idle() +bool ti99_multi_cart_conn_device::is_grom_idle() { /* Sanity check. Higher slots are always empty. */ if (m_active_slot >= NUMBER_OF_CARTRIDGE_SLOTS) @@ -659,7 +791,7 @@ bool multi_conn_device::is_grom_idle() return false; } -void multi_conn_device::device_start() +void ti99_multi_cart_conn_device::device_start() { m_next_free_slot = 0; m_active_slot = 0; @@ -673,7 +805,7 @@ void multi_conn_device::device_start() save_item(NAME(m_next_free_slot)); } -void multi_conn_device::device_reset(void) +void ti99_multi_cart_conn_device::device_reset(void) { m_active_slot = 0; m_fixed_slot = ioport("CARTSLOT")->read() - 1; @@ -687,12 +819,12 @@ static MACHINE_CONFIG_FRAGMENT( multi_slot ) MCFG_DEVICE_ADD("cartridge4", TI99CART, 0) MACHINE_CONFIG_END -machine_config_constructor multi_conn_device::device_mconfig_additions() const +machine_config_constructor ti99_multi_cart_conn_device::device_mconfig_additions() const { return MACHINE_CONFIG_NAME( multi_slot ); } -INPUT_CHANGED_MEMBER( multi_conn_device::switch_changed ) +INPUT_CHANGED_MEMBER( ti99_multi_cart_conn_device::switch_changed ) { if (TRACE_CHANGE) logerror("Slot changed %d - %d\n", (int)((uint64_t)param & 0x07), newval); m_active_slot = m_fixed_slot = newval - 1; @@ -700,7 +832,7 @@ INPUT_CHANGED_MEMBER( multi_conn_device::switch_changed ) INPUT_PORTS_START(multi_slot) PORT_START( "CARTSLOT" ) - PORT_DIPNAME( 0x0f, 0x00, "Multi-cartridge slot" ) PORT_CHANGED_MEMBER(DEVICE_SELF, multi_conn_device, switch_changed, 0) + PORT_DIPNAME( 0x0f, 0x00, "Multi-cartridge slot" ) PORT_CHANGED_MEMBER(DEVICE_SELF, ti99_multi_cart_conn_device, switch_changed, 0) PORT_DIPSETTING( 0x00, "Auto" ) PORT_DIPSETTING( 0x01, "Slot 1" ) PORT_DIPSETTING( 0x02, "Slot 2" ) @@ -708,7 +840,7 @@ INPUT_PORTS_START(multi_slot) PORT_DIPSETTING( 0x04, "Slot 4" ) INPUT_PORTS_END -ioport_constructor multi_conn_device::device_input_ports() const +ioport_constructor ti99_multi_cart_conn_device::device_input_ports() const { return INPUT_PORTS_NAME(multi_slot); } @@ -828,8 +960,8 @@ enum #define GKSWITCH4_TAG "GKSWITCH4" #define GKSWITCH5_TAG "GKSWITCH5" -gkracker_device::gkracker_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : ti99_cartridge_connector_device(mconfig, GROMPORT_GK, "GRAMKracker", tag, owner, clock, "ti99_gkracker", __FILE__), +ti99_gkracker_device::ti99_gkracker_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : ti99_cartridge_connector_device(mconfig, TI99_GROMPORT_GK, tag, owner, clock), device_nvram_interface(mconfig, *this), m_romspace_selected(false), m_ram_page(0), @@ -841,7 +973,7 @@ gkracker_device::gkracker_device(const machine_config &mconfig, const char *tag, { } -WRITE_LINE_MEMBER(gkracker_device::romgq_line) +WRITE_LINE_MEMBER(ti99_gkracker_device::romgq_line) { m_romspace_selected = (state==ASSERT_LINE); // Propagate to the guest @@ -851,13 +983,13 @@ WRITE_LINE_MEMBER(gkracker_device::romgq_line) /* Combined select lines */ -WRITE8_MEMBER(gkracker_device::set_gromlines) +WRITE8_MEMBER(ti99_gkracker_device::set_gromlines) { m_grom_selected = (data != 0); if (m_cartridge != nullptr) m_cartridge->set_gromlines(space, offset, data); } -WRITE_LINE_MEMBER(gkracker_device::gclock_in) +WRITE_LINE_MEMBER(ti99_gkracker_device::gclock_in) { if (m_cartridge != nullptr) m_cartridge->gclock_in(state); } @@ -865,12 +997,12 @@ WRITE_LINE_MEMBER(gkracker_device::gclock_in) /* Check whether the GROMs are idle. */ -bool gkracker_device::is_grom_idle() +bool ti99_gkracker_device::is_grom_idle() { return (m_cartridge != nullptr)? m_cartridge->is_grom_idle() : false; } -READ8Z_MEMBER(gkracker_device::readz) +READ8Z_MEMBER(ti99_gkracker_device::readz) { if (m_grom_selected) { @@ -929,7 +1061,7 @@ READ8Z_MEMBER(gkracker_device::readz) } } -WRITE8_MEMBER(gkracker_device::write) +WRITE8_MEMBER(ti99_gkracker_device::write) { // write to the guest cartridge if present if (m_cartridge != nullptr) @@ -1001,23 +1133,23 @@ WRITE8_MEMBER(gkracker_device::write) } } -READ8Z_MEMBER( gkracker_device::crureadz ) +READ8Z_MEMBER( ti99_gkracker_device::crureadz ) { if (m_cartridge != nullptr) m_cartridge->crureadz(space, offset, value); } -WRITE8_MEMBER( gkracker_device::cruwrite ) +WRITE8_MEMBER( ti99_gkracker_device::cruwrite ) { if (m_cartridge != nullptr) m_cartridge->cruwrite(space, offset, data); } -INPUT_CHANGED_MEMBER( gkracker_device::gk_changed ) +INPUT_CHANGED_MEMBER( ti99_gkracker_device::gk_changed ) { if (TRACE_GKRACKER) logerror("Input changed %d - %d\n", (int)((uint64_t)param & 0x07), newval); m_gk_switch[(uint64_t)param & 0x07] = newval; } -void gkracker_device::insert(int index, ti99_cartridge_device* cart) +void ti99_gkracker_device::insert(int index, ti99_cartridge_device* cart) { if (TRACE_CHANGE) logerror("Insert cartridge\n"); m_cartridge = cart; @@ -1026,13 +1158,13 @@ void gkracker_device::insert(int index, ti99_cartridge_device* cart) m_gromport->cartridge_inserted(); } -void gkracker_device::remove(int index) +void ti99_gkracker_device::remove(int index) { if (TRACE_CHANGE) logerror("Remove cartridge\n"); m_cartridge = nullptr; } -void gkracker_device::gk_install_menu(const char* menutext, int len, int ptr, int next, int start) +void ti99_gkracker_device::gk_install_menu(const char* menutext, int len, int ptr, int next, int start) { const int base = 0x0000; m_ram_ptr[base + ptr] = (uint8_t)((next >> 8) & 0xff); @@ -1049,7 +1181,7 @@ void gkracker_device::gk_install_menu(const char* menutext, int len, int ptr, in some sample entries which shall indicate that the memory has been tested by the manufacturer. */ -void gkracker_device::nvram_default() +void ti99_gkracker_device::nvram_default() { if (TRACE_GKRACKER) logerror("Creating default NVRAM\n"); memset(m_ram_ptr, 0, 81920); @@ -1072,7 +1204,7 @@ void gkracker_device::nvram_default() m_ram_ptr[0x6100] = 0x0b; // GPL EXIT } -void gkracker_device::nvram_read(emu_file &file) +void ti99_gkracker_device::nvram_read(emu_file &file) { int readsize = file.read(m_ram_ptr, 81920); if (TRACE_GKRACKER) logerror("Reading NVRAM\n"); @@ -1083,13 +1215,13 @@ void gkracker_device::nvram_read(emu_file &file) } } -void gkracker_device::nvram_write(emu_file &file) +void ti99_gkracker_device::nvram_write(emu_file &file) { if (TRACE_GKRACKER) logerror("Writing NVRAM\n"); file.write(m_ram_ptr, 81920); } -void gkracker_device::device_start() +void ti99_gkracker_device::device_start() { m_ram_ptr = memregion(GKRACKER_NVRAM_TAG)->base(); m_grom_ptr = memregion(GKRACKER_ROM_TAG)->base(); @@ -1102,7 +1234,7 @@ void gkracker_device::device_start() save_item(NAME(m_waddr_LSB)); } -void gkracker_device::device_reset() +void ti99_gkracker_device::device_reset() { m_gk_switch[1] = ioport(GKSWITCH1_TAG)->read(); m_gk_switch[2] = ioport(GKSWITCH2_TAG)->read(); @@ -1128,45 +1260,45 @@ ROM_START( gkracker_rom ) ROM_LOAD("gkracker.bin", 0x0000, 0x2000, CRC(86eaaf9f) SHA1(a3bd5257c63e190800921b52dbe3ffa91ad91113)) ROM_END -const tiny_rom_entry *gkracker_device::device_rom_region() const +const tiny_rom_entry *ti99_gkracker_device::device_rom_region() const { return ROM_NAME( gkracker_rom ); } -machine_config_constructor gkracker_device::device_mconfig_additions() const +machine_config_constructor ti99_gkracker_device::device_mconfig_additions() const { return MACHINE_CONFIG_NAME( gkracker_slot ); } INPUT_PORTS_START(gkracker) PORT_START( GKSWITCH1_TAG ) - PORT_DIPNAME( 0x01, 0x01, "GK switch 1" ) PORT_CHANGED_MEMBER(DEVICE_SELF, gkracker_device, gk_changed, 1) + PORT_DIPNAME( 0x01, 0x01, "GK switch 1" ) PORT_CHANGED_MEMBER(DEVICE_SELF, ti99_gkracker_device, gk_changed, 1) PORT_DIPSETTING( 0x00, "GK Off" ) PORT_DIPSETTING( 0x01, DEF_STR( Normal ) ) PORT_START( GKSWITCH2_TAG ) - PORT_DIPNAME( 0x01, 0x01, "GK switch 2" ) PORT_CHANGED_MEMBER(DEVICE_SELF, gkracker_device, gk_changed, 2) + PORT_DIPNAME( 0x01, 0x01, "GK switch 2" ) PORT_CHANGED_MEMBER(DEVICE_SELF, ti99_gkracker_device, gk_changed, 2) PORT_DIPSETTING( 0x00, "GRAM 0" ) PORT_DIPSETTING( 0x01, "Op Sys" ) PORT_START( GKSWITCH3_TAG ) - PORT_DIPNAME( 0x01, 0x01, "GK switch 3" ) PORT_CHANGED_MEMBER(DEVICE_SELF, gkracker_device, gk_changed, 3) + PORT_DIPNAME( 0x01, 0x01, "GK switch 3" ) PORT_CHANGED_MEMBER(DEVICE_SELF, ti99_gkracker_device, gk_changed, 3) PORT_DIPSETTING( 0x00, "GRAM 1-2" ) PORT_DIPSETTING( 0x01, "TI BASIC" ) PORT_START( GKSWITCH4_TAG ) - PORT_DIPNAME( 0x03, 0x01, "GK switch 4" ) PORT_CHANGED_MEMBER(DEVICE_SELF, gkracker_device, gk_changed, 4) + PORT_DIPNAME( 0x03, 0x01, "GK switch 4" ) PORT_CHANGED_MEMBER(DEVICE_SELF, ti99_gkracker_device, gk_changed, 4) PORT_DIPSETTING( 0x00, "Bank 1" ) PORT_DIPSETTING( 0x01, "W/P" ) PORT_DIPSETTING( 0x02, "Bank 2" ) PORT_START( GKSWITCH5_TAG ) - PORT_DIPNAME( 0x01, 0x00, "GK switch 5" ) PORT_CHANGED_MEMBER(DEVICE_SELF, gkracker_device, gk_changed, 5) + PORT_DIPNAME( 0x01, 0x00, "GK switch 5" ) PORT_CHANGED_MEMBER(DEVICE_SELF, ti99_gkracker_device, gk_changed, 5) PORT_DIPSETTING( 0x00, "Loader On" ) PORT_DIPSETTING( 0x01, "Loader Off" ) INPUT_PORTS_END -ioport_constructor gkracker_device::device_input_ports() const +ioport_constructor ti99_gkracker_device::device_input_ports() const { return INPUT_PORTS_NAME(gkracker); } @@ -1228,7 +1360,7 @@ static const pcb_type sw_pcbdefs[] = }; ti99_cartridge_device::ti99_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) -: bus8z_device(mconfig, TI99CART, "TI-99 cartridge", tag, owner, clock, "cartridge", __FILE__), +: bus8z_device(mconfig, TI99CART, tag, owner, clock), device_image_interface(mconfig, *this), m_pcbtype(0), m_slot(0), @@ -1564,7 +1696,7 @@ const tiny_rom_entry *ti99_cartridge_device::device_rom_region() const return ROM_NAME( cartridge_memory ); } -const device_type TI99CART = device_creator<ti99_cartridge_device>; +DEFINE_DEVICE_TYPE(TI99CART, ti99_cartridge_device, "ti99cart", "TI-99 cartridge") /*************************************************************************** Cartridge types @@ -2518,14 +2650,14 @@ DTD: /* Constructor. */ -rpk::rpk(emu_options& options, const char* sysname) +ti99_cartridge_device::rpk::rpk(emu_options& options, const char* sysname) :m_options(options), m_type(0) //,m_system_name(sysname) { m_sockets.clear(); } -rpk::~rpk() +ti99_cartridge_device::rpk::~rpk() { if (TRACE_RPK) printf("gromport/RPK: Destroy RPK\n"); } @@ -2533,7 +2665,7 @@ rpk::~rpk() /* Deliver the contents of the socket by name of the socket. */ -uint8_t* rpk::get_contents_of_socket(const char *socket_name) +uint8_t* ti99_cartridge_device::rpk::get_contents_of_socket(const char *socket_name) { auto socket = m_sockets.find(socket_name); if (socket == m_sockets.end()) return nullptr; @@ -2543,14 +2675,14 @@ uint8_t* rpk::get_contents_of_socket(const char *socket_name) /* Deliver the length of the contents of the socket by name of the socket. */ -int rpk::get_resource_length(const char *socket_name) +int ti99_cartridge_device::rpk::get_resource_length(const char *socket_name) { auto socket = m_sockets.find(socket_name); if (socket == m_sockets.end()) return 0; return socket->second->get_content_length(); } -void rpk::add_socket(const char* id, std::unique_ptr<rpk_socket> newsock) +void ti99_cartridge_device::rpk::add_socket(const char* id, std::unique_ptr<rpk_socket> newsock) { m_sockets.emplace(id, std::move(newsock)); } @@ -2560,7 +2692,7 @@ void rpk::add_socket(const char* id, std::unique_ptr<rpk_socket> newsock) Saves the contents of the NVRAMs and frees all memory. -------------------------------------------------*/ -void rpk::close() +void ti99_cartridge_device::rpk::close() { // Save the NVRAM contents for(auto &socket : m_sockets) @@ -2585,20 +2717,20 @@ void rpk::close() not a network socket) ***************************************************************/ -rpk_socket::rpk_socket(const char* id, int length, uint8_t* contents, const char *pathname) -: m_id(id), m_length(length), m_contents(contents), m_pathname(pathname) +ti99_cartridge_device::rpk_socket::rpk_socket(const char* id, int length, uint8_t* contents, const char *pathname) + : m_id(id), m_length(length), m_contents(contents), m_pathname(pathname) { } -rpk_socket::rpk_socket(const char* id, int length, uint8_t* contents) -: m_id(id), m_length(length), m_contents(contents), m_pathname(nullptr) +ti99_cartridge_device::rpk_socket::rpk_socket(const char* id, int length, uint8_t* contents) + : rpk_socket(id, length, contents, nullptr) { } /* Locate a file in the ZIP container */ -int rpk_reader::find_file(util::archive_file &zip, const char *filename, uint32_t crc) +int ti99_cartridge_device::rpk_reader::find_file(util::archive_file &zip, const char *filename, uint32_t crc) { for (int header = zip.first_file(); header >= 0; header = zip.next_file()) { @@ -2628,7 +2760,7 @@ int rpk_reader::find_file(util::archive_file &zip, const char *filename, uint32_ /* Load a rom resource and put it in a pcb socket instance. */ -std::unique_ptr<rpk_socket> rpk_reader::load_rom_resource(util::archive_file &zip, util::xml::data_node const* rom_resource_node, const char* socketname) +std::unique_ptr<ti99_cartridge_device::rpk_socket> ti99_cartridge_device::rpk_reader::load_rom_resource(util::archive_file &zip, util::xml::data_node const* rom_resource_node, const char* socketname) { const char* file; const char* crcstr; @@ -2693,7 +2825,7 @@ std::unique_ptr<rpk_socket> rpk_reader::load_rom_resource(util::archive_file &zi /* Load a ram resource and put it in a pcb socket instance. */ -std::unique_ptr<rpk_socket> rpk_reader::load_ram_resource(emu_options &options, util::xml::data_node const* ram_resource_node, const char* socketname, const char* system_name) +std::unique_ptr<ti99_cartridge_device::rpk_socket> ti99_cartridge_device::rpk_reader::load_ram_resource(emu_options &options, util::xml::data_node const* ram_resource_node, const char* socketname, const char* system_name) { const char* length_string; const char* ram_type; @@ -2780,7 +2912,7 @@ std::unique_ptr<rpk_socket> rpk_reader::load_ram_resource(emu_options &options, system_name - name of the driver (also just for NVRAM handling) -------------------------------------------------*/ -rpk* rpk_reader::open(emu_options &options, const char *filename, const char *system_name) +ti99_cartridge_device::rpk* ti99_cartridge_device::rpk_reader::open(emu_options &options, const char *filename, const char *system_name) { util::archive_file::error ziperr; |