Re-organisation of video emulation.

This commit is contained in:
TomW 2013-06-24 20:42:35 +01:00
commit 58085bcc87
86 changed files with 8087 additions and 7229 deletions

View file

@ -1,7 +1,6 @@
#include "ibm.h"
#include "vid_ati_eeprom.h"
static uint16_t eeprom[256];
enum
{
EEPROM_IDLE,
@ -29,201 +28,193 @@ enum
EEPROM_OP_EWEN = 3
};
static int oldclk, oldena;
static int eeprom_opcode, eeprom_state, eeprom_count, eeprom_out;
static int eeprom_wp;
static uint32_t eeprom_dat;
static int eeprom_type;
static char eeprom_fn[256] = {0};
void ati_eeprom_load(char *fn, int type)
void ati_eeprom_load(ati_eeprom_t *eeprom, char *fn, int type)
{
FILE *f;
eeprom_type = type;
strcpy(eeprom_fn, fn);
f = romfopen(eeprom_fn, "rb");
eeprom->type = type;
strcpy(eeprom->fn, fn);
f = romfopen(eeprom->fn, "rb");
if (!f)
{
memset(eeprom, 0, type ? 512 : 128);
memset(eeprom->data, 0, eeprom->type ? 512 : 128);
return;
}
fread(eeprom, 1, type ? 512 : 128, f);
fread(eeprom->data, 1, eeprom->type ? 512 : 128, f);
fclose(f);
}
void ati_eeprom_save()
void ati_eeprom_save(ati_eeprom_t *eeprom)
{
FILE *f = romfopen(eeprom_fn, "wb");
FILE *f = romfopen(eeprom->fn, "wb");
if (!f) return;
fwrite(eeprom, 1, eeprom_type ? 512 : 128, f);
fwrite(eeprom->data, 1, eeprom->type ? 512 : 128, f);
fclose(f);
}
void ati_eeprom_write(int ena, int clk, int dat)
void ati_eeprom_write(ati_eeprom_t *eeprom, int ena, int clk, int dat)
{
int c;
pclog("EEPROM write %i %i %i\n", ena, clk, dat);
if (!ena)
{
eeprom_out = 1;
eeprom->out = 1;
}
if (clk && !oldclk)
if (clk && !eeprom->oldclk)
{
if (ena && !oldena)
if (ena && !eeprom->oldena)
{
eeprom_state = EEPROM_WAIT;
eeprom_opcode = 0;
eeprom_count = 3;
eeprom_out = 1;
eeprom->state = EEPROM_WAIT;
eeprom->opcode = 0;
eeprom->count = 3;
eeprom->out = 1;
}
else if (ena)
{
pclog("EEPROM receive %i %i %i\n", ena, clk, dat);
switch (eeprom_state)
switch (eeprom->state)
{
case EEPROM_WAIT:
if (!dat)
break;
eeprom_state = EEPROM_OPCODE;
eeprom->state = EEPROM_OPCODE;
/* fall through */
case EEPROM_OPCODE:
eeprom_opcode = (eeprom_opcode << 1) | (dat ? 1 : 0);
eeprom_count--;
if (!eeprom_count)
eeprom->opcode = (eeprom->opcode << 1) | (dat ? 1 : 0);
eeprom->count--;
if (!eeprom->count)
{
pclog("EEPROM opcode - %i\n", eeprom_opcode);
switch (eeprom_opcode)
pclog("EEPROM opcode - %i\n", eeprom->opcode);
switch (eeprom->opcode)
{
case EEPROM_OP_WRITE:
eeprom_count = eeprom_type ? 24 : 22;
eeprom_state = EEPROM_INPUT;
eeprom_dat = 0;
eeprom->count = eeprom->type ? 24 : 22;
eeprom->state = EEPROM_INPUT;
eeprom->dat = 0;
break;
case EEPROM_OP_READ:
eeprom_count = eeprom_type ? 8 : 6;
eeprom_state = EEPROM_INPUT;
eeprom_dat = 0;
eeprom->count = eeprom->type ? 8 : 6;
eeprom->state = EEPROM_INPUT;
eeprom->dat = 0;
break;
case EEPROM_OP_EW:
eeprom_count = 2;
eeprom_state = EEPROM_INPUT;
eeprom_dat = 0;
eeprom->count = 2;
eeprom->state = EEPROM_INPUT;
eeprom->dat = 0;
break;
case EEPROM_OP_ERASE:
eeprom_count = eeprom_type ? 8 : 6;
eeprom_state = EEPROM_INPUT;
eeprom_dat = 0;
eeprom->count = eeprom->type ? 8 : 6;
eeprom->state = EEPROM_INPUT;
eeprom->dat = 0;
break;
}
}
break;
case EEPROM_INPUT:
eeprom_dat = (eeprom_dat << 1) | (dat ? 1 : 0);
eeprom_count--;
if (!eeprom_count)
eeprom->dat = (eeprom->dat << 1) | (dat ? 1 : 0);
eeprom->count--;
if (!eeprom->count)
{
pclog("EEPROM dat - %02X\n", eeprom_dat);
switch (eeprom_opcode)
pclog("EEPROM dat - %02X\n", eeprom->dat);
switch (eeprom->opcode)
{
case EEPROM_OP_WRITE:
pclog("EEPROM_OP_WRITE addr %02X eeprom_dat %04X\n", (eeprom_dat >> 16) & (eeprom_type ? 255 : 63), eeprom_dat & 0xffff);
if (!eeprom_wp)
pclog("EEPROM_OP_WRITE addr %02X eeprom_dat %04X\n", (eeprom->dat >> 16) & (eeprom->type ? 255 : 63), eeprom->dat & 0xffff);
if (!eeprom->wp)
{
eeprom[(eeprom_dat >> 16) & (eeprom_type ? 255 : 63)] = eeprom_dat & 0xffff;
ati_eeprom_save();
eeprom->data[(eeprom->dat >> 16) & (eeprom->type ? 255 : 63)] = eeprom->dat & 0xffff;
ati_eeprom_save(eeprom);
}
eeprom_state = EEPROM_IDLE;
eeprom_out = 1;
eeprom->state = EEPROM_IDLE;
eeprom->out = 1;
break;
case EEPROM_OP_READ:
eeprom_count = 17;
eeprom_state = EEPROM_OUTPUT;
eeprom_dat = eeprom[eeprom_dat];
pclog("Trigger EEPROM_OUTPUT %04X\n", eeprom_dat);
eeprom->count = 17;
eeprom->state = EEPROM_OUTPUT;
eeprom->dat = eeprom->data[eeprom->dat];
pclog("Trigger EEPROM_OUTPUT %04X\n", eeprom->dat);
break;
case EEPROM_OP_EW:
pclog("EEPROM_OP_EW %i\n", eeprom_dat);
switch (eeprom_dat)
pclog("EEPROM_OP_EW %i\n", eeprom->dat);
switch (eeprom->dat)
{
case EEPROM_OP_EWDS:
eeprom_wp = 1;
eeprom->wp = 1;
break;
case EEPROM_OP_WRAL:
opcode = EEPROM_OP_WRALMAIN;
eeprom_count = 20;
eeprom->opcode = EEPROM_OP_WRALMAIN;
eeprom->count = 20;
break;
case EEPROM_OP_ERAL:
if (!eeprom_wp)
if (!eeprom->wp)
{
memset(eeprom, 0xff, 128);
ati_eeprom_save();
memset(eeprom->data, 0xff, 128);
ati_eeprom_save(eeprom);
}
break;
case EEPROM_OP_EWEN:
eeprom_wp = 0;
eeprom->wp = 0;
break;
}
eeprom_state = EEPROM_IDLE;
eeprom_out = 1;
eeprom->state = EEPROM_IDLE;
eeprom->out = 1;
break;
case EEPROM_OP_ERASE:
pclog("EEPROM_OP_ERASE %i\n", eeprom_dat);
if (!eeprom_wp)
pclog("EEPROM_OP_ERASE %i\n", eeprom->dat);
if (!eeprom->wp)
{
eeprom[eeprom_dat] = 0xffff;
ati_eeprom_save();
eeprom->data[eeprom->dat] = 0xffff;
ati_eeprom_save(eeprom);
}
eeprom_state = EEPROM_IDLE;
eeprom_out = 1;
eeprom->state = EEPROM_IDLE;
eeprom->out = 1;
break;
case EEPROM_OP_WRALMAIN:
pclog("EEPROM_OP_WRAL %04X\n", eeprom_dat);
if (!eeprom_wp)
pclog("EEPROM_OP_WRAL %04X\n", eeprom->dat);
if (!eeprom->wp)
{
for (c = 0; c < 256; c++)
eeprom[c] = eeprom_dat;
ati_eeprom_save();
eeprom->data[c] = eeprom->dat;
ati_eeprom_save(eeprom);
}
eeprom_state = EEPROM_IDLE;
eeprom_out = 1;
eeprom->state = EEPROM_IDLE;
eeprom->out = 1;
break;
}
}
break;
}
}
oldena = ena;
eeprom->oldena = ena;
}
else if (!clk && oldclk)
else if (!clk && eeprom->oldclk)
{
if (ena)
{
switch (eeprom_state)
switch (eeprom->state)
{
case EEPROM_OUTPUT:
eeprom_out = (eeprom_dat & 0x10000) ? 1 : 0;
eeprom_dat <<= 1;
pclog("EEPROM_OUTPUT - data %i\n", eeprom_out);
eeprom_count--;
if (!eeprom_count)
eeprom->out = (eeprom->dat & 0x10000) ? 1 : 0;
eeprom->dat <<= 1;
pclog("EEPROM_OUTPUT - data %i\n", eeprom->out);
eeprom->count--;
if (!eeprom->count)
{
pclog("EEPROM_OUTPUT complete\n");
eeprom_state = EEPROM_IDLE;
eeprom->state = EEPROM_IDLE;
}
break;
}
}
}
oldclk = clk;
eeprom->oldclk = clk;
}
int ati_eeprom_read()
int ati_eeprom_read(ati_eeprom_t *eeprom)
{
return eeprom_out;
return eeprom->out;
}