Updated to support P2 FPGA v32b
This commit is contained in:
parent
56e4571636
commit
1b0c107390
|
@ -1,6 +1,6 @@
|
|||
Spinsim 0.97
|
||||
Spinsim 0.98
|
||||
|
||||
This version of spinsim supports most of the opcodes in the P2 v20 instruction
|
||||
This version of spinsim supports most of the opcodes in the P2 v32a instruction
|
||||
set. The opcodes that are not supported are as follows:
|
||||
|
||||
xzero xinit xcont clkset setdacs setxfrq getxcos getxsin
|
||||
|
|
66
disasm2.c
66
disasm2.c
|
@ -32,9 +32,9 @@ static char *group1[] = {
|
|||
"cmp", "cmpx", "cmps", "cmpsx", "cmpr", "cmpm", "subr", "cmpsub",
|
||||
"fge", "fle", "fges", "fles", "sumc", "sumnc", "sumz", "sumnz",
|
||||
"bitl", "bith", "bitc", "bitnc", "bitz", "bitnz", "bitrnd", "bitnot",
|
||||
"andn", "and", "or", "xor", "muxc", "muxnc", "muxz", "muxnz",
|
||||
"and", "andn", "or", "xor", "muxc", "muxnc", "muxz", "muxnz",
|
||||
"mov", "not", "abs", "neg", "negc", "negnc", "negz", "negnz",
|
||||
"incmod", "decmod", "encod", "invalid", "testn", "test", "anyb", "invalid"};
|
||||
"incmod", "decmod", "zerox", "signx", "encod", "ones", "test", "testn"};
|
||||
|
||||
static char *group2[] = {
|
||||
"setnib", "setnib", "setnib", "setnib", "setnib", "setnib", "setnib", "setnib",
|
||||
|
@ -44,15 +44,14 @@ static char *group2[] = {
|
|||
"rolbyte", "rolbyte", "rolbyte", "rolbyte", "setword", "setword", "getword", "getword",
|
||||
"rolword", "rolword", "altsn", "altgn", "altsb", "altgb", "altsw", "altgw",
|
||||
"altr", "altd", "alts", "altb", "alti", "setr", "setd", "sets",
|
||||
"decod", "bmask", "zerox", "signx", "muxnits", "muxnibs", "muxq", "movbyts",
|
||||
"mul", "mul", "muls", "muls", "sclu", "sclu", "scl", "scl",
|
||||
"decod", "bmask", "crcbit", "crcnib", "muxnits", "muxnibs", "muxq", "movbyts",
|
||||
"mul", "mul", "muls", "muls", "sca", "sca", "scas", "scas",
|
||||
"addpix", "mulpix", "blnpix", "mixpix", "addct1", "addct2", "addct3", "wmlong",
|
||||
"rqpin", "rdpin", "rqpin", "rdpin", "rdlut", "rdlut", "rdlut", "rdlut",
|
||||
"rdbyte", "rdbyte", "rdbyte", "rdbyte", "rdword", "rdword", "rdword", "rdword",
|
||||
"rdlong", "rdlong", "rdlong", "rdlong", "calld", "calld", "calld", "calld",
|
||||
"ijz", "ijnz", "ijs", "ijns", "djz", "djnz", "djs", "djns",
|
||||
"tjz", "tjnz", "tjs", "tjns", "invalid", "invalid", "invalid", "invalid",
|
||||
"callpa", "callpa", "callpb", "callpb"};
|
||||
"callpa", "callpa", "callpb", "callpb", "djz", "djnz", "djf", "djnf",
|
||||
"ijz", "ijnz", "tjz", "tjnz", "tjf", "tjnf", "tjs", "tjns", "tjv"};
|
||||
|
||||
static char *group3[] = {
|
||||
"jint", "jct1", "jct2", "jct3", "jse1", "jse2", "jse3", "jse4",
|
||||
|
@ -68,10 +67,10 @@ static char *group5[] = {
|
|||
"qmul", "qdiv", "qfrac", "qsqrt", "qrotate", "qvector"};
|
||||
|
||||
static char *group6[] = {
|
||||
"clkset", "cogid", "invalid", "cogstop", "locknew", "lockret", "lockclr", "lockset",
|
||||
"hubset", "cogid", "invalid", "cogstop", "locknew", "lockret", "locktry", "lockrel",
|
||||
"invalid", "invalid", "invalid", "invalid", "invalid", "invalid", "qlog", "qexp",
|
||||
"rfbyte", "rfword", "rflong", "wfbyte", "wfword", "wflong", "setq", "setq2",
|
||||
"getqx", "getqy", "getct", "getrnd", "setdacs", "setxfrq", "getxcos", "getxsin",
|
||||
"rfbyte", "rfword", "rflong", "rfvar", "rfvars", "wfbyte", "wfword", "wflong",
|
||||
"getqx", "getqy", "getct", "getrnd", "setdacs", "setxfrq", "getxacc", "waitx",
|
||||
"setse1", "setse2", "setse3", "setse4"};
|
||||
|
||||
static char immd6[] = {
|
||||
|
@ -90,16 +89,15 @@ static char *group7[] = {
|
|||
|
||||
static char *group8[] = {
|
||||
"setint1", "setint2", "setint3",
|
||||
"waitx", "invalid", "push", "pop", "jmp", "call", "calla", "callb",
|
||||
"jmprel", "skip", "skipf", "execf", "getptr", "getint", "setbrk", "setluts",
|
||||
"setq", "setq2", "push", "pop", "jmp", "call", "calla", "callb",
|
||||
"jmprel", "skip", "skipf", "execf", "getptr", "getbrk", "brk", "setluts",
|
||||
"setcy", "setci", "setcq", "setcfrq", "setcmod", "setpix", "setpiv", "cogatn",
|
||||
"dirl", "dirh", "dirc", "dirnc", "dirz", "dirnz", "dirrnd", "dirnot",
|
||||
"outl", "outh", "outc", "outnc", "outz", "outnz", "outrnd", "outnot",
|
||||
"fltl", "flth", "fltc", "fltnc", "fltz", "fltnz", "fltrnd", "fltnot",
|
||||
"drvl", "drvh", "drvc", "drvnc", "drvz", "drvnz", "drvrnd", "drvnot",
|
||||
"splitb", "mergeb", "splitw", "mergew", "seussf", "seussr", "rgbsqz", "rgbexp",
|
||||
"xoro32", "rev", "rczr", "rczl", "wrc", "wrnc", "wrz", "wrnz",
|
||||
"rfvar", "rfvars"};
|
||||
"xoro32", "rev", "rczr", "rczl", "wrc", "wrnc", "wrz", "wrnz"};
|
||||
|
||||
static char immd8[] = {
|
||||
1, 1, 1,
|
||||
|
@ -111,8 +109,7 @@ static char immd8[] = {
|
|||
7, 7, 7, 7, 7, 7, 7, 7,
|
||||
7, 7, 7, 7, 7, 7, 7, 7,
|
||||
0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 6, 6, 0, 0, 0, 0,
|
||||
6, 6};
|
||||
0, 0, 6, 6, 0, 0, 0, 0};
|
||||
|
||||
|
||||
static char *group9[] = {
|
||||
|
@ -168,7 +165,7 @@ char *GetOpname2(unsigned int instr, int *pczi, int *pformat, int *perrflag)
|
|||
strcpy(name, group1[opcode]);
|
||||
*pczi = 6;
|
||||
}
|
||||
else if (opcode <= 0x5e)
|
||||
else if (opcode < 0x5e)
|
||||
{
|
||||
int index = ((opcode - 0x40) << 2) + czflags;
|
||||
if (index < 24)
|
||||
|
@ -191,22 +188,38 @@ char *GetOpname2(unsigned int instr, int *pczi, int *pformat, int *perrflag)
|
|||
else
|
||||
*pczi = 0;
|
||||
}
|
||||
else if (opcode == 0x5f)
|
||||
else if (opcode == 0x5e)
|
||||
{
|
||||
if (cflag == 0)
|
||||
{
|
||||
if (dfield > 0x1f)
|
||||
strcpy(name, "invalid");
|
||||
if (zflag)
|
||||
{
|
||||
if (dfield > 0x1f)
|
||||
strcpy(name, "invalid");
|
||||
else
|
||||
{
|
||||
strcpy(name, group3[dfield]);
|
||||
if (!zflag)
|
||||
*perrflag = OPCODE_BAD_BITS;
|
||||
}
|
||||
*pformat = OP_ONEREL9;
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy(name, group3[dfield]);
|
||||
if (!zflag)
|
||||
*perrflag = OPCODE_BAD_BITS;
|
||||
strcpy(name, "tjv");
|
||||
*pformat = OP_TWOREL9;
|
||||
}
|
||||
*pformat = OP_ONEREL9;
|
||||
}
|
||||
else
|
||||
strcpy(name, "invalid");
|
||||
*pczi = 0;
|
||||
}
|
||||
else if (opcode == 0x5f)
|
||||
{
|
||||
if (cflag)
|
||||
strcpy(name, group4);
|
||||
else
|
||||
strcpy(name, "invalid");
|
||||
*pczi = 0;
|
||||
}
|
||||
else if (opcode <= 0x6a)
|
||||
|
@ -282,7 +295,7 @@ char *GetOpname2(unsigned int instr, int *pczi, int *pformat, int *perrflag)
|
|||
strcpy(name, "modcz");
|
||||
*pczi = 6;
|
||||
}
|
||||
else if (sfield > 0x71)
|
||||
else if (sfield > 0x6f)
|
||||
{
|
||||
strcpy(name, "invalid");
|
||||
*pczi = 0;
|
||||
|
@ -359,6 +372,7 @@ int InvalidAddress(int hubmode, int pc, int offset)
|
|||
invalid = (target < 0 || target >= 0x400);
|
||||
}
|
||||
|
||||
|
||||
return invalid;
|
||||
}
|
||||
|
||||
|
@ -436,7 +450,7 @@ void Disassemble2(int32_t instruct, int32_t pc, char *outstr, int *perrflag)
|
|||
}
|
||||
|
||||
dflag = ((czi & 1) && (opcode == 0x6b)) ||
|
||||
((czi & 2) && (opcode == 0x5d || opcode == 0x5e || (opcode == 0x5f && (czi & 4)) || (opcode >= 0x60 && opcode <= 0x6a)));
|
||||
((czi & 2) && (opcode == 0x5a || opcode == 0x5e || (opcode == 0x5f && (czi & 4)) || (opcode >= 0x60 && opcode <= 0x6a)));
|
||||
|
||||
// Check for extended address instructions
|
||||
if (opcode >= 0x6c)
|
||||
|
|
395
pasmsim2.c
395
pasmsim2.c
|
@ -223,13 +223,13 @@ static int32_t stream_fifo_level(PasmVarsT *pasmvars)
|
|||
#define INSTR_RFBYTE 0x0d600010
|
||||
#define INSTR_RFWORD 0x0d600011
|
||||
#define INSTR_RFLONG 0x0d600012
|
||||
#define INSTR_WFBYTE 0x0d600013
|
||||
#define INSTR_WFWORD 0x0d600014
|
||||
#define INSTR_WFLONG 0x0d600015
|
||||
#define INSTR_WFBYTE 0x0d600015
|
||||
#define INSTR_WFWORD 0x0d600016
|
||||
#define INSTR_WFLONG 0x0d600017
|
||||
#define INSTR_GETQX 0x0d600018
|
||||
#define INSTR_GETQY 0x0d600019
|
||||
#define INSTR_WAITX 0x0d60001f
|
||||
#define INSTR_WAITXXX 0x0d602024
|
||||
#define INSTR_WAITX 0x0d600028
|
||||
#define OPCODE_WMLONG 0x53
|
||||
#define OPCODE_RDBYTE 0x56
|
||||
#define OPCODE_RDWORD 0x57
|
||||
|
@ -1975,15 +1975,15 @@ int32_t ExecutePasmInstruction2(PasmVarsT *pasmvars)
|
|||
}
|
||||
break;
|
||||
|
||||
case 5: // andn, and, or, xor, muxxx
|
||||
case 5: // and, andn, or, xor, muxxx
|
||||
switch (opcode & 7)
|
||||
{
|
||||
case 0: // andn
|
||||
result = value1 & (~value2);
|
||||
case 0: // and
|
||||
result = value1 & value2;
|
||||
break;
|
||||
|
||||
case 1: // and
|
||||
result = value1 & value2;
|
||||
case 1: // andn
|
||||
result = value1 & (~value2);
|
||||
break;
|
||||
|
||||
case 2: // or
|
||||
|
@ -2060,7 +2060,7 @@ int32_t ExecutePasmInstruction2(PasmVarsT *pasmvars)
|
|||
zflag = (result == 0);
|
||||
break;
|
||||
|
||||
case 7: // incmod, decmod, encod, testn, test, anyb
|
||||
case 7: // incmod, decmod, zerox, signx, encod, ones, test, testn
|
||||
switch (opcode & 7)
|
||||
{
|
||||
case 0: // incmod
|
||||
|
@ -2079,7 +2079,16 @@ int32_t ExecutePasmInstruction2(PasmVarsT *pasmvars)
|
|||
result = value1 - 1;
|
||||
break;
|
||||
|
||||
case 2: // encod
|
||||
case 2: // zerox
|
||||
result = value1 & ~(0xfffffffe << (value2 & 31));
|
||||
break;
|
||||
|
||||
case 3: // signx
|
||||
temp = 31 - (value2 & 31);
|
||||
result = (value1 << temp) >> temp;
|
||||
break;
|
||||
|
||||
case 4: // encod
|
||||
cflag = (value2 == 0);
|
||||
for (result = 31; result > 0; result--)
|
||||
{
|
||||
|
@ -2089,31 +2098,23 @@ int32_t ExecutePasmInstruction2(PasmVarsT *pasmvars)
|
|||
if (kludge) cflag = result & 1;
|
||||
break;
|
||||
|
||||
case 3: // empty
|
||||
NotImplemented(instruct);
|
||||
break;
|
||||
|
||||
case 4: // testn
|
||||
result = value1 & (~value2);
|
||||
cflag = parity(result);
|
||||
write_czr &= 6;
|
||||
break;
|
||||
|
||||
case 5: // test
|
||||
result = value1 & value2;
|
||||
cflag = parity(result);
|
||||
write_czr &= 6;
|
||||
break;
|
||||
|
||||
case 6: // anyb
|
||||
case 5: // ones (was anyb)
|
||||
result = value1 | value2;
|
||||
cflag = parity(result);
|
||||
write_czr &= 6;
|
||||
break;
|
||||
|
||||
case 7: // empty
|
||||
NotImplemented(instruct);
|
||||
break;
|
||||
case 6: // test
|
||||
result = value1 & value2;
|
||||
cflag = parity(result);
|
||||
write_czr &= 6;
|
||||
break;
|
||||
|
||||
case 7: // testn
|
||||
result = value1 & (~value2);
|
||||
cflag = parity(result);
|
||||
write_czr &= 6;
|
||||
break;
|
||||
}
|
||||
zflag = (result == 0);
|
||||
break;
|
||||
|
@ -2166,7 +2167,7 @@ int32_t ExecutePasmInstruction2(PasmVarsT *pasmvars)
|
|||
}
|
||||
break;
|
||||
|
||||
case 9: // rolbyte, setword, getword, rolword, altxx, setx, decod, bmaks, zerox, signx, muxnits, muxnibs, muxq, movbyts
|
||||
case 9: // rolbyte, setword, getword, rolword, altxx, setx, decod, bmaks, muxnits, muxnibs, muxq, movbyts
|
||||
write_czr = 1;
|
||||
temp = (instruct >> 16) & 0x18;
|
||||
switch(opcode&7)
|
||||
|
@ -2380,7 +2381,7 @@ int32_t ExecutePasmInstruction2(PasmVarsT *pasmvars)
|
|||
}
|
||||
break;
|
||||
|
||||
case 6: // decod, bmask, zerox, signx
|
||||
case 6: // decod, bmask, crcbit, crcnib
|
||||
write_czr = 1;
|
||||
switch (czi >> 1)
|
||||
{
|
||||
|
@ -2392,13 +2393,12 @@ int32_t ExecutePasmInstruction2(PasmVarsT *pasmvars)
|
|||
result = ~(0xfffffffe << (value2 & 0x1f));
|
||||
break;
|
||||
|
||||
case 2: // zerox
|
||||
result = value1 & ~(0xfffffffe << (value2 & 31));
|
||||
case 2: // crcbit
|
||||
NotImplemented(instruct);
|
||||
break;
|
||||
|
||||
case 3: // signx
|
||||
temp = 31 - (value2 & 31);
|
||||
result = (value1 << temp) >> temp;
|
||||
case 3: // crcnib
|
||||
NotImplemented(instruct);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -2470,15 +2470,15 @@ int32_t ExecutePasmInstruction2(PasmVarsT *pasmvars)
|
|||
zflag = (result == 0);
|
||||
break;
|
||||
|
||||
case 1: // sclu, scl
|
||||
case 1: // sca, scas
|
||||
write_czr &= 2;
|
||||
if (czi&4) // scl
|
||||
if (czi&4) // scas
|
||||
{
|
||||
value1 = (value1 << 16) >> 16;
|
||||
value2 = (value2 << 16) >> 16;
|
||||
result = (value1 * value2) >> 14;
|
||||
}
|
||||
else // sclu
|
||||
else // sca
|
||||
{
|
||||
value1 &= 0xffff;
|
||||
value2 &= 0xffff;
|
||||
|
@ -2705,77 +2705,7 @@ if (streamflag) printf("\nSTREAM COLLISION\n");
|
|||
check_hubexec_mode(pasmvars);
|
||||
break;
|
||||
|
||||
case 2: // ijz, ijnz, ijs, ijns
|
||||
write_czr = 1;
|
||||
result = value1 + 1;
|
||||
zflag = (result == 0);
|
||||
cflag = (result == 0);
|
||||
// Determine if we should jump
|
||||
if (czi & 4) // ijs, ijns
|
||||
{
|
||||
if (((result >> 31) & 1) != ((czi >> 1) & 1))
|
||||
{
|
||||
value2 = (value2 << 23) >> 23;
|
||||
pasmvars->pc = (pc + pc_incr * (1 + value2)) & ADDR_MASK;
|
||||
pasmvars->pc1 |= INVALIDATE_INSTR;
|
||||
check_hubexec_mode(pasmvars);
|
||||
}
|
||||
}
|
||||
else // ijz, ijnz
|
||||
{
|
||||
if (zflag != ((czi >> 1) & 1))
|
||||
{
|
||||
value2 = (value2 << 23) >> 23;
|
||||
pasmvars->pc = (pc + pc_incr * (1 + value2)) & ADDR_MASK;
|
||||
pasmvars->pc1 |= INVALIDATE_INSTR;
|
||||
check_hubexec_mode(pasmvars);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 3: // djz, djnz, djs, djns
|
||||
case 4: // tjz, tjnz, tjs, tjns
|
||||
if ((opcode & 7) == 3)
|
||||
{
|
||||
value1--;
|
||||
cflag = (value1 == -1);
|
||||
write_czr = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
write_czr = 0;
|
||||
}
|
||||
result = value1;
|
||||
zflag = (result == 0);
|
||||
// Determine if we should jump
|
||||
if (czi & 4) // djs, djns, tjs, tjns
|
||||
{
|
||||
if (((result >> 31) & 1) != ((czi >> 1) & 1))
|
||||
{
|
||||
value2 = (value2 << 23) >> 23;
|
||||
pasmvars->pc = (pc + pc_incr * (1 + value2)) & ADDR_MASK;
|
||||
pasmvars->pc1 |= INVALIDATE_INSTR;
|
||||
check_hubexec_mode(pasmvars);
|
||||
}
|
||||
}
|
||||
else // djz, djnz, tjz, tjnz
|
||||
{
|
||||
if (zflag != ((czi >> 1) & 1))
|
||||
{
|
||||
value2 = (value2 << 23) >> 23;
|
||||
pasmvars->pc = (pc + pc_incr * (1 + value2)) & ADDR_MASK;
|
||||
pasmvars->pc1 |= INVALIDATE_INSTR;
|
||||
check_hubexec_mode(pasmvars);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 5: // empty
|
||||
NotImplemented(instruct);
|
||||
write_czr |= 1;
|
||||
break;
|
||||
|
||||
case 6: // callpa, callpb
|
||||
case 2: // callpa, callpb
|
||||
if (czi&4)
|
||||
rsltaddr = REG_PB;
|
||||
else
|
||||
|
@ -2793,11 +2723,91 @@ if (streamflag) printf("\nSTREAM COLLISION\n");
|
|||
check_hubexec_mode(pasmvars);
|
||||
break;
|
||||
|
||||
case 7: // setpat, jint, jnint, ...
|
||||
case 3: // djz, djnz, djf, djnf
|
||||
value1--;
|
||||
cflag = (value1 == -1);
|
||||
write_czr = 1;
|
||||
result = value1;
|
||||
zflag = (result == 0);
|
||||
// Determine if we should jump
|
||||
if (czi & 4) // djf, djnf
|
||||
{
|
||||
if (cflag != ((czi >> 1) & 1))
|
||||
{
|
||||
value2 = (value2 << 23) >> 23;
|
||||
pasmvars->pc = (pc + pc_incr * (1 + value2)) & ADDR_MASK;
|
||||
pasmvars->pc1 |= INVALIDATE_INSTR;
|
||||
check_hubexec_mode(pasmvars);
|
||||
}
|
||||
}
|
||||
else // djz, djnz
|
||||
{
|
||||
if (zflag != ((czi >> 1) & 1))
|
||||
{
|
||||
value2 = (value2 << 23) >> 23;
|
||||
pasmvars->pc = (pc + pc_incr * (1 + value2)) & ADDR_MASK;
|
||||
pasmvars->pc1 |= INVALIDATE_INSTR;
|
||||
check_hubexec_mode(pasmvars);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 4: // ijz, ijnz, tjz, tjnz
|
||||
if (czi&4) // tjz, tjnz
|
||||
{
|
||||
write_czr = 0;
|
||||
result = value1;
|
||||
}
|
||||
else // ijz, ijnz
|
||||
{
|
||||
write_czr = 1;
|
||||
result = value1 + 1;
|
||||
}
|
||||
zflag = (result == 0);
|
||||
cflag = (result == 0);
|
||||
// Determine if we should jump
|
||||
if (zflag != ((czi >> 1) & 1))
|
||||
{
|
||||
value2 = (value2 << 23) >> 23;
|
||||
pasmvars->pc = (pc + pc_incr * (1 + value2)) & ADDR_MASK;
|
||||
pasmvars->pc1 |= INVALIDATE_INSTR;
|
||||
check_hubexec_mode(pasmvars);
|
||||
}
|
||||
break;
|
||||
|
||||
case 5: // tjf, tjnf, tjs, tjns
|
||||
write_czr = 0;
|
||||
if (czi&4) // setpat
|
||||
result = value1;
|
||||
zflag = (result == 0);
|
||||
cflag = (result == -1);
|
||||
// Determine if we should jump
|
||||
if (czi & 4) // tjs, tjns
|
||||
{
|
||||
if (((result >> 31) & 1) != ((czi >> 1) & 1))
|
||||
{
|
||||
value2 = (value2 << 23) >> 23;
|
||||
pasmvars->pc = (pc + pc_incr * (1 + value2)) & ADDR_MASK;
|
||||
pasmvars->pc1 |= INVALIDATE_INSTR;
|
||||
check_hubexec_mode(pasmvars);
|
||||
}
|
||||
}
|
||||
else // tjf, tjnf
|
||||
{
|
||||
if (cflag != ((czi >> 1) & 1))
|
||||
{
|
||||
value2 = (value2 << 23) >> 23;
|
||||
pasmvars->pc = (pc + pc_incr * (1 + value2)) & ADDR_MASK;
|
||||
pasmvars->pc1 |= INVALIDATE_INSTR;
|
||||
check_hubexec_mode(pasmvars);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 6: // tjv, jint, jnint, ...
|
||||
write_czr = 0;
|
||||
if ((czi&6) == 0) // tjv
|
||||
NotImplemented(instruct);
|
||||
else // jint, jnint, ....
|
||||
else if ((czi&6) == 2) // jint, jnint, ....
|
||||
{
|
||||
temp = (value1 & 15);
|
||||
temp = (pasmvars->intflags >> temp) & 1;
|
||||
|
@ -2815,6 +2825,16 @@ if (streamflag) printf("\nSTREAM COLLISION\n");
|
|||
check_hubexec_mode(pasmvars);
|
||||
}
|
||||
}
|
||||
else // empty
|
||||
NotImplemented(instruct);
|
||||
break;
|
||||
|
||||
case 7: // setpat
|
||||
write_czr = 0;
|
||||
if (czi&4) // setpat
|
||||
NotImplemented(instruct);
|
||||
else // empty
|
||||
NotImplemented(instruct);
|
||||
break;
|
||||
#else
|
||||
case 0: // rdbyte
|
||||
|
@ -3198,8 +3218,7 @@ if (streamflag) printf("\nSTREAM COLLISION\n");
|
|||
if (srcaddr == 0x24) srcaddr = (instruct & 0x3ffff);
|
||||
switch (srcaddr)
|
||||
{
|
||||
case 0: // clkset
|
||||
NotImplemented(instruct);
|
||||
case 0: // hubset - TODO Need to implement. Ignore for now.
|
||||
break;
|
||||
|
||||
case 1: // cogid
|
||||
|
@ -3249,18 +3268,35 @@ if (streamflag) printf("\nSTREAM COLLISION\n");
|
|||
lockalloc[result] = 0;
|
||||
break;
|
||||
|
||||
case 6: // lockclr
|
||||
case 6: // locktry
|
||||
result = value1 & 15;
|
||||
zflag = (result == 0);
|
||||
cflag = lockstate[result] & 1;
|
||||
lockstate[result] = 0;
|
||||
if (!lockstate[result])
|
||||
{
|
||||
cflag = 1;
|
||||
lockstate[result] = 0x100 | pasmvars->cogid;
|
||||
}
|
||||
else
|
||||
cflag = 0;
|
||||
break;
|
||||
|
||||
case 7: // lockset
|
||||
result = value1 & 15;
|
||||
zflag = (result == 0);
|
||||
cflag = lockstate[result] & 1;
|
||||
lockstate[result] = -1;
|
||||
case 7: // lockrel
|
||||
zflag = 0;
|
||||
temp = value1 & 15;
|
||||
result = lockstate[temp] & 15;
|
||||
cflag = (lockstate[temp] != 0);
|
||||
if (cflag && result == pasmvars->cogid)
|
||||
{
|
||||
cflag = 0;
|
||||
lockstate[result] = 0;
|
||||
}
|
||||
write_czr &= 6;
|
||||
if ((czi&4) == 0)
|
||||
write_czr = 0;
|
||||
else if (czi&1)
|
||||
write_czr = 4;
|
||||
else
|
||||
write_czr = 5;
|
||||
break;
|
||||
|
||||
case 14: // qlog
|
||||
|
@ -3308,47 +3344,51 @@ if (streamflag) printf("\nSTREAM COLLISION\n");
|
|||
zflag = (result == 0);
|
||||
break;
|
||||
|
||||
case 19: // wfbyte
|
||||
case 19: // rfvar
|
||||
result = temp = 0;
|
||||
do
|
||||
{
|
||||
result |= read_stream_fifo_byte(pasmvars) << temp;
|
||||
temp += 7;
|
||||
} while ((temp < 28) && (result & (1 << temp)));
|
||||
cflag = 0;
|
||||
zflag = (result == 0);
|
||||
break;
|
||||
|
||||
case 20: // rfvars
|
||||
result = temp = 0;
|
||||
do
|
||||
{
|
||||
result |= read_stream_fifo_byte(pasmvars) << temp;
|
||||
temp += 7;
|
||||
} while ((temp < 28) && (result & (1 << temp)));
|
||||
temp = 31 - temp;
|
||||
result = (result << temp) >> temp;
|
||||
cflag = (result >> 31) & 1;
|
||||
zflag = (result == 0);
|
||||
break;
|
||||
|
||||
case 21: // wfbyte
|
||||
write_czr = 0;
|
||||
write_stream_fifo_byte(pasmvars, value1);
|
||||
if (pasmvars->printflag > 1)
|
||||
fprintf(tracefile, ", fifo = %2.2x", value1);
|
||||
break;
|
||||
|
||||
case 20: // wfword
|
||||
case 22: // wfword
|
||||
write_czr = 0;
|
||||
write_stream_fifo_word(pasmvars, value1);
|
||||
if (pasmvars->printflag > 1)
|
||||
fprintf(tracefile, ", fifo = %4.4x", value1);
|
||||
break;
|
||||
|
||||
case 21: // wflong
|
||||
case 23: // wflong
|
||||
write_czr = 0;
|
||||
write_stream_fifo_long(pasmvars, value1);
|
||||
if (pasmvars->printflag > 1)
|
||||
fprintf(tracefile, ", fifo = %8.8x", value1);
|
||||
break;
|
||||
|
||||
case 22: // setq
|
||||
write_czr &= 6;
|
||||
pasmvars->qreg = value1;
|
||||
pasmvars->memflag = 1;
|
||||
pasmvars->phase = 0;
|
||||
pasmvars->skip_mask >>= 1;
|
||||
//printf("qreg = %d\n", value1);
|
||||
return breakflag;
|
||||
break;
|
||||
|
||||
case 23: // setq2
|
||||
write_czr &= 6;
|
||||
pasmvars->qreg = value1;
|
||||
pasmvars->memflag = 2;
|
||||
pasmvars->phase = 0;
|
||||
pasmvars->skip_mask >>= 1;
|
||||
//printf("qreg = %d\n", value1);
|
||||
return breakflag;
|
||||
break;
|
||||
|
||||
case 24: // getqx
|
||||
pasmvars->qxposted = 0;
|
||||
result = pasmvars->qxreg;
|
||||
|
@ -3375,12 +3415,12 @@ if (streamflag) printf("\nSTREAM COLLISION\n");
|
|||
NotImplemented(instruct);
|
||||
break;
|
||||
|
||||
case 30: // getxcos
|
||||
case 30: // getxacc
|
||||
NotImplemented(instruct);
|
||||
break;
|
||||
|
||||
case 31: // getxsin
|
||||
NotImplemented(instruct);
|
||||
case 31: // waitx
|
||||
write_czr &= 6;
|
||||
break;
|
||||
|
||||
case 32: // setse1
|
||||
|
@ -3482,8 +3522,24 @@ if (streamflag) printf("\nSTREAM COLLISION\n");
|
|||
write_czr &= 6;
|
||||
break;
|
||||
|
||||
case 40: // waitx
|
||||
case 40: // setq
|
||||
write_czr &= 6;
|
||||
pasmvars->qreg = value1;
|
||||
pasmvars->memflag = 1;
|
||||
pasmvars->phase = 0;
|
||||
pasmvars->skip_mask >>= 1;
|
||||
//printf("qreg = %d\n", value1);
|
||||
return breakflag;
|
||||
break;
|
||||
|
||||
case 41: // setq2
|
||||
write_czr &= 6;
|
||||
pasmvars->qreg = value1;
|
||||
pasmvars->memflag = 2;
|
||||
pasmvars->phase = 0;
|
||||
pasmvars->skip_mask >>= 1;
|
||||
//printf("qreg = %d\n", value1);
|
||||
return breakflag;
|
||||
break;
|
||||
|
||||
case 42: // push
|
||||
|
@ -3632,6 +3688,7 @@ if (streamflag) printf("\nSTREAM COLLISION\n");
|
|||
zflag = (result = 0);
|
||||
break;
|
||||
|
||||
#if 0
|
||||
case 53: // getint
|
||||
result = pasmvars->intflags;
|
||||
result |= (pasmvars->intstate & 2) << 15;
|
||||
|
@ -3640,8 +3697,16 @@ if (streamflag) printf("\nSTREAM COLLISION\n");
|
|||
result |= (pasmvars->intstate & 8) << 18;
|
||||
zflag = (result = 0);
|
||||
break;
|
||||
#else
|
||||
case 53: // getbrk, cogbrk
|
||||
if (czi & 6) // getbrk
|
||||
NotImplemented(instruct);
|
||||
else // cogbrk
|
||||
NotImplemented(instruct);
|
||||
break;
|
||||
#endif
|
||||
|
||||
case 54: // setbrk
|
||||
case 54: // brk
|
||||
NotImplemented(instruct);
|
||||
break;
|
||||
|
||||
|
@ -4338,30 +4403,6 @@ if (streamflag) printf("\nSTREAM COLLISION\n");
|
|||
result = zflag ^ 1;
|
||||
break;
|
||||
|
||||
case 112: // rfvar
|
||||
result = temp = 0;
|
||||
do
|
||||
{
|
||||
result |= read_stream_fifo_byte(pasmvars) << temp;
|
||||
temp += 7;
|
||||
} while ((temp < 28) && (result & (1 << temp)));
|
||||
cflag = 0;
|
||||
zflag = (result == 0);
|
||||
break;
|
||||
|
||||
case 113: // rfvars
|
||||
result = temp = 0;
|
||||
do
|
||||
{
|
||||
result |= read_stream_fifo_byte(pasmvars) << temp;
|
||||
temp += 7;
|
||||
} while ((temp < 28) && (result & (1 << temp)));
|
||||
temp = 31 - temp;
|
||||
result = (result << temp) >> temp;
|
||||
cflag = (result >> 31) & 1;
|
||||
zflag = (result == 0);
|
||||
break;
|
||||
|
||||
default:
|
||||
NotImplemented(instruct);
|
||||
break;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*******************************************************************************
|
||||
' Author: Dave Hein
|
||||
' Version 0.97
|
||||
' Copyright (c) 2010 - 2017
|
||||
' Version 0.98
|
||||
' Copyright (c) 2010 - 2018
|
||||
' See end of file for terms of use.
|
||||
'******************************************************************************/
|
||||
#include <stdio.h>
|
||||
|
@ -99,7 +99,7 @@ void spinsim_exit(int32_t exitcode)
|
|||
|
||||
void usage(void)
|
||||
{
|
||||
fprintf(stderr, "Spinsim Version 0.97\n");
|
||||
fprintf(stderr, "Spinsim Version 0.98\n");
|
||||
fprintf(stderr, "usage: spinsim [options] file\n");
|
||||
fprintf(stderr, "The options are as follows:\n");
|
||||
fprintf(stderr, " -v# Set verbosity level\n");
|
||||
|
@ -669,7 +669,7 @@ void RebootProp(void)
|
|||
if (baudrate)
|
||||
{
|
||||
if (propmode)
|
||||
bitcycles = 60000000 / baudrate;
|
||||
bitcycles = 80000000 / baudrate;
|
||||
else
|
||||
bitcycles = (LONG(0) / baudrate) >> 2;
|
||||
SerialInit(&serial_in, 31, bitcycles, 2);
|
||||
|
|
Loading…
Reference in New Issue