OSDN Git Service

[General] Merge from upstream version, 2015-01-28.
[csp-qt/common_source_project-fm7.git] / source / src / vm / mz2800 / crtc.h
1 /*
2         SHARP MZ-2800 Emulator 'EmuZ-2800'
3
4         Author : Takeda.Toshiya
5         Date   : 2007.08.13 -
6
7         [ crtc ]
8 */
9
10 #ifndef _CRTC_H_
11 #define _CRTC_H_
12
13 #include "../vm.h"
14 #include "../../emu.h"
15 #include "../device.h"
16
17 #define SIG_CRTC_COLUMN_SIZE    0
18 #define SIG_CRTC_PALLETE        1
19 #define SIG_CRTC_MASK           2
20
21 class CRTC : public DEVICE
22 {
23 private:
24         DEVICE *d_pic, *d_pio;
25         
26         // vram
27         uint8 *vram_b, *vram_r, *vram_g, *vram_i;
28         uint8 *tvram;
29         // kanji rom, pcg
30         uint8 *kanji1, *kanji2;
31         uint8 *pcg0, *pcg1, *pcg2, *pcg3;
32         
33         // crtc
34         void set_hsync(int h);
35         uint8 textreg_num, textreg[16];
36         uint8 rmwreg_num[2], rmwreg[2][32];
37         uint8 cgreg_num, cgreg[32];
38         uint8 scrn_size, cg_mask;
39         bool font_size, column_size;
40         uint8 latch[2][4];
41         uint16 GDEVS, GDEVE;
42         uint8 GDEHS, GDEHE;
43         int GDEHSC, GDEHEC;
44         bool blank, hblank, vblank, blink;
45         uint8 clear_flag;
46         uint8 palette_reg[16];
47         bool pal_select;
48         bool screen_mask;
49         
50         // priority and palette
51         uint8 priority16[16][9];
52         scrntype palette16[16+8], palette4096[16];
53         uint8 palette4096r[16], palette4096g[16], palette4096b[16];
54         scrntype palette16txt[9], palette4096txt[9];
55         scrntype palette16pri[16][9], palette4096pri[16][9];
56         scrntype palette65536[0x10000]; // BRGI
57         uint8 prev16;
58         bool update16;
59         
60         // draw text
61         void draw_text();
62         void draw_80column_screen();
63         void draw_40column_screen();
64         void draw_80column_font(uint16 src, int dest, int y);
65         void draw_40column_font(uint16 src, int dest, int y);
66         uint8 text[640*480*2];
67         
68         // draw cg
69         void draw_cg();
70         uint16 cg[640*400*2];
71         uint32 map_addr[400][80];
72         uint8 map_hdsc[400][80];
73         
74         // speed optimize
75         uint8 cg_matrix0[256][256][8];
76         uint8 cg_matrix1[256][256][8];
77         uint8 cg_matrix2[256][256][8];
78         uint8 cg_matrix3[256][256][8];
79         uint8 text_matrix[256][8][8];
80         uint8 text_matrixw[256][8][16];
81         uint8 trans_color;
82         bool map_init, trans_init;
83         
84 public:
85         CRTC(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) {}
86         ~CRTC() {}
87         
88         // common functions
89         void initialize();
90         void write_data8(uint32 addr, uint32 data);
91         uint32 read_data8(uint32 addr);
92         void write_io8(uint32 addr, uint32 data);
93         void write_signal(int id, uint32 data, uint32 mask);
94         void event_callback(int event_id, int err);
95         void event_vline(int v, int clock);
96         void save_state(FILEIO* state_fio);
97         bool load_state(FILEIO* state_fio);
98         
99         // unique functions
100         void set_context_pic(DEVICE* device)
101         {
102                 d_pic = device;
103         }
104         void set_context_pio(DEVICE* device)
105         {
106                 d_pio = device;
107         }
108         void set_vram_ptr(uint8* ptr)
109         {
110                 vram_b = ptr + 0x00000;
111                 vram_r = ptr + 0x20000;
112                 vram_g = ptr + 0x40000;
113                 vram_i = ptr + 0x60000;
114         }
115         void set_tvram_ptr(uint8* ptr)
116         {
117                 tvram = ptr;
118         }
119         void set_kanji_ptr(uint8* ptr)
120         {
121                 kanji1 = ptr + 0x00000;
122                 kanji2 = ptr + 0x40000;
123         }
124         void set_pcg_ptr(uint8* ptr)
125         {
126                 pcg0 = ptr + 0x0000;
127                 pcg1 = ptr + 0x1000;
128                 pcg2 = ptr + 0x2000;
129                 pcg3 = ptr + 0x3000;
130         }
131         void draw_screen();
132 };
133
134 #endif
135