1
0
mirror of https://github.com/pkimpel/retro-220.git synced 2026-04-10 22:51:52 +00:00

Commit minor updates and corrections to BAC- and GEN-Assembler.

This commit is contained in:
Paul Kimpel
2019-06-04 15:34:36 -07:00
parent d07dd13179
commit b701ebfb4c
3 changed files with 218 additions and 142 deletions

View File

@@ -42,7 +42,7 @@
<li><a href="https://github.com/pkimpel/retro-220/">Open Source Project</a>
<br>Source code, documentation, and other developer resources for the retro-220 emulator project at GitHub.
<li><a href="https://datatron.blogspot.com/2018/02/introducing-burroughs-220.html/">Project Blog</a>
<li><a href="https://datatron.blogspot.com/2018/02/introducing-burroughs-220.html">Project Blog</a>
<br>Tom Sawyer's Burroughs 205 and 220 blog, which includes posts related to this emulator.
<!--
@@ -64,14 +64,13 @@
<a href="http://www.phkimpel.us/ElectroData-205/">ElectroData/Burroughs 205</a> emulators.
</p>
<p>&nbsp;
<p>&nbsp;</p>
<div id=footerDiv>
Copyright (c) 2017, Paul Kimpel &bull; Licensed under the <a href="LICENSE.txt">MIT License</a>
</div>
<div id=lastModDiv>Revised
2019-01-29
2019-02-14
</div>
</p>
</body>
</html>

View File

