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:
--
⑨