games/snes: bug fixes
This commit is contained in:
parent
11489407ec
commit
e5a6ebecd2
3 changed files with 36 additions and 16 deletions
|
@ -348,9 +348,12 @@ memread(u32int a)
|
|||
al = a;
|
||||
b = (a>>16) & 0x7f;
|
||||
if(al < 0x8000){
|
||||
if(b < 0x40)
|
||||
if(b < 0x40){
|
||||
if(hirom && al >= 0x6000 && nsram != 0)
|
||||
return sram[(b << 13 | al & 0x1ffff) & (nsram - 1)];
|
||||
return regread(al);
|
||||
if((b & 0xf8) == (hirom ? 0x20 : 0x70) && nsram != 0)
|
||||
}
|
||||
if(!hirom && (b & 0xf8) == 0x70 && nsram != 0)
|
||||
return sram[a & 0x07ffff & (nsram - 1)];
|
||||
}
|
||||
if(b >= 0x7e && (a & (1<<23)) == 0)
|
||||
|
@ -372,11 +375,16 @@ memwrite(u32int a, u8int v)
|
|||
mem[a - 0x7e0000] = v;
|
||||
if(al < 0x8000){
|
||||
if(b < 0x40){
|
||||
if(hirom && al >= 0x6000 && nsram != 0){
|
||||
sram[(b << 13 | al & 0x1fff) & (nsram - 1)] = v;
|
||||
goto save;
|
||||
}
|
||||
regwrite(a, v);
|
||||
return;
|
||||
}
|
||||
if((b & 0xf8) == (hirom ? 0x20 : 0x70) && nsram != 0){
|
||||
if(!hirom && (b & 0xf8) == 0x70 && nsram != 0){
|
||||
sram[a & 0x07ffff & (nsram - 1)] = v;
|
||||
save:
|
||||
if(saveclock == 0)
|
||||
saveclock = SAVEFREQ;
|
||||
return;
|
||||
|
|
|
@ -11,7 +11,7 @@ u16int vtime = 0x1ff, htime = 0x1ff, subcolor, mosatop;
|
|||
uchar pic[256*239*2*9];
|
||||
u16int m7[6], hofs[4], vofs[4];
|
||||
|
||||
enum { OBJ = 4, COL = 5, OBJNC = 6 };
|
||||
enum { OBJ = 4, COL = 5, OBJNC = 8 };
|
||||
|
||||
static u16int
|
||||
darken(u16int v)
|
||||
|
@ -290,8 +290,6 @@ bg(int n)
|
|||
u8int v;
|
||||
|
||||
p = bgctxts + n;
|
||||
if(p->sz == 0)
|
||||
return;
|
||||
v = bgpixel(p->c, p->nb, p->t & 0x4000);
|
||||
if(p->msz != 1)
|
||||
if(p->mx++ == 0)
|
||||
|
@ -348,11 +346,23 @@ bgsinit(void)
|
|||
static void
|
||||
bgs(void)
|
||||
{
|
||||
bg(0);
|
||||
bg(1);
|
||||
if(mode <= 1){
|
||||
switch(mode){
|
||||
case 0:
|
||||
bg(0);
|
||||
bg(1);
|
||||
bg(2);
|
||||
bg(3);
|
||||
break;
|
||||
case 1:
|
||||
bg(0);
|
||||
bg(1);
|
||||
bg(2);
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
bg(0);
|
||||
bg(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -510,7 +520,7 @@ static u16int
|
|||
colormath(void)
|
||||
{
|
||||
u16int v, w, r, g, b;
|
||||
u8int m, m2;
|
||||
u8int m, m2, div;
|
||||
int cw;
|
||||
|
||||
m = reg[CGWSEL];
|
||||
|
@ -536,31 +546,33 @@ colormath(void)
|
|||
case 2: if(cw < 0) cw = window(COL); if(cw) return v; break;
|
||||
default: return v;
|
||||
}
|
||||
div = (m2 & 0x40) != 0;
|
||||
if((m & 2) != 0){
|
||||
if((pixelcol[1] & 0x10000) != 0)
|
||||
w = pixelcol[1];
|
||||
else
|
||||
w = cgram[pixelcol[1] & 0xff];
|
||||
div = div && (pixelpri[1] & 0xf) != COL;
|
||||
}else
|
||||
w = subcolor;
|
||||
if((m2 & 0x80) != 0){
|
||||
r = (v & 0x7c00) - (w & 0x7c00);
|
||||
g = (v & 0x03e0) - (w & 0x03e0);
|
||||
b = (v & 0x001f) - (w & 0x001f);
|
||||
if((m2 & 0x40) != 0){
|
||||
if(r > 0x7c00) r = 0;
|
||||
if(g > 0x03e0) g = 0;
|
||||
if(b > 0x001f) b = 0;
|
||||
if(div){
|
||||
r = (r >> 1) & 0xfc00;
|
||||
g = (g >> 1) & 0xffe0;
|
||||
b >>= 1;
|
||||
}
|
||||
if(r > 0x7c00) r = 0;
|
||||
if(g > 0x03e0) g = 0;
|
||||
if(b > 0x001f) b = 0;
|
||||
return r | g | b;
|
||||
}else{
|
||||
r = (v & 0x7c00) + (w & 0x7c00);
|
||||
g = (v & 0x03e0) + (w & 0x03e0);
|
||||
b = (v & 0x001f) + (w & 0x001f);
|
||||
if((m2 & 0x40) != 0){
|
||||
if(div){
|
||||
r = (r >> 1) & 0xfc00;
|
||||
g = (g >> 1) & 0xffe0;
|
||||
b >>= 1;
|
||||
|
|
|
@ -233,8 +233,8 @@ usage:
|
|||
mc = initmouse(nil, screen);
|
||||
if(mc == nil)
|
||||
sysfatal("initmouse: %r");
|
||||
loadbat(argv[0]);
|
||||
screeninit();
|
||||
loadbat(argv[0]);
|
||||
proccreate(keyproc, 0, 8192);
|
||||
cpureset();
|
||||
memreset();
|
||||
|
|
Loading…
Reference in a new issue