diff --git a/app/build.gradle b/app/build.gradle index a49ff61..c0b30e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,4 +33,11 @@ dependencies { compile "org.jetbrains.kotlin:kotlin-reflect:0.12.213" compile 'com.jakewharton:kotterknife:0.1.0-SNAPSHOT' compile 'com.facebook.stetho:stetho:1.1.1' + compile 'com.google.guava:guava:18.0' + + testCompile 'junit:junit:4.12' + testCompile 'org.mockito:mockito-core:1.10.19' + testCompile 'org.hamcrest:hamcrest-integration:1.3' + testCompile 'org.hamcrest:hamcrest-core:1.3' + testCompile 'org.hamcrest:hamcrest-library:1.3' } diff --git a/app/src/androidTest/java/felipecsl/com/emu6502/ApplicationTest.java b/app/src/androidTest/java/felipecsl/com/emu6502/ApplicationTest.java deleted file mode 100644 index 336f7f7..0000000 --- a/app/src/androidTest/java/felipecsl/com/emu6502/ApplicationTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package felipecsl.com.emu6502; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/app/src/main/java/android/emu6502/Emu6502Application.java b/app/src/main/java/android/emu6502/Emu6502Application.java deleted file mode 100644 index 31d5dbb..0000000 --- a/app/src/main/java/android/emu6502/Emu6502Application.java +++ /dev/null @@ -1,16 +0,0 @@ -package android.emu6502; - -import android.app.Application; - -import com.facebook.stetho.Stetho; - -public class Emu6502Application extends Application { - - @Override public void onCreate() { - super.onCreate(); - Stetho.initialize( - Stetho.newInitializerBuilder(this) - .enableWebKitInspector(Stetho.defaultInspectorModulesProvider(this)) - .build()); - } -} diff --git a/app/src/main/kotlin/android/emu6502/Assembler.kt b/app/src/main/kotlin/android/emu6502/Assembler.kt index 2a0dd80..8e4b9d6 100644 --- a/app/src/main/kotlin/android/emu6502/Assembler.kt +++ b/app/src/main/kotlin/android/emu6502/Assembler.kt @@ -15,8 +15,7 @@ class Assembler(private var labels: Labels, private var memory: Memory, fun assembleCode(lines: List) { lines.forEachIndexed { i, line -> if (!assembleLine(line)) { - val str = line.replace("<", "<").replace(">", ">") - throw RuntimeException("**Syntax error line " + (i + 1) + ": " + str + "**") + throw RuntimeException("**Syntax error line " + (i + 1) + ": " + line + "**") } } // set a null byte at the end of the code @@ -121,6 +120,10 @@ class Assembler(private var labels: Labels, private var memory: Memory, return false } + fun hexdump(): String { + return memory.format(0x600, codeLen) + } + private fun DCB(param: String): Boolean { throw UnsupportedOperationException( "not implemented") //To change body of created functions use File | Settings | File Templates. @@ -289,7 +292,7 @@ class Assembler(private var labels: Labels, private var memory: Memory, // Try to parse the given parameter as a byte operand. // Returns the (positive) value if successful, otherwise -1 private fun tryParseByteOperand(param: String): Int { - var value: Int = 0 + var value: Int = -1 var parameter = param if (parameter.matches("^\\w+$".toRegex())) { @@ -321,7 +324,7 @@ class Assembler(private var labels: Labels, private var memory: Memory, } private fun tryParseWordOperand(param: String): Int { - var value: Int = 0 + var value: Int = -1 var parameter = param if (parameter.matches("^\\w+$".toRegex())) { diff --git a/app/src/main/kotlin/android/emu6502/CPU.kt b/app/src/main/kotlin/android/emu6502/CPU.kt index be5aa88..dd45650 100644 --- a/app/src/main/kotlin/android/emu6502/CPU.kt +++ b/app/src/main/kotlin/android/emu6502/CPU.kt @@ -139,8 +139,4 @@ class CPU(private val memory: Memory) { fun popWord(): Int { return popByte() + popByte().shl(8) } - - fun Int.toHexString(): String { - return Integer.toHexString(this) - } } \ No newline at end of file diff --git a/app/src/main/kotlin/android/emu6502/Emu6502Application.kt b/app/src/main/kotlin/android/emu6502/Emu6502Application.kt new file mode 100644 index 0000000..771887a --- /dev/null +++ b/app/src/main/kotlin/android/emu6502/Emu6502Application.kt @@ -0,0 +1,14 @@ +package android.emu6502 + +import android.app.Application +import com.facebook.stetho.Stetho + +public class Emu6502Application : Application() { + override fun onCreate() { + super.onCreate() + Stetho.initialize(Stetho.newInitializerBuilder(this) + .enableWebKitInspector(Stetho.defaultInspectorModulesProvider(this)) + .build()) + } +} + diff --git a/app/src/main/kotlin/android/emu6502/Memory.kt b/app/src/main/kotlin/android/emu6502/Memory.kt index 83d0c97..82e229e 100644 --- a/app/src/main/kotlin/android/emu6502/Memory.kt +++ b/app/src/main/kotlin/android/emu6502/Memory.kt @@ -1,5 +1,7 @@ package android.emu6502 +import java.util.* + class Memory(private val display: Display) { private val mem = IntArray(65536) @@ -17,4 +19,26 @@ class Memory(private val display: Display) { display.updatePixel(addr) } } + + fun format(start: Int, length: Int): String { + var i = 0 + var n: Int + val dump = StringBuilder() + + while (i < length) { + if (i.and(15) == 0) { + if (i > 0) { + dump.append("\n") + } + n = start + i + dump.append(n.shr(8).and(0xff).toHexString()) + dump.append(n.and(0xff).toHexString()) + dump.append(": ") + } + dump.append(get(start + i).toHexString()) + dump.append(" ") + i++ + } + return dump.toString().trim() + } } diff --git a/app/src/main/kotlin/android/emu6502/Utils.kt b/app/src/main/kotlin/android/emu6502/Utils.kt new file mode 100644 index 0000000..0fdccb0 --- /dev/null +++ b/app/src/main/kotlin/android/emu6502/Utils.kt @@ -0,0 +1,5 @@ +package android.emu6502 + +fun Int.toHexString(): String { + return java.lang.String.format("%02X", this); +} \ No newline at end of file diff --git a/app/src/test/java/android/emu6502/AssemblerTest.java b/app/src/test/java/android/emu6502/AssemblerTest.java new file mode 100644 index 0000000..5cd8358 --- /dev/null +++ b/app/src/test/java/android/emu6502/AssemblerTest.java @@ -0,0 +1,26 @@ +package android.emu6502; + +import com.google.common.collect.ImmutableList; + +import org.junit.Test; + +import java.util.List; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + +public class AssemblerTest { + + @Test public void testAssembler() { + List lines = ImmutableList.of( + "LDA #$01", + "STA $0200", + "LDA #$05", + "STA $0201", + "LDA #$08", + "STA $0202"); + Assembler assembler = new Assembler(new Labels(), new Memory(new Display()), new Symbols()); + assembler.assembleCode(lines); + assertThat(assembler.hexdump(), equalTo("0600: A9 01 8D 00 02 A9 05 8D 01 02 A9 08 8D 02 02")); + } +}