/**
  * 读取指定内存地址一字节数据,并以byte返回
  * @param addr 地址
  * @return byte数据
  */
 public sbyte getByte(int addr)
 {
     //Notice: 该实现与resetRamAddress的实现方式有关
     if (addr >= runRam.getStartAddr())
     {
         return(runRam.getByte(addr));
     }
     if (addr >= strRam.getStartAddr())
     {
         return(strRam.getByte(addr));
     }
     for (int index = ramCount - 1; index >= 0; index--)
     {
         Ram.Ram ram = rams[index];
         if (addr >= ram.getStartAddr())
         {
             return(ram.getByte(addr));
         }
     }
     return(-1);
     //throw new IndexOutOfBoundsException("内存读越界:" + addr);
 }
 /**
  * 将地址为addr的数据设为b
  * 注意:这些内存地址中可能涉及到显存或屏幕缓冲区,该方法不负责通知相应组件<p>
  *      应该自己调用intersectWithGraph()方法判断并做出相应反应
  * @param addr 地址
  * @param b 数据
  * @throws IndexOutOfBoundsException 内存写越界
  */
 public void setByte(int addr, sbyte b)
 {
     //Notice: 该实现与resetRamAddress的实现方式有关
     if (addr >= runRam.getStartAddr())
     {
         runRam.setByte(addr, b);
         return;
     }
     if (addr >= strRam.getStartAddr())
     {
         strRam.setByte(addr, b);
         return;
     }
     for (int index = ramCount - 1; index >= 0; index--)
     {
         Ram.Ram ram = rams[index];
         if (addr >= ram.getStartAddr())
         {
             ram.setByte(addr, b);
             return;
         }
     }
     //throw new IndexOutOfBoundsException("内存写越界:" + addr);
 }