OSDN Git Service

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