OSDN Git Service

cf4bd54823bde7a0db47d9ba4e5cda56bfcf511d
[csp-qt/common_source_project-fm7.git] / source / src / vm / pasopia / floppy.cpp
1 /*
2         TOSHIBA PASOPIA Emulator 'EmuPIA'
3
4         Author : Takeda.Toshiya
5         Date   : 2012.03.01 -
6
7         [ floppy ]
8 */
9
10 #include "floppy.h"
11 #include "../upd765a.h"
12
13 void FLOPPY::initialize()
14 {
15         intr = false;
16 }
17
18 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
19 {
20         if(!supported) {
21                 // OA-BASIC without floppy drives
22                 return;
23         }
24         
25         switch(addr & 0xff) {
26         case 0xe0:
27                 // tc off
28                 d_fdc->write_signal(SIG_UPD765A_TC, 0, 1);
29                 break;
30         case 0xe2:
31                 // tc on
32                 d_fdc->write_signal(SIG_UPD765A_TC, 1, 1);
33                 break;
34         case 0xe4:
35         case 0xe5:
36                 d_fdc->write_io8(addr, data);
37                 break;
38         case 0xe6:
39                 // fdc reset
40                 if(data & 0x80) {
41                         d_fdc->reset();
42                 }
43                 // motor on/off
44                 d_fdc->write_signal(SIG_UPD765A_MOTOR, data, 0x40);
45                 break;
46         }
47 }
48
49 uint32_t FLOPPY::read_io8(uint32_t addr)
50 {
51         if(!supported) {
52                 // OA-BASIC without floppy drives
53                 return 0xff;
54         }
55         
56         switch(addr & 0xff) {
57         case 0xe4:
58         case 0xe5:
59                 return d_fdc->read_io8(addr);
60         case 0xe6:
61                 // fdc intr
62                 return intr ? 0x80 : 0;
63         }
64         return 0xff;
65 }
66
67 void FLOPPY::write_signal(int id, uint32_t data, uint32_t mask)
68 {
69         if(id == SIG_FLOPPY_INTR) {
70                 intr = ((data & mask) != 0);
71         }
72 }
73
74 #define STATE_VERSION   1
75
76 #include "../../statesub.h"
77
78 void FLOPPY::decl_state()
79 {
80         enter_decl_state(STATE_VERSION);
81
82         DECL_STATE_ENTRY_BOOL(intr);
83         DECL_STATE_ENTRY_BOOL(supported);
84         
85         leave_decl_state();
86 }
87
88 void FLOPPY::save_state(FILEIO* state_fio)
89 {
90         if(state_entry != NULL) {
91                 state_entry->save_state(state_fio);
92         }
93 //      state_fio->FputUint32(STATE_VERSION);
94 //      state_fio->FputInt32(this_device_id);
95         
96 //      state_fio->FputBool(intr);
97 //      state_fio->FputBool(supported);
98 }
99
100 bool FLOPPY::load_state(FILEIO* state_fio)
101 {
102         bool mb = false;
103         if(state_entry != NULL) {
104                 mb = state_entry->load_state(state_fio);
105         }
106         if(!mb) {
107                 return false;
108         }
109 //      if(state_fio->FgetUint32() != STATE_VERSION) {
110 //              return false;
111 //      }
112 //      if(state_fio->FgetInt32() != this_device_id) {
113 //              return false;
114 //      }
115 //      intr = state_fio->FgetBool();
116 //      supported = state_fio->FgetBool();
117         return true;
118 }
119
120 bool FLOPPY::process_state(FILEIO* state_fio, bool loading)
121 {
122         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
123                 return false;
124         }
125         if(!state_fio->StateCheckInt32(this_device_id)) {
126                 return false;
127         }
128         state_fio->StateBool(intr);
129         state_fio->StateBool(supported);
130         return true;
131 }