2 FUJITSU FMR-50 Emulator 'eFMR-50'
3 FUJITSU FMR-60 Emulator 'eFMR-60'
5 Author : Takeda.Toshiya
14 #include "../mb8877.h"
18 void FLOPPY::initialize()
22 changed[0] = changed[1] = changed[2] = changed[3] = false;
27 for(int i = 0; i < MAX_DRIVE; i++) {
28 d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
32 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
36 switch(addr & 0xffff) {
38 // drive control register
39 irqmsk = ((data & 1) != 0);
41 // note: bit5 is CLKSEL, but 0 is set while seeking
43 for(int i = 0; i < MAX_DRIVE; i++) {
45 d_fdc->set_drive_type(i, DRIVE_TYPE_2DD);
47 d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
51 d_fdc->write_signal(SIG_MB8877_MOTOR, data, 0x10);
52 d_fdc->write_signal(SIG_MB8877_SIDEREG, data, 4);
55 // drive select register
66 if(drvsel != nextdrv) {
67 d_fdc->write_signal(SIG_MB8877_DRIVEREG, drvsel = nextdrv, 3);
69 for(int i = 0; i < MAX_DRIVE; i++) {
70 if((data & 0xc0) == 0x00) {
71 d_fdc->set_drive_type(i, DRIVE_TYPE_2DD); // 300rpm
72 } else if((data & 0xc0) == 0x40) {
73 d_fdc->set_drive_type(i, DRIVE_TYPE_2HD); // 360rpm
82 uint32_t FLOPPY::read_io8(uint32_t addr)
84 switch(addr & 0xffff) {
87 int drvreg = d_fdc->read_signal(SIG_MB8877_DRIVEREG);
88 uint32_t fdc_status = d_fdc->is_disk_inserted(drvreg) ? 2 : 0;
91 changed[drvsel] = false;
92 return fdc_status | 0xe1; // fdd*2
94 // return fdc_status | 0x60; // fdd*1
95 return fdc_status | 0xe0; // fdd*2
103 void FLOPPY::write_signal(int id, uint32_t data, uint32_t mask)
105 if(id == SIG_FLOPPY_IRQ) {
106 irq = ((data & mask) != 0);
111 void FLOPPY::update_intr()
113 d_pic->write_signal(SIG_I8259_CHIP0 | SIG_I8259_IR6, irq && irqmsk ? 1 : 0, 1);
116 #define STATE_VERSION 1
118 bool FLOPPY::process_state(FILEIO* state_fio, bool loading)
120 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
123 if(!state_fio->StateCheckInt32(this_device_id)) {
126 state_fio->StateInt32(drvreg);
127 state_fio->StateInt32(drvsel);
128 state_fio->StateBool(irq);
129 state_fio->StateBool(irqmsk);
130 //state_fio->StateBuffer(changed, sizeof(changed), 1);
131 for(int i = 0; i < (sizeof(changed) / sizeof(bool)); i++) {
132 state_fio->StateBool(changed[i]);