ref: f02938865de648be37f836b50bec65bf3327629b
parent: fcd896071ef85285b0a6dfcae57f927532d90337
author: Jean-André Santoni <jean.andre.santoni@gmail.com>
date: Sun Jul 7 17:52:29 EDT 2024
Implement or stub ed78, ed61, ed69
--- a/dat.h
+++ b/dat.h
@@ -12,8 +12,6 @@
extern uint8_t *prg;
extern uint8_t *rom;
extern uint8_t *mem;
-extern uint8_t *sram;
-extern uint32_t sramctl, sram0, sram1;
enum {MODE1 = 0x00,
--- a/mem.c
+++ b/mem.c
@@ -6,7 +6,8 @@
#define sysfatal(fmt, ...){printf(fmt"\n", ##__VA_ARGS__); exit(EXIT_FAILURE);}-uint16_t ram[32768], vram[32768];
+uint16_t ram[32768] = {0};+uint16_t vram[32768];
uint16_t cram[64], vsram[40];
uint32_t cramc[64];
uint8_t zram[8192];
@@ -20,7 +21,8 @@
uint8_t yma1, yma2;
uint8_t z80bus = 0;
-uint16_t z80bank;
+uint16_t ram_bank;
+uint8_t ram_enabled = 0;
int slotaddr[3] = {0, 0, 0};int nbank = 16;
@@ -38,9 +40,13 @@
else if (a < 0x8000)
return rom[(a - 0x4000) + slotaddr[1]];
else if (a < 0xC000){- 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]]);- return rom[(a - 0x8000) + slotaddr[2]];
+ 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]]);+ return rom[(a - 0x8000) + slotaddr[2]];
+ }
}else
return mem[a];
}
@@ -50,35 +56,43 @@
{ printf("z80write %x %x\n", a, v);if (a < 0x8000)
- printf("wrong z80write %x %x\n", a, v);- else if (a < 0xE000)
- {- rom[a] = v;
- rom[a + 0x2000] = v;
- }
+ printf("wrong z80write page 0 or 1 %x %x\n", a, v);+ else if (a < 0xC000)
+ if (ram_enabled)
+ ram[(a - 0x8000) + ram_bank] = v;
+ else
+ printf("wrong z80write page 2 %x %x\n", a, v);+ else if (a < 0xE000)
+ {+ mem[a] = v;
+ mem[a + 0x2000] = v;
+ }
else
{- printf("z80write > 0xE000 %x %x\n", a, v);- rom[a] = v;
- rom[a - 0x2000] = v;
+ // printf("z80write > 0xE000 %x %x\n", a, v);+ mem[a] = v;
+ mem[a - 0x2000] = v;
- switch (a)
- {- case 0xFFFC:
- printf("Persistent RAM");- break;
- case 0xFFFD:
- printf("Switch mapper slot 0 to %d\n", (v & nbank-1));- slotaddr[0] = (v & nbank-1) * 0x4000;
- break;
- case 0xFFFE:
- printf("Switch mapper slot 1 to %d\n", (v & nbank-1));- slotaddr[1] = (v & nbank-1) * 0x4000;
- break;
- case 0xFFFF:
- printf("Switch mapper slot 2 to %d\n", (v & nbank-1));- slotaddr[2] = (v & nbank-1) * 0x4000;
- break;
+ switch (a)
+ {+ case 0xFFFC:
+ ram_bank = (v & (1 << 2)) != 0 ? 0x4000 : 0;
+ printf("RAM bank %x\n", ram_bank);+ ram_enabled = (v & (1 << 3)) != 0 ? 1 : 0;
+ printf("RAM enabled %x\n", ram_enabled);+ break;
+ case 0xFFFD:
+ printf("Switch mapper slot 0 to %d\n", (v & nbank-1));+ slotaddr[0] = (v & nbank-1) * 0x4000;
+ break;
+ case 0xFFFE:
+ printf("Switch mapper slot 1 to %d\n", (v & nbank-1));+ slotaddr[1] = (v & nbank-1) * 0x4000;
+ break;
+ case 0xFFFF:
+ printf("Switch mapper slot 2 to %d\n", (v & nbank-1));+ slotaddr[2] = (v & nbank-1) * 0x4000;
+ break;
}
}
}
@@ -86,10 +100,23 @@
uint8_t
z80in(uint8_t a)
{+ printf("z80in %x\n", a);+ if (a == 0xBF)
+ return 0x1F;
return 0xff;
}
void
-z80out(uint8_t a, uint8_t b)
+z80out(uint8_t port, uint8_t v)
{+ printf("z80out %x %x\n", port, v);+
+ if (port < 0x40)
+ printf(" write to control register\n");+ else if ((port >= 0x40) && (port < 0x80))
+ printf(" write to SN76489 PSG\n");+ else if ((port >= 0x80) && (port < 0xC0))
+ printf(" write to VDP\n");+ else
+ printf(" write with no effect\n");}
--- a/sms.c
+++ b/sms.c
@@ -15,8 +15,6 @@
uint32_t r[16], pc, curpc;
extern uint16_t spc, scurpc, sp;
uint32_t asp, irq, stop;
-uint8_t *sram;
-uint32_t sramctl, nsram, sram0, sram1;
int doflush = 0;
// uint8_t header[0x7fff];
// uint8_t *prg = NULL;
--- a/z80.c
+++ b/z80.c
@@ -109,6 +109,7 @@
static int
alu(uint8_t op, uint8_t n)
{+ printf("alu %x %x\n", op, n);uint8_t v4;
uint8_t u;
uint16_t v;
@@ -149,13 +150,13 @@
v4 = (s[rA] & 0x0f) + (~u & 0x0f) + (~s[rF] & 1);
v = s[rA] + (u ^ 0xff) + (~s[rF] & 1);
break;
- case 4: v = s[rA] & u; break;
- case 5: v = s[rA] ^ u; break;
- case 6: v = s[rA] | u; 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;}
s[rF] = 0;
if((uint8_t)v == 0)
- s[rF] |= FLAGZ;
+ { s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }if((v & 0x80) != 0)
s[rF] |= FLAGS;
if(op < 2){@@ -188,7 +189,9 @@
branch(int cc, int t)
{uint16_t v;
-
+
+ printf("branch %x %x\n", cc, t);+
v = (int8_t)fetch8();
if(!cc)
return t + 7;
@@ -202,7 +205,7 @@
s[rF] &= FLAGC;
++v;
if(v == 0)
- s[rF] |= FLAGZ;
+ { s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }if((v & 0x80) != 0)
s[rF] |= FLAGS;
if(v == 0x80)
@@ -218,7 +221,7 @@
--v;
s[rF] = s[rF] & FLAGC | FLAGN;
if(v == 0)
- s[rF] |= FLAGZ;
+ { s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }if((v & 0x80) != 0)
s[rF] |= FLAGS;
if(v == 0x7f)
@@ -257,7 +260,7 @@
if((v4 & 0x1000) != 0)
s[rF] |= FLAGH;
if((uint16_t)v == 0)
- s[rF] |= FLAGZ;
+ { s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }if((v & 0x8000) != 0)
s[rF] |= FLAGS;
if((~(HL() ^ u) & (HL() ^ v) & 0x8000) != 0)
@@ -279,7 +282,7 @@
if((v4 & 0x1000) == 0)
s[rF] |= FLAGH;
if((uint16_t)v == 0)
- s[rF] |= FLAGZ;
+ { s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }if((v & 0x8000) != 0)
s[rF] |= FLAGS;
if(((HL() ^ u) & (HL() ^ v) & 0x8000) != 0)
@@ -377,7 +380,7 @@
case 7: s[rF] = v & 1; v >>= 1; break;
}
if(v == 0)
- s[rF] |= FLAGZ;
+ { s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }if((v & 0x80) != 0)
s[rF] |= FLAGS;
if(!parity(v))
@@ -386,7 +389,7 @@
case 1:
s[rF] = s[rF] & ~(FLAGN|FLAGZ) | FLAGH;
if((v & 1<<m) == 0)
- s[rF] |= FLAGZ;
+ { s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }return t;
case 2:
v &= ~(1<<m);
@@ -425,7 +428,7 @@
if((v & 0x80) != 0)
s[rF] |= FLAGS;
if(v == 0)
- s[rF] |= FLAGZ;
+ { s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }if((s[rA] & 0xf) < (u & 0xf))
s[rF] |= FLAGH;
break;
@@ -464,7 +467,7 @@
s[rA] = -s[rA];
s[rF] = FLAGN;
if(s[rA] == 0)
- s[rF] |= FLAGZ;
+ { s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }else
s[rF] |= FLAGC;
if((s[rA] & 0x80) != 0)
@@ -490,7 +493,7 @@
}
s[rF] &= FLAGC;
if(s[rA] == 0)
- s[rF] |= FLAGZ;
+ { s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }if((s[rA] & 0x80) != 0)
s[rF] |= FLAGS;
if(!parity(s[rA]))
@@ -507,9 +510,9 @@
case 0x4d: spc = pop16(); return 14;
case 0x5e: intm = intm & 0xc0 | 2; return 8;
case 0x4f: return 9;
- case 0x78: printf("- ed78\n"); return 0;- case 0x61: printf("- ed61\n"); return 0;- case 0x69: printf("- ed69\n"); return 0;+ case 0x78: s[rA] = z80in(s[rC]); return 12;
+ case 0x61: z80out(s[rC], s[rH]); return 12;
+ case 0x69: z80out(s[rC], s[rL]); return 12;
}
sysfatal("undefined z80 opcode ed%.2x at pc=%#.4x", op, scurpc);return 0;
@@ -628,7 +631,7 @@
}
}
scurpc = spc;
- if(1)
+ if(0)
printf("%x AF %.2x%.2x BC %.2x%.2x DE %.2x%.2x HL %.2x%.2x IX %.4x IY %.4x\n", scurpc, 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);@@ -695,7 +698,7 @@
if(!parity(s[rA]))
s[rF] |= FLAGV;
if(s[rA] == 0)
- s[rF] |= FLAGZ;
+ { s[rF] |= FLAGZ; printf("toggle zero <-------------------------------\n"); }if((s[rA] & 0x80) != 0)
s[rF] |= FLAGS;
return 4;
@@ -784,7 +787,7 @@
case 0xd7: return call(0x10, 1);
case 0xe7: return call(0x20, 1);
case 0xf7: return call(0x30, 1);
- case 0xc8: if((s[rF] & FLAGZ) != 0) {spc = pop16(); return 11;} return 5;+ case 0xc8: if((s[rF] & FLAGZ) != 0) {spc = pop16(); return 11;} return 5; // s[rF] should be 44 not 84 case 0xd8: if((s[rF] & FLAGC) != 0) {spc = pop16(); return 11;} return 5; case 0xe8: if((s[rF] & FLAGV) != 0) {spc = pop16(); return 11;} return 5; case 0xf8: if((s[rF] & FLAGS) != 0) {spc = pop16(); return 11;} return 5;--
⑨