OSDN Git Service

d174081b6c203402e2c47b0e174c6fae710f38d9
[csp-qt/common_source_project-fm7.git] / source / src / vm / pasopia7 / pac2.cpp
1 /*
2         TOSHIBA PASOPIA 7 Emulator 'EmuPIA7'
3
4         Author : Takeda.Toshiya
5         Date   : 2006.09.20 -
6
7         [ pac slot 2 ]
8 */
9
10 #include "pac2.h"
11 #include "pac2dev.h"
12 #include "rampac2.h"
13 #include "kanjipac2.h"
14 #include "joypac2.h"
15
16 void PAC2::initialize()
17 {
18         // slot 4 : ram pack #5
19         // slot 3 : ram pack #6
20         // slot 2 : kanji rom
21         // slot 1 : joystick
22         dummy = new PAC2DEV(static_cast<VM *>(vm), emu);
23         rampac2[0] = new RAMPAC2(static_cast<VM *>(vm), emu);
24         rampac2[1] = new RAMPAC2(static_cast<VM *>(vm), emu);
25         kanji = new KANJIPAC2(static_cast<VM *>(vm), emu);
26         joy = new JOYPAC2(static_cast<VM *>(vm), emu);
27         
28         rampac2[0]->initialize(1);
29         rampac2[1]->initialize(2);
30         kanji->initialize(3);
31         joy->initialize(4);
32         
33         dev[7] = dummy;
34         dev[6] = dummy;
35         dev[5] = dummy;
36         dev[4] = rampac2[0];
37         dev[3] = rampac2[1];
38         dev[2] = kanji;
39         dev[1] = joy;
40         dev[0] = dummy;
41         
42         sel = 0;
43 }
44
45 void PAC2::release()
46 {
47         delete dummy;
48         rampac2[0]->release();
49         delete rampac2[0];
50         rampac2[1]->release();
51         delete rampac2[1];
52         delete kanji;
53         delete joy;
54 }
55
56 void PAC2::reset()
57 {
58         rampac2[0]->reset();
59         rampac2[1]->reset();
60         kanji->reset();
61 }
62
63 void PAC2::write_io8(uint32_t addr, uint32_t data)
64 {
65         switch(addr & 0xff) {
66         case 0x18:
67         case 0x19:
68         case 0x1a:
69                 dev[sel]->write_io8(addr, data);
70                 break;
71         case 0x1b:
72                 if(data & 0x80) {
73                         dev[sel]->write_io8(addr, data);
74                 } else {
75                         sel = data & 7;
76                 }
77                 break;
78         }
79 }
80
81 uint32_t PAC2::read_io8(uint32_t addr)
82 {
83         return dev[sel]->read_io8(addr);
84 }
85
86 void PAC2::open_rampac2(int drv, const _TCHAR* file_path)
87 {
88         rampac2[drv]->open_file(file_path);
89 }
90
91 #define STATE_VERSION   1
92
93 #include "../../statesub.h"
94
95 void PAC2::decl_state()
96 {
97         enter_decl_state(STATE_VERSION);
98         
99         DECL_STATE_ENTRY_INT32(sel);
100         
101         if(dummy != NULL) {
102                 dummy->decl_state();
103         }
104         if(kanji != NULL) {
105                 kanji->decl_state();
106         }
107         if(joy != NULL) {
108                 joy->decl_state();
109         }
110         for(int i = 0; i < 2; i++) {
111                 if(rampac2[i] != NULL) {
112                         rampac2[i]->decl_state();
113                 }
114         }
115         leave_decl_state();
116 }
117
118 void PAC2::save_state(FILEIO* state_fio)
119 {
120         if(state_entry != NULL) {
121                 state_entry->save_state(state_fio);
122         }
123 //      state_fio->FputUint32(STATE_VERSION);
124 //      state_fio->FputInt32(this_device_id);
125         
126 //      state_fio->FputInt32(sel);
127         rampac2[0]->save_state(state_fio);
128         rampac2[1]->save_state(state_fio);
129         kanji->save_state(state_fio);
130 }
131
132 bool PAC2::load_state(FILEIO* state_fio)
133 {
134         bool mb = false;
135         if(state_entry != NULL) {
136                 mb = state_entry->load_state(state_fio);
137         }
138         if(!mb) return false;
139 //      if(state_fio->FgetUint32() != STATE_VERSION) {
140 //              return false;
141 //      }
142 //      if(state_fio->FgetInt32() != this_device_id) {
143 //              return false;
144 //      }
145 //      sel = state_fio->FgetInt32();
146         if(!rampac2[0]->load_state(state_fio)) {
147                 return false;
148         }
149         if(!rampac2[1]->load_state(state_fio)) {
150                 return false;
151         }
152         if(!kanji->load_state(state_fio)) {
153                 return false;
154         }
155         return true;
156 }
157
158 bool PAC2::process_state(FILEIO* state_fio, bool loading)
159 {
160         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
161                 return false;
162         }
163         if(!state_fio->StateCheckInt32(this_device_id)) {
164                 return false;
165         }
166         state_fio->StateInt32(sel);
167         if(!rampac2[0]->process_state(state_fio, loading)) {
168                 return false;
169         }
170         if(!rampac2[1]->process_state(state_fio, loading)) {
171                 return false;
172         }
173         if(!kanji->process_state(state_fio, loading)) {
174                 return false;
175         }
176         return true;
177 }