OSDN Git Service

[VM][General][WIP] Start to merge upstream 2018-10-14.Open branch upstream_20181014 .
[csp-qt/common_source_project-fm7.git] / source / src / vm / z80tvgame / memory.cpp
1 /*
2         Homebrew Z80 TV GAME SYSTEM Emulator 'eZ80TVGAME'
3
4         Author : Takeda.Toshiya
5         Date   : 2015.04.28-
6
7         [ memory ]
8 */
9
10 // http://w01.tp1.jp/~a571632211/z80tvgame/index.html
11
12 #include "memory.h"
13
14 namespace Z80TVGAME {
15
16 #define SET_BANK(s, e, w, r) { \
17         int sb = (s) >> 12, eb = (e) >> 12; \
18         for(int i = sb; i <= eb; i++) { \
19                 if((w) == wdmy) { \
20                         wbank[i] = wdmy; \
21                 } else { \
22                         wbank[i] = (w) + 0x1000 * (i - sb); \
23                 } \
24                 if((r) == rdmy) { \
25                         rbank[i] = rdmy; \
26                 } else { \
27                         rbank[i] = (r) + 0x1000 * (i - sb); \
28                 } \
29         } \
30 }
31
32 void MEMORY::initialize()
33 {
34         memset(rom, 0xff, sizeof(rom));
35         memset(rdmy, 0xff, sizeof(rdmy));
36         
37         // set memory map
38         SET_BANK(0x0000, 0x7fff, wdmy, rom);
39         SET_BANK(0x8000, 0xdfff, ram, ram);
40         SET_BANK(0xe000, 0xffff, wdmy, rdmy);
41         
42         inserted = false;
43 }
44
45 void MEMORY::reset()
46 {
47         memset(ram, 0, sizeof(ram));
48 }
49
50 void MEMORY::write_data8(uint32_t addr, uint32_t data)
51 {
52         addr &= 0xffff;
53         wbank[addr >> 12][addr & 0xfff] = data;
54 }
55
56 uint32_t MEMORY::read_data8(uint32_t addr)
57 {
58         addr &= 0xffff;
59         return rbank[addr >> 12][addr & 0xfff];
60 }
61
62 void MEMORY::open_cart(const _TCHAR* file_path)
63 {
64         FILEIO* fio = new FILEIO();
65         
66         if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
67                 memset(rom, 0xff, sizeof(rom));
68                 fio->Fread(rom, sizeof(rom), 1);
69                 fio->Fclose();
70                 inserted = true;
71         }
72         delete fio;
73 }
74
75 void MEMORY::close_cart()
76 {
77         memset(rom, 0xff, sizeof(rom));
78         inserted = false;
79 }
80
81 void MEMORY::draw_screen()
82 {
83         // draw screen
84         emu->set_vm_screen_lines(210);
85         
86         scrntype_t col_w = RGB_COLOR(255, 255, 255);
87         scrntype_t col_b = 0;
88         
89         emu->set_vm_screen_lines(210);
90         for(int y = 0, offset = 0x403c; y < 210; y++, offset += 30) {
91                 scrntype_t* dest = emu->get_screen_buffer(y) - 30;
92                 // (30 * 8 - 176) / 2 = 32
93                 for(int x = 32; x < 240 - 32; x++) {
94                         uint8_t val = ram[offset + (x >> 3)];
95                         uint8_t bit = 1 << (x & 7);
96                         dest[x] = (val & bit) ? col_w : col_b;
97                 }
98         }
99 }
100
101 #define STATE_VERSION   1
102
103 bool MEMORY::process_state(FILEIO* state_fio, bool loading)
104 {
105         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
106                 return false;
107         }
108         if(!state_fio->StateCheckInt32(this_device_id)) {
109                 return false;
110         }
111         state_fio->StateArray(ram, sizeof(ram), 1);
112         state_fio->StateValue(inserted);
113         return true;
114 }
115
116 }