OSDN Git Service

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