shithub: riscv

Download patch

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++){