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
29 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
33 if(!(prev & 0x80) && (data & 0x80)) {
35 if(register_id != -1) {
36 cancel_event(this, register_id);
40 register_event(this, EVENT_MOTOR_ON, 560000, false, ®ister_id);
42 } else if((prev & 0x80) && !(data & 0x80)) {
44 if(register_id != -1) {
45 cancel_event(this, register_id);
49 register_event(this, EVENT_MOTOR_OFF, 1500000, false, ®ister_id);
52 // FIXME: drvsel is active while motor is on ???
53 d_fdc->write_signal(SIG_MB8877_DRIVEREG, data, 0x03);
54 d_fdc->write_signal(SIG_MB8877_SIDEREG, data, 0x10);
60 #ifdef _X1TURBO_FEATURE
61 uint32_t FLOPPY::read_io8(uint32_t addr)
65 // d_fdc->set_drive_mfm(prev & 3, false);
68 // d_fdc->set_drive_mfm(prev & 3, true);
71 d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2HD);
72 // d_fdc->set_drive_rpm(prev & 3, 360);
75 if(d_fdc->get_media_type(prev & 3) == MEDIA_TYPE_2DD) {
76 d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2DD);
78 d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2D);
80 // d_fdc->set_drive_rpm(prev & 3, 300);
87 void FLOPPY::event_callback(int event_id, int err)
89 if(event_id == EVENT_MOTOR_ON) {
90 d_fdc->write_signal(SIG_MB8877_MOTOR, 1, 1);
92 } else if(event_id == EVENT_MOTOR_OFF) {
93 d_fdc->write_signal(SIG_MB8877_MOTOR, 0, 0);
99 #define STATE_VERSION 3
101 bool FLOPPY::process_state(FILEIO* state_fio, bool loading)
103 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
106 if(!state_fio->StateCheckInt32(this_device_id)) {
109 state_fio->StateInt32(prev);
110 state_fio->StateBool(motor_on);
111 state_fio->StateInt32(register_id);