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