2 NEC PC-9801 Emulator 'ePC-9801'
3 NEC PC-9801E/F/M Emulator 'ePC-9801E'
4 NEC PC-9801U Emulator 'ePC-9801U'
5 NEC PC-9801VF Emulator 'ePC-9801VF'
6 NEC PC-9801VM Emulator 'ePC-9801VM'
7 NEC PC-9801VX Emulator 'ePC-9801VX'
8 NEC PC-9801RA Emulator 'ePC-9801RA'
9 NEC PC-98XA Emulator 'ePC-98XA'
10 NEC PC-98XL Emulator 'ePC-98XL'
11 NEC PC-98RL Emulator 'ePC-98RL'
12 NEC PC-98DO Emulator 'ePC-98DO'
14 Author : Takeda.Toshiya
24 #include "../upd765a.h"
30 #if defined(SUPPORT_2HD_FDD_IF)
31 for(int i = 0; i < MAX_DRIVE; i++) {
32 d_fdc_2hd->set_drive_type(i, DRIVE_TYPE_2HD);
36 #if defined(SUPPORT_2DD_FDD_IF)
37 for(int i = 0; i < MAX_DRIVE; i++) {
38 d_fdc_2dd->set_drive_type(i, DRIVE_TYPE_2DD);
42 #if defined(SUPPORT_2HD_2DD_FDD_IF)
43 for(int i = 0; i < 4; i++) {
44 d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
52 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
55 #if defined(SUPPORT_2HD_FDD_IF)
57 d_fdc_2hd->write_io8(0, data);
60 d_fdc_2hd->write_io8(1, data);
64 if(!(ctrlreg_2hd & 0x80) && (data & 0x80)) {
67 d_fdc_2hd->write_signal(SIG_UPD765A_FREADY, data, 0x40);
71 #if defined(SUPPORT_2DD_FDD_IF)
73 d_fdc_2dd->write_io8(0, data);
76 d_fdc_2dd->write_io8(1, data);
80 if(!(ctrlreg_2dd & 0x80) && (data & 0x80)) {
85 cancel_event(this, timer_id);
87 register_event(this, EVENT_TIMER, 100000, false, &timer_id);
89 d_fdc_2dd->write_signal(SIG_UPD765A_MOTOR, data, 0x08);
93 #if defined(SUPPORT_2HD_2DD_FDD_IF)
95 #if !defined(SUPPORT_HIRESO)
97 if(((addr >> 4) & 1) == (modereg & 1))
100 d_fdc->write_io8(0, data);
104 #if !defined(SUPPORT_HIRESO)
106 if(((addr >> 4) & 1) == (modereg & 1))
109 d_fdc->write_io8(1, data);
114 #if !defined(SUPPORT_HIRESO)
117 if(((addr >> 4) & 1) == (modereg & 1))
120 if(!(ctrlreg & 0x80) && (data & 0x80)) {
123 #if !defined(SUPPORT_HIRESO)
124 if(!(addr == 0xcc && !(data & 0x20)))
127 d_fdc->write_signal(SIG_UPD765A_FREADY, data, 0x40);
129 #if defined(SUPPORT_HIRESO)
130 if((ctrlreg & 0x20) && !(data & 0x20)) {
131 d_fdc->set_drive_type(0, DRIVE_TYPE_2HD);
132 d_fdc->set_drive_type(1, DRIVE_TYPE_2HD);
133 } else if(!(ctrlreg & 0x20) && (data & 0x20)) {
134 d_fdc->set_drive_type(0, DRIVE_TYPE_2DD);
135 d_fdc->set_drive_type(1, DRIVE_TYPE_2DD);
138 //#if !defined(_PC98XA) && !defined(_PC98XL)
139 // if(modereg & 0x04) {
140 // d_fdc->write_signal(SIG_UPD765A_MOTOR, data, 0x08);
144 cancel_event(this, timer_id);
146 register_event(this, EVENT_TIMER, 100000, false, &timer_id);
153 #if !defined(SUPPORT_HIRESO)
154 if(!(modereg & 2) && (data & 2)) {
155 d_fdc->set_drive_type(0, DRIVE_TYPE_2HD);
156 d_fdc->set_drive_type(1, DRIVE_TYPE_2HD);
157 } else if((modereg & 2) && !(data & 2)) {
158 d_fdc->set_drive_type(0, DRIVE_TYPE_2DD);
159 d_fdc->set_drive_type(1, DRIVE_TYPE_2DD);
168 uint32_t FLOPPY::read_io8(uint32_t addr)
173 #if defined(SUPPORT_2HD_FDD_IF)
175 return d_fdc_2hd->read_io8(0);
177 return d_fdc_2hd->read_io8(1);
180 // value |= 0x80; // FINT1 (DIP SW 1-7), 1 = OFF, 0 = ON
181 value |= 0x40; // FINT0 (DIP SW 1-6), 1 = OFF, 0 = ON
182 // value |= 0x20; // DMACH (DIP SW 1-3), 1 = OFF, 0 = ON
185 #if defined(SUPPORT_2DD_FDD_IF)
187 return d_fdc_2dd->read_io8(0);
189 return d_fdc_2dd->read_io8(1);
192 // value |= 0x80; // FINT1 (DIP SW 1-7), 1 = OFF, 0 = ON
193 value |= 0x40; // FINT0 (DIP SW 1-6), 1 = OFF, 0 = ON
194 value |= 0x20; // DMACH (DIP SW 1-3), 1 = OFF, 0 = ON
195 if(d_fdc_2dd->is_disk_inserted()) {
196 value |= 0x10; // RDY
200 #if defined(SUPPORT_2HD_2DD_FDD_IF)
202 #if !defined(SUPPORT_HIRESO)
204 if(((addr >> 4) & 1) == (modereg & 1))
207 return d_fdc->read_io8(0);
211 #if !defined(SUPPORT_HIRESO)
213 if(((addr >> 4) & 1) == (modereg & 1))
216 return d_fdc->read_io8(1);
221 #if !defined(SUPPORT_HIRESO)
223 // value |= 0x80; // FINT1 (DIP SW 1-7), 1 = OFF, 0 = ON
224 value |= 0x40; // FINT0 (DIP SW 1-6), 1 = OFF, 0 = ON
225 // value |= 0x20; // DMACH (DIP SW 1-3), 1 = OFF, 0 = ON
226 // value |= 0x08; // TYP1,0 (DIP SW 1-4), 1,0 = ON Internal FDD: #3,#4, External FDD: #1,#2
227 value |= 0x04; // TYP1,0 (DIP SW 1-4), 0,1 = OFF Internal FDD: #1,#2, External FDD: #3,#4
231 // value |= 0x80; // MODE, 0 = Internal FDD existing
232 value |= ctrlreg & 0x20; // High Density, 1 = 640KB, 0 = 1MB
236 #if !defined(SUPPORT_HIRESO)
238 return 0xf8 | (modereg & 3);
242 // value |= 0x80; // FINT1 (DIP SW 1-7), 1 = OFF, 0 = ON
243 value |= 0x40; // FINT0 (DIP SW 1-6), 1 = OFF, 0 = ON
244 value |= 0x20; // DMACH (DIP SW 1-3), 1 = OFF, 0 = ON
245 // value |= 0x08; // TYP1,0 (DIP SW 1-4), 1,0 = ON Internal FDD: #3,#4, External FDD: #1,#2
246 value |= 0x04; // TYP1,0 (DIP SW 1-4), 0,1 = OFF Internal FDD: #1,#2, External FDD: #3,#4
247 if(d_fdc->is_disk_inserted()) {
248 value |= 0x10; // RDY
256 return 0xff;//addr & 0xff;
259 void FLOPPY::write_signal(int id, uint32_t data, uint32_t mask)
262 #if defined(SUPPORT_2HD_FDD_IF)
263 case SIG_FLOPPY_2HD_IRQ:
264 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR3, data, mask);
266 case SIG_FLOPPY_2HD_DRQ:
267 d_dma->write_signal(SIG_I8237_CH2, data, mask);
270 #if defined(SUPPORT_2DD_FDD_IF)
271 case SIG_FLOPPY_2DD_IRQ:
272 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR2, data, mask);
274 case SIG_FLOPPY_2DD_DRQ:
275 d_dma->write_signal(SIG_I8237_CH3, data, mask);
278 #if defined(SUPPORT_2HD_2DD_FDD_IF)
280 #if !defined(SUPPORT_HIRESO)
282 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR3, data, mask);
284 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR2, data, mask);
287 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR3, data, mask);
291 #if !defined(SUPPORT_HIRESO)
293 d_dma->write_signal(SIG_I8237_CH2, data, mask);
295 d_dma->write_signal(SIG_I8237_CH3, data, mask);
298 d_dma->write_signal(SIG_I8237_CH1, data, mask);
305 void FLOPPY::event_callback(int event_id, int err)
307 #if defined(SUPPORT_2DD_FDD_IF)
308 if(ctrlreg_2dd & 4) {
309 write_signal(SIG_FLOPPY_2DD_IRQ, 1, 1);
312 #if defined(SUPPORT_2HD_2DD_FDD_IF)
314 write_signal(SIG_FLOPPY_IRQ, 1, 1);
320 #define STATE_VERSION 1
322 void FLOPPY::save_state(FILEIO* state_fio)
324 state_fio->FputUint32(STATE_VERSION);
325 state_fio->FputInt32(this_device_id);
327 #if defined(SUPPORT_2HD_FDD_IF)
328 state_fio->FputUint8(ctrlreg_2hd);
330 #if defined(SUPPORT_2DD_FDD_IF)
331 state_fio->FputUint8(ctrlreg_2dd);
333 #if defined(SUPPORT_2HD_2DD_FDD_IF)
334 state_fio->FputUint8(ctrlreg);
335 state_fio->FputUint8(modereg);
337 state_fio->FputInt32(timer_id);
340 bool FLOPPY::load_state(FILEIO* state_fio)
342 if(state_fio->FgetUint32() != STATE_VERSION) {
345 if(state_fio->FgetInt32() != this_device_id) {
348 #if defined(SUPPORT_2HD_FDD_IF)
349 ctrlreg_2hd = state_fio->FgetUint8();
351 #if defined(SUPPORT_2DD_FDD_IF)
352 ctrlreg_2dd = state_fio->FgetUint8();
354 #if defined(SUPPORT_2HD_2DD_FDD_IF)
355 ctrlreg = state_fio->FgetUint8();
356 modereg = state_fio->FgetUint8();
358 timer_id = state_fio->FgetInt32();