ref: 79355486f7722877e518ee6117cf6894febd1f9b
parent: 93cfa1be72e18029d242ca462da3484488d1c6b3
author: aiju <devnull@localhost>
date: Sat May 24 21:11:21 EDT 2014
games/md: first bug fixes
--- a/sys/src/games/md/cpu.c
+++ b/sys/src/games/md/cpu.c
@@ -126,7 +126,7 @@
case 3:
w = fetch16();
v = r[w >> 12];
- if((v & 1<<11) == 0)
+ if((w & 1<<11) == 0)
v = (s16int)v;
return (u32int)(pc + v + (s8int)w - 2);
case 4:
@@ -461,7 +461,7 @@
int n, m, d;
static int cnt;
- if(0){
+ if(0 && pc == 0x13dc4){
trace++;
print("%x\n", curpc);
}
@@ -806,7 +806,7 @@
}
if(s == 3){ /* Scc */
a = amode(op >> 3, op, 0);
- wmode(a, s, -cond((op >> 8) & 0xf));
+ wmode(a, 0, -cond(op >> 8 & 0xf));
break;
} /* ADDQ, SUBQ */
rS |= FLAGZ;
--- a/sys/src/games/md/mem.c
+++ b/sys/src/games/md/mem.c
@@ -171,6 +171,8 @@
u16int *p;
u16int w;
+ if(0 && (a & 0xe0fffe) == 0xe0b1f4)
+ print("%x %x %x\n", curpc, v, m);
switch((a >> 21) & 7){
case 5:
switch(a >> 16 & 0xff){
@@ -193,7 +195,7 @@
dma = 4;
vdpdata = v >> 8;
p = &vram[vdpaddr / 2];
- if((vdpaddr & 1) != 0)
+ if((vdpaddr & 1) == 0)
*p = *p & 0xff | v << 8;
else
*p = *p & 0xff00 | v & 0xff;
--- a/sys/src/games/md/vdp.c
+++ b/sys/src/games/md/vdp.c
@@ -207,6 +207,8 @@
if((q->t & 0x1000) != 0)
dy = q->h + ~dy;
q->x = (p[3] & 0x3ff) - 128;
+ if(q->x == 0xff80)
+ break;
q->w = (p[1] >> 10 & 3) + 1 << 3;
c = vram + ((q->t & 0x7ff) << 4) + (dy << 1);
for(i = 0; i < q->w >> 3 && np < xdisp; i++){