2 NEC PC-9801 Emulator 'ePC-9801'
3 NEC PC-9801E/F/M Emulator 'ePC-9801E'
4 NEC PC-98DO Emulator 'ePC-98DO'
6 Author : Takeda.Toshiya
16 #include "../upd765a.h"
22 #if defined(SUPPORT_2HD_FDD_IF)
23 for(int i = 0; i < MAX_DRIVE; i++) {
24 d_fdc_2hd->set_drive_type(i, DRIVE_TYPE_2HD);
28 #if defined(SUPPORT_2DD_FDD_IF)
29 for(int i = 0; i < MAX_DRIVE; i++) {
30 d_fdc_2dd->set_drive_type(i, DRIVE_TYPE_2DD);
34 #if defined(SUPPORT_2HD_2DD_FDD_IF)
35 for(int i = 0; i < 4; i++) {
36 d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
44 void FLOPPY::write_io8(uint32 addr, uint32 data)
46 switch(addr & 0xffff) {
47 #if defined(SUPPORT_2HD_FDD_IF)
49 d_fdc_2hd->write_io8(0, data);
52 d_fdc_2hd->write_io8(1, data);
55 if(!(ctrlreg_2hd & 0x80) && (data & 0x80)) {
58 d_fdc_2hd->write_signal(SIG_UPD765A_FREADY, data, 0x40);
62 #if defined(SUPPORT_2DD_FDD_IF)
64 d_fdc_2dd->write_io8(0, data);
67 d_fdc_2dd->write_io8(1, data);
70 if(!(ctrlreg_2dd & 0x80) && (data & 0x80)) {
75 cancel_event(this, timer_id);
77 register_event(this, EVENT_TIMER, 100000, false, &timer_id);
79 d_fdc_2dd->write_signal(SIG_UPD765A_MOTOR, data, 0x08);
83 #if defined(SUPPORT_2HD_2DD_FDD_IF)
86 if(((addr >> 4) & 1) == (modereg & 1)) {
87 d_fdc->write_io8(0, data);
92 if(((addr >> 4) & 1) == (modereg & 1)) {
93 d_fdc->write_io8(1, data);
98 if(((addr >> 4) & 1) == (modereg & 1)) {
99 if(!(ctrlreg & 0x80) && (data & 0x80)) {
102 if(!(addr == 0xcc && !(data & 0x20))) {
103 d_fdc->write_signal(SIG_UPD765A_FREADY, data, 0x40);
107 cancel_event(this, timer_id);
109 register_event(this, EVENT_TIMER, 100000, false, &timer_id);
112 // d_fdc->write_signal(SIG_UPD765A_MOTOR, data, 0x08);
118 if(!(modereg & 2) && (data & 2)) {
119 d_fdc->set_drive_type(0, DRIVE_TYPE_2HD);
120 d_fdc->set_drive_type(1, DRIVE_TYPE_2HD);
121 } else if((modereg & 2) && !(data & 2)) {
122 d_fdc->set_drive_type(0, DRIVE_TYPE_2DD);
123 d_fdc->set_drive_type(1, DRIVE_TYPE_2DD);
131 uint32 FLOPPY::read_io8(uint32 addr)
133 switch(addr & 0xffff) {
134 #if defined(SUPPORT_2HD_FDD_IF)
136 return d_fdc_2hd->read_io8(0);
138 return d_fdc_2hd->read_io8(1);
139 #if !defined(_PC9801)
141 return 0x5f; // 0x40 ???
144 #if defined(SUPPORT_2DD_FDD_IF)
146 return d_fdc_2dd->read_io8(0);
148 return d_fdc_2dd->read_io8(1);
150 return (d_fdc_2dd->disk_inserted() ? 0x10 : 0) | 0x6f; // 0x60 ???
152 #if defined(SUPPORT_2HD_2DD_FDD_IF)
155 if(((addr >> 4) & 1) == (modereg & 1)) {
156 return d_fdc->read_io8(0);
161 if(((addr >> 4) & 1) == (modereg & 1)) {
162 return d_fdc->read_io8(1);
171 return 0xf8 | (modereg & 3);
174 return (d_fdc->disk_inserted() ? 0x10 : 0) | 0x64; // 0x60 ???
179 return 0xff;//addr & 0xff;
182 void FLOPPY::write_signal(int id, uint32 data, uint32 mask)
185 #if defined(SUPPORT_2HD_FDD_IF)
186 case SIG_FLOPPY_2HD_IRQ:
187 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR3, data, mask);
189 case SIG_FLOPPY_2HD_DRQ:
190 d_dma->write_signal(SIG_I8237_CH2, data, mask);
193 #if defined(SUPPORT_2DD_FDD_IF)
194 case SIG_FLOPPY_2DD_IRQ:
195 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR2, data, mask);
197 case SIG_FLOPPY_2DD_DRQ:
198 d_dma->write_signal(SIG_I8237_CH3, data, mask);
201 #if defined(SUPPORT_2HD_2DD_FDD_IF)
204 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR3, data, mask);
206 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR2, data, mask);
211 d_dma->write_signal(SIG_I8237_CH2, data, mask);
213 d_dma->write_signal(SIG_I8237_CH3, data, mask);
220 void FLOPPY::event_callback(int event_id, int err)
222 #if defined(SUPPORT_2DD_FDD_IF)
223 if(ctrlreg_2dd & 4) {
224 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR2, 1, 1);
227 #if defined(SUPPORT_2HD_2DD_FDD_IF)
229 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR2, 1, 1);
236 #define STATE_VERSION 1
238 void FLOPPY::save_state(FILEIO* state_fio)
240 state_fio->FputUint32(STATE_VERSION);
241 state_fio->FputInt32(this_device_id);
243 #if defined(SUPPORT_2HD_FDD_IF)
244 state_fio->FputUint8(ctrlreg_2hd);
246 #if defined(SUPPORT_2DD_FDD_IF)
247 state_fio->FputUint8(ctrlreg_2dd);
249 #if defined(SUPPORT_2HD_2DD_FDD_IF)
250 state_fio->FputUint8(ctrlreg);
251 state_fio->FputUint8(modereg);
253 state_fio->FputInt32(timer_id);
256 bool FLOPPY::load_state(FILEIO* state_fio)
258 if(state_fio->FgetUint32() != STATE_VERSION) {
261 if(state_fio->FgetInt32() != this_device_id) {
264 #if defined(SUPPORT_2HD_FDD_IF)
265 ctrlreg_2hd = state_fio->FgetUint8();
267 #if defined(SUPPORT_2DD_FDD_IF)
268 ctrlreg_2dd = state_fio->FgetUint8();
270 #if defined(SUPPORT_2HD_2DD_FDD_IF)
271 ctrlreg = state_fio->FgetUint8();
272 modereg = state_fio->FgetUint8();
274 timer_id = state_fio->FgetInt32();