shithub: sms

Download patch

ref: 67600add6ce675dc2578495cb12c9874db4bd617
parent: f7586fdd640283d9d7aa909e2055d5f578572ae3
author: Jean-André Santoni <jean.andre.santoni@gmail.com>
date: Fri Feb 27 06:41:55 EST 2026

Start working on audio

--- a/fns.h
+++ b/fns.h
@@ -16,7 +16,7 @@
 u8int vdphcounter(void);
 u8int vdpvcounter(void);
 void cramwrite(u16int, u8int);
-void initaudio(void);
+int audioout(void);
 void psginit(const u16int, const int);
 void psgwrite(const u8int);
 u16int psgstep();
--- a/mem.c
+++ b/mem.c
@@ -58,8 +58,8 @@
 		if (ram_enabled)
 			return ram[(a - 0x8000) + ram_bank];
 		else{
-			// printf("== page 2 %x %x %x\n", a, (a - 0x8000) + slotaddr[2], slotaddr[2]);
-			// printf("== rom[(a - 0x8000) + slotaddr[2]] %x\n", rom[(a - 0x8000) + slotaddr[2]]);
+			// print("== page 2 %x %x %x\n", a, (a - 0x8000) + slotaddr[2], slotaddr[2]);
+			// print("== rom[(a - 0x8000) + slotaddr[2]] %x\n", rom[(a - 0x8000) + slotaddr[2]]);
 			return rom[(a - 0x8000) + slotaddr[2]];
 		}
 	}else
@@ -69,7 +69,7 @@
 void
 z80write(u16int a, u8int v)
 {
-	// printf("z80write %x %x\n", a, v);
+	// print("z80write %x %x\n", a, v);
 	if (a < 0x8000)
 		print("wrong z80write page 0 or 1 %x %x", a, v);
 	else if (a < 0xC000)
@@ -84,7 +84,7 @@
 	}
 	else
 	{
-		// printf("z80write > 0xE000 %x %x\n", a, v);
+		// print("z80write > 0xE000 %x %x", a, v);
 		mem[a] = v;
 		mem[a - 0x2000]  = v;
 
@@ -92,20 +92,20 @@
 		{
 			case 0xFFFC:
 				ram_bank = (v & (1 << 2)) != 0 ? 0x4000 : 0;
-				// printf("RAM bank %x\n", ram_bank);
+				// print("RAM bank %x", ram_bank);
 				ram_enabled = (v & (1 << 3)) != 0 ? 1 : 0;
-				// printf("RAM enabled %x\n", ram_enabled);
+				// print("RAM enabled %x", ram_enabled);
 				break;
 			case 0xFFFD:
-				// printf("Switch mapper slot 0 to %d\n", (v & nbank-1));
+				// print("Switch mapper slot 0 to %d", (v & nbank-1));
 				slotaddr[0] = (v & nbank-1) * 0x4000;
 				break;
 			case 0xFFFE:
-				// printf("Switch mapper slot 1 to %d\n", (v & nbank-1));
+				// print("switch mapper slot 1 to %d", (v & nbank-1));
 				slotaddr[1] = (v & nbank-1) * 0x4000;
 				break;
 			case 0xFFFF:
-				// printf("Switch mapper slot 2 to %d\n", (v & nbank-1));
+				// print("switch mapper slot 2 to %d", (v & nbank-1));
 				slotaddr[2] = (v & nbank-1) * 0x4000;
 				break;
 		}
--- a/psg.c
+++ b/psg.c
@@ -8,6 +8,7 @@
 #define NOISE_TAPPED 0x9
 
 static int fd;
+static short sbuf[2 * 2000], *sbufp;
 
 static const u8int noise_table[3] = { 0x10, 0x20, 0x40 };
 static const short vol_table[16] = {
@@ -26,13 +27,6 @@
 static u8int curr_type;
 
 void
-psginit(const u16int rate, const int clockspd)
-{
-	cyclespersample = (double)clockspd / (double)PSGDIV/ (double)rate;
-	cyc = cyclespersample;
-}
-
-void
 psgwrite(const u8int data)
 {
 	int first = data & 128;
@@ -99,11 +93,32 @@
 	return vol(0) + vol(1) + vol(2) + vol(3);
 }
 
+int
+audioout(void)
+{
+	int rc;
+
+	if(sbufp == nil)
+		return -1;
+	if(sbufp == sbuf)
+		return 0;
+	rc = warp10 ? (sbufp - sbuf) * 2 : write(fd, sbuf, (sbufp - sbuf) * 2);
+	if(rc > 0)
+		sbufp -= (rc+1)/2;
+	if(sbufp < sbuf)
+		sbufp = sbuf;
+	return 0;
+}
+
 void
-initaudio(void)
+psginit(const u16int rate, const int clockspd)
 {
+	cyclespersample = (double)clockspd / (double)PSGDIV/ (double)rate;
+	cyc = cyclespersample;
+
 	fd = open("/dev/audio", OWRITE);
 	if(fd < 0)
 		return;
-	//sbufp = sbuf;
+
+	sbufp = sbuf;
 }
\ No newline at end of file
--- a/sms.c
+++ b/sms.c
@@ -13,7 +13,6 @@
 u32int irq;
 u8int rom[0x40000];
 u8int *mem = nil;
-u8int *pic = nil;
 int vdpclock = 0;
 int psgclock = 0;
 
@@ -32,9 +31,6 @@
 	memcpy(mem, rom, 0xC000);
 	pc = 0;
 
-	psginit(RATE, PSGCLOCK);
-	vdpmode();
-
 	close(fd);
 }
 
@@ -51,7 +47,7 @@
 	u16int v1, v2;
 
 	v1 = ~(keys & 0xffff);
-	v2 = ~(keys2 & 0xffff);
+	v2 = 0; //~(keys2 & 0xffff);
 
 	portDC = (v1 & 0x3f) + ((v2 << 6) & 0xc0);
 	portDD = ((v2 >> 2) & 0x0f) | 0xf0;
@@ -64,7 +60,7 @@
 
 	ARGBEGIN{
 	case 'a':
-		initaudio();
+		psginit(RATE, PSGCLOCK);
 		break;
 	case 'x':
 		fixscale = strtol(EARGF(usage()), nil, 0);
@@ -85,7 +81,6 @@
 	regkey("right", Kright, 1<<3);
 	z80reset();
 	vdpmode();
-	//ymreset();
 	for(;;){
 		process_inputs();
 		t = z80step();
@@ -103,5 +98,5 @@
 {
 	flushmouse(1);
 	flushscreen();
-	//flushaudio(audioout);
+	flushaudio(audioout);
 }
--- a/z80.c
+++ b/z80.c
@@ -412,7 +412,7 @@
 	u16int a, n;
 
 	op = fetch8();
-	// printf("ed %.2x\n", op);
+	// print("ed %.2x", op);
 	switch(op){
 	case 0xa0: case 0xa1: case 0xa8: case 0xa9:
 	case 0xb0: case 0xb1: case 0xb8: case 0xb9:
--