OSDN Git Service

[VM][STATE] Use namespace {VMNAME} to separate per VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / pasopia7 / rampac2.cpp
1 /*
2         TOSHIBA PASOPIA Emulator 'EmuPIA'
3         TOSHIBA PASOPIA 7 Emulator 'EmuPIA7'
4
5         Author : Takeda.Toshiya
6         Date   : 2006.09.20 -
7
8         [ ram pac 2 (32kbytes) ]
9 */
10
11 #include "rampac2.h"
12
13 namespace PASOPIA7 {
14
15 static const uint8_t header[16] = {
16         0xaa, 0x1f, 0x04, 0x00, 0x04, 0x80, 0x00, 0x01, 0x04, 0x04, 0x01, 0x03, 0x08, 0x00, 0x00, 0x00
17 };
18
19 void RAMPAC2::initialize(int id)
20 {
21         opened = modified = false;
22         
23         // note: rampac2 id must be 1 or 2 !!!
24         if(_tcscmp(config.recent_binary_path[id - 1][0], _T("")) != 0) {
25                 // open last file
26                 open_file(config.recent_binary_path[id - 1][0]);
27         } else {
28                 // open default rampac2 file
29                 open_file(create_local_path(_T("RAMPAC%d.BIN"), id));
30         }
31 }
32
33 void RAMPAC2::release()
34 {
35         // save modified data
36         if(opened && modified) {
37                 FILEIO* fio = new FILEIO();
38                 if(fio->Fopen(path, FILEIO_WRITE_BINARY)) {
39                         fio->Fwrite(ram, sizeof(ram), 1);
40                         fio->Fclose();
41                 }
42                 delete fio;
43         }
44 }
45
46 void RAMPAC2::reset()
47 {
48         ptr = 0;
49 }
50
51 void RAMPAC2::write_io8(uint32_t addr, uint32_t data)
52 {
53         switch(addr & 0xff) {
54         case 0x18:
55                 ptr = (ptr & 0x7f00) | data;
56                 break;
57         case 0x19:
58                 ptr = (ptr & 0x00ff) | ((data & 0x7f) << 8);
59                 break;
60         case 0x1a:
61                 if(ram[ptr & 0x7fff] != data) {
62                         modified = true;
63                 }
64                 ram[ptr & 0x7fff] = data;
65                 break;
66         }
67 }
68
69 uint32_t RAMPAC2::read_io8(uint32_t addr)
70 {
71         return ram[ptr & 0x7fff];
72 }
73
74 void RAMPAC2::open_file(const _TCHAR* file_path)
75 {
76         // save modified data
77         release();
78         
79         // load specified file
80         FILEIO* fio = new FILEIO();
81         if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
82                 fio->Fread(ram, sizeof(ram), 1);
83                 fio->Fclose();
84         } else {
85                 // initialize formatted image
86                 memset(ram, 0, sizeof(ram));
87                 memcpy(ram, header, sizeof(header));
88                 memset(ram + 0x20, 0xff, 0x200);
89                 memset(ram + 0x300, 0xfe, 0x004);
90                 memset(ram + 0x304, 0xff, 0x0fc);
91         }
92         delete fio;
93         
94         my_tcscpy_s(path, _MAX_PATH, file_path);
95         opened = true;
96         modified = false;
97 }
98
99 #define STATE_VERSION   1
100
101 bool RAMPAC2::process_state(FILEIO* state_fio, bool loading)
102 {
103         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
104                 return false;
105         }
106         state_fio->StateBuffer(ram, sizeof(ram), 1);
107         state_fio->StateUint32(ptr);
108         state_fio->StateBool(opened);
109         state_fio->StateBool(modified);
110         return true;
111 }
112
113 }