NEC PC-9801VM Emulator 'ePC-9801VM'
NEC PC-9801VX Emulator 'ePC-9801VX'
NEC PC-9801RA Emulator 'ePC-9801RA'
+ NEC PC-98XA Emulator 'ePC-98XA'
NEC PC-98XL Emulator 'ePC-98XL'
NEC PC-98RL Emulator 'ePC-98RL'
NEC PC-98DO Emulator 'ePC-98DO'
d_fdc_2hd->write_io8(1, data);
break;
case 0x0094:
+ case 0x0096:
if(!(ctrlreg_2hd & 0x80) && (data & 0x80)) {
d_fdc_2hd->reset();
}
d_fdc_2dd->write_io8(1, data);
break;
case 0x00cc:
+ case 0x00ce:
if(!(ctrlreg_2dd & 0x80) && (data & 0x80)) {
d_fdc_2dd->reset();
}
}
break;
case 0x0094:
+ case 0x0096:
#if !defined(SUPPORT_HIRESO)
case 0x00cc:
+ case 0x00ce:
if(((addr >> 4) & 1) == (modereg & 1))
#endif
{
d_fdc->set_drive_type(1, DRIVE_TYPE_2DD);
}
#endif
-// if(modereg & 4) {
+//#if !defined(_PC98XA) && !defined(_PC98XL)
+// if(modereg & 0x04) {
// d_fdc->write_signal(SIG_UPD765A_MOTOR, data, 0x08);
// }
- if(data & 1) {
+ if(data & 0x01) {
if(timer_id != -1) {
cancel_event(this, timer_id);
}
register_event(this, EVENT_TIMER, 100000, false, &timer_id);
}
ctrlreg = data;
+//#endif
}
break;
case 0x00be:
uint32_t FLOPPY::read_io8(uint32_t addr)
{
+ uint32_t value = 0;
+
switch(addr) {
#if defined(SUPPORT_2HD_FDD_IF)
case 0x0090:
return d_fdc_2hd->read_io8(0);
case 0x0092:
return d_fdc_2hd->read_io8(1);
-#if !defined(_PC9801)
case 0x0094:
- return 0x5f; // 0x40 ???
-#endif
+ case 0x0096:
+// value |= 0x80; // FINT1 (DIP SW 1-7), 1 = OFF, 0 = ON
+ value |= 0x40; // FINT0 (DIP SW 1-6), 1 = OFF, 0 = ON
+// value |= 0x20; // DMACH (DIP SW 1-3), 1 = OFF, 0 = ON
+ return value;
#endif
#if defined(SUPPORT_2DD_FDD_IF)
case 0x00c8:
case 0x00ca:
return d_fdc_2dd->read_io8(1);
case 0x00cc:
- return (d_fdc_2dd->is_disk_inserted() ? 0x10 : 0) | 0x6f; // 0x60 ???
+ case 0x00ce:
+// value |= 0x80; // FINT1 (DIP SW 1-7), 1 = OFF, 0 = ON
+ value |= 0x40; // FINT0 (DIP SW 1-6), 1 = OFF, 0 = ON
+ value |= 0x20; // DMACH (DIP SW 1-3), 1 = OFF, 0 = ON
+ if(d_fdc_2dd->is_disk_inserted()) {
+ value |= 0x10; // RDY
+ }
+ return value;
#endif
#if defined(SUPPORT_2HD_2DD_FDD_IF)
case 0x0090:
return d_fdc->read_io8(1);
}
break;
- case 0x94:
+ case 0x0094:
+ case 0x0096:
#if !defined(SUPPORT_HIRESO)
if(modereg & 1) {
- return 0x44;
+// value |= 0x80; // FINT1 (DIP SW 1-7), 1 = OFF, 0 = ON
+ value |= 0x40; // FINT0 (DIP SW 1-6), 1 = OFF, 0 = ON
+// value |= 0x20; // DMACH (DIP SW 1-3), 1 = OFF, 0 = ON
+// value |= 0x08; // TYP1,0 (DIP SW 1-4), 1,0 = ON Internal FDD: #3,#4, External FDD: #1,#2
+ value |= 0x04; // TYP1,0 (DIP SW 1-4), 0,1 = OFF Internal FDD: #1,#2, External FDD: #3,#4
+ return value;
}
#else
- return ctrlreg & 0x20;
+// value |= 0x80; // MODE, 0 = Internal FDD existing
+ value |= ctrlreg & 0x20; // High Density, 1 = 640KB, 0 = 1MB
+ return value;
#endif
break;
#if !defined(SUPPORT_HIRESO)
case 0x00be:
return 0xf8 | (modereg & 3);
case 0x00cc:
+ case 0x00ce:
if(!(modereg & 1)) {
- return (d_fdc->is_disk_inserted() ? 0x10 : 0) | 0x64; // 0x60 ???
+// value |= 0x80; // FINT1 (DIP SW 1-7), 1 = OFF, 0 = ON
+ value |= 0x40; // FINT0 (DIP SW 1-6), 1 = OFF, 0 = ON
+ value |= 0x20; // DMACH (DIP SW 1-3), 1 = OFF, 0 = ON
+// value |= 0x08; // TYP1,0 (DIP SW 1-4), 1,0 = ON Internal FDD: #3,#4, External FDD: #1,#2
+ value |= 0x04; // TYP1,0 (DIP SW 1-4), 0,1 = OFF Internal FDD: #1,#2, External FDD: #3,#4
+ if(d_fdc->is_disk_inserted()) {
+ value |= 0x10; // RDY
+ }
+ return value;
}
break;
#endif
#define STATE_VERSION 1
-void FLOPPY::save_state(FILEIO* state_fio)
-{
- state_fio->FputUint32(STATE_VERSION);
- state_fio->FputInt32(this_device_id);
-
-#if defined(SUPPORT_2HD_FDD_IF)
- state_fio->FputUint8(ctrlreg_2hd);
-#endif
-#if defined(SUPPORT_2DD_FDD_IF)
- state_fio->FputUint8(ctrlreg_2dd);
-#endif
-#if defined(SUPPORT_2HD_2DD_FDD_IF)
- state_fio->FputUint8(ctrlreg);
- state_fio->FputUint8(modereg);
-#endif
- state_fio->FputInt32(timer_id);
-}
-
-bool FLOPPY::load_state(FILEIO* state_fio)
+bool FLOPPY::process_state(FILEIO* state_fio, bool loading)
{
- if(state_fio->FgetUint32() != STATE_VERSION) {
+ if(!state_fio->StateCheckUint32(STATE_VERSION)) {
return false;
}
- if(state_fio->FgetInt32() != this_device_id) {
+ if(!state_fio->StateCheckInt32(this_device_id)) {
return false;
}
#if defined(SUPPORT_2HD_FDD_IF)
- ctrlreg_2hd = state_fio->FgetUint8();
+ state_fio->StateUint8(ctrlreg_2hd);
#endif
#if defined(SUPPORT_2DD_FDD_IF)
- ctrlreg_2dd = state_fio->FgetUint8();
+ state_fio->StateUint8(ctrlreg_2dd);
#endif
#if defined(SUPPORT_2HD_2DD_FDD_IF)
- ctrlreg = state_fio->FgetUint8();
- modereg = state_fio->FgetUint8();
+ state_fio->StateUint8(ctrlreg);
+ state_fio->StateUint8(modereg);
#endif
- timer_id = state_fio->FgetInt32();
+ state_fio->StateInt32(timer_id);
return true;
}