#include "vcdhdr.h"
Vcdtable_t* _Vcdtbl = 0;
Vcdindex_t _Vcdindex = { 0 };
Vcdsize_t _Vcdsize =
{ 17,
{ 18, 18, 18, 18, 18, 18, 18, 18, 18 },
{ 4, 4, 4, 4, 4, 4, 4, 4, 4 },
{ 6, 6, 6, 6, 6, 6, 4, 4, 4 },
{ 4, 4, 4, 4, 4, 4, 4, 4, 4 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1 },
};
static Vcdtable_t _Vcdtable =
{ 4,
3
};
#if __STD_C
static void vcdtblmake(Vcdtable_t* tbl, Vcdsize_t* siz, Vcdindex_t* idx)
#else
static void vcdtblmake(tbl, siz, idx)
Vcdtable_t* tbl;
Vcdsize_t* siz;
Vcdindex_t* idx;
#endif
{
int i, m, maxm, s, maxs, t, maxt;
Vcdcode_t* code = tbl->code;
DEBUG_DECLARE(int, k);
i = 0;
code[i].inst1.type = VCD_RUN;
code[i].inst1.size = 0;
code[i].inst1.mode = 0;
code[i].inst2.type = VCD_NOOP;
code[i].inst1.size = 0;
code[i].inst1.mode = 0;
i += 1;
DEBUG_SET(k,0);
for(s = 0; s <= siz->add; ++s)
{ code[i].inst1.type = VCD_ADD;
code[i].inst1.size = s;
code[i].inst1.mode = 0;
code[i].inst2.type = VCD_NOOP;
code[i].inst2.size = 0;
code[i].inst2.mode = 0;
if(idx)
idx->add[s] = i;
i += 1; DEBUG_COUNT(k);
} DEBUG_ASSERT(i < 256);
maxm = tbl->s_same + tbl->s_near + 1;
DEBUG_SET(k,0);
for(m = VCD_SELF; m <= maxm; ++m)
for(s = 0, maxs = siz->copy[m]; s <= maxs; s = s == 0 ? COPYMIN : s+1)
{ code[i].inst1.type = VCD_COPY;
code[i].inst1.size = s;
code[i].inst1.mode = m;
code[i].inst2.type = VCD_NOOP;
code[i].inst2.size = 0;
code[i].inst2.mode = 0;
if(idx)
idx->copy[m][s] = i;
i += 1; DEBUG_COUNT(k);
} DEBUG_ASSERT(i <= 256);
DEBUG_SET(k,0);
for(m = VCD_SELF; m <= maxm; ++m)
for(s = 1, maxs = siz->add1[m]; s <= maxs; ++s)
for(t = COPYMIN, maxt = siz->copy2[m]; t <= maxt; ++t)
{ code[i].inst1.type = VCD_ADD;
code[i].inst1.size = s;
code[i].inst1.mode = 0;
code[i].inst2.type = VCD_COPY;
code[i].inst2.size = t;
code[i].inst2.mode = m;
if(idx)
idx->addcopy[s][m][t] = i;
i += 1; DEBUG_COUNT(k);
} DEBUG_ASSERT(i <= 256);
DEBUG_SET(k,0);
for(m = VCD_SELF; m <= maxm; ++m)
for(s = COPYMIN, maxs = siz->copy1[m]; s <= maxs; ++s)
for(t = 1, maxt = siz->add2[m]; t <= maxt; ++t)
{ code[i].inst1.type = VCD_COPY;
code[i].inst1.size = s;
code[i].inst1.mode = m;
code[i].inst2.type = VCD_ADD;
code[i].inst2.size = t;
code[i].inst2.mode = 0;
if(idx)
idx->copyadd[m][s][t] = i;
i += 1; DEBUG_COUNT(k);
} DEBUG_ASSERT(i <= 256);
DEBUG_ASSERT(i == 256);
}
#if __STD_C
void _vcdtblinit(void)
#else
void _vcdtblinit()
#endif
{
if(!_Vcdtbl)
{ vcdtblmake(&_Vcdtable, &_Vcdsize, &_Vcdindex);
_Vcdtbl = &_Vcdtable;
}
}