2 * Common source code project -> FM-7 -> Display
3 * (C) 2015 K.Ohta <whatisthis.sowhat _at_ gmail.com>
5 * Feb 10, 2015 : Initial.
8 #ifndef _CSP_FM7_DISPLAY_H
9 #define _CSP_FM7_DISPLAY_H
11 #include "../../common.h"
12 #include "../device.h"
13 #include "../mc6809.h"
14 #include "fm7_common.h"
17 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
18 #define __FM7_GVRAM_PAG_SIZE (0x2000 * 24)
19 #elif defined(_FM77AV40)
20 #define __FM7_GVRAM_PAG_SIZE (0x2000 * 18)
21 #elif defined(_FM77AV_VARIANTS)
22 #define __FM7_GVRAM_PAG_SIZE (0x2000 * 12)
24 #define __FM7_GVRAM_PAG_SIZE (0x4000 * 3)
37 class DISPLAY: public DEVICE
41 uint16_t bit_trans_table_0[256][8];
42 uint16_t bit_trans_table_1[256][8];
43 uint16_t bit_trans_table_2[256][8];
44 uint16_t bit_trans_table_3[256][8];
45 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
46 uint16_t bit_trans_table_4[256][8];
47 uint16_t bit_trans_table_5[256][8];
50 uint32_t (DISPLAY::*read_cpu_func_table[512])(uint32_t);
51 uint32_t (DISPLAY::*read_dma_func_table[512])(uint32_t);
52 void (DISPLAY::*write_cpu_func_table[512])(uint32_t, uint8_t);
53 void (DISPLAY::*write_dma_func_table[512])(uint32_t, uint8_t);
56 bool screen_update_flag;
61 void setup_display_mode(void);
66 void set_multimode(uint8_t val);
67 uint8_t get_multimode(void);
68 uint8_t get_cpuaccessmask(void);
69 void set_dpalette(uint32_t addr, uint8_t val);
70 uint8_t get_dpalette(uint32_t addr);
71 void enter_display(void);
72 void leave_display(void);
73 void halt_subsystem(void);
74 void restart_subsystem(void);
75 void set_crtflag(void);
76 void reset_crtflag(void);
77 uint8_t acknowledge_irq(void);
79 uint8_t attention_irq(void);
80 void set_cyclesteal(uint8_t val);
81 uint8_t set_vramaccess(void);
82 void reset_vramaccess(void);
83 uint8_t reset_subbusy(void);
84 void set_subbusy(void);
85 void reset_some_devices(void);
86 void reset_subcpu(bool _check_firq);
87 void setup_400linemode(uint8_t val);
89 #if defined(_FM77AV_VARIANTS)
90 void alu_write_cmdreg(uint32_t val);
91 void alu_write_logical_color(uint8_t val);
92 void alu_write_mask_reg(uint8_t val);
93 void alu_write_cmpdata_reg(int addr, uint8_t val);
94 void alu_write_disable_reg(uint8_t val);
95 void alu_write_tilepaint_data(uint32_t addr, uint8_t val);
96 void alu_write_offsetreg_hi(uint8_t val);
97 void alu_write_offsetreg_lo(uint8_t val);
98 void alu_write_linepattern_hi(uint8_t val);
99 void alu_write_linepattern_lo(uint8_t val);
100 void alu_write_line_position(int addr, uint8_t val);
102 uint8_t get_miscreg(void);
103 void set_miscreg(uint8_t val);
104 void set_monitor_bank(uint8_t var);
105 void set_apalette_index_hi(uint8_t val);
106 void set_apalette_index_lo(uint8_t val);
107 void set_apalette_b(uint8_t val);
108 void set_apalette_r(uint8_t val);
109 void set_apalette_g(uint8_t val);
110 void calc_apalette(uint16_t idx);
112 #endif // _FM77AV_VARIANTS
114 void copy_vram_all();
115 void copy_vram_per_line(int begin, int end);
116 void copy_vram_blank_area(void);
129 int active_page; // GVRAM is Double-Buffer.
130 uint32_t page_offset;
132 uint32_t pagemod_mask;
135 uint8_t frame_skip_count_draw;
136 uint8_t frame_skip_count_transfer;
137 bool need_transfer_line;
138 bool palette_changed;
143 //#if defined(_FM77AV_VARIANTS) || defined(_FM77L4)
151 #if defined(_FM77AV_VARIANTS)
152 bool subcpu_resetreq;
162 int8_t display_page_bak;
163 #if defined(_FM77_VARIANTS)
164 # if defined(_FM77L4)
166 bool stat_400linecard;
170 #elif defined(_FM77AV_VARIANTS)
173 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
174 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
180 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
181 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
184 uint8_t console_ram_bank;
185 uint8_t vram_active_block;
186 uint8_t vram_display_block;
188 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
190 uint16_t window_high;
191 uint16_t window_xbegin;
192 uint16_t window_xend;
198 bool diag_load_subrom_a;
199 bool diag_load_subrom_b;
200 bool diag_load_subrom_cg;
202 bool diag_load_subrom_c;
204 scrntype_t dpalette_pixel[8];
205 scrntype_t dpalette_pixel_tmp[8];
206 #if defined(USE_GREEN_DISPLAY)
207 scrntype_t dpalette_pixel_green[8];
208 scrntype_t dpalette_green_tmp[8];
209 bool use_green_monitor;
212 uint8_t dpalette_data[8];
213 #if defined(_FM77AV_VARIANTS)
214 pair_t apalette_index;
215 uint8_t analog_palette_r[4096];
216 uint8_t analog_palette_g[4096];
217 uint8_t analog_palette_b[4096];
218 scrntype_t analog_palette_pixel[4096];
219 scrntype_t analog_palette_pixel_tmp[4096];
220 #endif // FM77AV etc...
221 #if defined(_FM77AV_VARIANTS)
222 uint8_t io_w_latch[0x40];
223 #elif !defined(_FM77AV40EX) && !defined(_FM77AV40SX)
224 uint8_t io_w_latch[0x10];
226 uint8_t io_w_latch[0x100];
228 uint8_t multimode_accessmask;
229 uint8_t multimode_dispmask;
230 bool multimode_accessflags[4];
231 bool multimode_dispflags[4];
233 uint32_t offset_point;
234 pair_t tmp_offset_point[2];
235 bool offset_changed[2];
238 #if defined(_FM77AV_VARIANTS)
240 uint8_t subrom_bank_using;
241 uint32_t offset_point_bank1;
242 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
249 //uint8_t write_access_page;
251 // ROM/RAM on Sub-System.
252 uint8_t gvram[__FM7_GVRAM_PAG_SIZE];
253 uint8_t gvram_shadow[__FM7_GVRAM_PAG_SIZE];
255 uint8_t console_ram[0x1000];
256 uint8_t work_ram[0x380];
257 uint8_t shared_ram[0x80];
259 uint8_t subsys_c[0x2800];
260 #if defined(_FM77AV_VARIANTS)
261 uint8_t subsys_a[0x2000];
262 uint8_t subsys_b[0x2000];
263 uint8_t subsys_cg[0x2000];
264 uint8_t submem_hidden[0x300];
268 bool vram_accessflag;
271 uint8_t subsys_cg_l4[0x1000];
272 uint8_t subsys_l4[0x4800];
273 uint8_t text_vram[0x1000];
274 uint8_t crtc_regs[18];
275 uint8_t text_scroll_count;
283 pair_t text_start_addr;
293 int event_id_l4_text_blink;
294 int event_id_l4_cursor_blink;
297 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
298 uint8_t submem_cgram[0x4000];
299 uint8_t submem_console_av40[0x2000];
300 uint8_t subsys_ram[0x2000];
303 KANJIROM *kanjiclass1;
304 KANJIROM *kanjiclass2;
305 #elif defined(_FM77_VARIANTS)
306 KANJIROM *kanjiclass1;
309 bool vram_wrote_shadow;
310 bool vram_wrote_table[411 * 5];
311 bool vram_draw_table[411];
312 //uint8_t vram_wrote_pages[411];
313 uint32_t vram_wrote_addr_1[411];
314 uint32_t vram_wrote_addr_2[411];
315 #if defined(_FM77AV_VARIANTS)
327 #if defined(USE_GREEN_DISPLAY)
328 void GETVRAM_8_200L_GREEN(int yoff, scrntype_t *p, scrntype_t *px, bool window_inv = false, bool scan_line = false);
331 scrntype_t GETVRAM_TEXTCOLOR(uint8_t attr, bool do_green);
332 uint8_t GETVRAM_TEXTPIX(uint8_t bitdata, bool reverse, bool cursor_rev);
333 void GETVRAM_1_400L(int yoff, scrntype_t *p);
334 void GETVRAM_1_400L_GREEN(int yoff, scrntype_t *p);
335 void cursor_blink_77l4();
336 void text_blink_77l4();
339 void GETVRAM_8_200L(int yoff, scrntype_t *p, scrntype_t *px, bool window_inv = false, bool scan_line = false);
340 #if defined(_FM77AV_VARIANTS)
341 void GETVRAM_4096(int yoff, scrntype_t *p, scrntype_t *px, uint32_t rgbmask, bool window_inv = false, bool scan_line = false);
343 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
344 void GETVRAM_8_400L(int yoff, scrntype_t *p, bool window_inv = false);
345 void GETVRAM_256k(int yoff, scrntype_t *p, scrntype_t *px, bool scan_line = false);
347 uint32_t read_mmio(uint32_t addr);
349 void init_read_table(void);
350 void init_write_table(void);
352 uint32_t read_vram_data8(uint32_t addr);
353 uint32_t read_cpu_vram_data8(uint32_t addr);
354 uint32_t read_dma_vram_data8(uint32_t addr);
355 uint32_t read_console_ram(uint32_t addr);
356 uint32_t read_work_ram(uint32_t addr);
357 uint32_t read_shared_ram(uint32_t addr);
358 #if defined(_FM77AV_VARIANTS)
359 uint32_t read_hidden_ram(uint32_t addr);
361 uint32_t read_cgrom(uint32_t addr);
362 uint32_t read_subsys_monitor(uint32_t addr);
364 void write_vram_data8(uint32_t addr, uint8_t data);
365 void write_cpu_vram_data8(uint32_t addr, uint8_t data);
366 void write_dma_vram_data8(uint32_t addr, uint8_t data);
367 void write_console_ram(uint32_t addr, uint8_t data);
368 void write_work_ram(uint32_t addr, uint8_t data);
369 void write_shared_ram(uint32_t addr, uint8_t data);
370 #if defined(_FM77AV_VARIANTS)
371 void write_hidden_ram(uint32_t addr, uint8_t data);
373 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
374 void write_subsys_cgram(uint32_t addr, uint8_t data);
375 void write_subsys_ram(uint32_t addr, uint8_t data);
377 void write_mmio(uint32_t addr, uint8_t data);
378 void write_dummy(uint32_t addr, uint8_t data);
380 uint32_t read_bios(const _TCHAR *name, uint8_t *ptr, uint32_t size);
383 void event_callback_vstart(void);
384 void event_callback_vsync(void);
385 void event_callback_hdisp(void);
386 void event_callback_hblank(void);
389 void call_write_signal(T *np, int id, uint32_t data, uint32_t mask)
391 //T *nnp = static_cast<T *>(np);
392 static_cast<T *>(np)->write_signal(id, data, mask);
395 void call_write_data8(T *np, uint32_t addr, uint32_t data)
397 //T *nnp = static_cast<T *>(np);
398 static_cast<T *>(np)->write_data8(addr, data);
401 uint32_t call_read_data8(T *np, uint32_t addr)
403 //T *nnp = static_cast<T *>(np);
404 return static_cast<T *>(np)->read_data8(addr);
407 void call_write_dma_data8(T *np, uint32_t addr, uint32_t data)
409 //T *nnp = static_cast<T *>(np);
410 static_cast<T *>(np)->write_dma_data8(addr, data);
413 uint32_t call_read_dma_data8(T *np, uint32_t addr)
415 //T *nnp = static_cast<T *>(np);
416 return static_cast<T *>(np)->read_dma_data8(addr);
420 DISPLAY(VM_TEMPLATE* parent_vm, EMU *parent_emu);
422 void event_callback(int event_id, int err);
423 void write_signal(int id, uint32_t data, uint32_t mask);
424 uint32_t read_signal(int id);
426 uint32_t read_data8(uint32_t addr);
427 void write_data8(uint32_t addr, uint32_t data);
429 uint32_t read_dma_data8(uint32_t addr);
430 void write_dma_data8(uint32_t addr, uint32_t data);
435 void update_config();
439 void event_vline(int v, int clock);
440 bool process_state(FILEIO *state_fio, bool loading);
442 int get_screen_mode(void) {
445 uint32_t read_io8(uint32_t addr) { // This is only for debug.
446 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
447 return io_w_latch[addr & 0xff];
448 #elif defined(_FM77AV_VARIANTS) // Really?
449 return io_w_latch[addr & 0x3f];
451 return io_w_latch[addr & 0x0f];
454 bool screen_update(void);
455 void reset_screen_update(void);
456 void set_context_kanjiclass1(DEVICE *p) {
457 #if defined(_FM77_VARIANTS) || \
458 defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
459 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
460 kanjiclass1 = (KANJIROM *)p;
463 void set_context_kanjiclass2(DEVICE *p) {
464 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
465 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
466 kanjiclass2 = (KANJIROM *)p;
467 if(p != NULL) kanji_level2 = true;
470 void set_context_mainio(DEVICE *p) {
471 mainio = (FM7_MAINIO *)p;
473 void set_context_keyboard(DEVICE *p) {
474 keyboard = (KEYBOARD *)p;
476 void set_context_subcpu(DEVICE *p) {
477 subcpu = (MC6809 *)p;
479 #if defined(_FM77AV_VARIANTS)
480 void set_context_alu(DEVICE *p) {
481 alu = (MB61VH010 *)p;
485 void set_context_l4crtc(HD46505 *p) {
491 #endif // _CSP_FM7_DISPLAY_H