games/md: apply same screen flush changes from games/snes
This commit is contained in:
parent
763231588c
commit
e15d0126ad
|
@ -22,6 +22,7 @@ int dmaclock, vdpclock, z80clock, audioclock, ymclock, saveclock;
|
||||||
int scale, paused;
|
int scale, paused;
|
||||||
QLock pauselock;
|
QLock pauselock;
|
||||||
Mousectl *mc;
|
Mousectl *mc;
|
||||||
|
Channel *flushc;
|
||||||
Rectangle picr;
|
Rectangle picr;
|
||||||
Image *tmp, *bg;
|
Image *tmp, *bg;
|
||||||
|
|
||||||
|
@ -125,6 +126,51 @@ screeninit(void)
|
||||||
draw(screen, screen->r, bg, nil, ZP);
|
draw(screen, screen->r, bg, nil, ZP);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
screenproc(void *)
|
||||||
|
{
|
||||||
|
extern u8int pic[320*224*4*3];
|
||||||
|
Rectangle r;
|
||||||
|
uchar *s;
|
||||||
|
int w;
|
||||||
|
|
||||||
|
enum { AMOUSE, ARESIZE, AFLUSH, AEND };
|
||||||
|
Alt a[AEND+1] = {
|
||||||
|
{ mc->c, nil, CHANRCV },
|
||||||
|
{ mc->resizec, nil, CHANRCV },
|
||||||
|
{ flushc, nil, CHANRCV },
|
||||||
|
{ nil, nil, CHANEND }
|
||||||
|
};
|
||||||
|
|
||||||
|
for(;;){
|
||||||
|
switch(alt(a)){
|
||||||
|
case ARESIZE:
|
||||||
|
if(getwindow(display, Refnone) < 0)
|
||||||
|
sysfatal("resize failed: %r");
|
||||||
|
screeninit();
|
||||||
|
/* wet floor */
|
||||||
|
case AFLUSH:
|
||||||
|
if(scale == 1){
|
||||||
|
loadimage(tmp, tmp->r, pic, 320*224*4);
|
||||||
|
draw(screen, picr, tmp, nil, ZP);
|
||||||
|
}else{
|
||||||
|
s = pic;
|
||||||
|
r = picr;
|
||||||
|
w = 320*4*scale;
|
||||||
|
while(r.min.y < picr.max.y){
|
||||||
|
loadimage(tmp, tmp->r, s, w);
|
||||||
|
s += w;
|
||||||
|
r.max.y = r.min.y+scale;
|
||||||
|
draw(screen, r, tmp, nil, ZP);
|
||||||
|
r.min.y = r.max.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
flushimage(display, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
keyproc(void *)
|
keyproc(void *)
|
||||||
{
|
{
|
||||||
|
@ -202,13 +248,15 @@ threadmain(int argc, char **argv)
|
||||||
threadexitsall("usage");
|
threadexitsall("usage");
|
||||||
}
|
}
|
||||||
loadrom(*argv);
|
loadrom(*argv);
|
||||||
if(initdraw(nil, nil, nil) < 0)
|
if(initdraw(nil, nil, argv0) < 0)
|
||||||
sysfatal("initdraw: %r");
|
sysfatal("initdraw: %r");
|
||||||
proccreate(keyproc, nil, 8192);
|
flushc = chancreate(sizeof(ulong), 1);
|
||||||
mc = initmouse(nil, screen);
|
mc = initmouse(nil, screen);
|
||||||
if(mc == nil)
|
if(mc == nil)
|
||||||
sysfatal("initmouse: %r");
|
sysfatal("initmouse: %r");
|
||||||
screeninit();
|
screeninit();
|
||||||
|
proccreate(keyproc, nil, 8192);
|
||||||
|
proccreate(screenproc, nil, 8192);
|
||||||
cpureset();
|
cpureset();
|
||||||
vdpmode();
|
vdpmode();
|
||||||
ymreset();
|
ymreset();
|
||||||
|
@ -257,37 +305,10 @@ threadmain(int argc, char **argv)
|
||||||
void
|
void
|
||||||
flush(void)
|
flush(void)
|
||||||
{
|
{
|
||||||
extern uchar pic[320*224*2*3*3];
|
|
||||||
Mouse m;
|
|
||||||
Rectangle r;
|
|
||||||
uchar *s;
|
|
||||||
int w;
|
|
||||||
static vlong old, delta;
|
static vlong old, delta;
|
||||||
vlong new, diff;
|
vlong new, diff;
|
||||||
|
|
||||||
if(nbrecvul(mc->resizec) > 0){
|
sendul(flushc, 1); /* flush screen */
|
||||||
if(getwindow(display, Refnone) < 0)
|
|
||||||
sysfatal("resize failed: %r");
|
|
||||||
screeninit();
|
|
||||||
}
|
|
||||||
while(nbrecv(mc->c, &m) > 0)
|
|
||||||
;
|
|
||||||
if(scale == 1){
|
|
||||||
loadimage(tmp, tmp->r, pic, 320*224*4);
|
|
||||||
draw(screen, picr, tmp, nil, ZP);
|
|
||||||
}else{
|
|
||||||
s = pic;
|
|
||||||
r = picr;
|
|
||||||
w = 320*4*scale;
|
|
||||||
while(r.min.y < picr.max.y){
|
|
||||||
loadimage(tmp, tmp->r, s, w);
|
|
||||||
s += w;
|
|
||||||
r.max.y = r.min.y+scale;
|
|
||||||
draw(screen, r, tmp, nil, ZP);
|
|
||||||
r.min.y = r.max.y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
flushimage(display, 1);
|
|
||||||
if(audioout() < 0){
|
if(audioout() < 0){
|
||||||
new = nsec();
|
new = nsec();
|
||||||
diff = 0;
|
diff = 0;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include "dat.h"
|
#include "dat.h"
|
||||||
#include "fns.h"
|
#include "fns.h"
|
||||||
|
|
||||||
u8int pic[320*224*4*3*3];
|
u8int pic[320*224*4*3];
|
||||||
u16int vdpstat = 0x3400;
|
u16int vdpstat = 0x3400;
|
||||||
int vdpx, vdpy;
|
int vdpx, vdpy;
|
||||||
u16int hctr;
|
u16int hctr;
|
||||||
|
|
Loading…
Reference in a new issue