OSDN Git Service

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