Added rest of the CPU registers and logging
This commit is contained in:
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@@ -20,7 +20,7 @@
|
||||
<component name="FrameworkDetectionExcludesConfiguration">
|
||||
<file type="web" url="file://$PROJECT_DIR$" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="19" project-jdk-type="JavaSDK">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_19" default="true" project-jdk-name="19" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
124
.idea/uiDesigner.xml
generated
Normal file
124
.idea/uiDesigner.xml
generated
Normal file
@@ -0,0 +1,124 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Palette2">
|
||||
<group name="Swing">
|
||||
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
|
||||
</item>
|
||||
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
|
||||
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
|
||||
<initial-values>
|
||||
<property name="text" value="Button" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="RadioButton" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="CheckBox" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="Label" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
|
||||
<preferred-size width="-1" height="20" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
|
||||
</item>
|
||||
</group>
|
||||
</component>
|
||||
</project>
|
2
.idea/vcs.xml
generated
2
.idea/vcs.xml
generated
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
@@ -29,7 +29,7 @@ tasks.test {
|
||||
}
|
||||
|
||||
kotlin {
|
||||
jvmToolchain(8)
|
||||
jvmToolchain(19)
|
||||
}
|
||||
|
||||
application {
|
||||
|
@@ -9,4 +9,4 @@ plugins {
|
||||
id("org.gradle.toolchains.foojay-resolver-convention") version "0.5.0"
|
||||
}
|
||||
|
||||
rootProject.name = "mc-pdp"
|
||||
rootProject.name = "jdp11"
|
@@ -4,18 +4,22 @@ import com.thequux.mcpdp.core.CPU
|
||||
import com.thequux.mcpdp.core.PAddressSpace
|
||||
import com.thequux.mcpdp.ext.bit.bit
|
||||
import com.thequux.mcpdp.ext.bit.shl
|
||||
import org.slf4j.LoggerFactory
|
||||
import java.io.File
|
||||
import kotlin.math.log
|
||||
|
||||
/// Loads an RT-11 object file into memory
|
||||
fun CPU.loadAbs(infile: File) {
|
||||
|
||||
val logger = LoggerFactory.getLogger("AbsLoader")
|
||||
|
||||
val core = this.core.modeSpace
|
||||
val inStream = infile.inputStream()
|
||||
|
||||
var buf = ByteArray(6)
|
||||
var offset = 0
|
||||
var addr: UShort = 0u
|
||||
var len: Int = 0
|
||||
var cksum: Int = 0
|
||||
var addr: UShort
|
||||
var len: Int
|
||||
var cksum: Int
|
||||
|
||||
var pos = 0
|
||||
|
||||
@@ -53,20 +57,21 @@ fun CPU.loadAbs(infile: File) {
|
||||
if (buf.size < len+1) {
|
||||
buf = ByteArray(len+1)
|
||||
}
|
||||
System.err.println("Reading ${len+1} bytes into ${buf.size}")
|
||||
inStream.read(buf, 0, len+1)
|
||||
for (i in 0..len) {
|
||||
cksum += buf[i]
|
||||
}
|
||||
cksum = cksum and 0xFF
|
||||
// TODO: validate checksum == 0
|
||||
println("Loading 0x${len.toString(16)} bytes at 0x${addr.toString(16)}")
|
||||
if (cksum != 0) {
|
||||
throw Exception("Incorrect checksum: 0x${cksum.toString(16)}")
|
||||
}
|
||||
logger.debug("Loading 0x${len.toString(16)} bytes at 0x${addr.toString(16)}")
|
||||
if (len == 0) {
|
||||
// end of file
|
||||
println("Tape ended at ${pos+len+7}")
|
||||
logger.debug("Tape ended at ${pos+len+7}")
|
||||
if (!(addr bit 0)){
|
||||
this.pc = addr
|
||||
println("Ready to run")
|
||||
logger.debug("Ready to run at ${addr.toString(8)}")
|
||||
}
|
||||
return
|
||||
} else {
|
@@ -3,6 +3,8 @@ package com.thequux.mcpdp.core
|
||||
import com.thequux.mcpdp.ext.bit.*
|
||||
import com.thequux.mcpdp.peripheral.MemBus
|
||||
import com.thequux.mcpdp.util.ProgrammerError
|
||||
import org.slf4j.Logger
|
||||
import org.slf4j.LoggerFactory
|
||||
|
||||
/// The main CPU
|
||||
///
|
||||
@@ -12,6 +14,8 @@ import com.thequux.mcpdp.util.ProgrammerError
|
||||
/// xxxx: rest
|
||||
@OptIn(ExperimentalUnsignedTypes::class)
|
||||
class CPU(val mbus: MemBus) {
|
||||
|
||||
val logger: Logger = LoggerFactory.getLogger(this.javaClass)
|
||||
private val flagStr: String
|
||||
get() {
|
||||
val chars = CharArray(4) { '-' }
|
||||
@@ -130,7 +134,7 @@ class CPU(val mbus: MemBus) {
|
||||
val mode = operand shr 3
|
||||
val reg = operand and 0x7
|
||||
val increment = if (byte_mode && reg != 7) 1U else 2U
|
||||
return when (mode and 0x7) {
|
||||
return 0x80_FFFFu and when (mode and 0x7) {
|
||||
0 -> reg.toUInt() bis PADDR_REG_BIT
|
||||
1 -> registers[reg].toUInt()
|
||||
2 -> {
|
||||
@@ -227,8 +231,11 @@ class CPU(val mbus: MemBus) {
|
||||
when (opcode and 0xF000) {
|
||||
0x0, 0x8000 -> when (opcode and 0xFF00) {
|
||||
0x0000 -> when (opcode) {
|
||||
0x0000 -> runState = RunState.HALTED
|
||||
0x0001 -> runState = RunState.WAIT_FOR_INTERRUPT
|
||||
0x0000 -> {
|
||||
if (cur_mode == 0)
|
||||
runState = RunState.HALTED
|
||||
} // HALT
|
||||
0x0001 -> runState = RunState.WAIT_FOR_INTERRUPT // WAIT
|
||||
0x0002 -> { // RTI
|
||||
pc = stack_pop()
|
||||
psw = stack_pop() // TODO: check privilege on mode; check psw[11]
|
||||
@@ -777,10 +784,10 @@ class CPU(val mbus: MemBus) {
|
||||
|
||||
// TODO: handle PIRQ
|
||||
for (i in 7 downTo (psw_priority + 1)) {
|
||||
if (pirq bit 8+i) {
|
||||
trap(0xA0u)
|
||||
break
|
||||
}
|
||||
if (pirq bit 8+i) {
|
||||
trap(0xA0u)
|
||||
break
|
||||
}
|
||||
val source = mbus.unibus.checkInterrupt(i)
|
||||
if (source != null) {
|
||||
// we might have been waiting for an interrupt
|
||||
@@ -796,6 +803,11 @@ class CPU(val mbus: MemBus) {
|
||||
// TODO: handle T bit
|
||||
} catch (error: MemoryError) {
|
||||
// TODO: fill in memory manager fields
|
||||
cpu_err = when (error) {
|
||||
is OddAddressError -> cpu_err or 0x40u
|
||||
is NonExistentMemoryError -> cpu_err or 0x20u
|
||||
is BusTimeoutError -> cpu_err or 0x10u
|
||||
}
|
||||
trap(4u)
|
||||
} catch (_: InvalidOpcodeException) {
|
||||
trap(10u)
|
||||
@@ -820,23 +832,22 @@ class CPU(val mbus: MemBus) {
|
||||
|
||||
private inner class Registers: PAddressSpace {
|
||||
override fun getw(addr: UInt): UShort = when (addr) {
|
||||
0x3FFF0u -> (mbus.size shr 6).toUShort()
|
||||
0x3FFF2u -> 0u // upper size
|
||||
0x3FFF4u -> 0x1170u // system ID
|
||||
0x3FFF6u -> cpu_err
|
||||
0x3FFFAu -> pirq // PIRQ
|
||||
0x3FFFCu -> 0x0u // stack limit
|
||||
0x3FFF0u -> (mbus.size shr 6).toUShort()
|
||||
0x3FFF2u -> 0u // upper size
|
||||
0x3FFF4u -> 0x1170u // system ID
|
||||
0x3FFF6u -> cpu_err
|
||||
0x3FFFAu -> pirq // PIRQ
|
||||
0x3FFFCu -> 0x0u // stack limit
|
||||
0x3FFFEu -> psw
|
||||
|
||||
else -> throw BusTimeoutError(addr)
|
||||
}
|
||||
|
||||
override fun setw(addr: UInt, value: UShort) = when (addr) {
|
||||
0x3_FFF0u , 0x3_FFF2u , 0x3_FFF4u, 0x3_FFF8u -> {} // read-only registers
|
||||
0x3_FFF6u -> cpu_err = value
|
||||
0x3_FFFAu -> pirq = value
|
||||
0x3_FFFCu -> {} // stack limit
|
||||
0x3_FFFEu -> psw = value
|
||||
0x3_FFF0u , 0x3_FFF2u , 0x3_FFF4u, 0x3_FFF8u -> {} // read-only registers
|
||||
0x3_FFF6u -> cpu_err = value
|
||||
0x3_FFFAu -> pirq = value
|
||||
0x3_FFFCu -> {} // stack limit
|
||||
0x3_FFFEu -> psw = value or (cur_mode.toUShort() shl 14) // writing to PSW can only increase current mode
|
||||
else -> {
|
||||
println("Bus error at ${addr.toString(16)}: ${value.toString(16)}")
|
||||
throw BusTimeoutError(addr)
|
||||
|
@@ -2,12 +2,10 @@
|
||||
|
||||
package com.thequux.mcpdp.tools
|
||||
|
||||
import com.sun.org.apache.xml.internal.security.utils.UnsyncBufferedOutputStream
|
||||
import picocli.CommandLine
|
||||
import picocli.CommandLine.Option
|
||||
import picocli.CommandLine.Parameters
|
||||
import java.io.File
|
||||
import java.util.Hashtable
|
||||
import java.util.concurrent.Callable
|
||||
import java.util.function.Consumer
|
||||
|
||||
@@ -17,7 +15,6 @@ class Link11: Callable<Int> {
|
||||
|
||||
@Parameters()
|
||||
lateinit var objects: Array<File>
|
||||
|
||||
@Option(names = ["-o", "--out"], required = true, description = ["Output file"])
|
||||
lateinit var outFile: File
|
||||
|
||||
|
Reference in New Issue
Block a user