shithub: sms

Download patch

ref: 73a7877779639b957f662355b1aaea68160cc63c
parent: 53c0554f5de6f79a8fb546267a10ca085efe52a4
author: Jean-André Santoni <jean.andre.santoni@gmail.com>
date: Sat Jul 13 07:57:18 EDT 2024

Improve vdpctrl and remove some logs

--- a/mem.c
+++ b/mem.c
@@ -31,7 +31,7 @@
 
 	cram[a & 0x1f] = v;
 	w = v << 12 & 0xe00000 | v << 8 & 0xe000 | v << 4 & 0xe0;
-	cramc[a/2] = w;
+	cramc[a & 0x1f] = w;
 
 	printf("cramwrite %x %x\n", a, v);
 	for(int i=0;i<64;i++)
@@ -42,7 +42,7 @@
 uint8_t
 z80read(uint16_t a)
 {
-	printf("z80read %x\n", a);
+	// printf("z80read %x\n", a);
 	uint16_t v;
 
 	if (a < 0x400)
@@ -66,7 +66,7 @@
 void
 z80write(uint16_t a, uint8_t v)
 {
-	printf("z80write %x %x\n", a, v);
+	// printf("z80write %x %x\n", a, v);
 	if (a < 0x8000)
 		printf("wrong z80write page 0 or 1 %x %x\n", a, v);
 	else if (a < 0xC000)
@@ -117,7 +117,7 @@
 uint8_t
 z80in(uint8_t port)
 {
-	printf("z80in %x\n", port);
+	// printf("z80in %x\n", port);
 	if (port < 0x40)
 		return 0xff;
 	else if (port >= 0x40 && port < 0x80)
@@ -140,7 +140,7 @@
 void
 z80out(uint8_t port, uint8_t v)
 {
-	printf("z80out %x %x\n", port, v);
+	// printf("z80out %x %x\n", port, v);
 
 	if (port < 0x40){
 		printf("  write to control register\n");
@@ -153,7 +153,7 @@
 	}else if ((port >= 0x40) && (port < 0x80))
 		printf("  write to SN76489 PSG\n");
 	else if ((port >= 0x80) && (port < 0xC0)){
-		printf("  write to VDP\n");
+		// printf("  write to VDP\n");
 		if ((port & 0x01) == 0x00)
 			vdpdata(v);
 		else
--- a/sms.c
+++ b/sms.c
@@ -96,11 +96,11 @@
 void
 retro_run(void)
 {
+	printf("%d ================================\n", counter++);
 	input_poll_cb();
 	process_inputs();
 
 	while(!doflush){
-		printf("%d ================================\n", counter++);
 		t = z80step() * Z80DIV;
 		vdpclock -= t;
 
@@ -109,7 +109,7 @@
 			vdpclock += 8;
 		}
 	}
-	printf("flush\n");
+
 	video_cb(pic, 320, 224, 320*4);
 	// audioout();
 	doflush = 0;
--- a/vdp.c
+++ b/vdp.c
@@ -6,6 +6,7 @@
 
 uint8_t vdpcode;
 uint8_t vdpaddr;
+uint8_t vdpbuf;
 uint16_t vdpstat = 0x3400;
 int vdpx = 0, vdpy, vdpyy, frame, intla;
 uint16_t hctr;
@@ -99,7 +100,7 @@
 static void
 planeinit(void)
 {
-	printf("planeinit\n");
+	// printf("planeinit\n");
 	static int szs[] = {5, 6, 6, 7};
 	int v, a, i;
 	struct pctxt *p;
@@ -225,7 +226,7 @@
 static void
 spritesinit(void)
 {
-	printf("spritesinit\n");
+	// printf("spritesinit\n");
 	uint16_t t, *p, dy, c;
 	uint32_t v;
 	int i, ns, np, nt;
@@ -329,16 +330,26 @@
 void
 vdpctrl(uint8_t v)
 {
-	printf("    write to control port %x\n", v);
+	printf("    vdp write to control port %x\n", v);
 	vdpcode = (v >> 6) & 0x03;
 	vdpaddr = (vdpaddr & 0x00ff) | ((v & 0x3f) << 8);
+
+	switch(vdpcode){
+		case 0:
+			vdpbuf = vram[vdpaddr];
+			vdpaddr++;
+			vdpaddr &= 0x3fff;
+			break;
+		case 2: reg[v & 0x0f] = (vdpaddr & 0x00ff); break;
+	}
 }
 
 void
 vdpdata(uint8_t v)
 {
-	printf("    write to data port %x\n", v);
+	printf("    vdp write to data port %x\n", v);
 	switch(vdpcode){
+		case 0: case 1: case 2: vram[vdpaddr] = v; break;
 		case 3: cramwrite(vdpaddr, v); break;
 	}
 	vdpaddr++;
--- a/z80.c
+++ b/z80.c
@@ -43,9 +43,7 @@
 static uint16_t
 fetch16(void)
 {
-	uint16_t u;
-
-	u = z80read(pc++);
+	uint16_t u = z80read(pc++);
 	return u | z80read(pc++) << 8;
 }
 
@@ -71,9 +69,7 @@
 static uint16_t
 pop16(void)
 {
-	uint16_t v;
-
-	v = z80read(sp++);
+	uint16_t v = z80read(sp++);
 	return v | z80read(sp++) << 8;
 }
 
@@ -158,9 +154,9 @@
 		v4 = (s[rA] & 0x0f) + (~u & 0x0f) + (~s[rF] & 1);
 		v = s[rA] + (u ^ 0xff) + (~s[rF] & 1);
 		break;
-	case 4: {v = s[rA] & u; printf("result: %x <= %x & %x\n", (uint8_t)v, s[rA], u);} break;
-	case 5: {v = s[rA] ^ u; printf("result: %x <= %x ^ %x\n", (uint8_t)v, s[rA], u);} break;
-	case 6: {v = s[rA] | u; printf("result: %x <= %x | %x\n", (uint8_t)v, s[rA], u);} break;
+	case 4: v = s[rA] & u; break;
+	case 5: v = s[rA] ^ u; break;
+	case 6: v = s[rA] | u; break;
 	}
 	s[rF] = 0;
 	if((uint8_t)v == 0)
@@ -196,11 +192,7 @@
 static int
 branch(int cc, int t)
 {
-	uint16_t v;
-
-	printf("branch %x %x\n", cc, t);
-
-	v = (int8_t)fetch8();
+	uint16_t v = (int8_t)fetch8();
 	if(!cc)
 		return t + 7;
 	pc += v;
@@ -242,10 +234,8 @@
 static int
 addhl(uint16_t u)
 {
-	uint32_t v;
-
 	s[rF] &= ~(FLAGN|FLAGC|FLAGH);
-	v = HL() + u;
+	uint32_t v = HL() + u;
 	if((v & 0x10000) != 0)
 		s[rF] |= FLAGC;
 	if((HL() & 0xfff) + (u & 0xfff) >= 0x1000)
@@ -258,10 +248,8 @@
 static void
 adchl(uint16_t u)
 {
-	uint32_t v, v4;
-
-	v = HL() + u + (s[rF] & FLAGC);
-	v4 = (HL() & 0xfff) + (u & 0xfff) + (s[rF] & FLAGC);
+	uint32_t v = HL() + u + (s[rF] & FLAGC);
+	uint32_t v4 = (HL() & 0xfff) + (u & 0xfff) + (s[rF] & FLAGC);
 	s[rF] = 0;
 	if((v & 0x10000) != 0)
 		s[rF] |= FLAGC;
@@ -280,10 +268,8 @@
 static void
 sbchl(uint16_t u)
 {
-	uint32_t v, v4;
-
-	v = HL() + (uint16_t)~u + (~s[rF] & FLAGC);
-	v4 = (HL() & 0xfff) + (~u & 0xfff) + (~s[rF] & FLAGC);
+	uint32_t v = HL() + (uint16_t)~u + (~s[rF] & FLAGC);
+	uint32_t v4 = (HL() & 0xfff) + (~u & 0xfff) + (~s[rF] & FLAGC);
 	s[rF] = FLAGN;
 	if((v & 0x10000) == 0)
 		s[rF] |= FLAGC;
@@ -304,10 +290,8 @@
 static int
 addindex(int n, uint16_t u)
 {
-	uint32_t v;
-
 	s[rF] &= ~(FLAGN|FLAGC|FLAGH);
-	v = ix[n] + u;
+	uint32_t v = ix[n] + u;
 	if((v & 0x10000) != 0)
 		s[rF] |= FLAGC;
 	if((ix[n] & 0xfff) + (u & 0xfff) >= 0x1000)
@@ -319,9 +303,7 @@
 static int
 jump(int cc)
 {
-	uint16_t v;
-
-	v = fetch16();
+	uint16_t v = fetch16();
 	if(cc)
 		pc = v;
 	return 10;
@@ -340,9 +322,7 @@
 static void
 swap(uint8_t a)
 {
-	uint8_t v;
-
-	v = s[a];
+	uint8_t v = s[a];
 	s[a] = s[a + 8];
 	s[a + 8] = v;
 }
@@ -421,13 +401,13 @@
 	uint16_t a;
 
 	op = fetch8();
-	printf("ed %.2x\n", op);
+	// printf("ed %.2x\n", op);
 	switch(op){
 	case 0xa0: case 0xa1: case 0xa8: case 0xa9:
 	case 0xb0: case 0xb1: case 0xb8: case 0xb9:
 		switch(op & 3){
 		default:
-			uint8_t u = z80read(HL());
+			u = z80read(HL());
 			z80write(DE(), u);
 			s[rF] &= ~(FLAGN|FLAGH);
 			uint16_t n = s[rA] + u;
@@ -575,10 +555,9 @@
 static int
 index_(int n)
 {
-	uint8_t op;
 	uint16_t v;
 
-	op = fetch8();
+	uint8_t op = fetch8();
 	switch(op){
 	case 0x40: case 0x41: case 0x42: case 0x43: case 0x47:
 	case 0x48: case 0x49: case 0x4a: case 0x4b: case 0x4f:
@@ -685,10 +664,10 @@
 		}
 	}
 	curpc = pc;
-	if(1)
+	if(0)
 		printf("%x AF %.2x%.2x BC %.2x%.2x DE %.2x%.2x HL %.2x%.2x IX %.4x IY %.4x\n", curpc, s[rA], s[rF], s[rB], s[rC], s[rD], s[rE], s[rH], s[rL], ix[0], ix[1]);
 	op = fetch8();
-	printf("op: %x\n", op);
+	// printf("op: %x\n", op);
 	switch(op >> 6){
 	case 1: return move(op >> 3 & 7, op & 7);
 	case 2: return alu(op >> 3 & 7, op & 7);
--