Got 60 insns further in EKBA

This commit is contained in:
2023-09-19 22:44:02 +02:00
parent 20e57e3a19
commit aee3672252
2 changed files with 45 additions and 8 deletions

View File

@@ -6,6 +6,7 @@ import com.thequux.mcpdp.util.Disassembler
import com.thequux.mcpdp.util.ProgrammerError import com.thequux.mcpdp.util.ProgrammerError
import org.slf4j.Logger import org.slf4j.Logger
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import java.lang.StringBuilder
import kotlin.math.log import kotlin.math.log
/// The main CPU /// The main CPU
@@ -202,19 +203,19 @@ class CPU(val mbus: MemBus) {
} }
private fun op_storw(spec: UInt, value: UShort, dspace: Boolean = true) { private fun op_storw(spec: UInt, value: UShort, dspace: Boolean = true) {
val addr = (spec and 0xFFFFu).toUShort() val addr = (spec and 0xFFFFu)
if (is_paddr_reg(spec)) { if (is_paddr_reg(spec)) {
// register // register
registers[addr.toInt()] = value registers[addr.toInt()] = value
} else { } else {
core.setw(addr, value, dspace) core.setw(addr.toUShort(), value, dspace)
} }
} }
private fun op_loadw(spec: UInt, dspace: Boolean=true): UShort { private fun op_loadw(spec: UInt, dspace: Boolean=true): UShort {
val addr = (spec and 0xFFFFu).toUShort() val addr = (spec and 0xFFFFu).toUShort()
return if (is_paddr_reg(spec)) { return if (is_paddr_reg(spec)) {
(registers[addr.toInt()] and 0xFFu) registers[addr.toInt()]
} else { } else {
core.getw(addr, dspace) core.getw(addr, dspace)
} }
@@ -286,6 +287,7 @@ class CPU(val mbus: MemBus) {
if (opcode bit 1) V = flag if (opcode bit 1) V = flag
if (opcode bit 2) Z = flag if (opcode bit 2) Z = flag
if (opcode bit 3) N = flag if (opcode bit 3) N = flag
// debugFlags()
} // Scc/Ccc } // Scc/Ccc
in 0xC0..0xFF -> { in 0xC0..0xFF -> {
val dst = opc_dst(opcode) val dst = opc_dst(opcode)
@@ -335,10 +337,15 @@ class CPU(val mbus: MemBus) {
} // COM } // COM
2 -> { // INC 2 -> { // INC
val dst = opc_dst(opcode) val dst = opc_dst(opcode)
val res = op_loadw(dst).inc().also { op_storw(dst, it) } val src = op_loadw(dst)
val res = src.inc()
op_storw(dst, res)
N = res bit 15 N = res bit 15
Z = res == 0.toUShort() Z = res == 0.toUShort()
V = res == 0x8000.toUShort() V = res == 0x8000.toUShort()
debugFlags()
logger.debug("RV: ${dst.toString(16)} RES: ${res.toString(16)}, SRC: ${src.toString(16)}")
} // INC } // INC
3 -> { // DEC 3 -> { // DEC
val dst = opc_dst(opcode) val dst = opc_dst(opcode)
@@ -396,6 +403,8 @@ class CPU(val mbus: MemBus) {
N = res bit 15 N = res bit 15
Z = res == 0.toUShort() Z = res == 0.toUShort()
V = N xor C V = N xor C
// debugFlags()
// logger.debug("RV: ${dst.toString(16)} RES: ${res.toString(16)}/${op_loadw(dst).toString(16)}, SRC: ${src.toString(16)}, C: ${src bit 15}")
} // ROR } // ROR
1 -> { 1 -> {
val dst = opc_dst(opcode) val dst = opc_dst(opcode)
@@ -406,6 +415,8 @@ class CPU(val mbus: MemBus) {
N = res bit 15 N = res bit 15
Z = res == 0.toUShort() Z = res == 0.toUShort()
V = N xor C V = N xor C
// debugFlags()
// logger.debug("RES: ${res.toString(16)}, SRC: ${src.toString(16)}, C: ${src bit 15}")
} // ROL } // ROL
2 -> { // ASR 2 -> { // ASR
val dst = opc_dst(opcode) val dst = opc_dst(opcode)
@@ -438,7 +449,7 @@ class CPU(val mbus: MemBus) {
1 -> { throw InvalidOpcodeException() } // MFPI // TODO 1 -> { throw InvalidOpcodeException() } // MFPI // TODO
2 -> { throw InvalidOpcodeException() } // MTPI // TODO 2 -> { throw InvalidOpcodeException() } // MTPI // TODO
3 -> { 3 -> {
op_storw(opc_dst(opcode), if (N) 0.toUShort() else (-1).toUShort()) op_storw(opc_dst(opcode), if (N) (-1).toUShort() else 0.toUShort())
Z = !N Z = !N
V = false V = false
} // SXT } // SXT
@@ -794,6 +805,17 @@ class CPU(val mbus: MemBus) {
} }
} }
private fun debugFlags() {
if (logger.isDebugEnabled) {
val res = StringBuilder()
if (N) res.append('N')
if (Z) res.append('Z')
if (C) res.append('C')
if (V) res.append('V')
logger.debug("Flags: $res")
}
}
fun step() { fun step() {
try { try {
if (runState == RunState.HALTED) return if (runState == RunState.HALTED) return

View File

@@ -21,6 +21,20 @@ class Disassembler(val core: VAddressSpace) {
private fun fmt(opcode: String, vararg args: String): String { private fun fmt(opcode: String, vararg args: String): String {
val res = StringBuilder() val res = StringBuilder()
var tpc = opc
var bytes = 0
while (tpc != vpc) {
bytes += 2
res.append(core.getw(tpc, dspace = false).toString(16).padStart(4, '0'))
res.append('.')
tpc = tpc.inc().inc()
}
while (bytes < 6) {
res.append("----.")
bytes += 2
}
res.append('\t')
res.append(opcode.uppercase()) res.append(opcode.uppercase())
for ((index, arg) in args.withIndex()) { for ((index, arg) in args.withIndex()) {
@@ -72,7 +86,7 @@ class Disassembler(val core: VAddressSpace) {
private fun br_rel(opc: String): String { private fun br_rel(opc: String): String {
val rel = (opcode and 0xFF) - (opcode and 0x80 shl 1) val rel = (opcode and 0xFF) - (opcode and 0x80 shl 1)
val dst = (vpc.toInt() + rel).toUShort() val dst = (vpc.toInt() + rel.shl(1)).toUShort()
return fmt(opc, dst.toString(8)) return fmt(opc, dst.toString(8))
} }
@@ -83,7 +97,8 @@ class Disassembler(val core: VAddressSpace) {
} }
fun dasm_at(loc: UShort): String { fun dasm_at(loc: UShort): String {
var vpc = loc vpc = loc
opc = loc
opcode = core.getw(vpc, dspace = false).toInt() opcode = core.getw(vpc, dspace = false).toInt()
vpc = (vpc + 2u).toUShort() vpc = (vpc + 2u).toUShort()
@@ -108,7 +123,7 @@ class Disassembler(val core: VAddressSpace) {
if (opcode bit 1) items.add("SEZ") if (opcode bit 1) items.add("SEZ")
if (opcode bit 2) items.add("SEV") if (opcode bit 2) items.add("SEV")
if (opcode bit 3) items.add("SEN") if (opcode bit 3) items.add("SEN")
items.joinToString(" ") fmt(items.joinToString(" "))
} // Scc/Ccc } // Scc/Ccc
in 0xC0..0xFF -> fmt("SWAB", dst()) // SWAB in 0xC0..0xFF -> fmt("SWAB", dst()) // SWAB
else -> throw InvalidOpcodeException() else -> throw InvalidOpcodeException()