2 FUJITSU FMR-50 Emulator 'eFMR-50'
3 FUJITSU FMR-60 Emulator 'eFMR-60'
5 Author : Takeda.Toshiya
14 #include "../mb8877.h"
16 void FLOPPY::initialize()
20 changed[0] = changed[1] = changed[2] = changed[3] = false;
25 for(int i = 0; i < MAX_DRIVE; i++) {
26 d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
30 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
34 switch(addr & 0xffff) {
36 // drive control register
37 irqmsk = ((data & 1) != 0);
39 // note: bit5 is CLKSEL, but 0 is set while seeking
41 for(int i = 0; i < MAX_DRIVE; i++) {
43 d_fdc->set_drive_type(i, DRIVE_TYPE_2DD);
45 d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
49 d_fdc->write_signal(SIG_MB8877_MOTOR, data, 0x10);
50 d_fdc->write_signal(SIG_MB8877_SIDEREG, data, 4);
53 // drive select register
64 if(drvsel != nextdrv) {
65 d_fdc->write_signal(SIG_MB8877_DRIVEREG, drvsel = nextdrv, 3);
67 for(int i = 0; i < MAX_DRIVE; i++) {
68 if((data & 0xc0) == 0x00) {
69 d_fdc->set_drive_type(i, DRIVE_TYPE_2DD); // 300rpm
70 } else if((data & 0xc0) == 0x40) {
71 d_fdc->set_drive_type(i, DRIVE_TYPE_2HD); // 360rpm
80 uint32_t FLOPPY::read_io8(uint32_t addr)
82 switch(addr & 0xffff) {
85 int drvreg = d_fdc->read_signal(SIG_MB8877_DRIVEREG);
86 uint32_t fdc_status = d_fdc->is_disk_inserted(drvreg) ? 2 : 0;
89 changed[drvsel] = false;
90 return fdc_status | 0xe1; // fdd*2
92 // return fdc_status | 0x60; // fdd*1
93 return fdc_status | 0xe0; // fdd*2
101 void FLOPPY::write_signal(int id, uint32_t data, uint32_t mask)
103 if(id == SIG_FLOPPY_IRQ) {
104 irq = ((data & mask) != 0);
109 void FLOPPY::update_intr()
111 d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR6, irq && irqmsk ? 1 : 0, 1);
114 #define STATE_VERSION 1
116 #include "../../statesub.h"
118 void FLOPPY::decl_state()
120 enter_decl_state(STATE_VERSION);
122 DECL_STATE_ENTRY_INT32(drvreg);
123 DECL_STATE_ENTRY_INT32(drvsel);
124 DECL_STATE_ENTRY_BOOL(irq);
125 DECL_STATE_ENTRY_BOOL(irqmsk);
126 DECL_STATE_ENTRY_1D_ARRAY(changed, sizeof(changed) / sizeof(bool));
131 void FLOPPY::save_state(FILEIO* state_fio)
133 if(state_entry != NULL) {
134 state_entry->save_state(state_fio);
137 // state_fio->FputUint32(STATE_VERSION);
138 // state_fio->FputInt32(this_device_id);
140 // state_fio->FputInt32(drvreg);
141 // state_fio->FputInt32(drvsel);
142 // state_fio->FputBool(irq);
143 // state_fio->FputBool(irqmsk);
144 // state_fio->Fwrite(changed, sizeof(changed), 1);
147 bool FLOPPY::load_state(FILEIO* state_fio)
150 if(state_entry != NULL) {
151 mb = state_entry->load_state(state_fio);
157 // if(state_fio->FgetUint32() != STATE_VERSION) {
160 // if(state_fio->FgetInt32() != this_device_id) {
163 // drvreg = state_fio->FgetInt32();
164 // drvsel = state_fio->FgetInt32();
165 // irq = state_fio->FgetBool();
166 // irqmsk = state_fio->FgetBool();
167 // state_fio->Fread(changed, sizeof(changed), 1);
171 bool FLOPPY::process_state(FILEIO* state_fio, bool loading)
173 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
176 if(!state_fio->StateCheckInt32(this_device_id)) {
179 state_fio->StateInt32(drvreg);
180 state_fio->StateInt32(drvsel);
181 state_fio->StateBool(irq);
182 state_fio->StateBool(irqmsk);
183 state_fio->StateBuffer(changed, sizeof(changed), 1);