@@ -40,13 +40,18 @@
* Output of Pass 2 is a traditional assembler listing, with words of
* generated object code and data. This listing is created by default.
*
* Output of the generated code and data can be obtained in three forms:
* Output of the generated code and data can be obtained in four forms:
*
* - Punched cards in a self-loading band-6 format (default).
*
* - Punched cards in BALGOL Machine Language format. This is also a
* band-6 format, but requires a separate loader program. See Appendix
* F in the BAC-220 reference manual.
* F in the BAC-220 reference manual under the heading "PREPARATION OF
* EXTERNAL PROGRAMS".
*
* - Punched cards in the BALGOL Generator program deck format for
* INPUTMEDIA and OUTPUTMEDIA routines. See Appendix F of the BAC-220
* reference manual under the heading "INPUT-OUTPUT PROCEDURES".
*
* - Magnetic tape image recorded in 100-word blocks. The code is
* written to lane 0 of the tape image.
@@ -71,8 +76,9 @@ HTML {
BODY {
position: relative;
background-color: #FFC;
font-family: Arial, Helvetica, sans-serif;
height: 100%;
height: calc(100% - 3ex);
margin: 1ex}
DIV.heading {
@@ -84,7 +90,6 @@ LABEL {
font-size: smaller}
#CardReaderPanel {
position: relative;
color: white;
background-color: #666;
width: 640px;
@@ -100,8 +105,6 @@ LABEL {
width: 100%}
#CardReaderCol1 {
width: 18ex}
#CardReaderCol2 {
}
#CardReaderTable TD {
text-align: left;
vertical-align: top;
@@ -119,22 +122,17 @@ LABEL {
border: 1px solid white}
#OptionsTable {
position: relative;
margin-top: 4px;
margin-bottom: 4px;
width: 640px}
#TextDiv {
position: relative;
height: 75%;
width: 640px}
#TextPanel {
position: absolute;
left: 0;
top: 0;
bottom: 8px;
width: 100%;
top: 160px; /* initially */
bottom: 0px;
width: 640px;
white-space: pre;
overflow: scroll;
padding: 4px;
border: 1px solid black;
@@ -162,45 +160,47 @@ LABEL {
Assembler for the Burroughs 220 BALGOL Compiler &amp; Library
</div>
<div id=CardReaderPanel>
<table id=CardReaderTable>
<colgroup><col id=CardReaderCol1><col id=CardReaderCol2></colgroup>
<tr><td>Pre-load Pool
<td><input id=CRPoolSelector type=file size=90>
<tr><td>Load Source &amp; Go
<td><input id=CRFileSelector type=file size=90>
<div id=OptionsDiv>
<table id=OptionsTable>
<thead>
<tr>
<th><label for=Pass1ListCheck>List Pass 1</label>
<th><label for=Pass2ListCheck>List Pass 2</label>
<th><label for=ChecksumCheck>Write Checksum</label>
<th><label for=OutputModeSelect>Output Mode</label>
<th>&nbsp;
<tbody>
<tr>
<td class=center>
<input id=Pass1ListCheck type=checkbox value=1>
<td class=center>
<input id=Pass2ListCheck type=checkbox value=1 CHECKED>
<td class=center>
<input id=ChecksumCheck type=checkbox value=1>
<td class=center>
<select id=OutputModeSelect>
<option value="" >No Object
<option value=L SELECTED>Loadable Deck
<option value=M >BALGOL ML Deck
<option value=P >Gen MEDIA Deck
<option value=T >Object Tape
</select>
<td class=rj>
<button id=ExtractListing type=button>Extract Listing</button>
</table>
<div id=CardReaderPanel>
<table id=CardReaderTable>
<colgroup><col id=CardReaderCol1><col id=CardReaderCol2></colgroup>
<tr><td>Pre-load Pool
<td><input id=CRPoolSelector type=file size=90>
<tr><td>Load Source &amp; Go
<td><input id=CRFileSelector type=file size=90>
</table>
</div>
</div>
<table id=OptionsTable>
<thead>
<tr>
<th><label for=Pass1ListCheck>List Pass 1</label>
<th><label for=Pass2ListCheck>List Pass 2</label>
<th><label for=ChecksumCheck>Write Checksum</label>
<th><label for=OutputModeSelect>Output Mode</label>
<th>&nbsp;
<tbody>
<tr>
<td class=center>
<input id=Pass1ListCheck type=checkbox value=1>
<td class=center>
<input id=Pass2ListCheck type=checkbox value=1 CHECKED>
<td class=center>
<input id=ChecksumCheck type=checkbox value=1>
<td class=center>
<select id=OutputModeSelect>
<option value="" >No Object
<option value=L SELECTED>Loadable Deck
<option value=M >BALGOL ML Deck
<option value=P >Gen MEDIA Deck
<option value=T >Object Tape
</select>
<td class=rj>
<button id=SelectListing type=button>Select Listing</button>
</table>
<div id=TextDiv><pre id=TextPanel></pre></div> <!-- Don't add any whitespace! -->
<div id=TextPanel></div> <!-- Don't add any whitespace inside the div! -->
<script>
@@ -362,7 +362,7 @@ window.addEventListener("load", function() {
* 13 = BU pair for CRF/CWF: (B-1)*2 added to (41), U in (11)
* 14 = reload-lockout value added to (41)
* 15 = digit inserted in (11); if specified, insert 1 in (41)
* 16 = format band digit added to (41): (B-1)*2
* 16 = Cardatron c-digit inserted in (31) for T-relays (carriage control)
* 17 = variant value added to (41)
* 18 = mag tape unit/lane as LLU, inserted as ULL in (33)
* 19 = resolved address only
@@ -475,7 +475,7 @@ window.addEventListener("load", function() {
"MIE": [ 159, 1, -1, 4, -1, 8, 0],
"CRD": [ 60, 1, -1, 4, -1, 5, 0, 8, 0],
"CNC": [ 1060, 1, -1, 4, -1, 5, 0],
"CWR": [ 61, 1, -1, 13, -1, 16, 0, 8, 0],
"CWR": [ 61, 1, -1, 13, -1, 16, 0],
"CRF": [ 62, 1, -1, 13, -1, 14, 0],
"CWF": [ 63, 1, -1, 13, -1, 14, 0],
"CRI": [ 64, 1, -1, 4, -1],
@@ -1373,11 +1373,8 @@ window.addEventListener("load", function() {
word = putField(word, 1, 41);
}
break;
case 16: // format band digit added to (41): (B-1)*2
w1 = f%10;
if (w1 > 0) {
word = putField(word, getField(word, 41) + (w1-1)*2, 41);
}
case 16: // Cardatron c-digit inserted in (31) for T-relays (carriage control)
word = putField(word, f, 31);
break;
case 17: // BMOD value added to (41)
word = putField(word, getField(word, 41) + f%10, 41);
@@ -2108,8 +2105,7 @@ window.addEventListener("load", function() {
if (errorCount == 0) { // advance to Pass 2
setTimeout(initializePass2, 100);
} else {
$$("TextDiv").removeChild($$("Spinner"));
// And... we're done at this point -- just exit the script
finishAssembly();
}
}
}
@@ -2455,9 +2451,37 @@ window.addEventListener("load", function() {
/*******************************************************************
* Object Code Output *
* Assembler Output *
*******************************************************************/
/**************************************/
function extractListing(ev) {
/* Copies the text contents of the "paper" area of the assembler listing,
opens a new temporary window, and pastes that text into the window so it
can be copied or saved by the user */
var doc = null; // temp window document object
var text = panel.textContent;
var title = "BAC-Assembler Listing";
var win = window.open("../../webUI/B220FramePaper.html", "BAC-Asm-Listing",
"scrollbars,resizable,width=600,height=500");
function copyText(ev) {
var doc = ev.target;
var win = doc.defaultView;
win.removeEventListener("load", copyText, false);
doc = win.document;
doc.title = title;
doc.getElementById("Paper").textContent = text;
}
//clearPanel();
win.addEventListener("load", copyText, false);
win.moveTo((screen.availWidth-win.outerWidth)/2, (screen.availHeight-win.outerHeight)/2);
ev.preventDefault();
ev.stopPropagation();
}
/**************************************/
function generateFormat6LoadableDeck(asmCode, outputChecksum, startAddress) {
/* Formats the assembled object code as a standard Cardatron format-6
@@ -2793,7 +2817,7 @@ window.addEventListener("load", function() {
$$("CRFileSelector").value = null; // reset the <input> elements
$$("CRPoolSelector").value = null; // so they can be reused
poolSets.length = 1; // discard any poolSets that were loaded
$$("TextDiv").removeChild($$("Spinner")); // remove the spinner image
document.body.removeChild($$("Spinner")); // remove the spinner image
// And... we're done -- just fall out of the script.
}
@@ -2934,7 +2958,7 @@ window.addEventListener("load", function() {
e = document.createElement("img");
e.src = "../../webUI/resources/ajax-spinner.gif";
e.id = "Spinner";
$$("TextDiv").appendChild(e);
document.body.appendChild(e);
reader.onload = fileLoader_onLoad;
reader.readAsText(f);
@@ -2962,7 +2986,18 @@ window.addEventListener("load", function() {
}
}
/**************************************/
function repositionTextPanel() {
/* Repositions and resizes the #TextPanel element so that it fills the
bottom portion of the window */
var opts = $$("OptionsDiv");
var panel = $$("TextPanel");
panel.style.top = (opts.offsetTop + opts.offsetHeight + 8).toFixed() + "px";
}
/******************** Start of window.onload() ********************/
repositionTextPanel();
if (checkBrowser()) {
return;
}
@@ -2987,9 +3022,7 @@ window.addEventListener("load", function() {
outputChecksum = ev.target.checked;
});
$$("SelectListing").addEventListener("click", function(ev) {
window.getSelection().selectAllChildren($$("TextPanel"));
});
$$("ExtractListing").addEventListener("click", extractListing);
}, false);
</script>

View File

@@ -39,13 +39,18 @@
* and data. It is designed to match the listing from which the compiler
* was transcribed, so that it may be compared for proofing purposes.
*
* Output of the generated code and data can be obtained in three forms:
* Output of the generated code and data can be obtained in four forms:
*
* - Punched cards in a self-loading band-6 format (default).
*
* - Punched cards in BALGOL Machine Language format. This is also a
* band-6 format, but requires a separate loader program. See Appendix
* F in the BAC-220 reference manual.
* F in the BAC-220 reference manual under the heading "PREPARATION OF
* EXTERNAL PROGRAMS".
*
* - Punched cards in the BALGOL Generator program deck format for
* INPUTMEDIA and OUTPUTMEDIA routines. See Appendix F of the BAC-220
* reference manual under the heading "INPUT-OUTPUT PROCEDURES".
*
* - Magnetic tape image recorded in 100-word blocks. The code is
* written to lane 0 of the tape image.
@@ -70,8 +75,9 @@ HTML {
BODY {
position: relative;
background-color: #CFC;
font-family: Arial, Helvetica, sans-serif;
height: 100%;
height: calc(100% - 3ex);
margin: 1ex}
DIV.heading {
@@ -83,7 +89,6 @@ LABEL {
font-size: smaller}
#CardReaderPanel {
position: relative;
color: white;
background-color: #666;
width: 640px;
@@ -99,8 +104,6 @@ LABEL {
width: 100%}
#CardReaderCol1 {
width: 18ex}
#CardReaderCol2 {
}
#CardReaderTable TD {
text-align: left;
vertical-align: top;
@@ -118,22 +121,17 @@ LABEL {
border: 1px solid white}
#OptionsTable {
position: relative;
margin-top: 4px;
margin-bottom: 4px;
width: 640px}
#TextDiv {
position: relative;
height: 75%;
width: 640px}
#TextPanel {
position: absolute;
left: 0;
top: 0;
bottom: 8px;
width: 100%;
top: 160px; /* initially */
bottom: 0px;
width: 640px;
white-space: pre;
overflow: scroll;
padding: 4px;
border: 1px solid black;
@@ -158,48 +156,50 @@ LABEL {
<body>
<div class=heading>
Assembler for the Burroughs 220 BAC Generator
Assembler for the Burroughs 220 BALGOL Generator
</div>
<div id=CardReaderPanel>
<table id=CardReaderTable>
<colgroup><col id=CardReaderCol1><col id=CardReaderCol2></colgroup>
<tr><td>Pre-load Pool
<td><input id=CRPoolSelector type=file size=90>
<tr><td>Load Source &amp; Go
<td><input id=CRFileSelector type=file size=90>
<div id=OptionsDiv>
<table id=OptionsTable>
<thead>
<tr>
<th><label for=Pass1ListCheck>List Pass 1</label>
<th><label for=Pass2ListCheck>List Pass 2</label>
<th><label for=ChecksumCheck>Write Checksum</label>
<th><label for=OutputModeSelect>Output Mode</label>
<th>&nbsp;
<tbody>
<tr>
<td class=center>
<input id=Pass1ListCheck type=checkbox value=1>
<td class=center>
<input id=Pass2ListCheck type=checkbox value=1 CHECKED>
<td class=center>
<input id=ChecksumCheck type=checkbox value=1>
<td class=center>
<select id=OutputModeSelect>
<option value="" >No Object
<option value=L SELECTED>Loadable Deck
<option value=M >BALGOL ML Deck
<option value=P >Gen MEDIA Deck
<option value=T >Object Tape
</select>
<td class=rj>
<button id=ExtractListing type=button>Extract Listing</button>
</table>
<div id=CardReaderPanel>
<table id=CardReaderTable>
<colgroup><col id=CardReaderCol1><col id=CardReaderCol2></colgroup>
<tr><td>Pre-load Pool
<td><input id=CRPoolSelector type=file size=90>
<tr><td>Load Source &amp; Go
<td><input id=CRFileSelector type=file size=90>
</table>
</div>
</div>
<table id=OptionsTable>
<thead>
<tr>
<th><label for=Pass1ListCheck>List Pass 1</label>
<th><label for=Pass2ListCheck>List Pass 2</label>
<th><label for=ChecksumCheck>Write Checksum</label>
<th><label for=OutputModeSelect>Output Mode</label>
<th>&nbsp;
<tbody>
<tr>
<td class=center>
<input id=Pass1ListCheck type=checkbox value=1>
<td class=center>
<input id=Pass2ListCheck type=checkbox value=1 CHECKED>
<td class=center>
<input id=ChecksumCheck type=checkbox value=1>
<td class=center>
<select id=OutputModeSelect>
<option value="" >No Object
<option value=L SELECTED>Loadable Deck
<option value=M >BALGOL ML Deck
<option value=P >Gen MEDIA Deck
<option value=T >Object Tape
</select>
<td class=rj>
<button id=SelectListing type=button>Select Listing</button>
</table>
<div id=TextDiv><pre id=TextPanel></pre></div> <!-- Don't add any whitespace! -->
<div id=TextPanel></div> <!-- Don't add any whitespace inside the div! -->
<script>
@@ -399,6 +399,7 @@ window.addEventListener("load", function() {
* 11 = count in /21
* 12 = format band digit added to /41: (B-1)*2
* 13 = SPO operand: special string or address,count pair
* 14 = Cardatron c-digit inserted in (31) for T-relays (carriage control)
* 19 = resolved address only
*******************************************************************/
@@ -428,7 +429,7 @@ window.addEventListener("load", function() {
"PRB ": [ 4, 1,-1, 4,-1, 5, 0],
"PRI ": [ 5, 1,-1, 4,-1, 6, 0, 5, 0],
"PWR ": [ 6, 1,-1, 4,-1, 6, 0],
"PWI ": [ 7, 1, 0],
"PWI ": [ 7, 1, 0, 4,-1],
"KAD ": [ 8, 1, 0],
"SPO ": [ 9, 13,-1],
"CAD ": [ 10, 1, 0],
@@ -503,8 +504,8 @@ window.addEventListener("load", function() {
"MLS ": [ 450, 10,-1],
"MRW ": [ 850, 10,-1],
"MDA ": [ 950, 10,-1],
"MTC ": [ 51, 1, 0, 10,-1],
"MFC ": [4000051, 1, 0, 10,-1],
"MTC ": [ 51, 1, 0, 10,-1, 5, 0],
"MFC ": [4000051, 1, 0, 10,-1, 5, 0],
"MRD ": [ 52, 1,-1, 4,-1, 11, 0, 5, 0],
"MNC ": [ 152, 1,-1, 4,-1, 11, 0, 5, 1],
"MRR ": [ 53, 1,-1, 4,-1, 11, 0, 5, 0],
@@ -520,7 +521,7 @@ window.addEventListener("load", function() {
"CRD ": [ 60, 1,-1, 4,-1, 5, 0, 6, 0],
"CNC ": [ 1060, 1,-1, 4,-1],
"CNCL ": [ 1160, 1,-1, 4,-1],
"CWR ": [ 161, 1,-1, 4,-1, 12,-1, 6, 0],
"CWR ": [ 161, 1,-1, 4,-1, 12,-1, 14, 0],
"CRF ": [ 62, 1,-1, 4,-1, 12,-1],
"CRFL ": [ 162, 1,-1, 4,-1, 12,-1],
"CWF ": [ 63, 1,-1, 4,-1, 12,-1],
@@ -1831,6 +1832,10 @@ window.addEventListener("load", function() {
result = parseSPOOperand(token, pass2, result);
break;
case 14: // Cardatron c-digit inserted in (31) for T-relays (carriage control)
result = putField(result, val, 31);
break;
case 19: // resolved address only
if (isNaN(val)) {
printError("MUST HAVE FULLY-RESOLVED ADDRESS");
@@ -1857,16 +1862,16 @@ window.addEventListener("load", function() {
/* Generates the 29 words of a Cardatron format band from the operand
text and returns an array of 29 words with band data. Examples:
FBGR INPUT,16(P5A),P10Z
FBGR PRINT,49B,T5A,T1A1B2A4Z,T10N,T8Z1A,XB6Z2A,48B MONITOR
FBGR PRINT,32B,11(T5A),33B ERROR MESSAGE FORMAT BAND
FBGR INPUT,T2Z1B4A,15(T5A)
FBGR INPUT,16(P5A),P10Z
FBGR PRINT,49B,TZZZZZZNNNN,BBB,SBNNNNBNNBNNNN,BT5A,44B
FBGR PRINT,49B,TZZZZZZNNNN,BBB,SBNNNNBNNBZZZZ,5BT5A,44B
FBGR PRINT,49B,TZZZZZZNNNN,BBB,T6Z10BNNNN,50B
FBGR PRINT,7(T5A),85B
FBGR PRINT,TZZNNNNZZZZ,4B,16(T5A),32B
FORMAT INPUT,16(P5A),P10Z
FORMAT PRINT,49B,T5A,T1A1B2A4Z,T10N,T8Z1A,XB6Z2A,48B MONITOR
FORMAT PRINT,32B,11(T5A),33B ERROR MESSAGE FORMAT BAND
FORMAT INPUT,T2Z1B4A,15(T5A)
FORMAT INPUT,16(P5A),P10Z
FORMAT PRINT,49B,TZZZZZZNNNN,BBB,SBNNNNBNNBNNNN,BT5A,44B
FORMAT PRINT,49B,TZZZZZZNNNN,BBB,SBNNNNBNNBZZZZ,5BT5A,44B
FORMAT PRINT,49B,TZZZZZZNNNN,BBB,T6Z10BNNNN,50B
FORMAT PRINT,7(T5A),85B
FORMAT PRINT,TZZNNNNZZZZ,4B,16(T5A),32B
The first parameter can be "INPUT", "PUNCH", or "PRINT". The first two
values generate bands for 80 card columns; the third generates a band
@@ -2830,6 +2835,7 @@ window.addEventListener("load", function() {
readACard();
if (cardData.atEOF) {
printError("EOF encountered before END in Pass 1");
finishAssembly();
} else {
Promise.resolve(false).then(assemblePass1);
}
@@ -2908,9 +2914,37 @@ window.addEventListener("load", function() {
/*******************************************************************
* Object Code Output *
* Assembler Output *
*******************************************************************/
/**************************************/
function extractListing(ev) {
/* Copies the text contents of the "paper" area of the assembler listing,
opens a new temporary window, and pastes that text into the window so it
can be copied or saved by the user */
var doc = null; // temp window document object
var text = panel.textContent;
var title = "GEN-Assembler Listing";
var win = window.open("../../webUI/B220FramePaper.html", "GEN-Asm-Listing",
"scrollbars,resizable,width=600,height=500");
function copyText(ev) {
var doc = ev.target;
var win = doc.defaultView;
win.removeEventListener("load", copyText, false);
doc = win.document;
doc.title = title;
doc.getElementById("Paper").textContent = text;
}
//clearPanel();
win.addEventListener("load", copyText, false);
win.moveTo((screen.availWidth-win.outerWidth)/2, (screen.availHeight-win.outerHeight)/2);
ev.preventDefault();
ev.stopPropagation();
}
/**************************************/
function generateFormat6LoadableDeck(asmCode, outputChecksum, startAddress) {
/* Formats the assembled object code as a standard Cardatron format-6
@@ -3319,7 +3353,7 @@ window.addEventListener("load", function() {
$$("CRFileSelector").value = null; // reset the <input> elements
$$("CRPoolSelector").value = null; // so they can be reused
poolSets.length = 1; // discard any poolSets that were loaded
$$("TextDiv").removeChild($$("Spinner")); // remove the spinner image
document.body.removeChild($$("Spinner")); // remove the spinner image
}
}
@@ -3333,6 +3367,7 @@ window.addEventListener("load", function() {
asmCode = []; // clear the assembled code buffer
clearPanel();
programUnitNr = 0;
printLine("Assembler for the Burroughs 220 BAC Generator -- " +
stamp.getFullYear().toString() + "-" +
padLeft(stamp.getMonth()+1, 2, "0") + "-" +
@@ -3463,7 +3498,7 @@ window.addEventListener("load", function() {
e = document.createElement("img");
e.src = "../../webUI/resources/ajax-spinner.gif";
e.id = "Spinner";
$$("TextDiv").appendChild(e);
document.body.appendChild(e);
reader.onload = fileLoader_onLoad;
reader.readAsText(f);
@@ -3492,7 +3527,18 @@ window.addEventListener("load", function() {
}
}
/**************************************/
function repositionTextPanel() {
/* Repositions and resizes the #TextPanel element so that it fills the
bottom portion of the window */
var opts = $$("OptionsDiv");
var panel = $$("TextPanel");
panel.style.top = (opts.offsetTop + opts.offsetHeight + 8).toFixed() + "px";
}
/******************** Start of window.onload() ********************/
repositionTextPanel();
if (checkBrowser()) {
return;
}
@@ -3517,9 +3563,7 @@ window.addEventListener("load", function() {
outputChecksum = ev.target.checked;
});
$$("SelectListing").addEventListener("click", function(ev) {
window.getSelection().selectAllChildren($$("TextPanel"));
});
$$("ExtractListing").addEventListener("click", extractListing);
}, false);
</script>