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
25 #ifdef _X1TURBO_FEATURE
30 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
34 if(!(prev & 0x80) && (data & 0x80)) {
36 if(register_id != -1) {
37 cancel_event(this, register_id);
41 register_event(this, EVENT_MOTOR_ON, 560000, false, ®ister_id);
43 } else if((prev & 0x80) && !(data & 0x80)) {
45 if(register_id != -1) {
46 cancel_event(this, register_id);
50 register_event(this, EVENT_MOTOR_OFF, 1500000, false, ®ister_id);
53 // FIXME: drvsel is active while motor is on ???
54 d_fdc->write_signal(SIG_MB8877_DRIVEREG, data, 0x03);
55 d_fdc->write_signal(SIG_MB8877_SIDEREG, data, 0x10);
61 #ifdef _X1TURBO_FEATURE
62 uint32_t FLOPPY::read_io8(uint32_t addr)
66 // d_fdc->set_drive_mfm(prev & 3, false);
70 // d_fdc->set_drive_mfm(prev & 3, true);
74 d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2HD);
75 // d_fdc->set_drive_rpm(prev & 3, 360);
79 d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2D);
81 d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2DD);
83 select_2dd = !select_2dd;
84 // d_fdc->set_drive_rpm(prev & 3, 300);
91 void FLOPPY::event_callback(int event_id, int err)
93 if(event_id == EVENT_MOTOR_ON) {
94 d_fdc->write_signal(SIG_MB8877_MOTOR, 1, 1);
96 } else if(event_id == EVENT_MOTOR_OFF) {
97 d_fdc->write_signal(SIG_MB8877_MOTOR, 0, 0);
103 #define STATE_VERSION 2
105 #include "../statesub.h"
107 void FLOPPY::decl_state()
109 enter_decl_state(STATE_VERSION);
111 DECL_STATE_ENTRY_INT32(prev);
112 #ifdef _X1TURBO_FEATURE
113 DECL_STATE_ENTRY_BOOL(select_2dd);
115 DECL_STATE_ENTRY_BOOL(motor_on);
116 DECL_STATE_ENTRY_INT32(register_id);
120 void FLOPPY::save_state(FILEIO* state_fio)
122 if(state_entry != NULL) {
123 state_entry->save_state(state_fio);
125 // state_fio->FputUint32(STATE_VERSION);
126 // state_fio->FputInt32(this_device_id);
128 // state_fio->FputInt32(prev);
129 //#ifdef _X1TURBO_FEATURE
130 // state_fio->FputBool(select_2dd);
132 // state_fio->FputBool(motor_on);
133 // state_fio->FputInt32(register_id);
136 bool FLOPPY::load_state(FILEIO* state_fio)
139 if(state_entry != NULL) {
140 mb = state_entry->load_state(state_fio);
142 if(!mb) return false;
143 // if(state_fio->FgetUint32() != STATE_VERSION) {
146 // if(state_fio->FgetInt32() != this_device_id) {
149 // prev = state_fio->FgetInt32();
150 //#ifdef _X1TURBO_FEATURE
151 // select_2dd = state_fio->FgetBool();
153 // motor_on = state_fio->FgetBool();
154 // register_id = state_fio->FgetInt32();