OSDN Git Service

[INITIAL] Import 20141226 version of http://homepage3.nifty.com/takeda-toshiya/common...
[csp-qt/common_source_project-fm7.git] / source / src / vm / n5200 / memory.cpp
1 /*\r
2         NEC N5200 Emulator 'eN5200'\r
3 \r
4         Author : Takeda.Toshiya\r
5         Date   : 2009.06.03-\r
6 \r
7         [ memory ]\r
8 */\r
9 \r
10 #include "memory.h"\r
11 #include "../../fileio.h"\r
12 \r
13 #define SET_BANK(s, e, w, r) { \\r
14         int sb = (s) >> 11, eb = (e) >> 11; \\r
15         for(int i = sb; i <= eb; i++) { \\r
16                 if((w) == wdmy) { \\r
17                         wbank[i] = wdmy; \\r
18                 } else { \\r
19                         wbank[i] = (w) + 0x800 * (i - sb); \\r
20                 } \\r
21                 if((r) == rdmy) { \\r
22                         rbank[i] = rdmy; \\r
23                 } else { \\r
24                         rbank[i] = (r) + 0x800 * (i - sb); \\r
25                 } \\r
26         } \\r
27 }\r
28 \r
29 void MEMORY::initialize()\r
30 {\r
31         // init memory\r
32         memset(ram, 0, sizeof(ram));\r
33         memset(exram, 0, sizeof(exram));\r
34         memset(vram, 0, sizeof(vram));\r
35         memset(tvram, 0, sizeof(tvram));\r
36         memset(backup, 0, sizeof(backup));\r
37         memset(ipl, 0xff, sizeof(ipl));\r
38         memset(rdmy, 0xff, sizeof(rdmy));\r
39         \r
40         // load rom image\r
41         FILEIO* fio = new FILEIO();\r
42         if(fio->Fopen(emu->bios_path(_T("IPL.ROM")), FILEIO_READ_BINARY)) {\r
43                 fio->Fread(ipl, sizeof(ipl), 1);\r
44                 fio->Fclose();\r
45                 for(int i = 0xa8e; i < 0xafc; i++) {\r
46                         ipl[i] = 0x90;\r
47                 }\r
48         }\r
49         delete fio;\r
50 }\r
51 \r
52 void MEMORY::release()\r
53 {\r
54         // save ram image\r
55         FILEIO* fio = new FILEIO();\r
56         if(fio->Fopen(emu->bios_path(_T("TVRAM.BIN")), FILEIO_WRITE_BINARY)) {\r
57                 fio->Fwrite(tvram, sizeof(tvram), 1);\r
58                 fio->Fclose();\r
59         }\r
60         delete fio;\r
61 }\r
62 \r
63 void MEMORY::reset()\r
64 {\r
65         SET_BANK(0x000000, 0xffffff, wdmy, rdmy);\r
66         SET_BANK(0x000000, 0x0bffff, ram, ram);\r
67         SET_BANK(0x0c0000, 0x0dffff, vram, vram);       // ???\r
68         SET_BANK(0x0e0000, 0x0e77ff, tvram, tvram);\r
69         SET_BANK(0x0e7800, 0x0effff, backup, backup);\r
70         SET_BANK(0x0f0000, 0x0fffff, wdmy, ipl);\r
71         SET_BANK(0x100000, 0x1fffff, exram, exram);\r
72         SET_BANK(0xff0000, 0xffffff, wdmy, ipl);\r
73         \r
74         protect = true;\r
75 }\r
76 \r
77 void MEMORY::write_data8(uint32 addr, uint32 data)\r
78 {\r
79         addr &= 0xffffff;\r
80         if(0xe7800 <= addr && addr < 0xf0000 && protect) {\r
81                 return;\r
82         }\r
83         wbank[addr >> 11][addr & 0x7ff] = data;\r
84 }\r
85 \r
86 uint32 MEMORY::read_data8(uint32 addr)\r
87 {\r
88         addr &= 0xffffff;\r
89         return rbank[addr >> 11][addr & 0x7ff];\r
90 }\r
91 \r
92 void MEMORY::write_io8(uint32 addr, uint32 data)\r
93 {\r
94         switch(addr) {\r
95         case 0x74:\r
96                 protect = ((data & 1) != 0);\r
97                 break;\r
98         }\r
99 }\r
100 \r
101 uint32 MEMORY::read_io8(uint32 addr)\r
102 {\r
103         return 0xff;\r
104 }\r
105 \r