2 SHARP MZ-800 Emulator 'EmuZ-800'
3 SHARP MZ-1500 Emulator 'EmuZ-1500'
5 Author : Takeda.Toshiya
12 #include "../mb8877.h"
14 #define EVENT_MOTOR_ON 0
15 #define EVENT_MOTOR_OFF 1
17 void FLOPPY::initialize()
22 // always motor on (temporary)
23 // d_fdc->write_signal(SIG_MB8877_MOTOR, 1, 1);
32 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
38 d_fdc->write_signal(SIG_MB8877_DRIVEREG, data, 3);
41 if(!(prev_dc & 0x80) && (data & 0x80)) {
43 if(register_id != -1) {
44 cancel_event(this, register_id);
48 register_event(this, EVENT_MOTOR_ON, 560000, false, ®ister_id);
50 } else if((prev_dc & 0x80) && !(data & 0x80)) {
52 if(register_id != -1) {
53 cancel_event(this, register_id);
57 register_event(this, EVENT_MOTOR_OFF, 1500000, false, ®ister_id);
64 d_fdc->write_signal(SIG_MB8877_SIDEREG, data, 1);
71 irq_enabled = ((data & 1) != 0);
76 void FLOPPY::event_callback(int event_id, int err)
78 if(event_id == EVENT_MOTOR_ON) {
79 d_fdc->write_signal(SIG_MB8877_MOTOR, 1, 1);
81 } else if(event_id == EVENT_MOTOR_OFF) {
82 d_fdc->write_signal(SIG_MB8877_MOTOR, 0, 0);
88 void FLOPPY::write_signal(int id, uint32_t data, uint32_t mask)
90 if(id == SIG_FLOPPY_DRQ) {
91 if(irq_enabled && (data & mask) != 0) {
92 d_cpu->set_intr_line(true, true, 0);
97 #define STATE_VERSION 1
99 #include "../../statesub.h"
101 void FLOPPY::decl_state()
103 enter_decl_state(STATE_VERSION);
105 DECL_STATE_ENTRY_UINT32(prev_dc);
106 DECL_STATE_ENTRY_INT32(register_id);
107 DECL_STATE_ENTRY_BOOL(motor_on);
108 DECL_STATE_ENTRY_BOOL(irq_enabled);
113 void FLOPPY::save_state(FILEIO* state_fio)
115 if(state_entry != NULL) {
116 state_entry->save_state(state_fio);
118 // state_fio->FputUint32(STATE_VERSION);
119 // state_fio->FputInt32(this_device_id);
121 // state_fio->FputUint32(prev_dc);
122 // state_fio->FputInt32(register_id);
123 // state_fio->FputBool(motor_on);
124 // state_fio->FputBool(irq_enabled);
127 bool FLOPPY::load_state(FILEIO* state_fio)
130 if(state_entry != NULL) {
131 mb = state_entry->load_state(state_fio);
136 // if(state_fio->FgetUint32() != STATE_VERSION) {
139 // if(state_fio->FgetInt32() != this_device_id) {
142 // prev_dc = state_fio->FgetUint32();
143 // register_id = state_fio->FgetInt32();
144 // motor_on = state_fio->FgetBool();
145 // irq_enabled = state_fio->FgetBool();
149 bool FLOPPY::process_state(FILEIO* state_fio, bool loading)
151 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
154 if(!state_fio->StateCheckInt32(this_device_id)) {
157 state_fio->StateUint32(prev_dc);
158 state_fio->StateInt32(register_id);
159 state_fio->StateBool(motor_on);
160 state_fio->StateBool(irq_enabled);