OSDN Git Service

[VM][PCENGINE][X1] Enable to build.
[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 }
26
27 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
28 {
29         switch(addr) {
30         case 0xffc:
31                 if(!(prev & 0x80) && (data & 0x80)) {
32                         // L -> H
33                         if(register_id != -1) {
34                                 cancel_event(this, register_id);
35                                 register_id = -1;
36                         }
37                         if(!motor_on) {
38                                 register_event(this, EVENT_MOTOR_ON, 560000, false, &register_id);
39                         }
40                 } else if((prev & 0x80) && !(data & 0x80)) {
41                         // H -> L
42                         if(register_id != -1) {
43                                 cancel_event(this, register_id);
44                                 register_id = -1;
45                         }
46                         if(motor_on) {
47                                 register_event(this, EVENT_MOTOR_OFF, 1500000, false, &register_id);
48                         }
49                 }
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);
53                 prev = data;
54                 break;
55         }
56 }
57
58 #ifdef _X1TURBO_FEATURE
59 uint32_t FLOPPY::read_io8(uint32_t addr)
60 {
61         switch(addr) {
62         case 0xffc:     // FM
63 //              d_fdc->set_drive_mfm(prev & 3, false);
64                 return 0xff;
65         case 0xffd:     // MFM
66 //              d_fdc->set_drive_mfm(prev & 3, true);
67                 return 0xff;
68         case 0xffe:     // 2HD
69                 d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2HD);
70 //              d_fdc->set_drive_rpm(prev & 3, 360);
71                 return 0xff;
72         case 0xfff:     // 2D/2DD
73                 if(d_fdc->get_media_type(prev & 3) == MEDIA_TYPE_2DD) {
74                         d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2DD);
75                 } else {
76                         d_fdc->set_drive_type(prev & 3, DRIVE_TYPE_2D);
77                 }
78 //              d_fdc->set_drive_rpm(prev & 3, 300);
79                 return 0xff;
80         }
81         return 0xff;
82 }
83 #endif
84
85 void FLOPPY::event_callback(int event_id, int err)
86 {
87         if(event_id == EVENT_MOTOR_ON) {
88                 d_fdc->write_signal(SIG_MB8877_MOTOR, 1, 1);
89                 motor_on = true;
90         } else if(event_id == EVENT_MOTOR_OFF) {
91                 d_fdc->write_signal(SIG_MB8877_MOTOR, 0, 0);
92                 motor_on = false;
93         }
94         register_id = -1;
95 }
96
97 #define STATE_VERSION   3
98
99 bool FLOPPY::process_state(FILEIO* state_fio, bool loading)
100 {
101         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
102                 return false;
103         }
104         if(!state_fio->StateCheckInt32(this_device_id)) {
105                 return false;
106         }
107         state_fio->StateInt32(prev);
108         state_fio->StateBool(motor_on);
109         state_fio->StateInt32(register_id);
110         return true;
111 }