2
2
// copyright-holders:Mark Garlanger
3
3
/* **************************************************************************
4
4
5
- Magnolia Microsystems 77316 soft-sectored floppy controller
5
+ Magnolia Microsystems 77316 DD soft-sectored floppy controller
6
6
7
+ Supported upto 8 floppy drives
8
+ - 4 8" drives
9
+ - 4 5.25" drives
7
10
8
11
****************************************************************************/
9
12
17
20
#define LOG_FUNC (1U << 4 ) // Function calls
18
21
#define LOG_ERR (1U << 5 ) // log errors
19
22
#define LOG_BURST (1U << 6 ) // burst mode
23
+ #define LOG_DATA (1U << 7 ) // data read/writes
20
24
21
25
#define VERBOSE (0 )
22
26
28
32
#define LOGFUNC (...) LOGMASKED(LOG_FUNC, __VA_ARGS__)
29
33
#define LOGERR (...) LOGMASKED(LOG_ERR, __VA_ARGS__)
30
34
#define LOGBURST (...) LOGMASKED(LOG_BURST, __VA_ARGS__)
35
+ #define LOGDATA (...) LOGMASKED(LOG_DATA, __VA_ARGS__)
31
36
32
37
#ifdef _MSC_VER
33
38
#define FUNCNAME __func__
@@ -49,6 +54,8 @@ mms77316_fdc_device::mms77316_fdc_device(const machine_config &mconfig, const ch
49
54
50
55
void mms77316_fdc_device::ctrl_w (u8 val)
51
56
{
57
+ LOGREG (" %s: val: %d\n " , FUNCNAME, val);
58
+
52
59
u8 floppy_drive = BIT (val, 0 , 3 );
53
60
u8 five_in_drv = bool (BIT (val, ctrl_525DriveSel_c));
54
61
@@ -58,6 +65,8 @@ void mms77316_fdc_device::ctrl_w(u8 val)
58
65
59
66
m_fdc->dden_w (BIT (val, ctrl_SetMFMRecording_c));
60
67
68
+ LOGLINES (" %s: intrq allowed: %d, drq allowed: %d\n " , FUNCNAME, m_irq_allowed, m_drq_allowed);
69
+
61
70
if (m_irq_allowed)
62
71
{
63
72
m_irq_cb (m_irq);
@@ -69,12 +78,10 @@ void mms77316_fdc_device::ctrl_w(u8 val)
69
78
m_drq_cb (CLEAR_LINE);
70
79
}
71
80
72
- LOGREG (" %s: floppydrive: %d\n " , FUNCNAME, floppy_drive);
81
+ LOGDRIVE (" %s: floppydrive: %d, 5.25 in: %d \n " , FUNCNAME, floppy_drive, five_in_drv );
73
82
74
83
m_fdc->set_floppy (m_floppies[floppy_drive]->get_device ());
75
84
76
- LOGREG (" %s: intrq allowed: %d, drq allowed: %d\n " , FUNCNAME, m_irq_allowed, m_drq_allowed);
77
-
78
85
m_fdc->set_clock (five_in_drv ? FIVE_IN_CLOCK : EIGHT_IN_CLOCK);
79
86
80
87
for (int i = 4 ; i < 8 ; i++)
@@ -94,11 +101,13 @@ void mms77316_fdc_device::ctrl_w(u8 val)
94
101
95
102
void mms77316_fdc_device::data_w (u8 val)
96
103
{
104
+ LOGDATA (" %s: val: %d\n " , FUNCNAME, val);
105
+
97
106
if (burst_mode_r () && !m_drq && !m_irq)
98
107
{
99
108
LOGBURST (" %s: burst_mode_r\n " , FUNCNAME);
100
- m_wait_cb (ASSERT_LINE);
101
109
110
+ m_wait_cb (ASSERT_LINE);
102
111
return ;
103
112
}
104
113
@@ -107,7 +116,7 @@ void mms77316_fdc_device::data_w(u8 val)
107
116
108
117
void mms77316_fdc_device::write (offs_t reg, u8 val)
109
118
{
110
- LOGFUNC (" %s: reg: %d val: 0x%02x\n " , FUNCNAME, reg, val);
119
+ LOGREG (" %s: reg: %d val: 0x%02x\n " , FUNCNAME, reg, val);
111
120
112
121
switch (reg)
113
122
{
@@ -117,7 +126,7 @@ void mms77316_fdc_device::write(offs_t reg, u8 val)
117
126
case 1 :
118
127
case 2 :
119
128
case 3 :
120
- LOGFUNC (" %s: Unexpected port write reg: %d val: 0x%02x\n " , FUNCNAME, reg, val);
129
+ LOGERR (" %s: Unexpected port write reg: %d val: 0x%02x\n " , FUNCNAME, reg, val);
121
130
break ;
122
131
case 4 :
123
132
m_fdc->cmd_w (val);
@@ -136,15 +145,22 @@ void mms77316_fdc_device::write(offs_t reg, u8 val)
136
145
137
146
u8 mms77316_fdc_device::data_r ()
138
147
{
148
+ u8 data = 0 ;
149
+
139
150
if (burst_mode_r () && !m_drq && !m_irq)
140
151
{
141
152
LOGBURST (" %s: burst_mode setting wait state\n " , FUNCNAME);
142
- m_wait_cb (ASSERT_LINE);
143
153
144
- return ( 0x00 );
154
+ m_wait_cb (ASSERT_LINE );
145
155
}
156
+ else
157
+ {
158
+ data = m_fdc->data_r ();
159
+ }
160
+
161
+ LOGDATA (" %s: data: %d\n " , FUNCNAME, data);
146
162
147
- return m_fdc-> data_r () ;
163
+ return data ;
148
164
}
149
165
150
166
u8 mms77316_fdc_device::read (offs_t reg)
@@ -175,7 +191,7 @@ u8 mms77316_fdc_device::read(offs_t reg)
175
191
break ;
176
192
}
177
193
178
- LOGFUNC (" %s: reg: %d val: 0x%02x\n " , FUNCNAME, reg, value);
194
+ LOGREG (" %s: reg: %d val: 0x%02x\n " , FUNCNAME, reg, value);
179
195
180
196
return value;
181
197
}
@@ -196,9 +212,10 @@ void mms77316_fdc_device::device_reset()
196
212
m_irq = false ;
197
213
m_drq_count = 0 ;
198
214
199
- m_irq_cb (0 );
200
- m_drq_cb (0 );
201
- m_wait_cb (0 );
215
+ m_irq_cb (CLEAR_LINE);
216
+ m_drq_cb (CLEAR_LINE);
217
+ m_wait_cb (CLEAR_LINE);
218
+
202
219
for (int i = 0 ; i < 4 ; i++)
203
220
{
204
221
auto elem = m_floppies[i];
@@ -217,25 +234,25 @@ void mms77316_fdc_device::device_reset()
217
234
static void mms_5_in_floppies (device_slot_interface &device)
218
235
{
219
236
// H-17-1 -- SS 48tpi
220
- device.option_add (" 5_ssdd " , FLOPPY_525_SSDD);
237
+ device.option_add (" 5_ss_dd " , FLOPPY_525_SSDD);
221
238
// SS 96tpi
222
- device.option_add (" 5_ssqd " , FLOPPY_525_SSQD);
239
+ device.option_add (" 5_ss_qd " , FLOPPY_525_SSQD);
223
240
// DS 48tpi
224
- device.option_add (" 5_dd " , FLOPPY_525_DD);
241
+ device.option_add (" 5_ds_dd " , FLOPPY_525_DD);
225
242
// H-17-4 / H-17-5 -- DS 96tpi
226
- device.option_add (" 5_qd " , FLOPPY_525_QD);
243
+ device.option_add (" 5_ds_qd " , FLOPPY_525_QD);
227
244
}
228
245
229
246
static void mms_8_in_floppies (device_slot_interface &device)
230
247
{
231
248
// 8" DSDD
232
- device.option_add (" 8_sssd " , FLOPPY_8_SSSD);
249
+ device.option_add (" 8_ss_sd " , FLOPPY_8_SSSD);
233
250
// 8" SSDD
234
- device.option_add (" 8_dssd " , FLOPPY_8_DSSD);
251
+ device.option_add (" 8_ds_sd " , FLOPPY_8_DSSD);
235
252
// 8" DSDD
236
- device.option_add (" 8_ssdd " , FLOPPY_8_SSDD);
253
+ device.option_add (" 8_ss_dd " , FLOPPY_8_SSDD);
237
254
// 8" SSDD
238
- device.option_add (" 8_dsdd " , FLOPPY_8_DSDD);
255
+ device.option_add (" 8_ds_dd " , FLOPPY_8_DSDD);
239
256
}
240
257
241
258
void mms77316_fdc_device::device_add_mconfig (machine_config &config)
@@ -245,38 +262,38 @@ void mms77316_fdc_device::device_add_mconfig(machine_config &config)
245
262
m_fdc->drq_wr_callback ().set (FUNC (mms77316_fdc_device::set_drq));
246
263
247
264
// 8" Floppy drives
248
- FLOPPY_CONNECTOR (config, m_floppies[0 ], mms_8_in_floppies, " 8_dsdd " , floppy_image_device::default_mfm_floppy_formats);
265
+ FLOPPY_CONNECTOR (config, m_floppies[0 ], mms_8_in_floppies, " 8_ds_dd " , floppy_image_device::default_mfm_floppy_formats);
249
266
m_floppies[0 ]->enable_sound (true );
250
- FLOPPY_CONNECTOR (config, m_floppies[1 ], mms_8_in_floppies, " 8_dsdd " , floppy_image_device::default_mfm_floppy_formats);
267
+ FLOPPY_CONNECTOR (config, m_floppies[1 ], mms_8_in_floppies, " 8_ds_dd " , floppy_image_device::default_mfm_floppy_formats);
251
268
m_floppies[1 ]->enable_sound (true );
252
- FLOPPY_CONNECTOR (config, m_floppies[2 ], mms_8_in_floppies, " 8_dsdd " , floppy_image_device::default_mfm_floppy_formats);
269
+ FLOPPY_CONNECTOR (config, m_floppies[2 ], mms_8_in_floppies, " 8_ds_dd " , floppy_image_device::default_mfm_floppy_formats);
253
270
m_floppies[2 ]->enable_sound (true );
254
- FLOPPY_CONNECTOR (config, m_floppies[3 ], mms_8_in_floppies, " 8_dsdd " , floppy_image_device::default_mfm_floppy_formats);
271
+ FLOPPY_CONNECTOR (config, m_floppies[3 ], mms_8_in_floppies, " 8_ds_dd " , floppy_image_device::default_mfm_floppy_formats);
255
272
m_floppies[3 ]->enable_sound (true );
256
273
257
274
// 5" Floppy drives
258
- FLOPPY_CONNECTOR (config, m_floppies[4 ], mms_5_in_floppies, " 5_qd " , floppy_image_device::default_mfm_floppy_formats);
275
+ FLOPPY_CONNECTOR (config, m_floppies[4 ], mms_5_in_floppies, " 5_ds_qd " , floppy_image_device::default_mfm_floppy_formats);
259
276
m_floppies[4 ]->enable_sound (true );
260
- FLOPPY_CONNECTOR (config, m_floppies[5 ], mms_5_in_floppies, " 5_qd " , floppy_image_device::default_mfm_floppy_formats);
277
+ FLOPPY_CONNECTOR (config, m_floppies[5 ], mms_5_in_floppies, " 5_ds_qd " , floppy_image_device::default_mfm_floppy_formats);
261
278
m_floppies[5 ]->enable_sound (true );
262
- FLOPPY_CONNECTOR (config, m_floppies[6 ], mms_5_in_floppies, " 5_qd " , floppy_image_device::default_mfm_floppy_formats);
279
+ FLOPPY_CONNECTOR (config, m_floppies[6 ], mms_5_in_floppies, " 5_ds_qd " , floppy_image_device::default_mfm_floppy_formats);
263
280
m_floppies[6 ]->enable_sound (true );
264
- FLOPPY_CONNECTOR (config, m_floppies[7 ], mms_5_in_floppies, " 5_qd " , floppy_image_device::default_mfm_floppy_formats);
281
+ FLOPPY_CONNECTOR (config, m_floppies[7 ], mms_5_in_floppies, " 5_ds_qd " , floppy_image_device::default_mfm_floppy_formats);
265
282
m_floppies[7 ]->enable_sound (true );
266
283
}
267
284
268
285
void mms77316_fdc_device::set_irq (int state)
269
286
{
270
287
LOGLINES (" set irq, allowed: %d state: %d\n " , m_irq_allowed, state);
271
288
272
- if (state)
289
+ m_irq = state;
290
+
291
+ if (m_irq)
273
292
{
274
293
m_wait_cb (CLEAR_LINE);
275
294
m_drq_count = 0 ;
276
295
}
277
296
278
- m_irq = state;
279
-
280
297
m_irq_cb (m_irq_allowed ? m_irq : CLEAR_LINE);
281
298
}
282
299
@@ -289,6 +306,7 @@ void mms77316_fdc_device::set_drq(int state)
289
306
if (burst_mode_r ())
290
307
{
291
308
LOGBURST (" %s: in burst mode drq: %d, m_drq_count: %d\n " , FUNCNAME, m_drq, m_drq_count);
309
+
292
310
if (m_drq)
293
311
{
294
312
m_wait_cb (CLEAR_LINE);
0 commit comments