Fixed the components.xsl for PDPjs machines, and added more instructions, resource links, etc, for the PDP-11 demo machines
This commit is contained in:
parent
8e2b50afe1
commit
21d91cbcfa
35 changed files with 685 additions and 284 deletions
|
|
@ -103,6 +103,7 @@ if (NODE) {
|
|||
* component-specific property:
|
||||
*
|
||||
* autoMount: one or more JSON-encoded objects, each containing 'name' and 'path' properties
|
||||
*
|
||||
* sortBy: "name" to sort disks by name, "path" to sort by path, or "none" to leave as-is (default is "name")
|
||||
*
|
||||
* Regarding early diskette drives: the IBM PC Model 5150 originally shipped with single-sided drives,
|
||||
|
|
|
|||
|
|
@ -1610,8 +1610,20 @@ if (DEBUGGER) {
|
|||
*/
|
||||
DebuggerPDP11.prototype.checkInstruction = function(addr, nState)
|
||||
{
|
||||
var opCode = -1
|
||||
var cpu = this.cpu;
|
||||
|
||||
/*
|
||||
* Purely as a convenience, we're going to skip over a HALT opcode if the machine is just starting,
|
||||
* and pretend that the NEXT instruction is the first to be executed.
|
||||
*/
|
||||
if (nState == 0) {
|
||||
opCode = this.cpu.getWordDirect(addr);
|
||||
if (opCode == PDP11.OPCODE.HALT) {
|
||||
this.cpu.advancePC(2);
|
||||
}
|
||||
}
|
||||
|
||||
if (nState > 0) {
|
||||
if (this.nBreakIns && !--this.nBreakIns) {
|
||||
return true;
|
||||
|
|
@ -1629,7 +1641,7 @@ if (DEBUGGER) {
|
|||
*/
|
||||
if (nState >= 0 && this.aaOpcodeCounts.length) {
|
||||
this.cOpcodes++;
|
||||
var opCode = this.cpu.getWordDirect(addr);
|
||||
if (opCode < 0) opCode = this.cpu.getWordDirect(addr);
|
||||
if (opCode != null) {
|
||||
var dbgAddr = this.aOpcodeHistory[this.iOpcodeHistory];
|
||||
this.setAddr(dbgAddr, cpu.getPC());
|
||||
|
|
|
|||
|
|
@ -185,6 +185,12 @@ var PDP11 = {
|
|||
CMODE: 14
|
||||
}
|
||||
},
|
||||
/*
|
||||
* Assorted common opcodes
|
||||
*/
|
||||
OPCODE: {
|
||||
HALT: 0x0000
|
||||
},
|
||||
/*
|
||||
* Internal operation state flags
|
||||
*/
|
||||
|
|
@ -523,19 +529,26 @@ var PDP11 = {
|
|||
BUSY: 0x0800, // Busy (R/O)
|
||||
ERROR: 0x8000, // Error (R/O)
|
||||
CLEAR: 0x08C0, // bits cleared on INIT
|
||||
RMASK: 0xFFFE, // bits readable (TODO: All I know for sure is that bit 0 is NOT readable; see PC11.readPRS())
|
||||
WMASK: 0x0041 // bits writable
|
||||
RMASK: 0xFFFE, // bits readable (TODO: All I know for sure is that bit 0 is NOT readable; see readPRS())
|
||||
WMASK: 0x0041, // bits writable
|
||||
BAUD: 3600
|
||||
},
|
||||
PRB: {
|
||||
MASK: 0x00FF // Data
|
||||
}
|
||||
},
|
||||
PPS: {
|
||||
/*
|
||||
* TODO: Flesh this out if/when we add Paper Tape Punch support
|
||||
*/
|
||||
BAUD: 600
|
||||
},
|
||||
},
|
||||
DL11: { // Serial Line Interface (program compatible with the KL11 for control of console teleprinters)
|
||||
PRI: 4,
|
||||
RVEC: 0o60,
|
||||
XVEC: 0o64,
|
||||
RCSR: { // 177560
|
||||
RE: 0x0001, // Reader Enable (W/O) TODO: Determine if we really need to exclude this write-only bit from RMASK
|
||||
RE: 0x0001, // Reader Enable (W/O)
|
||||
DTR: 0x0002, // Data Terminal Ready (R/W)
|
||||
RTS: 0x0004, // Request To Send (R/W)
|
||||
STD: 0x0008, // Secondary Transmitted Data (R/W)
|
||||
|
|
@ -548,16 +561,16 @@ var PDP11 = {
|
|||
CTS: 0x2000, // Clear To Send (R/O)
|
||||
RI: 0x4000, // Ring Indicator (R/O)
|
||||
DSC: 0x8000, // Dataset Status Change (R/O)
|
||||
RMASK: 0xFFFF, // read mask
|
||||
WMASK: 0x006F // write mask
|
||||
RMASK: 0xFFFE, // bits readable (TODO: All I know for sure is that bit 0 is NOT readable; see readRCSR())
|
||||
WMASK: 0x006F, // bits writable
|
||||
BAUD: 9600
|
||||
},
|
||||
RBUF: { // 177562
|
||||
DATA: 0x00ff, // Received Data (R/O)
|
||||
PARITY: 0x1000, // Received Data Parity (R/O)
|
||||
FE: 0x2000, // Framing Error (R/O)
|
||||
OE: 0x4000, // Overrun Error (R/O)
|
||||
ERROR: 0x8000, // Error (R/O)
|
||||
DELAY: 1
|
||||
ERROR: 0x8000 // Error (R/O)
|
||||
},
|
||||
XCSR: { // 177564
|
||||
BREAK: 0x0001, // BREAK (R/W)
|
||||
|
|
@ -566,11 +579,10 @@ var PDP11 = {
|
|||
READY: 0x0080, // Transmitter Ready (R/O)
|
||||
RMASK: 0x00C5,
|
||||
WMASK: 0x0045,
|
||||
DELAY: 1
|
||||
BAUD: 9600
|
||||
},
|
||||
XBUF: { // 177566
|
||||
DATA: 0x00FF, // Transmitted Data (W/O) TODO: Determine why pdp11.js effectively defined this as 0x7F
|
||||
DELAY: 1
|
||||
DATA: 0x00FF // Transmitted Data (W/O) TODO: Determine why pdp11.js effectively defined this as 0x7F
|
||||
}
|
||||
},
|
||||
KW11: { // KW11-L Line Time Clock
|
||||
|
|
|
|||
|
|
@ -88,7 +88,6 @@ KeyboardPDP11.prototype.initBus = function(cmp, bus, cpu, dbg)
|
|||
this.cmp = cmp;
|
||||
this.cpu = cpu;
|
||||
this.dbg = dbg; // NOTE: The "dbg" property must be set for the message functions to work
|
||||
this.chipset = null; // /** @type {ChipSetPDP11} */ (cmp.getMachineComponent("ChipSet"));
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* @fileoverview Implements the PC11 High-Speed Paper Tape Reader/Punch
|
||||
* @fileoverview Implements the PDP-11 High-Speed Paper Tape Reader/Punch (eg, PC11)
|
||||
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
|
||||
* @copyright © Jeff Parsons 2012-2016
|
||||
*
|
||||
|
|
@ -41,6 +41,24 @@ if (NODE) {
|
|||
/**
|
||||
* PC11(parms)
|
||||
*
|
||||
* The PC11 component has the following component-specific (parms) properties:
|
||||
*
|
||||
* autoMount: a JSON-encoded object containing 'name' and 'path' properties, describing a
|
||||
* tape resource to automatically attach at startup (only the "attach" operation is supported
|
||||
* for autoMount; if you want to "load" a tape image directly into RAM at startup, you must
|
||||
* ask the RAM component to do that).
|
||||
*
|
||||
* baudReceive: the default number of bits/second that the device should receive data at;
|
||||
* 0 means use the device default (PDP11.PC11.PRS.BAUD)
|
||||
*
|
||||
* baudTransmit: the default number of bits/second that the device should transmit data at;
|
||||
* 0 means use the device default (PDP11.PC11.PPS.BAUD); currently ignored, since punch
|
||||
* support isn't implemented yet.
|
||||
*
|
||||
* NOTE: Since the XSL file defines the 'baud' properties as numbers, not strings, there's no need to
|
||||
* use parseInt(), and as an added benefit, we don't need to worry about whether a hex or decimal format
|
||||
* was used.
|
||||
*
|
||||
* @constructor
|
||||
* @extends Component
|
||||
* @param {Object} parms
|
||||
|
|
@ -55,6 +73,7 @@ function PC11(parms)
|
|||
*/
|
||||
this.configMount = parms['autoMount'] || null;
|
||||
this.cAutoMount = 0;
|
||||
this.nBaudReceive = parms['baudReceive'] || PDP11.PC11.PRS.BAUD;
|
||||
|
||||
this.prs = 0; // PRS register
|
||||
this.prb = 0; // PRB register
|
||||
|
|
@ -63,6 +82,7 @@ function PC11(parms)
|
|||
this.sTapeSource = PC11.SOURCE.NONE;
|
||||
this.nTapeTarget = PC11.TARGET.NONE;
|
||||
this.sTapeName = this.sTapePath = "";
|
||||
this.nLastPercent = -1; // ensure the first displayProgress() displays something
|
||||
|
||||
/*
|
||||
* Support for local tape images is currently limited to desktop browsers with FileReader support;
|
||||
|
|
@ -622,7 +642,7 @@ PC11.prototype.displayTape = function()
|
|||
PC11.prototype.displayProgress = function(nPercent)
|
||||
{
|
||||
nPercent |= 0;
|
||||
if (nPercent !== this.lastPercent) {
|
||||
if (nPercent !== this.nLastPercent) {
|
||||
var control = this.bindings[PC11.BINDING.READ_PROGRESS];
|
||||
if (control) {
|
||||
var aeControls = Component.getElementsByClass(control, PC11.CSSCLASS.PROGRESS_BAR);
|
||||
|
|
@ -631,7 +651,7 @@ PC11.prototype.displayProgress = function(nPercent)
|
|||
controlBar.style.width = nPercent + "%";
|
||||
}
|
||||
}
|
||||
this.lastPercent = nPercent;
|
||||
this.nLastPercent = nPercent;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -734,6 +754,25 @@ PC11.prototype.restore = function(data)
|
|||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* getBaudTimeout(nBaud)
|
||||
*
|
||||
* Based on the selected baud rate (nBaud), convert that rate into a millisecond delay.
|
||||
*
|
||||
* @this {PC11}
|
||||
* @param {number} nBaud
|
||||
* @return {number} (number of milliseconds per byte)
|
||||
*/
|
||||
PC11.prototype.getBaudTimeout = function(nBaud)
|
||||
{
|
||||
/*
|
||||
* TODO: Do a better job computing this, based on actual numbers of start, stop and parity bits,
|
||||
* instead of hard-coding the total number of bits per byte to 10.
|
||||
*/
|
||||
var nBytesPerSecond = Math.round(nBaud / 10);
|
||||
return 1000 / nBytesPerSecond;
|
||||
};
|
||||
|
||||
/**
|
||||
* advanceReader()
|
||||
*
|
||||
|
|
@ -748,9 +787,14 @@ PC11.prototype.advanceReader = function()
|
|||
if ((this.prs & (PDP11.PC11.PRS.RE | PDP11.PC11.PRS.ERROR)) == PDP11.PC11.PRS.RE) {
|
||||
if (!(this.prs & PDP11.PC11.PRS.DONE)) {
|
||||
if (this.iTapeData < this.aTapeData.length) {
|
||||
/*
|
||||
* Here, as elsewhere (eg, the DL11 component), even if I trusted all incoming data
|
||||
* to be byte values (which I don't), there's also the risk that it could be signed data
|
||||
* (eg, -128 to 127, instead of 0 to 255). Both risks are good reasons to always mask
|
||||
* the data assigned to PRB with 0xff.
|
||||
*/
|
||||
this.prb = this.aTapeData[this.iTapeData++] & 0xff;
|
||||
this.displayProgress(this.iTapeData / this.aTapeData.length * 100);
|
||||
if (MAXDEBUG) this.println("tape read " + str.toHexByte(this.prb) + " at pos " + str.toHexWord(this.iTapeData));
|
||||
this.prs |= PDP11.PC11.PRS.DONE;
|
||||
this.prs &= ~PDP11.PC11.PRS.BUSY;
|
||||
if (this.prs & PDP11.PC11.PRS.RIE) {
|
||||
|
|
@ -809,7 +853,7 @@ PC11.prototype.writePRS = function(data, addr)
|
|||
* that's the rate we'll choose as well (ie, 1000ms / 300). As an aside, the original "low speed"
|
||||
* version of the reader ran at 10 CPS.
|
||||
*/
|
||||
this.cpu.setTimer(this.timerReaderAdvance, 1000/300);
|
||||
this.cpu.setTimer(this.timerReaderAdvance, this.getBaudTimeout(this.nBaudReceive));
|
||||
}
|
||||
}
|
||||
this.prs = (this.prs & ~PDP11.PC11.PRS.WMASK) | (data & PDP11.PC11.PRS.WMASK);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* @fileoverview Implements the PDP11 SerialPort component.
|
||||
* @fileoverview Implements the PDP-11 SerialPort component (eg, DL11)
|
||||
* @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
|
||||
* @copyright © Jeff Parsons 2012-2016
|
||||
*
|
||||
|
|
@ -46,19 +46,24 @@ if (NODE) {
|
|||
*
|
||||
* The SerialPort component has the following component-specific (parmsSerial) properties:
|
||||
*
|
||||
* adapter: adapter number; 0 if not defined
|
||||
* adapter: adapter number; 0 if not defined (the PCx86 SerialPort component uses this
|
||||
* value to set the device's internal COM number, which in turn determines other properties,
|
||||
* such as I/O ports and IRQ; for the PDP-11, this currently has no defined use)
|
||||
*
|
||||
* baudReceive: the default number of bits/second that the device should receive data at;
|
||||
* 0 means use the device default (PDP11.DL11.RCSR.BAUD)
|
||||
*
|
||||
* baudTransmit: the default number of bits/second that the device should transmit data at;
|
||||
* 0 means use the device default (PDP11.DL11.XCSR.BAUD)
|
||||
*
|
||||
* binding: name of a control (based on its "binding" attribute) to bind to this port's I/O
|
||||
*
|
||||
* tabSize: set to a non-zero number to convert tabs to spaces (applies only to output to
|
||||
* the above binding); default is 0 (no conversion)
|
||||
*
|
||||
* In the future, we may support 'port' and 'irq' properties that allow the machine to define a
|
||||
* non-standard serial port configuration, instead of only our pre-defined 'adapter' configurations.
|
||||
*
|
||||
* NOTE: Since the XSL file defines 'adapter' as a number, not a string, there's no need to use
|
||||
* parseInt(), and as an added benefit, we don't need to worry about whether a hex or decimal format
|
||||
* was used.
|
||||
* NOTE: Since the XSL file defines the 'adapter' and 'baud' properties as numbers, not strings,
|
||||
* there's no need to use parseInt(), and as an added benefit, we don't need to worry about whether
|
||||
* a hex or decimal format was used.
|
||||
*
|
||||
* @constructor
|
||||
* @extends Component
|
||||
|
|
@ -67,6 +72,8 @@ if (NODE) {
|
|||
function SerialPortPDP11(parmsSerial) {
|
||||
|
||||
this.iAdapter = parmsSerial['adapter'];
|
||||
this.nBaudReceive = parmsSerial['baudReceive'] || PDP11.DL11.RCSR.BAUD;
|
||||
this.nBaudTransmit = parmsSerial['baudTransmit'] || PDP11.DL11.XCSR.BAUD;
|
||||
|
||||
/**
|
||||
* consoleOutput becomes a string that records serial port output if the 'binding' property is set to the
|
||||
|
|
@ -265,7 +272,13 @@ SerialPortPDP11.prototype.initBus = function(cmp, bus, cpu, dbg)
|
|||
this.timerReceiveInterrupt = this.cpu.addTimer(function readyReceiver() {
|
||||
if (!(serial.rcsr & PDP11.DL11.RCSR.RD)) {
|
||||
if (serial.abReceive.length) {
|
||||
serial.rbuf = serial.abReceive.shift();
|
||||
/*
|
||||
* Here, as elsewhere (eg, the PC11 component), even if I trusted all incoming data
|
||||
* to be byte values (which I don't), there's also the risk that it could be signed data
|
||||
* (eg, -128 to 127, instead of 0 to 255). Both risks are good reasons to always mask
|
||||
* the data assigned to RBUF with 0xff.
|
||||
*/
|
||||
serial.rbuf = serial.abReceive.shift() & 0xff;
|
||||
serial.rcsr |= PDP11.DL11.RCSR.RD;
|
||||
if (serial.rcsr & PDP11.DL11.RCSR.RIE) {
|
||||
serial.cpu.setTrigger(serial.triggerReceiveInterrupt);
|
||||
|
|
@ -447,6 +460,25 @@ SerialPortPDP11.prototype.saveRegisters = function()
|
|||
return [];
|
||||
};
|
||||
|
||||
/**
|
||||
* getBaudTimeout(nBaud)
|
||||
*
|
||||
* Based on the selected baud rate (nBaud), convert that rate into a millisecond delay.
|
||||
*
|
||||
* @this {SerialPortPDP11}
|
||||
* @param {number} nBaud
|
||||
* @return {number} (number of milliseconds per byte)
|
||||
*/
|
||||
SerialPortPDP11.prototype.getBaudTimeout = function(nBaud)
|
||||
{
|
||||
/*
|
||||
* TODO: Do a better job computing this, based on actual numbers of start, stop and parity bits,
|
||||
* instead of hard-coding the total number of bits per byte to 10.
|
||||
*/
|
||||
var nBytesPerSecond = Math.round(nBaud / 10);
|
||||
return 1000 / nBytesPerSecond;
|
||||
};
|
||||
|
||||
/**
|
||||
* receiveData(data)
|
||||
*
|
||||
|
|
@ -471,7 +503,7 @@ SerialPortPDP11.prototype.receiveData = function(data)
|
|||
else {
|
||||
this.abReceive = this.abReceive.concat(data);
|
||||
}
|
||||
this.cpu.setTimer(this.timerReceiveInterrupt, PDP11.DL11.RBUF.DELAY);
|
||||
this.cpu.setTimer(this.timerReceiveInterrupt, this.getBaudTimeout(this.nBaudReceive));
|
||||
return true; // for now, return true regardless, since we're buffering everything anyway
|
||||
};
|
||||
|
||||
|
|
@ -570,7 +602,7 @@ SerialPortPDP11.prototype.readRBUF = function(addr)
|
|||
{
|
||||
this.rcsr &= ~PDP11.DL11.RCSR.RD;
|
||||
if (this.abReceive.length > 0) {
|
||||
this.cpu.setTimer(this.timerReceiveInterrupt, PDP11.DL11.RBUF.DELAY);
|
||||
this.cpu.setTimer(this.timerReceiveInterrupt, this.getBaudTimeout(this.nBaudReceive));
|
||||
}
|
||||
return this.rbuf;
|
||||
};
|
||||
|
|
@ -611,7 +643,7 @@ SerialPortPDP11.prototype.writeXCSR = function(data, addr)
|
|||
* If the device is READY, and IE is transitioning on, then request an interrupt.
|
||||
*/
|
||||
if ((this.xcsr & (PDP11.DL11.XCSR.READY | PDP11.DL11.XCSR.TIE)) == PDP11.DL11.XCSR.READY && (data & PDP11.DL11.XCSR.TIE)) {
|
||||
this.cpu.setTimer(this.timerTransmitInterrupt, PDP11.DL11.XCSR.DELAY);
|
||||
this.cpu.setTimer(this.timerTransmitInterrupt, this.getBaudTimeout(this.nBaudTransmit));
|
||||
}
|
||||
this.xcsr = (this.xcsr & ~PDP11.DL11.XCSR.WMASK) | (data & PDP11.DL11.XCSR.WMASK);
|
||||
};
|
||||
|
|
@ -641,7 +673,7 @@ SerialPortPDP11.prototype.writeXBUF = function(data, addr)
|
|||
if (data) {
|
||||
this.transmitByte(data);
|
||||
this.xcsr &= ~PDP11.DL11.XCSR.READY;
|
||||
this.cpu.setTimer(this.timerTransmitInterrupt, PDP11.DL11.XBUF.DELAY);
|
||||
this.cpu.setTimer(this.timerTransmitInterrupt, this.getBaudTimeout(this.nBaudTransmit));
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,14 @@
|
|||
|
||||
<xsl:template name="componentScripts">
|
||||
<xsl:param name="component"/>
|
||||
<script type="text/javascript" src="/versions/{$APPCLASS}/{$APPVERSION}/{$component}.js"> </script>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$APPNAME = 'PDPjs'">
|
||||
<script type="text/javascript" src="/versions/pdpjs/{$APPVERSION}/{$component}.js"> </script>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<script type="text/javascript" src="/versions/{$APPCLASS}/{$APPVERSION}/{$component}.js"> </script>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="componentIncludes">
|
||||
|
|
@ -762,6 +769,18 @@
|
|||
<xsl:otherwise/>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="baudReceive">
|
||||
<xsl:choose>
|
||||
<xsl:when test="@baudReceive"><xsl:value-of select="@baudReceive"/></xsl:when>
|
||||
<xsl:otherwise>0</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="baudTransmit">
|
||||
<xsl:choose>
|
||||
<xsl:when test="@baudTransmit"><xsl:value-of select="@baudTransmit"/></xsl:when>
|
||||
<xsl:otherwise>0</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="autoMount">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$mount != ''"><xsl:value-of select="$mount"/></xsl:when>
|
||||
|
|
@ -772,7 +791,7 @@
|
|||
<xsl:call-template name="component">
|
||||
<xsl:with-param name="machine" select="$machine"/>
|
||||
<xsl:with-param name="class">device</xsl:with-param>
|
||||
<xsl:with-param name="parms">,type:'<xsl:value-of select="$type"/>',autoMount:'<xsl:value-of select="$autoMount"/>'</xsl:with-param>
|
||||
<xsl:with-param name="parms">,type:'<xsl:value-of select="$type"/>',baudReceive:<xsl:value-of select="$baudReceive"/>,baudTransmit:<xsl:value-of select="$baudTransmit"/>,autoMount:'<xsl:value-of select="$autoMount"/>'</xsl:with-param>
|
||||
</xsl:call-template>
|
||||
</xsl:template>
|
||||
|
||||
|
|
@ -838,6 +857,18 @@
|
|||
<xsl:otherwise>0</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="baudReceive">
|
||||
<xsl:choose>
|
||||
<xsl:when test="@baudReceive"><xsl:value-of select="@baudReceive"/></xsl:when>
|
||||
<xsl:otherwise>0</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="baudTransmit">
|
||||
<xsl:choose>
|
||||
<xsl:when test="@baudTransmit"><xsl:value-of select="@baudTransmit"/></xsl:when>
|
||||
<xsl:otherwise>0</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<xsl:variable name="binding">
|
||||
<xsl:choose>
|
||||
<xsl:when test="@binding"><xsl:value-of select="@binding"/></xsl:when>
|
||||
|
|
@ -861,7 +892,7 @@
|
|||
<xsl:call-template name="component">
|
||||
<xsl:with-param name="machine" select="$machine"/>
|
||||
<xsl:with-param name="class">serial</xsl:with-param>
|
||||
<xsl:with-param name="parms">,adapter:<xsl:value-of select="$adapter"/>,binding:'<xsl:value-of select="$binding"/>',tabSize:<xsl:value-of select="$tabSize"/>,charBOL:<xsl:value-of select="$charBOL"/></xsl:with-param>
|
||||
<xsl:with-param name="parms">,adapter:<xsl:value-of select="$adapter"/>,baudReceive:<xsl:value-of select="$baudReceive"/>,baudTransmit:<xsl:value-of select="$baudTransmit"/>,binding:'<xsl:value-of select="$binding"/>',tabSize:<xsl:value-of select="$tabSize"/>,charBOL:<xsl:value-of select="$charBOL"/></xsl:with-param>
|
||||
</xsl:call-template>
|
||||
</xsl:template>
|
||||
|
||||
|
|
|
|||
|
|
@ -10,8 +10,7 @@
|
|||
<xsl:output doctype-system="about:legacy-compat" method="html"/>
|
||||
|
||||
<xsl:include href="common.xsl"/>
|
||||
<!-- There is no "shared" components.xsl, so we just pick one to eliminate IDE inspection warnings -->
|
||||
<xsl:include href="../../pcjs/templates/components.xsl"/>
|
||||
<xsl:include href="../../shared/templates/components.xsl"/>
|
||||
|
||||
<xsl:template match="/machine">
|
||||
<html lang="en">
|
||||
|
|
|
|||
Loading…
Reference in a new issue