From e82a1d5b52a7dfda7a89d20b5362d10ebbd21dac Mon Sep 17 00:00:00 2001 From: Jeff Parsons Date: Tue, 2 Aug 2016 18:53:01 -0700 Subject: [PATCH] VT100 video buffer bias fixed --- devices/pc8080/machine/vt100/machine.xml | 2 +- modules/pc8080/lib/chipset.js | 25 ++++++---------- modules/pc8080/lib/video.js | 38 ++++++++++++------------ 3 files changed, 29 insertions(+), 36 deletions(-) diff --git a/devices/pc8080/machine/vt100/machine.xml b/devices/pc8080/machine/vt100/machine.xml index ca5234a28..d13953d86 100644 --- a/devices/pc8080/machine/vt100/machine.xml +++ b/devices/pc8080/machine/vt100/machine.xml @@ -26,5 +26,5 @@ - + diff --git a/modules/pc8080/lib/chipset.js b/modules/pc8080/lib/chipset.js index 237cb15b8..012213678 100644 --- a/modules/pc8080/lib/chipset.js +++ b/modules/pc8080/lib/chipset.js @@ -194,6 +194,9 @@ ChipSet.VT100 = { DC011: { // generates Line Buffer Addresses (LBAs) for the Video Processor PORT: 0xC2, // write-only INIT: 0x00 + }, + LBA: { // used to simulate LBA0 through LBA7 (LBA7 is used to drive NVR_CLK) + INIT: 0x00 } }; @@ -312,7 +315,8 @@ ChipSet.VT100.init = [ ChipSet.VT100.NVR_LATCH.INIT, ChipSet.VT100.FLAGS_BUFFER.NO_AVO | ChipSet.VT100.FLAGS_BUFFER.NO_GFX, ChipSet.VT100.DC012.INIT, - ChipSet.VT100.DC011.INIT + ChipSet.VT100.DC011.INIT, + ChipSet.VT100.LBA.INIT ] ]; @@ -344,7 +348,7 @@ ChipSet.prototype.save = function() state.set(0, [this.bStatus0, this.bStatus1, this.bStatus2, this.wShiftData, this.bShiftCount, this.bSound1, this.bSound2]); break; case ChipSet.VT100.MODEL: - state.set(0, [this.bBrightnessLatch, this.bNVRLatch]); + state.set(0, [this.bBrightnessLatch, this.bNVRLatch, this.bFlagsBuffer, this.bDC012, this.bDC011, this.bLBA]); break; } return state.data(); @@ -379,6 +383,7 @@ ChipSet.prototype.restore = function(data) this.bFlagsBuffer = a[2]; this.bDC012 = a[3]; this.bDC011 = a[4]; + this.bLBA = a[5]; return true; } } @@ -413,19 +418,6 @@ ChipSet.prototype.stop = function() */ }; -/** - * isVideoEnabled() - * - * TODO: Consider moving this and the related ports (ie, DC011 and DC012) into the Video component. - * - * @this {ChipSet} - * @return {boolean} - */ -ChipSet.prototype.isVideoEnabled = function() -{ - return this.model != ChipSet.VT100.MODEL || this.bDC011 != 0; -}; - /** * updateStatus0(bit, fSet) * @@ -604,7 +596,8 @@ ChipSet.prototype.outSIWatchdog = function(port, b, addrFrom) */ ChipSet.prototype.inVT100FlagsBuffer = function(port, addrFrom) { - var b = this.bFlagsBuffer; + this.bLBA++; + var b = this.bFlagsBuffer = (this.bFlagsBuffer & ~ChipSet.VT100.FLAGS_BUFFER.NVR_CLK) | ((this.bLBA & 0x80)? ChipSet.VT100.FLAGS_BUFFER.NVR_CLK : 0); this.printMessageIO(port, null, addrFrom, "FLAGS.BUFFER", b, true); return b; }; diff --git a/modules/pc8080/lib/video.js b/modules/pc8080/lib/video.js index 21f128a5b..409ddf36b 100644 --- a/modules/pc8080/lib/video.js +++ b/modules/pc8080/lib/video.js @@ -279,10 +279,13 @@ Video.VT100 = { }, LINETERM: 0x7F, LINEATTR: { - ADDRMASK: 0x1F, + ADDRMASK: 0x0F, + ADDRBIAS: 0x10, // 1 == ADDRBIAS_LO, 0 = ADDRBIAS_HI FONTMASK: 0x60, SCROLL: 0x80 - } + }, + ADDRBIAS_LO: 0x2000, + ADDRBIAS_HI: 0x4000 }; /** @@ -635,7 +638,7 @@ Video.prototype.powerUp = function(data, fRepower) fBreak = true; } } - b = (font & Video.VT100.LINEATTR.FONTMASK) | ((addrNext >> 8) & Video.VT100.LINEATTR.ADDRMASK); + b = (font & Video.VT100.LINEATTR.FONTMASK) | ((addrNext >> 8) & Video.VT100.LINEATTR.ADDRMASK) | Video.VT100.LINEATTR.ADDRBIAS; this.bus.setByteDirect(addr++, b); this.bus.setByteDirect(addr++, addrNext & 0xff); if (fBreak) break; @@ -978,7 +981,8 @@ Video.prototype.updateVT100 = function() if ((data & Video.VT100.LINETERM) == Video.VT100.LINETERM) { var b = this.bus.getByteDirect(addr++); fontNext = b & Video.VT100.LINEATTR.FONTMASK; - addrNext = this.addrBuffer | ((b & Video.VT100.LINEATTR.ADDRMASK) << 8) | this.bus.getByteDirect(addr); + addrNext = ((b & Video.VT100.LINEATTR.ADDRMASK) << 8) | this.bus.getByteDirect(addr); + addrNext += (b & Video.VT100.LINEATTR.ADDRBIAS)? Video.VT100.ADDRBIAS_LO : Video.VT100.ADDRBIAS_HI; break; } if (nCols < this.abLineBuffer.length) { @@ -992,7 +996,6 @@ Video.prototype.updateVT100 = function() * Skip the first few "fill lines" */ if (nFill) { - this.assert(nCols === 0); // "fill lines" are typically zero-length nFill--; continue; } @@ -1004,22 +1007,19 @@ Video.prototype.updateVT100 = function() this.abLineBuffer[nCols++] = 0; // character code 0 is a empty font character } - this.assert(font >= 0); // font isn't valid on the first line, but that's always a "fill line" - /* - * Display the line buffer + * Display the line buffer; ordinarily, font would always be valid after processing the "fill lines", + * but if the buffer was filled with garbage, the usual LINETERM might be missing, so font might not be set. */ - for (var iCol = 0; iCol < nCols; iCol++) { - data = this.abLineBuffer[iCol]; - if (!this.fCellCacheValid || data !== this.aCellCache[iCell]) { - /* - * TODO: If bit 8 is set, we must select a different font variation, depending on which per-character - * screen attribute is currently enabled (ie, reverse video or underline). - */ - this.updateChar(font, iCol, nRows, data, this.contextBuffer); - cUpdated++; + if (font >= 0) { + for (var iCol = 0; iCol < nCols; iCol++) { + data = this.abLineBuffer[iCol]; + if (!this.fCellCacheValid || data !== this.aCellCache[iCell]) { + this.updateChar(font, iCol, nRows, data, this.contextBuffer); + cUpdated++; + } + iCell++; } - iCell++; } nRows++; } @@ -1090,7 +1090,7 @@ Video.prototype.updateScreen = function(n) this.printMessage("updateScreen(" + n + "): clean=" + fClean + ", update=" + fUpdate + ", cycles=" + nCycles + ", delta=" + nCyclesDelta); } - if (!fUpdate || this.chipset && !this.chipset.isVideoEnabled()) { + if (!fUpdate) { return; }