OSDN Git Service

[General] Convert sourcecode's CRLF format: DOS(WINDOWS) to Unix, to apply patches...
[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 #include "../../fileio.h"
13
14 static const uint8 header[16] = {
15         0xaa, 0x1f, 0x04, 0x00, 0x04, 0x80, 0x00, 0x01, 0x04, 0x04, 0x01, 0x03, 0x08, 0x00, 0x00, 0x00
16 };
17
18 void RAMPAC2::initialize(int id)
19 {
20         opened = modified = false;
21         
22         // note: rampac2 id must be 1 or 2 !!!
23         if(_tcscmp(config.recent_binary_path[id - 1][0], _T("")) != 0) {
24                 // open last file
25                 open_file(config.recent_binary_path[id - 1][0]);
26         } else {
27                 // open default rampac2 file
28                 _TCHAR file_path[_MAX_PATH];
29                 _stprintf_s(file_path, _MAX_PATH, _T("%sRAMPAC%d.BIN"), emu->application_path(), id);
30                 open_file(file_path);
31         }
32 }
33
34 void RAMPAC2::release()
35 {
36         // save modified data
37         if(opened && modified) {
38                 FILEIO* fio = new FILEIO();
39                 if(fio->Fopen(path, FILEIO_WRITE_BINARY)) {
40                         fio->Fwrite(ram, sizeof(ram), 1);
41                         fio->Fclose();
42                 }
43                 delete fio;
44         }
45 }
46
47 void RAMPAC2::reset()
48 {
49         ptr = 0;
50 }
51
52 void RAMPAC2::write_io8(uint32 addr, uint32 data)
53 {
54         switch(addr & 0xff) {
55         case 0x18:
56                 ptr = (ptr & 0x7f00) | data;
57                 break;
58         case 0x19:
59                 ptr = (ptr & 0x00ff) | ((data & 0x7f) << 8);
60                 break;
61         case 0x1a:
62                 if(ram[ptr & 0x7fff] != data) {
63                         modified = true;
64                 }
65                 ram[ptr & 0x7fff] = data;
66                 break;
67         }
68 }
69
70 uint32 RAMPAC2::read_io8(uint32 addr)
71 {
72         return ram[ptr & 0x7fff];
73 }
74
75 void RAMPAC2::open_file(_TCHAR* file_path)
76 {
77         // save modified data
78         release();
79         
80         // load specified file
81         FILEIO* fio = new FILEIO();
82         if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
83                 fio->Fread(ram, sizeof(ram), 1);
84                 fio->Fclose();
85         } else {
86                 // initialize formatted image
87                 memset(ram, 0, sizeof(ram));
88                 memcpy(ram, header, sizeof(header));
89                 memset(ram + 0x20, 0xff, 0x200);
90                 memset(ram + 0x300, 0xfe, 0x004);
91                 memset(ram + 0x304, 0xff, 0x0fc);
92         }
93         delete fio;
94         
95         _tcscpy_s(path, _MAX_PATH, file_path);
96         opened = true;
97         modified = false;
98 }
99
100 #define STATE_VERSION   1
101
102 void RAMPAC2::save_state(FILEIO* state_fio)
103 {
104         state_fio->FputUint32(STATE_VERSION);
105         
106         state_fio->Fwrite(ram, sizeof(ram), 1);
107         state_fio->FputUint32(ptr);
108         state_fio->FputBool(opened);
109         state_fio->FputBool(modified);
110 }
111
112 bool RAMPAC2::load_state(FILEIO* state_fio)
113 {
114         if(state_fio->FgetUint32() != STATE_VERSION) {
115                 return false;
116         }
117         state_fio->Fread(ram, sizeof(ram), 1);
118         ptr = state_fio->FgetUint32();
119         opened = state_fio->FgetBool();
120         modified = state_fio->FgetBool();
121         return true;
122 }
123