-/*\r
- NEC PC-9801 Emulator 'ePC-9801'\r
- NEC PC-9801E/F/M Emulator 'ePC-9801E'\r
- NEC PC-98DO Emulator 'ePC-98DO'\r
-\r
- Author : Takeda.Toshiya\r
- Date : 2010.09.16-\r
-\r
- [ display ]\r
-*/\r
-\r
-#ifndef _DISPLAY_H_\r
-#define _DISPLAY_H_\r
-\r
-#include "../vm.h"\r
-#include "../../emu.h"\r
-#include "../device.h"\r
-\r
-class UPD7220;\r
-\r
-class DISPLAY : public DEVICE\r
-{\r
-private:\r
- DEVICE *d_pic;\r
- UPD7220 *d_gdc_chr, *d_gdc_gfx;\r
- uint8 *ra_chr;\r
- uint8 *ra_gfx, *cs_gfx;\r
- \r
- uint8 tvram[0x4000];\r
-#if defined(SUPPORT_2ND_VRAM)\r
- uint8 vram[0x40000];\r
-#else\r
- uint8 vram[0x20000];\r
-#endif\r
- uint8 *vram_disp_b;\r
- uint8 *vram_disp_r;\r
- uint8 *vram_disp_g;\r
-#if defined(SUPPORT_16_COLORS)\r
- uint8 *vram_disp_e;\r
-#endif\r
- uint8 *vram_draw;\r
- \r
- scrntype palette_chr[8];\r
- scrntype palette_gfx8[8];\r
- uint8 digipal[4];\r
-#if defined(SUPPORT_16_COLORS)\r
- scrntype palette_gfx16[8];\r
- uint8 anapal[16][3], anapal_sel;\r
-#endif\r
- \r
- uint8 crtv;\r
- uint8 scroll[6];\r
- uint8 modereg1[8];\r
-#if defined(SUPPORT_16_COLORS)\r
- uint8 modereg2[128];\r
- uint8 grcg_mode, grcg_tile_ptr, grcg_tile[4];\r
-#endif\r
- \r
- uint8 font[0x84000];\r
- uint16 font_code;\r
- uint8 font_line;\r
- uint16 font_lr;\r
- \r
- uint8 screen_chr[400][641];\r
- uint8 screen_gfx[400][640];\r
- uint32 gdc_addr[480][80];\r
- \r
- void kanji_copy(uint8 *dst, uint8 *src, int from, int to);\r
-#if defined(SUPPORT_16_COLORS)\r
- void write_grcg(uint32 addr, uint32 data);\r
- uint32 read_grcg(uint32 addr);\r
-#endif\r
- void draw_chr_screen();\r
- void draw_gfx_screen();\r
- \r
-public:\r
- DISPLAY(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu) {}\r
- ~DISPLAY() {}\r
- \r
- // common functions\r
- void initialize();\r
- void reset();\r
- void event_frame();\r
- void write_io8(uint32 addr, uint32 data);\r
- uint32 read_io8(uint32 addr);\r
- void write_memory_mapped_io8(uint32 addr, uint32 data);\r
- uint32 read_memory_mapped_io8(uint32 addr);\r
- void save_state(FILEIO* state_fio);\r
- bool load_state(FILEIO* state_fio);\r
- \r
- // unique functions\r
- void set_context_pic(DEVICE *device)\r
- {\r
- d_pic = device;\r
- }\r
- void set_context_gdc_chr(UPD7220 *device, uint8 *ra)\r
- {\r
- d_gdc_chr = device;\r
- ra_chr = ra;\r
- }\r
- void set_context_gdc_gfx(UPD7220 *device, uint8 *ra, uint8 *cs)\r
- {\r
- d_gdc_gfx = device;\r
- ra_gfx = ra; cs_gfx = cs;\r
- }\r
- void draw_screen();\r
- \r
- bool sound_bios_ok;\r
-};\r
-\r
-#endif\r
-\r
+/*
+ NEC PC-9801 Emulator 'ePC-9801'
+ NEC PC-9801E/F/M Emulator 'ePC-9801E'
+ NEC PC-9801U Emulator 'ePC-9801U'
+ NEC PC-9801VF Emulator 'ePC-9801VF'
+ NEC PC-9801VM Emulator 'ePC-9801VM'
+ NEC PC-9801VX Emulator 'ePC-9801VX'
+ NEC PC-9801RA Emulator 'ePC-9801RA'
+ NEC PC-98XA Emulator 'ePC-98XA'
+ NEC PC-98XL Emulator 'ePC-98XL'
+ NEC PC-98RL Emulator 'ePC-98RL'
+ NEC PC-98DO Emulator 'ePC-98DO'
+
+ Author : Takeda.Toshiya
+ Date : 2010.09.16-
+
+ [ display ]
+*/
+
+#ifndef _DISPLAY_H_
+#define _DISPLAY_H_
+
+#include "../vm.h"
+#include "../../emu.h"
+#include "../device.h"
+
+class UPD7220;
+
+namespace PC9801 {
+
+class DISPLAY : public DEVICE
+{
+private:
+ DEVICE *d_pic;
+ UPD7220 *d_gdc_chr, *d_gdc_gfx;
+ uint8_t *ra_chr;
+ uint8_t *ra_gfx, *cs_gfx;
+
+ uint8_t tvram[0x4000];
+#if !defined(SUPPORT_HIRESO)
+#if defined(SUPPORT_2ND_VRAM)
+ uint8_t vram[0x40000];
+#else
+ uint8_t vram[0x20000];
+#endif
+#else
+ uint8_t vram[0x80000];
+#endif
+
+#if defined(SUPPORT_2ND_VRAM) && !defined(SUPPORT_HIRESO)
+ uint8_t vram_disp_sel;
+ uint8_t vram_draw_sel;
+#endif
+ uint8_t *vram_disp_b;
+ uint8_t *vram_disp_r;
+ uint8_t *vram_disp_g;
+#if defined(SUPPORT_16_COLORS)
+ uint8_t *vram_disp_e;
+#endif
+ uint8_t *vram_draw;
+
+ scrntype_t palette_chr[8];
+ scrntype_t palette_gfx8[8];
+ uint8_t digipal[4];
+#if defined(SUPPORT_16_COLORS)
+ scrntype_t palette_gfx16[16];
+ uint8_t anapal[16][3], anapal_sel;
+#endif
+
+ uint8_t crtv;
+ uint8_t scroll[6];
+ uint8_t modereg1[8];
+#if defined(SUPPORT_16_COLORS)
+ uint8_t modereg2[128];
+#endif
+#if defined(SUPPORT_GRCG)
+ uint8_t grcg_mode, grcg_tile_ptr, grcg_tile[4];
+#endif
+#if defined(SUPPORT_EGC)
+ typedef union {
+ uint8_t b[2];
+ uint16_t w;
+ } egcword_t;
+ typedef union {
+ uint8_t b[4][2];
+ uint16_t w[4];
+ uint32_t d[2];
+ uint64_t q;
+ } egcquad_t;
+
+ uint16_t egc_access;
+ uint16_t egc_fgbg;
+ uint16_t egc_ope;
+ uint16_t egc_fg;
+ egcword_t egc_mask;
+ uint16_t egc_bg;
+ uint16_t egc_sft;
+ uint16_t egc_leng;
+ egcquad_t egc_lastvram;
+ egcquad_t egc_patreg;
+ egcquad_t egc_fgc;
+ egcquad_t egc_bgc;
+ int egc_func;
+ uint32_t egc_remain;
+ uint32_t egc_stack;
+ uint8_t* egc_inptr;
+ uint8_t* egc_outptr;
+
+ int tmp_inptr_ofs;
+ int tmp_outptr_ofs;
+
+ egcword_t egc_mask2;
+ egcword_t egc_srcmask;
+ uint8_t egc_srcbit;
+ uint8_t egc_dstbit;
+ uint8_t egc_sft8bitl;
+ uint8_t egc_sft8bitr;
+ uint8_t egc_buf[528]; /* 4096/8 + 4*4 */
+ egcquad_t egc_vram_src;
+ egcquad_t egc_vram_data;
+#endif
+
+#if !defined(SUPPORT_HIRESO)
+ #define FONT_SIZE 16
+ #define FONT_WIDTH 8
+ #define FONT_HEIGHT 16
+#else
+ #define FONT_SIZE 48
+ #define FONT_WIDTH 14
+ #define FONT_HEIGHT 24
+#endif
+ #define KANJI_2ND_OFS (FONT_SIZE * 0x80)
+ #define KANJI_FONT_SIZE (FONT_SIZE * 2)
+ #define ANK_FONT_OFS (KANJI_FONT_SIZE * 0x4000)
+
+ uint8_t font[ANK_FONT_OFS + FONT_SIZE * 0x400];
+ uint16_t font_code;
+ uint8_t font_line;
+// uint16_t font_lr;
+
+ uint8_t screen_chr[SCREEN_HEIGHT][SCREEN_WIDTH + 1];
+ uint8_t screen_gfx[SCREEN_HEIGHT][SCREEN_WIDTH];
+
+#if !defined(SUPPORT_HIRESO)
+ void kanji_copy(uint8_t *dst, uint8_t *src, int from, int to);
+#else
+ void ank_copy(int code, uint8_t *pattern);
+ void kanji_copy(int first, int second, uint8_t *pattern);
+#endif
+#if defined(SUPPORT_GRCG)
+ void grcg_writeb(uint32_t addr1, uint32_t data);
+ void grcg_writew(uint32_t addr1, uint32_t data);
+ uint32_t grcg_readb(uint32_t addr1);
+ uint32_t grcg_readw(uint32_t addr1);
+#endif
+#if defined(SUPPORT_EGC)
+ void egc_shift();
+ void egc_sftb_upn_sub(uint32_t ext);
+ void egc_sftb_dnn_sub(uint32_t ext);
+ void egc_sftb_upr_sub(uint32_t ext);
+ void egc_sftb_dnr_sub(uint32_t ext);
+ void egc_sftb_upl_sub(uint32_t ext);
+ void egc_sftb_dnl_sub(uint32_t ext);
+ void egc_sftb_upn0(uint32_t ext);
+ void egc_sftw_upn0();
+ void egc_sftb_dnn0(uint32_t ext);
+ void egc_sftw_dnn0();
+ void egc_sftb_upr0(uint32_t ext);
+ void egc_sftw_upr0();
+ void egc_sftb_dnr0(uint32_t ext);
+ void egc_sftw_dnr0();
+ void egc_sftb_upl0(uint32_t ext);
+ void egc_sftw_upl0();
+ void egc_sftb_dnl0(uint32_t ext);
+ void egc_sftw_dnl0();
+ void egc_sftb(int func, uint32_t ext);
+ void egc_sftw(int func);
+ void egc_shiftinput_byte(uint32_t ext);
+ void egc_shiftinput_incw();
+ void egc_shiftinput_decw();
+ uint64_t egc_ope_00(uint8_t ope, uint32_t addr);
+ uint64_t egc_ope_0f(uint8_t ope, uint32_t addr);
+ uint64_t egc_ope_c0(uint8_t ope, uint32_t addr);
+ uint64_t egc_ope_f0(uint8_t ope, uint32_t addr);
+ uint64_t egc_ope_fc(uint8_t ope, uint32_t addr);
+ uint64_t egc_ope_ff(uint8_t ope, uint32_t addr);
+ uint64_t egc_ope_nd(uint8_t ope, uint32_t addr);
+ uint64_t egc_ope_np(uint8_t ope, uint32_t addr);
+ uint64_t egc_ope_xx(uint8_t ope, uint32_t addr);
+ uint64_t egc_opefn(uint32_t func, uint8_t ope, uint32_t addr);
+ uint64_t egc_opeb(uint32_t addr, uint8_t value);
+ uint64_t egc_opew(uint32_t addr, uint16_t value);
+ uint32_t egc_readb(uint32_t addr1);
+ uint32_t egc_readw(uint32_t addr1);
+ void egc_writeb(uint32_t addr1, uint8_t value);
+ void egc_writew(uint32_t addr1, uint16_t value);
+#endif
+ void draw_chr_screen();
+ void draw_gfx_screen();
+
+public:
+ DISPLAY(VM_TEMPLATE* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
+ {
+ memset(tvram, 0, sizeof(tvram));
+ set_device_name(_T("Display"));
+ }
+ ~DISPLAY() {}
+
+ // common functions
+ void initialize();
+ void release();
+ void reset();
+ void event_frame();
+ void write_io8(uint32_t addr, uint32_t data);
+ uint32_t read_io8(uint32_t addr);
+ void write_memory_mapped_io8(uint32_t addr, uint32_t data);
+ void write_memory_mapped_io16(uint32_t addr, uint32_t data);
+ uint32_t read_memory_mapped_io8(uint32_t addr);
+ uint32_t read_memory_mapped_io16(uint32_t addr);
+ void write_dma_io8(uint32_t addr, uint32_t data);
+ void write_dma_io16(uint32_t addr, uint32_t data);
+ uint32_t read_dma_io8(uint32_t addr);
+ uint32_t read_dma_io16(uint32_t addr);
+ bool process_state(FILEIO* state_fio, bool loading);
+
+ // unique functions
+ void set_context_pic(DEVICE *device)
+ {
+ d_pic = device;
+ }
+ void set_context_gdc_chr(UPD7220 *device, uint8_t *ra)
+ {
+ d_gdc_chr = device;
+ ra_chr = ra;
+ }
+ void set_context_gdc_gfx(UPD7220 *device, uint8_t *ra, uint8_t *cs)
+ {
+ d_gdc_gfx = device;
+ ra_gfx = ra; cs_gfx = cs;
+ }
+ void sound_bios_ok()
+ {
+ tvram[0x3fee] = 8;
+ }
+ void draw_screen();
+};
+
+}
+#endif
+