/** * 得到以start开始end结束的内存地址在屏幕上的显示区域<p> * @param start 开始地址,包括 * @param end 结束地址,不包括 * @return 该内存区域在屏幕显示区域的最小覆盖矩形;如果不存在现存或该内存块不与显存相交,则返回一个空的Area */ public Area intersectWithGraph(int start, int end) { if (graphRam == null) { return(Area.EMPTY_AREA); } if (start >= graphRam.getStartAddr() + graphRam.size() || end <= graphRam.getStartAddr()) { return(Area.EMPTY_AREA); } if (start < graphRam.getStartAddr()) { start = graphRam.getStartAddr(); } if (end > graphRam.getStartAddr() + graphRam.size()) { end = graphRam.getStartAddr() + graphRam.size(); } start <<= 3; end = (end << 3) - 1; int y1 = start / screen.getWidth(); int x1 = start % screen.getWidth(); int y2 = end / screen.getWidth(); int x2 = end % screen.getWidth(); if (y1 == y2) { return(new Area(x1, y1, x2 - x1 + 1, 1)); } else { return(new Area(0, y1, screen.getWidth(), y2 - y1 + 1)); } }
/// <summary> /// 设置用于显示的ScreenModel,并作适当的初始化 /// </summary> /// <param name="screen"></param> public void setScreenModel(ScreenModel screen) { if (screen == null) { //throw new IllegalArgumentException("Screen must't be null!"); } if (this.screen != screen) { this.screen = screen; this.buffer = new sbyte[(screen.getWidth() / 6) * (screen.getHeight() / 13)]; this.getter = new ByteArrayGetter(buffer); this.ram = new ByteArrayRam(buffer, screen); this.render = screen.getRender(); } else { ram.Clear(); } this.curCol = this.curRow = 0; this.isBigMode = true; this.maxCol = screen.getWidth() / 8; this.maxRow = screen.getHeight() / 16; }