OSDN Git Service

[GENERAL] Merge upstream 2018-02-27.
[csp-qt/common_source_project-fm7.git] / source / src / vm / pc9801 / display.h
1 /*
2         NEC PC-9801 Emulator 'ePC-9801'
3         NEC PC-9801E/F/M Emulator 'ePC-9801E'
4         NEC PC-9801U Emulator 'ePC-9801U'
5         NEC PC-9801VF Emulator 'ePC-9801VF'
6         NEC PC-9801VM Emulator 'ePC-9801VM'
7         NEC PC-9801VX Emulator 'ePC-9801VX'
8         NEC PC-98DO Emulator 'ePC-98DO'
9
10         Author : Takeda.Toshiya
11         Date   : 2010.09.16-
12
13         [ display ]
14 */
15
16 #ifndef _DISPLAY_H_
17 #define _DISPLAY_H_
18
19 #include "../vm.h"
20 #include "../../emu.h"
21 #include "../device.h"
22
23 class UPD7220;
24
25 class DISPLAY : public DEVICE
26 {
27 private:
28         DEVICE *d_pic;
29         UPD7220 *d_gdc_chr, *d_gdc_gfx;
30         uint8_t *ra_chr;
31         uint8_t *ra_gfx, *cs_gfx;
32         
33         uint8_t tvram[0x4000];
34 #if !defined(SUPPORT_HIRESO)
35 #if defined(SUPPORT_2ND_VRAM)
36         uint8_t vram[0x40000];
37 #else
38         uint8_t vram[0x20000];
39 #endif
40 #else
41         uint8_t vram[0x80000];
42 #endif
43         
44 #if defined(SUPPORT_2ND_VRAM) && !defined(SUPPORT_HIRESO)
45         uint8_t vram_disp_sel;
46         uint8_t vram_draw_sel;
47 #endif
48         uint8_t *vram_disp_b;
49         uint8_t *vram_disp_r;
50         uint8_t *vram_disp_g;
51 #if defined(SUPPORT_16_COLORS)
52         uint8_t *vram_disp_e;
53 #endif
54         uint8_t *vram_draw;
55         
56         scrntype_t palette_chr[8];
57         scrntype_t palette_gfx8[8];
58         uint8_t digipal[4];
59 #if defined(SUPPORT_16_COLORS)
60         scrntype_t palette_gfx16[16];
61         uint8_t anapal[16][3], anapal_sel;
62 #endif
63         
64         uint8_t crtv;
65         uint8_t scroll[6];
66         uint8_t modereg1[8];
67 #if defined(SUPPORT_16_COLORS)
68         uint8_t modereg2[128];
69 #endif
70 #if defined(SUPPORT_GRCG)
71         uint8_t grcg_mode, grcg_tile_ptr, grcg_tile[4];
72 #endif
73 #if defined(SUPPORT_EGC)
74         typedef union {
75                 uint8_t b[2];
76                 uint16_t w;
77         } egcword_t;
78         typedef union {
79                 uint8_t b[4][2];
80                 uint16_t w[4];
81                 uint32_t d[2];
82                 uint64_t q;
83         } egcquad_t;
84         
85         uint16_t egc_access;
86         uint16_t egc_fgbg;
87         uint16_t egc_ope;
88         uint16_t egc_fg;
89         egcword_t egc_mask;
90         uint16_t egc_bg;
91         uint16_t egc_sft;
92         uint16_t egc_leng;
93         egcquad_t egc_lastvram;
94         egcquad_t egc_patreg;
95         egcquad_t egc_fgc;
96         egcquad_t egc_bgc;
97         int egc_func;
98         uint32_t egc_remain;
99         uint32_t egc_stack;
100         uint8_t* egc_inptr;
101         uint8_t* egc_outptr;
102         egcword_t egc_mask2;
103         egcword_t egc_srcmask;
104         uint8_t egc_srcbit;
105         uint8_t egc_dstbit;
106         uint8_t egc_sft8bitl;
107         uint8_t egc_sft8bitr;
108         uint8_t egc_buf[528];   /* 4096/8 + 4*4 */
109         egcquad_t egc_vram_src;
110         egcquad_t egc_vram_data;
111 #endif
112         
113         uint8_t font[0x84000];
114         uint16_t font_code;
115         uint8_t font_line;
116 //      uint16_t font_lr;
117         
118         uint8_t screen_chr[400][641];
119         uint8_t screen_gfx[400][640];
120         uint32_t gdc_addr[480][80];
121         
122         void kanji_copy(uint8_t *dst, uint8_t *src, int from, int to);
123 #if defined(SUPPORT_GRCG)
124         void grcg_writeb(uint32_t addr1, uint32_t data);
125         void grcg_writew(uint32_t addr1, uint32_t data);
126         uint32_t grcg_readb(uint32_t addr1);
127         uint32_t grcg_readw(uint32_t addr1);
128 #endif
129 #if defined(SUPPORT_EGC)
130         void egc_shift();
131         void egc_sftb_upn_sub(uint32_t ext);
132         void egc_sftb_dnn_sub(uint32_t ext);
133         void egc_sftb_upr_sub(uint32_t ext);
134         void egc_sftb_dnr_sub(uint32_t ext);
135         void egc_sftb_upl_sub(uint32_t ext);
136         void egc_sftb_dnl_sub(uint32_t ext);
137         void egc_sftb_upn0(uint32_t ext);
138         void egc_sftw_upn0();
139         void egc_sftb_dnn0(uint32_t ext);
140         void egc_sftw_dnn0();
141         void egc_sftb_upr0(uint32_t ext);
142         void egc_sftw_upr0();
143         void egc_sftb_dnr0(uint32_t ext);
144         void egc_sftw_dnr0();
145         void egc_sftb_upl0(uint32_t ext);
146         void egc_sftw_upl0();
147         void egc_sftb_dnl0(uint32_t ext);
148         void egc_sftw_dnl0();
149         void egc_sftb(int func, uint32_t ext);
150         void egc_sftw(int func);
151         void egc_shiftinput_byte(uint32_t ext);
152         void egc_shiftinput_incw();
153         void egc_shiftinput_decw();
154         uint64_t egc_ope_00(uint8_t ope, uint32_t addr);
155         uint64_t egc_ope_0f(uint8_t ope, uint32_t addr);
156         uint64_t egc_ope_c0(uint8_t ope, uint32_t addr);
157         uint64_t egc_ope_f0(uint8_t ope, uint32_t addr);
158         uint64_t egc_ope_fc(uint8_t ope, uint32_t addr);
159         uint64_t egc_ope_ff(uint8_t ope, uint32_t addr);
160         uint64_t egc_ope_nd(uint8_t ope, uint32_t addr);
161         uint64_t egc_ope_np(uint8_t ope, uint32_t addr);
162         uint64_t egc_ope_xx(uint8_t ope, uint32_t addr);
163         uint64_t egc_opefn(uint32_t func, uint8_t ope, uint32_t addr);
164         uint64_t egc_opeb(uint32_t addr, uint8_t value);
165         uint64_t egc_opew(uint32_t addr, uint16_t value);
166         uint32_t egc_readb(uint32_t addr1);
167         uint32_t egc_readw(uint32_t addr1);
168         void egc_writeb(uint32_t addr1, uint8_t value);
169         void egc_writew(uint32_t addr1, uint16_t value);
170 #endif
171         void draw_chr_screen();
172         void draw_gfx_screen();
173         
174 public:
175         DISPLAY(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
176         {
177                 set_device_name(_T("Display"));
178         }
179         ~DISPLAY() {}
180         
181         // common functions
182         void initialize();
183         void reset();
184         void event_frame();
185         void write_io8(uint32_t addr, uint32_t data);
186         uint32_t read_io8(uint32_t addr);
187         void write_memory_mapped_io8(uint32_t addr, uint32_t data);
188         void write_memory_mapped_io16(uint32_t addr, uint32_t data);
189         uint32_t read_memory_mapped_io8(uint32_t addr);
190         uint32_t read_memory_mapped_io16(uint32_t addr);
191         void write_dma_io8(uint32_t addr, uint32_t data);
192         void write_dma_io16(uint32_t addr, uint32_t data);
193         uint32_t read_dma_io8(uint32_t addr);
194         uint32_t read_dma_io16(uint32_t addr);
195         void save_state(FILEIO* state_fio);
196         bool load_state(FILEIO* state_fio);
197         
198         // unique functions
199         void set_context_pic(DEVICE *device)
200         {
201                 d_pic = device;
202         }
203         void set_context_gdc_chr(UPD7220 *device, uint8_t *ra)
204         {
205                 d_gdc_chr = device;
206                 ra_chr = ra;
207         }
208         void set_context_gdc_gfx(UPD7220 *device, uint8_t *ra, uint8_t *cs)
209         {
210                 d_gdc_gfx = device;
211                 ra_gfx = ra; cs_gfx = cs;
212         }
213         void draw_screen();
214         
215         bool sound_bios_ok;
216 };
217
218 #endif
219