2 NEC PC-9801 Emulator 'ePC-9801'
\r
3 NEC PC-9801E/F/M Emulator 'ePC-9801E'
\r
4 NEC PC-98DO Emulator 'ePC-98DO'
\r
6 Author : Takeda.Toshiya
\r
13 #include "../disk.h"
\r
14 #include "../i8237.h"
\r
15 #include "../i8259.h"
\r
16 #include "../upd765a.h"
\r
17 #include "../../fileio.h"
\r
19 #define EVENT_TIMER 0
\r
21 void FLOPPY::reset()
\r
23 #if defined(SUPPORT_2HD_FDD_IF)
\r
24 for(int i = 0; i < MAX_DRIVE; i++) {
\r
25 d_fdc_2hd->set_drive_type(i, DRIVE_TYPE_2HD);
\r
29 #if defined(SUPPORT_2DD_FDD_IF)
\r
30 for(int i = 0; i < MAX_DRIVE; i++) {
\r
31 d_fdc_2dd->set_drive_type(i, DRIVE_TYPE_2DD);
\r
35 #if defined(SUPPORT_2HD_2DD_FDD_IF)
\r
36 for(int i = 0; i < 4; i++) {
\r
37 d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
\r
45 void FLOPPY::write_io8(uint32 addr, uint32 data)
\r
47 switch(addr & 0xffff) {
\r
48 #if defined(SUPPORT_2HD_FDD_IF)
\r
50 d_fdc_2hd->write_io8(0, data);
\r
53 d_fdc_2hd->write_io8(1, data);
\r
56 if(!(ctrlreg_2hd & 0x80) && (data & 0x80)) {
\r
59 d_fdc_2hd->write_signal(SIG_UPD765A_FREADY, data, 0x40);
\r
63 #if defined(SUPPORT_2DD_FDD_IF)
\r
65 d_fdc_2dd->write_io8(0, data);
\r
68 d_fdc_2dd->write_io8(1, data);
\r
71 if(!(ctrlreg_2dd & 0x80) && (data & 0x80)) {
\r
75 if(timer_id != -1) {
\r
76 cancel_event(this, timer_id);
\r
78 register_event(this, EVENT_TIMER, 100000, false, &timer_id);
\r
80 d_fdc_2dd->write_signal(SIG_UPD765A_MOTOR, data, 0x08);
\r
84 #if defined(SUPPORT_2HD_2DD_FDD_IF)
\r
87 if(((addr >> 4) & 1) == (modereg & 1)) {
\r
88 d_fdc->write_io8(0, data);
\r
93 if(((addr >> 4) & 1) == (modereg & 1)) {
\r
94 d_fdc->write_io8(1, data);
\r
99 if(((addr >> 4) & 1) == (modereg & 1)) {
\r
100 if(!(ctrlreg & 0x80) && (data & 0x80)) {
\r
103 if(!(addr == 0xcc && !(data & 0x20))) {
\r
104 d_fdc->write_signal(SIG_UPD765A_FREADY, data, 0x40);
\r
107 if(timer_id != -1) {
\r
108 cancel_event(this, timer_id);
\r
110 register_event(this, EVENT_TIMER, 100000, false, &timer_id);
\r
112 // if(modereg & 4) {
\r
113 // d_fdc->write_signal(SIG_UPD765A_MOTOR, data, 0x08);
\r
119 if(!(modereg & 2) && (data & 2)) {
\r
120 d_fdc->set_drive_type(0, DRIVE_TYPE_2HD);
\r
121 d_fdc->set_drive_type(1, DRIVE_TYPE_2HD);
\r
122 } else if((modereg & 2) && !(data & 2)) {
\r
123 d_fdc->set_drive_type(0, DRIVE_TYPE_2DD);
\r
124 d_fdc->set_drive_type(1, DRIVE_TYPE_2DD);
\r
132 uint32 FLOPPY::read_io8(uint32 addr)
\r
134 switch(addr & 0xffff) {
\r
135 #if defined(SUPPORT_2HD_FDD_IF)
\r
137 return d_fdc_2hd->read_io8(0);
\r
139 return d_fdc_2hd->read_io8(1);
\r
140 #if !defined(_PC9801)
\r
142 return 0x5f; // 0x40 ???
\r
145 #if defined(SUPPORT_2DD_FDD_IF)
\r
147 return d_fdc_2dd->read_io8(0);
\r
149 return d_fdc_2dd->read_io8(1);
\r
151 return (d_fdc_2dd->disk_inserted() ? 0x10 : 0) | 0x6f; // 0x60 ???
\r
153 #if defined(SUPPORT_2HD_2DD_FDD_IF)
\r
156 if(((addr >> 4) & 1) == (modereg & 1)) {
\r
157 return d_fdc->read_io8(0);
\r
162 if(((addr >> 4) & 1) == (modereg & 1)) {
\r
163 return d_fdc->read_io8(1);
\r
172 return 0xf8 | (modereg & 3);
\r
174 if(!(modereg & 1)) {
\r
175 return (d_fdc->disk_inserted() ? 0x10 : 0) | 0x64; // 0x60 ???
\r
180 return 0xff;//addr & 0xff;
\r
183 void FLOPPY::write_signal(int id, uint32 data, uint32 mask)
\r
186 #if defined(SUPPORT_2HD_FDD_IF)
\r
187 case SIG_FLOPPY_2HD_IRQ:
\r
188 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR3, data, mask);
\r
190 case SIG_FLOPPY_2HD_DRQ:
\r
191 d_dma->write_signal(SIG_I8237_CH2, data, mask);
\r
194 #if defined(SUPPORT_2DD_FDD_IF)
\r
195 case SIG_FLOPPY_2DD_IRQ:
\r
196 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR2, data, mask);
\r
198 case SIG_FLOPPY_2DD_DRQ:
\r
199 d_dma->write_signal(SIG_I8237_CH3, data, mask);
\r
202 #if defined(SUPPORT_2HD_2DD_FDD_IF)
\r
203 case SIG_FLOPPY_IRQ:
\r
205 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR3, data, mask);
\r
207 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR2, data, mask);
\r
210 case SIG_FLOPPY_DRQ:
\r
212 d_dma->write_signal(SIG_I8237_CH2, data, mask);
\r
214 d_dma->write_signal(SIG_I8237_CH3, data, mask);
\r
221 void FLOPPY::event_callback(int event_id, int err)
\r
223 #if defined(SUPPORT_2DD_FDD_IF)
\r
224 if(ctrlreg_2dd & 4) {
\r
225 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR2, 1, 1);
\r
228 #if defined(SUPPORT_2HD_2DD_FDD_IF)
\r
230 d_pic->write_signal(SIG_I8259_CHIP1 | SIG_I8259_IR2, 1, 1);
\r
236 #define STATE_VERSION 1
\r
238 void FLOPPY::save_state(FILEIO* state_fio)
\r
240 state_fio->FputUint32(STATE_VERSION);
\r
241 state_fio->FputInt32(this_device_id);
\r
243 #if defined(SUPPORT_2HD_FDD_IF)
\r
244 state_fio->FputUint8(ctrlreg_2hd);
\r
246 #if defined(SUPPORT_2DD_FDD_IF)
\r
247 state_fio->FputUint8(ctrlreg_2dd);
\r
249 #if defined(SUPPORT_2HD_2DD_FDD_IF)
\r
250 state_fio->FputUint8(ctrlreg);
\r
251 state_fio->FputUint8(modereg);
\r
253 state_fio->FputInt32(timer_id);
\r
256 bool FLOPPY::load_state(FILEIO* state_fio)
\r
258 if(state_fio->FgetUint32() != STATE_VERSION) {
\r
261 if(state_fio->FgetInt32() != this_device_id) {
\r
264 #if defined(SUPPORT_2HD_FDD_IF)
\r
265 ctrlreg_2hd = state_fio->FgetUint8();
\r
267 #if defined(SUPPORT_2DD_FDD_IF)
\r
268 ctrlreg_2dd = state_fio->FgetUint8();
\r
270 #if defined(SUPPORT_2HD_2DD_FDD_IF)
\r
271 ctrlreg = state_fio->FgetUint8();
\r
272 modereg = state_fio->FgetUint8();
\r
274 timer_id = state_fio->FgetInt32();
\r