2 SHARP X1 Emulator 'eX1'
3 SHARP X1twin Emulator 'eX1twin'
4 SHARP X1turbo Emulator 'eX1turbo'
5 SHARP X1turboZ Emulator 'eX1turboZ'
7 Author : Takeda.Toshiya
14 #include "../mb8877.h"
15 #ifdef _X1TURBO_FEATURE
19 #define EVENT_MOTOR_ON 0
20 #define EVENT_MOTOR_OFF 1
27 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
31 if(!(prev & 0x80) && (data & 0x80)) {
33 if(register_id != -1) {
34 cancel_event(this, register_id);
38 register_event(this, EVENT_MOTOR_ON, 560000, false, ®ister_id);
40 } else if((prev & 0x80) && !(data & 0x80)) {
42 if(register_id != -1) {
43 cancel_event(this, register_id);
47 register_event(this, EVENT_MOTOR_OFF, 1500000, false, ®ister_id);
50 // FIXME: drvsel is active while motor is on ???
51 d_fdc->write_signal(SIG_MB8877_DRIVEREG, data, 0x03);
52 d_fdc->write_signal(SIG_MB8877_SIDEREG, data, 0x10);
58 #ifdef _X1TURBO_FEATURE
59 uint32_t FLOPPY::read_io8(uint32_t addr)
63 // d_fdc->set_drive_mfm(prev & 3, false);
66 // d_fdc->set_drive_mfm(prev & 3, true);
69 d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2HD);
70 // d_fdc->set_drive_rpm(prev & 3, 360);
73 if(d_fdc->get_media_type(prev & 3) == MEDIA_TYPE_2DD) {
74 d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2DD);
76 d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2D);
78 // d_fdc->set_drive_rpm(prev & 3, 300);
85 void FLOPPY::event_callback(int event_id, int err)
87 if(event_id == EVENT_MOTOR_ON) {
88 d_fdc->write_signal(SIG_MB8877_MOTOR, 1, 1);
90 } else if(event_id == EVENT_MOTOR_OFF) {
91 d_fdc->write_signal(SIG_MB8877_MOTOR, 0, 0);
97 #define STATE_VERSION 3
99 bool FLOPPY::process_state(FILEIO* state_fio, bool loading)
101 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
104 if(!state_fio->StateCheckInt32(this_device_id)) {
107 state_fio->StateInt32(prev);
108 state_fio->StateBool(motor_on);
109 state_fio->StateInt32(register_id);