//----------------------------------------------------------------------------- // reads the next available value from the FIFO and converts it to volts before returning the reading //----------------------------------------------------------------------------- double Read_ACCESIO_AD(void) { //scale counts into AD Range Volts unsigned short data; data = InPort(AIO_BASE); return ((double)(data) / 65536.0 - ((accesSettings.adrange&0x02)?0.5:0.0)) // Adjust for polarity jumper * ((accesSettings.adrange&0x04)?10.0:20.0); // Adjust for gain jumper }
//----------------------------------------------------------------------------- // performs all the low-level operations to grab analog data from ACCESIO card // called from Process.cpp, ProcessTrigger() //----------------------------------------------------------------------------- void ReadDAQIntegrated(DataStruct *data) { CString str; double intAdc[16]; DEBUG_MESSAGE_EXT(_T(" - in ReadDAQIntegrated\r\n")); for (int i = 0; i < 16; i++) { intAdc[i] = ((double)(InPort(AIO_BASE)) / 65536.0 - ((accesSettings.adrange&0x02)?0.5:0.0)) // Adjust for polarity jumper 0.5 * ((accesSettings.adrange&0x04)?10.0:20.0); // Adjust for gain jumper 20.0 } data->integAlo = (float)intAdc[0]; data->integAhi = (float)intAdc[1]; data->integClo = (float)intAdc[2]; data->integChi = (float)intAdc[3]; return; }
bool Cpu::RunUnit() { unsigned char Cmd = ((*(vmem + this->rp)) & 0xF0) >> 4; unsigned char Addr = 0, AddrSec = 0, Flag = 0, DataType = 0, CalType = 0; unsigned int Argu = 0, ArguSec = 0, CmdLen = CmdLengthMap[Cmd]; switch(CmdLen) { case 1: break; case 5: // X[Addressing] [Argument] Addr = (*(vmem + this->rp)) & 0x0F; Argu = *(int*)(vmem + this->rp + 1); break; case 6: // X[Flag] [Addressing] [Argument] Flag = (*(vmem + this->rp)) & 0x0F; Addr = *(vmem + this->rp + 1); Argu = *(int*)(vmem + this->rp + 2); break; case 10: // X[DataType|0] [0|CalType][Multi-Addressing] [Argument1] [Argument2] DataType = (*(vmem + this->rp)) & 0x0F; if (DataType > 4) { CoreCrash("Unknow data type:%d", DataType); return false; } CalType = ((*(vmem + this->rp + 1)) & 0xF0) >> 4; Addr = (*(vmem + this->rp + 1)) & 0x0F; AddrSec = Addr & 0x03; Addr >>= 2; Argu = *(int*)(vmem + this->rp + 2); ArguSec = *(int*)(vmem + this->rp + 6); break; } // Log("%s\n", CmdName[Cmd]); switch(Cmd) { case 0x0: // NOOP this->rp += CmdLen; break; case 0x1: // LD PutData(Addr, Argu, GetData(AddrSec, ArguSec), DataType); this->rp += CmdLen; break; case 0x2: // PUSH Push(GetData(Addr, Argu)); this->rp += CmdLen; break; case 0x3: // POP PutData(Addr, Argu, Pop(), DataType); this->rp += CmdLen; break; case 0x4: // IN PutData(Addr, Argu, InPort(GetData(AddrSec, ArguSec)), DataType); this->rp += CmdLen; break; case 0x5: // OUT OutPort(GetData(Addr, Argu), GetData(AddrSec, ArguSec)); this->rp += CmdLen; break; case 0x6: // JMP this->rp = GetData(Addr, Argu); break; case 0x7: // JPC if (GetFlag(Flag) == true) { this->rp = GetData(Addr, Argu); } else { this->rp += CmdLen; } break; case 0x8: // CALL Push(this->rp + CmdLen); this->rp = GetData(Addr, Argu); break; case 0x9: // RET this->rp = Pop(); break; case 0xA: // CMP { int op1 = (int)GetData(Addr, Argu), op2 = (int)GetData(AddrSec, ArguSec); switch(DataType) { case BYTE: op1 &= 0xFF; op2 &= 0xFF; case WORD: op1 &= 0xFFFF; op2 &= 0xFFFF; case DWORD: case INT: if (op1 == op2) {PutFlag(Z);} else if (op1 < op2) {PutFlag(B);} else if (op1 > op2) {PutFlag(A);} break; case FLOAT: { float opf1, opf2; conv.i = op1; opf1 = conv.f; conv.i = op2; opf2 = conv.f; if (opf1 == opf2) {PutFlag(Z);} else if (opf1 < opf2) {PutFlag(B);} else if (opf1 > opf2) {PutFlag(A);} } break; } } this->rp += CmdLen; break; case 0xB: // CAL { int op1 = (int)GetData(Addr, Argu), op2 = (int)GetData(AddrSec, ArguSec), result = 0; switch(DataType) { case BYTE: op1 &= 0xFF; op2 &= 0xFF; case WORD: op1 &= 0xFFFF; op2 &= 0xFFFF; case DWORD: case INT: switch(CalType) { case ADD: result = op1 + op2; break; case SUB: result = op1 - op2; break; case MUL: result = op1 * op2; break; case DIV: result = op1 / op2; break; case MOD: result = op1 % op2; break; default: CoreCrash("Unknow operator: %d", CalType); } break; case FLOAT: { float opf1, opf2, resultf = 0.0f; conv.i = op1; opf1 = conv.f; conv.i = op2; opf2 = conv.f; switch(CalType) { case ADD: resultf = opf1 + opf2; break; case SUB: resultf = opf1 - opf2; break; case MUL: resultf = opf1 * opf2; break; case DIV: resultf = opf1 / opf2; break; default: CoreCrash("Unknow operator: %d", CalType); } conv.f = resultf; result = conv.i; } break; } PutData(Addr, Argu, result, DataType); } this->rp += CmdLen; break; case 0xF: // EXIT return false; default: CoreCrash("Unpredictable command on [0x%08X] :", rp); CoreDump(); return false; } return true; }