Successfully runs EKBA

This commit is contained in:
2023-09-20 09:25:49 +02:00
parent ac3496ed4f
commit 7556dca4f6
3 changed files with 28 additions and 6 deletions

View File

@@ -0,0 +1,5 @@
package com.thequux.mcpdp.ext.bit
fun UShort.toOctal(): String = this.toString(8).padStart(6,'0')
fun UByte.toOctal(): String = this.toString(8).padStart(3, '0')
fun UInt.toOctal(): String = this.toString(8).padStart(11, '0')

View File

@@ -8,6 +8,7 @@ import com.thequux.mcpdp.ext.bit.bic
import com.thequux.mcpdp.ext.bit.bis import com.thequux.mcpdp.ext.bit.bis
import com.thequux.mcpdp.ext.bit.bit import com.thequux.mcpdp.ext.bit.bit
import com.thequux.mcpdp.ext.bit.maskSet import com.thequux.mcpdp.ext.bit.maskSet
import org.slf4j.LoggerFactory
import java.io.InputStream import java.io.InputStream
import java.io.OutputStream import java.io.OutputStream
import java.io.InterruptedIOException import java.io.InterruptedIOException
@@ -18,6 +19,7 @@ import kotlin.concurrent.thread
class DL11(private var istr: InputStream, private val ostr: OutputStream, val reg_base: UInt, val vector: UShort, val unibus: Unibus): PAddressSpace, Peripheral { class DL11(private var istr: InputStream, private val ostr: OutputStream, val reg_base: UInt, val vector: UShort, val unibus: Unibus): PAddressSpace, Peripheral {
private val logger = LoggerFactory.getLogger(this.javaClass)
private var reader: Thread? = null private var reader: Thread? = null
private var rcsr: UShort = 0x0u private var rcsr: UShort = 0x0u
set(value) { set(value) {
@@ -78,9 +80,9 @@ class DL11(private var istr: InputStream, private val ostr: OutputStream, val re
} }
override fun setb(addr: UInt, value: UByte) { override fun setb(addr: UInt, value: UByte) {
when (addr.toInt() and 7) {
0 -> setw(0u, value.toUShort()) // high bits are unaffected
if (!(addr bit 0)) {
setw(addr, value.toUShort())
} }
} }

View File

@@ -4,8 +4,10 @@ import com.thequux.mcpdp.core.BusTimeoutError
import com.thequux.mcpdp.core.MemoryError import com.thequux.mcpdp.core.MemoryError
import com.thequux.mcpdp.core.MemoryErrorType import com.thequux.mcpdp.core.MemoryErrorType
import com.thequux.mcpdp.core.PAddressSpace import com.thequux.mcpdp.core.PAddressSpace
import com.thequux.mcpdp.ext.bit.toOctal
import com.thequux.mcpdp.util.ConfigurationError import com.thequux.mcpdp.util.ConfigurationError
import com.thequux.mcpdp.util.ProgrammerError import com.thequux.mcpdp.util.ProgrammerError
import org.slf4j.LoggerFactory
import java.lang.Integer.min import java.lang.Integer.min
import java.util.Collections import java.util.Collections
import java.util.LinkedList import java.util.LinkedList
@@ -72,15 +74,28 @@ class Unibus: PAddressSpace, Subregion(12, 6) {
/// The view of the unibus from a device /// The view of the unibus from a device
var deviceView: PAddressSpace = this var deviceView: PAddressSpace = this
internal set internal set
private val logger = LoggerFactory.getLogger(this.javaClass)
private val queue: Array<MutableList<InterruptSource>> = Array(8) { Vector(4) } private val queue: Array<MutableList<InterruptSource>> = Array(8) { Vector(4) }
override fun map(address: UInt): PAddressSpace = override fun map(address: UInt): PAddressSpace =
super.map(address) ?: throw BusTimeoutError(address) super.map(address) ?: throw BusTimeoutError(address)
override fun getw(addr: UInt): UShort = map(addr).getw(addr) override fun getw(addr: UInt): UShort {
override fun getb(addr: UInt): UByte = map(addr).getb(addr) if (logger.isTraceEnabled) logger.trace("DATIW ${addr.toOctal()}")
override fun setw(addr: UInt, value: UShort) = map(addr).setw(addr, value) return map(addr).getw(addr)
override fun setb(addr: UInt, value: UByte) = map(addr).setb(addr, value) }
override fun getb(addr: UInt): UByte {
if (logger.isTraceEnabled) logger.trace("DATIB ${addr.toOctal()}")
return map(addr).getb(addr)
}
override fun setw(addr: UInt, value: UShort) {
if (logger.isTraceEnabled) logger.trace("DATOW ${addr.toOctal()} <- ${value.toOctal()}")
map(addr).setw(addr, value)
}
override fun setb(addr: UInt, value: UByte) {
if (logger.isTraceEnabled) logger.trace("DATOB ${addr.toOctal()} <- ${value.toOctal()}")
map(addr).setb(addr, value)
}
/// Request that the processor service an interrupt. When the interrupt is handled, calls getVector() on the device /// Request that the processor service an interrupt. When the interrupt is handled, calls getVector() on the device
/// to fetch the currently desired interrupt vector /// to fetch the currently desired interrupt vector