--- np2/io/gdc_sub.c 2004/02/14 07:56:51 1.11 +++ np2/io/gdc_sub.c 2004/02/20 16:20:41 1.16 @@ -20,6 +20,8 @@ typedef struct { SINT16 y2; } VECTDIR; +const UINT32 gdcplaneseg[4] = {VRAM_E, VRAM_B, VRAM_R, VRAM_G}; + static UINT16 gdc_rt[RT_TABLEMAX+1]; static const VECTDIR vectdir[16] = { @@ -85,7 +87,7 @@ REG8 gdcbitreverse(REG8 data) { #endif -void gdcsub_init(void) { +void gdcsub_initialize(void) { int i; @@ -102,22 +104,33 @@ void gdcslavewait(NEVENTITEM item) { } } +void gdcsub_setslavewait(UINT32 wait) { + + SINT32 clk; + + clk = nevent_getremain(NEVENT_GDCSLAVE); + if (clk < 0) { + clk = 0; + } + gdc.s_drawing = 8; // GDC DRAWING! + nevent_set(NEVENT_GDCSLAVE, clk + wait, gdcslavewait, NEVENT_ABSOLUTE); +} + static void calc_gdcslavewait(UINT dots) { SINT32 clk; clk = dots; - if (pccore.baseclock != PCBASECLOCK20) { - clk *= 27648; + if (pccore.cpumode & CPUMODE_8MHZ) { + clk *= 22464; } else { - clk *= 22464; + clk *= 27648; } clk *= pccore.multiple; clk /= 15625; clk += 30 * pccore.multiple; - gdc.s_drawing = 8; // GDC DRAWING! - nevent_set(NEVENT_GDCSLAVE, clk, gdcslavewait, NEVENT_ABSOLUTE); + gdcsub_setslavewait(clk); } void gdcsub_vect0(UINT32 csrw, const GDCVECT *vect, REG16 pat, REG8 ope) { @@ -221,7 +234,7 @@ const VECTDIR *dir; BYTE mulx; if (vect->ope & 0x80) { // SL - pat = (GDCPATREVERSE(pat) << 8) + GDCPATREVERSE(pat >> 8); + pat = (REG16)((GDCPATREVERSE(pat) << 8) + GDCPATREVERSE(pat >> 8)); } gdcpset_prepare(&pset, csrw, 0xffff, ope); multiple = (gdc.s.para[GDC_ZOOM] & 15) + 1; @@ -546,7 +559,7 @@ void gdcsub_write(void) { } gdcs.grphdisp |= (BYTE)updatebit; - ptr += vramplaneseg[(adrs >> 14) & 3]; + ptr += gdcplaneseg[(adrs >> 14) & 3]; adrs = (adrs & 0x3fff) << 1; calc_gdcslavewait(leng);