OSDN Git Service

[VM][WIP] Use namespace to devices per VMs.
[csp-qt/common_source_project-fm7.git] / source / src / vm / fmr50 / memory.h
1 /*
2         FUJITSU FMR-50 Emulator 'eFMR-50'
3         FUJITSU FMR-60 Emulator 'eFMR-60'
4
5         Author : Takeda.Toshiya
6         Date   : 2008.04.29 -
7
8         [ memory ]
9 */
10
11 #ifndef _FMR50_MEMORY_H_
12 #define _FMR50_MEMORY_H_
13
14 #include "../vm.h"
15 #include "../../emu.h"
16 #include "../device.h"
17
18 #define SIG_MEMORY_DISP         0
19 #define SIG_MEMORY_VSYNC        1
20
21 #if defined(HAS_I286)
22 class I286;
23 #else
24 class I386;
25 #endif
26
27 namespace FMR50 {
28         
29 class MEMORY : public DEVICE
30 {
31 private:
32 #if defined(HAS_I286)
33         I286 *d_cpu;
34 #else
35         I386 *d_cpu;
36 #endif
37         DEVICE *d_crtc;
38         
39         uint8_t* rbank[8192];   // 16MB / 2KB
40         uint8_t* wbank[8192];
41         uint8_t wdmy[0x800];
42         uint8_t rdmy[0x800];
43         
44         uint8_t ram[0x400000];  // RAM 1+3MB
45 #ifdef _FMR60
46         uint8_t vram[0x80000];  // VRAM 512KB
47         uint8_t cvram[0x2000];
48         uint8_t avram[0x2000];
49 #else
50         uint8_t vram[0x40000];  // VRAM 256KB
51         uint8_t cvram[0x1000];
52         uint8_t kvram[0x1000];
53         uint8_t dummy[0x8000];  // dummy plane
54 #endif
55         uint8_t ipl[0x4000];    // IPL 16KB
56 #ifdef _FMR60
57         uint8_t ank24[0x3000];          // ANK(14x24)
58         uint8_t kanji24[0x240000];      // KANJI(24x24)
59 #else
60         uint8_t ank8[0x800];    // ANK(8x8) 2KB
61         uint8_t ank16[0x1000];  // ANK(8x16) 4KB
62         uint8_t kanji16[0x40000];       // KANJI(16x16) 256KB
63 #endif
64         uint8_t machine_id;     // MACHINE ID
65         
66         // memory
67         uint8_t protect, rst;
68         uint8_t mainmem, rplane, wplane;
69         uint8_t dma_addr_reg, dma_wrap_reg;
70         uint32_t dma_addr_mask;
71         
72         // crtc
73         uint8_t* chreg;
74         bool disp, vsync;
75         int blink;
76         
77         // video
78         uint8_t apal[16][3], apalsel, dpal[8];
79         uint8_t outctrl;
80         
81 #ifndef _FMR60
82         // 16bit card
83         uint8_t pagesel, ankcg;
84         uint8_t dispctrl;
85         uint8_t mix;
86         uint16_t accaddr, dispaddr;
87         
88         // kanji
89         int kj_h, kj_l, kj_ofs, kj_row;
90         
91         // logical operation
92         uint8_t cmdreg, imgcol, maskreg, compreg[8], compbit, bankdis, tilereg[3];
93         uint16_t lofs, lsty, lsx, lsy, lex, ley;
94         void point(int x, int y, int col);
95         void line();
96 #endif
97         
98         uint8_t screen_txt[SCREEN_HEIGHT][SCREEN_WIDTH + 14];
99         uint8_t screen_cg[SCREEN_HEIGHT][SCREEN_WIDTH];
100 //      uint8_t screen_txt[400][648];
101 //      uint8_t screen_cg[400][640];
102         scrntype_t palette_txt[16];
103         scrntype_t palette_cg[16];
104         
105         void update_bank();
106         void update_dma_addr_mask();
107 #ifdef _FMR60
108         void draw_text();
109 #else
110         void draw_text40();
111         void draw_text80();
112 #endif
113         void draw_cg();
114         
115 public:
116         MEMORY(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) 
117         {
118                 set_device_name(_T("Memory Bus"));
119         }
120         ~MEMORY() {}
121         
122         // common functions
123         void initialize();
124         void reset();
125         void write_data8(uint32_t addr, uint32_t data);
126         uint32_t read_data8(uint32_t addr);
127         void write_dma_data8(uint32_t addr, uint32_t data);
128         uint32_t read_dma_data8(uint32_t addr);
129         void write_io8(uint32_t addr, uint32_t data);
130         uint32_t read_io8(uint32_t addr);
131         void write_signal(int id, uint32_t data, uint32_t mask);
132         void event_frame();
133         bool process_state(FILEIO* state_fio, bool loading);
134         
135         // unique functions
136 #if defined(HAS_I286)
137         void set_context_cpu(I286* device)
138 #else
139         void set_context_cpu(I386* device)
140 #endif
141         {
142                 d_cpu = device;
143         }
144         void set_machine_id(uint8_t id)
145         {
146                 machine_id = id;
147         }
148         void set_context_crtc(DEVICE* device)
149         {
150                 d_crtc = device;
151         }
152         void set_chregs_ptr(uint8_t* ptr)
153         {
154                 chreg = ptr;
155         }
156         uint8_t* get_vram()
157         {
158                 return vram;
159         }
160         uint8_t* get_cvram()
161         {
162                 return cvram;
163         }
164 #ifdef _FMR60
165         uint8_t* get_avram()
166         {
167                 return avram;
168         }
169 #else
170         uint8_t* get_kvram()
171         {
172                 return kvram;
173         }
174 #endif
175         void draw_screen();
176 };
177
178 }
179
180 #endif
181