--- xmil/io/pcg.c 2004/08/04 17:09:25 1.4 +++ xmil/io/pcg.c 2005/02/04 06:42:11 1.14 @@ -3,27 +3,37 @@ #include "pccore.h" #include "iocore.h" #include "vram.h" +#include "makescrn.h" #include "font.h" -static void pcgsync(void) { +static void waithsync(void) { - *(UINT32 *)&pcg.r.vsync = 0; - *(UINT32 *)&pcg.r.roff0 = 0; + SINT32 clock; + SINT32 h; + + clock = (CPU_CLOCKCOUNT - iocore.e.framestartclock) << 8; + h = clock % crtc.e.rasterclock8; + h = crtc.e.rasterdisp8 - h; + if (h < 0) { + h += crtc.e.rasterclock8; + } + CPU_REMCLOCK -= (h >> 8); } + static UINT pcg_offset(void) { - if (tram[TRAM_ATR + 0x07ff] & 0x20) { + if (TRAM_ATR(0x07ff) & 0x20) { return(0x7ff); } - if (tram[TRAM_ATR + 0x03ff] & 0x20) { + if (TRAM_ATR(0x03ff) & 0x20) { return(0x3ff); } - if (tram[TRAM_ATR + 0x05ff] & 0x20) { + if (TRAM_ATR(0x05ff) & 0x20) { return(0x5ff); } - if (tram[TRAM_ATR + 0x01ff] & 0x20) { + if (TRAM_ATR(0x01ff) & 0x20) { return(0x1ff); } return(0x7ff); @@ -31,31 +41,38 @@ static UINT pcg_offset(void) { static UINT knj_offset(void) { - if (!(tram[TRAM_ATR + 0x07ff] & 0x20)) { + if (!(TRAM_ATR(0x07ff) & 0x20)) { return(0x7ff); } - if (!(tram[TRAM_ATR + 0x03ff] & 0x20)) { + if (!(TRAM_ATR(0x03ff) & 0x20)) { return(0x3ff); } - if (!(tram[TRAM_ATR + 0x05ff] & 0x20)) { + if (!(TRAM_ATR(0x05ff) & 0x20)) { return(0x5ff); } - if (!(tram[TRAM_ATR + 0x01ff] & 0x20)) { + if (!(TRAM_ATR(0x01ff) & 0x20)) { return(0x1ff); } return(0x7ff); } -static UINT nowsyncoffset(void) { +static UINT nowsyncoffset(UINT *line) { + SINT32 clock; + UINT h; + UINT v; UINT ret; - ret = (((v_cnt - crtc.s.CRT_YL) / crtc.s.fnty) + crtc.s.TXT_YL) - * crtc.s.TXT_XL + crtc.s.TXT_TOP; - if (pccore.HSYNC_CLK) { - ret += (h_cnt * crtc.s.TXT_XL) / pccore.HSYNC_CLK; - } - + clock = (CPU_CLOCKCOUNT - iocore.e.framestartclock) << 8; + v = clock / crtc.e.rasterclock8; + h = clock - (v * crtc.e.rasterclock8); + if (crtc.s.SCRN_BITS & SCRN_24KHZ) { + v = v >> 1; + } + ret = v / crtc.e.fonty; + *line = (v - (ret * crtc.e.fonty)) & 7; + ret = (ret * crtc.s.reg[CRTCREG_HDISP]) + crtc.e.pos; + ret += (h * crtc.s.reg[CRTCREG_HDISP]) / crtc.e.rasterclock8; if (ret >= 0x0800) { ret = 0x07ff; // オーバーフロー } @@ -67,140 +84,84 @@ void IOOUTCALL pcg_o(UINT port, REG8 val UINT chr; UINT off; - UINT l; + UINT line; if (crtc.s.SCRN_BITS & SCRN_PCGMODE) { + waithsync(); off = pcg_offset(); - chr = tram[TRAM_ANK + off]; - if (tram[TRAM_KNJ + off] & 0x90) { - chr &= 0xfe; - l = port & 15; + chr = TRAM_ANK(off); + if (TRAM_KNJ(off) & 0x90) { + chr = chr & (~1); + line = port & 15; } else { - l = (port >> 1) & 7; - } - switch(port >> 8) { - case 0x15: - pcg.d.b[chr][l] = value; - break; - - case 0x16: - pcg.d.r[chr][l] = value; - break; - - case 0x17: - pcg.d.g[chr][l] = value; - break; + line = (port >> 1) & 7; } } else { - off = nowsyncoffset(); // 990622 puni - chr = tram[TRAM_ANK + off]; - if (pcg.r.vsync) { - pcgsync(); - } - switch(port & 0xff00) { - case 0x1500: - pcg.d.b[chr][pcg.r.woff1] = value; - pcg.r.woff1 = (pcg.r.woff1 + 1) & 7; - break; - - case 0x1600: - pcg.d.r[chr][pcg.r.woff2] = value; - pcg.r.woff2 = (pcg.r.woff2 + 1) & 7; - break; - - case 0x1700: - pcg.d.g[chr][pcg.r.woff4] = value; - pcg.r.woff4 = (pcg.r.woff4 + 1) & 7; - break; - } + off = nowsyncoffset(&line); + chr = TRAM_ANK(off); + } + chr += (port & 0x0300) - 0x100; + if (pcg.d[(chr << 3) + line] != value) { + pcg.d[(chr << 3) + line] = value; + crtc.e.scrnallflash = TRUE; } } REG8 IOINPCALL pcg_i(UINT port) { + UINT upper; + UINT line; UINT off; - int l; - BYTE chr,knj,val; + UINT chr; + UINT knj; + UINT addr; - val = 0xff; + upper = port & 0x0300; if (crtc.s.SCRN_BITS & SCRN_PCGMODE) { - l = port & 0x0f; - if ((port & 0xff00) == 0x1400) { + waithsync(); + line = port & 0x0f; + if (!upper) { off = knj_offset(); - chr = tram[TRAM_ANK + off]; - knj = tram[TRAM_KNJ + off]; + chr = TRAM_ANK(off); + knj = TRAM_KNJ(off); if (knj & 0x80) { - DWORD p; - p = ((((DWORD)knj << 8) | chr) & 0x1fff) << 4; + addr = ((((knj & 0x1f) << 8) + chr) << 4) + line; if (knj & 0x40) { - val = font_knjx1t[p + l + FONTX1T_LR]; - } - else { - val = font_knjx1t[p + l]; + addr += FONTX1T_LR; } + return(font_knjx1t[addr]); } else if (crtc.s.SCRN_BITS & SCRN_CPUFONT) { - val = font_txt[(chr << 4) + l]; + return(font_txt[(chr << 4) + line]); } else { - val = font_ank[(chr << 3) + (l >> 1)]; + line >>= 1; } } else { off = pcg_offset(); - chr = tram[TRAM_ANK + off]; - if (tram[TRAM_KNJ + off] & 0x90) { - chr &= 0xfe; + chr = TRAM_ANK(off); + if (TRAM_KNJ(off) & 0x90) { + chr = chr & (~1); } else { - l >>= 1; - } - switch(port & 0xff00) { - case 0x1500: - val = pcg.d.b[chr][l]; - break; - - case 0x1600: - val = pcg.d.r[chr][l]; - break; - - case 0x1700: - val = pcg.d.g[chr][l]; - break; + line >>= 1; } } } else { - off = nowsyncoffset(); // 990622 puni - chr = tram[TRAM_ANK + off]; - if (pcg.r.vsync) { - pcgsync(); - } - switch(port >> 8) { - case 0x14: - val = font_ank[(chr << 3) + pcg.r.roff0]; - pcg.r.roff0 = (pcg.r.roff0 + 1) & 7; - break; - - case 0x15: - val = pcg.d.b[chr][pcg.r.roff1]; - pcg.r.roff1 = (pcg.r.roff1 + 1) & 7; - break; - - case 0x16: - val = pcg.d.r[chr][pcg.r.roff2]; - pcg.r.roff2 = (pcg.r.roff2 + 1) & 7; - break; - - case 0x17: - val = pcg.d.g[chr][pcg.r.roff4]; - pcg.r.roff4 = (pcg.r.roff4 + 1) & 7; - break; - } + off = nowsyncoffset(&line); + chr = TRAM_ANK(off); + } + if (!upper) { + return(font_ank[(chr << 3) + line]); + } + else { + chr += upper - 0x100; + return(pcg.d[(chr << 3) + line]); } - return(val); } @@ -212,7 +173,5 @@ void pcg_initialize(void) { } void pcg_reset(void) { - - pcgsync(); }