summaryrefslogtreecommitdiff
path: root/src/zx81.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/zx81.c')
-rw-r--r--src/zx81.c96
1 files changed, 72 insertions, 24 deletions
diff --git a/src/zx81.c b/src/zx81.c
index 603bbd9..a7299e4 100644
--- a/src/zx81.c
+++ b/src/zx81.c
@@ -51,21 +51,21 @@ static const int ROMLEN=0x2000;
static const int ROM_SAVE=0x2fc;
static const int ROM_LOAD=0x347;
-/* No of cycles in each 64us HSYNC (hopefully)
+/* No of T-states in each 64us HSYNC (hopefully)
*/
-static const int HSYNC_PERIOD=321;
+static const Z80Val HSYNC_PERIOD=321;
/* The ZX81 screen
*/
-static const int SCR_W=256;
-static const int SCR_H=192;
-static const int TXT_W=32;
-static const int TXT_H=24;
+static int scr_enable=TRUE;
-/* These assume a 320x200 screen
-*/
-static const int OFF_X=(320-256)/2;
-static const int OFF_Y=(200-192)/2;
+#define SCR_W 256
+#define SCR_H 192
+#define TXT_W 32
+#define TXT_H 24
+
+#define OFF_X (GFX_WIDTH-SCR_W)/2
+#define OFF_Y (GFX_HEIGHT-SCR_H)/2
static Z80Byte mem[0x10000];
@@ -249,7 +249,7 @@ static void LoadTape(Z80State *state)
if (strlen(p)==0)
{
- GUIMessage("ERROR","Can't load empty filename");
+ GUIMessage(eMessageBox,"ERROR","Can't load empty filename");
return;
}
@@ -260,7 +260,7 @@ static void LoadTape(Z80State *state)
if (!(fp=fopen(path,"rb")))
{
- GUIMessage("ERROR","Can't load file:\n%s",path);
+ GUIMessage(eMessageBox,"ERROR","Can't load file:\n%s",path);
return;
}
@@ -288,7 +288,7 @@ static void SaveTape(Z80State *state)
if (strlen(p)==0)
{
- GUIMessage("ERROR","Can't save empty filename");
+ GUIMessage(eMessageBox,"ERROR","Can't save empty filename");
return;
}
@@ -299,7 +299,7 @@ static void SaveTape(Z80State *state)
if (!(fp=fopen(path,"wb")))
{
- GUIMessage("ERROR","Can't write file:\n%s",path);
+ GUIMessage(eMessageBox,"ERROR","Can't write file:\n%s",path);
return;
}
@@ -345,6 +345,9 @@ static void ULA_Video_Shifter(Z80 *z80, Z80Byte val)
int inv;
int b;
+ if (!scr_enable)
+ return;
+
Z80GetState(z80,&state);
/* Extra check due to out dodgy ULA emulation
@@ -396,12 +399,12 @@ static int CheckTimers(Z80 *z80, Z80Val val)
{
if (val>HSYNC_PERIOD)
{
- Z80ResetCycles(z80,0);
+ Z80ResetCycles(z80,val-HSYNC_PERIOD);
- if (nmigen)
+ if (nmigen && hsync)
{
- Z80NMI(z80,0xff);
- printf("NMIGEN\n");
+ Z80NMI(z80);
+ /*printf("NMIGEN\n");*/
}
else if (hsync)
{
@@ -429,22 +432,24 @@ void ZX81Init(Z80 *z80)
if (!(fp=fopen(SConfig(CONF_ROMFILE),"rb")))
{
- GUIMessage("ERROR","Failed to open ZX81 ROM\n%s",SConfig(CONF_ROMFILE));
+ GUIMessage(eMessageBox,
+ "ERROR","Failed to open ZX81 ROM\n%s",SConfig(CONF_ROMFILE));
Exit("");
}
if (fread(mem,1,ROMLEN,fp)!=ROMLEN)
{
fclose(fp);
- GUIMessage("ERROR","ROM file must be %d bytes long\n",ROMLEN);
+ GUIMessage(eMessageBox,
+ "ERROR","ROM file must be %d bytes long\n",ROMLEN);
Exit("");
}
/* Patch the ROM
*/
RomPatch();
- Z80LodgeCallback(z80,Z80_EDHook,EDCallback);
- Z80LodgeCallback(z80,Z80_Fetch,CheckTimers);
+ Z80LodgeCallback(z80,eZ80_EDHook,EDCallback);
+ Z80LodgeCallback(z80,eZ80_Instruction,CheckTimers);
/* Mirror the ROM
*/
@@ -544,6 +549,16 @@ Z80Byte ZX81ReadMem(Z80 *z80, Z80Word addr)
}
+Z80Word ZX81ReadWord(Z80 *z80, Z80Word addr)
+{
+ Z80Word l,h;
+
+ l=ZX81ReadMem(z80,addr);
+ h=ZX81ReadMem(z80,addr+1);
+ return (h<<8)|l;
+}
+
+
void ZX81WriteMem(Z80 *z80, Z80Word addr, Z80Byte val)
{
addr=addr&0x7fff;
@@ -553,6 +568,18 @@ void ZX81WriteMem(Z80 *z80, Z80Word addr, Z80Byte val)
}
+void ZX81WriteWord(Z80 *z80, Z80Word addr, Z80Word val)
+{
+ if (addr>=RAMBOT && addr<=RAMTOP)
+ mem[addr]=val&0xff;
+
+ addr++;
+
+ if (addr>=RAMBOT && addr<=RAMTOP)
+ mem[addr]=val>>8;
+}
+
+
Z80Byte ZX81ReadPort(Z80 *z80, Z80Word port)
{
Z80Byte b=0;
@@ -597,6 +624,7 @@ Z80Byte ZX81ReadPort(Z80 *z80, Z80Word port)
*/
if (!nmigen && hsync)
{
+ printf("HSYNC OFF\n");
hsync=FALSE;
GFXEndFrame(TRUE);
@@ -637,14 +665,17 @@ void ZX81WritePort(Z80 *z80, Z80Word port, Z80Byte val)
switch(port&0xff)
{
case 0xfd: /* NMI generator OFF */
+ printf("NMIGEN OFF\n");
nmigen=FALSE;
break;
case 0xfe: /* NMI generator ON */
+ printf("NMIGEN ON\n");
nmigen=TRUE;
break;
case 0xff: /* HSYNC generator ON */
+ printf("HSYNC ON\n");
hsync=TRUE;
Z80ResetCycles(z80,0);
break;
@@ -662,12 +693,29 @@ const char *ZX81Info(Z80 *z80)
{
static char buff[80];
- sprintf(buff,"NMIGEN: %s HSYNC: %s",
+ sprintf(buff,"NMI: %s HS: %s ULA: (%d,%d,%d,%d)",
nmigen ? "ON":"OFF",
- hsync ? "ON":"OFF");
+ hsync ? "ON":"OFF",
+ ULA.x,ULA.y,ULA.c,ULA.release);
return buff;
}
+void ZX81EnableScreen(int enable)
+{
+ scr_enable=enable;
+}
+
+
+void ZX81Reset(Z80 *z80)
+{
+ scr_enable=TRUE;
+ nmigen=FALSE;
+ hsync=FALSE;
+
+ GFXStartFrame();
+}
+
+
/* END OF FILE */