Got 60 insns further in EKBA
This commit is contained in:
@@ -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
|
||||||
|
@@ -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()
|
||||||
|
Reference in New Issue
Block a user