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"
32 #if defined(SUPPORT_2HD_FDD_IF)
33 for(int i = 0; i < MAX_DRIVE; i++) {
34 d_fdc_2hd->set_drive_type(i, DRIVE_TYPE_2HD);
38 #if defined(SUPPORT_2DD_FDD_IF)
39 for(int i = 0; i < MAX_DRIVE; i++) {
40 d_fdc_2dd->set_drive_type(i, DRIVE_TYPE_2DD);
44 #if defined(SUPPORT_2HD_2DD_FDD_IF)
45 for(int i = 0; i < 4; i++) {
46 d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
54 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
57 #if defined(SUPPORT_2HD_FDD_IF)
59 d_fdc_2hd->write_io8(0, data);
62 d_fdc_2hd->write_io8(1, data);
66 if(!(ctrlreg_2hd & 0x80) && (data & 0x80)) {
69 d_fdc_2hd->write_signal(SIG_UPD765A_FREADY, data, 0x40);
73 #if defined(SUPPORT_2DD_FDD_IF)
75 d_fdc_2dd->write_io8(0, data);
78 d_fdc_2dd->write_io8(1, data);
82 if(!(ctrlreg_2dd & 0x80) && (data & 0x80)) {
87 cancel_event(this, timer_id);
89 register_event(this, EVENT_TIMER, 100000, false, &timer_id);
91 d_fdc_2dd->write_signal(SIG_UPD765A_MOTOR, data, 0x08);
95 #if defined(SUPPORT_2HD_2DD_FDD_IF)
97 #if !defined(SUPPORT_HIRESO)
99 if(((addr >> 4) & 1) == (modereg & 1))
102 d_fdc->write_io8(0, data);
106 #if !defined(SUPPORT_HIRESO)
108 if(((addr >> 4) & 1) == (modereg & 1))
111 d_fdc->write_io8(1, data);
116 #if !defined(SUPPORT_HIRESO)
119 if(((addr >> 4) & 1) == (modereg & 1))
122 if(!(ctrlreg & 0x80) && (data & 0x80)) {
125 #if !defined(SUPPORT_HIRESO)
126 if(!(addr == 0xcc && !(data & 0x20)))
129 d_fdc->write_signal(SIG_UPD765A_FREADY, data, 0x40);
131 #if defined(SUPPORT_HIRESO)
132 if((ctrlreg & 0x20) && !(data & 0x20)) {
133 d_fdc->set_drive_type(0, DRIVE_TYPE_2HD);
134 d_fdc->set_drive_type(1, DRIVE_TYPE_2HD);
135 } else if(!(ctrlreg & 0x20) && (data & 0x20)) {
136 d_fdc->set_drive_type(0, DRIVE_TYPE_2DD);
137 d_fdc->set_drive_type(1, DRIVE_TYPE_2DD);
140 //#if !defined(_PC98XA) && !defined(_PC98XL)
141 // if(modereg & 0x04) {
142 // d_fdc->write_signal(SIG_UPD765A_MOTOR, data, 0x08);
146 cancel_event(this, timer_id);
148 register_event(this, EVENT_TIMER, 100000, false, &timer_id);
155 #if !defined(SUPPORT_HIRESO)
156 if(!(modereg & 2) && (data & 2)) {
157 d_fdc->set_drive_type(0, DRIVE_TYPE_2HD);
158 d_fdc->set_drive_type(1, DRIVE_TYPE_2HD);
159 } else if((modereg & 2) && !(data & 2)) {
160 d_fdc->set_drive_type(0, DRIVE_TYPE_2DD);
161 d_fdc->set_drive_type(1, DRIVE_TYPE_2DD);
170 uint32_t FLOPPY::read_io8(uint32_t addr)
175 #if defined(SUPPORT_2HD_FDD_IF)
177 return d_fdc_2hd->read_io8(0);
179 return d_fdc_2hd->read_io8(1);
182 // value |= 0x80; // FINT1 (DIP SW 1-7), 1 = OFF, 0 = ON
183 value |= 0x40; // FINT0 (DIP SW 1-6), 1 = OFF, 0 = ON
184 // value |= 0x20; // DMACH (DIP SW 1-3), 1 = OFF, 0 = ON
187 #if defined(SUPPORT_2DD_FDD_IF)
189 return d_fdc_2dd->read_io8(0);
191 return d_fdc_2dd->read_io8(1);
194 // value |= 0x80; // FINT1 (DIP SW 1-7), 1 = OFF, 0 = ON
195 value |= 0x40; // FINT0 (DIP SW 1-6), 1 = OFF, 0 = ON
196 value |= 0x20; // DMACH (DIP SW 1-3), 1 = OFF, 0 = ON
197 if(d_fdc_2dd->is_disk_inserted()) {
198 value |= 0x10; // RDY
202 #if defined(SUPPORT_2HD_2DD_FDD_IF)
204 #if !defined(SUPPORT_HIRESO)
206 if(((addr >> 4) & 1) == (modereg & 1))
209 return d_fdc->read_io8(0);
213 #if !defined(SUPPORT_HIRESO)
215 if(((addr >> 4) & 1) == (modereg & 1))
218 return d_fdc->read_io8(1);
223 #if !defined(SUPPORT_HIRESO)
225 // value |= 0x80; // FINT1 (DIP SW 1-7), 1 = OFF, 0 = ON
226 value |= 0x40; // FINT0 (DIP SW 1-6), 1 = OFF, 0 = ON
227 // value |= 0x20; // DMACH (DIP SW 1-3), 1 = OFF, 0 = ON
228 // value |= 0x08; // TYP1,0 (DIP SW 1-4), 1,0 = ON Internal FDD: #3,#4, External FDD: #1,#2
229 value |= 0x04; // TYP1,0 (DIP SW 1-4), 0,1 = OFF Internal FDD: #1,#2, External FDD: #3,#4
233 // value |= 0x80; // MODE, 0 = Internal FDD existing
234 value |= ctrlreg & 0x20; // High Density, 1 = 640KB, 0 = 1MB
238 #if !defined(SUPPORT_HIRESO)
240 return 0xf8 | (modereg & 3);
244 // value |= 0x80; // FINT1 (DIP SW 1-7), 1 = OFF, 0 = ON
245 value |= 0x40; // FINT0 (DIP SW 1-6), 1 = OFF, 0 = ON
246 value |= 0x20; // DMACH (DIP SW 1-3), 1 = OFF, 0 = ON
247 // value |= 0x08; // TYP1,0 (DIP SW 1-4), 1,0 = ON Internal FDD: #3,#4, External FDD: #1,#2
248 value |= 0x04; // TYP1,0 (DIP SW 1-4), 0,1 = OFF Internal FDD: #1,#2, External FDD: #3,#4
249 if(d_fdc->is_disk_inserted()) {
250 value |= 0x10; // RDY
258 return 0xff;//addr & 0xff;
261 void FLOPPY::write_signal(int id, uint32_t data, uint32_t mask)
264 #if defined(SUPPORT_2HD_FDD_IF)
265 case SIG_FLOPPY_2HD_IRQ:
266 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR3, data, mask);
268 case SIG_FLOPPY_2HD_DRQ:
269 d_dma->write_signal(SIG_I8237_CH2, data, mask);
272 #if defined(SUPPORT_2DD_FDD_IF)
273 case SIG_FLOPPY_2DD_IRQ:
274 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR2, data, mask);
276 case SIG_FLOPPY_2DD_DRQ:
277 d_dma->write_signal(SIG_I8237_CH3, data, mask);
280 #if defined(SUPPORT_2HD_2DD_FDD_IF)
282 #if !defined(SUPPORT_HIRESO)
284 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR3, data, mask);
286 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR2, data, mask);
289 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR3, data, mask);
293 #if !defined(SUPPORT_HIRESO)
295 d_dma->write_signal(SIG_I8237_CH2, data, mask);
297 d_dma->write_signal(SIG_I8237_CH3, data, mask);
300 d_dma->write_signal(SIG_I8237_CH1, data, mask);
307 void FLOPPY::event_callback(int event_id, int err)
309 #if defined(SUPPORT_2DD_FDD_IF)
310 if(ctrlreg_2dd & 4) {
311 write_signal(SIG_FLOPPY_2DD_IRQ, 1, 1);
314 #if defined(SUPPORT_2HD_2DD_FDD_IF)
316 write_signal(SIG_FLOPPY_IRQ, 1, 1);
322 #define STATE_VERSION 1
324 bool FLOPPY::process_state(FILEIO* state_fio, bool loading)
326 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
329 if(!state_fio->StateCheckInt32(this_device_id)) {
332 #if defined(SUPPORT_2HD_FDD_IF)
333 state_fio->StateUint8(ctrlreg_2hd);
335 #if defined(SUPPORT_2DD_FDD_IF)
336 state_fio->StateUint8(ctrlreg_2dd);
338 #if defined(SUPPORT_2HD_2DD_FDD_IF)
339 state_fio->StateUint8(ctrlreg);
340 state_fio->StateUint8(modereg);
342 state_fio->StateInt32(timer_id);