--- xmil/io/pcg.c 2004/08/14 12:16:17 1.10 +++ xmil/io/pcg.c 2008/06/02 20:07:31 1.15 @@ -2,23 +2,38 @@ #include "z80core.h" #include "pccore.h" #include "iocore.h" -#include "nevent.h" #include "vram.h" +#include "makescrn.h" #include "font.h" +static void waithsync(void) { + + 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); @@ -26,16 +41,16 @@ 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); @@ -48,11 +63,7 @@ static UINT nowsyncoffset(UINT *line) { UINT v; UINT ret; - clock = nevent_getwork(NEVENT_FRAMES); - if (corestat.vsync) { - clock += corestat.dispclock; - } - clock = clock << 8; + 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) { @@ -63,9 +74,9 @@ static UINT nowsyncoffset(UINT *line) { 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; // オーバーフロー + ret = 0x07ff; /* オーバーフロー */ } - return(ret); // まさに表示しようとしている TXT-RAMアドレス + return(ret); /* まさに表示しようとしている TXT-RAMアドレス */ } @@ -76,9 +87,10 @@ void IOOUTCALL pcg_o(UINT port, REG8 val 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 = TRAM_ANK(off); + if (TRAM_KNJ(off) & 0x90) { chr = chr & (~1); line = port & 15; } @@ -88,10 +100,13 @@ void IOOUTCALL pcg_o(UINT port, REG8 val } else { off = nowsyncoffset(&line); - chr = tram[TRAM_ANK + off]; + chr = TRAM_ANK(off); } chr += (port & 0x0300) - 0x100; - pcg.d[(chr << 3) + line] = value; + if (pcg.d[(chr << 3) + line] != value) { + pcg.d[(chr << 3) + line] = value; + crtc.e.scrnallflash = TRUE; + } } REG8 IOINPCALL pcg_i(UINT port) { @@ -105,11 +120,12 @@ REG8 IOINPCALL pcg_i(UINT port) { upper = port & 0x0300; if (crtc.s.SCRN_BITS & SCRN_PCGMODE) { + 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) { addr = ((((knj & 0x1f) << 8) + chr) << 4) + line; if (knj & 0x40) { @@ -126,8 +142,8 @@ REG8 IOINPCALL pcg_i(UINT port) { } else { off = pcg_offset(); - chr = tram[TRAM_ANK + off]; - if (tram[TRAM_KNJ + off] & 0x90) { + chr = TRAM_ANK(off); + if (TRAM_KNJ(off) & 0x90) { chr = chr & (~1); } else { @@ -137,7 +153,7 @@ REG8 IOINPCALL pcg_i(UINT port) { } else { off = nowsyncoffset(&line); - chr = tram[TRAM_ANK + off]; + chr = TRAM_ANK(off); } if (!upper) { return(font_ank[(chr << 3) + line]); @@ -149,7 +165,7 @@ REG8 IOINPCALL pcg_i(UINT port) { } -// ---- +/* initialize & reset */ void pcg_initialize(void) {