--- xmil/vram/scrndraw.c 2004/08/01 05:31:31 1.1 +++ xmil/vram/scrndraw.c 2004/08/17 16:52:46 1.9 @@ -1,15 +1,17 @@ #include "compiler.h" #include "scrnmng.h" #include "sysmng.h" +#include "pccore.h" +#include "iocore.h" #include "scrndraw.h" #include "sdraw.h" -#include "draw.h" #include "palettes.h" +#include "makescrn.h" SCRN scrn; - UINT8 renewalline[SCREEN_HEIGHT+4]; - UINT8 screenmap[SCREEN_WIDTH * SCREEN_HEIGHT]; + UINT8 renewalline[SURFACE_HEIGHT+4]; + UINT8 screenmap[SURFACE_SIZE]; static void updateallline(UINT32 update) { @@ -27,11 +29,11 @@ static void updateallline(UINT32 update) void scrndraw_initialize(void) { // ddraws_init ZeroMemory(screenmap, sizeof(screenmap)); - ZeroMemory(x1n_pal32, sizeof(x1n_pal32)); + ZeroMemory(xmil_pal32, sizeof(xmil_pal32)); + xmil_palettes = 0; scrn.widthmode = SCRNWIDTHMODE_WIDTH40; - xm_palettes = 0; updateallline(0x03030303); // updateallline(0x01010101); scrnmng_allflash(); sysmng_scrnwidth(scrn.widthmode); @@ -55,22 +57,89 @@ void scrndraw_changepalette(void) { return; } #endif -#if defined(SUPPORT_16BPP) - if (scrnmng_getbpp() == 16) { - pals_cnv16pal(x1n_pal16, x1n_pal32, xm_palettes); - } -#endif updateallline(0x01010101); // fillrenewalline(0x03030303) } + +// ---- + +#if defined(SUPPORT_PALEVENT) +static REG8 rasterdraw(SDRAWFN sdrawfn, SDRAW sdraw, int maxy) { + + UINT8 rgbp[8]; + SINT32 rasterclock; + SINT32 clock; + PAL1EVENT *event; + PAL1EVENT *eventterm; + int nextupdate; + int y; + + CopyMemory(rgbp, palevent.rgbp, 8); + rasterclock = crtc.e.rasterclock8; + if (crtc.s.SCRN_BITS & SCRN_24KHZ) { + rasterclock = rasterclock * 2; + } + clock = 0; + event = palevent.event; + eventterm = event + palevent.events; + nextupdate = 0; + + for (y=2; y= eventterm) { + break; + } + clock += rasterclock; + // お弁当はあった? + if (clock > (event->clock << 8)) { + pal_update1(rgbp); + (*sdrawfn)(sdraw, y); + nextupdate = y; + // お弁当を食べる + while(clock > (event->clock << 8)) { + ((UINT8 *)rgbp)[event->rgbp] = event->value; + event++; + if (event >= eventterm) { + break; + } + } + } + } + if (y < maxy) { + pal_update1(rgbp); + (*sdrawfn)(sdraw, maxy); + } + // 戻すすすす + pal_update1(crtc.s.rgbp); + + if (nextupdate) { + for (y=0; yxalign; sdraw.yalign = surf->yalign; +#if !defined(SUPPORT_PALEVENT) (*fn)(&sdraw, 400); +#else + if (((crtc.e.dispmode & SCRN64_MASK) != SCRN64_INVALID) || + (palevent.events >= SUPPORT_PALEVENT)) { + (*fn)(&sdraw, 400); + } + else { + ret = rasterdraw(*sdrawfn, &sdraw, 400); + } +#endif sddr_exit2: scrnmng_surfunlock(surf); sddr_exit1: - return(0); + return(ret); } void scrndraw_redraw(void) { scrnmng_allflash(); - scrnmng_palchanged(); // ? - updateallline(0x01010101); // fillrenewalline(0x03030303) - palettes(); - scrndraw_draw(FALSE); + pal_update(); + scrndraw_draw(TRUE); }