OSDN Git Service

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