Files
86Box/src/VIDEO/vid_icd2061.c
OBattler f6612fb33b Fixed bugs that were preventing NVR and Flash files from behind saved;
A lot of clean ups from waltje;
Start of a directory structure for the code, thanks to waltje.
2017-05-06 17:48:33 +02:00

64 lines
2.3 KiB
C

/* Copyright holders: Sarah Walker
see COPYING for more details
*/
/*PCem v8.1 by Tom Walker
ICD2061 clock generator emulation
Used by ET4000w32/p (Diamond Stealth 32)*/
#include "../ibm.h"
#include "vid_icd2061.h"
void icd2061_write(icd2061_t *icd2061, int val)
{
int q, p, m, a;
if ((val & 1) && !(icd2061->state & 1))
{
if (!icd2061->status)
{
if (val & 2)
icd2061->unlock++;
else
{
if (icd2061->unlock >= 5)
{
icd2061->status = 1;
icd2061->pos = 0;
}
else
icd2061->unlock = 0;
}
}
else if (val & 1)
{
icd2061->data = (icd2061->data >> 1) | (((val & 2) ? 1 : 0) << 24);
icd2061->pos++;
if (icd2061->pos == 26)
{
a = (icd2061->data >> 21) & 0x7;
if (!(a & 4))
{
q = (icd2061->data & 0x7f) - 2;
m = 1 << ((icd2061->data >> 7) & 0x7);
p = ((icd2061->data >> 10) & 0x7f) - 3;
if (icd2061->ctrl & (1 << a))
p <<= 1;
icd2061->freq[a] = ((double)p / (double)q) * 2.0 * 14318184.0 / (double)m;
}
else if (a == 6)
{
icd2061->ctrl = val;
}
icd2061->unlock = icd2061->data = 0;
icd2061->status = 0;
}
}
}
icd2061->state = val;
}
double icd2061_getfreq(icd2061_t *icd2061, int i)
{
return icd2061->freq[i];
}