summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/snes/bsx.h
blob: 24ce7b9f6914f3bff0b2641fdf16a494aba133c9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
// license:BSD-3-Clause
// copyright-holders:Fabio Priuli
#ifndef MAME_BUS_SNES_BSX_H
#define MAME_BUS_SNES_BSX_H

#pragma once

#include "snes_slot.h"
#include "rom.h"
#include "rom21.h"

// ======================> sns_rom_bsx_device

class sns_rom_bsx_device : public sns_rom_device
{
public:
	// construction/destruction
	sns_rom_bsx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	// additional reading and writing
	virtual DECLARE_READ8_MEMBER(read_l) override;
	virtual DECLARE_READ8_MEMBER(read_h) override;
	virtual DECLARE_WRITE8_MEMBER(write_l) override;
	virtual DECLARE_WRITE8_MEMBER(write_h) override;
	virtual DECLARE_READ8_MEMBER(chip_read) override;
	virtual DECLARE_WRITE8_MEMBER(chip_write) override;

protected:
	class bsx_base
	{
	public:
		bsx_base(running_machine &machine);
		running_machine &machine() const { return m_machine; }

		void init();
		uint8_t read(uint32_t offset);
		void write(uint32_t offset, uint8_t data);

	private:
		// regs
		uint8_t regs[0x18];       // 0x2188-0x219f

		// counter + clock
		uint8_t r2192_counter;
		uint8_t r2192_hour, r2192_minute, r2192_second;

		running_machine& m_machine;
	};

	sns_rom_bsx_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;
	virtual void device_reset() override;

	virtual void device_add_mconfig(machine_config &config) override;

	void access_update();

	// base regs
	std::unique_ptr<bsx_base> m_base_unit;

	// cart regs
	uint8_t m_cart_regs[16];
	uint8_t access_00_1f; // 1 = CART, 0 = NOTHING
	uint8_t access_80_9f; // 1 = CART, 0 = NOTHING
	uint8_t access_40_4f; // 1 = NOTHING, 0 = PRAM
	uint8_t access_50_5f; // 1 = NOTHING, 0 = PRAM
	uint8_t access_60_6f; // 1 = PRAM, 0 = NOTHING
	uint8_t rom_access;   // 2 = HiROM, 1 = LoROM, 0 = PRAM

	uint8_t m_pram[0x80000];

private:
	required_device<sns_bsx_cart_slot_device> m_slot;
};

// ======================> sns_rom_bsxlo_device

class sns_rom_bsxlo_device : public sns_rom_device
{
public:
	// construction/destruction
	sns_rom_bsxlo_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	// additional reading and writing
	virtual DECLARE_READ8_MEMBER(read_l) override;
	virtual DECLARE_READ8_MEMBER(read_h) override;

protected:
	// device-level overrides
	virtual void device_start() override;

	virtual void device_add_mconfig(machine_config &config) override;

private:
	required_device<sns_bsx_cart_slot_device> m_slot;
};

// ======================> sns_rom_bsxhi_device

class sns_rom_bsxhi_device : public sns_rom21_device
{
public:
	// construction/destruction
	sns_rom_bsxhi_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	// additional reading and writing
	virtual DECLARE_READ8_MEMBER(read_l) override;
	virtual DECLARE_READ8_MEMBER(read_h) override;

protected:
	// device-level overrides
	virtual void device_start() override;

	virtual void device_add_mconfig(machine_config &config) override;

private:
	required_device<sns_bsx_cart_slot_device> m_slot;
};


// ======================> sns_rom_bsmempak_device

class sns_rom_bsmempak_device : public sns_rom_device
{
public:
	// construction/destruction
	sns_rom_bsmempak_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	// additional reading and writing
	virtual DECLARE_READ8_MEMBER(read_l) override;
	virtual DECLARE_READ8_MEMBER(read_h) override;
	virtual DECLARE_WRITE8_MEMBER(write_l) override;
//  virtual DECLARE_WRITE8_MEMBER(write_h);
//  virtual DECLARE_READ8_MEMBER(chip_read);
//  virtual DECLARE_WRITE8_MEMBER(chip_write);

protected:
	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;

	// flash regs
	uint32_t m_command;
	uint8_t m_write_old;
	uint8_t m_write_new;

	int m_flash_enable;
	int m_read_enable;
	int m_write_enable;
};


// device type definition
DECLARE_DEVICE_TYPE(SNS_ROM_BSX,   sns_rom_bsx_device)
DECLARE_DEVICE_TYPE(SNS_LOROM_BSX, sns_rom_bsxlo_device)
DECLARE_DEVICE_TYPE(SNS_HIROM_BSX, sns_rom_bsxhi_device)
DECLARE_DEVICE_TYPE(SNS_BSMEMPAK,  sns_rom_bsmempak_device)

#endif // MAME_BUS_SNES_BSX_H