From 053d7b267d4a362df91f5cf780bddbfb229cdf36 Mon Sep 17 00:00:00 2001 From: Felipe Lima Date: Thu, 11 Jun 2015 23:26:47 -0700 Subject: [PATCH] Adds instructions, display, instructiontarget, etc --- .../main/kotlin/android/emu6502/Assembler.kt | 31 +++- app/src/main/kotlin/android/emu6502/CPU.kt | 162 ++++++++++-------- .../main/kotlin/android/emu6502/Display.kt | 6 + .../main/kotlin/android/emu6502/Emulator.kt | 8 + app/src/main/kotlin/android/emu6502/Memory.kt | 17 +- .../android/emu6502/app/MainActivity.kt | 11 +- .../android/emu6502/instructions/ADC.kt | 9 - .../android/emu6502/instructions/AND.kt | 9 - .../android/emu6502/instructions/ASL.kt | 9 - .../emu6502/instructions/BaseInstruction.kt | 28 +-- .../emu6502/instructions/InstructionTarget.kt | 7 + .../android/emu6502/instructions/LDX.kt | 9 - .../android/emu6502/instructions/ORA.kt | 8 - .../android/emu6502/instructions/STX.kt | 10 -- .../android/emu6502/instructions/impl/ADC.kt | 10 ++ .../android/emu6502/instructions/impl/AND.kt | 10 ++ .../android/emu6502/instructions/impl/ASL.kt | 10 ++ .../android/emu6502/instructions/impl/BIT.kt | 10 ++ .../android/emu6502/instructions/impl/LDA.kt | 15 ++ .../android/emu6502/instructions/impl/LDX.kt | 9 + .../android/emu6502/instructions/impl/LDY.kt | 10 ++ .../android/emu6502/instructions/impl/ORA.kt | 10 ++ .../android/emu6502/instructions/impl/STA.kt | 16 ++ .../android/emu6502/instructions/impl/STX.kt | 10 ++ app/src/main/res/layout/activity_main.xml | 4 +- 25 files changed, 292 insertions(+), 146 deletions(-) create mode 100644 app/src/main/kotlin/android/emu6502/Display.kt create mode 100644 app/src/main/kotlin/android/emu6502/Emulator.kt delete mode 100644 app/src/main/kotlin/android/emu6502/instructions/ADC.kt delete mode 100644 app/src/main/kotlin/android/emu6502/instructions/AND.kt delete mode 100644 app/src/main/kotlin/android/emu6502/instructions/ASL.kt create mode 100644 app/src/main/kotlin/android/emu6502/instructions/InstructionTarget.kt delete mode 100644 app/src/main/kotlin/android/emu6502/instructions/LDX.kt delete mode 100644 app/src/main/kotlin/android/emu6502/instructions/ORA.kt delete mode 100644 app/src/main/kotlin/android/emu6502/instructions/STX.kt create mode 100644 app/src/main/kotlin/android/emu6502/instructions/impl/ADC.kt create mode 100644 app/src/main/kotlin/android/emu6502/instructions/impl/AND.kt create mode 100644 app/src/main/kotlin/android/emu6502/instructions/impl/ASL.kt create mode 100644 app/src/main/kotlin/android/emu6502/instructions/impl/BIT.kt create mode 100644 app/src/main/kotlin/android/emu6502/instructions/impl/LDA.kt create mode 100644 app/src/main/kotlin/android/emu6502/instructions/impl/LDX.kt create mode 100644 app/src/main/kotlin/android/emu6502/instructions/impl/LDY.kt create mode 100644 app/src/main/kotlin/android/emu6502/instructions/impl/ORA.kt create mode 100644 app/src/main/kotlin/android/emu6502/instructions/impl/STA.kt create mode 100644 app/src/main/kotlin/android/emu6502/instructions/impl/STX.kt diff --git a/app/src/main/kotlin/android/emu6502/Assembler.kt b/app/src/main/kotlin/android/emu6502/Assembler.kt index e7bd871..dfe2ee9 100644 --- a/app/src/main/kotlin/android/emu6502/Assembler.kt +++ b/app/src/main/kotlin/android/emu6502/Assembler.kt @@ -14,7 +14,7 @@ class Assembler(private var labels: Labels, private var codeAssembledOK = false private var BOOTSTRAP_ADDRESS = 0x600 - fun assembleCode(lines: Array): Boolean { + fun assembleCode(lines: List): Boolean { lines.forEach { line -> if (!assembleLine(line)) { return false @@ -132,7 +132,7 @@ class Assembler(private var labels: Labels, } private fun checkAbsolute(param: String, opcode: Int): Boolean { - if (checkWordOperand("^([\\w\$]+)$")) { + if (checkWordOperand(param, opcode, "^([\\w\$]+)$")) { return true } @@ -196,40 +196,67 @@ class Assembler(private var labels: Labels, } private fun checkIndirectY(param: String, opcode: Int): Boolean { + if (opcode == 0xff) { + return false + } return checkByteOperand(param, opcode, "^\\(([\\w\$]+)\\),Y$") } private fun checkIndirectX(param: String, opcode: Int): Boolean { + if (opcode == 0xff) { + return false + } return checkByteOperand(param, opcode, "^\\(([\\w\$]+)\\),X$") } private fun checkIndirect(param: String, opcode: Int): Boolean { + if (opcode == 0xff) { + return false + } return checkWordOperand(param, opcode, "^\\(([\\w\$]+)\\)$") } private fun checkAbsoluteY(param: String, opcode: Int): Boolean { + if (opcode == 0xff) { + return false + } return checkWordOperand(param, opcode, "^([\\w\$]+),Y$") || checkLabel(param, opcode, "^\\w+,Y$".toRegex()) } private fun checkAbsoluteX(param: String, opcode: Int): Boolean { + if (opcode == 0xff) { + return false + } return checkWordOperand(param, opcode, "^([\\w\$]+),X$") || checkLabel(param, opcode, "^\\w+,X$".toRegex()) } private fun checkZeroPageY(param: String, opcode: Int): Boolean { + if (opcode == 0xff) { + return false + } return checkByteOperand(param, opcode, "^([\\w\$]+),Y") } private fun checkZeroPageX(param: String, opcode: Int): Boolean { + if (opcode == 0xff) { + return false + } return checkByteOperand(param, opcode, "^([\\w\$]+),X") } private fun checkZeroPage(param: String, opcode: Int): Boolean { + if (opcode == 0xff) { + return false + } return innerCheckByteOperand(param, opcode) } private fun checkImmediate(param: String, opcode: Int): Boolean { + if (opcode == 0xff) { + return false + } if (checkByteOperand(param, opcode, "^#([\\w\$]+)$")) { return true } diff --git a/app/src/main/kotlin/android/emu6502/CPU.kt b/app/src/main/kotlin/android/emu6502/CPU.kt index b2de827..9e95f70 100644 --- a/app/src/main/kotlin/android/emu6502/CPU.kt +++ b/app/src/main/kotlin/android/emu6502/CPU.kt @@ -1,83 +1,87 @@ package android.emu6502 -import android.emu6502.instructions.* +import android.emu6502.instructions.BaseInstruction +import android.emu6502.instructions.Instruction +import android.emu6502.instructions.InstructionTarget +import android.emu6502.instructions.impl.* import android.util.Log import java.util.HashMap import kotlin.reflect.KMemberFunction0 class CPU(private val memory: Memory) { // Accumulator - private var A: Byte = 0 + var A: Int = 0 // Registers - private var X: Byte = 0 - private var Y: Byte = 0 + var X: Int = 0 + var Y: Int = 0 // Program counter - private var PC = 0x600 + var PC: Int = 0x600 // Stack pointer - private var SP = 0xFF - private var flags: Byte = 0 + var SP: Int = 0xFF + // Processor flags + var P: Int = 0 private var isRunning = false private var debug = false private var monitoring = false private var TAG = "CPU" - private val instructionList: HashMap> = HashMap() + val instructionList: HashMap = HashMap() private val operationList: HashMap = hashMapOf( - Pair(Instruction.ADC, ADC(instructionList)), - Pair(Instruction.AND, AND(instructionList)), - Pair(Instruction.ASL, ASL(instructionList)), - Pair(Instruction.BIT, BIT(instructionList)), - Pair(Instruction.BPL, BPL(instructionList)), - Pair(Instruction.BMI, BMI(instructionList)), - Pair(Instruction.BVC, BVC(instructionList)), - Pair(Instruction.BVS, BVS(instructionList)), - Pair(Instruction.BCC, BCC(instructionList)), - Pair(Instruction.BCS, BCS(instructionList)), - Pair(Instruction.BNE, BNE(instructionList)), - Pair(Instruction.BEQ, BEQ(instructionList)), - Pair(Instruction.BRK, BRK(instructionList)), - Pair(Instruction.CMP, CMP(instructionList)), - Pair(Instruction.CPX, CPX(instructionList)), - Pair(Instruction.CPY, CPY(instructionList)), - Pair(Instruction.DEC, DEC(instructionList)), - Pair(Instruction.EOR, EOR(instructionList)), - Pair(Instruction.CLC, CLC(instructionList)), - Pair(Instruction.SEC, SEC(instructionList)), - Pair(Instruction.CLI, CLI(instructionList)), - Pair(Instruction.SEI, SEI(instructionList)), - Pair(Instruction.CLV, CLV(instructionList)), - Pair(Instruction.CLD, CLD(instructionList)), - Pair(Instruction.SED, SED(instructionList)), - Pair(Instruction.INC, INC(instructionList)), - Pair(Instruction.JMP, JMP(instructionList)), - Pair(Instruction.JSR, JSR(instructionList)), - Pair(Instruction.LDA, LDA(instructionList)), - Pair(Instruction.LDX, LDX(instructionList)), - Pair(Instruction.LDY, LDY(instructionList)), - Pair(Instruction.LSR, LSR(instructionList)), - Pair(Instruction.NOP, NOP(instructionList)), - Pair(Instruction.ORA, ORA(instructionList)), - Pair(Instruction.TAX, TAX(instructionList)), - Pair(Instruction.TXA, TXA(instructionList)), - Pair(Instruction.DEX, DEX(instructionList)), - Pair(Instruction.INX, INX(instructionList)), - Pair(Instruction.TAY, TAY(instructionList)), - Pair(Instruction.TYA, TYA(instructionList)), - Pair(Instruction.DEY, DEY(instructionList)), - Pair(Instruction.INY, INY(instructionList)), - Pair(Instruction.ROR, ROR(instructionList)), - Pair(Instruction.ROL, ROL(instructionList)), - Pair(Instruction.RTI, RTI(instructionList)), - Pair(Instruction.RTS, RTS(instructionList)), - Pair(Instruction.SBC, SBC(instructionList)), - Pair(Instruction.STA, STA(instructionList)), - Pair(Instruction.TXS, TXS(instructionList)), - Pair(Instruction.TSX, TSX(instructionList)), - Pair(Instruction.PHA, PHA(instructionList)), - Pair(Instruction.PLA, PLA(instructionList)), - Pair(Instruction.PHP, PHP(instructionList)), - Pair(Instruction.PLP, PLP(instructionList)), - Pair(Instruction.STX, STX(instructionList)), - Pair(Instruction.STY, STY(instructionList)) + Pair(Instruction.ADC, ADC(this)), + Pair(Instruction.AND, AND(this)), + Pair(Instruction.ASL, ASL(this)), + Pair(Instruction.BIT, BIT(this)), + Pair(Instruction.LDA, LDA(this)), + Pair(Instruction.LDX, LDX(this)), + Pair(Instruction.LDY, LDY(this)), + Pair(Instruction.STA, STA(memory, this)), + Pair(Instruction.STX, STX(this)), + Pair(Instruction.ORA, ORA(this)) +// Pair(Instruction.BPL, BPL(this)), +// Pair(Instruction.BMI, BMI(this)), +// Pair(Instruction.BVC, BVC(this)), +// Pair(Instruction.BVS, BVS(this)), +// Pair(Instruction.BCC, BCC(this)), +// Pair(Instruction.BCS, BCS(this)), +// Pair(Instruction.BNE, BNE(this)), +// Pair(Instruction.BEQ, BEQ(this)), +// Pair(Instruction.BRK, BRK(this)), +// Pair(Instruction.CMP, CMP(this)), +// Pair(Instruction.CPX, CPX(this)), +// Pair(Instruction.CPY, CPY(this)), +// Pair(Instruction.DEC, DEC(this)), +// Pair(Instruction.EOR, EOR(this)), +// Pair(Instruction.CLC, CLC(this)), +// Pair(Instruction.SEC, SEC(this)), +// Pair(Instruction.CLI, CLI(this)), +// Pair(Instruction.SEI, SEI(this)), +// Pair(Instruction.CLV, CLV(this)), +// Pair(Instruction.CLD, CLD(this)), +// Pair(Instruction.SED, SED(this)), +// Pair(Instruction.INC, INC(this)), +// Pair(Instruction.JMP, JMP(this)), +// Pair(Instruction.JSR, JSR(this)), +// Pair(Instruction.LSR, LSR(this)), +// Pair(Instruction.NOP, NOP(this)), +// Pair(Instruction.TAX, TAX(this)), +// Pair(Instruction.TXA, TXA(this)), +// Pair(Instruction.DEX, DEX(this)), +// Pair(Instruction.INX, INX(this)), +// Pair(Instruction.TAY, TAY(this)), +// Pair(Instruction.TYA, TYA(this)), +// Pair(Instruction.DEY, DEY(this)), +// Pair(Instruction.INY, INY(this)), +// Pair(Instruction.ROR, ROR(this)), +// Pair(Instruction.ROL, ROL(this)), +// Pair(Instruction.RTI, RTI(this)), +// Pair(Instruction.RTS, RTS(this)), +// Pair(Instruction.SBC, SBC(this)), +// Pair(Instruction.TXS, TXS(this)), +// Pair(Instruction.TSX, TSX(this)), +// Pair(Instruction.PHA, PHA(this)), +// Pair(Instruction.PLA, PLA(this)), +// Pair(Instruction.PHP, PHP(this)), +// Pair(Instruction.PLP, PLP(this)), +// Pair(Instruction.STY, STY(this)) ) fun execute() { @@ -96,19 +100,41 @@ class CPU(private val memory: Memory) { private fun executeNextInstruction() { val instruction = Integer.valueOf(popByte().toInt().toString(), 16) - val function = instructionList.get(instruction) - if (function != null) { - ORA(instructionList).function() + val target = instructionList.get(instruction) + if (target != null) { + val function = target.method + target.operation.function() } else { Log.e(TAG, "Address $" + PC + " - unknown opcode") } } - private fun popByte(): Byte { + fun popByte(): Int { return memory.get((PC++).and(0xff)); } private fun setRandomByte() { memory.set(0xfe, Math.floor(Math.random() * 256).toInt()) } + + fun setSZFlagsForRegA() { + setSZFlagsForValue(A) + } + + private fun setSZFlagsForValue(value: Int) { + if (value != 0) { + P = P.and(0xfd); + } else { + P = P.or(0x02); + } + if (value.and(0x80) != 0) { + P = P.or(0x80); + } else { + P = P.and(0x7f); + } + } + + fun popWord(): Int { + return popByte() + popByte().shl(8) + } } \ No newline at end of file diff --git a/app/src/main/kotlin/android/emu6502/Display.kt b/app/src/main/kotlin/android/emu6502/Display.kt new file mode 100644 index 0000000..f7ccb38 --- /dev/null +++ b/app/src/main/kotlin/android/emu6502/Display.kt @@ -0,0 +1,6 @@ +package android.emu6502 + +final class Display { + fun updatePixel(addr: Int) { + } +} diff --git a/app/src/main/kotlin/android/emu6502/Emulator.kt b/app/src/main/kotlin/android/emu6502/Emulator.kt new file mode 100644 index 0000000..5982834 --- /dev/null +++ b/app/src/main/kotlin/android/emu6502/Emulator.kt @@ -0,0 +1,8 @@ +package android.emu6502 + +final class Emulator { + val display = Display() + val memory = Memory(display) + val cpu = CPU(memory) + val assembler = Assembler(Labels(), memory, Symbols()) +} \ No newline at end of file diff --git a/app/src/main/kotlin/android/emu6502/Memory.kt b/app/src/main/kotlin/android/emu6502/Memory.kt index f9030c6..83d0c97 100644 --- a/app/src/main/kotlin/android/emu6502/Memory.kt +++ b/app/src/main/kotlin/android/emu6502/Memory.kt @@ -1,13 +1,20 @@ package android.emu6502 -class Memory { - private val mem = ByteArray(65536) +class Memory(private val display: Display) { + private val mem = IntArray(65536) - public fun get(addr: Int): Byte { + fun get(addr: Int): Int { return mem[addr] } - public fun set(addr: Int, value: Int) { - mem[addr] = value.toByte() + fun set(addr: Int, value: Int) { + mem[addr] = value + } + + fun storeByte(addr: Int, value: Int) { + set(addr, value.and(0xff)) + if ((addr >= 0x200) && (addr <= 0x5ff)) { + display.updatePixel(addr) + } } } diff --git a/app/src/main/kotlin/android/emu6502/app/MainActivity.kt b/app/src/main/kotlin/android/emu6502/app/MainActivity.kt index 714cbe1..3fdabe6 100644 --- a/app/src/main/kotlin/android/emu6502/app/MainActivity.kt +++ b/app/src/main/kotlin/android/emu6502/app/MainActivity.kt @@ -1,5 +1,6 @@ package android.emu6502.app +import android.emu6502.Emulator import android.emu6502.R import android.os.Bundle import android.support.design.widget.FloatingActionButton @@ -9,6 +10,7 @@ import android.support.v7.widget.Toolbar import android.view.Menu import android.view.MenuItem import android.widget.TextView +import android.widget.Toast import butterknife.bindView public class MainActivity : AppCompatActivity() { @@ -20,7 +22,9 @@ public class MainActivity : AppCompatActivity() { val txtSP: TextView by bindView(R.id.SP) val txtPC: TextView by bindView(R.id.PC) val txtFlags: TextView by bindView(R.id.PC) - val fab: FloatingActionButton by bindView(R.id.fab) + val txtInstructions: TextView by bindView(R.id.txtInstructions) + val fabRun: FloatingActionButton by bindView(R.id.fabRun) + val emulator = Emulator() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -30,6 +34,11 @@ public class MainActivity : AppCompatActivity() { var ab: ActionBar = getSupportActionBar() ab.setDisplayHomeAsUpEnabled(true) + + fabRun.setOnClickListener { + emulator.assembler.assembleCode(txtInstructions.getText().toString().splitBy("\n")) + Toast.makeText(fabRun.getContext(), "Code assembled", Toast.LENGTH_SHORT).show() + } } override fun onCreateOptionsMenu(menu: Menu?): Boolean { diff --git a/app/src/main/kotlin/android/emu6502/instructions/ADC.kt b/app/src/main/kotlin/android/emu6502/instructions/ADC.kt deleted file mode 100644 index 18ef3d1..0000000 --- a/app/src/main/kotlin/android/emu6502/instructions/ADC.kt +++ /dev/null @@ -1,9 +0,0 @@ -package android.emu6502.instructions - -import java.util.* -import kotlin.reflect.KMemberFunction0 - -/** ADd with Carry */ -class ADC(instructionList: HashMap>) - : BaseInstruction(Instruction.ADC, instructionList) { -} \ No newline at end of file diff --git a/app/src/main/kotlin/android/emu6502/instructions/AND.kt b/app/src/main/kotlin/android/emu6502/instructions/AND.kt deleted file mode 100644 index 0cf8f59..0000000 --- a/app/src/main/kotlin/android/emu6502/instructions/AND.kt +++ /dev/null @@ -1,9 +0,0 @@ -package android.emu6502.instructions - -import java.util.* -import kotlin.reflect.KMemberFunction0 - -/** bitwise AND with accumulator */ -class AND(instructionList: HashMap>) - : BaseInstruction(Instruction.AND, instructionList) { -} \ No newline at end of file diff --git a/app/src/main/kotlin/android/emu6502/instructions/ASL.kt b/app/src/main/kotlin/android/emu6502/instructions/ASL.kt deleted file mode 100644 index 832ac25..0000000 --- a/app/src/main/kotlin/android/emu6502/instructions/ASL.kt +++ /dev/null @@ -1,9 +0,0 @@ -package android.emu6502.instructions - -import java.util.* -import kotlin.reflect.KMemberFunction0 - -/** Arithmetic Shift Left */ -class ASL(instructionList: HashMap>) - : BaseInstruction(Instruction.ASL, instructionList) { -} diff --git a/app/src/main/kotlin/android/emu6502/instructions/BaseInstruction.kt b/app/src/main/kotlin/android/emu6502/instructions/BaseInstruction.kt index 0f21610..54476ab 100644 --- a/app/src/main/kotlin/android/emu6502/instructions/BaseInstruction.kt +++ b/app/src/main/kotlin/android/emu6502/instructions/BaseInstruction.kt @@ -3,7 +3,7 @@ package android.emu6502.instructions import java.util.HashMap open class BaseInstruction(private val instruction: Instruction, - private val instructionList: HashMap>) { + private val instructionList: HashMap) { init { val opcodes: IntArray = Opcodes.MAP[instruction] as IntArray @@ -12,44 +12,44 @@ open class BaseInstruction(private val instruction: Instruction, opcodes.forEachIndexed { i, opcode -> if (opcode != 0xff) { - instructionList.put(opcodes[i], methods[i]) + instructionList.put(opcodes[i], InstructionTarget(this, methods[i])) } } } - fun immediate() { + open fun immediate() { } - fun zeroPage() { + open fun zeroPage() { } - fun zeroPageX() { + open fun zeroPageX() { } - fun zeroPageY() { + open fun zeroPageY() { } - fun absolute() { + open fun absolute() { } - fun absoluteX() { + open fun absoluteX() { } - fun absoluteY() { + open fun absoluteY() { } - fun indirect() { + open fun indirect() { } - fun indirectX() { + open fun indirectX() { } - fun indirectY() { + open fun indirectY() { } - fun single() { + open fun single() { } - fun branch() { + open fun branch() { } } diff --git a/app/src/main/kotlin/android/emu6502/instructions/InstructionTarget.kt b/app/src/main/kotlin/android/emu6502/instructions/InstructionTarget.kt new file mode 100644 index 0000000..27fb54e --- /dev/null +++ b/app/src/main/kotlin/android/emu6502/instructions/InstructionTarget.kt @@ -0,0 +1,7 @@ +package android.emu6502.instructions + +import kotlin.reflect.KMemberFunction0 + +class InstructionTarget(val operation: BaseInstruction, + val method: KMemberFunction0) { +} diff --git a/app/src/main/kotlin/android/emu6502/instructions/LDX.kt b/app/src/main/kotlin/android/emu6502/instructions/LDX.kt deleted file mode 100644 index 68e2657..0000000 --- a/app/src/main/kotlin/android/emu6502/instructions/LDX.kt +++ /dev/null @@ -1,9 +0,0 @@ -package android.emu6502.instructions - -import java.util.* -import kotlin.reflect.KMemberFunction0 - -/** LoaD X register */ -class LDX(instructionList: HashMap>) - : BaseInstruction(Instruction.LDX, instructionList) { -} diff --git a/app/src/main/kotlin/android/emu6502/instructions/ORA.kt b/app/src/main/kotlin/android/emu6502/instructions/ORA.kt deleted file mode 100644 index 8f18be5..0000000 --- a/app/src/main/kotlin/android/emu6502/instructions/ORA.kt +++ /dev/null @@ -1,8 +0,0 @@ -package android.emu6502.instructions - -import java.util.HashMap - -/** bitwise OR with Accumulator */ -class ORA(instructionList: HashMap>) - : BaseInstruction(Instruction.ORA, instructionList) { -} \ No newline at end of file diff --git a/app/src/main/kotlin/android/emu6502/instructions/STX.kt b/app/src/main/kotlin/android/emu6502/instructions/STX.kt deleted file mode 100644 index 33e18e6..0000000 --- a/app/src/main/kotlin/android/emu6502/instructions/STX.kt +++ /dev/null @@ -1,10 +0,0 @@ -package android.emu6502.instructions - - -import java.util.* -import kotlin.reflect.KMemberFunction0 - -/** STore X register */ -class STX(instructionList: HashMap>) -: BaseInstruction(Instruction.STX, instructionList) { -} diff --git a/app/src/main/kotlin/android/emu6502/instructions/impl/ADC.kt b/app/src/main/kotlin/android/emu6502/instructions/impl/ADC.kt new file mode 100644 index 0000000..f5c3759 --- /dev/null +++ b/app/src/main/kotlin/android/emu6502/instructions/impl/ADC.kt @@ -0,0 +1,10 @@ +package android.emu6502.instructions.impl + +import android.emu6502.CPU +import android.emu6502.instructions.BaseInstruction +import android.emu6502.instructions.Instruction + +/** ADd with Carry */ +class ADC(cpu: CPU) + : BaseInstruction(Instruction.ADC, cpu.instructionList) { +} \ No newline at end of file diff --git a/app/src/main/kotlin/android/emu6502/instructions/impl/AND.kt b/app/src/main/kotlin/android/emu6502/instructions/impl/AND.kt new file mode 100644 index 0000000..a180c90 --- /dev/null +++ b/app/src/main/kotlin/android/emu6502/instructions/impl/AND.kt @@ -0,0 +1,10 @@ +package android.emu6502.instructions.impl + +import android.emu6502.CPU +import android.emu6502.instructions.BaseInstruction +import android.emu6502.instructions.Instruction + +/** bitwise AND with accumulator */ +class AND(cpu: CPU) + : BaseInstruction(Instruction.AND, cpu.instructionList) { +} \ No newline at end of file diff --git a/app/src/main/kotlin/android/emu6502/instructions/impl/ASL.kt b/app/src/main/kotlin/android/emu6502/instructions/impl/ASL.kt new file mode 100644 index 0000000..65c2318 --- /dev/null +++ b/app/src/main/kotlin/android/emu6502/instructions/impl/ASL.kt @@ -0,0 +1,10 @@ +package android.emu6502.instructions.impl + +import android.emu6502.CPU +import android.emu6502.instructions.BaseInstruction +import android.emu6502.instructions.Instruction + +/** Arithmetic Shift Left */ +class ASL(cpu: CPU) + : BaseInstruction(Instruction.ASL, cpu.instructionList) { +} diff --git a/app/src/main/kotlin/android/emu6502/instructions/impl/BIT.kt b/app/src/main/kotlin/android/emu6502/instructions/impl/BIT.kt new file mode 100644 index 0000000..3ab8e39 --- /dev/null +++ b/app/src/main/kotlin/android/emu6502/instructions/impl/BIT.kt @@ -0,0 +1,10 @@ +package android.emu6502.instructions.impl + +import android.emu6502.CPU +import android.emu6502.instructions.BaseInstruction +import android.emu6502.instructions.Instruction + +/** test BITs */ +class BIT(cpu: CPU) + : BaseInstruction(Instruction.BIT, cpu.instructionList) { +} diff --git a/app/src/main/kotlin/android/emu6502/instructions/impl/LDA.kt b/app/src/main/kotlin/android/emu6502/instructions/impl/LDA.kt new file mode 100644 index 0000000..9421d4b --- /dev/null +++ b/app/src/main/kotlin/android/emu6502/instructions/impl/LDA.kt @@ -0,0 +1,15 @@ +package android.emu6502.instructions.impl + +import android.emu6502.CPU +import android.emu6502.instructions.BaseInstruction +import android.emu6502.instructions.Instruction + +/** LoaD Accumulator */ +class LDA(private val cpu: CPU) + : BaseInstruction(Instruction.LDA, cpu.instructionList) { + + override fun immediate() { + cpu.A = cpu.popByte() + cpu.setSZFlagsForRegA() + } +} diff --git a/app/src/main/kotlin/android/emu6502/instructions/impl/LDX.kt b/app/src/main/kotlin/android/emu6502/instructions/impl/LDX.kt new file mode 100644 index 0000000..17d56ea --- /dev/null +++ b/app/src/main/kotlin/android/emu6502/instructions/impl/LDX.kt @@ -0,0 +1,9 @@ +package android.emu6502.instructions.impl + +import android.emu6502.CPU +import android.emu6502.instructions.BaseInstruction +import android.emu6502.instructions.Instruction + +/** LoaD X register */ +class LDX(cpu: CPU) : BaseInstruction(Instruction.LDX, cpu.instructionList) { +} diff --git a/app/src/main/kotlin/android/emu6502/instructions/impl/LDY.kt b/app/src/main/kotlin/android/emu6502/instructions/impl/LDY.kt new file mode 100644 index 0000000..9bd7dd3 --- /dev/null +++ b/app/src/main/kotlin/android/emu6502/instructions/impl/LDY.kt @@ -0,0 +1,10 @@ +package android.emu6502.instructions.impl + +import android.emu6502.CPU +import android.emu6502.instructions.BaseInstruction +import android.emu6502.instructions.Instruction + +/** LoaD Y register */ +class LDY(cpu: CPU) +: BaseInstruction(Instruction.LDY, cpu.instructionList) { +} diff --git a/app/src/main/kotlin/android/emu6502/instructions/impl/ORA.kt b/app/src/main/kotlin/android/emu6502/instructions/impl/ORA.kt new file mode 100644 index 0000000..525be0c --- /dev/null +++ b/app/src/main/kotlin/android/emu6502/instructions/impl/ORA.kt @@ -0,0 +1,10 @@ +package android.emu6502.instructions.impl + +import android.emu6502.CPU +import android.emu6502.instructions.BaseInstruction +import android.emu6502.instructions.Instruction + +/** bitwise OR with Accumulator */ +class ORA(cpu: CPU) + : BaseInstruction(Instruction.ORA, cpu.instructionList) { +} \ No newline at end of file diff --git a/app/src/main/kotlin/android/emu6502/instructions/impl/STA.kt b/app/src/main/kotlin/android/emu6502/instructions/impl/STA.kt new file mode 100644 index 0000000..2d34aea --- /dev/null +++ b/app/src/main/kotlin/android/emu6502/instructions/impl/STA.kt @@ -0,0 +1,16 @@ +package android.emu6502.instructions.impl + +import android.emu6502.CPU +import android.emu6502.Memory +import android.emu6502.instructions.BaseInstruction +import android.emu6502.instructions.Instruction + +/** STore Accumulator */ +class STA(private val memory: Memory, private val cpu: CPU) + : BaseInstruction(Instruction.STA, cpu.instructionList) { + + override fun absolute() { + memory.storeByte(cpu.popWord(), cpu.A); + } +} + diff --git a/app/src/main/kotlin/android/emu6502/instructions/impl/STX.kt b/app/src/main/kotlin/android/emu6502/instructions/impl/STX.kt new file mode 100644 index 0000000..1cb3df6 --- /dev/null +++ b/app/src/main/kotlin/android/emu6502/instructions/impl/STX.kt @@ -0,0 +1,10 @@ +package android.emu6502.instructions.impl + +import android.emu6502.CPU +import android.emu6502.instructions.BaseInstruction +import android.emu6502.instructions.Instruction + +/** STore X register */ +class STX(cpu: CPU) +: BaseInstruction(Instruction.STX, cpu.instructionList) { +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 1f9d2e4..656bb30 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -39,7 +39,7 @@ android:id="@+id/txtInstructions" android:layout_width="match_parent" android:layout_height="match_parent" - android:text="LDA #$80\nSTA $01\nADC $01" + android:text="LDA #$01\nSTA $0200\nLDA #$05\nSTA $0201\nLDA #$08\nSTA $0202" android:fontFamily="monospace" android:textSize="14sp" android:gravity="top" /> @@ -145,7 +145,7 @@