From ea720ec2f185e38b6a42e193ceaff7988a383d8b Mon Sep 17 00:00:00 2001 From: Jeff Parsons Date: Thu, 5 Nov 2015 15:01:34 -0800 Subject: [PATCH] New icons --- modules/pcjs/lib/debugger.js | 116 +++++++++++++------ modules/pcjs/lib/fdc.js | 16 +-- modules/pcjs/lib/hdc.js | 56 ++++----- modules/pcjs/lib/interrupts.js | 65 +++++++++++ modules/shared/templates/common.html | 13 ++- server.js | 3 +- versions/icons/current/apple-touch-icon.png | Bin 0 -> 1197 bytes versions/icons/current/favicon.ico | Bin 0 -> 1150 bytes versions/icons/current/pc-favicon.png | Bin 0 -> 1310 bytes versions/icons/current/pc-icon-114.png | Bin 0 -> 2846 bytes versions/icons/current/pc-icon-120.png | Bin 0 -> 2855 bytes versions/icons/current/pc-icon-144.png | Bin 0 -> 2864 bytes versions/icons/current/pc-icon-152.png | Bin 0 -> 2874 bytes versions/icons/current/pc-icon-180.png | Bin 0 -> 2883 bytes versions/icons/current/pc-icon-192.png | Bin 0 -> 3117 bytes versions/icons/current/pc-icon-57.png | Bin 0 -> 2830 bytes versions/icons/current/pc-icon-72.png | Bin 0 -> 2835 bytes versions/icons/current/pc-icon-76.png | Bin 0 -> 2842 bytes versions/images/current/apple-touch-icon.png | Bin 17764 -> 0 bytes versions/images/current/favicon.ico | Bin 894 -> 0 bytes 20 files changed, 189 insertions(+), 80 deletions(-) create mode 100644 versions/icons/current/apple-touch-icon.png create mode 100644 versions/icons/current/favicon.ico create mode 100644 versions/icons/current/pc-favicon.png create mode 100644 versions/icons/current/pc-icon-114.png create mode 100644 versions/icons/current/pc-icon-120.png create mode 100644 versions/icons/current/pc-icon-144.png create mode 100644 versions/icons/current/pc-icon-152.png create mode 100644 versions/icons/current/pc-icon-180.png create mode 100644 versions/icons/current/pc-icon-192.png create mode 100644 versions/icons/current/pc-icon-57.png create mode 100644 versions/icons/current/pc-icon-72.png create mode 100644 versions/icons/current/pc-icon-76.png delete mode 100644 versions/images/current/apple-touch-icon.png delete mode 100644 versions/images/current/favicon.ico diff --git a/modules/pcjs/lib/debugger.js b/modules/pcjs/lib/debugger.js index 1882272d2..6e4f06df3 100644 --- a/modules/pcjs/lib/debugger.js +++ b/modules/pcjs/lib/debugger.js @@ -116,8 +116,8 @@ function Debugger(parmsDbg) * stepCPU() and checkInstruction() calls. nCycles is updated by every stepCPU() or stop() * call and simply represents the number of cycles performed by the last run of instructions. */ - this.nCycles = -1; - this.cOpcodes = -1; + this.nCycles = 0; + this.cOpcodes = this.cOpcodesStart = 0; /* * Default number of hex chars in a register and a linear address (ie, for real-mode); @@ -3358,7 +3358,9 @@ if (DEBUGGER) { sReplace = sAddr + ' "' + this.getSZ(dbgAddr) + '"'; s = s.replace('$' + sAddr, sReplace); i += sReplace.length; + continue; } + $i++; } /* * Replace every ^XXXX:XXXX, where XXXX:XXXX is a segmented address, with the FCB filename stored at that address. @@ -3372,7 +3374,9 @@ if (DEBUGGER) { sReplace = sAddr + ' "' + this.getSZ(dbgAddr, 11) + '"'; s = s.replace('^' + sAddr, sReplace); i += sReplace.length; + continue; } + i++; } return s; }; @@ -3757,7 +3761,7 @@ if (DEBUGGER) { Debugger.prototype.reset = function(fQuiet) { this.historyInit(); - this.cOpcodes = 0; + this.cOpcodes = this.cOpcodesStart = 0; this.sMessagePrev = null; this.nCycles = 0; this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS()); @@ -3852,7 +3856,7 @@ if (DEBUGGER) { sStopped += " ("; if (this.checksEnabled()) { sStopped += this.cOpcodes + " opcodes, "; - this.cOpcodes = 0; // remove this line if you want to maintain a longer total + this.cOpcodes = this.cOpcodesStart = 0; } sStopped += this.nCycles + " cycles, " + msTotal + " ms, " + nCyclesPerSecond + " hz)"; if (MAXDEBUG && this.chipset) { @@ -5271,7 +5275,7 @@ if (DEBUGGER) { }; /** - * parseReference(sValue) + * parseReference(s) * * Returns the given string with any "{expression}" sequences replaced with the value of the expression, * and any "[address]" references replaced with the contents of the address. Expressions are parsed BEFORE @@ -5279,23 +5283,50 @@ if (DEBUGGER) { * (define intermediate variables if needed). * * @this {Debugger} - * @param {string} sValue + * @param {string} s * @return {string} */ - Debugger.prototype.parseReference = function(sValue) + Debugger.prototype.parseReference = function(s) { var a; - while (a = sValue.match(/\{(.*?)}/)) { + while (a = s.match(/\{(.*?)}/)) { if (a[1].indexOf('{') >= 0) break; // unsupported nested brace(s) var value = this.parseExpression(a[1]); - sValue = sValue.replace('{' + a[1] + '}', value != null? str.toHex(value) : "undefined"); + s = s.replace('{' + a[1] + '}', value != null? str.toHex(value) : "undefined"); } - while (a = sValue.match(/\[(.*?)]/)) { + while (a = s.match(/\[(.*?)]/)) { if (a[1].indexOf('[') >= 0) break; // unsupported nested bracket(s) var dbgAddr = this.parseAddr(a[1]); - sValue = sValue.replace('[' + a[1] + ']', dbgAddr? str.toHex(this.getWord(dbgAddr), dbgAddr.fData32? 8 : 4) : "undefined"); + s = s.replace('[' + a[1] + ']', dbgAddr? str.toHex(this.getWord(dbgAddr), dbgAddr.fData32? 8 : 4) : "undefined"); } - return sValue; + return this.parseSysVars(s); + }; + + /** + * parseSysVars(s) + * + * Returns the given string with any recognized "$var" replaced with its value; eg: + * + * $ops: the number of opcodes executed since the last time it was displayed (or reset) + * + * @this {Debugger} + * @param {string} s + * @return {string} + */ + Debugger.prototype.parseSysVars = function(s) + { + var a; + while (a = s.match(/\$([a-z]+)/i)) { + var v = null; + switch(a[1].toLowerCase()) { + case "ops": + v = this.cOpcodes - this.cOpcodesStart; + break; + } + if (v == null) break; + s = s.replace(a[0], v.toString()); + } + return s; }; /** @@ -5339,7 +5370,7 @@ if (DEBUGGER) { var fDefined = false; if (value !== undefined) { fDefined = true; - sValue = str.toHexLong(value) + " (" + value + '=' + str.toBinBytes(value) + ')'; + sValue = str.toHexLong(value) + " " + value + ". (" + str.toBinBytes(value) + ")"; } sVar = (sVar != null? (sVar + ": ") : ""); this.println(sVar + sValue); @@ -5975,31 +6006,6 @@ if (DEBUGGER) { return; } - if (sCmd == "disk") { - /* - * The "disk" command is an undocumented command that's useful any time we're inside an internal - * DOS dispatch function where the registers are substantially the same as the corresponding INT 0x13; - * "m int on; m disk on" produces the same output, but only when an actual INT 0x13 instruction is used. - * Issuing this command at any other time should also be OK, but the results will be meaningless. - */ - this.messageInt(Interrupts.DISK, this.cpu.regLIP, true); - return; - } - - if (sCmd == "dos") { - /* - * The "dos" command is an undocumented command that's useful any time we're inside an internal - * DOS dispatch function where the registers are substantially the same as the corresponding INT 0x21; - * "m int on; m dos on" produces the same output, but only when an actual INT 0x21 instruction is used. - * Issuing this command at any other time should also be OK, but the results will be meaningless. - * - * NOTE: This is different from the "d dos" command, which invokes dumpDos() to dump DOS memory blocks, - * and is handled by one of the registered dumper functions below. - */ - this.messageInt(Interrupts.DOS, this.cpu.regLIP, true); - return; - } - /* * Transform a "ds" command into a "d desc" command (simply as shorthand); ditto for "dg" and "dl", * only because that's the syntax that WDEB386 used. I'm uncertain what WDEB386 would do with an LDT @@ -6288,6 +6294,34 @@ if (DEBUGGER) { } }; + /** + * doInt(sInt) + * + * Displays information about the given software interrupt (assuming that said interrupt is in progress). + * + * These messages also reset the system variable $ops (by updating cOpcodesStart), to make it easier to see + * how many opcodes were executed since the interrupt "started". + * + * @this {Debugger} + * @param {string|undefined} sInt + * @return {boolean} true if successful, false if not + */ + Debugger.prototype.doInt = function(sInt) + { + switch(this.parseValue(sInt)) { + case 0x13: + this.messageInt(Interrupts.DISK, this.cpu.regLIP, true); + this.cOpcodesStart = this.cOpcodes; + return true; + case 0x21: + this.messageInt(Interrupts.DOS, this.cpu.regLIP, true); + this.cOpcodesStart = this.cOpcodes; + return true; + default: + return false; + } + }; + /** * doVar(sCmd) * @@ -7540,6 +7574,12 @@ if (DEBUGGER) { } break; } + if (asArgs[0] == "int") { + if (!this.doInt(asArgs[1])) { + result = false; + } + break; + } this.doInput(asArgs[1]); break; case 'k': diff --git a/modules/pcjs/lib/fdc.js b/modules/pcjs/lib/fdc.js index b7d83bbd5..f2e6aa740 100644 --- a/modules/pcjs/lib/fdc.js +++ b/modules/pcjs/lib/fdc.js @@ -2037,7 +2037,7 @@ FDC.prototype.popCmd = function(name) if (DEBUG && this.messageEnabled(Messages.PORT | Messages.FDC)) { var bCmdMasked = bCmd & FDC.REG_DATA.CMD.MASK; if (!name && !this.regDataIndex && FDC.aCmdInfo[bCmdMasked]) name = FDC.aCmdInfo[bCmdMasked].name; - this.printMessage(this.id + ".popCmd(" + (name || this.regDataIndex) + "): " + str.toHexByte(bCmd), true); + this.printMessage(this.idComponent + ".popCmd(" + (name || this.regDataIndex) + "): " + str.toHexByte(bCmd), true); } this.regDataIndex++; return bCmd; @@ -2089,7 +2089,7 @@ FDC.prototype.beginResult = function() FDC.prototype.pushResult = function(bResult, name) { if (DEBUG && this.messageEnabled(Messages.PORT | Messages.FDC)) { - this.printMessage(this.id + ".pushResult(" + (name || this.regDataTotal) + "): " + str.toHexByte(bResult), true); + this.printMessage(this.idComponent + ".pushResult(" + (name || this.regDataTotal) + "): " + str.toHexByte(bResult), true); } this.assert(!(bResult & ~0xff)); this.regDataArray[this.regDataTotal++] = bResult; @@ -2156,7 +2156,7 @@ FDC.prototype.dmaRead = function(drive, b, done) /* * The DMA controller should be ASKING for data, not GIVING us data; this suggests an internal DMA miscommunication */ - if (DEBUG) this.printMessage(this.id + ".dmaRead(): invalid DMA acknowledgement"); + if (DEBUG) this.printMessage(this.idComponent + ".dmaRead(): invalid DMA acknowledgement"); done(-1, false); }; @@ -2175,7 +2175,7 @@ FDC.prototype.dmaWrite = function(drive, b) /* * The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication */ - if (DEBUG) this.printMessage(this.id + ".dmaWrite(): invalid DMA acknowledgement"); + if (DEBUG) this.printMessage(this.idComponent + ".dmaWrite(): invalid DMA acknowledgement"); return -1; }; @@ -2194,7 +2194,7 @@ FDC.prototype.dmaFormat = function(drive, b) /* * The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication */ - if (DEBUG) this.printMessage(this.id + ".dmaFormat(): invalid DMA acknowledgement"); + if (DEBUG) this.printMessage(this.idComponent + ".dmaFormat(): invalid DMA acknowledgement"); return -1; }; @@ -2215,7 +2215,7 @@ FDC.prototype.doRead = function(drive) if (drive.disk) { if (DEBUG && this.messageEnabled()) { - this.printMessage(this.id + ".doRead(CHS=" + drive.bCylinder + ':' + drive.bHead + ':' + drive.bSector + ",PBA=" + (drive.bCylinder * (drive.disk.nHeads * drive.disk.nSectors) + drive.bHead * drive.disk.nSectors + drive.bSector-1) + ')'); + this.printMessage(this.idComponent + ".doRead(CHS=" + drive.bCylinder + ':' + drive.bHead + ':' + drive.bSector + ",PBA=" + (drive.bCylinder * (drive.disk.nHeads * drive.disk.nSectors) + drive.bHead * drive.disk.nSectors + drive.bSector-1) + ')'); } drive.sector = null; drive.resCode = FDC.REG_DATA.RES.NONE; @@ -2238,7 +2238,7 @@ FDC.prototype.doWrite = function(drive) if (drive.disk) { if (DEBUG && this.messageEnabled()) { - this.printMessage(this.id + ".doWrite(CHS=" + drive.bCylinder + ':' + drive.bHead + ':' + drive.bSector + ",PBA=" + (drive.bCylinder * (drive.disk.nHeads * drive.disk.nSectors) + drive.bHead * drive.disk.nSectors + drive.bSector-1) + ')'); + this.printMessage(this.idComponent + ".doWrite(CHS=" + drive.bCylinder + ':' + drive.bHead + ':' + drive.bSector + ",PBA=" + (drive.bCylinder * (drive.disk.nHeads * drive.disk.nSectors) + drive.bHead * drive.disk.nSectors + drive.bSector-1) + ')'); } if (drive.disk.fWriteProtected) { drive.resCode = FDC.REG_DATA.RES.NOT_WRITABLE | FDC.REG_DATA.RES.INCOMPLETE; @@ -2441,7 +2441,7 @@ FDC.prototype.writeFormat = function(drive, b) drive.nBytes = 128 << drive.abFormat[3];// N (0 => 128, 1 => 256, 2 => 512, 3 => 1024) drive.cbFormat = 0; if (DEBUG && this.messageEnabled()) { - this.printMessage(this.id + ".writeFormat(head=" + str.toHexByte(drive.bHead) + ",cyl=" + str.toHexByte(drive.bCylinder) + ",sec=" + str.toHexByte(drive.bSector) + ",len=" + str.toHexWord(drive.nBytes) + ")"); + this.printMessage(this.idComponent + ".writeFormat(head=" + str.toHexByte(drive.bHead) + ",cyl=" + str.toHexByte(drive.bCylinder) + ",sec=" + str.toHexByte(drive.bSector) + ",len=" + str.toHexWord(drive.nBytes) + ")"); } for (var i = 0; i < drive.nBytes; i++) { if (this.writeData(drive, drive.bFiller) < 0) { diff --git a/modules/pcjs/lib/hdc.js b/modules/pcjs/lib/hdc.js index f7951d20d..57316a7b9 100644 --- a/modules/pcjs/lib/hdc.js +++ b/modules/pcjs/lib/hdc.js @@ -1459,7 +1459,7 @@ HDC.prototype.inATCByte = function(port, addrFrom) */ hdc.regStatus = HDC.ATC.STATUS.ERROR; hdc.regError = HDC.ATC.ERROR.NO_CHS; - if (DEBUG) hdc.printMessage(this.id + ".inATCByte(): read failed"); + if (DEBUG) hdc.printMessage(this.idComponent + ".inATCByte(): read failed"); } }, false); } else { @@ -1507,7 +1507,7 @@ HDC.prototype.outATCByte = function(port, bOut, addrFrom) this.regStatus = HDC.ATC.STATUS.ERROR; this.regError = HDC.ATC.ERROR.NO_CHS; if (DEBUG && this.messageEnabled()) { - this.printMessage(this.id + ".outATCByte(" + str.toHexByte(bOut) + "): write failed"); + this.printMessage(this.idComponent + ".outATCByte(" + str.toHexByte(bOut) + "): write failed"); } } else if (this.drive.ibSector == 1 || this.drive.ibSector == this.drive.cbSector) { @@ -1539,7 +1539,7 @@ HDC.prototype.outATCByte = function(port, bOut, addrFrom) * TODO: What to do about unexpected writes? The number of bytes has exceeded what the command specified. */ if (DEBUG && this.messageEnabled()) { - this.printMessage(this.id + ".outATCByte(" + str.toHexByte(bOut) + "): write exceeds count (" + this.drive.nBytes + ")"); + this.printMessage(this.idComponent + ".outATCByte(" + str.toHexByte(bOut) + "): write exceeds count (" + this.drive.nBytes + ")"); } } } else { @@ -1547,7 +1547,7 @@ HDC.prototype.outATCByte = function(port, bOut, addrFrom) * TODO: What to do about unexpected writes? No command was specified. */ if (DEBUG && this.messageEnabled()) { - this.printMessage(this.id + ".outATCByte(" + str.toHexByte(bOut) + "): write without command"); + this.printMessage(this.idComponent + ".outATCByte(" + str.toHexByte(bOut) + "): write without command"); } } }; @@ -1890,7 +1890,7 @@ HDC.prototype.doATC = function() } if (DEBUG && this.messageEnabled(Messages.HDC)) { - this.printMessage(this.id + ".doATC(" + str.toHexByte(bCmd) + "): " + HDC.aATCCommands[bCmd], true); + this.printMessage(this.idComponent + ".doATC(" + str.toHexByte(bCmd) + "): " + HDC.aATCCommands[bCmd], true); } switch (bCmd & HDC.ATC.COMMAND.MASK) { @@ -1904,7 +1904,7 @@ HDC.prototype.doATC = function() case HDC.ATC.COMMAND.READ_DATA: // 0x20 if (DEBUG && this.messageEnabled(Messages.HDC)) { - this.printMessage(this.id + ".doRead(" + iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + nSectors + ")", true); + this.printMessage(this.idComponent + ".doRead(" + iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + nSectors + ")", true); } /* * We're using a call to readData() that disables auto-increment, so that once we've got the first @@ -1936,7 +1936,7 @@ HDC.prototype.doATC = function() case HDC.ATC.COMMAND.WRITE_DATA: // 0x30 if (DEBUG && this.messageEnabled(Messages.HDC)) { - this.printMessage(this.id + ".doWrite(" + iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + nSectors + ")", true); + this.printMessage(this.idComponent + ".doWrite(" + iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + nSectors + ")", true); } this.regStatus = HDC.ATC.STATUS.DATA_REQ; break; @@ -1987,7 +1987,7 @@ HDC.prototype.doATC = function() default: if (DEBUG && this.messageEnabled()) { - this.printMessage(this.id + ".doATC(" + str.toHexByte(this.regCommand) + "): " + (bCmd < 0? ("invalid drive (" + iDrive + ")") : "unsupported operation")); + this.printMessage(this.idComponent + ".doATC(" + str.toHexByte(this.regCommand) + "): " + (bCmd < 0? ("invalid drive (" + iDrive + ")") : "unsupported operation")); if (MAXDEBUG && bCmd >= 0) this.dbg.stopCPU(); } break; @@ -2031,9 +2031,9 @@ HDC.prototype.setATCIRR = function(fWrite) * has a low tolerance for fast controller interrupts during multi-sector operations. */ this.chipset.setIRR(ChipSet.IRQ.ATC, 120); - if (DEBUG) this.printMessage(this.id + ".setATCIRR(): enabled", Messages.PIC | Messages.HDC); + if (DEBUG) this.printMessage(this.idComponent + ".setATCIRR(): enabled", Messages.PIC | Messages.HDC); } else { - if (DEBUG) this.printMessage(this.id + ".setATCIRR(): disabled", Messages.PIC | Messages.HDC); + if (DEBUG) this.printMessage(this.idComponent + ".setATCIRR(): disabled", Messages.PIC | Messages.HDC); } } }; @@ -2115,7 +2115,7 @@ HDC.prototype.doXTC = function() bDataStatus = HDC.XTC.DATA.STATUS.OK; if (!drive && this.iDriveAllowFail == iDrive) { this.iDriveAllowFail = -1; - if (DEBUG) this.printMessage(this.id + ".doXTC(): fake failure triggered"); + if (DEBUG) this.printMessage(this.idComponent + ".doXTC(): fake failure triggered"); bDataStatus = HDC.XTC.DATA.STATUS.ERROR; } this.beginResult(bDataStatus | bDrive); @@ -2152,7 +2152,7 @@ HDC.prototype.doXTC = function() case HDC.XTC.DATA.CMD.RECALIBRATE: // 0x01 drive.bControl = bControl; if (DEBUG && this.messageEnabled()) { - this.printMessage(this.id + ".doXTC(): drive " + iDrive + " control byte: " + str.toHexByte(bControl)); + this.printMessage(this.idComponent + ".doXTC(): drive " + iDrive + " control byte: " + str.toHexByte(bControl)); } this.beginResult(HDC.XTC.DATA.STATUS.OK | bDrive); break; @@ -2190,7 +2190,7 @@ HDC.prototype.doXTC = function() default: this.beginResult(HDC.XTC.DATA.STATUS.ERROR | bDrive); if (DEBUG && this.messageEnabled()) { - this.printMessage(this.id + ".doXTC(" + str.toHexByte(bCmdOrig) + "): " + (bCmd < 0? ("invalid drive (" + iDrive + ")") : "unsupported operation")); + this.printMessage(this.idComponent + ".doXTC(" + str.toHexByte(bCmdOrig) + "): " + (bCmd < 0? ("invalid drive (" + iDrive + ")") : "unsupported operation")); if (MAXDEBUG && bCmd >= 0) this.dbg.stopCPU(); } break; @@ -2211,7 +2211,7 @@ HDC.prototype.popCmd = function() if (bCmdIndex < this.regDataTotal) { bCmd = this.regDataArray[this.regDataIndex++]; if (DEBUG && this.messageEnabled((bCmdIndex > 0? Messages.PORT : 0) | Messages.HDC)) { - this.printMessage(this.id + ".popCmd(" + bCmdIndex + "): " + str.toHexByte(bCmd) + (!bCmdIndex && HDC.aXTCCommands[bCmd]? (" (" + HDC.aXTCCommands[bCmd] + ")") : ""), true); + this.printMessage(this.idComponent + ".popCmd(" + bCmdIndex + "): " + str.toHexByte(bCmd) + (!bCmdIndex && HDC.aXTCCommands[bCmd]? (" (" + HDC.aXTCCommands[bCmd] + ")") : ""), true); } } return bCmd; @@ -2226,13 +2226,7 @@ HDC.prototype.popCmd = function() HDC.prototype.beginResult = function(bResult) { this.regDataIndex = this.regDataTotal = 0; - - if (bResult !== undefined) { - if (DEBUG && this.messageEnabled()) { - this.printMessage(this.id + ".beginResult(" + str.toHexByte(bResult) + ")"); - } - this.pushResult(bResult); - } + if (bResult !== undefined) this.pushResult(bResult); /* * After the Execution phase (eg, DMA Terminal Count has occurred, or the EOT sector has been read/written), * an interrupt is supposed to occur, signaling the beginning of the Result Phase. Once the data "status byte" @@ -2251,7 +2245,7 @@ HDC.prototype.beginResult = function(bResult) HDC.prototype.pushResult = function(bResult) { if (DEBUG && this.messageEnabled((this.regDataTotal > 0? Messages.PORT : 0) | Messages.HDC)) { - this.printMessage(this.id + ".pushResult(" + this.regDataTotal + "): " + str.toHexByte(bResult), true); + this.printMessage(this.idComponent + ".pushResult(" + this.regDataTotal + "): " + str.toHexByte(bResult), true); } this.regDataArray[this.regDataTotal++] = bResult; }; @@ -2273,7 +2267,7 @@ HDC.prototype.dmaRead = function(drive, b, done) /* * The DMA controller should be ASKING for data, not GIVING us data; this suggests an internal DMA miscommunication */ - if (DEBUG) this.printMessage(this.id + ".dmaRead(): invalid DMA acknowledgement"); + if (DEBUG) this.printMessage(this.idComponent + ".dmaRead(): invalid DMA acknowledgement"); done(-1, false); }; @@ -2292,7 +2286,7 @@ HDC.prototype.dmaWrite = function(drive, b) /* * The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication */ - if (DEBUG) this.printMessage(this.id + ".dmaWrite(): invalid DMA acknowledgement"); + if (DEBUG) this.printMessage(this.idComponent + ".dmaWrite(): invalid DMA acknowledgement"); return -1; }; @@ -2311,7 +2305,7 @@ HDC.prototype.dmaWriteBuffer = function(drive, b) /* * The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication */ - if (DEBUG) this.printMessage(this.id + ".dmaWriteBuffer(): invalid DMA acknowledgement"); + if (DEBUG) this.printMessage(this.idComponent + ".dmaWriteBuffer(): invalid DMA acknowledgement"); return -1; }; @@ -2330,7 +2324,7 @@ HDC.prototype.dmaWriteFormat = function(drive, b) /* * The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication */ - if (DEBUG) this.printMessage(this.id + ".dmaWriteFormat(): invalid DMA acknowledgement"); + if (DEBUG) this.printMessage(this.idComponent + ".dmaWriteFormat(): invalid DMA acknowledgement"); return -1; }; @@ -2346,7 +2340,7 @@ HDC.prototype.doDMARead = function(drive, done) drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY; if (DEBUG && this.messageEnabled()) { - this.printMessage(this.id + ".doDMARead(" + drive.iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + ((drive.nBytes / drive.cbSector)|0) + ")"); + this.printMessage(this.idComponent + ".doDMARead(" + drive.iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + ((drive.nBytes / drive.cbSector)|0) + ")"); } if (drive.disk) { @@ -2390,7 +2384,7 @@ HDC.prototype.doDMAWrite = function(drive, done) drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY; if (DEBUG && this.messageEnabled()) { - this.printMessage(this.id + ".doDMAWrite(" + drive.iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + ((drive.nBytes / drive.cbSector)|0) + ")"); + this.printMessage(this.idComponent + ".doDMAWrite(" + drive.iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + ((drive.nBytes / drive.cbSector)|0) + ")"); } if (drive.disk) { @@ -2440,7 +2434,7 @@ HDC.prototype.doDMAWriteBuffer = function(drive, done) { drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY; - if (DEBUG) this.printMessage(this.id + ".doDMAWriteBuffer()"); + if (DEBUG) this.printMessage(this.idComponent + ".doDMAWriteBuffer()"); if (!drive.abSector || drive.abSector.length != drive.nBytes) { drive.abSector = new Array(drive.nBytes); @@ -2743,7 +2737,7 @@ HDC.prototype.writeFormat = function(drive, b) drive.cbFormat = 0; if (DEBUG && this.messageEnabled()) { - this.printMessage(this.id + ".writeFormat(" + drive.wCylinder + ":" + drive.bHead + ":" + drive.bSector + ":" + drive.nBytes + ")"); + this.printMessage(this.idComponent + ".writeFormat(" + drive.wCylinder + ":" + drive.bHead + ":" + drive.bSector + ":" + drive.nBytes + ")"); } for (var i = 0; i < drive.nBytes; i++) { @@ -2828,7 +2822,7 @@ HDC.prototype.intBIOSDiskette = function(addr) { var AH = this.cpu.regEAX >> 8; if ((!AH && this.chipset && this.chipset.checkIMR(ChipSet.IRQ.FDC))) { - if (DEBUG) this.printMessage(this.id + ".intBIOSDiskette(): skipping useless INT 0x40 diskette reset"); + if (DEBUG) this.printMessage(this.idComponent + ".intBIOSDiskette(): skipping useless INT 0x40 diskette reset"); return false; } return true; diff --git a/modules/pcjs/lib/interrupts.js b/modules/pcjs/lib/interrupts.js index d489f43c4..44be1ed4a 100644 --- a/modules/pcjs/lib/interrupts.js +++ b/modules/pcjs/lib/interrupts.js @@ -108,6 +108,71 @@ var Interrupts = { }; if (DEBUGGER) { + Interrupts.BIOS_DATA = { + 0x400: ["RS232_BASE",8], // BASE ADDRESSES OF RS232 ADAPTERS + 0x408: ["PRINTER_BASE",8], // BASE ADDRESSES OF PRINTER ADAPTERS + 0x410: ["EQUIP_FLAG",2], // INSTALLED HARDWARE FLAGS + 0x412: ["MFG_TST",1], // INITIALIZATION FLAGS + 0x413: ["MEMORY_SIZE",2], // BASE MEMORY SIZE IN K BYTES (X 1024) + 0x415: ["MFG_ERR_FLAG",2], // SCRATCHPAD FOR MANUFACTURING ERROR CODES + 0x417: ["KB_FLAG",1], // KEYBOARD SHIFT STATE AND STATUS FLAGS + 0x418: ["KB_FLAG_1",1], // SECOND BYTE OF KEYBOARD STATUS + 0x419: ["ALT_INPUT",1], // STORAGE FOR ALTERNATE KEY PAD ENTRY + 0x41A: ["BUFFER_HEAD",2], // POINTER TO HEAD OF KEYBOARD BUFFER + 0x41C: ["BUFFER_TAIL",2], // POINTER TO TAIL OF KEYBOARD BUFFER + 0x41E: ["KB_BUFFER",32], // ROOM FOR 15 SCAN CODE ENTRIES + 0x43E: ["SEEK_STATUS",1], // DRIVE RECALIBRATION STATUS (BIT 3-0 = DRIVE 3-0 RECALIBRATION BEFORE NEXT SEEK IF BIT IS = 0) + 0x43F: ["MOTOR_STATUS",1], // MOTOR STATUS (BIT 3-0 = DRIVE 3-0 CURRENTLY RUNNING, BIT 7 = CURRENT OPERATION IS A WRITE) + 0x440: ["MOTOR_COUNT",1], // TIME OUT COUNTER FOR MOTOR(S) TURN OFF + 0x441: ["DISKETTE_STATUS",1], // RETURN CODE STATUS BYTE + 0x442: ["NEC_STATUS",7], // STATUS BYTES FROM DISKETTE OPERATION + 0x449: ["CRT_MODE",1], // CURRENT DISPLAY MODE (TYPE) + 0x44A: ["CRT_COLS",2], // NUMBER OF COLUMNS ON SCREEN + 0x44C: ["CRT_LEN",2], // LENGTH OF REGEN BUFFER IN BYTES + 0x44E: ["CRT_START",2], // STARTING ADDRESS IN REGEN BUFFER + 0x450: ["CURSOR_POSN",16], // CURSOR FOR EACH OF UP TO 8 PAGES + 0x460: ["CURSOR_MODE",2], // CURRENT CURSOR MODE SETTING + 0x462: ["ACTIVE_PAGE",1], // CURRENT PAGE BEING DISPLAYED + 0x463: ["ADDR_6845",2], // BASE ADDRESS FOR ACTIVE DISPLAY CARD + 0x465: ["CRT_MODE_SET",1], // CURRENT SETTING OF THE 3X8 REGISTER + 0x466: ["CRT_PALETTE",1], // CURRENT PALETTE SETTING - COLOR CARD + 0x467: ["IO_ROM_INIT",2], // POINTER TO ROM INITIALIZATION ROUTINE + 0x469: ["IO_ROM_SEG",2], // POINTER TO I/O ROM SEGMENT + 0x46B: ["INTR_FLAG",1], // FLAG INDICATING AN INTERRUPT HAPPENED + 0x46C: ["TIMER_LOW",2], // LOW WORD OF TIMER COUNT + 0x46E: ["TIMER_HIGH",2], // HIGH WORD OF TIMER COUNT + 0x470: ["TIMER_OFL",1], // TIMER HAS ROLLED OVER SINCE LAST READ + 0x471: ["BIOS_BREAK",1], // BIT 7=1 IF BREAK KEY HAS BEEN PRESSED + 0x472: ["RESET_FLAG",2], // WORD=1234H IF KEYBOARD RESET UNDERWAY + 0x474: ["DISK_STATUS1",1], // FIXED DISK STATUS + 0x475: ["HF_NUM",1], // COUNT OF FIXED DISK DRIVES + 0x476: ["CONTROL_BYTE",1], // HEAD CONTROL BYTE + 0x477: ["PORT_OFF",1], // RESERVED (PORT OFFSET) + 0x478: ["PRINT_TIM_OUT",4], // TIME OUT COUNTERS FOR PRINTER RESPONSE + 0x47C: ["RS232_TIM_OUT",4], // TIME OUT COUNTERS FOR RS232 RESPONSE + 0x480: ["BUFFER_START",2], // OFFSET OF KEYBOARD BUFFER START + 0x482: ["BUFFER_END",2], // OFFSET OF END OF BUFFER + 0x484: ["ROWS",1], // ROWS ON THE ACTIVE SCREEN (LESS 1) + 0x485: ["POINTS",2], // BYTES PER CHARACTER + 0x487: ["INFO",1], // MODE OPTIONS + 0x488: ["INFO_3",3], // FEATURE BIT SWITCHES + 0x48B: ["LASTRATE",1], // LAST DISKETTE DATA RATE SELECTED + 0x48C: ["HF_STATUS",1], // STATUS REGISTER + 0x48D: ["HF_ERROR",1], // ERROR REGISTER + 0x48E: ["HF_INT_FLAG",1], // FIXED DISK INTERRUPT FLAG + 0x48F: ["HF_CNTRL",1], // COMBO FIXED DISK/DISKETTE CARD BIT 0=1 + 0x490: ["DSK_STATE",4], // DRIVE 0 MEDIA STATE, DRIVE 1 MEDIA STATE, DRIVE 0 OPERATION START STATE, DRIVE 1 OPERATION START STATE + 0x494: ["DSK_TRK",2], // DRIVE 0 PRESENT CYLINDER, DRIVE 1 PRESENT CYLINDER + 0x496: ["KB_FLAG_3",1], // KEYBOARD MODE STATE AND TYPE FLAGS + 0x497: ["KB_FLAG_2",1], // KEYBOARD LED FLAGS + 0x498: ["USER_FLAG",2], // OFFSET ADDRESS OF USERS WAIT FLAG + 0x49A: ["USER_FLAG_SEG",2], // SEGMENT ADDRESS OF USER WAIT FLAG + 0x49C: ["RTC_LOW",2], // LOW WORD OF USER WAIT FLAG + 0x49E: ["RTC_HIGH",2], // HIGH WORD OF USER WAIT FLAG + 0x4A0: ["RTC_WAIT_FLAG",1], // WAIT ACTIVE FLAG (01=BUSY, 80=POSTED) (00=POST ACKNOWLEDGED) + 0x4A1: ["NET",7], // RESERVED FOR NETWORK ADAPTERS + 0x4A8: ["SAVE_PTR",4] // POINTER TO EGA PARAMETER CONTROL BLOCK + }, /* * See Debugger.prototype.replaceRegs() for the rules governing how register contents are replaced in the strings below. * diff --git a/modules/shared/templates/common.html b/modules/shared/templates/common.html index 5be5136a5..11a37b307 100644 --- a/modules/shared/templates/common.html +++ b/modules/shared/templates/common.html @@ -9,7 +9,18 @@ - + + + + + + + + + + + + diff --git a/server.js b/server.js index f9f4d0d24..31b9ab138 100644 --- a/server.js +++ b/server.js @@ -123,8 +123,7 @@ app.use(function(req, res, next) { }); app.use(express.static(sServerRoot)); -/* Serve favicon at site root */ -app.use('/favicon.ico', express.static(path.join(sServerRoot, "versions/images/current/favicon.ico"))); +app.use('/favicon.ico', express.static(path.join(sServerRoot, "versions/icons/current/favicon.ico"))); app.use(slash()); var server = http.createServer(app).listen(app.get('port'), function() { diff --git a/versions/icons/current/apple-touch-icon.png b/versions/icons/current/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..899a4874bcd3ea568d800fd4feb83675d69ebc9e GIT binary patch literal 1197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z81_tJ3nIRD+5xzcF$@#f@i7EL>sd^Q;1whpd3^o;3KxS@gNuokUZcbjY zRfVk*ScMgk4HDK@QUEI{$+lIB@C{IK&M!(;Fx4~BGf=YQQczH^DN0GR3UYCSY6tRc zl`=|73as??%gf94%8m8%i_-NCEiEne4UF`SjC6r2bc-wVN)jt{^NN)rhQQ2mNi9w; z$}A|!%+FH*nVXoDUs__Tqy(}E4xsMLEr45;R}A$P(0}?Bi3R$GdItK~G?iqgA)JSz z3nYV6TWUon4s9SAh&FIwK-_2p3{flJ{FKbJN|(fvR68RBLsMNtLtO*Y5JO`tLqjWb za~pj$H3%PqbvqZOCYIzEh2-bw*ac)(q~_#;xC+L4CJ>#-@<>`izOeEy%1i|YFDMZ0 z3~lr=#L(3{=jRp_r4|>1)SE)pBa5M{4@xc0&nX2NADWk0VrK-^f+mcvD-t1ZXAaYY zEQqcl0-FY8K_m^JXs`l@Q-n)qZfYLbFNS6|`dB5s3S;ilj%%R8HRmo+8y)1eavg# zFyZuu$gSRwUtH&Vv1Fs``^83*s;tf@wC)zZ({f-7_GMtKd@4RWRbHjf`LCxNL;hr) z8_xwdNC${EaBqHGxRIe?k&KPI#Jpo0Jk8#HR}FJ_*ebNK`kt$%+4IZiUEH-h#OxX0 Xg&QRX{@7dtDnmS7{an^LB{Ts5bIX39 literal 0 HcmV?d00001 diff --git a/versions/icons/current/favicon.ico b/versions/icons/current/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bf33c84285e262fac0eec3a6379e004802734276 GIT binary patch literal 1150 zcmd6m!3u*w3`9rh&5Kaz*`uH4N35lv=AY@rWi*8DmhMR{?TInyIZZ@%8^t52APl0{14*OnZ4~Y?+y?y BX3YQq literal 0 HcmV?d00001 diff --git a/versions/icons/current/pc-favicon.png b/versions/icons/current/pc-favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..7db87d9f5715207c8a39e9402760d34fdb9b90d1 GIT binary patch literal 1310 zcmZ`(U1-x#6wa_y*EyXNhCd8L^hs&b^k+XI4Rnoj6+1`QL5HBG>D|n1a$}O(6cOiy z!bBZdm_r18(MLf9-GjaeA`bQ-J_tT3D0>i8kb%f_-kWw?EL|bZz2|)2{myrilc~Xh zqb=UOUV zZiJzfRN6`>j&m|pX(3Rqg+z#tJ2XfLY=iNonx3np+FacG&IH-wx_3u@dubdz=se% zv#42;?bFNyl|xp~5rHWiif$=TBk{RX2Ij2@MPZ?}U!_h<8C_S>%&IM9kii*-rTt7j z8nBfOXgISWEi13N((^{n@syPrkOL~vEEDnAx^k$uYsCMGv?aYF<}|V5jmMR9NnpZU z9=BjvQ!F9CJBDh*>m8}EVo=o$V48>~gsT*HtQMbMml3*FHQd2k!U;n`P9bPJ#d8TfnmKcLMXbkC+3~*r%#TBYWJ2E31$+!|O zVpitNd}bWTmg{MuXXd>7L*P8)3iC`|G>_f{E&;R3Xi=0bAO!qum}6PaA12w5vp{xh zFs=%4CT0N1f<_9$oZz@n@sfZS(d2;&%xlJxzE&7*Yk=d@;waz`_>@WH9%!~OC1p&y`&cZuFOB&(*3M)e)0AAg0S@2^ZS@zj?92f_=^=k LG9W(cJu~?a`w5v7 literal 0 HcmV?d00001 diff --git a/versions/icons/current/pc-icon-114.png b/versions/icons/current/pc-icon-114.png new file mode 100644 index 0000000000000000000000000000000000000000..ad67f3703169319d2b67a35a0eee1d90c32f29d1 GIT binary patch literal 2846 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 literal 0 HcmV?d00001 diff --git a/versions/icons/current/pc-icon-120.png b/versions/icons/current/pc-icon-120.png new file mode 100644 index 0000000000000000000000000000000000000000..377b483990f27d67b6d844d6153e5f297a745801 GIT binary patch literal 2855 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 FV1lT_TNVHS literal 0 HcmV?d00001 diff --git a/versions/icons/current/pc-icon-144.png b/versions/icons/current/pc-icon-144.png new file mode 100644 index 0000000000000000000000000000000000000000..4ceb1f700e5c403242e61c7e974aedf5efe3087b GIT binary patch literal 2864 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 hQFP;)h=_P({W~e9C<6$`DGmSt05LMWdh_Uh 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 literal 0 HcmV?d00001 diff --git a/versions/icons/current/pc-icon-76.png b/versions/icons/current/pc-icon-76.png new file mode 100644 index 0000000000000000000000000000000000000000..8f67b8a15958e67a0db59111bd5e7d40c444ede1 GIT binary patch literal 2842 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 literal 0 HcmV?d00001 diff --git a/versions/images/current/apple-touch-icon.png b/versions/images/current/apple-touch-icon.png deleted file mode 100644 index 7c5af016763638ac2fa74eb293bd4ed6362ae456..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17764 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 Hu0mjfcFL*; diff --git a/versions/images/current/favicon.ico b/versions/images/current/favicon.ico deleted file mode 100644 index 484ed55a84a73af55f935ee0fffd53c90e806c2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 894 zcmZQzU<5(|0R|u`!H~hsz#zuJz@P!dKp_SNAO?xUfG{@$0|>)_i;If}3=m|yy1D|@ z5>y6P15pp>LhQk#9j=~8EkN~nOoLd5Y}BaxkwXKMJq*Gh=mnAh1H*g=O#BrnHW`Q) NpkXy29~rN8002W5qYnT8