OSDN Git Service

[VM][X1] Copy VRAMs to shadow data at starting a frame.Reduce flickering a lot.
[csp-qt/common_source_project-fm7.git] / source / src / vm / x1 / display.h
1 /*
2         SHARP X1 Emulator 'eX1'
3         SHARP X1twin Emulator 'eX1twin'
4         SHARP X1turbo Emulator 'eX1turbo'
5         SHARP X1turboZ Emulator 'eX1turboZ'
6
7         Author : Takeda.Toshiya
8         Date   : 2009.03.14-
9
10         [ display ]
11 */
12
13 #ifndef _DISPLAY_H_
14 #define _DISPLAY_H_
15
16 #include "../vm.h"
17 #include "../../emu.h"
18 #include "../device.h"
19
20 #define SIG_DISPLAY_VBLANK              0
21 #define SIG_DISPLAY_COLUMN40            1
22 #define SIG_DISPLAY_DETECT_VBLANK       2
23 #define SIG_DISPLAY_DISP                3
24
25 class HD46505;
26
27 class DISPLAY : public DEVICE
28 {
29 private:
30 #ifdef _X1TURBO_FEATURE
31         DEVICE *d_cpu;
32 #endif
33         HD46505 *d_crtc;
34         uint8_t* regs;
35         uint8_t vram_t[0x800];
36         uint8_t vram_a[0x800];
37 #ifdef _X1TURBO_FEATURE
38         uint8_t vram_k[0x800];
39 #endif
40         uint8_t* vram_ptr;
41         uint8_t pcg_b[256][8];
42         uint8_t pcg_r[256][8];
43         uint8_t pcg_g[256][8];
44 #ifdef _X1TURBO_FEATURE
45         uint8_t gaiji_b[128][16];
46         uint8_t gaiji_r[128][16];
47         uint8_t gaiji_g[128][16];
48 #endif
49         uint8_t font[0x800];
50         uint8_t kanji[0x4bc00];
51         
52         uint8_t cur_code, cur_line;
53         
54         int kaddr, kofs, kflag;
55         uint8_t* kanji_ptr;
56         
57         uint8_t pal[3];
58         uint8_t priority, pri[8][8];    // pri[cg][txt]
59         uint8_t dr_priority;
60         
61         bool column40;
62 #ifdef _X1TURBO_FEATURE
63         uint8_t mode1, mode2;
64         bool hireso;
65 #endif
66 #ifdef _X1TURBOZ
67         uint8_t zmode1;
68         uint8_t zpriority;
69         uint8_t zadjust;
70         uint8_t zmosaic;
71         uint8_t zchromakey;
72         uint8_t zscroll;
73         uint8_t zmode2;
74         uint8_t ztpal[8];
75         uint8_t dr_zpriority;
76
77         struct {
78                 uint8_t b, r, g;
79         } zpal[4096];
80         int zpal_num;
81 #endif
82         
83 #ifdef _X1TURBO_FEATURE
84         uint8_t text[400][640];
85         uint8_t cg[400][640];
86         uint8_t pri_line[400][8][8];
87
88         
89         uint8_t dr_text[400][640];
90         uint8_t dr_cg[400][640];
91         uint8_t dr_pri_line[400][8][8];
92 #else
93         uint8_t text[200][640+8];
94         uint8_t cg[200][640];
95         uint8_t pri_line[200][8][8];
96
97         uint8_t dr_text[200][640+8];
98         uint8_t dr_cg[200][640];
99         uint8_t dr_pri_line[200][8][8];
100 #endif
101 #ifdef _X1TURBOZ
102         uint16_t zcg[2][400][640];
103         bool aen_line[400];
104         scrntype_t zpalette_pc[8+8+4096];       // 0-7:text, 8-15:cg, 16-:4096cg
105
106         uint16_t dr_zcg[2][400][640];
107         bool dr_aen_line[400];
108         scrntype_t dr_zpalette_pc[8+8+4096];    // 0-7:text, 8-15:cg, 16-:4096cg
109 #endif
110         scrntype_t palette_pc[8+8];             // 0-7:text, 8-15:cg
111         scrntype_t dr_palette_pc[8+8];          // 0-7:text, 8-15:cg
112         bool prev_vert_double;
113         int raster, cblink;
114         
115         int ch_height; // HD46505
116         int hz_total, hz_disp, vt_disp;
117         int st_addr;
118         uint32_t vblank_clock;
119         int cur_vline;
120         bool cur_blank;
121         
122         void update_crtc();
123         void update_pal();
124         uint8_t get_cur_font(uint32_t addr);
125         void get_cur_pcg(uint32_t addr);
126         void get_cur_code_line();
127         
128         void draw_line(int v);
129         void draw_text(int y);
130         void draw_cg(int line, int plane);
131         
132 #ifdef _X1TURBOZ
133         int get_zpal_num(uint32_t addr, uint32_t data);
134         scrntype_t get_zpriority(uint8_t text, uint16_t cg0, uint16_t cg1);
135 #endif
136         
137         // kanji rom (from X1EMU by KM)
138         void write_kanji(uint32_t addr, uint32_t data);
139         uint32_t read_kanji(uint32_t addr);
140         
141         uint16_t jis2adr_x1(uint16_t jis);
142         uint32_t adr2knj_x1(uint16_t adr);
143 #ifdef _X1TURBO_FEATURE
144         uint32_t adr2knj_x1t(uint16_t adr);
145 #endif
146         uint32_t jis2knj(uint16_t jis);
147         uint16_t jis2sjis(uint16_t jis);
148         
149 public:
150         DISPLAY(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
151         {
152                 set_device_name(_T("Display"));
153         }
154         ~DISPLAY() {}
155         
156         // common functions
157         void initialize();
158         void reset();
159         void write_io8(uint32_t addr, uint32_t data);
160         uint32_t read_io8(uint32_t addr);
161         void write_signal(int id, uint32_t data, uint32_t mask);
162         void event_frame();
163         void event_vline(int v, int clock);
164 #ifdef _X1TURBO_FEATURE
165         void event_callback(int event_id, int err);
166 #endif
167         void save_state(FILEIO* state_fio);
168         bool load_state(FILEIO* state_fio);
169         
170         // unique functions
171 #ifdef _X1TURBO_FEATURE
172         void set_context_cpu(DEVICE* device)
173         {
174                 d_cpu = device;
175         }
176 #endif
177         void set_context_crtc(HD46505* device)
178         {
179                 d_crtc = device;
180         }
181         void set_vram_ptr(uint8_t* ptr)
182         {
183                 vram_ptr = ptr;
184         }
185         void set_regs_ptr(uint8_t* ptr)
186         {
187                 regs = ptr;
188         }
189         void draw_screen();
190 };
191
192 #endif
193