OSDN Git Service

e23d257e15d8ffb658fcf8dfb4ee07ad191e3202
[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         PrepareReverseBitTransTableScrnType(&pixel_trans_table, RGB_COLOR(255, 255, 255), RGB_COLOR(0,0,0) );
45 }
46
47 void MEMORY::reset()
48 {
49         memset(ram, 0, sizeof(ram));
50 }
51
52 void MEMORY::write_data8(uint32_t addr, uint32_t data)
53 {
54         addr &= 0xffff;
55         wbank[addr >> 12][addr & 0xfff] = data;
56 }
57
58 uint32_t MEMORY::read_data8(uint32_t addr)
59 {
60         addr &= 0xffff;
61         return rbank[addr >> 12][addr & 0xfff];
62 }
63
64 void MEMORY::open_cart(const _TCHAR* file_path)
65 {
66         FILEIO* fio = new FILEIO();
67         
68         if(fio->Fopen(file_path, FILEIO_READ_BINARY)) {
69                 memset(rom, 0xff, sizeof(rom));
70                 fio->Fread(rom, sizeof(rom), 1);
71                 fio->Fclose();
72                 inserted = true;
73         }
74         delete fio;
75 }
76
77 void MEMORY::close_cart()
78 {
79         memset(rom, 0xff, sizeof(rom));
80         inserted = false;
81 }
82
83 void MEMORY::draw_screen()
84 {
85         // draw screen
86         emu->set_vm_screen_lines(210);
87         
88         scrntype_t col_w = RGB_COLOR(255, 255, 255);
89         scrntype_t col_b = RGB_COLOR(0, 0, 0);
90         
91         emu->set_vm_screen_lines(210);
92         for(int y = 0, offset = 0x403c; y < 210; y++, offset += 30) {
93                 scrntype_t* dest = emu->get_screen_buffer(y) - 30;
94                 // (30 * 8 - 176) / 2 = 32
95 #if 0           
96                 for(int x = 32; x < 240 - 32; x++) {
97                         uint8_t val = ram[offset + (x >> 3)];
98                         uint8_t bit = 1 << (x & 7);
99                         dest[x] = (val & bit) ? col_w : col_b;
100                 }
101 #else
102                 scrntype_vec8_t d;
103                 for(int xx = 32; xx < (240 - 32); xx += 8) {
104                         uint8_t val = ram[offset + (xx >> 3)];
105                         d = ConvertByteToPackedPixel_PixelTbl(val, &pixel_trans_table);
106                         for(int i = 0; i < 8; i++) {
107                                 dest[xx + i] = d.w[i];
108                         }
109                 }
110 #endif
111         }
112 }
113
114 #define STATE_VERSION   1
115
116 bool MEMORY::process_state(FILEIO* state_fio, bool loading)
117 {
118         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
119                 return false;
120         }
121         if(!state_fio->StateCheckInt32(this_device_id)) {
122                 return false;
123         }
124         state_fio->StateArray(ram, sizeof(ram), 1);
125         state_fio->StateValue(inserted);
126         return true;
127 }
128
129 }