shithub: sms

Download patch

ref: 756e800fc10c88e4f9b3b9dc31928714184a9ea0
parent: eb7b815c30cf34ef95bfc9480b66f0896a4d73d3
author: Jean-André Santoni <jean.andre.santoni@gmail.com>
date: Fri Jul 26 15:10:28 EDT 2024

Improve vdp bg + clean

--- a/dat.h
+++ b/dat.h
@@ -3,7 +3,6 @@
 extern uint32_t irq;
 
 extern uint8_t reg[16];
-extern uint8_t dma;
 
 extern uint8_t z80bus, z80irq;
 extern uint16_t pc, curpc;
@@ -29,29 +28,13 @@
 	PBNT    = 0x04,
 	SPRTAB  = 0x05,
 	BGCOL   = 0x07,
+	HORSCR  = 0x08,
+	VERSCR  = 0x09,
 	HORCTR  = 0x0a,
-	MODE3   = 0x0b,
-	MODE4   = 0x0c,
-	HORSCR  = 0x0d,
-	AUTOINC = 0x0f,
-	PLSIZ   = 0x10,
-	WINH    = 0x11,
-	WINV    = 0x12,
-	DMACL   = 0x13,
-	DMACH   = 0x14,
-	DMASRC0 = 0x15,
-	DMASRC1 = 0x16,
-	DMASRC2 = 0x17,
 
 	IE0     = 0x20,
 	IE1     = 0x10,
-	DMAEN   = 0x10,
-	SHI     = 0x08,
 
-	WIDE    = 0x01,
-
-	STATDMA = 0x02,
-	STATHBL = 0x04,
 	STATVBL = 0x08,
 	STATFR  = 0x10,
 	STATCOLL= 0x20,
--- a/mem.c
+++ b/mem.c
@@ -18,7 +18,6 @@
 };
 uint8_t ctl[15];
 
-uint8_t dma;
 uint8_t vdplatch;
 
 uint8_t z80bus = 0;
--- a/sms.c
+++ b/sms.c
@@ -17,20 +17,15 @@
 extern uint16_t pc, curpc, sp;
 uint32_t asp, irq, stop;
 int doflush = 0;
-// uint8_t header[0x7fff];
-// uint8_t *prg = NULL;
 uint8_t *rom = NULL;
 uint8_t *mem = NULL;
 uint8_t *pic = NULL;
-
 int vdpclock = 0;
+uint8_t keys[2];
 
 void
 loadrom(const uint8_t *data)
 {
-	// memcpy(header, data, sizeof(header));
-	// prg = malloc(0xC000);
-	// memcpy(prg, data+sizeof(header), 0xC000);
 	pic = malloc(320 * 224 * 4);
 	rom = malloc(0x40000);
 	memcpy(rom, data, 0x40000);
@@ -86,15 +81,13 @@
 	return true;
 }
 
-uint8_t keys[2];
-
 static const int retro_bind[] = {
-	[RETRO_DEVICE_ID_JOYPAD_UP] = 0,
-	[RETRO_DEVICE_ID_JOYPAD_DOWN] = 1<<1,
-	[RETRO_DEVICE_ID_JOYPAD_LEFT] = 1<<2,
+	[RETRO_DEVICE_ID_JOYPAD_UP]    = 0,
+	[RETRO_DEVICE_ID_JOYPAD_DOWN]  = 1<<1,
+	[RETRO_DEVICE_ID_JOYPAD_LEFT]  = 1<<2,
 	[RETRO_DEVICE_ID_JOYPAD_RIGHT] = 1<<3,
-	[RETRO_DEVICE_ID_JOYPAD_A] = 1<<4,
-	[RETRO_DEVICE_ID_JOYPAD_B] = 1<<5,
+	[RETRO_DEVICE_ID_JOYPAD_A]     = 1<<4,
+	[RETRO_DEVICE_ID_JOYPAD_B]     = 1<<5,
 	[RETRO_DEVICE_ID_JOYPAD_START] = 1<<6,
 };
 
--- a/vdp.c
+++ b/vdp.c
@@ -12,7 +12,6 @@
 int first = 1;
 uint16_t hctr;
 static int xmax, xdisp;
-static int sx, snx, col, pri;
 enum { ymax = 262, yvbl = 234 };
 
 void
@@ -20,7 +19,6 @@
 {
 	xmax = 320;
 	xdisp = 256;
-	intla = (reg[MODE4] & 6) == 6;
 }
 
 static void
@@ -42,11 +40,14 @@
 {
 	uint16_t screenmap = (reg[PANT] & 0x0e) << 10;
 
-	int ty = vdpy >> 3;
-	int tyoff = vdpy & 7;
+	uint8_t y = vdpy + reg[VERSCR];
+	if (y >= 224) y -= 224;
+	int ty = y >> 3;
+	int tyoff = y & 7;
 
-	int tx = vdpx >> 3;
-	int txoff = vdpx & 7;
+	uint8_t x = vdpx - reg[HORSCR];
+	int tx = x >> 3;
+	int txoff = x & 7;
 
 	uint16_t taddr = screenmap + (((ty << 5) + tx) << 1);
 	int tidx = vram[taddr];
@@ -54,7 +55,7 @@
 
 	int hflip = (info & 1 << 1) != 0;
 	int vflip = (info & 1 << 2) != 0;
-	int paloff = (info & 1 << 3) != 0 ? 0x20 : 0x00;
+	int paloff = (info & 1 << 3) != 0 ? 16 : 0;
 
 	int data = (tidx << 5) + ((vflip ? 7 - tyoff : tyoff) << 2);
 	int xx = 7 - txoff;
@@ -65,7 +66,7 @@
 			(((vram[data + 2] >> xx) & 1) << 2) +
 			(((vram[data + 3] >> xx) & 1) << 3);
 
-	if(c > 0) pixeldraw(vdpx, vdpy, cramc[c + paloff]);
+	pixeldraw(vdpx, vdpy, cramc[c + paloff]);
 }
 
 int sprlst[64] = {-1};
@@ -226,9 +227,8 @@
 
 	if(vdpx < 320 && vdpy < 192)
 		if(vdpx < xdisp){
-			col = reg[BGCOL] & 0x0f + 16;
-			pri = 0;
-			pixeldraw(vdpx, vdpy, col);
+			int c = (reg[BGCOL] & 0x0f) + 16;
+			pixeldraw(vdpx, vdpy, c);
 			planes();
 			sprites();
 		}else
--- a/z80.c
+++ b/z80.c
@@ -495,12 +495,12 @@
 		v = z80read(HL());
 		z80write(HL(), v >> 4 | s[rA] << 4);
 		s[rA] = s[rA] & 0xf0 | v & 0x0f;
-		if(0){
+#if 0
 	case 0x6f:
 			v = z80read(HL());
 			z80write(HL(), v << 4 | s[rA] & 0xf);
 			s[rA] = s[rA] & 0xf0 | v >> 4;
-		}
+#endif
 		s[rF] &= FLAGC;
 		if(s[rA] == 0)
 			s[rF] |= FLAGZ;
--