OSDN Git Service

336ea6200a3ab91f2a0db3c8c28c56091c7bca12
[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_t *vram_b, *vram_r, *vram_g, *vram_i;
28         uint8_t *tvram;
29         // kanji rom, pcg
30         uint8_t *kanji1, *kanji2;
31         uint8_t *pcg0, *pcg1, *pcg2, *pcg3;
32         
33         // crtc
34         void set_hsync(int h);
35         uint8_t textreg_num, textreg[16];
36         uint8_t rmwreg_num[2], rmwreg[2][32];
37         uint8_t cgreg_num, cgreg[32];
38         uint8_t scrn_size, cg_mask;
39         bool font_size, column_size;
40         uint8_t latch[2][4];
41         uint16_t GDEVS, GDEVE;
42         uint8_t GDEHS, GDEHE;
43         int GDEHSC, GDEHEC;
44         bool blank, hblank, vblank, blink;
45         uint8_t clear_flag;
46         uint8_t palette_reg[16];
47         bool pal_select;
48         bool screen_mask;
49         
50         // priority and palette
51         uint8_t priority16[16][9];
52         scrntype_t palette16[16+8], palette4096[16];
53         uint8_t palette4096r[16], palette4096g[16], palette4096b[16];
54         scrntype_t palette16txt[9], palette4096txt[9];
55         scrntype_t palette16pri[16][9], palette4096pri[16][9];
56         scrntype_t palette65536[0x10000];       // BRGI
57         uint8_t 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_t src, int dest, int y);
65         void draw_40column_font(uint16_t src, int dest, int y);
66         uint8_t text[640*480*2];
67         
68         // draw cg
69         void draw_cg();
70         uint16_t cg[640*400*2];
71         uint32_t map_addr[400][80];
72         uint8_t map_hdsc[400][80];
73         
74         // speed optimize
75         uint8_t cg_matrix0[256][256][8];
76         uint8_t cg_matrix1[256][256][8];
77         uint8_t cg_matrix2[256][256][8];
78         uint8_t cg_matrix3[256][256][8];
79         uint8_t text_matrix[256][8][8];
80         uint8_t text_matrixw[256][8][16];
81         uint8_t trans_color;
82         bool map_init, trans_init;
83         
84 public:
85         CRTC(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
86         {
87                 set_device_name(_T("CRTC"));
88         }
89         ~CRTC() {}
90         
91         // common functions
92         void initialize();
93         void write_data8(uint32_t addr, uint32_t data);
94         uint32_t read_data8(uint32_t addr);
95         void write_io8(uint32_t addr, uint32_t data);
96         void write_signal(int id, uint32_t data, uint32_t mask);
97         void event_callback(int event_id, int err);
98         void event_vline(int v, int clock);
99         bool process_state(FILEIO* state_fio, bool loading);
100         
101         // unique functions
102         void set_context_pic(DEVICE* device)
103         {
104                 d_pic = device;
105         }
106         void set_context_pio(DEVICE* device)
107         {
108                 d_pio = device;
109         }
110         void set_vram_ptr(uint8_t* ptr)
111         {
112                 vram_b = ptr + 0x00000;
113                 vram_r = ptr + 0x20000;
114                 vram_g = ptr + 0x40000;
115                 vram_i = ptr + 0x60000;
116         }
117         void set_tvram_ptr(uint8_t* ptr)
118         {
119                 tvram = ptr;
120         }
121         void set_kanji_ptr(uint8_t* ptr)
122         {
123                 kanji1 = ptr + 0x00000;
124                 kanji2 = ptr + 0x40000;
125         }
126         void set_pcg_ptr(uint8_t* ptr)
127         {
128                 pcg0 = ptr + 0x0000;
129                 pcg1 = ptr + 0x1000;
130                 pcg2 = ptr + 0x2000;
131                 pcg3 = ptr + 0x3000;
132         }
133         void draw_screen();
134 };
135
136 #endif
137