/* This file is part of jpcsp. Jpcsp is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Jpcsp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Jpcsp. If not, see <http://www.gnu.org/licenses/>. */ package jpcsp.memory; /** * @author gid15 * */ public class BufferedMemoryReader { private IMemoryReader memoryReader; private int readValue; private int index; public BufferedMemoryReader(int address) { memoryReader = MemoryReader.getMemoryReader(address, 4); init(address); } public BufferedMemoryReader(int address, int length) { memoryReader = MemoryReader.getMemoryReader(address, length, 4); init(address); } private void init(int address) { index = address & 0x03; if (index > 0) { readValue = memoryReader.readNext(); } } public int readNext32() { index = 0; return memoryReader.readNext(); } public void skipNext32(int count) { index = 0; memoryReader.skip(count); } public void skipNext32() { skipNext32(1); } public int readNext16() { if (index == 0 || index == 3) { index = 2; readValue = memoryReader.readNext(); return readValue & 0xFFFF; } index = 0; return readValue >>> 16; } public void skipNext16() { if (index == 0 || index == 3) { index = 2; readValue = memoryReader.readNext(); } else { index = 0; } } public int readNext8() { switch (index) { case 0: readValue = memoryReader.readNext(); index = 1; return (readValue & 0xFF); case 1: index = 2; return (readValue >> 8) & 0xFF; case 2: index = 3; return (readValue >> 16) & 0xFF; default: // index == 3 index = 0; return (readValue >>> 24); } } public void skipNext8() { if (index == 0) { readValue = memoryReader.readNext(); index = 1; } else if (index == 3) { index = 0; } else { index++; } } public float readNextFloat() { index = 0; return Float.intBitsToFloat(memoryReader.readNext()); } public void align16() { index = (index + 1) & ~1; } public void align32() { index = 0; } }