OSDN Git Service

[VM][STATE] Apply new framework to some VMs.
[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 bool PAC2::process_state(FILEIO* state_fio, bool loading)
94 {
95         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
96                 return false;
97         }
98         if(!state_fio->StateCheckInt32(this_device_id)) {
99                 return false;
100         }
101         state_fio->StateInt32(sel);
102         if(!rampac2[0]->process_state(state_fio, loading)) {
103                 return false;
104         }
105         if(!rampac2[1]->process_state(state_fio, loading)) {
106                 return false;
107         }
108         if(!kanji->process_state(state_fio, loading)) {
109                 return false;
110         }
111         return true;
112 }