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)
42 class DISPLAY: public DEVICE
46 uint16_t bit_trans_table_0[256][8];
47 uint16_t bit_trans_table_1[256][8];
48 uint16_t bit_trans_table_2[256][8];
49 uint16_t bit_trans_table_3[256][8];
50 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
51 uint16_t bit_trans_table_4[256][8];
52 uint16_t bit_trans_table_5[256][8];
55 uint32_t (DISPLAY::*read_cpu_func_table[512])(uint32_t);
56 uint32_t (DISPLAY::*read_dma_func_table[512])(uint32_t);
57 void (DISPLAY::*write_cpu_func_table[512])(uint32_t, uint8_t);
58 void (DISPLAY::*write_dma_func_table[512])(uint32_t, uint8_t);
61 bool screen_update_flag;
66 void setup_display_mode(void);
71 void set_multimode(uint8_t val);
72 uint8_t get_multimode(void);
73 uint8_t get_cpuaccessmask(void);
74 void set_dpalette(uint32_t addr, uint8_t val);
75 uint8_t get_dpalette(uint32_t addr);
76 void enter_display(void);
77 void leave_display(void);
78 void halt_subsystem(void);
79 void restart_subsystem(void);
80 void set_crtflag(void);
81 void reset_crtflag(void);
82 uint8_t acknowledge_irq(void);
84 uint8_t attention_irq(void);
85 void set_cyclesteal(uint8_t val);
86 uint8_t set_vramaccess(void);
87 void reset_vramaccess(void);
88 uint8_t reset_subbusy(void);
89 void set_subbusy(void);
90 void reset_some_devices(void);
91 void reset_subcpu(bool _check_firq);
92 void setup_400linemode(uint8_t val);
94 #if defined(_FM77AV_VARIANTS)
95 void alu_write_cmdreg(uint32_t val);
96 void alu_write_logical_color(uint8_t val);
97 void alu_write_mask_reg(uint8_t val);
98 void alu_write_cmpdata_reg(int addr, uint8_t val);
99 void alu_write_disable_reg(uint8_t val);
100 void alu_write_tilepaint_data(uint32_t addr, uint8_t val);
101 void alu_write_offsetreg_hi(uint8_t val);
102 void alu_write_offsetreg_lo(uint8_t val);
103 void alu_write_linepattern_hi(uint8_t val);
104 void alu_write_linepattern_lo(uint8_t val);
105 void alu_write_line_position(int addr, uint8_t val);
107 uint8_t get_miscreg(void);
108 void set_miscreg(uint8_t val);
109 void set_monitor_bank(uint8_t var);
110 void set_apalette_index_hi(uint8_t val);
111 void set_apalette_index_lo(uint8_t val);
112 void set_apalette_b(uint8_t val);
113 void set_apalette_r(uint8_t val);
114 void set_apalette_g(uint8_t val);
115 void calc_apalette(uint16_t idx);
117 #endif // _FM77AV_VARIANTS
119 void copy_vram_all();
120 void copy_vram_per_line(int begin, int end);
121 void copy_vram_blank_area(void);
134 int active_page; // GVRAM is Double-Buffer.
135 uint32_t page_offset;
137 uint32_t pagemod_mask;
140 uint8_t frame_skip_count_draw;
141 uint8_t frame_skip_count_transfer;
142 bool need_transfer_line;
143 bool palette_changed;
148 //#if defined(_FM77AV_VARIANTS) || defined(_FM77L4)
156 #if defined(_FM77AV_VARIANTS)
157 bool subcpu_resetreq;
167 int8_t display_page_bak;
168 #if defined(_FM77_VARIANTS)
169 # if defined(_FM77L4)
171 bool stat_400linecard;
175 #elif defined(_FM77AV_VARIANTS)
178 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
179 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
185 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
186 defined(_FM77AV20) || defined(_FM77AV20SX) || defined(_FM77AV20EX)
189 uint8_t console_ram_bank;
190 uint8_t vram_active_block;
191 uint8_t vram_display_block;
193 # if defined(_FM77AV40EX) || defined(_FM77AV40SX)
195 uint16_t window_high;
196 uint16_t window_xbegin;
197 uint16_t window_xend;
203 bool diag_load_subrom_a;
204 bool diag_load_subrom_b;
205 bool diag_load_subrom_cg;
207 bool diag_load_subrom_c;
209 scrntype_t dpalette_pixel[8];
210 scrntype_t dpalette_pixel_tmp[8];
211 #if defined(USE_GREEN_DISPLAY)
212 scrntype_t dpalette_pixel_green[8];
213 scrntype_t dpalette_green_tmp[8];
214 bool use_green_monitor;
217 uint8_t dpalette_data[8];
218 #if defined(_FM77AV_VARIANTS)
219 pair_t apalette_index;
220 uint8_t analog_palette_r[4096];
221 uint8_t analog_palette_g[4096];
222 uint8_t analog_palette_b[4096];
223 scrntype_t analog_palette_pixel[4096];
224 scrntype_t analog_palette_pixel_tmp[4096];
225 #endif // FM77AV etc...
226 #if defined(_FM77AV_VARIANTS)
227 uint8_t io_w_latch[0x40];
228 #elif !defined(_FM77AV40EX) && !defined(_FM77AV40SX)
229 uint8_t io_w_latch[0x10];
231 uint8_t io_w_latch[0x100];
233 uint8_t multimode_accessmask;
234 uint8_t multimode_dispmask;
235 bool multimode_accessflags[4];
236 bool multimode_dispflags[4];
238 uint32_t offset_point;
239 pair_t tmp_offset_point[2];
240 bool offset_changed[2];
243 #if defined(_FM77AV_VARIANTS)
245 uint8_t subrom_bank_using;
246 uint32_t offset_point_bank1;
247 # if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
254 //uint8_t write_access_page;
256 // ROM/RAM on Sub-System.
257 uint8_t gvram[__FM7_GVRAM_PAG_SIZE];
258 uint8_t gvram_shadow[__FM7_GVRAM_PAG_SIZE];
260 uint8_t console_ram[0x1000];
261 uint8_t work_ram[0x380];
262 uint8_t shared_ram[0x80];
264 uint8_t subsys_c[0x2800];
265 #if defined(_FM77AV_VARIANTS)
266 uint8_t subsys_a[0x2000];
267 uint8_t subsys_b[0x2000];
268 uint8_t subsys_cg[0x2000];
269 uint8_t submem_hidden[0x300];
273 bool vram_accessflag;
276 uint8_t subsys_cg_l4[0x1000];
277 uint8_t subsys_l4[0x4800];
278 uint8_t text_vram[0x1000];
279 uint8_t crtc_regs[18];
280 uint8_t text_scroll_count;
288 pair_t text_start_addr;
298 int event_id_l4_text_blink;
299 int event_id_l4_cursor_blink;
302 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
303 uint8_t submem_cgram[0x4000];
304 uint8_t submem_console_av40[0x2000];
305 uint8_t subsys_ram[0x2000];
308 FM7::KANJIROM *kanjiclass1;
309 FM7::KANJIROM *kanjiclass2;
310 #elif defined(_FM77_VARIANTS)
311 FM7::KANJIROM *kanjiclass1;
314 bool vram_wrote_shadow;
315 bool vram_wrote_table[411 * 5];
316 bool vram_draw_table[411];
317 //uint8_t vram_wrote_pages[411];
318 uint32_t vram_wrote_addr_1[411];
319 uint32_t vram_wrote_addr_2[411];
320 #if defined(_FM77AV_VARIANTS)
324 FM7::FM7_MAINIO *mainio;
325 FM7::KEYBOARD *keyboard;
332 #if defined(USE_GREEN_DISPLAY)
333 void GETVRAM_8_200L_GREEN(int yoff, scrntype_t *p, scrntype_t *px, bool window_inv = false, bool scan_line = false);
336 scrntype_t GETVRAM_TEXTCOLOR(uint8_t attr, bool do_green);
337 uint8_t GETVRAM_TEXTPIX(uint8_t bitdata, bool reverse, bool cursor_rev);
338 void GETVRAM_1_400L(int yoff, scrntype_t *p);
339 void GETVRAM_1_400L_GREEN(int yoff, scrntype_t *p);
340 void cursor_blink_77l4();
341 void text_blink_77l4();
344 void GETVRAM_8_200L(int yoff, scrntype_t *p, scrntype_t *px, bool window_inv = false, bool scan_line = false);
345 #if defined(_FM77AV_VARIANTS)
346 void GETVRAM_4096(int yoff, scrntype_t *p, scrntype_t *px, uint32_t rgbmask, bool window_inv = false, bool scan_line = false);
348 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
349 void GETVRAM_8_400L(int yoff, scrntype_t *p, bool window_inv = false);
350 void GETVRAM_256k(int yoff, scrntype_t *p, scrntype_t *px, bool scan_line = false);
352 uint32_t read_mmio(uint32_t addr);
354 void init_read_table(void);
355 void init_write_table(void);
357 uint32_t read_vram_data8(uint32_t addr);
358 uint32_t read_cpu_vram_data8(uint32_t addr);
359 uint32_t read_dma_vram_data8(uint32_t addr);
360 uint32_t read_console_ram(uint32_t addr);
361 uint32_t read_work_ram(uint32_t addr);
362 uint32_t read_shared_ram(uint32_t addr);
363 #if defined(_FM77AV_VARIANTS)
364 uint32_t read_hidden_ram(uint32_t addr);
366 uint32_t read_cgrom(uint32_t addr);
367 uint32_t read_subsys_monitor(uint32_t addr);
369 void write_vram_data8(uint32_t addr, uint8_t data);
370 void write_cpu_vram_data8(uint32_t addr, uint8_t data);
371 void write_dma_vram_data8(uint32_t addr, uint8_t data);
372 void write_console_ram(uint32_t addr, uint8_t data);
373 void write_work_ram(uint32_t addr, uint8_t data);
374 void write_shared_ram(uint32_t addr, uint8_t data);
375 #if defined(_FM77AV_VARIANTS)
376 void write_hidden_ram(uint32_t addr, uint8_t data);
378 #if defined(_FM77AV40) || defined(_FM77AV40SX) || defined(_FM77AV40EX)
379 void write_subsys_cgram(uint32_t addr, uint8_t data);
380 void write_subsys_ram(uint32_t addr, uint8_t data);
382 void write_mmio(uint32_t addr, uint8_t data);
383 void write_dummy(uint32_t addr, uint8_t data);
385 uint32_t read_bios(const _TCHAR *name, uint8_t *ptr, uint32_t size);
388 void event_callback_vstart(void);
389 void event_callback_vsync(void);
390 void event_callback_hdisp(void);
391 void event_callback_hblank(void);
394 void call_write_signal(T *np, int id, uint32_t data, uint32_t mask)
396 //T *nnp = static_cast<T *>(np);
397 static_cast<T *>(np)->write_signal(id, data, mask);
400 void call_write_data8(T *np, uint32_t addr, uint32_t data)
402 //T *nnp = static_cast<T *>(np);
403 static_cast<T *>(np)->write_data8(addr, data);
406 uint32_t call_read_data8(T *np, uint32_t addr)
408 //T *nnp = static_cast<T *>(np);
409 return static_cast<T *>(np)->read_data8(addr);
412 void call_write_dma_data8(T *np, uint32_t addr, uint32_t data)
414 //T *nnp = static_cast<T *>(np);
415 static_cast<T *>(np)->write_dma_data8(addr, data);
418 uint32_t call_read_dma_data8(T *np, uint32_t addr)
420 //T *nnp = static_cast<T *>(np);
421 return static_cast<T *>(np)->read_dma_data8(addr);
425 DISPLAY(VM_TEMPLATE* parent_vm, EMU *parent_emu);
427 void event_callback(int event_id, int err);
428 void write_signal(int id, uint32_t data, uint32_t mask);
429 uint32_t read_signal(int id);
431 uint32_t read_data8(uint32_t addr);
432 void write_data8(uint32_t addr, uint32_t data);
434 uint32_t read_dma_data8(uint32_t addr);
435 void write_dma_data8(uint32_t addr, uint32_t data);
440 void update_config();
444 void event_vline(int v, int clock);
445 bool process_state(FILEIO *state_fio, bool loading);
447 int get_screen_mode(void) {
450 uint32_t read_io8(uint32_t addr) { // This is only for debug.
451 #if defined(_FM77AV40EX) || defined(_FM77AV40SX)
452 return io_w_latch[addr & 0xff];
453 #elif defined(_FM77AV_VARIANTS) // Really?
454 return io_w_latch[addr & 0x3f];
456 return io_w_latch[addr & 0x0f];
459 bool screen_update(void);
460 void reset_screen_update(void);
461 void set_context_kanjiclass1(DEVICE *p) {
462 #if defined(_FM77_VARIANTS) || \
463 defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
464 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
465 kanjiclass1 = (FM7::KANJIROM *)p;
468 void set_context_kanjiclass2(DEVICE *p) {
469 #if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)|| \
470 defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
471 kanjiclass2 = (FM7::KANJIROM *)p;
472 if(p != NULL) kanji_level2 = true;
475 void set_context_mainio(DEVICE *p) {
476 mainio = (FM7::FM7_MAINIO *)p;
478 void set_context_keyboard(DEVICE *p) {
479 keyboard = (FM7::KEYBOARD *)p;
481 void set_context_subcpu(DEVICE *p) {
482 subcpu = (MC6809 *)p;
484 #if defined(_FM77AV_VARIANTS)
485 void set_context_alu(DEVICE *p) {
486 alu = (MB61VH010 *)p;
490 void set_context_l4crtc(HD46505 *p) {
498 #endif // _CSP_FM7_DISPLAY_H