/** * 卸载ram,如果并没有安装过ram,则什么也不会发生 * @param type 需要卸载的内存类型 */ public void uninstall(int type) { Ram.Ram ram = null; switch (type) { case RamConst.RAM_RUNTIME_TYPE: ram = runRam; runRam = null; break; case RamConst.RAM_GRAPH_TYPE: ram = graphRam; graphRam = null; break; case RamConst.RAM_BUFFER_TYPE: ram = bufferRam; bufferRam = null; break; case RamConst.RAM_STRING_TYPE: ram = strRam; strRam = null; break; case RamConst.RAM_TEXT_TYPE: ram = textRam; textRam = null; break; } if (ram != null) { resetRamAddress(); } }
/** * 往里面添加内存模块,每种类型的内存最多只能安装一个.<p> * ram为null不会抛出异常,且不会改变RamManager的任何状态 * @param ram 需要安装的内存 * @throws IllegalStateException 已经安装了这种类型的内存 * @see #uninstall */ public void install(Ram.Ram ram) { if (ram == null) { return; } switch (ram.getRamType()) { case RamConst.RAM_RUNTIME_TYPE: if (runRam != null) { //throw new IllegalStateException("Runtime Ram was installed!"); } runRam = (RuntimeRam)ram; break; case RamConst.RAM_GRAPH_TYPE: if (graphRam != null) { //throw new IllegalStateException("Graph Ram was installed!"); } graphRam = (RelativeRam)ram; screen = graphRam.getScreenModel(); break; case RamConst.RAM_BUFFER_TYPE: if (bufferRam != null) { //throw new IllegalStateException("Buffer Ram was installed!"); } bufferRam = (RelativeRam)ram; break; case RamConst.RAM_STRING_TYPE: if (strRam != null) { //throw new IllegalStateException("String Ram was installed!"); } strRam = (StringRam)ram; break; case RamConst.RAM_TEXT_TYPE: if (textRam != null) { //throw new IllegalStateException("Text Ram was installed!"); } textRam = (RelativeRam)ram; break; } resetRamAddress(); }
/** * 读取指定内存地址一字节数据,并以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); }