/*
MemoryTest.java
(c) 2005-2013 Edward Swartz
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/epl-v10.html
*/
package v9t9.machine.ti99.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.util.Random;
import org.junit.Before;
import org.junit.Test;
import v9t9.common.client.ISettingsHandler;
import v9t9.common.memory.IMemoryDomain;
import v9t9.common.settings.BasicSettingsHandler;
import v9t9.machine.ti99.machine.TI994A;
import v9t9.machine.ti99.memory.ConsoleRamArea;
import v9t9.machine.ti99.memory.ExpRamArea;
import ejs.base.properties.IProperty;
/**
* @author ejs
*/
public class MemoryTest {
private ISettingsHandler settings;
private TI994A machine;
private IMemoryDomain CPU;
/*
* (non-Javadoc)
*
* @see junit.framework.TestCase#setUp()
*/
@Before
public void setUp() throws Exception {
settings = new BasicSettingsHandler();
machine = new TI994A(settings);
CPU = machine.getConsole();
}
@Test
public void testReads() {
int i;
for (i = 0; i < 65536; i++) {
CPU.flatReadByte(i);
}
for (i = 0x8400; i < 0xa000; i++) {
CPU.readByte(i);
}
for (i = 0x8400; i < 0xa000; i++) {
CPU.writeByte(i, (byte) 0);
}
IProperty expRam = settings.get(ExpRamArea.settingExpRam);
expRam.setBoolean(true);
IProperty enhRam = settings.get(ConsoleRamArea.settingEnhRam);
enhRam.setBoolean(true);
int firstRAM = 0;
Random rand = new Random();
rand.setSeed(0);
for (i = 0; i < 65536; i++) {
if (CPU.hasRamAccess(i)) {
if (firstRAM == 0) {
firstRAM = i;
}
byte byt = (byte) rand.nextInt();
//System.out.println("setting " + i + " to " + byt);
CPU.writeByte(i, byt);
}
}
rand.setSeed(0);
for (i = 0; i < 65536; i++) {
if (CPU.hasRamAccess(i)) {
byte byt = (byte) rand.nextInt();
byte red = CPU.readByte(i);
if (byt != red) {
fail("memory reread failed at " + Integer.toHexString(i)
+ " byt=" + byt + ", red=" + red);
}
}
}
/* verify byte ordering */
CPU.writeWord(firstRAM, (short) 0x1234);
assertEquals(CPU.readByte(firstRAM), 0x12);
assertEquals(CPU.readByte(firstRAM + 1), 0x34);
assertEquals(CPU.readWord(firstRAM), 0x1234);
/* and off address munging */
assertEquals(CPU.readWord(firstRAM + 1), 0x1234);
/* turn off expansion RAM, shouldn't get anything from it... */
expRam.setBoolean(false);
for (i = 0x2000; i < 0x4000; i++) {
byte red = CPU.readByte(i);
if (red != 0) {
fail("memory read failed at " + Integer.toHexString(i));
}
}
for (i = 0xA000; i < 0x10000; i++) {
byte red = CPU.readByte(i);
if (red != 0) {
fail("memory read failed at " + Integer.toHexString(i));
}
}
/* without enhanced ram, 0x8000 mirrors 0x8100 through 0x8300 */
enhRam.setBoolean(false);
rand.setSeed(0);
for (i = 0x8000; i < 0x8400; i++) {
byte byt = (byte) rand.nextInt();
//System.out.println("setting " + i + " to " + byt);
CPU.writeByte(i, byt);
}
for (i = 0x8000; i < 0x8100; i++) {
byte byt0 = CPU.readByte(i);
byte byt1 = CPU.readByte(i + 0x100);
byte byt2 = CPU.readByte(i + 0x200);
byte byt3 = CPU.readByte(i + 0x300);
if (byt0 != byt1 || byt1 != byt2 || byt2 != byt3) {
fail("memory reread failed at " + Integer.toHexString(i));
}
}
for (i = 0; i < 65536; i++) {
machine.getGplMemoryDomain().readByte(i);
}
for (i = 0; i < 65536; i++) {
machine.getVdpMemoryDomain().readByte(i);
}
for (i = 0; i < 65536; i++) {
machine.getSpeechMemoryDomain().readByte(i);
}
}
}