OSDN Git Service

[VM][WIP] Use namespace to devices per VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz700 / floppy.cpp
1 /*
2         SHARP MZ-800 Emulator 'EmuZ-800'
3         SHARP MZ-1500 Emulator 'EmuZ-1500'
4
5         Author : Takeda.Toshiya
6         Date   : 2011.05.16-
7
8         [ floppy ]
9 */
10
11 #include "floppy.h"
12 #include "../mb8877.h"
13
14 #define EVENT_MOTOR_ON  0
15 #define EVENT_MOTOR_OFF 1
16
17 namespace MZ700 {
18         
19 void FLOPPY::initialize()
20 {
21         prev_dc = 0;
22         motor_on = false;
23         
24         // always motor on (temporary)
25 //      d_fdc->write_signal(SIG_MB8877_MOTOR, 1, 1);
26 }
27
28 void FLOPPY::reset()
29 {
30         register_id = -1;
31         irq_enabled = false;
32 }
33
34 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
35 {
36         switch(addr & 0xff) {
37         case 0xdc:
38                 // drive reg
39                 if(data & 4) {
40                         d_fdc->write_signal(SIG_MB8877_DRIVEREG, data, 3);
41                 }
42                 // motor on/off
43                 if(!(prev_dc & 0x80) && (data & 0x80)) {
44                         // L -> H
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_ON, 560000, false, &register_id);
51                         }
52                 } else if((prev_dc & 0x80) && !(data & 0x80)) {
53                         // H -> L
54                         if(register_id != -1) {
55                                 cancel_event(this, register_id);
56                                 register_id = -1;
57                         }
58                         if(motor_on) {
59                                 register_event(this, EVENT_MOTOR_OFF, 1500000, false, &register_id);
60                         }
61                 }
62                 prev_dc = data;
63                 break;
64         case 0xdd:
65                 // side reg
66                 d_fdc->write_signal(SIG_MB8877_SIDEREG, data, 1);
67                 break;
68         case 0xde:
69                 // ???
70                 break;
71         case 0xdf:
72                 // irq enable
73                 irq_enabled = ((data & 1) != 0);
74                 break;
75         }
76 }
77
78 void FLOPPY::event_callback(int event_id, int err)
79 {
80         if(event_id == EVENT_MOTOR_ON) {
81                 d_fdc->write_signal(SIG_MB8877_MOTOR, 1, 1);
82                 motor_on = true;
83         } else if(event_id == EVENT_MOTOR_OFF) {
84                 d_fdc->write_signal(SIG_MB8877_MOTOR, 0, 0);
85                 motor_on = false;
86         }
87         register_id = -1;
88 }
89
90 void FLOPPY::write_signal(int id, uint32_t data, uint32_t mask)
91 {
92         if(id == SIG_FLOPPY_DRQ) {
93                 if(irq_enabled && (data & mask) != 0) {
94                         d_cpu->set_intr_line(true, true, 0);
95                 }
96         }
97 }
98
99 #define STATE_VERSION   1
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->StateUint32(prev_dc);
110         state_fio->StateInt32(register_id);
111         state_fio->StateBool(motor_on);
112         state_fio->StateBool(irq_enabled);
113         return true;
114 }
115
116 }