// license:BSD-3-Clause
// copyright-holders:Fabio Priuli
#ifndef MAME_BUS_MEGADRIVE_ROM_H
#define MAME_BUS_MEGADRIVE_ROM_H
#pragma once
#include "md_slot.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> md_std_rom_device
class md_std_rom_device : public device_t,
public device_md_cart_interface
{
public:
// construction/destruction
md_std_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override { if (offset < 0x400000/2) return m_rom[MD_ADDR(offset)]; else return 0xffff; }
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override { }
protected:
md_std_rom_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
virtual void device_start() override { }
};
// ======================> md_rom_sram_device
class md_rom_sram_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_sram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
md_rom_sram_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
public:
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
virtual void write_a13(offs_t offset, uint16_t data) override;
};
// ======================> md_rom_sram_arg96_device
class md_rom_sram_arg96_device : public md_rom_sram_device
{
public:
md_rom_sram_arg96_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
};
// ======================> md_rom_fram_device
class md_rom_fram_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_fram_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
virtual uint16_t read_a13(offs_t offset) override;
virtual void write_a13(offs_t offset, uint16_t data) override;
};
// ======================> md_rom_ssf2_device
class md_rom_ssf2_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_ssf2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write_a13(offs_t offset, uint16_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
uint8_t m_bank[16];
int m_lastoff, m_lastdata;
};
// ======================> md_rom_cm2in1_device
class md_rom_cm2in1_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_cm2in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
int m_base;
};
// ======================> md_rom_mcpirate_device
class md_rom_mcpirate_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_mcpirate_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write_a13(offs_t offset, uint16_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
uint8_t m_bank;
};
// ======================> md_rom_bugslife_device
class md_rom_bugslife_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_bugslife_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read_a13(offs_t offset) override;
};
// ======================> md_rom_chinf3_device
class md_rom_chinf3_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_chinf3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
int m_bank;
};
// ======================> md_rom_16mj2_device
class md_rom_16mj2_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_16mj2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
};
// ======================> md_rom_elfwor_device
class md_rom_elfwor_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_elfwor_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
};
// ======================> md_rom_yasech_device
class md_rom_yasech_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_yasech_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
};
// ======================> md_rom_kof98_device
class md_rom_kof98_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_kof98_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
};
// ======================> md_rom_kof99_device
class md_rom_kof99_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_kof99_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read_a13(offs_t offset) override;
};
// ======================> md_rom_lion2_device
class md_rom_lion2_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_lion2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
uint16_t m_prot1_data, m_prot2_data;
};
// ======================> md_rom_lion3_device
class md_rom_lion3_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_lion3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
uint8_t m_reg[3];
uint16_t m_bank;
};
// ======================> md_rom_mjlov_device
class md_rom_mjlov_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_mjlov_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
};
// ======================> md_rom_cjmjclub_device
class md_rom_cjmjclub_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_cjmjclub_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
};
// ======================> md_rom_pokea_device
class md_rom_pokea_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_pokea_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read_a13(offs_t offset) override;
};
// ======================> md_rom_pokestad_device
class md_rom_pokestad_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_pokestad_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
uint8_t m_bank;
};
// ======================> md_rom_realtec_device
class md_rom_realtec_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_realtec_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
uint16_t m_bank_addr, m_bank_size, m_old_bank_addr;
};
// ======================> md_rom_redcl_device
class md_rom_redcl_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_redcl_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
};
// ======================> md_rom_rx3_device
class md_rom_rx3_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_rx3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read_a13(offs_t offset) override;
};
// ======================> md_rom_sbubl_device
class md_rom_sbubl_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_sbubl_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
};
// ======================> md_rom_smb_device
class md_rom_smb_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_smb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read_a13(offs_t offset) override;
};
// ======================> md_rom_smb2_device
class md_rom_smb2_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_smb2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read_a13(offs_t offset) override;
};
// ======================> md_rom_smw64_device
class md_rom_smw64_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_smw64_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
uint32_t m_latch0, m_latch1;
uint16_t m_reg[6];
uint16_t m_ctrl[3];
};
// ======================> md_rom_smouse_device
class md_rom_smouse_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_smouse_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
};
// ======================> md_rom_soulb_device
class md_rom_soulb_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_soulb_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
};
// ======================> md_rom_squir_device
class md_rom_squir_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_squir_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
uint16_t m_latch;
};
// ======================> md_rom_tc2000_device
class md_rom_tc2000_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_tc2000_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
uint16_t m_retvalue;
};
// ======================> md_rom_tekkensp_device
class md_rom_tekkensp_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_tekkensp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
uint16_t m_reg;
};
// ======================> md_rom_topf_device
class md_rom_topf_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_topf_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
uint16_t m_latch;
uint8_t m_bank[3];
};
// ======================> md_rom_radica_device
class md_rom_radica_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_radica_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual uint16_t read_a13(offs_t offset) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
uint8_t m_bank;
};
// ======================> md_rom_beggarp_device
class md_rom_beggarp_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_beggarp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
virtual void write_a13(offs_t offset, uint16_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
uint8_t m_mode, m_lock;
};
// ======================> md_rom_wukong_device
class md_rom_wukong_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_wukong_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
virtual void write_a13(offs_t offset, uint16_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
uint8_t m_mode;
};
// ======================> md_rom_starodys_device
class md_rom_starodys_device : public md_std_rom_device
{
public:
// construction/destruction
md_rom_starodys_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// reading and writing
virtual uint16_t read(offs_t offset) override;
virtual void write(offs_t offset, uint16_t data, uint16_t mem_mask = ~0) override;
virtual uint16_t read_a13(offs_t offset) override;
virtual void write_a13(offs_t offset, uint16_t data) override;
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
private:
uint8_t m_mode, m_lock, m_ram_enable, m_base;
};
// device type definition
DECLARE_DEVICE_TYPE(MD_STD_ROM, md_std_rom_device)
DECLARE_DEVICE_TYPE(MD_ROM_SRAM, md_rom_sram_device)
DECLARE_DEVICE_TYPE(MD_ROM_FRAM, md_rom_fram_device)
DECLARE_DEVICE_TYPE(MD_ROM_CM2IN1, md_rom_cm2in1_device)
DECLARE_DEVICE_TYPE(MD_ROM_SSF2, md_rom_ssf2_device)
DECLARE_DEVICE_TYPE(MD_ROM_BUGSLIFE, md_rom_bugslife_device)
DECLARE_DEVICE_TYPE(MD_ROM_SMOUSE, md_rom_smouse_device)
DECLARE_DEVICE_TYPE(MD_ROM_SMW64, md_rom_smw64_device)
DECLARE_DEVICE_TYPE(MD_ROM_SMB, md_rom_smb_device)
DECLARE_DEVICE_TYPE(MD_ROM_SMB2, md_rom_smb2_device)
DECLARE_DEVICE_TYPE(MD_ROM_SBUBL, md_rom_sbubl_device)
DECLARE_DEVICE_TYPE(MD_ROM_RX3, md_rom_rx3_device)
DECLARE_DEVICE_TYPE(MD_ROM_MJLOV, md_rom_mjlov_device)
DECLARE_DEVICE_TYPE(MD_ROM_CJMJCLUB, md_rom_cjmjclub_device)
DECLARE_DEVICE_TYPE(MD_ROM_KOF98, md_rom_kof98_device)
DECLARE_DEVICE_TYPE(MD_ROM_KOF99, md_rom_kof99_device)
DECLARE_DEVICE_TYPE(MD_ROM_SOULB, md_rom_soulb_device)
DECLARE_DEVICE_TYPE(MD_ROM_CHINF3, md_rom_chinf3_device)
DECLARE_DEVICE_TYPE(MD_ROM_16MJ2, md_rom_16mj2_device)
DECLARE_DEVICE_TYPE(MD_ROM_ELFWOR, md_rom_elfwor_device)
DECLARE_DEVICE_TYPE(MD_ROM_YASECH, md_rom_yasech_device)
DECLARE_DEVICE_TYPE(MD_ROM_LION2, md_rom_lion2_device)
DECLARE_DEVICE_TYPE(MD_ROM_LION3, md_rom_lion3_device)
DECLARE_DEVICE_TYPE(MD_ROM_MCPIR, md_rom_mcpirate_device)
DECLARE_DEVICE_TYPE(MD_ROM_POKEA, md_rom_pokea_device)
DECLARE_DEVICE_TYPE(MD_ROM_POKESTAD, md_rom_pokestad_device)
DECLARE_DEVICE_TYPE(MD_ROM_REALTEC, md_rom_realtec_device)
DECLARE_DEVICE_TYPE(MD_ROM_REDCL, md_rom_redcl_device)
DECLARE_DEVICE_TYPE(MD_ROM_SQUIR, md_rom_squir_device)
DECLARE_DEVICE_TYPE(MD_ROM_SRAM_ARG96, md_rom_sram_arg96_device)
DECLARE_DEVICE_TYPE(MD_ROM_TC2000, md_rom_tc2000_device)
DECLARE_DEVICE_TYPE(MD_ROM_TEKKENSP, md_rom_tekkensp_device)
DECLARE_DEVICE_TYPE(MD_ROM_TOPF, md_rom_topf_device)
DECLARE_DEVICE_TYPE(MD_ROM_RADICA, md_rom_radica_device)
DECLARE_DEVICE_TYPE(MD_ROM_BEGGARP, md_rom_beggarp_device)
DECLARE_DEVICE_TYPE(MD_ROM_WUKONG, md_rom_wukong_device)
DECLARE_DEVICE_TYPE(MD_ROM_STARODYS, md_rom_starodys_device)
#endif // MAME_BUS_MEGADRIVE_ROM_H