2 * FM-7 Main I/O -> FDC [floppy.cpp]
4 * Author: K.Ohta <whatisthis.sowhat _at_ gmail.com>
7 * Mar 19, 2015 : Initial, split from fm7_mainio.cpp .
11 #include "fm7_mainio.h"
13 #include "../mc6809.h"
16 #include "../mb8877.h"
19 void FM7_MAINIO::reset_fdc(void)
30 irqreg_fdc = 0xff; //0b11111111;
33 irqreg_fdc = 0x1f; //0b00011111;
41 void FM7_MAINIO::set_fdc_cmd(uint8 val)
43 if(!connect_fdc) return;
46 fdc->write_io8(0, val & 0x00ff);
49 uint8 FM7_MAINIO::get_fdc_stat(void)
51 if(!connect_fdc) return 0xff;
52 fdc_statreg = fdc->read_io8(0);
56 void FM7_MAINIO::set_fdc_track(uint8 val)
58 if(!connect_fdc) return;
59 // if mode is 2DD and type-of-image = 2D then val >>= 1;
61 fdc->write_io8(1, val & 0x00ff);
64 uint8 FM7_MAINIO::get_fdc_track(void)
66 if(!connect_fdc) return 0xff;
67 fdc_trackreg = fdc->read_io8(1);
71 void FM7_MAINIO::set_fdc_sector(uint8 val)
73 if(!connect_fdc) return;
75 fdc->write_io8(2, val & 0x00ff);
78 uint8 FM7_MAINIO::get_fdc_sector(void)
80 if(!connect_fdc) return 0xff;
81 fdc_sectreg = fdc->read_io8(2);
85 void FM7_MAINIO::set_fdc_data(uint8 val)
87 if(!connect_fdc) return;
89 fdc->write_io8(3, val & 0x00ff);
92 uint8 FM7_MAINIO::get_fdc_data(void)
94 if(!connect_fdc) return 0xff;
95 fdc_datareg = fdc->read_io8(3);
99 uint8 FM7_MAINIO::get_fdc_motor(void)
101 uint8 val = 0x3c; //0b00111100;
102 if(!connect_fdc) return 0xff;
103 if(fdc_motor) val |= 0x80;
104 val = val | (fdc_drvsel & 0x03);
108 void FM7_MAINIO::set_fdc_fd1c(uint8 val)
110 if(!connect_fdc) return;
111 fdc_headreg = (val & 0x01) | 0xfe;
112 fdc->write_signal(SIG_MB8877_SIDEREG, val, 0x01);
115 uint8 FM7_MAINIO::get_fdc_fd1c(void)
117 if(!connect_fdc) return 0xff;
121 void FM7_MAINIO::set_fdc_fd1d(uint8 val)
123 bool backup_motor = fdc_motor;
124 if(!connect_fdc) return;
125 if((val & 0x80) != 0) {
130 // fdc->write_signal(SIG_MB8877_DRIVEREG, val, 0x07);
131 fdc->write_signal(SIG_MB8877_DRIVEREG, val, 0x03);
132 if(fdc_motor != backup_motor) {
134 register_event(this, EVENT_FD_MOTOR_ON, 1000.0 * 1000.0, false, NULL); // Motor ON After 1.0Sec.
136 register_event(this, EVENT_FD_MOTOR_OFF, 1000.0 * 300.0, false, NULL); // Motor ON After 0.3Sec.
142 void FM7_MAINIO::set_irq_mfd(bool flag)
144 uint8 backup = irqreg_fdc;
146 if(!connect_fdc) return;
148 irqreg_fdc |= 0x40; //0b01000000;
149 if(!(irqmask_mfd)) irqstat_fdc = true;
151 irqreg_fdc &= 0xbf; //0b10111111;
154 if(backup != irqreg_fdc) do_irq();
158 void FM7_MAINIO::set_drq_mfd(bool flag)
160 if(!connect_fdc) return;
162 irqreg_fdc |= 0x80;//0b10000000;
164 irqreg_fdc &= 0x7f; //0b01111111;
169 uint8 FM7_MAINIO::fdc_getdrqirq(void)
171 uint8 val = irqreg_fdc | 0x3f;
172 if((fdc->read_io8(0) & 0x01) == 0) val |= 0x40; // Workaround of 太陽の神殿
173 irqreg_fdc |= 0x20; //0b00100000;
177 void FM7_MAINIO::set_fdc_motor(bool flag)
179 fdc->write_signal(SIG_MB8877_MOTOR, flag ? 0x01 : 0x00, 0x01);