10
10
11
11
**********************************************************************/
12
12
13
-
14
13
#include " emu.h"
15
14
#include " ramdisc.h"
16
15
16
+ #include " machine/nvram.h"
17
17
18
- // **************************************************************************
19
- // DEVICE DEFINITIONS
20
- // **************************************************************************
21
18
22
- DEFINE_DEVICE_TYPE (BBC_RAMDISC, bbc_ramdisc_device, " bbc_ramdisc" , " Morley Electronics RAM Disc" );
19
+ namespace {
20
+
21
+ class bbc_ramdisc_device : public device_t , public device_bbc_1mhzbus_interface
22
+ {
23
+ public:
24
+ bbc_ramdisc_device (const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
25
+ : device_t (mconfig, BBC_RAMDISC, tag, owner, clock)
26
+ , device_bbc_1mhzbus_interface(mconfig, *this )
27
+ , m_1mhzbus(*this , " 1mhzbus" )
28
+ , m_nvram(*this , " nvram" )
29
+ , m_ram_size(*this , " SIZE" )
30
+ , m_power(*this , " POWER" )
31
+ , m_sector(0 )
32
+ {
33
+ }
34
+
35
+ DECLARE_INPUT_CHANGED_MEMBER (power_changed);
36
+
37
+ protected:
38
+ // device_t overrides
39
+ virtual void device_start () override ATTR_COLD;
40
+
41
+ // optional information overrides
42
+ virtual void device_add_mconfig (machine_config &config) override ATTR_COLD;
43
+ virtual ioport_constructor device_input_ports () const override ATTR_COLD;
44
+ virtual const tiny_rom_entry *device_rom_region () const override ATTR_COLD;
45
+
46
+ virtual uint8_t fred_r (offs_t offset) override ;
47
+ virtual void fred_w (offs_t offset, uint8_t data) override ;
48
+ virtual uint8_t jim_r (offs_t offset) override ;
49
+ virtual void jim_w (offs_t offset, uint8_t data) override ;
50
+
51
+ private:
52
+ required_device<bbc_1mhzbus_slot_device> m_1mhzbus;
53
+ required_device<nvram_device> m_nvram;
54
+ required_ioport m_ram_size;
55
+ required_ioport m_power;
56
+
57
+ std::unique_ptr<uint8_t []> m_ram;
58
+ uint16_t m_sector;
59
+ };
23
60
24
61
25
62
// -------------------------------------------------
26
- // INPUT_PORTS( ramdisc )
63
+ // input_ports - device-specific input ports
27
64
// -------------------------------------------------
28
65
29
66
static INPUT_PORTS_START (ramdisc)
@@ -37,77 +74,54 @@ static INPUT_PORTS_START(ramdisc)
37
74
PORT_CONFSETTING(0x02 , " 2MB" )
38
75
INPUT_PORTS_END
39
76
40
- // -------------------------------------------------
41
- // input_ports - device-specific input ports
42
- // -------------------------------------------------
43
-
44
77
ioport_constructor bbc_ramdisc_device::device_input_ports() const
45
78
{
46
79
return INPUT_PORTS_NAME (ramdisc);
47
80
}
48
81
82
+
49
83
// -------------------------------------------------
50
- // ROM( ramdisc )
84
+ // rom_region - device-specific ROM region
51
85
// -------------------------------------------------
52
86
53
87
ROM_START (ramdisc)
54
88
ROM_REGION (0x4000 , " exp_rom" , 0 )
55
89
ROM_LOAD (" ramdisc101.rom" , 0x0000 , 0x4000 , CRC(627568c2) SHA1(17e727998756fe35ff451fd2ce1d4b5977be24fc))
56
90
ROM_END
57
91
92
+ const tiny_rom_entry *bbc_ramdisc_device::device_rom_region () const
93
+ {
94
+ return ROM_NAME (ramdisc);
95
+ }
96
+
97
+
58
98
// -------------------------------------------------
59
99
// device_add_mconfig - add device configuration
60
100
// -------------------------------------------------
61
101
62
102
void bbc_ramdisc_device::device_add_mconfig (machine_config &config)
63
103
{
64
- /* ram disk */
104
+ // ram disk
65
105
NVRAM (config, " nvram" , nvram_device::DEFAULT_NONE);
66
106
67
107
BBC_1MHZBUS_SLOT (config, m_1mhzbus, DERIVED_CLOCK (1 , 1 ), bbc_1mhzbus_devices, nullptr );
68
108
m_1mhzbus->irq_handler ().set (DEVICE_SELF_OWNER, FUNC (bbc_1mhzbus_slot_device::irq_w));
69
109
m_1mhzbus->nmi_handler ().set (DEVICE_SELF_OWNER, FUNC (bbc_1mhzbus_slot_device::nmi_w));
110
+ // m_1mhzbus->add_route(ALL_OUTPUTS, DEVICE_SELF_OWNER, 1.0);
70
111
}
71
112
72
- // -------------------------------------------------
73
- // rom_region - device-specific ROM region
74
- // -------------------------------------------------
75
-
76
- const tiny_rom_entry *bbc_ramdisc_device::device_rom_region () const
77
- {
78
- return ROM_NAME (ramdisc);
79
- }
80
-
81
- // **************************************************************************
82
- // LIVE DEVICE
83
- // **************************************************************************
84
-
85
- // -------------------------------------------------
86
- // bbc_ramdisc_device - constructor
87
- // -------------------------------------------------
88
-
89
- bbc_ramdisc_device::bbc_ramdisc_device (const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
90
- : device_t(mconfig, BBC_RAMDISC, tag, owner, clock)
91
- , device_bbc_1mhzbus_interface(mconfig, *this )
92
- , m_1mhzbus(*this , " 1mhzbus" )
93
- , m_nvram(*this , " nvram" )
94
- , m_ram_size(*this , " SIZE" )
95
- , m_power(*this , " POWER" )
96
- , m_sector(0 )
97
- {
98
- }
99
113
100
114
// -------------------------------------------------
101
115
// device_start - device-specific startup
102
116
// -------------------------------------------------
103
117
104
118
void bbc_ramdisc_device::device_start ()
105
119
{
106
- /* define 2mb ram */
120
+ // define 2mb ram
107
121
m_ram = std::make_unique<uint8_t []>(0x200000 );
108
122
m_nvram->set_base (m_ram.get (), 0x200000 );
109
123
110
- /* register for save states */
124
+ // register for save states
111
125
save_pointer (NAME (m_ram), 0x200000 );
112
126
save_item (NAME (m_sector));
113
127
}
@@ -119,7 +133,7 @@ void bbc_ramdisc_device::device_start()
119
133
120
134
INPUT_CHANGED_MEMBER (bbc_ramdisc_device::power_changed)
121
135
{
122
- /* clear RAM on power off */
136
+ // clear RAM on power off
123
137
if (!newval)
124
138
{
125
139
memset (m_ram.get (), 0xff , 0x200000 );
@@ -135,17 +149,17 @@ uint8_t bbc_ramdisc_device::fred_r(offs_t offset)
135
149
switch (offset)
136
150
{
137
151
case 0xc0 :
138
- /* sector LSB */
152
+ // sector LSB
139
153
data = m_sector & 0x00ff ;
140
154
break ;
141
155
case 0xc2 :
142
- /* sector MSB */
156
+ // sector MSB
143
157
data = (m_sector & 0xff00 ) >> 8 ;
144
158
break ;
145
159
case 0xc1 :
146
160
case 0xc3 :
147
- /* TODO: unknown purpose, must return 0x3f or 0x5f */
148
- data = 0x3f ;
161
+ // TODO: unknown purpose, must return 0x3f or 0x5f
162
+ data = 0x1f | (m_ram_size-> read () << 5 ) ;
149
163
logerror (" Read %04x -> %02x\n " , offset | 0xfcc0 , data);
150
164
break ;
151
165
}
@@ -163,16 +177,16 @@ void bbc_ramdisc_device::fred_w(offs_t offset, uint8_t data)
163
177
switch (offset)
164
178
{
165
179
case 0xc0 :
166
- /* sector LSB */
180
+ // sector LSB
167
181
m_sector = (m_sector & 0xff00 ) | data;
168
182
break ;
169
183
case 0xc2 :
170
- /* sector MSB */
184
+ // sector MSB
171
185
m_sector = (m_sector & 0x00ff ) | (data << 8 );
172
186
break ;
173
187
case 0xc1 :
174
188
case 0xc3 :
175
- /* TODO: unknown purpose, always writes 0x00 or 0xff */
189
+ // TODO: unknown purpose, always writes 0x00 or 0xff
176
190
logerror (" Write %04x <- %02x\n " , offset | 0xfcc0 , data);
177
191
break ;
178
192
}
@@ -185,8 +199,8 @@ uint8_t bbc_ramdisc_device::jim_r(offs_t offset)
185
199
{
186
200
uint8_t data = 0xff ;
187
201
188
- /* power on and sector < 2mb */
189
- if (m_power->read () && m_sector < (m_ram_size->read () << 8 ))
202
+ // power on and sector < 2mb
203
+ if (m_power->read () && m_sector < (m_ram_size->read () << 12 ))
190
204
{
191
205
data &= m_ram[(m_sector << 8 ) | offset];
192
206
}
@@ -198,11 +212,16 @@ uint8_t bbc_ramdisc_device::jim_r(offs_t offset)
198
212
199
213
void bbc_ramdisc_device::jim_w (offs_t offset, uint8_t data)
200
214
{
201
- /* power on and sector < 2mb */
202
- if (m_power->read () && m_sector < (m_ram_size->read () << 8 ))
215
+ // power on and sector < 2mb
216
+ if (m_power->read () && m_sector < (m_ram_size->read () << 12 ))
203
217
{
204
218
m_ram[(m_sector << 8 ) | offset] = data;
205
219
}
206
220
207
221
m_1mhzbus->jim_w (offset, data);
208
222
}
223
+
224
+ } // anonymous namespace
225
+
226
+
227
+ DEFINE_DEVICE_TYPE_PRIVATE (BBC_RAMDISC, device_bbc_1mhzbus_interface, bbc_ramdisc_device, " bbc_ramdisc" , " Morley Electronics RAM Disc" );
0 commit comments