Exemple #1
0
void VM::update()
{
	unsigned int memsize = m_memory.size();
	unsigned int pc = m_pc;
	unsigned int sp = m_sp;
	int time_left = m_time_left + m_speed;
	vmByte* data = m_memory.data;
	vmUInt pos;

	m_time_left = time_left;

	while ( time_left-- > 0 ) {

		switch ( data[pc++] ) {

/* --------------------------------------- NOP GROUP ------------------------------------- */

			case 0: // nop
				nop();
			break;
			case 1: nop(); break;
			case 2: nop(); break;
			case 3: nop(); break;

/* --------------------------------------- ICONST GROUP ------------------------------------- */

			case 4: // iconst
				intRef(sp) = readInt(pc);
				incSP(sizeof(vmInt));
				incPC(sizeof(vmInt));
			break;

			case 5: // iconst_0
				intRef(sp) = 0;
				incSP(sizeof(vmInt));
			break;
			case 6: // iconst_1
				intRef(sp) = 1;
				incSP(sizeof(vmInt));
			break;
			case 7: // iconst_m1
				intRef(sp) = -1;
				incSP(sizeof(vmInt));
			break;

/* --------------------------------------- ILOAD GROUP ------------------------------------- */

			case 8: // iload_b
				pos = sp - readSByte(pc);
				if ( isValidIntMemPos(pos) ) intRef(sp) = readInt( pos );
				incSP(sizeof(vmInt));
				incPC(sizeof(vmSByte));
			break;
			case 9: // iload
				pos = m_bos + readInt(pc);
				if ( isValidIntMemPos(pos) ) intRef(sp) = readInt( pos );
				incSP(sizeof(vmInt));
				incPC(sizeof(vmInt));
			break;
			case 10: nop(); break;
			case 11: nop(); break;

/* --------------------------------------- ISTOR GROUP ------------------------------------- */

			case 12: // istor_b
				nop();
			break;
			case 13: // istor
				nop();
			break;
			case 14: nop(); break;
			case 15: nop(); break;

/* --------------------------------------- JUMP GROUP ------------------------------------- */

			case 16: // goto_b
				incPC(readSByte(pc));
			break;
			case 17: // goto
				incPC(readInt(pc));
			break;
			case 18: // jump
				pc = readUInt(pc);
			break;
			case 19: nop(); break;

/* --------------------------------------- IOPS GROUP ------------------------------------- */

			case 20: // iadd
				intRef( sp-2*sizeof(vmInt) ) += readInt( sp-sizeof(vmInt) );
				incSP(-sizeof(vmInt));
			break;
			case 21: // imul
				intRef( sp-2*sizeof(vmInt) ) *= readInt( sp-sizeof(vmInt) );
				incSP(-sizeof(vmInt));
			break;
			case 22: // idiv
				if ( readInt( sp-sizeof(vmInt) ) != 0 ) {
					intRef( sp-2*sizeof(vmInt) ) /= readInt( sp-sizeof(vmInt) );
					incSP(-sizeof(vmInt));
				} else {
					intRef( sp-2*sizeof(vmInt) ) = INT_MAX;
					incSP(-sizeof(vmInt));
					callInterrupt(intDivideByZero);
				}
			break;
			case 23: // imod
				if ( readInt( sp-sizeof(vmInt) ) != 0 ) {
					intRef( sp-2*sizeof(vmInt) ) %= readInt( sp-sizeof(vmInt) );
					incSP(-sizeof(vmInt));
				} else {
					intRef( sp-2*sizeof(vmInt) ) = 0;
					incSP(-sizeof(vmInt));
					callInterrupt(intDivideByZero);
				}
			break;

			case 24: // iinc
				intRef( sp-sizeof(vmInt) ) += readInt(pc);
				incPC(sizeof(vmInt));
			break;
			case 25: //iinc_1
				intRef( sp-sizeof(vmInt) )++;
			break;
			case 26: nop(); break;
			case 27: nop(); break;

/* --------------------------------------- BRA GROUP ------------------------------------- */

			case 28: // bne
				nop();
			break;
			case 29: // beq
				nop();
			break;
			case 30: // blt
				nop();
			break;
			case 31: // bgt
				nop();
			break;

			case 32: // bge
				nop();
			break;
			case 33: // ble
				nop();
			break;
			case 34: nop(); break;
			case 35: nop(); break;

/* --------------------------------------- STACK GROUP ------------------------------------- */

			case 36: // pop
				incSP(-1);
			break;
			case 37: // pop_4
				incSP(-4);
			break;
			case 38: // incsp
				incSP(readSByte(pc));
				incPC(sizeof(vmByte));
			break;
			case 39: nop(); break;

/* --------------------------------------- LOGIC GROUP ------------------------------------- */

			case 40: // or
				nop();
			break;
			case 41: // and
				nop();
			break;
			case 42: nop(); break;
			case 43: nop(); break;

/* --------------------------------------- CALL GROUP ------------------------------------- */

			case 44: // jsr_b
				nop();
			break;
			case 45: // jsr
				nop();
			break;
			case 46: nop(); break;
			case 47: // ret
				nop();
			break;

/* --------------------------------------- MEM GROUP ------------------------------------- */

			case 48: // imemstor
				nop();
			break;
			case 49: // imemload
				nop();
			break;
			case 50: nop(); break;
			case 51: nop(); break;

/* --------------------------------------- PORT GROUP ------------------------------------- */

			case 52: // port_r
				byteRef(sp-sizeof(vmUInt)) = m_coreio.readByte( readUInt(sp-sizeof(vmUInt)) );
				incSP(sizeof(vmSByte)-sizeof(vmInt));
			break;
			case 53: // port_w
				nop();
			break;
			case 54: // iport_r
				nop();
			break;
			case 55: // iport_w
				nop();
			break;

/* ------------------------------------ INTERRUPT GROUP ---------------------------------- */

			case 56: // swi
				nop();
			break;
			case 57: // seti
				nop();
			break;
			case 58: // unseti
				nop();
			break;
			case 59: // reti
				nop();
			break;

/* ------------------------------------ CMP GROUP ---------------------------------- */

			case 60: // icmp
				if ( readInt( sp-sizeof(vmInt) ) == readInt( sp-2*sizeof(vmInt) ) ) sbyteRef( sp-2*sizeof(vmInt) ) = 0;
				else if ( readInt( sp-sizeof(vmInt) ) > readInt( sp-2*sizeof(vmInt) ) ) sbyteRef( sp-2*sizeof(vmInt) ) = 1;
				else sbyteRef( sp-2*sizeof(vmInt) ) = -1;
				incSP(sizeof(vmSByte)-2*sizeof(vmUInt));
			break;
			case 61: // iucmp
				if ( readUInt( sp-sizeof(vmUInt) ) == readUInt( sp-2*sizeof(vmUInt) ) ) sbyteRef( sp-2*sizeof(vmUInt) ) = 0;
				else if ( readUInt( sp-sizeof(vmUInt) ) > readUInt( sp-2*sizeof(vmUInt) ) ) sbyteRef( sp-2*sizeof(vmUInt) ) = 1;
				else sbyteRef( sp-2*sizeof(vmInt) ) = -1;
				incSP(sizeof(vmSByte)-2*sizeof(vmUInt));
			break;
			case 62: // itest
				if ( readInt( sp-sizeof(vmInt) ) == 0 ) sbyteRef( sp-sizeof(vmInt) ) = 0;
				else if ( readInt( sp-sizeof(vmInt) ) > 0 ) sbyteRef( sp-sizeof(vmInt) ) = 1;
				else sbyteRef( sp-sizeof(vmInt) ) = -1;
				incSP(sizeof(vmSByte)-sizeof(vmUInt));
			break;
			case 63: nop(); break;

			case 64: nop(); break;
			case 65: nop(); break;
			case 66: nop(); break;
			case 67: nop(); break;

			case 68: nop(); break;
			case 69: nop(); break;
			case 70: nop(); break;
			case 71: nop(); break;
			case 72: nop(); break;
			case 73: nop(); break;
			case 74: nop(); break;
			case 75: nop(); break;
			case 76: nop(); break;
			case 77: nop(); break;
			case 78: nop(); break;
			case 79: nop(); break;
			case 80: nop(); break;
			case 81: nop(); break;
			case 82: nop(); break;
			case 83: nop(); break;
			case 84: nop(); break;
			case 85: nop(); break;
			case 86: nop(); break;
			case 87: nop(); break;
			case 88: nop(); break;
			case 89: nop(); break;
			case 90: nop(); break;
			case 91: nop(); break;
			case 92: nop(); break;
			case 93: nop(); break;
			case 94: nop(); break;
			case 95: nop(); break;
			case 96: nop(); break;
			case 97: nop(); break;
			case 98: nop(); break;
			case 99: nop(); break;

			case 100: nop(); break;
			case 101: nop(); break;
			case 102: nop(); break;
			case 103: nop(); break;
			case 104: nop(); break;
			case 105: nop(); break;
			case 106: nop(); break;
			case 107: nop(); break;
			case 108: nop(); break;
			case 109: nop(); break;
			case 110: nop(); break;
			case 111: nop(); break;
			case 112: nop(); break;
			case 113: nop(); break;
			case 114: nop(); break;
			case 115: nop(); break;
			case 116: nop(); break;
			case 117: nop(); break;
			case 118: nop(); break;
			case 119: nop(); break;
			case 120: nop(); break;
			case 121: nop(); break;
			case 122: nop(); break;
			case 123: nop(); break;
			case 124: nop(); break;
			case 125: nop(); break;
			case 126: nop(); break;
			case 127: nop(); break;
			case 128: nop(); break;
			case 129: nop(); break;
			case 130: nop(); break;
			case 131: nop(); break;
			case 132: nop(); break;
			case 133: nop(); break;
			case 134: nop(); break;
			case 135: nop(); break;
			case 136: nop(); break;
			case 137: nop(); break;
			case 138: nop(); break;
			case 139: nop(); break;
			case 140: nop(); break;
			case 141: nop(); break;
			case 142: nop(); break;
			case 143: nop(); break;
			case 144: nop(); break;
			case 145: nop(); break;
			case 146: nop(); break;
			case 147: nop(); break;
			case 148: nop(); break;
			case 149: nop(); break;
			case 150: nop(); break;
			case 151: nop(); break;
			case 152: nop(); break;
			case 153: nop(); break;
			case 154: nop(); break;
			case 155: nop(); break;
			case 156: nop(); break;
			case 157: nop(); break;
			case 158: nop(); break;
			case 159: nop(); break;
			case 160: nop(); break;
			case 161: nop(); break;
			case 162: nop(); break;
			case 163: nop(); break;
			case 164: nop(); break;
			case 165: nop(); break;
			case 166: nop(); break;
			case 167: nop(); break;
			case 168: nop(); break;
			case 169: nop(); break;
			case 170: nop(); break;
			case 171: nop(); break;
			case 172: nop(); break;
			case 173: nop(); break;
			case 174: nop(); break;
			case 175: nop(); break;
			case 176: nop(); break;
			case 177: nop(); break;
			case 178: nop(); break;
			case 179: nop(); break;
			case 180: nop(); break;
			case 181: nop(); break;
			case 182: nop(); break;
			case 183: nop(); break;
			case 184: nop(); break;
			case 185: nop(); break;
			case 186: nop(); break;
			case 187: nop(); break;
			case 188: nop(); break;
			case 189: nop(); break;
			case 190: nop(); break;
			case 191: nop(); break;
			case 192: nop(); break;
			case 193: nop(); break;
			case 194: nop(); break;
			case 195: nop(); break;
			case 196: nop(); break;
			case 197: nop(); break;
			case 198: nop(); break;
			case 199: nop(); break;

			case 200: nop(); break;
			case 201: nop(); break;
			case 202: nop(); break;
			case 203: nop(); break;
			case 204: nop(); break;
			case 205: nop(); break;
			case 206: nop(); break;
			case 207: nop(); break;
			case 208: nop(); break;
			case 209: nop(); break;
			case 210: nop(); break;
			case 211: nop(); break;
			case 212: nop(); break;
			case 213: nop(); break;
			case 214: nop(); break;
			case 215: nop(); break;
			case 216: nop(); break;
			case 217: nop(); break;
			case 218: nop(); break;
			case 219: nop(); break;
			case 220: nop(); break;
			case 221: nop(); break;
			case 222: nop(); break;
			case 223: nop(); break;
			case 224: nop(); break;
			case 225: nop(); break;
			case 226: nop(); break;
			case 227: nop(); break;
			case 228: nop(); break;
			case 229: nop(); break;
			case 230: nop(); break;
			case 231: nop(); break;
			case 232: nop(); break;
			case 233: nop(); break;
			case 234: nop(); break;
			case 235: nop(); break;
			case 236: nop(); break;
			case 237: nop(); break;
			case 238: nop(); break;
			case 239: nop(); break;
			case 240: nop(); break;
			case 241: nop(); break;
			case 242: nop(); break;
			case 243: nop(); break;
			case 244: nop(); break;
			case 245: nop(); break;
			case 246: nop(); break;
			case 247: nop(); break;
			case 248: nop(); break;
			case 249: nop(); break;
			case 250: nop(); break;
			case 251: nop(); break;

/* --------------------------------------- EXT GROUP ------------------------------------- */

			case 252: nop(); break;
			case 253: nop(); break;
			case 254: nop(); break;
			case 255: // extended
				if ( data[pc] != 255 ) {
					incPC(sizeof(vmByte));
				}
			break;

		}

    if ( pc >= memsize ) pc = 0;
    if ( sp >= memsize ) sp = 0;
		//pc = pc<memsize?pc:0;
		//sp = sp<memsize?sp:0;

	}

	m_time_left = time_left;
	m_pc = pc;
	m_sp = sp;
}
//Read one packet from SerialPort
PktData blockingReadOnePacket(HANDLE hComm) {
    PktData pktData = { 0.0 };

    unsigned char packet[256];

    unsigned char cData = 0;
    unsigned char pData = 0;
    int dataCount = 1;

    // find the start of packet
    while (((pData != DLE) || (cData != SOH))) {
        pData = cData;
        cData = readSByte(hComm);
        if ((pData == DLE) && (cData == DLE)) {
            pData = cData;
            cData = readSByte(hComm);
        }
    }

    // start collect data
    while (((pData != DLE) || (cData != EOT))) {
        pData = cData;
        cData = readSByte(hComm);

        if (cData != DLE)
            packet[(dataCount++) % 256] = cData;
        else {
            pData = cData;
            cData = readSByte(hComm);
            if (cData == DLE) {
                packet[(dataCount++) % 256] = cData;
            }
        }
    }

    if (dataCount == 23) {
        int accX = uCharToInt(packet[1], packet[2]) ;
        int accY = uCharToInt(packet[3], packet[4]);
        int accZ = uCharToInt(packet[5], packet[6]);
        int gyroX = uCharToInt(packet[7], packet[8]);
        int gyroY = uCharToInt(packet[9], packet[10]);
        int gyroZ = uCharToInt(packet[11], packet[12]);
        int magX = uCharToInt(packet[13], packet[14]);
        int magY = uCharToInt(packet[15], packet[16]);
        int magZ = uCharToInt(packet[17], packet[18]);

        pktData.accX = accX / 4096.0 / 2;
        pktData.accY = accY / 4096.0 / 2;
        pktData.accZ = accZ / 4096.0 / 2;
        pktData.gyroX = gyroX / 131.0 / 120;
        pktData.gyroY = gyroY / 131.0 / 120;
        pktData.gyroZ = gyroZ / 131.0  / 120;
        pktData.magX = magX * 1.0;
        pktData.magY = magY * 1.0;
        pktData.magZ = magZ * 1.0;

        pktData.rssiData1 = packet[19];
        pktData.rssiData2 = packet[20];
        pktData.rssiData3 = packet[21];
        pktData.rssiData4 = packet[22];

        pktData.pktNumber = (PKT_NUMBER ++);
        pktData.timeStamp = getLocalTime();

        if(packet[19] != 0 || packet[20] != 0 || packet[21] != 0 || packet[22] != 0)
            printf("%ld, %d, %d, %d, %d \n",
                   getLocalTime(), pktData.rssiData1, pktData.rssiData2, pktData.rssiData3, pktData.rssiData4);
        }
    return pktData;
}