OSDN Git Service

[VM][WIP] Pre-process to apply new state framework.Still not buildable.
[csp-qt/common_source_project-fm7.git] / source / src / vm / pc98ha / floppy.cpp
1 /*
2         NEC PC-98LT Emulator 'ePC-98LT'
3         NEC PC-98HA Emulator 'eHANDY98'
4
5         Author : Takeda.Toshiya
6         Date   : 2008.06.11 -
7
8         [ floppy ]
9 */
10
11 #include "floppy.h"
12 #include "../disk.h"
13 #include "../upd765a.h"
14
15 void FLOPPY::reset()
16 {
17 /*
18         for(int i = 0; i < 4; i++) {
19                 d_fdc->set_drive_type(i, DRIVE_TYPE_2HD);
20         }
21 */
22         ctrlreg = 0x80;
23         modereg = 0x03;
24 }
25
26 void FLOPPY::write_io8(uint32_t addr, uint32_t data)
27 {
28         switch(addr & 0xffff) {
29         case 0xca:
30                 d_fdc->write_io8(1, data);
31                 break;
32         case 0xcc:
33                 if(!(ctrlreg & 0x80) && (data & 0x80)) {
34                         d_fdc->reset();
35                 }
36                 d_fdc->write_signal(SIG_UPD765A_FREADY, data, 0x40);
37                 d_fdc->write_signal(SIG_UPD765A_MOTOR, data, 0x08);
38                 ctrlreg = data;
39                 break;
40         case 0xbe:
41 /*
42                 if(!(modereg & 2) && (data & 2)) {
43                         d_fdc->set_drive_type(0, DRIVE_TYPE_2HD);
44                         d_fdc->set_drive_type(1, DRIVE_TYPE_2HD);
45                 } else if((modereg & 2) && !(data & 2)) {
46                         d_fdc->set_drive_type(0, DRIVE_TYPE_2DD);
47                         d_fdc->set_drive_type(1, DRIVE_TYPE_2DD);
48                 }
49 */
50                 modereg = data;
51                 break;
52         }
53 }
54
55 uint32_t FLOPPY::read_io8(uint32_t addr)
56 {
57         switch(addr & 0xffff) {
58         case 0xc8:
59                 return d_fdc->read_io8(0);
60         case 0xca:
61                 return d_fdc->read_io8(1);
62         case 0xcc:
63                 return (d_fdc->is_disk_inserted() ? 0x10 : 0) | 0x64;
64         case 0xbe:
65                 return (modereg & 0x03) | 0x08;
66         }
67         return addr & 0xff;
68 }
69
70 #define STATE_VERSION   1
71
72
73 #include "../../statesub.h"
74
75 void FLOPPY::decl_state()
76 {
77         enter_decl_state(STATE_VERSION);
78
79         DECL_STATE_ENTRY_UINT8(ctrlreg);
80         DECL_STATE_ENTRY_UINT8(modereg);
81
82         leave_decl_state();
83 }
84
85 void FLOPPY::save_state(FILEIO* state_fio)
86 {
87         if(state_entry != NULL) {
88                 state_entry->save_state(state_fio);
89         }
90 //      state_fio->FputUint32(STATE_VERSION);
91 //      state_fio->FputInt32(this_device_id);
92         
93 //      state_fio->FputUint8(ctrlreg);
94 //      state_fio->FputUint8(modereg);
95 }
96
97 bool FLOPPY::load_state(FILEIO* state_fio)
98 {
99         bool mb = false;
100         if(state_entry != NULL) {
101                 mb = state_entry->load_state(state_fio);
102         }
103         if(!mb) {
104                 return false;
105         }
106 //      if(state_fio->FgetUint32() != STATE_VERSION) {
107 //              return false;
108 //      }
109 //      if(state_fio->FgetInt32() != this_device_id) {
110 //              return false;
111 //      }
112 //      ctrlreg = state_fio->FgetUint8();
113 //      modereg = state_fio->FgetUint8();
114         return true;
115 }
116
117 bool FLOPPY::process_state(FILEIO* state_fio, bool loading)
118 {
119         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
120                 return false;
121         }
122         if(!state_fio->StateCheckInt32(this_device_id)) {
123                 return false;
124         }
125         state_fio->StateUint8(ctrlreg);
126         state_fio->StateUint8(modereg);
127         return true;
128 }