int32 mba_rdbufW (uint32 mb, int32 bc, uint16 *buf)
{
int32 i, j, ba, mbc, pbc;
uint32 pa, dat;

if (mb >= MBA_NUM)                                      /* valid MBA? */
    return 0;
ba = mba_va[mb];                                        /* get virt addr */
mbc = (MBABC_WR + 1) - mba_bc[mb];                      /* get Mbus bc */
if (bc > mbc)                                           /* use smaller */
    bc = mbc;
for (i = 0; i < bc; i = i + pbc) {                      /* loop by pages */
    if (!mba_map_addr (ba + i, &pa, mb))                /* page inv? */
        break;
    if (!ADDR_IS_MEM (pa)) {                            /* NXM? */
        mba_upd_sr (MBASR_RTMO, 0, mb);
        break;
        }
    pbc = VA_PAGSIZE - VA_GETOFF (pa);                  /* left in page */
    if (pbc > (bc - i))                                 /* limit to rem xfr */
        pbc = bc - i;
    if (DEBUG_PRI (mba_dev[mb], MBA_DEB_XFR))
        fprintf (sim_deb, ">>MBA%d: read, pa = %X, bc = %X\n", mb, pa, pbc);
    if ((pa | pbc) & 1) {                               /* aligned word? */
        for (j = 0; j < pbc; pa++, j++) {               /* no, bytes */
            if ((i + j) & 1) {                          /* odd byte? */
                *buf = (*buf & BMASK) | (ReadB (pa) << 8);
                buf++;
                }
            else *buf = (*buf & ~BMASK) | ReadB (pa);
            }
        }
    else if ((pa | pbc) & 3) {                          /* aligned LW? */
        for (j = 0; j < pbc; pa = pa + 2, j = j + 2) {  /* no, words */
            *buf++ = ReadW (pa);                        /* get word */
            }
        }
    else {                                              /* yes, do by LW */
        for (j = 0; j < pbc; pa = pa + 4, j = j + 4) {
            dat = ReadL (pa);                           /* get lw */
            *buf++ = dat & WMASK;                       /* low 16b */
            *buf++ = (dat >> 16) & WMASK;               /* high 16b */
            }
        }
    }
mba_bc[mb] = (mba_bc[mb] + i) & MBABC_WR;
mba_va[mb] = (mba_va[mb] + i) & MBAVA_WR;
return i;
}
Exemple #2
0
t_stat my_save (FILE *fileref, char *cptr, char *fnam)
{
	int iaddr, nzeroes = 0, nwords = (int) (MEMSIZE/2), val;

	fprintf(fileref, "=%04x\r\n", IAR);
	fprintf(fileref, "@0000\r\n");
	for (iaddr = 0; iaddr < nwords; iaddr++) {
		val = ReadW(iaddr);
		if (val == 0)						/*queue up zeroes */
			nzeroes++;
		else {
			if (nzeroes >= 4) {				/*spit out a Z directive */
				fprintf(fileref, "Z%04x\r\n", nzeroes);
				nzeroes = 0;
			}
			else {							/*write queued zeroes literally */
				while (nzeroes > 0) {
					fprintf(fileref, " 0000\r\n");
					nzeroes--;
				}
			}
			fprintf(fileref, " %04x\r\n", val);
		}
	}
	if (nzeroes >= 4) {						/*emit any queued zeroes */
		fprintf(fileref, "Z%04x\r\n", nzeroes);
		nzeroes = 0;
	}
	else {
		while (nzeroes > 0) {
			fprintf(fileref, " 0000\r\n");
			nzeroes--;
		}
	}

	return SCPE_OK;
}
Exemple #3
0
int main(void)
{
unsigned char BufC;
uint16_t BufW; 

  /* 系统初始化*/
  systemInit();

  delay_ms(300);
  printf("LEADIY-M3 TEST V2\r\n");

  while (1)
  {
    if(uartAvailable()) //检测是否收到LEADIY-M3数据
    {  
      BufC = uartRead(); //读一个字节
      if(BufC==0xA7){  //判断是否为帧 头
        BufC = uartRead(); //读一个字节
        if (BufC==0x7A) { //判断是否为帧头
          BufC = uartRead(); //读一个字节
          switch(BufC) //帧类型判断
          {
            case 0x70: //标识为角速度帧
              BufC = uartRead(); //帧长度,可不用
              BufC = uartRead(); //效验位
              Gyro[0] = ReadW();      //X轴
              Gyro[1] = ReadW();      //Y轴
              Gyro[2] = ReadW();      //Z轴

              /*GYRO的量程为2000度每秒*/
              /* 得到以"dps" ("度/秒")为单位的角速度值*/
              GyroDPS[0] = (float)Gyro[0]*4/16.4;
              GyroDPS[1] = (float)Gyro[1]*4/16.4;
              GyroDPS[2] = (float)Gyro[2]*4/16.4;

              printf("GYRO X:%d  Y:%d  Z:%d\r\n", Gyro[0], Gyro[1], Gyro[2]);
              printf("GyroDPS X: %.2f, Y: %.2f, Z: %.2f\r\n", GyroDPS[0], GyroDPS[1], GyroDPS[2]);
              break;
            case 0x71: //标识为加速度帧
              BufC = uartRead(); //帧长度,可不用
              BufC = uartRead(); //效验位
              Acc[0] = ReadW();      //X轴
              Acc[1] = ReadW();      //Y轴
              Acc[2] = ReadW();      //Z轴

              /*ACC的量程为8G*/
              /*得到以"g"为单位的加速度*/
              AccG[0] = (float)Acc[0] / 4096;
              AccG[1] = (float)Acc[1] / 4096;
              AccG[2] = (float)Acc[2] / 4096;
              printf("ACC X:%d  Y:%d  Z:%d\r\n", Acc[0], Acc[1], Acc[2]);
              printf("AccG X:%.2f  Y:%.2f  Z:%.2f\r\n", AccG[0], AccG[1], AccG[2]);
              break;
            case 0x72: //标识为姿态帧
              BufC = uartRead(); //帧长度,可不用
              BufC = uartRead(); //效验位
              Angle[0] = ReadW();   //X轴角度(横滚)
              Angle[1] = ReadW();   //Y轴角度(俯仰)
              Angle[2] = ReadW();   //Z轴角度(偏航)

              AngleDeg[0] = (float)Angle[0] / 100;
              AngleDeg[1] = (float)Angle[1] / 100;
              AngleDeg[2] = (float)Angle[2] / 100;
              if (AngleDeg[2]<0) AngleDeg[2] += 360; //将航向值转化到0---360度区间
              printf("ANGLE X:%d  Y:%d  Z:%d \r\n", Angle[0], Angle[1], Angle[2]);
              printf("AngleDeg X:%.2f  Y:%.2f  Z:%.2f \r\n", AngleDeg[0], AngleDeg[1], AngleDeg[2]);
              break;
            case 0x73: //标识为 地磁帧
              BufC = uartRead(); //帧长度,可不用
              BufC = uartRead(); //效验位
              Mag[0] = ReadW();   //X轴
              Mag[1] = ReadW();   //Y轴
              Mag[2] = ReadW();   //Z轴

              /*地磁设置为2.5Ga*/
              /*得到以"Gauss"为单位的地磁*/
              MagGauss[0] = (float)Mag[0] / 660; 
              MagGauss[1] = (float)Mag[1] / 660; 
              MagGauss[2] = (float)Mag[2] / 660; 
              printf("Mag X:%d  Y:%d  Z:%d \r\n", Mag[0], Mag[1], Mag[2]);
              printf("MagGauss X:%.2f  Y:%.2f  Z:%.2f \r\n", MagGauss[0], MagGauss[1], MagGauss[2]);
              break;
            case 0x74: //标识为温度、气压帧
              BufC = uartRead(); //帧长度,可不用
              BufC = uartRead(); //效验位
              Temper = ReadW() / 10;   //X轴
              BufW = ReadW();   //气压低16位
              Pressure = (int32_t)(((uint32_t)(ReadW() << 16))|BufW); 
              printf("Temperature(Degree):%.2f  Pressure(Pa):%d \r\n", Temper, Pressure);
              break;
            case 0x75: // 标识为高度帧
              BufC = uartRead(); //帧长度,可不用
              BufC = uartRead(); //效验位
              BufW = ReadW();   //高度低16位

              /*得到以"CM"为单位的海拔高度*/
              Altitude = (int32_t)(((uint32_t)(ReadW() << 16))|BufW); 
              printf("Altitude(cm):%d \r\n", Altitude);
              break;
            default:  break;
          }
        }
      }
    }
  }

}