--- xmil/vram/scrndraw.c 2004/08/17 12:30:41 1.7 +++ xmil/vram/scrndraw.c 2005/02/04 06:42:12 1.12 @@ -1,13 +1,13 @@ #include "compiler.h" #include "scrnmng.h" -#include "sysmng.h" +#include "pccore.h" +#include "iocore.h" #include "scrndraw.h" #include "sdraw.h" #include "palettes.h" #include "makescrn.h" - SCRN scrn; UINT8 renewalline[SURFACE_HEIGHT+4]; UINT8 screenmap[SURFACE_SIZE]; @@ -30,20 +30,8 @@ void scrndraw_initialize(void) { // ZeroMemory(xmil_pal32, sizeof(xmil_pal32)); xmil_palettes = 0; - scrn.widthmode = SCRNWIDTHMODE_WIDTH40; - updateallline(0x03030303); // updateallline(0x01010101); scrnmng_allflash(); - sysmng_scrnwidth(scrn.widthmode); -} - -void scrndraw_changewidth(REG8 widthmode) { - - if (scrn.widthmode != widthmode) { - scrn.widthmode = widthmode; - sysmng_scrnwidth(widthmode); - updateallline(0x01010101); // fillrenewalline(0x03030303) - } } void scrndraw_changepalette(void) { @@ -51,15 +39,81 @@ void scrndraw_changepalette(void) { #if defined(SUPPORT_8BPP) if (scrnmng_getbpp() == 8) { scrnmng_palchanged(); - updateallline(0x01010101); // fillrenewalline(0x02020202) return; } #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; yptr; +#if defined(SIZE_QVGA) + sdraw.width = surf->width >> 1; +#else sdraw.width = surf->width; - sdraw.xbytes = surf->xalign * surf->width; +#endif + sdraw.xbytes = surf->xalign * sdraw.width; sdraw.y = 0; sdraw.xalign = surf->xalign; sdraw.yalign = surf->yalign; +#if !defined(SUPPORT_PALEVENT) (*fn)(&sdraw, 400); +#else + if ((crtc.e.dispmode & SCRN64_ENABLE) || + (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) {