404
Looks like we've got some broken links.Take me home.
diff --git a/404.html b/404.html new file mode 100644 index 0000000..f2079ac --- /dev/null +++ b/404.html @@ -0,0 +1,22 @@ + + +
+ + +")]),e._v(" alternatively.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"international-keyboard-support-enhancement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#international-keyboard-support-enhancement"}},[this._v("#")]),this._v(" International keyboard support "),t("em",[this._v("(enhancement)")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The original VT100 keyboard was essentially a US keyboard with a small concession to the UK in that the "),t("code",[this._v("<3>")]),this._v(" combination could be configured to transmit a "),t("code",[this._v("£")]),this._v(" symbol instead of the usual "),t("code",[this._v("#")]),this._v(". This is also true of the VT132, see US/UK setting in SET-UP B.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("code",[this._v("SET-UP A")]),this._v(" and "),t("code",[this._v("SET-UP B")]),this._v(" screens are faithful to the original VT100 with the following exceptions:")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"online-local-indicator"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#online-local-indicator"}},[this._v("#")]),this._v(" ONLINE/LOCAL indicator")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("All setup screens display either "),t("code",[this._v("ONLINE")]),this._v(" or "),t("code",[this._v("LOCAL")]),this._v(" at the right-hand-end of line 4 to compensate for the absence of indicator LEDs for this purpose on the PC keyboard.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"set-up-screen-help-enhancement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-up-screen-help-enhancement"}},[this._v("#")]),this._v(" SET-UP screen HELP "),t("em",[this._v("(enhancement)")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("All setup screen include integrated help that can be displayed by pressing function key "),t("code",[this._v("F1")]),this._v(" on each setup screen.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("code",[this._v("SET-UP A")]),this._v(" and "),t("code",[this._v("SET-UP B")]),this._v(" screens with integrated help are shown here:")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(231),alt:"SET-UP-A-HELP"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(232),alt:"SET-UP-B-HELP"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"set-up-a-reset-tab-stops-enhancement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-up-a-reset-tab-stops-enhancement"}},[this._v("#")]),this._v(" SET-UP A - reset Tab-Stops "),t("em",[this._v("(enhancement)")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The VT132 implements the key combination "),t("code",[this._v(" ")]),this._v(" to reset tab-stops to the default 8 character spacing. This was a feature on the VT102.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"set-up-b-t-r-speed"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-up-b-t-r-speed"}},[this._v("#")]),this._v(" SET-UP B - T/R Speed")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The original VT100 provided support for independent baud rates for Transmit "),t("code",[this._v("T SPEED")]),this._v(" and Receive "),t("code",[this._v("R SPEED")]),this._v(" speeds from 50 to 19200 baud.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The VT132 supports baud rates from 300 to 115200 and the Transmit and Receive speed must be the same. The available speeds are "),t("code",[this._v("300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200")]),this._v(" corresponding to the speeds supported by most serial interface cards based on the available clock settings.")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("p",[e._v("Consequently in "),s("code",[e._v("SET-UP B")]),e._v(", both the "),s("code",[e._v("7")]),e._v(" and the "),s("code",[e._v("8")]),e._v(" key will cycle through the available baud rates changing both "),s("code",[e._v("T SPEED")]),e._v(" and "),s("code",[e._v("R SPEED")]),e._v(" simultaneously.")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[s("code",[e._v("7")]),e._v(" will cycle "),s("em",[e._v("downwards")]),e._v(" through the available speeds, rolling back to "),s("code",[e._v("115200")]),e._v(" after "),s("code",[e._v("300")])]),e._v(" "),s("li",[s("code",[e._v("8")]),e._v(" will cycle "),s("em",[e._v("upwards")]),e._v(" through the available speeds, rolling back to "),s("code",[e._v("300")]),e._v(" after "),s("code",[e._v("115200")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"set-up-b-clear-nvr-reset-to-factory-defaults-enhancement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-up-b-clear-nvr-reset-to-factory-defaults-enhancement"}},[this._v("#")]),this._v(" SET-UP B - clear NVR (reset to factory defaults) "),t("em",[this._v("(enhancement)")])])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("p",[s("strong",[e._v("Only")]),e._v(" on the "),s("code",[e._v("SET-UP B")]),e._v(" screen the key combination "),s("code",[e._v(" ")]),e._v(" will clear the NVR for the VT100.\nThis will cause a return to factory defaults on the next power-up, hardware reset, soft reset "),s("code",[e._v("0")]),e._v(" or recall "),s("code",[e._v(" ")]),e._v(".")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"set-up-b-advance-to-next-setup-screen-enhancement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-up-b-advance-to-next-setup-screen-enhancement"}},[this._v("#")]),this._v(" SET-UP B - advance to next setup screen "),t("em",[this._v("(enhancement)")])])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("p",[e._v("On the "),s("code",[e._v("SET-UP B")]),e._v(" screen, pressing "),s("code",[e._v("5")]),e._v(" will advance to the "),s("code",[e._v("SET-UP C")]),e._v(" and then onto the "),s("code",[e._v("SET-UP D")]),e._v(" screens, before returning to the "),s("code",[e._v("SET-UP A")]),e._v(" screen.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The definition and function of each feature on the "),t("code",[this._v("SET-UP A")]),this._v(" and "),t("code",[this._v("SET-UP B")]),this._v(" screens is faithful to the original VT100, as described in the User Guide, with the following exceptions:")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"bits-per-character-enhancement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bits-per-character-enhancement"}},[this._v("#")]),this._v(" BITS PER CHARACTER "),t("em",[this._v("(enhancement)")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("code",[this._v("bits per character")]),this._v(" for the VT132 is fixed at 8, enabling 8-bit extended ASCII modes of operation")])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[this._v("bit 8 "),t("strong",[this._v("is not set to space (or 0)")]),this._v(" for characters transmitted")]),this._v(" "),t("li",[this._v("bit 8 "),t("strong",[this._v("is not ignored")]),this._v(" for characters received")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"interlace"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#interlace"}},[this._v("#")]),this._v(" INTERLACE")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"parity"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#parity"}},[this._v("#")]),this._v(" PARITY")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("code",[this._v("parity")]),this._v(" for the VT132 is fixed to "),t("code",[this._v("None")]),this._v(" given that the "),t("code",[this._v("bits per character")]),this._v(" is fixed at 8.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"parity-sense-odd-even"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#parity-sense-odd-even"}},[this._v("#")]),this._v(" PARITY SENSE (ODD/EVEN)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("code",[this._v("parity sense")]),this._v(" for the VT132 is not relevant as the "),t("code",[this._v("parity")]),this._v(" is fixed to "),t("code",[this._v("None")]),this._v(".")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"power-enhancement-now-backspace-del-bs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#power-enhancement-now-backspace-del-bs"}},[this._v("#")]),this._v(" POWER "),t("em",[this._v("(enhancement)")]),this._v(" now: Backspace DEL/BS")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("code",[this._v("power")]),this._v(" line frequency of the original VT100 (50Hz or 60Hz) is not relevant to the VT132.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("This 'soft switch' bit on the "),t("code",[this._v("SET-UP B")]),this._v(" screen has been replaced with a bit that shows/sets the current "),t("a",{attrs:{href:"###"}},[this._v("DECBKM")]),this._v(" Backarrow Key Mode "),t("em",[this._v("(enhancement)")]),this._v(".")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"bold-is-bright-enhancement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bold-is-bright-enhancement"}},[this._v("#")]),this._v(" BOLD is BRIGHT "),t("em",[this._v("(enhancement)")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Sets the "),t("code",[this._v("SGR")]),this._v(" attribute "),t("strong",[this._v("Bold")]),this._v(" to be rendered "),t("em",[this._v("bright")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"bold-is-thick-enhancement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bold-is-thick-enhancement"}},[this._v("#")]),this._v(" BOLD is THICK "),t("em",[this._v("(enhancement)")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Sets the "),t("code",[this._v("SGR")]),this._v(" attribute "),t("strong",[this._v("Bold")]),this._v(" to be rendered "),t("em",[this._v("double thick")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"set-ansi-sys-compliance-enhancement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-ansi-sys-compliance-enhancement"}},[this._v("#")]),this._v(" Set ANSI.SYS compliance "),t("em",[this._v("(enhancement)")])])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("li",[e._v("The "),s("strong",[e._v("ED")]),e._v(" escape sequence "),s("code",[e._v("ESC [ 2 J")]),e._v(" both clears the the screen "),s("strong",[e._v("and")]),e._v(" homes the cursor (equiavlent to a following "),s("code",[e._v("ESC [ H")]),e._v(")")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[e._v("The "),s("em",[e._v('"used"')]),e._v(" control characters that will "),s("strong",[e._v("not")]),e._v(" print a glyph/character in this mode are:\n"),s("ul",[s("li",[e._v("BEL "),s("code",[e._v("^G")])]),e._v(" "),s("li",[e._v("HT "),s("code",[e._v("^I")])]),e._v(" "),s("li",[e._v("LF "),s("code",[e._v("^J")])]),e._v(" "),s("li",[e._v("VT "),s("code",[e._v("^K")])]),e._v(" "),s("li",[e._v("FF "),s("code",[e._v("^L")])]),e._v(" "),s("li",[e._v("CR "),s("code",[e._v("^M")])]),e._v(" "),s("li",[e._v("ESC "),s("code",[e._v("^[")])])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"set-numlock-on-reset-enhancement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-numlock-on-reset-enhancement"}},[this._v("#")]),this._v(" Set NUMLOCK on Reset "),t("em",[this._v("(enhancement)")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Sets the NUMLOCK key "),t("strong",[this._v("on")]),this._v(" whenever settings are restored from NVR.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"screen-brightness"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#screen-brightness"}},[this._v("#")]),this._v(" SCREEN BRIGHTNESS")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The VT132 "),t("strong",[this._v("does not implement")]),this._v(" the "),t("code",[this._v("screen brightness")]),this._v(" feature of the original VT100.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The self testing described in this section of the VT100 User Guide "),t("strong",[this._v("is not implemented")]),this._v(" by the VT132.")])}],r=s(0),i=Object(r.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"content"},[e._m(0),e._v(" "),e._m(1),e._v(" "),s("p",[e._v("The VT132 faithfully implements almost all of the features of the original Digital Equipment Corporation (DEC) VT100, with the Advanced Video Option installed.")]),e._v(" "),s("p",[e._v("To this a range of enhancements have been added")]),e._v(" "),e._m(2),e._v(" "),s("p",[e._v("A good reference for an owner of a VT100 (especially getting started with the Setup screens) is the original "),s("a",{attrs:{href:"https://vt100.net/docs/vt100-ug/contents.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("VT100 Users Guide"),s("OutboundLink")],1),e._v(" over at "),s("a",{attrs:{href:"https://vt100.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("VT100.net"),s("OutboundLink")],1),e._v(". Details of what the "),s("a",{attrs:{href:"https://vt100.net/docs/vt100-ug/chapter4.html#S4.1",target:"_blank",rel:"noopener noreferrer"}},[e._v("Advanced Video Option"),s("OutboundLink")],1),e._v(" adds can be found here also.")]),e._v(" "),s("p",[e._v("The remainder of this section will largely focus on where the VT132 implementation of the VT100 differs to an original VT100.")]),e._v(" "),e._m(3),e._v(" "),s("h2",{attrs:{id:"part-1-keyboard-control-and-indictors"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#part-1-keyboard-control-and-indictors"}},[e._v("#")]),e._v(" "),s("a",{attrs:{href:"https://vt100.net/docs/vt100-ug/chapter1.html#S1.1",target:"_blank",rel:"noopener noreferrer"}},[e._v("Part 1 - Keyboard Control and Indictors"),s("OutboundLink")],1)]),e._v(" "),s("p",[e._v("The DEC VT100 keyboard differs from a modern PC (PS/2) keyboard in a numbers of ways. The following keyboard mappings are made for keys that were present on the VT100 but not available or not the same on a PC keyboard.")]),e._v(" "),e._m(4),e._v(" "),e._m(5),e._v(" "),e._m(6),e._v(" "),e._m(7),e._v(" "),e._m(8),e._v(" "),e._m(9),e._v(" "),e._m(10),e._v(" "),e._m(11),e._v(" "),e._m(12),e._v(" "),e._m(13),e._v(" "),e._m(14),e._v(" "),e._m(15),e._v(" "),e._m(16),e._v(" "),e._m(17),e._v(" "),s("p",[e._v("In addition to the standard US PC keyboard layout, the VT132 also supports international keyboards for the UK, France, Germany, Italy and Sweden (with more to follow), see "),s("router-link",{attrs:{to:"./setup-d/#international-keyboard-support"}},[e._v("Keyboard in SET-UP D")]),e._v(".")],1),e._v(" "),s("h2",{attrs:{id:"part-2-set-up-mode"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#part-2-set-up-mode"}},[e._v("#")]),e._v(" "),s("a",{attrs:{href:"https://vt100.net/docs/vt100-ug/chapter1.html#S1.2",target:"_blank",rel:"noopener noreferrer"}},[e._v("Part 2 - Set-Up Mode"),s("OutboundLink")],1)]),e._v(" "),e._m(18),e._v(" "),e._m(19),e._v(" "),e._m(20),e._v(" "),e._m(21),e._v(" "),e._m(22),e._v(" "),e._m(23),e._v(" "),e._m(24),e._v(" "),e._m(25),e._v(" "),e._m(26),e._v(" "),e._m(27),e._v(" "),e._m(28),e._v(" "),e._m(29),e._v(" "),e._m(30),e._v(" "),e._m(31),e._v(" "),e._m(32),e._v(" "),e._m(33),e._v(" "),e._m(34),e._v(" "),e._m(35),e._v(" "),e._m(36),e._v(" "),s("p",[e._v("See the separate sections on the features of the "),s("router-link",{attrs:{to:"./setup-c/"}},[e._v("SET-UP C")]),e._v(" and "),s("router-link",{attrs:{to:"./setup-d/"}},[e._v("SET-UP D")]),e._v(" screens.")],1),e._v(" "),s("h3",{attrs:{id:"set-up-c-code-pages-ansi-colours-system-information-enhancement"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#set-up-c-code-pages-ansi-colours-system-information-enhancement"}},[e._v("#")]),e._v(" "),s("router-link",{attrs:{to:"./setup-c/"}},[e._v("SET-UP C - Code Pages, ANSI colours, System Information "),s("em",[e._v("(enhancement)")])])],1),e._v(" "),s("h3",{attrs:{id:"set-up-d-multinational-character-set-nrcs-international-keyboards-personalities-enhancement"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#set-up-d-multinational-character-set-nrcs-international-keyboards-personalities-enhancement"}},[e._v("#")]),e._v(" "),s("router-link",{attrs:{to:"./setup-d/"}},[e._v("SET-UP D - Multinational Character Set, NRCS, International Keyboards, Personalities "),s("em",[e._v("(enhancement)")])])],1),e._v(" "),s("h2",{attrs:{id:"part-3-–-definition-of-each-set-up-feature"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#part-3-–-definition-of-each-set-up-feature"}},[e._v("#")]),e._v(" "),s("a",{attrs:{href:"https://www.vt100.net/docs/vt100-ug/chapter1.html#S1.3",target:"_blank",rel:"noopener noreferrer"}},[e._v("Part 3 – Definition of Each SET-UP Feature"),s("OutboundLink")],1)]),e._v(" "),e._m(37),e._v(" "),e._m(38),e._v(" "),e._m(39),e._v(" "),e._m(40),e._v(" "),e._m(41),e._v(" "),s("p",[e._v("Interlace is simulated by rendering blank scan lines in the doubled scan lines normally rendered in non-interlace mode.")]),e._v(" "),e._m(42),e._v(" "),e._m(43),e._v(" "),e._m(44),e._v(" "),e._m(45),e._v(" "),e._m(46),e._v(" "),e._m(47),e._v(" "),e._m(48),e._v(" "),e._m(49),e._v(" "),e._m(50),e._v(" "),e._m(51),e._v(" "),e._m(52),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),s("p",[e._v("One or both of these attributes must be set, it is not possible to clear them both.")]),e._v(" "),s("p",[e._v("The default is that they are "),s("strong",[e._v("both")]),e._v(" set, making *"),s("em",[e._v("bold")]),e._v(" both "),s("em",[e._v("bright")]),e._v(" and "),s("em",[e._v("thick")]),e._v("\nIn ANSI.SYS mode it is typical to set only "),s("em",[e._v("bright")]),e._v(". This is done automatically by the "),s("strong",[e._v("Ansi.sys")]),e._v(" macro in the Quick Menu (see: "),s("router-link",{attrs:{to:"./quick-menu/#ansi-sys-emulation-mode"}},[e._v("Ansi.sys emulation mode")]),e._v(")")],1)]),e._v(" "),e._m(53),e._v(" "),s("p",[e._v("Enables two (2) MS-DOS ANSI.SYS compliant features:")]),e._v(" "),s("ul",[e._m(54),e._v(" "),s("li",[e._v("Non-printable ASCII control characters in the "),s("strong",[e._v("C0")]),e._v(" range "),s("code",[e._v("(0x00 - 0x1F)")]),e._v(" that are "),s("em",[e._v('"unused"')]),e._v(" will print the corresponding glyph/character from the "),s("a",{attrs:{href:"https://en.wikipedia.org/wiki/Code_page_437#Character_set",target:"_blank",rel:"noopener noreferrer"}},[e._v("PC Code Page 437"),s("OutboundLink")],1),e._v(" character set.\n"),e._m(55)])]),e._v(" "),e._m(56),e._v(" "),e._m(57),e._v(" "),e._m(58),e._v(" "),e._m(59),e._v(" "),s("h2",{attrs:{id:"part-4-–-self-testing-the-vt100"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#part-4-–-self-testing-the-vt100"}},[e._v("#")]),e._v(" "),s("a",{attrs:{href:"https://www.vt100.net/docs/vt100-ug/chapter1.html#S1.4",target:"_blank",rel:"noopener noreferrer"}},[e._v("Part 4 – Self-Testing the VT100"),s("OutboundLink")],1)]),e._v(" "),e._m(60),e._v(" "),s("p",[e._v("There are tests performed during power-up for the internal memory of the ESP32, keyboard and Nonvolatile Memory (NVR). But error codes resulting from these tests are not displayed on the VT100.")])])}),n,!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/15.ddf97691.js b/assets/js/15.ddf97691.js new file mode 100644 index 0000000..b6bb5f0 --- /dev/null +++ b/assets/js/15.ddf97691.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{249:function(t,e,a){t.exports=a.p+"assets/img/SetupD_mcs.88cb3cb5.jpg"},250:function(t,e,a){t.exports=a.p+"assets/img/SetupD_help.9e678f31.jpg"},281:function(t,e,a){"use strict";a.r(e);var r=[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"set-up-d-multinational-character-set-nrcs-international-keyboards-personalities-enhancement"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#set-up-d-multinational-character-set-nrcs-international-keyboards-personalities-enhancement"}},[this._v("#")]),this._v(" SET-UP D - Multinational Character Set, NRCS, International Keyboards, Personalities "),e("em",[this._v("(enhancement)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"background"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#background"}},[this._v("#")]),this._v(" Background")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("code",[this._v("SET-UP D")]),this._v(" screen is an enhancement that the VT132 adds to the original VT100 functionality.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The VT132 implements multinational character support (derived from the VT220), international keyboard support and personality support for a range of other terminals of the era, these features are accessible and configurable through the"),e("code",[this._v("SET-UP D")]),this._v(" screen.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:a(249),alt:"SET-UP-D-MCS"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"help"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#help"}},[this._v("#")]),this._v(" Help")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The integrated help screen is accessible by pressing the "),e("code",[this._v("F1")]),this._v(" key as with the other SET-UP screens, provides a summary of the features that are configurable on this screen.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:a(250),alt:"SET-UP-D-HELP"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"dec-multinational-character-set-mcs-8-bit-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dec-multinational-character-set-mcs-8-bit-support"}},[this._v("#")]),this._v(" DEC Multinational Character Set (MCS 8-bit) Support")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("a standard 7-bit ASCII character set")]),this._v(" "),e("li",[this._v("an extended 8-bit ASCII character set including accented characters, currency symbols, and other character glyphs missing from 7-bit ASCII")]),this._v(" "),e("li",[this._v("(and is the ancestor of the ISO-8859-1 'Latin 1' codepage)")]),this._v(" "),e("li",[this._v("a full MCS 8-bit character set available to all applications that are 8-bit clean")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"dec-national-replacement-character-set-nrcs-7-bit-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dec-national-replacement-character-set-nrcs-7-bit-support"}},[this._v("#")]),this._v(" DEC National Replacement Character Set (NRCS 7-bit) Support")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("a standard 7-bit US-ASCII character set, with")]),this._v(" "),e("li",[this._v("a maximum of 12 standard US-ASCII characters substituted with language/country specific characters for a nominated country")]),this._v(" "),e("li",[this._v("(currently implemented for UK (British), FR (French), DE (German), IT (Italian) and SE (Swedish) on the VT132, with more countries to follow)")]),this._v(" "),e("li",[this._v("international character support for applications that are not 8-bit clean and that only support 7-bit ASCII")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The UK is the simplest of these with only the pound symbol "),e("code",[this._v("£")]),this._v(" substituted for the US-ASCII "),e("code",[this._v("#")]),this._v(" symbol at ASCII 35 (dec) or 0x24 (hex).")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Only one country can be active for NRCS at a time. Changing the country will appear to change the contents of files created while working with another country, because the same 7-bit ASCII code is used to represent different characters depending on the country currently selected.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"international-keyboard-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#international-keyboard-support"}},[this._v("#")]),this._v(" International Keyboard Support")])},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ul",[a("li",[t._v("à á â ä ā À Á Â Ä Ã")]),t._v(" "),a("li",[t._v("è é ê ë È É Ê Ë")]),t._v(" "),a("li",[t._v("ì í î ï Ì Í Î Ï")]),t._v(" "),a("li",[t._v("ò ó ô ö õ Ò Ó Ô Ö Õ")]),t._v(" "),a("li",[t._v("ù ú û ü Ù Ú Û Ü")]),t._v(" "),a("li",[t._v("ñ Ñ")]),t._v(" "),a("li",[t._v("ÿ Ÿ")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("pressing a dead-key twice, or followed by "),e("code",[this._v(" ")]),this._v(", will output the accent character if printable\n` ^ ~ are printable as standalone characters\n´ ¨ are not printable as standalone characters\nsee: "),e("a",{attrs:{href:""}},[this._v("https://en.wikipedia.org/wiki/Dead_key")]),this._v(" for further information on the use of dead-keys")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"selecting-character-set-and-keyboard-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#selecting-character-set-and-keyboard-support"}},[this._v("#")]),this._v(" Selecting character set and keyboard support")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Pressing "),e("code",[this._v("7")]),this._v(" on the keyboard toggles between the two available character set modes")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("DEC Multinational Character Set (MCS 8-bit), and")]),this._v(" "),e("li",[this._v("DEC National Replacement Character Set (NRCS 7-bit)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Pressing "),e("code",[this._v("6")]),this._v(" on the keyboard selects the country/language for both NRCS mode and keyboard support, based on the current cursor position. Current choices are:")])},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ul",[a("li",[t._v("US")]),t._v(" "),a("li",[t._v("UK")]),t._v(" "),a("li",[t._v("FR (French)")]),t._v(" "),a("li",[t._v("DE (German)")]),t._v(" "),a("li",[t._v("IT (Italian)")]),t._v(" "),a("li",[t._v("SE (Swedish)")])])},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("p",[t._v("Moving the cursor left or right with the "),a("code",[t._v(" ")]),t._v(" and "),a("code",[t._v(" ")]),t._v(" cursor control keys, "),a("code",[t._v(" ")]),t._v(" or "),a("code",[t._v(" ")]),t._v(" enables you to choose the language/country you want to select.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The current country/keyboard as a word eg. "),e("code",[this._v("German")]),this._v(" on the last line of the screen.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("NRCS country/language selection and keyboard country/language selection are not independent.\nOn the VT220 the country/language selection was made automatically by the keyboard that was attached to the terminal.\nAt least with the VT132 you get to choose.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"personality-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#personality-support"}},[this._v("#")]),this._v(" Personality Support")])},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ul",[a("li",[t._v("ANSI/VT100 (the default VT100 operating mode)")]),t._v(" "),a("li",[t._v("WordStar/VT100 (same as above but with WordStar cursor navigation key mappings)")]),t._v(" "),a("li",[t._v("ADM-3A")]),t._v(" "),a("li",[t._v("ADM-31")]),t._v(" "),a("li",[t._v("Cromemco 3102")]),t._v(" "),a("li",[t._v("Hazeltine 1500")]),t._v(" "),a("li",[t._v("Osborne 1")]),t._v(" "),a("li",[t._v("Kaypro")]),t._v(" "),a("li",[t._v("VT52 (already a feature of the VT100, this personality simply actives VT52 compatibility mode)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"selecting-personality-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#selecting-personality-support"}},[this._v("#")]),this._v(" Selecting personality support")])},function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("p",[t._v("Pressing the "),a("code",[t._v(" ")]),t._v(" and "),a("code",[t._v(" ")]),t._v(" cursor control keys cycles to the "),a("code",[t._v("Previous")]),t._v(" or "),a("code",[t._v("Next")]),t._v(" personality in the list.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"set-up-d-advance-to-next-setup-screen"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#set-up-d-advance-to-next-setup-screen"}},[this._v("#")]),this._v(" SET-UP D - advance to next setup screen")])}],s=a(0),i=Object(s.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),a("p",[t._v("The "),a("a",{attrs:{href:"https://en.wikipedia.org/wiki/Multinational_Character_Set",target:"_blank",rel:"noopener noreferrer"}},[t._v("DEC Multinational Character Set (MCS)"),a("OutboundLink")],1),t._v(" is the default character set on the VT132. It provides:")]),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),a("p",[t._v("The "),a("a",{attrs:{href:"https://en.wikipedia.org/wiki/National_Replacement_Character_Set",target:"_blank",rel:"noopener noreferrer"}},[t._v("DEC National Replacement Character Set (NRCS)"),a("OutboundLink")],1),t._v(" is an alternate character set on the VT132. It is mutually exclusive with the MCS. It provides:")]),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),a("p",[t._v("For other countries/languages, see the reference above to see which characters are substituted.")]),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),a("p",[t._v("PC keyboard scancode to character set mappings are provided for the same country/languages that the VT132 currently support with NRCS (see next section).")]),t._v(" "),a("p",[t._v("Includes dead-key support (country specific) for composed characters with accent diacritics ` ´ ^ ¨ ~ (MCS 8-bit character set and CP437)")]),t._v(" "),t._m(15),t._v(" "),a("p",[t._v("note: not all keyboard layouts support all dead-keys")]),t._v(" "),t._m(16),t._v(" "),t._m(17),t._v(" "),t._m(18),t._v(" "),t._m(19),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),t._m(22),t._v(" "),t._m(23),t._v(" "),t._m(24),t._v(" "),t._m(25),t._v(" "),a("p",[t._v("The teminal emulation provides a number of 'Personalities' for different terminals of the era.")]),t._v(" "),a("p",[t._v("It maps the escape sequences that control these terminals to the equivalent escape sequences for the VT100.")]),t._v(" "),a("p",[t._v('The special, non-ASCII keyboard keys (mainly cursor control keys) are mapped to the typical "WordStar" key mappings. Details tba.')]),t._v(" "),a("p",[t._v("The available personalities are:")]),t._v(" "),t._m(26),t._v(" "),t._m(27),t._v(" "),t._m(28),t._v(" "),t._m(29),t._v(" "),a("p",[t._v("On the "),a("code",[t._v("SET-UP D")]),t._v(" screen, pressing "),a("code",[t._v("5")]),t._v(" will return to the "),a("router-link",{attrs:{to:"./../#part-2-set-up-mode"}},[a("code",[t._v("SET-UP A")])]),t._v(" screen.")],1)])}),r,!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/16.686f89aa.js b/assets/js/16.686f89aa.js new file mode 100644 index 0000000..9852ab6 --- /dev/null +++ b/assets/js/16.686f89aa.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{255:function(t,e,i){"use strict";i.r(e);var s=[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"configuration-draft"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuration-draft"}},[this._v("#")]),this._v(" Configuration (Draft)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[this._v("#")]),this._v(" Overview")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Just like the real Cromemco Z-1, the default configuration of your kit is an empty machine. While you "),e("em",[this._v("can")]),this._v(" enter instructions using the toggle switches (and you "),e("em",[this._v("should")]),this._v(" experiment with this sometime) it's more interesting to run some real software.\nThe default configuration is like an empty machine with no ROM only RAM.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"getting-connected"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-connected"}},[this._v("#")]),this._v(" Getting connected")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("Plug in the power to the Cromemco Z-1 kit.")]),t._v(" "),i("li",[t._v("On your computer, open the Wi-Fi settings and select the "),i("code",[t._v("cromemco")]),t._v(" network (SSID).")]),t._v(" "),i("li",[t._v("When prompted for a password, enter "),i("code",[t._v("password")]),t._v(".")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("If you have a Mac, open your browser and enter "),i("code",[t._v("cromemco")]),t._v(" or "),i("code",[t._v("cromemco.local")]),t._v(" as the web address.")]),t._v(" "),i("li",[t._v("If you have a PC, open your browser and enter "),i("code",[t._v("cromemco")]),t._v(" or "),i("code",[t._v("192.168.4.1")]),t._v(" as the address.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"default-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#default-configuration"}},[this._v("#")]),this._v(" Default configuration")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"cromemco-z-1-guest"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cromemco-z-1-guest"}},[this._v("#")]),this._v(" Cromemco Z-1 (guest)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("The default configuration is like an empty machine with no ROM only RAM.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("RAM is 64K occupying the entire address space from "),i("code",[t._v("0000h")]),t._v(" to "),i("code",[t._v("FFFFh")])]),t._v(" "),i("li",[t._v("CPU is Zilog Z80 @ 2MHz with support for undocumented op-codes")]),t._v(" "),i("li",[t._v("No boot ROM is active by default")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"esp32-host"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#esp32-host"}},[this._v("#")]),this._v(" ESP32 (host)")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("Wi-Fi set to "),i("strong",[t._v("Access-Point (AP)")]),t._v(" mode with the default SSID of "),i("code",[t._v("cromemco")]),t._v(", password of "),i("code",[t._v("password")])]),t._v(" "),i("li",[t._v("Hostname (HOSTNAME environment variable) set to "),i("code",[t._v("cromemco")]),t._v(" ("),i("code",[t._v("cromemco.local")]),t._v(" for mDNS)")]),t._v(" "),i("li",[t._v("Port (PORT environment variable) set to "),i("code",[t._v("80")])]),t._v(" "),i("li",[t._v("Timezone (TZ environment variable) set for AEST+10, ADST+11 (ie. Sydney, Australia)")]),t._v(" "),i("li",[t._v("Time server (NTP_SERVER environment variable) set to "),i("code",[t._v("pool.ntp.org")])]),t._v(" "),i("li",[t._v("POST (Power On Self Test) disabled")]),t._v(" "),i("li",[t._v("Console log level set to "),i("code",[t._v("NONE")]),t._v(" (details to follow)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Once you are connected to the Wi-Fi network, start a Chrome browser and enter the URL "),e("code",[this._v("http://cromemco")]),this._v(" to see the Desktop UI.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"startup-configuration-non-volatile-storage-nvs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#startup-configuration-non-volatile-storage-nvs"}},[this._v("#")]),this._v(" Startup configuration (Non-Volatile Storage, NVS)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("To enter "),e("em",[this._v("startup configuration mode")]),this._v(", follow the sequence:")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ol",[i("li",[t._v("ensure the ESP32 is connected to a USB power source, the red LED on the ESP32 board should be illuminated")]),t._v(" "),i("li",[t._v("turn the front panel power switch "),i("strong",[t._v("off")]),t._v(", "),i("code",[t._v("PWR OFF")]),t._v(", the down position")]),t._v(" "),i("li",[t._v("hold the "),i("code",[t._v("EXAMINE")]),t._v(" toggle in the "),i("strong",[t._v("Examine")]),t._v(", up position")]),t._v(" "),i("li",[t._v("press and release the "),i("code",[t._v("Reset")]),t._v(" buttons while holding the "),i("code",[t._v("EXAMINE")]),t._v(" toggle up")]),t._v(" "),i("li",[t._v("hold the "),i("code",[t._v("EXAMINE")]),t._v(" toggle for a second or two")]),t._v(" "),i("li",[t._v("release the "),i("code",[t._v("EXAMINE")]),t._v(" toggle")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("There are 2 "),i("code",[t._v("Reset")]),t._v(" buttons available that both do the same thing:")]),t._v(" "),i("ul",[i("li",[t._v("The "),i("code",[t._v("Tactile Switch SPST-NO")]),t._v(" you installed in the "),i("code",[t._v("Reset")]),t._v(" position on the PCB")]),t._v(" "),i("li",[t._v("The small tactile switch on the ESP32 board marked "),i("code",[t._v("EN")])]),t._v(" "),i("li",[i("strong",[t._v("NOT")]),t._v(" the "),i("em",[t._v("blue toggle switch")]),t._v(" on the front panel")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The Cromemco Z-1 should now be in "),i("em",[t._v("startup configuration mode")]),t._v(". This is indicted by a running LED pattern (right to left) on the 4 LEDS at the right hand side of the front panel ("),i("code",[t._v("HOLD")]),t._v(", "),i("code",[t._v("WAIT")]),t._v(", "),i("code",[t._v("RUN")]),t._v(", "),i("code",[t._v("INTERRUPTS ENABLED")]),t._v(").")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("The current "),e("em",[this._v("startup configuration value")]),this._v(" is displayed on the Address Bus LEDs (bits 0-15) when you enter "),e("em",[this._v("startup configuration mode")]),this._v(".")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"warning custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),i("p",[t._v("When you "),i("strong",[t._v("Deposit")]),t._v(" a new "),i("em",[t._v("startup configuration value")]),t._v(", all the bits of the current value are overwritten. If your objective is to "),i("strong",[t._v("modify")]),t._v(" the existing value changing only a few of the bits, you must toggle in all the bits of the existing value indicated by the Address Bus LEDs and then switch the bits you want to configure differently, before you "),i("strong",[t._v("Deposit")]),t._v(" this new value.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("Booting with RDOS 3.08 ROM (suitable to boot from a floppy disk to CDOS, Cromix or CP/M, or boot from hard disk)")]),t._v(" "),i("p",[t._v("To configure the Cromemco Z-1 to boot into the ROM based "),i("em",[t._v("RDOS 3.08")]),t._v(" in Z80 mode @ 4 MHz, the following startup configuration value can be used.")]),t._v(" "),i("ul",[i("li",[t._v("Binary: 0000 1001 0100 0000")]),t._v(" "),i("li",[t._v("Hexadecimal: 0940")])]),t._v(" "),i("ol",[i("li",[t._v("Enter "),i("em",[t._v("startup configuration mode")]),t._v(" (above)")]),t._v(" "),i("li",[t._v("Toggle in this value on the "),i("strong",[t._v("Address")]),t._v(" toggle switches")]),t._v(" "),i("li",[t._v("Raise the "),i("code",[t._v("DEPOSIT")]),t._v(" toggle to the "),i("strong",[t._v("Deposit")]),t._v(", up position to store the entered startup configuration value.")]),t._v(" "),i("li",[t._v("Reboot the Cromemco Z-1 by raising the "),i("code",[t._v("RESET")]),t._v(" toggle")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("table",[i("thead",[i("tr",[i("th",{staticStyle:{"text-align":"right"}},[t._v("Address Bit")]),t._v(" "),i("th",[t._v("Name")]),t._v(" "),i("th",[t._v("Equivalent Flag")]),t._v(" "),i("th",[t._v("Description")])])]),t._v(" "),i("tbody",[i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("0")]),t._v(" "),i("td",[t._v("NVS_POST")]),t._v(" "),i("td",[t._v("n/a")]),t._v(" "),i("td",[t._v("Enable Power On Self Test (POST)")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("1-2")]),t._v(" "),i("td",[t._v("NVS_LOG_LEVEL")]),t._v(" "),i("td",[t._v("n/a")]),t._v(" "),i("td",[t._v("Set ESP32 console "),i("strong",[t._v("Log Level")]),t._v(", 0 = NONE; 1 = ERROR; 2 = WARN; 3 = INFO")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("3")]),t._v(" "),i("td",[t._v("NVS_IF_STA")]),t._v(" "),i("td",[t._v("n/a")]),t._v(" "),i("td",[t._v("Set Wi-Fi Mode, 0 = Access Point Mode (AP); 1 = Station Mode (STA)")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("4")]),t._v(" "),i("td",[t._v("NVS_Z80")]),t._v(" "),i("td",[i("code",[t._v("-z")]),t._v(", "),i("code",[t._v("-8")])]),t._v(" "),i("td",[t._v("This bit is ignored as the Cromemco Z-1 is always running a Z80 CPU")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("5")]),t._v(" "),i("td",[t._v("NVS_NO_UNDOC")]),t._v(" "),i("td",[i("code",[t._v("-u")])]),t._v(" "),i("td",[t._v("Suppress support for undocumented op. codes, 1 = "),i("code",[t._v("-u")])])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("6")]),t._v(" "),i("td",[t._v("NVS_4MHZ")]),t._v(" "),i("td",[i("code",[t._v("-f")])]),t._v(" "),i("td",[t._v("Set CPU speed, 0 = 2 MHz "),i("code",[t._v("-f 2")]),t._v("; 1 = 4 MHz "),i("code",[t._v("-f 4")])])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("7")]),t._v(" "),i("td",[t._v("NVS_UNLIMITED")]),t._v(" "),i("td",[i("code",[t._v("-f 0")])]),t._v(" "),i("td",[t._v("Set CPU speed to Unlimited, 0 = use speed from bit 6; 1 = Unlimited "),i("code",[t._v("-f 0")])])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("8-10")]),t._v(" "),i("td",[t._v("NVS_MEMORY_MAP")]),t._v(" "),i("td",[i("code",[t._v("-M")])]),t._v(" "),i("td",[t._v("Set memory map, 0 = default 64K RAM, 1-7 = use memory map "),i("em",[t._v("n")]),t._v(" "),i("code",[t._v("-M n")])])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("11")]),t._v(" "),i("td",[t._v("NVS_BANK_ROM")]),t._v(" "),i("td",[i("code",[t._v("-R")])]),t._v(" "),i("td",[t._v("Enable FDC-16/64 style Banked ROM functionality, 1 = "),i("code",[t._v("-R")]),t._v(". Only compatible with RDOS ROM images.")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("12-14")]),t._v(" "),i("td"),t._v(" "),i("td"),t._v(" "),i("td",[t._v("Reserved for future use")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("15")]),t._v(" "),i("td",[t._v("NVS_AUTO_RUN")]),t._v(" "),i("td"),t._v(" "),i("td",[t._v("Autorun - The CPU will automatically run when the machine is switched on ("),i("code",[t._v("PWR ON")]),t._v(")")])])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ol",[i("li",[t._v("To "),i("strong",[t._v("set")]),t._v(" a bit, put the corresponding "),i("strong",[t._v("Address")]),t._v(" toggle switch in the "),i("strong",[t._v("up")]),t._v(" position.")]),t._v(" "),i("li",[t._v("To "),i("strong",[t._v("clear")]),t._v(" a bit, put the corresponding "),i("strong",[t._v("Address")]),t._v(" toggle switch in the "),i("strong",[t._v("down")]),t._v(" position.")]),t._v(" "),i("li",[t._v("Raise the "),i("code",[t._v("DEPOSIT")]),t._v(" toggle to the "),i("strong",[t._v("Deposit")]),t._v(", up position to store the entered startup configuration value.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"warning custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),i("p",[t._v("The Cromemco Z-1 must be rebooted for the new configuration to take effect.")]),t._v(" "),i("p",[t._v("This can be done by raising the "),i("code",[t._v("RESET")]),t._v(" toggle or by pressing a "),i("code",[t._v("Reset")]),t._v(" switch.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("For further details about the "),i("em",[t._v("Equivalent Flag")]),t._v(" refer to the "),i("strong",[t._v("Z80PACK")]),t._v(" documentation for the "),i("strong",[t._v("cromemcosim")]),t._v(" machine.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("The memory map indexed by NVS_MEMORY_MAP (1-7) is defined in the configuration file "),e("code",[this._v("system.conf")]),this._v("\nSee "),e("a",{attrs:{href:"#memory-maps"}},[this._v("Memory maps")]),this._v(" for details.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"serial-communications-rs232-usb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#serial-communications-rs232-usb"}},[this._v("#")]),this._v(" Serial Communications (RS232, USB)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("strong",[this._v("Cromemco Z-1")]),this._v(" is configured with three (3) "),e("em",[this._v("virtual")]),this._v(" "),e("strong",[this._v("TU-ART")]),this._v(" UART devices.")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The first "),i("em",[t._v("virtual")]),t._v(" UART is the console port on the "),i("strong",[t._v("Cromemco FDC16/64")]),t._v(" floppy disk controller.\nThe second and third "),i("em",[t._v("virtual")]),t._v(" UARTs are the A and B devices on the "),i("strong",[t._v("Cromemco TU-ART")]),t._v(" serial/parallel I/O interface.")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("table",[i("thead",[i("tr",[i("th",{staticStyle:{"text-align":"center"}},[t._v("Board")]),t._v(" "),i("th",{staticStyle:{"text-align":"center"}},[t._v("UART device")]),t._v(" "),i("th",{staticStyle:{"text-align":"center"}},[t._v("I/O ports (hexadecimal)")]),t._v(" "),i("th",[t._v("Default Connected Device")]),t._v(" "),i("th",{staticStyle:{"text-align":"center"}},[t._v("Default Desktop Device")])])]),t._v(" "),i("tbody",[i("tr",[i("td",{staticStyle:{"text-align":"center"}},[t._v("FDC-16/64")]),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("TU-ART 0A")]),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("00-09")]),t._v(" "),i("td",[t._v("Physical "),i("strong",[t._v("UART0")]),t._v(" (Tx/Rx Patch pins & USB)")]),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("TTY:")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"center"}},[t._v("TU-ART #1")]),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("TU-ART 1A")]),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("20-29")]),t._v(" "),i("td",[t._v("Physical "),i("strong",[t._v("UART1")]),t._v(" (IO22/IO5 Patch pins)")]),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("TTY1:")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"center"}}),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("TU-ART 1B")]),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("50-59")]),t._v(" "),i("td",[t._v("Physical "),i("strong",[t._v("UART2")]),t._v(" (IO32/IO33 Patch pins)")]),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("TTY2:")])])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("When the machine boots, the "),i("em",[t._v("virtual")]),t._v(" "),i("strong",[t._v("TU-ART 0A")]),t._v(" is routed to the "),i("em",[t._v("physical")]),t._v(" "),i("strong",[t._v("UART0")]),t._v(" on the "),i("code",[t._v("ESP32-PICO-KIT")]),t._v(".")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("This enables you to use any software on the Cromemco Z-1 that communicates via this UART as the console using a terminal or terminal emulator depending your method of connection.")]),this._v(" "),e("li",[this._v("The default speed with the current firmware is 115200 baud @ 8N1")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("Both the "),i("em",[t._v("ESP32 console log")]),t._v(" and the Cromemco console "),i("strong",[t._v("TU-ART 0A")]),t._v(" (TTY:) will be directed to the serial "),i("strong",[t._v("UART0")]),t._v(". If you set the "),i("code",[t._v("NVS_LOG_LEVEL")]),t._v(" to "),i("code",[t._v("INFO")]),t._v(" (3) this will likely send console log messages during normal use of the machine. It is recommended to set the "),i("code",[t._v("NVS_LOG_LEVEL")]),t._v(" to a lower level during normal operation.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"warning custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),i("p",[t._v("Behavior of serial communications is further effected by the settings on the "),i("em",[t._v("virtual")]),t._v(" "),i("strong",[t._v("TU-ART")]),t._v(" UARTs. See "),i("a",{attrs:{href:"#tu-art-device-mappings"}},[t._v("TU-ART device mappings")]),t._v(" in the "),i("code",[t._v("system.conf")]),t._v(" file below, for further details.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"warning custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),i("p",[t._v("If you start the "),i("strong",[t._v("Desktop UI")]),t._v(" from a web browser and the "),i("em",[t._v("TTY: virtual device")]),t._v(" is connected (default behavior) then the "),i("em",[t._v("virtual")]),t._v("* TU-UART 0A device is disconnected from the "),i("em",[t._v("physical")]),t._v(" UART0 on the "),i("code",[t._v("ESP32-PICO-KIT")]),t._v(" and instead re-routed to the "),i("em",[t._v("TTY: virtual device")]),t._v(" on the Desktop UI. If the "),i("em",[t._v("TTY: virtual device")]),t._v(" is disconnected, then the TU-UART 0A device is re-routed back to the UART0 on the "),i("code",[t._v("ESP32-PICO-KIT")]),t._v(", ie. only one of these two destinations can be connected at a time.")]),t._v(" "),i("p",[i("strong",[t._v("Note: the "),i("em",[t._v("ESP32 console log")]),t._v(" is always sent to the physical UART0 and is never redirected.")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"serial-uart-over-usb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#serial-uart-over-usb"}},[this._v("#")]),this._v(" Serial UART over USB")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("code",[this._v("ESP32-PICO-KIT")]),this._v(" supports serial communications from UART0 over USB. It uses a "),e("em",[this._v("Silicon Labs CP210x USB to UART bridge")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ol",[i("li",[t._v("connect the "),i("code",[t._v("ESPP32-PICO-KIT")]),t._v(" to a PC using a suitable USB cable")]),t._v(" "),i("li",[t._v("start a terminal emulator on the PC set for 115200 baud 8N1 connected to the serial device your OS identifies the "),i("code",[t._v("ESP32-PICO-KIT")]),t._v(" on\n"),i("ul",[i("li",[t._v("Windows will be a COMx: port")]),t._v(" "),i("li",[t._v("OSX will be /dev/tty.SLAB_USBtoUART")]),t._v(" "),i("li",[t._v("Linux will be /dev/ttyUSB0 (or similar, TBA)")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("If you do not see a TTY/COM port on your PC presented by the ESP32-PICO-KIT when connected, you may need to install a driver for the "),e("em",[this._v("Silicon Labs CP210x USB to UART bridge")]),this._v(".")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"serial-uart-over-rs232"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#serial-uart-over-rs232"}},[this._v("#")]),this._v(" Serial UART over RS232")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[e("em",[this._v("Serial UART0 over RS232")]),this._v(" and "),e("em",[this._v("Serial UART0 over USB")]),this._v(" are mutually exclusive, ie. they cannot be used at the same time.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[i("em",[t._v("Serial UART over RS232")]),t._v(" is configured by using the supplied jumpers/shunts to bridge the required pins on the "),i("code",[t._v("Patch")]),t._v(" and "),i("code",[t._v("Comms")]),t._v(" headers accessible on the rear of the PCB, and connecting a suitable RS232 device to one of the DE-9M connectors labeled "),i("code",[t._v("RS232-1")]),t._v(" and "),i("code",[t._v("RS232-2")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("You must position 4 of the jumpers/shunts provided to enable a "),i("em",[t._v("Serial UART over RS232")]),t._v(". This image shows the currently supported configuration for the jumpers/shunts on both the "),i("code",[t._v("Patch")]),t._v(" and "),i("code",[t._v("Comms")]),t._v(" headers for "),i("strong",[t._v("UART0")]),t._v(" to "),i("code",[t._v("RS232-1")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:i(65),alt:"Patch & Comms jumpers"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"uart0-to-rs232-1"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#uart0-to-rs232-1"}},[this._v("#")]),this._v(" UART0 to RS232-1")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h5",{attrs:{id:"patch-header"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#patch-header"}},[this._v("#")]),this._v(" Patch header")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("bridge Tx - T1 - vertical "),e("em",[this._v("position second from right")])]),this._v(" "),e("li",[this._v("bridge Rx - R1 - vertical "),e("em",[this._v("right most position")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h5",{attrs:{id:"comms-header"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#comms-header"}},[this._v("#")]),this._v(" Comms header")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("bridge @ Tx1 - horizontal "),e("em",[this._v("second position from top")])]),this._v(" "),e("li",[this._v("bridge @ Rx1 - horizontal "),e("em",[this._v("fourth position from top")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"uart1-to-rs232-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#uart1-to-rs232-2"}},[this._v("#")]),this._v(" UART1 to RS232-2")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h5",{attrs:{id:"patch-header-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#patch-header-2"}},[this._v("#")]),this._v(" Patch header")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("bridge IO22 - T2 - vertical "),e("em",[this._v("position third from right")])]),this._v(" "),e("li",[this._v("bridge IO5 - R2 - vertical "),e("em",[this._v("position fourth from right")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h5",{attrs:{id:"comms-header-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#comms-header-2"}},[this._v("#")]),this._v(" Comms header")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("bridge @ Tx2 - horizontal "),e("em",[this._v("third position from bottom")])]),this._v(" "),e("li",[this._v("bridge @ Rx2 - horizontal "),e("em",[this._v("last position at bottom")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"configuring-physical-uart-parameters-speed-data-stop-bits"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuring-physical-uart-parameters-speed-data-stop-bits"}},[this._v("#")]),this._v(" Configuring physical UART parameters (speed, data & stop bits)")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("You can configure the parameters for both "),i("strong",[t._v("UART0")]),t._v(" ("),i("code",[t._v("RS232-1")]),t._v("/USB) and "),i("strong",[t._v("UART1")]),t._v(" ("),i("code",[t._v("RS232-2")]),t._v(") via the "),i("code",[t._v("boot.conf")]),t._v(" file.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"wi-fi-communications"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wi-fi-communications"}},[this._v("#")]),this._v(" Wi-Fi Communications")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The ESP32 has on-board Wi-Fi and can boot in either "),i("strong",[t._v("Access Point")]),t._v(" (AP) or "),i("strong",[t._v("Station")]),t._v(" (STA) mode. The mode is determined by the "),i("strong",[t._v("NVS_IF_STA")]),t._v(" bit in the "),i("em",[t._v("startup configuration")]),t._v(" stored in NVS and described "),i("a",{attrs:{href:"#startup-configuration-non-volatile-storage-nvs"}},[t._v("above")]),t._v(".")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("In AP mode, the ESP32 acts as an Access Point and broadcasts a system defined SSID and provides DHCP services for clients to connect\n"),i("ul",[i("li",[t._v("The "),i("strong",[t._v("SSID")]),t._v(" hardcoded in the firmware is "),i("em",[t._v("espressif")]),t._v(" with a "),i("strong",[t._v("password")]),t._v(" of "),i("em",[t._v("password")]),t._v(", this will only be used if the "),i("strong",[t._v("boot.conf")]),t._v(" file on the microSD card cannot be read or does not include a "),i("code",[t._v("HOSTNAME=name")]),t._v(" statement, see "),i("a",{attrs:{href:"#boot-conf-file"}},[t._v("Boot.conf file")]),t._v(" below.")]),t._v(" "),i("li",[t._v("If a "),i("code",[t._v("HOSTNAME=name")]),t._v(" statement is found in the "),i("strong",[t._v("boot.conf")]),t._v(" file, then this hostname is also used as the "),i("strong",[t._v("SSID")]),t._v(" in AP mode. In this case, the "),i("strong",[t._v("password")]),t._v(" still remains "),i("em",[t._v("password")])])])]),t._v(" "),i("li",[t._v("In STA mode, the ESP32 acts as a Wi-Fi station or client and can join an existing Wi-Fi network (supporting WPA or WPA2, but not Enterprise WPA).\n"),i("ul",[i("li",[t._v("The "),i("strong",[t._v("SSID")]),t._v(" and "),i("strong",[t._v("password")]),t._v(" of the desired Wi-Fi network must be configured in the "),i("strong",[t._v("boot.conf")]),t._v(" file using the "),i("code",[t._v("SSID=name")]),t._v(" and "),i("code",[t._v("PASSWORD=password")]),t._v(" statements, see "),i("a",{attrs:{href:"#boot-conf-file"}},[t._v("Boot.conf file")]),t._v(" below.")])])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("The "),i("strong",[t._v("boot.conf")]),t._v(" file can be edited via the "),i("strong",[t._v("SYS:")]),t._v(" virtual system device in the Desktop UI while connected to the Cromemco Z-1 running in AP mode.\nAlternatively the "),i("strong",[t._v("microSD Card")]),t._v(" can be mounted in a PC and the "),i("code",[t._v("/cromemco/conf/boot.conf")]),t._v(" file edited directly in a text editor then the "),i("strong",[t._v("microSD Card")]),t._v(" returned to the Cromemco Z-1 before it is powered on.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("When the Cromemco Z-1 is configured to work in station mode (STA) but it is unable to make a connection to the configured Wi-Fi network within 30 seconds, the ESP32 will reboot and temporarily start in AP mode.")]),this._v(" "),e("ul",[e("li",[this._v("This enables you to connect to the Cromemco Z-1 from a browser on the advertised SSID and modify/correct the STA mode Wi-Fi configuration.")]),this._v(" "),e("li",[this._v("The simplest way to determine if this has happened is to look for the AP mode SSID being broadcast, or to look at the ESP32 console log output on UART0/USB.")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"danger custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("The design of the Cromemco Z-1 is intended for only "),e("strong",[this._v("one")]),this._v(" Wi-Fi client (browser) to be connected at any given time. It is untested and not recommended to connect multiple clients at the same time.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"boot-conf-file"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#boot-conf-file"}},[this._v("#")]),this._v(" Boot.conf file")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("strong",[this._v("boot.conf")]),this._v(" file is located on the microSD card with the path "),e("code",[this._v("/cromemco/conf/boot.conf")]),this._v("\nAs the ESP32 boots this file is loaded, each line parsed and the "),e("strong",[this._v("variable=value")]),this._v(" pair is added to the environment (like posix environment variables).")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"danger custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("There is little to no error checking done at the moment. If you significantly change this file and remove a variable, or leave a value blank you may cause the boot process to fail. I know, I've managed to do that once or twice.")]),this._v(" "),e("p",[this._v("The solution is to mount the microSD card on a PC and edit the "),e("strong",[this._v("boot.conf")]),this._v(" file to fix the problem.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"default-boot-conf"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#default-boot-conf"}},[this._v("#")]),this._v(" Default boot.conf")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("### Network configuration\nNTP_SERVER=pool.ntp.org\nTZ=AEST-10AEDT,M10.1.0,M4.1.0\nHOSTNAME=cromemco\nPORT=80\nSSID=mySSID\nPASSWORD=myPASSWORD\nWIFI.sta.scan=1\n#WIFI.password.hide=1\n### UART configuration\n#UART0=115200,cs8\n#UART1=115200,cs8\n#UART2=115200,cs8\n### Performance parameters\n#TTY.netsrv.buffer_delay=33\n#TTY2.netsrv.buffer_delay=33\n#TTY3.netsrv.buffer_delay=33\n#LPT.netsrv.buffer_delay=33\n### Harddisk images\n#HARDDISK.hd0=hd0.hdd\n#HARDDISK.hd1=hd1.hdd\n#HARDDISK.hd2=offline\n### TU-ART default device mappings (HAL)\n#TUART0.deviceA.device=WEBTTY,MODEM,UART0\n#TUART1.deviceA.device=WEBTTY2,SCKTSRV1,UART1\n#TUART1.deviceB.device=WEBTTY3,SCKTSRV2,UART2\n### Modem initialization string\nMODEM.init=ATS0=1S15=1&A1 #S0=1 auto-answer after 1 ring, S15=1 enable telnet protocol\n#MODEM.init=ATS15=1 #S15=1 enable telnet protocol\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"network-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#network-configuration"}},[this._v("#")]),this._v(" Network Configuration")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("em",[this._v("Network configuration")]),this._v(" entries should be familiar and mostly self explanatory.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The TZ variable cannot use values like "),e("em",[this._v("Sydney/Australia")]),this._v(" (Olson format) but must use explicitly defined timezone strings (POSIX format) eg. "),e("code",[this._v("TZ=AEST-10AEDT,M10.1.0,M4.1.0")]),this._v(" which is correct for Sydney, Australia.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"uart-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#uart-configuration"}},[this._v("#")]),this._v(" UART Configuration")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The "),i("em",[t._v("UART configuration")]),t._v(" entries define the speed, data & stop bits for the three physical UARTs on the ESP32, "),i("strong",[t._v("UART0")]),t._v(", "),i("strong",[t._v("UART1")]),t._v(" and "),i("strong",[t._v("UART2")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("### UART configuration\nUART0=115200,cs8 # ie. 115200, 8N1 - not required because this is default\nUART1=9600 cs7 cstopb parenb parodd # ie. 9600, 7O2\n")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("parameters can be separated by "),i("em",[t._v("spaces")]),t._v(" or "),i("em",[t._v("commas")])]),t._v(" "),i("li",[t._v("parameters are "),i("em",[t._v("case insensitive")])]),t._v(" "),i("li",[t._v("parameters follow the convention used by the "),i("code",[t._v("screen")]),t._v(" program under "),i("em",[t._v("unix/linux/gnu")]),t._v(" ie.:\n"),i("ul",[i("li",[t._v("default is "),i("code",[t._v("115200,cs8")]),t._v(" in other words 115200 8N1")]),t._v(" "),i("li",[t._v("standard baud rates from "),i("code",[t._v("110")]),t._v(" to "),i("code",[t._v("230400")]),t._v(" e.g. 110, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400 others may work, but you'll have to experiment")]),t._v(" "),i("li",[i("code",[t._v("cs7")]),t._v(" - for 7 data bits")]),t._v(" "),i("li",[i("code",[t._v("cs8")]),t._v(" - for 8 data bits")]),t._v(" "),i("li",[i("code",[t._v("cstopb")]),t._v(" - for 2 stop bits, default is 1")]),t._v(" "),i("li",[i("code",[t._v("parenb")]),t._v(" - for even parity, default is none")]),t._v(" "),i("li",[i("code",[t._v("parenb,parodd")]),t._v(" - for odd parity")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"performance-parameters"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#performance-parameters"}},[this._v("#")]),this._v(" Performance parameters")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The "),i("em",[t._v("Performance parameters")]),t._v(" exist only for the four devices "),i("code",[t._v("TTY:")]),t._v(" (default: TU-ART 0A), "),i("code",[t._v("TTY2:")]),t._v(" (default: TU-ART 1A), "),i("code",[t._v("TTY3:")]),t._v(" (default: TU-ART 1B)and "),i("code",[t._v("LPT:")]),t._v(" and apply only to websocket communication to the "),i("em",[t._v("Desktop UI")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("#Performance parameters\nTTY.netsrv.buffer_delay=33\nTTY2.netsrv.buffer_delay=33\nTTY3.netsrv.buffer_delay=33\nLPT.netsrv.buffer_delay=33\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"harddisk-image"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#harddisk-image"}},[this._v("#")]),this._v(" Harddisk image")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Three (3) harddisks are supported with the "),e("em",[this._v("virtual")]),this._v(" "),e("strong",[this._v("Cromemco WDI-II")]),this._v(" winchester harddisk interface.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("A harddisk image (~10MB) can be mounted for each of "),e("code",[this._v("hd0:")]),this._v(", "),e("code",[this._v("hd1:")]),this._v(" & "),e("code",[this._v("hd2:")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("Any "),i("em",[t._v("online")]),t._v(" harddisk image is visible on the desktop as "),i("code",[t._v("HD0:")]),t._v(", "),i("code",[t._v("HD1:")]),t._v(" or "),i("code",[t._v("HD2:")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Harddisk images are visible in the disk library "),e("code",[this._v("LIB:")]),this._v(" and indicated with a "),e("em",[this._v("harddisk")]),this._v(" icon. You can drag-and-drop a new harddisk onto the "),e("code",[this._v("LIB:")]),this._v(" window to upload a new harddisk image.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The default harddisk image mappings are: (these do not need to be specified in the "),e("code",[this._v("boot.conf")]),this._v(" file)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("HARDDISK.hd0=hd0.hdd\nHARDDISK.hd1=hd1.hdd\nHARDDISK.hd2=hd2.hdd\n")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("The harddisk image file must reside in "),i("code",[t._v("/cromemco/disks/")]),t._v(" and end with "),i("code",[t._v(".hdd")]),t._v(" eg. "),i("code",[t._v("/cromemco/disks/hd0.hdd")]),t._v(".")]),t._v(" "),i("p",[t._v("Do not use the "),i("code",[t._v(".dsk")]),t._v(" extension for a harddisk image as it will be confused with a floppy disk image.")]),t._v(" "),i("p",[t._v("If a harddisk image file is not found then the harddisk is marked as "),i("em",[t._v("offline")]),t._v(" and wont appear on the desktop.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("You can specify any haddisk image file in the directory for any harddisk, or specify "),e("strong",[this._v("offline")]),this._v(" to force a harddisk to be "),e("em",[this._v("offline")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("### Harddisk images\nHARDDISK.hd0=disk1.hdd\nHARDDISK.hd1=workdisk.hdd\nHARDDISK.hd2=offline\n")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("An empty (all zero (0) byte values) file of the required size (10,874,880 bytes) is provided in the disk library "),i("code",[t._v("LIB:")]),t._v(" named "),i("code",[t._v("empty.hdd")]),t._v(".")]),t._v(" "),i("p",[t._v("You can copy and rename this file to create new harddisk images, ready to be intialised, formatted and mounted as required by CDOS or Cromix.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("If you change a harddisk image you must "),e("strong",[this._v("reboot")]),this._v(" the Cromemco Z-1 to load the new image")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("There is no UI for changing hard disk images, the required image must be set using the environment variables "),e("code",[this._v("HARDDISK.hd[0..2]")]),this._v(" in the "),e("code",[this._v("boot.conf")]),this._v(" file and then the ESP32 hard reset to reload the environment.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"tu-art-device-mappings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#tu-art-device-mappings"}},[this._v("#")]),this._v(" TU-ART device mappings")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("the TU-ART device mapping configuration is loaded and reported to the debug console (UART0/USB) when the Cromemco Z-1 is started/powered-on")]),this._v(" "),e("li",[this._v("the TU-ART device mapping configuration is also displayed in the SYS: virtual device on the desktop UI")]),this._v(" "),e("li",[this._v("when no TU-ART device mapping configuration is specified, a standard configuration is the default, and reported as follows:")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-config extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("TU-ART Devices\nTUART0.deviceA = WEBTTY,MODEM,UART0\nTUART1.deviceA = WEBTTY2,SCKTSRV1,UART1\nTUART1.deviceB = WEBTTY3,SCKTSRV2,UART2\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("simplify the addition of new character mode devices in future\neg. additional hardware UART; network sockets; additional telnet listeners; new virtual peripherals on the desktop UI")]),this._v(" "),e("li",[this._v("enable the user to assign specific devices to each of the three (3) virtual TU-ART serial ports")]),this._v(" "),e("li",[this._v("details of configuring the TU-ART device mapping will be published soon")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"modem-initialization-string"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modem-initialization-string"}},[this._v("#")]),this._v(" Modem initialization string")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("This string will be processed by the 'AT' Modem when it is initialised and reset (ie. with the command "),e("code",[this._v("ATZ")]),this._v(")")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("auto-answer after 1 ring ("),i("code",[t._v("ATS0=1")]),t._v(")")]),t._v(" "),i("li",[t._v("enable telnet protocol ("),i("code",[t._v("ATS15=1")]),t._v(")")]),t._v(" "),i("li",[t._v('enable answer mode (ie. listen) in "daemon" mode ('),i("code",[t._v("AT&A1")]),t._v(")")]),t._v(" "),i("li",[t._v("with the commands concatenated into a single command string "),i("code",[t._v("ATS0=1S15=1&A1")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("#Modem initialization string\nMODEM.init=ATS0=1S15=1&A1\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"system-conf-file"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#system-conf-file"}},[this._v("#")]),this._v(" System.conf file")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("strong",[this._v("system.conf")]),this._v(" file is located on the microSD card with the path "),e("code",[this._v("/cromemco/conf/system.conf")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Some settings in this file are legacy, maintained for source code compatibility with the "),e("em",[this._v("Z80PACK, cromemcosim")]),this._v(" machine. Only the parameters documented here have any effect on the "),e("strong",[this._v("Cromemco Z-1")]),this._v(".")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"memory-maps"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#memory-maps"}},[this._v("#")]),this._v(" Memory maps")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The only parameters that effect the "),e("strong",[this._v("Cromemco Z-1")]),this._v(" are the "),e("code",[this._v("[MEMORY n]")]),this._v(" sections:")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-config extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("# <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>\n# memory configurations in pages of 256 bytes\n#\tstart,size (numbers in decimal, hexadecimal, octal)\n# up to 7 memory sections allowed\n# up to 6 ram/rom statements per section allowed\n#\n# NOTES:\n# - memory sections only effect bank 0 of the machine's memory\n# <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>\n\n[MEMORY 1]\n# Memory configuration for running CP/M, CDOS, CROMIX with RDOS0308:\n# 256 pages RAM, 32 pages ROM\nram\t\t0,256\nrom\t\t0xc0,32,rdos0308.hex\n# Power-on jump address for the boot ROM\nboot\t\t0xc000\n\n[MEMORY 2]\n# Memory configuration for RDOS1:\n# 256 pages RAM, 4 pages ROM\nram\t\t0,256\nrom\t\t0xc0,4,rdos1.hex\n# Power-on jump address for the boot ROM\nboot\t\t0xc000\n\n[MEMORY 3]\n# Memory configuration for RDOS252:\n# 256 pages RAM, 32 pages ROM\nram\t\t0,256\nrom\t\t0xc0,32,rdos252.hex\n# Power-on jump address for the boot ROM\nboot\t\t0xc000\n\n[MEMORY 4]\n# Memory configuration for Z1MON 1.0:\n# 256 pages RAM, 16 pages ROM\nram\t\t0,256\nrom\t\t0xe0,16,z1mon-1.0.hex\n# Power-on jump address for the ROM\nboot\t\t0xe000\n\n[MEMORY 5]\n# Memory configuration for Z1MON 1.4:\n# 256 pages RAM, 16 pages ROM\nram\t\t0,256\nrom\t\t0xe0,16,z1mon-1.4.hex\n# Power-on jump address for the ROM\nboot\t\t0xe000\n\n[MEMORY 6]\n# Memory configuration for Monitor/BASIC ROM:\n# 256 pages RAM, 16 pages ROM\nram\t\t0,256\nrom\t\t0,16,mbc.hex\n# Power-on jump address for the ROM\nboot\t\t0\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("A memory map is selected by setting the NVS_MEMORY_MAP bits in the "),e("a",{attrs:{href:"#startup-configuration-non-volatile-storage-nvs"}},[this._v("Startup configuration, NVS")]),this._v(" for details.")])])}],o=i(0),n=Object(o.a)({},(function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),i("p",[t._v("In order to run any applications, you will need to activate a virtual ROM (eg. to run BASIC, or boot a floppy disk) and maybe load an operating system (such as CDOS or Cromix) from a virtual disk.")]),t._v(" "),i("p",[t._v("Also like the original computer, your Cromemco Z-1 has no video output port. Owners of the original Cromemco Z-1 would connect a serial terminal (either a teletype printer or visual display unit) to a serial port. While you can still do this (see "),i("a",{attrs:{href:"http://localhost:8080/cromemcoZ1/configure/#serial-communications-rs232-usb",target:"_blank",rel:"noopener noreferrer"}},[t._v("Serial Communications"),i("OutboundLink")],1),t._v(" section), this modern kit offers a much easier solution using Wi-Fi.")]),t._v(" "),i("p",[t._v("Once power is applied to your kit, the ESP32 will create a Wi-Fi Access Point. You can connect your computer to this Wi-Fi network as if it were connected to a Wi-FI router. You can then open a web page, the Desktop UI, that will give you full access to the Cromemco Z-1 - including a virtual serial terminal (TTY:), floppy disks, printer (LPT:) and more.")]),t._v(" "),i("p",[t._v("Once connected, you can then configure the Cromemco Z-1 to connect directly to your home Wi-Fi, so you can use it without having to change your Wi-FI settings again.")]),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),i("p",[t._v("Your computer should now be connected, and you will be able to open the Desktop UI. The web interface has been written and tested with the Chrome browser in mind, and you might find it works differently if you are using a different browser.")]),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),t._m(13),t._v(" "),i("p",[t._v("The startup configuration is modified via the toggle switches on the front panel.")]),t._v(" "),t._m(14),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),t._m(17),t._v(" "),t._m(18),t._v(" "),t._m(19),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),i("p",[t._v("To set the startup configuration mode value, follow the sequence:")]),t._v(" "),t._m(22),t._v(" "),t._m(23),t._v(" "),t._m(24),t._v(" "),t._m(25),t._v(" "),t._m(26),t._v(" "),t._m(27),t._v(" "),t._m(28),t._v(" "),i("p",[t._v("The board/port/devices are assigned as follows:")]),t._v(" "),t._m(29),t._v(" "),t._m(30),t._v(" "),t._m(31),t._v(" "),t._m(32),t._v(" "),t._m(33),t._v(" "),t._m(34),t._v(" "),t._m(35),t._v(" "),t._m(36),t._v(" "),t._m(37),t._v(" "),i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),t._m(38),t._v(" "),i("p",[t._v("Drivers are available direct from the manufacturer at "),i("a",{attrs:{href:"https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers"),i("OutboundLink")],1)])]),t._v(" "),i("p",[t._v("Additional information is available from the Espressif (manufacturer of the "),i("code",[t._v("ESP32-PICO-KIT")]),t._v(") web site at "),i("a",{attrs:{href:"https://docs.espressif.com/projects/esp-idf/en/latest/get-started/establish-serial-connection.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://docs.espressif.com/projects/esp-idf/en/latest/get-started/establish-serial-connection.html"),i("OutboundLink")],1)]),t._v(" "),t._m(39),t._v(" "),t._m(40),t._v(" "),t._m(41),t._v(" "),i("p",[t._v("RS232 line levels are provided by the Maxim MAX3232 IC see the "),i("a",{attrs:{href:"https://datasheets.maximintegrated.com/en/ds/MAX3222-MAX3241.pdf",target:"_blank",rel:"noopener noreferrer"}},[t._v("data sheet"),i("OutboundLink")],1),t._v(" for details.")]),t._v(" "),t._m(42),t._v(" "),t._m(43),t._v(" "),t._m(44),t._v(" "),t._m(45),t._v(" "),t._m(46),t._v(" "),t._m(47),t._v(" "),t._m(48),t._v(" "),t._m(49),t._v(" "),t._m(50),t._v(" "),t._m(51),t._v(" "),t._m(52),t._v(" "),t._m(53),t._v(" "),t._m(54),t._v(" "),t._m(55),t._v(" "),i("p",[t._v("See "),i("router-link",{attrs:{to:"./#uart-configuration"}},[t._v("UART Configuration")]),t._v(" in the "),i("code",[t._v("boot.conf")]),t._v(" file below, for further details.")],1),t._v(" "),t._m(56),t._v(" "),t._m(57),t._v(" "),t._m(58),t._v(" "),t._m(59),t._v(" "),t._m(60),t._v(" "),t._m(61),t._v(" "),t._m(62),t._v(" "),t._m(63),t._v(" "),t._m(64),t._v(" "),t._m(65),t._v(" "),i("p",[t._v("The default configuration, as shipped (in Release v1.10.0-beta.1) is a follows:")]),t._v(" "),t._m(66),t._m(67),t._v(" "),t._m(68),t._v(" "),i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),t._m(69),t._v(" "),i("p",[t._v("A file with TZ variable values for many timezones can be found at "),i("a",{attrs:{href:"https://www.di-mgt.com.au/src/wclocktz.ini",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.di-mgt.com.au/src/wclocktz.ini"),i("OutboundLink")],1),t._v(" "),i("a",{attrs:{href:"https://groups.google.com/d/msg/imsai8080esp/PdNyxAOeBhU/7_IgKXXbCAAJ",target:"_blank",rel:"noopener noreferrer"}},[t._v("Credit to: John Mann in the Forum"),i("OutboundLink")],1)]),t._v(" "),i("p",[t._v("An article that defines the POSIX format can be found at "),i("a",{attrs:{href:"https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Specifying the Time Zone with TZ"),i("OutboundLink")],1),t._v(', however please note, the "third format" referenced in this article is the Olson format, and not supported on the ESP32.')])]),t._v(" "),t._m(70),t._v(" "),t._m(71),t._v(" "),i("p",[t._v("For example:")]),t._v(" "),t._m(72),t._m(73),t._v(" "),t._m(74),t._v(" "),t._m(75),t._v(" "),i("p",[t._v("They specify a time in milliseconds (ms) during which output to the device will be buffered (up to the next line feed character) and transmitted in a single (websocket) packet. This can greatly improve performance of both the TTY: and LPT: devices. If used, recommended optimal settings are:")]),t._v(" "),t._m(76),t._m(77),t._v(" "),t._m(78),t._v(" "),t._m(79),t._v(" "),t._m(80),t._v(" "),t._m(81),t._v(" "),t._m(82),t._v(" "),t._m(83),t._m(84),t._v(" "),t._m(85),t._v(" "),i("p",[t._v("e.g.")]),t._v(" "),t._m(86),t._m(87),t._v(" "),t._m(88),t._v(" "),t._m(89),t._v(" "),t._m(90),t._v(" "),i("p",[t._v("A HAL (Hardware Abstraction Layer) enables mapping of character mode devices to the three (3) virtual TU-ART serial devices")]),t._v(" "),t._m(91),t._v(" "),t._m(92),i("p",[t._v("the purpose of the HAL is to:")]),t._v(" "),t._m(93),t._v(" "),t._m(94),t._v(" "),t._m(95),t._v(" "),i("p",[t._v("For example, to initialize the modem for:")]),t._v(" "),t._m(96),t._v(" "),i("p",[t._v("add the following line:")]),t._v(" "),t._m(97),t._m(98),t._v(" "),t._m(99),t._v(" "),t._m(100),t._v(" "),t._m(101),t._v(" "),t._m(102),t._v(" "),t._m(103),t._m(104)])}),s,!1,null,null,null);e.default=n.exports},65:function(t,e,i){t.exports=i.p+"assets/img/rs232_jumpers.aa5b21af.jpg"}}]); \ No newline at end of file diff --git a/assets/js/17.b0cfdf99.js b/assets/js/17.b0cfdf99.js new file mode 100644 index 0000000..0db98c8 --- /dev/null +++ b/assets/js/17.b0cfdf99.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{118:function(t,e,i){t.exports=i.p+"assets/img/rs232_jumpers.aa5b21af.jpg"},259:function(t,e,i){"use strict";i.r(e);var s=[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"configuration-v1-10-0-or-later"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuration-v1-10-0-or-later"}},[this._v("#")]),this._v(" Configuration - "),e("code",[this._v("v1.10.0")]),this._v(" or later")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("As of October 2022 kits ship with firmware "),e("code",[this._v("v1.10.0")]),this._v(" or later.\nThe following configuration guide relates to these firmware versions.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[this._v("#")]),this._v(" Overview")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Just like the real IMSAI 8080 computer, the default configuration of your kit is an empty machine. While you "),e("em",[this._v("can")]),this._v(" enter instructions using the toggle switches (and you "),e("em",[this._v("should")]),this._v(" experiment with this sometime) it's more interesting to run some real software.\nThe default configuration is like an empty machine with no ROM only RAM.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"getting-connected"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-connected"}},[this._v("#")]),this._v(" Getting connected")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("Plug in the power to the IMSAI 8080esp kit.")]),t._v(" "),i("li",[t._v("On your computer, open the Wi-Fi settings and select the "),i("code",[t._v("imsai8080")]),t._v(" network (SSID).")]),t._v(" "),i("li",[t._v("When prompted for a password, enter "),i("code",[t._v("password")]),t._v(".")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("If you have a Mac, open your browser and enter "),i("code",[t._v("imsai8080")]),t._v(" or "),i("code",[t._v("imsai8080.local")]),t._v(" as the web address.")]),t._v(" "),i("li",[t._v("If you have a PC, open your browser and enter "),i("code",[t._v("imsai8080")]),t._v(" or "),i("code",[t._v("192.168.4.1")]),t._v(" as the address.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"default-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#default-configuration"}},[this._v("#")]),this._v(" Default configuration")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"imsai-8080-guest"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#imsai-8080-guest"}},[this._v("#")]),this._v(" IMSAI 8080 (guest)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("The default configuration is like an empty machine with no ROM only RAM.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("RAM is 64K occupying the entire address space from "),i("code",[t._v("0000h")]),t._v(" to "),i("code",[t._v("FFFFh")])]),t._v(" "),i("li",[t._v("CPU is Intel 8080 @ 2MHz with support for undocumented op-codes")]),t._v(" "),i("li",[t._v("No boot ROM is active by default")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"esp32-host"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#esp32-host"}},[this._v("#")]),this._v(" ESP32 (host)")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("Wi-Fi set to "),i("strong",[t._v("Access-Point (AP)")]),t._v(" mode with the default SSID of "),i("code",[t._v("imsai8080")]),t._v(", password of "),i("code",[t._v("password")])]),t._v(" "),i("li",[t._v("Hostname (HOSTNAME environment variable) set to "),i("code",[t._v("imsai8080")]),t._v(" ("),i("code",[t._v("imsai8080.local")]),t._v(" for mDNS)")]),t._v(" "),i("li",[t._v("Port (PORT environment variable) set to "),i("code",[t._v("80")])]),t._v(" "),i("li",[t._v("Timezone (TZ environment variable) set for AEST+10, ADST+11 (ie. Sydney, Australia)")]),t._v(" "),i("li",[t._v("Time server (NTP_SERVER environment variable) set to "),i("code",[t._v("pool.ntp.org")])]),t._v(" "),i("li",[t._v("POST (Power On Self Test) disabled")]),t._v(" "),i("li",[t._v("Console log level set to "),i("code",[t._v("NONE")]),t._v(" (details to follow)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Once you are connected to the Wi-Fi network, start a Chrome browser and enter the URL "),e("code",[this._v("http://imsai8080")]),this._v(" to see the Desktop UI.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"startup-configuration-non-volatile-storage-nvs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#startup-configuration-non-volatile-storage-nvs"}},[this._v("#")]),this._v(" Startup configuration (Non-Volatile Storage, NVS)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("To enter "),e("em",[this._v("startup configuration mode")]),this._v(", follow the sequence:")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ol",[i("li",[t._v("ensure the ESP32 is connected to a USB power source, the red LED on the ESP32 board should be illuminated")]),t._v(" "),i("li",[t._v("turn the front panel power switch "),i("strong",[t._v("off")]),t._v(", "),i("code",[t._v("PWR OFF")]),t._v(", the down position")]),t._v(" "),i("li",[t._v("hold the "),i("code",[t._v("EXAMINE")]),t._v(" toggle in the "),i("strong",[t._v("Examine")]),t._v(", up position")]),t._v(" "),i("li",[t._v("press and release the "),i("code",[t._v("Reset")]),t._v(" switch while holding the "),i("code",[t._v("EXAMINE")]),t._v(" toggle up")]),t._v(" "),i("li",[t._v("hold the "),i("code",[t._v("EXAMINE")]),t._v(" toggle for a second or two")]),t._v(" "),i("li",[t._v("release the "),i("code",[t._v("EXAMINE")]),t._v(" toggle")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("There are 2 "),i("code",[t._v("Reset")]),t._v(" switches available that both do the same thing:")]),t._v(" "),i("ul",[i("li",[t._v("The "),i("code",[t._v("Tactile Switch SPST-NO")]),t._v(" you installed in the "),i("code",[t._v("Reset")]),t._v(" position on the PCB")]),t._v(" "),i("li",[t._v("The small tactile switch on the ESP32 board marked "),i("code",[t._v("EN")])]),t._v(" "),i("li",[i("strong",[t._v("NOT")]),t._v(" the "),i("em",[t._v("blue toggle switch")]),t._v(" on the front panel")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The IMSAI 8080esp should now be in "),i("em",[t._v("startup configuration mode")]),t._v(". This is indicted by a running LED pattern (right to left) on the 4 LEDS at the right hand side of the front panel ("),i("code",[t._v("HOLD")]),t._v(", "),i("code",[t._v("WAIT")]),t._v(", "),i("code",[t._v("RUN")]),t._v(", "),i("code",[t._v("INTERRUPTS ENABLED")]),t._v(").")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("The current "),e("em",[this._v("startup configuration value")]),this._v(" is displayed on the Address Bus LEDs (bits 0-15) when you enter "),e("em",[this._v("startup configuration mode")]),this._v(".")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("The whole procedure, including entering a value to boot into CP/M 2.2 (see below) is demonstrated in this "),e("em",[this._v("Kit Assembly")]),this._v(" video\n"),this._v(" "),e("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/Cwv_gRtWnZM?start=200",frameborder:"0",allow:"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""}})])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"warning custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),i("p",[t._v("When you "),i("strong",[t._v("Deposit")]),t._v(" a new "),i("em",[t._v("startup configuration value")]),t._v(", all the bits of the current value are overwritten. If your objective is to "),i("strong",[t._v("modify")]),t._v(" the existing value changing only a few of the bits, you must toggle in all the bits of the existing value indicated by the Address Bus LEDs and then switch the bits you want to configure differently, before you "),i("strong",[t._v("Deposit")]),t._v(" this new value.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("Booting into XYBASIC")]),t._v(" "),i("p",[t._v("To configure the IMSAI 8080esp to boot directly into a ROM based "),i("em",[t._v("XYBASIC")]),t._v(" in Z80 mode @ 4 MHz, the following startup configuration value can be used.")]),t._v(" "),i("ul",[i("li",[t._v("Binary: 0000 0100 0101 0000")]),t._v(" "),i("li",[t._v("Octal: 002120")]),t._v(" "),i("li",[t._v("Hexadecimal: 0450")])]),t._v(" "),i("ol",[i("li",[t._v("Enter "),i("em",[t._v("startup configuration mode")]),t._v(" (above)")]),t._v(" "),i("li",[t._v("Toggle in this value on the "),i("strong",[t._v("Address")]),t._v(" toggle switches")]),t._v(" "),i("li",[t._v("Raise the "),i("code",[t._v("DEPOSIT")]),t._v(" toggle to the "),i("strong",[t._v("Deposit")]),t._v(", up position to store the entered startup configuration value.")]),t._v(" "),i("li",[t._v("Reboot the IMSAI 8080esp by pressing a "),i("code",[t._v("Reset")]),t._v(" switch")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("Booting into CP/M 2.2")]),t._v(" "),i("p",[t._v("To configure the IMSAI 8080esp to boot from the disk image in drive "),i("code",[t._v("DSK:A:")]),t._v(" in Z80 mode @ 4 MHz, the following startup configuration value can be used. You can mount the "),i("code",[t._v("cpm_22.dsk")]),t._v(" disk image in drive "),i("code",[t._v("DSK:A:")]),t._v(" via the "),i("em",[t._v("Desktop UI")]),t._v(".")]),t._v(" "),i("ul",[i("li",[t._v("Binary: 0000 1001 0101 0000")]),t._v(" "),i("li",[t._v("Octal: 004520")]),t._v(" "),i("li",[t._v("Hexadecimal: 0950")])]),t._v(" "),i("ol",[i("li",[t._v("Enter "),i("em",[t._v("startup configuration mode")]),t._v(" (above)")]),t._v(" "),i("li",[t._v("Toggle in this value on the "),i("strong",[t._v("Address")]),t._v(" toggle switches")]),t._v(" "),i("li",[t._v("Raise the "),i("code",[t._v("DEPOSIT")]),t._v(" toggle to the "),i("strong",[t._v("Deposit")]),t._v(", up position to store the entered startup configuration value.")]),t._v(" "),i("li",[t._v("Reboot the IMSAI 8080esp by pressing a "),i("code",[t._v("Reset")]),t._v(" switch")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("table",[i("thead",[i("tr",[i("th",{staticStyle:{"text-align":"right"}},[t._v("Address Bit")]),t._v(" "),i("th",[t._v("Name")]),t._v(" "),i("th",[t._v("Equivalent Flag")]),t._v(" "),i("th",[t._v("Description")])])]),t._v(" "),i("tbody",[i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("0")]),t._v(" "),i("td",[t._v("NVS_POST")]),t._v(" "),i("td",[t._v("n/a")]),t._v(" "),i("td",[t._v("Enable Power On Self Test (POST)")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("1-2")]),t._v(" "),i("td",[t._v("NVS_LOG_LEVEL")]),t._v(" "),i("td",[t._v("n/a")]),t._v(" "),i("td",[t._v("Set ESP32 console "),i("strong",[t._v("Log Level")]),t._v(", 0 = NONE; 1 = ERROR; 2 = WARN; 3 = INFO")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("3")]),t._v(" "),i("td",[t._v("NVS_IF_STA")]),t._v(" "),i("td",[t._v("n/a")]),t._v(" "),i("td",[t._v("Set Wi-Fi Mode, 0 = Access Point Mode (AP); 1 = Station Mode (STA)")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("4")]),t._v(" "),i("td",[t._v("NVS_Z80")]),t._v(" "),i("td",[i("code",[t._v("-z")]),t._v(", "),i("code",[t._v("-8")])]),t._v(" "),i("td",[t._v("Enable Z80 CPU emulation, 0 = 8080 "),i("code",[t._v("-8")]),t._v("; 1 = Z80 "),i("code",[t._v("-z")])])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("5")]),t._v(" "),i("td",[t._v("NVS_NO_UNDOC")]),t._v(" "),i("td",[i("code",[t._v("-u")])]),t._v(" "),i("td",[t._v("Suppress support for undocumented op. codes, 1 = "),i("code",[t._v("-u")])])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("6")]),t._v(" "),i("td",[t._v("NVS_4MHZ")]),t._v(" "),i("td",[i("code",[t._v("-f")])]),t._v(" "),i("td",[t._v("Set CPU speed, 0 = 2 MHz "),i("code",[t._v("-f 2")]),t._v("; 1 = 4 MHz "),i("code",[t._v("-f 4")])])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("7")]),t._v(" "),i("td",[t._v("NVS_UNLIMITED")]),t._v(" "),i("td",[i("code",[t._v("-f 0")])]),t._v(" "),i("td",[t._v("Set CPU speed to Unlimited, 0 = use speed from bit 6; 1 = Unlimited "),i("code",[t._v("-f 0")])])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("8-10")]),t._v(" "),i("td",[t._v("NVS_MEMORY_MAP")]),t._v(" "),i("td",[i("code",[t._v("-M")])]),t._v(" "),i("td",[t._v("Set memory map, 0 = default 64K RAM, 1-7 = use memory map "),i("em",[t._v("n")]),t._v(" "),i("code",[t._v("-M n")])])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("11")]),t._v(" "),i("td",[t._v("NVS_BANK_ROM")]),t._v(" "),i("td",[i("code",[t._v("-R")])]),t._v(" "),i("td",[t._v("Enable "),i("strong",[t._v("MPU-B(A)")]),t._v(" style Banked ROM/RAM functionality, 1 = "),i("code",[t._v("-r")]),t._v(". Only compatible with MPU-A ROM images.")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("12-14")]),t._v(" "),i("td"),t._v(" "),i("td"),t._v(" "),i("td",[t._v("Reserved for future use")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("15")]),t._v(" "),i("td",[t._v("NVS_AUTO_RUN")]),t._v(" "),i("td"),t._v(" "),i("td",[t._v("Autorun - The CPU will automatically run when the machine is switched on ("),i("code",[t._v("PWR ON")]),t._v(")")])])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ol",[i("li",[t._v("To "),i("strong",[t._v("set")]),t._v(" a bit, put the corresponding "),i("strong",[t._v("Address")]),t._v(" toggle switch in the "),i("strong",[t._v("up")]),t._v(" position.")]),t._v(" "),i("li",[t._v("To "),i("strong",[t._v("clear")]),t._v(" a bit, put the corresponding "),i("strong",[t._v("Address")]),t._v(" toggle switch in the "),i("strong",[t._v("down")]),t._v(" position.")]),t._v(" "),i("li",[t._v("Raise the "),i("code",[t._v("DEPOSIT")]),t._v(" toggle to the "),i("strong",[t._v("Deposit")]),t._v(", up position to store the entered startup configuration value.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"warning custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),i("p",[t._v("The IMSAI 8080esp must be rebooted for the new configuration to take effect.")]),t._v(" "),i("p",[t._v("This can be done by raising the "),i("code",[t._v("RESET")]),t._v(" toggle or by pressing a "),i("code",[t._v("Reset")]),t._v(" switch.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("For further details about the "),i("em",[t._v("Equivalent Flag")]),t._v(" refer to the "),i("strong",[t._v("Z80PACK")]),t._v(" documentation for the "),i("strong",[t._v("imsaisim")]),t._v(" machine.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"serial-communications-rs232-usb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#serial-communications-rs232-usb"}},[this._v("#")]),this._v(" Serial Communications (RS232, USB)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("strong",[this._v("IMSAI 8080esp")]),this._v(" is configured with two "),e("em",[this._v("virtual")]),this._v(" "),e("strong",[this._v("IMSAI SIO-2")]),this._v(" UART boards.")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("table",[i("thead",[i("tr",[i("th",{staticStyle:{"text-align":"center"}},[t._v("SIO Board")]),t._v(" "),i("th",{staticStyle:{"text-align":"center"}},[t._v("UART Port")]),t._v(" "),i("th",[t._v("I/O ports (decimal)")]),t._v(" "),i("th",[t._v("Connected Device")]),t._v(" "),i("th",[t._v("CP/M 2.2 Device via BIOS")])])]),t._v(" "),i("tbody",[i("tr",[i("td",{staticStyle:{"text-align":"center"}},[t._v("#1")]),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("A (SIO1)")]),t._v(" "),i("td",[t._v("2 (data), 3 (status)")]),t._v(" "),i("td",[t._v("Physical "),i("strong",[t._v("UART0")]),t._v(" (Tx/Rx Patch pins & USB)")]),t._v(" "),i("td",[t._v("TTY:")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"center"}}),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("B")]),t._v(" "),i("td",[t._v("4 (data), 5 (status)")]),t._v(" "),i("td",[t._v("Virtual VIO keyboard")]),t._v(" "),i("td",[t._v("CRT: (input only, no output)")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"center"}},[t._v("#2")]),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("A (SIO2)")]),t._v(" "),i("td",[t._v("34 (data), 35 (status)")]),t._v(" "),i("td",[t._v("Physical "),i("strong",[t._v("UART1")]),t._v(" (IO22/IO5 Patch pins)")]),t._v(" "),i("td",[t._v("UC1: (default)")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"center"}}),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("B")]),t._v(" "),i("td",[t._v("36 (data), 37 (status)")]),t._v(" "),i("td",[t._v("Virtual 'AT' Hayes modem")]),t._v(" "),i("td",[t._v("(assignable as UC1:)")])])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("When the machine boots, the "),i("em",[t._v("virtual")]),t._v(" "),i("strong",[t._v("SIO1")]),t._v(" UART (board #1 port A) is routed to the "),i("em",[t._v("physical")]),t._v(" "),i("strong",[t._v("UART0")]),t._v(" on the "),i("code",[t._v("ESP32-PICO-KIT")]),t._v(".")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("This enables you to use any software on the IMSAI 8080 that communicates via this UART on the SIO (namely the CP/M TTY: as console) using a terminal or terminal emulator depending your method of connection.")]),this._v(" "),e("li",[this._v("The default speed with the current firmware is 115200 baud @ 8N1")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("Both the "),i("em",[t._v("ESP32 console log")]),t._v(" and the IMSAI 8080 "),i("strong",[t._v("SIO1")]),t._v(" (TTY:) will be directed to the serial "),i("strong",[t._v("UART0")]),t._v(". If you set the "),i("code",[t._v("NVS_LOG_LEVEL")]),t._v(" to "),i("code",[t._v("INFO")]),t._v(" (3) this will likely send console log messages during normal use of the machine. It is recommended to set the "),i("code",[t._v("NVS_LOG_LEVEL")]),t._v(" to a lower level during normal operation.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"warning custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),i("p",[t._v("If you start the "),i("strong",[t._v("Desktop UI")]),t._v(" from a web browser and the "),i("em",[t._v("TTY: virtual device")]),t._v(" is connected (default behavior) then the "),i("em",[t._v("virtual")]),t._v("* SIO1 UART (TTY:) is disconnected from the "),i("em",[t._v("physical")]),t._v(" UART0 on the "),i("code",[t._v("ESP32-PICO-KIT")]),t._v(" and instead re-routed to the "),i("em",[t._v("TTY: virtual device")]),t._v(" on the Desktop UI. If the "),i("em",[t._v("TTY: virtual device")]),t._v(" is disconnected, then the SIO1 UART is re-routed back to the UART0 on the "),i("code",[t._v("ESP32-PICO-KIT")]),t._v(", ie. only one of these two destinations can be connected at a time.")]),t._v(" "),i("p",[i("strong",[t._v("Note: the "),i("em",[t._v("ESP32 console log")]),t._v(" is always sent to the physical UART0 and is never redirected.")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"serial-uart-over-usb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#serial-uart-over-usb"}},[this._v("#")]),this._v(" Serial UART over USB")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("code",[this._v("ESP32-PICO-KIT")]),this._v(" supports serial communications from UART0 over USB. It uses a "),e("em",[this._v("Silicon Labs CP210x USB to UART bridge")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ol",[i("li",[t._v("connect the "),i("code",[t._v("ESPP32-PICO-KIT")]),t._v(" to a PC using a suitable USB cable")]),t._v(" "),i("li",[t._v("start a terminal emulator on the PC set for 115200 baud 8N1 connected to the serial device your OS identifies the "),i("code",[t._v("ESP32-PICO-KIT")]),t._v(" on\n"),i("ul",[i("li",[t._v("Windows will be a COMx: port")]),t._v(" "),i("li",[t._v("OSX will be /dev/tty.SLAB_USBtoUART")]),t._v(" "),i("li",[t._v("Linux will be /dev/ttyUSB0 (or similar, TBA)")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("If you do not see a TTY/COM port on your PC presented by the ESP32-PICO-KIT when connected, you may need to install a driver for the "),e("em",[this._v("Silicon Labs CP210x USB to UART bridge")]),this._v(".")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"serial-uart-over-rs232"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#serial-uart-over-rs232"}},[this._v("#")]),this._v(" Serial UART over RS232")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[e("em",[this._v("Serial UART0 over RS232")]),this._v(" and "),e("em",[this._v("Serial UART0 over USB")]),this._v(" are mutually exclusive, ie. they cannot be used at the same time.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[i("em",[t._v("Serial UART over RS232")]),t._v(" is configured by using the supplied jumpers/shunts to bridge the required pins on the "),i("code",[t._v("Patch")]),t._v(" and "),i("code",[t._v("Comms")]),t._v(" headers accessible on the rear of the PCB, and connecting a suitable RS232 device to one of the DE-9M connectors labeled "),i("code",[t._v("RS232-1")]),t._v(" and "),i("code",[t._v("RS232-2")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("You must position 4 of the jumpers/shunts provided to enable a "),i("em",[t._v("Serial UART over RS232")]),t._v(". This image shows the currently supported configuration for the jumpers/shunts on both the "),i("code",[t._v("Patch")]),t._v(" and "),i("code",[t._v("Comms")]),t._v(" headers for "),i("strong",[t._v("UART0")]),t._v(" to "),i("code",[t._v("RS232-1")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:i(118),alt:"Patch & Comms jumpers"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"uart0-to-rs232-1"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#uart0-to-rs232-1"}},[this._v("#")]),this._v(" UART0 to RS232-1")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h5",{attrs:{id:"patch-header"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#patch-header"}},[this._v("#")]),this._v(" Patch header")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("bridge Tx - T1 - vertical "),e("em",[this._v("position second from right")])]),this._v(" "),e("li",[this._v("bridge Rx - R1 - vertical "),e("em",[this._v("right most position")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h5",{attrs:{id:"comms-header"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#comms-header"}},[this._v("#")]),this._v(" Comms header")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("bridge @ Tx1 - horizontal "),e("em",[this._v("second position from top")])]),this._v(" "),e("li",[this._v("bridge @ Rx1 - horizontal "),e("em",[this._v("fourth position from top")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"uart1-to-rs232-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#uart1-to-rs232-2"}},[this._v("#")]),this._v(" UART1 to RS232-2")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h5",{attrs:{id:"patch-header-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#patch-header-2"}},[this._v("#")]),this._v(" Patch header")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("bridge IO22 - T2 - vertical "),e("em",[this._v("position third from right")])]),this._v(" "),e("li",[this._v("bridge IO5 - R2 - vertical "),e("em",[this._v("position fourth from right")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h5",{attrs:{id:"comms-header-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#comms-header-2"}},[this._v("#")]),this._v(" Comms header")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("bridge @ Tx2 - horizontal "),e("em",[this._v("third position from bottom")])]),this._v(" "),e("li",[this._v("bridge @ Rx2 - horizontal "),e("em",[this._v("last position at bottom")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"configuring-physical-uart-parameters-speed-data-stop-bits"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuring-physical-uart-parameters-speed-data-stop-bits"}},[this._v("#")]),this._v(" Configuring physical UART parameters (speed, data & stop bits)")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("You can configure the parameters for both "),i("strong",[t._v("UART0")]),t._v(" ("),i("code",[t._v("RS232-1")]),t._v("/USB) and "),i("strong",[t._v("UART1")]),t._v(" ("),i("code",[t._v("RS232-2")]),t._v(") via the "),i("code",[t._v("boot.conf")]),t._v(" file.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"wi-fi-communications"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wi-fi-communications"}},[this._v("#")]),this._v(" Wi-Fi Communications")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The ESP32 has on-board Wi-Fi and can boot in either "),i("strong",[t._v("Access Point")]),t._v(" (AP) or "),i("strong",[t._v("Station")]),t._v(" (STA) mode. The mode is determined by the "),i("strong",[t._v("NVS_IF_STA")]),t._v(" bit in the "),i("em",[t._v("startup configuration")]),t._v(" stored in NVS and described "),i("a",{attrs:{href:"#startup-configuration-non-volatile-storage-nvs"}},[t._v("above")]),t._v(".")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("In AP mode, the ESP32 acts as an Access Point and broadcasts a system defined SSID and provides DHCP services for clients to connect\n"),i("ul",[i("li",[t._v("The "),i("strong",[t._v("SSID")]),t._v(" hardcoded in the firmware is "),i("em",[t._v("imsai")]),t._v(" with a "),i("strong",[t._v("password")]),t._v(" of "),i("em",[t._v("password")]),t._v(", this will only be used if the "),i("strong",[t._v("boot.conf")]),t._v(" file on the microSD card cannot be read or does not include a "),i("code",[t._v("HOSTNAME=name")]),t._v(" statement, see "),i("a",{attrs:{href:"#boot-conf-file"}},[t._v("Boot.conf file")]),t._v(" below.")]),t._v(" "),i("li",[t._v("If a "),i("code",[t._v("HOSTNAME=name")]),t._v(" statement is found in the "),i("strong",[t._v("boot.conf")]),t._v(" file, then this hostname is also used as the "),i("strong",[t._v("SSID")]),t._v(" in AP mode. In this case, the "),i("strong",[t._v("password")]),t._v(" still remains "),i("em",[t._v("password")])])])]),t._v(" "),i("li",[t._v("In STA mode, the ESP32 acts as a Wi-Fi station or client and can join an existing Wi-Fi network (supporting WPA or WPA2, but not Enterprise WPA).\n"),i("ul",[i("li",[t._v("The "),i("strong",[t._v("SSID")]),t._v(" and "),i("strong",[t._v("password")]),t._v(" of the desired Wi-Fi network must be configured in the "),i("strong",[t._v("boot.conf")]),t._v(" file using the "),i("code",[t._v("SSID=name")]),t._v(" and "),i("code",[t._v("PASSWORD=password")]),t._v(" statements, see "),i("a",{attrs:{href:"#boot-conf-file"}},[t._v("Boot.conf file")]),t._v(" below.")])])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("The "),i("strong",[t._v("boot.conf")]),t._v(" file can be edited via the "),i("strong",[t._v("SYS:")]),t._v(" virtual system device in the Desktop UI while connected to the IMSAI 8080esp running in AP mode.\nAlternatively the "),i("strong",[t._v("microSD Card")]),t._v(" can be mounted in a PC and the "),i("code",[t._v("/imsai/conf/boot.conf")]),t._v(" file edited directly in a text editor then the "),i("strong",[t._v("microSD Card")]),t._v(" returned to the IMSAI 8080esp before it is powered on.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("When the IMSAI 8080esp is configured to work in station mode (STA) but it is unable to make a connection to the configured Wi-Fi network within 30 seconds, the ESP32 will reboot and temporarily start in AP mode.")]),this._v(" "),e("ul",[e("li",[this._v("This enables you to connect to the IMSAI 8080esp from a browser on the advertised SSID and modify/correct the STA mode Wi-Fi configuration.")]),this._v(" "),e("li",[this._v("The simplest way to determine if this has happed is to look for the AP mode SSID being broadcast, or to look at the ESP32 console log output on the UART.")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"danger custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("The design of the IMSAI 8080esp is intended for only "),e("strong",[this._v("one")]),this._v(" Wi-Fi client (browser)to be connected at any given time. It is untested and not recommended to connect multiple clients at the same time.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"boot-conf-file"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#boot-conf-file"}},[this._v("#")]),this._v(" Boot.conf file")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("strong",[this._v("boot.conf")]),this._v(" file is located on the microSD card with the path "),e("code",[this._v("/imsai/conf/boot.conf")]),this._v("\nAs the ESP32 boots this file is loaded, each line parsed and the "),e("strong",[this._v("variable=value")]),this._v(" pair is added to the environment (like posix environment variables).")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"danger custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("There is little to no error checking done at the moment. If you significantly change this file and remove a variable, or leave a value blank you may cause the boot process to fail. I know I've managed to do that once or twice.")]),this._v(" "),e("p",[this._v("The solution is to mount the microSD card on a PC and edit the "),e("strong",[this._v("boot.conf")]),this._v(" file to fix the problem.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"default-boot-conf"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#default-boot-conf"}},[this._v("#")]),this._v(" Default boot.conf")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("### Network configuration\nNTP_SERVER=pool.ntp.org\nTZ=AEST-10AEDT,M10.1.0,M4.1.0\nHOSTNAME=imsai8080\nPORT=80\nSSID=mySSID\nPASSWORD=myPASSWORD\nWIFI.sta.scan=1\n#WIFI.password.hide=1\n### UART configuration\n#UART0=115200,cs8\n#UART1=115200,cs8\n### Performance parameters\n#TTY.netsrv.buffer_delay=33\n#LPT.netsrv.buffer_delay=33\n### Harddisk image\nHARDDISK=hd-ws4\n### SIO-2 default port mappings (HAL)\n#SIO1.portA.device=WEBTTY,UART0\n#SIO1.portB.device=VIOKBD\n#SIO2.portA.device=WEBPTR,UART1\n#SIO2.portB.device=MODEM\n### Modem initialization string. Example:\n#MODEM.init=ATS0=1S15=1&A1 #S0=1 auto-answer after 1 ring, S15=1 enable telnet protocol\nMODEM.init=ATS15=1 #S15=1 enable telnet protocol\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"network-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#network-configuration"}},[this._v("#")]),this._v(" Network Configuration")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("em",[this._v("Network configuration")]),this._v(" entries should be familiar and mostly self explanatory.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The TZ variable cannot use values like "),e("em",[this._v("Sydney/Australia")]),this._v(" (Olson format) but must use explicitly defined timezone strings (POSIX format) eg. "),e("code",[this._v("TZ=AEST-10AEDT,M10.1.0,M4.1.0")]),this._v(" which is correct for Sydney, Australia.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"uart-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#uart-configuration"}},[this._v("#")]),this._v(" UART Configuration")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("em",[this._v("UART configuration")]),this._v(" entries define the speed, data & stop bits for the two physical UARTs on the ESP32, "),e("strong",[this._v("UART0")]),this._v(" and "),e("strong",[this._v("UART1")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("### UART configuration\nUART0=115200,cs8 # ie. 115200, 8N1 - not required because this is default\nUART1=9600 cs7 cstopb parenb parodd # ie. 9600, 7O2\n")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("parameters can be separated by "),i("em",[t._v("spaces")]),t._v(" or "),i("em",[t._v("commas")])]),t._v(" "),i("li",[t._v("parameters are "),i("em",[t._v("case insensitive")])]),t._v(" "),i("li",[t._v("parameters follow the convention used by the "),i("code",[t._v("screen")]),t._v(" program under "),i("em",[t._v("unix/linux/gnu")]),t._v(" ie.:\n"),i("ul",[i("li",[t._v("default is "),i("code",[t._v("115200,cs8")]),t._v(" in other words 115200 8N1")]),t._v(" "),i("li",[t._v("standard baud rates from "),i("code",[t._v("110")]),t._v(" to "),i("code",[t._v("230400")]),t._v(" e.g. 110, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400 others may work, but you'll have to experiment")]),t._v(" "),i("li",[i("code",[t._v("cs7")]),t._v(" - for 7 data bits")]),t._v(" "),i("li",[i("code",[t._v("cs8")]),t._v(" - for 8 data bits")]),t._v(" "),i("li",[i("code",[t._v("cstopb")]),t._v(" - for 2 stop bits, default is 1")]),t._v(" "),i("li",[i("code",[t._v("parenb")]),t._v(" - for even parity, default is none")]),t._v(" "),i("li",[i("code",[t._v("parenb,parodd")]),t._v(" - for odd parity")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"performance-parameters"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#performance-parameters"}},[this._v("#")]),this._v(" Performance parameters")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The "),i("em",[t._v("Performance parameters")]),t._v(" exist only for the two devices "),i("code",[t._v("TTY:")]),t._v(" (default: SIO1A) and "),i("code",[t._v("LPT:")]),t._v(" and apply only to websocket communication to the "),i("em",[t._v("Desktop UI")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("### Performance parameters\nTTY.netsrv.buffer_delay=33\nLPT.netsrv.buffer_delay=33\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"harddisk-image"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#harddisk-image"}},[this._v("#")]),this._v(" Harddisk image")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The current harddisk image is visible on the desktop as "),e("code",[this._v("I:DSK:")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Harddisk images are visible in the disk library "),e("code",[this._v("LIB:")]),this._v(" and indicated with a "),e("em",[this._v("harddisk")]),this._v(" icon. You can drag-and-drop a new harddisk onto the "),e("code",[this._v("LIB:")]),this._v(" window to upload a new harddisk image.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The harddisk function is inactive unless you include the following line in "),e("code",[this._v("boot.conf")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("HARDDISK=imagename\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("### Harddisk image (don't include the .hdd extension)\nHARDDISK=hd-ws4\n")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The harddisk image file must reside in "),i("code",[t._v("/imsai/disks/")]),t._v(" and end with "),i("code",[t._v(".hdd")]),t._v(" eg. "),i("code",[t._v("/imsai/disks/hd-ws4.hdd")]),t._v("\nDo not use the "),i("code",[t._v(".dsk")]),t._v(" extension for a harddisk image as it will be confused with a floppy disk image")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("If you change harddisk image you must "),e("strong",[this._v("reboot")]),this._v(" the IMSAI8080esp to load the new image")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("There is no UI for changing hard disk images, the required image must be set using the environment variable "),e("code",[this._v("HARDDISK")]),this._v(" in the "),e("code",[this._v("boot.conf")]),this._v(" file and then the ESP32 hard reset to reload the environment.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"sio-2-port-mappings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#sio-2-port-mappings"}},[this._v("#")]),this._v(" SIO-2 port mappings")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("the SIO port mapping configuration is loaded and reported to the debug console (UART0/USB) when the IMSAI8080esp is started/powered-on")]),this._v(" "),e("li",[this._v("the SIO port mapping configuration is also displayed in the SYS: virtual device on the desktop UI")]),this._v(" "),e("li",[this._v("when no SIO port mapping configuration is specified, a stanard configuration is the default, and reported as follows:")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-config extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("SIO PORT MAP:\nSIO1.portA = WEBTTY UART0 \nSIO1.portB = VIOKBD \nSIO2.portA = UART1 \nSIO2.portB = MODEM\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("simplify the addition of new character mode devices in future\neg. additional hardware UART; network sockets; additional telnet listeners; new virtual peripherals on the desktop UI")]),this._v(" "),e("li",[this._v("enable the user to assign specific devices to each of the four (4) virtual SIO-2 serial ports")]),this._v(" "),e("li",[this._v("details of configuring the SIO port mappings will be published later")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"modem-initialization-string"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modem-initialization-string"}},[this._v("#")]),this._v(" Modem initialization string")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("This string will be processed by the 'AT' Modem when it is initialised and reset (ie. with the command "),e("code",[this._v("ATZ")]),this._v(")")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("auto-answer after 1 ring ("),i("code",[t._v("ATS0=1")]),t._v(")")]),t._v(" "),i("li",[t._v("enable telnet protocol ("),i("code",[t._v("ATS15=1")]),t._v(")")]),t._v(" "),i("li",[t._v('enable answer mode (ie. listen) in "daemon" mode ('),i("code",[t._v("AT&A1")]),t._v(")")]),t._v(" "),i("li",[t._v("with the commands concatenated into a single command string "),i("code",[t._v("ATS0=1S15=1&A1")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("#Modem initialization string\nMODEM.init=ATS0=1S15=1&A1\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"system-conf-file"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#system-conf-file"}},[this._v("#")]),this._v(" System.conf file")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("strong",[this._v("system.conf")]),this._v(" file is located on the microSD card with the path "),e("code",[this._v("/imsai/conf/system.conf")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Some settings in this file are legacy, maintained for source code compatibility with the "),e("em",[this._v("Z80PACK, imsaisim")]),this._v(" machine. Only the parameters documented here have any effect on the "),e("strong",[this._v("IMSAI8080esp")]),this._v(".")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"sio-flags"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#sio-flags"}},[this._v("#")]),this._v(" SIO flags")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("strong",[this._v("SIO flags")]),this._v(" affect the behavior of the the four "),e("em",[this._v("virtual")]),this._v(" SIO serial ports that are (by default) mapped to "),e("em",[this._v("physical")]),this._v(" UARTs on the ESP32.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("These four "),e("em",[this._v("virtual")]),this._v(" serial ports can:")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("force upper case")]),t._v(" "),i("li",[t._v("strip the parity bit (the MSB in each character byte) - the default for the CP/M console (SIO1)")]),t._v(" "),i("li",[t._v("drop nulls")]),t._v(" "),i("li",[t._v("set a "),i("em",[t._v("virtual")]),t._v(" baud rate (independent of the "),i("em",[t._v("physical")]),t._v(" UARTs baudrate - the lower rate will determine the actual speed)")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The functions are "),i("strong",[t._v("enabled")]),t._v(" by setting the flag value to "),i("strong",[t._v("1")]),t._v(" or "),i("strong",[t._v("disabled")]),t._v(" with a value of "),i("strong",[t._v("0")]),t._v(" (zero - the default)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("If the "),e("em",[this._v("virtual")]),this._v(" baud rate is set to 0 (zero) then no rate limit is applied by the "),e("em",[this._v("virtual")]),this._v(" SIO serial port")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-config extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("# SIO 1 Channel A, Ports 2/3 connected to terminal UART0/RS232-1/USB (default)\nsio1a_upper_case\t0\nsio1a_strip_parity\t0\nsio1a_drop_nulls\t1\nsio1a_baud_rate\t\t115200 \n# typical baud rate values are 110, 300, 1200, 2400, 4800, 9600,\n# 19200, 38400, 57600, 115200 - 0 = unlimited baud rate\n\n# SIO 1 Channel B, Ports 4/5 connected to VIO keyboard\nsio1b_upper_case\t0\nsio1b_strip_parity\t0\nsio1b_drop_nulls\t0\nsio1b_baud_rate\t\t1200 \n\n# SIO 2 Channel A, Ports 34/35 connected to UART1/RS232-2 (default)\n# use 8bit here, so that serial file transfers work\nsio2a_upper_case\t0\nsio2a_strip_parity\t0\nsio2a_drop_nulls\t0\nsio2a_baud_rate\t\t9600 \n# typical baud rate values are 110, 300, 1200, 2400, 4800, 9600,\n# 19200, 38400, 57600, 115200 - 0 = unlimited baud rate\n\n# SIO 2 Channel B, ports 36/37 connected to 'AT' telnet modem (default)\n# use 8bit here, so that serial file transfers work\nsio2b_upper_case\t0\nsio2b_strip_parity\t0\nsio2b_drop_nulls\t0\nsio2b_baud_rate\t\t2400 \n")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("If you require "),i("strong",[t._v("8-bit clean")]),t._v(" communications, for example: if using protocols like "),i("em",[t._v("xmodem")]),t._v(", then all of "),i("strong",[t._v("upper case")]),t._v(", "),i("strong",[t._v("strip the parity bit")]),t._v(" and "),i("strong",[t._v("drop_nulls")]),t._v(" should be "),i("strong",[t._v("disabled")])]),t._v(" "),i("p",[t._v("eg.")]),t._v(" "),i("div",{staticClass:"language-config extra-class"},[i("pre",{pre:!0,attrs:{class:"language-text"}},[i("code",[t._v("sio1a_upper_case\t\t0\nsio1a_strip_parity\t\t0\nsio1a_drop_nulls\t\t0\n")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"memory-maps"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#memory-maps"}},[this._v("#")]),this._v(" Memory maps")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The only other parameters that effect the "),e("strong",[this._v("IMSAI 8080esp")]),this._v(" are the "),e("code",[this._v("[MEMORY n]")]),this._v(" sections:")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("# <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>\n# memory configurations in pages a 256 bytes\n# start,size (numbers in decimal, hexadecimal, octal)\n# up to 7 memory sections allowed\n# up to 6 ram/rom statements per section allowed\n# <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>\n\n[MEMORY 1]\n# Default memory configuration used in most situations with MPU-A ROM:\n# 256 pages RAM, 8 pages ROM (replaces or overlays RAM)\nram 0,256\nrom 0xd8,8,mpu-a-rom.hex\n# Start address of the boot ROM\nboot 0xd800\n\n[MEMORY 2]\n# Memory configuration for running MPU-A ROM and VIO ROM:\n# 240 pages RAM, 8 pages ROM (replaces or overlays RAM)\n# 8 pages of RAM and 8 pages of ROM for the VIO from 0xf000\nram 0,0xf0\nrom 0xd8,8,mpu-a-rom.hex\nram 0xf0,8\nrom 0xf8,8,viofm1.hex\n# Start address of the boot ROM\nboot 0xd800\n\n[MEMORY 3]\n# Memory configuration for running with MEMON80 ROM:\n# 248 pages RAM, 8 pages ROM\nram 0,0xf8\nrom 0xf8,8,memon80.hex\n# Start address of the boot ROM\nboot 0xf800\n\n[MEMORY 4]\n# Memory configuration for running ROM based XYBASIC:\n# 16K ROM, 48K RAM\nrom 0,64,xybasic.hex\nram 64,192\n# Start address of the boot ROM\nboot 0x0000\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("A memory map is selected by setting the NVS_MEMORY_MAP bits in the "),e("a",{attrs:{href:"#startup-configuration-non-volatile-storage-nvs"}},[this._v("Startup configuration, NVS")]),this._v(" for details.")])])}],o=i(0),a=Object(o.a)({},(function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"content"},[t._m(0),t._v(" "),i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),t._m(1),t._v(" "),i("p",[t._v("If you are still running and older firmware revision "),i("code",[t._v("v1.9.1")]),t._v(" or earlier, the previous version of the "),i("strong",[t._v("Configuration Guide")]),t._v(" is available "),i("router-link",{attrs:{to:"./old_version_prior_v1.10.0/"}},[t._v("here")])],1)]),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),i("p",[t._v("In order to run any applications, you will need to activate a virtual ROM (eg. to run BASIC, or boot a floppy disk) and maybe load an operating system (such as CP/M) from a virtual disk.")]),t._v(" "),i("p",[t._v("Also like the original computer, your IMSAI 8080esp has no video output port. Owners of the original IMSAI 8080 would connect a serial terminal (either a teletype printer or visual display unit) to a serial port. While you can still do this (see "),i("a",{attrs:{href:"http://localhost:8080/imsai8080/configure/#serial-communications-rs232-usb",target:"_blank",rel:"noopener noreferrer"}},[t._v("Serial Communications"),i("OutboundLink")],1),t._v(" section), this modern kit offers a much easier solution using Wi-Fi.")]),t._v(" "),i("p",[t._v("Once power is applied to your kit, the ESP32 will create a Wi-Fi Access Point. You can connect your computer to this Wi-Fi network as if it were connected to a Wi-FI router. You can then open a web page, the Desktop UI, that will give you full access to the IMSAI 8080esp - including a virtual serial terminal (TTY:), floppy disks, printer (LPT:) and more.")]),t._v(" "),i("p",[t._v("Once connected, you can then configure the IMSAI 8080esp to connect directly to your home Wi-Fi, so you can use it without having to change your Wi-FI settings again.")]),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),i("p",[t._v("Your computer should now be connected, and you will be able to open the Desktop UI. The web interface has been written and tested with the Chrome browser in mind, and you might find it works differently if you are using a different browser.")]),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),i("p",[t._v("The startup configuration is modified via the toggle switches on the front panel.")]),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),t._m(17),t._v(" "),t._m(18),t._v(" "),t._m(19),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),t._m(22),t._v(" "),t._m(23),t._v(" "),t._m(24),t._v(" "),i("p",[t._v("To set the startup configuration mode value, follow the sequence:")]),t._v(" "),t._m(25),t._v(" "),t._m(26),t._v(" "),t._m(27),t._v(" "),t._m(28),t._v(" "),t._m(29),t._v(" "),i("p",[t._v("Each SIO board provides two serial I/O ports. The board/port/devices are assigned as follows:")]),t._v(" "),t._m(30),t._v(" "),t._m(31),t._v(" "),t._m(32),t._v(" "),t._m(33),t._v(" "),i("div",{staticClass:"warning custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),i("p",[t._v("Behavior of serial communications is further effected by the settings on the "),i("em",[t._v("virtual")]),t._v(" "),i("strong",[t._v("SIO")]),t._v(" UARTs (SIO1 and SIO2). See "),i("router-link",{attrs:{to:"./#sio-flags"}},[t._v("SIO flags")]),t._v(" in the "),i("code",[t._v("system.conf")]),t._v(" file below, for further details.")],1)]),t._v(" "),t._m(34),t._v(" "),t._m(35),t._v(" "),t._m(36),t._v(" "),t._m(37),t._v(" "),i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),t._m(38),t._v(" "),i("p",[t._v("Drivers are available direct from the manufacturer at "),i("a",{attrs:{href:"https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers"),i("OutboundLink")],1)])]),t._v(" "),i("p",[t._v("Additional information is available from the Espressif (manufacturer of the "),i("code",[t._v("ESP32-PICO-KIT")]),t._v(") web site at "),i("a",{attrs:{href:"https://docs.espressif.com/projects/esp-idf/en/latest/get-started/establish-serial-connection.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://docs.espressif.com/projects/esp-idf/en/latest/get-started/establish-serial-connection.html"),i("OutboundLink")],1)]),t._v(" "),t._m(39),t._v(" "),t._m(40),t._v(" "),t._m(41),t._v(" "),i("p",[t._v("RS232 line levels are provided by the Maxim MAX3232 IC see the "),i("a",{attrs:{href:"https://datasheets.maximintegrated.com/en/ds/MAX3222-MAX3241.pdf",target:"_blank",rel:"noopener noreferrer"}},[t._v("data sheet"),i("OutboundLink")],1),t._v(" for details.")]),t._v(" "),t._m(42),t._v(" "),t._m(43),t._v(" "),t._m(44),t._v(" "),t._m(45),t._v(" "),t._m(46),t._v(" "),t._m(47),t._v(" "),t._m(48),t._v(" "),t._m(49),t._v(" "),t._m(50),t._v(" "),t._m(51),t._v(" "),t._m(52),t._v(" "),t._m(53),t._v(" "),t._m(54),t._v(" "),t._m(55),t._v(" "),i("p",[t._v("See "),i("router-link",{attrs:{to:"./#uart-configuration"}},[t._v("UART Configuration")]),t._v(" in the "),i("code",[t._v("boot.conf")]),t._v(" file below, for further details.")],1),t._v(" "),t._m(56),t._v(" "),t._m(57),t._v(" "),t._m(58),t._v(" "),t._m(59),t._v(" "),t._m(60),t._v(" "),t._m(61),t._v(" "),t._m(62),t._v(" "),t._m(63),t._v(" "),t._m(64),t._v(" "),t._m(65),t._v(" "),i("p",[t._v("The default configuration, as shipped (in Release v1.10.0) is a follows:")]),t._v(" "),t._m(66),t._m(67),t._v(" "),t._m(68),t._v(" "),i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),t._m(69),t._v(" "),i("p",[t._v("A file with TZ variable values for many timezones can be found at "),i("a",{attrs:{href:"https://www.di-mgt.com.au/src/wclocktz.ini",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.di-mgt.com.au/src/wclocktz.ini"),i("OutboundLink")],1),t._v(" "),i("a",{attrs:{href:"https://groups.google.com/d/msg/imsai8080esp/PdNyxAOeBhU/7_IgKXXbCAAJ",target:"_blank",rel:"noopener noreferrer"}},[t._v("Credit to: John Mann in the Forum"),i("OutboundLink")],1)]),t._v(" "),i("p",[t._v("An article that defines the POSIX format can be found at "),i("a",{attrs:{href:"https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Specifying the Time Zone with TZ"),i("OutboundLink")],1),t._v(', however please note, the "third format" referenced in this article is the Olson format, and not supported on the ESP32.')])]),t._v(" "),t._m(70),t._v(" "),t._m(71),t._v(" "),i("p",[t._v("For example:")]),t._v(" "),t._m(72),t._m(73),t._v(" "),t._m(74),t._v(" "),t._m(75),t._v(" "),i("p",[t._v("They specify a time in milliseconds (ms) during which output to the device will be buffered (up to the next line feed character) and transmitted in a single (websocket) packet. This can greatly improve performance of both the TTY: and LPT: devices. If used, recommended optimal settings are:")]),t._v(" "),t._m(76),t._m(77),t._v(" "),i("p",[t._v("A harddisk image (4MB) can be mounted as I:DSK: / Drive I:")]),t._v(" "),t._m(78),t._v(" "),t._m(79),t._v(" "),t._m(80),t._v(" "),t._m(81),i("p",[t._v("e.g.")]),t._v(" "),t._m(82),t._m(83),t._v(" "),t._m(84),t._v(" "),i("p",[t._v("The harddisk cannot be made a bootable device, the bootrom doesn't support this. A CP/M system floppy disk image is still required in drive A: to boot CP/M")]),t._v(" "),t._m(85),t._v(" "),t._m(86),t._v(" "),i("p",[t._v("A HAL (Hardware Abstraction Layer) enables mapping of character mode devices to the four (4) virtual SIO-2 serial ports")]),t._v(" "),t._m(87),t._v(" "),t._m(88),i("p",[t._v("the purpose of the HAL is to:")]),t._v(" "),t._m(89),t._v(" "),t._m(90),t._v(" "),t._m(91),t._v(" "),i("p",[t._v("For example, to initialize the modem for:")]),t._v(" "),t._m(92),t._v(" "),i("p",[t._v("add the following line:")]),t._v(" "),t._m(93),t._m(94),t._v(" "),t._m(95),t._v(" "),t._m(96),t._v(" "),t._m(97),t._v(" "),t._m(98),t._v(" "),t._m(99),t._v(" "),t._m(100),t._v(" "),t._m(101),t._v(" "),t._m(102),t._v(" "),i("p",[t._v("For example:")]),t._v(" "),t._m(103),t._m(104),t._v(" "),t._m(105),t._v(" "),t._m(106),t._v(" "),t._m(107),t._m(108)])}),s,!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/18.31ce3cae.js b/assets/js/18.31ce3cae.js new file mode 100644 index 0000000..6ad7d56 --- /dev/null +++ b/assets/js/18.31ce3cae.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{119:function(t,e,i){t.exports=i.p+"assets/img/rs232_jumpers.aa5b21af.jpg"},260:function(t,e,i){"use strict";i.r(e);var s=[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"configuration-v1-9-1-or-earlier"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuration-v1-9-1-or-earlier"}},[this._v("#")]),this._v(" Configuration - "),e("code",[this._v("v1.9.1")]),this._v(" or earlier")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[this._v("#")]),this._v(" Overview")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Just like the real IMSAI 8080 computer, the default configuration of your kit is an empty machine. While you "),e("em",[this._v("can")]),this._v(" enter instructions using the toggle switches (and you "),e("em",[this._v("should")]),this._v(" experiment with this sometime) it's more interesting to run some real software.\nThe default configuration is like an empty machine with no ROM only RAM.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"getting-connected"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-connected"}},[this._v("#")]),this._v(" Getting connected")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("Plug in the power to the IMSAI 8080esp kit.")]),t._v(" "),i("li",[t._v("On your computer, open the Wi-Fi settings and select the "),i("code",[t._v("imsai8080")]),t._v(" network (SSID).")]),t._v(" "),i("li",[t._v("When prompted for a password, enter "),i("code",[t._v("password")]),t._v(".")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("If you have a Mac, open your browser and enter "),e("code",[this._v("imsai8080.local")]),this._v(" as the web address.")]),this._v(" "),e("li",[this._v("If you have a PC, open your browser and enter "),e("code",[this._v("192.168.4.1")]),this._v(" as the address.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"default-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#default-configuration"}},[this._v("#")]),this._v(" Default configuration")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"imsai-8080-guest"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#imsai-8080-guest"}},[this._v("#")]),this._v(" IMSAI 8080 (guest)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("The default configuration is like an empty machine with no ROM only RAM.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("RAM is 64K occupying the entire address space from "),i("code",[t._v("0000h")]),t._v(" to "),i("code",[t._v("FFFFh")])]),t._v(" "),i("li",[t._v("CPU is Intel 8080 @ 2MHz with support for undocumented op-codes")]),t._v(" "),i("li",[t._v("No boot ROM is active by default")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"esp32-host"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#esp32-host"}},[this._v("#")]),this._v(" ESP32 (host)")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("Wi-Fi set to "),i("strong",[t._v("Access-Point (AP)")]),t._v(" mode with the default SSID of "),i("code",[t._v("imsai8080")]),t._v(", password of "),i("code",[t._v("password")])]),t._v(" "),i("li",[t._v("Hostname (HOSTNAME environment variable) set to "),i("code",[t._v("imsai8080")]),t._v(" ("),i("code",[t._v("imsai8080.local")]),t._v(" for mDNS)")]),t._v(" "),i("li",[t._v("Port (PORT environment variable) set to "),i("code",[t._v("80")])]),t._v(" "),i("li",[t._v("Timezone (TZ environment variable) set for AEST+10, ADST+11 (ie. Sydney, Australia)")]),t._v(" "),i("li",[t._v("Time server (NTP_SERVER environment variable) set to "),i("code",[t._v("pool.ntp.org")])]),t._v(" "),i("li",[t._v("POST (Power On Self Test) disabled")]),t._v(" "),i("li",[t._v("Console log level set to "),i("code",[t._v("NONE")]),t._v(" (details to follow)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Once you are connected to the Wi-Fi network, start a Chrome browser and enter the URL "),e("code",[this._v("http://imsai8080.local")]),this._v(" to see the Desktop UI.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"startup-configuration-non-volatile-storage-nvs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#startup-configuration-non-volatile-storage-nvs"}},[this._v("#")]),this._v(" Startup configuration (Non-Volatile Storage, NVS)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("To enter "),e("em",[this._v("startup configuration mode")]),this._v(", follow the sequence:")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ol",[i("li",[t._v("ensure the ESP32 is connected to a USB power source, the red LED on the ESP32 board should be illuminated")]),t._v(" "),i("li",[t._v("turn the front panel power switch "),i("strong",[t._v("off")]),t._v(", "),i("code",[t._v("PWR OFF")]),t._v(", the down position")]),t._v(" "),i("li",[t._v("hold the "),i("code",[t._v("EXAMINE")]),t._v(" toggle in the "),i("strong",[t._v("Examine")]),t._v(", up position")]),t._v(" "),i("li",[t._v("press and release the "),i("code",[t._v("Reset")]),t._v(" switch while holding the "),i("code",[t._v("EXAMINE")]),t._v(" toggle up")]),t._v(" "),i("li",[t._v("hold the "),i("code",[t._v("EXAMINE")]),t._v(" toggle for a second or two")]),t._v(" "),i("li",[t._v("release the "),i("code",[t._v("EXAMINE")]),t._v(" toggle")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("There are 2 "),i("code",[t._v("Reset")]),t._v(" switches available that both do the same thing:")]),t._v(" "),i("ul",[i("li",[t._v("The "),i("code",[t._v("Tactile Switch SPST-NO")]),t._v(" you installed in the "),i("code",[t._v("Reset")]),t._v(" position on the PCB")]),t._v(" "),i("li",[t._v("The small tactile switch on the ESP32 board marked "),i("code",[t._v("EN")])]),t._v(" "),i("li",[i("strong",[t._v("NOT")]),t._v(" the "),i("em",[t._v("blue toggle switch")]),t._v(" on the front panel")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The IMSAI 8080esp should now be in "),i("em",[t._v("startup configuration mode")]),t._v(". This is indicted by a running LED pattern (right to left) on the 4 LEDS at the right hand side of the front panel ("),i("code",[t._v("HOLD")]),t._v(", "),i("code",[t._v("WAIT")]),t._v(", "),i("code",[t._v("RUN")]),t._v(", "),i("code",[t._v("INTERRUPTS ENABLED")]),t._v(").")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("The current "),e("em",[this._v("startup configuration value")]),this._v(" is displayed on the Address Bus LEDs (bits 0-15) when you enter "),e("em",[this._v("startup configuration mode")]),this._v(".")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("The whole procedure, including entering a value to boot into CP/M 2.2 (see below) is demonstrated in this "),e("em",[this._v("Kit Assembly")]),this._v(" video\n"),this._v(" "),e("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/Cwv_gRtWnZM?start=200",frameborder:"0",allow:"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""}})])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"warning custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),i("p",[t._v("When you "),i("strong",[t._v("Deposit")]),t._v(" a new "),i("em",[t._v("startup configuration value")]),t._v(", all the bits of the current value are overwritten. If your objective is to "),i("strong",[t._v("modify")]),t._v(" the existing value changing only a few of the bits, you must toggle in all the bits of the existing value indicated by the Address Bus LEDs and then switch the bits you want to configure differently, before you "),i("strong",[t._v("Deposit")]),t._v(" this new value.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("Booting into MSBASIC 1.4 (8K)")]),t._v(" "),i("p",[t._v("To configure the IMSAI 8080esp to boot directly into a ROM based "),i("em",[t._v("MSBASIC 1.4 (8K)")]),t._v(" in 8080 mode @ 2 MHz, the following startup configuration value can be used.")]),t._v(" "),i("ul",[i("li",[t._v("Binary: 0000 0100 0000 0000")]),t._v(" "),i("li",[t._v("Octal: 002000")]),t._v(" "),i("li",[t._v("Hexadecimal: 0400")])]),t._v(" "),i("ol",[i("li",[t._v("Enter "),i("em",[t._v("startup configuration mode")]),t._v(" (above)")]),t._v(" "),i("li",[t._v("Toggle in this value on the "),i("strong",[t._v("Address")]),t._v(" toggle switches")]),t._v(" "),i("li",[t._v("Raise the "),i("code",[t._v("DEPOSIT")]),t._v(" toggle to the "),i("strong",[t._v("Deposit")]),t._v(", up position to store the entered startup configuration value.")]),t._v(" "),i("li",[t._v("Reboot the IMSAI 8080esp by pressing a "),i("code",[t._v("Reset")]),t._v(" switch")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("Booting into XYBASIC")]),t._v(" "),i("p",[t._v("To configure the IMSAI 8080esp to boot directly into a ROM based "),i("em",[t._v("XYBASIC")]),t._v(" in Z80 mode @ 4 MHz, the following startup configuration value can be used.")]),t._v(" "),i("ul",[i("li",[t._v("Binary: 0000 0101 0101 0000")]),t._v(" "),i("li",[t._v("Octal: 002520")]),t._v(" "),i("li",[t._v("Hexadecimal: 0550")])]),t._v(" "),i("ol",[i("li",[t._v("Enter "),i("em",[t._v("startup configuration mode")]),t._v(" (above)")]),t._v(" "),i("li",[t._v("Toggle in this value on the "),i("strong",[t._v("Address")]),t._v(" toggle switches")]),t._v(" "),i("li",[t._v("Raise the "),i("code",[t._v("DEPOSIT")]),t._v(" toggle to the "),i("strong",[t._v("Deposit")]),t._v(", up position to store the entered startup configuration value.")]),t._v(" "),i("li",[t._v("Reboot the IMSAI 8080esp by pressing a "),i("code",[t._v("Reset")]),t._v(" switch")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("Booting into CP/M 2.2")]),t._v(" "),i("p",[t._v("To configure the IMSAI 8080esp to boot from the disk image in drive "),i("code",[t._v("DSK:A:")]),t._v(" in Z80 mode @ 4 MHz, the following startup configuration value can be used. You can mount the "),i("code",[t._v("cpm_22.dsk")]),t._v(" disk image in drive "),i("code",[t._v("DSK:A:")]),t._v(" via the "),i("em",[t._v("Desktop UI")]),t._v(".")]),t._v(" "),i("ul",[i("li",[t._v("Binary: 0000 1001 0101 0000")]),t._v(" "),i("li",[t._v("Octal: 004520")]),t._v(" "),i("li",[t._v("Hexadecimal: 0950")])]),t._v(" "),i("ol",[i("li",[t._v("Enter "),i("em",[t._v("startup configuration mode")]),t._v(" (above)")]),t._v(" "),i("li",[t._v("Toggle in this value on the "),i("strong",[t._v("Address")]),t._v(" toggle switches")]),t._v(" "),i("li",[t._v("Raise the "),i("code",[t._v("DEPOSIT")]),t._v(" toggle to the "),i("strong",[t._v("Deposit")]),t._v(", up position to store the entered startup configuration value.")]),t._v(" "),i("li",[t._v("Reboot the IMSAI 8080esp by pressing a "),i("code",[t._v("Reset")]),t._v(" switch")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("table",[i("thead",[i("tr",[i("th",{staticStyle:{"text-align":"right"}},[t._v("Address Bit")]),t._v(" "),i("th",[t._v("Name")]),t._v(" "),i("th",[t._v("Equivalent Flag")]),t._v(" "),i("th",[t._v("Description")])])]),t._v(" "),i("tbody",[i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("0")]),t._v(" "),i("td",[t._v("NVS_POST")]),t._v(" "),i("td",[t._v("n/a")]),t._v(" "),i("td",[t._v("Enable Power On Self Test (POST)")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("1-2")]),t._v(" "),i("td",[t._v("NVS_LOG_LEVEL")]),t._v(" "),i("td",[t._v("n/a")]),t._v(" "),i("td",[t._v("Set ESP32 console "),i("strong",[t._v("Log Level")]),t._v(", 0 = NONE; 1 = ERROR; 2 = WARN; 3 = INFO")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("3")]),t._v(" "),i("td",[t._v("NVS_IF_STA")]),t._v(" "),i("td",[t._v("n/a")]),t._v(" "),i("td",[t._v("Set Wi-Fi Mode, 0 = Access Point Mode (AP); 1 = Station Mode (STA)")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("4")]),t._v(" "),i("td",[t._v("NVS_Z80")]),t._v(" "),i("td",[i("code",[t._v("-z")]),t._v(", "),i("code",[t._v("-8")])]),t._v(" "),i("td",[t._v("Enable Z80 CPU emulation, 0 = 8080 "),i("code",[t._v("-8")]),t._v("; 1 = Z80 "),i("code",[t._v("-z")])])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("5")]),t._v(" "),i("td",[t._v("NVS_NO_UNDOC")]),t._v(" "),i("td",[i("code",[t._v("-u")])]),t._v(" "),i("td",[t._v("Suppress support for undocumented op. codes, 1 = "),i("code",[t._v("-u")])])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("6")]),t._v(" "),i("td",[t._v("NVS_4MHZ")]),t._v(" "),i("td",[i("code",[t._v("-f")])]),t._v(" "),i("td",[t._v("Set CPU speed, 0 = 2 MHz "),i("code",[t._v("-f 2")]),t._v("; 1 = 4 MHz "),i("code",[t._v("-f 4")])])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("7")]),t._v(" "),i("td",[t._v("NVS_UNLIMITED")]),t._v(" "),i("td",[i("code",[t._v("-f 0")])]),t._v(" "),i("td",[t._v("Set CPU speed to Unlimited, 0 = use speed from bit 6; 1 = Unlimited "),i("code",[t._v("-f 0")])])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("8-10")]),t._v(" "),i("td",[t._v("NVS_BOOT_ROM")]),t._v(" "),i("td",[i("code",[t._v("-x")])]),t._v(" "),i("td",[t._v("Set boot ROM to 1 of 7 "),i("em",[t._v("slots")]),t._v(", 0 = No boot ROM, 1-7 = use slot "),i("em",[t._v("n")]),t._v(" "),i("code",[t._v("-x $ROMn")])])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("11")]),t._v(" "),i("td",[t._v("NVS_BANK_ROM")]),t._v(" "),i("td",[i("code",[t._v("-r")])]),t._v(" "),i("td",[t._v("Enable "),i("strong",[t._v("MPU-B(A)")]),t._v(" style Banked ROM/RAM functionality, 1 = "),i("code",[t._v("-r")]),t._v(". Only compatible with MPU-A ROM images.")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"right"}},[t._v("12-15")]),t._v(" "),i("td"),t._v(" "),i("td"),t._v(" "),i("td",[t._v("Reserved for future use")])])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ol",[i("li",[t._v("To "),i("strong",[t._v("set")]),t._v(" a bit, put the corresponding "),i("strong",[t._v("Address")]),t._v(" toggle switch in the "),i("strong",[t._v("up")]),t._v(" position.")]),t._v(" "),i("li",[t._v("To "),i("strong",[t._v("clear")]),t._v(" a bit, put the corresponding "),i("strong",[t._v("Address")]),t._v(" toggle switch in the "),i("strong",[t._v("down")]),t._v(" position.")]),t._v(" "),i("li",[t._v("Raise the "),i("code",[t._v("DEPOSIT")]),t._v(" toggle to the "),i("strong",[t._v("Deposit")]),t._v(", up position to store the entered startup configuration value.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("The IMSAI 8080esp must be rebooted for the new configuration to take effect. This can be done by pressing a "),e("code",[this._v("Reset")]),this._v(" switch.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("For further details about the "),i("em",[t._v("Equivalent Flag")]),t._v(" refer to the "),i("strong",[t._v("Z80PACK")]),t._v(" documentation for the "),i("strong",[t._v("imsaisim")]),t._v(" machine.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"serial-communications-rs232-usb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#serial-communications-rs232-usb"}},[this._v("#")]),this._v(" Serial Communications (RS232, USB)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("strong",[this._v("IMSAI 8080esp")]),this._v(" is configured with two "),e("em",[this._v("virtual")]),this._v(" "),e("strong",[this._v("IMSAI SIO-2")]),this._v(" UART boards.")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("table",[i("thead",[i("tr",[i("th",{staticStyle:{"text-align":"center"}},[t._v("SIO Board")]),t._v(" "),i("th",{staticStyle:{"text-align":"center"}},[t._v("UART Port")]),t._v(" "),i("th",[t._v("I/O ports (decimal)")]),t._v(" "),i("th",[t._v("Connected Device")]),t._v(" "),i("th",[t._v("CP/M 2.2 Device via BIOS")])])]),t._v(" "),i("tbody",[i("tr",[i("td",{staticStyle:{"text-align":"center"}},[t._v("#1")]),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("A (SIO1)")]),t._v(" "),i("td",[t._v("2 (data), 3 (status)")]),t._v(" "),i("td",[t._v("Physical "),i("strong",[t._v("UART0")]),t._v(" (Tx/Rx Patch pins & USB)")]),t._v(" "),i("td",[t._v("TTY:")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"center"}}),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("B")]),t._v(" "),i("td",[t._v("4 (data), 5 (status)")]),t._v(" "),i("td",[t._v("Virtual VIO keyboard")]),t._v(" "),i("td",[t._v("CRT: (input only, no output)")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"center"}},[t._v("#2")]),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("A (SIO2)")]),t._v(" "),i("td",[t._v("34 (data), 35 (status)")]),t._v(" "),i("td",[t._v("Physical "),i("strong",[t._v("UART1")]),t._v(" (IO22/IO5 Patch pins)")]),t._v(" "),i("td",[t._v("UC1: (default)")])]),t._v(" "),i("tr",[i("td",{staticStyle:{"text-align":"center"}}),t._v(" "),i("td",{staticStyle:{"text-align":"center"}},[t._v("B")]),t._v(" "),i("td",[t._v("36 (data), 37 (status)")]),t._v(" "),i("td",[t._v("Virtual 'AT' Hayes modem")]),t._v(" "),i("td",[t._v("(assignable as UC1:)")])])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("When the machine boots, the "),i("em",[t._v("virtual")]),t._v(" "),i("strong",[t._v("SIO1")]),t._v(" UART (board #1 port A) is routed to the "),i("em",[t._v("physical")]),t._v(" "),i("strong",[t._v("UART0")]),t._v(" on the "),i("code",[t._v("ESP32-PICO-KIT")]),t._v(".")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("This enables you to use any software on the IMSAI 8080 that communicates via this UART on the SIO (namely the CP/M TTY: as console) using a terminal or terminal emulator depending your method of connection.")]),this._v(" "),e("li",[this._v("The default speed with the current firmware is 115200 baud @ 8N1")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("Both the "),i("em",[t._v("ESP32 console log")]),t._v(" and the IMSAI 8080 "),i("strong",[t._v("SIO1")]),t._v(" (TTY:) will be directed to the serial "),i("strong",[t._v("UART0")]),t._v(". If you set the "),i("code",[t._v("NVS_LOG_LEVEL")]),t._v(" to "),i("code",[t._v("INFO")]),t._v(" (3) this will likely send console log messages during normal use of the machine. It is recommended to set the "),i("code",[t._v("NVS_LOG_LEVEL")]),t._v(" to a lower level during normal operation.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"warning custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),i("p",[t._v("If you start the "),i("strong",[t._v("Desktop UI")]),t._v(" from a web browser and the "),i("em",[t._v("TTY: virtual device")]),t._v(" is connected (default behavior) then the "),i("em",[t._v("virtual")]),t._v("* SIO1 UART (TTY:) is disconnected from the "),i("em",[t._v("physical")]),t._v(" UART0 on the "),i("code",[t._v("ESP32-PICO-KIT")]),t._v(" and instead re-routed to the "),i("em",[t._v("TTY: virtual device")]),t._v(" on the Desktop UI. If the "),i("em",[t._v("TTY: virtual device")]),t._v(" is disconnected, then the SIO1 UART is re-routed back to the UART0 on the "),i("code",[t._v("ESP32-PICO-KIT")]),t._v(", ie. only one of these two destinations can be connected at a time.")]),t._v(" "),i("p",[i("strong",[t._v("Note: the "),i("em",[t._v("ESP32 console log")]),t._v(" is always sent to the physical UART0 and is never redirected.")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"serial-uart-over-usb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#serial-uart-over-usb"}},[this._v("#")]),this._v(" Serial UART over USB")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("code",[this._v("ESP32-PICO-KIT")]),this._v(" supports serial communications from UART0 over USB. It uses a "),e("em",[this._v("Silicon Labs CP210x USB to UART bridge")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ol",[i("li",[t._v("connect the "),i("code",[t._v("ESPP32-PICO-KIT")]),t._v(" to a PC using a suitable USB cable")]),t._v(" "),i("li",[t._v("start a terminal emulator on the PC set for 115200 baud 8N1 connected to the serial device your OS identifies the "),i("code",[t._v("ESP32-PICO-KIT")]),t._v(" on\n"),i("ul",[i("li",[t._v("Windows will be a COMx: port")]),t._v(" "),i("li",[t._v("OSX will be /dev/tty.SLAB_USBtoUART")]),t._v(" "),i("li",[t._v("Linux will be /dev/ttyUSB0 (or similar, TBA)")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("If you do not see a TTY/COM port on your PC presented by the ESP32-PICO-KIT when connected, you may need to install a driver for the "),e("em",[this._v("Silicon Labs CP210x USB to UART bridge")]),this._v(".")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"serial-uart-over-rs232"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#serial-uart-over-rs232"}},[this._v("#")]),this._v(" Serial UART over RS232")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[e("em",[this._v("Serial UART0 over RS232")]),this._v(" and "),e("em",[this._v("Serial UART0 over USB")]),this._v(" are mutually exclusive, ie. they cannot be used at the same time.")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[i("em",[t._v("Serial UART over RS232")]),t._v(" is configured by using the supplied jumpers/shunts to bridge the required pins on the "),i("code",[t._v("Patch")]),t._v(" and "),i("code",[t._v("Comms")]),t._v(" headers accessible on the rear of the PCB, and connecting a suitable RS232 device to one of the DE-9M connectors labeled "),i("code",[t._v("RS232-1")]),t._v(" and "),i("code",[t._v("RS232-2")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("You must position 4 of the jumpers/shunts provided to enable a "),i("em",[t._v("Serial UART over RS232")]),t._v(". This image shows the currently supported configuration for the jumpers/shunts on both the "),i("code",[t._v("Patch")]),t._v(" and "),i("code",[t._v("Comms")]),t._v(" headers for "),i("strong",[t._v("UART0")]),t._v(" to "),i("code",[t._v("RS232-1")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:i(119),alt:"Patch & Comms jumpers"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"uart0-to-rs232-1"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#uart0-to-rs232-1"}},[this._v("#")]),this._v(" UART0 to RS232-1")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h5",{attrs:{id:"patch-header"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#patch-header"}},[this._v("#")]),this._v(" Patch header")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("bridge Tx - T1 - vertical "),e("em",[this._v("position second from right")])]),this._v(" "),e("li",[this._v("bridge Rx - R1 - vertical "),e("em",[this._v("right most position")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h5",{attrs:{id:"comms-header"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#comms-header"}},[this._v("#")]),this._v(" Comms header")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("bridge @ Tx1 - horizontal "),e("em",[this._v("second position from top")])]),this._v(" "),e("li",[this._v("bridge @ Rx1 - horizontal "),e("em",[this._v("fourth position from top")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"uart1-to-rs232-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#uart1-to-rs232-2"}},[this._v("#")]),this._v(" UART1 to RS232-2")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h5",{attrs:{id:"patch-header-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#patch-header-2"}},[this._v("#")]),this._v(" Patch header")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("bridge IO22 - T2 - vertical "),e("em",[this._v("position third from right")])]),this._v(" "),e("li",[this._v("bridge IO5 - R2 - vertical "),e("em",[this._v("position fourth from right")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h5",{attrs:{id:"comms-header-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#comms-header-2"}},[this._v("#")]),this._v(" Comms header")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("bridge @ Tx2 - horizontal "),e("em",[this._v("third position from bottom")])]),this._v(" "),e("li",[this._v("bridge @ Rx2 - horizontal "),e("em",[this._v("last position at bottom")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"configuring-physical-uart-parameters-speed-data-stop-bits"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuring-physical-uart-parameters-speed-data-stop-bits"}},[this._v("#")]),this._v(" Configuring physical UART parameters (speed, data & stop bits)")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("You can configure the parameters for both "),i("strong",[t._v("UART0")]),t._v(" ("),i("code",[t._v("RS232-1")]),t._v("/USB) and "),i("strong",[t._v("UART1")]),t._v(" ("),i("code",[t._v("RS232-2")]),t._v(") via the "),i("code",[t._v("boot.conf")]),t._v(" file.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"wi-fi-communications"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wi-fi-communications"}},[this._v("#")]),this._v(" Wi-Fi Communications")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The ESP32 has on-board Wi-Fi and can boot in either "),i("strong",[t._v("Access Point")]),t._v(" (AP) or "),i("strong",[t._v("Station")]),t._v(" (STA) mode. The mode is determined by the "),i("strong",[t._v("NVS_IF_STA")]),t._v(" bit in the "),i("em",[t._v("startup configuration")]),t._v(" stored in NVS and described "),i("a",{attrs:{href:"#startup-configuration-non-volatile-storage-nvs"}},[t._v("above")]),t._v(".")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("In AP mode, the ESP32 acts as an Access Point and broadcasts a system defined SSID and provides DHCP services for clients to connect\n"),i("ul",[i("li",[t._v("The "),i("strong",[t._v("SSID")]),t._v(" hardcoded in the firmware is "),i("em",[t._v("imsai")]),t._v(" with a "),i("strong",[t._v("password")]),t._v(" of "),i("em",[t._v("password")]),t._v(", this will only be used if the "),i("strong",[t._v("boot.conf")]),t._v(" file on the microSD card cannot be read or does not include a "),i("code",[t._v("HOSTNAME=name")]),t._v(" statement, see "),i("a",{attrs:{href:"#boot-conf-file"}},[t._v("Boot.conf file")]),t._v(" below.")]),t._v(" "),i("li",[t._v("If a "),i("code",[t._v("HOSTNAME=name")]),t._v(" statement is found in the "),i("strong",[t._v("boot.conf")]),t._v(" file, then this hostname is also used as the "),i("strong",[t._v("SSID")]),t._v(" in AP mode. In this case, the "),i("strong",[t._v("password")]),t._v(" still remains "),i("em",[t._v("password")])])])]),t._v(" "),i("li",[t._v("In STA mode, the ESP32 acts as a Wi-Fi station or client and can join an existing Wi-Fi network (supporting WPA or WPA2, but not Enterprise WPA).\n"),i("ul",[i("li",[t._v("The "),i("strong",[t._v("SSID")]),t._v(" and "),i("strong",[t._v("password")]),t._v(" of the desired Wi-Fi network must be configured in the "),i("strong",[t._v("boot.conf")]),t._v(" file using the "),i("code",[t._v("SSID=name")]),t._v(" and "),i("code",[t._v("PASSWORD=password")]),t._v(" statements, see "),i("a",{attrs:{href:"#boot-conf-file"}},[t._v("Boot.conf file")]),t._v(" below.")])])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("The "),i("strong",[t._v("boot.conf")]),t._v(" file can be edited via the "),i("strong",[t._v("SYS:")]),t._v(" virtual system device in the Desktop UI while connected to the IMSAI 8080esp running in AP mode.\nAlternatively the "),i("strong",[t._v("microSD Card")]),t._v(" can be mounted in a PC and the "),i("code",[t._v("/imsai/conf/boot.conf")]),t._v(" file edited directly in a text editor then the "),i("strong",[t._v("microSD Card")]),t._v(" returned to the IMSAI 8080esp before it is powered on.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("When the IMSAI 8080esp is configured to work in station mode (STA) but it is unable to make a connection to the configured Wi-Fi network within 30 seconds, the ESP32 will reboot and temporarily start in AP mode.")]),this._v(" "),e("ul",[e("li",[this._v("This enables you to connect to the IMSAI 8080esp from a browser on the advertised SSID and modify/correct the STA mode Wi-Fi configuration.")]),this._v(" "),e("li",[this._v("The simplest way to determine if this has happed is to look for the AP mode SSID being broadcast, or to look at the ESP32 console log output on the UART.")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"danger custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("The design of the IMSAI 8080esp is intended for only "),e("strong",[this._v("one")]),this._v(" Wi-Fi client (browser)to be connected at any given time. It is untested and not recommended to connect multiple clients at the same time.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"boot-conf-file"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#boot-conf-file"}},[this._v("#")]),this._v(" Boot.conf file")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("strong",[this._v("boot.conf")]),this._v(" file is located on the microSD card with the path "),e("code",[this._v("/imsai/conf/boot.conf")]),this._v("\nAs the ESP32 boots this file is loaded, each line parsed and the "),e("strong",[this._v("variable=value")]),this._v(" pair is added to the environment (like posix environment variables).")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"danger custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("There is little to no error checking done at the moment. If you significantly change this file and remove a variable, or leave a value blank you may cause the boot process to fail. I know I've managed to do that once or twice.")]),this._v(" "),e("p",[this._v("The solution is to mount the microSD card on a PC and edit the "),e("strong",[this._v("boot.conf")]),this._v(" file to fix the problem.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"default-boot-conf"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#default-boot-conf"}},[this._v("#")]),this._v(" Default boot.conf")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("#Network configuration\nNTP_SERVER=pool.ntp.org\nTZ=AEST-10AEDT,M10.1.0,M4.1.0\nHOSTNAME=imsai8080\nPORT=80\nSSID=mySSID\nPASSWORD=myPASSWORD\n#Bootrom configuration\nROM1=mpu-a-rom.hex\nROM2=mpu-a-vio-rom.hex\nROM3=basic4k.hex\nROM4=basic8k.hex\nROM5=xybasic.hex\nROM6=memon80.hex\n#UART configuration\n#UART0=115200,cs8\n#UART1=230400,cs8\n#Harddisk image\nHARDDISK=hd-ws4\n#Performance parameters\n#SIO1.netsrv.buffer_delay=33\n#LPT.netsrv.buffer_delay=33\n#Modem initialization string. Example:\n#MODEM.init=ATS0=1S15=1&A1\n#SIO-2 default port mappings\n#SIO1.portA.device=WEBTTY,UART0\n#SIO1.portB.device=VIOKBD\n#SIO2.portA.device=MODEM\n#SIO2.portB.device=UART1\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"network-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#network-configuration"}},[this._v("#")]),this._v(" Network Configuration")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("em",[this._v("Network configuration")]),this._v(" entries should be familiar and mostly self explanatory.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The TZ variable cannot use values like "),e("em",[this._v("Sydney/Australia")]),this._v(" (Olson format) but must use explicitly defined timezone strings (POSIX format) eg. "),e("code",[this._v("TZ=AEST-10AEDT,M10.1.0,M4.1.0")]),this._v(" which is correct for Sydney, Australia.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"bootrom-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#bootrom-configuration"}},[this._v("#")]),this._v(" Bootrom Configuration")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The "),i("em",[t._v("Bootrom configuration")]),t._v(" entries define the "),i("em",[t._v("slots")]),t._v(" corresponding to the "),i("strong",[t._v("NVS_BOOT_ROM")]),t._v(" bits in the "),i("em",[t._v("Startup configuration (NVS)")]),t._v(" (see above). There can be a maximum of 7, "),i("code",[t._v("ROM1")]),t._v(" to "),i("code",[t._v("ROM7")]),t._v(". Each value should be the filename of a bootable program in "),i("em",[t._v("Intel HEX file format")]),t._v(" (TBA) and located on the microSD card in the path "),i("code",[t._v("/imsai/")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"uart-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#uart-configuration"}},[this._v("#")]),this._v(" UART Configuration")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("em",[this._v("UART configuration")]),this._v(" entries define the speed, data & stop bits for the two physical UARTs on the ESP32, "),e("strong",[this._v("UART0")]),this._v(" and "),e("strong",[this._v("UART1")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("#UART configuration\nUART0=115200,cs8 # ie. 115200, 8N1 - not required because this is default\nUART1=9600 cs7 cstopb parenb parodd # ie. 9600, 7O2\n")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("parameters can be separated by "),i("em",[t._v("spaces")]),t._v(" or "),i("em",[t._v("commas")])]),t._v(" "),i("li",[t._v("parameters are "),i("em",[t._v("case insensitive")])]),t._v(" "),i("li",[t._v("parameters follow the convention used by the "),i("code",[t._v("screen")]),t._v(" program under "),i("em",[t._v("unix/linux/gnu")]),t._v(" ie.:\n"),i("ul",[i("li",[t._v("default is "),i("code",[t._v("115200,cs8")]),t._v(" in other words 115200 8N1")]),t._v(" "),i("li",[t._v("standard baud rates from "),i("code",[t._v("110")]),t._v(" to "),i("code",[t._v("230400")]),t._v(" e.g. 110, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400 others may work, but you'll have to experiment")]),t._v(" "),i("li",[i("code",[t._v("cs7")]),t._v(" - for 7 data bits")]),t._v(" "),i("li",[i("code",[t._v("cs8")]),t._v(" - for 8 data bits")]),t._v(" "),i("li",[i("code",[t._v("cstopb")]),t._v(" - for 2 stop bits, default is 1")]),t._v(" "),i("li",[i("code",[t._v("parenb")]),t._v(" - for even parity, default is none")]),t._v(" "),i("li",[i("code",[t._v("parenb,parodd")]),t._v(" - for odd parity")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"harddisk-image"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#harddisk-image"}},[this._v("#")]),this._v(" Harddisk image")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The current harddisk image is visible on the desktop as "),e("code",[this._v("I:DSK:")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Harddisk images are visible in the disk library "),e("code",[this._v("LIB:")]),this._v(" and indicated with a "),e("em",[this._v("harddisk")]),this._v(" icon. You can drag-and-drop a new harddisk onto the "),e("code",[this._v("LIB:")]),this._v(" window to upload a new harddisk image.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The harddisk function is inactive unless you include the following line in "),e("code",[this._v("boot.conf")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("HARDDISK=imagename\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("#HARDDISK image (don't include the .hdd extension)\nHARDDISK=hd-ws4\n")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The harddisk image file must reside in "),i("code",[t._v("/imsai/disks/")]),t._v(" and end with "),i("code",[t._v(".hdd")]),t._v(" eg. "),i("code",[t._v("/imsai/disks/hd-ws4.hdd")]),t._v("\ndo not use the "),i("code",[t._v(".dsk")]),t._v(" extension for a harddisk image as it will be confused with a floppy disk image")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("If you change harddisk image you must "),e("strong",[this._v("reboot")]),this._v(" the IMSAI8080esp to load the new image")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("There is no UI for changing hard disk images, the required image must be set using the environment variable "),e("code",[this._v("HARDDISK")]),this._v(" in the "),e("code",[this._v("boot.conf")]),this._v(" file and then the ESP32 hard reset to reload the environment.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"performance-parameters"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#performance-parameters"}},[this._v("#")]),this._v(" Performance parameters")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The "),i("em",[t._v("Performance parameters")]),t._v(" exist only for the two devices "),i("code",[t._v("TTY:")]),t._v(" (SIO1) and "),i("code",[t._v("LPT:")]),t._v(" and apply only to websocket communication to the "),i("em",[t._v("Desktop UI")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("#Performance parameters\nSIO1.netsrv.buffer_delay=33\nLPT.netsrv.buffer_delay=33\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"modem-initialization-string"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modem-initialization-string"}},[this._v("#")]),this._v(" Modem initialization string")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("This string will be processed by the 'AT' Modem when it is initialised and reset (ie. with the command "),e("code",[this._v("ATZ")]),this._v(")")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("auto-answer after 1 ring ("),i("code",[t._v("ATS0=1")]),t._v(")")]),t._v(" "),i("li",[t._v("enable telnet protocol ("),i("code",[t._v("ATS15=1")]),t._v(")")]),t._v(" "),i("li",[t._v('enable answer mode (ie. listen) in "daemon" mode ('),i("code",[t._v("AT&A1")]),t._v(")")]),t._v(" "),i("li",[t._v("with the commands conncatenated into a single command string "),i("code",[t._v("ATS0=1S15=1&A1")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-conf extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("#Modem initialization string\nMODEM.init=ATS0=1S15=1&A1\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"sio-2-port-mappings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#sio-2-port-mappings"}},[this._v("#")]),this._v(" SIO-2 port mappings")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("the SIO port mapping configuration is loaded and reported to the debug console (UART0/USB) when the IMSAI8080esp is started/powered-on")]),this._v(" "),e("li",[this._v("the SIO port mapping configuration is also displayed in the SYS: virtual device on the desktop UI")]),this._v(" "),e("li",[this._v("when no SIO port mapping configuration is specified, a stanard configuration is the default, and reported as follows:")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-config extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("SIO PORT MAP:\nSIO1.portA = WEBTTY UART0 \nSIO1.portB = VIOKBD \nSIO2.portA = UART1 \nSIO2.portB = MODEM\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("simplify the addition of new character mode devices in future\neg. additional hardware UART; network sockets; additional telnet listeners; new virtual peripherals on the desktop UI")]),this._v(" "),e("li",[this._v("enable the user to assign specific devices to each of the four (4) virtual SIO-2 serial ports")]),this._v(" "),e("li",[this._v("details of configuring the SIO port mappings will be published soon")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"system-conf-file"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#system-conf-file"}},[this._v("#")]),this._v(" System.conf file")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("strong",[this._v("system.conf")]),this._v(" file is located on the microSD card with the path "),e("code",[this._v("/imsai/conf/system.conf")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("This is a legacy configuration file, maintained for source code compatibility with the "),e("em",[this._v("Z80PACK, imsaisim")]),this._v(" machine. Only the parameters documented here have any effect on the "),e("strong",[this._v("IMSAI8080esp")]),this._v(".")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"sio-flags"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#sio-flags"}},[this._v("#")]),this._v(" SIO flags")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("strong",[this._v("SIO flags")]),this._v(" affect the behavior of the the two "),e("em",[this._v("virtual")]),this._v(" SIO serial ports that are (by default) mapped to "),e("em",[this._v("physical")]),this._v(" UARTs on the ESP32.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("These two "),e("em",[this._v("virtual")]),this._v(" serial ports can:")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ul",[i("li",[t._v("force upper case")]),t._v(" "),i("li",[t._v("strip the parity bit (the MSB in each character byte) - the default for the CP/M console (SIO1)")]),t._v(" "),i("li",[t._v("drop nulls")]),t._v(" "),i("li",[t._v("set a "),i("em",[t._v("virtual")]),t._v(" baud rate (independent of the "),i("em",[t._v("physical")]),t._v(" UARTs baudrate - the lower rate will determine the actual speed)")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("p",[t._v("The functions are "),i("strong",[t._v("enabled")]),t._v(" by setting the flag value to "),i("strong",[t._v("1")]),t._v(" or "),i("strong",[t._v("disabled")]),t._v(" with a value of "),i("strong",[t._v("0")]),t._v(" (zero - the default)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("If the "),e("em",[this._v("virtual")]),this._v(" baud rate is set to 0 (zero) then no rate limit is applied by the "),e("em",[this._v("virtual")]),this._v(" SIO serial port")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-config extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("# SIO 1 Channel A, Ports 2/3 connected to UART0/USB/RS232-1 (default)\nsio1a_upper_case\t\t0\nsio1a_strip_parity\t\t1\nsio1a_drop_nulls\t\t1\nsio1a_baud_rate\t\t\t9600\n\n# SIO 2 Channel A, Ports 34/35, connected to UART1/RS232-2 (default)\n#sio2a_upper_case\t\t0\n#sio2a_strip_parity\t\t1\n#sio2a_drop_nulls\t\t1\nsio2a_baud_rate\t\t\t19200\n")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("If you require "),i("strong",[t._v("8-bit clean")]),t._v(" communications, for example: if using protocols like "),i("em",[t._v("xmodem")]),t._v(", then all of "),i("strong",[t._v("upper case")]),t._v(", "),i("strong",[t._v("strip the parity bit")]),t._v(" and "),i("strong",[t._v("drop_nulls")]),t._v(" should be "),i("strong",[t._v("disabled")])]),t._v(" "),i("p",[t._v("eg.")]),t._v(" "),i("div",{staticClass:"language-config extra-class"},[i("pre",{pre:!0,attrs:{class:"language-text"}},[i("code",[t._v("sio1a_upper_case\t\t0\nsio1a_strip_parity\t\t0\nsio1a_drop_nulls\t\t0\n")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"ram-size"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ram-size"}},[this._v("#")]),this._v(" RAM size")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The only other parameter that effects the "),e("strong",[this._v("IMSAI 8080esp")]),this._v(" is the last line:")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-config extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("ram 64\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"danger custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Changing this value is not tested and is likely to result in the machine failing to work as expected.")])])}],o=i(0),a=Object(o.a)({},(function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),i("p",[t._v("In order to run any applications, you will need to activate a virtual ROM (eg. to run BASIC, or boot a floppy disk) and maybe load an operating system (such as CP/M) from a virtual disk.")]),t._v(" "),i("p",[t._v("Also like the original computer, your IMSAI 8080esp has no video output port. Owners of the original IMSAI 8080 would connect a serial terminal (either a teletype printer or visual display unit) to a serial port. While you can still do this (see "),i("a",{attrs:{href:"http://localhost:8080/imsai8080/configure/#serial-communications-rs232-usb",target:"_blank",rel:"noopener noreferrer"}},[t._v("Serial Communications"),i("OutboundLink")],1),t._v(" section), this modern kit offers a much easier solution using Wi-Fi.")]),t._v(" "),i("p",[t._v("Once power is applied to your kit, the ESP32 will create a Wi-Fi Access Point. You can connect your computer to this Wi-Fi network as if it were connected to a Wi-FI router. You can then open a web page, the Desktop UI, that will give you full access to the IMSAI 8080esp - including a virtual serial terminal (TTY:), floppy disks, printer (LPT:) and more.")]),t._v(" "),i("p",[t._v("Once connected, you can then configure the IMSAI 8080esp to connect directly to your home Wi-Fi, so you can use it without having to change your Wi-FI settings again.")]),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),i("p",[t._v("Your computer should now be connected, and you will be able to open the Desktop UI. The web interface has been written and tested with the Chrome browser in mind, and you might find it works differently if you are using a different browser.")]),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),t._m(13),t._v(" "),i("p",[t._v("The startup configuration is modified via the toggle switches on the front panel.")]),t._v(" "),t._m(14),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),t._m(17),t._v(" "),t._m(18),t._v(" "),t._m(19),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),t._m(22),t._v(" "),t._m(23),t._v(" "),t._m(24),t._v(" "),i("p",[t._v("To set the startup configuration mode value, follow the sequence:")]),t._v(" "),t._m(25),t._v(" "),t._m(26),t._v(" "),t._m(27),t._v(" "),t._m(28),t._v(" "),t._m(29),t._v(" "),i("p",[t._v("Each SIO board provides two serial I/O ports. The board/port/devices are assigned as follows:")]),t._v(" "),t._m(30),t._v(" "),t._m(31),t._v(" "),t._m(32),t._v(" "),t._m(33),t._v(" "),i("div",{staticClass:"warning custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),i("p",[t._v("Behavior of serial communications is further effected by the settings on the "),i("em",[t._v("virtual")]),t._v(" "),i("strong",[t._v("SIO")]),t._v(" UARTs (SIO1 and SIO2). See "),i("router-link",{attrs:{to:"./#sio-flags"}},[t._v("SIO flags")]),t._v(" in the "),i("code",[t._v("system.conf")]),t._v(" file below, for further details.")],1)]),t._v(" "),t._m(34),t._v(" "),t._m(35),t._v(" "),t._m(36),t._v(" "),t._m(37),t._v(" "),i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),t._m(38),t._v(" "),i("p",[t._v("Drivers are available direct from the manufacturer at "),i("a",{attrs:{href:"https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers"),i("OutboundLink")],1)])]),t._v(" "),i("p",[t._v("Additional information is available from the Espressif (manufacturer of the "),i("code",[t._v("ESP32-PICO-KIT")]),t._v(") web site at "),i("a",{attrs:{href:"https://docs.espressif.com/projects/esp-idf/en/latest/get-started/establish-serial-connection.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://docs.espressif.com/projects/esp-idf/en/latest/get-started/establish-serial-connection.html"),i("OutboundLink")],1)]),t._v(" "),t._m(39),t._v(" "),t._m(40),t._v(" "),t._m(41),t._v(" "),i("p",[t._v("RS232 line levels are provided by the Maxim MAX3232 IC see the "),i("a",{attrs:{href:"https://datasheets.maximintegrated.com/en/ds/MAX3222-MAX3241.pdf",target:"_blank",rel:"noopener noreferrer"}},[t._v("data sheet"),i("OutboundLink")],1),t._v(" for details.")]),t._v(" "),t._m(42),t._v(" "),t._m(43),t._v(" "),t._m(44),t._v(" "),t._m(45),t._v(" "),t._m(46),t._v(" "),t._m(47),t._v(" "),t._m(48),t._v(" "),t._m(49),t._v(" "),t._m(50),t._v(" "),t._m(51),t._v(" "),t._m(52),t._v(" "),t._m(53),t._v(" "),t._m(54),t._v(" "),t._m(55),t._v(" "),i("p",[t._v("See "),i("router-link",{attrs:{to:"./#uart-configuration"}},[t._v("UART Configuration")]),t._v(" in the "),i("code",[t._v("boot.conf")]),t._v(" file below, for further details.")],1),t._v(" "),t._m(56),t._v(" "),t._m(57),t._v(" "),t._m(58),t._v(" "),t._m(59),t._v(" "),t._m(60),t._v(" "),t._m(61),t._v(" "),t._m(62),t._v(" "),t._m(63),t._v(" "),t._m(64),t._v(" "),t._m(65),t._v(" "),i("p",[t._v("The default configuration, as shipped (in Release v1.7.0) is a follows:")]),t._v(" "),t._m(66),t._m(67),t._v(" "),t._m(68),t._v(" "),i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),t._m(69),t._v(" "),i("p",[t._v("A file with TZ variable values for many timezones can be found at "),i("a",{attrs:{href:"https://www.di-mgt.com.au/src/wclocktz.ini",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://www.di-mgt.com.au/src/wclocktz.ini"),i("OutboundLink")],1),t._v(" "),i("a",{attrs:{href:"https://groups.google.com/d/msg/imsai8080esp/PdNyxAOeBhU/7_IgKXXbCAAJ",target:"_blank",rel:"noopener noreferrer"}},[t._v("Credit to: John Mann in the Forum"),i("OutboundLink")],1)]),t._v(" "),i("p",[t._v("An article that defines the POSIX format can be found at "),i("a",{attrs:{href:"https://www.gnu.org/software/libc/manual/html_node/TZ-Variable.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Specifying the Time Zone with TZ"),i("OutboundLink")],1),t._v(', however please note, the "third format" referenced in this article is the Olson format, and not supported on the ESP32.')])]),t._v(" "),t._m(70),t._v(" "),t._m(71),t._v(" "),t._m(72),t._v(" "),t._m(73),t._v(" "),i("p",[t._v("For example:")]),t._v(" "),t._m(74),t._m(75),t._v(" "),t._m(76),t._v(" "),i("p",[t._v("A harddisk image (4MB) can be mounted as I:DSK: / Drive I:")]),t._v(" "),t._m(77),t._v(" "),t._m(78),t._v(" "),t._m(79),t._v(" "),t._m(80),i("p",[t._v("e.g.")]),t._v(" "),t._m(81),t._m(82),t._v(" "),t._m(83),t._v(" "),i("p",[t._v("The harddisk cannot be made a bootable device, the bootrom doesn't support this. A CP/M system floppy disk image is still required in drive A: to boot CP/M")]),t._v(" "),t._m(84),t._v(" "),t._m(85),t._v(" "),t._m(86),t._v(" "),i("p",[t._v("They specify a time in milliseconds (ms) during which output to the device will be buffered (up to the next line feed character) and transmitted in a single (websocket) packet. This can greatly improve performance of both the TTY: and LPT: devices. If used, recommended optimal settings are:")]),t._v(" "),t._m(87),t._m(88),t._v(" "),t._m(89),t._v(" "),i("p",[t._v("For example, to initialize the modem for:")]),t._v(" "),t._m(90),t._v(" "),i("p",[t._v("add the following line:")]),t._v(" "),t._m(91),t._m(92),t._v(" "),i("p",[t._v("A HAL (Hardware Abstraction Layer) enables mapping of character mode devices to the four (4) virtual SIO-2 serial ports")]),t._v(" "),t._m(93),t._v(" "),t._m(94),i("p",[t._v("the purpose of the HAL is to:")]),t._v(" "),t._m(95),t._v(" "),t._m(96),t._v(" "),t._m(97),t._v(" "),t._m(98),t._v(" "),t._m(99),t._v(" "),t._m(100),t._v(" "),t._m(101),t._v(" "),t._m(102),t._v(" "),t._m(103),t._v(" "),t._m(104),t._v(" "),i("p",[t._v("For example:")]),t._v(" "),t._m(105),t._m(106),t._v(" "),t._m(107),t._v(" "),t._m(108),t._v(" "),t._m(109),i("p",[t._v("This still sets the maximum amount of RAM allocated to the simulated machine in KB.")]),t._v(" "),t._m(110)])}),s,!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/19.ea9ef856.js b/assets/js/19.ea9ef856.js new file mode 100644 index 0000000..61811f7 --- /dev/null +++ b/assets/js/19.ea9ef856.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{263:function(e,t,s){"use strict";s.r(t);var i=[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{attrs:{id:"updating-software-draft"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#updating-software-draft"}},[this._v("#")]),this._v(" Updating Software (Draft)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[this._v("#")]),this._v(" Overview")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("p",[s("strong",[e._v("Firmware")]),e._v(" and "),s("strong",[e._v("Image")]),e._v(" updates are published via "),s("strong",[e._v("GitHub")]),e._v(", accessible using the "),s("em",[e._v("GitHub")]),e._v(" link in the upper-right corner of this page.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("It is recommended to always use the release marked as the "),t("strong",[this._v("Latest Release")]),this._v(" unless you have a specific reason not to.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"updating-the-firmware"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#updating-the-firmware"}},[this._v("#")]),this._v(" Updating the Firmware")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Updating the "),t("strong",[this._v("firmware")]),this._v(" is a simple "),t("em",[this._v("drag & drop")]),this._v(" process via the web-based "),t("em",[this._v("desktop UI")]),this._v(".")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"download-the-firmware-from-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#download-the-firmware-from-github"}},[this._v("#")]),this._v(" Download the firmware from GitHub")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Download the "),t("strong",[this._v("FIRMWARE.zip")]),this._v(" file from the latest release on GitHub (see above).")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("strong",[this._v("FIRMWARE")]),this._v(" package in the release assets is a "),t("em",[this._v("ZIP")]),this._v(" file containing 6 files, for example:")])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[this._v("COPYRIGHT.txt\nFLASHING.md\nbootloader.bin 22K\nimsai_part_table.bin 3.0K\nimsaisim_esp32.bin 918K\nota_data_initial.bin 8.0K\n")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("To update the "),t("em",[this._v("firmware")]),this._v(" you need only the "),t("code",[this._v("imsaisim_esp32.bin")]),this._v(" file. This is the "),t("strong",[this._v("IMASAI 8080esp")]),this._v(" firmware binary to be flashed to the ESP32.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"upload-flash-the-firmware-to-the-esp32"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#upload-flash-the-firmware-to-the-esp32"}},[this._v("#")]),this._v(" Upload (flash) the firmware to the ESP32")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[e._v("Drag-and-drop the "),s("code",[e._v("imsaisim_esp32.bin")]),e._v(" file onto the "),s("code",[e._v("SYS:")]),e._v(" device "),s("strong",[e._v("icon")]),e._v(" on the "),s("em",[e._v("Desktop UI")]),e._v(" to flash it to the ESP32.")]),e._v(" "),s("li",[e._v("Confirm the first dialog, and wait (typically 10-30 seconds) until you see the second dialog confirming the upload was successful")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"warning custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),t("p",[this._v("If you don't receive the second dialog confirming the upload was successful, then the firmware will not have been flashed.\nThis will not effect the ESP32 as it will simply reboot on the last working firmware.")]),this._v(" "),t("p",[this._v("Some early adopters have reported this occurring, and the reason was poor Wi-Fi connectivity causing drop-outs. The solution was simply to move their IMSAI8080esp closer to their Wi-Fi Access Point")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"reboot-the-esp32"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reboot-the-esp32"}},[this._v("#")]),this._v(" Reboot the ESP32")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Reboot the ESP32 using the reset (EN) press button on ESP32, or click the reboot button (Red, circular arrow) on the "),t("code",[this._v("SYS:")]),this._v(" window.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"checking-the-firmware-version"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#checking-the-firmware-version"}},[this._v("#")]),this._v(" Checking the firmware version")])},function(){var e=this.$createElement,t=this._self._c||e;return t("ol",[t("li",[this._v("To the system console (UART0 - USB or RS232-1 at 115200 baud) early in the boot process:")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("pre",[t("code",[t("span",{staticStyle:{color:"#00FF00"}},[this._v("I (336) cpu_start: Application information:\nI (366) cpu_start: Project name: imsaisim_esp32\nI (372) cpu_start: App version: v1.7.0\nI (377) cpu_start: Compile time: Jul 5 2021 14:21:20\nI (383) cpu_start: ELF file SHA256: 6e2f6503e36a286f...\nI (389) cpu_start: ESP-IDF: v4.0.2-4-g877a28e05\n")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("In this example you can see the "),t("code",[this._v("App version: v1.7.0")]),this._v(" indicating that the system is running the "),t("code",[this._v("v1.7.0")]),this._v(" firmware.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("ol",{attrs:{start:"2"}},[t("li",[this._v("The "),t("code",[this._v("SYS:")]),this._v(" System (host) virtual device on the "),t("em",[this._v("desktop UI")]),this._v(" "),t("img",{attrs:{src:s(56),alt:"SYS:"}})])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("In this example you can see the "),t("code",[this._v("Build version: v1.5.0")]),this._v(" indicating that the system is running the "),t("code",[this._v("v1.5.0")]),this._v(" firmware.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"background-over-the-air-ota-updates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#background-over-the-air-ota-updates"}},[this._v("#")]),this._v(" Background - Over The Air (OTA) updates")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("p",[e._v("This handy, "),s("em",[e._v("Over The Air")]),e._v(" (OTA) update feature is provided as part of the "),s("strong",[e._v("Espressif")]),e._v(" "),s("em",[e._v("esp-idf")]),e._v(" development platform.\nThere are two "),s("em",[e._v("partitions")]),e._v(" that can each store an "),s("em",[e._v("OTA firmware")]),e._v(", "),s("strong",[e._v("ota_0")]),e._v(" and "),s("strong",[e._v("ota_1")]),e._v(".")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("p",[e._v("Each update is flashed to the next available partition, the original "),s("strong",[e._v("factory")]),e._v(" partition is never overwritten by an "),s("em",[e._v("OTA update")]),e._v(".\nDetails of what partitions are active (Running:), booted (Boot:) and available (Next:) are given in the "),s("code",[e._v("SYS:")]),e._v(" System (host) virtual device on the "),s("em",[e._v("desktop UI")]),e._v(" under the heading "),s("strong",[e._v("Partitions")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"updating-the-µsd-card-image"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#updating-the-µsd-card-image"}},[this._v("#")]),this._v(" Updating the µSD card Image")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"updating-using-drag-drop"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#updating-using-drag-drop"}},[this._v("#")]),this._v(" Updating using drag & drop")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("p",[e._v("The "),s("strong",[e._v("first")]),e._v(" way to update the "),s("strong",[e._v("µSD card Image")]),e._v(" is via a "),s("em",[e._v("drag & drop")]),e._v(" process similar to the "),s("em",[e._v("firmware update")]),e._v(" process described above. This allows the "),s("em",[e._v("image update")]),e._v(" to be done without the need to mount the "),s("em",[e._v("µSD card")]),e._v(" in a PC.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("You can simply drag-and-drop the "),t("code",[this._v("update.bin")]),this._v(" file onto the "),t("strong",[this._v("SYS:")]),this._v(" icon on the desktop GUI. When the upload is complete, reboot the ESP32 and the update will be identified, unpacked and installed. Watch the output on the boot console (typically via USB port @ 115200 8N1) to see the process proceed.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"updating-in-a-windows-mac-linux-pc"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#updating-in-a-windows-mac-linux-pc"}},[this._v("#")]),this._v(" Updating in a Windows/Mac/Linux PC")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("p",[e._v("The "),s("strong",[e._v("second")]),e._v(" way to update the "),s("strong",[e._v("µSD card Image")]),e._v(" is to remove the "),s("em",[e._v("µSD card")]),e._v(" from your "),s("strong",[e._v("IMSAI8080esp")]),e._v(" and connect it to your Windows/Mac/Linux PC.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The filesystem on the "),t("em",[this._v("µSD card")]),this._v(" is "),t("code",[this._v("FAT32")]),this._v(".")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("With the "),t("em",[this._v("µSD card")]),this._v(" filesystem mounted on your PC you should be able to:")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[e._v("backup the whole "),s("em",[e._v("image")])]),e._v(" "),s("li",[e._v("restore a whole "),s("em",[e._v("image")])]),e._v(" "),s("li",[e._v("edit individual configuration files")]),e._v(" "),s("li",[e._v("directly manage disk and harddisk "),s("em",[e._v("(*.dsk and *.hdd)")]),e._v(" image files in the disk library directory")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"checking-the-desktop-ui-version"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#checking-the-desktop-ui-version"}},[this._v("#")]),this._v(" Checking the Desktop UI version")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("strong",[this._v("desktop UI")]),this._v(" version number is reported in only one place, the "),t("code",[this._v("SYS:")]),this._v(" System (host) virtual device on the "),t("em",[this._v("desktop UI")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Following a successful update of the "),t("em",[this._v("µSD card Image")]),this._v(" this version number should reflect the version number you have installed.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(56),alt:"SYS:"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("In this example you can see the "),t("code",[this._v("GUI Version: webfrontend-v1.5.0")]),this._v(" indicating that the system is also running the "),t("code",[this._v("v1.5.0")]),this._v(" desktop UI.")])}],r=s(0),a=Object(r.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"content"},[e._m(0),e._v(" "),e._m(1),e._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("While every effort is made to ensure any new release of firmware and image software is ready for use, experience and "),s("a",{attrs:{href:"https://en.wikipedia.org/wiki/Murphy%27s_law",target:"_blank",rel:"noopener noreferrer"}},[e._v("Murphy's Law"),s("OutboundLink")],1),e._v(" dictate that there will be problems from time to time.")]),e._v(" "),s("p",[e._v("If you don't like risk and don't count yourself as an "),s("a",{attrs:{href:"https://en.wikipedia.org/wiki/Early_adopter",target:"_blank",rel:"noopener noreferrer"}},[e._v("early adopter"),s("OutboundLink")],1),e._v(" then follow the "),s("a",{attrs:{href:"https://github.com/orgs/thehighnibble/discussions",target:"_blank",rel:"noopener noreferrer"}},[e._v("TheHighNibble forum"),s("OutboundLink")],1),e._v(" and look for a clear sign of positive reports about a new release before proceeding with any update.")]),e._v(" "),s("p",[e._v("The worst that can happen is that you will need to install the "),s("strong",[e._v("Espressif")]),e._v(" "),s("a",{attrs:{href:"https://github.com/espressif/esptool",target:"_blank",rel:"noopener noreferrer"}},[e._v("esptool.py"),s("OutboundLink")],1),e._v(" on your Windows/Mac/Linux PC to be able to re-flash your ESP32 to bring your IMSAI8080esp back to life.")])]),e._v(" "),e._m(2),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),e._m(3),e._v(" "),s("p",[e._v("The latest release is the "),s("a",{attrs:{href:"https://github.com/thehighnibble/firmware/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[e._v("June 2023 Release"),s("OutboundLink")],1),e._v(" (v.1.12.0)")])]),e._v(" "),e._m(4),e._v(" "),e._m(5),e._v(" "),e._m(6),e._v(" "),e._m(7),e._v(" "),e._m(8),e._v(" "),e._m(9),e._m(10),e._v(" "),s("div",{staticClass:"danger custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("The remaining files are only for flashing a new firmware installation to a blank ESP32, and can only be flashed using the "),s("strong",[e._v("Espressif")]),e._v(" "),s("a",{attrs:{href:"https://github.com/espressif/esptool",target:"_blank",rel:"noopener noreferrer"}},[e._v("esptool.py"),s("OutboundLink")],1),e._v(".\nInstructions for this are included in the file "),s("code",[e._v("FLASHING.md")])])]),e._v(" "),e._m(11),e._v(" "),e._m(12),e._v(" "),e._m(13),e._v(" "),e._m(14),e._v(" "),e._m(15),e._v(" "),s("p",[e._v("Your IMSAI 8080esp will now reboot on the new firmware.")]),e._v(" "),e._m(16),e._v(" "),s("p",[e._v("The firmware version number is reported in two places:")]),e._v(" "),e._m(17),e._v(" "),e._m(18),e._v(" "),e._m(19),e._v(" "),e._m(20),e._v(" "),e._m(21),e._v(" "),e._m(22),e._v(" "),e._m(23),e._v(" "),e._m(24),e._v(" "),s("p",[e._v("For further information you can refer to the "),s("strong",[e._v("Espressif")]),e._v(" "),s("em",[e._v("esp-idf")]),e._v(" "),s("a",{attrs:{href:"https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/system/ota.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("documentation"),s("OutboundLink")],1)]),e._v(" "),s("p",[e._v("Also you can set the startup configuration mode for 'NVS_LOG_LEVEL' to 'INFO' at watch the firmware update/flash process logs on the system console.")]),e._v(" "),e._m(25),e._v(" "),e._m(26),e._v(" "),e._m(27),e._v(" "),e._m(28),e._v(" "),e._m(29),e._v(" "),e._m(30),e._v(" "),e._m(31),e._v(" "),e._m(32),e._v(" "),e._m(33),e._v(" "),e._m(34),e._v(" "),e._m(35),e._v(" "),e._m(36),e._v(" "),e._m(37),e._v(" "),e._m(38)])}),i,!1,null,null,null);t.default=a.exports},56:function(e,t,s){e.exports=s.p+"assets/img/SYS_build_version.7556ac90.png"}}]); \ No newline at end of file diff --git a/assets/js/2.d719985f.js b/assets/js/2.d719985f.js new file mode 100644 index 0000000..2f9154d --- /dev/null +++ b/assets/js/2.d719985f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{136:function(t,e,i){t.exports=i.p+"assets/img/WROVER.60594a0c.png"},137:function(t,e,i){t.exports=i.p+"assets/img/LDO.84fe5048.png"},138:function(t,e,i){t.exports=i.p+"assets/img/74CBTLV3257.f9a7f82f.png"},139:function(t,e,i){t.exports=i.p+"assets/img/74HC00.56dba003.png"},140:function(t,e,i){t.exports=i.p+"assets/img/RES_120.72482160.png"},141:function(t,e,i){t.exports=i.p+"assets/img/RES_2K.4ea50fc0.png"},142:function(t,e,i){t.exports=i.p+"assets/img/RES_10K.5990c193.png"},143:function(t,e,i){t.exports=i.p+"assets/img/RES_806.ab72cc4a.png"},144:function(t,e,i){t.exports=i.p+"assets/img/RES_402.260d3484.png"},145:function(t,e,i){t.exports=i.p+"assets/img/RES_4K7.49692d23.png"},146:function(t,e,i){t.exports=i.p+"assets/img/RES_121.1357a8ba.png"},147:function(t,e,i){t.exports=i.p+"assets/img/RES_243.8dcea9f5.png"},148:function(t,e,i){t.exports=i.p+"assets/img/RES_487.59357193.png"},149:function(t,e,i){t.exports=i.p+"assets/img/RES_976.beba718f.png"},150:function(t,e,i){t.exports=i.p+"assets/img/1N4148.f932e991.png"},151:function(t,e,i){t.exports=i.p+"assets/img/CAP_105.6a05778f.png"},152:function(t,e,i){t.exports=i.p+"assets/img/CAP_104.ec90267a.png"},153:function(t,e,i){t.exports=i.p+"assets/img/CAP_100uF.20ad176a.png"},154:function(t,e,i){t.exports=i.p+"assets/img/CAP_22uF.551085fb.png"},155:function(t,e,i){t.exports=i.p+"assets/img/CAP_10uF.429a3565.png"},156:function(t,e,i){t.exports=i.p+"assets/img/S8050.8d15144c.png"},157:function(t,e,i){t.exports=i.p+"assets/img/Buzzer.5b8d847a.png"},158:function(t,e,i){t.exports=i.p+"assets/img/74HC165.04785644.png"},159:function(t,e,i){t.exports=i.p+"assets/img/MCP3008.87ffecf7.png"},160:function(t,e,i){t.exports=i.p+"assets/img/74HC138.f8fa198c.png"},161:function(t,e,i){t.exports=i.p+"assets/img/74HC595.f9235fb6.png"},162:function(t,e,i){t.exports=i.p+"assets/img/LM7805.36fe89a8.png"},163:function(t,e,i){t.exports=i.p+"assets/img/CNX_2RA.a4ab8ff6.png"},164:function(t,e,i){t.exports=i.p+"assets/img/CNX_4X2.dae969af.png"},165:function(t,e,i){t.exports=i.p+"assets/img/CNX_8x2F.27100f76.png"},166:function(t,e,i){t.exports=i.p+"assets/img/CNX_20x2F.3101cf87.png"},167:function(t,e,i){t.exports=i.p+"assets/img/VGA_SOCKET.b56dbc1c.png"},168:function(t,e,i){t.exports=i.p+"assets/img/PS2_SOCKET.c31fc3fe.png"},169:function(t,e,i){t.exports=i.p+"assets/img/DC_Barrel_Jack.3b82a41b.png"},170:function(t,e,i){t.exports=i.p+"assets/img/16pin_DIP_Socket.639031f8.png"},171:function(t,e,i){t.exports=i.p+"assets/img/USB-HID.a9eaaa3b.png"},172:function(t,e,i){t.exports=i.p+"assets/img/S-132_PCB.f6d3d370.png"},173:function(t,e,i){t.exports=i.p+"assets/img/M4x10_Hex_Socket_Screw.d5503c83.png"},174:function(t,e,i){t.exports=i.p+"assets/img/M4_Hex_Nut.5c5ac210.png"},175:function(t,e,i){t.exports=i.p+"assets/img/M3x5_Machine_Screw_Washer.1a20c3b3.png"},176:function(t,e,i){t.exports=i.p+"assets/img/M3_Nut.aa4fd012.png"},177:function(t,e,i){t.exports=i.p+"assets/img/RES_10K_C.aeeb5f00.png"},178:function(t,e,i){t.exports=i.p+"assets/img/8-core_IDC_cable.b8bc83b5.png"},179:function(t,e,i){t.exports=i.p+"assets/img/CNX_4x2_IDC_F.6f5d9334.png"},180:function(t,e,i){t.exports=i.p+"assets/img/Joystick_Adapter_PCB.bfd3ab33.png"},181:function(t,e,i){t.exports=i.p+"assets/img/10K_analog_joystick.91cd6687.png"},182:function(t,e,i){t.exports=i.p+"assets/img/JS-1_Joystick_PCB.1d9f4006.png"},183:function(t,e,i){t.exports=i.p+"assets/img/DB25F.66fb1120.png"},184:function(t,e,i){t.exports=i.p+"assets/img/Printer_Adapter_PCB.bce0c529.png"},185:function(t,e,i){t.exports=i.p+"assets/img/Prototype_Adapter_PCB.a6702995.png"},265:function(t,e,i){"use strict";i.r(e);var r=[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"s-132-bill-of-materials-draft"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#s-132-bill-of-materials-draft"}},[this._v("#")]),this._v(" S-132 Bill of Materials (Draft)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("To see the images in full size you can right-click on an image and "),e("code",[this._v("Open Image in New Tab")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("Notes on the PCB")]),this._v(" "),e("ul",[e("li",[this._v("PCBs are production (V1.5.1)")]),this._v(" "),e("li",[this._v("Part identifiers are correct and there are no known errors")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"main-s-132-pcb-green"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#main-s-132-pcb-green"}},[this._v("#")]),this._v(" Main S-132 PCB (green)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"surface-mount-device-smd-components"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#surface-mount-device-smd-components"}},[this._v("#")]),this._v(" Surface Mount Device (SMD) components")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("Don't Panic")]),this._v(" "),e("ul",[e("li",[this._v("Yes there are four SMD components!")]),this._v(" "),e("li",[this._v("You can do it!")]),this._v(" "),e("li",[this._v("You can do it with a regular soldering iron, but you are going to need flux")])])])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",[r("thead",[r("tr",[r("th",[t._v("Part")]),t._v(" "),r("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),r("th",[t._v("PCB")]),t._v(" "),r("th",[t._v("Description")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[r("img",{attrs:{src:i(136),alt:"ESP32-WROVER"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("ESP32-WROVER U1")]),t._v(" "),r("td",[r("h4",[t._v("ESP-32 WROVER Module")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(137),alt:"NCP1117-33"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("NCP1117-33 U2")]),t._v(" "),r("td",[r("h4",[t._v("NCP1117-33 LDO Linear Regulator")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(138),alt:"74CBTLV3257"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("74CBTLV3257 U3")]),t._v(" "),r("td",[r("h4",[t._v("74CBTLV3257 SOIC-16 Quad 1-of-2 Multiplexer/Demultiplexer")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(139),alt:"74HC00"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("74HC00 U4")]),t._v(" "),r("td",[r("h4",[t._v("74HC00 SOIC-14 Quad NAND Gate")])])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"through-hole-tht-components"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#through-hole-tht-components"}},[this._v("#")]),this._v(" Through Hole (THT) components")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",[r("thead",[r("tr",[r("th",[t._v("Part")]),t._v(" "),r("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),r("th",[t._v("PCB")]),t._v(" "),r("th",[t._v("Description")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[r("img",{attrs:{src:i(140),alt:"120 Ohm"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("2")]),t._v(" "),r("td",[t._v("R1, R2")]),t._v(" "),r("td",[r("h4",[t._v("120 Ohm Resistor [Brown, Red, Black, Black, Brown]")]),t._v(" Only required if using the PS/2 keyboard")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(141),alt:"2K Ohm"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("2")]),t._v(" "),r("td",[t._v("R3, R4")]),t._v(" "),r("td",[r("h4",[t._v("2K Ohm Resistor [Red, Black, Black, Brown, Brown]")]),t._v(" Only required if using the PS/2 keyboard")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(142),alt:"10K Ohm"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("R5, R13")]),t._v(" "),r("td",[r("h4",[t._v("10K Ohm Resistor [Brown, Black, Black, Red, Brown]")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(143),alt:"806 Ohm"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("3")]),t._v(" "),r("td",[t._v("R6, R8, R10")]),t._v(" "),r("td",[r("h4",[t._v("806 Ohm Resistor [Grey, Black, Blue, Black, Brown]")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(144),alt:"402 Ohm"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("3")]),t._v(" "),r("td",[t._v("R7, R9, R11")]),t._v(" "),r("td",[r("h4",[t._v("402 Ohm Resistor [Yellow, Black, Red, Black, Brown.]")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(145),alt:"4K7 Ohm"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("R12")]),t._v(" "),r("td",[r("h4",[t._v("4.7K Ohm Resistor [Yellow, Violet, Black, Brown, Brown]")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(146),alt:"121 Ohm"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("R14")]),t._v(" "),r("td",[r("h4",[t._v("121 Ohm Resistor [Brown, Red, Brown, Black, Brown]")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(147),alt:"243 Ohm"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("R15")]),t._v(" "),r("td",[r("h4",[t._v("243 Ohm Resistor [Red, Yellow, Orange, Black, Brown]")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(148),alt:"487 Ohm"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("R16")]),t._v(" "),r("td",[r("h4",[t._v("487 Ohm Resistor [Yellow, Gray, Violet, Black, Brown]")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(149),alt:"976 Ohm"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("R17")]),t._v(" "),r("td",[r("h4",[t._v("976 Ohm Resistor [White, Violet, Blue, Black, Brown.]")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(150),alt:"Diode"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("4")]),t._v(" "),r("td",[t._v("D1, D2, D3, D4")]),t._v(" "),r("td",[r("h4",[t._v("1N4148 Signal Diode")]),t._v(" Diodes have polarity, ie. they must be inserted the correct way around to function properly.")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(151),alt:"1 uF Capacitor"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("C2")]),t._v(" "),r("td",[r("h4",[t._v("1 uF MLC (105) Capacitor")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(152),alt:"100 nF Capacitor"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("7")]),t._v(" "),r("td",[t._v("C1, C6, C7, C8, C9, C10, C11")]),t._v(" "),r("td",[r("h4",[t._v("100 nF (104) MLC Capacitor")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(153),alt:"100 uF Capacitor"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("2")]),t._v(" "),r("td",[t._v("C3, C12")]),t._v(" "),r("td",[r("h4",[t._v("100 uF Electrolytic Capacitor")]),t._v(" Electrolytic capacitors have polarity, ie. they must be inserted the correct way around to function properly. +VE to the Square Pad")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(154),alt:"22 uF Capacitor"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("C4")]),t._v(" "),r("td",[r("h4",[t._v("22 uF Electrolytic Capacitor")]),t._v(" Electrolytic capacitors have polarity, ie. they must be inserted the correct way around to function properly. +VE to the Square Pad")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(155),alt:"10 uF Capacitor"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("2")]),t._v(" "),r("td",[t._v("C5, C13")]),t._v(" "),r("td",[r("h4",[t._v("10 uF Electrolytic Capacitor")]),t._v(" Electrolytic capacitors have polarity, ie. they must be inserted the correct way around to function properly. +VE to the Square Pad")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(156),alt:"S8050"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("Q1")]),t._v(" "),r("td",[r("h4",[t._v("S8050 NPN Transistor TO-92")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(57),alt:"Tactile Switch"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("2")]),t._v(" "),r("td",[t._v("Prog, Reset")]),t._v(" "),r("td",[r("h4",[t._v("Tactile Push Button Switch SPST")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(157),alt:"Buzzer"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("Bell")]),t._v(" "),r("td",[r("h4",[t._v("Buzzer 12.2mm dia.")]),t._v(" The Buzzer is polarized, ie. it must be inserted the correct way around to function. +VE to the Square Pad")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(158),alt:"74HC165"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("U5")]),t._v(" "),r("td",[r("h4",[t._v("74HC165")]),t._v(" Shift Register 8-bit, parallel load")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(159),alt:"MCP3008"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("U6")]),t._v(" "),r("td",[r("h4",[t._v("MCP3008")]),t._v(" 8 Channel 10-bit Analog-to-Digital Converter (ADC)")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(160),alt:"74HC138"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("U7")]),t._v(" "),r("td",[r("h4",[t._v("74HC138")]),t._v(" 3-to-8 line Decoder/Demultiplexer, inverting")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(161),alt:"74HC595"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("U8")]),t._v(" "),r("td",[r("h4",[t._v("74HC595")]),t._v(" 8-bit serial in/out Shift Register 3-State Outputs")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(162),alt:"LM7805"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("LM7805 U9")]),t._v(" "),r("td",[r("h4",[t._v("LM7805 +5V DC Linear Regulator")])])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"through-hole-tht-headers"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#through-hole-tht-headers"}},[this._v("#")]),this._v(" Through Hole (THT) headers")])},function(){var t=this.$createElement,e=this._self._c||t;return e("thead",[e("tr",[e("th",[this._v("Part")]),this._v(" "),e("th",{staticStyle:{"text-align":"right"}},[this._v("Quantity")]),this._v(" "),e("th",[this._v("PCB")]),this._v(" "),e("th",[this._v("Description")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:i(163),alt:"Header 2pin"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[this._v("JP1 5V Pwr")]),this._v(" "),e("td",[e("h4",[this._v("2 Pin Header - Horizontal")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:i(53),alt:"Header 6pin"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[this._v("FTDI Program")]),this._v(" "),e("td",[e("h4",[this._v("6 Pin Header - Vertical")]),this._v("Cut from 20 Pin male header")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("td",[e("img",{attrs:{src:i(53),alt:"Header 6pin"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:i(164),alt:"Header 4x2 Male"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[this._v("Patch")]),this._v(" "),e("td",[e("h4",[this._v("8 Pin Header (4x2)- Vertical")]),this._v(" See notes for use of this header")])])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("tr",[r("td",[r("img",{attrs:{src:i(165),alt:"Header 8x2 Female"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("S-132")]),t._v(" "),r("td",[r("h4",[t._v("16 Pin Header (8x2)- Female, Vertical")]),t._v(" Fit to the "),r("strong",[t._v("underside")]),t._v(" of the PCB - attaches to the IMSAI8080/Cromemco Z-1")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("td",[e("img",{attrs:{src:i(53),alt:"Header 2pin"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:i(58),alt:"Shunt"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("4")]),this._v(" "),e("td",[this._v("For JP1 & Patch as required")]),this._v(" "),e("td",[e("h4",[this._v("Header Pin Shunts")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:i(166),alt:"Connector 20x2 Female"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[this._v("D+7AIO")]),this._v(" "),e("td",[e("h4",[this._v("Connector 20x2 Female")]),this._v(" Sits between the DIP-16 IC sockets. This connector forms a 40-pin socket for the D+7AIO")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"through-hole-tht-connectors"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#through-hole-tht-connectors"}},[this._v("#")]),this._v(" Through Hole (THT) connectors")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",[r("thead",[r("tr",[r("th",[t._v("Part")]),t._v(" "),r("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),r("th",[t._v("PCB")]),t._v(" "),r("th",[t._v("Description")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[r("img",{attrs:{src:i(167),alt:"VGA DB15"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("VGA")]),t._v(" "),r("td",[r("h4",[t._v("DB15 VGA Female Socket - Right Angled")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(168),alt:"PS2 KBD"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("PS/2")]),t._v(" "),r("td",[r("h4",[t._v("Mini-DIN-6 PS/2 Keyboard Female Socket - Right Angled")]),t._v(" Only required if using the PS/2 keyboard")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(169),alt:"Power"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("Power")]),t._v(" "),r("td",[r("h4",[t._v("6.2mm DC Barrel Jack Connector")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(170),alt:"16pin DIP Socket"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("4")]),t._v(" "),r("td",[t._v("(U4, U6, U7, U8)")]),t._v(" "),r("td",[r("h4",[t._v("16 pin DIP Socket")]),t._v(" One for each IC - U4, U6, U7, U8")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"printed-circuit-board-pcb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#printed-circuit-board-pcb"}},[this._v("#")]),this._v(" Printed Circuit Board (PCB)")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",[r("thead",[r("tr",[r("th",[t._v("Part")]),t._v(" "),r("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),r("th",[t._v("Description")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[r("img",{attrs:{src:i(171),alt:"USB-HID"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[r("h4",[t._v("USB-HID Keyboard Interface")]),t._v("If ordered")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(172),alt:"PCB Front"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[r("h4",[t._v("Front view")])])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"mounting-hardware"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mounting-hardware"}},[this._v("#")]),this._v(" Mounting hardware")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",[r("thead",[r("tr",[r("th",[t._v("Part")]),t._v(" "),r("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),r("th",[t._v("Description")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[r("img",{attrs:{src:i(173),alt:"M4x10 Hex Socket Screw"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[r("h4",[t._v("M4x10mm Hex Socket Screw")]),t._v(" The M4 socket screw is used to fix the S-132 to the clear acrylic back of the IMSAI80080/Cromemco Z-1. You will need to tap or drill a hole to secure the M4 socket screw.")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(174),alt:"M4 Hex Nut"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[r("h4",[t._v("M4 Hex Nut Nylon")]),t._v(" The nut can be used as a spacer between the S-132 PCB and the acrylic back of the IMSAI80080/Cromemco Z-1")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(175),alt:"M3x5 Machine Screw"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[r("h4",[t._v("M3x5mm Zinc Machine Screw & Washer")]),t._v(" The M3 machine screw, washer and nut are used to secure the LM7805 to the S-132 PCB, to aide thermal conduction with the PCB.")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(176),alt:"M3 Nut"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"joystick-adapter-yellow"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#joystick-adapter-yellow"}},[this._v("#")]),this._v(" Joystick Adapter (yellow)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("thead",[e("tr",[e("th",[this._v("Part")]),this._v(" "),e("th",{staticStyle:{"text-align":"right"}},[this._v("Quantity")]),this._v(" "),e("th",[this._v("PCB")]),this._v(" "),e("th",[this._v("Description")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:i(54),alt:"Header 20x2 Male RA"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[this._v("Pin 1")]),this._v(" "),e("td",[e("h4",[this._v("40 Pin Header (20x2)- Horizontal")]),this._v(" Fit to underside of PCB.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:i(59),alt:"Header 4x2 Male"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("2")]),this._v(" "),e("td",[this._v("Pad 1, Pad 2")]),this._v(" "),e("td",[e("h4",[this._v("8 Pin Header (4x2)- Horizontal")]),this._v(" Fit to top of PCB.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:i(177),alt:"10K Ohm"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("8")]),this._v(" "),e("td",[this._v("R100 - 107")]),this._v(" "),e("td",[e("h4",[this._v("10K Ohm Resistor [Brown, Black, Orange, Gold]")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:i(53),alt:"Header 2pin"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[this._v("A.Gnd")]),this._v(" "),e("td",[e("h4",[this._v("2 Pin Header - Vertical")]),this._v("Cut from 20 Pin male header")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:i(53),alt:"Header 3pin"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[this._v("Ref.Voltage")]),this._v(" "),e("td",[e("h4",[this._v("3 Pin Header - Vertical")]),this._v("Cut from 20 Pin male header")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:i(53),alt:"Header 3pin"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[this._v("Audio Patch")]),this._v(" "),e("td",[e("h4",[this._v("3 Pin Header - Vertical")]),this._v("Cut from 20 Pin male header")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:i(53),alt:"Header 3pin"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[this._v("Amp")]),this._v(" "),e("td",[e("h4",[this._v("3 Pin Header - Vertical")]),this._v("Cut from 20 Pin male header")])])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("tr",[r("td",[r("img",{attrs:{src:i(58),alt:"Shunt"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("4")]),t._v(" "),r("td",[t._v("For A.Gnd, Ref.Voltage & Audio Patch as required")]),t._v(" "),r("td",[r("h4",[t._v("Header Pin Shunts")]),t._v("Fit a shunt to both "),r("strong",[t._v("A.Gnd")]),t._v(" and the "),r("em",[t._v("+5V")]),t._v(" & "),r("em",[t._v("Center")]),t._v(" pins of "),r("strong",[t._v("Ref.Voltage")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("td",[e("h4",[this._v("100 nF (104) MLC Capacitor")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("td",[e("h4",[this._v("1 uF (105) MLC Capacitor")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("td",[e("h4",[this._v("MCP1541 4.096V Voltage Reference")])])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",[r("thead",[r("tr",[r("th",[t._v("Part")]),t._v(" "),r("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),r("th",[t._v("Description")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[r("img",{attrs:{src:i(178),alt:"8-core IDC Ribbon"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("2 x 36 inch")]),t._v(" "),r("td",[r("h4",[t._v("8-core IDC Ribbon Cable")]),t._v("Connects JS-1 Joysticks to the Joystick Adapter")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(179),alt:"8-pin IDC Header"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("4")]),t._v(" "),r("td",[r("h4",[t._v("8-pin IDC Ribbon Cable Header - Female")]),t._v("Connects JS-1 Joysticks to the Joystick Adapter")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(180),alt:"PCB Front"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[r("h4",[t._v("Front view")])])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"js-1-analog-joystick-yellow-x-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#js-1-analog-joystick-yellow-x-2"}},[this._v("#")]),this._v(" JS-1 Analog Joystick (yellow x 2)")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",[r("thead",[r("tr",[r("th",[t._v("Part")]),t._v(" "),r("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),r("th",[t._v("PCB")]),t._v(" "),r("th",[t._v("Description")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[r("img",{attrs:{src:i(57),alt:"Tactile Switch"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("4 each")]),t._v(" "),r("td",[t._v("SW1 - 4")]),t._v(" "),r("td",[r("h4",[t._v("Tactile Push Button Switch SPST")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(181),alt:"Analog Joystick"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1 each")]),t._v(" "),r("td"),t._v(" "),r("td",[r("h4",[t._v("2-axis Analog Joystick - 10Kohm")])])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(59),alt:"Header 4x2 Male"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1 each")]),t._v(" "),r("td"),t._v(" "),r("td",[r("h4",[t._v("8 Pin Header (4x2)- Horizontal")]),t._v(" Fit to top of PCB.")])])])])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",[r("thead",[r("tr",[r("th",[t._v("Part")]),t._v(" "),r("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),r("th",[t._v("Description")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[r("img",{attrs:{src:i(182),alt:"PCB Front"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("2")]),t._v(" "),r("td",[r("h4",[t._v("Front view")])])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"parallel-printer-red"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#parallel-printer-red"}},[this._v("#")]),this._v(" Parallel Printer (red)")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",[r("thead",[r("tr",[r("th",[t._v("Part")]),t._v(" "),r("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),r("th",[t._v("PCB")]),t._v(" "),r("th",[t._v("Description")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[r("img",{attrs:{src:i(54),alt:"Header 40pin"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("Pin 1")]),t._v(" "),r("td",[r("h4",[t._v("40 Pin Header (20x2)- Horizontal")]),t._v(" Fit to underside of PCB.")])]),t._v(" "),r("tr",[r("td",[r("img",{attrs:{src:i(183),alt:"DB25"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("Printer")]),t._v(" "),r("td",[r("h4",[t._v("DB25 Female Socket - Solder lug")])])])])])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",[r("thead",[r("tr",[r("th",[t._v("Part")]),t._v(" "),r("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),r("th",[t._v("Description")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[r("img",{attrs:{src:i(184),alt:"PCB Front"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1*")]),t._v(" "),r("td",[r("h4",[t._v("Front view")])])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"prototype-adapter-green"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#prototype-adapter-green"}},[this._v("#")]),this._v(" Prototype Adapter (green)")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",[r("thead",[r("tr",[r("th",[t._v("Part")]),t._v(" "),r("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),r("th",[t._v("PCB")]),t._v(" "),r("th",[t._v("Description")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[r("img",{attrs:{src:i(54),alt:"Header 40pin"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),r("td",[t._v("Pin 1")]),t._v(" "),r("td",[r("h4",[t._v("40 Pin Header (20x2)- Horizontal")]),t._v(" Fit to underside of PCB.")])])])])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",[r("thead",[r("tr",[r("th",[t._v("Part")]),t._v(" "),r("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),r("th",[t._v("Description")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[r("img",{attrs:{src:i(185),alt:"PCB Front"}})]),t._v(" "),r("td",{staticStyle:{"text-align":"right"}},[t._v("1*")]),t._v(" "),r("td",[r("h4",[t._v("Front view")])])])])])}],a=i(0),s=Object(a.a)({},(function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),i("table",[t._m(10),t._v(" "),i("tbody",[t._m(11),t._v(" "),t._m(12),t._v(" "),i("tr",[t._m(13),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("Keyboard")]),t._v(" "),i("td",[i("h4",[t._v("6 Pin Header - Vertical")]),t._v(" Cut from 20 Pin male header."),i("BR"),t._v("Only required if using the USB-HID keyboard")],1)]),t._v(" "),t._m(14),t._v(" "),t._m(15),t._v(" "),i("tr",[t._m(16),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("KB Reset")]),t._v(" "),i("td",[i("h4",[t._v("2 Pin Header - Vertical")]),t._v(" Cut from 20 Pin male header."),i("BR"),t._v("Only required if using the USB-HID keyboard")],1)]),t._v(" "),t._m(17),t._v(" "),t._m(18)])]),t._v(" "),t._m(19),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),t._m(22),t._v(" "),t._m(23),t._v(" "),t._m(24),t._v(" "),t._m(25),t._v(" "),i("table",[t._m(26),t._v(" "),i("tbody",[t._m(27),t._v(" "),t._m(28),t._v(" "),t._m(29),t._v(" "),t._m(30),t._v(" "),t._m(31),t._v(" "),t._m(32),t._v(" "),t._m(33),t._v(" "),t._m(34),t._v(" "),i("tr",[i("td",[t._v("NOT SUPPLIED"),i("BR"),t._v("NOT REQUIRED")],1),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("C100")]),t._v(" "),t._m(35)]),t._v(" "),i("tr",[i("td",[t._v("NOT SUPPLIED"),i("BR"),t._v("NOT REQUIRED")],1),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("C101")]),t._v(" "),t._m(36)]),t._v(" "),i("tr",[i("td",[t._v("NOT SUPPLIED"),i("BR"),t._v("NOT REQUIRED")],1),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("MCP1541")]),t._v(" "),t._m(37)])])]),t._v(" "),t._m(38),t._v(" "),t._m(39),t._v(" "),t._m(40),t._v(" "),t._m(41),t._v(" "),t._m(42),t._v(" "),t._m(43),t._v(" "),t._m(44),t._v(" "),t._m(45),t._v(" "),t._m(46),t._v(" "),t._m(47)])}),r,!1,null,null,null);e.default=s.exports},53:function(t,e,i){t.exports=i.p+"assets/img/CNX_20x1.d8b78993.png"},54:function(t,e,i){t.exports=i.p+"assets/img/CNX_20X2RA.1a8842bd.png"},57:function(t,e,i){t.exports=i.p+"assets/img/Tactile_Switch.dbb1e634.png"},58:function(t,e,i){t.exports=i.p+"assets/img/SHUNT.8ad03e96.png"},59:function(t,e,i){t.exports=i.p+"assets/img/CNX_4X2RA.36a6ee1e.png"}}]); \ No newline at end of file diff --git a/assets/js/20.5e9cab50.js b/assets/js/20.5e9cab50.js new file mode 100644 index 0000000..c0db7c0 --- /dev/null +++ b/assets/js/20.5e9cab50.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{135:function(t,e,r){t.exports=r.p+"assets/img/S132_on_IMSAI.d22a7ecd.jpg"},264:function(t,e,r){"use strict";r.r(e);var i=[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"s-132"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#s-132"}},[this._v("#")]),this._v(" S-132")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Powered by an ESP32: "),e("strong",[this._v("S-100 + ESP32 = S-132")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:r(135),alt:"V1.5 pre-production"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("em",[this._v("Pictured with USB-HID keyboard connected (red interface PCB) and DC power supplied via barrel jack")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"overview"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[this._v("#")]),this._v(" Overview")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("It adds many I/O features normally provided by additional cards on the S-100 bus. It connects to the "),e("code",[this._v("Patch")]),this._v(" header on the IMSAI8080 or Cromemco Z-1 replica and produces output on a VGA monitor with support for either a PS/2 or USB-HID keyboard.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("8 digital inputs (5V TTY level - buffered by a 74HC165)")]),this._v(" "),e("li",[this._v("8 digital outputs (5V TTY level - buffered by a 74HC595)")]),this._v(" "),e("li",[this._v("7 analog inputs (0-5V - digitized by an MCP3008 ADC)")]),this._v(" "),e("li",[this._v("2 analog outputs (0-3.3V - produced by the 2 onboard DACs on the ESP32)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[this._v("pluggable adapter boards that provide, alternately:\n"),e("ul",[e("li",[this._v("two Cromemco JS-1 analog joysticks & audio line header for external audio amp.")]),this._v(" "),e("li",[this._v("a Centronics parallel printer port (DB-25) with passthrough for the LPT: device")]),this._v(" "),e("li",[this._v("a prototying PCB for your own designs")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("mount/eject disk images from the 4 emulated floppy disk drives (DSK:A: - DSK:D:)")]),this._v(" "),e("li",[this._v("view and control the Run/Stop/Reset/Ext.Clr state of the front panel (CPA:)")]),this._v(" "),e("li",[this._v("view all the system information normally found in the SYS: device on the "),e("em",[this._v("Web Desktop")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"functions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#functions"}},[this._v("#")]),this._v(" Functions")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Each function of the S-132 can be selected by a keyboard "),e("strong",[this._v("hot-key")]),this._v(" (as with the Linux console on a PC)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[e("code",[this._v(" ")]),this._v(" = "),e("strong",[this._v("TTY2:")]),this._v(" - "),e("em",[this._v("Cromemco Z-1 only")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[e("code",[this._v(" ")]),this._v(" = "),e("strong",[this._v("TTY3:")]),this._v(" - "),e("em",[this._v("Cromemco Z-1 only")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[e("code",[this._v(" ")]),this._v(" = "),e("strong",[this._v("VIO:")]),this._v(" - IMSAI VIO character display - "),e("em",[this._v("IMSAI8080 only")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[e("code",[this._v(" ")]),this._v(" = "),e("strong",[this._v("DZLR:")]),this._v(" - IMSAI Dazzler graphics display")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("li",[r("code",[t._v(" ")]),t._v(" = "),r("strong",[t._v("SYS:")]),t._v(" - System Menu to:\n"),r("ul",[r("li",[t._v("view/eject/mount floppy disks")]),t._v(" "),r("li",[t._v("view floppy disk library image list")]),t._v(" "),r("li",[t._v("view system state for the guest/host/environment/tasks & config files")]),t._v(" "),r("li",[t._v("set S-132 specific settings")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[e("code",[this._v(" ")]),this._v(" = "),e("strong",[this._v("D7AIO:")]),this._v(" - Cromemco D+7A Input/Output display")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("li",[r("code",[t._v(" ")]),t._v(" = "),r("strong",[t._v("CPA:")]),t._v(" - "),r("code",[t._v("RUN")]),t._v(" - lift CP-A frontpanel switch to the "),r("code",[t._v("RUN")]),t._v(" position")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("li",[r("code",[t._v(" ")]),t._v(" = "),r("strong",[t._v("CPA:")]),t._v(" - "),r("code",[t._v("STOP")]),t._v(" - press CP-A frontpanel switch to the "),r("code",[t._v("STOP")]),t._v(" position")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("li",[r("code",[t._v(" ")]),t._v(" = "),r("strong",[t._v("CPA:")]),t._v(" - "),r("code",[t._v("RESET")]),t._v(" - lift CP-A frontpanel switch to the "),r("code",[t._v("RESET")]),t._v(" position")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("li",[r("code",[t._v(" ")]),t._v(" = "),r("strong",[t._v("CPA:")]),t._v(" - "),r("code",[t._v("EXT.CLR")]),t._v(" - press CP-A frontpanel switch to the "),r("code",[t._v("EXT.CLR")]),t._v(" position")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"firmware-updates"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#firmware-updates"}},[this._v("#")]),this._v(" Firmware Updates")])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[this._v("Firmware updates can be performed directly on the S-132 from the System Menu (see "),e("strong",[this._v("SYS:")]),this._v(" above) but require an update file to first be uploaded via the IMSAI8080 or Cromemco Z-1 replica (Web) Desktop UI.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"availability"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#availability"}},[this._v("#")]),this._v(" Availability")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"pricing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pricing"}},[this._v("#")]),this._v(" Pricing")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("ul",[r("li",[t._v("USD$55 for the base kit\n"),r("ul",[r("li",[t._v("all functions included with VGA output, PS/2 keyboard input & DC power input")]),t._v(" "),r("li",[t._v("with only the main PCB (green) and the parts for that")]),t._v(" "),r("li",[t._v("ie. no adapter PCBs or joysticks")])])]),t._v(" "),r("li",[t._v("plus USD$5 for USB-HID keyboard input (replaces PS/2 keyboard input)")]),t._v(" "),r("li",[t._v("plus USD$40 for the full adapter PCB kit including all parts\n"),r("ul",[r("li",[t._v("Parallel printer adapter PCB (red) & DB-25 Centronics printer port")]),t._v(" "),r("li",[t._v("Prototype adapter PCB (also green)")]),t._v(" "),r("li",[t._v("Joystick adapter PCBs (yellow) + 2 analog joysticks, buttons, cables and connectors")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("just the base kit @ USD$55, or")]),this._v(" "),e("li",[this._v("base + usb @ USD$60, or")]),this._v(" "),e("li",[this._v("base + adapters @ USD$95, or")]),this._v(" "),e("li",[this._v("base + usb + adapters @ USD$100")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"to-order"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#to-order"}},[this._v("#")]),this._v(" To Order")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("I am accepting orders via email. If you send email to "),e("a",{attrs:{href:"mailto:info@thehighnibble.com"}},[this._v("info@thehighnibble.com")]),this._v(" with your choice of configuration, shipping name & address, I will respond to you with a PayPal invoice with the total price including shipping and transaction fees.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Please only pay against the PayPal invoice when I send it to you. Do not try to pay directly to me via PayPal as this will only delay your order.")])])}],a=r(0),o=Object(a.a)({},(function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),r("p",[t._v("The S-132 is an add-on for both the "),r("router-link",{attrs:{to:"/imsai8080/"}},[t._v("IMSAI8080")]),t._v(" and the "),r("router-link",{attrs:{to:"/cromemcoZ1/"}},[t._v("Cromemco Z-1")]),t._v(" replicas.")],1),t._v(" "),t._m(5),t._v(" "),r("p",[t._v("With the S-132 attached to the IMSAI8080 or Cromemco Z-1 replica you have all the functionality of the following S-100 attached devices, without the need to use the Web Desktop:")]),t._v(" "),r("ul",[r("li",[t._v("VT100 (TTY:) terminal via serial UART\n"),r("ul",[r("li",[t._v("("),r("a",{attrs:{href:"http://www.s100computers.com/Hardware%20Folder/IMSAI/SIO/SIO.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("IMSAI SIO-2 S-100 card"),r("OutboundLink")],1),t._v(" / "),r("a",{attrs:{href:"http://www.s100computers.com/Hardware%20Folder/Cromemco/16FDC/16FDC.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Cromemco 16FDC (TU-ART) S-100 card"),r("OutboundLink")],1),t._v(")")])])]),t._v(" "),r("li",[t._v("two additional VT100 (or C3102) terminals (TTY2: & TTY3:) via serial UART\n"),r("ul",[r("li",[t._v("("),r("a",{attrs:{href:"http://www.s100computers.com/Hardware%20Folder/Cromemco/TU-ART/TU-ART.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Cromemco TU-ART S-100 card"),r("OutboundLink")],1),t._v(" - "),r("em",[t._v("Cromemco Z-1 only")]),t._v(")")])])]),t._v(" "),r("li",[r("a",{attrs:{href:"http://www.s100computers.com/Hardware%20Folder/IMSAI/VIO%20Board/VIO%20Board.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("IMSAI VIO (CRT:) S-100 card"),r("OutboundLink")],1),t._v(" ("),r("em",[t._v("IMSAI8080 only")]),t._v(")")]),t._v(" "),r("li",[r("a",{attrs:{href:"http://www.s100computers.com/Hardware%20Folder/Cromemco/Dazzler/Dazzler.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Cromemco Dazzler S-100 card"),r("OutboundLink")],1)]),t._v(" "),r("li",[r("a",{attrs:{href:"http://www.s100computers.com/Hardware%20Folder/Cromemco/D+7IO/D+7IO.htm",target:"_blank",rel:"noopener noreferrer"}},[t._v("Cromemco D+7A Input/Output S-100 card"),r("OutboundLink")],1),t._v(" (40-pin header)\n"),t._m(6)]),t._v(" "),t._m(7)]),t._v(" "),r("p",[t._v("Additionally, the S-132 adds a System Menu (SYS:) where you can")]),t._v(" "),t._m(8),t._v(" "),r("p",[t._v("Lastly, the S-132 has a DC barrel jack and a selectable LM7805 5V regulator allowing you the option of powering your IMSAI8080/Cromemco Z-1, along with the S-132, from a standard DC power supply (from 5V to 12V).")]),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),r("ul",[r("li",[r("code",[t._v(" ")]),t._v(" = "),r("strong",[t._v("TTY:")]),t._v(" - "),r("router-link",{attrs:{to:"/vt132/"}},[t._v("VT132")]),t._v(" terminal emulator")],1),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),t._m(17),t._v(" "),t._m(18),t._v(" "),t._m(19),t._v(" "),t._m(20)]),t._v(" "),r("h3",{attrs:{id:"pinouts-for-the-d-7a-i-o-connector"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#pinouts-for-the-d-7a-i-o-connector"}},[t._v("#")]),t._v(" "),r("router-link",{attrs:{to:"./pinouts/"}},[t._v("Pinouts for the D+7A I/O connector")])],1),t._v(" "),t._m(21),t._v(" "),r("ul",[r("li",[t._v("Firmware updates are hosted on "),r("a",{attrs:{href:"https://github.com/thehighnibble/s-132",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub"),r("OutboundLink")],1)]),t._v(" "),r("li",[t._v("The current production firmware can always be found at "),r("a",{attrs:{href:"https://github.com/thehighnibble/s-132/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[t._v("github.com/thehighnibble/s-132/releases/latest"),r("OutboundLink")],1)]),t._v(" "),t._m(22)]),t._v(" "),r("p",[t._v("The process for Firmware Updates is covered in the "),r("router-link",{attrs:{to:"./update/"}},[t._v("Firmware Update Guide")])],1),t._v(" "),t._m(23),t._v(" "),r("p",[t._v("The S-132 is available to order as of March 2023.")]),t._v(" "),t._m(24),t._v(" "),t._m(25),t._v(" "),r("p",[t._v("So a full package is USD$100 but you can choose from:")]),t._v(" "),t._m(26),t._v(" "),t._m(27),t._v(" "),t._m(28),t._v(" "),t._m(29),t._v(" "),r("p",[t._v("While you are waiting for your S-132 kit, checkout the introductory video")]),t._v(" "),r("iframe",{attrs:{width:"640",height:"360",src:"https://www.youtube.com/embed/4TmmvyEFCsw",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""}}),t._v(" "),r("h2",{attrs:{id:"configuration-draft"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#configuration-draft"}},[t._v("#")]),t._v(" "),r("router-link",{attrs:{to:"./configure/"}},[t._v("Configuration (draft)")])],1),t._v(" "),r("h2",{attrs:{id:"bill-of-materials-draft"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#bill-of-materials-draft"}},[t._v("#")]),t._v(" "),r("router-link",{attrs:{to:"./bom/"}},[t._v("Bill-of-Materials (draft)")])],1),t._v(" "),r("h2",{attrs:{id:"build-notes-draft"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#build-notes-draft"}},[t._v("#")]),t._v(" "),r("router-link",{attrs:{to:"./build/"}},[t._v("Build notes (draft)")])],1),t._v(" "),r("h2",{attrs:{id:"firmware-install-console-log"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#firmware-install-console-log"}},[t._v("#")]),t._v(" "),r("router-link",{attrs:{to:"./maint/"}},[t._v("Firmware Install & Console Log")])],1)])}),i,!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/21.8975c554.js b/assets/js/21.8975c554.js new file mode 100644 index 0000000..6f2498f --- /dev/null +++ b/assets/js/21.8975c554.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{186:function(e,t,s){e.exports=s.p+"assets/img/Finished_PCB.7743562f.jpg"},266:function(e,t,s){"use strict";s.r(t);var i=[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{attrs:{id:"build-notes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-notes"}},[this._v("#")]),this._v(" Build notes")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"hi-resolution-image-of-the-finished-pcb"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#hi-resolution-image-of-the-finished-pcb"}},[this._v("#")]),this._v(" Hi-resolution image of the finished PCB")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(186),alt:"Finished PCB"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"notes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#notes"}},[this._v("#")]),this._v(" Notes")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[e._v("use "),s("strong",[e._v("lots of flux")]),e._v(" on the SMDs\n"),s("ul",[s("li",[e._v("don't even attempt them without flux")]),e._v(" "),s("li",[e._v("a flux cored solder is not enough")])])]),e._v(" "),s("li",[e._v("the ESP32 module goes with the metal can face down in the cutout in the PCB\n"),s("ul",[s("li",[e._v("this holds it in position for soldering")]),e._v(" "),s("li",[e._v("see the image above.")])])]),e._v(" "),s("li",[e._v("the two SOIC package SMD ICs are the hardest ones to orientate correctly\n"),s("ul",[s("li",[e._v("read their data sheets on how to identify pin 1")]),e._v(" "),s("li",[e._v("the location for pin 1 is marked clearly on the PCB silkscreen")])])]),e._v(" "),s("li",[e._v("once you've soldered the SMDs, most people use a rule of thumb:\n"),s("ul",[s("li",[e._v("to solder the through-hole components starting with the lowest/shortest/closest to the board")]),e._v(" "),s("li",[e._v("then moving up through to the tallest components last")])])]),e._v(" "),s("li",[e._v("use a multimeter to measure the resistance and correctly identify the resistors")]),e._v(" "),s("li",[e._v("use masking/painters tape to hold things in place if you need an extra pair of hands")]),e._v(" "),s("li",[e._v("don't solder the DIP-16 ICs directly to the PCB, use the sockets")])])}],o=s(0),n=Object(o.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"content"},[e._m(0),e._v(" "),e._m(1),e._v(" "),s("p",[e._v("The following image has a resolution of 3024x3024.\nRight click on the image and open in a new window/tab to see at a higher resolution.")]),e._v(" "),e._m(2),e._v(" "),e._m(3),e._v(" "),s("p",[e._v("The nearest thing to assembly instructions is the "),s("router-link",{attrs:{to:"./../bom/"}},[e._v("Bill-of-Materials")])],1),e._v(" "),s("p",[e._v("The PCB has all the components marked.")]),e._v(" "),s("p",[e._v("As a general guide, proceed in the order of the BOM, with the following notes:")]),e._v(" "),e._m(4)])}),i,!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/22.ed3f4f05.js b/assets/js/22.ed3f4f05.js new file mode 100644 index 0000000..0307cdf --- /dev/null +++ b/assets/js/22.ed3f4f05.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{187:function(t,e,v){t.exports=v.p+"assets/img/D+7A_pinout_sml.68f3b3d6.png"},269:function(t,e,v){"use strict";v.r(e);var _=[function(){var t=this,e=t.$createElement,_=t._self._c||e;return _("div",{staticClass:"content"},[_("h1",{attrs:{id:"d-7a-i-o-connector-pinouts"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#d-7a-i-o-connector-pinouts"}},[t._v("#")]),t._v(" D+7A I/O connector pinouts")]),t._v(" "),_("h2",{attrs:{id:"original-s-100-cromemco-d-7a-i-o-connector"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#original-s-100-cromemco-d-7a-i-o-connector"}},[t._v("#")]),t._v(" Original S-100 Cromemco D+7A I/O connector")]),t._v(" "),_("p",[t._v("The following diagram is from the original Cromemco D+7A I/O documentation")]),t._v(" "),_("p",[_("img",{attrs:{src:v(187),alt:"D+7A I/O connector"}})]),t._v(" "),_("h2",{attrs:{id:"s-132-d-7a-i-o-connector"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#s-132-d-7a-i-o-connector"}},[t._v("#")]),t._v(" S-132 D+7A I/O connector")]),t._v(" "),_("p",[t._v("The S-132 D+7A I/O 40-pin (female) connector closely matches the original Cromemco D+7A I/O 44 position edge connector providing most of the same Analog and Digital inputs and outputs in the same configuration.\nMainly it differs in the voltages that are (or are not) provided around the middle of the connector.")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",{staticStyle:{"text-align":"right"}},[t._v("ESP32 Side")]),t._v(" "),_("th"),t._v(" "),_("th",{staticStyle:{"text-align":"center"}},[t._v("Pin No.")]),t._v(" "),_("th",{staticStyle:{"text-align":"center"}},[t._v("Pin No.")]),t._v(" "),_("th",[t._v("LM7805 Side")]),t._v(" "),_("th")])]),t._v(" "),_("tbody",[_("tr",[_("td",{staticStyle:{"text-align":"right"}}),t._v(" "),_("td"),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("Top")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("Top")]),t._v(" "),_("td"),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}},[t._v("Analog Ground "),_("sup",[t._v("(1)")])]),t._v(" "),_("td"),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("A")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("1")]),t._v(" "),_("td",[t._v("Ground")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}},[t._v("Analog Input "),_("sup",[t._v("(2)")])]),t._v(" "),_("td",[t._v("7")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("B")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("2")]),t._v(" "),_("td",[t._v("N/C")]),t._v(" "),_("td",[t._v("7")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}}),t._v(" "),_("td",[t._v("6")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("C")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("3")]),t._v(" "),_("td",[t._v("N/C")]),t._v(" "),_("td",[t._v("6")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}}),t._v(" "),_("td",[t._v("5")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("D")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("4")]),t._v(" "),_("td",[t._v("N/C")]),t._v(" "),_("td",[t._v("5")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}}),t._v(" "),_("td",[t._v("4")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("E")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("5")]),t._v(" "),_("td",[t._v("N/C")]),t._v(" "),_("td",[t._v("4")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}}),t._v(" "),_("td",[t._v("3")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("F")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("6")]),t._v(" "),_("td",[t._v("Analog Output "),_("sup",[t._v("(3)")])]),t._v(" "),_("td",[t._v("3")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}}),t._v(" "),_("td",[t._v("2")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("H")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("7")]),t._v(" "),_("td",[t._v("N/C")]),t._v(" "),_("td",[t._v("2")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}}),t._v(" "),_("td",[t._v("1")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("J")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("8")]),t._v(" "),_("td",[t._v("Analog Output "),_("sup",[t._v("(3)")])]),t._v(" "),_("td",[t._v("1")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}},[t._v("Voltage Ref. "),_("sup",[t._v("(4)")])]),t._v(" "),_("td"),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("H")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("9")]),t._v(" "),_("td",[t._v("Voltage Ref. "),_("sup",[t._v("(4)")])]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}},[t._v("+5V DC Regulated")]),t._v(" "),_("td"),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("N")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("10")]),t._v(" "),_("td",[t._v("+5V DC Regulated")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}},[t._v("Input _STB "),_("sup",[t._v("(5)")])]),t._v(" "),_("td"),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("P")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("11")]),t._v(" "),_("td",[t._v("Output _STB "),_("sup",[t._v("(6)")])]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}},[t._v("Digital Input Bit "),_("sup",[t._v("(7)")])]),t._v(" "),_("td",[t._v("7")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("R")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("12")]),t._v(" "),_("td",[t._v("Digital Output Bit "),_("sup",[t._v("(8)")])]),t._v(" "),_("td",[t._v("7")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}}),t._v(" "),_("td",[t._v("6")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("S")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("13")]),t._v(" "),_("td"),t._v(" "),_("td",[t._v("6")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}}),t._v(" "),_("td",[t._v("5")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("T")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("14")]),t._v(" "),_("td"),t._v(" "),_("td",[t._v("5")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}}),t._v(" "),_("td",[t._v("4")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("U")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("15")]),t._v(" "),_("td"),t._v(" "),_("td",[t._v("4")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}}),t._v(" "),_("td",[t._v("3")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("V")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("16")]),t._v(" "),_("td"),t._v(" "),_("td",[t._v("3")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}}),t._v(" "),_("td",[t._v("2")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("W")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("17")]),t._v(" "),_("td"),t._v(" "),_("td",[t._v("2")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}}),t._v(" "),_("td",[t._v("1")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("X")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("18")]),t._v(" "),_("td"),t._v(" "),_("td",[t._v("1")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}}),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("Y")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("19")]),t._v(" "),_("td"),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}},[t._v("Ground")]),t._v(" "),_("td"),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("Z")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("20")]),t._v(" "),_("td",[t._v("Ground")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",{staticStyle:{"text-align":"right"}}),t._v(" "),_("td"),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("Bottom")]),t._v(" "),_("td",{staticStyle:{"text-align":"center"}},[t._v("Bottom")]),t._v(" "),_("td"),t._v(" "),_("td")])])]),t._v(" "),_("h2",{attrs:{id:"notes"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#notes"}},[t._v("#")]),t._v(" Notes:")]),t._v(" "),_("ol",[_("li",[_("code",[t._v("Analog Ground")]),t._v(" is isolated from "),_("code",[t._v("Ground")]),t._v(" "),_("ul",[_("li",[t._v("for most use cases you should tie it to "),_("code",[t._v("Ground")])])])]),t._v(" "),_("li",[_("code",[t._v("Analog Input 1 to 7")]),t._v(" "),_("ul",[_("li",[t._v("these are digitized by the "),_("strong",[t._v("MCP3008 ADC")])]),t._v(" "),_("li",[t._v("typically "),_("code",[t._v("0V")]),t._v(" to "),_("code",[t._v("Voltage Ref. V")]),t._v(" for signed input port values of "),_("code",[t._v("-128 to 127")])]),t._v(" "),_("li",[t._v("see the "),_("strong",[t._v("MCP3008 ADC")]),t._v(" data sheet for exact specifications")])])]),t._v(" "),_("li",[t._v("There are only two (2) analog outputs "),_("code",[t._v("Analog Output 1")]),t._v(" and "),_("code",[t._v("Analog Output 3")]),t._v(" "),_("ul",[_("li",[t._v("because there are only two (2) DACs on the "),_("strong",[t._v("ESP32")])]),t._v(" "),_("li",[t._v("these are "),_("code",[t._v("0V")]),t._v(" to "),_("code",[t._v("+3.3V")]),t._v(" (or slightly between these limits) for signed output port values of -128 to 127")]),t._v(" "),_("li",[t._v("you can map any of the Analog Output ports to either of these two (2) DACs (see config guide for D+7AIO settings)")]),t._v(" "),_("li",[t._v("it's 1 & 3 because that is what the Cromemco JS-1 Analog Joysticks used for audio")])])]),t._v(" "),_("li",[_("code",[t._v("Voltage Ref.")]),t._v(" is the V.Ref on the MCP3008 ADC\n"),_("ul",[_("li",[t._v("for most use cases you should tie it to "),_("code",[t._v("+5V Regulated")])])])]),t._v(" "),_("li",[_("code",[t._v("Input _STB")]),t._v(" (active low) "),_("strong",[t._v("isn't")]),t._v(" implemented - because... reasons.")]),t._v(" "),_("li",[_("code",[t._v("Output _STB")]),t._v(" (active low) "),_("strong",[t._v("is")]),t._v(" implemented\n"),_("ul",[_("li",[t._v("as a working example: this is used on the Parallel Printer interface as the parallel output data strobe")])])]),t._v(" "),_("li",[_("code",[t._v("Digital Input Bits 0 to 7")]),t._v(" "),_("ul",[_("li",[t._v("these are buffered by the "),_("strong",[t._v("74HC165")]),t._v(" with a "),_("code",[t._v("+5V DC")]),t._v(" regulated supply for "),_("code",[t._v("Vcc")])]),t._v(" "),_("li",[t._v("typically "),_("code",[t._v("> 3.15V = 1")]),t._v(" and "),_("code",[t._v("< 1.35V = 0")])]),t._v(" "),_("li",[t._v("see the "),_("strong",[t._v("74HC165")]),t._v(" data sheet for exact specifications")])])]),t._v(" "),_("li",[_("code",[t._v("Digital Output Bits 0 to 7")]),t._v(" "),_("ul",[_("li",[t._v("these are driven by the "),_("strong",[t._v("74HC595")]),t._v(" with a "),_("code",[t._v("+5V DC")]),t._v(" regulated supply for "),_("code",[t._v("Vcc")])]),t._v(" "),_("li",[t._v("typically "),_("code",[t._v("0V = 0")]),t._v(" and "),_("code",[t._v("+5V (Vcc) = 1")])]),t._v(" "),_("li",[t._v("see the "),_("strong",[t._v("74HC595")]),t._v(" data sheet for exact specifications")])])])])])}],i=v(0),a=Object(i.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),_,!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/23.285a1bb3.js b/assets/js/23.285a1bb3.js new file mode 100644 index 0000000..b2e65f6 --- /dev/null +++ b/assets/js/23.285a1bb3.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{221:function(e,t,n){e.exports=n.p+"assets/img/Modem_AT_help.5f469d8f.jpg"},275:function(e,t,n){"use strict";n.r(t);var o=[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{attrs:{id:"at-hayes-serial-modem-operation-manual-draft"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#at-hayes-serial-modem-operation-manual-draft"}},[this._v("#")]),this._v(" 'AT' (Hayes) Serial Modem Operation Manual (Draft)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"background"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#background"}},[this._v("#")]),this._v(" Background")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Although later standardized by the TIA/EIA, in the early days of dialup modems the "),t("strong",[this._v("'AT' command set")]),this._v(" of the Hayes SmartModem was copied by other modem makers and became a de-facto standard or rather a "),t("strong",[this._v("convention")]),this._v(", as other modem manufacturers took the liberty to alter and extend the 'AT' command set. The same applied to the so called "),t("strong",[this._v("'S' Registers")]),this._v(" where settings and configuration are made and saved to non-volatile storage (NVS).")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"at-commands"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#at-commands"}},[this._v("#")]),this._v(" 'AT' Commands")])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[this._v("The modem only responds to 'AT' commands in upper case.")])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"tip custom-block"},[n("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),n("ul",[n("li",[e._v("Commands are terminated by "),n("code",[e._v(" ")]),e._v(" (carriage return, "),n("code",[e._v(" -m")]),e._v(", "),n("code",[e._v("0x0D")]),e._v(", decimal 13) usually generated by the "),n("code",[e._v("Enter")]),e._v(" or "),n("code",[e._v("Return")]),e._v(" key on your keyboard.")]),e._v(" "),n("li",[e._v("Commands can by edited, before pressing "),n("code",[e._v(" ")]),e._v(", using "),n("code",[e._v(" ")]),e._v(" (backspace, "),n("code",[e._v(" -H")]),e._v(", "),n("code",[e._v("0x08")]),e._v(" decimal 8) to erase the previous character entered. You may need to configure the terminal to generate "),n("code",[e._v(" ")]),e._v(" when you press the "),n("code",[e._v("Backspace")]),e._v(" or "),n("code",[e._v("<-")]),e._v(" key on your keyboard.")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"warning custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),t("p",[this._v("The 'AT' command processor is based on a finite state machine (FSM). If you type anything that is not recognized by the rules of the FSM you will immediately see an "),t("code",[this._v("Error")]),this._v(" message.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"at-command-help"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#at-command-help"}},[this._v("#")]),this._v(" 'AT' Command Help")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Typing "),t("code",[this._v("AT$")]),this._v(" when connected to the modem will result in the following 'AT' command summary being returned by the modem.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:n(221),alt:"Modem AT Commands"}})])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"tip custom-block"},[n("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),n("ul",[n("li",[e._v("All commands must be prefixed with "),n("code",[e._v("AT")]),e._v(" except for the "),n("strong",[e._v("immediate")]),e._v(" command "),n("code",[e._v("A/")]),e._v(".")]),e._v(" "),n("li",[e._v("Commands can be concatenated into a single command string, except in the cases where the command accepts all the remaining input up to the "),n("code",[e._v(" ")]),e._v(" as part of the command.")]),e._v(" "),n("li",[e._v("See the table below for examples.")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"warning custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),t("p",[this._v("The maximum length command string that can be entered is "),t("strong",[this._v("80")]),this._v(" characters.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"at-command-summary-table"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#at-command-summary-table"}},[this._v("#")]),this._v(" 'AT' Command Summary Table")])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("table",[n("thead",[n("tr",[n("th",[e._v("Command")]),e._v(" "),n("th",[e._v("Description")]),e._v(" "),n("th",[e._v("Comments/Examples")])])]),e._v(" "),n("tbody",[n("tr",[n("td",[n("strong",[e._v("AT")])]),e._v(" "),n("td",[e._v("'AT' test")]),e._v(" "),n("td",[n("code",[e._v("AT")]),e._v(" entered on its own will respond "),n("code",[e._v("OK")]),e._v(" and tests that command processor is responding")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("A/")])]),e._v(" "),n("td",[e._v("Repeat last command (immediate)")]),e._v(" "),n("td",[e._v("This "),n("strong",[e._v("immediate")]),e._v(" command is "),n("strong",[e._v("not")]),e._v(" prefixed by "),n("code",[e._v("AT")]),e._v(" but repeats the last command entered as soon as "),n("code",[e._v("A/")]),e._v(" is entered ie. it does not wait for a "),n("code",[e._v(" ")])])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("$")])]),e._v(" "),n("td",[e._v("Help")]),e._v(" "),n("td",[e._v("Responds with the 'AT' Command Help "),n("a",{attrs:{href:"#at-command-help"}},[e._v("see above")])])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("I")]),e._v(" or "),n("strong",[e._v("I0")])]),e._v(" "),n("td",[e._v("Information zero")]),e._v(" "),n("td",[e._v("Responds with the modem model string "),n("code",[e._v("VT132 'AT' Modem")])])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("I1")])]),e._v(" "),n("td",[e._v("Information one")]),e._v(" "),n("td",[e._v("Responds with the modem firmware version string eg. "),n("code",[e._v("V1.0.0")])])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("I2")])]),e._v(" "),n("td",[e._v("Information two")]),e._v(" "),n("td",[e._v("Responds with the modem firmware build chain version string eg. "),n("code",[e._v("V4.0-1234")])])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("Z")])]),e._v(" "),n("td",[e._v("Reset modem")]),e._v(" "),n("td",[e._v("Soft resets the modem. Reloads settings and 'S' Registers from NVS. Closes open TCP/IP connections. But does not disconnect from the Wi-Fi Access Point (AP) if connected")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("&F")])]),e._v(" "),n("td",[e._v("Restore factory defaults")]),e._v(" "),n("td",[e._v("Return the current settings and 'S' Registers to factory defaults. But does not save these to NVS")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("&W")])]),e._v(" "),n("td",[e._v("Write settings to NVS")]),e._v(" "),n("td",[e._v("Writes the current settings to NVS. This takes approximately 10 seconds, during which the modem appears frozen. The modem will respond "),n("code",[e._v("OK")]),e._v(" when the write is complete")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("D")])]),e._v(" "),n("td",[e._v("Dial (TCP/IP connect)")]),e._v(" "),n("td",[e._v("The full form is "),n("code",[e._v("ATDhostname:port")]),e._v(" where "),n("em",[e._v("hostname")]),e._v(" is either the IPV4 address in "),n("code",[e._v("nnn.nnn.nnn.nnn")]),e._v(" notation or the DNS name of the host. The "),n("code",[e._v(":port")]),e._v(" is optional and specifies a "),n("em",[e._v("numeric TCP/IP port number")]),e._v(" for the connection, the default is "),n("code",[e._v("23")]),e._v(". There are a number of possible error conditions explained below under "),n("a",{attrs:{href:"#wi-fi-connection-results"}},[e._v("Wi-Fi Connection Results")]),e._v(". If the connection is successful the modem will enter "),n("strong",[e._v("Data Mode")])])]),e._v(" "),n("tr",[n("td",[e._v("+++")]),e._v(" "),n("td",[e._v("Escape Sequence")]),e._v(" "),n("td",[e._v("When connected and in "),n("strong",[e._v("Data Mode")]),e._v(" the "),n("em",[e._v("Escape Sequence")]),e._v(" will return to "),n("strong",[e._v("Command Mode")]),e._v(". The "),n("code",[e._v("+++")]),e._v(" "),n("em",[e._v("Escape Sequence")]),e._v(" is only recognised if surrounded by a guard interval of 1 second ie. there must be a one second pause before and after entering "),n("code",[e._v("+++")]),e._v(" or it will not be recognised but simply treated as part of the data stream")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("O")])]),e._v(" "),n("td",[e._v("Return Online")]),e._v(" "),n("td",[e._v("When connected and in "),n("strong",[e._v("Command Mode")]),e._v(" "),n("code",[e._v("ATO")]),e._v(" will return to "),n("strong",[e._v("Data Mode")]),e._v(". If not connected the modem will respond "),n("code",[e._v("NO CARRIER")])])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("H")])]),e._v(" "),n("td",[e._v("Hangup")]),e._v(" "),n("td",[e._v("When connected and in "),n("strong",[e._v("Command Mode")]),e._v(" "),n("code",[e._v("ATH")]),e._v(" will close the connection. If a connection is closed the modem will respond "),n("code",[e._v("HANGUP")])])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("&A")]),e._v(" or "),n("strong",[e._v("&A0")])]),e._v(" "),n("td",[e._v("Enable Answer mode (interactive)")]),e._v(" "),n("td",[e._v("Unless "),n("code",[e._v("AT&A")]),e._v(" is entered the modem will not respond to requests for incoming connections. See "),n("a",{attrs:{href:"#answer-mode"}},[e._v("Answer Mode")]),e._v(" below for details. "),n("strong",[e._v("Interactive:")]),e._v(" Displays "),n("code",[e._v("RING")]),e._v(" & "),n("code",[e._v("CONNECTED")]),e._v(" responses (if enabled). Allows the interrupt sequence "),n("code",[e._v("+++")]),e._v(" to return the Modem to command mode from data mode")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("&A1")])]),e._v(" "),n("td",[e._v("Enable Answer mode (daemon)")]),e._v(" "),n("td",[e._v("Unless "),n("code",[e._v("AT&A")]),e._v(" is entered the modem will not respond to requests for incoming connections. See "),n("a",{attrs:{href:"#answer-mode"}},[e._v("Answer Mode")]),e._v(" below for details. "),n("strong",[e._v("Daemon:")]),e._v(" Suppresses 'AT' command echo and responses (sets "),n("code",[e._v("ATE0")]),e._v(" & "),n("code",[e._v("ATQ1")]),e._v("). Ignores the interrupt sequence "),n("code",[e._v("+++")]),e._v(" preventing the Modem from returning to command mode from data mode")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("A")])]),e._v(" "),n("td",[e._v("Answer")]),e._v(" "),n("td",[e._v("When an incoming connection request is indicated by the modem responding "),n("code",[e._v("RING")]),e._v(" the request can by manually accepted with the "),n("code",[e._v("ATA")]),e._v(" command. If the connection is successful the modem will enter "),n("strong",[e._v("Data Mode")])])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("Sn")])]),e._v(" "),n("td",[e._v("Select current register")]),e._v(" "),n("td",[e._v("Select register "),n("em",[e._v("n")]),e._v(" as the current 'S' register")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("?")])]),e._v(" "),n("td",[e._v("Query current register")]),e._v(" "),n("td",[e._v("The modem will respond with the value of the current 'S' register. If no register has been selected the default is zero (0). As commands can be concatenated it is normal to append this to the "),n("code",[e._v("Sn")]),e._v(" command to query a specific register eg. "),n("code",[e._v("ATS15?")]),e._v(" will query the value of 'S' Register 15")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("=r")])]),e._v(" "),n("td",[e._v("Set current register")]),e._v(" "),n("td",[e._v("Sets the value of the current 'S' register to "),n("em",[e._v("r")]),e._v(". If no register has been selected the default is zero (0). As commands can be concatenated it is normal to append this to the "),n("code",[e._v("Sn")]),e._v(" command to set a specific register eg. "),n("code",[e._v("ATS15=1")]),e._v(" will set the value of 'S' Register 15 to 1")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("En")])]),e._v(" "),n("td",[e._v("Command Echo")]),e._v(" "),n("td",[e._v("Where "),n("em",[e._v("n=0")]),e._v(" is echo off and "),n("em",[e._v("n=1")]),e._v(" is echo on; to disable/enable echoing 'AT' commands when in command mode; default is "),n("em",[e._v("on")]),e._v(" (echo on)")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("Qn")])]),e._v(" "),n("td",[e._v("Quiet Results")]),e._v(" "),n("td",[e._v("Where "),n("em",[e._v("n=0")]),e._v(" is quiet off and "),n("em",[e._v("n=1")]),e._v(" is quiet on; to show/hide 'AT' command results when in command mode; default is "),n("em",[e._v("off")]),e._v(" (quiet off)")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("&K")]),e._v(" or "),n("strong",[e._v("&K0")])]),e._v(" "),n("td",[e._v("Disable CTS/RTS flow control")]),e._v(" "),n("td",[e._v("The 6-pin modem header provides CTS/RTS lines. "),n("code",[e._v("AT&K0")]),e._v(" disables their operation. This is the default")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("&K1")])]),e._v(" "),n("td",[e._v("Enable CTS/RTS flow control")]),e._v(" "),n("td",[e._v("The 6-pin modem header provides CTS/RTS lines. "),n("code",[e._v("AT&K1")]),e._v(" enables their operation")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("+W?")])]),e._v(" "),n("td",[e._v("Query Wi-Fi Access Point (AP) connection status")]),e._v(" "),n("td",[e._v("Responds with the status of the Wi-Fi connection as a string. The possible responses are listed below under "),n("a",{attrs:{href:"#wi-fi-connection-results"}},[e._v("Wi-Fi Connection Results")])])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("+W=sss,ppp")])]),e._v(" "),n("td",[e._v("Join Wi-Fi Access Point (AP)")]),e._v(" "),n("td",[e._v("Connects to the Wi-Fi access point with "),n("strong",[e._v("SSID")]),e._v(" - "),n("em",[e._v("sss")]),e._v(" and "),n("strong",[e._v("password")]),e._v(" - "),n("em",[e._v("ppp")]),e._v(". The modem responds "),n("code",[e._v("OK")]),e._v(" immediately but the connection happens asynchronously so the status of the connection should be checked with "),n("code",[e._v("AT+W?")]),e._v(" or "),n("code",[e._v("AT+W$")]),e._v(". The "),n("strong",[e._v("SSID")]),e._v(" and "),n("strong",[e._v("password")]),e._v(" are immediately stored in NVS regardless of whether they are valid or the connection was successful")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("+W$")])]),e._v(" "),n("td",[e._v("Show Wi-Fi IP address")]),e._v(" "),n("td",[e._v("Responds with the IP address allocated to the modem from the AP by DHCP. If the connection has not completed or has been unsuccessful the IP address returned will be "),n("code",[e._v("0.0.0.0")])])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("+W#")])]),e._v(" "),n("td",[e._v("Show Wi-Fi MAC address")]),e._v(" "),n("td",[e._v("Responds with the MAC address of the modem. No connection is required, the MAC address is always available")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("+W+")])]),e._v(" "),n("td",[e._v("Reconnect to Wi-Fi AP")]),e._v(" "),n("td",[e._v("Reconnects to the AP using the "),n("strong",[e._v("SSID")]),e._v(" and "),n("strong",[e._v("password")]),e._v(" stored in NVS. If the modem is already joined to the AP, the connection is first disconnected and then reconnected")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("+W-")])]),e._v(" "),n("td",[e._v("Disconnect from Wi-Fi AP")]),e._v(" "),n("td",[e._v("Disconnects from the AP")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("+B?")])]),e._v(" "),n("td",[e._v("Query Baud Rate")]),e._v(" "),n("td",[e._v("Responds with the current baud rate configured for the connection to the DTE")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("+B=n")])]),e._v(" "),n("td",[e._v("Set Baud Rate")]),e._v(" "),n("td",[e._v("Sets the current baud rate to a supported value closest to "),n("em",[e._v("n")]),e._v(". The supported speeds are 4800, 9600, 14400, 19200, 38400, 57600, 115200. After the command is entered there is a 5 second delay before the baud rate is changed to allow changes to be made on the DTE before the modem responds. The new baud rate is immediately stored in NVS")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("+T?")])]),e._v(" "),n("td",[e._v("Query Telnet TERM environment variable")]),e._v(" "),n("td",[e._v("Responds with the current string value of the TERM environment variable that will be used by the Telnet protocol layer when negotiating the "),n("strong",[e._v("TERMINAL-TYPE")]),e._v(" option. If no value has been set, or has been cleared, the default value "),n("code",[e._v("vt100")]),e._v(" will be used")])]),e._v(" "),n("tr",[n("td",[n("strong",[e._v("+T=ttt")])]),e._v(" "),n("td",[e._v("Set Telnet TERM environment variable")]),e._v(" "),n("td",[e._v("Sets the current string value of the TERM environment variable to "),n("em",[e._v("ttt")]),e._v(". The Telnet protocol layer will use this value when negotiating the "),n("strong",[e._v("TERMINAL-TYPE")]),e._v(" option. If the command includes no value and is given only as "),n("code",[e._v("AT+T=")]),e._v(" then the TERM environment variable is cleared and the default value will be used in future. The new value is immediately stored in NVS.")])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"s-registers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#s-registers"}},[this._v("#")]),this._v(" 'S' Registers")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("There are a total of 51 'S' Registers reserved in the modem, "),t("code",[this._v("S0")]),this._v(" to "),t("code",[this._v("S50")]),this._v(".")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"defined-s-registers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#defined-s-registers"}},[this._v("#")]),this._v(" Defined 'S' Registers")])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("table",[n("thead",[n("tr",[n("th",[e._v("Register")]),e._v(" "),n("th",[e._v("Description")]),e._v(" "),n("th",[e._v("Range")]),e._v(" "),n("th",[e._v("Default Value")]),e._v(" "),n("th",[e._v("Used")])])]),e._v(" "),n("tbody",[n("tr",[n("td",[e._v("S0")]),e._v(" "),n("td",[e._v("Number of rings before Auto-Answer")]),e._v(" "),n("td",[e._v("0–255 (0 = never)")]),e._v(" "),n("td",[e._v("0")]),e._v(" "),n("td",[e._v("Yes")])]),e._v(" "),n("tr",[n("td",[e._v("S1")]),e._v(" "),n("td",[e._v("Ring Counter")]),e._v(" "),n("td",[e._v("0–255 rings")]),e._v(" "),n("td",[e._v("0")]),e._v(" "),n("td",[e._v("Yes")])]),e._v(" "),n("tr",[n("td",[e._v("S2")]),e._v(" "),n("td",[e._v("Escape character")]),e._v(" "),n("td",[e._v("0–255, ASCII decimal")]),e._v(" "),n("td",[e._v("43 ('+')")]),e._v(" "),n("td",[e._v("Ignored")])]),e._v(" "),n("tr",[n("td",[e._v("S3")]),e._v(" "),n("td",[e._v("Carriage Return Character")]),e._v(" "),n("td",[e._v("0–127, ASCII decimal")]),e._v(" "),n("td",[e._v("13 (Carriage Return)")]),e._v(" "),n("td",[e._v("Ignored")])]),e._v(" "),n("tr",[n("td",[e._v("S4")]),e._v(" "),n("td",[e._v("Line Feed Character")]),e._v(" "),n("td",[e._v("0–127, ASCII decimal")]),e._v(" "),n("td",[e._v("10 (Line Feed)")]),e._v(" "),n("td",[e._v("Ignored")])]),e._v(" "),n("tr",[n("td",[e._v("S5")]),e._v(" "),n("td",[e._v("Backspace Character")]),e._v(" "),n("td",[e._v("0–32, ASCII decimal")]),e._v(" "),n("td",[e._v("8 (Backspace)")]),e._v(" "),n("td",[e._v("Ignored")])]),e._v(" "),n("tr",[n("td",[e._v("S14")]),e._v(" "),n("td",[e._v("TCP/IP Port number for "),n("strong",[e._v("Answer Mode")])]),e._v(" "),n("td",[e._v("0-65535")]),e._v(" "),n("td",[e._v("23")]),e._v(" "),n("td",[e._v("Yes")])]),e._v(" "),n("tr",[n("td",[e._v("S15")]),e._v(" "),n("td",[e._v("Telnet Protocol for "),n("strong",[e._v("Data Mode")])]),e._v(" "),n("td",[e._v("0 - disabled, 1 - enabled")]),e._v(" "),n("td",[e._v("0")]),e._v(" "),n("td",[e._v("Yes")])]),e._v(" "),n("tr",[n("td",[e._v("S16")]),e._v(" "),n("td",[e._v("Negotiate Telnet "),n("strong",[e._v("SGA")])]),e._v(" "),n("td",[e._v("0 - Won't/Don't, 1 - Will, 2 - Do, 3 - Will/Do")]),e._v(" "),n("td",[e._v("3")]),e._v(" "),n("td",[e._v("Yes")])]),e._v(" "),n("tr",[n("td",[e._v("S17")]),e._v(" "),n("td",[e._v("Negotiate Telnet "),n("strong",[e._v("ECHO")])]),e._v(" "),n("td",[e._v("0 - Won't/Don't, 1 - Will, 2 - Do, 3 - Will/Do")]),e._v(" "),n("td",[e._v("3")]),e._v(" "),n("td",[e._v("Yes")])]),e._v(" "),n("tr",[n("td",[e._v("S18")]),e._v(" "),n("td",[e._v("Negotiate Telnet "),n("strong",[e._v("BIN")])]),e._v(" "),n("td",[e._v("0 - Won't/Don't, 1 - Will, 2 - Do, 3 - Will/Do")]),e._v(" "),n("td",[e._v("0")]),e._v(" "),n("td",[e._v("Yes")])]),e._v(" "),n("tr",[n("td",[e._v("S19")]),e._v(" "),n("td",[e._v("Negotiate Telnet "),n("strong",[e._v("NAWS")])]),e._v(" "),n("td",[e._v("0 - Won't/Don't, 1 - Will, 2 - Do, 3 - Will/Do")]),e._v(" "),n("td",[e._v("3")]),e._v(" "),n("td",[e._v("Yes")])]),e._v(" "),n("tr",[n("td",[e._v("S20")]),e._v(" "),n("td",[e._v("NAWS Negotiate "),n("strong",[e._v("Columns")])]),e._v(" "),n("td",[e._v("0-255 columns")]),e._v(" "),n("td",[e._v("80")]),e._v(" "),n("td",[e._v("Yes")])]),e._v(" "),n("tr",[n("td",[e._v("S21")]),e._v(" "),n("td",[e._v("NAWS Negotiate "),n("strong",[e._v("Rows")])]),e._v(" "),n("td",[e._v("0-255 rows")]),e._v(" "),n("td",[e._v("24")]),e._v(" "),n("td",[e._v("Yes")])]),e._v(" "),n("tr",[n("td",[e._v("S22")]),e._v(" "),n("td",[e._v("Negotiate Telnet "),n("strong",[e._v("TERMINAL-TYPE")])]),e._v(" "),n("td",[e._v("0 - Won't/Don't, 1 - Will, 2 - Do, 3 - Will/Do")]),e._v(" "),n("td",[e._v("3")]),e._v(" "),n("td",[e._v("Yes")])]),e._v(" "),n("tr",[n("td",[e._v("S39")]),e._v(" "),n("td",[e._v("CTS/RTS Flow Control")]),e._v(" "),n("td",[e._v("0 - disabled, 1 - enabled, set by "),n("code",[e._v("AT&K")]),e._v(" command")]),e._v(" "),n("td",[e._v("0")]),e._v(" "),n("td",[e._v("Yes")])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"wi-fi-connection-results"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#wi-fi-connection-results"}},[this._v("#")]),this._v(" Wi-Fi Connection Results")])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"warning custom-block"},[n("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),n("p",[e._v("Wi-Fi "),n("strong",[e._v("cannot")]),e._v(" be started when the terminal is in "),n("strong",[e._v("30 line")]),e._v(" mode due to the limited amount of internal memory in the EPS32.")]),e._v(" "),n("p",[e._v("If you attempt to (re)connect the Wi-Fi when in this mode you will receive the response: "),n("code",[e._v("WIFI ERROR")])]),e._v(" "),n("p",[e._v("Return the terminal to "),n("strong",[e._v("24 or 25 line")]),e._v(" mode and you will be able to (re)connect the Wi-Fi.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"dial-responses"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dial-responses"}},[this._v("#")]),this._v(" Dial Responses")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The following table details the responses from the modem for the "),t("strong",[this._v("Dial")]),this._v(" command "),t("code",[this._v("ATDhostname:port")])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("table",[n("thead",[n("tr",[n("th",[e._v("Response")]),e._v(" "),n("th",[e._v("Reason for Response")])])]),e._v(" "),n("tbody",[n("tr",[n("td",[n("code",[e._v("NO DIALTONE")])]),e._v(" "),n("td",[e._v("when no Wi-Fi connection has been established with an AP")])]),e._v(" "),n("tr",[n("td",[n("code",[e._v("ALREADY IN CALL")])]),e._v(" "),n("td",[e._v("when a connection is already established ('Dialed' or 'Answered') with another host")])]),e._v(" "),n("tr",[n("td",[n("code",[e._v("ERROR")])]),e._v(" "),n("td",[e._v("when no "),n("em",[e._v("hostname")]),e._v(" is provided")])]),e._v(" "),n("tr",[n("td",[n("code",[e._v("NO ANSWER")])]),e._v(" "),n("td",[e._v("when a TCP/IP socket "),n("strong",[e._v("can't be opened")]),e._v(" with the "),n("em",[e._v("hostname:port")])])]),e._v(" "),n("tr",[n("td",[n("code",[e._v("CONNECT")])]),e._v(" "),n("td",[e._v("when a TCP/IP socket "),n("strong",[e._v("is opened")]),e._v(" with the "),n("em",[e._v("hostname:port")])])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"query-wi-fi-responses"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#query-wi-fi-responses"}},[this._v("#")]),this._v(" Query Wi-Fi Responses")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The following table details the responses from the modem for the "),t("strong",[this._v("Query Wi-Fi Access Point (AP) connection status")]),this._v(" command "),t("code",[this._v("AT+W?")])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("table",[n("thead",[n("tr",[n("th",[e._v("Response")]),e._v(" "),n("th",[e._v("Description")])])]),e._v(" "),n("tbody",[n("tr",[n("td",[n("code",[e._v("WIFI NOT STARTED")])]),e._v(" "),n("td",[e._v("when no Wi-Fi connection has been attempted since power-on or hardware reset")])]),e._v(" "),n("tr",[n("td",[n("code",[e._v("WIFI IDLE")])]),e._v(" "),n("td",[e._v("if Wi-Fi status is queried during a connection attempt")])]),e._v(" "),n("tr",[n("td",[n("code",[e._v("WIFI NO SSID")])]),e._v(" "),n("td",[e._v("when no AP with the given SSID/password is found following the "),n("code",[e._v("AT+W+")]),e._v(" or "),n("code",[e._v("AT+W=")]),e._v(" commands")])]),e._v(" "),n("tr",[n("td",[n("code",[e._v("WIFI CONNECTED")])]),e._v(" "),n("td",[e._v("following a "),n("strong",[e._v("successful")]),e._v(" connection to an AP with the "),n("code",[e._v("AT+W+")]),e._v(" or "),n("code",[e._v("AT+W=")]),e._v(" commands")])]),e._v(" "),n("tr",[n("td",[n("code",[e._v("WIFI CONNECT FAILED")])]),e._v(" "),n("td",[e._v("tba")])]),e._v(" "),n("tr",[n("td",[n("code",[e._v("WIFI CONNECTION LOST")])]),e._v(" "),n("td",[e._v("following a lost connection with the AP")])]),e._v(" "),n("tr",[n("td",[n("code",[e._v("WIFI DISCONNECTED")])]),e._v(" "),n("td",[e._v("following an "),n("strong",[e._v("unsuccessful")]),e._v(" connection attempt, or a "),n("strong",[e._v("successful")]),e._v(" disconnection with the "),n("code",[e._v("AT+W-")]),e._v(" command")])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"telnet-protocol"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#telnet-protocol"}},[this._v("#")]),this._v(" Telnet Protocol")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The Telnet daemon "),t("code",[this._v("telnetd")]),this._v(" I have on MacOS won't accept a connection if Telnet is not negotiated.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("When Telnet is "),t("strong",[this._v("not enabled")]),this._v(", TCP/IP socket connections are 8-bit clean. With Telnet "),t("strong",[this._v("enabled")]),this._v(" only one value, "),t("code",[this._v("0xFF")]),this._v(" known as the IAC byte (Interpret As Command) is overloaded to indicate that the next byte is a Telnet command. Telnet must negotiate binary mode (BIN) to transmit binary files.")])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"tip custom-block"},[n("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),n("p",[e._v("If connecting to a remote "),n("strong",[e._v("c-Kermit server")]),e._v(" ie. under c-Kermit on a remote host enter the command "),n("code",[e._v("set host /server * 8080")])]),e._v(" "),n("p",[n("strong",[e._v("DO NOT")]),e._v(" enable the Telnet protocol as you are not acting as an NVT in this use-case and c-Kermit doesn't expect Telnet.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"telnet-options-implemented"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#telnet-options-implemented"}},[this._v("#")]),this._v(" Telnet Options Implemented")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The modem implements the following minimum set of Telnet "),t("em",[this._v("options")]),this._v(":")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Each Telnet "),t("em",[this._v("Option")]),this._v(" is negotiated in via a request/response exchange described as Do/Don't (request) and Will/Won't (response). Trying to understand how these work for each "),t("em",[this._v("Option")]),this._v(" usually requires reading the RFC (linked in the list above) and extreme patience and experimentation.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Usually you either want an "),t("em",[this._v("Option")]),this._v(" completely "),t("strong",[this._v("On")]),this._v(" (Do/Will) or "),t("strong",[this._v("Off")]),this._v(" (Don't/Won't).")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Setting the supported "),t("em",[this._v("Options")]),this._v(" and their default values are defined via specific "),t("a",{attrs:{href:"#defined-s-registers"}},[this._v("'S' Registers detailed above")]),this._v(".")])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("table",[n("thead",[n("tr",[n("th",[e._v("Option")]),e._v(" "),n("th",[e._v("Default")]),e._v(" "),n("th",[e._v("Description")])])]),e._v(" "),n("tbody",[n("tr",[n("td",[e._v("SGA")]),e._v(" "),n("td",[e._v("Do/Will")]),e._v(" "),n("td",[e._v("SGA is required for the NVT to work character by character and not in linemode")])]),e._v(" "),n("tr",[n("td",[e._v("ECHO")]),e._v(" "),n("td",[e._v("Do/Will")]),e._v(" "),n("td",[e._v("tba")])]),e._v(" "),n("tr",[n("td",[e._v("BIN")]),e._v(" "),n("td",[e._v("Don't/Won't")]),e._v(" "),n("td",[e._v("To operate as an NVT, binary mode is not required. File transfer protocols like KERMIT and XMODEM do their own binary encoding")])]),e._v(" "),n("tr",[n("td",[e._v("NAWS")]),e._v(" "),n("td",[e._v("Do/Will")]),e._v(" "),n("td",[e._v("The remote host can learn your terminal windows size in characters, the default is "),n("code",[e._v("80 x 24")]),e._v(" set in "),n("code",[e._v("S20")]),e._v(" and "),n("code",[e._v("S21")]),e._v(" respectively")])]),e._v(" "),n("tr",[n("td",[e._v("TERMINAL-TYPE")]),e._v(" "),n("td",[e._v("Do/Will")]),e._v(" "),n("td",[e._v("The remote host can learn your terminal type, the default is "),n("code",[e._v("vt100")])])])])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"tip custom-block"},[n("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),n("p",[e._v("TERMINAL-TYPEs must be known by the remote system to be recognised.")]),e._v(" "),n("p",[e._v("When connecting to "),n("code",[e._v("telnetd")]),e._v(" on MacOS I use "),n("code",[e._v("vt100+")]),e._v(" from the "),n("code",[e._v("terminfo")]),e._v(" database which provides support for color over and above the standard "),n("code",[e._v("vt100")]),e._v(" terminal type, making text applications like "),n("code",[e._v("htop")]),e._v(" work as expected and in color.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"enabling-telnet-protocol"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enabling-telnet-protocol"}},[this._v("#")]),this._v(" Enabling Telnet Protocol")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Telnet protocol is "),t("strong",[this._v("not enabled")]),this._v(" by default.")])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("ul",[n("li",[e._v("To "),n("strong",[e._v("enable")]),e._v(" the Telnet protocol you must manually set 'S' Register "),n("code",[e._v("S15")]),e._v(" to "),n("code",[e._v("1")]),e._v(" with "),n("code",[e._v("ATS15=1")])]),e._v(" "),n("li",[e._v("To "),n("strong",[e._v("disable")]),e._v(" the Telnet protocol you must manually set 'S' Register "),n("code",[e._v("S15")]),e._v(" to "),n("code",[e._v("0")]),e._v(" with "),n("code",[e._v("ATS15=0")])])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("p",[e._v("The Telnet protocol is applied to "),n("strong",[e._v("both")]),e._v(" "),n("em",[e._v("outgoing connections")]),e._v(" 'Dialed' with "),n("code",[e._v("ATD")]),e._v(" and "),n("em",[e._v("incoming connections")]),e._v(" 'Answered' with "),n("code",[e._v("ATA")]),e._v(" or "),n("strong",[e._v("Auto-answer")]),e._v(".")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"telnet-protocol-framework"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#telnet-protocol-framework"}},[this._v("#")]),this._v(" Telnet Protocol Framework")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The library provides a framework for implementing any Telnet "),t("em",[this._v("Option")]),this._v(". So if there are "),t("em",[this._v("Options")]),this._v(" that you feel are important beyond the minimum set already implemented let me know, providing a "),t("em",[this._v("compelling")]),this._v(" use-case, and I will consider adding them.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"answer-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#answer-mode"}},[this._v("#")]),this._v(" Answer Mode")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Listening for incoming TCP/IP socket connections is "),t("strong",[this._v("not enabled")]),this._v(" by default.")])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"tip custom-block"},[n("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),n("p",[e._v("Changes to the "),n("code",[e._v("AT&A")]),e._v(" command include: See "),n("a",{attrs:{href:"#at-command-summary-table"}},[e._v("'AT' Command Summary Table")]),e._v(" above.")]),e._v(" "),n("ul",[n("li",[n("code",[e._v("AT&A0")]),e._v(" is equivalent to "),n("code",[e._v("AT&A")]),e._v(" for "),n("strong",[e._v("interactive")]),e._v(" command mode use (as below)\n"),n("ul",[n("li",[e._v("Displays "),n("code",[e._v("RING")]),e._v(" & "),n("code",[e._v("CONNECTED")]),e._v(" responses (if enabled)")]),e._v(" "),n("li",[e._v("Allows the interrupt sequence "),n("code",[e._v("+++")]),e._v(" to return the Modem to command mode from data mode")])])]),e._v(" "),n("li",[n("code",[e._v("AT&A1")]),e._v(" is a new "),n("strong",[e._v("daemon")]),e._v(" mode - this mode avoids a race condition when the 'AT' Modem is used, for example, as the CP/M console device CON: and allows the Modem to be used to provide remote access to the console eg. from a telnet client\n"),n("ul",[n("li",[e._v("Suppresses 'AT' command echo and responses (sets "),n("code",[e._v("ATE0")]),e._v(" & "),n("code",[e._v("ATQ1")]),e._v(").")]),e._v(" "),n("li",[e._v("Ignores the interrupt sequence "),n("code",[e._v("+++")]),e._v(" preventing the Modem from returning to command mode from data mode")]),e._v(" "),n("li",[e._v("Typically would be executed from a modem initialisation string")])])])])])},function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("ul",[n("li",[e._v("To "),n("strong",[e._v("enable")]),e._v(" listening for incoming TCP/IP socket connections you must manually enter "),n("code",[e._v("AT&A")]),e._v(" to "),n("em",[e._v("Enable Answer Mode")]),e._v(".")]),e._v(" "),n("li",[e._v("Answer Mode will remain enabled, and can only disabled by an "),n("code",[e._v("ATZ")]),e._v(" Soft Reset, hardware reset or power-cycle.")]),e._v(" "),n("li",[e._v("Incoming TCP/IP socket connections will cause the modem to respond with "),n("code",[e._v("RING")]),e._v(", repeated every three (3) seconds.")]),e._v(" "),n("li",[e._v("As each "),n("code",[e._v("RING")]),e._v(" occurs the Ring Counter in "),n("code",[e._v("S1")]),e._v(" is incremented by one (1).")]),e._v(" "),n("li",[e._v("The user can "),n("em",[e._v("Answer")]),e._v(" the incoming call at any time with "),n("code",[e._v("ATA")]),e._v(" and the modem will accept the TCP/IP socket connection and enter "),n("strong",[e._v("Data Mode")]),e._v(".")]),e._v(" "),n("li",[e._v("If the "),n("strong",[e._v("Number of rings before Auto-Answer")]),e._v(" is set in "),n("code",[e._v("S0")]),e._v(" to a number greater than zero (0 = never) and "),n("code",[e._v("S1")]),e._v(" is greater-then-or-equal to "),n("code",[e._v("S0")]),e._v(" the modem will "),n("em",[e._v("Auto-answer")]),e._v(": accept the TCP/IP socket connection and enter "),n("strong",[e._v("Data Mode")]),e._v(".")]),e._v(" "),n("li",[e._v("If Telnet protocol is enabled by "),n("code",[e._v("ATS15=1")]),e._v(" then the Telnet Protocol will be negotiated with the remote host after the modem enters "),n("strong",[e._v("Data Mode")]),e._v(".")]),e._v(" "),n("li",[e._v("The user can "),n("em",[e._v("Hangup")]),e._v(" an incoming call by sending the "),n("em",[e._v("Escape Sequence")]),e._v(" "),n("code",[e._v("+++")]),e._v(" (with guard times) to return to "),n("strong",[e._v("Command Mode")]),e._v(" and then sending "),n("code",[e._v("ATH")]),e._v(" to "),n("em",[e._v("Hangup")]),e._v(".")]),e._v(" "),n("li",[e._v("A Hangup "),n("code",[e._v("ATH")]),e._v(" will reset the Ring Counter in "),n("code",[e._v("S1")]),e._v(" to zero (0).")])])}],s=n(0),r=Object(s.a)({},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"content"},[e._m(0),e._v(" "),e._m(1),e._v(" "),n("p",[e._v("Unlike the VT100 terminal, the modem does not try to faithfully emulate any particular original device.")]),e._v(" "),n("p",[e._v("Instead it is designed to provide an MVP (minimum viable product) providing a modified "),n("a",{attrs:{href:"https://en.wikipedia.org/wiki/Hayes_command_set",target:"_blank",rel:"noopener noreferrer"}},[e._v("Hayes 'AT'"),n("OutboundLink")],1),e._v(" "),n("strong",[e._v("compatible")]),e._v(" command set for connecting over Wi-Fi via TCP/IP sockets with an optional "),n("a",{attrs:{href:"https://en.wikipedia.org/wiki/Telnet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telnet protocol"),n("OutboundLink")],1),e._v(" layer.")]),e._v(" "),e._m(2),e._v(" "),n("p",[e._v("See "),n("router-link",{attrs:{to:"./../#hardware-configuration"}},[e._v("Hardware Configuration")]),e._v(" for details on connecting from a UART on your system to the modem.")],1),e._v(" "),e._m(3),e._v(" "),n("div",{staticClass:"tip custom-block"},[n("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),n("p",[e._v("The original 'AT' command set was strictly in upper case. This is because the bit sequence of the ASCII values for 'A' and 'T' have a specific property that enables "),n("a",{attrs:{href:"https://en.wikipedia.org/wiki/Hayes_command_set#Autobaud",target:"_blank",rel:"noopener noreferrer"}},[e._v("autobaud detection"),n("OutboundLink")],1),e._v(" of the connection to the data terminal equipment (DTE).")]),e._v(" "),e._m(4)]),e._v(" "),e._m(5),e._v(" "),e._m(6),e._v(" "),e._m(7),e._v(" "),e._m(8),e._v(" "),e._m(9),e._v(" "),e._m(10),e._v(" "),e._m(11),e._v(" "),n("p",[e._v("Each command is explained in the following table.")]),e._v(" "),e._m(12),e._v(" "),e._m(13),e._v(" "),e._m(14),e._v(" "),e._m(15),e._v(" "),n("p",[e._v("Most of them are undefined and unused. The defined registers are set with default values but some registers are ignored as their purpose is typically not useful, this is indicated in the table below. Changing the value of a register that is ignored will have no effect on the operation of the modem.")]),e._v(" "),n("p",[e._v("'S' Registers originally held only 8-bit (byte) values. In this implementation registers are 16-bit.")]),e._v(" "),e._m(16),e._v(" "),e._m(17),e._v(" "),e._m(18),e._v(" "),e._m(19),e._v(" "),e._m(20),e._v(" "),e._m(21),e._v(" "),e._m(22),e._v(" "),e._m(23),e._v(" "),e._m(24),e._v(" "),e._m(25),e._v(" "),e._m(26),e._v(" "),n("p",[e._v("The "),n("a",{attrs:{href:"https://en.wikipedia.org/wiki/Telnet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telnet protocol"),n("OutboundLink")],1),e._v(" in normally considered an optional layer when establishing TCP/IP socket connections with remote hosts to operate as a Network Virtual Terminal (NVT).")]),e._v(" "),n("p",[e._v("Some hosts will provide a more functional service if Telnet is negotiated.")]),e._v(" "),e._m(27),e._v(" "),e._m(28),e._v(" "),e._m(29),e._v(" "),e._m(30),e._v(" "),e._m(31),e._v(" "),n("ul",[n("li",[n("a",{attrs:{href:"https://tools.ietf.org/html/rfc858",target:"_blank",rel:"noopener noreferrer"}},[e._v("SGA (Suppress Go Ahead)"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://tools.ietf.org/html/rfc1073",target:"_blank",rel:"noopener noreferrer"}},[e._v("ECHO"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://tools.ietf.org/html/rfc856",target:"_blank",rel:"noopener noreferrer"}},[e._v("BIN (Binary Transmission)"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://tools.ietf.org/html/rfc1073",target:"_blank",rel:"noopener noreferrer"}},[e._v("NAWS (Negotiate About Window Size)"),n("OutboundLink")],1)]),e._v(" "),n("li",[n("a",{attrs:{href:"https://tools.ietf.org/html/rfc1091",target:"_blank",rel:"noopener noreferrer"}},[e._v("TERMINAL-TYPE"),n("OutboundLink")],1)])]),e._v(" "),e._m(32),e._v(" "),e._m(33),e._v(" "),e._m(34),e._v(" "),n("p",[e._v("In summary the defaults are:")]),e._v(" "),e._m(35),e._v(" "),e._m(36),e._v(" "),e._m(37),e._v(" "),e._m(38),e._v(" "),e._m(39),e._v(" "),e._m(40),e._v(" "),e._m(41),e._v(" "),n("p",[e._v("The Telnet protocol implementation in the modem is not fixed, but is instead based on a library "),n("a",{attrs:{href:"https://github.com/seanmiddleditch/libtelnet",target:"_blank",rel:"noopener noreferrer"}},[e._v("libtelnet"),n("OutboundLink")],1),e._v(". There is further information about Telnet and Telnet "),n("em",[e._v("Options")]),e._v(" on the GitHub repository for the library.")]),e._v(" "),e._m(42),e._v(" "),e._m(43),e._v(" "),e._m(44),e._v(" "),e._m(45),e._v(" "),e._m(46)])}),o,!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/24.56b64d35.js b/assets/js/24.56b64d35.js new file mode 100644 index 0000000..7ec6fea --- /dev/null +++ b/assets/js/24.56b64d35.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{222:function(e,t,o){e.exports=o.p+"assets/img/Modem_OTA_Status.e11f0da8.jpg"},276:function(e,t,o){"use strict";o.r(t);var r=[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{attrs:{id:"over-the-air-ota-firmware-update-guide-draft"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#over-the-air-ota-firmware-update-guide-draft"}},[this._v("#")]),this._v(" Over-the-Air (OTA) Firmware Update Guide (Draft)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The OTA Update feature of the VT132 enables you to update the firmware of your VT132 to the latest release "),t("strong",[this._v("without")]),this._v(" having to connect your VT132 to a PC via the FTDI connector or install any utilities on your PC to flash new firmware to the ESP32 module.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"tip custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),t("p",[this._v("From the modem prompt/command line you can type "),t("code",[this._v("AT$")]),this._v(" for help to be reminded of the OTA 'AT' commands.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("You can connect to the modem from your system using a terminal program such as "),t("strong",[this._v("KERMIT")]),this._v(" or "),t("strong",[this._v("QTERM")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"update-to-latest-version-from-github-repository-recommended"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-to-latest-version-from-github-repository-recommended"}},[this._v("#")]),this._v(" Update to latest version from GitHub repository (recommended)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The current firmware on GitHub is tagged as the "),t("em",[this._v("latest")]),this._v(" release, so simply use the OTA update feature as follows:")])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ul",[o("li",[o("code",[e._v("AT+W+")]),e._v(" or "),o("code",[e._v("AT+W=ssid,pwd")]),e._v(" to join your Wi-Fi network")]),e._v(" "),o("li",[o("code",[e._v("AT+U$")]),e._v(" to see what firmware version you are currently running [optional]")]),e._v(" "),o("li",[o("code",[e._v("AT+U?")]),e._v(" to query GitHub for the latest firmware image")]),e._v(" "),o("li",[e._v("should report "),o("code",[e._v("V1.2.0")]),e._v(" (or similar)\n"),o("ul",[o("li",[e._v("following the version number, a self explanatory indicator of "),o("code",[e._v("[OLDER]")]),e._v(", "),o("code",[e._v("[SAME]")]),e._v(" or "),o("code",[e._v("[NEWER]")]),e._v(" will be shown")])])]),e._v(" "),o("li",[o("code",[e._v("AT+U^")]),e._v(" or "),o("code",[e._v("AT+U!")]),e._v(" to upgrade or "),o("em",[e._v("force")]),e._v(" the upgrade, depending on your current version\n"),o("ul",[o("li",[o("code",[e._v("AT+U^")]),e._v(" will only work if the queried firmware image is "),o("code",[e._v("[NEWER]")])]),e._v(" "),o("li",[e._v("during the upgrade process a series of full-stops "),o("code",[e._v("...")]),e._v(" will be output to indicate progress with the upgrade")]),e._v(" "),o("li",[e._v("when the upgrade completes downloading the new firmware image into flash memory the modem will respond with an "),o("code",[e._v("OK")])])])]),e._v(" "),o("li",[o("code",[e._v("AT+U$")]),e._v(" to see what firmware version you will boot next [optional]")]),e._v(" "),o("li",[e._v("H/W reset after success with the download & flash\n"),o("ul",[o("li",[e._v("the new firmware image will only be run following a H/W reset or reboot")])])])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",{staticClass:"warning custom-block"},[o("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),o("p",[e._v("Once you have entered the "),o("strong",[e._v("Query OTA Update")]),e._v(" command "),o("code",[e._v("AT+U?")]),e._v(" the VT132 should not be expected to operate "),o("em",[e._v('"normally"')]),e._v(" until you perform a H/W reset or reboot of the VT132.")]),e._v(" "),o("p",[e._v("This is because the "),o("strong",[e._v("Query OTA Update")]),e._v(" command opens and creates a number of files and large data structures in memory that may conflict with normal operation and these can only be closed and released by a H/W reset or reboot.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"tip custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),t("p",[this._v("You can safely "),t("em",[this._v("force")]),this._v(" upgrade "),t("code",[this._v("AT+U!")]),this._v(' the firmware to the same version you are currently running if you simply want to "practice" the upgrade process.')])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("p",[e._v("Example output from the "),o("strong",[e._v("Show OTA Partition Status")]),e._v(" "),o("code",[e._v("AT+U$")]),e._v(" and "),o("strong",[e._v("Query OTA Update")]),e._v(" "),o("code",[e._v("AT+U?")]),e._v(" commands is show here:")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:o(222),alt:"OTA AT Commands"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"update-to-a-version-from-a-local-web-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-to-a-version-from-a-local-web-server"}},[this._v("#")]),this._v(" Update to a version from a local web server")])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"tip custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),t("p",[this._v("The standard firmware image file is named "),t("code",[this._v("VT132.bin")])])])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("p",[e._v("Eg. With the firmware image file "),o("code",[e._v("VT132.bin")]),e._v(' staged on the root of the "local" web server running on '),o("strong",[e._v("port")]),e._v(" "),o("code",[e._v("5500")]),e._v(" with "),o("strong",[e._v("DNS name")]),e._v(" "),o("code",[e._v("mylocalserver")]),e._v(" and "),o("strong",[e._v("IPv4 address")]),e._v(" of "),o("code",[e._v("192.168.1.20")]),e._v(" proceed as follows:")])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ul",[o("li",[o("code",[e._v("AT+W+")]),e._v(" or "),o("code",[e._v("AT+W=ssid,pwd")]),e._v(" to join your Wi-Fi network")]),e._v(" "),o("li",[o("code",[e._v("AT+U$")]),e._v(" to see what firmware version you are currently running [optional]")]),e._v(" "),o("li",[o("code",[e._v("AT+U=url_for_local_file")]),e._v(" to set the URL to the file on the local web server, eg.:\n"),o("ul",[o("li",[o("code",[e._v("AT+U=http://mylocalserver:5500/VT132.bin")]),e._v(" if using the DNS name, or")]),e._v(" "),o("li",[o("code",[e._v("AT+U=http://192.168.1.20:5500/VT132.bin")]),e._v(" if using the IPV4 address")])])]),e._v(" "),o("li",[o("code",[e._v("AT+U?")]),e._v(" to query the local web server for the firmware image specified")]),e._v(" "),o("li",[e._v("should report "),o("code",[e._v("V1.2.0")]),e._v(" (or similar)\n"),o("ul",[o("li",[e._v("following the version number, a self explanatory indicator of "),o("code",[e._v("[OLDER]")]),e._v(", "),o("code",[e._v("[SAME]")]),e._v(" or "),o("code",[e._v("[NEWER]")]),e._v(" will be shown")])])]),e._v(" "),o("li",[o("code",[e._v("AT+U^")]),e._v(" or "),o("code",[e._v("AT+U!")]),e._v(" to upgrade or "),o("em",[e._v("force")]),e._v(" the upgrade, depending on your current version\n"),o("ul",[o("li",[o("code",[e._v("AT+U^")]),e._v(" will only work if the queried firmware image is "),o("code",[e._v("[NEWER]")])]),e._v(" "),o("li",[e._v("during the upgrade process a series of full-stops "),o("code",[e._v("...")]),e._v(" will be output to indicate progress with the upgrade")]),e._v(" "),o("li",[e._v("when the upgrade completes downloading the new firmware image into flash memory the modem will respond with an "),o("code",[e._v("OK")])])])]),e._v(" "),o("li",[o("code",[e._v("AT+U$")]),e._v(" to see what firmware version you will boot next [optional]")]),e._v(" "),o("li",[e._v("H/W reset after success with the download & flash\n"),o("ul",[o("li",[e._v("the new firmware image will only be run following a H/W reset or reboot")])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"update-to-a-version-using-the-esp-idf-epstool-py-utility"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-to-a-version-using-the-esp-idf-epstool-py-utility"}},[this._v("#")]),this._v(" Update to a version using the ESP-IDF "),t("code",[this._v("epstool.py")]),this._v(" utility")])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ul",[o("li",[e._v("download the "),o("code",[e._v("FIRMWARE.zip")]),e._v(" file")]),e._v(" "),o("li",[e._v("unzip the file")]),e._v(" "),o("li",[e._v("read the "),o("code",[e._v("FLASHING.md")]),e._v(" file for instructions")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"for-the-security-conscious"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#for-the-security-conscious"}},[this._v("#")]),this._v(" For the security conscious")])},function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",{staticClass:"danger custom-block"},[o("p",{staticClass:"custom-block-title"},[e._v("For the security conscious")]),e._v(" "),o("p",[e._v("OTA Updates from GitHub are performed using the "),o("strong",[e._v("https")]),e._v(" protocol.")]),e._v(" "),o("p",[e._v("Security certificates (Root CA) for "),o("strong",[e._v("GitHub")]),e._v(" and "),o("strong",[e._v("Amazon S3")]),e._v(" (where GitHub stores release binary files) are embedded in the firmware.")]),e._v(" "),o("p",[o("strong",[e._v("https")]),e._v(" requests to servers that use any other "),o("em",[e._v("Root CA")]),e._v(" certificate will fail to authenticate.")]),e._v(" "),o("p",[e._v("Also, the VT132 makes this request as an "),o("strong",[e._v("https client")]),e._v(" and "),o("strong",[e._v("does not")]),e._v(" implement an http or https server.")]),e._v(" "),o("p",[e._v("Note also:")]),e._v(" "),o("ul",[o("li",[e._v("A Wi-Fi connection to an Access Point is never established by default, but must be explicitly (re)connected using the "),o("code",[e._v("AT+W=")]),e._v(" or "),o("code",[e._v("AT+W+")]),e._v(" commands")]),e._v(" "),o("li",[e._v("The only time the VT132 makes outgoing IP socket requests is when:\n"),o("ul",[o("li",[e._v("you dial a host with the "),o("code",[e._v("ATD")]),e._v(" dial command")]),e._v(" "),o("li",[e._v("you initiate an OTA update transaction with the "),o("code",[e._v("AT+U?")]),e._v(" Query OTA Update command and the subsequent "),o("code",[e._v("AT+U^")]),e._v(" or "),o("code",[e._v("AT+U!")]),e._v(" upgrade or "),o("em",[e._v("force")]),e._v(" upgrade commands")])])]),e._v(" "),o("li",[e._v('The only time the VT132 accepts incoming IP socket requests is when the modem is enabled for "Answer" mode with '),o("code",[e._v("AT&A")]),e._v(" (not be default).")])])])}],i=o(0),s=Object(i.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",{staticClass:"content"},[e._m(0),e._v(" "),e._m(1),e._v(" "),o("p",[e._v("OTA updates are performed via the 'AT' (Hayes) Modem interface using a series of 'AT' command extensions.")]),e._v(" "),e._m(2),e._v(" "),o("div",{staticClass:"tip custom-block"},[o("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),e._m(3),e._v(" "),o("p",[e._v("OR")]),e._v(" "),o("p",[e._v("You can enable the modem locally and connect directly from the VT100 to the modem in "),o("strong",[e._v("LOCAL")]),e._v(" mode. See the "),o("router-link",{attrs:{to:"./../vt100/operator/quick-menu/"}},[e._v("Quick Menu Guide")]),e._v(" for details.")],1)]),e._v(" "),e._m(4),e._v(" "),e._m(5),e._v(" "),o("p",[e._v("From the modem prompt/command line:")]),e._v(" "),e._m(6),e._v(" "),e._m(7),e._v(" "),e._m(8),e._v(" "),e._m(9),e._v(" "),e._m(10),e._v(" "),o("p",[e._v("A full description of the OTA Update commands and their output will be added here later: TBA.")]),e._v(" "),e._m(11),e._v(" "),o("p",[e._v("If you have a firmware image file or if you wish to install a firmware image "),o("strong",[e._v("other")]),e._v(" than the one tagged "),o("em",[e._v("latest")]),e._v(" on the "),o("a",{attrs:{href:"https://github.com/thehighnibble/vt132/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub firmware repository"),o("OutboundLink")],1),e._v(" you can stage that file on a local web server (ie. on the same network as the VT132 connects over Wi-Fi) and use a process similar to the one above, but with one extra command to provide the local address of the firmware image.")]),e._v(" "),e._m(12),e._v(" "),e._m(13),e._v(" "),o("p",[e._v("From the modem prompt/command line:")]),e._v(" "),e._m(14),e._v(" "),e._m(15),e._v(" "),o("p",[e._v("Instructions for flashing the firmware using the "),o("strong",[e._v("ESP-IDF")]),e._v(" "),o("code",[e._v("esptool.py")]),e._v(" utility are included with the firmware downloadable from the "),o("a",{attrs:{href:"https://github.com/thehighnibble/vt132/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub firmware repository"),o("OutboundLink")],1)]),e._v(" "),o("p",[e._v("If using this process to upgrade:")]),e._v(" "),e._m(16),e._v(" "),e._m(17),e._v(" "),e._m(18)])}),r,!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/25.9f6ad8a0.js b/assets/js/25.9f6ad8a0.js new file mode 100644 index 0000000..f284cb6 --- /dev/null +++ b/assets/js/25.9f6ad8a0.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{253:function(t,a,s){"use strict";s.r(a);var i=s(0),e=Object(i.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),[function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"content"},[s("div",{staticClass:"hero"},[s("p",{staticClass:"action"},[s("a",{staticClass:"nav-link action-button action-button3",attrs:{href:"/cromemcoZ1/"}},[t._v("Cromemco Z-1 Replica details →")])])]),t._v(" "),s("div",{staticClass:"hero"},[s("p",{staticClass:"action"},[s("a",{staticClass:"nav-link action-button action-button2",attrs:{href:"/vt132/"}},[t._v("VT132 details →")])])]),t._v(" "),s("div",{staticClass:"hero"},[s("p",{staticClass:"action"},[s("a",{staticClass:"nav-link action-button action-button4",attrs:{href:"/s132/"}},[t._v("S-132 details →")])])]),t._v(" "),s("br"),t._v(" "),s("br"),t._v(" "),s("div",{staticClass:"socials"},[s("a",{attrs:{href:"https://twitter.com/@TheHighNibble",target:"_blank",rel:"noopener noreferrer"}},[s("img",{staticClass:"social",attrs:{src:"/img/twitter.png"}})]),t._v(" "),s("a",{attrs:{href:"https://www.youtube.com/thehighnibble",target:"_blank",rel:"noopener noreferrer"}},[s("img",{staticClass:"social",attrs:{src:"/img/youtube.png"}})])]),t._v(" "),s("br")])}],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/26.6540c28f.js b/assets/js/26.6540c28f.js new file mode 100644 index 0000000..a0c73c0 --- /dev/null +++ b/assets/js/26.6540c28f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{257:function(t,e,s){"use strict";s.r(e);var i=s(0),o=Object(i.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("There is a "),s("a",{attrs:{href:"https://www.youtube.com/playlist?list=PLADkYVZqAxdOlpkLc3HC-EbbttXevZ3-B",target:"_blank",rel:"noopener noreferrer"}},[t._v("play list of videos on YouTube"),s("OutboundLink")],1),t._v(" that demonstrate this step-by-step assembly sequence and includes additional tips for successful assembly.")])]),t._v(" "),t._m(10),t._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("Please unpack the entire kit and perform a stock take of what you have received against the "),s("router-link",{attrs:{to:"./../bom/"}},[t._v("Bill-of-Materials")]),t._v(".")],1)]),t._v(" "),s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("If you believe you are missing any components when you compare the kit contents with the "),s("router-link",{attrs:{to:"./../bom/"}},[t._v("Bill-of-Materials")]),t._v(" please contact me directly by email to "),s("a",{attrs:{href:"mailto:info@thehighnibble.com"}},[t._v("info@thehighnibble.com")]),t._v(".")],1),t._v(" "),s("p",[t._v("Please respect that this kit is a hobby project made by an individual maker and not a mass produced product from a manufacturer. While every care was taken to pack each kit correctly, mistakes may have occurred.")])]),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),s("table",[t._m(15),t._v(" "),s("tbody",[t._m(16),t._v(" "),t._m(17),t._v(" "),t._m(18),t._v(" "),t._m(19),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),t._m(22),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("8.")]),t._v(" "),s("td",[t._v("ESP32-PICO-KIT, microSD Memory Card")]),t._v(" "),t._m(23),t._v(" "),s("td",[t._v("Plug the ESP32-PICO-KIT into the female connectors on the "),s("strong",[t._v("back")]),t._v(" of the PCB. "),s("em",[t._v("Note: The USB connecter should be towards the near edge of the PCB and the Wi-Fi antenna towards the RS232 connector mounting holes.")]),t._v(" Insert the microSD card. Connect the ESP32-PICO-KIT to a PC with a suitable USB cable. Run a terminal emulator (e.g. PuTTY on Windows, or iTerm2, Serial on Mac) at 115200 baud 8N1 connected to the TTY/COM port that the ESP32-PICO-KIT presents and observe the boot logs. Errors with either the PSRAM or the microSD card will indicate soldering mistakes (see the "),s("router-link",{attrs:{to:"./../troubleshooting/#during-assembly"}},[t._v("During Assembly")]),t._v(" section in the Troubleshooting guide for details)")],1)])])]),t._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("If you do not see a TTY/COM port on your PC presented by the ESP32-PICO-KIT, you may need to install a driver for the "),s("em",[t._v("Silicon Labs CP210x USB to UART bridge")]),t._v(" used on the ESP32-PICO-KIT. See "),s("router-link",{attrs:{to:"./../configure/#serial-communications-rs232-usb"}},[t._v("Serial Communications (RS232, USB)")]),t._v(" in the Configuration guide for details.")],1)]),t._v(" "),t._m(24),t._v(" "),t._m(25),t._v(" "),t._m(26),t._v(" "),t._m(27),t._v(" "),t._m(28),t._v(" "),t._m(29),t._v(" "),t._m(30),t._v(" "),t._m(31),t._v(" "),t._m(32),t._v(" "),t._m(33),t._v(" "),t._m(34),t._v(" "),t._m(35),t._v(" "),t._m(36),t._v(" "),t._m(37),t._v(" "),t._m(38),t._v(" "),t._m(39),t._v(" "),t._m(40),t._v(" "),t._m(41),t._v(" "),t._m(42),t._v(" "),t._m(43),t._v(" "),t._m(44),t._v(" "),t._m(45),t._v(" "),t._m(46),t._v(" "),t._m(47),t._v(" "),t._m(48),t._v(" "),t._m(49),t._v(" "),t._m(50),t._v(" "),t._m(51),t._v(" "),t._m(52),t._v(" "),t._m(53),t._v(" "),t._m(54),t._v(" "),t._m(55),t._v(" "),t._m(56),t._v(" "),t._m(57),t._v(" "),t._m(58),t._v(" "),t._m(59),t._v(" "),t._m(60),t._v(" "),t._m(61),t._v(" "),t._m(62),t._v(" "),t._m(63),t._v(" "),t._m(64),t._v(" "),t._m(65),t._v(" "),t._m(66),t._v(" "),t._m(67),t._v(" "),t._m(68),t._v(" "),t._m(69),t._v(" "),t._m(70),t._v(" "),t._m(71),t._v(" "),t._m(72),t._v(" "),t._m(73),t._v(" "),t._m(74),t._v(" "),t._m(75),t._v(" "),t._m(76),t._v(" "),s("table",[t._m(77),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("47a.")]),t._v(" "),s("td",[t._v("2mm White acrylic back cover corner reinforcer (x3+1) (top edge crucifix slots)")]),t._v(" "),s("td",[t._v("3mm Clear acrylic back cover")]),t._v(" "),s("td",[t._v("See this "),s("a",{attrs:{href:"https://groups.google.com/g/imsai8080esp/c/9mQPFmFZeEU/m/rFo8j5coAwAJ",target:"_blank",rel:"noopener noreferrer"}},[t._v("forum post"),s("OutboundLink")],1),t._v(" for details.")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("47b.")]),t._v(" "),s("td",[t._v("2mm White acrylic back cover corner reinforcer (x4) (bottom side edge crucifix slots)")]),t._v(" "),s("td",[t._v("3mm Clear acrylic back cover")]),t._v(" "),s("td",[t._v("See this "),s("a",{attrs:{href:"https://groups.google.com/g/imsai8080esp/c/9mQPFmFZeEU/m/rFo8j5coAwAJ",target:"_blank",rel:"noopener noreferrer"}},[t._v("forum post"),s("OutboundLink")],1),t._v(" for details.")])]),t._v(" "),t._m(78),t._v(" "),t._m(79)])]),t._v(" "),t._m(80),t._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v('Once that last "cup-of-tea" has had the desired calming effect...')]),t._v(" "),s("p",[t._v("The most appropriate way to celebrate is to toggle in and run your first program.")]),t._v(" "),s("ol",[t._m(81),t._v(" "),t._m(82),t._v(" "),s("li",[t._v("Go and download/open your copy of the "),s("a",{attrs:{href:"http://bit.ly/2UoKnSR",target:"_blank",rel:"noopener noreferrer"}},[t._v("IMSAI 8080 Microcomputer System User Manual"),s("OutboundLink")],1),t._v(" (also included in the manual folder on the microSD card)")]),t._v(" "),t._m(83)]),t._v(" "),s("p",[t._v("Enjoy!")])]),t._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("To do anything more than toggle programs into a machine with no stored programs in ROM, you will need to understand how to "),s("router-link",{attrs:{to:"./../configure/"}},[t._v("Configure your IMSAI 8080esp")]),t._v(" to load ROM images on startup, connect to Wi-Fi to access the Desktop UI, etc...")],1)])])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"step-by-step-assembly-guide-draft"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-by-step-assembly-guide-draft"}},[this._v("#")]),this._v(" Step-by-step Assembly Guide (Draft)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"notices"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#notices"}},[this._v("#")]),this._v(" Notices")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[e("strong",[this._v("Please read all the following notices and instructions before assembling the IMSAI 8080esp replica kit.")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("This kit contains cut acrylic.\nCut acrylic can have sharp edges that can in turn cut. As a precaution, wear cotton gloves to protect your hands while handling the cut acrylic.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"danger custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("CAUTION")]),this._v(" "),e("p",[this._v("This kit contains many small parts that may be a choking hazard and is not suitable for children. Keep the contents of this kit away from children to avoid choking.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("NOTE")]),this._v(" "),e("p",[this._v("This kit is for hobby and educational interest only. The simulated replica computer you will build should not be used for any other purpose and cannot be expected to work reliably beyond a demonstration of the simulated computer.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Keep the box the IMSAI 8080esp replica kit shipped in. This custom made box was designed to both ship the unassembled kit and also to house the assembled replica. It is the best box you can use if you need to store or transport your finished IMSAI 8080esp.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Keep one of the full sheets of cardboard from above or below the components. This will serve as a tool to help with the assembly of the kit, especially for retaining the M4 bolts in the correct position while assembling all the layers of acrylic and the PCB together. It maybe useful to you in future if you ever need to disassemble and reassemble the IMSAI 8080esp.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("Notes on the PCB")]),t._v(" "),s("ul",[s("li",[t._v("There is no resistor R15, it was removed from the design long ago and the resistors were never renumbered")]),t._v(" "),s("li",[t._v("There are 2 silk screen errors on the PCB (v3.4.1, fixed on v3.4.2):\n"),s("ol",[s("li",[t._v("the LED LA14 is incorrectly labeled as LS14")]),t._v(" "),s("li",[t._v("the LED LD0 is labeled on the left of the LED and should be labeled above as per LD1-LD7")])])]),t._v(" "),s("li",[t._v("There is a 5x2 group of through-holes marked "),s("strong",[t._v("Spare")]),t._v(" that nothing gets soldered into")]),t._v(" "),s("li",[t._v("There are two groups of 8x1 through-holes that are unmarked (one above LRN1 and one below RN1) that nothing gets soldered into")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("This step-by-step assembly guide refers to the "),s("strong",[t._v("front")]),t._v(" and "),s("strong",[t._v("back")]),t._v(" of the PCB as follows:")]),t._v(" "),s("ul",[s("li",[t._v("the "),s("strong",[t._v("front")]),t._v(" of the PCB has the silkscreen for the LEDs and the toggle switches")]),t._v(" "),s("li",[t._v("the "),s("strong",[t._v("back")]),t._v(" of the PCB has the silkscreen of the IMSAI 8080 Microcomputer System decal and The High Nibble logo")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"unpacking-and-checking-against-the-bom"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#unpacking-and-checking-against-the-bom"}},[this._v("#")]),this._v(" Unpacking and checking against the BOM")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"danger custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("DAMAGE")]),this._v(" "),e("p",[this._v("If your kit arrived in a damaged state, or if upon opening the kit you find any of the contents to be damaged, please take photographs of the damage and include them in your email.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("I will happily work with you directly, via email, to resolve the issues with your incomplete or damaged kit.\nThis may require mailing replacement parts to you and that will take time, so please have patience.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"pcb-soldering"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pcb-soldering"}},[this._v("#")]),this._v(" PCB & Soldering")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"esp32-microcontroller-psram-micro-sd-card-socket"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#esp32-microcontroller-psram-micro-sd-card-socket"}},[this._v("#")]),this._v(" ESP32 Microcontroller, PSRAM & micro SD Card Socket")])},function(){var t=this.$createElement,e=this._self._c||t;return e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"right"}},[this._v("Step")]),this._v(" "),e("th",[this._v("Parts")]),this._v(" "),e("th",[this._v("Location")]),this._v(" "),e("th",[this._v("Notes")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",{staticStyle:{"text-align":"right"}},[this._v("1.")]),this._v(" "),e("td",[this._v("Header 20x1 Male")]),this._v(" "),e("td",[this._v("ESP32-PICO-KIT board")]),this._v(" "),e("td",[this._v("Before soldering anything to the main circuit board, it's first necessary to solder some pins to the ESP32-PICO-KIT board. Cut 2 sets of 3 pins from the 20x1 Male Header strip. Solder these into the unpopulated through-holes on the ESP32-PICO-KIT board. Upon completion there should be 20 pins along each edge of the underside of the ESP32-PICO-KIT board.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("2.")]),t._v(" "),s("td",[t._v("PSRAM (SMD)")]),t._v(" "),s("td",[s("code",[t._v("U13")]),t._v(" front")]),t._v(" "),s("td",[s("em",[t._v("Note: Pin 1 is indicated on the PCB by a white dot and on the component by a dimple in the plastic case")]),t._v(". When done, perform a continuity test with a multimeter from each pin of the SOP-8 package to a connected pad on the PCB (see video, details to follow)")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("3.")]),t._v(" "),s("td",[t._v("microSD Card Socket (SMD)")]),t._v(" "),s("td",[s("code",[t._v("uSD Card")]),t._v(" front")]),t._v(" "),s("td",[t._v("The microSD Card Socket is also soldered to the "),s("strong",[t._v("front")]),t._v(" of the circuit board. Align the two locating pins on the microSD Card Socket with the two holes in the PCB. Solder the 4 large ground pads of the lid first ensuring the 9 smaller leads are well aligned, then solder the 9 smaller leads.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("4.")]),t._v(" "),s("td",[t._v("Resistor 10K Ohm")]),t._v(" "),s("td",[s("code",[t._v("R14")]),t._v(" front")]),t._v(" "),s("td",[t._v("There are 15 10K resistors in this kit (including 1 spare), and they are colour-coded Brown, Black, Orange, Gold. The resistors are tight fitting, so bend the leads close to the their body before inserting into location. Resistors are not polarized, and can be soldered in either orientation.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("5.")]),t._v(" "),s("td",[t._v("Capacitor 100nF")]),t._v(" "),s("td",[s("code",[t._v("C1")]),t._v(" front")]),t._v(" "),s("td",[t._v("There is only one type of capacitor in this kit, and they can be soldered in either orientation.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("6.")]),t._v(" "),s("td",[t._v("Resistor Network 6x10K Ohm")]),t._v(" "),s("td",[s("code",[t._v("RN1")]),t._v(" back")]),t._v(" "),s("td",[s("em",[t._v("Note: Pin 1 is indicated on the PCB by the square pad and on the component by a white dot")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("7.")]),t._v(" "),s("td",[t._v("Connector 20x1 Female (x2)")]),t._v(" "),s("td",[s("code",[t._v("ESP32")]),t._v(" back")]),t._v(" "),s("td",[t._v("Solder these connectors mounted on the "),s("strong",[t._v("back")]),t._v(" of the PCB in the 2 rows of 20 through-holes that form a DIP40 outline marked "),s("code",[t._v("ESP32")]),t._v(".")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("td",[e("strong",[this._v("[TEST STEP]")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"danger custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Before continuing, remove both the microSD Memory Card from the socket and the ESP32-PICO-KIT from the female connectors, "),e("strong",[this._v("taking care not to bend the Wi-Fi antenna.")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"leds-and-accompanying-resistors"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#leds-and-accompanying-resistors"}},[this._v("#")]),this._v(" LEDs and accompanying Resistors")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("The LEDs and accompanying Resistors should be soldered in groups of 8 as indicated below and each group of 8 tested before proceeding to the next group.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("Use the supplied acrylic spacer and alignment tools. Tape them in place with the LEDs before you solder to help achieve the alignment of each group of 8 LEDs.")]),t._v(" "),s("ul",[s("li",[t._v("My preference is to raise the LEDs 3mm off the PCB, the acrylic spacer with 8 open vertical slots enables this. You can, however, solder the LEDs sitting flush with the PCB.")]),t._v(" "),s("li",[t._v("The acrylic alignment tool with 8 round holes should always be used to help align 8 LEDs at a time to be in alignment. Peel any covering off the alignment tool before using it.")])]),t._v(" "),s("p",[t._v("(see video, details to follow)")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"danger custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("LEDs are polarized and must be soldered in the correct orientation. The cathode (short lead, nearest the flat edge) should be soldered in the "),s("strong",[t._v("square")]),t._v(", lower, though-hole pad. The anode (long lead) should be soldered in the "),s("strong",[t._v("round")]),t._v(", upper, though-hole pad. Check the orientation of all LEDs in each group of 8 before soldering into place by visually inspecting the flat edge corresponding with the flat indicated in the silk screen on "),s("strong",[t._v("front")]),t._v(" side of the PCB, and the alignment of the long and short leads on the "),s("strong",[t._v("back")]),t._v(" side of the PCB.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"right"}},[t._v("Step")]),t._v(" "),s("th",[t._v("Parts")]),t._v(" "),s("th",[t._v("Location")]),t._v(" "),s("th",[t._v("Notes")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("9a.")]),t._v(" "),s("td",[t._v("LED Red 5mm (x8)")]),t._v(" "),s("td",[s("code",[t._v("LA8-LA15")]),t._v(" front")]),t._v(" "),s("td",[s("em",[t._v("Note: LEDs are polarized and must be soldered in the correct orientation.")]),t._v(" Use the acrylic spacer and alignment tools. See notes above.")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("10a.")]),t._v(" "),s("td",[t._v("Resistor 3K Ohm (x8)")]),t._v(" "),s("td",[s("code",[t._v("R32-R39")]),t._v(" front")]),t._v(" "),s("td",[t._v("There are 45 3K resistors in this kit (including 1 spare), and they are colour-coded Orange, Black, Red, Gold. Resistors are "),s("strong",[t._v("not")]),t._v(" polarized and can be inserted and soldered either way around. Because of my sense of aesthetic (ok, my OCD) I like to orientate them all the same way according to the coloured bands.")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("11a.")]),t._v(" "),s("td",[t._v("Test Lead")]),t._v(" "),s("td",[t._v("[TEST STEP]")]),t._v(" "),s("td",[t._v("At this time you should test the group of 8 LEDs you have just soldered into place. Insert the ESP32-PICO-KIT into its socket and connect it to a power source. Using the supplied test lead you can use the +5V provided by the ESP32-PICO-KIT to the PCB to test each LED (see video, details to follow)")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"danger custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Before continuing, remove both the microSD Memory Card from the socket and the ESP32-PICO-KIT from the female connectors, "),e("strong",[this._v("taking care not to bend the Wi-Fi antenna.")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"steps-9-10-can-now-be-repeated-for-each-remaining-group-of-leds-in-the-following-suggested-order"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#steps-9-10-can-now-be-repeated-for-each-remaining-group-of-leds-in-the-following-suggested-order"}},[this._v("#")]),this._v(" Steps 9-10 can now be repeated for each remaining group of LEDs in the following suggested order")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"right"}},[t._v("Step")]),t._v(" "),s("th",[t._v("Parts")]),t._v(" "),s("th",[t._v("Location")]),t._v(" "),s("th",[t._v("Notes")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("9b.")]),t._v(" "),s("td",[t._v("LED Red 5mm (x8)")]),t._v(" "),s("td",[s("code",[t._v("LS0-LS7")]),t._v(" front")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("10b.")]),t._v(" "),s("td",[t._v("Resistor 3K Ohm (x8)")]),t._v(" "),s("td",[s("code",[t._v("R40-R47")]),t._v(" front")]),t._v(" "),s("td",[t._v("Orange, Black, Red, Gold")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("11b.")]),t._v(" "),s("td",[t._v("Test Lead")]),t._v(" "),s("td",[t._v("[TEST STEP]")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("9c.")]),t._v(" "),s("td",[t._v("LED Red 5mm (x8)")]),t._v(" "),s("td",[s("code",[t._v("LO0-LO7")]),t._v(" front")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("10c.")]),t._v(" "),s("td",[t._v("Resistor 3K Ohm (x8)")]),t._v(" "),s("td",[s("code",[t._v("R16-R23")]),t._v(" front")]),t._v(" "),s("td",[t._v("Orange, Black, Red, Gold")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("11c.")]),t._v(" "),s("td",[t._v("Test Lead")]),t._v(" "),s("td",[t._v("[TEST STEP]")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("9d.")]),t._v(" "),s("td",[t._v("LED Red 5mm (x8)")]),t._v(" "),s("td",[s("code",[t._v("LA0-LA7")]),t._v(" front")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("10d.")]),t._v(" "),s("td",[t._v("Resistor 3K Ohm (x8)")]),t._v(" "),s("td",[s("code",[t._v("R24-R31")]),t._v(" front")]),t._v(" "),s("td",[t._v("Orange, Black, Red, Gold")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("11d.")]),t._v(" "),s("td",[t._v("Test Lead")]),t._v(" "),s("td",[t._v("[TEST STEP]")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("9e.")]),t._v(" "),s("td",[t._v("LED Red 5mm (x8)")]),t._v(" "),s("td",[s("code",[t._v("LD0-LD7")]),t._v(" front")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("10e.")]),t._v(" "),s("td",[t._v("Resistor 3K Ohm (x8)")]),t._v(" "),s("td",[s("code",[t._v("R52-R59")]),t._v(" front")]),t._v(" "),s("td",[t._v("Orange, Black, Red, Gold")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("11e.")]),t._v(" "),s("td",[t._v("Test Lead")]),t._v(" "),s("td",[t._v("[TEST STEP]")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("9f.")]),t._v(" "),s("td",[t._v("LED Red 5mm (x4)")]),t._v(" "),s("td",[s("code",[t._v("LHT1, LWT1, LRN1, LIE1")]),t._v(" front")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("10f.")]),t._v(" "),s("td",[t._v("Resistor 3K Ohm (x4)")]),t._v(" "),s("td",[s("code",[t._v("R48-R51")]),t._v(" front")]),t._v(" "),s("td",[t._v("Orange, Black, Red, Gold")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("11f.")]),t._v(" "),s("td",[t._v("Test Lead")]),t._v(" "),s("td",[t._v("[TEST STEP]")]),t._v(" "),s("td")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"other-resistors-capacitors-ic-sockets-miscellaneous-parts"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#other-resistors-capacitors-ic-sockets-miscellaneous-parts"}},[this._v("#")]),this._v(" Other Resistors, Capacitors, IC sockets & Miscellaneous Parts")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("Note")]),t._v(" "),s("p",[t._v("The transistor "),s("code",[t._v("Q1")]),t._v(" and the accompanying Resistor "),s("code",[t._v("R13")]),t._v(" are "),s("strong",[t._v("optional")]),t._v(". They are a convenience for flashing new firmware on the ESP32-PICO-KIT over USB without removing it from the IMSAI 8080esp PCB. However, on their own they do not provide the whole solution and two extra jumper wires are required to be directly soldered to component leads on the ESP32-PICO-KIT board (details to follow). The simple alternative is to remove the ESP32-PICO-KIT from the IMSAI 8080esp PCB before flashing new firmware over USB, or more simply use the drag-and-drop, over-the-air (OTA) firmware update procedure via the Desktop UI (details to follow).")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"right"}},[t._v("Step")]),t._v(" "),s("th",[t._v("Parts")]),t._v(" "),s("th",[t._v("Location")]),t._v(" "),s("th",[t._v("Notes")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("12.")]),t._v(" "),s("td",[t._v("Resistor 10K Ohm")]),t._v(" "),s("td",[s("code",[t._v("R1-R12")]),t._v(" front")]),t._v(" "),s("td",[t._v("Brown, Black, Orange, Gold. Resistors are "),s("strong",[t._v("not")]),t._v(" polarized and can be inserted & soldered either way around. Because of my sense of aesthetic (ok, my OCD) I like to orientate them all the same way according to the coloured bands.")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("13.")]),t._v(" "),s("td",[t._v("Resistor 10K Ohm")]),t._v(" "),s("td",[s("code",[t._v("R13")]),t._v(" back")]),t._v(" "),s("td",[s("em",[t._v("(Optional) See note above.")]),t._v(" Brown, Black, Orange, Gold.")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("14.")]),t._v(" "),s("td",[t._v("Capacitor 100nF (0.1μF, 104)")]),t._v(" "),s("td",[s("code",[t._v("C3-C12, C17")]),t._v(" front")]),t._v(" "),s("td",[t._v("These capacitors are "),s("strong",[t._v("not")]),t._v(" polarized and can be inserted & soldered either way around.")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("15.")]),t._v(" "),s("td",[t._v("Capacitor 100nF (0.1μF, 104)")]),t._v(" "),s("td",[s("code",[t._v("C2, C13-C16")]),t._v(" back")]),t._v(" "),s("td",[t._v("These capacitors are "),s("strong",[t._v("not")]),t._v(" polarized and can be inserted & soldered either way around.")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("16.")]),t._v(" "),s("td",[t._v("16 pin DIP Socket (x10)")]),t._v(" "),s("td",[s("code",[t._v("U1-U10")]),t._v(" front")]),t._v(" "),s("td",[t._v("DIP sockets should be inserted to align the crescent/indent at one end with the corresponding mark in the silk screen for the IC Socket. This makes no difference functionally, but will help with the inserting the ICs with the correct orientation later in the assembly.")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("17.")]),t._v(" "),s("td",[t._v("16 pin DIP Socket")]),t._v(" "),s("td",[s("code",[t._v("U11")]),t._v(" back")]),t._v(" "),s("td",[t._v("DIP sockets should be inserted to align the crescent/indent at one end with the corresponding mark in the silk screen for the IC Socket. This makes no difference functionally, but will help when inserting the ICs with the correct orientation later in the assembly.")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("18.")]),t._v(" "),s("td",[t._v("S8050 NPN Transistor")]),t._v(" "),s("td",[s("code",[t._v("Q1")]),t._v(" back")]),t._v(" "),s("td",[s("em",[t._v("(Optional) See note above.")])])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("19.")]),t._v(" "),s("td",[t._v("Tactile Switch SPST-NO")]),t._v(" "),s("td",[s("code",[t._v("Reset")]),t._v(" front")]),t._v(" "),s("td",[s("em",[t._v("Note: don't rely only on the 2 soldered connector pins to secure the switch to the PCB, also solder in the 2 mounting pegs to ensure a secure connection to the PCB")])])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("20.")]),t._v(" "),s("td",[t._v("Header 4x2 Male")]),t._v(" "),s("td",[s("code",[t._v("Boot")]),t._v(" back")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("21.")]),t._v(" "),s("td",[t._v("Header 8x2 Male")]),t._v(" "),s("td",[s("code",[t._v("Patch")]),t._v(" back")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("22.")]),t._v(" "),s("td",[t._v("Header 8x2 Male")]),t._v(" "),s("td",[s("code",[t._v("Comms")]),t._v(" back")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("23.")]),t._v(" "),s("td",[t._v("DE9 (DB9) Male Socket (x2)")]),t._v(" "),s("td",[s("code",[t._v("RS232-1, RS232-2")]),t._v(" back")]),t._v(" "),s("td",[s("em",[t._v("Note: don't rely only on the 9 soldered connector pins to secure a socket to the PCB, also solder in the 2 mounting pegs to ensure a secure connection to the PCB")])])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"inserting-the-ics"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#inserting-the-ics"}},[this._v("#")]),this._v(" Inserting the ICs")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"danger custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("If you fail to insert the ICs at this step, before proceeding to insert and solder the rocker/toggle switches, you will find that you cannot later insert some of the ICs without bending the switches. I have done this, to prove that it can be done, but I do not recommend it.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"danger custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[e("strong",[this._v("ICs are polarized/directional and must be inserted in the correct orientation.")]),this._v(" ICs should be inserted to align the crescent/indent at one end with the corresponding mark in the silk screen. If you have soldered in the "),e("strong",[this._v("16 pin DIP Sockets")]),this._v(" with the indicated orientation, this will make the job easier. Once you have inserted the ICs, have a cup of tea and then double-check they are in the correct way: it's easy to accidentally insert them the wrong way round.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"right"}},[t._v("Step")]),t._v(" "),s("th",[t._v("Parts")]),t._v(" "),s("th",[t._v("Location")]),t._v(" "),s("th",[t._v("Notes")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("24.")]),t._v(" "),s("td",[t._v("74HC595 (x6)")]),t._v(" "),s("td",[s("code",[t._v("U1-U6")]),t._v(" front")]),t._v(" "),s("td",[s("code",[t._v("U1-U6")]),t._v(" are all oriented the same way, with the crescent/indent to the "),s("strong",[t._v("right")]),t._v(" when looking at the "),s("strong",[t._v("front")]),t._v(" of the PCB. Take time to check you are putting the ICs in the correct sockets, as U6 might not be where you expect it to be.")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("25.")]),t._v(" "),s("td",[t._v("74HC165 (x4)")]),t._v(" "),s("td",[s("code",[t._v("U7-U10")]),t._v(" front")]),t._v(" "),s("td",[s("code",[t._v("U7-U10")]),t._v(" are all oriented the same way, with the crescent/indent to the "),s("strong",[t._v("right")]),t._v(" when looking at the "),s("strong",[t._v("front")]),t._v(" of the PCB.")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("26.")]),t._v(" "),s("td",[t._v("MAX3232")]),t._v(" "),s("td",[s("code",[t._v("U11")]),t._v(" back")]),t._v(" "),s("td",[s("code",[t._v("U11")]),t._v(" is oriented with the crescent/indent to the "),s("strong",[t._v("left")]),t._v(" when looking at the "),s("strong",[t._v("back")]),t._v(" of the PCB.")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"testing-i"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#testing-i"}},[this._v("#")]),this._v(" Testing I")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("At this point you can operate the IMSAI 8080esp without having the rocker/toggle switches mounted.")]),t._v(" "),s("ul",[s("li",[t._v("Plug the ESP32-PICO-KIT into the female connectors on the "),s("strong",[t._v("back")]),t._v(" of the PCB.")]),t._v(" "),s("li",[s("em",[t._v("Note: The USB connecter should be towards the near edge of the PCB and the Wi-Fi antenna towards the RS232 connectors.")])]),t._v(" "),s("li",[t._v("Insert the microSD card.")]),t._v(" "),s("li",[t._v("Connect the ESP32-PICO-KIT to a USB power source with a suitable USB cable.")]),t._v(" "),s("li",[t._v("The simulation will not start until you short the centre and top pins of switch "),s("code",[t._v("S1")])])]),t._v(" "),s("p",[t._v("You can connect to the web based desktop UI by connecting a PC to the Wi-Fi SSID advertised as "),s("code",[t._v("IMSAI8080")]),t._v(". Because the Wi-Fi has not been configured, the IMSAI 8080esp should have rebooted into Wi-Fi fallback mode, where it acts as an "),s("strong",[t._v("Access-Point (AP)")]),t._v(" with the default SSID of "),s("code",[t._v("IMSAI8080")]),t._v(". Once you are connected to this Wi-Fi network, start a Chrome browser and enter the URL "),s("code",[t._v("http://imsai8080.local")]),t._v(".")]),t._v(" "),s("p",[t._v("There are (or will be) separate instructions for configuring the Wi-Fi to connect to you local Wi-Fi network.")]),t._v(" "),s("p",[t._v("You can use the virtual "),s("code",[t._v("CPA:")]),t._v(" device to toggle the "),s("code",[t._v("RUN/STOP")]),t._v(" switch.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("While you can operate the IMSAI 8080esp at this point, it will not do much for you without some further configuration. The default configuration is like an empty machine with no ROM only RAM, and you don't have a full front panel to play with. Damn!\nConfiguration is (or will be) covered elsewhere.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Time for a cup of tea if you've gotten this far.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"rocker-toggle-switches"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rocker-toggle-switches"}},[this._v("#")]),this._v(" Rocker/Toggle Switches")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("To correctly locate and align the rocker switches before soldering, the front panel should be partially assembled according to the following instructions.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Many of the sheets of acrylic have a protective backing cover (plastic or paper) to protect them from scratching during cutting and transportation. This should be removed before you use them in the assembly of the kit.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("When assembling all or part of the front panel it is sometimes necessary to flip the assembly. To avoid having the M4 socket screws fall out you can use masking tape to hold them in place, or use a cardboard sheet from the packaging to cover the socket screws while flipping the assembly (see video).")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("When screwing the M4 Nylon Nuts and the M4 Socket Screws together only ever make them "),e("strong",[this._v("finger tight")]),this._v(" to avoid stripping the thread from the M4 Nylon Nuts.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"right"}},[t._v("Step")]),t._v(" "),s("th",[t._v("Parts")]),t._v(" "),s("th",[t._v("Location")]),t._v(" "),s("th",[t._v("Notes")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("27.")]),t._v(" "),s("td",[t._v("M4x30mm Hex Socket Screw (x8)")]),t._v(" "),s("td",[t._v("3mm Black acrylic LED/switch masking plate")]),t._v(" "),s("td",[t._v("Insert the 8 "),s("code",[t._v("M4 socket screws")]),t._v(" into each of the 8 round holes in the large "),s("code",[t._v("3mm Black acrylic LED/switch masking plate")])])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("28.")]),t._v(" "),s("td",[t._v("Spacer 8mm Nylon (x8)")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("Thread a "),s("code",[t._v("8mm spacer")]),t._v(" over each of the 8 "),s("code",[t._v("M4 socket screws")]),t._v(" behind the "),s("code",[t._v("3mm Black acrylic LED/switch masking plate")])])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("29.")]),t._v(" "),s("td",[t._v("PCB")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("Fit the "),s("code",[t._v("PCB")]),t._v(" over the 8 "),s("code",[t._v("M4 socket screws")]),t._v(" behind the "),s("code",[t._v("8mm spacers")]),t._v(" and the "),s("code",[t._v("3mm Black acrylic LED/switch masking plate")])])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("30.")]),t._v(" "),s("td",[t._v("M4 Hex Nut Nylon (x8)")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("Secure this partial assembly of the front panel by screwing a "),s("code",[t._v("M4 Nut")]),t._v(" on each of the 8 "),s("code",[t._v("M4 socket screws")]),t._v(" behind the "),s("code",[t._v("PCB")])])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("You should now have a sandwich with the PCB at the back and the 3mm Black acrylic LED/switch masking plate at the front, separated by the 8mm spacers and held together with the M4 socket screws and nuts.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("As you insert each rocker switch into the PCB, there should be a slight press-to-fit resistance from the pins as they push into the through-holes in the PCB. This will help hold the switch in position prior to soldering.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"right"}},[t._v("Step")]),t._v(" "),s("th",[t._v("Parts")]),t._v(" "),s("th",[t._v("Location")]),t._v(" "),s("th",[t._v("Notes")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("31a.")]),t._v(" "),s("td",[t._v("Blue Rocker (On-On) (x4)")]),t._v(" "),s("td",[s("code",[t._v("SA12-SA15")])]),t._v(" "),s("td",[s("strong",[t._v("Don't solder them yet")])])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("32a.")]),t._v(" "),s("td",[t._v("Red Rocker (On-On) (x4)")]),t._v(" "),s("td",[s("code",[t._v("SA8-SA11")])]),t._v(" "),s("td",[s("strong",[t._v("Don't solder them yet")])])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("33a.")]),t._v(" "),s("td",[t._v("3mm Black acrylic LED spacer & switch alignment guide (8 slots)")]),t._v(" "),s("td",[s("code",[t._v("SA8-SA15")])]),t._v(" "),s("td",[t._v("Place the small acrylic alignment guide over the ends of the whole set of 8 rocker switch toggles/actuators, this should help get the switches in alignment. Secure this in place with tape of a couple of strong elastic bands. Solder the switches in place.")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"steps-31-33-can-now-be-repeated-for-the-second-group-of-on-on-switches"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#steps-31-33-can-now-be-repeated-for-the-second-group-of-on-on-switches"}},[this._v("#")]),this._v(" Steps 31-33 can now be repeated for the second group of (On-On) switches")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"right"}},[t._v("Step")]),t._v(" "),s("th",[t._v("Parts")]),t._v(" "),s("th",[t._v("Location")]),t._v(" "),s("th",[t._v("Notes")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("31b.")]),t._v(" "),s("td",[t._v("Blue Rocker (On-On) (x4)")]),t._v(" "),s("td",[s("code",[t._v("SA4-SA7")])]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("32b.")]),t._v(" "),s("td",[t._v("Red Rocker (On-On) (x4)")]),t._v(" "),s("td",[s("code",[t._v("SA0-SA3")])]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("33b.")]),t._v(" "),s("td",[t._v("3mm Black acrylic LED spacer & switch alignment guide (8 slots)")]),t._v(" "),s("td",[s("code",[t._v("SA0-SA7")])]),t._v(" "),s("td")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("The order of the momentary switches is different. They alternate blue/red from left to right with the red power switch in the right-most position. I have seen different configurations and I guess it comes down to personal choice. I imagine you can swap the plastic toggle actuators but I have not tried this myself.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"right"}},[t._v("Step")]),t._v(" "),s("th",[t._v("Parts")]),t._v(" "),s("th",[t._v("Location")]),t._v(" "),s("th",[t._v("Notes")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("34.")]),t._v(" "),s("td",[t._v("Blue Rocker (Mom-off-Mom) (x3)")]),t._v(" "),s("td",[s("code",[t._v("S6, S4, S2")])]),t._v(" "),s("td",[s("strong",[t._v("Don't solder them yet")])])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("35.")]),t._v(" "),s("td",[t._v("Red Rocker (Mom-off-Mom) (x2)")]),t._v(" "),s("td",[s("code",[t._v("S5, S3")])]),t._v(" "),s("td",[s("strong",[t._v("Don't solder them yet")])])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("36.")]),t._v(" "),s("td",[t._v("3mm Black acrylic LED spacer & switch alignment guide (8 slots)")]),t._v(" "),s("td",[s("code",[t._v("S2-S6")])]),t._v(" "),s("td",[t._v("Place the small acrylic alignment guide over the ends of the whole set of 5 rocker switch toggles/actuators, this should help get the switches in alignment. Secure this in place with tape of a couple of strong elastic bands. Solder the switches in place.")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("37.")]),t._v(" "),s("td",[t._v("Red Power Switch (On-On)")]),t._v(" "),s("td",[s("code",[t._v("S1")])]),t._v(" "),s("td",[t._v("Solder it in place.")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"testing-ii"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#testing-ii"}},[this._v("#")]),this._v(" Testing II")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("At this point the IMSAI 8080esp should be fully operational.\nSee "),e("a",{attrs:{href:"#testing-i"}},[this._v("Testing I")]),this._v(" for a general outline of getting it started.")]),this._v(" "),e("p",[this._v("You should exercise all the switches and make sure they are operating correctly (details to follow)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("While you can operate the IMSAI 8080esp at this point, it will not boot a disk without further configuration. The default configuration is like an empty machine with no ROM only RAM. You can, however, now enter programs through the front panel switches and run them.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Time for another cup of tea if you've gotten this far.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"full-front-panel-stack"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#full-front-panel-stack"}},[this._v("#")]),this._v(" Full Front Panel Stack")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Having successfully gotten this far, the next section can go very smoothly if you take care or it can become very fiddly and frustrating if you rush or end up separating the "),e("code",[this._v("PCB")]),this._v(" and the "),e("code",[this._v("3mm Black acrylic LED/switch masking plate")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("ol",[s("li",[t._v("Remove the "),s("code",[t._v("M4 Nuts")]),t._v(" (8) without letting the "),s("code",[t._v("M4 Socket Screws")]),t._v(" (8) drop out of place, tape may help.")]),t._v(" "),s("li",[t._v("Place the "),s("code",[t._v("PCB")]),t._v(" down on a surface with the "),s("code",[t._v("3mm Black acrylic LED/switch masking plate")]),t._v(" facing up, the "),s("code",[t._v("M4 Socket Screws")]),t._v(" will need to slide up to let the "),s("code",[t._v("PCB")]),t._v(" sit down flat on the surface.")]),t._v(" "),s("li",[t._v("Carefully remove the "),s("code",[t._v("M4 Socket Screws")]),t._v(" (8) without disturbing the "),s("code",[t._v("3mm Black acrylic LED/switch masking plate")]),t._v(", the "),s("code",[t._v("PCB")]),t._v(" "),s("strong",[t._v("and especially don't allow the "),s("code",[t._v("8mm Spacers")]),t._v(" to move out of place")]),t._v(".")]),t._v(" "),s("li",[t._v("Leave this assembly undisturbed while you put the remaining front panel acrylic together")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"right"}},[t._v("Step")]),t._v(" "),s("th",[t._v("Parts")]),t._v(" "),s("th",[t._v("Location")]),t._v(" "),s("th",[t._v("Notes")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("38.")]),t._v(" "),s("td",[t._v("M4x30mm Hex Socket Screw (x8)")]),t._v(" "),s("td",[t._v("6mm Clear acrylic front cover")]),t._v(" "),s("td",[t._v("Insert the 8 "),s("code",[t._v("M4 socket screws")]),t._v(" into each of the 8 round holes in the thick "),s("code",[t._v("6mm Clear acrylic front cover")]),t._v(". Tape over the heads to hold them in place.")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("39.")]),t._v(" "),s("td",[t._v("3mm White text/decals on Black facia over red transparent filter")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("Align the "),s("code",[t._v("Text Facia")]),t._v(" over the "),s("code",[t._v("M4 socket screws")]),t._v(" and slide it down to meet the clear acrylic")])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("40.")]),t._v(" "),s("td"),t._v(" "),s("td"),t._v(" "),s("td",[t._v("This step removed as the "),s("code",[t._v("Text Facia")]),t._v(" and "),s("code",[t._v("transparent red filter")]),t._v(" are now a single piece")])])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("ol",[s("li",[t._v("Take this whole assembly and flip it over, with the clear acrylic and the "),s("code",[t._v("Text Facia")]),t._v(" facing up.")]),t._v(" "),s("li",[t._v("Lower this into place, guiding the "),s("code",[t._v("M4 socket screws")]),t._v(" through the holes in the other assembly you previously set aside (black acrylic, 8mm spacers and PCB)")]),t._v(" "),s("li",[t._v("Making sure the "),s("code",[t._v("M4 socket screws")]),t._v(" wont fall out (tape again), flip this whole assembly over, placing the front panel face down on a surface.")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("If by this point, any of the "),s("code",[t._v("8mm Spacers")]),t._v(" have slipped out of position, you can withdraw the corresponding "),s("code",[t._v("M4 socket screw")]),t._v(" and use tweezers to correctly locate the "),s("code",[t._v("8mm Spacer")]),t._v(" before reinserting the "),s("code",[t._v("M4 socket screw")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"right"}},[t._v("Step")]),t._v(" "),s("th",[t._v("Parts")]),t._v(" "),s("th",[t._v("Location")]),t._v(" "),s("th",[t._v("Notes")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("41.")]),t._v(" "),s("td",[t._v("Spacer 6mm Nylon (x8)")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("Thread a "),s("code",[t._v("6mm spacer")]),t._v(" over each of the 8 "),s("code",[t._v("M4 socket screws")]),t._v(" behind the "),s("code",[t._v("PCB")])])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("42.")]),t._v(" "),s("td",[t._v("3mm Clear acrylic back cover")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("Align the "),s("code",[t._v("3mm Clear acrylic back cover")]),t._v(" over the "),s("code",[t._v("M4 socket screws")]),t._v(" and slide it down to meet the "),s("code",[t._v("3mm Spacers")])])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("43.")]),t._v(" "),s("td",[t._v("M4 Hex Nut Nylon (x8)")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("Push a "),s("code",[t._v("M4 Nut")]),t._v(" into each hexagonal cutout in the "),s("code",[t._v("3mm Clear acrylic back cover")]),t._v(" behind each of the 8 "),s("code",[t._v("M4 socket screws")]),t._v(", tape them into position so that they don't fall out while tightening the "),s("code",[t._v("M4 socket screws")])])])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("ol",[s("li",[t._v("Holding the whole assembly firmly together (again tape may help) stand it up on one long edge.")]),t._v(" "),s("li",[t._v("Screw each of the 8 "),s("code",[t._v("M4 socket screws")]),t._v(" firmly into their corresponding "),s("code",[t._v("M4 Nut")]),t._v(", take care not to over-tighten and strip the thread in the "),s("code",[t._v("M4 Nut")]),t._v(".")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Almost done!")]),this._v(" "),e("p",[this._v("Who would have thought you'd have a working replica of an IMSAI 8080 in around just 40 simple steps 😃")]),this._v(" "),e("p",[this._v("Probably time for another cup of tea, but in my case, I think I'd choose something stronger.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"switch-surround"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#switch-surround"}},[this._v("#")]),this._v(" Switch Surround")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Don't try to operate your IMSAI 8080esp for long periods of time without this component in place. It looks so good, you're missing out if you don't have it in place 😃.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Don't attach any tape to the "),e("code",[this._v("6mm Charcoal grey hammer tone painted acrylic switch surround")]),this._v("\nThere has been a report of this removing some paint when the tape was removed.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("table",[s("thead",[s("tr",[s("th",{staticStyle:{"text-align":"right"}},[t._v("Step")]),t._v(" "),s("th",[t._v("Parts")]),t._v(" "),s("th",[t._v("Location")]),t._v(" "),s("th",[t._v("Notes")])])]),t._v(" "),s("tbody",[s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("44.")]),t._v(" "),s("td",[t._v("120mm x 25mm Black Velcro adhesive backed hook & loop tape")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("Cut both the "),s("code",[t._v("hook and loop tape")]),t._v(" into "),s("strong",[t._v("2")]),t._v(" x 60mm lengths. Cut each 60mm piece "),s("strong",[t._v("lengthways in half")]),t._v(" to produce "),s("strong",[t._v("4")]),t._v(" x 60mm x 12.5mm strips of "),s("code",[t._v("hook and loop tape")])])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("45.")]),t._v(" "),s("td",[t._v("60mm x 12.5mm Black Velcro adhesive backed hook & loop tape (x4)")]),t._v(" "),s("td",[t._v("6mm Charcoal grey hammer tone painted acrylic switch surround")]),t._v(" "),s("td",[t._v("Stick each strip of "),s("code",[t._v("hook and loop tape")]),t._v(" to the back of the "),s("code",[t._v("switch surround")]),t._v(" vertically , aligned behind the fingers extending upwards along the "),s("code",[t._v("switch surround")])])]),t._v(" "),s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("46.")]),t._v(" "),s("td",[t._v("6mm Charcoal grey hammer tone painted acrylic switch surround")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("Remove the paper backing from the "),s("code",[t._v("hook and loop tape")]),t._v(" and press the "),s("code",[t._v("switch surround")]),t._v(" into place under the "),s("code",[t._v("toggle switches")]),t._v(" on the assembly you completed after Step 43.")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"the-lid"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-lid"}},[this._v("#")]),this._v(" The Lid")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("The lid can wait, its time to play!")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("It is highly recommended that you fit the "),s("code",[t._v("2mm White acrylic back cover corner reinforcement pieces")]),t._v(" to the "),s("code",[t._v("3mm Clear acrylic back cover")]),t._v(" before you you attach the lid. Failure to do so might result in cracking the "),s("code",[t._v("3mm Clear acrylic back cover")]),t._v(".")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"right"}},[this._v("Step")]),this._v(" "),e("th",[this._v("Parts")]),this._v(" "),e("th",[this._v("Location")]),this._v(" "),e("th",[this._v("Notes")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("48.")]),t._v(" "),s("td",[t._v("M3x12mm Black Machine Screw (x4), M3 Nut (x4)")]),t._v(" "),s("td",[t._v("3mm Blue aluminium lid")]),t._v(" "),s("td",[t._v("Put an "),s("code",[t._v("M3 Screw")]),t._v(" through each of the 4 smaller holes in the "),s("code",[t._v("Blue aluminium lid")]),t._v(" and use a "),s("code",[t._v("M3 Nut")]),t._v(" on the end of each "),s("code",[t._v("M3 Screw")]),t._v(" to secure the "),s("code",[t._v("Blue aluminium lid")]),t._v(".")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("tr",[s("td",{staticStyle:{"text-align":"right"}},[t._v("49.")]),t._v(" "),s("td",[t._v("3mm Blue aluminium lid")]),t._v(" "),s("td"),t._v(" "),s("td",[t._v("Place the "),s("code",[t._v("Blue aluminium lid")]),t._v(" around the assembly completed at step 38 above. The "),s("code",[t._v("M3 Screws")]),t._v(" are closer to the "),s("strong",[t._v("back")]),t._v(" than to the front. Secure each "),s("code",[t._v("M3 Screw")]),t._v(" & "),s("code",[t._v("M3 Nut")]),t._v(" in the corresponding slot in the "),s("code",[t._v("3mm Clear acrylic back cover")]),t._v(". Don't over-tighten the "),s("code",[t._v("M3 Screws")]),t._v(" used to secure the lid or you could crack the "),s("code",[t._v("3mm Clear acrylic back cover")]),t._v(".")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"celebrating"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#celebrating"}},[this._v("#")]),this._v(" Celebrating")])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[this._v("Remember to once again plug in the "),e("code",[this._v("ESP32-PICO-KIT")]),this._v(" and insert the "),e("code",[this._v("microSD Card")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[this._v("Connect the "),e("code",[this._v("ESP32-PICO-KIT")]),this._v(" to a USB power source with a USB micro-B cable")])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[this._v("Find page 34 in the manual and start from the heading "),e("strong",[this._v("SYSTEM FUNCTIONAL TEST")])])}],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/27.6fa96bf1.js b/assets/js/27.6fa96bf1.js new file mode 100644 index 0000000..1cee37c --- /dev/null +++ b/assets/js/27.6fa96bf1.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{262:function(t,e,s){"use strict";s.r(e);var i=s(0),o=Object(i.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("If you experience problems that are not covered in this trouble shooting guide, please post them to "),s("a",{attrs:{href:"https://github.com/orgs/thehighnibble/discussions",target:"_blank",rel:"noopener noreferrer"}},[t._v("TheHighNibble forum"),s("OutboundLink")],1),t._v(". Maybe someone else has already solved that problem and can help you if I am asleep or unavailable. Also, any problem you have is likely to be experienced by someone else and so, the discussion and resolution via the forum can act as a knowledge base until I can update this guide to include notes on the problem.")])]),t._v(" "),t._m(1),t._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("The troubleshooting outlined here focuses on understanding the messages that are logged to the console by the ESP32 as it boots.\nThe simplest way to see these messages is to")]),t._v(" "),t._m(2),t._v(" "),s("p",[t._v("If you do not see a TTY/COM port on your PC presented by the ESP32-PICO-KIT, you may need to install a driver for the "),s("em",[t._v("Silicon Labs CP210x USB to UART bridge")]),t._v(" used on the ESP32-PICO-KIT. See "),s("router-link",{attrs:{to:"./../configure/#serial-communications-rs232-usb"}},[t._v("Serial Communications (RS232, USB)")]),t._v(" in the Configuration guide for details.")],1)]),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),s("p",[t._v("If you see only:")]),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),s("p",[t._v("If you see something similar to:")]),t._v(" "),t._m(10),t._v(" "),s("p",[t._v("Then your soldering of the PSRAM has been unsuccessful. You should rework all the solder joints of the PSRAM SOP-8 package, check that you have "),s("code",[t._v("C1")]),t._v(" and "),s("code",[t._v("R14")]),t._v(" correctly installed and that you have added the extra 2 sets of 3 male header pins to the ESP32-PICO-KIT board as per the "),s("router-link",{attrs:{to:"./../assembly/#esp32-microcontroller-psram-micro-sd-card-socket"}},[t._v("assembly instructions")])],1),t._v(" "),s("p",[t._v("If you see something similar to:")]),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),s("p",[t._v("The NVS (Non Volatile Storage) has not yet been initialised. You must have all the toggles soldered in before you can set the "),s("router-link",{attrs:{to:"./../configure/#startup-configuration-non-volatile-storage-nvs"}},[t._v("Startup Configuration in NVS")])],1),t._v(" "),t._m(13),t._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("If you see a Wi-Fi Access Point SSID named "),s("code",[t._v("imsai8080")]),t._v(" on your Wi-Fi network, and can get any of the Desktop UI to load when you point your Chrome browser at "),s("a",{attrs:{href:"http://imsai8080.local",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://imsai8080.local"),s("OutboundLink")],1),t._v(" then your soldering of the "),s("code",[t._v("microSD Card Socket")]),t._v(" is perfect.")]),t._v(" "),t._m(14)]),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),t._m(17),t._v(" "),t._m(18),t._v(" "),t._m(19),t._v(" "),s("p",[t._v("Once the toggle switches are soldered in you will be able to more get some more conclusive tests done.")]),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("For a visual guide to the following tests refer to the YouTube video titled "),s("a",{attrs:{href:"https://youtu.be/VrSLJicIlcU",target:"_blank",rel:"noopener noreferrer"}},[t._v("THN #019 - Kit Assembly #11- The dead LED is fixed and testing continues."),s("OutboundLink")],1),t._v(" "),s("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/VrSLJicIlcU",frameborder:"0",allow:"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""}})])]),t._v(" "),t._m(22),t._v(" "),t._m(23),t._v(" "),t._m(24),t._v(" "),t._m(25),t._v(" "),t._m(26),t._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("At this point your IMSAI 8080esp should by fully operational.")]),t._v(" "),s("p",[t._v("For a visual guide to the following tests refer to the YouTube video titled "),s("a",{attrs:{href:"https://youtu.be/Cwv_gRtWnZM",target:"_blank",rel:"noopener noreferrer"}},[t._v("THN #022 - Kit Assembly #14 - Some last testing before final assembly"),s("OutboundLink")],1),t._v(" "),s("iframe",{attrs:{width:"560",height:"315",src:"https://www.youtube.com/embed/Cwv_gRtWnZM",frameborder:"0",allow:"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""}})])]),t._v(" "),t._m(27),t._v(" "),t._m(28),t._v(" "),t._m(29),t._v(" "),t._m(30),t._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("You should be able to repeat any of the above tests but more importantly you should be able to enter "),s("em",[t._v("startup configuration mode")]),t._v(" and configure your IMSAI 8080esp to boot into a ROM based application eg. BASIC, or to boot a floppy disk image and start a disk based operating system eg. CP/M 2.2 (as supplied). See the "),s("router-link",{attrs:{to:"./../configure/"}},[t._v("Configuration guide")]),t._v(" for details.")],1)]),t._v(" "),t._m(31),t._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),t._m(32),t._v(" "),s("p",[t._v("If you haven't visited it yet, head over to "),s("a",{attrs:{href:"https://github.com/orgs/thehighnibble/discussions",target:"_blank",rel:"noopener noreferrer"}},[t._v("TheHighNibble forum"),s("OutboundLink")],1),t._v(". The forum is public and readable by anyone but if you wish to post you need to become a member.")]),t._v(" "),t._m(33),t._v(" "),t._m(34)]),t._v(" "),t._m(35),t._v(" "),s("p",[t._v("If you have LEDs or Toggle switches that don't operate correctly the most likely cause is the soldering.")]),t._v(" "),s("p",[t._v("A visual inspection of all solder joints is ofter the best first approach.")]),t._v(" "),s("p",[t._v("Any joints that don't look like the others, especially on pads connected to the faulty component can be re-worked with a hot soldering iron and some flux, or more solder added if required.")]),t._v(" "),s("p",[t._v("You will have to (partially or fully) disassemble the acrylic components to get access to the PCB so that you can do any soldering or some further testing. A digital multimeter can be a useful tool for this work to help you do some continuity testing, test resistors for correct values, check that voltages are as expected (+5V DC).")]),t._v(" "),t._m(36),t._v(" "),t._m(37),t._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),t._m(38),t._v(" "),t._m(39),t._v(" "),s("p",[t._v("See the "),s("router-link",{attrs:{to:"./../configure/#startup-configuration-non-volatile-storage-nvs"}},[t._v("Startup configuration (Non-Volatile Storage, NVS)")]),t._v(" section of the Configuration guide for instructions on setting the "),s("strong",[t._v("NVS_LOG_LEVEL")])],1)]),t._v(" "),s("p",[t._v("When you are posting in the forum requesting help with a problem, it would be a good idea to include an attached file of your current ESP32 console logs that highlight the problem.")])])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"troubleshooting-draft"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting-draft"}},[this._v("#")]),this._v(" Troubleshooting (Draft)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"during-assembly"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#during-assembly"}},[this._v("#")]),this._v(" During assembly")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ol",[s("li",[t._v("connect the "),s("code",[t._v("ESPP32-PICO-KIT")]),t._v(" to a PC using a suitable USB cable")]),t._v(" "),s("li",[t._v("start a terminal emulator on the PC set for 115200 baud 8N1 connected to the serial device your OS identifies the ESP32 on\n"),s("ul",[s("li",[t._v("Windows will be a COMx: port")]),t._v(" "),s("li",[t._v("OSX will be /dev/tty.SLAB_USBtoUART")]),t._v(" "),s("li",[t._v("Linux will be /dev/ttyUSB0 (or similar, TBA)")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"with-just-the-esp32-psram-and-microsd-card-in-place-and-supporting-passives"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#with-just-the-esp32-psram-and-microsd-card-in-place-and-supporting-passives"}},[this._v("#")]),this._v(" With just the ESP32, PSRAM and microSD card in place (and supporting passives)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"no-firmware"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#no-firmware"}},[this._v("#")]),this._v(" No firmware")])},function(){var t=this.$createElement,e=this._self._c||t;return e("pre",[e("code",[this._v("rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)\nflash read err, 1000\nets_main.c 371\nets Jun 8 2016 00:22:57\n\nrst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)\nflash read err, 1000\nets_main.c 371\nets Jun 8 2016 00:22:57\n")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Then that's my fault, and I've shipped you an ESP32-PICO-KIT module without the IMSAI 8080esp firmware flashed. This does "),e("strong",[this._v("not")]),this._v(" require a return and re-mail. But it will require you to follow a number of steps involving installing some tools from the "),e("code",[this._v("esp-idf")]),this._v(" to flash the firmware yourself. A detailed guide for this unlikely outcome will follow.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"i-see-an-error-in-the-logs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#i-see-an-error-in-the-logs"}},[this._v("#")]),this._v(" I see an error in the logs")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"danger custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("An error in the logs appears as "),e("strong",[this._v("red text")]),this._v(" with a capital "),e("strong",[this._v("E")]),this._v(" as the first character of the line.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Some errors cause the ESP32 to continuously reboot and so the error will be repeated and scroll up the screen and be hard to read. Simply unplug the USB cable to stop the console error log so you can read the error.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("pre",[e("code",[this._v("Rebooting...\nets Jun 8 2016 00:22:57\n\nrst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)\nconfigsip: 188777542, SPIWP:0xee\nclk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00\nmode:DIO, clock div:1\nload:0x3fff0018,len:4\nload:0x3fff001c,len:4276\nload:0x40078000,len:9948\nload:0x40080400,len:6464\nentry 0x400806cc\n"),e("span",{staticStyle:{color:"#00FF00"}},[this._v("I (269) psram: This chip is ESP32-PICO")]),this._v("\n"),e("span",{staticStyle:{color:"#FF0000"}},[this._v("E (269) cpu_start: Failed to init external RAM, needed for external .bss segment")]),this._v("\nabort() was called at PC 0x400817e4 on core 0\n")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("pre",[e("code",[e("span",{staticStyle:{color:"#00FF00"}},[this._v("I (832) cpu_start: Pro cpu start user code\nI (178) cpu_start: Starting scheduler on PRO CPU.\nI (0) cpu_start: Starting scheduler on APP CPU.\n"),e("span",{staticStyle:{color:"#FF0000"}},[this._v("E (224) nvs: Error (UNKNOWN ERROR) opening NVS handle!")]),this._v("\nI (224) esp32_boot: Log Level set to NONE\nI (834) phy: phy_version: 4100, 6fa5e27, Jan 25 2019, 17:02:06, 0, 0\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("strong",[this._v("This is completely normal at this stage")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("This error will "),e("strong",[this._v("not")]),this._v(" prevent you getting on with the assembly &/or testing the Wi-Fi connectivity.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The Desktop UI is served from the "),e("code",[this._v("microSD Memory Card")]),this._v(" by the embedded web server and will only show if the connection checks out.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"i-don-t-see-a-wi-fi-access-point-ssid-named-imsai8080-but-i-do-see-one-named-imsai"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#i-don-t-see-a-wi-fi-access-point-ssid-named-imsai8080-but-i-do-see-one-named-imsai"}},[this._v("#")]),this._v(" I don't see a Wi-Fi Access Point SSID named "),e("code",[this._v("imsai8080")]),this._v(" but I do see one named "),e("code",[this._v("imsai")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("At this early stage, this is the only indication you'll get that you haven't successfully soldered the "),e("code",[this._v("microSD Card Socket")]),this._v(", or maybe you just forgot to insert the "),e("code",[this._v("microSD Memory Card")]),this._v(".")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("I thought a bad "),e("code",[this._v("microSD Card Socket")]),this._v(" connection would be more obvious at this point and reported by an explicit error message in the console log, but it appears I was wrong. I will work to improve this step in the troubleshooting in a future firmware release.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("You also wont (shouldn't) be able to get the Desktop UI to load in your browser if this is your problem. The Desktop UI is served from the "),e("code",[this._v("microSD Memory Card")]),this._v(" by the embedded web server.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Once you've checked that it's not the latter and are suspecting the former, try some more flux and heat to reflow the solder along the fine pins at the rear of the "),e("code",[this._v("microSD Card Socket")]),this._v(". Only add more solder sparingly or you'll start to bridge pins, although some desoldering wick will help you resolve that issue if that is what you suspect has gone wrong.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"with-all-the-leds-and-ics-in-place-and-supporting-passives"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#with-all-the-leds-and-ics-in-place-and-supporting-passives"}},[this._v("#")]),this._v(" With all the LEDs and ICs in place (and supporting passives)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Without the toggle switches in place, the testing that is possible is limited, don't expect too much")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"testing-for-power-on-off"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#testing-for-power-on-off"}},[this._v("#")]),this._v(" Testing for power on/off")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("em",[this._v("(refer to video above for now)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"testing-the-leds"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#testing-the-leds"}},[this._v("#")]),this._v(" Testing the LEDs")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("em",[this._v("(refer to video above for now)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"with-the-toggle-switches-in-place"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#with-the-toggle-switches-in-place"}},[this._v("#")]),this._v(" With the toggle switches in place")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"testing-the-leds-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#testing-the-leds-2"}},[this._v("#")]),this._v(" Testing the LEDs")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("em",[this._v("(refer to video above for now)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h4",{attrs:{id:"testing-the-red-and-blue-toggle-switches"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#testing-the-red-and-blue-toggle-switches"}},[this._v("#")]),this._v(" Testing the Red and Blue Toggle Switches")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("em",[this._v("(refer to video above for now)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"after-assembly"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#after-assembly"}},[this._v("#")]),this._v(" After assembly")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("There is a growing community of fellow IMSAI 8080esp owners and interested parties, sharing with and helping each other on the "),e("strong",[this._v("IMSAI 8080esp Forum")]),this._v(".")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Membership requires you to have GitHub account. Email to "),e("a",{attrs:{href:"mailto://info@thehighnibble.com"}},[this._v("info@thehighnibble.com")]),this._v(" with your GitHub name and I will send you an invite to join the discussion forum.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Remember I am one person, I have a day job, I need sleep and I'm in Sydney, Australia (UTC+10). So I could be at work or asleep when you most need support. The "),e("strong",[this._v("IMSAI 8080esp Forum")]),this._v(" on the other hand has members located all around the world, in different timezones and with great experience. I highly recommend the forum.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"essential-hardware-functionality-leds-and-toggle-switches"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#essential-hardware-functionality-leds-and-toggle-switches"}},[this._v("#")]),this._v(" Essential hardware functionality (LEDs and Toggle Switches)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"the-hardware-checks-out-you-suspect-it-is-the-software"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-hardware-checks-out-you-suspect-it-is-the-software"}},[this._v("#")]),this._v(" The hardware checks out, you suspect it is the software")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("The troubleshooting outlined here focuses on understanding the messages that are logged to the console by the ESP32 as it boots.\nThe simplest way to see these messages is to")]),t._v(" "),s("ol",[s("li",[t._v("connect the "),s("code",[t._v("ESPP32-PICO-KIT")]),t._v(" to a PC using a suitable USB cable")]),t._v(" "),s("li",[t._v("start a terminal emulator on the PC set for 115200 baud 8N1 connected to the serial device your OS identifies the ESP32 on\n"),s("ul",[s("li",[t._v("Windows will be a COMx: port")]),t._v(" "),s("li",[t._v("OSX will be /dev/tty.SLAB_USBtoUART")]),t._v(" "),s("li",[t._v("Linux will be /dev/tty.USB0 (or similar, TBA)")])])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The level of detail provided by the ESP32 in the console logs can be changed by the "),e("strong",[this._v("NVS_LOG_LEVEL")]),this._v(" bits in the "),e("em",[this._v("startup configuration")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The most informative level to set "),e("strong",[this._v("NVS_LOG_LEVEL")]),this._v(" is "),e("strong",[this._v("INFO")]),this._v(". This is not recommended for normal operation as it is too verbose, but it is recommended for troubleshooting.")])}],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/28.ec99adc6.js b/assets/js/28.ec99adc6.js new file mode 100644 index 0000000..399126f --- /dev/null +++ b/assets/js/28.ec99adc6.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{267:function(t,e,s){"use strict";s.r(e);var a=s(0),r=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),s("p",[t._v("The S-132 requires only minimal configuration to get working.")]),t._v(" "),s("p",[t._v("The majority of features require no configuration to make work. However, the "),s("code",[t._v("boot.conf")]),t._v(" file on the IMSAI8080 or Cromemco Z-1 replica must be edited to enable the TTY: (TTY2: & TTY3: - "),s("em",[t._v("Cromemco Z-1 only")]),t._v(") and VIO: keyboard ("),s("em",[t._v("IMSAI8080 only")]),t._v(") to be recognized as input/output devices by the "),s("router-link",{attrs:{to:"/imsai8080/configure/#sio-2-port-mappings"}},[t._v("HAL in the IMSAI8080")]),t._v(" or the "),s("router-link",{attrs:{to:"/cromemcoZ1/configure/#tu-art-device-mappings"}},[t._v("HAL in the Cromemco Z-1")]),t._v(" respectively.")],1),t._v(" "),s("p",[t._v("The VT100 terminal emulation (VT132), on the other hand, has extensive configuration options. See the "),s("router-link",{attrs:{to:"/vt132/operation/"}},[t._v("VT132 Operation Manual")]),t._v(" for details.")],1),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),s("p",[t._v("The S-132 will perform a hand-shake with the ESP32-PICO-KIT on the replica and you will (may) briefly see the message")]),t._v(" "),t._m(3),s("p",[t._v("displayed in the upper left-hand corner of your VGA monitor. This will rapidly be replaced with the message")]),t._v(" "),t._m(4),s("p",[t._v("and a brief bell tone from the buzzer while the VT100 terminal initializes and retrieves its setting from the NVRAM.")]),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),s("p",[t._v("The S-132 can be powered from the connected IMSAI8080 or Cromemco Z-1 replica. Additional power is not required.")]),t._v(" "),s("p",[t._v("Alteratively, the S-132 can provide power to the connected IMSAI8080 or Cromemco Z-1 replica if you connect a DC power supply via the DC barrel jack on the S-132. In which case you should remove any USB cable providing power to the connected IMSAI8080 or Cromemco Z-1 replica.")]),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),s("p",[t._v("Enable and initialize the S-132")]),t._v(" "),t._m(9),s("p",[t._v("To make the S-132 the first (and only) preference for the TTY: and VIO: devices, use:")]),t._v(" "),t._m(10),s("p",[t._v("To make the S-132 the first preference for the TTY: & VIO: devices and also simultaneously use the Web Desktop devices if connected, use:")]),t._v(" "),t._m(11),s("p",[t._v("To allow the Web Desktop to capture the TTY: and VIO: devices with priority ove the S-132, use:")]),t._v(" "),t._m(12),s("p",[t._v("For more information on the "),s("code",[t._v("boot.conf")]),t._v(" see "),s("router-link",{attrs:{to:"/imsai8080/configure/#sio-2-port-mappings"}},[t._v("HAL configuration for the IMSAI8080")])],1),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),s("p",[t._v("Enable and initialize the S-132")]),t._v(" "),t._m(15),s("p",[t._v("To make the S-132 the first (and only) preference for the TTY: devices, use:")]),t._v(" "),t._m(16),s("p",[t._v("To make the S-132 the first preference for the TTY: devices and also simultaneously use the Web Desktop devices if connected, use:")]),t._v(" "),t._m(17),s("p",[t._v("To allow the Web Desktop to capture the TTY: devices with priority ove the S-132, use:")]),t._v(" "),t._m(18),s("p",[t._v("For more information on the "),s("code",[t._v("boot.conf")]),t._v(" see "),s("router-link",{attrs:{to:"/cromemcoZ1/configure/#tu-art-device-mappings"}},[t._v("HAL configuration for the Cromemco Z-1")])],1),t._v(" "),t._m(19),t._v(" "),s("p",[t._v("T.B.A.")])])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"configuration-draft"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuration-draft"}},[this._v("#")]),this._v(" Configuration (Draft)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"start-up"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#start-up"}},[this._v("#")]),this._v(" Start-up")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("With the S-132 connected to the IMSAI8080 or Cromemco Z-1 replica along with a VGA monitor and suitable keyboard, "),e("a",{attrs:{href:"#power-options"}},[this._v("apply power")]),this._v(" and press the hardware reset on the IMSAI8080 or Cromemco Z-1 replica. As the replica boots it will force the S-132 to reboot.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("Host found\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("Wait\n")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("When you first start the S-132, or after a full firmware re-flash (not an upgrade) "),s("strong",[t._v("it is completely normal")]),t._v(" to see the massage")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("Error\n")])])]),s("p",[t._v("and a long bell tone from the buzzer.")]),t._v(" "),s("p",[t._v("This is the original behavior of the VT100 terminal and indicates that no settings were saved in NVRAM.")]),t._v(" "),s("p",[t._v("To avoid this message and warning tone in future simply go to one of the VT100 menus and save settings to NVRAM.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"power-options"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#power-options"}},[this._v("#")]),this._v(" Power Options")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"configure-the-imsai8080"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configure-the-imsai8080"}},[this._v("#")]),this._v(" Configure the IMSAI8080")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("You must edit the "),e("strong",[this._v("HAL")]),this._v(" settings in the "),e("code",[this._v("boot.conf")]),this._v(" file.\nYou can use the Web Desktop, or mount the µSD card in a PC and edit the "),e("code",[this._v("/imsai/conf/boot.conf")]),this._v(" file directly.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-editorconfig extra-class"},[e("pre",{pre:!0,attrs:{class:"language-editorconfig"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[this._v("### Enable S-132")]),this._v("\n"),e("span",{pre:!0,attrs:{class:"token property"}},[this._v("S132.init")]),e("span",{pre:!0,attrs:{class:"token value string"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[this._v("=")]),this._v("1")]),this._v("\n")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-editorconfig extra-class"},[s("pre",{pre:!0,attrs:{class:"language-editorconfig"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("### SIO-2 default port mappings (HAL)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v("SIO1.portA.device")]),s("span",{pre:!0,attrs:{class:"token value string"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v("S132TTY,WEBTTY,UART0")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v("SIO1.portB.device")]),s("span",{pre:!0,attrs:{class:"token value string"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v("S132VIO,VIOKBD")]),t._v("\n")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-editorconfig extra-class"},[s("pre",{pre:!0,attrs:{class:"language-editorconfig"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("### SIO-2 default port mappings (HAL)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v("SIO1.portA.device")]),s("span",{pre:!0,attrs:{class:"token value string"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v("S132TTY+,WEBTTY,UART0")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v("SIO1.portB.device")]),s("span",{pre:!0,attrs:{class:"token value string"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v("S132VIO+,VIOKBD")]),t._v("\n")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-editorconfig extra-class"},[s("pre",{pre:!0,attrs:{class:"language-editorconfig"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("### SIO-2 default port mappings (HAL)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v("SIO1.portA.device")]),s("span",{pre:!0,attrs:{class:"token value string"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v("WEBTTY,S132TTY,UART0")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v("SIO1.portB.device")]),s("span",{pre:!0,attrs:{class:"token value string"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v("VIOKBD,S132VIO")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"configure-the-cromemco-z-1"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configure-the-cromemco-z-1"}},[this._v("#")]),this._v(" Configure the Cromemco Z-1")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("You must edit the "),e("strong",[this._v("HAL")]),this._v(" settings in the "),e("code",[this._v("boot.conf")]),this._v(" file.\nYou can use the Web Desktop, or mount the µSD card in a PC and edit the "),e("code",[this._v("/cromemco/conf/boot.conf")]),this._v(" file directly.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language-editorconfig extra-class"},[e("pre",{pre:!0,attrs:{class:"language-editorconfig"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[this._v("### Enable S-132")]),this._v("\n"),e("span",{pre:!0,attrs:{class:"token property"}},[this._v("S132.init")]),e("span",{pre:!0,attrs:{class:"token value string"}},[e("span",{pre:!0,attrs:{class:"token punctuation"}},[this._v("=")]),this._v("1")]),this._v("\n")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-editorconfig extra-class"},[s("pre",{pre:!0,attrs:{class:"language-editorconfig"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("### TU-ART default device mappings (HAL)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v("TUART0.deviceA.device")]),s("span",{pre:!0,attrs:{class:"token value string"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v("S132TTY,WEBTTY,MODEM,UART0")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v("TUART1.deviceA.device")]),s("span",{pre:!0,attrs:{class:"token value string"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v("S132TTY2,WEBTTY2,SCKTSRV1,UART1")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v("TUART1.deviceB.device")]),s("span",{pre:!0,attrs:{class:"token value string"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v("S132TTY3,WEBTTY3,SCKTSRV2,UART2")]),t._v("\n")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-editorconfig extra-class"},[s("pre",{pre:!0,attrs:{class:"language-editorconfig"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("### TU-ART default device mappings (HAL)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v("TUART0.deviceA.device")]),s("span",{pre:!0,attrs:{class:"token value string"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v("S132TTY+,WEBTTY,MODEM,UART0")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v("TUART1.deviceA.device")]),s("span",{pre:!0,attrs:{class:"token value string"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v("S132TTY2+,WEBTTY2,SCKTSRV1,UART1")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v("TUART1.deviceB.device")]),s("span",{pre:!0,attrs:{class:"token value string"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v("S132TTY3+,WEBTTY3,SCKTSRV2,UART2")]),t._v("\n")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-editorconfig extra-class"},[s("pre",{pre:!0,attrs:{class:"language-editorconfig"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("### TU-ART default device mappings (HAL)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v("TUART0.deviceA.device")]),s("span",{pre:!0,attrs:{class:"token value string"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v("WEBTTY,S132TTY,MODEM,UART0")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v("TUART1.deviceA.device")]),s("span",{pre:!0,attrs:{class:"token value string"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v("WEBTTY2,S132TTY2,SCKTSRV1,UART1")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token property"}},[t._v("TUART1.deviceB.device")]),s("span",{pre:!0,attrs:{class:"token value string"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),t._v("WEBTTY3,S132TTY3,SCKTSRV2,UART2")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"d-7aio-settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#d-7aio-settings"}},[this._v("#")]),this._v(" D+7AIO Settings")])}],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/29.94ecc810.js b/assets/js/29.94ecc810.js new file mode 100644 index 0000000..0c1a917 --- /dev/null +++ b/assets/js/29.94ecc810.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{268:function(t,e,s){"use strict";s.r(e);var o=s(0),l=Object(o.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),s("p",[t._v("A full install is useful for:")]),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),s("esp-web-install-button",{attrs:{manifest:"/manifests/s132-manifest.json"}})],1)}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"s-132-firmware-install-console-logs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#s-132-firmware-install-console-logs"}},[this._v("#")]),this._v(" S-132 Firmware Install & Console Logs")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"full-install"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#full-install"}},[this._v("#")]),this._v(" Full install")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("initializing a new (blank) "),e("strong",[this._v("ESP32-WROVER")]),this._v(" module for the S-132")]),this._v(" "),e("li",[this._v('returning an S-132 to "factory defaults" based on the latest firmware\n'),e("ul",[e("li",[this._v("ie. this process will clear any values you have previously saved to the NVRAM")])])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("This tool can also be used to view the console log of the ESP32, useful for trouble-shooting")]),t._v(" "),s("p",[t._v("Simply:")]),t._v(" "),s("ul",[s("li",[t._v("click the "),s("strong",[t._v("CONNECT")]),t._v(" button (below)")]),t._v(" "),s("li",[t._v("chose your serial port/device")]),t._v(" "),s("li",[t._v("click on "),s("strong",[t._v("LOGS & CONSOLE")]),t._v(" on the "),s("em",[t._v("Device Dashboard")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("When you click "),e("strong",[this._v("INSTALL THE FULL S-132 IMAGE")]),this._v("\nThis will erase the entire flash on the ESP32 and install\nthe indicated build of the S-132 firmware")]),this._v(" "),e("p",[this._v("It is completely safe, however, you will loose any settings\nyou have saved to NVRAM")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"danger custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("This install process is not suitable for the "),s("strong",[t._v("ESP32-WROVER-E")]),t._v(" module at this time.")]),t._v(" "),s("p",[t._v("If you have an ESP32-WROVER-E you must use the Espressif "),s("code",[t._v("esptool.py")]),t._v(" and "),s("code",[t._v("espefuse.py")]),t._v(" tools to setup and install the firmware to be compatible with the S-132")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"note"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#note"}},[this._v("#")]),this._v(" Note:")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ul",[s("li",[t._v("The "),s("strong",[t._v("DEVICE RESET")]),t._v(" function on the "),s("em",[t._v("LOGS & CONSOLE")]),t._v(" screen does not work with the S-132")]),t._v(" "),s("li",[t._v("When you click "),s("strong",[t._v("INSTALL")]),t._v(" on the "),s("em",[t._v("Confirm Installation")]),t._v(" dialog\n"),s("ul",[s("li",[t._v("it will say "),s("strong",[t._v("Preparing installation")]),t._v(" and wait for the ESP32 to enter "),s("em",[t._v("bootloader")]),t._v(" mode")]),t._v(" "),s("li",[t._v("you will need to manually set the ESP32 into "),s("em",[t._v("bootloader")]),t._v(" mode by:\n"),s("ul",[s("li",[t._v("pressing both the "),s("code",[t._v("Reset")]),t._v(" and "),s("code",[t._v("Prog")]),t._v(" buttons on the S-132, together")]),t._v(" "),s("li",[t._v("release the "),s("code",[t._v("Reset")]),t._v(" button "),s("strong",[t._v("first")]),t._v(", and about 1 second later")]),t._v(" "),s("li",[t._v("release the "),s("code",[t._v("Prog")]),t._v(" button")])])])])]),t._v(" "),s("li",[t._v("If you abort an install by pressing the "),s("code",[t._v(" ")]),t._v(" key on you keyboard you may not be able to reconnect to the ESP32, with a message about the "),s("em",[t._v("serial port is already open")]),t._v(". You will need to "),s("strong",[t._v("reload")]),t._v(" the web page to release the serial port")])])}],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/3.c9e8ee06.js b/assets/js/3.c9e8ee06.js new file mode 100644 index 0000000..59009e7 --- /dev/null +++ b/assets/js/3.c9e8ee06.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{100:function(t,e,s){t.exports=s.p+"assets/img/120mm_Loop_Tape.f771f287.png"},101:function(t,e,s){t.exports=s.p+"assets/img/pcb.e26238bb.jpg"},102:function(t,e,s){t.exports=s.p+"assets/img/M4x30_Hex_Socket_Screw.81055db0.png"},103:function(t,e,s){t.exports=s.p+"assets/img/Spacer_9mm.fb831ed4.png"},104:function(t,e,s){t.exports=s.p+"assets/img/Spacer_6mm.1511a22d.png"},105:function(t,e,s){t.exports=s.p+"assets/img/M4_Hex_Nut_Nylon.75593c57.png"},106:function(t,e,s){t.exports=s.p+"assets/img/M3x12_Machine_Screw.28a68b1d.png"},107:function(t,e,s){t.exports=s.p+"assets/img/M3_Nut.aa4fd012.png"},108:function(t,e,s){t.exports=s.p+"assets/img/aluminium_lid.1b5530e5.jpg"},109:function(t,e,s){t.exports=s.p+"assets/img/front_cover.d318ae0a.jpg"},110:function(t,e,s){t.exports=s.p+"assets/img/switch_surround.c43e3260.jpg"},111:function(t,e,s){t.exports=s.p+"assets/img/new_facia_and_filter.966b5c14.jpg"},112:function(t,e,s){t.exports=s.p+"assets/img/switch_masking_plate.cad18ad5.jpg"},113:function(t,e,s){t.exports=s.p+"assets/img/back_cover.5c12382c.jpg"},114:function(t,e,s){t.exports=s.p+"assets/img/reinforce_top.c040a287.png"},115:function(t,e,s){t.exports=s.p+"assets/img/reinforce_bottom.1eb4b60b.png"},116:function(t,e,s){t.exports=s.p+"assets/img/LED_Spacer_Rocker_Alignment_Tool.a7e72e7f.png"},117:function(t,e,s){t.exports=s.p+"assets/img/LED_Alignment_Tool.099c08ac.png"},258:function(t,e,s){"use strict";s.r(e);var i=[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"bill-of-materials-draft"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#bill-of-materials-draft"}},[this._v("#")]),this._v(" Bill of Materials (Draft)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("I haven't figured out how to set the image sizes in the site tool I am using, so image sizes my vary. To see them in full size you can always right-click on an image and "),e("code",[this._v("Open Image in New Tab")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("Notes on the PCB")]),t._v(" "),s("ul",[s("li",[t._v("There is no resistor R15, it was removed from the design long ago and the resistors were never renumbered")]),t._v(" "),s("li",[t._v("There were 2 silk screen errors on the PCB (v3.4.1, fixed on v3.4.2 and later):\n"),s("ol",[s("li",[t._v("the LED LA14 is incorrectly labeled as LS14")]),t._v(" "),s("li",[t._v("the LED LD0 is labeled on the left of the LED and should be labeled above as per LD1-LD7")])])]),t._v(" "),s("li",[t._v("There is a 5x2 group of through-holes marked "),s("strong",[t._v("Spare")]),t._v(" that nothing gets soldered into")]),t._v(" "),s("li",[t._v("There are two groups of 8x1 through-holes that are unmarked (one above LRN1 and one below RN1) that nothing gets soldered into")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"through-hole-tht-components"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#through-hole-tht-components"}},[this._v("#")]),this._v(" Through Hole (THT) components")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("table",[i("thead",[i("tr",[i("th",[t._v("Part")]),t._v(" "),i("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),i("th",[t._v("PCB")]),t._v(" "),i("th",[t._v("Description")])])]),t._v(" "),i("tbody",[i("tr",[i("td",[i("img",{attrs:{src:s(72),alt:"LED Red 5mm"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("44 (45 packed)")]),t._v(" "),i("td",[t._v("LO0-7, LS0-7, LA0-15, LD0-7, LIE1, LRN1, LWT1, LHT1")]),t._v(" "),i("td",[i("h4",[t._v("LED Red 5mm")]),t._v(" LEDs have polarity, ie. they must be inserted the correct way around to function properly (see assembly guide).")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(73),alt:"Resistor 3K"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("44 (45 packed)")]),t._v(" "),i("td",[t._v("R16-59")]),t._v(" "),i("td",[i("h4",[t._v("Resistor 3K ohm [Orange, Black, Red, Gold]")]),t._v(" One for each LED. The value 3K ohm was selected because it gives a reasonable brightness to the LEDs. If you want super-bright you can go down to 220 ohm. If you want the LEDs to be more dim, you can always substitute a higher value for these resistors.")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(74),alt:"Resistor 10K"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("14 (15 packed)")]),t._v(" "),i("td",[t._v("R1-12,14; R13 (back)")]),t._v(" "),i("td",[i("h4",[t._v("Resistor 10K ohm [Brown, Black, Orange, Gold]")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(75),alt:"Resistor Network 6x10K"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("RN1 (back)")]),t._v(" "),i("td",[i("h4",[t._v("Resistor Network 6x10K ohm")]),t._v(" Pin 1 is indicated on the component by a white dot and on the PCB by the square pad.")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(76),alt:"Capacitor 100nF"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("17 (18 packed)")]),t._v(" "),i("td",[t._v("C1, 3-12, 17; C2, 13-16 (back)")]),t._v(" "),i("td",[i("h4",[t._v("Capacitor 100nF (0.1μF, 104)")]),t._v(" These are the only capacitors in the kit, so all the capacitors have the same value. Keeps it simple.")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(77),alt:"Transistor"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("Q1 (back)")]),t._v(" "),i("td",[i("h4",[t._v("S8050 NPN Transistor (TO-92-3) ")]),t._v(' This component and its associated resistor R13 are optional. They allow the ESP32 to be flashed over USB without removing it from the connectors. They only do something if you add extra "bodge" wires to the ESP32 board and connect these to the Boot->DTR/RTS pins.')])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(78),alt:"74HC595"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("6")]),t._v(" "),i("td",[t._v("U1-6")]),t._v(" "),i("td",[i("h4",[t._v("74HC595")]),t._v(" 8-bit serial in/out Shift Register 3-State Outputs")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(79),alt:"74HC165"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("4")]),t._v(" "),i("td",[t._v("U7-10")]),t._v(" "),i("td",[i("h4",[t._v("74HC165")]),t._v(" Shift Register 8-bit, parallel load")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(80),alt:"MAX3232"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("U11 (back)")]),t._v(" "),i("td",[i("h4",[t._v("MAX3232")]),t._v(" Low-Power, up to 1Mbps, True RS-232 Transceivers Using Four 0.1μF External Capacitors (C13-16)")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(81),alt:"16pin DIP Socket"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("11")]),t._v(" "),i("td",[t._v("(U1-11)")]),t._v(" "),i("td",[i("h4",[t._v("16 pin DIP Socket")]),t._v(" One for each IC, U1-11")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(82),alt:"DE9 Male Socket"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("2")]),t._v(" "),i("td",[t._v("RS232-1,2 (back)")]),t._v(" "),i("td",[i("h4",[t._v("DE9 (DB9) Male Socket")]),t._v(" Currently only RSR232-1 can be used as SIO1, without hardware handshaking . Future work to enable SIO2 &/or hardware handshaking on SIO1.")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(83),alt:"Header 4x2 Male"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("Boot (back)")]),t._v(" "),i("td",[i("h4",[t._v("Header 4x2 Male")]),t._v(" Using the provided shunt-jumpers you can set low level boot options via this header (future, currently not active)")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(84),alt:"Header 8x2 Male"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("2")]),t._v(" "),i("td",[t._v("Patch, Comms (back)")]),t._v(" "),i("td",[i("h4",[t._v("Header 8x2 Male")]),t._v(" Using the provided shunt-jumpers you can configure the RS232 serials comms via these two headers")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(85),alt:"Connector 20x1 Female"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("2")]),t._v(" "),i("td",[t._v("ESP32 (back)")]),t._v(" "),i("td",[i("h4",[t._v("Connector 20x1 Female")]),t._v(" These two connectors form a socket for mounting the ESP32-PICO-KIT board")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(86),alt:"Header 20x1 Male"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td"),t._v(" "),i("td",[i("h4",[t._v("Header 20x1 Male")]),t._v(" This header is not soldered to the PCB. It is supplied for a few uses. 1) A pair of 3 pin headers, cut off and soldered to the unpopulated header pin holes on ESP32 (see assembly guide). 2) An 8 pin header, cut off and used if a uSD daughter card is required to replaced a damaged uSD Card Socket. The remaining pins are spare.")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(87),alt:"Tactile Switch"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("Reset")]),t._v(" "),i("td",[i("h4",[t._v("Tactile Switch SPST-NO")]),t._v(" This reset switch is redundant as the ESP32 has its own reset press-button switch, but I like to have it. It allows the device to be reset by pushing a pencil/pen tip through an air vent hole in the side of the lid, rather than having to look around the back to find the tiny switch on the ESP32")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"surface-mount-device-smd-components"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#surface-mount-device-smd-components"}},[this._v("#")]),this._v(" Surface Mount Device (SMD) components")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("Don't Panic")]),this._v(" "),e("ul",[e("li",[this._v("Yes there are two SMD components!")]),this._v(" "),e("li",[this._v("You can do it!")]),this._v(" "),e("li",[this._v("You can do it with a regular soldering iron, but you are going to need flux (see assembly guide and tools)")])])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("table",[i("thead",[i("tr",[i("th",[t._v("Part")]),t._v(" "),i("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),i("th",[t._v("PCB")]),t._v(" "),i("th",[t._v("Description")])])]),t._v(" "),i("tbody",[i("tr",[i("td",[i("img",{attrs:{src:s(88),alt:"PSRAM"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("U13")]),t._v(" "),i("td",[i("h4",[t._v("PSRAM 64Mb (8M x 8) SPI/ QPI SOP-8_150mil")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(89),alt:"microSD socket"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("uSD Card")]),t._v(" "),i("td",[i("h4",[t._v("microSD Card Socket")])])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"rocker-switches"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#rocker-switches"}},[this._v("#")]),this._v(" Rocker Switches")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("table",[i("thead",[i("tr",[i("th",[t._v("Part")]),t._v(" "),i("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),i("th",[t._v("PCB")]),t._v(" "),i("th",[t._v("Description")])])]),t._v(" "),i("tbody",[i("tr",[i("td",[i("img",{attrs:{src:s(90),alt:"Red Power On-On"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("S1")]),t._v(" "),i("td",[i("h4",[t._v("Red Power Switch (On-On)")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(91),alt:"Blue Rocker Mom-off-Mom"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("3")]),t._v(" "),i("td",[t._v("S2, S4, S6")]),t._v(" "),i("td",[i("h4",[t._v("Blue Rocker (Mom-off-Mom)")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(92),alt:"Red Rocker Mom-off-Mom"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("2")]),t._v(" "),i("td",[t._v("S3, S5")]),t._v(" "),i("td",[i("h4",[t._v("Red Rocker (Mom-off-Mom)")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(93),alt:"Blue Rocker On-On"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("8")]),t._v(" "),i("td",[t._v("SA4-7, SA12-15")]),t._v(" "),i("td",[i("h4",[t._v("Blue Rocker (On-On)")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(94),alt:"Red Rocker On-On"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("8")]),t._v(" "),i("td",[t._v("SA0-3, SA8-11")]),t._v(" "),i("td",[i("h4",[t._v("Red Rocker (On-On)")])])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"miscellaneous-components"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#miscellaneous-components"}},[this._v("#")]),this._v(" Miscellaneous components")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("table",[i("thead",[i("tr",[i("th",[t._v("Part")]),t._v(" "),i("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),i("th",[t._v("PCB")]),t._v(" "),i("th",[t._v("Description")])])]),t._v(" "),i("tbody",[i("tr",[i("td",[i("img",{attrs:{src:s(95),alt:"ESP32_Pico_DevKit"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("ESP32 (back)")]),t._v(" "),i("td",[i("h4",[t._v("ESP32-PICO-KIT v4.1")]),t._v(' Look closely and you will see that 3 of the pinout through-holes on each side are unpopulated (at the end where the antenna is, opposite end to the micro-USB connector). These need to be populated with 0.1" pitch male header pins (provided in the strip of 20 above). These enable the PSRAM, soldered on the PCB, to be accessed by the ESP32.')])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(96),alt:"microSD 16GB Memory_Card"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td"),t._v(" "),i("td",[i("h4",[t._v("microSD 16GB Memory Card")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(97),alt:"Shunt-Jumper"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("8")]),t._v(" "),i("td"),t._v(" "),i("td",[i("h4",[t._v("Shunt-Jumper")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(98),alt:"Test Lead"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td"),t._v(" "),i("td",[i("h4",[t._v("Test lead")]),t._v(" Used to test LEDs during assembly, but not used in the final assembled kit")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(99),alt:"Velcro hook tape"}}),t._v(" "),i("img",{attrs:{src:s(100),alt:"Velcro loop tape"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("120mm x 25mm")]),t._v(" "),i("td"),t._v(" "),i("td",[i("h4",[t._v("Black Velcro adhesive backed hook & loop tape")]),t._v(" Used to mount the Charcoal grey hammer tone painted acrylic switch surround to the Black acrylic LED/switch masking plate.")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(101),alt:"PCB"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td"),t._v(" "),i("td",[i("h4",[t._v("PCB")])])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"mounting-hardware"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mounting-hardware"}},[this._v("#")]),this._v(" Mounting hardware")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("table",[i("thead",[i("tr",[i("th",[t._v("Part")]),t._v(" "),i("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),i("th",[t._v("Description")])])]),t._v(" "),i("tbody",[i("tr",[i("td",[i("img",{attrs:{src:s(102),alt:"M4x30 Hex Socket Screw"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("8")]),t._v(" "),i("td",[i("h4",[t._v("M4x30mm Hex Socket Screw")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(103),alt:"Spacer 8mm"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("8")]),t._v(" "),i("td",[i("h4",[t._v("Spacer 8mm Nylon")]),t._v(" The 8mm spacers fit on the "),i("code",[t._v("M4x30mm Hex Socket Screws")]),t._v(" "),i("strong",[t._v("in front of")]),t._v(" the PCB, between the PCB and the "),i("code",[t._v("3mm Black acrylic LED/switch masking plate")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(104),alt:"Spacer 6mm"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("8")]),t._v(" "),i("td",[i("h4",[t._v("Spacer 6mm Nylon")]),t._v(" The 6mm spacers fit on the "),i("code",[t._v("M4x30mm Hex Socket Screws")]),t._v(" "),i("strong",[t._v("behind")]),t._v(" the PCB, between the PCB and the "),i("code",[t._v("3mm Clear acrylic back cover")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(105),alt:"M4 Hex Nut Nylon"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("8")]),t._v(" "),i("td",[i("h4",[t._v("M4 Hex Nut Nylon")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(106),alt:"M3x12 Machine Screw"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("4")]),t._v(" "),i("td",[i("h4",[t._v("M3x12mm Black Machine Screw")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(107),alt:"M3 Nut"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("4")]),t._v(" "),i("td")]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:s(108),alt:"Blue aluminium lid"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[i("h3",[t._v("NEW")]),i("h4",[t._v(" 3mm Blue aluminium lid")])])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"acrylic-parts"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#acrylic-parts"}},[this._v("#")]),this._v(" Acrylic parts")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Most pieces of acrylic have a protective backing cover (plastic or paper) to protect them from scratching during cutting and transportation. This should be removed before you use them in the assembly of the kit.")]),this._v(" "),e("p",[this._v("If any of the following acrylic parts, especially the clear parts, appear white or any colour other than indicated, it is because they have a protective covering.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("thead",[e("tr",[e("th",[this._v("Part")]),this._v(" "),e("th",{staticStyle:{"text-align":"right"}},[this._v("Quantity")]),this._v(" "),e("th",[this._v("Description")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:s(109),alt:"Clear acrylic front cover"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[e("h4",[this._v("6mm Clear acrylic front cover")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:s(110),alt:"Charcoal grey acrylic switch surround"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[e("h4",[this._v("6mm Charcoal grey hammer tone painted acrylic switch surround")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:s(111),alt:"White text/decals on Black facia over transparent red filter"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[e("h3",[this._v("NEW")]),e("h4",[this._v(" 3.0mm White text/decals on Black facia over a transparent red filter")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:s(112),alt:"Black acrylic LED/switch masking plate"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[e("h4",[this._v("3mm Black acrylic LED/switch masking plate")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:s(113),alt:"Clear acrylic back cover"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[e("h4",[this._v("3mm Clear acrylic back cover")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("td",[e("img",{attrs:{src:s(114),alt:"White acrylic back cover corner reinforcer (Top)"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("td",[e("img",{attrs:{src:s(115),alt:"White acrylic back cover corner reinforcer (Bottom)"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:s(116),alt:"LED Spacer/Switch Alignment guide"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[e("h4",[this._v("2mm Black/White/Clear acrylic LED spacer & switch alignment guide (8 slots)")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("img",{attrs:{src:s(117),alt:"LED alignment guide"}})]),this._v(" "),e("td",{staticStyle:{"text-align":"right"}},[this._v("1")]),this._v(" "),e("td",[e("h4",[this._v("2mm Black/white/Clear acrylic LED alignment guide (8 round holes)")])])])}],a=s(0),r=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),t._m(15),t._v(" "),s("table",[t._m(16),t._v(" "),s("tbody",[t._m(17),t._v(" "),t._m(18),t._v(" "),t._m(19),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),s("tr",[t._m(22),t._v(" "),s("td",{staticStyle:{"text-align":"right"}},[t._v("1+3")]),t._v(" "),s("td",[s("h4",[t._v("2mm White acrylic back cover corner reinforcer (top edge crucifix slots)")]),t._v(" See this "),s("a",{attrs:{href:"https://groups.google.com/g/imsai8080esp/c/9mQPFmFZeEU/m/rFo8j5coAwAJ",target:"_blank",rel:"noopener noreferrer"}},[t._v("forum post"),s("OutboundLink")],1),t._v(" for details")])]),t._v(" "),s("tr",[t._m(23),t._v(" "),s("td",{staticStyle:{"text-align":"right"}},[t._v("4")]),t._v(" "),s("td",[s("h4",[t._v("2mm White acrylic back cover corner reinforcer (bottom side edge crucifix slots)")]),t._v("See this "),s("a",{attrs:{href:"https://groups.google.com/g/imsai8080esp/c/9mQPFmFZeEU/m/rFo8j5coAwAJ",target:"_blank",rel:"noopener noreferrer"}},[t._v("forum post"),s("OutboundLink")],1),t._v(" for details")])]),t._v(" "),t._m(24),t._v(" "),t._m(25)])])])}),i,!1,null,null,null);e.default=r.exports},72:function(t,e,s){t.exports=s.p+"assets/img/LED_Red_5mm.9b866ef4.png"},73:function(t,e,s){t.exports=s.p+"assets/img/Resistor_3Kohm.ee51f38a.png"},74:function(t,e,s){t.exports=s.p+"assets/img/Resistor_10Kohm.ab0ea3fa.png"},75:function(t,e,s){t.exports=s.p+"assets/img/Resistor_Network_6x10Kohm.e9b4ac96.png"},76:function(t,e,s){t.exports=s.p+"assets/img/Capacitor_100nF.b673d2ce.png"},77:function(t,e,s){t.exports=s.p+"assets/img/Transistor.5d3dd83b.png"},78:function(t,e,s){t.exports=s.p+"assets/img/74HC595.910bbc95.png"},79:function(t,e,s){t.exports=s.p+"assets/img/74HC165.3e327548.png"},80:function(t,e,s){t.exports=s.p+"assets/img/MAX3232.4ac4cdea.png"},81:function(t,e,s){t.exports=s.p+"assets/img/16pin_DIP_Socket.639031f8.png"},82:function(t,e,s){t.exports=s.p+"assets/img/DE9_Male_Socket.238a0910.png"},83:function(t,e,s){t.exports=s.p+"assets/img/Header_4x2_Male.973e9024.png"},84:function(t,e,s){t.exports=s.p+"assets/img/Header_8x2_Male.178f008c.png"},85:function(t,e,s){t.exports=s.p+"assets/img/Header_20x1_Female.301fe8c0.png"},86:function(t,e,s){t.exports=s.p+"assets/img/Header_20x1_Male.c42f156f.png"},87:function(t,e,s){t.exports=s.p+"assets/img/Tactile_Switch.cafe48ed.png"},88:function(t,e,s){t.exports=s.p+"assets/img/PSRAM.16734f71.png"},89:function(t,e,s){t.exports=s.p+"assets/img/microSD_socket.f697ee67.png"},90:function(t,e,s){t.exports=s.p+"assets/img/Red_Power_On-On.5390b421.png"},91:function(t,e,s){t.exports=s.p+"assets/img/Blue_Rocker_Mom-off-Mom.834e1c92.png"},92:function(t,e,s){t.exports=s.p+"assets/img/Red_Rocker_Mom-off-Mom.6c1dfbde.png"},93:function(t,e,s){t.exports=s.p+"assets/img/Blue_Rocker_On-On.161c4f84.png"},94:function(t,e,s){t.exports=s.p+"assets/img/Red_Rocker_On-On.a48b36c0.png"},95:function(t,e,s){t.exports=s.p+"assets/img/ESP32_Pico_DevKit.242dd87b.png"},96:function(t,e,s){t.exports=s.p+"assets/img/microSD_16GB_Memory_Card.e2d49301.png"},97:function(t,e,s){t.exports=s.p+"assets/img/Shunt-Jumper.070a497e.png"},98:function(t,e,s){t.exports=s.p+"assets/img/Test_Lead.7f2aa8cf.png"},99:function(t,e,s){t.exports=s.p+"assets/img/120mm_Hook_Tape.1b292f0f.png"}}]); \ No newline at end of file diff --git a/assets/js/30.a5b1fc7f.js b/assets/js/30.a5b1fc7f.js new file mode 100644 index 0000000..c1b2974 --- /dev/null +++ b/assets/js/30.a5b1fc7f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{270:function(t,e,s){"use strict";s.r(e);var a=s(0),i=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),s("p",[t._v("The firmware update process for the S-132 requires you to:")]),t._v(" "),t._m(1),t._v(" "),s("p",[t._v("Follow the 4 steps detailed below to successfully complete the S-132 firmware update.")]),t._v(" "),t._m(2),t._v(" "),s("p",[t._v("The current production firmware can always be found at "),s("a",{attrs:{href:"https://github.com/thehighnibble/s-132/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[t._v("github.com/thehighnibble/s-132/releases/latest"),s("OutboundLink")],1)]),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),s("p",[t._v("When the upload is complete, reboot the host ESP32 and the update will be identified and unpacked.")]),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),s("p",[t._v("If the firmware update is found on the host the the following message will be shown in large, green text on the S-132 display")]),t._v(" "),t._m(11),t._v("\nFollowed by:\n"),t._m(12),t._m(13),t._v(" "),t._m(14),t._v(" "),t._m(15),t._v(" "),t._m(16),t._m(17),t._v(" "),t._m(18),s("p",[t._v("The firmware update process is now complete and the update file will be deleted from the host.")]),t._v(" "),t._m(19),t._v(" "),t._m(20)])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"s-132-firmware-update-guide"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#s-132-firmware-update-guide"}},[this._v("#")]),this._v(" S-132 Firmware Update Guide")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("first download and copy the firmware update file to your IMSAI8080 or Cromemco Z-1 emulator")]),this._v(" "),e("li",[this._v("then start the firmware update process on the S-132 itself")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"download-the-update-file-from-github"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#download-the-update-file-from-github"}},[this._v("#")]),this._v(" Download the update file from GitHub")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Download the "),e("code",[this._v("update.bin")]),this._v(" file, listed under "),e("em",[this._v("Assets")]),this._v(" at the bottom of the release notes, to your local computer")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"copy-the-update-file-to-the-host-imsai8080-or-cromemco-z-1"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#copy-the-update-file-to-the-host-imsai8080-or-cromemco-z-1"}},[this._v("#")]),this._v(" Copy the update file to the host (IMSAI8080 or Cromemco Z-1)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Now you can now simply drag-and-drop the "),e("code",[this._v("update.bin")]),this._v(" file onto the "),e("strong",[this._v("SYS:")]),this._v(" icon on the (Web) desktop GUI of your emulator (IMSAI8080 or Cromemco Z-1)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"reset-the-host-imsaio8080-or-cromemco-z-1"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#reset-the-host-imsaio8080-or-cromemco-z-1"}},[this._v("#")]),this._v(" Reset the host (IMSAIO8080 or Cromemco Z-1)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Your IMSAI8080 or Cromemco Z-1 will take longer to startup than usual while it unpacks the update file.")]),this._v(" "),e("p",[this._v("You can optionally watch the output on the boot console (typically via USB port @ 115200 8N1) to see the process proceed.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"start-the-flash-f-w-process-on-the-s-132"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#start-the-flash-f-w-process-on-the-s-132"}},[this._v("#")]),this._v(" Start the "),e("em",[this._v("Flash F/W")]),this._v(" process on the S-132")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("p",[t._v("Now on the "),s("strong",[t._v("S-132")]),t._v(", open the "),s("em",[t._v("System Menu")]),t._v(" ("),s("strong",[t._v("SYS:")]),t._v(") with the key combination "),s("code",[t._v(" ")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Goto the "),e("code",[this._v("S-132 > Flash F/W")]),this._v(" menu selection and press "),e("code",[this._v(" ")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language- extra-class"},[e("pre",{staticClass:"language-text"},[e("span",{staticClass:"line-number",staticStyle:{color:"limegreen","font-size":"1.7em"}},[this._v("S-132 Firmware update available")]),this._v("\n")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("Press on the S-132 to begin\n")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("At this point you have 5 (five) seconds to find and press the "),s("code",[t._v("Prog")]),t._v(" button on the top edge of the S-132 PCB to continue with the firmware update")]),t._v(" "),s("p",[t._v("If you wait for more than the 5 (five) seconds the update process will end and you will return to the "),s("em",[t._v("System Menu")]),t._v(" ("),s("strong",[t._v("SYS:")]),t._v(")")]),t._v(" "),s("p",[t._v("This is not a problem, just repeat this step and the firmware update will still be there and available on the host")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("If the firmware update is not found on the host system (see steps above) then the following warning message will be shown in large, yellow text on the S-132 display")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{staticClass:"language-text"},[s("span",{staticClass:"line-number",staticStyle:{color:"yellow","font-size":"1.7em"}},[t._v("S-132 Firmware update not present")]),t._v("\n")])]),t._v(" "),s("p",[t._v("Return to the steps above and re-attempt to copy the firmware update to the host system")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("After you press the "),e("code",[this._v(" ")]),this._v(" button on the top edge of the S-132 PCB, the firmware will download from the host and be flashed onto the S-132 during which you will see a message like:")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v(" Pressed\nApplication image found- expecting 1152624 bytes\nFirmware update to S-132 V1.7.0 built Aug 26 2024\nUpdating partition: app1\nBytes remaining: 1152624\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("code",[this._v("Bytes remaining:")]),this._v(" will count down as the download/flash proceeds, and when it reaches "),e("code",[this._v("0")]),this._v(" (zero) it will be followed by the message:")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("Firmware update complete\nPress on the S-132 to restart\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The S-132 will nolonger respond to keyboard input but will wait for you to press the "),e("code",[this._v(" ")]),this._v(" button on the top edge of the S-132 PCB.")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("If any message other than "),s("code",[t._v("Firmware update complete")]),t._v(" is displayed, it should indicate what went wrong.")]),t._v(" "),s("p",[t._v("Typically this is because of a fault when verifying the firmware update file, or a fault in flashing the new firmware to the ESP32 on the S-132.")]),t._v(" "),s("p",[t._v("Either way, you will need to begin the firmare update procedure from the beginnng.")]),t._v(" "),s("p",[t._v('It is highly unlikely that a fault at this stage can "brick" your S-132, as the ESP32 firmware update process uses 2 individual slots for firmware and only swiches to the new slot after a successful firmware update. When a firmware update fails, the ESP32 will contine to boot from the last successful firmware loaded.')])])}],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/31.6b6ed39c.js b/assets/js/31.6b6ed39c.js new file mode 100644 index 0000000..550a453 --- /dev/null +++ b/assets/js/31.6b6ed39c.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{273:function(t,e,s){"use strict";s.r(e);var i=s(0),o=Object(i.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),s("p",[t._v("A full install is useful for:")]),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),s("esp-web-install-button",{attrs:{manifest:"/manifests/vt132-manifest.json"}})],1)}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"vt132-firmware-install-console-logs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#vt132-firmware-install-console-logs"}},[this._v("#")]),this._v(" VT132 Firmware Install & Console Logs")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"full-install"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#full-install"}},[this._v("#")]),this._v(" Full install")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("initializing a new (blank) "),e("strong",[this._v("ESP32-WROVER")]),this._v(" module for the VT132")]),this._v(" "),e("li",[this._v('returning a VT132 to "factory defaults" based on the latest firmware\n'),e("ul",[e("li",[this._v("ie. this process will clear any values you have previously saved to the NVRAM including Wi-Fi network details.")])])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("This tool can also be used to view the console log of the ESP32, useful for trouble-shooting")]),t._v(" "),s("p",[t._v("Simply:")]),t._v(" "),s("ul",[s("li",[t._v("click the "),s("strong",[t._v("CONNECT")]),t._v(" button (below)")]),t._v(" "),s("li",[t._v("chose your serial port/device")]),t._v(" "),s("li",[t._v("click on "),s("strong",[t._v("LOGS & CONSOLE")]),t._v(" on the "),s("em",[t._v("Device Dashboard")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("When you click "),e("strong",[this._v("INSTALL THE FULL VT132 IMAGE")]),this._v("\nThis will erase the entire flash on the ESP32 and install\nthe indicated build of the VT132 firmware")]),this._v(" "),e("p",[this._v("It is completely safe, however, you will loose any settings\nyou have saved to NVRAM including Wi-Fi network details.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"danger custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("This install process is not suitable for the "),s("strong",[t._v("ESP32-WROVER-E")]),t._v(" module at this time.")]),t._v(" "),s("p",[t._v("If you have an ESP32-WROVER-E you must use the Espressif "),s("code",[t._v("esptool.py")]),t._v(" and "),s("code",[t._v("espefuse.py")]),t._v(" tools to setup and install the firmware to be compatible with the VT132")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"note"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#note"}},[this._v("#")]),this._v(" Note:")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ul",[s("li",[t._v("The "),s("strong",[t._v("DEVICE RESET")]),t._v(" function on the "),s("em",[t._v("LOGS & CONSOLE")]),t._v(" screen does not work with the VT132")]),t._v(" "),s("li",[t._v("When you click "),s("strong",[t._v("INSTALL")]),t._v(" on the "),s("em",[t._v("Confirm Installation")]),t._v(" dialog\n"),s("ul",[s("li",[t._v("it will say "),s("strong",[t._v("Preparing installation")]),t._v(" and wait for the ESP32 to enter "),s("em",[t._v("bootloader")]),t._v(" mode")]),t._v(" "),s("li",[t._v("you will need to manually set the ESP32 into "),s("em",[t._v("bootloader")]),t._v(" mode by:\n"),s("ul",[s("li",[t._v("pressing both the "),s("code",[t._v("Reset")]),t._v(" and "),s("code",[t._v("Prog")]),t._v(" buttons on the VT132, together")]),t._v(" "),s("li",[t._v("release the "),s("code",[t._v("Reset")]),t._v(" button "),s("strong",[t._v("first")]),t._v(", and about 1 second later")]),t._v(" "),s("li",[t._v("release the "),s("code",[t._v("Prog")]),t._v(" button")])])])])]),t._v(" "),s("li",[t._v("If you abort an install by pressing the "),s("code",[t._v(" ")]),t._v(" key on you keyboard you may not be able to reconnect to the ESP32, with a message about the "),s("em",[t._v("serial port is already open")]),t._v(". You will need to "),s("strong",[t._v("reload")]),t._v(" the web page to release the serial port")])])}],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/32.8285d7d9.js b/assets/js/32.8285d7d9.js new file mode 100644 index 0000000..5184e14 --- /dev/null +++ b/assets/js/32.8285d7d9.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{282:function(t,e,_){"use strict";_.r(e);var v=_(0),r=Object(v.a)({},(function(){var t=this,e=t.$createElement,_=t._self._c||e;return _("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),_("p",[t._v("The VT132 faithfully implements almost all of the features of the original Digital Equipment Corporation (DEC) VT100, with the Advanced Video Option installed.")]),t._v(" "),_("p",[t._v("To this a range of enhancements have been added")]),t._v(" "),t._m(2),t._v(" "),_("p",[t._v("A good reference for an owner of a VT100 (especially getting started with the Setup screens) is the original "),_("a",{attrs:{href:"https://vt100.net/docs/vt100-ug/contents.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("VT100 Users Guide"),_("OutboundLink")],1),t._v(" over at "),_("a",{attrs:{href:"https://vt100.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("VT100.net"),_("OutboundLink")],1),t._v(". Details of what the "),_("a",{attrs:{href:"https://vt100.net/docs/vt100-ug/chapter4.html#S4.1",target:"_blank",rel:"noopener noreferrer"}},[t._v("Advanced Video Option"),_("OutboundLink")],1),t._v(" adds can be found here also.")]),t._v(" "),_("p",[t._v("The remainder of this section will largely focus on where the VT132 implementation of the VT100 differs to an original VT100.")]),t._v(" "),t._m(3),t._v(" "),_("h2",{attrs:{id:"the-keyboard"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#the-keyboard"}},[t._v("#")]),t._v(" "),_("a",{attrs:{href:"https://www.vt100.net/docs/vt100-ug/chapter3.html#S3.1",target:"_blank",rel:"noopener noreferrer"}},[t._v("The Keyboard"),_("OutboundLink")],1)]),t._v(" "),t._m(4),t._v(" "),_("p",[t._v("The original VT100 keyboard had 7 LED indicators, the VT132 does not.")]),t._v(" "),_("p",[t._v("On the VT132:")]),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),_("h2",{attrs:{id:"communications-protocols"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#communications-protocols"}},[t._v("#")]),t._v(" "),_("a",{attrs:{href:"https://www.vt100.net/docs/vt100-ug/chapter3.html#S3.2",target:"_blank",rel:"noopener noreferrer"}},[t._v("Communications Protocols"),_("OutboundLink")],1)]),t._v(" "),t._m(12),t._v(" "),t._m(13),t._v(" "),_("h2",{attrs:{id:"terminal-control-commands"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#terminal-control-commands"}},[t._v("#")]),t._v(" "),_("a",{attrs:{href:"https://www.vt100.net/docs/vt100-ug/chapter3.html#S3.3",target:"_blank",rel:"noopener noreferrer"}},[t._v("Terminal Control Commands"),_("OutboundLink")],1)]),t._v(" "),t._m(14),t._v(" "),_("p",[t._v("The following table details the control characters the VT132 responds to.")]),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),_("div",{staticClass:"tip custom-block"},[_("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),t._m(17),t._v(" "),t._m(18),t._v(" "),_("p",[t._v("In this mode only the "),_("em",[t._v("Control Characters")]),t._v(" listed above with "),_("em",[t._v("Yes")]),t._v(" in the "),_("strong",[t._v("ANSI.SYS")]),t._v(" column are considered "),_("em",[t._v("non-printable")]),t._v(".\nAll other "),_("em",[t._v("Control Characters")]),t._v(" "),_("strong",[t._v("will be")]),t._v(" output to the terminal, showing the corresponding glyph from the currently selected font. This is designed to allow a greater range of the "),_("a",{attrs:{href:"https://en.wikipedia.org/wiki/Code_page_437#Character_set",target:"_blank",rel:"noopener noreferrer"}},[t._v("CP437"),_("OutboundLink")],1),t._v(" character set to be output to the terminal and many of these glyphs are used in BBSs to display extra symbols and also in ANSI art.")])]),t._v(" "),t._m(19),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),t._m(22),t._v(" "),t._m(23),t._v(" "),t._m(24),t._v(" "),t._m(25),t._v(" "),_("p",[t._v("TBA")]),t._v(" "),t._m(26),t._v(" "),t._m(27),t._v(" "),t._m(28),t._v(" "),t._m(29),t._v(" "),t._m(30),t._v(" "),t._m(31)])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"vt100-enhanced-programmer-information-draft"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#vt100-enhanced-programmer-information-draft"}},[this._v("#")]),this._v(" VT100 (enhanced) Programmer Information (Draft)")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"background"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#background"}},[this._v("#")]),this._v(" Background")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("many are features of later DEC VT family terminals that have been implemented for convenience")]),this._v(" "),e("li",[this._v('some are features of "standard" ANSI terminals (mainly IBM PC/MS DOS based terminal emulators)')]),this._v(" "),e("li",[this._v("enhancements are highlighted by the addition of "),e("em",[this._v("(enhancement)")]),this._v(" to the heading or description")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Each heading is a link to the corresponding section of Chapter 3 of the original VT100 Users Guide")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"led-indicators"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#led-indicators"}},[this._v("#")]),this._v(" LED Indicators")])},function(){var t=this,e=t.$createElement,_=t._self._c||e;return _("ul",[_("li",[t._v("The "),_("em",[t._v("ON-LINE/LOCAL")]),t._v(" status is indicated on each "),_("strong",[t._v("Setup screen")]),t._v(" in the top right-hand corner as either "),_("code",[t._v("ONLINE")]),t._v(" or "),_("code",[t._v("LOCAL")]),t._v(" and also in the "),_("strong",[t._v("Quick Menu")]),t._v(", on the root menu, by the checkbox item "),_("code",[t._v("[X]On-line")]),t._v(" for "),_("em",[t._v("ON-LINE")]),t._v(" and "),_("code",[t._v("[ ]On-line")]),t._v(" for "),_("em",[t._v("LOCAL")]),t._v(".")]),t._v(" "),_("li",[t._v('There is no support for the "keyboard locked" condition.')]),t._v(" "),_("li",[t._v("The four remaining, programmable LEDs are represented as follows:\n"),_("ul",[_("li",[t._v("L1, L2 and L3 are mapped to the 3 PC keyboard LEDs for "),_("code",[t._v(" ")]),t._v(", "),_("code",[t._v(" ")]),t._v(" and "),_("code",[t._v(" ")]),t._v(" (if present)\n"),_("ul",[_("li",[t._v("Sending an escape sequence to turn on/off any of L1, L2 or L3 will change the corresponding LED on the keyboard")]),t._v(" "),_("li",[t._v("Pressing one of the 3 key-lock keys "),_("code",[t._v(" ")]),t._v(", "),_("code",[t._v(" ")]),t._v(" and "),_("code",[t._v(" ")]),t._v(" will override the value displayed for L1, L2 or L3")])])]),t._v(" "),_("li",[t._v("L4 is not mapped to anything is so is not visible")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"set-up"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#set-up"}},[this._v("#")]),this._v(" SET-UP")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("code",[this._v("SET-UP")]),this._v(" key is mapped to "),e("code",[this._v(" ")]),this._v(" or "),e("code",[this._v(" ")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"no-scroll"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#no-scroll"}},[this._v("#")]),this._v(" NO SCROLL")])},function(){var t=this,e=t.$createElement,_=t._self._c||e;return _("p",[t._v("The "),_("code",[t._v("NO SCROLL")]),t._v(" key is mapped to the "),_("code",[t._v(" ")]),t._v(" key on a PC keyboard and is equivalent to pressing "),_("code",[t._v(" ")]),t._v(" and "),_("code",[t._v(" ")]),t._v(" alternatively.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"break"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#break"}},[this._v("#")]),this._v(" BREAK")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("code",[this._v("BREAK")]),this._v(" key function "),e("strong",[this._v("is not implemented")]),this._v(" by the VT132.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"full-duplex"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#full-duplex"}},[this._v("#")]),this._v(" Full Duplex")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The VT132 supports baud rates from 300 to 115200 and the Transmit and Receive speed must be the same. The available speeds are "),e("code",[this._v("300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200")]),this._v(" corresponding to the speeds supported by most serial interface cards based on the available clock settings.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"control-characters"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#control-characters"}},[this._v("#")]),this._v(" Control Characters")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("There are two columns indicating whether the control character action is implemented, one for "),e("strong",[this._v("VT100")]),this._v(" mode and one for "),e("strong",[this._v("ANSI.SYS compliance")]),this._v(" mode as the set of control characters differs depending on the current mode.")])},function(){var t=this,e=t.$createElement,_=t._self._c||e;return _("table",[_("thead",[_("tr",[_("th",[t._v("Control Character")]),t._v(" "),_("th",[t._v("Octal Code")]),t._v(" "),_("th",[t._v("Hex Code")]),t._v(" "),_("th",[t._v("Action Taken")]),t._v(" "),_("th",[t._v("VT100")]),t._v(" "),_("th",[t._v("ANSI.SYS")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("NUL")]),t._v(" "),_("td",[t._v("000")]),t._v(" "),_("td",[t._v("0x00")]),t._v(" "),_("td",[t._v("Ignored on input")]),t._v(" "),_("td",[t._v("No")]),t._v(" "),_("td",[t._v("No")])]),t._v(" "),_("tr",[_("td",[t._v("ENQ")]),t._v(" "),_("td",[t._v("005")]),t._v(" "),_("td",[t._v("0x05")]),t._v(" "),_("td",[t._v("Transmit answer-back message")]),t._v(" "),_("td",[t._v("Yes")]),t._v(" "),_("td",[t._v("No")])]),t._v(" "),_("tr",[_("td",[t._v("BEL")]),t._v(" "),_("td",[t._v("007")]),t._v(" "),_("td",[t._v("0x07")]),t._v(" "),_("td",[t._v("Sound bell tone from buzzer")]),t._v(" "),_("td",[t._v("Yes")]),t._v(" "),_("td",[t._v("Yes")])]),t._v(" "),_("tr",[_("td",[t._v("BS")]),t._v(" "),_("td",[t._v("010")]),t._v(" "),_("td",[t._v("0x08")]),t._v(" "),_("td",[t._v("Move the cursor to the left one character position, unless it is at the left margin, in which case no action occurs")]),t._v(" "),_("td",[t._v("Yes")]),t._v(" "),_("td",[t._v("Yes")])]),t._v(" "),_("tr",[_("td",[t._v("HT")]),t._v(" "),_("td",[t._v("011")]),t._v(" "),_("td",[t._v("0x09")]),t._v(" "),_("td",[t._v("Move the cursor to the next tab stop, or to the right margin if no further tab stops are present on the line")]),t._v(" "),_("td",[t._v("Yes")]),t._v(" "),_("td",[t._v("Yes")])]),t._v(" "),_("tr",[_("td",[t._v("LF")]),t._v(" "),_("td",[t._v("012")]),t._v(" "),_("td",[t._v("0x0A")]),t._v(" "),_("td",[t._v("This code causes a line feed or a new line operation. (See new line mode).")]),t._v(" "),_("td",[t._v("Yes")]),t._v(" "),_("td",[t._v("Yes")])]),t._v(" "),_("tr",[_("td",[t._v("VT")]),t._v(" "),_("td",[t._v("013")]),t._v(" "),_("td",[t._v("0x0B")]),t._v(" "),_("td",[t._v("Interpreted as "),_("strong",[t._v("LF")]),t._v(" - TBA")]),t._v(" "),_("td",[t._v("Yes")]),t._v(" "),_("td",[t._v("Yes")])]),t._v(" "),_("tr",[_("td",[t._v("FF")]),t._v(" "),_("td",[t._v("014")]),t._v(" "),_("td",[t._v("0x0C")]),t._v(" "),_("td",[t._v("Interpreted same as "),_("strong",[t._v("VT")])]),t._v(" "),_("td",[t._v("Yes")]),t._v(" "),_("td",[t._v("Yes")])]),t._v(" "),_("tr",[_("td",[t._v("CR")]),t._v(" "),_("td",[t._v("015")]),t._v(" "),_("td",[t._v("0x0D")]),t._v(" "),_("td",[t._v("Move cursor to the left margin on the current line")]),t._v(" "),_("td",[t._v("Yes")]),t._v(" "),_("td",[t._v("Yes")])]),t._v(" "),_("tr",[_("td",[t._v("SO")]),t._v(" "),_("td",[t._v("016")]),t._v(" "),_("td",[t._v("0x0E")]),t._v(" "),_("td",[t._v("Invoke G1 character set, as designated by "),_("strong",[t._v("SCS")]),t._v(" control sequence.")]),t._v(" "),_("td",[t._v("Yes")]),t._v(" "),_("td",[t._v("No")])]),t._v(" "),_("tr",[_("td",[t._v("SI")]),t._v(" "),_("td",[t._v("017")]),t._v(" "),_("td",[t._v("0x0F")]),t._v(" "),_("td",[t._v("Select G0 character set, as selected by "),_("code",[t._v("ESC (")]),t._v(" sequence")]),t._v(" "),_("td",[t._v("Yes")]),t._v(" "),_("td",[t._v("No")])]),t._v(" "),_("tr",[_("td",[t._v("XON")]),t._v(" "),_("td",[t._v("021")]),t._v(" "),_("td",[t._v("0x11")]),t._v(" "),_("td",[t._v("Causes terminal to resume transmission")]),t._v(" "),_("td",[t._v("Yes")]),t._v(" "),_("td",[t._v("Yes")])]),t._v(" "),_("tr",[_("td",[t._v("XOFF")]),t._v(" "),_("td",[t._v("023")]),t._v(" "),_("td",[t._v("0x13")]),t._v(" "),_("td",[t._v("Causes terminal to stop transmitted all codes except "),_("strong",[t._v("XOFF")]),t._v(" and "),_("strong",[t._v("XON")])]),t._v(" "),_("td",[t._v("Yes")]),t._v(" "),_("td",[t._v("Yes")])]),t._v(" "),_("tr",[_("td",[t._v("SUB")]),t._v(" "),_("td",[t._v("030")]),t._v(" "),_("td",[t._v("0x18")]),t._v(" "),_("td",[t._v("Not implemented")]),t._v(" "),_("td",[t._v("No")]),t._v(" "),_("td",[t._v("No")])]),t._v(" "),_("tr",[_("td",[t._v("CAN")]),t._v(" "),_("td",[t._v("032")]),t._v(" "),_("td",[t._v("0x1A")]),t._v(" "),_("td",[t._v("Not implemented")]),t._v(" "),_("td",[t._v("No")]),t._v(" "),_("td",[t._v("No")])]),t._v(" "),_("tr",[_("td",[t._v("ESC")]),t._v(" "),_("td",[t._v("033")]),t._v(" "),_("td",[t._v("0x1B")]),t._v(" "),_("td",[t._v("Invokes a control sequence")]),t._v(" "),_("td",[t._v("Yes")]),t._v(" "),_("td",[t._v("Yes")])]),t._v(" "),_("tr",[_("td",[t._v("DEL")]),t._v(" "),_("td",[t._v("177")]),t._v(" "),_("td",[t._v("0x7F")]),t._v(" "),_("td",[t._v("Ignored on input")]),t._v(" "),_("td",[t._v("Yes")]),t._v(" "),_("td",[t._v("Yes")])])])])},function(){var t=this,e=t.$createElement,_=t._self._c||e;return _("p",[_("em",[t._v("Control Characters")]),t._v(" in the ranges named "),_("strong",[t._v("C0")]),t._v(" (0x00-0x1F) and "),_("strong",[t._v("C1")]),t._v(" (0x80-0x9F) are normally considered "),_("em",[t._v("non-printable")]),t._v(" characters.\nThis is true for the VT100 (and all terminal personalities included in the VT132).")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("strong",[this._v("The exception is when ANSI.SYS compliance is enabled.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"control-sequences"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#control-sequences"}},[this._v("#")]),this._v(" Control Sequences")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The following tables of "),e("em",[this._v("Control Sequences")]),this._v(" are grouped into 4 categories:")])},function(){var t=this,e=t.$createElement,_=t._self._c||e;return _("ul",[_("li",[_("a",{attrs:{href:"#original-vt100-control-sequences"}},[t._v("Original VT100 Control Sequences")])]),t._v(" "),_("li",[_("a",{attrs:{href:"#additional-control-sequences"}},[t._v("Additional Control Sequences")]),t._v(" from later models of VT family terminals")]),t._v(" "),_("li",[_("a",{attrs:{href:"#ansi-sys-control-sequences"}},[t._v("ANSI.SYS Control Sequences")]),t._v(" specific to ANSI.SYS support")]),t._v(" "),_("li",[_("a",{attrs:{href:"#original-vt52-control-sequences"}},[t._v("Original VT52 Control Sequences")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"original-vt100-control-sequences"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#original-vt100-control-sequences"}},[this._v("#")]),this._v(" Original VT100 Control Sequences")])},function(){var t=this,e=t.$createElement,_=t._self._c||e;return _("table",[_("thead",[_("tr",[_("th",[t._v("Control Sequence")]),t._v(" "),_("th",[t._v("Name")]),t._v(" "),_("th",[t._v("Action Taken")]),t._v(" "),_("th",[t._v("Default Value")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[_("code",[t._v("ESC [ Pn ; Pn R")])]),t._v(" "),_("td",[_("em",[t._v("CPR")])]),t._v(" "),_("td",[_("em",[t._v("Cursor Position Report")]),_("br"),t._v("Response to DSR")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ Pn D")])]),t._v(" "),_("td",[t._v("CUB")]),t._v(" "),_("td",[t._v("Cursor Backward")]),t._v(" "),_("td",[t._v("1")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ Pn B")])]),t._v(" "),_("td",[t._v("CUD")]),t._v(" "),_("td",[t._v("Cursor Down")]),t._v(" "),_("td",[t._v("1")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ Pn C")])]),t._v(" "),_("td",[t._v("CUF")]),t._v(" "),_("td",[t._v("Cursor Forward")]),t._v(" "),_("td",[t._v("1")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ Pn ; Pn H")])]),t._v(" "),_("td",[t._v("CUP")]),t._v(" "),_("td",[t._v("Cursor Position")]),t._v(" "),_("td",[t._v("1")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ Pn A")])]),t._v(" "),_("td",[t._v("CUU")]),t._v(" "),_("td",[t._v("Cursor Up")]),t._v(" "),_("td",[t._v("1")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ Pn c")])]),t._v(" "),_("td",[t._v("DA")]),t._v(" "),_("td",[t._v("Device Attributes")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ ? 1 ; Pn c")])]),t._v(" "),_("td",[_("em",[t._v("DA")])]),t._v(" "),_("td",[_("em",[t._v("Device Attributes response")]),_("br"),t._v("Hardcoded to:"),_("br"),_("code",[t._v("Esc [ ? 64 ; 1 ; 6 ; 22 c")])]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC # 8")])]),t._v(" "),_("td",[t._v("DECALN")]),t._v(" "),_("td",[t._v("Screen Alignment Display")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ ? 2 l")])]),t._v(" "),_("td",[t._v("DECANM")]),t._v(" "),_("td",[t._v("ANSI/VT52 Mode")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ ? 8 h/l")])]),t._v(" "),_("td",[t._v("DECARM")]),t._v(" "),_("td",[t._v("Auto Repeat Mode")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ ? 7 h/l")])]),t._v(" "),_("td",[t._v("DECAWM")]),t._v(" "),_("td",[t._v("Auto-wrap Mode")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ ? 1 h/l")])]),t._v(" "),_("td",[t._v("DECCKM")]),t._v(" "),_("td",[t._v("Cursor Keys Mode")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ ? 3 h/l")])]),t._v(" "),_("td",[t._v("DECCOLM")]),t._v(" "),_("td",[t._v("132/80 Column Mode")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC # 3")])]),t._v(" "),_("td",[t._v("DECDHL")]),t._v(" "),_("td",[t._v("Double Height Line -Top Half")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC # 4")])]),t._v(" "),_("td",[t._v("DECDHL")]),t._v(" "),_("td",[t._v("Double Height Line - Bottom Half")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC # 6")])]),t._v(" "),_("td",[t._v("DECDWL")]),t._v(" "),_("td",[t._v("Double Width Line")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC Z")])]),t._v(" "),_("td",[t._v("DECID")]),t._v(" "),_("td",[t._v("Identify Terminal")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ ? 9 h/l")])]),t._v(" "),_("td",[t._v("DECINLM")]),t._v(" "),_("td",[t._v("Interlace Mode"),_("br"),_("em",[t._v("480/240 scan lines")])]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC =")])]),t._v(" "),_("td",[t._v("DECKPAM")]),t._v(" "),_("td",[t._v("Keypad Application Mode")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC >")])]),t._v(" "),_("td",[t._v("DECKPNM")]),t._v(" "),_("td",[t._v("Keypad Numeric Mode")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ Ps q")])]),t._v(" "),_("td",[t._v("DECLL")]),t._v(" "),_("td",[t._v("Load LEDS")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ ? 6 h/l")])]),t._v(" "),_("td",[t._v("DECOM")]),t._v(" "),_("td",[t._v("Origin Mode")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC 8")])]),t._v(" "),_("td",[t._v("DECRC")]),t._v(" "),_("td",[t._v("Restore Cursor"),_("br"),_("em",[t._v("Paired with DECSC")])]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [; ... x")])]),t._v(" "),_("td",[t._v("DECREPTPARM")]),t._v(" "),_("td",[t._v("Report Terminal Parameters"),_("br"),_("strong",[t._v("NOT IMPLEMENTED")])]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ x")])]),t._v(" "),_("td",[t._v("DECREQTPARM")]),t._v(" "),_("td",[t._v("Request Terminal Parameters"),_("br"),_("strong",[t._v("NOT IMPLEMENTED")])]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC 7")])]),t._v(" "),_("td",[t._v("DECSC")]),t._v(" "),_("td",[t._v("Save Cursor"),_("br"),_("em",[t._v("Paired with DECRC")])]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ ? 4 h/l")])]),t._v(" "),_("td",[t._v("DECSCLM")]),t._v(" "),_("td",[t._v("Scrolling Mode"),_("br"),_("em",[t._v("Smooth/Jump scrolling")])]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ ? 5 h/l")])]),t._v(" "),_("td",[t._v("DECSCNM")]),t._v(" "),_("td",[t._v("Screen Mode"),_("br"),_("em",[t._v("Reverse/Normal")])]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ Pn; Pn r")])]),t._v(" "),_("td",[t._v("DECSTBM")]),t._v(" "),_("td",[t._v("Set Top and Bottom Margins"),_("br"),_("em",[t._v("Minimum 2 lines")])]),t._v(" "),_("td",[t._v("whole screen")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC # 5")])]),t._v(" "),_("td",[t._v("DECSWL")]),t._v(" "),_("td",[t._v("Single-width Line")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ 2 ; Ps y")])]),t._v(" "),_("td",[t._v("DECTST")]),t._v(" "),_("td",[t._v("Invoke Confidence Test"),_("br"),_("strong",[t._v("NOT IMPLEMENTED")])]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ Ps n")])]),t._v(" "),_("td",[t._v("DSR")]),t._v(" "),_("td",[t._v("Device Status Report")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ Ps J")])]),t._v(" "),_("td",[t._v("ED")]),t._v(" "),_("td",[t._v("Erase In Display")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ Ps K")])]),t._v(" "),_("td",[t._v("EL")]),t._v(" "),_("td",[t._v("Erase In Line")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC H")])]),t._v(" "),_("td",[t._v("HTS")]),t._v(" "),_("td",[t._v("Horizontal Tabulation Set")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ Pn ; Pn f")])]),t._v(" "),_("td",[t._v("HVP")]),t._v(" "),_("td",[t._v("Horizontal and Vertical Position")]),t._v(" "),_("td",[t._v("1")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC D")])]),t._v(" "),_("td",[t._v("IND")]),t._v(" "),_("td",[t._v("Index")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ 20 h/l")])]),t._v(" "),_("td",[t._v("LNM")]),t._v(" "),_("td",[t._v("Line Feed/New Line Mode")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC E")])]),t._v(" "),_("td",[t._v("NEL")]),t._v(" "),_("td",[t._v("Next Line")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC M")])]),t._v(" "),_("td",[t._v("RI")]),t._v(" "),_("td",[t._v("Reverse Index")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC c")])]),t._v(" "),_("td",[t._v("RIS")]),t._v(" "),_("td",[t._v("Reset To Initial State")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ Ps ; ... l")])]),t._v(" "),_("td",[t._v("RM")]),t._v(" "),_("td",[t._v("Reset Mode")]),t._v(" "),_("td",[t._v("none")])]),t._v(" "),_("tr",[_("td"),t._v(" "),_("td",[_("strong",[t._v("SCS")])]),t._v(" "),_("td",[_("strong",[t._v("Select Character Set")])]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("em",[_("code",[t._v("ESC ( A")])])]),t._v(" "),_("td",[_("em",[t._v("SCS - G0")])]),t._v(" "),_("td",[t._v("G0 - United Kingdom Set")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("em",[_("code",[t._v("ESC ( B")])])]),t._v(" "),_("td",[_("em",[t._v("SCS - G0")])]),t._v(" "),_("td",[t._v("G0 - ASCII Set")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("em",[_("code",[t._v("ESC ( 0")])])]),t._v(" "),_("td",[_("em",[t._v("SCS - G0")])]),t._v(" "),_("td",[t._v("G0 - Special Graphics")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("em",[_("code",[t._v("ESC ( 1")])])]),t._v(" "),_("td",[_("em",[t._v("SCS - G0")])]),t._v(" "),_("td",[t._v("G0 - Alt Standard Character Set")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("em",[_("code",[t._v("ESC ( 2")])])]),t._v(" "),_("td",[_("em",[t._v("SCS - G0")])]),t._v(" "),_("td",[t._v("G0 - Alt Special Graphics")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("em",[_("code",[t._v("ESC ) A")])])]),t._v(" "),_("td",[_("em",[t._v("SCS - G1")])]),t._v(" "),_("td",[t._v("G1 - United Kingdom Set")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("em",[_("code",[t._v("ESC ) B")])])]),t._v(" "),_("td",[_("em",[t._v("SCS - G1")])]),t._v(" "),_("td",[t._v("G1 - ASCII Set")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("em",[_("code",[t._v("ESC ) 0")])])]),t._v(" "),_("td",[_("em",[t._v("SCS - G1")])]),t._v(" "),_("td",[t._v("G1 - Special Graphics")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("em",[_("code",[t._v("ESC ) 1")])])]),t._v(" "),_("td",[_("em",[t._v("SCS - G1")])]),t._v(" "),_("td",[t._v("G1 - Alt Standard Character Set")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("em",[_("code",[t._v("ESC ) 2")])])]),t._v(" "),_("td",[_("em",[t._v("SCS - G1")])]),t._v(" "),_("td",[t._v("G1 - Alt Special Graphics")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("strong",[_("code",[t._v("ESC [ Ps ; ... m")])])]),t._v(" "),_("td",[_("strong",[t._v("SGR")])]),t._v(" "),_("td",[_("strong",[t._v("Select Graphics Rendition")])]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("em",[_("code",[t._v("ESC [ 0 m")])])]),t._v(" "),_("td",[_("em",[t._v("SGR")])]),t._v(" "),_("td",[t._v("Attributes Off")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("em",[_("code",[t._v("ESC [ 1 m")])])]),t._v(" "),_("td",[_("em",[t._v("SGR")])]),t._v(" "),_("td",[t._v("Bold or Increased Intensity")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("em",[_("code",[t._v("ESC [ 4 m")])])]),t._v(" "),_("td",[_("em",[t._v("SGR")])]),t._v(" "),_("td",[t._v("Underscore")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("em",[_("code",[t._v("ESC [ 5 m")])])]),t._v(" "),_("td",[_("em",[t._v("SGR")])]),t._v(" "),_("td",[t._v("Blink")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("em",[_("code",[t._v("ESC [ 7 m")])])]),t._v(" "),_("td",[_("em",[t._v("SGR")])]),t._v(" "),_("td",[t._v("Negative (reverse/inverse) image")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ Ps ; ... h")])]),t._v(" "),_("td",[t._v("SM")]),t._v(" "),_("td",[t._v("Set Mode")]),t._v(" "),_("td")]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ Ps g")])]),t._v(" "),_("td",[t._v("TBC")]),t._v(" "),_("td",[t._v("Tabulation Clear")]),t._v(" "),_("td",[t._v("0")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"additional-control-sequences"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-control-sequences"}},[this._v("#")]),this._v(" Additional Control Sequences")])},function(){var t=this,e=t.$createElement,_=t._self._c||e;return _("table",[_("thead",[_("tr",[_("th",[t._v("Control Sequence")]),t._v(" "),_("th",[t._v("Mnemonic")]),t._v(" "),_("th",[t._v("Action Taken")]),t._v(" "),_("th",[t._v("Notes")])])]),t._v(" "),_("tbody")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"ansi-sys-control-sequences"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ansi-sys-control-sequences"}},[this._v("#")]),this._v(" ANSI.SYS Control Sequences")])},function(){var t=this,e=t.$createElement,_=t._self._c||e;return _("table",[_("thead",[_("tr",[_("th",[t._v("Control Sequence")]),t._v(" "),_("th",[t._v("Mnemonic")]),t._v(" "),_("th",[t._v("Action Taken")]),t._v(" "),_("th",[t._v("Notes")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[_("code",[t._v("ESC [ s")])]),t._v(" "),_("td",[t._v("SCOSC")]),t._v(" "),_("td",[t._v("Save current cursor state (position and attributes)")]),t._v(" "),_("td",[t._v("Does the same as "),_("code",[t._v("ESC 7")])])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC [ u")])]),t._v(" "),_("td",[t._v("SCORC")]),t._v(" "),_("td",[t._v("Restore current cursor state (position and attributes)")]),t._v(" "),_("td",[t._v("Does the same as "),_("code",[t._v("ESC 8")])])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"xterm-control-sequences"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#xterm-control-sequences"}},[this._v("#")]),this._v(" XTERM Control Sequences")])},function(){var t=this,e=t.$createElement,_=t._self._c||e;return _("table",[_("thead",[_("tr",[_("th",[t._v("Control Sequence")]),t._v(" "),_("th",[t._v("Mnemonic")]),t._v(" "),_("th",[t._v("Action Taken")]),t._v(" "),_("th",[t._v("Notes")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[_("code",[t._v("ESC [ Ps b")])]),t._v(" "),_("td",[t._v("REP")]),t._v(" "),_("td",[t._v("Repeat the preceding graphic character Ps times")]),t._v(" "),_("td",[t._v("otherwise ignored")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"original-vt52-control-sequences"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#original-vt52-control-sequences"}},[this._v("#")]),this._v(" Original VT52 Control Sequences")])},function(){var t=this,e=t.$createElement,_=t._self._c||e;return _("table",[_("thead",[_("tr",[_("th",[t._v("Control Sequence")]),t._v(" "),_("th",[t._v("Action Taken")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[_("code",[t._v("ESC A")])]),t._v(" "),_("td",[t._v("Cursor Up")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC B")])]),t._v(" "),_("td",[t._v("Cursor Down")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC C")])]),t._v(" "),_("td",[t._v("Cursor Right")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC D")])]),t._v(" "),_("td",[t._v("Cursor Left")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC F")])]),t._v(" "),_("td",[t._v("Enter Graphics Mode")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC G")])]),t._v(" "),_("td",[t._v("Exit Graphics Mode")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC H")])]),t._v(" "),_("td",[t._v("Cursor to Home")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC I")])]),t._v(" "),_("td",[t._v("Reverse Line Feed")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC J")])]),t._v(" "),_("td",[t._v("Erase to End of Screen")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC K")])]),t._v(" "),_("td",[t._v("Erase to End of Line")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC Y line column")])]),t._v(" "),_("td",[t._v("Direct Cursor Address")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC Z")])]),t._v(" "),_("td",[t._v("Identify")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC / Z")])]),t._v(" "),_("td",[_("em",[t._v("Identify response")])])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC =")])]),t._v(" "),_("td",[t._v("Enter Alternate Keypad Mode")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC >")])]),t._v(" "),_("td",[t._v("Exit Alternate Keypad Mode")])]),t._v(" "),_("tr",[_("td",[_("code",[t._v("ESC <")])]),t._v(" "),_("td",[t._v("Enter ANSI Mode")])])])])}],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/33.f36dfd73.js b/assets/js/33.f36dfd73.js new file mode 100644 index 0000000..d3cf6ef --- /dev/null +++ b/assets/js/33.f36dfd73.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{251:function(n,w,o){}}]); \ No newline at end of file diff --git a/assets/js/4.bdb612dd.js b/assets/js/4.bdb612dd.js new file mode 100644 index 0000000..5119bdd --- /dev/null +++ b/assets/js/4.bdb612dd.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{195:function(t,e,a){t.exports=a.p+"assets/img/WROVER.60594a0c.png"},196:function(t,e,a){t.exports=a.p+"assets/img/LDO.84fe5048.png"},197:function(t,e,a){t.exports=a.p+"assets/img/RES_120.72482160.png"},198:function(t,e,a){t.exports=a.p+"assets/img/RES_2K.4ea50fc0.png"},199:function(t,e,a){t.exports=a.p+"assets/img/RES_806.cecae634.png"},200:function(t,e,a){t.exports=a.p+"assets/img/RES_405.2c8abd5a.png"},201:function(t,e,a){t.exports=a.p+"assets/img/RES_4K7.49692d23.png"},202:function(t,e,a){t.exports=a.p+"assets/img/CAP_104.ec90267a.png"},203:function(t,e,a){t.exports=a.p+"assets/img/CAP_105.6a05778f.png"},204:function(t,e,a){t.exports=a.p+"assets/img/CAP_100uF.faa0d44b.png"},205:function(t,e,a){t.exports=a.p+"assets/img/CAP_22uF.36b246e3.png"},206:function(t,e,a){t.exports=a.p+"assets/img/CAP_10uF.ad70d4fb.png"},207:function(t,e,a){t.exports=a.p+"assets/img/S8050.8d15144c.png"},208:function(t,e,a){t.exports=a.p+"assets/img/TACTILE_SW.bd6ac827.png"},209:function(t,e,a){t.exports=a.p+"assets/img/Buzzer.5b8d847a.png"},210:function(t,e,a){t.exports=a.p+"assets/img/CNX_2RA.a4ab8ff6.png"},211:function(t,e,a){t.exports=a.p+"assets/img/CNX_6RA.51b4d022.png"},212:function(t,e,a){t.exports=a.p+"assets/img/CNX_4X2.dae969af.png"},213:function(t,e,a){t.exports=a.p+"assets/img/CNX_40X2RA.eb825555.png"},214:function(t,e,a){t.exports=a.p+"assets/img/SHUNT.8ad03e96.png"},215:function(t,e,a){t.exports=a.p+"assets/img/VGA_SOCKET.b56dbc1c.png"},216:function(t,e,a){t.exports=a.p+"assets/img/PS2_SOCKET.c31fc3fe.png"},217:function(t,e,a){t.exports=a.p+"assets/img/PCB_BACK.5d5fa736.png"},218:function(t,e,a){t.exports=a.p+"assets/img/PCB_FRONT.9c173f76.png"},272:function(t,e,a){"use strict";a.r(e);var i=[function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"content"},[i("h1",{attrs:{id:"vt132-bill-of-materials-draft"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#vt132-bill-of-materials-draft"}},[t._v("#")]),t._v(" VT132 Bill of Materials (Draft)")]),t._v(" "),i("div",{staticClass:"danger custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("Note:")]),t._v(" "),i("p",[t._v("The BOM is yet to be updated to include details of")]),t._v(" "),i("ul",[i("li",[t._v("the "),i("strong",[t._v("Stand Alone edition")])]),t._v(" "),i("li",[t._v("the USB interface for USB-HID keyboard support")])]),t._v(" "),i("p",[t._v("The parts listed below are common for both editions with the exception of:")]),t._v(" "),i("ul",[i("li",[t._v("the Through Hole (THT) headers supplied")]),t._v(" "),i("li",[t._v("the Printed Circuit Board (PCB)")])])]),t._v(" "),i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),i("p",[t._v("To see the images in full size you can right-click on an image and "),i("code",[t._v("Open Image in New Tab")])])]),t._v(" "),i("div",{staticClass:"warning custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("Notes on the PCB")]),t._v(" "),i("ul",[i("li",[t._v("The silk screen on the Beta Kit PCBs (V1.3) is not final")]),t._v(" "),i("li",[t._v("Part identifiers are correct and there are no known errors")]),t._v(" "),i("li",[t._v("Graphic decals and label placement are not final")])])]),t._v(" "),i("h2",{attrs:{id:"surface-mount-device-smd-components"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#surface-mount-device-smd-components"}},[t._v("#")]),t._v(" Surface Mount Device (SMD) components")]),t._v(" "),i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("Don't Panic")]),t._v(" "),i("ul",[i("li",[t._v("Yes there are two SMD components!")]),t._v(" "),i("li",[t._v("You can do it!")]),t._v(" "),i("li",[t._v("You can do it with a regular soldering iron, but you are going to need flux")])])]),t._v(" "),i("table",[i("thead",[i("tr",[i("th",[t._v("Part")]),t._v(" "),i("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),i("th",[t._v("PCB")]),t._v(" "),i("th",[t._v("Description")])])]),t._v(" "),i("tbody",[i("tr",[i("td",[i("img",{attrs:{src:a(195),alt:"ESP32-WROVER"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("ESP32-WROVER U1")]),t._v(" "),i("td",[i("h4",[t._v("ESP-32 WROVER Module")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(196),alt:"NCP1117-33"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("NCP1117-33 U2")]),t._v(" "),i("td",[i("h4",[t._v("NCP1117-33 LDO Linear Regulator")])])])])]),t._v(" "),i("h2",{attrs:{id:"through-hole-tht-components"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#through-hole-tht-components"}},[t._v("#")]),t._v(" Through Hole (THT) components")]),t._v(" "),i("table",[i("thead",[i("tr",[i("th",[t._v("Part")]),t._v(" "),i("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),i("th",[t._v("PCB")]),t._v(" "),i("th",[t._v("Description")])])]),t._v(" "),i("tbody",[i("tr",[i("td",[i("img",{attrs:{src:a(197),alt:"120 Ohm"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("2")]),t._v(" "),i("td",[t._v("R1, R2")]),t._v(" "),i("td",[i("h4",[t._v("120 Ohm Resistor [Brown, Red, Black, Black, Gold]")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(198),alt:"2K Ohm"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("2")]),t._v(" "),i("td",[t._v("R3, R4")]),t._v(" "),i("td",[i("h4",[t._v("2K Ohm Resistor [Red, Black, Black, Brown, Gold]")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(60),alt:"10K Ohm"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("R5 Vertical")]),t._v(" "),i("td",[i("h4",[t._v("10K Ohm Resistor [Brown, Black, Black, Red, Gold]")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(199),alt:"806 Ohm"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("3")]),t._v(" "),i("td",[t._v("R6, R8, R10")]),t._v(" "),i("td",[i("h4",[t._v("806 Ohm Resistor [Grey, Black, Blue, Black, Gold]")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(200),alt:"405 Ohm"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("3")]),t._v(" "),i("td",[t._v("R7, R9, R11")]),t._v(" "),i("td",[i("h4",[t._v("405 Ohm Resistor [Yellow, Black, Green, Black, Gold]")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(201),alt:"4K7 Ohm"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("R12")]),t._v(" "),i("td",[i("h4",[t._v("4.7K Ohm Resistor [Yellow, Purple, Black, Brown, Gold]")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(60),alt:"10K Ohm"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("R13")]),t._v(" "),i("td",[i("h4",[t._v("10K Ohm Resistor [Brown, Black, Black, Red, Gold]")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(202),alt:"100 nF Capacitor"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("C1")]),t._v(" "),i("td",[i("h4",[t._v("100 nF (104) MLC Capacitor")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(203),alt:"1 uF Capacitor"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("C2")]),t._v(" "),i("td",[i("h4",[t._v("1 uF MLC (105) Capacitor")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(204),alt:"100 uF Capacitor"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("C3")]),t._v(" "),i("td",[i("h4",[t._v("100 uF Electrolytic Capacitor")]),t._v(" Electrolytic capacitors have polarity, ie. they must be inserted the correct way around to function properly.")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(205),alt:"22 uF Capacitor"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("C4")]),t._v(" "),i("td",[i("h4",[t._v("22 uF Electrolytic Capacitor")]),t._v(" Electrolytic capacitors have polarity, ie. they must be inserted the correct way around to function properly.")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(206),alt:"10 uF Capacitor"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("C5")]),t._v(" "),i("td",[i("h4",[t._v("10 uF Electrolytic Capacitor")]),t._v(" Electrolytic capacitors have polarity, ie. they must be inserted the correct way around to function properly.")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(207),alt:"S8050"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("Q1")]),t._v(" "),i("td",[i("h4",[t._v("S8050 NPN Transistor TO-92")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(208),alt:"Tactile Switch"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("2")]),t._v(" "),i("td",[t._v("Prog, Reset")]),t._v(" "),i("td",[i("h4",[t._v("Tactile Push Button Switch SPST - Right Angled")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(209),alt:"Buzzer"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("Bell")]),t._v(" "),i("td",[i("h4",[t._v("Buzzer 12.2mm dia.")]),t._v(" The Buzzer is polarized, ie. it must be inserted the correct way around to function. +VE to the Square Pad")])])])]),t._v(" "),i("h2",{attrs:{id:"through-hole-tht-headers"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#through-hole-tht-headers"}},[t._v("#")]),t._v(" Through Hole (THT) headers")]),t._v(" "),i("table",[i("thead",[i("tr",[i("th",[t._v("Part")]),t._v(" "),i("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),i("th",[t._v("PCB")]),t._v(" "),i("th",[t._v("Description")])])]),t._v(" "),i("tbody",[i("tr",[i("td",[i("img",{attrs:{src:a(210),alt:"Header 2pin"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("2")]),t._v(" "),i("td",[t._v("JP5, JP6 5V Pwr")]),t._v(" "),i("td",[i("h4",[t._v("2 Pin Header - Horizontal")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(211),alt:"Header 6pin"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("2")]),t._v(" "),i("td",[t._v("FTDI Program, Modem Port B")]),t._v(" "),i("td",[i("h4",[t._v("6 Pin Header - Horizontal")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(212),alt:"Header 8pin"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("JP1 to JP4 RxA/TxA RxB/TxB")]),t._v(" "),i("td",[i("h4",[t._v("8 Pin Header (4x2)- Vertical")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(213),alt:"Header 80pin"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("Pin 1")]),t._v(" "),i("td",[i("h4",[t._v("80 Pin Header (40x2)- Horizontal")]),t._v(" RC2014 Pro Bus Connector. Remove the unneeded pins from the upper row.")])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(214),alt:"Shunt"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("6")]),t._v(" "),i("td",[t._v("For JP1 to JP6 as required")]),t._v(" "),i("td",[i("h4",[t._v("Header Pin Shunts")]),t._v(" To be placed only on JP1 to 4 for normal operation.")])])])]),t._v(" "),i("h2",{attrs:{id:"through-hole-tht-connectors"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#through-hole-tht-connectors"}},[t._v("#")]),t._v(" Through Hole (THT) connectors")]),t._v(" "),i("table",[i("thead",[i("tr",[i("th",[t._v("Part")]),t._v(" "),i("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),i("th",[t._v("PCB")]),t._v(" "),i("th",[t._v("Description")])])]),t._v(" "),i("tbody",[i("tr",[i("td",[i("img",{attrs:{src:a(215),alt:"VGA DB15"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("VGA")]),t._v(" "),i("td",[i("h4",[t._v("DB15 VGA Female Socket - Right Angled")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(216),alt:"PS2 KBD"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1")]),t._v(" "),i("td",[t._v("Keyboard")]),t._v(" "),i("td",[i("h4",[t._v("Mini-DIN-6 PS/2 Keyboard Female Socket - Right Angled")])])])])]),t._v(" "),i("h2",{attrs:{id:"printed-circuit-board-pcb"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#printed-circuit-board-pcb"}},[t._v("#")]),t._v(" Printed Circuit Board (PCB)")]),t._v(" "),i("table",[i("thead",[i("tr",[i("th",[t._v("Part")]),t._v(" "),i("th",{staticStyle:{"text-align":"right"}},[t._v("Quantity")]),t._v(" "),i("th",[t._v("Description")])])]),t._v(" "),i("tbody",[i("tr",[i("td",[i("img",{attrs:{src:a(217),alt:"PCB Back"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1*")]),t._v(" "),i("td",[i("h4",[t._v("Back view")])])]),t._v(" "),i("tr",[i("td",[i("img",{attrs:{src:a(218),alt:"PCB Front"}})]),t._v(" "),i("td",{staticStyle:{"text-align":"right"}},[t._v("1*")]),t._v(" "),i("td",[i("h4",[t._v("Front view")])])])])])])}],r=a(0),s=Object(r.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),i,!1,null,null,null);e.default=s.exports},60:function(t,e,a){t.exports=a.p+"assets/img/RES_10K.5990c193.png"}}]); \ No newline at end of file diff --git a/assets/js/5.2c851482.js b/assets/js/5.2c851482.js new file mode 100644 index 0000000..d8a757b --- /dev/null +++ b/assets/js/5.2c851482.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{120:function(t,e,s){t.exports=s.p+"assets/img/Soldering_Iron.bf29229a.png"},121:function(t,e,s){t.exports=s.p+"assets/img/Solder.2e28c434.png"},122:function(t,e,s){t.exports=s.p+"assets/img/Soldering_Tip_Cleaner.aabca84a.png"},123:function(t,e,s){t.exports=s.p+"assets/img/Solder_Wick.7feae810.png"},124:function(t,e,s){t.exports=s.p+"assets/img/Flux_Pen.5bf7bbb8.png"},125:function(t,e,s){t.exports=s.p+"assets/img/IPA.f7f6a01b.png"},126:function(t,e,s){t.exports=s.p+"assets/img/Conductive_Brush.2ccf0c5c.png"},127:function(t,e,s){t.exports=s.p+"assets/img/Cotton_Buds.f15c3c02.png"},128:function(t,e,s){t.exports=s.p+"assets/img/Side_Cutters.80586b86.png"},129:function(t,e,s){t.exports=s.p+"assets/img/Self-closing_Tweezers.e27293a7.png"},130:function(t,e,s){t.exports=s.p+"assets/img/2.5mm_Hex_Driver.85a47727.png"},131:function(t,e,s){t.exports=s.p+"assets/img/Screwdriver.db421fdd.png"},132:function(t,e,s){t.exports=s.p+"assets/img/Digital_Multimeter.79e10569.png"},133:function(t,e,s){t.exports=s.p+"assets/img/Masking_Tape.5082a3c7.png"},134:function(t,e,s){t.exports=s.p+"assets/img/Elastic_Bands.6d182d79.png"},261:function(t,e,s){"use strict";s.r(e);var o=[function(){var t=this,e=t.$createElement,o=t._self._c||e;return o("div",{staticClass:"content"},[o("h1",{attrs:{id:"tools-draft"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#tools-draft"}},[t._v("#")]),t._v(" Tools (Draft)")]),t._v(" "),o("div",{staticClass:"tip custom-block"},[o("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),o("p",[t._v("I haven't figured out how to set the image sizes in the site tool I am using, so image sizes my vary. To see them in full size you can always right-click on an image and "),o("code",[t._v("Open Image in New Tab")])])]),t._v(" "),o("div",{staticClass:"warning custom-block"},[o("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),o("p",[t._v("I use solder that contains lead because it has a lower melting temperature and is easier to work with. When soldering it is recommended that you work in a well ventilated area and use a fan to blow or suck the soldering fumes away from your face so that you don't breath them.")])]),t._v(" "),o("h2",{attrs:{id:"soldering-tools-supplies"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#soldering-tools-supplies"}},[t._v("#")]),t._v(" Soldering tools & supplies")]),t._v(" "),o("table",[o("thead",[o("tr",[o("th",[t._v("Tool")]),t._v(" "),o("th",[t._v("Description")])])]),t._v(" "),o("tbody",[o("tr",[o("td",[o("img",{attrs:{src:s(120),alt:"Soldering Iron"}})]),t._v(" "),o("td",[o("h4",[t._v("Soldering Iron")]),t._v(" I use this sub AUD$20 hobby soldering iron. It doesn't have a temperature control. The little red button gives a short term, fast temperature boot but I almost never use it. This iron has a 1mm Conical tip which is necessary for the two SMD components. A chisel tip can make the through-hole component soldering easier, but isn't necessary.")])]),t._v(" "),o("tr",[o("td",[o("img",{attrs:{src:s(121),alt:"Solder"}})]),t._v(" "),o("td",[o("h4",[t._v("Solder")]),t._v(" You should use a flux/rosin core solder that release flux onto the solder joint as it melts.")])]),t._v(" "),o("tr",[o("td",[o("img",{attrs:{src:s(122),alt:"Soldering Tip Cleaner"}})]),t._v(" "),o("td",[o("h4",[t._v("Soldering Tip Clearer")]),t._v(" You should use a solder tip cleaner from time to time to keep the tip of your soldering iron in the best possible condition. This makes soldering much easier.")])]),t._v(" "),o("tr",[o("td",[o("img",{attrs:{src:s(123),alt:"Solder Wick"}})]),t._v(" "),o("td",[o("h4",[t._v("Solder Wick")]),t._v(" Solder Wick is the simplest tool to use to remove excess solder. I would say it is essential for attempting the SMD components, to remove any solder bridges that will almost always form.")])]),t._v(" "),o("tr",[o("td",[o("img",{attrs:{src:s(124),alt:"Flux Pen"}})]),t._v(" "),o("td",[o("h4",[t._v("Flux - in a Flux Pen")]),t._v(" Extra flux is essential for attempting the SMD components. It helps the solder flow exactly and only where you need it. The flux in rosin core solder isn't enough by itself. A flux pen is the simplest and easiest dispenser for small flux jobs. You can use flux gel, but its more messy to dispense and to clean up.")])])])]),t._v(" "),o("h2",{attrs:{id:"clean-up-supplies"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#clean-up-supplies"}},[t._v("#")]),t._v(" Clean-up supplies")]),t._v(" "),o("table",[o("thead",[o("tr",[o("th",[t._v("Tool")]),t._v(" "),o("th",[t._v("Description")])])]),t._v(" "),o("tbody",[o("tr",[o("td",[o("img",{attrs:{src:s(125),alt:"IPA"}})]),t._v(" "),o("td",[o("h4",[t._v("Isopropyl Alcohol (IPA)")]),t._v(" IPA in a handy spray pack is very useful for cleaning the PCB after soldering. It is recommended that any residual flux is removed, as with time it can corrode the solder joints (?). I'm not very careful about this, but if I have used extra flux then I usually remember to clean up afterwards.")])]),t._v(" "),o("tr",[o("td",[o("img",{attrs:{src:s(126),alt:"Conductive Brush"}})]),t._v(" "),o("td",[o("h4",[t._v("Conductive Brush")]),t._v(" I bought a conductive brush to help with cleaning up using IPA because it looks cool. Watch any of Jan Beta's YouTube videos that involve soldering and he's very liberal with the IPA and the conductive brush. I guess you shouldn't use a toothbrush because it might generate static electricity (?).")])]),t._v(" "),o("tr",[o("td",[o("img",{attrs:{src:s(127),alt:"Cotton Buds"}})]),t._v(" "),o("td",[o("h4",[t._v("Cotton Buds")]),t._v(" Very useful for wiping away and scrubbing off dried flux with some IPA.")])])])]),t._v(" "),o("h2",{attrs:{id:"tools"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#tools"}},[t._v("#")]),t._v(" Tools")]),t._v(" "),o("table",[o("thead",[o("tr",[o("th",[t._v("Tool")]),t._v(" "),o("th",[t._v("Description")])])]),t._v(" "),o("tbody",[o("tr",[o("td",[o("img",{attrs:{src:s(128),alt:"Side Cutters"}})]),t._v(" "),o("td",[o("h4",[t._v("Side Cutters")]),t._v(" I recommend these "),o("em",[t._v("flat")]),t._v(" side cutters over the more rounded one I used to have. They are easier to handle and get level with where you want to cut.")])]),t._v(" "),o("tr",[o("td",[o("img",{attrs:{src:s(129),alt:"Self-closing Tweezers"}})]),t._v(" "),o("td",[o("h4",[t._v("Self-closing Tweezers")]),t._v(" Regular tweezers are better than nothing, but these are easier to use as they don't spring open at the wrong time.")])]),t._v(" "),o("tr",[o("td",[o("img",{attrs:{src:s(130),alt:"2.5mm Hex Driver"}})]),t._v(" "),o("td",[o("h4",[t._v("2.5mm Hex Driver")]),t._v(" A simple 2.5mm Metric Hex/Allen Key will do the job. This is only used to do up the "),o("strong",[t._v("8 x M4 Hex Button Socket Screws")]),t._v(" that hold the front panel together.")])]),t._v(" "),o("tr",[o("td",[o("img",{attrs:{src:s(131),alt:"Phillips Head Screwdriver"}})]),t._v(" "),o("td",[o("h4",[t._v("Phillips Head Screwdriver")]),t._v(" A medium to small Phillips Head screwdriver is required to tighten the "),o("strong",[t._v("4 x M3 Black Machine Screws")]),t._v(" that fix the lid to the front panel.")])]),t._v(" "),o("tr",[o("td",[o("img",{attrs:{src:s(132),alt:"Digital Multimeter"}})]),t._v(" "),o("td",[o("h4",[t._v("Digital Multimeter")]),t._v(" Not essential, but a useful tool to check for continuity and shorts as you solder the components to the PCB.")])])])]),t._v(" "),o("h2",{attrs:{id:"miscellaneous"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#miscellaneous"}},[t._v("#")]),t._v(" Miscellaneous")]),t._v(" "),o("table",[o("thead",[o("tr",[o("th",[t._v("Tool")]),t._v(" "),o("th",[t._v("Description")])])]),t._v(" "),o("tbody",[o("tr",[o("td",[o("img",{attrs:{src:s(133),alt:"Masking Tape"}})]),t._v(" "),o("td",[o("h4",[t._v("Masking Tape")]),t._v(" Specifically, masking tape, not sticky tape. Masking tape is less likely to leave a sticky residue. This blue painters tape is usually better than the plain, paper based tape. You'll need a little of this to secure components in place while you solder them (see assembly guide).")])]),t._v(" "),o("tr",[o("td",[o("img",{attrs:{src:s(134),alt:"Elastic Bands"}})]),t._v(" "),o("td",[o("h4",[t._v("Elastic Bands")]),t._v(" You might need 2 strong elastic bands to hold the "),o("strong",[t._v("alignment guide for the rocker switches")]),t._v(" in place when soldering in the rocker switches.")])])])])])}],i=s(0),a=Object(i.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),o,!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/6.5265986f.js b/assets/js/6.5265986f.js new file mode 100644 index 0000000..2727ef0 --- /dev/null +++ b/assets/js/6.5265986f.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{223:function(e,t,s){e.exports=s.p+"assets/img/UHC_RC2014.107b5d99.jpg"},224:function(e,t,s){e.exports=s.p+"assets/img/UHC_RC2014_example.e8b0475b.jpg"},225:function(e,t,s){e.exports=s.p+"assets/img/UHC_SA.5246eee7.jpg"},226:function(e,t,s){e.exports=s.p+"assets/img/UHC_SA_example.326dc67a.jpg"},227:function(e,t,s){e.exports=s.p+"assets/img/keyboard_device_status.bd790f9a.jpg"},228:function(e,t,s){e.exports=s.p+"assets/img/UHC_firmware_upgrade.99f92466.jpg"},229:function(e,t,s){e.exports=s.p+"assets/img/UHC_firmware_fail.bb1e2403.jpg"},230:function(e,t,s){e.exports=s.p+"assets/img/UHC_firmware_success.4c60a5d8.jpg"},277:function(e,t,s){"use strict";s.r(t);var r=[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{attrs:{id:"usb-host-controller-uhc-firmware-update-guide-draft"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usb-host-controller-uhc-firmware-update-guide-draft"}},[this._v("#")]),this._v(" USB Host Controller (UHC) Firmware Update Guide (Draft)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"background"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#background"}},[this._v("#")]),this._v(" Background")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"update-procedure-overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-procedure-overview"}},[this._v("#")]),this._v(" Update Procedure Overview")])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[this._v("Press "),t("code",[this._v("9")]),this._v(" on the keyboard to show the keyboard device status")])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[this._v("Press "),t("code",[this._v("U")]),this._v(" (uppercase 'U') to start the update process")])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"tip custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),t("p",[this._v("If you have PS/2 keyboard connector you can still view the keyboard device status on the SET-UP D screen but pressing 'U' will do nothing.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"warning custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),t("p",[this._v("While it is safe to perform the UHC firmware upgrade repeatedly, the CH559T microcontroller can only be re-flashed a limited number of times (appoximately 100) before it will fail to re-flash again and may not operate correctly after this time.")]),this._v(" "),t("p",[this._v("It is recommended to only update the UHC firmware when required, as indicated in the release notes for a VT132 firmware update.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"update-procedure-step-by-step-guide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-procedure-step-by-step-guide"}},[this._v("#")]),this._v(" Update Procedure Step-by-Step guide")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"update-the-vt132-to-the-latest-release"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#update-the-vt132-to-the-latest-release"}},[this._v("#")]),this._v(" Update the VT132 to the latest release")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"navigate-to-the-set-up-d-screen-of-the-vt132"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#navigate-to-the-set-up-d-screen-of-the-vt132"}},[this._v("#")]),this._v(" Navigate to the SET-UP D screen of the VT132")])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[this._v("Press the "),t("code",[this._v("SETUP")]),this._v(" key ie. "),t("code",[this._v(" ")]),this._v(" or "),t("code",[this._v(" ")]),this._v(" to enter the VT132 SET-UP screens")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"show-the-keyboard-device-status"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#show-the-keyboard-device-status"}},[this._v("#")]),this._v(" Show the keyboard device status")])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[this._v("Press "),t("code",[this._v("9")]),this._v(" on the keyboard to show the keyboard device status")]),this._v(" "),t("li",[this._v("Details of the current UHC firmware version and any attached keyboard will be shown like in this example:")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(227),alt:"Keyboard device status"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"start-the-uhc-firmware-update-process"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#start-the-uhc-firmware-update-process"}},[this._v("#")]),this._v(" Start the UHC firmware update process")])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[this._v("Press "),t("code",[this._v("U")]),this._v(" (uppercase 'U') on the keyboard to start the UHC firmware update process")]),this._v(" "),t("li",[this._v("Details of the first UHC firmware update screen are shown here:")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(228),alt:"UHC firmware upgrade"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"tip custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),t("p",[this._v("As the first two (2) lines of text on this screen suggest, you can abort the update process by pressing "),t("code",[this._v("reset")]),this._v(" during the first 5 seconds.")]),this._v(" "),t("p",[this._v("This is only the first point where you can abort the process, there are 2 other opportunities later in the process.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"proceeding-with-the-update-process"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#proceeding-with-the-update-process"}},[this._v("#")]),this._v(" Proceeding with the update process")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[e._v("As the text on the "),s("strong",[e._v("UHC firmware upgrade")]),e._v(" screen indicates, you must power-cycle the VT132 to proceed with the update process.")]),e._v(" "),s("li",[e._v("In addition you must jumper/short two (2) pads on the back of the VT132 to force the UHC to restart in "),s("strong",[e._v("programming mode")])]),e._v(" "),s("li",[e._v("Diagrams showing the pads to short for both the "),s("strong",[e._v("VT132 for RC2014")]),e._v(" and the "),s("strong",[e._v("VT132 Stand Alone")]),e._v(" editions are given here:\n"),s("ul",[s("li",[e._v("In the first image the pads are circled in "),s("em",[e._v("GREEN")]),e._v(".")]),e._v(" "),s("li",[e._v("In the second image you can see how I normally do this with a pair of tweezers.")])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"vt132-designed-for-rc2104-edition"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vt132-designed-for-rc2104-edition"}},[this._v("#")]),this._v(" VT132 Designed for RC2104 edition")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"vt132-stand-alone-edition"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vt132-stand-alone-edition"}},[this._v("#")]),this._v(" VT132 Stand Alone edition")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"finishing-the-update-process"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#finishing-the-update-process"}},[this._v("#")]),this._v(" Finishing the update process")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"failure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#failure"}},[this._v("#")]),this._v(" Failure")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[e._v("If you have "),s("strong",[e._v("not")]),e._v(" successfully forced the UHC to restart in "),s("strong",[e._v("programming mode")]),e._v(", you will see the following screen after the restart:")]),e._v(" "),s("li",[e._v("This will also happen if you only "),s("strong",[e._v("reset")]),e._v(" the VT132 and have not performed a full power cycle")]),e._v(" "),s("li",[e._v("If you see this screen, simply reset the VT132 and start the procedure again")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(229),alt:"UHC firmware upgrade failure"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"success"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#success"}},[this._v("#")]),this._v(" Success")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[e._v("If you have successfully forced the UHC to restart in "),s("strong",[e._v("programming mode")]),e._v(", you will see the following screen after the restart:")]),e._v(" "),s("li",[e._v("The UHC firmware update will now complete")]),e._v(" "),s("li",[e._v("When you see the "),s("em",[e._v("GREEN")]),e._v(" text "),s("code",[e._v("UHC upgrade complete.")]),e._v(" the process is finsihed")]),e._v(" "),s("li",[e._v("You must again perform a full power cycle to correctly restart the UHC following the firmware upgrade")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(230),alt:"UHC firmware upgrade success"}})])}],i=s(0),a=Object(i.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"content"},[e._m(0),e._v(" "),e._m(1),e._v(" "),r("p",[e._v("The VT132 USB-HID keyboard adapter, the small, red, PCB supplied when you order the USB-HID keyboard option, uses a CH559T microcontroller as a USB Host Controller (UHC).")]),e._v(" "),r("p",[e._v("The UHC runs its own firmware that translates between USB-HID protocols and a high-speed serial protocol for the ESP32 to work with a USB keyboard.")]),e._v(" "),r("p",[e._v("From time-to-time, firmware updates may be released to improve performance, fix bugs or extend the functionality of the UHC.")]),e._v(" "),r("p",[e._v("These firmware updates will be embedded in a release of the VT132 firmware and initiated from within the VT132 Setup screens.")]),e._v(" "),e._m(2),e._v(" "),r("p",[e._v("The procedure for updating the UHC firmware is:")]),e._v(" "),r("ol",[r("li",[e._v("Update the VT132 to the latest release, following the "),r("router-link",{attrs:{to:"./../ota/"}},[e._v("OTA Firmware Update Guide")])],1),e._v(" "),r("li",[e._v("Navigate to the "),r("router-link",{attrs:{to:"./../vt100/operator/setup-d/"}},[e._v("SET-UP D")]),e._v(" screen of the VT132")],1),e._v(" "),e._m(3),e._v(" "),e._m(4),e._v(" "),r("li",[e._v("Follow the on-screen prompts for restarting the VT132 to proceed with the update process")])]),e._v(" "),e._m(5),e._v(" "),e._m(6),e._v(" "),e._m(7),e._v(" "),e._m(8),e._v(" "),r("p",[e._v("This is documented in the "),r("router-link",{attrs:{to:"./../ota/"}},[e._v("OTA Firmware Update Guide")])],1),e._v(" "),e._m(9),e._v(" "),r("ul",[e._m(10),e._v(" "),r("li",[e._v("Press "),r("code",[e._v("5")]),e._v(" three (3) times to navigate to the "),r("router-link",{attrs:{to:"./../vt100/operator/setup-d/"}},[e._v("SET-UP D")]),e._v(" screen")],1)]),e._v(" "),e._m(11),e._v(" "),e._m(12),e._v(" "),e._m(13),e._v(" "),e._m(14),e._v(" "),e._m(15),e._v(" "),e._m(16),e._v(" "),e._m(17),e._v(" "),e._m(18),e._v(" "),e._m(19),e._v(" "),e._m(20),e._v(" "),r("br"),e._v(" "),r("img",{attrs:{src:s(223),width:"360",alt:"VT132 RC2014 pads"}}),e._v(" "),r("img",{attrs:{src:s(224),width:"360",alt:"VT132 RC2014 example"}}),e._v(" "),e._m(21),e._v(" "),r("br"),e._v(" "),r("img",{attrs:{src:s(225),width:"360",alt:"VT132 SA pads"}}),e._v(" "),r("img",{attrs:{src:s(226),width:"360",alt:"VT132 SA example"}}),e._v(" "),e._m(22),e._v(" "),e._m(23),e._v(" "),e._m(24),e._v(" "),e._m(25),e._v(" "),e._m(26),e._v(" "),e._m(27),e._v(" "),e._m(28)])}),r,!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/7.681fd166.js b/assets/js/7.681fd166.js new file mode 100644 index 0000000..7dca41b --- /dev/null +++ b/assets/js/7.681fd166.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{233:function(e,t,s){e.exports=s.p+"assets/img/QM_Home.f2b1902e.jpg"},234:function(e,t,s){e.exports=s.p+"assets/img/QM_Actions.e190e745.jpg"},235:function(e,t,s){e.exports=s.p+"assets/img/QM_History.2997912a.jpg"},236:function(e,t,s){e.exports=s.p+"assets/img/QM_CRT_Saver.bc6ea1a6.jpg"},237:function(e,t,s){e.exports=s.p+"assets/img/QM_Personalities.f65aa878.jpg"},238:function(e,t,s){e.exports=s.p+"assets/img/QM_Emulations.b8328e01.jpg"},239:function(e,t,s){e.exports=s.p+"assets/img/QM_Keyboards.e14c4935.jpg"},240:function(e,t,s){e.exports=s.p+"assets/img/QM_Modem.a95663bd.jpg"},279:function(e,t,s){"use strict";s.r(t);var i=[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{attrs:{id:"quick-menu-guide-draft"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-menu-guide-draft"}},[this._v("#")]),this._v(" Quick Menu Guide (Draft)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"overview-and-rationale"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview-and-rationale"}},[this._v("#")]),this._v(" Overview and rationale")])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[this._v("not features can be accessed via the Quick Menu")]),this._v(" "),t("li",[this._v("it is mainly for features that can't be accessed through Set-Up menus")]),this._v(" "),t("li",[this._v("or features from Set-Up C & D that require quick access")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"accessing-the-quick-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#accessing-the-quick-menu"}},[this._v("#")]),this._v(" Accessing the Quick Menu")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("p",[e._v("The "),s("strong",[e._v("Quick Menu")]),e._v(" is opened with the "),s("code",[e._v(" - ")]),e._v(" key combination. When these key are pressed together with "),s("em",[e._v(" ")]),e._v(" being used like a "),s("em",[e._v(" ")]),e._v(" key, the display is cleared and the following "),s("strong",[e._v("root")]),e._v(" menu appears:")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(233),alt:"QuickMenu Root"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"keyboard-navigation-in-the-quick-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#keyboard-navigation-in-the-quick-menu"}},[this._v("#")]),this._v(" Keyboard navigation in the Quick Menu")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[e._v("Access the Quick Menu by pressing "),s("code",[e._v(" ")])]),e._v(" "),s("li",[e._v("Press "),s("code",[e._v(" ")]),e._v(" to close the Quick Menu")]),e._v(" "),s("li",[e._v("Dim/faint features are currently disabled")]),e._v(" "),s("li",[s("code",[e._v(" ")]),e._v(", "),s("code",[e._v(" ")]),e._v(" and "),s("code",[e._v(" ")]),e._v(" make selections")]),e._v(" "),s("li",[e._v("Pressing the underlined letter (any case) makes that selection (only in the current menu)")]),e._v(" "),s("li",[s("code",[e._v(" ")]),e._v(", "),s("code",[e._v(" ")]),e._v(", "),s("code",[e._v(" ")]),e._v(" go back/exit. Of these, only "),s("code",[e._v(" ")]),e._v(" will close the Quick Menu")]),e._v(" "),s("li",[e._v('Selecting an "action" i.e not a menu, checkbox or radio button, will execute the action and leave the quick menu.')]),e._v(" "),s("li",[s("code",[e._v(" ")]),e._v(" and "),s("code",[e._v(" ")]),e._v(" navigate between choices in the current menu\n"),s("ul",[s("li",[e._v("these keys will wrap-around vertically from bottom-to-top, and top-to-bottom")])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"indicators-in-the-quick-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#indicators-in-the-quick-menu"}},[this._v("#")]),this._v(" Indicators in the Quick Menu")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[e._v("Binary selection of a feature is usually indicated with a Check Box\n"),s("ul",[s("li",[s("code",[e._v("[ ]")]),e._v(" for unselected")]),e._v(" "),s("li",[s("code",[e._v("[X]")]),e._v(" for selected")]),e._v(" "),s("li",[e._v("change this option with "),s("code",[e._v(" ")]),e._v(", "),s("code",[e._v(" ")]),e._v(" or "),s("code",[e._v(" ")])])])]),e._v(" "),s("li",[e._v("Selection from a group of options is usually indicated with Radio Buttons\n"),s("ul",[s("li",[s("code",[e._v("( )")]),e._v(" for not currently selected")]),e._v(" "),s("li",[s("code",[e._v("(*)")]),e._v(" for the currently selected option")]),e._v(" "),s("li",[e._v("change the selection with "),s("code",[e._v(" ")]),e._v(", "),s("code",[e._v(" ")]),e._v(" or "),s("code",[e._v(" ")])])])]),e._v(" "),s("li",[e._v("Menus are indicted with a "),s("code",[e._v(">")]),e._v(" at the right-hand-side of the selection")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"actions-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#actions-menu"}},[this._v("#")]),this._v(" Actions menu")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(234),alt:"QuickMenu Actions"}})])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[s("strong",[e._v("Clear display")]),e._v(" - equivalent to "),s("code",[e._v("ESC [ 2 J")]),e._v(" followed by "),s("code",[e._v("ESC [ H")]),e._v(" to clear the screen and "),s("em",[e._v("home")]),e._v(" the cursor")]),e._v(" "),s("li",[s("strong",[e._v("Soft reset")]),e._v(" - equivalent to "),s("code",[e._v("ESC [ !")]),e._v(" resets the terminal to a default state but does not recall settings from NVR")]),e._v(" "),s("li",[s("strong",[e._v("Reset terminal")]),e._v(" - equivalent to "),s("code",[e._v("ESC c")]),e._v(" or pressing "),s("code",[e._v("0")]),e._v(" in any of the "),s("strong",[e._v("Setup")]),e._v(" screens")]),e._v(" "),s("li",[s("strong",[e._v("Reboot")]),e._v(" - equivalent to pressing the H/W Reset button in the VT132. Reboots the ESP32 resetting the terminal and the modem")]),e._v(" "),s("li",[s("strong",[e._v("Clear NVR")]),e._v(" - completely erases all settings from the NVR for both the terminal and the modem")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"new-display-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#new-display-menu"}},[this._v("#")]),this._v(" New: Display menu")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(235),alt:"QuickMenu Display"}})])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[s("strong",[e._v("Lines of history")]),e._v(" - selects the number of lines stored (or disable) the scroll history")]),e._v(" "),s("li",[s("strong",[e._v("CRT saver")]),e._v(" - selects the timeout for (or disable) the screen saver")]),e._v(" "),s("li",[s("strong",[e._v("Clear history")]),e._v(" - an action that clears the contents of the scroll history, same as "),s("code",[e._v(" -C")]),e._v(" when in the scroll history")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(236),alt:"QuickMenu CRT Saver"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"terminal-type-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#terminal-type-menu"}},[this._v("#")]),this._v(" Terminal type menu")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(237),alt:"QuickMenu Terminal"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[t("strong",[this._v("Emulation mode")]),this._v(" - selects between the nine (9) personalities also selectable from "),t("strong",[this._v("Setup-D")])]),this._v(" "),t("li",[t("strong",[this._v("7-bit NRCS characters")]),this._v(" - selects between MCS and NRCS modes, also selectable from "),t("strong",[this._v("Setup-D")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"ascii-emulation-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ascii-emulation-menu"}},[this._v("#")]),this._v(" ASCII Emulation menu")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(238),alt:"QuickMenu Emulation"}})])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[s("strong",[e._v("White Screen")]),e._v(" - a macro that sets "),s("em",[e._v("White")]),e._v(" on "),s("em",[e._v("Black")]),e._v(" as the default colours")]),e._v(" "),s("li",[s("strong",[e._v("Green Screen")]),e._v(" - a macro that sets "),s("em",[e._v("Green")]),e._v(" on "),s("em",[e._v("Black")]),e._v(" as the default colours")]),e._v(" "),s("li",[s("strong",[e._v("Amber Screen")]),e._v(" - a macro that sets "),s("em",[e._v("Brown")]),e._v(" on "),s("em",[e._v("Black")]),e._v(" as the default colours")]),e._v(" "),s("li",[s("strong",[e._v("Blue Screen")]),e._v(" - a macro that sets "),s("em",[e._v("Cyan")]),e._v(" on "),s("em",[e._v("Black")]),e._v(" as the default colours")]),e._v(" "),s("li",[s("strong",[e._v("Ansi.sys")]),e._v(" - a macro that sets")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"dec-vt100-emulation-modes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dec-vt100-emulation-modes"}},[this._v("#")]),this._v(" DEC VT100 emulation modes")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The first four (4) options "),t("em",[this._v("White/Green/Amber/Blue")]),this._v(" set the terminal for")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[e._v("VT100 mode with ANIS.SYS compliance "),s("strong",[e._v("disabled")])]),e._v(" "),s("li",[e._v("the "),s("strong",[e._v("DEC VT100/VT220")]),e._v(" Font")]),e._v(" "),s("li",[e._v("resets to 80 column mode")]),e._v(" "),s("li",[e._v("the "),s("strong",[e._v("ANSI")]),e._v(" Colour Palette (except "),s("em",[e._v("Amber")]),e._v(" that sets the "),s("em",[e._v("VGA")]),e._v(" Colour Palette for "),s("em",[e._v("Brown")]),e._v(")")]),e._v(" "),s("li",[e._v("sets "),s("strong",[e._v("Bold")]),e._v(" to be both "),s("em",[e._v("Bright")]),e._v(" and "),s("em",[e._v("Thick")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"ansi-sys-emulation-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ansi-sys-emulation-mode"}},[this._v("#")]),this._v(" ANSI.SYS emulation mode")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("em",[this._v("Ansi.sys")]),this._v(" option set the terminal for")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[e._v("VT100 mode with ANIS.SYS compliance "),s("strong",[e._v("enabled")])]),e._v(" "),s("li",[e._v("the "),s("strong",[e._v("PC Code Page 437")]),e._v(" Font")]),e._v(" "),s("li",[e._v("resets to 80 column mode")]),e._v(" "),s("li",[e._v("the "),s("strong",[e._v("VGA")]),e._v(" Colour Palette")]),e._v(" "),s("li",[e._v("sets "),s("strong",[e._v("Bold")]),e._v(" to be only "),s("em",[e._v("Bright")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"keyboard-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#keyboard-menu"}},[this._v("#")]),this._v(" Keyboard menu")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(239),alt:"QuickMenu Keyboard"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[t("p",[t("strong",[this._v("Keyboard language")]),this._v(" - selects between the six (6) keyboard languages also selectable from "),t("strong",[this._v("Setup-D")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[t("code",[this._v("[ ]")]),this._v(" - disabled, dead-key support is disabled to avoid conflicts with accent keys")]),this._v(" "),t("li",[t("code",[this._v("[X]")]),this._v(" - enabled (default), dead-key support is enabled")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"modem-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#modem-menu"}},[this._v("#")]),this._v(" Modem menu")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(240),alt:"QuickMenu Modem"}})])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("li",[s("p",[s("strong",[e._v("Enable modem locally")]),e._v(" - selects between the two (2) operating modes for the modem")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("[ ]")]),e._v(" - unselected (default), the modem is accessible only via its own UART on the RC2014 Bus pins "),s("em",[e._v("TxB/RxB")]),e._v(" or via the 6 pin "),s("em",[e._v("Modem Part B")]),e._v(" header")]),e._v(" "),s("li",[s("code",[e._v("[X]")]),e._v(" - selected, the modem is disconnected from the UART and is available to the VT100 terminal "),s("em",[e._v('"locally"')]),e._v(" when the terminal is in "),s("code",[e._v("LOCAL")]),e._v(" mode (see: "),s("a",{attrs:{href:"#on-line-root-menu"}},[e._v("On-Line (root menu)")]),e._v(")")])])])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("li",[s("p",[s("strong",[e._v("Enable wi-fi autoconnect")]),e._v(" - selects whether the modem autoconnects to the Wi-Fi network during startup")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("[ ]")]),e._v(" - unselected (default), the modem "),s("strong",[e._v("does not")]),e._v(" autoconnect, "),s("code",[e._v("AT+W+")]),e._v(" (or similar) is required to connect")]),e._v(" "),s("li",[s("code",[e._v("[X]")]),e._v(" - selected, the modem "),s("strong",[e._v("does")]),e._v(" autoconnect, equivalent to"),s("code",[e._v("AT+W+")])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[t("p",[t("strong",[this._v("Initialization string")]),this._v(" - allows the modem initialization string to be edited, this is executed at power-on and reset, including a modem reset by "),t("code",[this._v("ATZ")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[t("p",[t("strong",[this._v("Reset modem")]),this._v(" - performs a modem reset as if the command "),t("code",[this._v("ATZ")]),this._v(" had been peformed, an audible bell will confirm that the modem has been reset")])])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),s("p",[e._v("The following three (3) settings, detailed above, are immediately stored to NVR and don't require a further "),s("em",[e._v("save setteings")]),e._v(" to retain:")]),e._v(" "),s("ul",[s("li",[e._v("Enable wi-fi autoconnect")]),e._v(" "),s("li",[e._v("Telnet TERM")]),e._v(" "),s("li",[e._v("Initialization string")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"on-line-root-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#on-line-root-menu"}},[this._v("#")]),this._v(" On-line (root menu)")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[s("strong",[e._v("On-line")]),e._v(" - equivalent to pressing "),s("code",[e._v("4")]),e._v(" in any of the "),s("strong",[e._v("Setup")]),e._v(" screens to select between "),s("code",[e._v("ONLINE")]),e._v(" or "),s("code",[e._v("LOCAL")]),e._v(" "),s("ul",[s("li",[s("code",[e._v("[X]")]),e._v(" - selected "),s("code",[e._v("ONLINE")]),e._v(" (default), the terminal is connected to the UART on the RC2014 Bus pins "),s("em",[e._v("TxA/RxA")])]),e._v(" "),s("li",[s("code",[e._v("[ ]")]),e._v(" - unselected "),s("code",[e._v("LOCAL")]),e._v(", the terminal is disconnected from the UART and will\n"),s("ul",[s("li",[e._v('echo "locally" if it is not connected to the modem')]),e._v(" "),s("li",[e._v("connect directly to the modem if set (see: "),s("a",{attrs:{href:"#modem-menu"}},[e._v("Modem menu")]),e._v(")")])])])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"save-settings-root-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#save-settings-root-menu"}},[this._v("#")]),this._v(" Save settings (root menu)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[this._v("Save all settings to NVR for the terminal")]),this._v(" "),t("li",[this._v("equivalent to pressing "),t("code",[this._v(" -S")]),this._v(" in any of the "),t("strong",[this._v("Setup")]),this._v(" screens")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"restore-settings-root-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#restore-settings-root-menu"}},[this._v("#")]),this._v(" Restore settings (root menu)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[this._v("Restore all settings from NVR for the terminal")]),this._v(" "),t("li",[this._v("equivalent to pressing "),t("code",[this._v(" -R")]),this._v(" in any of the "),t("strong",[this._v("Setup")]),this._v(" screens")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"exit-root-menu"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#exit-root-menu"}},[this._v("#")]),this._v(" Exit (root menu)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[t("strong",[this._v("Exit")]),this._v(" - closes the "),t("strong",[this._v("Quick Menu")]),this._v(", the same as pressing "),t("code",[this._v(" ")]),this._v(" when in the root menu.")])])}],n=s(0),r=Object(n.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"content"},[e._m(0),e._v(" "),e._m(1),e._v(" "),s("p",[e._v("The structure of the Setup screens based on the implementation in the original VT100 are difficult to extend. The VT132 already adds Setup-C & Setup-D to provided access and control for the majority of enhanced features. Additionally the VT100 style Setup screens makes finding, navigating to and changing/setting the desired feature cumbersome.")]),e._v(" "),s("p",[e._v("Digital Equipment Corporation (DEC) experimented with a number of different setup screen approaches throughout the life of the VT family of terminals, making significant changes to the implementation with the introduction of the VT220 and again with the VT510.")]),e._v(" "),s("p",[e._v("It was desirable to add a quick access menu for features that you might frequently want to change eg. terminal personality or to turn ANSI.SYS compliance on and off. Also it was desirable to have an easily extensible menu to access new features added to the VT132 over time, without having to add additional VT100 style Setup screens.")]),e._v(" "),s("p",[e._v("The solution was to add a VT510 style popup menu system. The implementation differs slightly to incorporate some more modern UI conventions and keyboard short-cuts.")]),e._v(" "),e._m(2),e._v(" "),e._m(3),e._v(" "),e._m(4),e._v(" "),e._m(5),e._v(" "),e._m(6),e._v(" "),e._m(7),e._v(" "),e._m(8),e._v(" "),e._m(9),e._v(" "),e._m(10),e._v(" "),e._m(11),e._v(" "),s("p",[e._v("The available actions are:")]),e._v(" "),e._m(12),e._v(" "),e._m(13),e._v(" "),e._m(14),e._v(" "),e._m(15),e._v(" "),e._m(16),e._v(" "),e._m(17),e._v(" "),e._m(18),e._v(" "),e._m(19),e._v(" "),e._m(20),e._v(" "),e._m(21),e._v(" "),e._m(22),e._v(" "),e._m(23),e._v(" "),e._m(24),e._v(" "),e._m(25),e._v(" "),s("p",[e._v("These are most useful for applications that expect to work with a VT100 terminal eg. WordStar or SuperCalc2")]),e._v(" "),e._m(26),e._v(" "),e._m(27),e._v(" "),e._m(28),e._v(" "),s("p",[e._v("This is most useful when visiting Bulletin Board Systems (BBS) that expect to work with an ANSI.SYS compliant terminal emulator")]),e._v(" "),e._m(29),e._v(" "),e._m(30),e._v(" "),s("ul",[e._m(31),e._v(" "),s("li",[s("p",[s("strong",[e._v("Enable dead keys")]),e._v(" - enable/disable dead-keys (enabled by default) (see: "),s("router-link",{attrs:{to:"/vt132/operation/vt100/operator/setup-d/#international-keyboard-support"}},[e._v("International Keyboard Support")]),e._v(")")],1),e._v(" "),e._m(32)])]),e._v(" "),e._m(33),e._v(" "),e._m(34),e._v(" "),s("ul",[e._m(35),e._v(" "),e._m(36),e._v(" "),s("li",[s("p",[s("strong",[e._v("Telnet TERM")]),e._v(" - allows the TERM environment variable to be edited, see: "),s("code",[e._v("AT+T?")]),e._v(" and "),s("code",[e._v("AT+T=ttt")]),e._v(" in the "),s("router-link",{attrs:{to:"/vt132/operation/modem/#at-command-summary-table"}},[e._v("'AT' Command Summary")])],1)]),e._v(" "),e._m(37),e._v(" "),e._m(38)]),e._v(" "),e._m(39),e._v(" "),e._m(40),e._v(" "),e._m(41),e._v(" "),e._m(42),e._v(" "),e._m(43),e._v(" "),e._m(44),e._v(" "),e._m(45),e._v(" "),e._m(46),e._v(" "),e._m(47)])}),i,!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/8.6df93b9e.js b/assets/js/8.6df93b9e.js new file mode 100644 index 0000000..c2c4b97 --- /dev/null +++ b/assets/js/8.6df93b9e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{241:function(e,t,s){e.exports=s.p+"assets/img/SetupC.50702c7e.jpg"},242:function(e,t,s){e.exports=s.p+"assets/img/SetupC_help.398dcee6.jpg"},243:function(e,t,s){e.exports=s.p+"assets/img/SetupC_cp437.abf411af.jpg"},244:function(e,t,s){e.exports=s.p+"assets/img/SetupC_latin1.a1c253a8.jpg"},245:function(e,t,s){e.exports=s.p+"assets/img/SetupC_25line.a1b2f3ac.jpg"},246:function(e,t,s){e.exports=s.p+"assets/img/SetupC_30line.ad9692d4.jpg"},247:function(e,t,s){e.exports=s.p+"assets/img/SetupC_vga.11f300e8.jpg"},248:function(e,t,s){e.exports=s.p+"assets/img/SetupC_drcs.3b29ee99.jpg"},280:function(e,t,s){"use strict";s.r(t);var r=[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{attrs:{id:"set-up-c-code-pages-ansi-colours-system-information-enhancement"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-up-c-code-pages-ansi-colours-system-information-enhancement"}},[this._v("#")]),this._v(" SET-UP C - Code Pages, ANSI colours, System Information "),t("em",[this._v("(enhancement)")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"background"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#background"}},[this._v("#")]),this._v(" Background")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("code",[this._v("SET-UP C")]),this._v(" screen is an enhancement that the VT132 adds to the original VT100 functionality.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The VT132 implements 16 colour support and multiple font/codepage support and these features are accessible and configurable through the"),t("code",[this._v("SET-UP C")]),this._v(" screen.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(241),alt:"SET-UP-C"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[this._v("firmware version details")]),this._v(" "),t("li",[this._v("credit to the FabGL library on which it is built")]),this._v(" "),t("li",[this._v("screen resolutions")]),this._v(" "),t("li",[this._v("memory utilization")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"help"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#help"}},[this._v("#")]),this._v(" Help")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The integrated help screen is accessible by pressing the "),t("code",[this._v("F1")]),this._v(" key as with the other SET-UP screens, provides a summary of the features that are configurable on this screen.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(242),alt:"SET-UP-C-HELP"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"codepage-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#codepage-support"}},[this._v("#")]),this._v(" Codepage Support")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Pressing "),t("code",[this._v("2")]),this._v(" on the keyboard toggles between the three available codepages.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"dec-vt100-vt220-rom-code-page"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dec-vt100-vt220-rom-code-page"}},[this._v("#")]),this._v(" DEC VT100/VT220 ROM Code Page")])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"tip custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),t("p",[this._v("This codepage is also available in 132 column mode.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"pc-code-page-437"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pc-code-page-437"}},[this._v("#")]),this._v(" PC Code Page 437")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(243),alt:"SET-UP-C-CP437"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The main purpose of providing "),t("a",{attrs:{href:"#pc-code-page-437"}},[this._v("CP437")]),this._v(" support is to allow visiting BBS systems that render menus and ASCII art expecting an ANSI terminal with VGA font support. You may find other uses but for general use this font is not as clear as the "),t("a",{attrs:{href:"#dec-vt100-vt220-rom-code-page"}},[this._v("DEC fonts")]),this._v(".")])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"tip custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),t("p",[this._v("When CP437 is selected as the current font, rendering characters from the "),t("strong",[this._v("DEC Special Graphics")]),this._v(" character set will still work as they are automatically mapped to corresponding characters in the CP437 font.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"warning custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),t("p",[this._v("This codepage "),t("strong",[this._v("is not available")]),this._v(" in 132 column mode.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"dec-vt220-latin-1-code-page"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dec-vt220-latin-1-code-page"}},[this._v("#")]),this._v(" DEC VT220/Latin-1 Code Page")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(244),alt:"SET-UP-C-LATIN-1"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The main purpose of providing "),t("a",{attrs:{href:"#dec-vt220-latin-1-code-page"}},[this._v("Latin-1")]),this._v(" codepage support is if you are connecting to a modern operating system and want an accurate, contemporary codepage.")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"warning custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("If "),s("strong",[e._v("DEC VT220/Latin-1")]),e._v(" is currently selected, any reset event or change of font/lines/columns etc... returns to "),s("strong",[e._v("DEC VT100/VT220 ROM")]),e._v(" codepage")]),e._v(" "),s("p",[e._v("This setting is is not currently saved in NVR")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"_24-25-30-line-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#_24-25-30-line-support"}},[this._v("#")]),this._v(" 24/25/30 Line Support")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Pressing "),t("code",[this._v("3")]),this._v(" on the keyboard toggles between 24, 25 & 30 line support. There is a noticeable delay while the VGA signal re-syncs with the changed viewport resolution.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("When 25 line support is selected, the details on the "),t("code",[this._v("SET-UP C")]),this._v(" screen change as follows:")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(245),alt:"SET-UP-C-25Line"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"tip custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),t("p",[this._v("Full screen applications such as WordStar or SuperCalc2 typically must be configured using their accompanying install/setup program to work with the increased number of rows.")]),this._v(" "),t("p",[this._v("SuperCalc2 works well at 132 columns by 30 rows.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("When 30 line support is selected, the details on the "),t("code",[this._v("SET-UP C")]),this._v(" screen change as follows:")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(246),alt:"SET-UP-C-30Line"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"tip custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),t("p",[this._v("25 and 30 line support is also available in 132 column mode.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"warning custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),t("p",[this._v("If Wi-FI has been started from the modem, then 30 line mode "),t("strong",[this._v("will not")]),this._v(" be selectable and this setting will only toggle between 24 and 25 line modes.")]),this._v(" "),t("p",[this._v("To re-enable 30 line mode you must H/W Reset or Reboot the VT132 and ensure Wi-Fi is not started from the modem.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"ansi-vga-palette-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ansi-vga-palette-support"}},[this._v("#")]),this._v(" ANSI/VGA Palette Support")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Pressing "),t("code",[this._v("6")]),this._v(" on the keyboard toggles between standard ANSI and VGA colour palettes. The colour changes are only subtle and effect only a few colours.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The main purpose of providing VGA colour palette support is to allow visiting BBS systems that render menus and ASCII art to be viewed with better colour accuracy. The most noticeable change is that the ANSI palette "),t("strong",[this._v("dark yellow")]),this._v(" becomes "),t("strong",[this._v("brown")]),this._v(" in the VGA palette.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("When the VGA colour palette is selected, the "),t("code",[this._v("SET-UP C")]),this._v(" screen change as follows:")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(247),alt:"SET-UP-C-VGA"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"setting-default-foreground-and-background-colours"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setting-default-foreground-and-background-colours"}},[this._v("#")]),this._v(" Setting Default Foreground and Background Colours")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Pressing "),t("code",[this._v("7")]),this._v(" on the keyboard sets the default foreground colour based on the current cursor position.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Pressing "),t("code",[this._v("8")]),this._v(" on the keyboard sets the default background colour based on the current cursor position.")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("p",[e._v("Moving the cursor left or right with the "),s("code",[e._v(" ")]),e._v(" and "),s("code",[e._v(" ")]),e._v(" cursor control keys, "),s("code",[e._v(" ")]),e._v(" or "),s("code",[e._v(" ")]),e._v(" enables you to choose the colour you want to apply.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The current default foreground and background colour combination is displayed by the word "),t("code",[this._v("Default")]),this._v(" on the last line of the screen.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"showing-the-currently-loaded-decdld-drcs-soft-font"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#showing-the-currently-loaded-decdld-drcs-soft-font"}},[this._v("#")]),this._v(" Showing the currently loaded DECDLD / DRCS soft font")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Pressing "),t("code",[this._v("9")]),this._v(" on the keyboard changes the codepage to display the presently loaded soft soft and its "),t("strong",[this._v("Dscs")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(248),alt:"SET-UP-C-DRCS"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The first row of glyphs does not belong to the soft font, but are the glyphs used to represent characters in "),t("strong",[this._v("C0")]),this._v(" when DEC CRM is enabled.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Any glyphs that are not loaded from a "),t("strong",[this._v("Down-Line-Loadable Character Set")]),this._v(" are shown with a "),t("em",[this._v("reverse question mark")]),this._v(" - "),t("strong",[this._v("⸮")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("strong",[this._v("Dscs")]),this._v(" (character set name) for the soft font, 1 to 3 characters, sprecified by the soft font definition is shown between "),t("strong",[this._v("square brackets")]),this._v(" in the inverse title above the character set. "),t("strong",[this._v("Dscs=[ @]")]),this._v(" in the example above.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"set-up-c-advance-to-next-setup-screen"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-up-c-advance-to-next-setup-screen"}},[this._v("#")]),this._v(" SET-UP C - advance to next setup screen")])}],i=s(0),n=Object(i.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"content"},[e._m(0),e._v(" "),e._m(1),e._v(" "),e._m(2),e._v(" "),e._m(3),e._v(" "),e._m(4),e._v(" "),s("p",[e._v("In addition to the enhanced features configurable through this screen, it also displays some useful information about the VT132 including:")]),e._v(" "),e._m(5),e._v(" "),e._m(6),e._v(" "),e._m(7),e._v(" "),e._m(8),e._v(" "),e._m(9),e._v(" "),e._m(10),e._v(" "),e._m(11),e._v(" "),s("p",[e._v("The default Codepage/Font shown in the previous screen images is derived from original DEC VT100 and VT220 ROMs.")]),e._v(" "),s("ul",[s("li",[e._v("Characters from 0x00 to 0x7F are from the VT100 character ROM and include the standard "),s("a",{attrs:{href:"https://en.wikipedia.org/wiki/ASCII#Character_set",target:"_blank",rel:"noopener noreferrer"}},[e._v("7-bit ASCII"),s("OutboundLink")],1),e._v(" character set and the "),s("a",{attrs:{href:"https://en.wikipedia.org/wiki/DEC_Special_Graphics",target:"_blank",rel:"noopener noreferrer"}},[e._v("DEC Special Graphics"),s("OutboundLink")],1),e._v(" character set.")]),e._v(" "),s("li",[e._v("Characters from 0x80 to 0xFF are from the VT220 character ROM and implement the upper half (non-ASCII) of the "),s("a",{attrs:{href:"https://en.wikipedia.org/wiki/Multinational_Character_Set",target:"_blank",rel:"noopener noreferrer"}},[e._v("DEC Multinational Character Set (MCS)"),s("OutboundLink")],1)])]),e._v(" "),e._m(12),e._v(" "),e._m(13),e._v(" "),s("p",[e._v("The alternate Codepage/Font "),s("a",{attrs:{href:"https://en.wikipedia.org/wiki/Code_page_437",target:"_blank",rel:"noopener noreferrer"}},[e._v("CP437"),s("OutboundLink")],1),e._v(", also known as the VGA/ANSI character set from the MS-DOS era, is shown here.")]),e._v(" "),e._m(14),e._v(" "),e._m(15),e._v(" "),e._m(16),e._v(" "),e._m(17),e._v(" "),e._m(18),e._v(" "),s("p",[e._v("The successor to the "),s("strong",[e._v("DEC Multinational Character Set")]),e._v(", this code page also known as "),s("a",{attrs:{href:"https://en.wikipedia.org/wiki/ISO/IEC_8859-1",target:"_blank",rel:"noopener noreferrer"}},[e._v("ISO-8859-1"),s("OutboundLink")],1),e._v(" was the most commonly used code page prior to the adoption of "),s("a",{attrs:{href:"https://en.wikipedia.org/wiki/Unicode",target:"_blank",rel:"noopener noreferrer"}},[e._v("Unicode"),s("OutboundLink")],1),e._v(" and is shown here.")]),e._v(" "),e._m(19),e._v(" "),s("p",[e._v("Available for both 80 and 132 column modes.")]),e._v(" "),e._m(20),e._v(" "),e._m(21),e._v(" "),e._m(22),e._v(" "),e._m(23),e._v(" "),s("p",[e._v("The original VT100 supported 24 lines of text. With the introduction of the IBM PC a 25 line display became the norm.")]),e._v(" "),s("p",[e._v("The main purpose of providing 25 line support is to allow visiting BBS systems that render menus and ASCII art expecting an ANSI terminal with 25 line support.")]),e._v(" "),e._m(24),e._v(" "),e._m(25),e._v(" "),s("p",[e._v("The maximum viewport resolution of the VT132 is 800x300. At this vertical resolution, 30 lines of text can be displayed. This can be useful for displaying more text on the screen for working at the operating system (CP/M) prompt, programming in Basic or working with a range of full screen applications such as WordStar or SuperCalc2.")]),e._v(" "),e._m(26),e._v(" "),e._m(27),e._v(" "),e._m(28),e._v(" "),e._m(29),e._v(" "),e._m(30),e._v(" "),e._m(31),e._v(" "),e._m(32),e._v(" "),s("p",[e._v("With the introduction of colour the ANSI escape codes for "),s("a",{attrs:{href:"https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters",target:"_blank",rel:"noopener noreferrer"}},[e._v("SGR (Select Graphic Rendition)"),s("OutboundLink")],1),e._v(" were extended to cater for colour.")]),e._v(" "),s("p",[e._v("The VT132 implements 4 bit colour providing for 16 possible colours.")]),e._v(" "),s("p",[e._v('The standard ANSI colours are represented under the heading "Windows Console" in this '),s("a",{attrs:{href:"https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit",target:"_blank",rel:"noopener noreferrer"}},[e._v("4 bit ANSI colour table"),s("OutboundLink")],1),e._v(". The VGA text colours were slightly different and are shown under the heading \"VGA' in the same table.")]),e._v(" "),e._m(33),e._v(" "),e._m(34),e._v(" "),e._m(35),e._v(" "),e._m(36),e._v(" "),e._m(37),e._v(" "),e._m(38),e._v(" "),e._m(39),e._v(" "),e._m(40),e._v(" "),s("p",[e._v("The ANSI escape codes for "),s("a",{attrs:{href:"https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters",target:"_blank",rel:"noopener noreferrer"}},[e._v("SGR (Select Graphic Rendition)"),s("OutboundLink")],1),e._v(" allow a default foreground and background colour to be specified, in addition to selecting specific colours on demand. When no specific colour attributes are in effect the default foreground and background colours are used.")]),e._v(" "),s("p",[e._v("This feature of the VT132 lets you manually select your preferred default foreground and background colours.")]),e._v(" "),s("p",[e._v("This way you can make the VT132 appear as a green, amber , white (default) or blue phosphor terminal, or any other colour combination that you prefer.")]),e._v(" "),e._m(41),e._v(" "),e._m(42),e._v(" "),s("p",[e._v("The example below shows the DEC APL soft font loaded from a file sourced from the VAX VMS system disks.")]),e._v(" "),e._m(43),e._v(" "),e._m(44),e._v(" "),e._m(45),e._v(" "),e._m(46),e._v(" "),s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),s("p",[e._v("The use of soft fonts is beyond the scope of these notes, you should consult the "),s("a",{attrs:{href:"https://vt100.net/docs/vt220-rm/chapter4.html#S4.16",target:"_blank",rel:"noopener noreferrer"}},[e._v("VT220 Programmers Guide - Chapter 4"),s("OutboundLink")],1),e._v(" for details.")])]),e._v(" "),e._m(47),e._v(" "),s("p",[e._v("On the "),s("code",[e._v("SET-UP C")]),e._v(" screen, pressing "),s("code",[e._v("5")]),e._v(" will advance to the "),s("router-link",{attrs:{to:"./../setup-d/"}},[s("code",[e._v("SET-UP D")])]),e._v(" screen, before returning to the "),s("code",[e._v("SET-UP A")]),e._v(" screen.")],1)])}),r,!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/9.761efa14.js b/assets/js/9.761efa14.js new file mode 100644 index 0000000..efc01b6 --- /dev/null +++ b/assets/js/9.761efa14.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{188:function(e,t,i){e.exports=i.p+"assets/img/VT132.d3f09725.png"},189:function(e,t,i){e.exports=i.p+"assets/img/RC2014_PS2.c8f5053c.jpg"},190:function(e,t,i){e.exports=i.p+"assets/img/RC2014_USB.a03dbd86.jpg"},191:function(e,t,i){e.exports=i.p+"assets/img/SA_PS2_Front.d43482d9.jpg"},192:function(e,t,i){e.exports=i.p+"assets/img/SA_USB_Front.9960bb0b.jpg"},193:function(e,t,i){e.exports=i.p+"assets/img/VT132_v1.0.275508b4.jpeg"},194:function(e,t,i){e.exports=i.p+"assets/img/VT132_v1.2.69033815.png"},271:function(e,t,i){"use strict";i.r(t);var r=[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{attrs:{id:"vt132"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vt132"}},[this._v("#")]),this._v(" VT132")])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticStyle:{"font-size":"36px",color:"black",border:"1px solid black"}},[this._v("Designed for RC2014 edition "),t("span",{staticStyle:{"font-size":"24px"}},[this._v("(White PCB)")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticStyle:{"font-size":"36px",color:"white","background-color":"black",border:"1px solid black"}},[this._v("Stand Alone edition "),t("span",{staticStyle:{"font-size":"24px"}},[this._v("(Black PCB)")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview"}},[this._v("#")]),this._v(" Overview")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:i(193),alt:"V1.0"}})])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("ul",[i("li",[e._v("FabGL is an Arduino library. Running FabGL @ 800x600 native resolution (800x300 scanline doubled) consumes a lot of the ESP32s internal memory.")]),e._v(" "),i("li",[e._v("Turning on WiFi in the Arduino environment on an ESP32 also consumes a lot of the ESP32s internal memory.")]),e._v(" "),i("li",[e._v("Moving to the ESP32-WROVER with 8Mb of SPRAM helps a little, but it's still the internal memory that is the limiting resource.")]),e._v(" "),i("li",[e._v("The Arduino IDE for ESP32 doesn't let you control and fine-tune all the memory and network resource allocation like the ESP-IDF does.")]),e._v(" "),i("li",[e._v("But Espressif thought of that...\n"),i("ul",[i("li",[e._v("It is possible to run the Arduino library as a component in the ESP-IDF environment.")]),e._v(" "),i("li",[e._v("I was easily able to make FabGL behave as an ESP-IDF component too.")])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:i(194),alt:"V1.2"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"editions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#editions"}},[this._v("#")]),this._v(" Editions")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"vt132-designed-for-rc2104-edition"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vt132-designed-for-rc2104-edition"}},[this._v("#")]),this._v(" VT132 Designed for RC2104 edition")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"white-pcb"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#white-pcb"}},[this._v("#")]),this._v(" (White PCB)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("In July 2020 the "),t("strong",[this._v("VT132 Designed for RC2014")]),this._v(" edition began shipping to the patiently waiting early-adopters.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"vt132-stand-alone-edition"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vt132-stand-alone-edition"}},[this._v("#")]),this._v(" VT132 Stand Alone edition")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"black-pcb"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#black-pcb"}},[this._v("#")]),this._v(" (Black PCB)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("In October 2020 the "),t("strong",[this._v("VT132 Stand Alone")]),this._v(" edition was released.")])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[e._v("Note:")]),e._v(" "),i("p",[e._v("The two editions are functionally equivalent when it comes to the features of the "),i("strong",[e._v("VT100")]),e._v(" terminal and the "),i("strong",[e._v("Telnet/WiFi 'AT' (Hayes) Modem")])]),e._v(" "),i("p",[e._v("Where they differ is in respect to:")]),e._v(" "),i("ul",[i("li",[e._v("powering the the VT132")]),e._v(" "),i("li",[e._v("serial communications connectivity")]),e._v(" "),i("li",[e._v("physical format and dimensions")])]),e._v(" "),i("p",[e._v("See each section below for details.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#features"}},[this._v("#")]),this._v(" Features")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"vt100-terminal"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vt100-terminal"}},[this._v("#")]),this._v(" VT100 Terminal")])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[this._v("800x600 native resolution over VGA (DB15 connector) - actually 800x300 with scanline doubling\n"),t("ul",[t("li",[this._v("800x240 viewport in 24 line (native) mode")]),this._v(" "),t("li",[this._v("800x250 viewport in 25 line (enhanced) mode")]),this._v(" "),t("li",[this._v("800x300 viewport in 30 line (enhanced) mode (excludes the use of Wi-Fi because of memory constraints)")])])])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("li",[e._v("10x10 character cells in 80 column mode\n"),i("ul",[i("li",[e._v("original DEC VT100 font (ASCII 7-bit) with pixel stretching as per the original VT100 hardware")]),e._v(" "),i("li",[e._v("original DEC Special Graphics overlay font (inc. line drawing characters)")]),e._v(" "),i("li",[e._v("original DEC VT220 Multinational Character Set (MCS) font (8-bit)")]),e._v(" "),i("li",[e._v("DEC National Replacement Character Set (NRCS) support (7-bit) (from VT220)\n"),i("ul",[i("li",[e._v("implemented for US/UK/French/German/Italian/Swedish, other countries to follow")])])]),e._v(" "),i("li",[e._v("PC/VGA Code Page 437 font for ANSI.SYS compatibility\n"),i("ul",[i("li",[e._v("supports DEC Special Graphics mapping to CP437")]),e._v(" "),i("li",[e._v("supports NRCS mapping to CP437")])])])])])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("li",[e._v("6x10 character cells in 132 column mode\n"),i("ul",[i("li",[e._v("modified DEC VT100 font (ASCII 7-bit)")]),e._v(" "),i("li",[e._v("modified DEC Special Graphics overlay font (inc. line drawing characters)")]),e._v(" "),i("li",[e._v("modified DEC VT220 Multinational Character Set (MCS) font (8-bit)")]),e._v(" "),i("li",[e._v("DEC National Replacement Character Set (NRCS) support (from VT220) see above.")]),e._v(" "),i("li",[e._v("no CP437 support in 132 column mode")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[this._v("implements all VT100 Advanced Video Option (AVO) features\n"),t("ul",[t("li",[this._v("132x24 (native), 132x25 & 132x30 (enhanced) character resolution")]),this._v(" "),t("li",[this._v("additional character attributes - Bold, Blink, Underline, Reverse (and combinations)")]),this._v(" "),t("li",[this._v("additional character ROM (NRCS and MCS fonts)")])])])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("li",[e._v("PC 104/105 key keyboard, either one of (you must specify which you want when ordering):\n"),i("ul",[i("li",[e._v("PS/2 keyboard (Mini-DIN 6, PS/2 connector)\n"),i("ul",[i("li",[e._v("supports keyboard layouts for US/UK/French/German/Italian/Swedish, other countries to follow\n"),i("ul",[i("li",[e._v("including dead-key support for composed characters with accent diacritics ` ´ ^ ¨ ~ (MCS 8-bit character set and CP437) - country specific")])])])])]),e._v(" "),i("li",[e._v("USB-HID keyboard (standard USB Type-A socket)\n"),i("ul",[i("li",[e._v("supports "),i("strong",[e._v("wired")]),e._v(" and "),i("strong",[e._v("wireless")]),e._v(" keyboards but "),i("strong",[e._v("not")]),e._v(" Bluetooth")]),e._v(" "),i("li",[e._v("does "),i("strong",[e._v("not")]),e._v(" support use of a USB hub or keyboards with integrated hubs eg. the Raspberry Pi keyboard")]),e._v(" "),i("li",[e._v("supports keyboard layouts for US/UK/French/German/Italian/Swedish, other countries to follow\n"),i("ul",[i("li",[e._v("including dead-key support for composed characters with accent diacritics ` ´ ^ ¨ ~ (MCS 8-bit character set and CP437) - country specific")])])])])])])])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("li",[e._v("implements a physical buzzer on the PCB for\n"),i("ul",[i("li",[e._v("keyclick")]),e._v(" "),i("li",[e._v("bell (^G)")]),e._v(" "),i("li",[e._v("margin bell")]),e._v(" "),i("li",[e._v("NVRAM error notification")]),e._v(" "),i("li",[e._v("non-blocking (operates on a timer interrupt and does not block serial communications)")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[this._v("implements 16 colour support\n"),t("ul",[t("li",[this._v("complies with ANSI escape code selection")]),this._v(" "),t("li",[this._v("use selectable default text and background colours via additional Set-up C screen")]),this._v(" "),t("li",[this._v("user selectable for standard ANSI or VGA colour palette")])])])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("li",[e._v("implements a "),i("strong",[e._v("scroll history buffer")]),e._v(" with a 100, 1000 or 5000 line capacity selectable\n"),i("ul",[i("li",[e._v("activated by "),i("em",[e._v("LeftAlt-Page Up")]),e._v(" key-press")]),e._v(" "),i("li",[e._v("scroll history can be stepped through page-at-a-time ("),i("em",[e._v("Page Up")]),e._v("/"),i("em",[e._v("Page Down")]),e._v(" keys)")]),e._v(" "),i("li",[e._v("or line-by-line ("),i("em",[e._v("Up")]),e._v("/"),i("em",[e._v("Down")]),e._v(" keys)")]),e._v(" "),i("li",[e._v("and can be cleared on demand ("),i("em",[e._v("Shift-C")]),e._v(" keys)")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[this._v("implements a "),t("strong",[this._v("CRT Saver")]),this._v(" (screen saver) function with 10 second, 1, 5, 10, 20 or 30 minute selectable timeout")])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[this._v("activated by "),t("em",[this._v("Alt-SysReq")]),this._v(" key-press (usually "),t("em",[this._v("Alt-PrintScreen")]),this._v(")")])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[this._v("Set-up A (native as per VT100 with minor modifications)\n"),t("ul",[t("li",[this._v("added 'T' command to restore default Tab-Stops (from VT102)")])])])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("li",[e._v("Set-up B (native as per VT100 with minor modifications)\n"),i("ul",[i("li",[e._v("added 'C' command to clear NVRAM")]),e._v(" "),i("li",[e._v("50/60Hz bit replaced by Backarrow Key Mode selection bit (DECBKM)")]),e._v(" "),i("li",[e._v("added selection of how "),i("strong",[e._v("Bold")]),e._v(" font is represented (bright &/or double-thick)")]),e._v(" "),i("li",[e._v("added selection of "),i("strong",[e._v("ANSI.SYS")]),e._v(" mode compatibility")]),e._v(" "),i("li",[e._v("baud rates supported - 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200")]),e._v(" "),i("li",[e._v("fixed serial format 8N1, no current support for 7 bits, parity or 2 stop bits")])])])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("li",[e._v("Set-up C (enhanced) enables:\n"),i("ul",[i("li",[e._v("DEC/VT font or CP437 font selection")]),e._v(" "),i("li",[e._v("24 line (native) / 25 line / 30 line (enhanced) mode selection for ANSI compatibility")]),e._v(" "),i("li",[e._v("default foreground text colour selection, 1 of 16 colours")]),e._v(" "),i("li",[e._v("default background colour selection, 1 of 16 colours")]),e._v(" "),i("li",[e._v("ANSI or VGA 16 colour palette selection")])])])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("li",[e._v("Quick Menu system (modeled on the VT510 setup menus)\n"),i("ul",[i("li",[e._v("activated by "),i("em",[e._v("LeftAlt-Esc")]),e._v(" key-press")]),e._v(" "),i("li",[e._v("provides quick access to:\n"),i("ul",[i("li",[e._v("common actions, eg. clear screen, reset, reboot, clear NVR")]),e._v(" "),i("li",[e._v("set/manage "),i("strong",[e._v("scroll history buffer")]),e._v(" and "),i("strong",[e._v("CRT saver")]),e._v(" functions")]),e._v(" "),i("li",[e._v("terminal personality selection")]),e._v(" "),i("li",[e._v("MCS/NRCS mode selection")]),e._v(" "),i("li",[e._v("macros for ASCII modes including:\n"),i("ul",[i("li",[e._v("Green/Amber/Blue/White screen emulation")]),e._v(" "),i("li",[e._v("ANSI.SYS mode compatibility")])])]),e._v(" "),i("li",[e._v("keyboard country/language selection")]),e._v(" "),i("li",[e._v("modem locally connected mode (direct VT100 to modem connection)")]),e._v(" "),i("li",[e._v("online/local mode selection")])])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[this._v("Non-volatile Storage (NVRAM) support for all terminal settings\n"),t("ul",[t("li",[this._v("save settings function - 'S' in Set-up screens, or from Quick Menu")]),this._v(" "),t("li",[this._v("restore settings function - 'R' in Set-up screens, or from Quick Menu")]),this._v(" "),t("li",[this._v("settings are restored on reset and power-up")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"vt132-designed-for-rc2104-edition-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vt132-designed-for-rc2104-edition-2"}},[this._v("#")]),this._v(" VT132 Designed for RC2104 edition")])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[this._v("connects to the RC2014 over the Tx/Rx lines (Pins 35 & 36) of the RC2014 Bus")]),this._v(" "),t("li",[this._v("takes power from the bus from Gnd/5V (Pins 17 & 18)")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"vt132-stand-alone-edition-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vt132-stand-alone-edition-2"}},[this._v("#")]),this._v(" VT132 Stand Alone edition")])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("ul",[i("li",[e._v("many options for "),i("strong",[e._v("serial communications connectivity")]),e._v(", including:\n"),i("ul",[i("li",[e._v("3.3V (5V tolerant) TTL level signaling with a 6-pin (straight, FTDI compatible) header")]),e._v(" "),i("li",[e._v("RS-232/EIA level signaling via an "),i("strong",[e._v("optional")]),e._v(" MAX3232 level converter\n"),i("ul",[i("li",[e._v("with a 6-pin (3x2) header")]),e._v(" "),i("li",[e._v("with an "),i("strong",[e._v("optional")]),e._v(" DE-9 (Male) edge-mounted connector as DTE")]),e._v(" "),i("li",[e._v("with an "),i("strong",[e._v("optional")]),e._v(" DB-25 (Female) edge-mounted connector as DTE")])])])])]),e._v(" "),i("li",[e._v("many options for "),i("strong",[e._v("powering")]),e._v(" the VT132 Stand Alone edition exist\n"),i("ul",[i("li",[e._v("2.0mm DC Barrel Jack for +5VDC (regulated) or +8VDC to +12VDC unregulated\n"),i("ul",[i("li",[i("strong",[e._v("optional")]),e._v(" onboard LM7805 to regulate +8VDC to +12VDC unregulated voltages")])])]),e._v(" "),i("li",[e._v("+5VDC can be supplied to the VT132 via the "),i("strong",[e._v("6-pin FTDI programming/debug")]),e._v(" header")]),e._v(" "),i("li",[e._v("+5VDC can be supplied to the VT132 via the "),i("strong",[e._v("6-pin TTL level Terminal")]),e._v(" header")]),e._v(" "),i("li",[e._v("+5VDC can be supplied to the VT132 via the "),i("strong",[e._v("6-pin TTL level Modem")]),e._v(" header")]),e._v(" "),i("li",[e._v("+5VDC (regulated) or +8VDC to +12VDC unregulated voltage can be supplied to the VT132 on Pin-9 of any of the RS-232/EIA level connectors (6-pin (3x2) headers DTE/DCE , DE-9 M/F DTE or DB-25 F/M DCE)\n"),i("ul",[i("li",[e._v("unregulated +8VDC to +12VDC voltages must be regulated by the "),i("strong",[e._v("optional")]),e._v(" onboard LM7805")])])])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"telnet-wifi-at-hayes-modem"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#telnet-wifi-at-hayes-modem"}},[this._v("#")]),this._v(" Telnet/WiFi 'AT' (Hayes) Modem")])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[this._v("supports serial baud rates of 4800, 9600, 14400, 19200, 38400, 57600, 1152000 from the UART\n"),t("ul",[t("li",[this._v("does not currently support 'autobaud'\n"),t("ul",[t("li",[this._v("but is selected by the 'Prog' press button switch on the PCB")]),this._v(" "),t("li",[this._v("the chosen speed is stored in NVRAM and persists through resets and power cycling")])])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"vt132-designed-for-rc2104-edition-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vt132-designed-for-rc2104-edition-3"}},[this._v("#")]),this._v(" VT132 Designed for RC2104 edition")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"vt132-stand-alone-edition-3"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vt132-stand-alone-edition-3"}},[this._v("#")]),this._v(" VT132 Stand Alone edition")])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("ul",[i("li",[e._v("many options for "),i("strong",[e._v("serial communications connectivity")]),e._v(", including:\n"),i("ul",[i("li",[e._v("3.3V (5V tolerant) TTL level signaling with a 6-pin (straight, modified FTDI) header")]),e._v(" "),i("li",[e._v("RS-232/EIA level signaling via an "),i("strong",[e._v("optional")]),e._v(" MAX3232 level converter\n"),i("ul",[i("li",[e._v("with a 6-pin (3x2) header")]),e._v(" "),i("li",[e._v("with an "),i("strong",[e._v("optional")]),e._v(" DE-9 (Female) edge-mounted connector as DCE")]),e._v(" "),i("li",[e._v("with an "),i("strong",[e._v("optional")]),e._v(" DB-25 (Male) edge-mounted connector as DCE")])])])])]),e._v(" "),i("li",[e._v("many options for "),i("strong",[e._v("powering")]),e._v(" the VT132 Stand Alone edition exist see "),i("a",{attrs:{href:"#vt132-stand-alone-edition"}},[e._v("above")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"over-the-air-ota-firmware-updates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#over-the-air-ota-firmware-updates"}},[this._v("#")]),this._v(" Over-the-Air (OTA) Firmware Updates")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"availability"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#availability"}},[this._v("#")]),this._v(" Availability")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"vt132-designed-for-rc2104-edition-4"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vt132-designed-for-rc2104-edition-4"}},[this._v("#")]),this._v(" VT132 Designed for RC2104 edition")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("strong",[this._v("VT132 Designed for RC2104")]),this._v(" edition is currently available (since July 2020) and has a price of USD$50 for the the model with PS/2 keyboard support. In addition to this you must pay for shipping and any transaction fees. Payment is via PayPal.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"vt132-stand-alone-edition-4"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vt132-stand-alone-edition-4"}},[this._v("#")]),this._v(" VT132 Stand Alone edition")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("strong",[this._v("VT132 Stand Alone edition")]),this._v(" is now also available (since October 2020) and is also priced at USD$50 for the base model. In addition to this you must pay for shipping and any transaction fees. Payment is via PayPal.")])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("ul",[i("li",[e._v("the base model has PS/2 keyboard support")]),e._v(" "),i("li",[e._v("comes with the DC barrel jack and an LM7805 linear power regulator (and associated capacitors)")]),e._v(" "),i("li",[e._v("includes headers for the TTL level Terminal and Modem connectors")]),e._v(" "),i("li",[e._v("but "),i("strong",[e._v("does not come with")]),e._v(" the MAX3232 level converter ICs and sockets, supporting capacitors or RS-232 EIA DTE/DCE (DB25, DE9) connectors\n"),i("ul",[i("li",[e._v("these parts are readily sourced from electronics suppliers such as Mouser, DigiKey & LCSC or other high street electronics stores eg. in Australia: Jaycar")])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"usb-hid-keyboard-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usb-hid-keyboard-support"}},[this._v("#")]),this._v(" USB-HID keyboard support")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("strong",[this._v("USB-HID keyboard support")]),this._v(" is priced as an option at an additional USD$5 owing to the extra parts (daughter PCB, CH559 microcontroller & USB Type-A socket).")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"to-order"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#to-order"}},[this._v("#")]),this._v(" To Order")])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),i("p",[e._v("When ordering, please specify both:")]),e._v(" "),i("ol",[i("li",[e._v("which edition you require: ie.\n"),i("ul",[i("li",[i("strong",[e._v("Designed for RC2014")]),e._v(", or")]),e._v(" "),i("li",[i("strong",[e._v("Stand Alone")])])])]),e._v(" "),i("li",[e._v("which keyboard support you require: ie.\n"),i("ul",[i("li",[i("strong",[e._v("PS/2")]),e._v(" connector based keyboard, or")]),e._v(" "),i("li",[i("strong",[e._v("USB")]),e._v(" Type-A, USB-HID based keyboard")])])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("I am accepting orders via email. If you send email to "),t("a",{attrs:{href:"mailto:info@thehighnibble.com"}},[this._v("info@thehighnibble.com")]),this._v(" with your choice of configuration, shipping name & address, I will respond to you with a PayPal invoice with the total price including shipping and transaction fees.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"warning custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),t("p",[this._v("Please only pay against the PayPal invoice when I send it to you. Do not try to pay directly to me via PayPal as this will only delay your order.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"specifications"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#specifications"}},[this._v("#")]),this._v(" Specifications")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"dimensions-built"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dimensions-built"}},[this._v("#")]),this._v(" Dimensions (built)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"designed-for-rc2104-edition"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#designed-for-rc2104-edition"}},[this._v("#")]),this._v(" Designed for RC2104 edition")])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[this._v("Designed for RC2014")]),this._v(" "),t("li",[this._v("Conforms to standard RC2014 card dimensions")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"stand-alone-edition"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#stand-alone-edition"}},[this._v("#")]),this._v(" Stand Alone edition")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h5",{attrs:{id:"pcb-dimensions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pcb-dimensions"}},[this._v("#")]),this._v(" PCB dimensions")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h5",{attrs:{id:"vesa-mounting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vesa-mounting"}},[this._v("#")]),this._v(" VESA Mounting")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"weight-built"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#weight-built"}},[this._v("#")]),this._v(" Weight (built)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"power"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#power"}},[this._v("#")]),this._v(" Power")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"designed-for-rc2104-edition-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#designed-for-rc2104-edition-2"}},[this._v("#")]),this._v(" Designed for RC2104 edition")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"stand-alone-edition-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#stand-alone-edition-2"}},[this._v("#")]),this._v(" Stand Alone edition")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"dimensions-boxed-shipped"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dimensions-boxed-shipped"}},[this._v("#")]),this._v(" Dimensions (boxed/shipped)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"weight-boxed-shipped"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#weight-boxed-shipped"}},[this._v("#")]),this._v(" Weight (boxed/shipped)")])}],n=i(0),a=Object(n.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"content"},[e._m(0),e._v(" "),r("img",{attrs:{src:i(188),height:"172px"}}),e._v(" "),r("br"),e._v(" "),e._m(1),e._v(" "),e._m(2),e._v(" "),e._m(3),e._v(" "),r("p",[e._v("I first tweeted about the VT132 in "),r("a",{attrs:{href:"https://twitter.com/TheHighNibble/status/1110861587751927811",target:"_blank",rel:"noopener noreferrer"}},[e._v("March 2019"),r("OutboundLink")],1),e._v("\nI had put together a first prototype in time for mVCF - Melbourne (AUS)")]),e._v(" "),e._m(4),e._v(" "),r("p",[e._v("Back then it was simply the hardware implementation of the brilliant work done by Fabrizio Di Vittorio in creating the "),r("a",{attrs:{href:"http://www.fabglib.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("FabGL library"),r("OutboundLink")],1),e._v(" for the ESP32. An ANSI/VT compatible, serially connected terminal with VGA output and a PS/2 keyboard.")]),e._v(" "),r("p",[e._v("But I wanted to extend his work and make a very authentic implementation of the DEC VT100 down to every reasonable detail.")]),e._v(" "),r("p",[e._v('Clearly from the prototype I\'d already chosen the initial form-factor to be a "Designed for RC2014" expansion card for the RC2014 bus.')]),e._v(" "),r("p",[e._v("I then took a break from the VT132 while I worked to finish another little project - the "),r("router-link",{attrs:{to:"/imsai8080/"}},[e._v("IMSAI 8080 replica")])],1),e._v(" "),r("p",[e._v("In "),r("a",{attrs:{href:"https://twitter.com/TheHighNibble/status/1215533158717775872",target:"_blank",rel:"noopener noreferrer"}},[e._v("January 2020"),r("OutboundLink")],1),e._v(" I again tweeted about the VT132 because I'd started to play around with it once more.")]),e._v(" "),r("p",[e._v("I'd added most of the authentic VT100 features I could think of, and decided that since the ESP32 has lots of UARTS and WiFi, that I would include a Telnet over WiFi, 'AT' (Hayes) style modem on a second UART. I'd already developed the modem code for the IMSAI8080 replica, so it was easy to integrate it into the VT132.")]),e._v(" "),r("p",[e._v("This is where the fun/trouble began...")]),e._v(" "),e._m(5),e._v(" "),r("p",[e._v("By April 2020 I was able to start posting "),r("a",{attrs:{href:"https://www.youtube.com/playlist?list=PLADkYVZqAxdO1fTDprnp_jRCTQ-9n1OIV",target:"_blank",rel:"noopener noreferrer"}},[e._v("videos to YouTube showcasing the features of the VT132"),r("OutboundLink")],1),e._v(".")]),e._v(" "),e._m(6),e._v(" "),r("p",[e._v("In June & July 2020 I conducted a closed Beta program with some fantastic people from the Retro-computer community. Their contribution to improving the VT132 and accelerating the development, ready for production has been invaluable.")]),e._v(" "),e._m(7),e._v(" "),e._m(8),e._v(" "),r("br"),e._v(" "),r("img",{attrs:{src:i(189),width:"360",alt:"RC2014 PS2"}}),e._v(" "),r("img",{attrs:{src:i(190),width:"360",alt:"RC2014 USB"}}),e._v(" "),e._m(9),e._v(" "),e._m(10),e._v(" "),e._m(11),e._v(" "),r("br"),e._v(" "),r("img",{attrs:{src:i(191),width:"360",alt:"Stand Alone PS2"}}),e._v(" "),r("img",{attrs:{src:i(192),width:"360",alt:"Stand Alone USB"}}),e._v(" "),e._m(12),e._v(" "),r("p",[e._v("Since its first release there has been regular feedback that a stand alone version of the VT132 would be warranted, to work with systems other than the RC2014.")]),e._v(" "),e._m(13),e._v(" "),e._m(14),e._v(" "),e._m(15),e._v(" "),e._m(16),e._v(" "),r("ul",[r("li",[e._v("fully DEC VT100 Escape Code compatible\n"),r("ul",[r("li",[e._v("extended escape code support from other DEC VTxxx models")]),e._v(" "),r("li",[e._v("extended ANSI.SYS escape code support")]),e._v(" "),r("li",[e._v("detailed in the "),r("router-link",{attrs:{to:"./operation/vt100/programmer/#terminal-control-commands"}},[e._v("Programmer Information manual")])],1)])]),e._v(" "),e._m(17),e._v(" "),e._m(18),e._v(" "),e._m(19),e._v(" "),r("li",[e._v("accurate Smooth Scrolling (requires XON/XOFF as per the original VT100 to avoid dropped characters)")]),e._v(" "),r("li",[e._v("interlace/non-interlace mode (simulated: doubled scanlines are either hidden or drawn)")]),e._v(" "),e._m(20),e._v(" "),e._m(21),e._v(" "),r("li",[e._v("implements user programmable answer back as per VT100")]),e._v(" "),e._m(22),e._v(" "),e._m(23),e._v(" "),e._m(24),e._v(" "),e._m(25),e._v(" "),r("li",[e._v("full VT100 style Set-up screen implementation\n"),r("ul",[e._m(26),e._v(" "),e._m(27),e._v(" "),e._m(28),e._v(" "),e._m(29),e._v(" "),r("li",[e._v("Set-up D (enhanced) enables:\n"),r("ul",[r("li",[e._v("7-bit ASCII (native) / 8-bit MCS selection (enhanced)")]),e._v(" "),r("li",[e._v("7-bit NRCS country selection")]),e._v(" "),r("li",[e._v("keyboard country/language selection")]),e._v(" "),r("li",[e._v("personality selection\n"),r("ul",[r("li",[e._v("personality (escape code and keyboard code translation) support for:\n"),r("ul",[r("li",[e._v("ANSI/VT100, ADM-3A, ADM-31, Cromemco 3102, Hazeltine 1500, Osborne 1, Kaypro, VT52")]),e._v(" "),r("li",[e._v("WordStar/VT100 - VT100 terminal with WordStar navigation keys for compatibility with many CP/M applications")]),e._v(" "),r("li",[e._v("details on the "),r("router-link",{attrs:{to:"./operation/vt100/operator/setup-d/#personality-support"}},[e._v("Setup-D screen")])],1)])])])])])]),e._v(" "),r("li",[e._v("all Set-up screens include optional help by pressing 'F1' key (enhanced)")])])]),e._v(" "),e._m(30),e._v(" "),e._m(31),e._v(" "),r("li",[e._v("a 6-pin FTDI header with dedicated UART for firmware flashing and for debug log monitoring")]),e._v(" "),r("li",[e._v("full details of configuring the terminal via the Set-up screens is covered in the "),r("router-link",{attrs:{to:"./operation/vt100/operator/"}},[e._v("VT100 Operator Information Manual")])],1)]),e._v(" "),e._m(32),e._v(" "),e._m(33),e._v(" "),e._m(34),e._v(" "),e._m(35),e._v(" "),e._m(36),e._v(" "),r("ul",[r("li",[e._v("implements a minimal set of 'AT' commands enabling it to behave as a serially connected modem")]),e._v(" "),r("li",[e._v("supports storing all 'S' register settings in non-volatile storage (NVRAM)")]),e._v(" "),r("li",[e._v("settings can be restored from NVRAM or restored to 'factory' defaults")]),e._v(" "),r("li",[e._v("settings are restored from NVRAM on reset and power-up")]),e._v(" "),r("li",[e._v("support 'DIAL' mode for outbound connections to hosts")]),e._v(" "),r("li",[e._v("supports 'ANSWER' mode for inbound connections including simulated 'RING' cycle")]),e._v(" "),r("li",[e._v("does not aim to reproduce every feature and command of any specific Hayes modem")]),e._v(" "),r("li",[e._v("connects to a WiFi access point over 2.4 GHz (802.11 b/g/n) as a WiFi station (STA mode)")]),e._v(" "),r("li",[e._v("cannot currently act as a WiFi access point (AP mode) - but this would be possible if it is a feature that people want")]),e._v(" "),r("li",[e._v("supports Telnet and TCP socket protocols for connecting to hosts")]),e._v(" "),e._m(37),e._v(" "),r("li",[e._v("supports CTS/RTS hardware flow-control")]),e._v(" "),r("li",[e._v("a full list of the 'AT' command set implemented and details of all the 'S' registers and their use is covered in the "),r("router-link",{attrs:{to:"./operation/modem/"}},[e._v("'AT' (Hayes) Serial Modem Operation Manual")])],1)]),e._v(" "),e._m(38),e._v(" "),r("ul",[r("li",[e._v("connects to the RC2014 over the Tx2/Rx2 lines (Pins 35 & 36) of the RC2014 Enhanced Bus")]),e._v(" "),r("li",[e._v("takes power from the bus from Gnd/5V (Pins 17 & 18)")]),e._v(" "),r("li",[e._v("compatible with all the speeds of the "),r("a",{attrs:{href:"https://rc2014.co.uk/modules/dual-serial-module-sio2/",target:"_blank",rel:"noopener noreferrer"}},[e._v("RC2014 Dual Serial Module SIO/2"),r("OutboundLink")],1),e._v(" or similar")]),e._v(" "),r("li",[e._v("CTS/RTS hardware flow-control over a 6-pin "),r("em",[e._v("modified FTDI")]),e._v(" style modem header (not the RC2014 Enhanced Bus)\n"),r("ul",[r("li",[e._v("making it compatible with the "),r("a",{attrs:{href:"https://smallcomputercentral.wordpress.com/sc104-z80-sio-2-module-rc2014/",target:"_blank",rel:"noopener noreferrer"}},[e._v("SC104 Z80 SIO/2 Module"),r("OutboundLink")],1),e._v(" with CTS/RTS flow-control")])])])]),e._v(" "),e._m(39),e._v(" "),e._m(40),e._v(" "),e._m(41),e._v(" "),r("ul",[r("li",[e._v("Firmware updates are hosted on "),r("a",{attrs:{href:"https://github.com/thehighnibble/vt132",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub"),r("OutboundLink")],1)]),e._v(" "),r("li",[e._v("The current production firmware can always be found at "),r("a",{attrs:{href:"https://github.com/thehighnibble/vt132/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[e._v("github.com/thehighnibble/vt132/releases/latest"),r("OutboundLink")],1)]),e._v(" "),r("li",[e._v("OTA Updates can be performed directly from the VT132 over Wi-Fi with only power, a VGA monitor and keyboard connected, no connected host (eg. RC2014 or PC) is required")])]),e._v(" "),r("p",[e._v("The process for OTA Updates is covered in the "),r("router-link",{attrs:{to:"./operation/ota/"}},[e._v("OTA Firmware Update Guide")])],1),e._v(" "),e._m(42),e._v(" "),e._m(43),e._v(" "),e._m(44),e._v(" "),e._m(45),e._v(" "),e._m(46),e._v(" "),e._m(47),e._v(" "),e._m(48),e._v(" "),e._m(49),e._v(" "),e._m(50),e._v(" "),e._m(51),e._v(" "),e._m(52),e._v(" "),e._m(53),e._v(" "),e._m(54),e._v(" "),e._m(55),e._v(" "),e._m(56),e._v(" "),e._m(57),e._v(" "),e._m(58),e._v(" "),e._m(59),e._v(" "),r("p",[e._v('3 3/8" x 3 3/8"')]),e._v(" "),r("p",[e._v("85mm x 85mm")]),e._v(" "),e._m(60),e._v(" "),r("p",[e._v("M4 holes (1 in each corner of the PCB)")]),e._v(" "),r("p",[e._v("at 75mm centers")]),e._v(" "),e._m(61),e._v(" "),r("p",[e._v("0.1 lbs")]),e._v(" "),r("p",[e._v("0.045 kg")]),e._v(" "),e._m(62),e._v(" "),e._m(63),e._v(" "),r("p",[e._v("5VDC @ 500 mA (max., < 100mA typical) - Powered from RC2014 Bus or via FTDI or Modem connectors (jumper selectable).")]),e._v(" "),e._m(64),e._v(" "),r("p",[e._v("TBA")]),e._v(" "),e._m(65),e._v(" "),r("p",[e._v('7 1/2" x 5.5" x 2"')]),e._v(" "),r("p",[e._v("190mm x 140mm x 50mm")]),e._v(" "),r("p",[e._v("(width x height x depth)")]),e._v(" "),e._m(66),e._v(" "),r("p",[e._v("less than 0.44 lbs")]),e._v(" "),r("p",[e._v("less than 0.2 kg")]),e._v(" "),r("h2",{attrs:{id:"bill-of-materials"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#bill-of-materials"}},[e._v("#")]),e._v(" "),r("router-link",{attrs:{to:"./bom/"}},[e._v("Bill-of-Materials")])],1),e._v(" "),r("h2",{attrs:{id:"operation-manual"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#operation-manual"}},[e._v("#")]),e._v(" "),r("router-link",{attrs:{to:"./operation/"}},[e._v("Operation Manual")])],1),e._v(" "),r("h2",{attrs:{id:"firmware-install-console-logs"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#firmware-install-console-logs"}},[e._v("#")]),e._v(" "),r("router-link",{attrs:{to:"./maint/"}},[e._v("Firmware Install & Console Logs")])],1)])}),r,!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/app.fbbdb5f2.js b/assets/js/app.fbbdb5f2.js new file mode 100644 index 0000000..822a9d6 --- /dev/null +++ b/assets/js/app.fbbdb5f2.js @@ -0,0 +1,14 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(e){function t(t){for(var r,a,s=t[0],l=t[1],u=t[2],p=0,d=[];p '};function i(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=i(e,r.minimum,1),n.status=1===e?null:e;var l=n.render(!t),u=l.querySelector(r.barSelector),c=r.speed,p=r.easing;return l.offsetWidth,a((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,function(e,t,n){var i;return(i="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,i}(e,c,p)),1===e?(s(l,{transition:"none",opacity:1}),l.offsetWidth,setTimeout((function(){s(l,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*i(Math.random()*t,.1,.95)),t=i(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var i,a=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(i=t.querySelector(r.spinnerSelector))&&d(i),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){c(document.documentElement,"nprogress-busy"),c(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&d(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var a=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()})),t[n]||(t[n]=function(t){var n=document.body.style;if(t in n)return t;for(var r,i=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);i--;)if((r=e[i]+o)in n)return r;return t}(n))}function r(e,t,r){t=n(t),e.style[t]=r}return function(e,t){var n,i,o=arguments;if(2==o.length)for(n in t)void 0!==(i=t[n])&&t.hasOwnProperty(n)&&r(e,n,i);else r(e,o[1],o[2])}}();function l(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;l(n,t)||(e.className=r.substring(1))}function c(e,t){var n,r=p(e);l(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function d(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n})?r.call(t,n,t,e):r)||(e.exports=i)},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t){var n=/^\s+|\s+$/g,r=/^[-+]0x[0-9a-f]+$/i,i=/^0b[01]+$/i,o=/^0o[0-7]+$/i,a=parseInt,s="object"==typeof global&&global&&global.Object===Object&&global,l="object"==typeof self&&self&&self.Object===Object&&self,u=s||l||Function("return this")(),c=Object.prototype.toString,p=Math.max,d=Math.min,f=function(){return u.Date.now()};function h(e,t,n){var r,i,o,a,s,l,u=0,c=!1,h=!1,g=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function y(t){var n=r,o=i;return r=i=void 0,u=t,a=e.apply(o,n)}function b(e){return u=e,s=setTimeout(w,t),c?y(e):a}function _(e){var n=e-l;return void 0===l||n>=t||n<0||h&&e-u>=o}function w(){var e=f();if(_(e))return C(e);s=setTimeout(w,function(e){var n=t-(e-l);return h?d(n,o-(e-u)):n}(e))}function C(e){return s=void 0,g&&r?y(e):(r=i=void 0,a)}function k(){var e=f(),n=_(e);if(r=arguments,i=this,l=e,n){if(void 0===s)return b(l);if(h)return s=setTimeout(w,t),y(l)}return void 0===s&&(s=setTimeout(w,t)),a}return t=m(t)||0,v(n)&&(c=!!n.leading,o=(h="maxWait"in n)?p(m(n.maxWait)||0,t):o,g="trailing"in n?!!n.trailing:g),k.cancel=function(){void 0!==s&&clearTimeout(s),u=0,r=l=i=s=void 0},k.flush=function(){return void 0===s?a:C(f())},k}function v(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function m(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==c.call(e)}(e))return NaN;if(v(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=v(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(n,"");var s=i.test(e);return s||o.test(e)?a(e.slice(2),s?2:8):r.test(e)?NaN:+e}e.exports=function(e,t,n){var r=!0,i=!0;if("function"!=typeof e)throw new TypeError("Expected a function");return v(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),h(e,t,{leading:r,maxWait:t,trailing:i})}},function(e,t,n){e.exports=n(49)},function(e,t,n){"use strict";n(2)},,function(e,t,n){"use strict";n(3)},,function(e,t,n){"use strict";n(4)},,function(e,t,n){"use strict";n(5)},,function(e,t,n){"use strict";n(6)},,function(e,t,n){"use strict";n(7)},,function(e,t,n){"use strict";n(8)},,function(e,t,n){"use strict";n(9)},,function(e,t,n){"use strict";n(10)},,function(e,t,n){"use strict";n(11)},,function(e,t,n){"use strict";n(12)},,function(e,t,n){"use strict";n(13)},,function(e,t,n){"use strict";n(14)},,function(e,t,n){"use strict";n(15)},,function(e,t,n){"use strict";n(16)},,function(e,t,n){"use strict";n.r(t); +/*! + * Vue.js v2.6.14 + * (c) 2014-2021 Evan You + * Released under the MIT License. + */ +var r=Object.freeze({});function i(e){return null==e}function o(e){return null!=e}function a(e){return!0===e}function s(e){return"string"==typeof e||"number"==typeof e||"symbol"==typeof e||"boolean"==typeof e}function l(e){return null!==e&&"object"==typeof e}var u=Object.prototype.toString;function c(e){return"[object Object]"===u.call(e)}function p(e){return"[object RegExp]"===u.call(e)}function d(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function f(e){return o(e)&&"function"==typeof e.then&&"function"==typeof e.catch}function h(e){return null==e?"":Array.isArray(e)||c(e)&&e.toString===u?JSON.stringify(e,null,2):String(e)}function v(e){var t=parseFloat(e);return isNaN(t)?e:t}function m(e,t){for(var n=Object.create(null),r=e.split(","),i=0;i -1)return e.splice(n,1)}}var b=Object.prototype.hasOwnProperty;function _(e,t){return b.call(e,t)}function w(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var C=/-(\w)/g,k=w((function(e){return e.replace(C,(function(e,t){return t?t.toUpperCase():""}))})),S=w((function(e){return e.charAt(0).toUpperCase()+e.slice(1)})),x=/\B([A-Z])/g,$=w((function(e){return e.replace(x,"-$1").toLowerCase()}));var T=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function A(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function O(e,t){for(var n in t)e[n]=t[n];return e}function E(e){for(var t={},n=0;n 0,Y=K&&K.indexOf("edge/")>0,J=(K&&K.indexOf("android"),K&&/iphone|ipad|ipod|ios/.test(K)||"ios"===G),Q=(K&&/chrome\/\d+/.test(K),K&&/phantomjs/.test(K),K&&K.match(/firefox\/(\d+)/)),ee={}.watch,te=!1;if(W)try{var ne={};Object.defineProperty(ne,"passive",{get:function(){te=!0}}),window.addEventListener("test-passive",null,ne)}catch(e){}var re=function(){return void 0===V&&(V=!W&&!z&&"undefined"!=typeof global&&(global.process&&"server"===global.process.env.VUE_ENV)),V},ie=W&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function oe(e){return"function"==typeof e&&/native code/.test(e.toString())}var ae,se="undefined"!=typeof Symbol&&oe(Symbol)&&"undefined"!=typeof Reflect&&oe(Reflect.ownKeys);ae="undefined"!=typeof Set&&oe(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var le=P,ue=0,ce=function(){this.id=ue++,this.subs=[]};ce.prototype.addSub=function(e){this.subs.push(e)},ce.prototype.removeSub=function(e){y(this.subs,e)},ce.prototype.depend=function(){ce.target&&ce.target.addDep(this)},ce.prototype.notify=function(){var e=this.subs.slice();for(var t=0,n=e.length;t -1)if(o&&!_(i,"default"))a=!1;else if(""===a||a===$(e)){var l=He(String,i.type);(l<0||s 0&&(pt((l=e(l,(n||"")+"_"+r))[0])&&pt(c)&&(p[u]=ge(c.text+l[0].text),l.shift()),p.push.apply(p,l)):s(l)?pt(c)?p[u]=ge(c.text+l):""!==l&&p.push(ge(l)):pt(l)&&pt(c)?p[u]=ge(c.text+l.text):(a(t._isVList)&&o(l.tag)&&i(l.key)&&o(n)&&(l.key="__vlist"+n+"_"+r+"__"),p.push(l)));return p}(e):void 0}function pt(e){return o(e)&&o(e.text)&&!1===e.isComment}function dt(e,t){if(e){for(var n=Object.create(null),r=se?Reflect.ownKeys(e):Object.keys(e),i=0;i 0,a=e?!!e.$stable:!o,s=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(a&&n&&n!==r&&s===n.$key&&!o&&!n.$hasNormal)return n;for(var l in i={},e)e[l]&&"$"!==l[0]&&(i[l]=gt(t,l,e[l]))}else i={};for(var u in t)u in i||(i[u]=yt(t,u));return e&&Object.isExtensible(e)&&(e._normalized=i),F(i,"$stable",a),F(i,"$key",s),F(i,"$hasNormal",o),i}function gt(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({}),t=(e=e&&"object"==typeof e&&!Array.isArray(e)?[e]:ct(e))&&e[0];return e&&(!t||1===e.length&&t.isComment&&!vt(t))?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function yt(e,t){return function(){return e[t]}}function bt(e,t){var n,r,i,a,s;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),r=0,i=e.length;rdocument.createEvent("Event").timeStamp&&(un=function(){return cn.now()})}function pn(){var e,t;for(ln=un(),an=!0,tn.sort((function(e,t){return e.id-t.id})),sn=0;sn sn&&tn[n].id>e.id;)n--;tn.splice(n+1,0,e)}else tn.push(e);on||(on=!0,nt(pn))}}(this)},fn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||l(e)||this.deep){var t=this.value;if(this.value=e,this.user){var n='callback for watcher "'+this.expression+'"';qe(this.cb,this.vm,[e,t],this.vm,n)}else this.cb.call(this.vm,e,t)}}},fn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},fn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},fn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||y(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var hn={enumerable:!0,configurable:!0,get:P,set:P};function vn(e,t,n){hn.get=function(){return this[t][n]},hn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,hn)}function mn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},i=e.$options._propKeys=[];e.$parent&&ke(!1);var o=function(o){i.push(o);var a=Me(o,t,n,e);$e(r,o,a),o in e||vn(e,"_props",o)};for(var a in t)o(a);ke(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]="function"!=typeof t[n]?P:T(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;c(t=e._data="function"==typeof t?function(e,t){de();try{return e.call(t,t)}catch(e){return Ve(e,t,"data()"),{}}finally{fe()}}(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,i=(e.$options.methods,n.length);for(;i--;){var o=n[i];0,r&&_(r,o)||(a=void 0,36!==(a=(o+"").charCodeAt(0))&&95!==a&&vn(e,"_data",o))}var a;xe(t,!0)}(e):xe(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=re();for(var i in t){var o=t[i],a="function"==typeof o?o:o.get;0,r||(n[i]=new fn(e,a||P,P,gn)),i in e||yn(e,i,o)}}(e,t.computed),t.watch&&t.watch!==ee&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var i=0;i -1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!p(e)&&e.test(t)}function An(e,t){var n=e.cache,r=e.keys,i=e._vnode;for(var o in n){var a=n[o];if(a){var s=a.name;s&&!t(s)&&On(n,o,r,i)}}}function On(e,t,n,r){var i=e[t];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),e[t]=null,y(n,t)}!function(e){e.prototype._init=function(e){var t=this;t._uid=Cn++,t._isVue=!0,e&&e._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r;var i=r.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(t,e):t.$options=De(kn(t.constructor),e||{},t),t._renderProxy=t,t._self=t,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(t),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&Zt(e,t)}(t),function(e){e._vnode=null,e._staticTrees=null;var t=e.$options,n=e.$vnode=t._parentVnode,i=n&&n.context;e.$slots=ft(t._renderChildren,i),e.$scopedSlots=r,e._c=function(t,n,r,i){return Ft(e,t,n,r,i,!1)},e.$createElement=function(t,n,r,i){return Ft(e,t,n,r,i,!0)};var o=n&&n.data;$e(e,"$attrs",o&&o.attrs||r,null,!0),$e(e,"$listeners",t._parentListeners||r,null,!0)}(t),en(t,"beforeCreate"),function(e){var t=dt(e.$options.inject,e);t&&(ke(!1),Object.keys(t).forEach((function(n){$e(e,n,t[n])})),ke(!0))}(t),mn(t),function(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}(t),en(t,"created"),t.$options.el&&t.$mount(t.$options.el)}}(Sn),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=Te,e.prototype.$delete=Ae,e.prototype.$watch=function(e,t,n){if(c(t))return wn(this,e,t,n);(n=n||{}).user=!0;var r=new fn(this,e,t,n);if(n.immediate){var i='callback for immediate watcher "'+r.expression+'"';de(),qe(t,this,[r.value],this,i),fe()}return function(){r.teardown()}}}(Sn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this;if(Array.isArray(e))for(var i=0,o=e.length;i 1?A(n):n;for(var r=A(arguments,1),i='event handler for "'+e+'"',o=0,a=n.length;oparseInt(this.max)&&On(e,t[0],t,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)On(this.cache,e,this.keys)},mounted:function(){var e=this;this.cacheVNode(),this.$watch("include",(function(t){An(e,(function(e){return Tn(t,e)}))})),this.$watch("exclude",(function(t){An(e,(function(e){return!Tn(t,e)}))}))},updated:function(){this.cacheVNode()},render:function(){var e=this.$slots.default,t=Wt(e),n=t&&t.componentOptions;if(n){var r=$n(n),i=this.include,o=this.exclude;if(i&&(!r||!Tn(i,r))||o&&r&&Tn(o,r))return t;var a=this.cache,s=this.keys,l=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;a[l]?(t.componentInstance=a[l].componentInstance,y(s,l),s.push(l)):(this.vnodeToCache=t,this.keyToCache=l),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return N}};Object.defineProperty(e,"config",t),e.util={warn:le,extend:O,mergeOptions:De,defineReactive:$e},e.set=Te,e.delete=Ae,e.nextTick=nt,e.observable=function(e){return xe(e),e},e.options=Object.create(null),U.forEach((function(t){e.options[t+"s"]=Object.create(null)})),e.options._base=e,O(e.options.components,Pn),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=A(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=De(this.options,e),this}}(e),xn(e),function(e){U.forEach((function(t){e[t]=function(e,n){return n?("component"===t&&c(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),"directive"===t&&"function"==typeof n&&(n={bind:n,update:n}),this.options[t+"s"][e]=n,n):this.options[t+"s"][e]}}))}(e)}(Sn),Object.defineProperty(Sn.prototype,"$isServer",{get:re}),Object.defineProperty(Sn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Sn,"FunctionalRenderContext",{value:Rt}),Sn.version="2.6.14";var In=m("style,class"),Ln=m("input,textarea,option,select,progress"),Rn=m("contenteditable,draggable,spellcheck"),jn=m("events,caret,typing,plaintext-only"),Dn=m("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),Un="http://www.w3.org/1999/xlink",Mn=function(e){return":"===e.charAt(5)&&"xlink"===e.slice(0,5)},Nn=function(e){return Mn(e)?e.slice(6,e.length):""},Bn=function(e){return null==e||!1===e};function Fn(e){for(var t=e.data,n=e,r=e;o(r.componentInstance);)(r=r.componentInstance._vnode)&&r.data&&(t=Hn(r.data,t));for(;o(n=n.parent);)n&&n.data&&(t=Hn(t,n.data));return function(e,t){if(o(e)||o(t))return Vn(e,qn(t));return""}(t.staticClass,t.class)}function Hn(e,t){return{staticClass:Vn(e.staticClass,t.staticClass),class:o(e.class)?[e.class,t.class]:t.class}}function Vn(e,t){return e?t?e+" "+t:e:t||""}function qn(e){return Array.isArray(e)?function(e){for(var t,n="",r=0,i=e.length;r-1?fr(e,t,n):Dn(t)?Bn(n)?e.removeAttribute(t):(n="allowfullscreen"===t&&"EMBED"===e.tagName?"true":t,e.setAttribute(t,n)):Rn(t)?e.setAttribute(t,function(e,t){return Bn(t)||"false"===t?"false":"contenteditable"===e&&jn(t)?t:"true"}(t,n)):Mn(t)?Bn(n)?e.removeAttributeNS(Un,Nn(t)):e.setAttributeNS(Un,t,n):fr(e,t,n)}function fr(e,t,n){if(Bn(n))e.removeAttribute(t);else{if(Z&&!X&&"TEXTAREA"===e.tagName&&"placeholder"===t&&""!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener("input",r)};e.addEventListener("input",r),e.__ieph=!0}e.setAttribute(t,n)}}var hr={create:pr,update:pr};function vr(e,t){var n=t.elm,r=t.data,a=e.data;if(!(i(r.staticClass)&&i(r.class)&&(i(a)||i(a.staticClass)&&i(a.class)))){var s=Fn(t),l=n._transitionClasses;o(l)&&(s=Vn(s,qn(l))),s!==n._prevClass&&(n.setAttribute("class",s),n._prevClass=s)}}var mr,gr={create:vr,update:vr};function yr(e,t,n){var r=mr;return function i(){var o=t.apply(null,arguments);null!==o&&wr(e,i,n,r)}}var br=Ke&&!(Q&&Number(Q[1])<=53);function _r(e,t,n,r){if(br){var i=ln,o=t;t=o._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=i||e.timeStamp<=0||e.target.ownerDocument!==document)return o.apply(this,arguments)}}mr.addEventListener(e,t,te?{capture:n,passive:r}:n)}function wr(e,t,n,r){(r||mr).removeEventListener(e,t._wrapper||t,n)}function Cr(e,t){if(!i(e.data.on)||!i(t.data.on)){var n=t.data.on||{},r=e.data.on||{};mr=t.elm,function(e){if(o(e.__r)){var t=Z?"change":"input";e[t]=[].concat(e.__r,e[t]||[]),delete e.__r}o(e.__c)&&(e.change=[].concat(e.__c,e.change||[]),delete e.__c)}(n),st(n,r,_r,wr,yr,t.context),mr=void 0}}var kr,Sr={create:Cr,update:Cr};function xr(e,t){if(!i(e.data.domProps)||!i(t.data.domProps)){var n,r,a=t.elm,s=e.data.domProps||{},l=t.data.domProps||{};for(n in o(l.__ob__)&&(l=t.data.domProps=O({},l)),s)n in l||(a[n]="");for(n in l){if(r=l[n],"textContent"===n||"innerHTML"===n){if(t.children&&(t.children.length=0),r===s[n])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===n&&"PROGRESS"!==a.tagName){a._value=r;var u=i(r)?"":String(r);$r(a,u)&&(a.value=u)}else if("innerHTML"===n&&Gn(a.tagName)&&i(a.innerHTML)){(kr=kr||document.createElement("div")).innerHTML="";for(var c=kr.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;c.firstChild;)a.appendChild(c.firstChild)}else if(r!==s[n])try{a[n]=r}catch(e){}}}}function $r(e,t){return!e.composing&&("OPTION"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var n=e.value,r=e._vModifiers;if(o(r)){if(r.number)return v(n)!==v(t);if(r.trim)return n.trim()!==t.trim()}return n!==t}(e,t))}var Tr={create:xr,update:xr},Ar=w((function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\))/g).forEach((function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}})),t}));function Or(e){var t=Er(e.style);return e.staticStyle?O(e.staticStyle,t):t}function Er(e){return Array.isArray(e)?E(e):"string"==typeof e?Ar(e):e}var Pr,Ir=/^--/,Lr=/\s*!important$/,Rr=function(e,t,n){if(Ir.test(t))e.style.setProperty(t,n);else if(Lr.test(n))e.style.setProperty($(t),n.replace(Lr,""),"important");else{var r=Dr(t);if(Array.isArray(n))for(var i=0,o=n.length;i -1?t.split(Nr).forEach((function(t){return e.classList.add(t)})):e.classList.add(t);else{var n=" "+(e.getAttribute("class")||"")+" ";n.indexOf(" "+t+" ")<0&&e.setAttribute("class",(n+t).trim())}}function Fr(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(" ")>-1?t.split(Nr).forEach((function(t){return e.classList.remove(t)})):e.classList.remove(t),e.classList.length||e.removeAttribute("class");else{for(var n=" "+(e.getAttribute("class")||"")+" ",r=" "+t+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?e.setAttribute("class",n):e.removeAttribute("class")}}function Hr(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&O(t,Vr(e.name||"v")),O(t,e),t}return"string"==typeof e?Vr(e):void 0}}var Vr=w((function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}})),qr=W&&!X,Wr="transition",zr="transitionend",Gr="animation",Kr="animationend";qr&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Wr="WebkitTransition",zr="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Gr="WebkitAnimation",Kr="webkitAnimationEnd"));var Zr=W?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Xr(e){Zr((function(){Zr(e)}))}function Yr(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),Br(e,t))}function Jr(e,t){e._transitionClasses&&y(e._transitionClasses,t),Fr(e,t)}function Qr(e,t,n){var r=ti(e,t),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s="transition"===i?zr:Kr,l=0,u=function(){e.removeEventListener(s,c),n()},c=function(t){t.target===e&&++l>=a&&u()};setTimeout((function(){l0&&(n="transition",c=a,p=o.length):"animation"===t?u>0&&(n="animation",c=u,p=l.length):p=(n=(c=Math.max(a,u))>0?a>u?"transition":"animation":null)?"transition"===n?o.length:l.length:0,{type:n,timeout:c,propCount:p,hasTransform:"transition"===n&&ei.test(r[Wr+"Property"])}}function ni(e,t){for(;e.length 1}function li(e,t){!0!==t.data.show&&ii(t)}var ui=function(e){var t,n,r={},l=e.modules,u=e.nodeOps;for(t=0;t h?b(e,i(n[g+1])?null:n[g+1].elm,n,f,g,r):f>g&&w(t,d,h)}(d,m,g,n,c):o(g)?(o(e.text)&&u.setTextContent(d,""),b(d,null,g,0,g.length-1,n)):o(m)?w(m,0,m.length-1):o(e.text)&&u.setTextContent(d,""):e.text!==t.text&&u.setTextContent(d,t.text),o(h)&&o(f=h.hook)&&o(f=f.postpatch)&&f(e,t)}}}function x(e,t,n){if(a(n)&&o(e.parent))e.parent.data.pendingInsert=t;else for(var r=0;r -1,a.selected!==o&&(a.selected=o);else if(R(hi(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}}function fi(e,t){return t.every((function(t){return!R(t,e)}))}function hi(e){return"_value"in e?e._value:e.value}function vi(e){e.target.composing=!0}function mi(e){e.target.composing&&(e.target.composing=!1,gi(e.target,"input"))}function gi(e,t){var n=document.createEvent("HTMLEvents");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function yi(e){return!e.componentInstance||e.data&&e.data.transition?e:yi(e.componentInstance._vnode)}var bi={model:ci,show:{bind:function(e,t,n){var r=t.value,i=(n=yi(n)).data&&n.data.transition,o=e.__vOriginalDisplay="none"===e.style.display?"":e.style.display;r&&i?(n.data.show=!0,ii(n,(function(){e.style.display=o}))):e.style.display=r?o:"none"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=yi(n)).data&&n.data.transition?(n.data.show=!0,r?ii(n,(function(){e.style.display=e.__vOriginalDisplay})):oi(n,(function(){e.style.display="none"}))):e.style.display=r?e.__vOriginalDisplay:"none")},unbind:function(e,t,n,r,i){i||(e.style.display=e.__vOriginalDisplay)}}},_i={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function wi(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?wi(Wt(t.children)):e}function Ci(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var i=n._parentListeners;for(var o in i)t[k(o)]=i[o];return t}function ki(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var Si=function(e){return e.tag||vt(e)},xi=function(e){return"show"===e.name},$i={name:"transition",props:_i,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(Si)).length){0;var r=this.mode;0;var i=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return i;var o=wi(i);if(!o)return i;if(this._leaving)return ki(e,i);var a="__transition-"+this._uid+"-";o.key=null==o.key?o.isComment?a+"comment":a+o.tag:s(o.key)?0===String(o.key).indexOf(a)?o.key:a+o.key:o.key;var l=(o.data||(o.data={})).transition=Ci(this),u=this._vnode,c=wi(u);if(o.data.directives&&o.data.directives.some(xi)&&(o.data.show=!0),c&&c.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(o,c)&&!vt(c)&&(!c.componentInstance||!c.componentInstance._vnode.isComment)){var p=c.data.transition=O({},l);if("out-in"===r)return this._leaving=!0,lt(p,"afterLeave",(function(){t._leaving=!1,t.$forceUpdate()})),ki(e,i);if("in-out"===r){if(vt(o))return u;var d,f=function(){d()};lt(l,"afterEnter",f),lt(l,"enterCancelled",f),lt(p,"delayLeave",(function(e){d=e}))}}return i}}},Ti=O({tag:String,moveClass:String},_i);function Ai(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function Oi(e){e.data.newPos=e.elm.getBoundingClientRect()}function Ei(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,i=t.top-n.top;if(r||i){e.data.moved=!0;var o=e.elm.style;o.transform=o.WebkitTransform="translate("+r+"px,"+i+"px)",o.transitionDuration="0s"}}delete Ti.mode;var Pi={Transition:$i,TransitionGroup:{props:Ti,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var i=Yt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,i(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=Ci(this),s=0;s -1?Zn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Zn[e]=/HTMLUnknownElement/.test(t.toString())},O(Sn.options.directives,bi),O(Sn.options.components,Pi),Sn.prototype.__patch__=W?ui:P,Sn.prototype.$mount=function(e,t){return function(e,t,n){var r;return e.$el=t,e.$options.render||(e.$options.render=me),en(e,"beforeMount"),r=function(){e._update(e._render(),n)},new fn(e,r,P,{before:function(){e._isMounted&&!e._isDestroyed&&en(e,"beforeUpdate")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,en(e,"mounted")),e}(this,e=e&&W?function(e){if("string"==typeof e){var t=document.querySelector(e);return t||document.createElement("div")}return e}(e):void 0,t)},W&&setTimeout((function(){N.devtools&&ie&&ie.emit("init",Sn)}),0);var Ii=Sn; +/*! + * vue-router v3.5.2 + * (c) 2021 Evan You + * @license MIT + */function Li(e,t){for(var n in t)e[n]=t[n];return e}var Ri=/[!'()*]/g,ji=function(e){return"%"+e.charCodeAt(0).toString(16)},Di=/%2C/g,Ui=function(e){return encodeURIComponent(e).replace(Ri,ji).replace(Di,",")};function Mi(e){try{return decodeURIComponent(e)}catch(e){0}return e}var Ni=function(e){return null==e||"object"==typeof e?e:String(e)};function Bi(e){var t={};return(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach((function(e){var n=e.replace(/\+/g," ").split("="),r=Mi(n.shift()),i=n.length>0?Mi(n.join("=")):null;void 0===t[r]?t[r]=i:Array.isArray(t[r])?t[r].push(i):t[r]=[t[r],i]})),t):t}function Fi(e){var t=e?Object.keys(e).map((function(t){var n=e[t];if(void 0===n)return"";if(null===n)return Ui(t);if(Array.isArray(n)){var r=[];return n.forEach((function(e){void 0!==e&&(null===e?r.push(Ui(t)):r.push(Ui(t)+"="+Ui(e)))})),r.join("&")}return Ui(t)+"="+Ui(n)})).filter((function(e){return e.length>0})).join("&"):null;return t?"?"+t:""}var Hi=/\/?$/;function Vi(e,t,n,r){var i=r&&r.options.stringifyQuery,o=t.query||{};try{o=qi(o)}catch(e){}var a={name:t.name||e&&e.name,meta:e&&e.meta||{},path:t.path||"/",hash:t.hash||"",query:o,params:t.params||{},fullPath:Gi(t,i),matched:e?zi(e):[]};return n&&(a.redirectedFrom=Gi(n,i)),Object.freeze(a)}function qi(e){if(Array.isArray(e))return e.map(qi);if(e&&"object"==typeof e){var t={};for(var n in e)t[n]=qi(e[n]);return t}return e}var Wi=Vi(null,{path:"/"});function zi(e){for(var t=[];e;)t.unshift(e),e=e.parent;return t}function Gi(e,t){var n=e.path,r=e.query;void 0===r&&(r={});var i=e.hash;return void 0===i&&(i=""),(n||"/")+(t||Fi)(r)+i}function Ki(e,t,n){return t===Wi?e===t:!!t&&(e.path&&t.path?e.path.replace(Hi,"")===t.path.replace(Hi,"")&&(n||e.hash===t.hash&&Zi(e.query,t.query)):!(!e.name||!t.name)&&(e.name===t.name&&(n||e.hash===t.hash&&Zi(e.query,t.query)&&Zi(e.params,t.params))))}function Zi(e,t){if(void 0===e&&(e={}),void 0===t&&(t={}),!e||!t)return e===t;var n=Object.keys(e).sort(),r=Object.keys(t).sort();return n.length===r.length&&n.every((function(n,i){var o=e[n];if(r[i]!==n)return!1;var a=t[n];return null==o||null==a?o===a:"object"==typeof o&&"object"==typeof a?Zi(o,a):String(o)===String(a)}))}function Xi(e){for(var t=0;t =0&&(t=e.slice(r),e=e.slice(0,r));var i=e.indexOf("?");return i>=0&&(n=e.slice(i+1),e=e.slice(0,i)),{path:e,query:n,hash:t}}(i.path||""),u=t&&t.path||"/",c=l.path?Qi(l.path,u,n||i.append):u,p=function(e,t,n){void 0===t&&(t={});var r,i=n||Bi;try{r=i(e||"")}catch(e){r={}}for(var o in t){var a=t[o];r[o]=Array.isArray(a)?a.map(Ni):Ni(a)}return r}(l.query,i.query,r&&r.options.parseQuery),d=i.hash||l.hash;return d&&"#"!==d.charAt(0)&&(d="#"+d),{_normalized:!0,path:c,query:p,hash:d}}var wo,Co=function(){},ko={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(e){var t=this,n=this.$router,r=this.$route,i=n.resolve(this.to,r,this.append),o=i.location,a=i.route,s=i.href,l={},u=n.options.linkActiveClass,c=n.options.linkExactActiveClass,p=null==u?"router-link-active":u,d=null==c?"router-link-exact-active":c,f=null==this.activeClass?p:this.activeClass,h=null==this.exactActiveClass?d:this.exactActiveClass,v=a.redirectedFrom?Vi(null,_o(a.redirectedFrom),null,n):a;l[h]=Ki(r,v,this.exactPath),l[f]=this.exact||this.exactPath?l[h]:function(e,t){return 0===e.path.replace(Hi,"/").indexOf(t.path.replace(Hi,"/"))&&(!t.hash||e.hash===t.hash)&&function(e,t){for(var n in t)if(!(n in e))return!1;return!0}(e.query,t.query)}(r,v);var m=l[h]?this.ariaCurrentValue:null,g=function(e){So(e)&&(t.replace?n.replace(o,Co):n.push(o,Co))},y={click:So};Array.isArray(this.event)?this.event.forEach((function(e){y[e]=g})):y[this.event]=g;var b={class:l},_=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:s,route:a,navigate:g,isActive:l[f],isExactActive:l[h]});if(_){if(1===_.length)return _[0];if(_.length>1||!_.length)return 0===_.length?e():e("span",{},_)}if("a"===this.tag)b.on=y,b.attrs={href:s,"aria-current":m};else{var w=function e(t){var n;if(t)for(var r=0;r -1&&(s.params[d]=n.params[d]);return s.path=bo(c.path,s.params),l(c,s,a)}if(s.path){s.params={};for(var f=0;f =e.length?n():e[i]?t(e[i],(function(){r(i+1)})):r(i+1)};r(0)}var Xo={redirected:2,aborted:4,cancelled:8,duplicated:16};function Yo(e,t){return Qo(e,t,Xo.redirected,'Redirected when going from "'+e.fullPath+'" to "'+function(e){if("string"==typeof e)return e;if("path"in e)return e.path;var t={};return ea.forEach((function(n){n in e&&(t[n]=e[n])})),JSON.stringify(t,null,2)}(t)+'" via a navigation guard.')}function Jo(e,t){return Qo(e,t,Xo.cancelled,'Navigation cancelled from "'+e.fullPath+'" to "'+t.fullPath+'" with a new navigation.')}function Qo(e,t,n,r){var i=new Error(r);return i._isRouter=!0,i.from=e,i.to=t,i.type=n,i}var ea=["params","query","hash"];function ta(e){return Object.prototype.toString.call(e).indexOf("Error")>-1}function na(e,t){return ta(e)&&e._isRouter&&(null==t||e.type===t)}function ra(e){return function(t,n,r){var i=!1,o=0,a=null;ia(e,(function(e,t,n,s){if("function"==typeof e&&void 0===e.cid){i=!0,o++;var l,u=sa((function(t){var i;((i=t).__esModule||aa&&"Module"===i[Symbol.toStringTag])&&(t=t.default),e.resolved="function"==typeof t?t:wo.extend(t),n.components[s]=t,--o<=0&&r()})),c=sa((function(e){var t="Failed to resolve async component "+s+": "+e;a||(a=ta(e)?e:new Error(t),r(a))}));try{l=e(u,c)}catch(e){c(e)}if(l)if("function"==typeof l.then)l.then(u,c);else{var p=l.component;p&&"function"==typeof p.then&&p.then(u,c)}}})),i||r()}}function ia(e,t){return oa(e.map((function(e){return Object.keys(e.components).map((function(n){return t(e.components[n],e.instances[n],e,n)}))})))}function oa(e){return Array.prototype.concat.apply([],e)}var aa="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function sa(e){var t=!1;return function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];if(!t)return t=!0,e.apply(this,n)}}var la=function(e,t){this.router=e,this.base=function(e){if(!e)if(xo){var t=document.querySelector("base");e=(e=t&&t.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else e="/";"/"!==e.charAt(0)&&(e="/"+e);return e.replace(/\/$/,"")}(t),this.current=Wi,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function ua(e,t,n,r){var i=ia(e,(function(e,r,i,o){var a=function(e,t){"function"!=typeof e&&(e=wo.extend(e));return e.options[t]}(e,t);if(a)return Array.isArray(a)?a.map((function(e){return n(e,r,i,o)})):n(a,r,i,o)}));return oa(r?i.reverse():i)}function ca(e,t){if(t)return function(){return e.apply(t,arguments)}}la.prototype.listen=function(e){this.cb=e},la.prototype.onReady=function(e,t){this.ready?e():(this.readyCbs.push(e),t&&this.readyErrorCbs.push(t))},la.prototype.onError=function(e){this.errorCbs.push(e)},la.prototype.transitionTo=function(e,t,n){var r,i=this;try{r=this.router.match(e,this.current)}catch(e){throw this.errorCbs.forEach((function(t){t(e)})),e}var o=this.current;this.confirmTransition(r,(function(){i.updateRoute(r),t&&t(r),i.ensureURL(),i.router.afterHooks.forEach((function(e){e&&e(r,o)})),i.ready||(i.ready=!0,i.readyCbs.forEach((function(e){e(r)})))}),(function(e){n&&n(e),e&&!i.ready&&(na(e,Xo.redirected)&&o===Wi||(i.ready=!0,i.readyErrorCbs.forEach((function(t){t(e)}))))}))},la.prototype.confirmTransition=function(e,t,n){var r=this,i=this.current;this.pending=e;var o,a,s=function(e){!na(e)&&ta(e)&&(r.errorCbs.length?r.errorCbs.forEach((function(t){t(e)})):console.error(e)),n&&n(e)},l=e.matched.length-1,u=i.matched.length-1;if(Ki(e,i)&&l===u&&e.matched[l]===i.matched[u])return this.ensureURL(),s(((a=Qo(o=i,e,Xo.duplicated,'Avoided redundant navigation to current location: "'+o.fullPath+'".')).name="NavigationDuplicated",a));var c=function(e,t){var n,r=Math.max(e.length,t.length);for(n=0;n 0)){var t=this.router,n=t.options.scrollBehavior,r=zo&&n;r&&this.listeners.push(Do());var i=function(){var n=e.current,i=da(e.base);e.current===Wi&&i===e._startLocation||e.transitionTo(i,(function(e){r&&Uo(t,e,n,!0)}))};window.addEventListener("popstate",i),this.listeners.push((function(){window.removeEventListener("popstate",i)}))}},t.prototype.go=function(e){window.history.go(e)},t.prototype.push=function(e,t,n){var r=this,i=this.current;this.transitionTo(e,(function(e){Go(eo(r.base+e.fullPath)),Uo(r.router,e,i,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,i=this.current;this.transitionTo(e,(function(e){Ko(eo(r.base+e.fullPath)),Uo(r.router,e,i,!1),t&&t(e)}),n)},t.prototype.ensureURL=function(e){if(da(this.base)!==this.current.fullPath){var t=eo(this.base+this.current.fullPath);e?Go(t):Ko(t)}},t.prototype.getCurrentLocation=function(){return da(this.base)},t}(la);function da(e){var t=window.location.pathname,n=t.toLowerCase(),r=e.toLowerCase();return!e||n!==r&&0!==n.indexOf(eo(r+"/"))||(t=t.slice(e.length)),(t||"/")+window.location.search+window.location.hash}var fa=function(e){function t(t,n,r){e.call(this,t,n),r&&function(e){var t=da(e);if(!/^\/#/.test(t))return window.location.replace(eo(e+"/#"+t)),!0}(this.base)||ha()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.setupListeners=function(){var e=this;if(!(this.listeners.length>0)){var t=this.router.options.scrollBehavior,n=zo&&t;n&&this.listeners.push(Do());var r=function(){var t=e.current;ha()&&e.transitionTo(va(),(function(r){n&&Uo(e.router,r,t,!0),zo||ya(r.fullPath)}))},i=zo?"popstate":"hashchange";window.addEventListener(i,r),this.listeners.push((function(){window.removeEventListener(i,r)}))}},t.prototype.push=function(e,t,n){var r=this,i=this.current;this.transitionTo(e,(function(e){ga(e.fullPath),Uo(r.router,e,i,!1),t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this,i=this.current;this.transitionTo(e,(function(e){ya(e.fullPath),Uo(r.router,e,i,!1),t&&t(e)}),n)},t.prototype.go=function(e){window.history.go(e)},t.prototype.ensureURL=function(e){var t=this.current.fullPath;va()!==t&&(e?ga(t):ya(t))},t.prototype.getCurrentLocation=function(){return va()},t}(la);function ha(){var e=va();return"/"===e.charAt(0)||(ya("/"+e),!1)}function va(){var e=window.location.href,t=e.indexOf("#");return t<0?"":e=e.slice(t+1)}function ma(e){var t=window.location.href,n=t.indexOf("#");return(n>=0?t.slice(0,n):t)+"#"+e}function ga(e){zo?Go(ma(e)):window.location.hash=e}function ya(e){zo?Ko(ma(e)):window.location.replace(ma(e))}var ba=function(e){function t(t,n){e.call(this,t,n),this.stack=[],this.index=-1}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.push=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index+1).concat(e),r.index++,t&&t(e)}),n)},t.prototype.replace=function(e,t,n){var r=this;this.transitionTo(e,(function(e){r.stack=r.stack.slice(0,r.index).concat(e),t&&t(e)}),n)},t.prototype.go=function(e){var t=this,n=this.index+e;if(!(n<0||n>=this.stack.length)){var r=this.stack[n];this.confirmTransition(r,(function(){var e=t.current;t.index=n,t.updateRoute(r),t.router.afterHooks.forEach((function(t){t&&t(r,e)}))}),(function(e){na(e,Xo.duplicated)&&(t.index=n)}))}},t.prototype.getCurrentLocation=function(){var e=this.stack[this.stack.length-1];return e?e.fullPath:"/"},t.prototype.ensureURL=function(){},t}(la),_a=function(e){void 0===e&&(e={}),this.app=null,this.apps=[],this.options=e,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=Ao(e.routes||[],this);var t=e.mode||"hash";switch(this.fallback="history"===t&&!zo&&!1!==e.fallback,this.fallback&&(t="hash"),xo||(t="abstract"),this.mode=t,t){case"history":this.history=new pa(this,e.base);break;case"hash":this.history=new fa(this,e.base,this.fallback);break;case"abstract":this.history=new ba(this,e.base);break;default:0}},wa={currentRoute:{configurable:!0}};function Ca(e,t){return e.push(t),function(){var n=e.indexOf(t);n>-1&&e.splice(n,1)}}_a.prototype.match=function(e,t,n){return this.matcher.match(e,t,n)},wa.currentRoute.get=function(){return this.history&&this.history.current},_a.prototype.init=function(e){var t=this;if(this.apps.push(e),e.$once("hook:destroyed",(function(){var n=t.apps.indexOf(e);n>-1&&t.apps.splice(n,1),t.app===e&&(t.app=t.apps[0]||null),t.app||t.history.teardown()})),!this.app){this.app=e;var n=this.history;if(n instanceof pa||n instanceof fa){var r=function(e){n.setupListeners(),function(e){var r=n.current,i=t.options.scrollBehavior;zo&&i&&"fullPath"in e&&Uo(t,e,r,!1)}(e)};n.transitionTo(n.getCurrentLocation(),r,r)}n.listen((function(e){t.apps.forEach((function(t){t._route=e}))}))}},_a.prototype.beforeEach=function(e){return Ca(this.beforeHooks,e)},_a.prototype.beforeResolve=function(e){return Ca(this.resolveHooks,e)},_a.prototype.afterEach=function(e){return Ca(this.afterHooks,e)},_a.prototype.onReady=function(e,t){this.history.onReady(e,t)},_a.prototype.onError=function(e){this.history.onError(e)},_a.prototype.push=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.push(e,t,n)}));this.history.push(e,t,n)},_a.prototype.replace=function(e,t,n){var r=this;if(!t&&!n&&"undefined"!=typeof Promise)return new Promise((function(t,n){r.history.replace(e,t,n)}));this.history.replace(e,t,n)},_a.prototype.go=function(e){this.history.go(e)},_a.prototype.back=function(){this.go(-1)},_a.prototype.forward=function(){this.go(1)},_a.prototype.getMatchedComponents=function(e){var t=e?e.matched?e:this.resolve(e).route:this.currentRoute;return t?[].concat.apply([],t.matched.map((function(e){return Object.keys(e.components).map((function(t){return e.components[t]}))}))):[]},_a.prototype.resolve=function(e,t,n){var r=_o(e,t=t||this.history.current,n,this),i=this.match(r,t),o=i.redirectedFrom||i.fullPath;return{location:r,route:i,href:function(e,t,n){var r="hash"===n?"#"+t:t;return e?eo(e+"/"+r):r}(this.history.base,o,this.mode),normalizedTo:r,resolved:i}},_a.prototype.getRoutes=function(){return this.matcher.getRoutes()},_a.prototype.addRoute=function(e,t){this.matcher.addRoute(e,t),this.history.current!==Wi&&this.history.transitionTo(this.history.getCurrentLocation())},_a.prototype.addRoutes=function(e){this.matcher.addRoutes(e),this.history.current!==Wi&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(_a.prototype,wa),_a.install=function e(t){if(!e.installed||wo!==t){e.installed=!0,wo=t;var n=function(e){return void 0!==e},r=function(e,t){var r=e.$options._parentVnode;n(r)&&n(r=r.data)&&n(r=r.registerRouteInstance)&&r(e,t)};t.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),t.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,r(this,this)},destroyed:function(){r(this)}}),Object.defineProperty(t.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(t.prototype,"$route",{get:function(){return this._routerRoot._route}}),t.component("RouterView",Yi),t.component("RouterLink",ko);var i=t.config.optionMergeStrategies;i.beforeRouteEnter=i.beforeRouteLeave=i.beforeRouteUpdate=i.created}},_a.version="3.5.2",_a.isNavigationFailure=na,_a.NavigationFailureType=Xo,_a.START_LOCATION=Wi,xo&&window.Vue&&window.Vue.use(_a);var ka=_a;function Sa(e,t){e.mixins||(e.mixins=[]),e.mixins.push(...t)}var xa={disableScrollBehavior:!1},$a=n(1),Ta=n.n($a);const Aa=/#.*$/,Oa=/\.(md|html)$/,Ea=/\/$/,Pa=/^(https?:|mailto:|tel:)/;function Ia(e){return decodeURI(e).replace(Aa,"").replace(Oa,"")}function La(e){return Pa.test(e)}function Ra(e){if(La(e))return e;const t=e.match(Aa),n=t?t[0]:"",r=Ia(e);return Ea.test(r)?e:r+".html"+n}function ja(e,t){const n=e.hash,r=function(e){const t=e.match(Aa);if(t)return t[0]}(t);if(r&&n!==r)return!1;return Ia(e.path)===Ia(t)}function Da(e,t,n){n&&(t=function(e,t,n){const r=e.charAt(0);if("/"===r)return e;if("?"===r||"#"===r)return t+e;const i=t.split("/");n&&i[i.length-1]||i.pop();const o=e.replace(/^\//,"").split("/");for(let e=0;e ({type:"auto",title:t.title,basePath:e.path,path:e.path+"#"+t.slug,children:t.children||[]}))}]}(e);const s=a.sidebar||o.sidebar;if(s){const{base:e,config:n}=function(e,t){if(Array.isArray(t))return{base:"/",config:t};for(const r in t)if(0===(n=e.path,/(\.html|\/)$/.test(n)?n:n+"/").indexOf(r))return{base:r,config:t[r]};var n;return{}}(t,s);return n?n.map(t=>function e(t,n,r,i){if("string"==typeof t)return Da(n,t,r);if(Array.isArray(t))return Object.assign(Da(n,t[0],r),{title:t[1]});{i&&console.error("[vuepress] Nested sidebar groups are not supported. Consider using navbar + categories instead.");const o=t.children||[];return{type:"group",title:t.title,children:o.map(t=>e(t,n,r,!0)),collapsable:!1!==t.collapsable}}}(t,i,e)):[]}return[]}function Ma(e){let t;return(e=e.map(e=>Object.assign({},e))).forEach(e=>{2===e.level?t=e:t&&(t.children||(t.children=[])).push(e)}),e.filter(e=>2===e.level)}function Na(e){return Object.assign(e,{type:e.items&&e.items.length?"links":"link"})}var Ba={props:{item:{required:!0}},computed:{link(){return Ra(this.item.link)},exact(){return this.$site.locales?Object.keys(this.$site.locales).some(e=>e===this.link):"/"===this.link}},methods:{isExternal:La,isMailto:function(e){return/^mailto:/.test(e)},isTel:function(e){return/^tel:/.test(e)}}},Fa=n(0),Ha=Object(Fa.a)(Ba,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.isExternal(e.link)?n("a",{staticClass:"nav-link external",attrs:{href:e.link,target:e.isMailto(e.link)||e.isTel(e.link)?null:"_blank",rel:e.isMailto(e.link)||e.isTel(e.link)?null:"noopener noreferrer"}},[e._v("\n "+e._s(e.item.text)+"\n "),n("OutboundLink")],1):n("router-link",{staticClass:"nav-link",attrs:{to:e.link,exact:e.exact}},[e._v(e._s(e.item.text))])}),[],!1,null,null,null).exports,Va={components:{NavLink:Ha},computed:{data(){return this.$page.frontmatter},actionLink(){return{link:this.data.actionLink,text:this.data.actionText}}}},qa=(n(19),Object(Fa.a)(Va,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"home"},[n("div",{staticClass:"hero"},[e.data.heroImage?n("img",{attrs:{src:e.$withBase(e.data.heroImage),alt:"hero"}}):e._e(),e._v(" "),n("h1",[e._v(e._s(e.data.heroText||e.$title||"Hello"))]),e._v(" "),n("p",{staticClass:"description"},[e._v("\n "+e._s(e.data.tagline||e.$description||"Welcome to your VuePress site")+"\n ")]),e._v(" "),e.data.actionText&&e.data.actionLink?n("p",{staticClass:"action"},[n("NavLink",{staticClass:"action-button",attrs:{item:e.actionLink}})],1):e._e()]),e._v(" "),e.data.features&&e.data.features.length?n("div",{staticClass:"features"},e._l(e.data.features,(function(t,r){return n("div",{key:r,staticClass:"feature"},[n("h2",[e._v(e._s(t.title))]),e._v(" "),n("p",[e._v(e._s(t.details))])])})),0):e._e(),e._v(" "),n("Content",{attrs:{custom:""}}),e._v(" "),e.data.footer?n("div",{staticClass:"footer"},[e._v("\n "+e._s(e.data.footer)+"\n ")]):e._e()],1)}),[],!1,null,null,null).exports),Wa=(n(21),Object(Fa.a)({},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"sidebar-button",on:{click:function(t){return e.$emit("toggle-sidebar")}}},[n("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[n("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null).exports),za={data:()=>({query:"",focused:!1,focusIndex:0}),computed:{showSuggestions(){return this.focused&&this.suggestions&&this.suggestions.length},suggestions(){const e=this.query.trim().toLowerCase();if(!e)return;const{pages:t,themeConfig:n}=this.$site,r=n.searchMaxSuggestions||5,i=this.$localePath,o=t=>t.title&&t.title.toLowerCase().indexOf(e)>-1,a=[];for(let e=0;e =r);e++){const n=t[e];if(this.getPageLocalePath(n)===i)if(o(n))a.push(n);else if(n.headers)for(let e=0;e =r);e++){const t=n.headers[e];o(t)&&a.push(Object.assign({},n,{path:n.path+"#"+t.slug,header:t}))}}return a},alignRight(){return(this.$site.themeConfig.nav||[]).length+(this.$site.repo?1:0)<=2}},methods:{getPageLocalePath(e){for(const t in this.$site.locales||{})if("/"!==t&&0===e.path.indexOf(t))return t;return"/"},onUp(){this.showSuggestions&&(this.focusIndex>0?this.focusIndex--:this.focusIndex=this.suggestions.length-1)},onDown(){this.showSuggestions&&(this.focusIndex "+e._s(t.header.title))]):e._e()])])})),0):e._e()])}),[],!1,null,null,null).exports),Ka={name:"DropdownTransition",methods:{setHeight(e){e.style.height=e.scrollHeight+"px"},unsetHeight(e){e.style.height=""}}},Za=(n(25),Object(Fa.a)(Ka,(function(){var e=this.$createElement;return(this._self._c||e)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null).exports),Xa={components:{NavLink:Ha,DropdownTransition:Za},data:()=>({open:!1}),props:{item:{required:!0}},methods:{toggle(){this.open=!this.open}}},Ya=(n(27),{components:{NavLink:Ha,DropdownLink:Object(Fa.a)(Xa,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"dropdown-wrapper",class:{open:e.open}},[n("a",{staticClass:"dropdown-title",on:{click:e.toggle}},[n("span",{staticClass:"title"},[e._v(e._s(e.item.text))]),e._v(" "),n("span",{staticClass:"arrow",class:e.open?"down":"right"})]),e._v(" "),n("DropdownTransition",[n("ul",{directives:[{name:"show",rawName:"v-show",value:e.open,expression:"open"}],staticClass:"nav-dropdown"},e._l(e.item.items,(function(t,r){return n("li",{key:t.link||r,staticClass:"dropdown-item"},["links"===t.type?n("h4",[e._v(e._s(t.text))]):e._e(),e._v(" "),"links"===t.type?n("ul",{staticClass:"dropdown-subitem-wrapper"},e._l(t.items,(function(e){return n("li",{key:e.link,staticClass:"dropdown-subitem"},[n("NavLink",{attrs:{item:e}})],1)})),0):n("NavLink",{attrs:{item:t}})],1)})),0)])],1)}),[],!1,null,null,null).exports},computed:{userNav(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav(){const{locales:e}=this.$site;if(e&&Object.keys(e).length>1){const t=this.$page.path,n=this.$router.options.routes,r=this.$site.themeConfig.locales||{},i={text:this.$themeLocaleConfig.selectText||"Languages",items:Object.keys(e).map(i=>{const o=e[i],a=r[i]&&r[i].label||o.lang;let s;return o.lang===this.$lang?s=t:(s=t.replace(this.$localeConfig.path,i),n.some(e=>e.path===s)||(s=i)),{text:a,link:s}})};return[...this.userNav,i]}return this.userNav},userLinks(){return(this.nav||[]).map(e=>Object.assign(Na(e),{items:(e.items||[]).map(Na)}))},repoLink(){const{repo:e}=this.$site.themeConfig;if(e)return/^https?:/.test(e)?e:"https://github.com/"+e},repoLabel(){if(!this.repoLink)return;if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;const e=this.repoLink.match(/^https?:\/\/[^/]+/)[0],t=["GitHub","GitLab","Bitbucket"];for(let n=0;n ({linksWrapMaxWidth:null}),mounted(){const e=parseInt(Qa(this.$el,"paddingLeft"))+parseInt(Qa(this.$el,"paddingRight")),t=()=>{document.documentElement.clientWidth<719?this.linksWrapMaxWidth=null:this.linksWrapMaxWidth=this.$el.offsetWidth-e-(this.$refs.siteName&&this.$refs.siteName.offsetWidth||0)};t(),window.addEventListener("resize",t,!1)},computed:{algolia(){return this.$themeLocaleConfig.algolia||this.$site.themeConfig.algolia||{}},isAlgoliaSearch(){return this.algolia&&this.algolia.apiKey&&this.algolia.indexName}}},ts=(n(31),Object(Fa.a)(es,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("header",{staticClass:"navbar"},[n("SidebarButton",{on:{"toggle-sidebar":function(t){return e.$emit("toggle-sidebar")}}}),e._v(" "),n("router-link",{staticClass:"home-link",attrs:{to:e.$localePath}},[e.$site.themeConfig.logo?n("img",{staticClass:"logo",attrs:{src:e.$withBase(e.$site.themeConfig.logo),alt:e.$siteTitle}}):e._e(),e._v(" "),e.$siteTitle?n("span",{ref:"siteName",staticClass:"site-name",class:{"can-hide":e.$site.themeConfig.logo}},[e._v(e._s(e.$siteTitle))]):e._e()]),e._v(" "),n("div",{staticClass:"links",style:{"max-width":e.linksWrapMaxWidth+"px"}},[e.isAlgoliaSearch?n("AlgoliaSearchBox",{attrs:{options:e.algolia}}):!1!==e.$site.themeConfig.search?n("SearchBox"):e._e(),e._v(" "),n("NavLinks",{staticClass:"can-hide"})],1)],1)}),[],!1,null,null,null).exports);function ns(e,t,n){const r=[];t.forEach(e=>{"group"===e.type?r.push(...e.children||[]):r.push(e)});for(let t=0;t i?null:e("ul",{class:"sidebar-sub-headers"},t.map(t=>{const a=ja(r,n+"#"+t.slug);return e("li",{class:"sidebar-sub-header"},[os(e,n+"#"+t.slug,t.title,a),as(e,t.children,n,r,i,o+1)])}))}var ss={functional:!0,props:["item"],render(e,{parent:{$page:t,$site:n,$route:r},props:{item:i}}){const o=ja(r,i.path),a="auto"===i.type?o||i.children.some(e=>ja(r,i.basePath+"#"+e.slug)):o,s=os(e,i.path,i.title||i.path,a),l=null!=t.frontmatter.sidebarDepth?t.frontmatter.sidebarDepth:n.themeConfig.sidebarDepth,u=null==l?1:l,c=!!n.themeConfig.displayAllHeaders;if("auto"===i.type)return[s,as(e,i.children,i.basePath,r,u)];if((a||c)&&i.headers&&!Aa.test(i.path)){return[s,as(e,Ma(i.headers),i.path,r,u)]}return s}},ls=(n(35),Object(Fa.a)(ss,void 0,void 0,!1,null,null,null).exports),us={name:"SidebarGroup",props:["item","first","open","collapsable"],components:{SidebarLink:ls,DropdownTransition:Za}};n(37);var cs={components:{SidebarGroup:Object(Fa.a)(us,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"sidebar-group",class:{first:e.first,collapsable:e.collapsable}},[n("p",{staticClass:"sidebar-heading",class:{open:e.open},on:{click:function(t){return e.$emit("toggle")}}},[n("span",[e._v(e._s(e.item.title))]),e._v(" "),e.collapsable?n("span",{staticClass:"arrow",class:e.open?"down":"right"}):e._e()]),e._v(" "),n("DropdownTransition",[e.open||!e.collapsable?n("ul",{ref:"items",staticClass:"sidebar-group-items"},e._l(e.item.children,(function(e){return n("li",[n("SidebarLink",{attrs:{item:e}})],1)})),0):e._e()])],1)}),[],!1,null,null,null).exports,SidebarLink:ls,NavLinks:Ja},props:["items"],data:()=>({openGroupIndex:0}),created(){this.refreshIndex()},watch:{$route(){this.refreshIndex()}},methods:{refreshIndex(){const e=function(e,t){for(let n=0;n ja(e,t.path)))return n}return-1}(this.$route,this.items);e>-1&&(this.openGroupIndex=e)},toggleGroup(e){this.openGroupIndex=e===this.openGroupIndex?-1:e},isActive(e){return ja(this.$route,e.path)}}},ps=(n(39),Object(Fa.a)(cs,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"sidebar"},[n("NavLinks"),e._v(" "),e._t("top"),e._v(" "),e.items.length?n("ul",{staticClass:"sidebar-links"},e._l(e.items,(function(t,r){return n("li",{key:r},["group"===t.type?n("SidebarGroup",{attrs:{item:t,first:0===r,open:r===e.openGroupIndex,collapsable:t.collapsable||t.collapsible},on:{toggle:function(t){return e.toggleGroup(r)}}}):n("SidebarLink",{attrs:{item:t}})],1)})),0):e._e(),e._v(" "),e._t("bottom")],2)}),[],!1,null,null,null).exports),ds={props:{updateEvent:{type:Object,default:null}},computed:{popupConfig(){for(const e of[this.$themeLocaleConfig,this.$site.themeConfig]){const t=e.serviceWorker;if(t&&t.updatePopup)return"object"==typeof t.updatePopup?t.updatePopup:{}}return null},enabled(){return Boolean(this.popupConfig&&this.updateEvent)},message(){const e=this.popupConfig;return e&&e.message||"New content is available."},buttonText(){const e=this.popupConfig;return e&&e.buttonText||"Refresh"}},methods:{reload(){this.updateEvent&&(this.updateEvent.skipWaiting().then(()=>{location.reload(!0)}),this.updateEvent=null)}}},fs=(n(41),{components:{Home:qa,Page:is,Sidebar:ps,Navbar:ts,SWUpdatePopup:Object(Fa.a)(ds,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("transition",{attrs:{name:"sw-update-popup"}},[e.enabled?n("div",{staticClass:"sw-update-popup"},[e._v("\n "+e._s(e.message)),n("br"),e._v(" "),n("button",{on:{click:e.reload}},[e._v(e._s(e.buttonText))])]):e._e()])}),[],!1,null,null,null).exports},data:()=>({isSidebarOpen:!1,swUpdateEvent:null}),computed:{shouldShowNavbar(){const{themeConfig:e}=this.$site,{frontmatter:t}=this.$page;return!1!==t.navbar&&!1!==e.navbar&&(this.$title||e.logo||e.repo||e.nav||this.$themeLocaleConfig.nav)},shouldShowSidebar(){const{frontmatter:e}=this.$page;return!e.layout&&!e.home&&!1!==e.sidebar&&this.sidebarItems.length},sidebarItems(){return Ua(this.$page,this.$route,this.$site,this.$localePath)},pageClasses(){const e=this.$page.frontmatter.pageClass;return[{"no-navbar":!this.shouldShowNavbar,"sidebar-open":this.isSidebarOpen,"no-sidebar":!this.shouldShowSidebar},e]}},mounted(){window.addEventListener("scroll",this.onScroll),Ta.a.configure({showSpinner:!1}),this.$router.beforeEach((e,t,n)=>{e.path===t.path||Ii.component(e.name)||Ta.a.start(),n()}),this.$router.afterEach(()=>{Ta.a.done(),this.isSidebarOpen=!1}),this.$on("sw-updated",this.onSWUpdated)},methods:{toggleSidebar(e){this.isSidebarOpen="boolean"==typeof e?e:!this.isSidebarOpen},onTouchStart(e){this.touchStart={x:e.changedTouches[0].clientX,y:e.changedTouches[0].clientY}},onTouchEnd(e){const t=e.changedTouches[0].clientX-this.touchStart.x,n=e.changedTouches[0].clientY-this.touchStart.y;Math.abs(t)>Math.abs(n)&&Math.abs(t)>40&&(t>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))},onSWUpdated(e){this.swUpdateEvent=e}}}),hs=(n(43),n(45),Object(Fa.a)(fs,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"theme-container",class:e.pageClasses,on:{touchstart:e.onTouchStart,touchend:e.onTouchEnd}},[e.shouldShowNavbar?n("Navbar",{on:{"toggle-sidebar":e.toggleSidebar}}):e._e(),e._v(" "),n("div",{staticClass:"sidebar-mask",on:{click:function(t){return e.toggleSidebar(!1)}}}),e._v(" "),n("Sidebar",{attrs:{items:e.sidebarItems},on:{"toggle-sidebar":e.toggleSidebar}},[e._t("sidebar-top",null,{slot:"top"}),e._v(" "),e._t("sidebar-bottom",null,{slot:"bottom"})],2),e._v(" "),e.$page.frontmatter.layout?n("div",{staticClass:"custom-layout"},[n(e.$page.frontmatter.layout,{tag:"component"})],1):e.$page.frontmatter.home?n("Home"):n("Page",{attrs:{"sidebar-items":e.sidebarItems}},[e._t("page-top",null,{slot:"top"}),e._v(" "),e._t("page-bottom",null,{slot:"bottom"})],2),e._v(" "),n("SWUpdatePopup",{attrs:{updateEvent:e.swUpdateEvent}})],1)}),[],!1,null,null,null).exports);const vs=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."];var ms={methods:{getMsg:()=>vs[Math.floor(Math.random()*vs.length)]}},gs=Object(Fa.a)(ms,(function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"theme-container"},[t("div",{staticClass:"content"},[t("h1",[this._v("404")]),this._v(" "),t("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),t("router-link",{attrs:{to:"/"}},[this._v("Take me home.")])],1)])}),[],!1,null,null,null).exports,ys={created(){this.$ssrContext&&(this.$ssrContext.title=this.$title,this.$ssrContext.lang=this.$lang,this.$ssrContext.description=this.$page.description||this.$description)},mounted(){this.currentMetaTags=new Set;const e=()=>{document.title=this.$title,document.documentElement.lang=this.$lang;const e=this.$page.frontmatter.meta||[],t=e.slice(0);0===e.filter(e=>"description"===e.name).length&&t.push({name:"description",content:this.$description});const n=document.querySelectorAll('meta[name="description"]');n.length&&n.forEach(e=>this.currentMetaTags.add(e)),this.currentMetaTags=new Set(bs(t,this.currentMetaTags))};this.$watch("$page",e),e()},beforeDestroy(){bs(null,this.currentMetaTags)}};function bs(e,t){if(t&&[...t].forEach(e=>{document.head.removeChild(e)}),e)return e.map(e=>{const t=document.createElement("meta");return Object.keys(e).forEach(n=>{t.setAttribute(n,e[n])}),document.head.appendChild(t),t})}var _s=n(17),ws=[ys,{mounted(){window.addEventListener("scroll",this.onScroll)},methods:{onScroll:n.n(_s)()((function(){this.setActiveHash()}),300),setActiveHash(){const e=[].slice.call(document.querySelectorAll(".sidebar-link")),t=[].slice.call(document.querySelectorAll(".header-anchor")).filter(t=>e.some(e=>e.hash===t.hash)),n=Math.max(window.pageYOffset,document.documentElement.scrollTop,document.body.scrollTop);for(let e=0;e =r.parentElement.offsetTop+10&&(!i||n {this.$nextTick(()=>{xa.disableScrollBehavior=!1})})}}},beforeDestroy(){window.removeEventListener("scroll",this.onScroll)}}];Sa(hs,ws),Sa(gs,ws);const Cs=[{name:"v-d340e45c2c4b4",path:"/",component:hs,beforeEnter:(e,t,r)=>{n.e(25).then(n.bind(null,253)).then(e=>{Ii.component("v-d340e45c2c4b4",e.default),r()})}},{path:"/index.html",redirect:"/"},{name:"v-88f3927654483",path:"/cromemcoZ1/",component:hs,beforeEnter:(e,t,r)=>{n.e(11).then(n.bind(null,254)).then(e=>{Ii.component("v-88f3927654483",e.default),r()})}},{path:"/cromemcoZ1/index.html",redirect:"/cromemcoZ1/"},{name:"v-75a0dc5c270f1",path:"/cromemcoZ1/configure/",component:hs,beforeEnter:(e,t,r)=>{n.e(16).then(n.bind(null,255)).then(e=>{Ii.component("v-75a0dc5c270f1",e.default),r()})}},{path:"/cromemcoZ1/configure/index.html",redirect:"/cromemcoZ1/configure/"},{name:"v-6e40af26273f7",path:"/imsai8080/",component:hs,beforeEnter:(e,t,r)=>{n.e(10).then(n.bind(null,256)).then(e=>{Ii.component("v-6e40af26273f7",e.default),r()})}},{path:"/imsai8080/index.html",redirect:"/imsai8080/"},{name:"v-8e0ad72bd5537",path:"/imsai8080/assembly/",component:hs,beforeEnter:(e,t,r)=>{n.e(26).then(n.bind(null,257)).then(e=>{Ii.component("v-8e0ad72bd5537",e.default),r()})}},{path:"/imsai8080/assembly/index.html",redirect:"/imsai8080/assembly/"},{name:"v-f8b9a631e75c7",path:"/imsai8080/bom/",component:hs,beforeEnter:(e,t,r)=>{n.e(3).then(n.bind(null,258)).then(e=>{Ii.component("v-f8b9a631e75c7",e.default),r()})}},{path:"/imsai8080/bom/index.html",redirect:"/imsai8080/bom/"},{name:"v-5c2e66553a585",path:"/imsai8080/configure/",component:hs,beforeEnter:(e,t,r)=>{n.e(17).then(n.bind(null,259)).then(e=>{Ii.component("v-5c2e66553a585",e.default),r()})}},{path:"/imsai8080/configure/index.html",redirect:"/imsai8080/configure/"},{name:"v-d73392e74801b",path:"/imsai8080/configure/old_version_prior_v1.10.0/",component:hs,beforeEnter:(e,t,r)=>{n.e(18).then(n.bind(null,260)).then(e=>{Ii.component("v-d73392e74801b",e.default),r()})}},{path:"/imsai8080/configure/old_version_prior_v1.10.0/index.html",redirect:"/imsai8080/configure/old_version_prior_v1.10.0/"},{name:"v-76f76dfbd5b9e",path:"/imsai8080/tools/",component:hs,beforeEnter:(e,t,r)=>{n.e(5).then(n.bind(null,261)).then(e=>{Ii.component("v-76f76dfbd5b9e",e.default),r()})}},{path:"/imsai8080/tools/index.html",redirect:"/imsai8080/tools/"},{name:"v-f7c266ac0d929",path:"/imsai8080/troubleshooting/",component:hs,beforeEnter:(e,t,r)=>{n.e(27).then(n.bind(null,262)).then(e=>{Ii.component("v-f7c266ac0d929",e.default),r()})}},{path:"/imsai8080/troubleshooting/index.html",redirect:"/imsai8080/troubleshooting/"},{name:"v-dcfeaebb97ca9",path:"/imsai8080/update/",component:hs,beforeEnter:(e,t,r)=>{n.e(19).then(n.bind(null,263)).then(e=>{Ii.component("v-dcfeaebb97ca9",e.default),r()})}},{path:"/imsai8080/update/index.html",redirect:"/imsai8080/update/"},{name:"v-c4b5cbdf122cc",path:"/s132/",component:hs,beforeEnter:(e,t,r)=>{n.e(20).then(n.bind(null,264)).then(e=>{Ii.component("v-c4b5cbdf122cc",e.default),r()})}},{path:"/s132/index.html",redirect:"/s132/"},{name:"v-8b503f2636aca",path:"/s132/bom/",component:hs,beforeEnter:(e,t,r)=>{n.e(2).then(n.bind(null,265)).then(e=>{Ii.component("v-8b503f2636aca",e.default),r()})}},{path:"/s132/bom/index.html",redirect:"/s132/bom/"},{name:"v-11d09ebc6a9b2",path:"/s132/build/",component:hs,beforeEnter:(e,t,r)=>{n.e(21).then(n.bind(null,266)).then(e=>{Ii.component("v-11d09ebc6a9b2",e.default),r()})}},{path:"/s132/build/index.html",redirect:"/s132/build/"},{name:"v-340a135d15ff",path:"/s132/configure/",component:hs,beforeEnter:(e,t,r)=>{n.e(28).then(n.bind(null,267)).then(e=>{Ii.component("v-340a135d15ff",e.default),r()})}},{path:"/s132/configure/index.html",redirect:"/s132/configure/"},{name:"v-bdc2ef3030e06",path:"/s132/maint/",component:hs,beforeEnter:(e,t,r)=>{n.e(29).then(n.bind(null,268)).then(e=>{Ii.component("v-bdc2ef3030e06",e.default),r()})}},{path:"/s132/maint/index.html",redirect:"/s132/maint/"},{name:"v-31d503703b77a",path:"/s132/pinouts/",component:hs,beforeEnter:(e,t,r)=>{n.e(22).then(n.bind(null,269)).then(e=>{Ii.component("v-31d503703b77a",e.default),r()})}},{path:"/s132/pinouts/index.html",redirect:"/s132/pinouts/"},{name:"v-9e27502461f4c",path:"/s132/update/",component:hs,beforeEnter:(e,t,r)=>{n.e(30).then(n.bind(null,270)).then(e=>{Ii.component("v-9e27502461f4c",e.default),r()})}},{path:"/s132/update/index.html",redirect:"/s132/update/"},{name:"v-68028d8fe112",path:"/vt132/",component:hs,beforeEnter:(e,t,r)=>{n.e(9).then(n.bind(null,271)).then(e=>{Ii.component("v-68028d8fe112",e.default),r()})}},{path:"/vt132/index.html",redirect:"/vt132/"},{name:"v-a66daca09014",path:"/vt132/bom/",component:hs,beforeEnter:(e,t,r)=>{n.e(4).then(n.bind(null,272)).then(e=>{Ii.component("v-a66daca09014",e.default),r()})}},{path:"/vt132/bom/index.html",redirect:"/vt132/bom/"},{name:"v-b695fcf1f5758",path:"/vt132/maint/",component:hs,beforeEnter:(e,t,r)=>{n.e(31).then(n.bind(null,273)).then(e=>{Ii.component("v-b695fcf1f5758",e.default),r()})}},{path:"/vt132/maint/index.html",redirect:"/vt132/maint/"},{name:"v-a3ad5766aa1ec",path:"/vt132/operation/",component:hs,beforeEnter:(e,t,r)=>{n.e(13).then(n.bind(null,274)).then(e=>{Ii.component("v-a3ad5766aa1ec",e.default),r()})}},{path:"/vt132/operation/index.html",redirect:"/vt132/operation/"},{name:"v-5d48b690e02f6",path:"/vt132/operation/modem/",component:hs,beforeEnter:(e,t,r)=>{n.e(23).then(n.bind(null,275)).then(e=>{Ii.component("v-5d48b690e02f6",e.default),r()})}},{path:"/vt132/operation/modem/index.html",redirect:"/vt132/operation/modem/"},{name:"v-ce4bf4615cd5e",path:"/vt132/operation/ota/",component:hs,beforeEnter:(e,t,r)=>{n.e(24).then(n.bind(null,276)).then(e=>{Ii.component("v-ce4bf4615cd5e",e.default),r()})}},{path:"/vt132/operation/ota/index.html",redirect:"/vt132/operation/ota/"},{name:"v-a1705864e6a64",path:"/vt132/operation/uhc/",component:hs,beforeEnter:(e,t,r)=>{n.e(6).then(n.bind(null,277)).then(e=>{Ii.component("v-a1705864e6a64",e.default),r()})}},{path:"/vt132/operation/uhc/index.html",redirect:"/vt132/operation/uhc/"},{name:"v-def4c5639ebda",path:"/vt132/operation/vt100/operator/",component:hs,beforeEnter:(e,t,r)=>{n.e(14).then(n.bind(null,278)).then(e=>{Ii.component("v-def4c5639ebda",e.default),r()})}},{path:"/vt132/operation/vt100/operator/index.html",redirect:"/vt132/operation/vt100/operator/"},{name:"v-f8010b0f0b53f",path:"/vt132/operation/vt100/operator/quick-menu/",component:hs,beforeEnter:(e,t,r)=>{n.e(7).then(n.bind(null,279)).then(e=>{Ii.component("v-f8010b0f0b53f",e.default),r()})}},{path:"/vt132/operation/vt100/operator/quick-menu/index.html",redirect:"/vt132/operation/vt100/operator/quick-menu/"},{name:"v-9a4ac1797e38a",path:"/vt132/operation/vt100/operator/setup-c/",component:hs,beforeEnter:(e,t,r)=>{n.e(8).then(n.bind(null,280)).then(e=>{Ii.component("v-9a4ac1797e38a",e.default),r()})}},{path:"/vt132/operation/vt100/operator/setup-c/index.html",redirect:"/vt132/operation/vt100/operator/setup-c/"},{name:"v-ba500bb037e18",path:"/vt132/operation/vt100/operator/setup-d/",component:hs,beforeEnter:(e,t,r)=>{n.e(15).then(n.bind(null,281)).then(e=>{Ii.component("v-ba500bb037e18",e.default),r()})}},{path:"/vt132/operation/vt100/operator/setup-d/index.html",redirect:"/vt132/operation/vt100/operator/setup-d/"},{name:"v-f2404da4b52e9",path:"/vt132/operation/vt100/programmer/",component:hs,beforeEnter:(e,t,r)=>{n.e(32).then(n.bind(null,282)).then(e=>{Ii.component("v-f2404da4b52e9",e.default),r()})}},{path:"/vt132/operation/vt100/programmer/index.html",redirect:"/vt132/operation/vt100/programmer/"},{path:"*",component:gs}],ks={title:"The High Nibble",description:"",base:"/",pages:[{key:"v-d340e45c2c4b4",path:"/",lastUpdated:1678348869e3,title:"Home",frontmatter:{home:!0,heroImage:"/img/THN_Logo.png",heroText:" ",tagline:" ",actionText:"IMSAI 8080 Replica details →",actionLink:"/imsai8080/",footer:"The High Nibble @TheHighNibble │ Copyright © The High Nibble Pty Ltd 2017-present | ACN 633 867 268"}},{key:"v-88f3927654483",path:"/cromemcoZ1/",lastUpdated:1731105837e3,title:"Cromemco Z-1 replica",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Features",slug:"features"},{level:2,title:"Availability",slug:"availability"},{level:3,title:"Expression of interest",slug:"expression-of-interest"},{level:2,title:"News & Updates",slug:"news-updates"},{level:2,title:"Forum",slug:"forum"},{level:2,title:"Specifications",slug:"specifications"},{level:3,title:"Dimensions (built)",slug:"dimensions-built"},{level:3,title:"Weight (built)",slug:"weight-built"},{level:3,title:"Power",slug:"power"},{level:3,title:"Dimensions (boxed/shipped)",slug:"dimensions-boxed-shipped"},{level:3,title:"Weight (boxed/shipped)",slug:"weight-boxed-shipped"},{level:2,title:"Bill-of-Materials",slug:"bill-of-materials"},{level:2,title:"Recommended tools for assembly",slug:"recommended-tools-for-assembly"},{level:2,title:"Step-by-step assembly guide",slug:"step-by-step-assembly-guide"},{level:2,title:"Configuration",slug:"configuration"},{level:2,title:"Updating Software",slug:"updating-software"},{level:2,title:"Troubleshooting (draft)",slug:"troubleshooting-draft"},{level:2,title:"Enhancements and Add-ons",slug:"enhancements-and-add-ons"},{level:3,title:"Planned",slug:"planned"}],frontmatter:{sidebar:"auto",editLink:!1}},{key:"v-75a0dc5c270f1",path:"/cromemcoZ1/configure/",lastUpdated:1661584931e3,title:"Configuration (Draft)",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Getting connected",slug:"getting-connected"},{level:2,title:"Default configuration",slug:"default-configuration"},{level:3,title:"Cromemco Z-1 (guest)",slug:"cromemco-z-1-guest"},{level:3,title:"ESP32 (host)",slug:"esp32-host"},{level:2,title:"Startup configuration (Non-Volatile Storage, NVS)",slug:"startup-configuration-non-volatile-storage-nvs"},{level:2,title:"Serial Communications (RS232, USB)",slug:"serial-communications-rs232-usb"},{level:3,title:"Serial UART over USB",slug:"serial-uart-over-usb"},{level:3,title:"Serial UART over RS232",slug:"serial-uart-over-rs232"},{level:3,title:"Configuring physical UART parameters (speed, data & stop bits)",slug:"configuring-physical-uart-parameters-speed-data-stop-bits"},{level:2,title:"Wi-Fi Communications",slug:"wi-fi-communications"},{level:2,title:"Boot.conf file",slug:"boot-conf-file"},{level:3,title:"Default boot.conf",slug:"default-boot-conf"},{level:3,title:"Network Configuration",slug:"network-configuration"},{level:3,title:"UART Configuration",slug:"uart-configuration"},{level:3,title:"Performance parameters",slug:"performance-parameters"},{level:3,title:"Harddisk image",slug:"harddisk-image"},{level:3,title:"TU-ART device mappings",slug:"tu-art-device-mappings"},{level:3,title:"Modem initialization string",slug:"modem-initialization-string"},{level:2,title:"System.conf file",slug:"system-conf-file"},{level:3,title:"Memory maps",slug:"memory-maps"}],frontmatter:{sidebar:"auto"}},{key:"v-6e40af26273f7",path:"/imsai8080/",lastUpdated:1731105837e3,title:"IMSAI 8080 replica",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Features",slug:"features"},{level:3,title:"Notes",slug:"notes"},{level:2,title:"Availability",slug:"availability"},{level:3,title:"Expression of interest",slug:"expression-of-interest"},{level:2,title:"News & Updates",slug:"news-updates"},{level:2,title:"Forum",slug:"forum"},{level:2,title:"Specifications",slug:"specifications"},{level:3,title:"Dimensions (built)",slug:"dimensions-built"},{level:3,title:"Weight (built)",slug:"weight-built"},{level:3,title:"Power",slug:"power"},{level:3,title:"Dimensions (boxed/shipped)",slug:"dimensions-boxed-shipped"},{level:3,title:"Weight (boxed/shipped)",slug:"weight-boxed-shipped"},{level:2,title:"Bill-of-Materials",slug:"bill-of-materials"},{level:2,title:"Recommended tools for assembly",slug:"recommended-tools-for-assembly"},{level:2,title:"Step-by-step assembly guide",slug:"step-by-step-assembly-guide"},{level:2,title:"Configuration (draft)",slug:"configuration-draft"},{level:2,title:"Updating Software (draft)",slug:"updating-software-draft"},{level:2,title:"Troubleshooting (draft)",slug:"troubleshooting-draft"},{level:2,title:"Enhancements and Add-ons",slug:"enhancements-and-add-ons"},{level:3,title:"Planned",slug:"planned"}],frontmatter:{sidebar:"auto",editLink:!1}},{key:"v-8e0ad72bd5537",path:"/imsai8080/assembly/",lastUpdated:1664943416e3,title:"Step-by-step Assembly Guide (Draft)",headers:[{level:2,title:"Notices",slug:"notices"},{level:2,title:"Unpacking and checking against the BOM",slug:"unpacking-and-checking-against-the-bom"},{level:2,title:"PCB & Soldering",slug:"pcb-soldering"},{level:3,title:"ESP32 Microcontroller, PSRAM & micro SD Card Socket",slug:"esp32-microcontroller-psram-micro-sd-card-socket"},{level:3,title:"LEDs and accompanying Resistors",slug:"leds-and-accompanying-resistors"},{level:3,title:"Other Resistors, Capacitors, IC sockets & Miscellaneous Parts",slug:"other-resistors-capacitors-ic-sockets-miscellaneous-parts"},{level:3,title:"Inserting the ICs",slug:"inserting-the-ics"},{level:2,title:"Testing I",slug:"testing-i"},{level:2,title:"Rocker/Toggle Switches",slug:"rocker-toggle-switches"},{level:2,title:"Testing II",slug:"testing-ii"},{level:2,title:"Full Front Panel Stack",slug:"full-front-panel-stack"},{level:2,title:"Switch Surround",slug:"switch-surround"},{level:2,title:"The Lid",slug:"the-lid"},{level:2,title:"Celebrating",slug:"celebrating"}],frontmatter:{sidebar:"auto"}},{key:"v-f8b9a631e75c7",path:"/imsai8080/bom/",lastUpdated:1625894459e3,title:"Bill of Materials (Draft)",headers:[{level:2,title:"Through Hole (THT) components",slug:"through-hole-tht-components"},{level:2,title:"Surface Mount Device (SMD) components",slug:"surface-mount-device-smd-components"},{level:2,title:"Rocker Switches",slug:"rocker-switches"},{level:2,title:"Miscellaneous components",slug:"miscellaneous-components"},{level:2,title:"Mounting hardware",slug:"mounting-hardware"},{level:2,title:"Acrylic parts",slug:"acrylic-parts"}],frontmatter:{sidebar:"auto"}},{key:"v-5c2e66553a585",path:"/imsai8080/configure/",lastUpdated:1677100978e3,title:"Configuration - v1.10.0 or later",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Getting connected",slug:"getting-connected"},{level:2,title:"Default configuration",slug:"default-configuration"},{level:3,title:"IMSAI 8080 (guest)",slug:"imsai-8080-guest"},{level:3,title:"ESP32 (host)",slug:"esp32-host"},{level:2,title:"Startup configuration (Non-Volatile Storage, NVS)",slug:"startup-configuration-non-volatile-storage-nvs"},{level:2,title:"Serial Communications (RS232, USB)",slug:"serial-communications-rs232-usb"},{level:3,title:"Serial UART over USB",slug:"serial-uart-over-usb"},{level:3,title:"Serial UART over RS232",slug:"serial-uart-over-rs232"},{level:3,title:"Configuring physical UART parameters (speed, data & stop bits)",slug:"configuring-physical-uart-parameters-speed-data-stop-bits"},{level:2,title:"Wi-Fi Communications",slug:"wi-fi-communications"},{level:2,title:"Boot.conf file",slug:"boot-conf-file"},{level:3,title:"Default boot.conf",slug:"default-boot-conf"},{level:3,title:"Network Configuration",slug:"network-configuration"},{level:3,title:"UART Configuration",slug:"uart-configuration"},{level:3,title:"Performance parameters",slug:"performance-parameters"},{level:3,title:"Harddisk image",slug:"harddisk-image"},{level:3,title:"SIO-2 port mappings",slug:"sio-2-port-mappings"},{level:3,title:"Modem initialization string",slug:"modem-initialization-string"},{level:2,title:"System.conf file",slug:"system-conf-file"},{level:3,title:"SIO flags",slug:"sio-flags"},{level:3,title:"Memory maps",slug:"memory-maps"}],frontmatter:{sidebar:"auto"}},{key:"v-d73392e74801b",path:"/imsai8080/configure/old_version_prior_v1.10.0/",lastUpdated:166494344e4,title:"Configuration - v1.9.1 or earlier",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Getting connected",slug:"getting-connected"},{level:2,title:"Default configuration",slug:"default-configuration"},{level:3,title:"IMSAI 8080 (guest)",slug:"imsai-8080-guest"},{level:3,title:"ESP32 (host)",slug:"esp32-host"},{level:2,title:"Startup configuration (Non-Volatile Storage, NVS)",slug:"startup-configuration-non-volatile-storage-nvs"},{level:2,title:"Serial Communications (RS232, USB)",slug:"serial-communications-rs232-usb"},{level:3,title:"Serial UART over USB",slug:"serial-uart-over-usb"},{level:3,title:"Serial UART over RS232",slug:"serial-uart-over-rs232"},{level:3,title:"Configuring physical UART parameters (speed, data & stop bits)",slug:"configuring-physical-uart-parameters-speed-data-stop-bits"},{level:2,title:"Wi-Fi Communications",slug:"wi-fi-communications"},{level:2,title:"Boot.conf file",slug:"boot-conf-file"},{level:3,title:"Default boot.conf",slug:"default-boot-conf"},{level:3,title:"Network Configuration",slug:"network-configuration"},{level:3,title:"Bootrom Configuration",slug:"bootrom-configuration"},{level:3,title:"UART Configuration",slug:"uart-configuration"},{level:3,title:"Harddisk image",slug:"harddisk-image"},{level:3,title:"Performance parameters",slug:"performance-parameters"},{level:3,title:"Modem initialization string",slug:"modem-initialization-string"},{level:3,title:"SIO-2 port mappings",slug:"sio-2-port-mappings"},{level:2,title:"System.conf file",slug:"system-conf-file"},{level:3,title:"SIO flags",slug:"sio-flags"},{level:3,title:"RAM size",slug:"ram-size"}],frontmatter:{sidebar:"auto"}},{key:"v-76f76dfbd5b9e",path:"/imsai8080/tools/",lastUpdated:1562154277e3,title:"Tools (Draft)",headers:[{level:2,title:"Soldering tools & supplies",slug:"soldering-tools-supplies"},{level:2,title:"Clean-up supplies",slug:"clean-up-supplies"},{level:2,title:"Tools",slug:"tools"},{level:2,title:"Miscellaneous",slug:"miscellaneous"}],frontmatter:{sidebar:"auto"}},{key:"v-f7c266ac0d929",path:"/imsai8080/troubleshooting/",lastUpdated:1678258791e3,title:"Troubleshooting (Draft)",headers:[{level:2,title:"During assembly",slug:"during-assembly"},{level:3,title:"With just the ESP32, PSRAM and microSD card in place (and supporting passives)",slug:"with-just-the-esp32-psram-and-microsd-card-in-place-and-supporting-passives"},{level:3,title:"With all the LEDs and ICs in place (and supporting passives)",slug:"with-all-the-leds-and-ics-in-place-and-supporting-passives"},{level:3,title:"With the toggle switches in place",slug:"with-the-toggle-switches-in-place"},{level:2,title:"After assembly",slug:"after-assembly"},{level:3,title:"Essential hardware functionality (LEDs and Toggle Switches)",slug:"essential-hardware-functionality-leds-and-toggle-switches"},{level:3,title:"The hardware checks out, you suspect it is the software",slug:"the-hardware-checks-out-you-suspect-it-is-the-software"}],frontmatter:{sidebar:"auto"}},{key:"v-dcfeaebb97ca9",path:"/imsai8080/update/",lastUpdated:168652865e4,title:"Updating Software (Draft)",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Updating the Firmware",slug:"updating-the-firmware"},{level:3,title:"Download the firmware from GitHub",slug:"download-the-firmware-from-github"},{level:3,title:"Upload (flash) the firmware to the ESP32",slug:"upload-flash-the-firmware-to-the-esp32"},{level:3,title:"Reboot the ESP32",slug:"reboot-the-esp32"},{level:3,title:"Checking the firmware version",slug:"checking-the-firmware-version"},{level:3,title:"Background - Over The Air (OTA) updates",slug:"background-over-the-air-ota-updates"},{level:2,title:"Updating the µSD card Image",slug:"updating-the-µsd-card-image"},{level:3,title:"Updating using drag & drop",slug:"updating-using-drag-drop"},{level:3,title:"Updating in a Windows/Mac/Linux PC",slug:"updating-in-a-windows-mac-linux-pc"},{level:3,title:"Checking the Desktop UI version",slug:"checking-the-desktop-ui-version"}],frontmatter:{sidebar:"auto"}},{key:"v-c4b5cbdf122cc",path:"/s132/",lastUpdated:1725172611e3,title:"S-132",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Functions",slug:"functions"},{level:3,title:"Pinouts for the D+7A I/O connector",slug:"pinouts-for-the-d-7a-i-o-connector"},{level:3,title:"Firmware Updates",slug:"firmware-updates"},{level:2,title:"Availability",slug:"availability"},{level:3,title:"Pricing",slug:"pricing"},{level:3,title:"To Order",slug:"to-order"},{level:2,title:"Configuration (draft)",slug:"configuration-draft"},{level:2,title:"Bill-of-Materials (draft)",slug:"bill-of-materials-draft"},{level:2,title:"Build notes (draft)",slug:"build-notes-draft"},{level:2,title:"Firmware Install & Console Log",slug:"firmware-install-console-log"}],frontmatter:{sidebar:"auto",editLink:!1}},{key:"v-8b503f2636aca",path:"/s132/bom/",lastUpdated:1679888074e3,title:"S-132 Bill of Materials (Draft)",headers:[{level:2,title:"Main S-132 PCB (green)",slug:"main-s-132-pcb-green"},{level:3,title:"Surface Mount Device (SMD) components",slug:"surface-mount-device-smd-components"},{level:3,title:"Through Hole (THT) components",slug:"through-hole-tht-components"},{level:3,title:"Through Hole (THT) headers",slug:"through-hole-tht-headers"},{level:3,title:"Through Hole (THT) connectors",slug:"through-hole-tht-connectors"},{level:3,title:"Printed Circuit Board (PCB)",slug:"printed-circuit-board-pcb"},{level:2,title:"Mounting hardware",slug:"mounting-hardware"},{level:2,title:"Joystick Adapter (yellow)",slug:"joystick-adapter-yellow"},{level:2,title:"JS-1 Analog Joystick (yellow x 2)",slug:"js-1-analog-joystick-yellow-x-2"},{level:2,title:"Parallel Printer (red)",slug:"parallel-printer-red"},{level:2,title:"Prototype Adapter (green)",slug:"prototype-adapter-green"}],frontmatter:{sidebar:"auto"}},{key:"v-11d09ebc6a9b2",path:"/s132/build/",lastUpdated:1681358122e3,title:"Build notes",headers:[{level:2,title:"Hi-resolution image of the finished PCB",slug:"hi-resolution-image-of-the-finished-pcb"},{level:2,title:"Notes",slug:"notes"}],frontmatter:{sidebar:"auto"}},{key:"v-340a135d15ff",path:"/s132/configure/",lastUpdated:167853796e4,title:"Configuration (Draft)",headers:[{level:2,title:"Start-up",slug:"start-up"},{level:2,title:"Power Options",slug:"power-options"},{level:2,title:"Configure the IMSAI8080",slug:"configure-the-imsai8080"},{level:2,title:"Configure the Cromemco Z-1",slug:"configure-the-cromemco-z-1"},{level:2,title:"D+7AIO Settings",slug:"d-7aio-settings"}],frontmatter:{sidebar:"auto"}},{key:"v-bdc2ef3030e06",path:"/s132/maint/",lastUpdated:1674262834e3,title:"S-132 Firmware Install & Console Logs",headers:[{level:2,title:"Full install",slug:"full-install"},{level:3,title:"Note:",slug:"note"}],frontmatter:{sidebar:!1,editLink:!1}},{key:"v-31d503703b77a",path:"/s132/pinouts/",lastUpdated:1678526451e3,title:"D+7A I/O connector pinouts",headers:[{level:2,title:"Original S-100 Cromemco D+7A I/O connector",slug:"original-s-100-cromemco-d-7a-i-o-connector"},{level:2,title:"S-132 D+7A I/O connector",slug:"s-132-d-7a-i-o-connector"},{level:2,title:"Notes:",slug:"notes"}],frontmatter:{sidebar:"auto"}},{key:"v-9e27502461f4c",path:"/s132/update/",lastUpdated:1725172611e3,title:"S-132 Firmware Update Guide",headers:[{level:2,title:"Download the update file from GitHub",slug:"download-the-update-file-from-github"},{level:2,title:"Copy the update file to the host (IMSAI8080 or Cromemco Z-1)",slug:"copy-the-update-file-to-the-host-imsai8080-or-cromemco-z-1"},{level:2,title:"Reset the host (IMSAIO8080 or Cromemco Z-1)",slug:"reset-the-host-imsaio8080-or-cromemco-z-1"},{level:2,title:"Start the Flash F/W process on the S-132",slug:"start-the-flash-f-w-process-on-the-s-132"}],frontmatter:{sidebar:"auto",editLink:!1}},{key:"v-68028d8fe112",path:"/vt132/",lastUpdated:1725172611e3,title:"VT132",headers:[{level:2,title:"Overview",slug:"overview"},{level:2,title:"Editions",slug:"editions"},{level:3,title:"VT132 Designed for RC2104 edition",slug:"vt132-designed-for-rc2104-edition"},{level:3,title:"VT132 Stand Alone edition",slug:"vt132-stand-alone-edition"},{level:2,title:"Features",slug:"features"},{level:3,title:"VT100 Terminal",slug:"vt100-terminal"},{level:3,title:"Telnet/WiFi 'AT' (Hayes) Modem",slug:"telnet-wifi-at-hayes-modem"},{level:3,title:"Over-the-Air (OTA) Firmware Updates",slug:"over-the-air-ota-firmware-updates"},{level:2,title:"Availability",slug:"availability"},{level:3,title:"VT132 Designed for RC2104 edition",slug:"vt132-designed-for-rc2104-edition-4"},{level:3,title:"VT132 Stand Alone edition",slug:"vt132-stand-alone-edition-4"},{level:3,title:"USB-HID keyboard support",slug:"usb-hid-keyboard-support"},{level:3,title:"To Order",slug:"to-order"},{level:2,title:"Specifications",slug:"specifications"},{level:3,title:"Dimensions (built)",slug:"dimensions-built"},{level:3,title:"Weight (built)",slug:"weight-built"},{level:3,title:"Power",slug:"power"},{level:3,title:"Dimensions (boxed/shipped)",slug:"dimensions-boxed-shipped"},{level:3,title:"Weight (boxed/shipped)",slug:"weight-boxed-shipped"},{level:2,title:"Bill-of-Materials",slug:"bill-of-materials"},{level:2,title:"Operation Manual",slug:"operation-manual"},{level:2,title:"Firmware Install & Console Logs",slug:"firmware-install-console-logs"}],frontmatter:{sidebar:"auto",editLink:!1}},{key:"v-a66daca09014",path:"/vt132/bom/",lastUpdated:1602972951e3,title:"VT132 Bill of Materials (Draft)",headers:[{level:2,title:"Surface Mount Device (SMD) components",slug:"surface-mount-device-smd-components"},{level:2,title:"Through Hole (THT) components",slug:"through-hole-tht-components"},{level:2,title:"Through Hole (THT) headers",slug:"through-hole-tht-headers"},{level:2,title:"Through Hole (THT) connectors",slug:"through-hole-tht-connectors"},{level:2,title:"Printed Circuit Board (PCB)",slug:"printed-circuit-board-pcb"}],frontmatter:{sidebar:"auto"}},{key:"v-b695fcf1f5758",path:"/vt132/maint/",lastUpdated:1674262834e3,title:"VT132 Firmware Install & Console Logs",headers:[{level:2,title:"Full install",slug:"full-install"},{level:3,title:"Note:",slug:"note"}],frontmatter:{sidebar:!1,editLink:!1}},{key:"v-a3ad5766aa1ec",path:"/vt132/operation/",lastUpdated:1632275512e3,title:"VT132 Operation Manual (Draft)",headers:[{level:2,title:"Assembly",slug:"assembly"},{level:3,title:"VT132 Designed for RC2104 edition",slug:"vt132-designed-for-rc2104-edition"},{level:3,title:"VT132 Stand Alone edition",slug:"vt132-stand-alone-edition"},{level:3,title:"New: USB daughter board (Red PCB) for USB-HID keyboards",slug:"new-usb-daughter-board-red-pcb-for-usb-hid-keyboards"},{level:2,title:"Hardware configuration",slug:"hardware-configuration"},{level:3,title:"VT132 Designed for RC2104 edition",slug:"vt132-designed-for-rc2104-edition-2"},{level:3,title:"VT132 Stand Alone edition",slug:"vt132-stand-alone-edition-2"},{level:3,title:"USB daughter board (Red PCB) for USB-HID keyboards",slug:"usb-daughter-board-red-pcb-for-usb-hid-keyboards"},{level:2,title:"VT132 Quick Reference Guide Print-ready PDF",slug:"vt132-quick-reference-guide-print-ready-pdf"},{level:2,title:"VT100 (enhanced) Operator Information",slug:"vt100-enhanced-operator-information"},{level:2,title:"VT100 (enhanced) Programmer Information",slug:"vt100-enhanced-programmer-information"},{level:2,title:"VT100 (enhanced) Quick Menu Guide",slug:"vt100-enhanced-quick-menu-guide"},{level:2,title:"'AT' (Hayes) Serial Modem Operation Manual",slug:"at-hayes-serial-modem-operation-manual"},{level:2,title:"Over-the-Air (OTA) Firmware Update Guide",slug:"over-the-air-ota-firmware-update-guide"},{level:2,title:"USB Host Controller (UHC) Firmware Update Guide",slug:"usb-host-controller-uhc-firmware-update-guide"}],frontmatter:{sidebar:"auto"}},{key:"v-5d48b690e02f6",path:"/vt132/operation/modem/",lastUpdated:1625894503e3,title:"'AT' (Hayes) Serial Modem Operation Manual (Draft)",headers:[{level:2,title:"Background",slug:"background"},{level:2,title:"'AT' Commands",slug:"at-commands"},{level:3,title:"'AT' Command Help",slug:"at-command-help"},{level:3,title:"'AT' Command Summary Table",slug:"at-command-summary-table"},{level:2,title:"'S' Registers",slug:"s-registers"},{level:3,title:"Defined 'S' Registers",slug:"defined-s-registers"},{level:2,title:"Wi-Fi Connection Results",slug:"wi-fi-connection-results"},{level:3,title:"Dial Responses",slug:"dial-responses"},{level:3,title:"Query Wi-Fi Responses",slug:"query-wi-fi-responses"},{level:2,title:"Telnet Protocol",slug:"telnet-protocol"},{level:3,title:"Telnet Options Implemented",slug:"telnet-options-implemented"},{level:3,title:"Enabling Telnet Protocol",slug:"enabling-telnet-protocol"},{level:3,title:"Telnet Protocol Framework",slug:"telnet-protocol-framework"},{level:2,title:"Answer Mode",slug:"answer-mode"}],frontmatter:{sidebar:"auto"}},{key:"v-ce4bf4615cd5e",path:"/vt132/operation/ota/",lastUpdated:1609198445e3,title:"Over-the-Air (OTA) Firmware Update Guide (Draft)",headers:[{level:2,title:"Update to latest version from GitHub repository (recommended)",slug:"update-to-latest-version-from-github-repository-recommended"},{level:2,title:"Update to a version from a local web server",slug:"update-to-a-version-from-a-local-web-server"},{level:2,title:"Update to a version using the ESP-IDF epstool.py utility",slug:"update-to-a-version-using-the-esp-idf-epstool-py-utility"},{level:2,title:"For the security conscious",slug:"for-the-security-conscious"}],frontmatter:{sidebar:"auto"}},{key:"v-a1705864e6a64",path:"/vt132/operation/uhc/",lastUpdated:1632275512e3,title:"USB Host Controller (UHC) Firmware Update Guide (Draft)",headers:[{level:2,title:"Background",slug:"background"},{level:2,title:"Update Procedure Overview",slug:"update-procedure-overview"},{level:2,title:"Update Procedure Step-by-Step guide",slug:"update-procedure-step-by-step-guide"},{level:3,title:"Update the VT132 to the latest release",slug:"update-the-vt132-to-the-latest-release"},{level:3,title:"Navigate to the SET-UP D screen of the VT132",slug:"navigate-to-the-set-up-d-screen-of-the-vt132"},{level:3,title:"Show the keyboard device status",slug:"show-the-keyboard-device-status"},{level:3,title:"Start the UHC firmware update process",slug:"start-the-uhc-firmware-update-process"},{level:3,title:"Proceeding with the update process",slug:"proceeding-with-the-update-process"},{level:3,title:"Finishing the update process",slug:"finishing-the-update-process"}],frontmatter:{sidebar:"auto"}},{key:"v-def4c5639ebda",path:"/vt132/operation/vt100/operator/",lastUpdated:1609198746e3,title:"VT100 (enhanced) Operator Information (Draft)",headers:[{level:2,title:"Background",slug:"background"},{level:2,title:"Part 1 - Keyboard Control and Indictors",slug:"part-1-keyboard-control-and-indictors"},{level:3,title:"Key and indicator mappings for the PC keyboard",slug:"key-and-indicator-mappings-for-the-pc-keyboard"},{level:3,title:"International keyboard support (enhancement)",slug:"international-keyboard-support-enhancement"},{level:2,title:"Part 2 - Set-Up Mode",slug:"part-2-set-up-mode"},{level:3,title:"ONLINE/LOCAL indicator",slug:"online-local-indicator"},{level:3,title:"SET-UP screen HELP (enhancement)",slug:"set-up-screen-help-enhancement"},{level:3,title:"SET-UP A - reset Tab-Stops (enhancement)",slug:"set-up-a-reset-tab-stops-enhancement"},{level:3,title:"SET-UP B - T/R Speed",slug:"set-up-b-t-r-speed"},{level:3,title:"SET-UP B - clear NVR (reset to factory defaults) (enhancement)",slug:"set-up-b-clear-nvr-reset-to-factory-defaults-enhancement"},{level:3,title:"SET-UP B - advance to next setup screen (enhancement)",slug:"set-up-b-advance-to-next-setup-screen-enhancement"},{level:3,title:"SET-UP C - Code Pages, ANSI colours, System Information (enhancement)",slug:"set-up-c-code-pages-ansi-colours-system-information-enhancement"},{level:3,title:"SET-UP D - Multinational Character Set, NRCS, International Keyboards, Personalities (enhancement)",slug:"set-up-d-multinational-character-set-nrcs-international-keyboards-personalities-enhancement"},{level:2,title:"Part 3 – Definition of Each SET-UP Feature",slug:"part-3-–-definition-of-each-set-up-feature"},{level:3,title:"BITS PER CHARACTER (enhancement)",slug:"bits-per-character-enhancement"},{level:3,title:"INTERLACE",slug:"interlace"},{level:3,title:"PARITY",slug:"parity"},{level:3,title:"PARITY SENSE (ODD/EVEN)",slug:"parity-sense-odd-even"},{level:3,title:"POWER (enhancement) now: Backspace DEL/BS",slug:"power-enhancement-now-backspace-del-bs"},{level:3,title:"BOLD is BRIGHT (enhancement)",slug:"bold-is-bright-enhancement"},{level:3,title:"BOLD is THICK (enhancement)",slug:"bold-is-thick-enhancement"},{level:3,title:"Set ANSI.SYS compliance (enhancement)",slug:"set-ansi-sys-compliance-enhancement"},{level:3,title:"Set NUMLOCK on Reset (enhancement)",slug:"set-numlock-on-reset-enhancement"},{level:3,title:"SCREEN BRIGHTNESS",slug:"screen-brightness"},{level:2,title:"Part 4 – Self-Testing the VT100",slug:"part-4-–-self-testing-the-vt100"}],frontmatter:{sidebar:"auto"}},{key:"v-f8010b0f0b53f",path:"/vt132/operation/vt100/operator/quick-menu/",lastUpdated:1724039274e3,title:"Quick Menu Guide (Draft)",headers:[{level:2,title:"Overview and rationale",slug:"overview-and-rationale"},{level:2,title:"Accessing the Quick Menu",slug:"accessing-the-quick-menu"},{level:2,title:"Keyboard navigation in the Quick Menu",slug:"keyboard-navigation-in-the-quick-menu"},{level:2,title:"Indicators in the Quick Menu",slug:"indicators-in-the-quick-menu"},{level:2,title:"Actions menu",slug:"actions-menu"},{level:2,title:"New: Display menu",slug:"new-display-menu"},{level:2,title:"Terminal type menu",slug:"terminal-type-menu"},{level:2,title:"ASCII Emulation menu",slug:"ascii-emulation-menu"},{level:3,title:"DEC VT100 emulation modes",slug:"dec-vt100-emulation-modes"},{level:3,title:"ANSI.SYS emulation mode",slug:"ansi-sys-emulation-mode"},{level:2,title:"Keyboard menu",slug:"keyboard-menu"},{level:2,title:"Modem menu",slug:"modem-menu"},{level:2,title:"On-line (root menu)",slug:"on-line-root-menu"},{level:2,title:"Save settings (root menu)",slug:"save-settings-root-menu"},{level:2,title:"Restore settings (root menu)",slug:"restore-settings-root-menu"},{level:2,title:"Exit (root menu)",slug:"exit-root-menu"}],frontmatter:{sidebar:"auto"}},{key:"v-9a4ac1797e38a",path:"/vt132/operation/vt100/operator/setup-c/",lastUpdated:1626249482e3,title:"SET-UP C - Code Pages, ANSI colours, System Information (enhancement)",headers:[{level:2,title:"Background",slug:"background"},{level:2,title:"Help",slug:"help"},{level:2,title:"Codepage Support",slug:"codepage-support"},{level:3,title:"DEC VT100/VT220 ROM Code Page",slug:"dec-vt100-vt220-rom-code-page"},{level:3,title:"PC Code Page 437",slug:"pc-code-page-437"},{level:3,title:"DEC VT220/Latin-1 Code Page",slug:"dec-vt220-latin-1-code-page"},{level:2,title:"24/25/30 Line Support",slug:"_24-25-30-line-support"},{level:2,title:"ANSI/VGA Palette Support",slug:"ansi-vga-palette-support"},{level:2,title:"Setting Default Foreground and Background Colours",slug:"setting-default-foreground-and-background-colours"},{level:3,title:"Showing the currently loaded DECDLD / DRCS soft font",slug:"showing-the-currently-loaded-decdld-drcs-soft-font"},{level:2,title:"SET-UP C - advance to next setup screen",slug:"set-up-c-advance-to-next-setup-screen"}],frontmatter:{sidebar:"auto"}},{key:"v-ba500bb037e18",path:"/vt132/operation/vt100/operator/setup-d/",lastUpdated:1724039274e3,title:"SET-UP D - Multinational Character Set, NRCS, International Keyboards, Personalities (enhancement)",headers:[{level:2,title:"Background",slug:"background"},{level:2,title:"Help",slug:"help"},{level:2,title:"DEC Multinational Character Set (MCS 8-bit) Support",slug:"dec-multinational-character-set-mcs-8-bit-support"},{level:2,title:"DEC National Replacement Character Set (NRCS 7-bit) Support",slug:"dec-national-replacement-character-set-nrcs-7-bit-support"},{level:2,title:"International Keyboard Support",slug:"international-keyboard-support"},{level:2,title:"Selecting character set and keyboard support",slug:"selecting-character-set-and-keyboard-support"},{level:2,title:"Personality Support",slug:"personality-support"},{level:2,title:"Selecting personality support",slug:"selecting-personality-support"},{level:2,title:"SET-UP D - advance to next setup screen",slug:"set-up-d-advance-to-next-setup-screen"}],frontmatter:{sidebar:"auto"}},{key:"v-f2404da4b52e9",path:"/vt132/operation/vt100/programmer/",lastUpdated:1609198596e3,title:"VT100 (enhanced) Programmer Information (Draft)",headers:[{level:2,title:"Background",slug:"background"},{level:2,title:"The Keyboard",slug:"the-keyboard"},{level:3,title:"LED Indicators",slug:"led-indicators"},{level:3,title:"SET-UP",slug:"set-up"},{level:3,title:"NO SCROLL",slug:"no-scroll"},{level:3,title:"BREAK",slug:"break"},{level:2,title:"Communications Protocols",slug:"communications-protocols"},{level:3,title:"Full Duplex",slug:"full-duplex"},{level:2,title:"Terminal Control Commands",slug:"terminal-control-commands"},{level:3,title:"Control Characters",slug:"control-characters"},{level:3,title:"Control Sequences",slug:"control-sequences"},{level:3,title:"Original VT100 Control Sequences",slug:"original-vt100-control-sequences"},{level:3,title:"Additional Control Sequences",slug:"additional-control-sequences"},{level:3,title:"ANSI.SYS Control Sequences",slug:"ansi-sys-control-sequences"},{level:3,title:"XTERM Control Sequences",slug:"xterm-control-sequences"},{level:3,title:"Original VT52 Control Sequences",slug:"original-vt52-control-sequences"}],frontmatter:{sidebar:"auto"}}],themeConfig:{repo:"thehighnibble/firmware",docsRepo:"thehighnibble/thehighnibble.github.io",docsDir:"docs",docsBranch:"vuepress",editLinks:!0,editLinkText:"Find a mistake? Got a suggestion? Edit this page.",lastUpdated:"Last Updated",nav:[{text:"Home",link:"/"},{text:"IMSAI 8080",link:"/imsai8080/"},{text:"Cromemco Z-1",link:"/cromemcoZ1/"},{text:"VT132",link:"/vt132/"},{text:"S-132",link:"/s132/"},{text:"Forum",link:"https://github.com/orgs/thehighnibble/discussions"}]}};var Ss={functional:!0,props:{custom:{type:Boolean,default:!0}},render:(e,{parent:t,props:n,data:r})=>e(t.$page.key,{class:[n.custom?"custom":"",r.class,r.staticClass],style:r.style})},xs=(n(47),Object(Fa.a)({},(function(e,t){var n=t._c;return n("svg",{staticClass:"icon outbound",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"}},[n("path",{attrs:{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}}),t._v(" "),n("polygon",{attrs:{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"}})])}),[],!0,null,null,null).exports),$s={functional:!0,render(e,{parent:t,children:n}){if(t._isMounted)return n;t.$once("hook:mounted",()=>{t.$forceUpdate()})}};Promise.all([n.e(0),n.e(33)]).then(n.t.bind(null,251,7)),Ii.config.productionTip=!1,Ii.use(ka),Ii.mixin(function(e){!function(e){e.pages.forEach(e=>{e.frontmatter||(e.frontmatter={})}),e.locales&&Object.keys(e.locales).forEach(t=>{e.locales[t].path=t});Object.freeze(e)}(e);const t=new Ii({data:{siteData:e}});return{computed:{$site:()=>t.siteData,$localeConfig(){const{locales:e={}}=this.$site;let t,n;for(const r in e)"/"===r?n=e[r]:0===this.$page.path.indexOf(r)&&(t=e[r]);return t||n||{}},$siteTitle(){return this.$localeConfig.title||this.$site.title||""},$title(){const e=this.$page,t=this.$siteTitle,n=e.frontmatter.home?null:e.frontmatter.title||e.title;return t?n?n+" | "+t:t:n||"VuePress"},$description(){if(this.$page.frontmatter.meta){const e=this.$page.frontmatter.meta.filter(e=>"description"===e.name)[0];if(e)return e.content}return this.$page.frontmatter.description||this.$localeConfig.description||this.$site.description||""},$lang(){return this.$page.frontmatter.lang||this.$localeConfig.lang||"en-US"},$localePath(){return this.$localeConfig.path||"/"},$themeLocaleConfig(){return(this.$site.themeConfig.locales||{})[this.$localePath]||{}},$page(){return function(e,t){for(let n=0;n Promise.all([n.e(0),n.e(12)]).then(n.bind(null,252))),Ii.component("ClientOnly",$s),Ii.prototype.$withBase=function(e){const t=this.$site.base;return"/"===e.charAt(0)?t+e.slice(1):e};const{app:Ts,router:As}=function(){const e=new ka({base:ks.base,mode:"history",fallback:!1,routes:Cs,scrollBehavior:(e,t,n)=>n||(e.hash?!xa.disableScrollBehavior&&{selector:e.hash}:{x:0,y:0})});e.beforeEach((e,t,n)=>{/(\/|\.html)$/.test(e.path)?n():n(Object.assign({},e,{path:e.path+"/"}))});const t={};return{app:new Ii(Object.assign(t,{router:e,render:e=>e("div",{attrs:{id:"app"}},[e("router-view",{ref:"layout"})])})),router:e}}();window.__VUEPRESS_VERSION__={version:"0.14.11",hash:"980d2bf"},As.onReady(()=>{Ts.$mount("#app")})}]); \ No newline at end of file diff --git a/binaries/S132bundle-rc.4W.bin b/binaries/S132bundle-rc.4W.bin new file mode 100644 index 0000000..ed81f99 Binary files /dev/null and b/binaries/S132bundle-rc.4W.bin differ diff --git a/binaries/S132bundle-rc.5.bin b/binaries/S132bundle-rc.5.bin new file mode 100644 index 0000000..8be48a8 Binary files /dev/null and b/binaries/S132bundle-rc.5.bin differ diff --git a/binaries/S132bundle-rc.6.bin b/binaries/S132bundle-rc.6.bin new file mode 100644 index 0000000..bc6a6dc Binary files /dev/null and b/binaries/S132bundle-rc.6.bin differ diff --git a/binaries/S132bundle-v1.6.0.bin b/binaries/S132bundle-v1.6.0.bin new file mode 100644 index 0000000..bab3e43 Binary files /dev/null and b/binaries/S132bundle-v1.6.0.bin differ diff --git a/binaries/VT132bundle-v1.5.0.bin b/binaries/VT132bundle-v1.5.0.bin new file mode 100644 index 0000000..da50e71 Binary files /dev/null and b/binaries/VT132bundle-v1.5.0.bin differ diff --git a/binaries/VT132bundle-v1.7.0.bin b/binaries/VT132bundle-v1.7.0.bin new file mode 100644 index 0000000..ee25857 Binary files /dev/null and b/binaries/VT132bundle-v1.7.0.bin differ diff --git a/cromemcoZ1/configure/index.html b/cromemcoZ1/configure/index.html new file mode 100644 index 0000000..9d7f4ed --- /dev/null +++ b/cromemcoZ1/configure/index.html @@ -0,0 +1,147 @@ + + + + + + Configuration (Draft) | The High Nibble + + + + + + + + + ++ + + diff --git a/cromemcoZ1/index.html b/cromemcoZ1/index.html new file mode 100644 index 0000000..141c9b4 --- /dev/null +++ b/cromemcoZ1/index.html @@ -0,0 +1,35 @@ + + + + + +The High Nibble # Configuration (Draft)
# Overview
WARNING
Just like the real Cromemco Z-1, the default configuration of your kit is an empty machine. While you can enter instructions using the toggle switches (and you should experiment with this sometime) it's more interesting to run some real software. +The default configuration is like an empty machine with no ROM only RAM.
In order to run any applications, you will need to activate a virtual ROM (eg. to run BASIC, or boot a floppy disk) and maybe load an operating system (such as CDOS or Cromix) from a virtual disk.
Also like the original computer, your Cromemco Z-1 has no video output port. Owners of the original Cromemco Z-1 would connect a serial terminal (either a teletype printer or visual display unit) to a serial port. While you can still do this (see Serial Communications section), this modern kit offers a much easier solution using Wi-Fi.
Once power is applied to your kit, the ESP32 will create a Wi-Fi Access Point. You can connect your computer to this Wi-Fi network as if it were connected to a Wi-FI router. You can then open a web page, the Desktop UI, that will give you full access to the Cromemco Z-1 - including a virtual serial terminal (TTY:), floppy disks, printer (LPT:) and more.
Once connected, you can then configure the Cromemco Z-1 to connect directly to your home Wi-Fi, so you can use it without having to change your Wi-FI settings again.
# Getting connected
- Plug in the power to the Cromemco Z-1 kit.
- On your computer, open the Wi-Fi settings and select the
cromemco
network (SSID).- When prompted for a password, enter
password
.Your computer should now be connected, and you will be able to open the Desktop UI. The web interface has been written and tested with the Chrome browser in mind, and you might find it works differently if you are using a different browser.
- If you have a Mac, open your browser and enter
cromemco
orcromemco.local
as the web address.- If you have a PC, open your browser and enter
cromemco
or192.168.4.1
as the address.# Default configuration
# Cromemco Z-1 (guest)
WARNING
The default configuration is like an empty machine with no ROM only RAM.
- RAM is 64K occupying the entire address space from
0000h
toFFFFh
- CPU is Zilog Z80 @ 2MHz with support for undocumented op-codes
- No boot ROM is active by default
# ESP32 (host)
- Wi-Fi set to Access-Point (AP) mode with the default SSID of
cromemco
, password ofpassword
- Hostname (HOSTNAME environment variable) set to
cromemco
(cromemco.local
for mDNS)- Port (PORT environment variable) set to
80
- Timezone (TZ environment variable) set for AEST+10, ADST+11 (ie. Sydney, Australia)
- Time server (NTP_SERVER environment variable) set to
pool.ntp.org
- POST (Power On Self Test) disabled
- Console log level set to
NONE
(details to follow)TIP
Once you are connected to the Wi-Fi network, start a Chrome browser and enter the URL
http://cromemco
to see the Desktop UI.# Startup configuration (Non-Volatile Storage, NVS)
The startup configuration is modified via the toggle switches on the front panel.
To enter startup configuration mode, follow the sequence:
- ensure the ESP32 is connected to a USB power source, the red LED on the ESP32 board should be illuminated
- turn the front panel power switch off,
PWR OFF
, the down position- hold the
EXAMINE
toggle in the Examine, up position- press and release the
Reset
buttons while holding theEXAMINE
toggle up- hold the
EXAMINE
toggle for a second or two- release the
EXAMINE
toggleTIP
There are 2
Reset
buttons available that both do the same thing:
- The
Tactile Switch SPST-NO
you installed in theReset
position on the PCB- The small tactile switch on the ESP32 board marked
EN
- NOT the blue toggle switch on the front panel
The Cromemco Z-1 should now be in startup configuration mode. This is indicted by a running LED pattern (right to left) on the 4 LEDS at the right hand side of the front panel (
HOLD
,WAIT
,RUN
,INTERRUPTS ENABLED
).TIP
The current startup configuration value is displayed on the Address Bus LEDs (bits 0-15) when you enter startup configuration mode.
WARNING
When you Deposit a new startup configuration value, all the bits of the current value are overwritten. If your objective is to modify the existing value changing only a few of the bits, you must toggle in all the bits of the existing value indicated by the Address Bus LEDs and then switch the bits you want to configure differently, before you Deposit this new value.
Booting with RDOS 3.08 ROM (suitable to boot from a floppy disk to CDOS, Cromix or CP/M, or boot from hard disk)
To configure the Cromemco Z-1 to boot into the ROM based RDOS 3.08 in Z80 mode @ 4 MHz, the following startup configuration value can be used.
- Binary: 0000 1001 0100 0000
- Hexadecimal: 0940
- Enter startup configuration mode (above)
- Toggle in this value on the Address toggle switches
- Raise the
DEPOSIT
toggle to the Deposit, up position to store the entered startup configuration value.- Reboot the Cromemco Z-1 by raising the
RESET
toggle
Address Bit Name Equivalent Flag Description 0 NVS_POST n/a Enable Power On Self Test (POST) 1-2 NVS_LOG_LEVEL n/a Set ESP32 console Log Level, 0 = NONE; 1 = ERROR; 2 = WARN; 3 = INFO 3 NVS_IF_STA n/a Set Wi-Fi Mode, 0 = Access Point Mode (AP); 1 = Station Mode (STA) 4 NVS_Z80 -z
,-8
This bit is ignored as the Cromemco Z-1 is always running a Z80 CPU 5 NVS_NO_UNDOC -u
Suppress support for undocumented op. codes, 1 = -u
6 NVS_4MHZ -f
Set CPU speed, 0 = 2 MHz -f 2
; 1 = 4 MHz-f 4
7 NVS_UNLIMITED -f 0
Set CPU speed to Unlimited, 0 = use speed from bit 6; 1 = Unlimited -f 0
8-10 NVS_MEMORY_MAP -M
Set memory map, 0 = default 64K RAM, 1-7 = use memory map n -M n
11 NVS_BANK_ROM -R
Enable FDC-16/64 style Banked ROM functionality, 1 = -R
. Only compatible with RDOS ROM images.12-14 Reserved for future use 15 NVS_AUTO_RUN Autorun - The CPU will automatically run when the machine is switched on ( PWR ON
)To set the startup configuration mode value, follow the sequence:
- To set a bit, put the corresponding Address toggle switch in the up position.
- To clear a bit, put the corresponding Address toggle switch in the down position.
- Raise the
DEPOSIT
toggle to the Deposit, up position to store the entered startup configuration value.WARNING
The Cromemco Z-1 must be rebooted for the new configuration to take effect.
This can be done by raising the
RESET
toggle or by pressing aReset
switch.TIP
For further details about the Equivalent Flag refer to the Z80PACK documentation for the cromemcosim machine.
TIP
The memory map indexed by NVS_MEMORY_MAP (1-7) is defined in the configuration file
system.conf
+See Memory maps for details.# Serial Communications (RS232, USB)
The Cromemco Z-1 is configured with three (3) virtual TU-ART UART devices.
The first virtual UART is the console port on the Cromemco FDC16/64 floppy disk controller. +The second and third virtual UARTs are the A and B devices on the Cromemco TU-ART serial/parallel I/O interface.
The board/port/devices are assigned as follows:
Board UART device I/O ports (hexadecimal) Default Connected Device Default Desktop Device FDC-16/64 TU-ART 0A 00-09 Physical UART0 (Tx/Rx Patch pins & USB) TTY: TU-ART #1 TU-ART 1A 20-29 Physical UART1 (IO22/IO5 Patch pins) TTY1: TU-ART 1B 50-59 Physical UART2 (IO32/IO33 Patch pins) TTY2: When the machine boots, the virtual TU-ART 0A is routed to the physical UART0 on the
ESP32-PICO-KIT
.
- This enables you to use any software on the Cromemco Z-1 that communicates via this UART as the console using a terminal or terminal emulator depending your method of connection.
- The default speed with the current firmware is 115200 baud @ 8N1
TIP
Both the ESP32 console log and the Cromemco console TU-ART 0A (TTY:) will be directed to the serial UART0. If you set the
NVS_LOG_LEVEL
toINFO
(3) this will likely send console log messages during normal use of the machine. It is recommended to set theNVS_LOG_LEVEL
to a lower level during normal operation.WARNING
Behavior of serial communications is further effected by the settings on the virtual TU-ART UARTs. See TU-ART device mappings in the
system.conf
file below, for further details.WARNING
If you start the Desktop UI from a web browser and the TTY: virtual device is connected (default behavior) then the virtual* TU-UART 0A device is disconnected from the physical UART0 on the
ESP32-PICO-KIT
and instead re-routed to the TTY: virtual device on the Desktop UI. If the TTY: virtual device is disconnected, then the TU-UART 0A device is re-routed back to the UART0 on theESP32-PICO-KIT
, ie. only one of these two destinations can be connected at a time.Note: the ESP32 console log is always sent to the physical UART0 and is never redirected.
# Serial UART over USB
The
ESP32-PICO-KIT
supports serial communications from UART0 over USB. It uses a Silicon Labs CP210x USB to UART bridge
- connect the
ESPP32-PICO-KIT
to a PC using a suitable USB cable- start a terminal emulator on the PC set for 115200 baud 8N1 connected to the serial device your OS identifies the
ESP32-PICO-KIT
on +
- Windows will be a COMx: port
- OSX will be /dev/tty.SLAB_USBtoUART
- Linux will be /dev/ttyUSB0 (or similar, TBA)
TIP
If you do not see a TTY/COM port on your PC presented by the ESP32-PICO-KIT when connected, you may need to install a driver for the Silicon Labs CP210x USB to UART bridge.
Drivers are available direct from the manufacturer at https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers
Additional information is available from the Espressif (manufacturer of the
ESP32-PICO-KIT
) web site at https://docs.espressif.com/projects/esp-idf/en/latest/get-started/establish-serial-connection.html# Serial UART over RS232
WARNING
Serial UART0 over RS232 and Serial UART0 over USB are mutually exclusive, ie. they cannot be used at the same time.
Serial UART over RS232 is configured by using the supplied jumpers/shunts to bridge the required pins on the
Patch
andComms
headers accessible on the rear of the PCB, and connecting a suitable RS232 device to one of the DE-9M connectors labeledRS232-1
andRS232-2
RS232 line levels are provided by the Maxim MAX3232 IC see the data sheet for details.
You must position 4 of the jumpers/shunts provided to enable a Serial UART over RS232. This image shows the currently supported configuration for the jumpers/shunts on both the
Patch
andComms
headers for UART0 toRS232-1
# UART0 to RS232-1
# Patch header
- bridge Tx - T1 - vertical position second from right
- bridge Rx - R1 - vertical right most position
# Comms header
- bridge @ Tx1 - horizontal second position from top
- bridge @ Rx1 - horizontal fourth position from top
# UART1 to RS232-2
# Patch header
- bridge IO22 - T2 - vertical position third from right
- bridge IO5 - R2 - vertical position fourth from right
# Comms header
- bridge @ Tx2 - horizontal third position from bottom
- bridge @ Rx2 - horizontal last position at bottom
# Configuring physical UART parameters (speed, data & stop bits)
You can configure the parameters for both UART0 (
RS232-1
/USB) and UART1 (RS232-2
) via theboot.conf
file.See UART Configuration in the
boot.conf
file below, for further details.# Wi-Fi Communications
The ESP32 has on-board Wi-Fi and can boot in either Access Point (AP) or Station (STA) mode. The mode is determined by the NVS_IF_STA bit in the startup configuration stored in NVS and described above.
- In AP mode, the ESP32 acts as an Access Point and broadcasts a system defined SSID and provides DHCP services for clients to connect +
- The SSID hardcoded in the firmware is espressif with a password of password, this will only be used if the boot.conf file on the microSD card cannot be read or does not include a
HOSTNAME=name
statement, see Boot.conf file below.- If a
HOSTNAME=name
statement is found in the boot.conf file, then this hostname is also used as the SSID in AP mode. In this case, the password still remains password- In STA mode, the ESP32 acts as a Wi-Fi station or client and can join an existing Wi-Fi network (supporting WPA or WPA2, but not Enterprise WPA). +
- The SSID and password of the desired Wi-Fi network must be configured in the boot.conf file using the
SSID=name
andPASSWORD=password
statements, see Boot.conf file below.TIP
The boot.conf file can be edited via the SYS: virtual system device in the Desktop UI while connected to the Cromemco Z-1 running in AP mode. +Alternatively the microSD Card can be mounted in a PC and the
/cromemco/conf/boot.conf
file edited directly in a text editor then the microSD Card returned to the Cromemco Z-1 before it is powered on.WARNING
When the Cromemco Z-1 is configured to work in station mode (STA) but it is unable to make a connection to the configured Wi-Fi network within 30 seconds, the ESP32 will reboot and temporarily start in AP mode.
- This enables you to connect to the Cromemco Z-1 from a browser on the advertised SSID and modify/correct the STA mode Wi-Fi configuration.
- The simplest way to determine if this has happened is to look for the AP mode SSID being broadcast, or to look at the ESP32 console log output on UART0/USB.
WARNING
The design of the Cromemco Z-1 is intended for only one Wi-Fi client (browser) to be connected at any given time. It is untested and not recommended to connect multiple clients at the same time.
# Boot.conf file
The boot.conf file is located on the microSD card with the path
/cromemco/conf/boot.conf
+As the ESP32 boots this file is loaded, each line parsed and the variable=value pair is added to the environment (like posix environment variables).WARNING
There is little to no error checking done at the moment. If you significantly change this file and remove a variable, or leave a value blank you may cause the boot process to fail. I know, I've managed to do that once or twice.
The solution is to mount the microSD card on a PC and edit the boot.conf file to fix the problem.
# Default boot.conf
The default configuration, as shipped (in Release v1.10.0-beta.1) is a follows:
### Network configuration +NTP_SERVER=pool.ntp.org +TZ=AEST-10AEDT,M10.1.0,M4.1.0 +HOSTNAME=cromemco +PORT=80 +SSID=mySSID +PASSWORD=myPASSWORD +WIFI.sta.scan=1 +#WIFI.password.hide=1 +### UART configuration +#UART0=115200,cs8 +#UART1=115200,cs8 +#UART2=115200,cs8 +### Performance parameters +#TTY.netsrv.buffer_delay=33 +#TTY2.netsrv.buffer_delay=33 +#TTY3.netsrv.buffer_delay=33 +#LPT.netsrv.buffer_delay=33 +### Harddisk images +#HARDDISK.hd0=hd0.hdd +#HARDDISK.hd1=hd1.hdd +#HARDDISK.hd2=offline +### TU-ART default device mappings (HAL) +#TUART0.deviceA.device=WEBTTY,MODEM,UART0 +#TUART1.deviceA.device=WEBTTY2,SCKTSRV1,UART1 +#TUART1.deviceB.device=WEBTTY3,SCKTSRV2,UART2 +### Modem initialization string +MODEM.init=ATS0=1S15=1&A1 #S0=1 auto-answer after 1 ring, S15=1 enable telnet protocol +#MODEM.init=ATS15=1 #S15=1 enable telnet protocol +
# Network Configuration
The Network configuration entries should be familiar and mostly self explanatory.
TIP
The TZ variable cannot use values like Sydney/Australia (Olson format) but must use explicitly defined timezone strings (POSIX format) eg.
TZ=AEST-10AEDT,M10.1.0,M4.1.0
which is correct for Sydney, Australia.A file with TZ variable values for many timezones can be found at https://www.di-mgt.com.au/src/wclocktz.ini Credit to: John Mann in the Forum
An article that defines the POSIX format can be found at Specifying the Time Zone with TZ, however please note, the "third format" referenced in this article is the Olson format, and not supported on the ESP32.
# UART Configuration
The UART configuration entries define the speed, data & stop bits for the three physical UARTs on the ESP32, UART0, UART1 and UART2
For example:
### UART configuration +UART0=115200,cs8 # ie. 115200, 8N1 - not required because this is default +UART1=9600 cs7 cstopb parenb parodd # ie. 9600, 7O2 +
- parameters can be separated by spaces or commas
- parameters are case insensitive
- parameters follow the convention used by the
screen
program under unix/linux/gnu ie.: +
- default is
115200,cs8
in other words 115200 8N1- standard baud rates from
110
to230400
e.g. 110, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400 others may work, but you'll have to experimentcs7
- for 7 data bitscs8
- for 8 data bitscstopb
- for 2 stop bits, default is 1parenb
- for even parity, default is noneparenb,parodd
- for odd parity# Performance parameters
The Performance parameters exist only for the four devices
TTY:
(default: TU-ART 0A),TTY2:
(default: TU-ART 1A),TTY3:
(default: TU-ART 1B)andLPT:
and apply only to websocket communication to the Desktop UIThey specify a time in milliseconds (ms) during which output to the device will be buffered (up to the next line feed character) and transmitted in a single (websocket) packet. This can greatly improve performance of both the TTY: and LPT: devices. If used, recommended optimal settings are:
#Performance parameters +TTY.netsrv.buffer_delay=33 +TTY2.netsrv.buffer_delay=33 +TTY3.netsrv.buffer_delay=33 +LPT.netsrv.buffer_delay=33 +
# Harddisk image
Three (3) harddisks are supported with the virtual Cromemco WDI-II winchester harddisk interface.
A harddisk image (~10MB) can be mounted for each of
hd0:
,hd1:
&hd2:
Any online harddisk image is visible on the desktop as
HD0:
,HD1:
orHD2:
Harddisk images are visible in the disk library
LIB:
and indicated with a harddisk icon. You can drag-and-drop a new harddisk onto theLIB:
window to upload a new harddisk image.The default harddisk image mappings are: (these do not need to be specified in the
boot.conf
file)HARDDISK.hd0=hd0.hdd +HARDDISK.hd1=hd1.hdd +HARDDISK.hd2=hd2.hdd +
TIP
The harddisk image file must reside in
/cromemco/disks/
and end with.hdd
eg./cromemco/disks/hd0.hdd
.Do not use the
.dsk
extension for a harddisk image as it will be confused with a floppy disk image.If a harddisk image file is not found then the harddisk is marked as offline and wont appear on the desktop.
You can specify any haddisk image file in the directory for any harddisk, or specify offline to force a harddisk to be offline
e.g.
### Harddisk images +HARDDISK.hd0=disk1.hdd +HARDDISK.hd1=workdisk.hdd +HARDDISK.hd2=offline +
TIP
An empty (all zero (0) byte values) file of the required size (10,874,880 bytes) is provided in the disk library
LIB:
namedempty.hdd
.You can copy and rename this file to create new harddisk images, ready to be intialised, formatted and mounted as required by CDOS or Cromix.
TIP
If you change a harddisk image you must reboot the Cromemco Z-1 to load the new image
WARNING
There is no UI for changing hard disk images, the required image must be set using the environment variables
HARDDISK.hd[0..2]
in theboot.conf
file and then the ESP32 hard reset to reload the environment.# TU-ART device mappings
A HAL (Hardware Abstraction Layer) enables mapping of character mode devices to the three (3) virtual TU-ART serial devices
- the TU-ART device mapping configuration is loaded and reported to the debug console (UART0/USB) when the Cromemco Z-1 is started/powered-on
- the TU-ART device mapping configuration is also displayed in the SYS: virtual device on the desktop UI
- when no TU-ART device mapping configuration is specified, a standard configuration is the default, and reported as follows:
TU-ART Devices +TUART0.deviceA = WEBTTY,MODEM,UART0 +TUART1.deviceA = WEBTTY2,SCKTSRV1,UART1 +TUART1.deviceB = WEBTTY3,SCKTSRV2,UART2 +
the purpose of the HAL is to:
- simplify the addition of new character mode devices in future +eg. additional hardware UART; network sockets; additional telnet listeners; new virtual peripherals on the desktop UI
- enable the user to assign specific devices to each of the three (3) virtual TU-ART serial ports
- details of configuring the TU-ART device mapping will be published soon
# Modem initialization string
This string will be processed by the 'AT' Modem when it is initialised and reset (ie. with the command
ATZ
)For example, to initialize the modem for:
- auto-answer after 1 ring (
ATS0=1
)- enable telnet protocol (
ATS15=1
)- enable answer mode (ie. listen) in "daemon" mode (
AT&A1
)- with the commands concatenated into a single command string
ATS0=1S15=1&A1
add the following line:
#Modem initialization string +MODEM.init=ATS0=1S15=1&A1 +
# System.conf file
The system.conf file is located on the microSD card with the path
/cromemco/conf/system.conf
WARNING
Some settings in this file are legacy, maintained for source code compatibility with the Z80PACK, cromemcosim machine. Only the parameters documented here have any effect on the Cromemco Z-1.
# Memory maps
The only parameters that effect the Cromemco Z-1 are the
[MEMORY n]
sections:# <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> +# memory configurations in pages of 256 bytes +# start,size (numbers in decimal, hexadecimal, octal) +# up to 7 memory sections allowed +# up to 6 ram/rom statements per section allowed +# +# NOTES: +# - memory sections only effect bank 0 of the machine's memory +# <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> + +[MEMORY 1] +# Memory configuration for running CP/M, CDOS, CROMIX with RDOS0308: +# 256 pages RAM, 32 pages ROM +ram 0,256 +rom 0xc0,32,rdos0308.hex +# Power-on jump address for the boot ROM +boot 0xc000 + +[MEMORY 2] +# Memory configuration for RDOS1: +# 256 pages RAM, 4 pages ROM +ram 0,256 +rom 0xc0,4,rdos1.hex +# Power-on jump address for the boot ROM +boot 0xc000 + +[MEMORY 3] +# Memory configuration for RDOS252: +# 256 pages RAM, 32 pages ROM +ram 0,256 +rom 0xc0,32,rdos252.hex +# Power-on jump address for the boot ROM +boot 0xc000 + +[MEMORY 4] +# Memory configuration for Z1MON 1.0: +# 256 pages RAM, 16 pages ROM +ram 0,256 +rom 0xe0,16,z1mon-1.0.hex +# Power-on jump address for the ROM +boot 0xe000 + +[MEMORY 5] +# Memory configuration for Z1MON 1.4: +# 256 pages RAM, 16 pages ROM +ram 0,256 +rom 0xe0,16,z1mon-1.4.hex +# Power-on jump address for the ROM +boot 0xe000 + +[MEMORY 6] +# Memory configuration for Monitor/BASIC ROM: +# 256 pages RAM, 16 pages ROM +ram 0,256 +rom 0,16,mbc.hex +# Power-on jump address for the ROM +boot 0 +
TIP
A memory map is selected by setting the NVS_MEMORY_MAP bits in the Startup configuration, NVS for details.
Last Updated: 8/27/2022, 7:22:11 AMCromemco Z-1 replica | The High Nibble + + + + + + + + + ++ + + diff --git a/img/THN_Logo.png b/img/THN_Logo.png new file mode 100644 index 0000000..69707f7 Binary files /dev/null and b/img/THN_Logo.png differ diff --git a/img/VT132-SA.pdf b/img/VT132-SA.pdf new file mode 100644 index 0000000..d5650db Binary files /dev/null and b/img/VT132-SA.pdf differ diff --git a/img/VT132-SA.png b/img/VT132-SA.png new file mode 100644 index 0000000..ecbffb7 Binary files /dev/null and b/img/VT132-SA.png differ diff --git a/img/twitter.png b/img/twitter.png new file mode 100644 index 0000000..372a39e Binary files /dev/null and b/img/twitter.png differ diff --git a/img/youtube.png b/img/youtube.png new file mode 100644 index 0000000..af53ecc Binary files /dev/null and b/img/youtube.png differ diff --git a/imsai8080/assembly/index.html b/imsai8080/assembly/index.html new file mode 100644 index 0000000..ae5d098 --- /dev/null +++ b/imsai8080/assembly/index.html @@ -0,0 +1,36 @@ + + + + + +The High Nibble # Cromemco Z-1 replica
# Overview
Cromemco was a notably more successful microcomputer manufacturer than IMSAI, despite the iconic status of the IMSAI 8080.
Initially producing add-on cards and peripherals for other S-100 computers, notably the Cyclops Camera, Dazzler graphics interface and D+7A digital & analog I/O interface, Cromemco went on to produce a family of related microcomputers initially powered by the Zilog Z80 microprocessor and then later incorporating both the Z80 and the Motorola 680x0 series of microprocessors.
Their first complete microcomputer was the Cromemco Z-1
From its appearance you might think it is just a rebadged IMSAI 8080, but that is not the case (no pun intended).
Cromemco OEM'ed the front panel, chassis & lid for the Z-1 from IMSAI but the internals were all produced by Cromemco, and at its heart was the Cromemco ZPU CPU board powered by the Zilog Z80 microprocessor.
Although this computer could run CP/M, Cromemco produced their own CP/M (v1.33) like operating system, Cromemco DOS, CDOS.
Cromemco then followed their own path producing the Cromix operating system. A multitasking, multi-user, UNIX-like operating system running on the Z80 with banked memory. The last release of Cromix (version 11.27) for the Z80 was in 1984. Cromix continued to be developed but only for the 680x0 series of microprocessor based Cromemco computers.
What you see in the photo above is the Cromemco Z-1 replica kit produced by TheHighNibble. Identical to the IMSAI 8080 replica kit except for the text and logos on the front facia (see: the Bill-of-Materials.
Also powered by Udo Munk's z80pack, specifically the cromemcosim machine, running on the ESP32 micro-controller targeting the ESP32-PICO-KIT.
# Features
The Cromemco Z-1 replica can run:
- CP/M
- Cromemco DOS (CDOS)
- Cromemco Cromix (up to version 11.27)
on a simulated Z80 microprocessor at 2 or 4 MHz (or "unlimited" at approximately 5MHz), with up to 8 banks of 64KB of RAM.
There is support for up to three (3) UARTs (physical or virtual), so Cromix is configured with three (3) TTY devices and can support up to three (3) simultaneous users since it is a multitasking, multi-user, UNIX-like operating system.
The Cromemco Z-1 machine emulation (Z80PACK, cromemcosim) includes the following emulated hardware configuration, following standard Cromemco memory and I/O port mapping:
- ZPU - Z80 CPU @ 2MHz, 4MHz or Unlimited (~5MHz)
- 64KB of RAM in Bank 0
- seven (7) additional banks of 64KB of RAM as Banks 1 to 6
- 16FDC/64FDC hybrid floppy disk controller +
- with 4 floppy disk drives (typically A: to D:)
- that can behave as 5 1/4" or 8" drives SS/DS, SD/DD
- based on the
*.dsk
floppy disk image that is mounted- banked ROM support for RDOS ROMs
- the console serial interface (TU-ART) as the TTY: device
- Real Time Clock (RTC) (512ms timer)
- WDI-II winchester (hard) disk interface +
- with up to 3 hard disk drives (typically hd0:, hd1: & hd2:)
- each emulating a 10MB capacity 8" IMI-7710
- the WDI-II will work with the CPU set to any speed as it reflects all timing relative to a 4MHz CPU
- additional TU-ART communications interface with +
- two (2) additional serial interfaces as the TTY2: and TTY3: devices
- two (2) parallel printers as lpt1 (LPT:) and lpt2 devices
- Dazzler graphics
- D+7A I/O with joystick input support
Like the IMSAI 8080 replica, the Cromemco Z-1 replica also comes with a web based desktop user interface that provides access to a range of virtual devices including:
- 3 simulated TTY terminals (VT100 &/or Cromemco 3102 Video Terminal compatible)
- 1 line printer, 80/132 column selectable
- 4 simulated 8" floppy disks
- Cromemco Dazzler graphics interface
- Cromemco D+7A I/O including JS-1 joystick emulation (from connected USB joystick)
- Paper tape punch/reader
- Manuals library
- Disks library
- Paper tapes library
# Availability
The Cromemco Z-1 replica has been available to order and in production since October 2022.
Please note:
The hardware kit is available complete with the Cromemco Z-1 facia panel (see: the Bill-of-Materials.
Update
As of November 2024, kits are available again.
The good news is that the redesign has done away with the need for any SMT components so all the soldering is now exclusively through-hole.
# Expression of interest
I am accepting expressions of interest via email. If you send email to info@thehighnibble.com I will add you to the list.
Please specify that you are interested in the Cromemco Z-1 replica.
Once a kit is available for you within the month, I will contact you to confirm your order.
The price for the kit is USD$300 and in addition you also pay for postage and any PayPal transaction fees.
# News & Updates
You can stay up-to-date with news about additions to this site, or new YouTube videos demonstrating the features of the kits by following on Twitter @TheHighNibble and subscribing to TheHighNibble YouTube Channel
# Forum
TheHighNibble forum has been set up on GitHub. The forum is public and readable by anyone but if you wish to post you need to become a member.
Membership requires you to have GitHub account. Email to info@thehighnibble.com with your GitHub name and I will send you an invite to join the discussion forum.
# Specifications
# Dimensions (built)
17 1/8" x 7" x 2 11/16"
435mm x 178mm x 68mm
(width x height x depth)
# Weight (built)
4.22 lbs
1.915 kg
# Power
5VDC @ 500 mA (max., < 100mA typical) - USB micro-B plug required
# Dimensions (boxed/shipped)
18 1/3" x 7 1/2" x 3"
465mm x 190mm x 75mm
(width x height x depth)
# Weight (boxed/shipped)
less than 5.1 lbs
less than 2.3 kg
# Bill-of-Materials
The Bill-of-Materials for the Cromemco Z-1 replica is the same as for the IMSAI8080 replica Bill-of-Materials +with the exception of the front panel facia.
Here is a side-by-side image of the two facias so that you can see the differences. +
TIP
The difference in colour is just my bad photography and lighting: they are both matt black .
Please Note
I will only supply one facia with the kit, please don't ask for both.
# Recommended tools for assembly
# Step-by-step assembly guide
# Configuration
# Updating Software
The ESP32 can be reflashed (using Over The Air updates) with the Cromemco Z-1 firmware.
TIP
Both the IMSAI 8080 replica and the Cromemco Z-1 replica are able to run either firmware. To switch from one to the other simply update using the OTA method linked above with the firmware for the desired machine.
The microSD card image has separate folders for maintaining the files for each machine, and each machine also maintains its own Startup Configuration in Non-volatile storage, NVS
# Troubleshooting (draft)
# Enhancements and Add-ons
# Planned
- emulated Cromemco SDI - Super Dazzler Interface (hi-res graphics adapter)
Last Updated: 11/8/2024, 10:43:57 PMStep-by-step Assembly Guide (Draft) | The High Nibble + + + + + + + + + ++ + + diff --git a/imsai8080/bom/index.html b/imsai8080/bom/index.html new file mode 100644 index 0000000..87bb26c --- /dev/null +++ b/imsai8080/bom/index.html @@ -0,0 +1,31 @@ + + + + + +The High Nibble # Step-by-step Assembly Guide (Draft)
# Notices
TIP
Please read all the following notices and instructions before assembling the IMSAI 8080esp replica kit.
WARNING
This kit contains cut acrylic. +Cut acrylic can have sharp edges that can in turn cut. As a precaution, wear cotton gloves to protect your hands while handling the cut acrylic.
CAUTION
This kit contains many small parts that may be a choking hazard and is not suitable for children. Keep the contents of this kit away from children to avoid choking.
NOTE
This kit is for hobby and educational interest only. The simulated replica computer you will build should not be used for any other purpose and cannot be expected to work reliably beyond a demonstration of the simulated computer.
TIP
Keep the box the IMSAI 8080esp replica kit shipped in. This custom made box was designed to both ship the unassembled kit and also to house the assembled replica. It is the best box you can use if you need to store or transport your finished IMSAI 8080esp.
TIP
Keep one of the full sheets of cardboard from above or below the components. This will serve as a tool to help with the assembly of the kit, especially for retaining the M4 bolts in the correct position while assembling all the layers of acrylic and the PCB together. It maybe useful to you in future if you ever need to disassemble and reassemble the IMSAI 8080esp.
Notes on the PCB
- There is no resistor R15, it was removed from the design long ago and the resistors were never renumbered
- There are 2 silk screen errors on the PCB (v3.4.1, fixed on v3.4.2): +
- the LED LA14 is incorrectly labeled as LS14
- the LED LD0 is labeled on the left of the LED and should be labeled above as per LD1-LD7
- There is a 5x2 group of through-holes marked Spare that nothing gets soldered into
- There are two groups of 8x1 through-holes that are unmarked (one above LRN1 and one below RN1) that nothing gets soldered into
Note
This step-by-step assembly guide refers to the front and back of the PCB as follows:
- the front of the PCB has the silkscreen for the LEDs and the toggle switches
- the back of the PCB has the silkscreen of the IMSAI 8080 Microcomputer System decal and The High Nibble logo
TIP
There is a play list of videos on YouTube that demonstrate this step-by-step assembly sequence and includes additional tips for successful assembly.
# Unpacking and checking against the BOM
TIP
Please unpack the entire kit and perform a stock take of what you have received against the Bill-of-Materials.
WARNING
If you believe you are missing any components when you compare the kit contents with the Bill-of-Materials please contact me directly by email to info@thehighnibble.com.
Please respect that this kit is a hobby project made by an individual maker and not a mass produced product from a manufacturer. While every care was taken to pack each kit correctly, mistakes may have occurred.
DAMAGE
If your kit arrived in a damaged state, or if upon opening the kit you find any of the contents to be damaged, please take photographs of the damage and include them in your email.
TIP
I will happily work with you directly, via email, to resolve the issues with your incomplete or damaged kit. +This may require mailing replacement parts to you and that will take time, so please have patience.
# PCB & Soldering
# ESP32 Microcontroller, PSRAM & micro SD Card Socket
Step Parts Location Notes 1. Header 20x1 Male ESP32-PICO-KIT board Before soldering anything to the main circuit board, it's first necessary to solder some pins to the ESP32-PICO-KIT board. Cut 2 sets of 3 pins from the 20x1 Male Header strip. Solder these into the unpopulated through-holes on the ESP32-PICO-KIT board. Upon completion there should be 20 pins along each edge of the underside of the ESP32-PICO-KIT board. 2. PSRAM (SMD) U13
frontNote: Pin 1 is indicated on the PCB by a white dot and on the component by a dimple in the plastic case. When done, perform a continuity test with a multimeter from each pin of the SOP-8 package to a connected pad on the PCB (see video, details to follow) 3. microSD Card Socket (SMD) uSD Card
frontThe microSD Card Socket is also soldered to the front of the circuit board. Align the two locating pins on the microSD Card Socket with the two holes in the PCB. Solder the 4 large ground pads of the lid first ensuring the 9 smaller leads are well aligned, then solder the 9 smaller leads. 4. Resistor 10K Ohm R14
frontThere are 15 10K resistors in this kit (including 1 spare), and they are colour-coded Brown, Black, Orange, Gold. The resistors are tight fitting, so bend the leads close to the their body before inserting into location. Resistors are not polarized, and can be soldered in either orientation. 5. Capacitor 100nF C1
frontThere is only one type of capacitor in this kit, and they can be soldered in either orientation. 6. Resistor Network 6x10K Ohm RN1
backNote: Pin 1 is indicated on the PCB by the square pad and on the component by a white dot 7. Connector 20x1 Female (x2) ESP32
backSolder these connectors mounted on the back of the PCB in the 2 rows of 20 through-holes that form a DIP40 outline marked ESP32
.8. ESP32-PICO-KIT, microSD Memory Card [TEST STEP] Plug the ESP32-PICO-KIT into the female connectors on the back of the PCB. Note: The USB connecter should be towards the near edge of the PCB and the Wi-Fi antenna towards the RS232 connector mounting holes. Insert the microSD card. Connect the ESP32-PICO-KIT to a PC with a suitable USB cable. Run a terminal emulator (e.g. PuTTY on Windows, or iTerm2, Serial on Mac) at 115200 baud 8N1 connected to the TTY/COM port that the ESP32-PICO-KIT presents and observe the boot logs. Errors with either the PSRAM or the microSD card will indicate soldering mistakes (see the During Assembly section in the Troubleshooting guide for details) TIP
If you do not see a TTY/COM port on your PC presented by the ESP32-PICO-KIT, you may need to install a driver for the Silicon Labs CP210x USB to UART bridge used on the ESP32-PICO-KIT. See Serial Communications (RS232, USB) in the Configuration guide for details.
WARNING
Before continuing, remove both the microSD Memory Card from the socket and the ESP32-PICO-KIT from the female connectors, taking care not to bend the Wi-Fi antenna.
# LEDs and accompanying Resistors
TIP
The LEDs and accompanying Resistors should be soldered in groups of 8 as indicated below and each group of 8 tested before proceeding to the next group.
TIP
Use the supplied acrylic spacer and alignment tools. Tape them in place with the LEDs before you solder to help achieve the alignment of each group of 8 LEDs.
- My preference is to raise the LEDs 3mm off the PCB, the acrylic spacer with 8 open vertical slots enables this. You can, however, solder the LEDs sitting flush with the PCB.
- The acrylic alignment tool with 8 round holes should always be used to help align 8 LEDs at a time to be in alignment. Peel any covering off the alignment tool before using it.
(see video, details to follow)
WARNING
LEDs are polarized and must be soldered in the correct orientation. The cathode (short lead, nearest the flat edge) should be soldered in the square, lower, though-hole pad. The anode (long lead) should be soldered in the round, upper, though-hole pad. Check the orientation of all LEDs in each group of 8 before soldering into place by visually inspecting the flat edge corresponding with the flat indicated in the silk screen on front side of the PCB, and the alignment of the long and short leads on the back side of the PCB.
Step Parts Location Notes 9a. LED Red 5mm (x8) LA8-LA15
frontNote: LEDs are polarized and must be soldered in the correct orientation. Use the acrylic spacer and alignment tools. See notes above. 10a. Resistor 3K Ohm (x8) R32-R39
frontThere are 45 3K resistors in this kit (including 1 spare), and they are colour-coded Orange, Black, Red, Gold. Resistors are not polarized and can be inserted and soldered either way around. Because of my sense of aesthetic (ok, my OCD) I like to orientate them all the same way according to the coloured bands. 11a. Test Lead [TEST STEP] At this time you should test the group of 8 LEDs you have just soldered into place. Insert the ESP32-PICO-KIT into its socket and connect it to a power source. Using the supplied test lead you can use the +5V provided by the ESP32-PICO-KIT to the PCB to test each LED (see video, details to follow) WARNING
Before continuing, remove both the microSD Memory Card from the socket and the ESP32-PICO-KIT from the female connectors, taking care not to bend the Wi-Fi antenna.
# Steps 9-10 can now be repeated for each remaining group of LEDs in the following suggested order
Step Parts Location Notes 9b. LED Red 5mm (x8) LS0-LS7
front10b. Resistor 3K Ohm (x8) R40-R47
frontOrange, Black, Red, Gold 11b. Test Lead [TEST STEP] 9c. LED Red 5mm (x8) LO0-LO7
front10c. Resistor 3K Ohm (x8) R16-R23
frontOrange, Black, Red, Gold 11c. Test Lead [TEST STEP] 9d. LED Red 5mm (x8) LA0-LA7
front10d. Resistor 3K Ohm (x8) R24-R31
frontOrange, Black, Red, Gold 11d. Test Lead [TEST STEP] 9e. LED Red 5mm (x8) LD0-LD7
front10e. Resistor 3K Ohm (x8) R52-R59
frontOrange, Black, Red, Gold 11e. Test Lead [TEST STEP] 9f. LED Red 5mm (x4) LHT1, LWT1, LRN1, LIE1
front10f. Resistor 3K Ohm (x4) R48-R51
frontOrange, Black, Red, Gold 11f. Test Lead [TEST STEP] # Other Resistors, Capacitors, IC sockets & Miscellaneous Parts
Note
The transistor
Q1
and the accompanying ResistorR13
are optional. They are a convenience for flashing new firmware on the ESP32-PICO-KIT over USB without removing it from the IMSAI 8080esp PCB. However, on their own they do not provide the whole solution and two extra jumper wires are required to be directly soldered to component leads on the ESP32-PICO-KIT board (details to follow). The simple alternative is to remove the ESP32-PICO-KIT from the IMSAI 8080esp PCB before flashing new firmware over USB, or more simply use the drag-and-drop, over-the-air (OTA) firmware update procedure via the Desktop UI (details to follow).
Step Parts Location Notes 12. Resistor 10K Ohm R1-R12
frontBrown, Black, Orange, Gold. Resistors are not polarized and can be inserted & soldered either way around. Because of my sense of aesthetic (ok, my OCD) I like to orientate them all the same way according to the coloured bands. 13. Resistor 10K Ohm R13
back(Optional) See note above. Brown, Black, Orange, Gold. 14. Capacitor 100nF (0.1μF, 104) C3-C12, C17
frontThese capacitors are not polarized and can be inserted & soldered either way around. 15. Capacitor 100nF (0.1μF, 104) C2, C13-C16
backThese capacitors are not polarized and can be inserted & soldered either way around. 16. 16 pin DIP Socket (x10) U1-U10
frontDIP sockets should be inserted to align the crescent/indent at one end with the corresponding mark in the silk screen for the IC Socket. This makes no difference functionally, but will help with the inserting the ICs with the correct orientation later in the assembly. 17. 16 pin DIP Socket U11
backDIP sockets should be inserted to align the crescent/indent at one end with the corresponding mark in the silk screen for the IC Socket. This makes no difference functionally, but will help when inserting the ICs with the correct orientation later in the assembly. 18. S8050 NPN Transistor Q1
back(Optional) See note above. 19. Tactile Switch SPST-NO Reset
frontNote: don't rely only on the 2 soldered connector pins to secure the switch to the PCB, also solder in the 2 mounting pegs to ensure a secure connection to the PCB 20. Header 4x2 Male Boot
back21. Header 8x2 Male Patch
back22. Header 8x2 Male Comms
back23. DE9 (DB9) Male Socket (x2) RS232-1, RS232-2
backNote: don't rely only on the 9 soldered connector pins to secure a socket to the PCB, also solder in the 2 mounting pegs to ensure a secure connection to the PCB # Inserting the ICs
WARNING
If you fail to insert the ICs at this step, before proceeding to insert and solder the rocker/toggle switches, you will find that you cannot later insert some of the ICs without bending the switches. I have done this, to prove that it can be done, but I do not recommend it.
WARNING
ICs are polarized/directional and must be inserted in the correct orientation. ICs should be inserted to align the crescent/indent at one end with the corresponding mark in the silk screen. If you have soldered in the 16 pin DIP Sockets with the indicated orientation, this will make the job easier. Once you have inserted the ICs, have a cup of tea and then double-check they are in the correct way: it's easy to accidentally insert them the wrong way round.
Step Parts Location Notes 24. 74HC595 (x6) U1-U6
frontU1-U6
are all oriented the same way, with the crescent/indent to the right when looking at the front of the PCB. Take time to check you are putting the ICs in the correct sockets, as U6 might not be where you expect it to be.25. 74HC165 (x4) U7-U10
frontU7-U10
are all oriented the same way, with the crescent/indent to the right when looking at the front of the PCB.26. MAX3232 U11
backU11
is oriented with the crescent/indent to the left when looking at the back of the PCB.# Testing I
TIP
At this point you can operate the IMSAI 8080esp without having the rocker/toggle switches mounted.
- Plug the ESP32-PICO-KIT into the female connectors on the back of the PCB.
- Note: The USB connecter should be towards the near edge of the PCB and the Wi-Fi antenna towards the RS232 connectors.
- Insert the microSD card.
- Connect the ESP32-PICO-KIT to a USB power source with a suitable USB cable.
- The simulation will not start until you short the centre and top pins of switch
S1
You can connect to the web based desktop UI by connecting a PC to the Wi-Fi SSID advertised as
IMSAI8080
. Because the Wi-Fi has not been configured, the IMSAI 8080esp should have rebooted into Wi-Fi fallback mode, where it acts as an Access-Point (AP) with the default SSID ofIMSAI8080
. Once you are connected to this Wi-Fi network, start a Chrome browser and enter the URLhttp://imsai8080.local
.There are (or will be) separate instructions for configuring the Wi-Fi to connect to you local Wi-Fi network.
You can use the virtual
CPA:
device to toggle theRUN/STOP
switch.WARNING
While you can operate the IMSAI 8080esp at this point, it will not do much for you without some further configuration. The default configuration is like an empty machine with no ROM only RAM, and you don't have a full front panel to play with. Damn! +Configuration is (or will be) covered elsewhere.
TIP
Time for a cup of tea if you've gotten this far.
# Rocker/Toggle Switches
TIP
To correctly locate and align the rocker switches before soldering, the front panel should be partially assembled according to the following instructions.
TIP
Many of the sheets of acrylic have a protective backing cover (plastic or paper) to protect them from scratching during cutting and transportation. This should be removed before you use them in the assembly of the kit.
TIP
When assembling all or part of the front panel it is sometimes necessary to flip the assembly. To avoid having the M4 socket screws fall out you can use masking tape to hold them in place, or use a cardboard sheet from the packaging to cover the socket screws while flipping the assembly (see video).
WARNING
When screwing the M4 Nylon Nuts and the M4 Socket Screws together only ever make them finger tight to avoid stripping the thread from the M4 Nylon Nuts.
Step Parts Location Notes 27. M4x30mm Hex Socket Screw (x8) 3mm Black acrylic LED/switch masking plate Insert the 8 M4 socket screws
into each of the 8 round holes in the large3mm Black acrylic LED/switch masking plate
28. Spacer 8mm Nylon (x8) Thread a 8mm spacer
over each of the 8M4 socket screws
behind the3mm Black acrylic LED/switch masking plate
29. PCB Fit the PCB
over the 8M4 socket screws
behind the8mm spacers
and the3mm Black acrylic LED/switch masking plate
30. M4 Hex Nut Nylon (x8) Secure this partial assembly of the front panel by screwing a M4 Nut
on each of the 8M4 socket screws
behind thePCB
TIP
You should now have a sandwich with the PCB at the back and the 3mm Black acrylic LED/switch masking plate at the front, separated by the 8mm spacers and held together with the M4 socket screws and nuts.
TIP
As you insert each rocker switch into the PCB, there should be a slight press-to-fit resistance from the pins as they push into the through-holes in the PCB. This will help hold the switch in position prior to soldering.
Step Parts Location Notes 31a. Blue Rocker (On-On) (x4) SA12-SA15
Don't solder them yet 32a. Red Rocker (On-On) (x4) SA8-SA11
Don't solder them yet 33a. 3mm Black acrylic LED spacer & switch alignment guide (8 slots) SA8-SA15
Place the small acrylic alignment guide over the ends of the whole set of 8 rocker switch toggles/actuators, this should help get the switches in alignment. Secure this in place with tape of a couple of strong elastic bands. Solder the switches in place. # Steps 31-33 can now be repeated for the second group of (On-On) switches
Step Parts Location Notes 31b. Blue Rocker (On-On) (x4) SA4-SA7
32b. Red Rocker (On-On) (x4) SA0-SA3
33b. 3mm Black acrylic LED spacer & switch alignment guide (8 slots) SA0-SA7
WARNING
The order of the momentary switches is different. They alternate blue/red from left to right with the red power switch in the right-most position. I have seen different configurations and I guess it comes down to personal choice. I imagine you can swap the plastic toggle actuators but I have not tried this myself.
Step Parts Location Notes 34. Blue Rocker (Mom-off-Mom) (x3) S6, S4, S2
Don't solder them yet 35. Red Rocker (Mom-off-Mom) (x2) S5, S3
Don't solder them yet 36. 3mm Black acrylic LED spacer & switch alignment guide (8 slots) S2-S6
Place the small acrylic alignment guide over the ends of the whole set of 5 rocker switch toggles/actuators, this should help get the switches in alignment. Secure this in place with tape of a couple of strong elastic bands. Solder the switches in place. 37. Red Power Switch (On-On) S1
Solder it in place. # Testing II
TIP
At this point the IMSAI 8080esp should be fully operational. +See Testing I for a general outline of getting it started.
You should exercise all the switches and make sure they are operating correctly (details to follow)
WARNING
While you can operate the IMSAI 8080esp at this point, it will not boot a disk without further configuration. The default configuration is like an empty machine with no ROM only RAM. You can, however, now enter programs through the front panel switches and run them.
TIP
Time for another cup of tea if you've gotten this far.
# Full Front Panel Stack
WARNING
Having successfully gotten this far, the next section can go very smoothly if you take care or it can become very fiddly and frustrating if you rush or end up separating the
PCB
and the3mm Black acrylic LED/switch masking plate
TIP
- Remove the
M4 Nuts
(8) without letting theM4 Socket Screws
(8) drop out of place, tape may help.- Place the
PCB
down on a surface with the3mm Black acrylic LED/switch masking plate
facing up, theM4 Socket Screws
will need to slide up to let thePCB
sit down flat on the surface.- Carefully remove the
M4 Socket Screws
(8) without disturbing the3mm Black acrylic LED/switch masking plate
, thePCB
and especially don't allow the8mm Spacers
to move out of place.- Leave this assembly undisturbed while you put the remaining front panel acrylic together
Step Parts Location Notes 38. M4x30mm Hex Socket Screw (x8) 6mm Clear acrylic front cover Insert the 8 M4 socket screws
into each of the 8 round holes in the thick6mm Clear acrylic front cover
. Tape over the heads to hold them in place.39. 3mm White text/decals on Black facia over red transparent filter Align the Text Facia
over theM4 socket screws
and slide it down to meet the clear acrylic40. This step removed as the Text Facia
andtransparent red filter
are now a single pieceTIP
- Take this whole assembly and flip it over, with the clear acrylic and the
Text Facia
facing up.- Lower this into place, guiding the
M4 socket screws
through the holes in the other assembly you previously set aside (black acrylic, 8mm spacers and PCB)- Making sure the
M4 socket screws
wont fall out (tape again), flip this whole assembly over, placing the front panel face down on a surface.WARNING
If by this point, any of the
8mm Spacers
have slipped out of position, you can withdraw the correspondingM4 socket screw
and use tweezers to correctly locate the8mm Spacer
before reinserting theM4 socket screw
Step Parts Location Notes 41. Spacer 6mm Nylon (x8) Thread a 6mm spacer
over each of the 8M4 socket screws
behind thePCB
42. 3mm Clear acrylic back cover Align the 3mm Clear acrylic back cover
over theM4 socket screws
and slide it down to meet the3mm Spacers
43. M4 Hex Nut Nylon (x8) Push a M4 Nut
into each hexagonal cutout in the3mm Clear acrylic back cover
behind each of the 8M4 socket screws
, tape them into position so that they don't fall out while tightening theM4 socket screws
TIP
- Holding the whole assembly firmly together (again tape may help) stand it up on one long edge.
- Screw each of the 8
M4 socket screws
firmly into their correspondingM4 Nut
, take care not to over-tighten and strip the thread in theM4 Nut
.TIP
Almost done!
Who would have thought you'd have a working replica of an IMSAI 8080 in around just 40 simple steps 😃
Probably time for another cup of tea, but in my case, I think I'd choose something stronger.
# Switch Surround
TIP
Don't try to operate your IMSAI 8080esp for long periods of time without this component in place. It looks so good, you're missing out if you don't have it in place 😃.
WARNING
Don't attach any tape to the
6mm Charcoal grey hammer tone painted acrylic switch surround
+There has been a report of this removing some paint when the tape was removed.
Step Parts Location Notes 44. 120mm x 25mm Black Velcro adhesive backed hook & loop tape Cut both the hook and loop tape
into 2 x 60mm lengths. Cut each 60mm piece lengthways in half to produce 4 x 60mm x 12.5mm strips ofhook and loop tape
45. 60mm x 12.5mm Black Velcro adhesive backed hook & loop tape (x4) 6mm Charcoal grey hammer tone painted acrylic switch surround Stick each strip of hook and loop tape
to the back of theswitch surround
vertically , aligned behind the fingers extending upwards along theswitch surround
46. 6mm Charcoal grey hammer tone painted acrylic switch surround Remove the paper backing from the hook and loop tape
and press theswitch surround
into place under thetoggle switches
on the assembly you completed after Step 43.# The Lid
TIP
The lid can wait, its time to play!
WARNING
It is highly recommended that you fit the
2mm White acrylic back cover corner reinforcement pieces
to the3mm Clear acrylic back cover
before you you attach the lid. Failure to do so might result in cracking the3mm Clear acrylic back cover
.
Step Parts Location Notes 47a. 2mm White acrylic back cover corner reinforcer (x3+1) (top edge crucifix slots) 3mm Clear acrylic back cover See this forum post for details. 47b. 2mm White acrylic back cover corner reinforcer (x4) (bottom side edge crucifix slots) 3mm Clear acrylic back cover See this forum post for details. 48. M3x12mm Black Machine Screw (x4), M3 Nut (x4) 3mm Blue aluminium lid Put an M3 Screw
through each of the 4 smaller holes in theBlue aluminium lid
and use aM3 Nut
on the end of eachM3 Screw
to secure theBlue aluminium lid
.49. 3mm Blue aluminium lid Place the Blue aluminium lid
around the assembly completed at step 38 above. TheM3 Screws
are closer to the back than to the front. Secure eachM3 Screw
&M3 Nut
in the corresponding slot in the3mm Clear acrylic back cover
. Don't over-tighten theM3 Screws
used to secure the lid or you could crack the3mm Clear acrylic back cover
.# Celebrating
TIP
Once that last "cup-of-tea" has had the desired calming effect...
The most appropriate way to celebrate is to toggle in and run your first program.
- Remember to once again plug in the
ESP32-PICO-KIT
and insert themicroSD Card
- Connect the
ESP32-PICO-KIT
to a USB power source with a USB micro-B cable- Go and download/open your copy of the IMSAI 8080 Microcomputer System User Manual (also included in the manual folder on the microSD card)
- Find page 34 in the manual and start from the heading SYSTEM FUNCTIONAL TEST
Enjoy!
TIP
To do anything more than toggle programs into a machine with no stored programs in ROM, you will need to understand how to Configure your IMSAI 8080esp to load ROM images on startup, connect to Wi-Fi to access the Desktop UI, etc...
Last Updated: 10/5/2022, 4:16:56 AMBill of Materials (Draft) | The High Nibble + + + + + + + + + ++ + + diff --git a/imsai8080/configure/index.html b/imsai8080/configure/index.html new file mode 100644 index 0000000..42f9703 --- /dev/null +++ b/imsai8080/configure/index.html @@ -0,0 +1,155 @@ + + + + + +The High Nibble # Bill of Materials (Draft)
TIP
I haven't figured out how to set the image sizes in the site tool I am using, so image sizes my vary. To see them in full size you can always right-click on an image and
Open Image in New Tab
Notes on the PCB
- There is no resistor R15, it was removed from the design long ago and the resistors were never renumbered
- There were 2 silk screen errors on the PCB (v3.4.1, fixed on v3.4.2 and later): +
- the LED LA14 is incorrectly labeled as LS14
- the LED LD0 is labeled on the left of the LED and should be labeled above as per LD1-LD7
- There is a 5x2 group of through-holes marked Spare that nothing gets soldered into
- There are two groups of 8x1 through-holes that are unmarked (one above LRN1 and one below RN1) that nothing gets soldered into
# Through Hole (THT) components
Part Quantity PCB Description 44 (45 packed) LO0-7, LS0-7, LA0-15, LD0-7, LIE1, LRN1, LWT1, LHT1 LED Red 5mm
LEDs have polarity, ie. they must be inserted the correct way around to function properly (see assembly guide).44 (45 packed) R16-59 Resistor 3K ohm [Orange, Black, Red, Gold]
One for each LED. The value 3K ohm was selected because it gives a reasonable brightness to the LEDs. If you want super-bright you can go down to 220 ohm. If you want the LEDs to be more dim, you can always substitute a higher value for these resistors.14 (15 packed) R1-12,14; R13 (back) Resistor 10K ohm [Brown, Black, Orange, Gold]
1 RN1 (back) Resistor Network 6x10K ohm
Pin 1 is indicated on the component by a white dot and on the PCB by the square pad.17 (18 packed) C1, 3-12, 17; C2, 13-16 (back) Capacitor 100nF (0.1μF, 104)
These are the only capacitors in the kit, so all the capacitors have the same value. Keeps it simple.1 Q1 (back) S8050 NPN Transistor (TO-92-3)
This component and its associated resistor R13 are optional. They allow the ESP32 to be flashed over USB without removing it from the connectors. They only do something if you add extra "bodge" wires to the ESP32 board and connect these to the Boot->DTR/RTS pins.6 U1-6 74HC595
8-bit serial in/out Shift Register 3-State Outputs4 U7-10 74HC165
Shift Register 8-bit, parallel load1 U11 (back) MAX3232
Low-Power, up to 1Mbps, True RS-232 Transceivers Using Four 0.1μF External Capacitors (C13-16)11 (U1-11) 16 pin DIP Socket
One for each IC, U1-112 RS232-1,2 (back) DE9 (DB9) Male Socket
Currently only RSR232-1 can be used as SIO1, without hardware handshaking . Future work to enable SIO2 &/or hardware handshaking on SIO1.1 Boot (back) Header 4x2 Male
Using the provided shunt-jumpers you can set low level boot options via this header (future, currently not active)2 Patch, Comms (back) Header 8x2 Male
Using the provided shunt-jumpers you can configure the RS232 serials comms via these two headers2 ESP32 (back) Connector 20x1 Female
These two connectors form a socket for mounting the ESP32-PICO-KIT board1 Header 20x1 Male
This header is not soldered to the PCB. It is supplied for a few uses. 1) A pair of 3 pin headers, cut off and soldered to the unpopulated header pin holes on ESP32 (see assembly guide). 2) An 8 pin header, cut off and used if a uSD daughter card is required to replaced a damaged uSD Card Socket. The remaining pins are spare.1 Reset Tactile Switch SPST-NO
This reset switch is redundant as the ESP32 has its own reset press-button switch, but I like to have it. It allows the device to be reset by pushing a pencil/pen tip through an air vent hole in the side of the lid, rather than having to look around the back to find the tiny switch on the ESP32# Surface Mount Device (SMD) components
Don't Panic
- Yes there are two SMD components!
- You can do it!
- You can do it with a regular soldering iron, but you are going to need flux (see assembly guide and tools)
Part Quantity PCB Description 1 U13 PSRAM 64Mb (8M x 8) SPI/ QPI SOP-8_150mil
1 uSD Card microSD Card Socket
# Rocker Switches
Part Quantity PCB Description 1 S1 Red Power Switch (On-On)
3 S2, S4, S6 Blue Rocker (Mom-off-Mom)
2 S3, S5 Red Rocker (Mom-off-Mom)
8 SA4-7, SA12-15 Blue Rocker (On-On)
8 SA0-3, SA8-11 Red Rocker (On-On)
# Miscellaneous components
Part Quantity PCB Description 1 ESP32 (back) ESP32-PICO-KIT v4.1
Look closely and you will see that 3 of the pinout through-holes on each side are unpopulated (at the end where the antenna is, opposite end to the micro-USB connector). These need to be populated with 0.1" pitch male header pins (provided in the strip of 20 above). These enable the PSRAM, soldered on the PCB, to be accessed by the ESP32.1 microSD 16GB Memory Card
8 Shunt-Jumper
1 Test lead
Used to test LEDs during assembly, but not used in the final assembled kit120mm x 25mm Black Velcro adhesive backed hook & loop tape
Used to mount the Charcoal grey hammer tone painted acrylic switch surround to the Black acrylic LED/switch masking plate.1 PCB
# Mounting hardware
Part Quantity Description 8 M4x30mm Hex Socket Screw
8 Spacer 8mm Nylon
The 8mm spacers fit on theM4x30mm Hex Socket Screws
in front of the PCB, between the PCB and the3mm Black acrylic LED/switch masking plate
8 Spacer 6mm Nylon
The 6mm spacers fit on theM4x30mm Hex Socket Screws
behind the PCB, between the PCB and the3mm Clear acrylic back cover
8 M4 Hex Nut Nylon
4 M3x12mm Black Machine Screw
4 1 NEW
3mm Blue aluminium lid
# Acrylic parts
TIP
Most pieces of acrylic have a protective backing cover (plastic or paper) to protect them from scratching during cutting and transportation. This should be removed before you use them in the assembly of the kit.
If any of the following acrylic parts, especially the clear parts, appear white or any colour other than indicated, it is because they have a protective covering.
Part Quantity Description 1 6mm Clear acrylic front cover
1 6mm Charcoal grey hammer tone painted acrylic switch surround
1 NEW
3.0mm White text/decals on Black facia over a transparent red filter
1 3mm Black acrylic LED/switch masking plate
1 3mm Clear acrylic back cover
1+3 2mm White acrylic back cover corner reinforcer (top edge crucifix slots)
See this forum post for details4 2mm White acrylic back cover corner reinforcer (bottom side edge crucifix slots)
See this forum post for details1 2mm Black/White/Clear acrylic LED spacer & switch alignment guide (8 slots)
1 2mm Black/white/Clear acrylic LED alignment guide (8 round holes)
Last Updated: 7/10/2021, 5:20:59 AMConfiguration - v1.10.0 or later | The High Nibble + + + + + + + + + ++ + + diff --git a/imsai8080/configure/old_version_prior_v1.10.0/index.html b/imsai8080/configure/old_version_prior_v1.10.0/index.html new file mode 100644 index 0000000..670d40d --- /dev/null +++ b/imsai8080/configure/old_version_prior_v1.10.0/index.html @@ -0,0 +1,100 @@ + + + + + +The High Nibble # Configuration -
v1.10.0
or laterTIP
As of October 2022 kits ship with firmware
v1.10.0
or later. +The following configuration guide relates to these firmware versions.If you are still running and older firmware revision
v1.9.1
or earlier, the previous version of the Configuration Guide is available here# Overview
WARNING
Just like the real IMSAI 8080 computer, the default configuration of your kit is an empty machine. While you can enter instructions using the toggle switches (and you should experiment with this sometime) it's more interesting to run some real software. +The default configuration is like an empty machine with no ROM only RAM.
In order to run any applications, you will need to activate a virtual ROM (eg. to run BASIC, or boot a floppy disk) and maybe load an operating system (such as CP/M) from a virtual disk.
Also like the original computer, your IMSAI 8080esp has no video output port. Owners of the original IMSAI 8080 would connect a serial terminal (either a teletype printer or visual display unit) to a serial port. While you can still do this (see Serial Communications section), this modern kit offers a much easier solution using Wi-Fi.
Once power is applied to your kit, the ESP32 will create a Wi-Fi Access Point. You can connect your computer to this Wi-Fi network as if it were connected to a Wi-FI router. You can then open a web page, the Desktop UI, that will give you full access to the IMSAI 8080esp - including a virtual serial terminal (TTY:), floppy disks, printer (LPT:) and more.
Once connected, you can then configure the IMSAI 8080esp to connect directly to your home Wi-Fi, so you can use it without having to change your Wi-FI settings again.
# Getting connected
- Plug in the power to the IMSAI 8080esp kit.
- On your computer, open the Wi-Fi settings and select the
imsai8080
network (SSID).- When prompted for a password, enter
password
.Your computer should now be connected, and you will be able to open the Desktop UI. The web interface has been written and tested with the Chrome browser in mind, and you might find it works differently if you are using a different browser.
- If you have a Mac, open your browser and enter
imsai8080
orimsai8080.local
as the web address.- If you have a PC, open your browser and enter
imsai8080
or192.168.4.1
as the address.# Default configuration
# IMSAI 8080 (guest)
WARNING
The default configuration is like an empty machine with no ROM only RAM.
- RAM is 64K occupying the entire address space from
0000h
toFFFFh
- CPU is Intel 8080 @ 2MHz with support for undocumented op-codes
- No boot ROM is active by default
# ESP32 (host)
- Wi-Fi set to Access-Point (AP) mode with the default SSID of
imsai8080
, password ofpassword
- Hostname (HOSTNAME environment variable) set to
imsai8080
(imsai8080.local
for mDNS)- Port (PORT environment variable) set to
80
- Timezone (TZ environment variable) set for AEST+10, ADST+11 (ie. Sydney, Australia)
- Time server (NTP_SERVER environment variable) set to
pool.ntp.org
- POST (Power On Self Test) disabled
- Console log level set to
NONE
(details to follow)TIP
Once you are connected to the Wi-Fi network, start a Chrome browser and enter the URL
http://imsai8080
to see the Desktop UI.# Startup configuration (Non-Volatile Storage, NVS)
The startup configuration is modified via the toggle switches on the front panel.
To enter startup configuration mode, follow the sequence:
- ensure the ESP32 is connected to a USB power source, the red LED on the ESP32 board should be illuminated
- turn the front panel power switch off,
PWR OFF
, the down position- hold the
EXAMINE
toggle in the Examine, up position- press and release the
Reset
switch while holding theEXAMINE
toggle up- hold the
EXAMINE
toggle for a second or two- release the
EXAMINE
toggleTIP
There are 2
Reset
switches available that both do the same thing:
- The
Tactile Switch SPST-NO
you installed in theReset
position on the PCB- The small tactile switch on the ESP32 board marked
EN
- NOT the blue toggle switch on the front panel
The IMSAI 8080esp should now be in startup configuration mode. This is indicted by a running LED pattern (right to left) on the 4 LEDS at the right hand side of the front panel (
HOLD
,WAIT
,RUN
,INTERRUPTS ENABLED
).TIP
The current startup configuration value is displayed on the Address Bus LEDs (bits 0-15) when you enter startup configuration mode.
TIP
The whole procedure, including entering a value to boot into CP/M 2.2 (see below) is demonstrated in this Kit Assembly video +
WARNING
When you Deposit a new startup configuration value, all the bits of the current value are overwritten. If your objective is to modify the existing value changing only a few of the bits, you must toggle in all the bits of the existing value indicated by the Address Bus LEDs and then switch the bits you want to configure differently, before you Deposit this new value.
Booting into XYBASIC
To configure the IMSAI 8080esp to boot directly into a ROM based XYBASIC in Z80 mode @ 4 MHz, the following startup configuration value can be used.
- Binary: 0000 0100 0101 0000
- Octal: 002120
- Hexadecimal: 0450
- Enter startup configuration mode (above)
- Toggle in this value on the Address toggle switches
- Raise the
DEPOSIT
toggle to the Deposit, up position to store the entered startup configuration value.- Reboot the IMSAI 8080esp by pressing a
Reset
switchBooting into CP/M 2.2
To configure the IMSAI 8080esp to boot from the disk image in drive
DSK:A:
in Z80 mode @ 4 MHz, the following startup configuration value can be used. You can mount thecpm_22.dsk
disk image in driveDSK:A:
via the Desktop UI.
- Binary: 0000 1001 0101 0000
- Octal: 004520
- Hexadecimal: 0950
- Enter startup configuration mode (above)
- Toggle in this value on the Address toggle switches
- Raise the
DEPOSIT
toggle to the Deposit, up position to store the entered startup configuration value.- Reboot the IMSAI 8080esp by pressing a
Reset
switch
Address Bit Name Equivalent Flag Description 0 NVS_POST n/a Enable Power On Self Test (POST) 1-2 NVS_LOG_LEVEL n/a Set ESP32 console Log Level, 0 = NONE; 1 = ERROR; 2 = WARN; 3 = INFO 3 NVS_IF_STA n/a Set Wi-Fi Mode, 0 = Access Point Mode (AP); 1 = Station Mode (STA) 4 NVS_Z80 -z
,-8
Enable Z80 CPU emulation, 0 = 8080 -8
; 1 = Z80-z
5 NVS_NO_UNDOC -u
Suppress support for undocumented op. codes, 1 = -u
6 NVS_4MHZ -f
Set CPU speed, 0 = 2 MHz -f 2
; 1 = 4 MHz-f 4
7 NVS_UNLIMITED -f 0
Set CPU speed to Unlimited, 0 = use speed from bit 6; 1 = Unlimited -f 0
8-10 NVS_MEMORY_MAP -M
Set memory map, 0 = default 64K RAM, 1-7 = use memory map n -M n
11 NVS_BANK_ROM -R
Enable MPU-B(A) style Banked ROM/RAM functionality, 1 = -r
. Only compatible with MPU-A ROM images.12-14 Reserved for future use 15 NVS_AUTO_RUN Autorun - The CPU will automatically run when the machine is switched on ( PWR ON
)To set the startup configuration mode value, follow the sequence:
- To set a bit, put the corresponding Address toggle switch in the up position.
- To clear a bit, put the corresponding Address toggle switch in the down position.
- Raise the
DEPOSIT
toggle to the Deposit, up position to store the entered startup configuration value.WARNING
The IMSAI 8080esp must be rebooted for the new configuration to take effect.
This can be done by raising the
RESET
toggle or by pressing aReset
switch.TIP
For further details about the Equivalent Flag refer to the Z80PACK documentation for the imsaisim machine.
# Serial Communications (RS232, USB)
The IMSAI 8080esp is configured with two virtual IMSAI SIO-2 UART boards.
Each SIO board provides two serial I/O ports. The board/port/devices are assigned as follows:
SIO Board UART Port I/O ports (decimal) Connected Device CP/M 2.2 Device via BIOS #1 A (SIO1) 2 (data), 3 (status) Physical UART0 (Tx/Rx Patch pins & USB) TTY: B 4 (data), 5 (status) Virtual VIO keyboard CRT: (input only, no output) #2 A (SIO2) 34 (data), 35 (status) Physical UART1 (IO22/IO5 Patch pins) UC1: (default) B 36 (data), 37 (status) Virtual 'AT' Hayes modem (assignable as UC1:) When the machine boots, the virtual SIO1 UART (board #1 port A) is routed to the physical UART0 on the
ESP32-PICO-KIT
.
- This enables you to use any software on the IMSAI 8080 that communicates via this UART on the SIO (namely the CP/M TTY: as console) using a terminal or terminal emulator depending your method of connection.
- The default speed with the current firmware is 115200 baud @ 8N1
TIP
Both the ESP32 console log and the IMSAI 8080 SIO1 (TTY:) will be directed to the serial UART0. If you set the
NVS_LOG_LEVEL
toINFO
(3) this will likely send console log messages during normal use of the machine. It is recommended to set theNVS_LOG_LEVEL
to a lower level during normal operation.WARNING
Behavior of serial communications is further effected by the settings on the virtual SIO UARTs (SIO1 and SIO2). See SIO flags in the
system.conf
file below, for further details.WARNING
If you start the Desktop UI from a web browser and the TTY: virtual device is connected (default behavior) then the virtual* SIO1 UART (TTY:) is disconnected from the physical UART0 on the
ESP32-PICO-KIT
and instead re-routed to the TTY: virtual device on the Desktop UI. If the TTY: virtual device is disconnected, then the SIO1 UART is re-routed back to the UART0 on theESP32-PICO-KIT
, ie. only one of these two destinations can be connected at a time.Note: the ESP32 console log is always sent to the physical UART0 and is never redirected.
# Serial UART over USB
The
ESP32-PICO-KIT
supports serial communications from UART0 over USB. It uses a Silicon Labs CP210x USB to UART bridge
- connect the
ESPP32-PICO-KIT
to a PC using a suitable USB cable- start a terminal emulator on the PC set for 115200 baud 8N1 connected to the serial device your OS identifies the
ESP32-PICO-KIT
on +
- Windows will be a COMx: port
- OSX will be /dev/tty.SLAB_USBtoUART
- Linux will be /dev/ttyUSB0 (or similar, TBA)
TIP
If you do not see a TTY/COM port on your PC presented by the ESP32-PICO-KIT when connected, you may need to install a driver for the Silicon Labs CP210x USB to UART bridge.
Drivers are available direct from the manufacturer at https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers
Additional information is available from the Espressif (manufacturer of the
ESP32-PICO-KIT
) web site at https://docs.espressif.com/projects/esp-idf/en/latest/get-started/establish-serial-connection.html# Serial UART over RS232
WARNING
Serial UART0 over RS232 and Serial UART0 over USB are mutually exclusive, ie. they cannot be used at the same time.
Serial UART over RS232 is configured by using the supplied jumpers/shunts to bridge the required pins on the
Patch
andComms
headers accessible on the rear of the PCB, and connecting a suitable RS232 device to one of the DE-9M connectors labeledRS232-1
andRS232-2
RS232 line levels are provided by the Maxim MAX3232 IC see the data sheet for details.
You must position 4 of the jumpers/shunts provided to enable a Serial UART over RS232. This image shows the currently supported configuration for the jumpers/shunts on both the
Patch
andComms
headers for UART0 toRS232-1
# UART0 to RS232-1
# Patch header
- bridge Tx - T1 - vertical position second from right
- bridge Rx - R1 - vertical right most position
# Comms header
- bridge @ Tx1 - horizontal second position from top
- bridge @ Rx1 - horizontal fourth position from top
# UART1 to RS232-2
# Patch header
- bridge IO22 - T2 - vertical position third from right
- bridge IO5 - R2 - vertical position fourth from right
# Comms header
- bridge @ Tx2 - horizontal third position from bottom
- bridge @ Rx2 - horizontal last position at bottom
# Configuring physical UART parameters (speed, data & stop bits)
You can configure the parameters for both UART0 (
RS232-1
/USB) and UART1 (RS232-2
) via theboot.conf
file.See UART Configuration in the
boot.conf
file below, for further details.# Wi-Fi Communications
The ESP32 has on-board Wi-Fi and can boot in either Access Point (AP) or Station (STA) mode. The mode is determined by the NVS_IF_STA bit in the startup configuration stored in NVS and described above.
- In AP mode, the ESP32 acts as an Access Point and broadcasts a system defined SSID and provides DHCP services for clients to connect +
- The SSID hardcoded in the firmware is imsai with a password of password, this will only be used if the boot.conf file on the microSD card cannot be read or does not include a
HOSTNAME=name
statement, see Boot.conf file below.- If a
HOSTNAME=name
statement is found in the boot.conf file, then this hostname is also used as the SSID in AP mode. In this case, the password still remains password- In STA mode, the ESP32 acts as a Wi-Fi station or client and can join an existing Wi-Fi network (supporting WPA or WPA2, but not Enterprise WPA). +
- The SSID and password of the desired Wi-Fi network must be configured in the boot.conf file using the
SSID=name
andPASSWORD=password
statements, see Boot.conf file below.TIP
The boot.conf file can be edited via the SYS: virtual system device in the Desktop UI while connected to the IMSAI 8080esp running in AP mode. +Alternatively the microSD Card can be mounted in a PC and the
/imsai/conf/boot.conf
file edited directly in a text editor then the microSD Card returned to the IMSAI 8080esp before it is powered on.WARNING
When the IMSAI 8080esp is configured to work in station mode (STA) but it is unable to make a connection to the configured Wi-Fi network within 30 seconds, the ESP32 will reboot and temporarily start in AP mode.
- This enables you to connect to the IMSAI 8080esp from a browser on the advertised SSID and modify/correct the STA mode Wi-Fi configuration.
- The simplest way to determine if this has happed is to look for the AP mode SSID being broadcast, or to look at the ESP32 console log output on the UART.
WARNING
The design of the IMSAI 8080esp is intended for only one Wi-Fi client (browser)to be connected at any given time. It is untested and not recommended to connect multiple clients at the same time.
# Boot.conf file
The boot.conf file is located on the microSD card with the path
/imsai/conf/boot.conf
+As the ESP32 boots this file is loaded, each line parsed and the variable=value pair is added to the environment (like posix environment variables).WARNING
There is little to no error checking done at the moment. If you significantly change this file and remove a variable, or leave a value blank you may cause the boot process to fail. I know I've managed to do that once or twice.
The solution is to mount the microSD card on a PC and edit the boot.conf file to fix the problem.
# Default boot.conf
The default configuration, as shipped (in Release v1.10.0) is a follows:
### Network configuration +NTP_SERVER=pool.ntp.org +TZ=AEST-10AEDT,M10.1.0,M4.1.0 +HOSTNAME=imsai8080 +PORT=80 +SSID=mySSID +PASSWORD=myPASSWORD +WIFI.sta.scan=1 +#WIFI.password.hide=1 +### UART configuration +#UART0=115200,cs8 +#UART1=115200,cs8 +### Performance parameters +#TTY.netsrv.buffer_delay=33 +#LPT.netsrv.buffer_delay=33 +### Harddisk image +HARDDISK=hd-ws4 +### SIO-2 default port mappings (HAL) +#SIO1.portA.device=WEBTTY,UART0 +#SIO1.portB.device=VIOKBD +#SIO2.portA.device=WEBPTR,UART1 +#SIO2.portB.device=MODEM +### Modem initialization string. Example: +#MODEM.init=ATS0=1S15=1&A1 #S0=1 auto-answer after 1 ring, S15=1 enable telnet protocol +MODEM.init=ATS15=1 #S15=1 enable telnet protocol +
# Network Configuration
The Network configuration entries should be familiar and mostly self explanatory.
TIP
The TZ variable cannot use values like Sydney/Australia (Olson format) but must use explicitly defined timezone strings (POSIX format) eg.
TZ=AEST-10AEDT,M10.1.0,M4.1.0
which is correct for Sydney, Australia.A file with TZ variable values for many timezones can be found at https://www.di-mgt.com.au/src/wclocktz.ini Credit to: John Mann in the Forum
An article that defines the POSIX format can be found at Specifying the Time Zone with TZ, however please note, the "third format" referenced in this article is the Olson format, and not supported on the ESP32.
# UART Configuration
The UART configuration entries define the speed, data & stop bits for the two physical UARTs on the ESP32, UART0 and UART1
For example:
### UART configuration +UART0=115200,cs8 # ie. 115200, 8N1 - not required because this is default +UART1=9600 cs7 cstopb parenb parodd # ie. 9600, 7O2 +
- parameters can be separated by spaces or commas
- parameters are case insensitive
- parameters follow the convention used by the
screen
program under unix/linux/gnu ie.: +
- default is
115200,cs8
in other words 115200 8N1- standard baud rates from
110
to230400
e.g. 110, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400 others may work, but you'll have to experimentcs7
- for 7 data bitscs8
- for 8 data bitscstopb
- for 2 stop bits, default is 1parenb
- for even parity, default is noneparenb,parodd
- for odd parity# Performance parameters
The Performance parameters exist only for the two devices
TTY:
(default: SIO1A) andLPT:
and apply only to websocket communication to the Desktop UIThey specify a time in milliseconds (ms) during which output to the device will be buffered (up to the next line feed character) and transmitted in a single (websocket) packet. This can greatly improve performance of both the TTY: and LPT: devices. If used, recommended optimal settings are:
### Performance parameters +TTY.netsrv.buffer_delay=33 +LPT.netsrv.buffer_delay=33 +
# Harddisk image
A harddisk image (4MB) can be mounted as I:DSK: / Drive I:
The current harddisk image is visible on the desktop as
I:DSK:
Harddisk images are visible in the disk library
LIB:
and indicated with a harddisk icon. You can drag-and-drop a new harddisk onto theLIB:
window to upload a new harddisk image.The harddisk function is inactive unless you include the following line in
boot.conf
HARDDISK=imagename +
e.g.
### Harddisk image (don't include the .hdd extension) +HARDDISK=hd-ws4 +
The harddisk image file must reside in
/imsai/disks/
and end with.hdd
eg./imsai/disks/hd-ws4.hdd
+Do not use the.dsk
extension for a harddisk image as it will be confused with a floppy disk imageTIP
If you change harddisk image you must reboot the IMSAI8080esp to load the new image
The harddisk cannot be made a bootable device, the bootrom doesn't support this. A CP/M system floppy disk image is still required in drive A: to boot CP/M
WARNING
There is no UI for changing hard disk images, the required image must be set using the environment variable
HARDDISK
in theboot.conf
file and then the ESP32 hard reset to reload the environment.# SIO-2 port mappings
A HAL (Hardware Abstraction Layer) enables mapping of character mode devices to the four (4) virtual SIO-2 serial ports
- the SIO port mapping configuration is loaded and reported to the debug console (UART0/USB) when the IMSAI8080esp is started/powered-on
- the SIO port mapping configuration is also displayed in the SYS: virtual device on the desktop UI
- when no SIO port mapping configuration is specified, a stanard configuration is the default, and reported as follows:
SIO PORT MAP: +SIO1.portA = WEBTTY UART0 +SIO1.portB = VIOKBD +SIO2.portA = UART1 +SIO2.portB = MODEM +
the purpose of the HAL is to:
- simplify the addition of new character mode devices in future +eg. additional hardware UART; network sockets; additional telnet listeners; new virtual peripherals on the desktop UI
- enable the user to assign specific devices to each of the four (4) virtual SIO-2 serial ports
- details of configuring the SIO port mappings will be published later
# Modem initialization string
This string will be processed by the 'AT' Modem when it is initialised and reset (ie. with the command
ATZ
)For example, to initialize the modem for:
- auto-answer after 1 ring (
ATS0=1
)- enable telnet protocol (
ATS15=1
)- enable answer mode (ie. listen) in "daemon" mode (
AT&A1
)- with the commands concatenated into a single command string
ATS0=1S15=1&A1
add the following line:
#Modem initialization string +MODEM.init=ATS0=1S15=1&A1 +
# System.conf file
The system.conf file is located on the microSD card with the path
/imsai/conf/system.conf
WARNING
Some settings in this file are legacy, maintained for source code compatibility with the Z80PACK, imsaisim machine. Only the parameters documented here have any effect on the IMSAI8080esp.
# SIO flags
The SIO flags affect the behavior of the the four virtual SIO serial ports that are (by default) mapped to physical UARTs on the ESP32.
These four virtual serial ports can:
- force upper case
- strip the parity bit (the MSB in each character byte) - the default for the CP/M console (SIO1)
- drop nulls
- set a virtual baud rate (independent of the physical UARTs baudrate - the lower rate will determine the actual speed)
The functions are enabled by setting the flag value to 1 or disabled with a value of 0 (zero - the default)
If the virtual baud rate is set to 0 (zero) then no rate limit is applied by the virtual SIO serial port
For example:
# SIO 1 Channel A, Ports 2/3 connected to terminal UART0/RS232-1/USB (default) +sio1a_upper_case 0 +sio1a_strip_parity 0 +sio1a_drop_nulls 1 +sio1a_baud_rate 115200 +# typical baud rate values are 110, 300, 1200, 2400, 4800, 9600, +# 19200, 38400, 57600, 115200 - 0 = unlimited baud rate + +# SIO 1 Channel B, Ports 4/5 connected to VIO keyboard +sio1b_upper_case 0 +sio1b_strip_parity 0 +sio1b_drop_nulls 0 +sio1b_baud_rate 1200 + +# SIO 2 Channel A, Ports 34/35 connected to UART1/RS232-2 (default) +# use 8bit here, so that serial file transfers work +sio2a_upper_case 0 +sio2a_strip_parity 0 +sio2a_drop_nulls 0 +sio2a_baud_rate 9600 +# typical baud rate values are 110, 300, 1200, 2400, 4800, 9600, +# 19200, 38400, 57600, 115200 - 0 = unlimited baud rate + +# SIO 2 Channel B, ports 36/37 connected to 'AT' telnet modem (default) +# use 8bit here, so that serial file transfers work +sio2b_upper_case 0 +sio2b_strip_parity 0 +sio2b_drop_nulls 0 +sio2b_baud_rate 2400 +
TIP
If you require 8-bit clean communications, for example: if using protocols like xmodem, then all of upper case, strip the parity bit and drop_nulls should be disabled
eg.
sio1a_upper_case 0 +sio1a_strip_parity 0 +sio1a_drop_nulls 0 +
# Memory maps
The only other parameters that effect the IMSAI 8080esp are the
[MEMORY n]
sections:# <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> +# memory configurations in pages a 256 bytes +# start,size (numbers in decimal, hexadecimal, octal) +# up to 7 memory sections allowed +# up to 6 ram/rom statements per section allowed +# <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><> + +[MEMORY 1] +# Default memory configuration used in most situations with MPU-A ROM: +# 256 pages RAM, 8 pages ROM (replaces or overlays RAM) +ram 0,256 +rom 0xd8,8,mpu-a-rom.hex +# Start address of the boot ROM +boot 0xd800 + +[MEMORY 2] +# Memory configuration for running MPU-A ROM and VIO ROM: +# 240 pages RAM, 8 pages ROM (replaces or overlays RAM) +# 8 pages of RAM and 8 pages of ROM for the VIO from 0xf000 +ram 0,0xf0 +rom 0xd8,8,mpu-a-rom.hex +ram 0xf0,8 +rom 0xf8,8,viofm1.hex +# Start address of the boot ROM +boot 0xd800 + +[MEMORY 3] +# Memory configuration for running with MEMON80 ROM: +# 248 pages RAM, 8 pages ROM +ram 0,0xf8 +rom 0xf8,8,memon80.hex +# Start address of the boot ROM +boot 0xf800 + +[MEMORY 4] +# Memory configuration for running ROM based XYBASIC: +# 16K ROM, 48K RAM +rom 0,64,xybasic.hex +ram 64,192 +# Start address of the boot ROM +boot 0x0000 +
TIP
A memory map is selected by setting the NVS_MEMORY_MAP bits in the Startup configuration, NVS for details.
Last Updated: 2/22/2023, 9:22:58 PMConfiguration - v1.9.1 or earlier | The High Nibble + + + + + + + + + ++ + + diff --git a/imsai8080/index.html b/imsai8080/index.html new file mode 100644 index 0000000..bcfac87 --- /dev/null +++ b/imsai8080/index.html @@ -0,0 +1,31 @@ + + + + + +The High Nibble # Configuration -
v1.9.1
or earlier# Overview
WARNING
Just like the real IMSAI 8080 computer, the default configuration of your kit is an empty machine. While you can enter instructions using the toggle switches (and you should experiment with this sometime) it's more interesting to run some real software. +The default configuration is like an empty machine with no ROM only RAM.
In order to run any applications, you will need to activate a virtual ROM (eg. to run BASIC, or boot a floppy disk) and maybe load an operating system (such as CP/M) from a virtual disk.
Also like the original computer, your IMSAI 8080esp has no video output port. Owners of the original IMSAI 8080 would connect a serial terminal (either a teletype printer or visual display unit) to a serial port. While you can still do this (see Serial Communications section), this modern kit offers a much easier solution using Wi-Fi.
Once power is applied to your kit, the ESP32 will create a Wi-Fi Access Point. You can connect your computer to this Wi-Fi network as if it were connected to a Wi-FI router. You can then open a web page, the Desktop UI, that will give you full access to the IMSAI 8080esp - including a virtual serial terminal (TTY:), floppy disks, printer (LPT:) and more.
Once connected, you can then configure the IMSAI 8080esp to connect directly to your home Wi-Fi, so you can use it without having to change your Wi-FI settings again.
# Getting connected
- Plug in the power to the IMSAI 8080esp kit.
- On your computer, open the Wi-Fi settings and select the
imsai8080
network (SSID).- When prompted for a password, enter
password
.Your computer should now be connected, and you will be able to open the Desktop UI. The web interface has been written and tested with the Chrome browser in mind, and you might find it works differently if you are using a different browser.
- If you have a Mac, open your browser and enter
imsai8080.local
as the web address.- If you have a PC, open your browser and enter
192.168.4.1
as the address.# Default configuration
# IMSAI 8080 (guest)
WARNING
The default configuration is like an empty machine with no ROM only RAM.
- RAM is 64K occupying the entire address space from
0000h
toFFFFh
- CPU is Intel 8080 @ 2MHz with support for undocumented op-codes
- No boot ROM is active by default
# ESP32 (host)
- Wi-Fi set to Access-Point (AP) mode with the default SSID of
imsai8080
, password ofpassword
- Hostname (HOSTNAME environment variable) set to
imsai8080
(imsai8080.local
for mDNS)- Port (PORT environment variable) set to
80
- Timezone (TZ environment variable) set for AEST+10, ADST+11 (ie. Sydney, Australia)
- Time server (NTP_SERVER environment variable) set to
pool.ntp.org
- POST (Power On Self Test) disabled
- Console log level set to
NONE
(details to follow)TIP
Once you are connected to the Wi-Fi network, start a Chrome browser and enter the URL
http://imsai8080.local
to see the Desktop UI.# Startup configuration (Non-Volatile Storage, NVS)
The startup configuration is modified via the toggle switches on the front panel.
To enter startup configuration mode, follow the sequence:
- ensure the ESP32 is connected to a USB power source, the red LED on the ESP32 board should be illuminated
- turn the front panel power switch off,
PWR OFF
, the down position- hold the
EXAMINE
toggle in the Examine, up position- press and release the
Reset
switch while holding theEXAMINE
toggle up- hold the
EXAMINE
toggle for a second or two- release the
EXAMINE
toggleTIP
There are 2
Reset
switches available that both do the same thing:
- The
Tactile Switch SPST-NO
you installed in theReset
position on the PCB- The small tactile switch on the ESP32 board marked
EN
- NOT the blue toggle switch on the front panel
The IMSAI 8080esp should now be in startup configuration mode. This is indicted by a running LED pattern (right to left) on the 4 LEDS at the right hand side of the front panel (
HOLD
,WAIT
,RUN
,INTERRUPTS ENABLED
).TIP
The current startup configuration value is displayed on the Address Bus LEDs (bits 0-15) when you enter startup configuration mode.
TIP
The whole procedure, including entering a value to boot into CP/M 2.2 (see below) is demonstrated in this Kit Assembly video +
WARNING
When you Deposit a new startup configuration value, all the bits of the current value are overwritten. If your objective is to modify the existing value changing only a few of the bits, you must toggle in all the bits of the existing value indicated by the Address Bus LEDs and then switch the bits you want to configure differently, before you Deposit this new value.
Booting into MSBASIC 1.4 (8K)
To configure the IMSAI 8080esp to boot directly into a ROM based MSBASIC 1.4 (8K) in 8080 mode @ 2 MHz, the following startup configuration value can be used.
- Binary: 0000 0100 0000 0000
- Octal: 002000
- Hexadecimal: 0400
- Enter startup configuration mode (above)
- Toggle in this value on the Address toggle switches
- Raise the
DEPOSIT
toggle to the Deposit, up position to store the entered startup configuration value.- Reboot the IMSAI 8080esp by pressing a
Reset
switchBooting into XYBASIC
To configure the IMSAI 8080esp to boot directly into a ROM based XYBASIC in Z80 mode @ 4 MHz, the following startup configuration value can be used.
- Binary: 0000 0101 0101 0000
- Octal: 002520
- Hexadecimal: 0550
- Enter startup configuration mode (above)
- Toggle in this value on the Address toggle switches
- Raise the
DEPOSIT
toggle to the Deposit, up position to store the entered startup configuration value.- Reboot the IMSAI 8080esp by pressing a
Reset
switchBooting into CP/M 2.2
To configure the IMSAI 8080esp to boot from the disk image in drive
DSK:A:
in Z80 mode @ 4 MHz, the following startup configuration value can be used. You can mount thecpm_22.dsk
disk image in driveDSK:A:
via the Desktop UI.
- Binary: 0000 1001 0101 0000
- Octal: 004520
- Hexadecimal: 0950
- Enter startup configuration mode (above)
- Toggle in this value on the Address toggle switches
- Raise the
DEPOSIT
toggle to the Deposit, up position to store the entered startup configuration value.- Reboot the IMSAI 8080esp by pressing a
Reset
switch
Address Bit Name Equivalent Flag Description 0 NVS_POST n/a Enable Power On Self Test (POST) 1-2 NVS_LOG_LEVEL n/a Set ESP32 console Log Level, 0 = NONE; 1 = ERROR; 2 = WARN; 3 = INFO 3 NVS_IF_STA n/a Set Wi-Fi Mode, 0 = Access Point Mode (AP); 1 = Station Mode (STA) 4 NVS_Z80 -z
,-8
Enable Z80 CPU emulation, 0 = 8080 -8
; 1 = Z80-z
5 NVS_NO_UNDOC -u
Suppress support for undocumented op. codes, 1 = -u
6 NVS_4MHZ -f
Set CPU speed, 0 = 2 MHz -f 2
; 1 = 4 MHz-f 4
7 NVS_UNLIMITED -f 0
Set CPU speed to Unlimited, 0 = use speed from bit 6; 1 = Unlimited -f 0
8-10 NVS_BOOT_ROM -x
Set boot ROM to 1 of 7 slots, 0 = No boot ROM, 1-7 = use slot n -x $ROMn
11 NVS_BANK_ROM -r
Enable MPU-B(A) style Banked ROM/RAM functionality, 1 = -r
. Only compatible with MPU-A ROM images.12-15 Reserved for future use To set the startup configuration mode value, follow the sequence:
- To set a bit, put the corresponding Address toggle switch in the up position.
- To clear a bit, put the corresponding Address toggle switch in the down position.
- Raise the
DEPOSIT
toggle to the Deposit, up position to store the entered startup configuration value.WARNING
The IMSAI 8080esp must be rebooted for the new configuration to take effect. This can be done by pressing a
Reset
switch.TIP
For further details about the Equivalent Flag refer to the Z80PACK documentation for the imsaisim machine.
# Serial Communications (RS232, USB)
The IMSAI 8080esp is configured with two virtual IMSAI SIO-2 UART boards.
Each SIO board provides two serial I/O ports. The board/port/devices are assigned as follows:
SIO Board UART Port I/O ports (decimal) Connected Device CP/M 2.2 Device via BIOS #1 A (SIO1) 2 (data), 3 (status) Physical UART0 (Tx/Rx Patch pins & USB) TTY: B 4 (data), 5 (status) Virtual VIO keyboard CRT: (input only, no output) #2 A (SIO2) 34 (data), 35 (status) Physical UART1 (IO22/IO5 Patch pins) UC1: (default) B 36 (data), 37 (status) Virtual 'AT' Hayes modem (assignable as UC1:) When the machine boots, the virtual SIO1 UART (board #1 port A) is routed to the physical UART0 on the
ESP32-PICO-KIT
.
- This enables you to use any software on the IMSAI 8080 that communicates via this UART on the SIO (namely the CP/M TTY: as console) using a terminal or terminal emulator depending your method of connection.
- The default speed with the current firmware is 115200 baud @ 8N1
TIP
Both the ESP32 console log and the IMSAI 8080 SIO1 (TTY:) will be directed to the serial UART0. If you set the
NVS_LOG_LEVEL
toINFO
(3) this will likely send console log messages during normal use of the machine. It is recommended to set theNVS_LOG_LEVEL
to a lower level during normal operation.WARNING
Behavior of serial communications is further effected by the settings on the virtual SIO UARTs (SIO1 and SIO2). See SIO flags in the
system.conf
file below, for further details.WARNING
If you start the Desktop UI from a web browser and the TTY: virtual device is connected (default behavior) then the virtual* SIO1 UART (TTY:) is disconnected from the physical UART0 on the
ESP32-PICO-KIT
and instead re-routed to the TTY: virtual device on the Desktop UI. If the TTY: virtual device is disconnected, then the SIO1 UART is re-routed back to the UART0 on theESP32-PICO-KIT
, ie. only one of these two destinations can be connected at a time.Note: the ESP32 console log is always sent to the physical UART0 and is never redirected.
# Serial UART over USB
The
ESP32-PICO-KIT
supports serial communications from UART0 over USB. It uses a Silicon Labs CP210x USB to UART bridge
- connect the
ESPP32-PICO-KIT
to a PC using a suitable USB cable- start a terminal emulator on the PC set for 115200 baud 8N1 connected to the serial device your OS identifies the
ESP32-PICO-KIT
on +
- Windows will be a COMx: port
- OSX will be /dev/tty.SLAB_USBtoUART
- Linux will be /dev/ttyUSB0 (or similar, TBA)
TIP
If you do not see a TTY/COM port on your PC presented by the ESP32-PICO-KIT when connected, you may need to install a driver for the Silicon Labs CP210x USB to UART bridge.
Drivers are available direct from the manufacturer at https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers
Additional information is available from the Espressif (manufacturer of the
ESP32-PICO-KIT
) web site at https://docs.espressif.com/projects/esp-idf/en/latest/get-started/establish-serial-connection.html# Serial UART over RS232
WARNING
Serial UART0 over RS232 and Serial UART0 over USB are mutually exclusive, ie. they cannot be used at the same time.
Serial UART over RS232 is configured by using the supplied jumpers/shunts to bridge the required pins on the
Patch
andComms
headers accessible on the rear of the PCB, and connecting a suitable RS232 device to one of the DE-9M connectors labeledRS232-1
andRS232-2
RS232 line levels are provided by the Maxim MAX3232 IC see the data sheet for details.
You must position 4 of the jumpers/shunts provided to enable a Serial UART over RS232. This image shows the currently supported configuration for the jumpers/shunts on both the
Patch
andComms
headers for UART0 toRS232-1
# UART0 to RS232-1
# Patch header
- bridge Tx - T1 - vertical position second from right
- bridge Rx - R1 - vertical right most position
# Comms header
- bridge @ Tx1 - horizontal second position from top
- bridge @ Rx1 - horizontal fourth position from top
# UART1 to RS232-2
# Patch header
- bridge IO22 - T2 - vertical position third from right
- bridge IO5 - R2 - vertical position fourth from right
# Comms header
- bridge @ Tx2 - horizontal third position from bottom
- bridge @ Rx2 - horizontal last position at bottom
# Configuring physical UART parameters (speed, data & stop bits)
You can configure the parameters for both UART0 (
RS232-1
/USB) and UART1 (RS232-2
) via theboot.conf
file.See UART Configuration in the
boot.conf
file below, for further details.# Wi-Fi Communications
The ESP32 has on-board Wi-Fi and can boot in either Access Point (AP) or Station (STA) mode. The mode is determined by the NVS_IF_STA bit in the startup configuration stored in NVS and described above.
- In AP mode, the ESP32 acts as an Access Point and broadcasts a system defined SSID and provides DHCP services for clients to connect +
- The SSID hardcoded in the firmware is imsai with a password of password, this will only be used if the boot.conf file on the microSD card cannot be read or does not include a
HOSTNAME=name
statement, see Boot.conf file below.- If a
HOSTNAME=name
statement is found in the boot.conf file, then this hostname is also used as the SSID in AP mode. In this case, the password still remains password- In STA mode, the ESP32 acts as a Wi-Fi station or client and can join an existing Wi-Fi network (supporting WPA or WPA2, but not Enterprise WPA). +
- The SSID and password of the desired Wi-Fi network must be configured in the boot.conf file using the
SSID=name
andPASSWORD=password
statements, see Boot.conf file below.TIP
The boot.conf file can be edited via the SYS: virtual system device in the Desktop UI while connected to the IMSAI 8080esp running in AP mode. +Alternatively the microSD Card can be mounted in a PC and the
/imsai/conf/boot.conf
file edited directly in a text editor then the microSD Card returned to the IMSAI 8080esp before it is powered on.WARNING
When the IMSAI 8080esp is configured to work in station mode (STA) but it is unable to make a connection to the configured Wi-Fi network within 30 seconds, the ESP32 will reboot and temporarily start in AP mode.
- This enables you to connect to the IMSAI 8080esp from a browser on the advertised SSID and modify/correct the STA mode Wi-Fi configuration.
- The simplest way to determine if this has happed is to look for the AP mode SSID being broadcast, or to look at the ESP32 console log output on the UART.
WARNING
The design of the IMSAI 8080esp is intended for only one Wi-Fi client (browser)to be connected at any given time. It is untested and not recommended to connect multiple clients at the same time.
# Boot.conf file
The boot.conf file is located on the microSD card with the path
/imsai/conf/boot.conf
+As the ESP32 boots this file is loaded, each line parsed and the variable=value pair is added to the environment (like posix environment variables).WARNING
There is little to no error checking done at the moment. If you significantly change this file and remove a variable, or leave a value blank you may cause the boot process to fail. I know I've managed to do that once or twice.
The solution is to mount the microSD card on a PC and edit the boot.conf file to fix the problem.
# Default boot.conf
The default configuration, as shipped (in Release v1.7.0) is a follows:
#Network configuration +NTP_SERVER=pool.ntp.org +TZ=AEST-10AEDT,M10.1.0,M4.1.0 +HOSTNAME=imsai8080 +PORT=80 +SSID=mySSID +PASSWORD=myPASSWORD +#Bootrom configuration +ROM1=mpu-a-rom.hex +ROM2=mpu-a-vio-rom.hex +ROM3=basic4k.hex +ROM4=basic8k.hex +ROM5=xybasic.hex +ROM6=memon80.hex +#UART configuration +#UART0=115200,cs8 +#UART1=230400,cs8 +#Harddisk image +HARDDISK=hd-ws4 +#Performance parameters +#SIO1.netsrv.buffer_delay=33 +#LPT.netsrv.buffer_delay=33 +#Modem initialization string. Example: +#MODEM.init=ATS0=1S15=1&A1 +#SIO-2 default port mappings +#SIO1.portA.device=WEBTTY,UART0 +#SIO1.portB.device=VIOKBD +#SIO2.portA.device=MODEM +#SIO2.portB.device=UART1 +
# Network Configuration
The Network configuration entries should be familiar and mostly self explanatory.
TIP
The TZ variable cannot use values like Sydney/Australia (Olson format) but must use explicitly defined timezone strings (POSIX format) eg.
TZ=AEST-10AEDT,M10.1.0,M4.1.0
which is correct for Sydney, Australia.A file with TZ variable values for many timezones can be found at https://www.di-mgt.com.au/src/wclocktz.ini Credit to: John Mann in the Forum
An article that defines the POSIX format can be found at Specifying the Time Zone with TZ, however please note, the "third format" referenced in this article is the Olson format, and not supported on the ESP32.
# Bootrom Configuration
The Bootrom configuration entries define the slots corresponding to the NVS_BOOT_ROM bits in the Startup configuration (NVS) (see above). There can be a maximum of 7,
ROM1
toROM7
. Each value should be the filename of a bootable program in Intel HEX file format (TBA) and located on the microSD card in the path/imsai/
# UART Configuration
The UART configuration entries define the speed, data & stop bits for the two physical UARTs on the ESP32, UART0 and UART1
For example:
#UART configuration +UART0=115200,cs8 # ie. 115200, 8N1 - not required because this is default +UART1=9600 cs7 cstopb parenb parodd # ie. 9600, 7O2 +
- parameters can be separated by spaces or commas
- parameters are case insensitive
- parameters follow the convention used by the
screen
program under unix/linux/gnu ie.: +
- default is
115200,cs8
in other words 115200 8N1- standard baud rates from
110
to230400
e.g. 110, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400 others may work, but you'll have to experimentcs7
- for 7 data bitscs8
- for 8 data bitscstopb
- for 2 stop bits, default is 1parenb
- for even parity, default is noneparenb,parodd
- for odd parity# Harddisk image
A harddisk image (4MB) can be mounted as I:DSK: / Drive I:
The current harddisk image is visible on the desktop as
I:DSK:
Harddisk images are visible in the disk library
LIB:
and indicated with a harddisk icon. You can drag-and-drop a new harddisk onto theLIB:
window to upload a new harddisk image.The harddisk function is inactive unless you include the following line in
boot.conf
HARDDISK=imagename +
e.g.
#HARDDISK image (don't include the .hdd extension) +HARDDISK=hd-ws4 +
The harddisk image file must reside in
/imsai/disks/
and end with.hdd
eg./imsai/disks/hd-ws4.hdd
+do not use the.dsk
extension for a harddisk image as it will be confused with a floppy disk imageTIP
If you change harddisk image you must reboot the IMSAI8080esp to load the new image
The harddisk cannot be made a bootable device, the bootrom doesn't support this. A CP/M system floppy disk image is still required in drive A: to boot CP/M
WARNING
There is no UI for changing hard disk images, the required image must be set using the environment variable
HARDDISK
in theboot.conf
file and then the ESP32 hard reset to reload the environment.# Performance parameters
The Performance parameters exist only for the two devices
TTY:
(SIO1) andLPT:
and apply only to websocket communication to the Desktop UIThey specify a time in milliseconds (ms) during which output to the device will be buffered (up to the next line feed character) and transmitted in a single (websocket) packet. This can greatly improve performance of both the TTY: and LPT: devices. If used, recommended optimal settings are:
#Performance parameters +SIO1.netsrv.buffer_delay=33 +LPT.netsrv.buffer_delay=33 +
# Modem initialization string
This string will be processed by the 'AT' Modem when it is initialised and reset (ie. with the command
ATZ
)For example, to initialize the modem for:
- auto-answer after 1 ring (
ATS0=1
)- enable telnet protocol (
ATS15=1
)- enable answer mode (ie. listen) in "daemon" mode (
AT&A1
)- with the commands conncatenated into a single command string
ATS0=1S15=1&A1
add the following line:
#Modem initialization string +MODEM.init=ATS0=1S15=1&A1 +
# SIO-2 port mappings
A HAL (Hardware Abstraction Layer) enables mapping of character mode devices to the four (4) virtual SIO-2 serial ports
- the SIO port mapping configuration is loaded and reported to the debug console (UART0/USB) when the IMSAI8080esp is started/powered-on
- the SIO port mapping configuration is also displayed in the SYS: virtual device on the desktop UI
- when no SIO port mapping configuration is specified, a stanard configuration is the default, and reported as follows:
SIO PORT MAP: +SIO1.portA = WEBTTY UART0 +SIO1.portB = VIOKBD +SIO2.portA = UART1 +SIO2.portB = MODEM +
the purpose of the HAL is to:
- simplify the addition of new character mode devices in future +eg. additional hardware UART; network sockets; additional telnet listeners; new virtual peripherals on the desktop UI
- enable the user to assign specific devices to each of the four (4) virtual SIO-2 serial ports
- details of configuring the SIO port mappings will be published soon
# System.conf file
The system.conf file is located on the microSD card with the path
/imsai/conf/system.conf
WARNING
This is a legacy configuration file, maintained for source code compatibility with the Z80PACK, imsaisim machine. Only the parameters documented here have any effect on the IMSAI8080esp.
# SIO flags
The SIO flags affect the behavior of the the two virtual SIO serial ports that are (by default) mapped to physical UARTs on the ESP32.
These two virtual serial ports can:
- force upper case
- strip the parity bit (the MSB in each character byte) - the default for the CP/M console (SIO1)
- drop nulls
- set a virtual baud rate (independent of the physical UARTs baudrate - the lower rate will determine the actual speed)
The functions are enabled by setting the flag value to 1 or disabled with a value of 0 (zero - the default)
If the virtual baud rate is set to 0 (zero) then no rate limit is applied by the virtual SIO serial port
For example:
# SIO 1 Channel A, Ports 2/3 connected to UART0/USB/RS232-1 (default) +sio1a_upper_case 0 +sio1a_strip_parity 1 +sio1a_drop_nulls 1 +sio1a_baud_rate 9600 + +# SIO 2 Channel A, Ports 34/35, connected to UART1/RS232-2 (default) +#sio2a_upper_case 0 +#sio2a_strip_parity 1 +#sio2a_drop_nulls 1 +sio2a_baud_rate 19200 +
TIP
If you require 8-bit clean communications, for example: if using protocols like xmodem, then all of upper case, strip the parity bit and drop_nulls should be disabled
eg.
sio1a_upper_case 0 +sio1a_strip_parity 0 +sio1a_drop_nulls 0 +
# RAM size
The only other parameter that effects the IMSAI 8080esp is the last line:
ram 64 +
This still sets the maximum amount of RAM allocated to the simulated machine in KB.
WARNING
Changing this value is not tested and is likely to result in the machine failing to work as expected.
Last Updated: 10/5/2022, 4:17:20 AMIMSAI 8080 replica | The High Nibble + + + + + + + + + ++ + + diff --git a/imsai8080/tools/index.html b/imsai8080/tools/index.html new file mode 100644 index 0000000..75c556a --- /dev/null +++ b/imsai8080/tools/index.html @@ -0,0 +1,30 @@ + + + + + +The High Nibble # IMSAI 8080 replica
# Overview
I began working on building an IMSAI 8080 CP-A Front Panel replica in May 2017.
I first ported Udo Munk's z80pack V1.36-dev, specifically the imsaisim machine, to the ESP32 micro-controller targeting the ESP32-PICO-KIT
These devices have a dual-core CPU @ 240MHz, 520KB SRAM, 4MB Flash RAM (storage) and builtin Wi-Fi, USB connector for serial UART and programming.
To this I added
- microSD Card for a FAT filesystem (using an 16GB card)
- PSRAM for banked memory implementation
- MAX232 style RS-232 driver and DE-9M sockets for serial UART
- Full size, fully functional replica of the IMSAI CP-A front panel with all LEDs and switches (for scale: the whole unit is 17" wide)
If you've seen the original IMSAI 8080, I hope you'll agree that the toggle switches are a great match to the original colours. The case is made of 3mm thick aluminium, powder coated blue and also a good match to the original.
Sometimes I use the USB based serial UART for TTY: (under CP/M) but most of the time I connect over Wi-Fi using a browser to launch the desktop GUI that this port of the imsaisim can serve using an embedded web server.
Running the replica at unlimited speed I can get a simulated clock speed somewhere above 5 MHz, there is certainly no problem with reliably running the simulation at a realistic 2 MHz or 4 MHz making WordStar, SuperCalc2, M80/L80 a pleasure to use.
# Features
The stock imsaisim machine from z80pack is configured with:
- 64K of RAM, however the CP/M 2.2 BIOS is configured for 56K to avoid conflicts with ROMS
- 4 simulated 8" floppy disks using 256K floppy image files (*.dsk)
- IMSAI MPU-A bootrom
- MPU-B style bank-switched ROM and RAM for bootrom masking
- IMSAI VIO support (optional based on bootrom choice)
- Harddisk emulation
- Virtual 'AT' modem over TCP/IP sockets (with selectable telnet protocol support) (outbound/dial and (auto) answer mode)
- An MMU with Banked memory management to enable CP/M 3.0 (Plus) with banked memory
- An RTC to support CP/M 3.0 (Plus)
- A range of disk images with different operating systems, applications, games, demos...
The best reference for the imsaisim machine is Udo Munk's z80pack site.
To this I added a simulated GUI desktop that you access over Wi-Fi from an evergreen browser (Chrome & Firefox, but not Safari) that includes the following virtual/emulated devices (some that I just made up)
- TTY: - VT100/ansi compatible character mode serial terminal, can be windowed or zoomed to full-screen (over websockets)
- CRT: - implementation of the IMSAI VIO (over websockets: mirrors the 2KB display RAM and does all rendering in the browser)
- LPT: - implementation of an 80/132-column dot-matrix/line printer with selectable paper-types - ready to print on your real printer (dumb text printer, no Esc codes, over websockets)
- X:DSK: & LIB: - graphical disk manager for the 4 floppy drives A-D, including eject, insert (drag-and-drop) from a disk library (.../machine/disks/library/), download disk image, upload disk image, delete disk image (uses RESTful web service interface). Also a hard disk presented as drive I.
- CPA: - IMSAI CP-A front panel (only the 6 control switches & 4 status LEDs on the RHS, over websockets)
- SYS: - system status window, shows details of the simulation (host?), enables remote reboot
- CFG: - configuration file editor, enables config files (.../machine/conf) to be edited and saved
- PTR: - virtual paper tape reader and punch
- DZLR: - implementation of the Cromemco Dazzler graphics display
- ACC: - implementation the Cromemco 88-CCC Cyclops Camera Controller and 88-ACC Cyclops camera (using the web camera attached to the machine running the browser)
- JS1: - implementation of the Cromemco D+7A I/O including JS-1 joystick emulation (from connected USB joystick)
- PTR: & TAPE: - paper tape reader/punch and paper tape library for local storage of paper tapes. A file can also be copied (drag-and-drop) from your local machine to the the reader or the library.
You can see what they look like in these screen-shots.
When the browser is made full-screen you would't know you were in a browser, it just feels like a desktop GUI.
The desktop GUI has been back-ported to z80pack V1.36-dev for desktop operating systems (OSX/Windows/Linux) so you can experience it on a modern PC running the imsaisim machine simulation.
# Notes
- TTY:, VIO:, DZLR: are all able to go full-screen with the use of a widget on the window title-bar and the use of the
ALT-Enter
(Win) orCMD-Enter
(Mac) key combination- you can take screen-shots of the VIO: and DZLR: with the use of a widget on the window title-bar
- ability to change aspect-ratio of the Dazzler display between 1:1 (square pixels), 4:3 (CRT TV), 8:7 (not common, but the closest to the "real thing" I could measure off a YouTube video of an original Cromemco Dazzler working, so I've made this the default), with the use of a widget on the window title-bar
- this chosen aspect-ratio is preserved in full-screen mode
- but not when a screen-capture is taken, this is always 512x512 square pixels
Here are some screen shots of the VIO: and DZLR: made with the screen-shot feature. +
The desktop GUI is developed to work with the latest version of the Google Chrome browser (Official Build). If it works with other browsers that's fortunate but not tested. Its currently looks to work with FireFox (not extensively tested), but I regularly have problems working with Safari.
# Availability
The first batches of IMSAI 8080 replicas shipped in June 2019.
Update
As of November 2024, kits are available again.
The good news is that the redesign has done away with the need for any SMT components so all the soldering is now exclusively through-hole.
# Expression of interest
I accept expressions of interest via email. If you send email to info@thehighnibble.com I will add you to the list.
Once a kit is available for you within the month, I will contact you to confirm your order.
The price for the kit is USD$300 and in addition you also pay for postage and any PayPal transaction fees.
# News & Updates
You can stay up-to-date with news about additions to this site, or new YouTube videos demonstrating the features listed above by following on Twitter @TheHighNibble and subscribing to TheHighNibble YouTube Channel
# Forum
TheHighNibble forum has been set up on GitHub. The forum is public and readable by anyone but if you wish to post you need to become a member.
Membership requires you to have GitHub account. Email to info@thehighnibble.com with your GitHub name and I will send you an invite to join the discussion forum.
# Specifications
# Dimensions (built)
17 1/8" x 7" x 2 11/16"
435mm x 178mm x 68mm
(width x height x depth)
# Weight (built)
4.22 lbs
1.915 kg
# Power
5VDC @ 500 mA (max., < 100mA typical) - USB micro-B plug required
# Dimensions (boxed/shipped)
18 1/3" x 7 1/2" x 3"
465mm x 190mm x 75mm
(width x height x depth)
# Weight (boxed/shipped)
less than 5.1 lbs
less than 2.3 kg
# Bill-of-Materials
# Recommended tools for assembly
# Step-by-step assembly guide
# Configuration (draft)
# Updating Software (draft)
# Troubleshooting (draft)
# Enhancements and Add-ons
# Planned
- Add a UI on the desktop GUI for the virtual 'AT' modem
- Add basic escape code support for formatting output on the LPT: line printer
Hardware based VIO, Dazzler, VT100 terminal with VGA output and PS/2 (and maybe USB) keyboard inputDone, see: S-132 Add-on- Hardware based interface for the replica Cromemco Cyclops ACC: digital camera
Last Updated: 11/8/2024, 10:43:57 PMTools (Draft) | The High Nibble + + + + + + + + + ++ + + diff --git a/imsai8080/troubleshooting/index.html b/imsai8080/troubleshooting/index.html new file mode 100644 index 0000000..040d1f3 --- /dev/null +++ b/imsai8080/troubleshooting/index.html @@ -0,0 +1,64 @@ + + + + + +The High Nibble # Tools (Draft)
TIP
I haven't figured out how to set the image sizes in the site tool I am using, so image sizes my vary. To see them in full size you can always right-click on an image and
Open Image in New Tab
WARNING
I use solder that contains lead because it has a lower melting temperature and is easier to work with. When soldering it is recommended that you work in a well ventilated area and use a fan to blow or suck the soldering fumes away from your face so that you don't breath them.
# Soldering tools & supplies
Tool Description Soldering Iron
I use this sub AUD$20 hobby soldering iron. It doesn't have a temperature control. The little red button gives a short term, fast temperature boot but I almost never use it. This iron has a 1mm Conical tip which is necessary for the two SMD components. A chisel tip can make the through-hole component soldering easier, but isn't necessary.Solder
You should use a flux/rosin core solder that release flux onto the solder joint as it melts.Soldering Tip Clearer
You should use a solder tip cleaner from time to time to keep the tip of your soldering iron in the best possible condition. This makes soldering much easier.Solder Wick
Solder Wick is the simplest tool to use to remove excess solder. I would say it is essential for attempting the SMD components, to remove any solder bridges that will almost always form.Flux - in a Flux Pen
Extra flux is essential for attempting the SMD components. It helps the solder flow exactly and only where you need it. The flux in rosin core solder isn't enough by itself. A flux pen is the simplest and easiest dispenser for small flux jobs. You can use flux gel, but its more messy to dispense and to clean up.# Clean-up supplies
Tool Description Isopropyl Alcohol (IPA)
IPA in a handy spray pack is very useful for cleaning the PCB after soldering. It is recommended that any residual flux is removed, as with time it can corrode the solder joints (?). I'm not very careful about this, but if I have used extra flux then I usually remember to clean up afterwards.Conductive Brush
I bought a conductive brush to help with cleaning up using IPA because it looks cool. Watch any of Jan Beta's YouTube videos that involve soldering and he's very liberal with the IPA and the conductive brush. I guess you shouldn't use a toothbrush because it might generate static electricity (?).Cotton Buds
Very useful for wiping away and scrubbing off dried flux with some IPA.# Tools
Tool Description Side Cutters
I recommend these flat side cutters over the more rounded one I used to have. They are easier to handle and get level with where you want to cut.Self-closing Tweezers
Regular tweezers are better than nothing, but these are easier to use as they don't spring open at the wrong time.2.5mm Hex Driver
A simple 2.5mm Metric Hex/Allen Key will do the job. This is only used to do up the 8 x M4 Hex Button Socket Screws that hold the front panel together.Phillips Head Screwdriver
A medium to small Phillips Head screwdriver is required to tighten the 4 x M3 Black Machine Screws that fix the lid to the front panel.Digital Multimeter
Not essential, but a useful tool to check for continuity and shorts as you solder the components to the PCB.# Miscellaneous
Tool Description Masking Tape
Specifically, masking tape, not sticky tape. Masking tape is less likely to leave a sticky residue. This blue painters tape is usually better than the plain, paper based tape. You'll need a little of this to secure components in place while you solder them (see assembly guide).Elastic Bands
You might need 2 strong elastic bands to hold the alignment guide for the rocker switches in place when soldering in the rocker switches.Last Updated: 7/3/2019, 11:44:37 AMTroubleshooting (Draft) | The High Nibble + + + + + + + + + ++ + + diff --git a/imsai8080/update/index.html b/imsai8080/update/index.html new file mode 100644 index 0000000..88383a5 --- /dev/null +++ b/imsai8080/update/index.html @@ -0,0 +1,46 @@ + + + + + +The High Nibble # Troubleshooting (Draft)
TIP
If you experience problems that are not covered in this trouble shooting guide, please post them to TheHighNibble forum. Maybe someone else has already solved that problem and can help you if I am asleep or unavailable. Also, any problem you have is likely to be experienced by someone else and so, the discussion and resolution via the forum can act as a knowledge base until I can update this guide to include notes on the problem.
# During assembly
TIP
The troubleshooting outlined here focuses on understanding the messages that are logged to the console by the ESP32 as it boots. +The simplest way to see these messages is to
- connect the
ESPP32-PICO-KIT
to a PC using a suitable USB cable- start a terminal emulator on the PC set for 115200 baud 8N1 connected to the serial device your OS identifies the ESP32 on +
- Windows will be a COMx: port
- OSX will be /dev/tty.SLAB_USBtoUART
- Linux will be /dev/ttyUSB0 (or similar, TBA)
If you do not see a TTY/COM port on your PC presented by the ESP32-PICO-KIT, you may need to install a driver for the Silicon Labs CP210x USB to UART bridge used on the ESP32-PICO-KIT. See Serial Communications (RS232, USB) in the Configuration guide for details.
# With just the ESP32, PSRAM and microSD card in place (and supporting passives)
# No firmware
If you see only:
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) +flash read err, 1000 +ets_main.c 371 +ets Jun 8 2016 00:22:57 + +rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) +flash read err, 1000 +ets_main.c 371 +ets Jun 8 2016 00:22:57 +
Then that's my fault, and I've shipped you an ESP32-PICO-KIT module without the IMSAI 8080esp firmware flashed. This does not require a return and re-mail. But it will require you to follow a number of steps involving installing some tools from the
esp-idf
to flash the firmware yourself. A detailed guide for this unlikely outcome will follow.# I see an error in the logs
WARNING
An error in the logs appears as red text with a capital E as the first character of the line.
TIP
Some errors cause the ESP32 to continuously reboot and so the error will be repeated and scroll up the screen and be hard to read. Simply unplug the USB cable to stop the console error log so you can read the error.
If you see something similar to:
Rebooting... +ets Jun 8 2016 00:22:57 + +rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) +configsip: 188777542, SPIWP:0xee +clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 +mode:DIO, clock div:1 +load:0x3fff0018,len:4 +load:0x3fff001c,len:4276 +load:0x40078000,len:9948 +load:0x40080400,len:6464 +entry 0x400806cc +I (269) psram: This chip is ESP32-PICO +E (269) cpu_start: Failed to init external RAM, needed for external .bss segment +abort() was called at PC 0x400817e4 on core 0 +
Then your soldering of the PSRAM has been unsuccessful. You should rework all the solder joints of the PSRAM SOP-8 package, check that you have
C1
andR14
correctly installed and that you have added the extra 2 sets of 3 male header pins to the ESP32-PICO-KIT board as per the assembly instructionsIf you see something similar to:
I (832) cpu_start: Pro cpu start user code +I (178) cpu_start: Starting scheduler on PRO CPU. +I (0) cpu_start: Starting scheduler on APP CPU. +E (224) nvs: Error (UNKNOWN ERROR) opening NVS handle! +I (224) esp32_boot: Log Level set to NONE +I (834) phy: phy_version: 4100, 6fa5e27, Jan 25 2019, 17:02:06, 0, 0 +
This is completely normal at this stage
The NVS (Non Volatile Storage) has not yet been initialised. You must have all the toggles soldered in before you can set the Startup Configuration in NVS
This error will not prevent you getting on with the assembly &/or testing the Wi-Fi connectivity.
TIP
If you see a Wi-Fi Access Point SSID named
imsai8080
on your Wi-Fi network, and can get any of the Desktop UI to load when you point your Chrome browser at http://imsai8080.local then your soldering of themicroSD Card Socket
is perfect.The Desktop UI is served from the
microSD Memory Card
by the embedded web server and will only show if the connection checks out.# I don't see a Wi-Fi Access Point SSID named
imsai8080
but I do see one namedimsai
At this early stage, this is the only indication you'll get that you haven't successfully soldered the
microSD Card Socket
, or maybe you just forgot to insert themicroSD Memory Card
.WARNING
I thought a bad
microSD Card Socket
connection would be more obvious at this point and reported by an explicit error message in the console log, but it appears I was wrong. I will work to improve this step in the troubleshooting in a future firmware release.You also wont (shouldn't) be able to get the Desktop UI to load in your browser if this is your problem. The Desktop UI is served from the
microSD Memory Card
by the embedded web server.Once you've checked that it's not the latter and are suspecting the former, try some more flux and heat to reflow the solder along the fine pins at the rear of the
microSD Card Socket
. Only add more solder sparingly or you'll start to bridge pins, although some desoldering wick will help you resolve that issue if that is what you suspect has gone wrong.Once the toggle switches are soldered in you will be able to more get some more conclusive tests done.
# With all the LEDs and ICs in place (and supporting passives)
WARNING
Without the toggle switches in place, the testing that is possible is limited, don't expect too much
TIP
For a visual guide to the following tests refer to the YouTube video titled THN #019 - Kit Assembly #11- The dead LED is fixed and testing continues.
# Testing for power on/off
(refer to video above for now)
# Testing the LEDs
(refer to video above for now)
# With the toggle switches in place
TIP
At this point your IMSAI 8080esp should by fully operational.
For a visual guide to the following tests refer to the YouTube video titled THN #022 - Kit Assembly #14 - Some last testing before final assembly
# Testing the LEDs
(refer to video above for now)
# Testing the Red and Blue Toggle Switches
(refer to video above for now)
TIP
You should be able to repeat any of the above tests but more importantly you should be able to enter startup configuration mode and configure your IMSAI 8080esp to boot into a ROM based application eg. BASIC, or to boot a floppy disk image and start a disk based operating system eg. CP/M 2.2 (as supplied). See the Configuration guide for details.
# After assembly
TIP
There is a growing community of fellow IMSAI 8080esp owners and interested parties, sharing with and helping each other on the IMSAI 8080esp Forum.
If you haven't visited it yet, head over to TheHighNibble forum. The forum is public and readable by anyone but if you wish to post you need to become a member.
Membership requires you to have GitHub account. Email to info@thehighnibble.com with your GitHub name and I will send you an invite to join the discussion forum.
Remember I am one person, I have a day job, I need sleep and I'm in Sydney, Australia (UTC+10). So I could be at work or asleep when you most need support. The IMSAI 8080esp Forum on the other hand has members located all around the world, in different timezones and with great experience. I highly recommend the forum.
# Essential hardware functionality (LEDs and Toggle Switches)
If you have LEDs or Toggle switches that don't operate correctly the most likely cause is the soldering.
A visual inspection of all solder joints is ofter the best first approach.
Any joints that don't look like the others, especially on pads connected to the faulty component can be re-worked with a hot soldering iron and some flux, or more solder added if required.
You will have to (partially or fully) disassemble the acrylic components to get access to the PCB so that you can do any soldering or some further testing. A digital multimeter can be a useful tool for this work to help you do some continuity testing, test resistors for correct values, check that voltages are as expected (+5V DC).
# The hardware checks out, you suspect it is the software
TIP
The troubleshooting outlined here focuses on understanding the messages that are logged to the console by the ESP32 as it boots. +The simplest way to see these messages is to
- connect the
ESPP32-PICO-KIT
to a PC using a suitable USB cable- start a terminal emulator on the PC set for 115200 baud 8N1 connected to the serial device your OS identifies the ESP32 on +
- Windows will be a COMx: port
- OSX will be /dev/tty.SLAB_USBtoUART
- Linux will be /dev/tty.USB0 (or similar, TBA)
TIP
The level of detail provided by the ESP32 in the console logs can be changed by the NVS_LOG_LEVEL bits in the startup configuration
The most informative level to set NVS_LOG_LEVEL is INFO. This is not recommended for normal operation as it is too verbose, but it is recommended for troubleshooting.
See the Startup configuration (Non-Volatile Storage, NVS) section of the Configuration guide for instructions on setting the NVS_LOG_LEVEL
When you are posting in the forum requesting help with a problem, it would be a good idea to include an attached file of your current ESP32 console logs that highlight the problem.
Last Updated: 3/8/2023, 6:59:51 AMUpdating Software (Draft) | The High Nibble + + + + + + + + + ++ + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..ab8d8df --- /dev/null +++ b/index.html @@ -0,0 +1,34 @@ + + + + + +The High Nibble # Updating Software (Draft)
# Overview
WARNING
While every effort is made to ensure any new release of firmware and image software is ready for use, experience and Murphy's Law dictate that there will be problems from time to time.
If you don't like risk and don't count yourself as an early adopter then follow the TheHighNibble forum and look for a clear sign of positive reports about a new release before proceeding with any update.
The worst that can happen is that you will need to install the Espressif esptool.py on your Windows/Mac/Linux PC to be able to re-flash your ESP32 to bring your IMSAI8080esp back to life.
Firmware and Image updates are published via GitHub, accessible using the GitHub link in the upper-right corner of this page.
TIP
It is recommended to always use the release marked as the Latest Release unless you have a specific reason not to.
The latest release is the June 2023 Release (v.1.12.0)
# Updating the Firmware
Updating the firmware is a simple drag & drop process via the web-based desktop UI.
# Download the firmware from GitHub
Download the FIRMWARE.zip file from the latest release on GitHub (see above).
The FIRMWARE package in the release assets is a ZIP file containing 6 files, for example:
COPYRIGHT.txt +FLASHING.md +bootloader.bin 22K +imsai_part_table.bin 3.0K +imsaisim_esp32.bin 918K +ota_data_initial.bin 8.0K +
To update the firmware you need only the
imsaisim_esp32.bin
file. This is the IMASAI 8080esp firmware binary to be flashed to the ESP32.WARNING
The remaining files are only for flashing a new firmware installation to a blank ESP32, and can only be flashed using the Espressif esptool.py. +Instructions for this are included in the file
FLASHING.md
# Upload (flash) the firmware to the ESP32
- Drag-and-drop the
imsaisim_esp32.bin
file onto theSYS:
device icon on the Desktop UI to flash it to the ESP32.- Confirm the first dialog, and wait (typically 10-30 seconds) until you see the second dialog confirming the upload was successful
WARNING
If you don't receive the second dialog confirming the upload was successful, then the firmware will not have been flashed. +This will not effect the ESP32 as it will simply reboot on the last working firmware.
Some early adopters have reported this occurring, and the reason was poor Wi-Fi connectivity causing drop-outs. The solution was simply to move their IMSAI8080esp closer to their Wi-Fi Access Point
# Reboot the ESP32
Reboot the ESP32 using the reset (EN) press button on ESP32, or click the reboot button (Red, circular arrow) on the
SYS:
window.Your IMSAI 8080esp will now reboot on the new firmware.
# Checking the firmware version
The firmware version number is reported in two places:
- To the system console (UART0 - USB or RS232-1 at 115200 baud) early in the boot process:
I (336) cpu_start: Application information: +I (366) cpu_start: Project name: imsaisim_esp32 +I (372) cpu_start: App version: v1.7.0 +I (377) cpu_start: Compile time: Jul 5 2021 14:21:20 +I (383) cpu_start: ELF file SHA256: 6e2f6503e36a286f... +I (389) cpu_start: ESP-IDF: v4.0.2-4-g877a28e05 +
In this example you can see the
App version: v1.7.0
indicating that the system is running thev1.7.0
firmware.
- The
SYS:
System (host) virtual device on the desktop UIIn this example you can see the
Build version: v1.5.0
indicating that the system is running thev1.5.0
firmware.# Background - Over The Air (OTA) updates
This handy, Over The Air (OTA) update feature is provided as part of the Espressif esp-idf development platform. +There are two partitions that can each store an OTA firmware, ota_0 and ota_1.
Each update is flashed to the next available partition, the original factory partition is never overwritten by an OTA update. +Details of what partitions are active (Running:), booted (Boot:) and available (Next:) are given in the
SYS:
System (host) virtual device on the desktop UI under the heading PartitionsFor further information you can refer to the Espressif esp-idf documentation
Also you can set the startup configuration mode for 'NVS_LOG_LEVEL' to 'INFO' at watch the firmware update/flash process logs on the system console.
# Updating the µSD card Image
# Updating using drag & drop
The first way to update the µSD card Image is via a drag & drop process similar to the firmware update process described above. This allows the image update to be done without the need to mount the µSD card in a PC.
You can simply drag-and-drop the
update.bin
file onto the SYS: icon on the desktop GUI. When the upload is complete, reboot the ESP32 and the update will be identified, unpacked and installed. Watch the output on the boot console (typically via USB port @ 115200 8N1) to see the process proceed.# Updating in a Windows/Mac/Linux PC
The second way to update the µSD card Image is to remove the µSD card from your IMSAI8080esp and connect it to your Windows/Mac/Linux PC.
The filesystem on the µSD card is
FAT32
.With the µSD card filesystem mounted on your PC you should be able to:
- backup the whole image
- restore a whole image
- edit individual configuration files
- directly manage disk and harddisk (*.dsk and *.hdd) image files in the disk library directory
# Checking the Desktop UI version
The desktop UI version number is reported in only one place, the
SYS:
System (host) virtual device on the desktop UIFollowing a successful update of the µSD card Image this version number should reflect the version number you have installed.
In this example you can see the
GUI Version: webfrontend-v1.5.0
indicating that the system is also running thev1.5.0
desktop UI.Last Updated: 6/12/2023, 12:10:50 AMThe High Nibble + + + + + + + + + ++ + + diff --git a/manifests/s132-manifest.json b/manifests/s132-manifest.json new file mode 100644 index 0000000..ca78912 --- /dev/null +++ b/manifests/s132-manifest.json @@ -0,0 +1,14 @@ +{ + "name": "the full S-132 image", + "version": "V1.6.0", + "new_install_prompt_erase": false, + "builds": [ + { + "chipFamily": "ESP32", + "parts": [ + { "path": "/binaries/S132bundle-v1.6.0.bin", "offset": 0 } + ] + } + ] + } + \ No newline at end of file diff --git a/manifests/vt132-manifest.json b/manifests/vt132-manifest.json new file mode 100644 index 0000000..45e7fb2 --- /dev/null +++ b/manifests/vt132-manifest.json @@ -0,0 +1,14 @@ +{ + "name": "the full VT132 image", + "version": "V1.7.0 (latest)", + "new_install_prompt_erase": false, + "builds": [ + { + "chipFamily": "ESP32", + "parts": [ + { "path": "/binaries/VT132bundle-v1.7.0.bin", "offset": 0 } + ] + } + ] + } + \ No newline at end of file diff --git a/s132/bom/index.html b/s132/bom/index.html new file mode 100644 index 0000000..7096756 --- /dev/null +++ b/s132/bom/index.html @@ -0,0 +1,30 @@ + + + + + +S-132 Bill of Materials (Draft) | The High Nibble + + + + + + + + + ++ + + diff --git a/s132/build/index.html b/s132/build/index.html new file mode 100644 index 0000000..6ef554f --- /dev/null +++ b/s132/build/index.html @@ -0,0 +1,35 @@ + + + + + +The High Nibble # S-132 Bill of Materials (Draft)
TIP
To see the images in full size you can right-click on an image and
Open Image in New Tab
Notes on the PCB
- PCBs are production (V1.5.1)
- Part identifiers are correct and there are no known errors
# Main S-132 PCB (green)
# Surface Mount Device (SMD) components
Don't Panic
- Yes there are four SMD components!
- You can do it!
- You can do it with a regular soldering iron, but you are going to need flux
Part Quantity PCB Description 1 ESP32-WROVER U1 ESP-32 WROVER Module
1 NCP1117-33 U2 NCP1117-33 LDO Linear Regulator
1 74CBTLV3257 U3 74CBTLV3257 SOIC-16 Quad 1-of-2 Multiplexer/Demultiplexer
1 74HC00 U4 74HC00 SOIC-14 Quad NAND Gate
# Through Hole (THT) components
Part Quantity PCB Description 2 R1, R2 120 Ohm Resistor [Brown, Red, Black, Black, Brown]
Only required if using the PS/2 keyboard2 R3, R4 2K Ohm Resistor [Red, Black, Black, Brown, Brown]
Only required if using the PS/2 keyboard1 R5, R13 10K Ohm Resistor [Brown, Black, Black, Red, Brown]
3 R6, R8, R10 806 Ohm Resistor [Grey, Black, Blue, Black, Brown]
3 R7, R9, R11 402 Ohm Resistor [Yellow, Black, Red, Black, Brown.]
1 R12 4.7K Ohm Resistor [Yellow, Violet, Black, Brown, Brown]
1 R14 121 Ohm Resistor [Brown, Red, Brown, Black, Brown]
1 R15 243 Ohm Resistor [Red, Yellow, Orange, Black, Brown]
1 R16 487 Ohm Resistor [Yellow, Gray, Violet, Black, Brown]
1 R17 976 Ohm Resistor [White, Violet, Blue, Black, Brown.]
4 D1, D2, D3, D4 1N4148 Signal Diode
Diodes have polarity, ie. they must be inserted the correct way around to function properly.1 C2 1 uF MLC (105) Capacitor
7 C1, C6, C7, C8, C9, C10, C11 100 nF (104) MLC Capacitor
2 C3, C12 100 uF Electrolytic Capacitor
Electrolytic capacitors have polarity, ie. they must be inserted the correct way around to function properly. +VE to the Square Pad1 C4 22 uF Electrolytic Capacitor
Electrolytic capacitors have polarity, ie. they must be inserted the correct way around to function properly. +VE to the Square Pad2 C5, C13 10 uF Electrolytic Capacitor
Electrolytic capacitors have polarity, ie. they must be inserted the correct way around to function properly. +VE to the Square Pad1 Q1 S8050 NPN Transistor TO-92
2 Prog, Reset Tactile Push Button Switch SPST
1 Bell Buzzer 12.2mm dia.
The Buzzer is polarized, ie. it must be inserted the correct way around to function. +VE to the Square Pad1 U5 74HC165
Shift Register 8-bit, parallel load1 U6 MCP3008
8 Channel 10-bit Analog-to-Digital Converter (ADC)1 U7 74HC138
3-to-8 line Decoder/Demultiplexer, inverting1 U8 74HC595
8-bit serial in/out Shift Register 3-State Outputs1 LM7805 U9 LM7805 +5V DC Linear Regulator
# Through Hole (THT) headers
Part Quantity PCB Description 1 JP1 5V Pwr 2 Pin Header - Horizontal
1 FTDI Program 6 Pin Header - Vertical
Cut from 20 Pin male header1 Keyboard 6 Pin Header - Vertical
Cut from 20 Pin male header.
Only required if using the USB-HID keyboard1 Patch 8 Pin Header (4x2)- Vertical
See notes for use of this header1 S-132 16 Pin Header (8x2)- Female, Vertical
Fit to the underside of the PCB - attaches to the IMSAI8080/Cromemco Z-11 KB Reset 2 Pin Header - Vertical
Cut from 20 Pin male header.
Only required if using the USB-HID keyboard4 For JP1 & Patch as required Header Pin Shunts
1 D+7AIO Connector 20x2 Female
Sits between the DIP-16 IC sockets. This connector forms a 40-pin socket for the D+7AIO# Through Hole (THT) connectors
Part Quantity PCB Description 1 VGA DB15 VGA Female Socket - Right Angled
1 PS/2 Mini-DIN-6 PS/2 Keyboard Female Socket - Right Angled
Only required if using the PS/2 keyboard1 Power 6.2mm DC Barrel Jack Connector
4 (U4, U6, U7, U8) 16 pin DIP Socket
One for each IC - U4, U6, U7, U8# Printed Circuit Board (PCB)
Part Quantity Description 1 USB-HID Keyboard Interface
If ordered1 Front view
# Mounting hardware
Part Quantity Description 1 M4x10mm Hex Socket Screw
The M4 socket screw is used to fix the S-132 to the clear acrylic back of the IMSAI80080/Cromemco Z-1. You will need to tap or drill a hole to secure the M4 socket screw.1 M4 Hex Nut Nylon
The nut can be used as a spacer between the S-132 PCB and the acrylic back of the IMSAI80080/Cromemco Z-11 M3x5mm Zinc Machine Screw & Washer
The M3 machine screw, washer and nut are used to secure the LM7805 to the S-132 PCB, to aide thermal conduction with the PCB.1 # Joystick Adapter (yellow)
Part Quantity PCB Description 1 Pin 1 40 Pin Header (20x2)- Horizontal
Fit to underside of PCB.2 Pad 1, Pad 2 8 Pin Header (4x2)- Horizontal
Fit to top of PCB.8 R100 - 107 10K Ohm Resistor [Brown, Black, Orange, Gold]
1 A.Gnd 2 Pin Header - Vertical
Cut from 20 Pin male header1 Ref.Voltage 3 Pin Header - Vertical
Cut from 20 Pin male header1 Audio Patch 3 Pin Header - Vertical
Cut from 20 Pin male header1 Amp 3 Pin Header - Vertical
Cut from 20 Pin male header4 For A.Gnd, Ref.Voltage & Audio Patch as required Header Pin Shunts
Fit a shunt to both A.Gnd and the +5V & Center pins of Ref.VoltageNOT SUPPLIED
NOT REQUIRED1 C100 100 nF (104) MLC Capacitor
NOT SUPPLIED
NOT REQUIRED1 C101 1 uF (105) MLC Capacitor
NOT SUPPLIED
NOT REQUIRED1 MCP1541 MCP1541 4.096V Voltage Reference
Part Quantity Description 2 x 36 inch 8-core IDC Ribbon Cable
Connects JS-1 Joysticks to the Joystick Adapter4 8-pin IDC Ribbon Cable Header - Female
Connects JS-1 Joysticks to the Joystick Adapter1 Front view
# JS-1 Analog Joystick (yellow x 2)
Part Quantity PCB Description 4 each SW1 - 4 Tactile Push Button Switch SPST
1 each 2-axis Analog Joystick - 10Kohm
1 each 8 Pin Header (4x2)- Horizontal
Fit to top of PCB.
Part Quantity Description 2 Front view
# Parallel Printer (red)
Part Quantity PCB Description 1 Pin 1 40 Pin Header (20x2)- Horizontal
Fit to underside of PCB.1 Printer DB25 Female Socket - Solder lug
Part Quantity Description 1* Front view
# Prototype Adapter (green)
Part Quantity PCB Description 1 Pin 1 40 Pin Header (20x2)- Horizontal
Fit to underside of PCB.
Part Quantity Description 1* Front view
Last Updated: 3/27/2023, 3:34:34 AMBuild notes | The High Nibble + + + + + + + + + ++ + + diff --git a/s132/configure/index.html b/s132/configure/index.html new file mode 100644 index 0000000..9c14919 --- /dev/null +++ b/s132/configure/index.html @@ -0,0 +1,60 @@ + + + + + +The High Nibble # Build notes
# Hi-resolution image of the finished PCB
The following image has a resolution of 3024x3024. +Right click on the image and open in a new window/tab to see at a higher resolution.
# Notes
The nearest thing to assembly instructions is the Bill-of-Materials
The PCB has all the components marked.
As a general guide, proceed in the order of the BOM, with the following notes:
- use lots of flux on the SMDs +
- don't even attempt them without flux
- a flux cored solder is not enough
- the ESP32 module goes with the metal can face down in the cutout in the PCB +
- this holds it in position for soldering
- see the image above.
- the two SOIC package SMD ICs are the hardest ones to orientate correctly +
- read their data sheets on how to identify pin 1
- the location for pin 1 is marked clearly on the PCB silkscreen
- once you've soldered the SMDs, most people use a rule of thumb: +
- to solder the through-hole components starting with the lowest/shortest/closest to the board
- then moving up through to the tallest components last
- use a multimeter to measure the resistance and correctly identify the resistors
- use masking/painters tape to hold things in place if you need an extra pair of hands
- don't solder the DIP-16 ICs directly to the PCB, use the sockets
Last Updated: 4/13/2023, 3:55:22 AMConfiguration (Draft) | The High Nibble + + + + + + + + + ++ + + diff --git a/s132/index.html b/s132/index.html new file mode 100644 index 0000000..453f21d --- /dev/null +++ b/s132/index.html @@ -0,0 +1,37 @@ + + + + + +The High Nibble # Configuration (Draft)
The S-132 requires only minimal configuration to get working.
The majority of features require no configuration to make work. However, the
boot.conf
file on the IMSAI8080 or Cromemco Z-1 replica must be edited to enable the TTY: (TTY2: & TTY3: - Cromemco Z-1 only) and VIO: keyboard (IMSAI8080 only) to be recognized as input/output devices by the HAL in the IMSAI8080 or the HAL in the Cromemco Z-1 respectively.The VT100 terminal emulation (VT132), on the other hand, has extensive configuration options. See the VT132 Operation Manual for details.
# Start-up
With the S-132 connected to the IMSAI8080 or Cromemco Z-1 replica along with a VGA monitor and suitable keyboard, apply power and press the hardware reset on the IMSAI8080 or Cromemco Z-1 replica. As the replica boots it will force the S-132 to reboot.
The S-132 will perform a hand-shake with the ESP32-PICO-KIT on the replica and you will (may) briefly see the message
Host found +
displayed in the upper left-hand corner of your VGA monitor. This will rapidly be replaced with the message
Wait +
and a brief bell tone from the buzzer while the VT100 terminal initializes and retrieves its setting from the NVRAM.
TIP
When you first start the S-132, or after a full firmware re-flash (not an upgrade) it is completely normal to see the massage
Error +
and a long bell tone from the buzzer.
This is the original behavior of the VT100 terminal and indicates that no settings were saved in NVRAM.
To avoid this message and warning tone in future simply go to one of the VT100 menus and save settings to NVRAM.
# Power Options
The S-132 can be powered from the connected IMSAI8080 or Cromemco Z-1 replica. Additional power is not required.
Alteratively, the S-132 can provide power to the connected IMSAI8080 or Cromemco Z-1 replica if you connect a DC power supply via the DC barrel jack on the S-132. In which case you should remove any USB cable providing power to the connected IMSAI8080 or Cromemco Z-1 replica.
# Configure the IMSAI8080
You must edit the HAL settings in the
boot.conf
file. +You can use the Web Desktop, or mount the µSD card in a PC and edit the/imsai/conf/boot.conf
file directly.Enable and initialize the S-132
### Enable S-132 +S132.init=1 +
To make the S-132 the first (and only) preference for the TTY: and VIO: devices, use:
### SIO-2 default port mappings (HAL) +SIO1.portA.device=S132TTY,WEBTTY,UART0 +SIO1.portB.device=S132VIO,VIOKBD +
To make the S-132 the first preference for the TTY: & VIO: devices and also simultaneously use the Web Desktop devices if connected, use:
### SIO-2 default port mappings (HAL) +SIO1.portA.device=S132TTY+,WEBTTY,UART0 +SIO1.portB.device=S132VIO+,VIOKBD +
To allow the Web Desktop to capture the TTY: and VIO: devices with priority ove the S-132, use:
### SIO-2 default port mappings (HAL) +SIO1.portA.device=WEBTTY,S132TTY,UART0 +SIO1.portB.device=VIOKBD,S132VIO +
For more information on the
boot.conf
see HAL configuration for the IMSAI8080# Configure the Cromemco Z-1
You must edit the HAL settings in the
boot.conf
file. +You can use the Web Desktop, or mount the µSD card in a PC and edit the/cromemco/conf/boot.conf
file directly.Enable and initialize the S-132
### Enable S-132 +S132.init=1 +
To make the S-132 the first (and only) preference for the TTY: devices, use:
### TU-ART default device mappings (HAL) +TUART0.deviceA.device=S132TTY,WEBTTY,MODEM,UART0 +TUART1.deviceA.device=S132TTY2,WEBTTY2,SCKTSRV1,UART1 +TUART1.deviceB.device=S132TTY3,WEBTTY3,SCKTSRV2,UART2 +
To make the S-132 the first preference for the TTY: devices and also simultaneously use the Web Desktop devices if connected, use:
### TU-ART default device mappings (HAL) +TUART0.deviceA.device=S132TTY+,WEBTTY,MODEM,UART0 +TUART1.deviceA.device=S132TTY2+,WEBTTY2,SCKTSRV1,UART1 +TUART1.deviceB.device=S132TTY3+,WEBTTY3,SCKTSRV2,UART2 +
To allow the Web Desktop to capture the TTY: devices with priority ove the S-132, use:
### TU-ART default device mappings (HAL) +TUART0.deviceA.device=WEBTTY,S132TTY,MODEM,UART0 +TUART1.deviceA.device=WEBTTY2,S132TTY2,SCKTSRV1,UART1 +TUART1.deviceB.device=WEBTTY3,S132TTY3,SCKTSRV2,UART2 +
For more information on the
boot.conf
see HAL configuration for the Cromemco Z-1# D+7AIO Settings
T.B.A.
Last Updated: 3/11/2023, 12:32:40 PMS-132 | The High Nibble + + + + + + + + + ++ + + diff --git a/s132/maint/index.html b/s132/maint/index.html new file mode 100644 index 0000000..b392746 --- /dev/null +++ b/s132/maint/index.html @@ -0,0 +1,36 @@ + + + + + +The High Nibble # S-132
Powered by an ESP32: S-100 + ESP32 = S-132
Pictured with USB-HID keyboard connected (red interface PCB) and DC power supplied via barrel jack
# Overview
The S-132 is an add-on for both the IMSAI8080 and the Cromemco Z-1 replicas.
It adds many I/O features normally provided by additional cards on the S-100 bus. It connects to the
Patch
header on the IMSAI8080 or Cromemco Z-1 replica and produces output on a VGA monitor with support for either a PS/2 or USB-HID keyboard.With the S-132 attached to the IMSAI8080 or Cromemco Z-1 replica you have all the functionality of the following S-100 attached devices, without the need to use the Web Desktop:
- VT100 (TTY:) terminal via serial UART +
- two additional VT100 (or C3102) terminals (TTY2: & TTY3:) via serial UART +
- (Cromemco TU-ART S-100 card - Cromemco Z-1 only)
- IMSAI VIO (CRT:) S-100 card (IMSAI8080 only)
- Cromemco Dazzler S-100 card
- Cromemco D+7A Input/Output S-100 card (40-pin header) +
- 8 digital inputs (5V TTY level - buffered by a 74HC165)
- 8 digital outputs (5V TTY level - buffered by a 74HC595)
- 7 analog inputs (0-5V - digitized by an MCP3008 ADC)
- 2 analog outputs (0-3.3V - produced by the 2 onboard DACs on the ESP32)
- pluggable adapter boards that provide, alternately: +
- two Cromemco JS-1 analog joysticks & audio line header for external audio amp.
- a Centronics parallel printer port (DB-25) with passthrough for the LPT: device
- a prototying PCB for your own designs
Additionally, the S-132 adds a System Menu (SYS:) where you can
- mount/eject disk images from the 4 emulated floppy disk drives (DSK:A: - DSK:D:)
- view and control the Run/Stop/Reset/Ext.Clr state of the front panel (CPA:)
- view all the system information normally found in the SYS: device on the Web Desktop
Lastly, the S-132 has a DC barrel jack and a selectable LM7805 5V regulator allowing you the option of powering your IMSAI8080/Cromemco Z-1, along with the S-132, from a standard DC power supply (from 5V to 12V).
# Functions
Each function of the S-132 can be selected by a keyboard hot-key (as with the Linux console on a PC)
<ctrl><alt><F1>
= TTY: - VT132 terminal emulator<ctrl><alt><F2>
= TTY2: - Cromemco Z-1 only<ctrl><alt><F3>
= TTY3: - Cromemco Z-1 only<ctrl><alt><F4>
= VIO: - IMSAI VIO character display - IMSAI8080 only<ctrl><alt><F5>
= DZLR: - IMSAI Dazzler graphics display<ctrl><alt><F6>
= SYS: - System Menu to: +
- view/eject/mount floppy disks
- view floppy disk library image list
- view system state for the guest/host/environment/tasks & config files
- set S-132 specific settings
<ctrl><alt><F7>
= D7AIO: - Cromemco D+7A Input/Output display<ctrl><alt><F9>
= CPA: -RUN
- lift CP-A frontpanel switch to theRUN
position<ctrl><alt><F10>
= CPA: -STOP
- press CP-A frontpanel switch to theSTOP
position<ctrl><alt><F11>
= CPA: -RESET
- lift CP-A frontpanel switch to theRESET
position<ctrl><alt><F12>
= CPA: -EXT.CLR
- press CP-A frontpanel switch to theEXT.CLR
position# Pinouts for the D+7A I/O connector
# Firmware Updates
- Firmware updates are hosted on GitHub
- The current production firmware can always be found at github.com/thehighnibble/s-132/releases/latest
- Firmware updates can be performed directly on the S-132 from the System Menu (see SYS: above) but require an update file to first be uploaded via the IMSAI8080 or Cromemco Z-1 replica (Web) Desktop UI.
The process for Firmware Updates is covered in the Firmware Update Guide
# Availability
The S-132 is available to order as of March 2023.
# Pricing
- USD$55 for the base kit +
- all functions included with VGA output, PS/2 keyboard input & DC power input
- with only the main PCB (green) and the parts for that
- ie. no adapter PCBs or joysticks
- plus USD$5 for USB-HID keyboard input (replaces PS/2 keyboard input)
- plus USD$40 for the full adapter PCB kit including all parts +
- Parallel printer adapter PCB (red) & DB-25 Centronics printer port
- Prototype adapter PCB (also green)
- Joystick adapter PCBs (yellow) + 2 analog joysticks, buttons, cables and connectors
So a full package is USD$100 but you can choose from:
- just the base kit @ USD$55, or
- base + usb @ USD$60, or
- base + adapters @ USD$95, or
- base + usb + adapters @ USD$100
# To Order
I am accepting orders via email. If you send email to info@thehighnibble.com with your choice of configuration, shipping name & address, I will respond to you with a PayPal invoice with the total price including shipping and transaction fees.
WARNING
Please only pay against the PayPal invoice when I send it to you. Do not try to pay directly to me via PayPal as this will only delay your order.
While you are waiting for your S-132 kit, checkout the introductory video
# Configuration (draft)
# Bill-of-Materials (draft)
# Build notes (draft)
# Firmware Install & Console Log
Last Updated: 9/1/2024, 6:36:51 AMS-132 Firmware Install & Console Logs | The High Nibble + + + + + + + + + ++ + + diff --git a/s132/pinouts/index.html b/s132/pinouts/index.html new file mode 100644 index 0000000..66879b5 --- /dev/null +++ b/s132/pinouts/index.html @@ -0,0 +1,33 @@ + + + + + +D+7A I/O connector pinouts | The High Nibble + + + + + + + + + ++ + + diff --git a/s132/update/index.html b/s132/update/index.html new file mode 100644 index 0000000..5815f71 --- /dev/null +++ b/s132/update/index.html @@ -0,0 +1,42 @@ + + + + + +The High Nibble # D+7A I/O connector pinouts
# Original S-100 Cromemco D+7A I/O connector
The following diagram is from the original Cromemco D+7A I/O documentation
# S-132 D+7A I/O connector
The S-132 D+7A I/O 40-pin (female) connector closely matches the original Cromemco D+7A I/O 44 position edge connector providing most of the same Analog and Digital inputs and outputs in the same configuration. +Mainly it differs in the voltages that are (or are not) provided around the middle of the connector.
ESP32 Side Pin No. Pin No. LM7805 Side Top Top Analog Ground (1) A 1 Ground Analog Input (2) 7 B 2 N/C 7 6 C 3 N/C 6 5 D 4 N/C 5 4 E 5 N/C 4 3 F 6 Analog Output (3) 3 2 H 7 N/C 2 1 J 8 Analog Output (3) 1 Voltage Ref. (4) H 9 Voltage Ref. (4) +5V DC Regulated N 10 +5V DC Regulated Input _STB (5) P 11 Output _STB (6) Digital Input Bit (7) 7 R 12 Digital Output Bit (8) 7 6 S 13 6 5 T 14 5 4 U 15 4 3 V 16 3 2 W 17 2 1 X 18 1 0 Y 19 0 Ground Z 20 Ground Bottom Bottom # Notes:
Analog Ground
is isolated fromGround
- for most use cases you should tie it to
Ground
Analog Input 1 to 7
- these are digitized by the MCP3008 ADC
- typically
0V
toVoltage Ref. V
for signed input port values of-128 to 127
- see the MCP3008 ADC data sheet for exact specifications
- There are only two (2) analog outputs
Analog Output 1
andAnalog Output 3
- because there are only two (2) DACs on the ESP32
- these are
0V
to+3.3V
(or slightly between these limits) for signed output port values of -128 to 127- you can map any of the Analog Output ports to either of these two (2) DACs (see config guide for D+7AIO settings)
- it's 1 & 3 because that is what the Cromemco JS-1 Analog Joysticks used for audio
Voltage Ref.
is the V.Ref on the MCP3008 ADC +
- for most use cases you should tie it to
+5V Regulated
Input _STB
(active low) isn't implemented - because... reasons.Output _STB
(active low) is implemented +
- as a working example: this is used on the Parallel Printer interface as the parallel output data strobe
Digital Input Bits 0 to 7
- these are buffered by the 74HC165 with a
+5V DC
regulated supply forVcc
- typically
> 3.15V = 1
and< 1.35V = 0
- see the 74HC165 data sheet for exact specifications
Digital Output Bits 0 to 7
- these are driven by the 74HC595 with a
+5V DC
regulated supply forVcc
- typically
0V = 0
and+5V (Vcc) = 1
- see the 74HC595 data sheet for exact specifications
Last Updated: 3/11/2023, 9:20:51 AMS-132 Firmware Update Guide | The High Nibble + + + + + + + + + ++ + + diff --git a/vt132/bom/index.html b/vt132/bom/index.html new file mode 100644 index 0000000..be52f44 --- /dev/null +++ b/vt132/bom/index.html @@ -0,0 +1,30 @@ + + + + + +The High Nibble # S-132 Firmware Update Guide
The firmware update process for the S-132 requires you to:
- first download and copy the firmware update file to your IMSAI8080 or Cromemco Z-1 emulator
- then start the firmware update process on the S-132 itself
Follow the 4 steps detailed below to successfully complete the S-132 firmware update.
# Download the update file from GitHub
The current production firmware can always be found at github.com/thehighnibble/s-132/releases/latest
Download the
update.bin
file, listed under Assets at the bottom of the release notes, to your local computer# Copy the update file to the host (IMSAI8080 or Cromemco Z-1)
Now you can now simply drag-and-drop the
update.bin
file onto the SYS: icon on the (Web) desktop GUI of your emulator (IMSAI8080 or Cromemco Z-1)# Reset the host (IMSAIO8080 or Cromemco Z-1)
When the upload is complete, reboot the host ESP32 and the update will be identified and unpacked.
TIP
Your IMSAI8080 or Cromemco Z-1 will take longer to startup than usual while it unpacks the update file.
You can optionally watch the output on the boot console (typically via USB port @ 115200 8N1) to see the process proceed.
# Start the Flash F/W process on the S-132
Now on the S-132, open the System Menu (SYS:) with the key combination
<ctrl><alt><F6>
Goto the
S-132 > Flash F/W
menu selection and press<enter>
If the firmware update is found on the host the the following message will be shown in large, green text on the S-132 display
+Followed by: +S-132 Firmware update available +
Press <Prog> on the S-132 to begin +
TIP
At this point you have 5 (five) seconds to find and press the
Prog
button on the top edge of the S-132 PCB to continue with the firmware updateIf you wait for more than the 5 (five) seconds the update process will end and you will return to the System Menu (SYS:)
This is not a problem, just repeat this step and the firmware update will still be there and available on the host
WARNING
If the firmware update is not found on the host system (see steps above) then the following warning message will be shown in large, yellow text on the S-132 display
S-132 Firmware update not present +
Return to the steps above and re-attempt to copy the firmware update to the host system
After you press the
<Prog>
button on the top edge of the S-132 PCB, the firmware will download from the host and be flashed onto the S-132 during which you will see a message like:<Prog> Pressed +Application image found- expecting 1152624 bytes +Firmware update to S-132 V1.7.0 built Aug 26 2024 +Updating partition: app1 +Bytes remaining: 1152624 +
The
Bytes remaining:
will count down as the download/flash proceeds, and when it reaches0
(zero) it will be followed by the message:Firmware update complete +Press <Reset> on the S-132 to restart +
The firmware update process is now complete and the update file will be deleted from the host.
The S-132 will nolonger respond to keyboard input but will wait for you to press the
<Reset>
button on the top edge of the S-132 PCB.WARNING
If any message other than
Firmware update complete
is displayed, it should indicate what went wrong.Typically this is because of a fault when verifying the firmware update file, or a fault in flashing the new firmware to the ESP32 on the S-132.
Either way, you will need to begin the firmare update procedure from the beginnng.
It is highly unlikely that a fault at this stage can "brick" your S-132, as the ESP32 firmware update process uses 2 individual slots for firmware and only swiches to the new slot after a successful firmware update. When a firmware update fails, the ESP32 will contine to boot from the last successful firmware loaded.
Last Updated: 9/1/2024, 6:36:51 AMVT132 Bill of Materials (Draft) | The High Nibble + + + + + + + + + ++ + + diff --git a/vt132/index.html b/vt132/index.html new file mode 100644 index 0000000..a0cda79 --- /dev/null +++ b/vt132/index.html @@ -0,0 +1,71 @@ + + + + + +The High Nibble # VT132 Bill of Materials (Draft)
Note:
The BOM is yet to be updated to include details of
- the Stand Alone edition
- the USB interface for USB-HID keyboard support
The parts listed below are common for both editions with the exception of:
- the Through Hole (THT) headers supplied
- the Printed Circuit Board (PCB)
TIP
To see the images in full size you can right-click on an image and
Open Image in New Tab
Notes on the PCB
- The silk screen on the Beta Kit PCBs (V1.3) is not final
- Part identifiers are correct and there are no known errors
- Graphic decals and label placement are not final
# Surface Mount Device (SMD) components
Don't Panic
- Yes there are two SMD components!
- You can do it!
- You can do it with a regular soldering iron, but you are going to need flux
Part Quantity PCB Description 1 ESP32-WROVER U1 ESP-32 WROVER Module
1 NCP1117-33 U2 NCP1117-33 LDO Linear Regulator
# Through Hole (THT) components
Part Quantity PCB Description 2 R1, R2 120 Ohm Resistor [Brown, Red, Black, Black, Gold]
2 R3, R4 2K Ohm Resistor [Red, Black, Black, Brown, Gold]
1 R5 Vertical 10K Ohm Resistor [Brown, Black, Black, Red, Gold]
3 R6, R8, R10 806 Ohm Resistor [Grey, Black, Blue, Black, Gold]
3 R7, R9, R11 405 Ohm Resistor [Yellow, Black, Green, Black, Gold]
1 R12 4.7K Ohm Resistor [Yellow, Purple, Black, Brown, Gold]
1 R13 10K Ohm Resistor [Brown, Black, Black, Red, Gold]
1 C1 100 nF (104) MLC Capacitor
1 C2 1 uF MLC (105) Capacitor
1 C3 100 uF Electrolytic Capacitor
Electrolytic capacitors have polarity, ie. they must be inserted the correct way around to function properly.1 C4 22 uF Electrolytic Capacitor
Electrolytic capacitors have polarity, ie. they must be inserted the correct way around to function properly.1 C5 10 uF Electrolytic Capacitor
Electrolytic capacitors have polarity, ie. they must be inserted the correct way around to function properly.1 Q1 S8050 NPN Transistor TO-92
2 Prog, Reset Tactile Push Button Switch SPST - Right Angled
1 Bell Buzzer 12.2mm dia.
The Buzzer is polarized, ie. it must be inserted the correct way around to function. +VE to the Square Pad# Through Hole (THT) headers
Part Quantity PCB Description 2 JP5, JP6 5V Pwr 2 Pin Header - Horizontal
2 FTDI Program, Modem Port B 6 Pin Header - Horizontal
1 JP1 to JP4 RxA/TxA RxB/TxB 8 Pin Header (4x2)- Vertical
1 Pin 1 80 Pin Header (40x2)- Horizontal
RC2014 Pro Bus Connector. Remove the unneeded pins from the upper row.6 For JP1 to JP6 as required Header Pin Shunts
To be placed only on JP1 to 4 for normal operation.# Through Hole (THT) connectors
Part Quantity PCB Description 1 VGA DB15 VGA Female Socket - Right Angled
1 Keyboard Mini-DIN-6 PS/2 Keyboard Female Socket - Right Angled
# Printed Circuit Board (PCB)
Part Quantity Description 1* Back view
1* Front view
Last Updated: 10/17/2020, 10:15:51 PMVT132 | The High Nibble + + + + + + + + + ++ + + diff --git a/vt132/maint/index.html b/vt132/maint/index.html new file mode 100644 index 0000000..72db020 --- /dev/null +++ b/vt132/maint/index.html @@ -0,0 +1,36 @@ + + + + + +The High Nibble # VT132
Designed for RC2014 edition (White PCB)Stand Alone edition (Black PCB)# Overview
I first tweeted about the VT132 in March 2019 +I had put together a first prototype in time for mVCF - Melbourne (AUS)
Back then it was simply the hardware implementation of the brilliant work done by Fabrizio Di Vittorio in creating the FabGL library for the ESP32. An ANSI/VT compatible, serially connected terminal with VGA output and a PS/2 keyboard.
But I wanted to extend his work and make a very authentic implementation of the DEC VT100 down to every reasonable detail.
Clearly from the prototype I'd already chosen the initial form-factor to be a "Designed for RC2014" expansion card for the RC2014 bus.
I then took a break from the VT132 while I worked to finish another little project - the IMSAI 8080 replica
In January 2020 I again tweeted about the VT132 because I'd started to play around with it once more.
I'd added most of the authentic VT100 features I could think of, and decided that since the ESP32 has lots of UARTS and WiFi, that I would include a Telnet over WiFi, 'AT' (Hayes) style modem on a second UART. I'd already developed the modem code for the IMSAI8080 replica, so it was easy to integrate it into the VT132.
This is where the fun/trouble began...
- FabGL is an Arduino library. Running FabGL @ 800x600 native resolution (800x300 scanline doubled) consumes a lot of the ESP32s internal memory.
- Turning on WiFi in the Arduino environment on an ESP32 also consumes a lot of the ESP32s internal memory.
- Moving to the ESP32-WROVER with 8Mb of SPRAM helps a little, but it's still the internal memory that is the limiting resource.
- The Arduino IDE for ESP32 doesn't let you control and fine-tune all the memory and network resource allocation like the ESP-IDF does.
- But Espressif thought of that... +
- It is possible to run the Arduino library as a component in the ESP-IDF environment.
- I was easily able to make FabGL behave as an ESP-IDF component too.
By April 2020 I was able to start posting videos to YouTube showcasing the features of the VT132.
In June & July 2020 I conducted a closed Beta program with some fantastic people from the Retro-computer community. Their contribution to improving the VT132 and accelerating the development, ready for production has been invaluable.
# Editions
# VT132 Designed for RC2104 edition
# (White PCB)
In July 2020 the VT132 Designed for RC2014 edition began shipping to the patiently waiting early-adopters.
# VT132 Stand Alone edition
# (Black PCB)
Since its first release there has been regular feedback that a stand alone version of the VT132 would be warranted, to work with systems other than the RC2014.
In October 2020 the VT132 Stand Alone edition was released.
Note:
The two editions are functionally equivalent when it comes to the features of the VT100 terminal and the Telnet/WiFi 'AT' (Hayes) Modem
Where they differ is in respect to:
- powering the the VT132
- serial communications connectivity
- physical format and dimensions
See each section below for details.
# Features
# VT100 Terminal
- fully DEC VT100 Escape Code compatible +
- extended escape code support from other DEC VTxxx models
- extended ANSI.SYS escape code support
- detailed in the Programmer Information manual
- 800x600 native resolution over VGA (DB15 connector) - actually 800x300 with scanline doubling +
- 800x240 viewport in 24 line (native) mode
- 800x250 viewport in 25 line (enhanced) mode
- 800x300 viewport in 30 line (enhanced) mode (excludes the use of Wi-Fi because of memory constraints)
- 10x10 character cells in 80 column mode +
- original DEC VT100 font (ASCII 7-bit) with pixel stretching as per the original VT100 hardware
- original DEC Special Graphics overlay font (inc. line drawing characters)
- original DEC VT220 Multinational Character Set (MCS) font (8-bit)
- DEC National Replacement Character Set (NRCS) support (7-bit) (from VT220) +
- implemented for US/UK/French/German/Italian/Swedish, other countries to follow
- PC/VGA Code Page 437 font for ANSI.SYS compatibility +
- supports DEC Special Graphics mapping to CP437
- supports NRCS mapping to CP437
- 6x10 character cells in 132 column mode +
- modified DEC VT100 font (ASCII 7-bit)
- modified DEC Special Graphics overlay font (inc. line drawing characters)
- modified DEC VT220 Multinational Character Set (MCS) font (8-bit)
- DEC National Replacement Character Set (NRCS) support (from VT220) see above.
- no CP437 support in 132 column mode
- accurate Smooth Scrolling (requires XON/XOFF as per the original VT100 to avoid dropped characters)
- interlace/non-interlace mode (simulated: doubled scanlines are either hidden or drawn)
- implements all VT100 Advanced Video Option (AVO) features +
- 132x24 (native), 132x25 & 132x30 (enhanced) character resolution
- additional character attributes - Bold, Blink, Underline, Reverse (and combinations)
- additional character ROM (NRCS and MCS fonts)
- PC 104/105 key keyboard, either one of (you must specify which you want when ordering): +
- PS/2 keyboard (Mini-DIN 6, PS/2 connector) +
- supports keyboard layouts for US/UK/French/German/Italian/Swedish, other countries to follow +
- including dead-key support for composed characters with accent diacritics ` ´ ^ ¨ ~ (MCS 8-bit character set and CP437) - country specific
- USB-HID keyboard (standard USB Type-A socket) +
- supports wired and wireless keyboards but not Bluetooth
- does not support use of a USB hub or keyboards with integrated hubs eg. the Raspberry Pi keyboard
- supports keyboard layouts for US/UK/French/German/Italian/Swedish, other countries to follow +
- including dead-key support for composed characters with accent diacritics ` ´ ^ ¨ ~ (MCS 8-bit character set and CP437) - country specific
- implements user programmable answer back as per VT100
- implements a physical buzzer on the PCB for +
- keyclick
- bell (^G)
- margin bell
- NVRAM error notification
- non-blocking (operates on a timer interrupt and does not block serial communications)
- implements 16 colour support +
- complies with ANSI escape code selection
- use selectable default text and background colours via additional Set-up C screen
- user selectable for standard ANSI or VGA colour palette
- implements a scroll history buffer with a 100, 1000 or 5000 line capacity selectable +
- activated by LeftAlt-Page Up key-press
- scroll history can be stepped through page-at-a-time (Page Up/Page Down keys)
- or line-by-line (Up/Down keys)
- and can be cleared on demand (Shift-C keys)
- implements a CRT Saver (screen saver) function with 10 second, 1, 5, 10, 20 or 30 minute selectable timeout
- full VT100 style Set-up screen implementation +
- activated by Alt-SysReq key-press (usually Alt-PrintScreen)
- Set-up A (native as per VT100 with minor modifications) +
- added 'T' command to restore default Tab-Stops (from VT102)
- Set-up B (native as per VT100 with minor modifications) +
- added 'C' command to clear NVRAM
- 50/60Hz bit replaced by Backarrow Key Mode selection bit (DECBKM)
- added selection of how Bold font is represented (bright &/or double-thick)
- added selection of ANSI.SYS mode compatibility
- baud rates supported - 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200
- fixed serial format 8N1, no current support for 7 bits, parity or 2 stop bits
- Set-up C (enhanced) enables: +
- DEC/VT font or CP437 font selection
- 24 line (native) / 25 line / 30 line (enhanced) mode selection for ANSI compatibility
- default foreground text colour selection, 1 of 16 colours
- default background colour selection, 1 of 16 colours
- ANSI or VGA 16 colour palette selection
- Set-up D (enhanced) enables: +
- 7-bit ASCII (native) / 8-bit MCS selection (enhanced)
- 7-bit NRCS country selection
- keyboard country/language selection
- personality selection +
- personality (escape code and keyboard code translation) support for: +
- ANSI/VT100, ADM-3A, ADM-31, Cromemco 3102, Hazeltine 1500, Osborne 1, Kaypro, VT52
- WordStar/VT100 - VT100 terminal with WordStar navigation keys for compatibility with many CP/M applications
- details on the Setup-D screen
- all Set-up screens include optional help by pressing 'F1' key (enhanced)
- Quick Menu system (modeled on the VT510 setup menus) +
- activated by LeftAlt-Esc key-press
- provides quick access to: +
- common actions, eg. clear screen, reset, reboot, clear NVR
- set/manage scroll history buffer and CRT saver functions
- terminal personality selection
- MCS/NRCS mode selection
- macros for ASCII modes including: +
- Green/Amber/Blue/White screen emulation
- ANSI.SYS mode compatibility
- keyboard country/language selection
- modem locally connected mode (direct VT100 to modem connection)
- online/local mode selection
- Non-volatile Storage (NVRAM) support for all terminal settings +
- save settings function - 'S' in Set-up screens, or from Quick Menu
- restore settings function - 'R' in Set-up screens, or from Quick Menu
- settings are restored on reset and power-up
- a 6-pin FTDI header with dedicated UART for firmware flashing and for debug log monitoring
- full details of configuring the terminal via the Set-up screens is covered in the VT100 Operator Information Manual
# VT132 Designed for RC2104 edition
- connects to the RC2014 over the Tx/Rx lines (Pins 35 & 36) of the RC2014 Bus
- takes power from the bus from Gnd/5V (Pins 17 & 18)
# VT132 Stand Alone edition
- many options for serial communications connectivity, including: +
- 3.3V (5V tolerant) TTL level signaling with a 6-pin (straight, FTDI compatible) header
- RS-232/EIA level signaling via an optional MAX3232 level converter +
- with a 6-pin (3x2) header
- with an optional DE-9 (Male) edge-mounted connector as DTE
- with an optional DB-25 (Female) edge-mounted connector as DTE
- many options for powering the VT132 Stand Alone edition exist +
- 2.0mm DC Barrel Jack for +5VDC (regulated) or +8VDC to +12VDC unregulated +
- optional onboard LM7805 to regulate +8VDC to +12VDC unregulated voltages
- +5VDC can be supplied to the VT132 via the 6-pin FTDI programming/debug header
- +5VDC can be supplied to the VT132 via the 6-pin TTL level Terminal header
- +5VDC can be supplied to the VT132 via the 6-pin TTL level Modem header
- +5VDC (regulated) or +8VDC to +12VDC unregulated voltage can be supplied to the VT132 on Pin-9 of any of the RS-232/EIA level connectors (6-pin (3x2) headers DTE/DCE , DE-9 M/F DTE or DB-25 F/M DCE) +
- unregulated +8VDC to +12VDC voltages must be regulated by the optional onboard LM7805
# Telnet/WiFi 'AT' (Hayes) Modem
- implements a minimal set of 'AT' commands enabling it to behave as a serially connected modem
- supports storing all 'S' register settings in non-volatile storage (NVRAM)
- settings can be restored from NVRAM or restored to 'factory' defaults
- settings are restored from NVRAM on reset and power-up
- support 'DIAL' mode for outbound connections to hosts
- supports 'ANSWER' mode for inbound connections including simulated 'RING' cycle
- does not aim to reproduce every feature and command of any specific Hayes modem
- connects to a WiFi access point over 2.4 GHz (802.11 b/g/n) as a WiFi station (STA mode)
- cannot currently act as a WiFi access point (AP mode) - but this would be possible if it is a feature that people want
- supports Telnet and TCP socket protocols for connecting to hosts
- supports serial baud rates of 4800, 9600, 14400, 19200, 38400, 57600, 1152000 from the UART +
- does not currently support 'autobaud' +
- but is selected by the 'Prog' press button switch on the PCB
- the chosen speed is stored in NVRAM and persists through resets and power cycling
- supports CTS/RTS hardware flow-control
- a full list of the 'AT' command set implemented and details of all the 'S' registers and their use is covered in the 'AT' (Hayes) Serial Modem Operation Manual
# VT132 Designed for RC2104 edition
- connects to the RC2014 over the Tx2/Rx2 lines (Pins 35 & 36) of the RC2014 Enhanced Bus
- takes power from the bus from Gnd/5V (Pins 17 & 18)
- compatible with all the speeds of the RC2014 Dual Serial Module SIO/2 or similar
- CTS/RTS hardware flow-control over a 6-pin modified FTDI style modem header (not the RC2014 Enhanced Bus) +
- making it compatible with the SC104 Z80 SIO/2 Module with CTS/RTS flow-control
# VT132 Stand Alone edition
- many options for serial communications connectivity, including: +
- 3.3V (5V tolerant) TTL level signaling with a 6-pin (straight, modified FTDI) header
- RS-232/EIA level signaling via an optional MAX3232 level converter +
- with a 6-pin (3x2) header
- with an optional DE-9 (Female) edge-mounted connector as DCE
- with an optional DB-25 (Male) edge-mounted connector as DCE
- many options for powering the VT132 Stand Alone edition exist see above
# Over-the-Air (OTA) Firmware Updates
- Firmware updates are hosted on GitHub
- The current production firmware can always be found at github.com/thehighnibble/vt132/releases/latest
- OTA Updates can be performed directly from the VT132 over Wi-Fi with only power, a VGA monitor and keyboard connected, no connected host (eg. RC2014 or PC) is required
The process for OTA Updates is covered in the OTA Firmware Update Guide
# Availability
# VT132 Designed for RC2104 edition
The VT132 Designed for RC2104 edition is currently available (since July 2020) and has a price of USD$50 for the the model with PS/2 keyboard support. In addition to this you must pay for shipping and any transaction fees. Payment is via PayPal.
# VT132 Stand Alone edition
The VT132 Stand Alone edition is now also available (since October 2020) and is also priced at USD$50 for the base model. In addition to this you must pay for shipping and any transaction fees. Payment is via PayPal.
- the base model has PS/2 keyboard support
- comes with the DC barrel jack and an LM7805 linear power regulator (and associated capacitors)
- includes headers for the TTL level Terminal and Modem connectors
- but does not come with the MAX3232 level converter ICs and sockets, supporting capacitors or RS-232 EIA DTE/DCE (DB25, DE9) connectors +
- these parts are readily sourced from electronics suppliers such as Mouser, DigiKey & LCSC or other high street electronics stores eg. in Australia: Jaycar
# USB-HID keyboard support
The USB-HID keyboard support is priced as an option at an additional USD$5 owing to the extra parts (daughter PCB, CH559 microcontroller & USB Type-A socket).
# To Order
TIP
When ordering, please specify both:
- which edition you require: ie. +
- Designed for RC2014, or
- Stand Alone
- which keyboard support you require: ie. +
- PS/2 connector based keyboard, or
- USB Type-A, USB-HID based keyboard
I am accepting orders via email. If you send email to info@thehighnibble.com with your choice of configuration, shipping name & address, I will respond to you with a PayPal invoice with the total price including shipping and transaction fees.
WARNING
Please only pay against the PayPal invoice when I send it to you. Do not try to pay directly to me via PayPal as this will only delay your order.
# Specifications
# Dimensions (built)
# Designed for RC2104 edition
- Designed for RC2014
- Conforms to standard RC2014 card dimensions
# Stand Alone edition
# PCB dimensions
3 3/8" x 3 3/8"
85mm x 85mm
# VESA Mounting
M4 holes (1 in each corner of the PCB)
at 75mm centers
# Weight (built)
0.1 lbs
0.045 kg
# Power
# Designed for RC2104 edition
5VDC @ 500 mA (max., < 100mA typical) - Powered from RC2014 Bus or via FTDI or Modem connectors (jumper selectable).
# Stand Alone edition
TBA
# Dimensions (boxed/shipped)
7 1/2" x 5.5" x 2"
190mm x 140mm x 50mm
(width x height x depth)
# Weight (boxed/shipped)
less than 0.44 lbs
less than 0.2 kg
# Bill-of-Materials
# Operation Manual
# Firmware Install & Console Logs
Last Updated: 9/1/2024, 6:36:51 AMVT132 Firmware Install & Console Logs | The High Nibble + + + + + + + + + ++ + + diff --git a/vt132/operation/index.html b/vt132/operation/index.html new file mode 100644 index 0000000..b1f6f95 --- /dev/null +++ b/vt132/operation/index.html @@ -0,0 +1,40 @@ + + + + + +VT132 Operation Manual (Draft) | The High Nibble + + + + + + + + + ++ + + diff --git a/vt132/operation/modem/index.html b/vt132/operation/modem/index.html new file mode 100644 index 0000000..991e9d8 --- /dev/null +++ b/vt132/operation/modem/index.html @@ -0,0 +1,32 @@ + + + + + +The High Nibble # VT132 Operation Manual (Draft)
# Assembly
TIP
If you are unsure, or unfamiliar with soldering the Surface Mount Device SMD components, there is an excellent series of five (5) videos on YouTube produced by The ShadowTron Blog that walk you through the assembly and soldering of the VT132.
TIP
The large, square ground pad under the ESP32 module does NOT need to be soldered. +This is simply a feature of the default PCB footprint for ESP32 modules but is not needed for electrical ground (GND). That is provided by a number of other pins on the ESP32 module (1, 15 & 38).
It can provide additional thermal relief for the ESP32 module but this is generally not required. +The pad can be soldered if using SMT reflow soldering techniques eg. solder paste and a reflow oven.
TIP
The production VT132 comes pre-flashed with a working firmware image. Firmware updates are published on the GitHub repository along with instructions on how to flash new firmware.
# VT132 Designed for RC2104 edition
It is assumed you have already successfully assembled a working RC2014 and know what you are doing in this respect. The silkscreen on the PCB along with the details provided in the VT132 Bill-of-Materials should provide sufficient information to assemble a working VT132.
Locating the VT132 in the RC2014 backplane
It was noted during the Beta testing that owing to the height of the PS/2 keyboard connector, some thought must be given to which slot in the RC2014 backplane you place the VT132.
Slot 1 in the Backplane Pro is always a good choice but you may need to add the extra 20 pin female header to the backplane for this slot to pick up the bus pins for the PortB UART.
Some suggested adding electrical insulation tape over the PS/2 connector shell to insulate it from an adjacent PCB.
# VT132 Stand Alone edition
It is assumed you have already successfully assembled a working system and know what you are doing in this respect. The silkscreen on the PCB along with the details provided in the VT132 Bill-of-Materials should provide sufficient information to assemble a working VT132.
A number of components are optional on the VT132 Stand Alone edition as follows:
- DC barrel jack +
- only required if you plan to power your VT132 from a power source with a 2.0mm - 2.1mm DC barrel jack (center pin +VE)
- LM7805 linear power regulator and accompanying capacitors (10µF and 100µF electrolytic) +
- only required if you want to power the VT132 from a DC voltage source other then +5VDC ie. +8VDC to +12VDC
- MAX3232 ICs & sockets and accompanying capacitors (5 x 100nF ceramic, per MAX3232) +
- only required if you want RS-232/EIA level serial communications over the DTE and DCE connectors
- not required if you only want TTL level serial communications over the 6-pin straight headers
- DB25 (F) DTE, DE9 (M) DTE connectors for the terminal +
- you need only install one or both of these connectors as required for your setup
- DB25 (M) DCE, DE9 (F) DCE connectors for the modem +
- you need only install one or both of these connectors as required for your setup
# New: USB daughter board (Red PCB) for USB-HID keyboards
WARNING
If you are building the VT132 with USB keyboard support DO NOT install the:
- PS/2 keyboard connector
2 x 120 ohm
and2 x 2K ohm
resistors immediately behind the PS/2 keyboard connector footprintThe USB daughter board (Red PCB) for the USB keyboard interface is supplied with the surface mount (SMT) components already soldered in place. You need to solder on the:
- USB Type-A connector
- 6-pin male header, for connecting the USB daughter board (Red PCB) to the main VT132 PCB (White: RC2014, Black: Stand Alone)
I recommend you watch the YouTube video on assembling and attaching the USB interface for the best results.
# Hardware configuration
NVR (Non-volatile RAM) is not initialized on a new VT132
- At power-on or reset, following the 'Wait' message, a new VT132 will display 'Error' along with a series of bells
- This is expected because the NVR has not been initialized
- Once you write settings to the NVR (see Setup Screens) this error should not persist
Hardware reset
- The hardware 'Reset' press button on the PCB reboots the ESP32 (EN line reset)
- This will cause both the VT100 terminal and the modem to reset
- and will lose any unsaved settings on both devices
TIP
- The hardware 'Prog' press button has two functions: +
- if flashing firmware to the ESP32 module over the FTDI connector this button grounds the 'BOOT' line (pin 25) for programming
- in normal operation pressing this button changes the baud rate of the modem +
- each press cycles to the next supported serial baud rate of the modem (4800, 9600, 14400, 19200, 38400, 57600, 1152000)
- the selected speed is echoed in a message to the modem UART eg.
BAUD 19200
- you should keep pressing the button until you see the desired baud rate displayed
- the selected speed is stored in NVRAM and persists through resets and power cycling
# VT132 Designed for RC2104 edition
There is minimal hardware configuration that needs to be performed on the VT132
For normal operation on the RC2014 Pro bus (or similar) both the Port A and Port B UARTS from an existing serial card (RC2014 Dual Serial, or similar) should be enabled by placing shunts on the 4 jumpers JP1 to JP4 (RxA/TxA and RxB/TxB)
The
FTDI Program
6-pin header on the top of the PCB is not connected to Port A on the RC2014 Pro bus. It is connected to a separate UART on the ESP32 and is only used for
- updating/re-flashing the firmware on the ESP32
- monitoring debug logs from the ESP32
- future expansion
The
Modem Port B
6-pin header on the top of the PCB is connected to Port B Rx/Tx lines on the RC2014 Pro bus. In addition it:
- provides RTS/CTS flow-control lines, when enabled for the modem
- is designed to be compatible with serial cards such as the SC104 Z80 SIO/2 Module or similar
If you want to provide power to, or take power from either of the 6 pin headers then JP5 and JP6 will provide power or isolate the
Vcc
pin in theFTDI Program
andModem Port B
6-pin headers respectively.WARNING
You should normally only connect one power source to the system at a time.
# VT132 Stand Alone edition
There are significantly more hardware configuration options on the VT132 Stand Alone edition. As noted above you need only install a number of optional components as required for your setup. All the optional components can be installed together if you want the maximum flexibility.
# Power configuration
There are six (6) different 2-pin, horizontal headers on the PCB for selecting power options.
WARNING
In most configurations only one (1) of these jumpers should be in place. Only connect more than one (1) if you have consulted the schematic diagram and made an informed decision to configure power in a specific configuration.
If you use
JP6
to bypass the LM7805 5VDC linear power regulator, it is your responsibility to ensure you are providing regulated +5VDC to the VT132.
JP6
(5V Select) bypasses the LM7805 5VDC linear power regulator and should only be put in place if you are supplying regulated +5VDC to the VT132 via the DC Barrel Jack or one of the EIA serial connectors for the modem (DCE) or the terminal (DTE)JP5
(FTDI Power Vcc) allows +5VDC power to be taken (or given) over the 6-pin FTDI Program headerJP4
(5V Vcc) allows +5VDC power to be taken (or given) over the 6-pin Modem TTL headerJP3
(5V Vcc) allows +5VDC power to be taken (or given) over the 6-pin Terminal TTL headerJP2
(+VDC) allows unregulated power to be taken (or given) over the 3x2-pin DCE - EIA Modem header or the Modem DB25/DE9 RS-232 serial connectorsJP1
(+VDC) allows unregulated power to be taken (or given) over the 3x2-pin DTE - EIA Terminal header or the Terminal DB25/DE9 RS-232 serial connectorsTIP
The supplied DC Barrel Jack and the PCB layout is configured for center-pin-positive.
For the DB25/DE9 RS-232 serial connectors, Pin 9 (normally reserved in the RS-232 standard) can be used for providing unregulated power to the VT132 and is passed through the LM7805 5VDC linear power regulator unless this is bypassed by
JP6
.# Serial communications configuration
There is a 12-pin (6 x 2) header under the MAX3232 ICs labelled
Patch
that must be configured for pass-through &/or cross-over connection of each pair of RS-232/EIA signals by usingshunts
to jumper the pins in pairs as follows:
Pins Device Signal Mode 1-2 Terminal Tx straight-through 3-4 Terminal Rx straight-through 1-3 Terminal Tx cross-over 2-4 Terminal Rx cross-over 5-6 Modem Tx straight-through 7-8 Modem Rx straight-through 5-7 Modem Tx cross-over 6-8 Modem Rx cross-over 9-10 Modem CTS straight-through 11-12 Modem RTS straight-through 9-11 Modem CTS cross-over 10-12 Modem RTS cross-over # VT132 Stand Alone schematic
# USB daughter board (Red PCB) for USB-HID keyboards
There is no additional hardware configuration required for the USB interface. The firmware will detect that the USB interface is installed and proceed to detect any attached USB-HID keyboard.
The USB interface is configured for plug-and-play ie. you should be able to unplug and reconnect a USB-HID keyboard while the VT132 is powered on, you can also change to a different keyboard.
WARNING
In rare circumstances the USB interface can lock-up and become unresponsive. In this case you may need to reset the VT132 with the
Reset
push button near the ESP32 or sometimes it will require you to power cycle the VT132.# VT132 Quick Reference Guide Print-ready PDF
One of the VT132 Beta testers, ACN, prepared this print-ready, PDF, Quick Reference Guide for you. +The site hosts the source in LaTeX and a copy of the published PDF file.
This is a living document and will be updated regularly as required.
# VT100 (enhanced) Operator Information
# VT100 (enhanced) Programmer Information
# VT100 (enhanced) Quick Menu Guide
# 'AT' (Hayes) Serial Modem Operation Manual
# Over-the-Air (OTA) Firmware Update Guide
# USB Host Controller (UHC) Firmware Update Guide
Last Updated: 9/22/2021, 1:51:52 AM'AT' (Hayes) Serial Modem Operation Manual (Draft) | The High Nibble + + + + + + + + + ++ + + diff --git a/vt132/operation/ota/index.html b/vt132/operation/ota/index.html new file mode 100644 index 0000000..9d98498 --- /dev/null +++ b/vt132/operation/ota/index.html @@ -0,0 +1,38 @@ + + + + + +The High Nibble # 'AT' (Hayes) Serial Modem Operation Manual (Draft)
# Background
Unlike the VT100 terminal, the modem does not try to faithfully emulate any particular original device.
Instead it is designed to provide an MVP (minimum viable product) providing a modified Hayes 'AT' compatible command set for connecting over Wi-Fi via TCP/IP sockets with an optional Telnet protocol layer.
Although later standardized by the TIA/EIA, in the early days of dialup modems the 'AT' command set of the Hayes SmartModem was copied by other modem makers and became a de-facto standard or rather a convention, as other modem manufacturers took the liberty to alter and extend the 'AT' command set. The same applied to the so called 'S' Registers where settings and configuration are made and saved to non-volatile storage (NVS).
See Hardware Configuration for details on connecting from a UART on your system to the modem.
# 'AT' Commands
TIP
The original 'AT' command set was strictly in upper case. This is because the bit sequence of the ASCII values for 'A' and 'T' have a specific property that enables autobaud detection of the connection to the data terminal equipment (DTE).
- The modem only responds to 'AT' commands in upper case.
TIP
- Commands are terminated by
<CR>
(carriage return,<ctrl>-m
,0x0D
, decimal 13) usually generated by theEnter
orReturn
key on your keyboard.- Commands can by edited, before pressing
<CR>
, using<BS>
(backspace,<ctrl>-H
,0x08
decimal 8) to erase the previous character entered. You may need to configure the terminal to generate<BS>
when you press theBackspace
or<-
key on your keyboard.WARNING
The 'AT' command processor is based on a finite state machine (FSM). If you type anything that is not recognized by the rules of the FSM you will immediately see an
Error
message.# 'AT' Command Help
Typing
AT$
when connected to the modem will result in the following 'AT' command summary being returned by the modem.TIP
- All commands must be prefixed with
AT
except for the immediate commandA/
.- Commands can be concatenated into a single command string, except in the cases where the command accepts all the remaining input up to the
<CR>
as part of the command.- See the table below for examples.
WARNING
The maximum length command string that can be entered is 80 characters.
Each command is explained in the following table.
# 'AT' Command Summary Table
Command Description Comments/Examples AT 'AT' test AT
entered on its own will respondOK
and tests that command processor is respondingA/ Repeat last command (immediate) This immediate command is not prefixed by AT
but repeats the last command entered as soon asA/
is entered ie. it does not wait for a<CR>
$ Help Responds with the 'AT' Command Help see above I or I0 Information zero Responds with the modem model string VT132 'AT' Modem
I1 Information one Responds with the modem firmware version string eg. V1.0.0
I2 Information two Responds with the modem firmware build chain version string eg. V4.0-1234
Z Reset modem Soft resets the modem. Reloads settings and 'S' Registers from NVS. Closes open TCP/IP connections. But does not disconnect from the Wi-Fi Access Point (AP) if connected &F Restore factory defaults Return the current settings and 'S' Registers to factory defaults. But does not save these to NVS &W Write settings to NVS Writes the current settings to NVS. This takes approximately 10 seconds, during which the modem appears frozen. The modem will respond OK
when the write is completeD Dial (TCP/IP connect) The full form is ATDhostname:port
where hostname is either the IPV4 address innnn.nnn.nnn.nnn
notation or the DNS name of the host. The:port
is optional and specifies a numeric TCP/IP port number for the connection, the default is23
. There are a number of possible error conditions explained below under Wi-Fi Connection Results. If the connection is successful the modem will enter Data Mode+++ Escape Sequence When connected and in Data Mode the Escape Sequence will return to Command Mode. The +++
Escape Sequence is only recognised if surrounded by a guard interval of 1 second ie. there must be a one second pause before and after entering+++
or it will not be recognised but simply treated as part of the data streamO Return Online When connected and in Command Mode ATO
will return to Data Mode. If not connected the modem will respondNO CARRIER
H Hangup When connected and in Command Mode ATH
will close the connection. If a connection is closed the modem will respondHANGUP
&A or &A0 Enable Answer mode (interactive) Unless AT&A
is entered the modem will not respond to requests for incoming connections. See Answer Mode below for details. Interactive: DisplaysRING
&CONNECTED
responses (if enabled). Allows the interrupt sequence+++
to return the Modem to command mode from data mode&A1 Enable Answer mode (daemon) Unless AT&A
is entered the modem will not respond to requests for incoming connections. See Answer Mode below for details. Daemon: Suppresses 'AT' command echo and responses (setsATE0
&ATQ1
). Ignores the interrupt sequence+++
preventing the Modem from returning to command mode from data modeA Answer When an incoming connection request is indicated by the modem responding RING
the request can by manually accepted with theATA
command. If the connection is successful the modem will enter Data ModeSn Select current register Select register n as the current 'S' register ? Query current register The modem will respond with the value of the current 'S' register. If no register has been selected the default is zero (0). As commands can be concatenated it is normal to append this to the Sn
command to query a specific register eg.ATS15?
will query the value of 'S' Register 15=r Set current register Sets the value of the current 'S' register to r. If no register has been selected the default is zero (0). As commands can be concatenated it is normal to append this to the Sn
command to set a specific register eg.ATS15=1
will set the value of 'S' Register 15 to 1En Command Echo Where n=0 is echo off and n=1 is echo on; to disable/enable echoing 'AT' commands when in command mode; default is on (echo on) Qn Quiet Results Where n=0 is quiet off and n=1 is quiet on; to show/hide 'AT' command results when in command mode; default is off (quiet off) &K or &K0 Disable CTS/RTS flow control The 6-pin modem header provides CTS/RTS lines. AT&K0
disables their operation. This is the default&K1 Enable CTS/RTS flow control The 6-pin modem header provides CTS/RTS lines. AT&K1
enables their operation+W? Query Wi-Fi Access Point (AP) connection status Responds with the status of the Wi-Fi connection as a string. The possible responses are listed below under Wi-Fi Connection Results +W=sss,ppp Join Wi-Fi Access Point (AP) Connects to the Wi-Fi access point with SSID - sss and password - ppp. The modem responds OK
immediately but the connection happens asynchronously so the status of the connection should be checked withAT+W?
orAT+W$
. The SSID and password are immediately stored in NVS regardless of whether they are valid or the connection was successful+W$ Show Wi-Fi IP address Responds with the IP address allocated to the modem from the AP by DHCP. If the connection has not completed or has been unsuccessful the IP address returned will be 0.0.0.0
+W# Show Wi-Fi MAC address Responds with the MAC address of the modem. No connection is required, the MAC address is always available +W+ Reconnect to Wi-Fi AP Reconnects to the AP using the SSID and password stored in NVS. If the modem is already joined to the AP, the connection is first disconnected and then reconnected +W- Disconnect from Wi-Fi AP Disconnects from the AP +B? Query Baud Rate Responds with the current baud rate configured for the connection to the DTE +B=n Set Baud Rate Sets the current baud rate to a supported value closest to n. The supported speeds are 4800, 9600, 14400, 19200, 38400, 57600, 115200. After the command is entered there is a 5 second delay before the baud rate is changed to allow changes to be made on the DTE before the modem responds. The new baud rate is immediately stored in NVS +T? Query Telnet TERM environment variable Responds with the current string value of the TERM environment variable that will be used by the Telnet protocol layer when negotiating the TERMINAL-TYPE option. If no value has been set, or has been cleared, the default value vt100
will be used+T=ttt Set Telnet TERM environment variable Sets the current string value of the TERM environment variable to ttt. The Telnet protocol layer will use this value when negotiating the TERMINAL-TYPE option. If the command includes no value and is given only as AT+T=
then the TERM environment variable is cleared and the default value will be used in future. The new value is immediately stored in NVS.# 'S' Registers
There are a total of 51 'S' Registers reserved in the modem,
S0
toS50
.Most of them are undefined and unused. The defined registers are set with default values but some registers are ignored as their purpose is typically not useful, this is indicated in the table below. Changing the value of a register that is ignored will have no effect on the operation of the modem.
'S' Registers originally held only 8-bit (byte) values. In this implementation registers are 16-bit.
# Defined 'S' Registers
Register Description Range Default Value Used S0 Number of rings before Auto-Answer 0–255 (0 = never) 0 Yes S1 Ring Counter 0–255 rings 0 Yes S2 Escape character 0–255, ASCII decimal 43 ('+') Ignored S3 Carriage Return Character 0–127, ASCII decimal 13 (Carriage Return) Ignored S4 Line Feed Character 0–127, ASCII decimal 10 (Line Feed) Ignored S5 Backspace Character 0–32, ASCII decimal 8 (Backspace) Ignored S14 TCP/IP Port number for Answer Mode 0-65535 23 Yes S15 Telnet Protocol for Data Mode 0 - disabled, 1 - enabled 0 Yes S16 Negotiate Telnet SGA 0 - Won't/Don't, 1 - Will, 2 - Do, 3 - Will/Do 3 Yes S17 Negotiate Telnet ECHO 0 - Won't/Don't, 1 - Will, 2 - Do, 3 - Will/Do 3 Yes S18 Negotiate Telnet BIN 0 - Won't/Don't, 1 - Will, 2 - Do, 3 - Will/Do 0 Yes S19 Negotiate Telnet NAWS 0 - Won't/Don't, 1 - Will, 2 - Do, 3 - Will/Do 3 Yes S20 NAWS Negotiate Columns 0-255 columns 80 Yes S21 NAWS Negotiate Rows 0-255 rows 24 Yes S22 Negotiate Telnet TERMINAL-TYPE 0 - Won't/Don't, 1 - Will, 2 - Do, 3 - Will/Do 3 Yes S39 CTS/RTS Flow Control 0 - disabled, 1 - enabled, set by AT&K
command0 Yes # Wi-Fi Connection Results
WARNING
Wi-Fi cannot be started when the terminal is in 30 line mode due to the limited amount of internal memory in the EPS32.
If you attempt to (re)connect the Wi-Fi when in this mode you will receive the response:
WIFI ERROR
Return the terminal to 24 or 25 line mode and you will be able to (re)connect the Wi-Fi.
# Dial Responses
The following table details the responses from the modem for the Dial command
ATDhostname:port
Response Reason for Response NO DIALTONE
when no Wi-Fi connection has been established with an AP ALREADY IN CALL
when a connection is already established ('Dialed' or 'Answered') with another host ERROR
when no hostname is provided NO ANSWER
when a TCP/IP socket can't be opened with the hostname:port CONNECT
when a TCP/IP socket is opened with the hostname:port # Query Wi-Fi Responses
The following table details the responses from the modem for the Query Wi-Fi Access Point (AP) connection status command
AT+W?
Response Description WIFI NOT STARTED
when no Wi-Fi connection has been attempted since power-on or hardware reset WIFI IDLE
if Wi-Fi status is queried during a connection attempt WIFI NO SSID
when no AP with the given SSID/password is found following the AT+W+
orAT+W=
commandsWIFI CONNECTED
following a successful connection to an AP with the AT+W+
orAT+W=
commandsWIFI CONNECT FAILED
tba WIFI CONNECTION LOST
following a lost connection with the AP WIFI DISCONNECTED
following an unsuccessful connection attempt, or a successful disconnection with the AT+W-
command# Telnet Protocol
The Telnet protocol in normally considered an optional layer when establishing TCP/IP socket connections with remote hosts to operate as a Network Virtual Terminal (NVT).
Some hosts will provide a more functional service if Telnet is negotiated.
The Telnet daemon
telnetd
I have on MacOS won't accept a connection if Telnet is not negotiated.When Telnet is not enabled, TCP/IP socket connections are 8-bit clean. With Telnet enabled only one value,
0xFF
known as the IAC byte (Interpret As Command) is overloaded to indicate that the next byte is a Telnet command. Telnet must negotiate binary mode (BIN) to transmit binary files.TIP
If connecting to a remote c-Kermit server ie. under c-Kermit on a remote host enter the command
set host /server * 8080
DO NOT enable the Telnet protocol as you are not acting as an NVT in this use-case and c-Kermit doesn't expect Telnet.
# Telnet Options Implemented
The modem implements the following minimum set of Telnet options:
- SGA (Suppress Go Ahead)
- ECHO
- BIN (Binary Transmission)
- NAWS (Negotiate About Window Size)
- TERMINAL-TYPE
Each Telnet Option is negotiated in via a request/response exchange described as Do/Don't (request) and Will/Won't (response). Trying to understand how these work for each Option usually requires reading the RFC (linked in the list above) and extreme patience and experimentation.
Usually you either want an Option completely On (Do/Will) or Off (Don't/Won't).
Setting the supported Options and their default values are defined via specific 'S' Registers detailed above.
In summary the defaults are:
Option Default Description SGA Do/Will SGA is required for the NVT to work character by character and not in linemode ECHO Do/Will tba BIN Don't/Won't To operate as an NVT, binary mode is not required. File transfer protocols like KERMIT and XMODEM do their own binary encoding NAWS Do/Will The remote host can learn your terminal windows size in characters, the default is 80 x 24
set inS20
andS21
respectivelyTERMINAL-TYPE Do/Will The remote host can learn your terminal type, the default is vt100
TIP
TERMINAL-TYPEs must be known by the remote system to be recognised.
When connecting to
telnetd
on MacOS I usevt100+
from theterminfo
database which provides support for color over and above the standardvt100
terminal type, making text applications likehtop
work as expected and in color.# Enabling Telnet Protocol
Telnet protocol is not enabled by default.
- To enable the Telnet protocol you must manually set 'S' Register
S15
to1
withATS15=1
- To disable the Telnet protocol you must manually set 'S' Register
S15
to0
withATS15=0
The Telnet protocol is applied to both outgoing connections 'Dialed' with
ATD
and incoming connections 'Answered' withATA
or Auto-answer.# Telnet Protocol Framework
The Telnet protocol implementation in the modem is not fixed, but is instead based on a library libtelnet. There is further information about Telnet and Telnet Options on the GitHub repository for the library.
The library provides a framework for implementing any Telnet Option. So if there are Options that you feel are important beyond the minimum set already implemented let me know, providing a compelling use-case, and I will consider adding them.
# Answer Mode
Listening for incoming TCP/IP socket connections is not enabled by default.
Note
Changes to the
AT&A
command include: See 'AT' Command Summary Table above.
AT&A0
is equivalent toAT&A
for interactive command mode use (as below) +
- Displays
RING
&CONNECTED
responses (if enabled)- Allows the interrupt sequence
+++
to return the Modem to command mode from data modeAT&A1
is a new daemon mode - this mode avoids a race condition when the 'AT' Modem is used, for example, as the CP/M console device CON: and allows the Modem to be used to provide remote access to the console eg. from a telnet client +
- Suppresses 'AT' command echo and responses (sets
ATE0
&ATQ1
).- Ignores the interrupt sequence
+++
preventing the Modem from returning to command mode from data mode- Typically would be executed from a modem initialisation string
- To enable listening for incoming TCP/IP socket connections you must manually enter
AT&A
to Enable Answer Mode.- Answer Mode will remain enabled, and can only disabled by an
ATZ
Soft Reset, hardware reset or power-cycle.- Incoming TCP/IP socket connections will cause the modem to respond with
RING
, repeated every three (3) seconds.- As each
RING
occurs the Ring Counter inS1
is incremented by one (1).- The user can Answer the incoming call at any time with
ATA
and the modem will accept the TCP/IP socket connection and enter Data Mode.- If the Number of rings before Auto-Answer is set in
S0
to a number greater than zero (0 = never) andS1
is greater-then-or-equal toS0
the modem will Auto-answer: accept the TCP/IP socket connection and enter Data Mode.- If Telnet protocol is enabled by
ATS15=1
then the Telnet Protocol will be negotiated with the remote host after the modem enters Data Mode.- The user can Hangup an incoming call by sending the Escape Sequence
+++
(with guard times) to return to Command Mode and then sendingATH
to Hangup.- A Hangup
ATH
will reset the Ring Counter inS1
to zero (0).Last Updated: 7/10/2021, 5:21:43 AMOver-the-Air (OTA) Firmware Update Guide (Draft) | The High Nibble + + + + + + + + + ++ + + diff --git a/vt132/operation/uhc/index.html b/vt132/operation/uhc/index.html new file mode 100644 index 0000000..de43c78 --- /dev/null +++ b/vt132/operation/uhc/index.html @@ -0,0 +1,31 @@ + + + + + +The High Nibble # Over-the-Air (OTA) Firmware Update Guide (Draft)
The OTA Update feature of the VT132 enables you to update the firmware of your VT132 to the latest release without having to connect your VT132 to a PC via the FTDI connector or install any utilities on your PC to flash new firmware to the ESP32 module.
OTA updates are performed via the 'AT' (Hayes) Modem interface using a series of 'AT' command extensions.
TIP
From the modem prompt/command line you can type
AT$
for help to be reminded of the OTA 'AT' commands.TIP
You can connect to the modem from your system using a terminal program such as KERMIT or QTERM
OR
You can enable the modem locally and connect directly from the VT100 to the modem in LOCAL mode. See the Quick Menu Guide for details.
# Update to latest version from GitHub repository (recommended)
The current firmware on GitHub is tagged as the latest release, so simply use the OTA update feature as follows:
From the modem prompt/command line:
AT+W+
orAT+W=ssid,pwd
to join your Wi-Fi networkAT+U$
to see what firmware version you are currently running [optional]AT+U?
to query GitHub for the latest firmware image- should report
V1.2.0
(or similar) +
- following the version number, a self explanatory indicator of
[OLDER]
,[SAME]
or[NEWER]
will be shownAT+U^
orAT+U!
to upgrade or force the upgrade, depending on your current version +
AT+U^
will only work if the queried firmware image is[NEWER]
- during the upgrade process a series of full-stops
...
will be output to indicate progress with the upgrade- when the upgrade completes downloading the new firmware image into flash memory the modem will respond with an
OK
AT+U$
to see what firmware version you will boot next [optional]- H/W reset after success with the download & flash +
- the new firmware image will only be run following a H/W reset or reboot
WARNING
Once you have entered the Query OTA Update command
AT+U?
the VT132 should not be expected to operate "normally" until you perform a H/W reset or reboot of the VT132.This is because the Query OTA Update command opens and creates a number of files and large data structures in memory that may conflict with normal operation and these can only be closed and released by a H/W reset or reboot.
TIP
You can safely force upgrade
AT+U!
the firmware to the same version you are currently running if you simply want to "practice" the upgrade process.Example output from the Show OTA Partition Status
AT+U$
and Query OTA UpdateAT+U?
commands is show here:A full description of the OTA Update commands and their output will be added here later: TBA.
# Update to a version from a local web server
If you have a firmware image file or if you wish to install a firmware image other than the one tagged latest on the GitHub firmware repository you can stage that file on a local web server (ie. on the same network as the VT132 connects over Wi-Fi) and use a process similar to the one above, but with one extra command to provide the local address of the firmware image.
TIP
The standard firmware image file is named
VT132.bin
Eg. With the firmware image file
VT132.bin
staged on the root of the "local" web server running on port5500
with DNS namemylocalserver
and IPv4 address of192.168.1.20
proceed as follows:From the modem prompt/command line:
AT+W+
orAT+W=ssid,pwd
to join your Wi-Fi networkAT+U$
to see what firmware version you are currently running [optional]AT+U=url_for_local_file
to set the URL to the file on the local web server, eg.: +
AT+U=http://mylocalserver:5500/VT132.bin
if using the DNS name, orAT+U=http://192.168.1.20:5500/VT132.bin
if using the IPV4 addressAT+U?
to query the local web server for the firmware image specified- should report
V1.2.0
(or similar) +
- following the version number, a self explanatory indicator of
[OLDER]
,[SAME]
or[NEWER]
will be shownAT+U^
orAT+U!
to upgrade or force the upgrade, depending on your current version +
AT+U^
will only work if the queried firmware image is[NEWER]
- during the upgrade process a series of full-stops
...
will be output to indicate progress with the upgrade- when the upgrade completes downloading the new firmware image into flash memory the modem will respond with an
OK
AT+U$
to see what firmware version you will boot next [optional]- H/W reset after success with the download & flash +
- the new firmware image will only be run following a H/W reset or reboot
# Update to a version using the ESP-IDF
epstool.py
utilityInstructions for flashing the firmware using the ESP-IDF
esptool.py
utility are included with the firmware downloadable from the GitHub firmware repositoryIf using this process to upgrade:
- download the
FIRMWARE.zip
file- unzip the file
- read the
FLASHING.md
file for instructions# For the security conscious
For the security conscious
OTA Updates from GitHub are performed using the https protocol.
Security certificates (Root CA) for GitHub and Amazon S3 (where GitHub stores release binary files) are embedded in the firmware.
https requests to servers that use any other Root CA certificate will fail to authenticate.
Also, the VT132 makes this request as an https client and does not implement an http or https server.
Note also:
- A Wi-Fi connection to an Access Point is never established by default, but must be explicitly (re)connected using the
AT+W=
orAT+W+
commands- The only time the VT132 makes outgoing IP socket requests is when: +
- you dial a host with the
ATD
dial command- you initiate an OTA update transaction with the
AT+U?
Query OTA Update command and the subsequentAT+U^
orAT+U!
upgrade or force upgrade commands- The only time the VT132 accepts incoming IP socket requests is when the modem is enabled for "Answer" mode with
AT&A
(not be default).Last Updated: 12/28/2020, 11:34:05 PMUSB Host Controller (UHC) Firmware Update Guide (Draft) | The High Nibble + + + + + + + + + ++ + + diff --git a/vt132/operation/vt100/operator/index.html b/vt132/operation/vt100/operator/index.html new file mode 100644 index 0000000..b6edf11 --- /dev/null +++ b/vt132/operation/vt100/operator/index.html @@ -0,0 +1,35 @@ + + + + + +The High Nibble # USB Host Controller (UHC) Firmware Update Guide (Draft)
# Background
The VT132 USB-HID keyboard adapter, the small, red, PCB supplied when you order the USB-HID keyboard option, uses a CH559T microcontroller as a USB Host Controller (UHC).
The UHC runs its own firmware that translates between USB-HID protocols and a high-speed serial protocol for the ESP32 to work with a USB keyboard.
From time-to-time, firmware updates may be released to improve performance, fix bugs or extend the functionality of the UHC.
These firmware updates will be embedded in a release of the VT132 firmware and initiated from within the VT132 Setup screens.
# Update Procedure Overview
The procedure for updating the UHC firmware is:
- Update the VT132 to the latest release, following the OTA Firmware Update Guide
- Navigate to the SET-UP D screen of the VT132
- Press
9
on the keyboard to show the keyboard device status- Press
U
(uppercase 'U') to start the update process- Follow the on-screen prompts for restarting the VT132 to proceed with the update process
TIP
If you have PS/2 keyboard connector you can still view the keyboard device status on the SET-UP D screen but pressing 'U' will do nothing.
WARNING
While it is safe to perform the UHC firmware upgrade repeatedly, the CH559T microcontroller can only be re-flashed a limited number of times (appoximately 100) before it will fail to re-flash again and may not operate correctly after this time.
It is recommended to only update the UHC firmware when required, as indicated in the release notes for a VT132 firmware update.
# Update Procedure Step-by-Step guide
# Update the VT132 to the latest release
This is documented in the OTA Firmware Update Guide
# Navigate to the SET-UP D screen of the VT132
- Press the
SETUP
key ie.<Alt><SysReq>
or<Alt><PrintScreen>
to enter the VT132 SET-UP screens- Press
5
three (3) times to navigate to the SET-UP D screen# Show the keyboard device status
- Press
9
on the keyboard to show the keyboard device status- Details of the current UHC firmware version and any attached keyboard will be shown like in this example:
# Start the UHC firmware update process
- Press
U
(uppercase 'U') on the keyboard to start the UHC firmware update process- Details of the first UHC firmware update screen are shown here:
TIP
As the first two (2) lines of text on this screen suggest, you can abort the update process by pressing
reset
during the first 5 seconds.This is only the first point where you can abort the process, there are 2 other opportunities later in the process.
# Proceeding with the update process
- As the text on the UHC firmware upgrade screen indicates, you must power-cycle the VT132 to proceed with the update process.
- In addition you must jumper/short two (2) pads on the back of the VT132 to force the UHC to restart in programming mode
- Diagrams showing the pads to short for both the VT132 for RC2014 and the VT132 Stand Alone editions are given here: +
- In the first image the pads are circled in GREEN.
- In the second image you can see how I normally do this with a pair of tweezers.
# VT132 Designed for RC2104 edition
# VT132 Stand Alone edition
# Finishing the update process
# Failure
- If you have not successfully forced the UHC to restart in programming mode, you will see the following screen after the restart:
- This will also happen if you only reset the VT132 and have not performed a full power cycle
- If you see this screen, simply reset the VT132 and start the procedure again
# Success
- If you have successfully forced the UHC to restart in programming mode, you will see the following screen after the restart:
- The UHC firmware update will now complete
- When you see the GREEN text
UHC upgrade complete.
the process is finsihed- You must again perform a full power cycle to correctly restart the UHC following the firmware upgrade
Last Updated: 9/22/2021, 1:51:52 AMVT100 (enhanced) Operator Information (Draft) | The High Nibble + + + + + + + + + ++ + + diff --git a/vt132/operation/vt100/operator/quick-menu/index.html b/vt132/operation/vt100/operator/quick-menu/index.html new file mode 100644 index 0000000..e76f7ea --- /dev/null +++ b/vt132/operation/vt100/operator/quick-menu/index.html @@ -0,0 +1,34 @@ + + + + + +The High Nibble # VT100 (enhanced) Operator Information (Draft)
# Background
The VT132 faithfully implements almost all of the features of the original Digital Equipment Corporation (DEC) VT100, with the Advanced Video Option installed.
To this a range of enhancements have been added
- many are features of later DEC VT family terminals that have been implemented for convenience
- some are features of "standard" ANSI terminals (mainly IBM PC/MS DOS based terminal emulators)
- enhancements are highlighted by the addition of (enhancement) to the heading or description
A good reference for an owner of a VT100 (especially getting started with the Setup screens) is the original VT100 Users Guide over at VT100.net. Details of what the Advanced Video Option adds can be found here also.
The remainder of this section will largely focus on where the VT132 implementation of the VT100 differs to an original VT100.
TIP
Each heading is a link to the corresponding section of Chapter 1 of the original VT100 Users Guide
# Part 1 - Keyboard Control and Indictors
The DEC VT100 keyboard differs from a modern PC (PS/2) keyboard in a numbers of ways. The following keyboard mappings are made for keys that were present on the VT100 but not available or not the same on a PC keyboard.
# Key and indicator mappings for the PC keyboard
The
SETUP
key is mapped to<Alt><SysReq>
or<Alt><PrintScreen>
The
ONLINE
andLOCAL
indicators are not shown on a PC keyboard but the mode is shown in the SET-UP screens by a visual ONLINE/LOCAL indicator.The
KEYBOARD LOCKED
indicator and the keyboard lock function are not implemented by the VT132.The
L1-L4
indicators are not implemented by the VT132.The
BACKSPACE
key transmits the code for backspace set by the DECBKM Backarrow Key Mode (enhancement)The
BREAK
key function is not implemented by the VT132.The
PF1-PF4
keys are mapped toF1-F4
.The
F5-F12
keys transmit ANSI escape sequences for these additional function keys (enhancement).
- Also generates escape codes for function keys
<F11>
to<F20>
using<Shift><F1>
through<Shift><F10>
- this makes the physical
<F11>
and<Shift><F1>
the same, and also<F12>
and<Shift><F2>
- escape codes transmitted follow the VT220 format: +
- F11 ESC [ 23 ~ (as existing)
- F12 ESC [ 24 ~ (as existing)
- F13 ESC [ 25 ~
- F14 ESC [ 26 ~
- F15 ESC [ 28 ~
- F16 ESC [ 29 ~
- F17 ESC [ 31 ~
- F18 ESC [ 32 ~
- F19 ESC [ 33 ~
- F20 ESC [ 34 ~
- The "skips" are intentional (skipping 27 and 30) and as per the DEC VT terminal specs.
The
LINEFEED
key does not exist on a PC keyboard but is equivalent to pressing<Ctrl><J>
.The
NO SCROLL
key is mapped to the<Scroll Lock>
key on a PC keyboard and is equivalent to pressing<Ctrl><S>
and<Ctrl><Q>
alternatively.# International keyboard support (enhancement)
The original VT100 keyboard was essentially a US keyboard with a small concession to the UK in that the
<Shift><3>
combination could be configured to transmit a£
symbol instead of the usual#
. This is also true of the VT132, see US/UK setting in SET-UP B.In addition to the standard US PC keyboard layout, the VT132 also supports international keyboards for the UK, France, Germany, Italy and Sweden (with more to follow), see Keyboard in SET-UP D.
# Part 2 - Set-Up Mode
SET-UP A
andSET-UP B
screens are faithful to the original VT100 with the following exceptions:# ONLINE/LOCAL indicator
All setup screens display either
ONLINE
orLOCAL
at the right-hand-end of line 4 to compensate for the absence of indicator LEDs for this purpose on the PC keyboard.# SET-UP screen HELP (enhancement)
All setup screen include integrated help that can be displayed by pressing function key
F1
on each setup screen.The
SET-UP A
andSET-UP B
screens with integrated help are shown here:# SET-UP A - reset Tab-Stops (enhancement)
The VT132 implements the key combination
<Shift><T>
to reset tab-stops to the default 8 character spacing. This was a feature on the VT102.# SET-UP B - T/R Speed
The original VT100 provided support for independent baud rates for Transmit
T SPEED
and ReceiveR SPEED
speeds from 50 to 19200 baud.The VT132 supports baud rates from 300 to 115200 and the Transmit and Receive speed must be the same. The available speeds are
300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200
corresponding to the speeds supported by most serial interface cards based on the available clock settings.Consequently in
SET-UP B
, both the7
and the8
key will cycle through the available baud rates changing bothT SPEED
andR SPEED
simultaneously.
7
will cycle downwards through the available speeds, rolling back to115200
after300
8
will cycle upwards through the available speeds, rolling back to300
after115200
# SET-UP B - clear NVR (reset to factory defaults) (enhancement)
Only on the
SET-UP B
screen the key combination<Shift><C>
will clear the NVR for the VT100. +This will cause a return to factory defaults on the next power-up, hardware reset, soft reset0
or recall<Shift><R>
.# SET-UP B - advance to next setup screen (enhancement)
On the
SET-UP B
screen, pressing5
will advance to theSET-UP C
and then onto theSET-UP D
screens, before returning to theSET-UP A
screen.See the separate sections on the features of the SET-UP C and SET-UP D screens.
# SET-UP C - Code Pages, ANSI colours, System Information (enhancement)
# SET-UP D - Multinational Character Set, NRCS, International Keyboards, Personalities (enhancement)
# Part 3 – Definition of Each SET-UP Feature
The definition and function of each feature on the
SET-UP A
andSET-UP B
screens is faithful to the original VT100, as described in the User Guide, with the following exceptions:# BITS PER CHARACTER (enhancement)
The
bits per character
for the VT132 is fixed at 8, enabling 8-bit extended ASCII modes of operation
- bit 8 is not set to space (or 0) for characters transmitted
- bit 8 is not ignored for characters received
# INTERLACE
Interlace is simulated by rendering blank scan lines in the doubled scan lines normally rendered in non-interlace mode.
# PARITY
The
parity
for the VT132 is fixed toNone
given that thebits per character
is fixed at 8.# PARITY SENSE (ODD/EVEN)
The
parity sense
for the VT132 is not relevant as theparity
is fixed toNone
.# POWER (enhancement) now: Backspace DEL/BS
The
power
line frequency of the original VT100 (50Hz or 60Hz) is not relevant to the VT132.This 'soft switch' bit on the
SET-UP B
screen has been replaced with a bit that shows/sets the current DECBKM Backarrow Key Mode (enhancement).# BOLD is BRIGHT (enhancement)
Sets the
SGR
attribute Bold to be rendered bright# BOLD is THICK (enhancement)
Sets the
SGR
attribute Bold to be rendered double thickTIP
One or both of these attributes must be set, it is not possible to clear them both.
The default is that they are both set, making *bold both bright and thick +In ANSI.SYS mode it is typical to set only bright. This is done automatically by the Ansi.sys macro in the Quick Menu (see: Ansi.sys emulation mode)
# Set ANSI.SYS compliance (enhancement)
Enables two (2) MS-DOS ANSI.SYS compliant features:
- The ED escape sequence
ESC [ 2 J
both clears the the screen and homes the cursor (equiavlent to a followingESC [ H
)- Non-printable ASCII control characters in the C0 range
(0x00 - 0x1F)
that are "unused" will print the corresponding glyph/character from the PC Code Page 437 character set. +
- The "used" control characters that will not print a glyph/character in this mode are: +
- BEL
^G
- HT
^I
- LF
^J
- VT
^K
- FF
^L
- CR
^M
- ESC
^[
# Set NUMLOCK on Reset (enhancement)
Sets the NUMLOCK key on whenever settings are restored from NVR.
# SCREEN BRIGHTNESS
The VT132 does not implement the
screen brightness
feature of the original VT100.# Part 4 – Self-Testing the VT100
The self testing described in this section of the VT100 User Guide is not implemented by the VT132.
There are tests performed during power-up for the internal memory of the ESP32, keyboard and Nonvolatile Memory (NVR). But error codes resulting from these tests are not displayed on the VT100.
Last Updated: 12/28/2020, 11:39:06 PMQuick Menu Guide (Draft) | The High Nibble + + + + + + + + + ++ + + diff --git a/vt132/operation/vt100/operator/setup-c/index.html b/vt132/operation/vt100/operator/setup-c/index.html new file mode 100644 index 0000000..1d451de --- /dev/null +++ b/vt132/operation/vt100/operator/setup-c/index.html @@ -0,0 +1,30 @@ + + + + + +The High Nibble # Quick Menu Guide (Draft)
# Overview and rationale
The structure of the Setup screens based on the implementation in the original VT100 are difficult to extend. The VT132 already adds Setup-C & Setup-D to provided access and control for the majority of enhanced features. Additionally the VT100 style Setup screens makes finding, navigating to and changing/setting the desired feature cumbersome.
Digital Equipment Corporation (DEC) experimented with a number of different setup screen approaches throughout the life of the VT family of terminals, making significant changes to the implementation with the introduction of the VT220 and again with the VT510.
It was desirable to add a quick access menu for features that you might frequently want to change eg. terminal personality or to turn ANSI.SYS compliance on and off. Also it was desirable to have an easily extensible menu to access new features added to the VT132 over time, without having to add additional VT100 style Setup screens.
The solution was to add a VT510 style popup menu system. The implementation differs slightly to incorporate some more modern UI conventions and keyboard short-cuts.
- not features can be accessed via the Quick Menu
- it is mainly for features that can't be accessed through Set-Up menus
- or features from Set-Up C & D that require quick access
# Accessing the Quick Menu
The Quick Menu is opened with the
<LeftAlt>-<Esc>
key combination. When these key are pressed together with <LeftAlt> being used like a <Shift> key, the display is cleared and the following root menu appears:# Keyboard navigation in the Quick Menu
- Access the Quick Menu by pressing
<LeftAlt><Esc>
- Press
<Esc>
to close the Quick Menu- Dim/faint features are currently disabled
<space>
,<Enter/Return>
and<right arrow>
make selections- Pressing the underlined letter (any case) makes that selection (only in the current menu)
<Esc>
,<Backspace>
,<left arrow>
go back/exit. Of these, only<Esc>
will close the Quick Menu- Selecting an "action" i.e not a menu, checkbox or radio button, will execute the action and leave the quick menu.
<up arrow>
and<down arrow>
navigate between choices in the current menu +
- these keys will wrap-around vertically from bottom-to-top, and top-to-bottom
# Indicators in the Quick Menu
- Binary selection of a feature is usually indicated with a Check Box +
[ ]
for unselected[X]
for selected- change this option with
<space>
,<Enter/Return>
or<right arrow>
- Selection from a group of options is usually indicated with Radio Buttons +
( )
for not currently selected(*)
for the currently selected option- change the selection with
<space>
,<Enter/Return>
or<right arrow>
- Menus are indicted with a
>
at the right-hand-side of the selection# Actions menu
The available actions are:
- Clear display - equivalent to
ESC [ 2 J
followed byESC [ H
to clear the screen and home the cursor- Soft reset - equivalent to
ESC [ !
resets the terminal to a default state but does not recall settings from NVR- Reset terminal - equivalent to
ESC c
or pressing0
in any of the Setup screens- Reboot - equivalent to pressing the H/W Reset button in the VT132. Reboots the ESP32 resetting the terminal and the modem
- Clear NVR - completely erases all settings from the NVR for both the terminal and the modem
# New: Display menu
- Lines of history - selects the number of lines stored (or disable) the scroll history
- CRT saver - selects the timeout for (or disable) the screen saver
- Clear history - an action that clears the contents of the scroll history, same as
<Shift>-C
when in the scroll history# Terminal type menu
- Emulation mode - selects between the nine (9) personalities also selectable from Setup-D
- 7-bit NRCS characters - selects between MCS and NRCS modes, also selectable from Setup-D
# ASCII Emulation menu
- White Screen - a macro that sets White on Black as the default colours
- Green Screen - a macro that sets Green on Black as the default colours
- Amber Screen - a macro that sets Brown on Black as the default colours
- Blue Screen - a macro that sets Cyan on Black as the default colours
- Ansi.sys - a macro that sets
# DEC VT100 emulation modes
The first four (4) options White/Green/Amber/Blue set the terminal for
- VT100 mode with ANIS.SYS compliance disabled
- the DEC VT100/VT220 Font
- resets to 80 column mode
- the ANSI Colour Palette (except Amber that sets the VGA Colour Palette for Brown)
- sets Bold to be both Bright and Thick
These are most useful for applications that expect to work with a VT100 terminal eg. WordStar or SuperCalc2
# ANSI.SYS emulation mode
The Ansi.sys option set the terminal for
- VT100 mode with ANIS.SYS compliance enabled
- the PC Code Page 437 Font
- resets to 80 column mode
- the VGA Colour Palette
- sets Bold to be only Bright
This is most useful when visiting Bulletin Board Systems (BBS) that expect to work with an ANSI.SYS compliant terminal emulator
# Keyboard menu
Keyboard language - selects between the six (6) keyboard languages also selectable from Setup-D
Enable dead keys - enable/disable dead-keys (enabled by default) (see: International Keyboard Support)
[ ]
- disabled, dead-key support is disabled to avoid conflicts with accent keys[X]
- enabled (default), dead-key support is enabled# Modem menu
Enable modem locally - selects between the two (2) operating modes for the modem
[ ]
- unselected (default), the modem is accessible only via its own UART on the RC2014 Bus pins TxB/RxB or via the 6 pin Modem Part B header[X]
- selected, the modem is disconnected from the UART and is available to the VT100 terminal "locally" when the terminal is inLOCAL
mode (see: On-Line (root menu))Enable wi-fi autoconnect - selects whether the modem autoconnects to the Wi-Fi network during startup
[ ]
- unselected (default), the modem does not autoconnect,AT+W+
(or similar) is required to connect[X]
- selected, the modem does autoconnect, equivalent toAT+W+
Telnet TERM - allows the TERM environment variable to be edited, see:
AT+T?
andAT+T=ttt
in the 'AT' Command SummaryInitialization string - allows the modem initialization string to be edited, this is executed at power-on and reset, including a modem reset by
ATZ
Reset modem - performs a modem reset as if the command
ATZ
had been peformed, an audible bell will confirm that the modem has been resetTIP
The following three (3) settings, detailed above, are immediately stored to NVR and don't require a further save setteings to retain:
- Enable wi-fi autoconnect
- Telnet TERM
- Initialization string
# On-line (root menu)
- On-line - equivalent to pressing
4
in any of the Setup screens to select betweenONLINE
orLOCAL
[X]
- selectedONLINE
(default), the terminal is connected to the UART on the RC2014 Bus pins TxA/RxA[ ]
- unselectedLOCAL
, the terminal is disconnected from the UART and will +
- echo "locally" if it is not connected to the modem
- connect directly to the modem if set (see: Modem menu)
# Save settings (root menu)
- Save all settings to NVR for the terminal
- equivalent to pressing
<Shift>-S
in any of the Setup screens# Restore settings (root menu)
- Restore all settings from NVR for the terminal
- equivalent to pressing
<Shift>-R
in any of the Setup screens# Exit (root menu)
- Exit - closes the Quick Menu, the same as pressing
<Esc>
when in the root menu.Last Updated: 8/19/2024, 3:47:54 AMSET-UP C - Code Pages, ANSI colours, System Information (enhancement) | The High Nibble + + + + + + + + + ++ + + diff --git a/vt132/operation/vt100/operator/setup-d/index.html b/vt132/operation/vt100/operator/setup-d/index.html new file mode 100644 index 0000000..567b5d5 --- /dev/null +++ b/vt132/operation/vt100/operator/setup-d/index.html @@ -0,0 +1,35 @@ + + + + + +The High Nibble # SET-UP C - Code Pages, ANSI colours, System Information (enhancement)
# Background
The
SET-UP C
screen is an enhancement that the VT132 adds to the original VT100 functionality.The VT132 implements 16 colour support and multiple font/codepage support and these features are accessible and configurable through the
SET-UP C
screen.In addition to the enhanced features configurable through this screen, it also displays some useful information about the VT132 including:
- firmware version details
- credit to the FabGL library on which it is built
- screen resolutions
- memory utilization
# Help
The integrated help screen is accessible by pressing the
F1
key as with the other SET-UP screens, provides a summary of the features that are configurable on this screen.# Codepage Support
Pressing
2
on the keyboard toggles between the three available codepages.# DEC VT100/VT220 ROM Code Page
The default Codepage/Font shown in the previous screen images is derived from original DEC VT100 and VT220 ROMs.
- Characters from 0x00 to 0x7F are from the VT100 character ROM and include the standard 7-bit ASCII character set and the DEC Special Graphics character set.
- Characters from 0x80 to 0xFF are from the VT220 character ROM and implement the upper half (non-ASCII) of the DEC Multinational Character Set (MCS)
TIP
This codepage is also available in 132 column mode.
# PC Code Page 437
The alternate Codepage/Font CP437, also known as the VGA/ANSI character set from the MS-DOS era, is shown here.
The main purpose of providing CP437 support is to allow visiting BBS systems that render menus and ASCII art expecting an ANSI terminal with VGA font support. You may find other uses but for general use this font is not as clear as the DEC fonts.
TIP
When CP437 is selected as the current font, rendering characters from the DEC Special Graphics character set will still work as they are automatically mapped to corresponding characters in the CP437 font.
WARNING
This codepage is not available in 132 column mode.
# DEC VT220/Latin-1 Code Page
The successor to the DEC Multinational Character Set, this code page also known as ISO-8859-1 was the most commonly used code page prior to the adoption of Unicode and is shown here.
Available for both 80 and 132 column modes.
The main purpose of providing Latin-1 codepage support is if you are connecting to a modern operating system and want an accurate, contemporary codepage.
WARNING
If DEC VT220/Latin-1 is currently selected, any reset event or change of font/lines/columns etc... returns to DEC VT100/VT220 ROM codepage
This setting is is not currently saved in NVR
# 24/25/30 Line Support
Pressing
3
on the keyboard toggles between 24, 25 & 30 line support. There is a noticeable delay while the VGA signal re-syncs with the changed viewport resolution.The original VT100 supported 24 lines of text. With the introduction of the IBM PC a 25 line display became the norm.
The main purpose of providing 25 line support is to allow visiting BBS systems that render menus and ASCII art expecting an ANSI terminal with 25 line support.
When 25 line support is selected, the details on the
SET-UP C
screen change as follows:The maximum viewport resolution of the VT132 is 800x300. At this vertical resolution, 30 lines of text can be displayed. This can be useful for displaying more text on the screen for working at the operating system (CP/M) prompt, programming in Basic or working with a range of full screen applications such as WordStar or SuperCalc2.
TIP
Full screen applications such as WordStar or SuperCalc2 typically must be configured using their accompanying install/setup program to work with the increased number of rows.
SuperCalc2 works well at 132 columns by 30 rows.
When 30 line support is selected, the details on the
SET-UP C
screen change as follows:TIP
25 and 30 line support is also available in 132 column mode.
WARNING
If Wi-FI has been started from the modem, then 30 line mode will not be selectable and this setting will only toggle between 24 and 25 line modes.
To re-enable 30 line mode you must H/W Reset or Reboot the VT132 and ensure Wi-Fi is not started from the modem.
# ANSI/VGA Palette Support
Pressing
6
on the keyboard toggles between standard ANSI and VGA colour palettes. The colour changes are only subtle and effect only a few colours.With the introduction of colour the ANSI escape codes for SGR (Select Graphic Rendition) were extended to cater for colour.
The VT132 implements 4 bit colour providing for 16 possible colours.
The standard ANSI colours are represented under the heading "Windows Console" in this 4 bit ANSI colour table. The VGA text colours were slightly different and are shown under the heading "VGA' in the same table.
The main purpose of providing VGA colour palette support is to allow visiting BBS systems that render menus and ASCII art to be viewed with better colour accuracy. The most noticeable change is that the ANSI palette dark yellow becomes brown in the VGA palette.
When the VGA colour palette is selected, the
SET-UP C
screen change as follows:# Setting Default Foreground and Background Colours
Pressing
7
on the keyboard sets the default foreground colour based on the current cursor position.Pressing
8
on the keyboard sets the default background colour based on the current cursor position.Moving the cursor left or right with the
<left>
and<right>
cursor control keys,<tab>
or<cr>
enables you to choose the colour you want to apply.The current default foreground and background colour combination is displayed by the word
Default
on the last line of the screen.The ANSI escape codes for SGR (Select Graphic Rendition) allow a default foreground and background colour to be specified, in addition to selecting specific colours on demand. When no specific colour attributes are in effect the default foreground and background colours are used.
This feature of the VT132 lets you manually select your preferred default foreground and background colours.
This way you can make the VT132 appear as a green, amber , white (default) or blue phosphor terminal, or any other colour combination that you prefer.
# Showing the currently loaded DECDLD / DRCS soft font
Pressing
9
on the keyboard changes the codepage to display the presently loaded soft soft and its DscsThe example below shows the DEC APL soft font loaded from a file sourced from the VAX VMS system disks.
The first row of glyphs does not belong to the soft font, but are the glyphs used to represent characters in C0 when DEC CRM is enabled.
Any glyphs that are not loaded from a Down-Line-Loadable Character Set are shown with a reverse question mark - ⸮
The Dscs (character set name) for the soft font, 1 to 3 characters, sprecified by the soft font definition is shown between square brackets in the inverse title above the character set. Dscs=[ @] in the example above.
TIP
The use of soft fonts is beyond the scope of these notes, you should consult the VT220 Programmers Guide - Chapter 4 for details.
# SET-UP C - advance to next setup screen
On the
SET-UP C
screen, pressing5
will advance to theSET-UP D
screen, before returning to theSET-UP A
screen.Last Updated: 7/14/2021, 7:58:02 AMSET-UP D - Multinational Character Set, NRCS, International Keyboards, Personalities (enhancement) | The High Nibble + + + + + + + + + ++ + + diff --git a/vt132/operation/vt100/programmer/index.html b/vt132/operation/vt100/programmer/index.html new file mode 100644 index 0000000..2d89a57 --- /dev/null +++ b/vt132/operation/vt100/programmer/index.html @@ -0,0 +1,34 @@ + + + + + +The High Nibble # SET-UP D - Multinational Character Set, NRCS, International Keyboards, Personalities (enhancement)
# Background
The
SET-UP D
screen is an enhancement that the VT132 adds to the original VT100 functionality.The VT132 implements multinational character support (derived from the VT220), international keyboard support and personality support for a range of other terminals of the era, these features are accessible and configurable through the
SET-UP D
screen.# Help
The integrated help screen is accessible by pressing the
F1
key as with the other SET-UP screens, provides a summary of the features that are configurable on this screen.# DEC Multinational Character Set (MCS 8-bit) Support
The DEC Multinational Character Set (MCS) is the default character set on the VT132. It provides:
- a standard 7-bit ASCII character set
- an extended 8-bit ASCII character set including accented characters, currency symbols, and other character glyphs missing from 7-bit ASCII
- (and is the ancestor of the ISO-8859-1 'Latin 1' codepage)
- a full MCS 8-bit character set available to all applications that are 8-bit clean
# DEC National Replacement Character Set (NRCS 7-bit) Support
The DEC National Replacement Character Set (NRCS) is an alternate character set on the VT132. It is mutually exclusive with the MCS. It provides:
- a standard 7-bit US-ASCII character set, with
- a maximum of 12 standard US-ASCII characters substituted with language/country specific characters for a nominated country
- (currently implemented for UK (British), FR (French), DE (German), IT (Italian) and SE (Swedish) on the VT132, with more countries to follow)
- international character support for applications that are not 8-bit clean and that only support 7-bit ASCII
The UK is the simplest of these with only the pound symbol
£
substituted for the US-ASCII#
symbol at ASCII 35 (dec) or 0x24 (hex).For other countries/languages, see the reference above to see which characters are substituted.
WARNING
Only one country can be active for NRCS at a time. Changing the country will appear to change the contents of files created while working with another country, because the same 7-bit ASCII code is used to represent different characters depending on the country currently selected.
# International Keyboard Support
PC keyboard scancode to character set mappings are provided for the same country/languages that the VT132 currently support with NRCS (see next section).
Includes dead-key support (country specific) for composed characters with accent diacritics ` ´ ^ ¨ ~ (MCS 8-bit character set and CP437)
- à á â ä ā À Á Â Ä Ã
- è é ê ë È É Ê Ë
- ì í î ï Ì Í Î Ï
- ò ó ô ö õ Ò Ó Ô Ö Õ
- ù ú û ü Ù Ú Û Ü
- ñ Ñ
- ÿ Ÿ
note: not all keyboard layouts support all dead-keys
pressing a dead-key twice, or followed by
<space>
, will output the accent character if printable +` ^ ~ are printable as standalone characters +´ ¨ are not printable as standalone characters +see: https://en.wikipedia.org/wiki/Dead_key for further information on the use of dead-keys# Selecting character set and keyboard support
Pressing
7
on the keyboard toggles between the two available character set modes
- DEC Multinational Character Set (MCS 8-bit), and
- DEC National Replacement Character Set (NRCS 7-bit)
Pressing
6
on the keyboard selects the country/language for both NRCS mode and keyboard support, based on the current cursor position. Current choices are:
- US
- UK
- FR (French)
- DE (German)
- IT (Italian)
- SE (Swedish)
Moving the cursor left or right with the
<left>
and<right>
cursor control keys,<tab>
or<cr>
enables you to choose the language/country you want to select.The current country/keyboard as a word eg.
German
on the last line of the screen.WARNING
NRCS country/language selection and keyboard country/language selection are not independent. +On the VT220 the country/language selection was made automatically by the keyboard that was attached to the terminal. +At least with the VT132 you get to choose.
# Personality Support
The teminal emulation provides a number of 'Personalities' for different terminals of the era.
It maps the escape sequences that control these terminals to the equivalent escape sequences for the VT100.
The special, non-ASCII keyboard keys (mainly cursor control keys) are mapped to the typical "WordStar" key mappings. Details tba.
The available personalities are:
- ANSI/VT100 (the default VT100 operating mode)
- WordStar/VT100 (same as above but with WordStar cursor navigation key mappings)
- ADM-3A
- ADM-31
- Cromemco 3102
- Hazeltine 1500
- Osborne 1
- Kaypro
- VT52 (already a feature of the VT100, this personality simply actives VT52 compatibility mode)
# Selecting personality support
Pressing the
<up>
and<down>
cursor control keys cycles to thePrevious
orNext
personality in the list.# SET-UP D - advance to next setup screen
On the
SET-UP D
screen, pressing5
will return to theSET-UP A
screen.Last Updated: 8/19/2024, 3:47:54 AMVT100 (enhanced) Programmer Information (Draft) | The High Nibble + + + + + + + + + ++ + +The High Nibble # VT100 (enhanced) Programmer Information (Draft)
# Background
The VT132 faithfully implements almost all of the features of the original Digital Equipment Corporation (DEC) VT100, with the Advanced Video Option installed.
To this a range of enhancements have been added
- many are features of later DEC VT family terminals that have been implemented for convenience
- some are features of "standard" ANSI terminals (mainly IBM PC/MS DOS based terminal emulators)
- enhancements are highlighted by the addition of (enhancement) to the heading or description
A good reference for an owner of a VT100 (especially getting started with the Setup screens) is the original VT100 Users Guide over at VT100.net. Details of what the Advanced Video Option adds can be found here also.
The remainder of this section will largely focus on where the VT132 implementation of the VT100 differs to an original VT100.
TIP
Each heading is a link to the corresponding section of Chapter 3 of the original VT100 Users Guide
# The Keyboard
# LED Indicators
The original VT100 keyboard had 7 LED indicators, the VT132 does not.
On the VT132:
- The ON-LINE/LOCAL status is indicated on each Setup screen in the top right-hand corner as either
ONLINE
orLOCAL
and also in the Quick Menu, on the root menu, by the checkbox item[X]On-line
for ON-LINE and[ ]On-line
for LOCAL.- There is no support for the "keyboard locked" condition.
- The four remaining, programmable LEDs are represented as follows: +
- L1, L2 and L3 are mapped to the 3 PC keyboard LEDs for
<Num Lock>
,<Caps Lock>
and<Scroll Lock>
(if present) +
- Sending an escape sequence to turn on/off any of L1, L2 or L3 will change the corresponding LED on the keyboard
- Pressing one of the 3 key-lock keys
<Num Lock>
,<Caps Lock>
and<Scroll Lock>
will override the value displayed for L1, L2 or L3- L4 is not mapped to anything is so is not visible
# SET-UP
The
SET-UP
key is mapped to<Alt><SysReq>
or<Alt><PrintScreen>
# NO SCROLL
The
NO SCROLL
key is mapped to the<Scroll Lock>
key on a PC keyboard and is equivalent to pressing<Ctrl><S>
and<Ctrl><Q>
alternatively.# BREAK
The
BREAK
key function is not implemented by the VT132.# Communications Protocols
# Full Duplex
The VT132 supports baud rates from 300 to 115200 and the Transmit and Receive speed must be the same. The available speeds are
300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200
corresponding to the speeds supported by most serial interface cards based on the available clock settings.# Terminal Control Commands
# Control Characters
The following table details the control characters the VT132 responds to.
There are two columns indicating whether the control character action is implemented, one for VT100 mode and one for ANSI.SYS compliance mode as the set of control characters differs depending on the current mode.
Control Character Octal Code Hex Code Action Taken VT100 ANSI.SYS NUL 000 0x00 Ignored on input No No ENQ 005 0x05 Transmit answer-back message Yes No BEL 007 0x07 Sound bell tone from buzzer Yes Yes BS 010 0x08 Move the cursor to the left one character position, unless it is at the left margin, in which case no action occurs Yes Yes HT 011 0x09 Move the cursor to the next tab stop, or to the right margin if no further tab stops are present on the line Yes Yes LF 012 0x0A This code causes a line feed or a new line operation. (See new line mode). Yes Yes VT 013 0x0B Interpreted as LF - TBA Yes Yes FF 014 0x0C Interpreted same as VT Yes Yes CR 015 0x0D Move cursor to the left margin on the current line Yes Yes SO 016 0x0E Invoke G1 character set, as designated by SCS control sequence. Yes No SI 017 0x0F Select G0 character set, as selected by ESC (
sequenceYes No XON 021 0x11 Causes terminal to resume transmission Yes Yes XOFF 023 0x13 Causes terminal to stop transmitted all codes except XOFF and XON Yes Yes SUB 030 0x18 Not implemented No No CAN 032 0x1A Not implemented No No ESC 033 0x1B Invokes a control sequence Yes Yes DEL 177 0x7F Ignored on input Yes Yes TIP
Control Characters in the ranges named C0 (0x00-0x1F) and C1 (0x80-0x9F) are normally considered non-printable characters. +This is true for the VT100 (and all terminal personalities included in the VT132).
The exception is when ANSI.SYS compliance is enabled.
In this mode only the Control Characters listed above with Yes in the ANSI.SYS column are considered non-printable. +All other Control Characters will be output to the terminal, showing the corresponding glyph from the currently selected font. This is designed to allow a greater range of the CP437 character set to be output to the terminal and many of these glyphs are used in BBSs to display extra symbols and also in ANSI art.
# Control Sequences
The following tables of Control Sequences are grouped into 4 categories:
- Original VT100 Control Sequences
- Additional Control Sequences from later models of VT family terminals
- ANSI.SYS Control Sequences specific to ANSI.SYS support
- Original VT52 Control Sequences
# Original VT100 Control Sequences
Control Sequence Name Action Taken Default Value ESC [ Pn ; Pn R
CPR Cursor Position Report
Response to DSRESC [ Pn D
CUB Cursor Backward 1 ESC [ Pn B
CUD Cursor Down 1 ESC [ Pn C
CUF Cursor Forward 1 ESC [ Pn ; Pn H
CUP Cursor Position 1 ESC [ Pn A
CUU Cursor Up 1 ESC [ Pn c
DA Device Attributes 0 ESC [ ? 1 ; Pn c
DA Device Attributes response
Hardcoded to:Esc [ ? 64 ; 1 ; 6 ; 22 c
ESC # 8
DECALN Screen Alignment Display ESC [ ? 2 l
DECANM ANSI/VT52 Mode ESC [ ? 8 h/l
DECARM Auto Repeat Mode ESC [ ? 7 h/l
DECAWM Auto-wrap Mode ESC [ ? 1 h/l
DECCKM Cursor Keys Mode ESC [ ? 3 h/l
DECCOLM 132/80 Column Mode ESC # 3
DECDHL Double Height Line -Top Half ESC # 4
DECDHL Double Height Line - Bottom Half ESC # 6
DECDWL Double Width Line ESC Z
DECID Identify Terminal ESC [ ? 9 h/l
DECINLM Interlace Mode
480/240 scan linesESC =
DECKPAM Keypad Application Mode ESC >
DECKPNM Keypad Numeric Mode ESC [ Ps q
DECLL Load LEDS 0 ESC [ ? 6 h/l
DECOM Origin Mode ESC 8
DECRC Restore Cursor
Paired with DECSCESC [ <sol>; ... x
DECREPTPARM Report Terminal Parameters
NOT IMPLEMENTEDESC [ <sol> x
DECREQTPARM Request Terminal Parameters
NOT IMPLEMENTEDESC 7
DECSC Save Cursor
Paired with DECRCESC [ ? 4 h/l
DECSCLM Scrolling Mode
Smooth/Jump scrollingESC [ ? 5 h/l
DECSCNM Screen Mode
Reverse/NormalESC [ Pn; Pn r
DECSTBM Set Top and Bottom Margins
Minimum 2 lineswhole screen ESC # 5
DECSWL Single-width Line ESC [ 2 ; Ps y
DECTST Invoke Confidence Test
NOT IMPLEMENTEDESC [ Ps n
DSR Device Status Report 0 ESC [ Ps J
ED Erase In Display 0 ESC [ Ps K
EL Erase In Line 0 ESC H
HTS Horizontal Tabulation Set ESC [ Pn ; Pn f
HVP Horizontal and Vertical Position 1 ESC D
IND Index ESC [ 20 h/l
LNM Line Feed/New Line Mode ESC E
NEL Next Line ESC M
RI Reverse Index ESC c
RIS Reset To Initial State ESC [ Ps ; ... l
RM Reset Mode none SCS Select Character Set ESC ( A
SCS - G0 G0 - United Kingdom Set ESC ( B
SCS - G0 G0 - ASCII Set ESC ( 0
SCS - G0 G0 - Special Graphics ESC ( 1
SCS - G0 G0 - Alt Standard Character Set ESC ( 2
SCS - G0 G0 - Alt Special Graphics ESC ) A
SCS - G1 G1 - United Kingdom Set ESC ) B
SCS - G1 G1 - ASCII Set ESC ) 0
SCS - G1 G1 - Special Graphics ESC ) 1
SCS - G1 G1 - Alt Standard Character Set ESC ) 2
SCS - G1 G1 - Alt Special Graphics ESC [ Ps ; ... m
SGR Select Graphics Rendition ESC [ 0 m
SGR Attributes Off ESC [ 1 m
SGR Bold or Increased Intensity ESC [ 4 m
SGR Underscore ESC [ 5 m
SGR Blink ESC [ 7 m
SGR Negative (reverse/inverse) image ESC [ Ps ; ... h
SM Set Mode ESC [ Ps g
TBC Tabulation Clear 0 # Additional Control Sequences
Control Sequence Mnemonic Action Taken Notes TBA
# ANSI.SYS Control Sequences
Control Sequence Mnemonic Action Taken Notes ESC [ s
SCOSC Save current cursor state (position and attributes) Does the same as ESC 7
ESC [ u
SCORC Restore current cursor state (position and attributes) Does the same as ESC 8
# XTERM Control Sequences
Control Sequence Mnemonic Action Taken Notes ESC [ Ps b
REP Repeat the preceding graphic character Ps times otherwise ignored # Original VT52 Control Sequences
Control Sequence Action Taken ESC A
Cursor Up ESC B
Cursor Down ESC C
Cursor Right ESC D
Cursor Left ESC F
Enter Graphics Mode ESC G
Exit Graphics Mode ESC H
Cursor to Home ESC I
Reverse Line Feed ESC J
Erase to End of Screen ESC K
Erase to End of Line ESC Y line column
Direct Cursor Address ESC Z
Identify ESC / Z
Identify response ESC =
Enter Alternate Keypad Mode ESC >
Exit Alternate Keypad Mode ESC <
Enter ANSI Mode Last Updated: 12/28/2020, 11:36:36 PM