diff --git a/devices/pc8080/machine/vt100/machine.xml b/devices/pc8080/machine/vt100/machine.xml index b8641c7c5..b873cd8a4 100644 --- a/devices/pc8080/machine/vt100/machine.xml +++ b/devices/pc8080/machine/vt100/machine.xml @@ -16,7 +16,8 @@ + - + diff --git a/modules/pc8080/lib/bus.js b/modules/pc8080/lib/bus.js index 491317c07..19c95d33f 100644 --- a/modules/pc8080/lib/bus.js +++ b/modules/pc8080/lib/bus.js @@ -794,8 +794,10 @@ Bus.prototype.addPortInputNotify = function(start, end, fn) Bus.prototype.addPortInputTable = function(component, table, offset) { if (offset === undefined) offset = 0; - for (var port in table) { - this.addPortInputNotify(+port + offset, +port + offset, table[port].bind(component)); + if (table) { + for (var port in table) { + this.addPortInputNotify(+port + offset, +port + offset, table[port].bind(component)); + } } }; @@ -951,8 +953,10 @@ Bus.prototype.addPortOutputNotify = function(start, end, fn) Bus.prototype.addPortOutputTable = function(component, table, offset) { if (offset === undefined) offset = 0; - for (var port in table) { - this.addPortOutputNotify(+port + offset, +port + offset, table[port].bind(component)); + if (table) { + for (var port in table) { + this.addPortOutputNotify(+port + offset, +port + offset, table[port].bind(component)); + } } }; diff --git a/modules/pc8080/lib/chipset.js b/modules/pc8080/lib/chipset.js index f65a96372..e65d05731 100644 --- a/modules/pc8080/lib/chipset.js +++ b/modules/pc8080/lib/chipset.js @@ -67,7 +67,8 @@ function ChipSet(parmsChipSet) Component.notice("Unrecognized ChipSet model: " + model); } - this.model = ChipSet.MODELS[model] || ChipSet.SI_1978.MODEL; + this.config = ChipSet.MODELS[model] || ChipSet.SI1978; + this.model = this.config.MODEL; this.bSwitches = this.parseDIPSwitches(parmsChipSet['swDIP']); @@ -104,9 +105,9 @@ function ChipSet(parmsChipSet) Component.subclass(ChipSet); -ChipSet.SI_1978 = { +ChipSet.SI1978 = { MODEL: 1978.1, - STATUS0: { // NOTE: STATUS0 not used by the SI_1978 ROMs; refer to STATUS1 instead + STATUS0: { // NOTE: STATUS0 not used by the SI1978 ROMs; refer to STATUS1 instead PORT: 0, DIP4: 0x01, // self-test request at power up? FIRE: 0x10, // 1 = fire @@ -165,11 +166,22 @@ ChipSet.SI_1978 = { } }; +ChipSet.VT100 = { + MODEL: 100.0, + BRIGHTNESS_LATCH: { + PORT: 0x42 // write-only + }, + NVR_LATCH: { + PORT: 0x62 // write-only + } +}; + /* * Supported model strings */ ChipSet.MODELS = { - "SI1978": ChipSet.SI_1978.MODEL + "SI1978": ChipSet.SI1978, + "VT100": ChipSet.VT100 }; /** @@ -227,10 +239,8 @@ ChipSet.prototype.initBus = function(cmp, bus, cpu, dbg) this.cpu = cpu; this.dbg = dbg; this.cmp = cmp; - if (this.model == ChipSet.SI_1978.MODEL) { - bus.addPortInputTable(this, ChipSet.aPortInput); - bus.addPortOutputTable(this, ChipSet.aPortOutput); - } + bus.addPortInputTable(this, this.config.portsInput); + bus.addPortOutputTable(this, this.config.portsOutput); }; /** @@ -266,6 +276,21 @@ ChipSet.prototype.powerDown = function(fSave, fShutdown) return fSave? this.save() : true; }; +ChipSet.SI1978.init = [ + [ + ChipSet.SI1978.STATUS0.ALWAYS_SET, + ChipSet.SI1978.STATUS1.ALWAYS_SET, + ChipSet.SI1978.STATUS2.ALWAYS_SET, + 0, 0, 0, 0 + ] +]; + +ChipSet.VT100.init = [ + [ + 0, 0 + ] +]; + /** * reset() * @@ -273,12 +298,9 @@ ChipSet.prototype.powerDown = function(fSave, fShutdown) */ ChipSet.prototype.reset = function() { - this.bStatus0 = ChipSet.SI_1978.STATUS0.ALWAYS_SET; - this.bStatus1 = ChipSet.SI_1978.STATUS1.ALWAYS_SET; - this.bStatus2 = ChipSet.SI_1978.STATUS2.ALWAYS_SET; - this.wShiftData = 0; - this.bShiftCount = 0; - this.bSound1 = this.bSound2 = 0; + if (!this.restore(this.config.init)) { + this.notice("reset error"); + } }; /** @@ -292,8 +314,13 @@ ChipSet.prototype.reset = function() ChipSet.prototype.save = function() { var state = new State(this); - if (this.model == ChipSet.SI_1978.MODEL) { + switch(this.model) { + case ChipSet.SI1978.MODEL: 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]); + break; } return state.data(); }; @@ -309,18 +336,25 @@ ChipSet.prototype.save = function() */ ChipSet.prototype.restore = function(data) { - var a, i; - a = data[0]; - if (this.model == ChipSet.SI_1978.MODEL) { - this.bStatus0 = a[0]; - this.bStatus1 = a[1]; - this.bStatus2 = a[2]; - this.wShiftData = a[3]; - this.bShiftCount = a[4]; - this.bSound1 = a[5]; - this.bSound2 = a[6]; + var a; + if (data && (a = data[0]) && a.length) { + switch(this.model) { + case ChipSet.SI1978.MODEL: + this.bStatus0 = a[0]; + this.bStatus1 = a[1]; + this.bStatus2 = a[2]; + this.wShiftData = a[3]; + this.bShiftCount = a[4]; + this.bSound1 = a[5]; + this.bSound2 = a[6]; + return true; + case ChipSet.VT100.MODEL: + this.bBrightnessLatch = a[0]; + this.bNVRLatch = a[1]; + return true; + } } - return true; + return false; }; /** @@ -519,20 +553,45 @@ ChipSet.prototype.outSIWatchdog = function(port, b, addrFrom) this.printMessageIO(port, b, addrFrom, "WATCHDOG", null, true); }; -/* - * Port input notification tables +/** + * outVT100BrightnessLatch(port, b, addrFrom) + * + * @this {ChipSet} + * @param {number} port (0x42) + * @param {number} b + * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port) */ -ChipSet.aPortInput = { +ChipSet.prototype.outVT100BrightnessLatch = function(port, b, addrFrom) +{ + this.printMessageIO(port, b, addrFrom, "BRIGHTNESS.LATCH", null, true); + this.bBrightnessLatch = b; +}; + +/** + * outVT100BrightnessLatch(port, b, addrFrom) + * + * @this {ChipSet} + * @param {number} port (0x62) + * @param {number} b + * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port) + */ +ChipSet.prototype.outVT100NVRLatch = function(port, b, addrFrom) +{ + this.printMessageIO(port, b, addrFrom, "NVR.LATCH", null, true); + this.bNVRLatch = b; +}; + +/* + * Port notification tables + */ +ChipSet.SI1978.portsInput = { 0x00: ChipSet.prototype.inSIStatus0, 0x01: ChipSet.prototype.inSIStatus1, 0x02: ChipSet.prototype.inSIStatus2, 0x03: ChipSet.prototype.inSIShiftResult }; -/* - * Port output notification tables - */ -ChipSet.aPortOutput = { +ChipSet.SI1978.portsOutput = { 0x02: ChipSet.prototype.outSIShiftCount, 0x03: ChipSet.prototype.outSISound1, 0x04: ChipSet.prototype.outSIShiftData, @@ -540,6 +599,14 @@ ChipSet.aPortOutput = { 0x06: ChipSet.prototype.outSIWatchdog }; +ChipSet.VT100.portsInput = { +}; + +ChipSet.VT100.portsOutput = { + 0x42: ChipSet.prototype.outVT100BrightnessLatch, + 0x62: ChipSet.prototype.outVT100NVRLatch +}; + /** * ChipSet.init() * diff --git a/modules/pc8080/lib/keyboard.js b/modules/pc8080/lib/keyboard.js index 9bc020ab9..bbf759906 100644 --- a/modules/pc8080/lib/keyboard.js +++ b/modules/pc8080/lib/keyboard.js @@ -415,27 +415,27 @@ Keyboard.prototype.onSoftKeyDown = function(sSoftCode, fDown) if (this.chipset) { switch(sSoftCode) { case '1p': - this.chipset.updateStatus1(ChipSet.SI_1978.STATUS1.P1, fDown); + this.chipset.updateStatus1(ChipSet.SI1978.STATUS1.P1, fDown); break; case '2p': - this.chipset.updateStatus1(ChipSet.SI_1978.STATUS1.P2, fDown); + this.chipset.updateStatus1(ChipSet.SI1978.STATUS1.P2, fDown); break; case 'coin': - this.chipset.updateStatus1(ChipSet.SI_1978.STATUS1.CREDIT, fDown); + this.chipset.updateStatus1(ChipSet.SI1978.STATUS1.CREDIT, fDown); break; case 'left': - this.chipset.updateStatus1(ChipSet.SI_1978.STATUS1.P1_LEFT, fDown); + this.chipset.updateStatus1(ChipSet.SI1978.STATUS1.P1_LEFT, fDown); break; case 'right': - this.chipset.updateStatus1(ChipSet.SI_1978.STATUS1.P1_RIGHT, fDown); + this.chipset.updateStatus1(ChipSet.SI1978.STATUS1.P1_RIGHT, fDown); break; case 'fire': - this.chipset.updateStatus1(ChipSet.SI_1978.STATUS1.P1_FIRE, fDown); + this.chipset.updateStatus1(ChipSet.SI1978.STATUS1.P1_FIRE, fDown); break; } } diff --git a/modules/pc8080/lib/video.js b/modules/pc8080/lib/video.js index 89e62e133..5d4e11549 100644 --- a/modules/pc8080/lib/video.js +++ b/modules/pc8080/lib/video.js @@ -393,7 +393,7 @@ Video.prototype.initBus = function(cmp, bus, cpu, dbg) if (!this.nFormat) { this.chipset = cmp.getMachineComponent("ChipSet"); - if (this.chipset && this.chipset.model == ChipSet.SI_1978.MODEL) { + if (this.chipset && this.chipset.model == ChipSet.SI1978.MODEL) { this.nFormat = Video.FORMAT.SI1978; } } @@ -595,32 +595,15 @@ Video.prototype.powerUp = function(data, fRepower) if (DEBUG && this.nFormat == Video.FORMAT.VT100) { /* * Build a test screen in the VT100 frame buffer; we'll mimic the "SET-UP A" screen, since it uses - * all the font variations. + * all the font variations. The process involves iterating over 0-based row numbers -2 (or -5 if 50Hz + * operation is selected) through 24, checking aLineData for a matching row number, and converting the + * corresponding string(s) to appropriate byte values. Negative row numbers correspond to "fill lines" + * and do not require a row entry. If multiple strings are present for a given row, we invert the + * default character attribute for subsequent strings. An empty array ends the screen build process. */ var aLineData = { 0: [Video.VT100.FONT.DHIGH, 'SET-UP A'], 2: [Video.VT100.FONT.DWIDE, 'TO EXIT PRESS "SET-UP"'], - /* - 3: [Video.VT100.FONT.NORML, '4'], - 4: [Video.VT100.FONT.NORML, '5'], - 5: [Video.VT100.FONT.NORML, '6'], - 6: [Video.VT100.FONT.NORML, '7'], - 7: [Video.VT100.FONT.NORML, '8'], - 8: [Video.VT100.FONT.NORML, '9'], - 9: [Video.VT100.FONT.NORML, '10'], - 10: [Video.VT100.FONT.NORML, '11'], - 11: [Video.VT100.FONT.NORML, '12'], - 12: [Video.VT100.FONT.NORML, '13'], - 13: [Video.VT100.FONT.NORML, '14'], - 14: [Video.VT100.FONT.NORML, '15'], - 15: [Video.VT100.FONT.NORML, '16'], - 16: [Video.VT100.FONT.NORML, '17'], - 17: [Video.VT100.FONT.NORML, '18'], - 18: [Video.VT100.FONT.NORML, '19'], - 19: [Video.VT100.FONT.NORML, '20'], - 20: [Video.VT100.FONT.NORML, '21'], - 21: [Video.VT100.FONT.NORML, '22'], - */ 22: [Video.VT100.FONT.NORML, ' T T T T T T T T T'], 23: [Video.VT100.FONT.NORML, '1234567890', '1234567890', '1234567890', '1234567890', '1234567890', '1234567890', '1234567890', '1234567890'], 24: [] diff --git a/modules/shared/lib/component.js b/modules/shared/lib/component.js index 7eb2489ac..b7a214c5c 100644 --- a/modules/shared/lib/component.js +++ b/modules/shared/lib/component.js @@ -367,7 +367,7 @@ Component.notice = function(s, fPrintOnly, id) if (DEBUG) { Component.println(s, "notice", id); } - if (!fPrintOnly) web.alertUser(s); + if (!fPrintOnly) web.alertUser((id? (id + ": ") : "") + s); }; /** @@ -724,7 +724,7 @@ Component.prototype = { * @param {string} [id] */ this.notice = function noticePanel(s, fPrintOnly, id) { - this.println(s, "notice", id); + this.println(s, this.idComponent); }; } return true; @@ -838,7 +838,7 @@ Component.prototype = { * @param {string} [id] is the caller's ID, if any */ notice: function(s, fPrintOnly, id) { - Component.notice(s, fPrintOnly, id || this.id); + Component.notice(s, fPrintOnly, id || this.type); }, /** * setError(s)