Re-organisation of video emulation.
This commit is contained in:
parent
b9062a1d0c
commit
58085bcc87
86 changed files with 8087 additions and 7229 deletions
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue