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);
--
⑨