OSDN Git Service

[VM][STATE][PC9801][X1] Apply new state framework to PC9801 series and X1 series.
[csp-qt/common_source_project-fm7.git] / source / src / vm / x1 / floppy.cpp
1 /*
2         SHARP X1 Emulator 'eX1'
3         SHARP X1twin Emulator 'eX1twin'
4         SHARP X1turbo Emulator 'eX1turbo'
5         SHARP X1turboZ Emulator 'eX1turboZ'
6
7         Author : Takeda.Toshiya
8         Date   : 2009.03.14-
9
10         [ floppy ]
11 */
12
13 #include "floppy.h"
14 #include "../mb8877.h"
15 #ifdef _X1TURBO_FEATURE
16 #include "../disk.h"
17 #endif
18
19 #define EVENT_MOTOR_ON  0
20 #define EVENT_MOTOR_OFF 1
21
22 void FLOPPY::reset()
23 {
24         register_id = -1;
25 #ifdef _X1TURBO_FEATURE
26         select_2dd = false;
27 #endif
28 }
29
30 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
31 {
32         switch(addr) {
33         case 0xffc:
34                 if(!(prev & 0x80) && (data & 0x80)) {
35                         // L -> H
36                         if(register_id != -1) {
37                                 cancel_event(this, register_id);
38                                 register_id = -1;
39                         }
40                         if(!motor_on) {
41                                 register_event(this, EVENT_MOTOR_ON, 560000, false, &register_id);
42                         }
43                 } else if((prev & 0x80) && !(data & 0x80)) {
44                         // H -> L
45                         if(register_id != -1) {
46                                 cancel_event(this, register_id);
47                                 register_id = -1;
48                         }
49                         if(motor_on) {
50                                 register_event(this, EVENT_MOTOR_OFF, 1500000, false, &register_id);
51                         }
52                 }
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);
56                 prev = data;
57                 break;
58         }
59 }
60
61 #ifdef _X1TURBO_FEATURE
62 uint32_t FLOPPY::read_io8(uint32_t addr)
63 {
64         switch(addr) {
65         case 0xffc:     // FM
66 //              d_fdc->set_drive_mfm(prev & 3, false);
67                 select_2dd = false;
68                 return 0xff;
69         case 0xffd:     // MFM
70 //              d_fdc->set_drive_mfm(prev & 3, true);
71                 select_2dd = false;
72                 return 0xff;
73         case 0xffe:     // 2HD
74                 d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2HD);
75 //              d_fdc->set_drive_rpm(prev & 3, 360);
76                 return 0xff;
77         case 0xfff:     // 2D/2DD
78                 if(!select_2dd) {
79                         d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2D);
80                 } else {
81                         d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2DD);
82                 }
83                 select_2dd = !select_2dd;
84 //              d_fdc->set_drive_rpm(prev & 3, 300);
85                 return 0xff;
86         }
87         return 0xff;
88 }
89 #endif
90
91 void FLOPPY::event_callback(int event_id, int err)
92 {
93         if(event_id == EVENT_MOTOR_ON) {
94                 d_fdc->write_signal(SIG_MB8877_MOTOR, 1, 1);
95                 motor_on = true;
96         } else if(event_id == EVENT_MOTOR_OFF) {
97                 d_fdc->write_signal(SIG_MB8877_MOTOR, 0, 0);
98                 motor_on = false;
99         }
100         register_id = -1;
101 }
102
103 #define STATE_VERSION   2
104
105 #include "../statesub.h"
106
107 void FLOPPY::decl_state()
108 {
109         enter_decl_state(STATE_VERSION);
110         
111         DECL_STATE_ENTRY_INT32(prev);
112 #ifdef _X1TURBO_FEATURE
113         DECL_STATE_ENTRY_BOOL(select_2dd);
114 #endif
115         DECL_STATE_ENTRY_BOOL(motor_on);
116         DECL_STATE_ENTRY_INT32(register_id);
117         leave_decl_state();
118 }
119
120 void FLOPPY::save_state(FILEIO* state_fio)
121 {
122         if(state_entry != NULL) {
123                 state_entry->save_state(state_fio);
124         }
125 //      state_fio->FputUint32(STATE_VERSION);
126 //      state_fio->FputInt32(this_device_id);
127         
128 //      state_fio->FputInt32(prev);
129 //#ifdef _X1TURBO_FEATURE
130 //      state_fio->FputBool(select_2dd);
131 //#endif
132 //      state_fio->FputBool(motor_on);
133 //      state_fio->FputInt32(register_id);
134 }
135
136 bool FLOPPY::load_state(FILEIO* state_fio)
137 {
138         bool mb = false;
139         if(state_entry != NULL) {
140                 mb = state_entry->load_state(state_fio);
141         }
142         if(!mb) return false;
143 //      if(state_fio->FgetUint32() != STATE_VERSION) {
144 //              return false;
145 //      }
146 //      if(state_fio->FgetInt32() != this_device_id) {
147 //              return false;
148 //      }
149 //      prev = state_fio->FgetInt32();
150 //#ifdef _X1TURBO_FEATURE
151 //      select_2dd = state_fio->FgetBool();
152 //#endif
153 //      motor_on = state_fio->FgetBool();
154 //      register_id = state_fio->FgetInt32();
155         return true;
156 }
157