diff --git a/modules/htmlout/lib/htmlout.js b/modules/htmlout/lib/htmlout.js
index 25bab0dd8..2210afe7f 100644
--- a/modules/htmlout/lib/htmlout.js
+++ b/modules/htmlout/lib/htmlout.js
@@ -1654,9 +1654,12 @@ HTMLOut.prototype.getReadMe = function(sToken, sIndent, aParms, sPrevious)
* it would be cleaner if this replacement could be performed by getTitle(), but unfortunately,
* getTitle() is called long before any README.md is opened.
*/
- var match = s.match(/^\s*]*>([^<]*)<\/h\1>/);
+ var match = s.match(/^\s*]*>(.*?)<\/h\1>/);
if (match) {
- obj.sHTML = obj.sHTML.replace(/(]*>)([^\|]*)\|[^<]*(<\/title>)/, "$1$2| " + match[2] + "$3");
+ var sTitle = match[2];
+ match = sTitle.match(/]*>([^<]*)<\/a>/);
+ if (match) sTitle = match[1];
+ obj.sHTML = obj.sHTML.replace(/(]*>)([^\|]*)\|[^<]*(<\/title>)/, "$1$2| " + sTitle + "$3");
}
/*
* We need to query the MarkOut object for any machine definitions that the current "readme"
diff --git a/modules/pcjs/lib/bus.js b/modules/pcjs/lib/bus.js
index 8973a1483..cae3622fb 100644
--- a/modules/pcjs/lib/bus.js
+++ b/modules/pcjs/lib/bus.js
@@ -50,7 +50,7 @@ if (typeof module !== 'undefined') {
/**
* Bus(cpu, dbg)
*
- * The Bus component manages "physical" memory and I/O address spaces.
+ * The Bus component manages physical memory and I/O address spaces.
*
* The Bus component has no UI elements, so it does not require an init() handler,
* but it still inherits from the Component class and must be allocated like any
@@ -174,6 +174,8 @@ function Bus(parmsBus, cpu, dbg)
*/
this.abtObjects = [];
this.cbtDeletions = 0;
+ this.ibtLastAlloc = -1;
+ this.ibtLastDelete = 0;
}
this.setReady();
@@ -219,6 +221,9 @@ Bus.prototype.initMemory = function()
Bus.prototype.reset = function()
{
this.setA20(true);
+ if (BACKTRACK) {
+ this.ibtLastDelete = 0;
+ }
};
/**
@@ -407,10 +412,8 @@ Bus.prototype.removeMemory = function(addr, size)
/**
* getByte(addr)
*
- * Why does the CPU use its own getByte() (which is substantially similar to ours) instead of calling us?
- *
- * It certainly could, but the CPU also needs to update some BACKTRACK state. There may also be a slight
- * performance advantage calling its own method vs. calling through another object (ie, the Bus object).
+ * The CPU could use this, but the CPU also needs to update BACKTRACK states. There may also be a slight
+ * performance advantage calling its own getByte() method vs. calling through another object (ie, the Bus object).
*
* @this {Bus}
* @param {number} addr is a physical (non-segmented) address
@@ -438,11 +441,9 @@ Bus.prototype.getByteDirect = function(addr)
/**
* getWord(addr)
*
- * Why does the CPU use its own getWord() (which is substantially similar to ours) instead of calling us?
- *
- * It certainly could, but the CPU also needs to update its cycle count, along with some BACKTRACK state.
- * There may also be a slight performance advantage calling its own method vs. calling through another object
- * (ie, the Bus object).
+ * The CPU could use this, but the CPU also needs to update cycle counts, along with BACKTRACK states.
+ * There may also be a slight performance advantage calling its own getWord() method vs. calling through another
+ * object (ie, the Bus object).
*
* @this {Bus}
* @param {number} addr is a physical (non-segmented) address
@@ -480,10 +481,8 @@ Bus.prototype.getWordDirect = function(addr)
/**
* setByte(addr, b)
*
- * Why does the CPU use its own setByte() (which is substantially similar to ours) instead of calling us?
- *
- * It certainly could, but the CPU also needs to update some BACKTRACK state. There may also be a slight
- * performance advantage calling its own method vs. calling through another object (ie, the Bus object).
+ * The CPU could use this, but the CPU also needs to update BACKTRACK states. There may also be a slight
+ * performance advantage calling its own setByte() method vs. calling through another object (ie, the Bus object).
*
* @this {Bus}
* @param {number} addr is a physical (non-segmented) address
@@ -512,11 +511,9 @@ Bus.prototype.setByteDirect = function(addr, b)
/**
* setWord(addr, w)
*
- * Why does the CPU use its own setWord() (which is substantially similar to ours) instead of calling us?
- *
- * It certainly could, but the CPU also needs to update its cycle count, along with some BACKTRACK state.
- * There may also be a slight performance advantage calling its own method vs. calling through another object
- * (ie, the Bus object).
+ * The CPU could use this, but the CPU also needs to update cycle counts, along with BACKTRACK states.
+ * There may also be a slight performance advantage calling its own setWord() method vs. calling through another
+ * object (ie, the Bus object).
*
* @this {Bus}
* @param {number} addr is a physical (non-segmented) address
@@ -561,13 +558,13 @@ Bus.prototype.setWordDirect = function(addr, w)
*
* If bto is null, then we create bto (ie, an object that wraps obj and records off).
*
- * If bto is NOT null, then we verify that off is within bto's range; if not, then we must
- * create a new bto and return that instead.
+ * If bto is NOT null, then we verify that off is within the given bto's range; if not,
+ * then we must create a new bto and return that instead.
*
* @this {Bus}
* @param {Object} obj
* @param {Object} bto
- * @param {number} off
+ * @param {number} off (the offset within obj that this wrapper object is relative to)
* @return {Object|null}
*/
Bus.prototype.addBackTrackObject = function(obj, bto, off)
@@ -578,24 +575,34 @@ Bus.prototype.addBackTrackObject = function(obj, bto, off)
/*
* Try the most recently created bto, on the off-chance it's what the caller needs
*/
- if (cbtObjects) bto = this.abtObjects[cbtObjects-1];
+ if (this.ibtLastAlloc >= 0) bto = this.abtObjects[this.ibtLastAlloc];
}
if (!bto || bto.obj != obj || off < bto.off || off >= bto.off + Bus.BACKTRACK.OFF_MAX) {
- var slot;
+
bto = {obj: obj, off: off, slot: 0, refs: 0};
+
+ var slot;
if (!this.cbtDeletions) {
slot = cbtObjects;
} else {
- for (slot = 0; slot < cbtObjects; slot++) {
- if (!this.abtObjects[slot]) {
+ for (slot = this.ibtLastDelete; slot < cbtObjects; slot++) {
+ var btoTest = this.abtObjects[slot];
+ if (!btoTest || !btoTest.refs && !this.isBackTrackWeak(slot << Bus.BACKTRACK.SLOT_SHIFT)) {
+ this.ibtLastDelete = slot + 1;
this.cbtDeletions--;
break;
}
}
- this.assert(slot < cbtObjects);
+ /*
+ * There's no longer any guarantee that simply because cbtDeletions was non-zero that there WILL
+ * be an available (existing) slot, because cbtDeletions also counts weak references that may still
+ * be weak.
+ *
+ * this.assert(slot < cbtObjects);
+ */
}
this.assert(slot < Bus.BACKTRACK.SLOT_MAX);
- bto.slot = slot;
+ this.ibtLastAlloc = bto.slot = slot;
if (slot == cbtObjects) {
this.abtObjects.push(bto);
} else {
@@ -682,7 +689,33 @@ Bus.prototype.writeBackTrack = function(addr, bti)
this.dbg.message("writeBackTrack(%" + str.toHex(addr) + ',' + str.toHex(bti) + "): previous index (" + str.toHex(btiPrev) + ") refers to object with bad ref count (" + btoPrev.refs + ")");
}
} else if (!--btoPrev.refs) {
- this.abtObjects[slotPrev] = null;
+ /*
+ * We used to just slam a null into the previous slot and consider it gone, but there may still
+ * be "weak references" to that slot (ie, it may still be associated with a register bti).
+ *
+ * The easiest way to handle weak references is to leave the slot allocated, with the object's ref
+ * count sitting at zero, and change addBackTrackObject() to look for both empty slots AND non-empty
+ * slots with a ref count of zero; in the latter case, it should again check for weak references,
+ * after which we can re-use the slot if all its weak references are now gone.
+ */
+ if (!this.isBackTrackWeak(btiPrev)) this.abtObjects[slotPrev] = null;
+ /*
+ * TODO: Consider what the appropriate trigger should be for resetting ibtLastDelete to zero;
+ * if we don't OCCASIONALLY set it to zero, we may never clear out obsolete weak references,
+ * whereas if we ALWAYS set it to zero, we may be forcing addBackTrackObject() to scan the entire
+ * table too often.
+ *
+ * I'd prefer to do something like this:
+ *
+ * if (this.ibtLastDelete > slotPrev) this.ibtLastDelete = slotPrev;
+ *
+ * or even this:
+ *
+ * if (this.ibtLastDelete > slotPrev) this.ibtLastDelete = 0;
+ *
+ * But neither one of those guarantees that we will at least occasionally scan the entire table.
+ */
+ this.ibtLastDelete = 0;
this.cbtDeletions++;
}
}
@@ -697,6 +730,33 @@ Bus.prototype.writeBackTrack = function(addr, bti)
}
};
+/**
+ * isBackTrackWeak(bti)
+ *
+ * @param {number} bti
+ * @returns {boolean} true if the given bti is still referenced by a register, false if not
+ */
+Bus.prototype.isBackTrackWeak = function(bti)
+{
+ var bt = this.cpu.backTrack;
+ var slot = bti >>> Bus.BACKTRACK.SLOT_SHIFT;
+ return (bt.btiAL >>> Bus.BACKTRACK.SLOT_SHIFT == slot ||
+ bt.btiAH >>> Bus.BACKTRACK.SLOT_SHIFT == slot ||
+ bt.btiBL >>> Bus.BACKTRACK.SLOT_SHIFT == slot ||
+ bt.btiBH >>> Bus.BACKTRACK.SLOT_SHIFT == slot ||
+ bt.btiCL >>> Bus.BACKTRACK.SLOT_SHIFT == slot ||
+ bt.btiCH >>> Bus.BACKTRACK.SLOT_SHIFT == slot ||
+ bt.btiDL >>> Bus.BACKTRACK.SLOT_SHIFT == slot ||
+ bt.btiDH >>> Bus.BACKTRACK.SLOT_SHIFT == slot ||
+ bt.btiBPLo >>> Bus.BACKTRACK.SLOT_SHIFT == slot ||
+ bt.btiBPHi >>> Bus.BACKTRACK.SLOT_SHIFT == slot ||
+ bt.btiSILo >>> Bus.BACKTRACK.SLOT_SHIFT == slot ||
+ bt.btiSIHi >>> Bus.BACKTRACK.SLOT_SHIFT == slot ||
+ bt.btiDILo >>> Bus.BACKTRACK.SLOT_SHIFT == slot ||
+ bt.btiDIHi >>> Bus.BACKTRACK.SLOT_SHIFT == slot
+ );
+};
+
/**
* saveMemory()
*
diff --git a/modules/pcjs/lib/chipset.js b/modules/pcjs/lib/chipset.js
index 108dbd61b..ba5bf211f 100644
--- a/modules/pcjs/lib/chipset.js
+++ b/modules/pcjs/lib/chipset.js
@@ -532,7 +532,7 @@ ChipSet.TIMER1 = {
ChipSet.TIMER2 = {
INDEX: 2,
- PORT: 0x42 // used speaker tone generation
+ PORT: 0x42 // used for speaker tone generation
};
ChipSet.TIMER_CTRL = {
diff --git a/modules/pcjs/lib/cpu.js b/modules/pcjs/lib/cpu.js
index 40d6abd77..051c5a41a 100644
--- a/modules/pcjs/lib/cpu.js
+++ b/modules/pcjs/lib/cpu.js
@@ -849,7 +849,7 @@ CPU.prototype.calcStartTime = function()
*
* This also won't do anything about other internal delays; for example, Debugger message() calls.
* By the time the message() function has called yieldCPU(), the cost of the message has already been
- * incurred, so it will be end up being charged against the instruction(s) that triggered them.
+ * incurred, so it will be end up being charged against the instruction(s) that triggered it.
*
* TODO: Consider calling yieldCPU() sooner from message(), so that it can arrange for the msEndThisRun
* "snapshot" to occur sooner; it's unclear, however, whether that will really improve the CPU's ability
diff --git a/modules/pcjs/lib/disk.js b/modules/pcjs/lib/disk.js
index ba429eb7b..1b19cd4f6 100644
--- a/modules/pcjs/lib/disk.js
+++ b/modules/pcjs/lib/disk.js
@@ -1154,7 +1154,10 @@ Disk.prototype.convertClusterToSectors = function(dir)
var iCluster = dir.iCluster;
if (iCluster) {
do {
- this.assert(iCluster >= DiskAPI.FAT12.CLUSNUM_MIN);
+ if (iCluster < DiskAPI.FAT12.CLUSNUM_MIN) {
+ this.assert(false);
+ break;
+ }
var lba = dir.lbaData + ((iCluster - DiskAPI.FAT12.CLUSNUM_MIN) * dir.nClusterSecs);
for (var i = 0; i < dir.nClusterSecs; i++) {
apba.push(dir.pbaVolume + lba++);
diff --git a/pubs/pc/magazines/byte/BYTE-1975-11/README.md b/pubs/pc/magazines/byte/BYTE-1975-11/README.md
index e5b1daf0d..6a15444cb 100644
--- a/pubs/pc/magazines/byte/BYTE-1975-11/README.md
+++ b/pubs/pc/magazines/byte/BYTE-1975-11/README.md
@@ -1,4 +1,4 @@
-Byte #3, November 1975
+[Byte #3, November 1975](../static/BYTE-1975-11/BYTE-1975-11.pdf)
---

@@ -99,5 +99,3 @@ Byte #3, November 1975



-
-[[Full PDF](../static/BYTE-1975-11/BYTE-1975-11.pdf)]
diff --git a/pubs/pc/magazines/msj/MSJ-1986-10/README.md b/pubs/pc/magazines/msj/MSJ-1986-10/README.md
index eaf43e7d8..d0e4c28a9 100644
--- a/pubs/pc/magazines/msj/MSJ-1986-10/README.md
+++ b/pubs/pc/magazines/msj/MSJ-1986-10/README.md
@@ -1,4 +1,4 @@
-Microsoft Systems Journal, October 1986
+[Microsoft Systems Journal, October 1986](../static/MSJ-1986-10/MSJ-1986-10.pdf)
---

@@ -35,5 +35,3 @@ Microsoft Systems Journal, October 1986



-
-[[Full PDF](../static/MSJ-1986-10/MSJ-1986-10.pdf)]
diff --git a/pubs/pc/magazines/msj/MSJ-1987-05/README.md b/pubs/pc/magazines/msj/MSJ-1987-05/README.md
index b8116758b..23789100c 100644
--- a/pubs/pc/magazines/msj/MSJ-1987-05/README.md
+++ b/pubs/pc/magazines/msj/MSJ-1987-05/README.md
@@ -1,4 +1,4 @@
-Microsoft Systems Journal, May 1987
+[Microsoft Systems Journal, May 1987](../static/MSJ-1987-05/MSJ-1987-05.pdf)
---

@@ -91,5 +91,3 @@ Microsoft Systems Journal, May 1987



-
-[[Full PDF](../static/MSJ-1987-05/MSJ-1987-05.pdf)]
diff --git a/pubs/pc/magazines/pctj/PCTJ-1986-10/README.md b/pubs/pc/magazines/pctj/PCTJ-1986-10/README.md
index e40fd28be..e0b375581 100644
--- a/pubs/pc/magazines/pctj/PCTJ-1986-10/README.md
+++ b/pubs/pc/magazines/pctj/PCTJ-1986-10/README.md
@@ -1,4 +1,4 @@
-PC Tech Journal, October 1986
+[PC Tech Journal, October 1986](../static/PCTJ-1986-10/PCTJ-1986-10.pdf)
---

@@ -229,5 +229,3 @@ PC Tech Journal, October 1986



-
-[[Full PDF](../static/PCTJ-1986-10/PCTJ-1986-10.pdf)]
diff --git a/pubs/pc/magazines/pctj/PCTJ-1986-11/README.md b/pubs/pc/magazines/pctj/PCTJ-1986-11/README.md
index ed8296853..b43c643b0 100644
--- a/pubs/pc/magazines/pctj/PCTJ-1986-11/README.md
+++ b/pubs/pc/magazines/pctj/PCTJ-1986-11/README.md
@@ -1,4 +1,4 @@
-PC Tech Journal, November 1986
+[PC Tech Journal, November 1986](../static/PCTJ-1986-11/PCTJ-1986-11.pdf)
---

@@ -229,5 +229,3 @@ PC Tech Journal, November 1986



-
-[[Full PDF](../static/PCTJ-1986-11/PCTJ-1986-11.pdf)]
diff --git a/pubs/pc/magazines/pctj/PCTJ-1986-12/README.md b/pubs/pc/magazines/pctj/PCTJ-1986-12/README.md
index 2c8ec0722..7ce3bf067 100644
--- a/pubs/pc/magazines/pctj/PCTJ-1986-12/README.md
+++ b/pubs/pc/magazines/pctj/PCTJ-1986-12/README.md
@@ -1,4 +1,4 @@
-PC Tech Journal, December 1986
+[PC Tech Journal, December 1986](../static/PCTJ-1986-12/PCTJ-1986-12.pdf)
---

@@ -233,5 +233,3 @@ PC Tech Journal, December 1986



-
-[[Full PDF](../static/PCTJ-1986-12/PCTJ-1986-12.pdf)]
diff --git a/pubs/pc/magazines/pctj/PCTJ-1987-01/README.md b/pubs/pc/magazines/pctj/PCTJ-1987-01/README.md
index 5c288a5f8..a88f25a29 100644
--- a/pubs/pc/magazines/pctj/PCTJ-1987-01/README.md
+++ b/pubs/pc/magazines/pctj/PCTJ-1987-01/README.md
@@ -1,4 +1,4 @@
-PC Tech Journal, January 1987
+[PC Tech Journal, January 1987](../static/PCTJ-1987-01/PCTJ-1987-01.pdf)
---

@@ -217,5 +217,3 @@ PC Tech Journal, January 1987



-
-[[Full PDF](../static/PCTJ-1987-01/PCTJ-1987-01.pdf)]
diff --git a/pubs/pc/magazines/pctj/PCTJ-1987-02/README.md b/pubs/pc/magazines/pctj/PCTJ-1987-02/README.md
index 5483a9056..92ff46853 100644
--- a/pubs/pc/magazines/pctj/PCTJ-1987-02/README.md
+++ b/pubs/pc/magazines/pctj/PCTJ-1987-02/README.md
@@ -1,4 +1,4 @@
-PC Tech Journal, February 1987
+[PC Tech Journal, February 1987](../static/PCTJ-1987-02/PCTJ-1987-02.pdf)
---

@@ -223,5 +223,3 @@ PC Tech Journal, February 1987



-
-[[Full PDF](../static/PCTJ-1987-02/PCTJ-1987-02.pdf)]
diff --git a/pubs/pc/magazines/pctj/PCTJ-1987-03/README.md b/pubs/pc/magazines/pctj/PCTJ-1987-03/README.md
index f1b376474..1f830338a 100644
--- a/pubs/pc/magazines/pctj/PCTJ-1987-03/README.md
+++ b/pubs/pc/magazines/pctj/PCTJ-1987-03/README.md
@@ -1,4 +1,4 @@
-PC Tech Journal, March 1987
+[PC Tech Journal, March 1987](../static/PCTJ-1987-03/PCTJ-1987-03.pdf)
---

@@ -215,5 +215,3 @@ PC Tech Journal, March 1987



-
-[[Full PDF](../static/PCTJ-1987-03/PCTJ-1987-03.pdf)]
diff --git a/pubs/pc/magazines/pctj/PCTJ-1987-04/README.md b/pubs/pc/magazines/pctj/PCTJ-1987-04/README.md
index 283edbc0b..5d95b39de 100644
--- a/pubs/pc/magazines/pctj/PCTJ-1987-04/README.md
+++ b/pubs/pc/magazines/pctj/PCTJ-1987-04/README.md
@@ -1,4 +1,4 @@
-PC Tech Journal, April 1987
+[PC Tech Journal, April 1987](../static/PCTJ-1987-04/PCTJ-1987-04.pdf)
---

@@ -219,5 +219,3 @@ PC Tech Journal, April 1987



-
-[[Full PDF](../static/PCTJ-1987-04/PCTJ-1987-04.pdf)]
diff --git a/pubs/pc/magazines/pctj/PCTJ-1987-05/README.md b/pubs/pc/magazines/pctj/PCTJ-1987-05/README.md
index 764cd146a..649102fdc 100644
--- a/pubs/pc/magazines/pctj/PCTJ-1987-05/README.md
+++ b/pubs/pc/magazines/pctj/PCTJ-1987-05/README.md
@@ -1,4 +1,4 @@
-PC Tech Journal, May 1987
+[PC Tech Journal, May 1987](../static/PCTJ-1987-05/PCTJ-1987-05.pdf)
---

@@ -241,5 +241,3 @@ PC Tech Journal, May 1987



-
-[[Full PDF](../static/PCTJ-1987-05/PCTJ-1987-05.pdf)]
diff --git a/pubs/pc/magazines/pctj/PCTJ-1987-06/README.md b/pubs/pc/magazines/pctj/PCTJ-1987-06/README.md
index ea84e7481..1d15aee3e 100644
--- a/pubs/pc/magazines/pctj/PCTJ-1987-06/README.md
+++ b/pubs/pc/magazines/pctj/PCTJ-1987-06/README.md
@@ -1,4 +1,4 @@
-PC Tech Journal, June 1987
+[PC Tech Journal, June 1987](../static/PCTJ-1987-06/PCTJ-1987-06.pdf)
---

@@ -237,5 +237,3 @@ PC Tech Journal, June 1987



-
-[[Full PDF](../static/PCTJ-1987-06/PCTJ-1987-06.pdf)]
diff --git a/pubs/pc/magazines/pctj/PCTJ-1987-07/README.md b/pubs/pc/magazines/pctj/PCTJ-1987-07/README.md
index d3c809a9e..a46262574 100644
--- a/pubs/pc/magazines/pctj/PCTJ-1987-07/README.md
+++ b/pubs/pc/magazines/pctj/PCTJ-1987-07/README.md
@@ -1,4 +1,4 @@
-PC Tech Journal, July 1987
+[PC Tech Journal, July 1987](../static/PCTJ-1987-07/PCTJ-1987-07.pdf)
---

@@ -231,5 +231,3 @@ PC Tech Journal, July 1987



-
-[[Full PDF](../static/PCTJ-1987-07/PCTJ-1987-07.pdf)]
diff --git a/pubs/pc/magazines/pctj/PCTJ-1987-08/README.md b/pubs/pc/magazines/pctj/PCTJ-1987-08/README.md
index 9077bcdfb..ce46cd41c 100644
--- a/pubs/pc/magazines/pctj/PCTJ-1987-08/README.md
+++ b/pubs/pc/magazines/pctj/PCTJ-1987-08/README.md
@@ -1,4 +1,4 @@
-PC Tech Journal, August 1987
+[PC Tech Journal, August 1987](../static/PCTJ-1987-08/PCTJ-1987-08.pdf)
---

@@ -251,5 +251,3 @@ PC Tech Journal, August 1987



-
-[[Full PDF](../static/PCTJ-1987-08/PCTJ-1987-08.pdf)]
diff --git a/pubs/pc/magazines/pctj/PCTJ-1987-09/README.md b/pubs/pc/magazines/pctj/PCTJ-1987-09/README.md
index 1528913be..b938b2c1f 100644
--- a/pubs/pc/magazines/pctj/PCTJ-1987-09/README.md
+++ b/pubs/pc/magazines/pctj/PCTJ-1987-09/README.md
@@ -1,4 +1,4 @@
-PC Tech Journal, September 1987
+[PC Tech Journal, September 1987](../static/PCTJ-1987-09/PCTJ-1987-09.pdf)
---

@@ -253,5 +253,3 @@ PC Tech Journal, September 1987



-
-[[Full PDF](../static/PCTJ-1987-09/PCTJ-1987-09.pdf)]
diff --git a/pubs/pc/magazines/pctj/PCTJ-1987-10/README.md b/pubs/pc/magazines/pctj/PCTJ-1987-10/README.md
index d6e60b610..8b63e39cb 100644
--- a/pubs/pc/magazines/pctj/PCTJ-1987-10/README.md
+++ b/pubs/pc/magazines/pctj/PCTJ-1987-10/README.md
@@ -1,4 +1,4 @@
-PC Tech Journal, October 1987
+[PC Tech Journal, October 1987](../static/PCTJ-1987-10/PCTJ-1987-10.pdf)
---

@@ -232,5 +232,3 @@ PC Tech Journal, October 1987



-
-[[Full PDF](../static/PCTJ-1987-10/PCTJ-1987-10.pdf)]
diff --git a/pubs/pc/magazines/pctj/PCTJ-1987-11/README.md b/pubs/pc/magazines/pctj/PCTJ-1987-11/README.md
index bf95eb242..df520e48c 100644
--- a/pubs/pc/magazines/pctj/PCTJ-1987-11/README.md
+++ b/pubs/pc/magazines/pctj/PCTJ-1987-11/README.md
@@ -1,4 +1,4 @@
-PC Tech Journal, November 1987
+[PC Tech Journal, November 1987](../static/PCTJ-1987-11/PCTJ-1987-11.pdf)
---

@@ -264,5 +264,3 @@ PC Tech Journal, November 1987



-
-[[Full PDF](../static/PCTJ-1987-11/PCTJ-1987-11.pdf)]
diff --git a/pubs/pc/magazines/pctj/PCTJ-1987-12/README.md b/pubs/pc/magazines/pctj/PCTJ-1987-12/README.md
index 302b0d015..d7020ce03 100644
--- a/pubs/pc/magazines/pctj/PCTJ-1987-12/README.md
+++ b/pubs/pc/magazines/pctj/PCTJ-1987-12/README.md
@@ -1,4 +1,4 @@
-PC Tech Journal, December 1987
+[PC Tech Journal, December 1987](../static/PCTJ-1987-12/PCTJ-1987-12.pdf)
---

@@ -243,5 +243,3 @@ PC Tech Journal, December 1987



-
-[[Full PDF](../static/PCTJ-1987-12/PCTJ-1987-12.pdf)]
diff --git a/pubs/pc/reference/ibm/5150/techref/README.md b/pubs/pc/reference/ibm/5150/techref/README.md
index c4892d0e9..93318397e 100644
--- a/pubs/pc/reference/ibm/5150/techref/README.md
+++ b/pubs/pc/reference/ibm/5150/techref/README.md
@@ -1,4 +1,4 @@
-IBM 5150 Technical Reference, August 1981
+[IBM 5150 Technical Reference, August 1981](http://minuszerodegrees.net/manuals/IBM_5150_Technical_Reference_6025005_AUG81.pdf)
---

@@ -395,5 +395,3 @@ IBM 5150 Technical Reference, August 1981



-
-[[Full PDF](http://minuszerodegrees.net/manuals/IBM_5150_Technical_Reference_6025005_AUG81.pdf)]
diff --git a/pubs/pc/reference/ibm/5160/techref/README.md b/pubs/pc/reference/ibm/5160/techref/README.md
index 242f0806c..4a2bc0c2d 100644
--- a/pubs/pc/reference/ibm/5160/techref/README.md
+++ b/pubs/pc/reference/ibm/5160/techref/README.md
@@ -1,4 +1,4 @@
-IBM 5160 Technical Reference, April 1983
+[IBM 5160 Technical Reference, April 1983](http://retroarchive.org/dos/docs/ibm5160techref.pdf)
---

@@ -624,5 +624,3 @@ IBM 5160 Technical Reference, April 1983



-
-[[Full PDF](http://retroarchive.org/dos/docs/ibm5160techref.pdf)]
diff --git a/pubs/pc/reference/ibm/5170/setup/README.md b/pubs/pc/reference/ibm/5170/setup/README.md
index 6d4c74875..f9e9b87c2 100644
--- a/pubs/pc/reference/ibm/5170/setup/README.md
+++ b/pubs/pc/reference/ibm/5170/setup/README.md
@@ -1,4 +1,4 @@
-IBM 5170 Installation and Setup, March 1984
+[IBM 5170 Installation and Setup, March 1984](http://minuszerodegrees.net/manuals/IBM_5170_Installation_and_Setup_1502491_MAR84.pdf)
---

@@ -287,5 +287,3 @@ IBM 5170 Installation and Setup, March 1984



-
-[[Full PDF](http://minuszerodegrees.net/manuals/IBM_5170_Installation_and_Setup_1502491_MAR84.pdf)]
diff --git a/pubs/pc/reference/ibm/5170/techref/README.md b/pubs/pc/reference/ibm/5170/techref/README.md
index 534f4f983..fba143979 100644
--- a/pubs/pc/reference/ibm/5170/techref/README.md
+++ b/pubs/pc/reference/ibm/5170/techref/README.md
@@ -1,4 +1,4 @@
-IBM 5170 Technical Reference, March 1984
+[IBM 5170 Technical Reference, March 1984](http://minuszerodegrees.net/manuals/IBM_5170_Technical_Reference_1502243_MAR84.pdf)
---

@@ -463,5 +463,3 @@ IBM 5170 Technical Reference, March 1984



-
-[[Full PDF](http://minuszerodegrees.net/manuals/IBM_5170_Technical_Reference_1502243_MAR84.pdf)]
diff --git a/pubs/pc/reference/ibm/ega/README.md b/pubs/pc/reference/ibm/ega/README.md
index d76f6d005..63e49552a 100644
--- a/pubs/pc/reference/ibm/ega/README.md
+++ b/pubs/pc/reference/ibm/ega/README.md
@@ -1,4 +1,4 @@
-IBM Enhanced Graphics Adapter
+[IBM Enhanced Graphics Adapter](http://minuszerodegrees.net/oa/OA - IBM Enhanced Graphics Adapter.pdf)
---

@@ -175,5 +175,3 @@ IBM Enhanced Graphics Adapter



-
-[[Full PDF](http://minuszerodegrees.net/oa/OA - IBM Enhanced Graphics Adapter.pdf)]
diff --git a/pubs/pc/reference/intel/80286/progref/README.md b/pubs/pc/reference/intel/80286/progref/README.md
index afecbdaf3..3e85bd91a 100644
--- a/pubs/pc/reference/intel/80286/progref/README.md
+++ b/pubs/pc/reference/intel/80286/progref/README.md
@@ -1,4 +1,4 @@
-80286 and 80287 Programmer's Reference Manual
+[80286 and 80287 Programmer's Reference Manual](../../static/80286/progref/80286_and_80287_Programmers_Reference_Manual_1987.pdf)
---

@@ -516,5 +516,3 @@



-
-[[Full PDF](../../static/80286/progref/80286_and_80287_Programmers_Reference_Manual_1987.pdf)]