diff options
Diffstat (limited to 'src/devices/bus/a800/a800_slot.h')
-rw-r--r-- | src/devices/bus/a800/a800_slot.h | 168 |
1 files changed, 109 insertions, 59 deletions
diff --git a/src/devices/bus/a800/a800_slot.h b/src/devices/bus/a800/a800_slot.h index e615058960e..476a54a4f4d 100644 --- a/src/devices/bus/a800/a800_slot.h +++ b/src/devices/bus/a800/a800_slot.h @@ -1,5 +1,5 @@ // license:BSD-3-Clause -// copyright-holders:Fabio Priuli +// copyright-holders:Fabio Priuli, Angelo Salese #ifndef MAME_BUS_A800_A800_SLOT_H #define MAME_BUS_A800_A800_SLOT_H @@ -13,6 +13,7 @@ ***************************************************************************/ /* PCB */ +// TODO: make this enum to actually follow up the .car specs, not the other way around enum { A800_8K = 0, @@ -23,18 +24,26 @@ enum A800_OSSM091, A800_OSS8K, A800_PHOENIX, + A800_BLIZZARD, A800_XEGS, A800_BBSB, A800_DIAMOND, A800_WILLIAMS, A800_EXPRESS, A800_SPARTADOS, - A800_BLIZZARD, - A800_TURBO64, - A800_TURBO128, + A800_SPARTADOS_128KB, + A800_TURBO, A800_TELELINK2, - A800_MICROCALC, + A800_ULTRACART, + A800_ADAWLIAH, + A800_ATRAX, A800_CORINA, + A800_CORINA_SRAM, + ATARIMAX_MAXFLASH_128KB, + ATARIMAX_MAXFLASH_1MB, + SIC_128KB, + SIC_256KB, + SIC_512KB, A5200_4K, A5200_8K, A5200_16K, @@ -43,8 +52,7 @@ enum A5200_BBSB }; - -// ======================> device_a800_cart_interface +class a800_cart_slot_device; class device_a800_cart_interface : public device_interface { @@ -52,41 +60,49 @@ public: // construction/destruction virtual ~device_a800_cart_interface(); - // memory accessor - virtual uint8_t read_80xx(offs_t offset) { return 0xff; } - virtual uint8_t read_d5xx(offs_t offset) { return 0xff; } - virtual void write_80xx(offs_t offset, uint8_t data) {} - virtual void write_d5xx(offs_t offset, uint8_t data) {} + virtual void cart_map(address_map &map); + virtual void cctl_map(address_map &map); + // TODO: remove all of this void rom_alloc(uint32_t size); - void ram_alloc(uint32_t size); - void nvram_alloc(uint32_t size); uint8_t* get_rom_base() { return m_rom; } - uint8_t* get_ram_base() { return &m_ram[0]; } - uint8_t* get_nvram_base() { return &m_nvram[0]; } uint32_t get_rom_size() { return m_rom_size; } - uint32_t get_ram_size() { return m_ram.size(); } - uint32_t get_nvram_size() { return m_nvram.size(); } + + /// + /// Carts can either init RD4/RD5 at startup or not, depending on if they have + /// reset circuitry or not. Future expansion of this getter will return a third value, + /// giving back the timing value where the initialization should happen. + /// + /// \return RD4, RD5 initial state + virtual std::tuple<int, int> get_initial_rd_state() { return std::make_tuple(0, 0); } protected: device_a800_cart_interface(const machine_config &mconfig, device_t &device); + virtual void interface_pre_start() override; + virtual void interface_post_start() override; + a800_cart_slot_device *m_slot; + // internal state uint8_t *m_rom; uint32_t m_rom_size; - std::vector<uint8_t> m_ram; - std::vector<uint8_t> m_nvram; // HiScore cart can save scores! // helpers int m_bank_mask; + + void rd4_w( int state ); + void rd5_w( int state ); + void rd_both_w ( int state ); }; // ======================> a800_cart_slot_device class a800_cart_slot_device : public device_t, + public device_memory_interface, public device_cartrom_image_interface, public device_single_card_slot_interface<device_a800_cart_interface> { + friend class device_a800_cart_interface; public: // construction/destruction template <typename T> @@ -101,46 +117,86 @@ public: a800_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0); virtual ~a800_cart_slot_device(); - // image-level overrides - virtual image_init_result call_load() override; - virtual void call_unload() override; - virtual bool is_reset_on_load() const noexcept override { return true; } virtual const char *image_interface() const noexcept override { return "a8bit_cart"; } virtual const char *file_extensions() const noexcept override { return "bin,rom,car"; } // slot interface overrides virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override; - - int get_cart_type() { return m_type; } int identify_cart_type(const uint8_t *header) const; + virtual std::pair<std::error_condition, std::string> call_load() override; + virtual void call_unload() override; + bool has_cart() { return m_cart != nullptr; } + auto rd4_callback() { return m_rd4_cb.bind(); } + auto rd5_callback() { return m_rd5_cb.bind(); } + void set_is_xegs(bool is_xegs) { m_is_xegs = is_xegs; } - // reading and writing - uint8_t read_80xx(offs_t offset); - uint8_t read_d5xx(offs_t offset); - void write_80xx(offs_t offset, uint8_t data); - void write_d5xx(offs_t offset, uint8_t data); + template <unsigned Bank> uint8_t read_cart(offs_t offset); + template <unsigned Bank> void write_cart(offs_t offset, uint8_t data); + uint8_t read_cctl(offs_t offset); + void write_cctl(offs_t offset, uint8_t data); + auto get_initial_rd_state() { return m_cart->get_initial_rd_state(); } protected: - a800_cart_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); + //a800_cart_slot_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); - // device-level overrides + // device_t implementation virtual void device_start() override; + virtual space_config_vector memory_space_config() const override; private: device_a800_cart_interface* m_cart; - int m_type; + + devcb_write_line m_rd4_cb; + devcb_write_line m_rd5_cb; + + address_space_config m_space_mem_config; + address_space_config m_space_io_config; + + address_space *m_space_mem; + address_space *m_space_io; + + int m_type = 0; + bool m_is_xegs = false; }; +class a5200_cart_slot_device; + +class device_a5200_cart_interface : public device_interface +{ +public: + // construction/destruction + virtual ~device_a5200_cart_interface(); + + virtual void cart_map(address_map &map); + + // TODO: remove all of this + void rom_alloc(uint32_t size); + uint8_t* get_rom_base() { return m_rom; } + uint32_t get_rom_size() { return m_rom_size; } -// The variants below are added to handle the additional formats for a5200, and to give more -// clear error messages if you try to load an A5200 game into an A800 or a XEGS, etc. +protected: + device_a5200_cart_interface(const machine_config &mconfig, device_t &device); -// ======================> a5200_cart_slot_device + virtual void interface_pre_start() override; + virtual void interface_post_start() override; + a5200_cart_slot_device *m_slot; -class a5200_cart_slot_device : public a800_cart_slot_device + // internal state + uint8_t *m_rom; + uint32_t m_rom_size; + // helpers + int m_bank_mask; +}; + + +class a5200_cart_slot_device : public device_t, + public device_memory_interface, + public device_cartrom_image_interface, + public device_single_card_slot_interface<device_a5200_cart_interface> { + friend class device_a5200_cart_interface; public: // construction/destruction template <typename T> @@ -155,39 +211,33 @@ public: a5200_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual ~a5200_cart_slot_device(); + virtual bool is_reset_on_load() const noexcept override { return true; } + virtual const char *image_interface() const noexcept override { return "a8bit_cart"; } virtual const char *file_extensions() const noexcept override { return "bin,rom,car,a52"; } // slot interface overrides virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override; -}; + int identify_cart_type(const uint8_t *header) const; + virtual std::pair<std::error_condition, std::string> call_load() override; + virtual void call_unload() override; -// ======================> xegs_cart_slot_device + u8 read_cart(offs_t offset); + void write_cart(offs_t offset, u8 data); -class xegs_cart_slot_device : public a800_cart_slot_device -{ -public: - // construction/destruction - template <typename T> - xegs_cart_slot_device(machine_config const &mconfig, char const *tag, device_t *owner, T &&opts, char const *dflt) - : xegs_cart_slot_device(mconfig, tag, owner, (uint32_t)0) - { - option_reset(); - opts(*this); - set_default_option(dflt); - set_fixed(false); - } - xegs_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); - virtual ~xegs_cart_slot_device(); +protected: + virtual void device_start() override; + virtual space_config_vector memory_space_config() const override; - virtual const char *file_extensions() const noexcept override { return "bin,rom,car"; } +private: + device_a5200_cart_interface* m_cart; + address_space_config m_space_mem_config; - // slot interface overrides - virtual std::string get_default_card_software(get_default_card_software_hook &hook) const override; + address_space *m_space_mem; + int m_type; }; // device type definition DECLARE_DEVICE_TYPE(A800_CART_SLOT, a800_cart_slot_device) DECLARE_DEVICE_TYPE(A5200_CART_SLOT, a5200_cart_slot_device) -DECLARE_DEVICE_TYPE(XEGS_CART_SLOT, xegs_cart_slot_device) #endif // MAME_BUS_A800_A800_SLOT_H |