diff --git a/404.html b/404.html new file mode 100644 index 0000000..f2079ac --- /dev/null +++ b/404.html @@ -0,0 +1,22 @@ + + + + + + The High Nibble + + + + + + + + + +

404

Looks like we've got some broken links.
Take me home.
+ + + diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..3a26e0c --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +thehighnibble.com diff --git a/assets/css/0.styles.c1e91812.css b/assets/css/0.styles.c1e91812.css new file mode 100644 index 0000000..6180773 --- /dev/null +++ b/assets/css/0.styles.c1e91812.css @@ -0,0 +1 @@ +.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#6493bf;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #4f85b6}.home .hero .action-button:hover{background-color:#739ec5}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.sidebar-button{display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem;cursor:pointer}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#6493bf}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:1.5rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#6493bf}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title{display:block}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#6493bf}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #6493bf;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid #ccc;border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid #ddd;border-bottom-color:#ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#6493bf}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #709cc4}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem;position:relative}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}.navbar .links .nav-links{flex:1}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}}.page-edit,.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit,.page-nav{padding:2rem}}@media (max-width:419px){.page-edit,.page-nav{padding:1.5rem}}.page{padding-bottom:2rem}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#aaa}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#6493bf}a.sidebar-link.active{font-weight:600;color:#6493bf;border-left-color:#6493bf}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar-group:not(.first){margin-top:1em}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading{cursor:auto;color:inherit}.sidebar-heading{color:#999;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:0 1.5rem;margin-top:0;margin-bottom:.5rem}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading:.open .arrow{top:-.18em}.sidebar-group-items{transition:height .1s ease-out;overflow:hidden}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem 0}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar .sidebar-links{padding:1.5rem 0}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar .sidebar-links{padding:1rem 0}}.sw-update-popup{position:fixed;right:1em;bottom:1em;padding:1em;border:1px solid #6493bf;border-radius:3px;background:#fff;box-shadow:0 4px 16px rgba(0,0,0,.5);text-align:center}.sw-update-popup button{margin-top:.5em;padding:.25em 2em}.sw-update-popup-enter-active,.sw-update-popup-leave-active{transition:opacity .3s,transform .3s}.sw-update-popup-enter,.sw-update-popup-leave-to{opacity:0;transform:translateY(50%) scale(.5)}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.action-button{background-color:#6493bf!important;border-bottom-color:#40607d!important}.action-button2{background-color:#000!important;border-bottom-color:gray!important}.action-button3{background-color:rgba(104,74,59,.753)!important;border-bottom-color:#684a3b!important}.action-button4{background-color:rgba(73,128,6,.753)!important;border-bottom-color:#498006!important}#nprogress{pointer-events:none}#nprogress .bar{background:#6493bf;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #6493bf,0 0 5px #6493bf;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#6493bf;border-left-color:#6493bf;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.content pre,.content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.content pre[class*=language-] code,.content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.content:not(.custom){padding:2rem}}@media (max-width:419px){.content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:15px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.content:not(.custom)>:first-child{margin-top:3.6rem}.content:not(.custom) a:hover{text-decoration:underline}.content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.content:not(.custom) img{max-width:100%}.content.custom{padding:0;margin:0}.content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#6493bf}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1.2rem;color:#999;border-left:.25rem solid #dfe2e5;margin-left:0;padding-left:1rem}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.content:not(.custom)>h1,.content:not(.custom)>h2,.content:not(.custom)>h3,.content:not(.custom)>h4,.content:not(.custom)>h5,.content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.content:not(.custom)>h1:first-child,.content:not(.custom)>h2:first-child,.content:not(.custom)>h3:first-child,.content:not(.custom)>h4:first-child,.content:not(.custom)>h5:first-child,.content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.content:not(.custom)>h1:first-child+.custom-block,.content:not(.custom)>h1:first-child+p,.content:not(.custom)>h1:first-child+pre,.content:not(.custom)>h2:first-child+.custom-block,.content:not(.custom)>h2:first-child+p,.content:not(.custom)>h2:first-child+pre,.content:not(.custom)>h3:first-child+.custom-block,.content:not(.custom)>h3:first-child+p,.content:not(.custom)>h3:first-child+pre,.content:not(.custom)>h4:first-child+.custom-block,.content:not(.custom)>h4:first-child+p,.content:not(.custom)>h4:first-child+pre,.content:not(.custom)>h5:first-child+.custom-block,.content:not(.custom)>h5:first-child+p,.content:not(.custom)>h5:first-child+pre,.content:not(.custom)>h6:first-child+.custom-block,.content:not(.custom)>h6:first-child+p,.content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.custom-layout{padding-top:3.6rem}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}.theme-container.no-navbar .custom-layout{padding-top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.icon.outbound{color:#aaa;display:inline-block}.socials{text-align:center}.social{width:96px}.action-button[data-v-099ab69c]{background-color:#6493bf!important;border-bottom-color:#40607d!important}.action-button2[data-v-099ab69c]{background-color:#000!important;border-bottom-color:gray!important}.action-button3[data-v-099ab69c]{background-color:rgba(104,74,59,.753)!important;border-bottom-color:#684a3b!important}.action-button4[data-v-099ab69c]{background-color:rgba(73,128,6,.753)!important;border-bottom-color:#498006!important}.badge[data-v-099ab69c]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff;margin-right:5px;background-color:#42b983}.badge.middle[data-v-099ab69c]{vertical-align:middle}.badge.top[data-v-099ab69c]{vertical-align:top}.badge.green[data-v-099ab69c],.badge.tip[data-v-099ab69c]{background-color:#42b983}.badge.error[data-v-099ab69c]{background-color:#da5961}.badge.warn[data-v-099ab69c],.badge.warning[data-v-099ab69c],.badge.yellow[data-v-099ab69c]{background-color:#e7c000} \ No newline at end of file diff --git a/assets/img/10K_analog_joystick.91cd6687.png b/assets/img/10K_analog_joystick.91cd6687.png new file mode 100644 index 0000000..092ee77 Binary files /dev/null and b/assets/img/10K_analog_joystick.91cd6687.png differ diff --git a/assets/img/120mm_Hook_Tape.1b292f0f.png b/assets/img/120mm_Hook_Tape.1b292f0f.png new file mode 100644 index 0000000..6fe8891 Binary files /dev/null and b/assets/img/120mm_Hook_Tape.1b292f0f.png differ diff --git a/assets/img/120mm_Loop_Tape.f771f287.png b/assets/img/120mm_Loop_Tape.f771f287.png new file mode 100644 index 0000000..59d361f Binary files /dev/null and b/assets/img/120mm_Loop_Tape.f771f287.png differ diff --git a/assets/img/16pin_DIP_Socket.639031f8.png b/assets/img/16pin_DIP_Socket.639031f8.png new file mode 100644 index 0000000..c75eb30 Binary files /dev/null and b/assets/img/16pin_DIP_Socket.639031f8.png differ diff --git a/assets/img/1N4148.f932e991.png b/assets/img/1N4148.f932e991.png new file mode 100644 index 0000000..9750fd1 Binary files /dev/null and b/assets/img/1N4148.f932e991.png differ diff --git a/assets/img/2.5mm_Hex_Driver.85a47727.png b/assets/img/2.5mm_Hex_Driver.85a47727.png new file mode 100644 index 0000000..5fed34b Binary files /dev/null and b/assets/img/2.5mm_Hex_Driver.85a47727.png differ diff --git a/assets/img/74CBTLV3257.f9a7f82f.png b/assets/img/74CBTLV3257.f9a7f82f.png new file mode 100644 index 0000000..30a5c1d Binary files /dev/null and b/assets/img/74CBTLV3257.f9a7f82f.png differ diff --git a/assets/img/74HC00.56dba003.png b/assets/img/74HC00.56dba003.png new file mode 100644 index 0000000..de710dd Binary files /dev/null and b/assets/img/74HC00.56dba003.png differ diff --git a/assets/img/74HC138.f8fa198c.png b/assets/img/74HC138.f8fa198c.png new file mode 100644 index 0000000..9a780d5 Binary files /dev/null and b/assets/img/74HC138.f8fa198c.png differ diff --git a/assets/img/74HC165.04785644.png b/assets/img/74HC165.04785644.png new file mode 100644 index 0000000..37160f3 Binary files /dev/null and b/assets/img/74HC165.04785644.png differ diff --git a/assets/img/74HC165.3e327548.png b/assets/img/74HC165.3e327548.png new file mode 100644 index 0000000..310913e Binary files /dev/null and b/assets/img/74HC165.3e327548.png differ diff --git a/assets/img/74HC595.910bbc95.png b/assets/img/74HC595.910bbc95.png new file mode 100644 index 0000000..563eba9 Binary files /dev/null and b/assets/img/74HC595.910bbc95.png differ diff --git a/assets/img/74HC595.f9235fb6.png b/assets/img/74HC595.f9235fb6.png new file mode 100644 index 0000000..f9e112a Binary files /dev/null and b/assets/img/74HC595.f9235fb6.png differ diff --git a/assets/img/8-core_IDC_cable.b8bc83b5.png b/assets/img/8-core_IDC_cable.b8bc83b5.png new file mode 100644 index 0000000..685bb71 Binary files /dev/null and b/assets/img/8-core_IDC_cable.b8bc83b5.png differ diff --git a/assets/img/ACC_desktop.5127181a.png b/assets/img/ACC_desktop.5127181a.png new file mode 100644 index 0000000..8e46833 Binary files /dev/null and b/assets/img/ACC_desktop.5127181a.png differ diff --git a/assets/img/Blue_Rocker_Mom-off-Mom.834e1c92.png b/assets/img/Blue_Rocker_Mom-off-Mom.834e1c92.png new file mode 100644 index 0000000..4b262c0 Binary files /dev/null and b/assets/img/Blue_Rocker_Mom-off-Mom.834e1c92.png differ diff --git a/assets/img/Blue_Rocker_On-On.161c4f84.png b/assets/img/Blue_Rocker_On-On.161c4f84.png new file mode 100644 index 0000000..edf00d8 Binary files /dev/null and b/assets/img/Blue_Rocker_On-On.161c4f84.png differ diff --git a/assets/img/Buzzer.5b8d847a.png b/assets/img/Buzzer.5b8d847a.png new file mode 100644 index 0000000..6afab54 Binary files /dev/null and b/assets/img/Buzzer.5b8d847a.png differ diff --git a/assets/img/CAP_100uF.20ad176a.png b/assets/img/CAP_100uF.20ad176a.png new file mode 100644 index 0000000..e3fe2e4 Binary files /dev/null and b/assets/img/CAP_100uF.20ad176a.png differ diff --git a/assets/img/CAP_100uF.faa0d44b.png b/assets/img/CAP_100uF.faa0d44b.png new file mode 100644 index 0000000..ea8884e Binary files /dev/null and b/assets/img/CAP_100uF.faa0d44b.png differ diff --git a/assets/img/CAP_104.ec90267a.png b/assets/img/CAP_104.ec90267a.png new file mode 100644 index 0000000..5033a60 Binary files /dev/null and b/assets/img/CAP_104.ec90267a.png differ diff --git a/assets/img/CAP_105.6a05778f.png b/assets/img/CAP_105.6a05778f.png new file mode 100644 index 0000000..ee48724 Binary files /dev/null and b/assets/img/CAP_105.6a05778f.png differ diff --git a/assets/img/CAP_10uF.429a3565.png b/assets/img/CAP_10uF.429a3565.png new file mode 100644 index 0000000..c1dcb29 Binary files /dev/null and b/assets/img/CAP_10uF.429a3565.png differ diff --git a/assets/img/CAP_10uF.ad70d4fb.png b/assets/img/CAP_10uF.ad70d4fb.png new file mode 100644 index 0000000..4363f28 Binary files /dev/null and b/assets/img/CAP_10uF.ad70d4fb.png differ diff --git a/assets/img/CAP_22uF.36b246e3.png b/assets/img/CAP_22uF.36b246e3.png new file mode 100644 index 0000000..453e810 Binary files /dev/null and b/assets/img/CAP_22uF.36b246e3.png differ diff --git a/assets/img/CAP_22uF.551085fb.png b/assets/img/CAP_22uF.551085fb.png new file mode 100644 index 0000000..d79f6e3 Binary files /dev/null and b/assets/img/CAP_22uF.551085fb.png differ diff --git a/assets/img/CNX_20X2RA.1a8842bd.png b/assets/img/CNX_20X2RA.1a8842bd.png new file mode 100644 index 0000000..03eb601 Binary files /dev/null and b/assets/img/CNX_20X2RA.1a8842bd.png differ diff --git a/assets/img/CNX_20x1.d8b78993.png b/assets/img/CNX_20x1.d8b78993.png new file mode 100644 index 0000000..4e7c7f9 Binary files /dev/null and b/assets/img/CNX_20x1.d8b78993.png differ diff --git a/assets/img/CNX_20x2F.3101cf87.png b/assets/img/CNX_20x2F.3101cf87.png new file mode 100644 index 0000000..1d6ea2e Binary files /dev/null and b/assets/img/CNX_20x2F.3101cf87.png differ diff --git a/assets/img/CNX_2RA.a4ab8ff6.png b/assets/img/CNX_2RA.a4ab8ff6.png new file mode 100644 index 0000000..2710bfd Binary files /dev/null and b/assets/img/CNX_2RA.a4ab8ff6.png differ diff --git a/assets/img/CNX_40X2RA.eb825555.png b/assets/img/CNX_40X2RA.eb825555.png new file mode 100644 index 0000000..4cd5814 Binary files /dev/null and b/assets/img/CNX_40X2RA.eb825555.png differ diff --git a/assets/img/CNX_4X2.dae969af.png b/assets/img/CNX_4X2.dae969af.png new file mode 100644 index 0000000..b40a0a1 Binary files /dev/null and b/assets/img/CNX_4X2.dae969af.png differ diff --git a/assets/img/CNX_4X2RA.36a6ee1e.png b/assets/img/CNX_4X2RA.36a6ee1e.png new file mode 100644 index 0000000..1e12c4d Binary files /dev/null and b/assets/img/CNX_4X2RA.36a6ee1e.png differ diff --git a/assets/img/CNX_4x2_IDC_F.6f5d9334.png b/assets/img/CNX_4x2_IDC_F.6f5d9334.png new file mode 100644 index 0000000..ae24a3d Binary files /dev/null and b/assets/img/CNX_4x2_IDC_F.6f5d9334.png differ diff --git a/assets/img/CNX_6RA.51b4d022.png b/assets/img/CNX_6RA.51b4d022.png new file mode 100644 index 0000000..c39c47c Binary files /dev/null and b/assets/img/CNX_6RA.51b4d022.png differ diff --git a/assets/img/CNX_8x2F.27100f76.png b/assets/img/CNX_8x2F.27100f76.png new file mode 100644 index 0000000..0c34b23 Binary files /dev/null and b/assets/img/CNX_8x2F.27100f76.png differ diff --git a/assets/img/Capacitor_100nF.b673d2ce.png b/assets/img/Capacitor_100nF.b673d2ce.png new file mode 100644 index 0000000..c1c645a Binary files /dev/null and b/assets/img/Capacitor_100nF.b673d2ce.png differ diff --git a/assets/img/Conductive_Brush.2ccf0c5c.png b/assets/img/Conductive_Brush.2ccf0c5c.png new file mode 100644 index 0000000..a54e40d Binary files /dev/null and b/assets/img/Conductive_Brush.2ccf0c5c.png differ diff --git a/assets/img/Cotton_Buds.f15c3c02.png b/assets/img/Cotton_Buds.f15c3c02.png new file mode 100644 index 0000000..7f13b34 Binary files /dev/null and b/assets/img/Cotton_Buds.f15c3c02.png differ diff --git a/assets/img/D+7A_pinout_sml.68f3b3d6.png b/assets/img/D+7A_pinout_sml.68f3b3d6.png new file mode 100644 index 0000000..f5bb971 Binary files /dev/null and b/assets/img/D+7A_pinout_sml.68f3b3d6.png differ diff --git a/assets/img/DB25F.66fb1120.png b/assets/img/DB25F.66fb1120.png new file mode 100644 index 0000000..0bdfeb1 Binary files /dev/null and b/assets/img/DB25F.66fb1120.png differ diff --git a/assets/img/DC_Barrel_Jack.3b82a41b.png b/assets/img/DC_Barrel_Jack.3b82a41b.png new file mode 100644 index 0000000..25a2743 Binary files /dev/null and b/assets/img/DC_Barrel_Jack.3b82a41b.png differ diff --git a/assets/img/DE9_Male_Socket.238a0910.png b/assets/img/DE9_Male_Socket.238a0910.png new file mode 100644 index 0000000..781fc1b Binary files /dev/null and b/assets/img/DE9_Male_Socket.238a0910.png differ diff --git a/assets/img/DZLR_screenshot.e8459bd6.png b/assets/img/DZLR_screenshot.e8459bd6.png new file mode 100644 index 0000000..3a625c4 Binary files /dev/null and b/assets/img/DZLR_screenshot.e8459bd6.png differ diff --git a/assets/img/Digital_Multimeter.79e10569.png b/assets/img/Digital_Multimeter.79e10569.png new file mode 100644 index 0000000..b88f828 Binary files /dev/null and b/assets/img/Digital_Multimeter.79e10569.png differ diff --git a/assets/img/ESP32_Pico_DevKit.242dd87b.png b/assets/img/ESP32_Pico_DevKit.242dd87b.png new file mode 100644 index 0000000..c5a56ec Binary files /dev/null and b/assets/img/ESP32_Pico_DevKit.242dd87b.png differ diff --git a/assets/img/Elastic_Bands.6d182d79.png b/assets/img/Elastic_Bands.6d182d79.png new file mode 100644 index 0000000..e628c2e Binary files /dev/null and b/assets/img/Elastic_Bands.6d182d79.png differ diff --git a/assets/img/Finished_PCB.7743562f.jpg b/assets/img/Finished_PCB.7743562f.jpg new file mode 100644 index 0000000..4017dd5 Binary files /dev/null and b/assets/img/Finished_PCB.7743562f.jpg differ diff --git a/assets/img/Flux_Pen.5bf7bbb8.png b/assets/img/Flux_Pen.5bf7bbb8.png new file mode 100644 index 0000000..723212c Binary files /dev/null and b/assets/img/Flux_Pen.5bf7bbb8.png differ diff --git a/assets/img/Header_20x1_Female.301fe8c0.png b/assets/img/Header_20x1_Female.301fe8c0.png new file mode 100644 index 0000000..951dae0 Binary files /dev/null and b/assets/img/Header_20x1_Female.301fe8c0.png differ diff --git a/assets/img/Header_20x1_Male.c42f156f.png b/assets/img/Header_20x1_Male.c42f156f.png new file mode 100644 index 0000000..f8c11bc Binary files /dev/null and b/assets/img/Header_20x1_Male.c42f156f.png differ diff --git a/assets/img/Header_4x2_Male.973e9024.png b/assets/img/Header_4x2_Male.973e9024.png new file mode 100644 index 0000000..da1b2c8 Binary files /dev/null and b/assets/img/Header_4x2_Male.973e9024.png differ diff --git a/assets/img/Header_8x2_Male.178f008c.png b/assets/img/Header_8x2_Male.178f008c.png new file mode 100644 index 0000000..8383f7b Binary files /dev/null and b/assets/img/Header_8x2_Male.178f008c.png differ diff --git a/assets/img/IMSAI_Desktop.9d18f55c.png b/assets/img/IMSAI_Desktop.9d18f55c.png new file mode 100644 index 0000000..6727828 Binary files /dev/null and b/assets/img/IMSAI_Desktop.9d18f55c.png differ diff --git a/assets/img/IMSAI_Printer.f3b50742.png b/assets/img/IMSAI_Printer.f3b50742.png new file mode 100644 index 0000000..cc14a43 Binary files /dev/null and b/assets/img/IMSAI_Printer.f3b50742.png differ diff --git a/assets/img/IPA.f7f6a01b.png b/assets/img/IPA.f7f6a01b.png new file mode 100644 index 0000000..110717d Binary files /dev/null and b/assets/img/IPA.f7f6a01b.png differ diff --git a/assets/img/JS-1_Joystick_PCB.1d9f4006.png b/assets/img/JS-1_Joystick_PCB.1d9f4006.png new file mode 100644 index 0000000..ef10bb5 Binary files /dev/null and b/assets/img/JS-1_Joystick_PCB.1d9f4006.png differ diff --git a/assets/img/Joystick_Adapter_PCB.bfd3ab33.png b/assets/img/Joystick_Adapter_PCB.bfd3ab33.png new file mode 100644 index 0000000..6db7041 Binary files /dev/null and b/assets/img/Joystick_Adapter_PCB.bfd3ab33.png differ diff --git a/assets/img/LDO.84fe5048.png b/assets/img/LDO.84fe5048.png new file mode 100644 index 0000000..c608284 Binary files /dev/null and b/assets/img/LDO.84fe5048.png differ diff --git a/assets/img/LED_Alignment_Tool.099c08ac.png b/assets/img/LED_Alignment_Tool.099c08ac.png new file mode 100644 index 0000000..85827a9 Binary files /dev/null and b/assets/img/LED_Alignment_Tool.099c08ac.png differ diff --git a/assets/img/LED_Red_5mm.9b866ef4.png b/assets/img/LED_Red_5mm.9b866ef4.png new file mode 100644 index 0000000..6673474 Binary files /dev/null and b/assets/img/LED_Red_5mm.9b866ef4.png differ diff --git a/assets/img/LED_Spacer_Rocker_Alignment_Tool.a7e72e7f.png b/assets/img/LED_Spacer_Rocker_Alignment_Tool.a7e72e7f.png new file mode 100644 index 0000000..fa2a607 Binary files /dev/null and b/assets/img/LED_Spacer_Rocker_Alignment_Tool.a7e72e7f.png differ diff --git a/assets/img/LM7805.36fe89a8.png b/assets/img/LM7805.36fe89a8.png new file mode 100644 index 0000000..7157089 Binary files /dev/null and b/assets/img/LM7805.36fe89a8.png differ diff --git a/assets/img/M3_Nut.aa4fd012.png b/assets/img/M3_Nut.aa4fd012.png new file mode 100644 index 0000000..520edd3 Binary files /dev/null and b/assets/img/M3_Nut.aa4fd012.png differ diff --git a/assets/img/M3x12_Machine_Screw.28a68b1d.png b/assets/img/M3x12_Machine_Screw.28a68b1d.png new file mode 100644 index 0000000..2550b61 Binary files /dev/null and b/assets/img/M3x12_Machine_Screw.28a68b1d.png differ diff --git a/assets/img/M3x5_Machine_Screw_Washer.1a20c3b3.png b/assets/img/M3x5_Machine_Screw_Washer.1a20c3b3.png new file mode 100644 index 0000000..f8bde0b Binary files /dev/null and b/assets/img/M3x5_Machine_Screw_Washer.1a20c3b3.png differ diff --git a/assets/img/M4_Hex_Nut.5c5ac210.png b/assets/img/M4_Hex_Nut.5c5ac210.png new file mode 100644 index 0000000..c1cd21f Binary files /dev/null and b/assets/img/M4_Hex_Nut.5c5ac210.png differ diff --git a/assets/img/M4_Hex_Nut_Nylon.75593c57.png b/assets/img/M4_Hex_Nut_Nylon.75593c57.png new file mode 100644 index 0000000..e500b7c Binary files /dev/null and b/assets/img/M4_Hex_Nut_Nylon.75593c57.png differ diff --git a/assets/img/M4x10_Hex_Socket_Screw.d5503c83.png b/assets/img/M4x10_Hex_Socket_Screw.d5503c83.png new file mode 100644 index 0000000..fdd303e Binary files /dev/null and b/assets/img/M4x10_Hex_Socket_Screw.d5503c83.png differ diff --git a/assets/img/M4x30_Hex_Socket_Screw.81055db0.png b/assets/img/M4x30_Hex_Socket_Screw.81055db0.png new file mode 100644 index 0000000..121650e Binary files /dev/null and b/assets/img/M4x30_Hex_Socket_Screw.81055db0.png differ diff --git a/assets/img/MAX3232.4ac4cdea.png b/assets/img/MAX3232.4ac4cdea.png new file mode 100644 index 0000000..3246a6b Binary files /dev/null and b/assets/img/MAX3232.4ac4cdea.png differ diff --git a/assets/img/MCP3008.87ffecf7.png b/assets/img/MCP3008.87ffecf7.png new file mode 100644 index 0000000..45f326c Binary files /dev/null and b/assets/img/MCP3008.87ffecf7.png differ diff --git a/assets/img/Masking_Tape.5082a3c7.png b/assets/img/Masking_Tape.5082a3c7.png new file mode 100644 index 0000000..61e5e87 Binary files /dev/null and b/assets/img/Masking_Tape.5082a3c7.png differ diff --git a/assets/img/Modem_AT_help.5f469d8f.jpg b/assets/img/Modem_AT_help.5f469d8f.jpg new file mode 100644 index 0000000..66a3c7a Binary files /dev/null and b/assets/img/Modem_AT_help.5f469d8f.jpg differ diff --git a/assets/img/Modem_OTA_Status.e11f0da8.jpg b/assets/img/Modem_OTA_Status.e11f0da8.jpg new file mode 100644 index 0000000..a35b7e6 Binary files /dev/null and b/assets/img/Modem_OTA_Status.e11f0da8.jpg differ diff --git a/assets/img/NEW_CPA_1024.68868dcc.png b/assets/img/NEW_CPA_1024.68868dcc.png new file mode 100644 index 0000000..36ce7cf Binary files /dev/null and b/assets/img/NEW_CPA_1024.68868dcc.png differ diff --git a/assets/img/PCB_BACK.5d5fa736.png b/assets/img/PCB_BACK.5d5fa736.png new file mode 100644 index 0000000..8a60fa4 Binary files /dev/null and b/assets/img/PCB_BACK.5d5fa736.png differ diff --git a/assets/img/PCB_FRONT.9c173f76.png b/assets/img/PCB_FRONT.9c173f76.png new file mode 100644 index 0000000..d396aa7 Binary files /dev/null and b/assets/img/PCB_FRONT.9c173f76.png differ diff --git a/assets/img/PS2_SOCKET.c31fc3fe.png b/assets/img/PS2_SOCKET.c31fc3fe.png new file mode 100644 index 0000000..da4e12d Binary files /dev/null and b/assets/img/PS2_SOCKET.c31fc3fe.png differ diff --git a/assets/img/PSRAM.16734f71.png b/assets/img/PSRAM.16734f71.png new file mode 100644 index 0000000..64b404d Binary files /dev/null and b/assets/img/PSRAM.16734f71.png differ diff --git a/assets/img/Printer_Adapter_PCB.bce0c529.png b/assets/img/Printer_Adapter_PCB.bce0c529.png new file mode 100644 index 0000000..df49d1d Binary files /dev/null and b/assets/img/Printer_Adapter_PCB.bce0c529.png differ diff --git a/assets/img/Prototype_Adapter_PCB.a6702995.png b/assets/img/Prototype_Adapter_PCB.a6702995.png new file mode 100644 index 0000000..f6c91a9 Binary files /dev/null and b/assets/img/Prototype_Adapter_PCB.a6702995.png differ diff --git a/assets/img/QM_Actions.e190e745.jpg b/assets/img/QM_Actions.e190e745.jpg new file mode 100644 index 0000000..38f049e Binary files /dev/null and b/assets/img/QM_Actions.e190e745.jpg differ diff --git a/assets/img/QM_CRT_Saver.bc6ea1a6.jpg b/assets/img/QM_CRT_Saver.bc6ea1a6.jpg new file mode 100644 index 0000000..fa514bf Binary files /dev/null and b/assets/img/QM_CRT_Saver.bc6ea1a6.jpg differ diff --git a/assets/img/QM_Emulations.b8328e01.jpg b/assets/img/QM_Emulations.b8328e01.jpg new file mode 100644 index 0000000..cacff95 Binary files /dev/null and b/assets/img/QM_Emulations.b8328e01.jpg differ diff --git a/assets/img/QM_History.2997912a.jpg b/assets/img/QM_History.2997912a.jpg new file mode 100644 index 0000000..02ab685 Binary files /dev/null and b/assets/img/QM_History.2997912a.jpg differ diff --git a/assets/img/QM_Home.f2b1902e.jpg b/assets/img/QM_Home.f2b1902e.jpg new file mode 100644 index 0000000..2e68875 Binary files /dev/null and b/assets/img/QM_Home.f2b1902e.jpg differ diff --git a/assets/img/QM_Keyboards.e14c4935.jpg b/assets/img/QM_Keyboards.e14c4935.jpg new file mode 100644 index 0000000..482a115 Binary files /dev/null and b/assets/img/QM_Keyboards.e14c4935.jpg differ diff --git a/assets/img/QM_Modem.a95663bd.jpg b/assets/img/QM_Modem.a95663bd.jpg new file mode 100644 index 0000000..6bdb3b2 Binary files /dev/null and b/assets/img/QM_Modem.a95663bd.jpg differ diff --git a/assets/img/QM_Personalities.f65aa878.jpg b/assets/img/QM_Personalities.f65aa878.jpg new file mode 100644 index 0000000..4dd3575 Binary files /dev/null and b/assets/img/QM_Personalities.f65aa878.jpg differ diff --git a/assets/img/RC2014_PS2.c8f5053c.jpg b/assets/img/RC2014_PS2.c8f5053c.jpg new file mode 100644 index 0000000..f3b4e0d Binary files /dev/null and b/assets/img/RC2014_PS2.c8f5053c.jpg differ diff --git a/assets/img/RC2014_USB.a03dbd86.jpg b/assets/img/RC2014_USB.a03dbd86.jpg new file mode 100644 index 0000000..63cf0a7 Binary files /dev/null and b/assets/img/RC2014_USB.a03dbd86.jpg differ diff --git a/assets/img/RES_10K.5990c193.png b/assets/img/RES_10K.5990c193.png new file mode 100644 index 0000000..5a8ea41 Binary files /dev/null and b/assets/img/RES_10K.5990c193.png differ diff --git a/assets/img/RES_10K_C.aeeb5f00.png b/assets/img/RES_10K_C.aeeb5f00.png new file mode 100644 index 0000000..2bb0fdb Binary files /dev/null and b/assets/img/RES_10K_C.aeeb5f00.png differ diff --git a/assets/img/RES_120.72482160.png b/assets/img/RES_120.72482160.png new file mode 100644 index 0000000..59c3901 Binary files /dev/null and b/assets/img/RES_120.72482160.png differ diff --git a/assets/img/RES_121.1357a8ba.png b/assets/img/RES_121.1357a8ba.png new file mode 100644 index 0000000..b057579 Binary files /dev/null and b/assets/img/RES_121.1357a8ba.png differ diff --git a/assets/img/RES_243.8dcea9f5.png b/assets/img/RES_243.8dcea9f5.png new file mode 100644 index 0000000..4b1c94c Binary files /dev/null and b/assets/img/RES_243.8dcea9f5.png differ diff --git a/assets/img/RES_2K.4ea50fc0.png b/assets/img/RES_2K.4ea50fc0.png new file mode 100644 index 0000000..7bea1f9 Binary files /dev/null and b/assets/img/RES_2K.4ea50fc0.png differ diff --git a/assets/img/RES_402.260d3484.png b/assets/img/RES_402.260d3484.png new file mode 100644 index 0000000..03565a9 Binary files /dev/null and b/assets/img/RES_402.260d3484.png differ diff --git a/assets/img/RES_405.2c8abd5a.png b/assets/img/RES_405.2c8abd5a.png new file mode 100644 index 0000000..1739a7f Binary files /dev/null and b/assets/img/RES_405.2c8abd5a.png differ diff --git a/assets/img/RES_487.59357193.png b/assets/img/RES_487.59357193.png new file mode 100644 index 0000000..1acc031 Binary files /dev/null and b/assets/img/RES_487.59357193.png differ diff --git a/assets/img/RES_4K7.49692d23.png b/assets/img/RES_4K7.49692d23.png new file mode 100644 index 0000000..078b250 Binary files /dev/null and b/assets/img/RES_4K7.49692d23.png differ diff --git a/assets/img/RES_806.ab72cc4a.png b/assets/img/RES_806.ab72cc4a.png new file mode 100644 index 0000000..cf72f2a Binary files /dev/null and b/assets/img/RES_806.ab72cc4a.png differ diff --git a/assets/img/RES_806.cecae634.png b/assets/img/RES_806.cecae634.png new file mode 100644 index 0000000..d1ad4c0 Binary files /dev/null and b/assets/img/RES_806.cecae634.png differ diff --git a/assets/img/RES_976.beba718f.png b/assets/img/RES_976.beba718f.png new file mode 100644 index 0000000..07138e6 Binary files /dev/null and b/assets/img/RES_976.beba718f.png differ diff --git a/assets/img/Red_Power_On-On.5390b421.png b/assets/img/Red_Power_On-On.5390b421.png new file mode 100644 index 0000000..fd96751 Binary files /dev/null and b/assets/img/Red_Power_On-On.5390b421.png differ diff --git a/assets/img/Red_Rocker_Mom-off-Mom.6c1dfbde.png b/assets/img/Red_Rocker_Mom-off-Mom.6c1dfbde.png new file mode 100644 index 0000000..d5c858c Binary files /dev/null and b/assets/img/Red_Rocker_Mom-off-Mom.6c1dfbde.png differ diff --git a/assets/img/Red_Rocker_On-On.a48b36c0.png b/assets/img/Red_Rocker_On-On.a48b36c0.png new file mode 100644 index 0000000..a9a8e49 Binary files /dev/null and b/assets/img/Red_Rocker_On-On.a48b36c0.png differ diff --git a/assets/img/Resistor_10Kohm.ab0ea3fa.png b/assets/img/Resistor_10Kohm.ab0ea3fa.png new file mode 100644 index 0000000..b5d3b20 Binary files /dev/null and b/assets/img/Resistor_10Kohm.ab0ea3fa.png differ diff --git a/assets/img/Resistor_3Kohm.ee51f38a.png b/assets/img/Resistor_3Kohm.ee51f38a.png new file mode 100644 index 0000000..e43cf77 Binary files /dev/null and b/assets/img/Resistor_3Kohm.ee51f38a.png differ diff --git a/assets/img/Resistor_Network_6x10Kohm.e9b4ac96.png b/assets/img/Resistor_Network_6x10Kohm.e9b4ac96.png new file mode 100644 index 0000000..1346054 Binary files /dev/null and b/assets/img/Resistor_Network_6x10Kohm.e9b4ac96.png differ diff --git a/assets/img/S-132_PCB.f6d3d370.png b/assets/img/S-132_PCB.f6d3d370.png new file mode 100644 index 0000000..700a417 Binary files /dev/null and b/assets/img/S-132_PCB.f6d3d370.png differ diff --git a/assets/img/S132_on_IMSAI.d22a7ecd.jpg b/assets/img/S132_on_IMSAI.d22a7ecd.jpg new file mode 100644 index 0000000..e9e0729 Binary files /dev/null and b/assets/img/S132_on_IMSAI.d22a7ecd.jpg differ diff --git a/assets/img/S8050.8d15144c.png b/assets/img/S8050.8d15144c.png new file mode 100644 index 0000000..10640ac Binary files /dev/null and b/assets/img/S8050.8d15144c.png differ diff --git a/assets/img/SA_PS2_Front.d43482d9.jpg b/assets/img/SA_PS2_Front.d43482d9.jpg new file mode 100644 index 0000000..53ae627 Binary files /dev/null and b/assets/img/SA_PS2_Front.d43482d9.jpg differ diff --git a/assets/img/SA_Patch_Cross.54270ac3.jpg b/assets/img/SA_Patch_Cross.54270ac3.jpg new file mode 100644 index 0000000..5de8f56 Binary files /dev/null and b/assets/img/SA_Patch_Cross.54270ac3.jpg differ diff --git a/assets/img/SA_Patch_Straight.e1f44e17.jpg b/assets/img/SA_Patch_Straight.e1f44e17.jpg new file mode 100644 index 0000000..0337e1c Binary files /dev/null and b/assets/img/SA_Patch_Straight.e1f44e17.jpg differ diff --git a/assets/img/SA_USB_Front.9960bb0b.jpg b/assets/img/SA_USB_Front.9960bb0b.jpg new file mode 100644 index 0000000..2f02f4b Binary files /dev/null and b/assets/img/SA_USB_Front.9960bb0b.jpg differ diff --git a/assets/img/SHUNT.8ad03e96.png b/assets/img/SHUNT.8ad03e96.png new file mode 100644 index 0000000..598af4d Binary files /dev/null and b/assets/img/SHUNT.8ad03e96.png differ diff --git a/assets/img/SYS_build_version.7556ac90.png b/assets/img/SYS_build_version.7556ac90.png new file mode 100644 index 0000000..7b8e8fd Binary files /dev/null and b/assets/img/SYS_build_version.7556ac90.png differ diff --git a/assets/img/Screwdriver.db421fdd.png b/assets/img/Screwdriver.db421fdd.png new file mode 100644 index 0000000..49c478e Binary files /dev/null and b/assets/img/Screwdriver.db421fdd.png differ diff --git a/assets/img/Self-closing_Tweezers.e27293a7.png b/assets/img/Self-closing_Tweezers.e27293a7.png new file mode 100644 index 0000000..c6f9ee4 Binary files /dev/null and b/assets/img/Self-closing_Tweezers.e27293a7.png differ diff --git a/assets/img/SetupA_help.74984ac6.jpg b/assets/img/SetupA_help.74984ac6.jpg new file mode 100644 index 0000000..0fae80a Binary files /dev/null and b/assets/img/SetupA_help.74984ac6.jpg differ diff --git a/assets/img/SetupB_help.bcacca03.jpg b/assets/img/SetupB_help.bcacca03.jpg new file mode 100644 index 0000000..2e4aa9c Binary files /dev/null and b/assets/img/SetupB_help.bcacca03.jpg differ diff --git a/assets/img/SetupC.50702c7e.jpg b/assets/img/SetupC.50702c7e.jpg new file mode 100644 index 0000000..c8d24c7 Binary files /dev/null and b/assets/img/SetupC.50702c7e.jpg differ diff --git a/assets/img/SetupC_25line.a1b2f3ac.jpg b/assets/img/SetupC_25line.a1b2f3ac.jpg new file mode 100644 index 0000000..1edca6a Binary files /dev/null and b/assets/img/SetupC_25line.a1b2f3ac.jpg differ diff --git a/assets/img/SetupC_30line.ad9692d4.jpg b/assets/img/SetupC_30line.ad9692d4.jpg new file mode 100644 index 0000000..e3bae9b Binary files /dev/null and b/assets/img/SetupC_30line.ad9692d4.jpg differ diff --git a/assets/img/SetupC_cp437.abf411af.jpg b/assets/img/SetupC_cp437.abf411af.jpg new file mode 100644 index 0000000..95121d0 Binary files /dev/null and b/assets/img/SetupC_cp437.abf411af.jpg differ diff --git a/assets/img/SetupC_drcs.3b29ee99.jpg b/assets/img/SetupC_drcs.3b29ee99.jpg new file mode 100644 index 0000000..229a257 Binary files /dev/null and b/assets/img/SetupC_drcs.3b29ee99.jpg differ diff --git a/assets/img/SetupC_help.398dcee6.jpg b/assets/img/SetupC_help.398dcee6.jpg new file mode 100644 index 0000000..51aa410 Binary files /dev/null and b/assets/img/SetupC_help.398dcee6.jpg differ diff --git a/assets/img/SetupC_latin1.a1c253a8.jpg b/assets/img/SetupC_latin1.a1c253a8.jpg new file mode 100644 index 0000000..3b16e78 Binary files /dev/null and b/assets/img/SetupC_latin1.a1c253a8.jpg differ diff --git a/assets/img/SetupC_vga.11f300e8.jpg b/assets/img/SetupC_vga.11f300e8.jpg new file mode 100644 index 0000000..ca2eb0f Binary files /dev/null and b/assets/img/SetupC_vga.11f300e8.jpg differ diff --git a/assets/img/SetupD_help.9e678f31.jpg b/assets/img/SetupD_help.9e678f31.jpg new file mode 100644 index 0000000..b573c8f Binary files /dev/null and b/assets/img/SetupD_help.9e678f31.jpg differ diff --git a/assets/img/SetupD_mcs.88cb3cb5.jpg b/assets/img/SetupD_mcs.88cb3cb5.jpg new file mode 100644 index 0000000..164a2b6 Binary files /dev/null and b/assets/img/SetupD_mcs.88cb3cb5.jpg differ diff --git a/assets/img/Shunt-Jumper.070a497e.png b/assets/img/Shunt-Jumper.070a497e.png new file mode 100644 index 0000000..a0e712a Binary files /dev/null and b/assets/img/Shunt-Jumper.070a497e.png differ diff --git a/assets/img/Side_Cutters.80586b86.png b/assets/img/Side_Cutters.80586b86.png new file mode 100644 index 0000000..ad545f9 Binary files /dev/null and b/assets/img/Side_Cutters.80586b86.png differ diff --git a/assets/img/Solder.2e28c434.png b/assets/img/Solder.2e28c434.png new file mode 100644 index 0000000..106e5e6 Binary files /dev/null and b/assets/img/Solder.2e28c434.png differ diff --git a/assets/img/Solder_Wick.7feae810.png b/assets/img/Solder_Wick.7feae810.png new file mode 100644 index 0000000..c90fde4 Binary files /dev/null and b/assets/img/Solder_Wick.7feae810.png differ diff --git a/assets/img/Soldering_Iron.bf29229a.png b/assets/img/Soldering_Iron.bf29229a.png new file mode 100644 index 0000000..426b7fd Binary files /dev/null and b/assets/img/Soldering_Iron.bf29229a.png differ diff --git a/assets/img/Soldering_Tip_Cleaner.aabca84a.png b/assets/img/Soldering_Tip_Cleaner.aabca84a.png new file mode 100644 index 0000000..a9b2ce7 Binary files /dev/null and b/assets/img/Soldering_Tip_Cleaner.aabca84a.png differ diff --git a/assets/img/Spacer_6mm.1511a22d.png b/assets/img/Spacer_6mm.1511a22d.png new file mode 100644 index 0000000..610e885 Binary files /dev/null and b/assets/img/Spacer_6mm.1511a22d.png differ diff --git a/assets/img/Spacer_9mm.fb831ed4.png b/assets/img/Spacer_9mm.fb831ed4.png new file mode 100644 index 0000000..cbd1398 Binary files /dev/null and b/assets/img/Spacer_9mm.fb831ed4.png differ diff --git a/assets/img/TACTILE_SW.bd6ac827.png b/assets/img/TACTILE_SW.bd6ac827.png new file mode 100644 index 0000000..d162deb Binary files /dev/null and b/assets/img/TACTILE_SW.bd6ac827.png differ diff --git a/assets/img/Tactile_Switch.cafe48ed.png b/assets/img/Tactile_Switch.cafe48ed.png new file mode 100644 index 0000000..0570530 Binary files /dev/null and b/assets/img/Tactile_Switch.cafe48ed.png differ diff --git a/assets/img/Tactile_Switch.dbb1e634.png b/assets/img/Tactile_Switch.dbb1e634.png new file mode 100644 index 0000000..43b9d86 Binary files /dev/null and b/assets/img/Tactile_Switch.dbb1e634.png differ diff --git a/assets/img/Test_Lead.7f2aa8cf.png b/assets/img/Test_Lead.7f2aa8cf.png new file mode 100644 index 0000000..22415d5 Binary files /dev/null and b/assets/img/Test_Lead.7f2aa8cf.png differ diff --git a/assets/img/Transistor.5d3dd83b.png b/assets/img/Transistor.5d3dd83b.png new file mode 100644 index 0000000..d7d51c9 Binary files /dev/null and b/assets/img/Transistor.5d3dd83b.png differ diff --git a/assets/img/UHC_RC2014.107b5d99.jpg b/assets/img/UHC_RC2014.107b5d99.jpg new file mode 100644 index 0000000..63d5ec6 Binary files /dev/null and b/assets/img/UHC_RC2014.107b5d99.jpg differ diff --git a/assets/img/UHC_RC2014_example.e8b0475b.jpg b/assets/img/UHC_RC2014_example.e8b0475b.jpg new file mode 100644 index 0000000..37904a7 Binary files /dev/null and b/assets/img/UHC_RC2014_example.e8b0475b.jpg differ diff --git a/assets/img/UHC_SA.5246eee7.jpg b/assets/img/UHC_SA.5246eee7.jpg new file mode 100644 index 0000000..9a60a72 Binary files /dev/null and b/assets/img/UHC_SA.5246eee7.jpg differ diff --git a/assets/img/UHC_SA_example.326dc67a.jpg b/assets/img/UHC_SA_example.326dc67a.jpg new file mode 100644 index 0000000..7605613 Binary files /dev/null and b/assets/img/UHC_SA_example.326dc67a.jpg differ diff --git a/assets/img/UHC_firmware_fail.bb1e2403.jpg b/assets/img/UHC_firmware_fail.bb1e2403.jpg new file mode 100644 index 0000000..d1df112 Binary files /dev/null and b/assets/img/UHC_firmware_fail.bb1e2403.jpg differ diff --git a/assets/img/UHC_firmware_success.4c60a5d8.jpg b/assets/img/UHC_firmware_success.4c60a5d8.jpg new file mode 100644 index 0000000..632ed79 Binary files /dev/null and b/assets/img/UHC_firmware_success.4c60a5d8.jpg differ diff --git a/assets/img/UHC_firmware_upgrade.99f92466.jpg b/assets/img/UHC_firmware_upgrade.99f92466.jpg new file mode 100644 index 0000000..5b79c7f Binary files /dev/null and b/assets/img/UHC_firmware_upgrade.99f92466.jpg differ diff --git a/assets/img/USB-HID.a9eaaa3b.png b/assets/img/USB-HID.a9eaaa3b.png new file mode 100644 index 0000000..683ebae Binary files /dev/null and b/assets/img/USB-HID.a9eaaa3b.png differ diff --git a/assets/img/VGA_SOCKET.b56dbc1c.png b/assets/img/VGA_SOCKET.b56dbc1c.png new file mode 100644 index 0000000..814f64f Binary files /dev/null and b/assets/img/VGA_SOCKET.b56dbc1c.png differ diff --git a/assets/img/VIO_screenshot.5c9c42ae.png b/assets/img/VIO_screenshot.5c9c42ae.png new file mode 100644 index 0000000..281d05b Binary files /dev/null and b/assets/img/VIO_screenshot.5c9c42ae.png differ diff --git a/assets/img/VT132.d3f09725.png b/assets/img/VT132.d3f09725.png new file mode 100644 index 0000000..0723607 Binary files /dev/null and b/assets/img/VT132.d3f09725.png differ diff --git a/assets/img/VT132_v1.0.275508b4.jpeg b/assets/img/VT132_v1.0.275508b4.jpeg new file mode 100644 index 0000000..914bfa3 Binary files /dev/null and b/assets/img/VT132_v1.0.275508b4.jpeg differ diff --git a/assets/img/VT132_v1.2.69033815.png b/assets/img/VT132_v1.2.69033815.png new file mode 100644 index 0000000..75b9ea8 Binary files /dev/null and b/assets/img/VT132_v1.2.69033815.png differ diff --git a/assets/img/WROVER.60594a0c.png b/assets/img/WROVER.60594a0c.png new file mode 100644 index 0000000..1927ea8 Binary files /dev/null and b/assets/img/WROVER.60594a0c.png differ diff --git a/assets/img/WebUI.7fea8b99.png b/assets/img/WebUI.7fea8b99.png new file mode 100644 index 0000000..3441462 Binary files /dev/null and b/assets/img/WebUI.7fea8b99.png differ diff --git a/assets/img/Z1_CPA.17189896.png b/assets/img/Z1_CPA.17189896.png new file mode 100644 index 0000000..8ded355 Binary files /dev/null and b/assets/img/Z1_CPA.17189896.png differ diff --git a/assets/img/aluminium_lid.1b5530e5.jpg b/assets/img/aluminium_lid.1b5530e5.jpg new file mode 100644 index 0000000..afb0b13 Binary files /dev/null and b/assets/img/aluminium_lid.1b5530e5.jpg differ diff --git a/assets/img/back_cover.5c12382c.jpg b/assets/img/back_cover.5c12382c.jpg new file mode 100644 index 0000000..ecfcdb8 Binary files /dev/null and b/assets/img/back_cover.5c12382c.jpg differ diff --git a/assets/img/facias.aa29d227.png b/assets/img/facias.aa29d227.png new file mode 100644 index 0000000..f0b7845 Binary files /dev/null and b/assets/img/facias.aa29d227.png differ diff --git a/assets/img/front_cover.d318ae0a.jpg b/assets/img/front_cover.d318ae0a.jpg new file mode 100644 index 0000000..7b8c4b1 Binary files /dev/null and b/assets/img/front_cover.d318ae0a.jpg differ diff --git a/assets/img/keyboard_device_status.bd790f9a.jpg b/assets/img/keyboard_device_status.bd790f9a.jpg new file mode 100644 index 0000000..50aefbc Binary files /dev/null and b/assets/img/keyboard_device_status.bd790f9a.jpg differ diff --git a/assets/img/microSD_16GB_Memory_Card.e2d49301.png b/assets/img/microSD_16GB_Memory_Card.e2d49301.png new file mode 100644 index 0000000..5fae9d7 Binary files /dev/null and b/assets/img/microSD_16GB_Memory_Card.e2d49301.png differ diff --git a/assets/img/microSD_socket.f697ee67.png b/assets/img/microSD_socket.f697ee67.png new file mode 100644 index 0000000..0a6d1a8 Binary files /dev/null and b/assets/img/microSD_socket.f697ee67.png differ diff --git a/assets/img/new_facia_and_filter.966b5c14.jpg b/assets/img/new_facia_and_filter.966b5c14.jpg new file mode 100644 index 0000000..ae04bfc Binary files /dev/null and b/assets/img/new_facia_and_filter.966b5c14.jpg differ diff --git a/assets/img/pcb.e26238bb.jpg b/assets/img/pcb.e26238bb.jpg new file mode 100644 index 0000000..384ca0c Binary files /dev/null and b/assets/img/pcb.e26238bb.jpg differ diff --git a/assets/img/reinforce_bottom.1eb4b60b.png b/assets/img/reinforce_bottom.1eb4b60b.png new file mode 100644 index 0000000..64e522e Binary files /dev/null and b/assets/img/reinforce_bottom.1eb4b60b.png differ diff --git a/assets/img/reinforce_top.c040a287.png b/assets/img/reinforce_top.c040a287.png new file mode 100644 index 0000000..afa764f Binary files /dev/null and b/assets/img/reinforce_top.c040a287.png differ diff --git a/assets/img/rs232_jumpers.aa5b21af.jpg b/assets/img/rs232_jumpers.aa5b21af.jpg new file mode 100644 index 0000000..d956b69 Binary files /dev/null and b/assets/img/rs232_jumpers.aa5b21af.jpg differ diff --git a/assets/img/search.83621669.svg b/assets/img/search.83621669.svg new file mode 100644 index 0000000..03d8391 --- /dev/null +++ b/assets/img/search.83621669.svg @@ -0,0 +1 @@ + diff --git a/assets/img/switch_masking_plate.cad18ad5.jpg b/assets/img/switch_masking_plate.cad18ad5.jpg new file mode 100644 index 0000000..24a0407 Binary files /dev/null and b/assets/img/switch_masking_plate.cad18ad5.jpg differ diff --git a/assets/img/switch_surround.c43e3260.jpg b/assets/img/switch_surround.c43e3260.jpg new file mode 100644 index 0000000..18e64d6 Binary files /dev/null and b/assets/img/switch_surround.c43e3260.jpg differ diff --git a/assets/js/10.a1761c1b.js b/assets/js/10.a1761c1b.js new file mode 100644 index 0000000..ffbf17a --- /dev/null +++ b/assets/js/10.a1761c1b.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{256: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:"imsai-8080-replica"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#imsai-8080-replica"}},[this._v("#")]),this._v(" IMSAI 8080 replica")])},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("ul",[t("li",[this._v("microSD Card for a FAT filesystem (using an 16GB card)")]),this._v(" "),t("li",[this._v("PSRAM for banked memory implementation")]),this._v(" "),t("li",[this._v("MAX232 style RS-232 driver and DE-9M sockets for serial UART")]),this._v(" "),t("li",[this._v('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)')])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(66),alt:"IMSAI 8080 CP-A"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("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 "),t("strong",[this._v("imsaisim")]),this._v(" can serve using an embedded web server.")])},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("p",[this._v("The stock "),t("strong",[this._v("imsaisim")]),this._v(" machine from "),t("strong",[this._v("z80pack")]),this._v(" is configured with:")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[e._v("64K of RAM, however the CP/M 2.2 BIOS is configured for 56K to avoid conflicts with ROMS")]),e._v(" "),s("li",[e._v('4 simulated 8" floppy disks using 256K floppy image files (*.dsk)')]),e._v(" "),s("li",[e._v("IMSAI MPU-A bootrom")]),e._v(" "),s("li",[e._v("MPU-B style bank-switched ROM and RAM for bootrom masking")]),e._v(" "),s("li",[e._v("IMSAI VIO support (optional based on bootrom choice)")]),e._v(" "),s("li",[e._v("Harddisk emulation")]),e._v(" "),s("li",[e._v("Virtual 'AT' modem over TCP/IP sockets (with selectable telnet protocol support) (outbound/dial and (auto) answer mode)")]),e._v(" "),s("li",[e._v("An MMU with Banked memory management to enable CP/M 3.0 (Plus) with banked memory")]),e._v(" "),s("li",[e._v("An RTC to support CP/M 3.0 (Plus)")]),e._v(" "),s("li",[e._v("A range of disk images with different operating systems, applications, games, demos...")])])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[s("strong",[e._v("TTY:")]),e._v(" - VT100/ansi compatible character mode serial terminal, can be windowed or zoomed to full-screen (over websockets)")]),e._v(" "),s("li",[s("strong",[e._v("CRT:")]),e._v(" - implementation of the IMSAI VIO (over websockets: mirrors the 2KB display RAM and does all rendering in the browser)")]),e._v(" "),s("li",[s("strong",[e._v("LPT:")]),e._v(" - 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)")]),e._v(" "),s("li",[s("strong",[e._v("X:DSK:")]),e._v(" & "),s("strong",[e._v("LIB:")]),e._v(" - 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.")]),e._v(" "),s("li",[s("strong",[e._v("CPA:")]),e._v(" - IMSAI CP-A front panel (only the 6 control switches & 4 status LEDs on the RHS, over websockets)")]),e._v(" "),s("li",[s("strong",[e._v("SYS:")]),e._v(" - system status window, shows details of the simulation (host?), enables remote reboot")]),e._v(" "),s("li",[s("strong",[e._v("CFG:")]),e._v(" - configuration file editor, enables config files (.../machine/conf) to be edited and saved")]),e._v(" "),s("li",[s("strong",[e._v("PTR:")]),e._v(" - virtual paper tape reader and punch")]),e._v(" "),s("li",[s("strong",[e._v("DZLR:")]),e._v(" - implementation of the Cromemco Dazzler graphics display")]),e._v(" "),s("li",[s("strong",[e._v("ACC:")]),e._v(" - implementation the Cromemco 88-CCC Cyclops Camera Controller and 88-ACC Cyclops camera (using the web camera attached to the machine running the browser)")]),e._v(" "),s("li",[s("strong",[e._v("JS1:")]),e._v(" - implementation of the Cromemco D+7A I/O including JS-1 joystick emulation (from connected USB joystick)")]),e._v(" "),s("li",[s("strong",[e._v("PTR:")]),e._v(" & "),s("strong",[e._v("TAPE:")]),e._v(" - 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.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(67),alt:"imsai desktop"}}),this._v(" "),t("img",{attrs:{src:s(68),alt:"imsai printer"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The desktop GUI has been back-ported to "),t("strong",[this._v("z80pack V1.36-dev")]),this._v(" for desktop operating systems (OSX/Windows/Linux) so you can experience it on a modern PC running the "),t("strong",[this._v("imsaisim")]),this._v(" machine simulation.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:s(69),alt:"cyclops"}})])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"notes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#notes"}},[this._v("#")]),this._v(" Notes")])},function(){var e=this.$createElement,t=this._self._c||e;return t("li",[this._v("TTY:, VIO:, DZLR: are all able to go "),t("strong",[this._v("full-screen")]),this._v(" with the use of a widget on the window title-bar and the use of the "),t("code",[this._v("ALT-Enter")]),this._v(" (Win) or "),t("code",[this._v("CMD-Enter")]),this._v(" (Mac) key combination")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Here are some screen shots of the VIO: and DZLR: made with the screen-shot feature.\n"),t("img",{attrs:{src:s(70),alt:"vio"}}),this._v(" "),t("img",{attrs:{src:s(71),alt:"dazzler"}})])},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("div",{staticClass:"tip custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("Update")]),this._v(" "),t("p",[this._v("As of November 2024, kits are available again.")]),this._v(" "),t("p",[this._v("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.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"expression-of-interest"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#expression-of-interest"}},[this._v("#")]),this._v(" Expression of interest")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("I accept expressions of interest via email. If you send email to "),t("a",{attrs:{href:"mailto:info@thehighnibble.com"}},[this._v("info@thehighnibble.com")]),this._v(" I will add you to the list.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"news-updates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#news-updates"}},[this._v("#")]),this._v(" News & Updates")])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"socials"},[t("a",{attrs:{href:"https://twitter.com/@TheHighNibble",target:"_blank",rel:"noopener noreferrer"}},[t("img",{staticClass:"social",attrs:{src:"/img/twitter.png"}})]),this._v(" "),t("a",{attrs:{href:"https://www.youtube.com/thehighnibble",target:"_blank",rel:"noopener noreferrer"}},[t("img",{staticClass:"social",attrs:{src:"/img/youtube.png"}})])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"forum"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#forum"}},[this._v("#")]),this._v(" Forum")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Membership requires you to have GitHub account. Email to "),t("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 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("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("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)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"enhancements-and-add-ons"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enhancements-and-add-ons"}},[this._v("#")]),this._v(" Enhancements and Add-ons")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"planned"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#planned"}},[this._v("#")]),this._v(" Planned")])}],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("p",[e._v("I began working on building an IMSAI 8080 CP-A Front Panel replica in May 2017.")]),e._v(" "),s("p",[e._v("I first ported Udo Munk's "),s("a",{attrs:{href:"http://bit.ly/Z80pack",target:"_blank",rel:"noopener noreferrer"}},[e._v("z80pack"),s("OutboundLink")],1),e._v(" V1.36-dev, specifically the "),s("strong",[e._v("imsaisim")]),e._v(" machine, to the "),s("a",{attrs:{href:"https://www.espressif.com/en/products/hardware/development-boards",target:"_blank",rel:"noopener noreferrer"}},[s("strong",[e._v("ESP32")]),s("OutboundLink")],1),e._v(" micro-controller targeting the ESP32-PICO-KIT")]),e._v(" "),s("p",[e._v("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.")]),e._v(" "),s("p",[e._v("To this I added")]),e._v(" "),e._m(2),e._v(" "),e._m(3),e._v(" "),s("p",[e._v("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.")]),e._v(" "),e._m(4),e._v(" "),s("p",[e._v("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.")]),e._v(" "),e._m(5),e._v(" "),e._m(6),e._v(" "),e._m(7),e._v(" "),s("p",[e._v("The best reference for the "),s("strong",[e._v("imsaisim")]),e._v(" machine is Udo Munk's "),s("a",{attrs:{href:"http://www.icl1900.co.uk/unix4fun/z80pack/",target:"_blank",rel:"noopener noreferrer"}},[e._v("z80pack"),s("OutboundLink")],1),e._v(" site.")]),e._v(" "),s("p",[e._v("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)")]),e._v(" "),e._m(8),e._v(" "),s("p",[e._v("You can see what they look like in these screen-shots.")]),e._v(" "),e._m(9),e._v(" "),s("p",[e._v("When the browser is made full-screen you would't know you were in a browser, it just feels like a desktop GUI.")]),e._v(" "),e._m(10),e._v(" "),e._m(11),e._v(" "),e._m(12),e._v(" "),s("ul",[e._m(13),e._v(" "),s("li",[e._v("you can take screen-shots of the VIO: and DZLR: with the use of a widget on the window title-bar")]),e._v(" "),s("li",[e._v('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 '),s("a",{attrs:{href:"http://bit.ly/2KVVcfHI",target:"_blank",rel:"noopener noreferrer"}},[e._v("Cromemco Dazzler working"),s("OutboundLink")],1),e._v(", so I've made this the default), with the use of a widget on the window title-bar")]),e._v(" "),s("li",[e._v("this chosen aspect-ratio is preserved in full-screen mode")]),e._v(" "),s("li",[e._v("but not when a screen-capture is taken, this is always 512x512 square pixels")])]),e._v(" "),e._m(14),e._v(" "),s("p",[e._v("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.")]),e._v(" "),e._m(15),e._v(" "),s("p",[e._v("The first batches of IMSAI 8080 replicas shipped in June 2019.")]),e._v(" "),e._m(16),e._v(" "),e._m(17),e._v(" "),e._m(18),e._v(" "),s("p",[e._v("Once a kit is available for you within the month, I will contact you to confirm your order.")]),e._v(" "),s("p",[e._v("The price for the kit is USD$300 and in addition you also pay for postage and any PayPal transaction fees.")]),e._v(" "),e._m(19),e._v(" "),s("p",[e._v("You can stay up-to-date with news about additions to this site, or new YouTube videos demonstrating the "),s("router-link",{attrs:{to:"/imsai8080/#features"}},[e._v("features")]),e._v(" listed above by following on "),s("a",{attrs:{href:"https://twitter.com/@TheHighNibble",target:"_blank",rel:"noopener noreferrer"}},[e._v("Twitter @TheHighNibble"),s("OutboundLink")],1),e._v(" and subscribing to "),s("a",{attrs:{href:"https://www.youtube.com/thehighnibble",target:"_blank",rel:"noopener noreferrer"}},[e._v("TheHighNibble YouTube Channel"),s("OutboundLink")],1)],1),e._v(" "),s("br"),e._v(" "),s("br"),e._v(" "),e._m(20),e._v(" "),s("br"),e._v(" "),e._m(21),e._v(" "),s("p",[s("a",{attrs:{href:"https://github.com/orgs/thehighnibble/discussions",target:"_blank",rel:"noopener noreferrer"}},[e._v("TheHighNibble forum"),s("OutboundLink")],1),e._v(" 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.")]),e._v(" "),e._m(22),e._v(" "),e._m(23),e._v(" "),e._m(24),e._v(" "),s("p",[e._v('17 1/8" x 7" x 2 11/16"')]),e._v(" "),s("p",[e._v("435mm x 178mm x 68mm")]),e._v(" "),s("p",[e._v("(width x height x depth)")]),e._v(" "),e._m(25),e._v(" "),s("p",[e._v("4.22 lbs")]),e._v(" "),s("p",[e._v("1.915 kg")]),e._v(" "),e._m(26),e._v(" "),s("p",[e._v("5VDC @ 500 mA (max., < 100mA typical) - USB micro-B plug required")]),e._v(" "),e._m(27),e._v(" "),s("p",[e._v('18 1/3" x 7 1/2" x 3"')]),e._v(" "),s("p",[e._v("465mm x 190mm x 75mm")]),e._v(" "),s("p",[e._v("(width x height x depth)")]),e._v(" "),e._m(28),e._v(" "),s("p",[e._v("less than 5.1 lbs")]),e._v(" "),s("p",[e._v("less than 2.3 kg")]),e._v(" "),s("h2",{attrs:{id:"bill-of-materials"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#bill-of-materials"}},[e._v("#")]),e._v(" "),s("router-link",{attrs:{to:"./bom/"}},[e._v("Bill-of-Materials")])],1),e._v(" "),s("h2",{attrs:{id:"recommended-tools-for-assembly"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#recommended-tools-for-assembly"}},[e._v("#")]),e._v(" "),s("router-link",{attrs:{to:"./tools/"}},[e._v("Recommended tools for assembly")])],1),e._v(" "),s("h2",{attrs:{id:"step-by-step-assembly-guide"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#step-by-step-assembly-guide"}},[e._v("#")]),e._v(" "),s("router-link",{attrs:{to:"./assembly/"}},[e._v("Step-by-step assembly guide")])],1),e._v(" "),s("h2",{attrs:{id:"configuration-draft"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-draft"}},[e._v("#")]),e._v(" "),s("router-link",{attrs:{to:"./configure/"}},[e._v("Configuration (draft)")])],1),e._v(" "),s("h2",{attrs:{id:"updating-software-draft"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#updating-software-draft"}},[e._v("#")]),e._v(" "),s("router-link",{attrs:{to:"./update/"}},[e._v("Updating Software (draft)")])],1),e._v(" "),s("h2",{attrs:{id:"troubleshooting-draft"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting-draft"}},[e._v("#")]),e._v(" "),s("router-link",{attrs:{to:"./troubleshooting/"}},[e._v("Troubleshooting (draft)")])],1),e._v(" "),e._m(29),e._v(" "),e._m(30),e._v(" "),s("ul",[s("li",[e._v("Add a UI on the desktop GUI for the virtual 'AT' modem")]),e._v(" "),s("li",[e._v("Add basic escape code support for formatting output on the LPT: line printer")]),e._v(" "),s("li",[s("s",[e._v("Hardware based VIO, Dazzler, VT100 terminal with VGA output and PS/2 (and maybe USB) keyboard input")]),e._v(" Done, see: "),s("router-link",{attrs:{to:"/s132/"}},[e._v("S-132 Add-on")])],1),e._v(" "),s("li",[e._v("Hardware based interface for the replica Cromemco Cyclops ACC: digital camera")])])])}),i,!1,null,null,null);t.default=a.exports},66:function(e,t,s){e.exports=s.p+"assets/img/NEW_CPA_1024.68868dcc.png"},67:function(e,t,s){e.exports=s.p+"assets/img/IMSAI_Desktop.9d18f55c.png"},68:function(e,t,s){e.exports=s.p+"assets/img/IMSAI_Printer.f3b50742.png"},69:function(e,t,s){e.exports=s.p+"assets/img/ACC_desktop.5127181a.png"},70:function(e,t,s){e.exports=s.p+"assets/img/VIO_screenshot.5c9c42ae.png"},71:function(e,t,s){e.exports=s.p+"assets/img/DZLR_screenshot.e8459bd6.png"}}]); \ No newline at end of file diff --git a/assets/js/11.ec577dca.js b/assets/js/11.ec577dca.js new file mode 100644 index 0000000..652d9cd --- /dev/null +++ b/assets/js/11.ec577dca.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{254: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:"cromemco-z-1-replica"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cromemco-z-1-replica"}},[this._v("#")]),this._v(" Cromemco Z-1 replica")])},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(62),alt:"Cromemco Z-1"}})])},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("ul",[t("li",[this._v("CP/M")]),this._v(" "),t("li",[this._v("Cromemco DOS (CDOS)")]),this._v(" "),t("li",[this._v("Cromemco Cromix (up to version 11.27)")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The Cromemco Z-1 machine emulation (Z80PACK, "),t("em",[this._v("cromemcosim")]),this._v(") includes the following emulated hardware configuration, following standard Cromemco memory and I/O port mapping:")])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("ul",[i("li",[e._v("ZPU - Z80 CPU @ 2MHz, 4MHz or Unlimited (~5MHz)")]),e._v(" "),i("li",[e._v("64KB of RAM in Bank 0")]),e._v(" "),i("li",[e._v("seven (7) additional banks of 64KB of RAM as Banks 1 to 6")]),e._v(" "),i("li",[e._v("16FDC/64FDC hybrid floppy disk controller\n"),i("ul",[i("li",[e._v("with 4 floppy disk drives (typically A: to D:)")]),e._v(" "),i("li",[e._v('that can behave as 5 1/4" or 8" drives SS/DS, SD/DD')]),e._v(" "),i("li",[e._v("based on the "),i("code",[e._v("*.dsk")]),e._v(" floppy disk image that is mounted")]),e._v(" "),i("li",[e._v("banked ROM support for RDOS ROMs")]),e._v(" "),i("li",[e._v("the console serial interface (TU-ART) as the TTY: device")]),e._v(" "),i("li",[e._v("Real Time Clock (RTC) (512ms timer)")])])]),e._v(" "),i("li",[e._v("WDI-II winchester (hard) disk interface\n"),i("ul",[i("li",[e._v("with up to 3 hard disk drives (typically hd0:, hd1: & hd2:)")]),e._v(" "),i("li",[e._v('each emulating a 10MB capacity 8" IMI-7710')]),e._v(" "),i("li",[e._v("the WDI-II will work with the CPU set to any speed as it reflects all timing relative to a 4MHz CPU")])])]),e._v(" "),i("li",[e._v("additional TU-ART communications interface with\n"),i("ul",[i("li",[e._v("two (2) additional serial interfaces as the TTY2: and TTY3: devices")]),e._v(" "),i("li",[e._v("two (2) parallel printers as lpt1 (LPT:) and lpt2 devices")])])]),e._v(" "),i("li",[e._v("Dazzler graphics")]),e._v(" "),i("li",[e._v("D+7A I/O with joystick input support")])])},function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("ul",[i("li",[e._v("3 simulated TTY terminals (VT100 &/or Cromemco 3102 Video Terminal compatible)")]),e._v(" "),i("li",[e._v("1 line printer, 80/132 column selectable")]),e._v(" "),i("li",[e._v('4 simulated 8" floppy disks')]),e._v(" "),i("li",[e._v("Cromemco Dazzler graphics interface")]),e._v(" "),i("li",[e._v("Cromemco D+7A I/O including JS-1 joystick emulation (from connected USB joystick)")]),e._v(" "),i("li",[e._v("Paper tape punch/reader")]),e._v(" "),i("li",[e._v("Manuals library")]),e._v(" "),i("li",[e._v("Disks library")]),e._v(" "),i("li",[e._v("Paper tapes library")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("img",{attrs:{src:i(63),alt:"Web Desktop UI"}})])},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("div",{staticClass:"warning custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("Please note:")]),this._v(" "),t("p",[this._v("The hardware kit is available complete with the Cromemco Z-1 facia panel (see: the "),t("a",{attrs:{href:"#bill-of-materials"}},[this._v("Bill-of-Materials")]),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("Update")]),this._v(" "),t("p",[this._v("As of November 2024, kits are available again.")]),this._v(" "),t("p",[this._v("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.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"expression-of-interest"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#expression-of-interest"}},[this._v("#")]),this._v(" Expression of interest")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("I am accepting expressions of interest via email. If you send email to "),t("a",{attrs:{href:"mailto:info@thehighnibble.com"}},[this._v("info@thehighnibble.com")]),this._v(" I will add you to the list.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Please specify that you are interested in the "),t("strong",[this._v("Cromemco Z-1 replica")]),this._v(".")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"news-updates"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#news-updates"}},[this._v("#")]),this._v(" News & Updates")])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"socials"},[t("a",{attrs:{href:"https://twitter.com/@TheHighNibble",target:"_blank",rel:"noopener noreferrer"}},[t("img",{staticClass:"social",attrs:{src:"/img/twitter.png"}})]),this._v(" "),t("a",{attrs:{href:"https://www.youtube.com/thehighnibble",target:"_blank",rel:"noopener noreferrer"}},[t("img",{staticClass:"social",attrs:{src:"/img/youtube.png"}})])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"forum"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#forum"}},[this._v("#")]),this._v(" Forum")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Membership requires you to have GitHub account. Email to "),t("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 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("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("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)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"bill-of-materials"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bill-of-materials"}},[this._v("#")]),this._v(" Bill-of-Materials")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("Here is a side-by-side image of the two facias so that you can see the differences.\n"),t("img",{attrs:{src:i(64),alt:"Facia side-by-side"}})])},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 difference in colour is just my bad photography and lighting: they are both matt black .")])])},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("Please Note")]),this._v(" "),t("p",[this._v("I will only supply one facia with the kit, please don't ask for both.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"updating-software"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#updating-software"}},[this._v("#")]),this._v(" Updating Software")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"enhancements-and-add-ons"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enhancements-and-add-ons"}},[this._v("#")]),this._v(" Enhancements and Add-ons")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"planned"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#planned"}},[this._v("#")]),this._v(" Planned")])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[this._v("emulated Cromemco SDI - Super Dazzler Interface (hi-res graphics adapter)")])])}],a=i(0),s=Object(a.a)({},(function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"content"},[e._m(0),e._v(" "),e._m(1),e._v(" "),i("p",[i("a",{attrs:{href:"https://en.wikipedia.org/wiki/Cromemco",target:"_blank",rel:"noopener noreferrer"}},[e._v("Cromemco"),i("OutboundLink")],1),e._v(" was a notably more successful microcomputer manufacturer than "),i("a",{attrs:{href:"https://en.wikipedia.org/wiki/IMS_Associates,_Inc.",target:"_blank",rel:"noopener noreferrer"}},[e._v("IMSAI"),i("OutboundLink")],1),e._v(", despite the iconic status of the "),i("a",{attrs:{href:"https://en.wikipedia.org/wiki/IMSAI_8080",target:"_blank",rel:"noopener noreferrer"}},[e._v("IMSAI 8080"),i("OutboundLink")],1),e._v(".")]),e._v(" "),i("p",[e._v("Initially producing add-on cards and peripherals for other S-100 computers, notably the "),i("a",{attrs:{href:"https://en.wikipedia.org/wiki/Cromemco_Cyclops",target:"_blank",rel:"noopener noreferrer"}},[e._v("Cyclops Camera"),i("OutboundLink")],1),e._v(", "),i("a",{attrs:{href:"https://en.wikipedia.org/wiki/Cromemco_Dazzler",target:"_blank",rel:"noopener noreferrer"}},[e._v("Dazzler"),i("OutboundLink")],1),e._v(" graphics interface and "),i("a",{attrs:{href:"http://www.s100computers.com/Hardware%20Folder/Cromemco/D+7IO/D+7IO.htm",target:"_blank",rel:"noopener noreferrer"}},[e._v("D+7A"),i("OutboundLink")],1),e._v(" 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.")]),e._v(" "),i("p",[e._v("Their first complete microcomputer was the "),i("a",{attrs:{href:"https://deramp.com/downloads/mfe_archive/010-S100%20Computers%20and%20Boards/00-Cromemco/80-Cromemco%20Brochures%20and%20Literature/1976%20Cromemco%20Z1.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("Cromemco Z-1"),i("OutboundLink")],1)]),e._v(" "),e._m(2),e._v(" "),i("p",[e._v("From its appearance you might think it is just a rebadged IMSAI 8080, but that is not the case (no pun intended).")]),e._v(" "),i("p",[e._v("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 "),i("a",{attrs:{href:"http://www.s100computers.com/Hardware%20Folder/Cromemco/Z80/ZPU.htm",target:"_blank",rel:"noopener noreferrer"}},[e._v("ZPU"),i("OutboundLink")],1),e._v(" CPU board powered by the Zilog Z80 microprocessor.")]),e._v(" "),i("p",[e._v("Although this computer could run CP/M, Cromemco produced their own CP/M (v1.33) like operating system, Cromemco DOS, "),i("a",{attrs:{href:"https://en.wikipedia.org/wiki/Cromemco_DOS",target:"_blank",rel:"noopener noreferrer"}},[e._v("CDOS"),i("OutboundLink")],1),e._v(".")]),e._v(" "),i("p",[e._v("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.")]),e._v(" "),i("p",[e._v("What you see in the photo above is the Cromemco Z-1 replica kit produced by TheHighNibble. Identical to the "),i("router-link",{attrs:{to:"./../imsai8080/"}},[e._v("IMSAI 8080 replica")]),e._v(" kit except for the text and logos on the front facia (see: the "),i("a",{attrs:{href:"#bill-of-materials"}},[e._v("Bill-of-Materials")]),e._v(".")],1),e._v(" "),i("p",[e._v("Also powered by Udo Munk's "),i("a",{attrs:{href:"http://bit.ly/Z80pack",target:"_blank",rel:"noopener noreferrer"}},[e._v("z80pack"),i("OutboundLink")],1),e._v(", specifically the "),i("strong",[e._v("cromemcosim")]),e._v(" machine, running on the "),i("a",{attrs:{href:"https://www.espressif.com/en/products/hardware/development-boards",target:"_blank",rel:"noopener noreferrer"}},[i("strong",[e._v("ESP32")]),i("OutboundLink")],1),e._v(" micro-controller targeting the ESP32-PICO-KIT.")]),e._v(" "),e._m(3),e._v(" "),i("p",[e._v("The Cromemco Z-1 replica can run:")]),e._v(" "),e._m(4),e._v(" "),i("p",[e._v('on a simulated Z80 microprocessor at 2 or 4 MHz (or "unlimited" at approximately 5MHz), with up to 8 banks of 64KB of RAM.')]),e._v(" "),i("p",[e._v("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.")]),e._v(" "),e._m(5),e._v(" "),e._m(6),e._v(" "),i("p",[e._v("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:")]),e._v(" "),e._m(7),e._v(" "),e._m(8),e._v(" "),e._m(9),e._v(" "),i("p",[e._v("The Cromemco Z-1 replica has been available to order and in production since October 2022.")]),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(" "),i("p",[e._v("Once a kit is available for you within the month, I will contact you to confirm your order.")]),e._v(" "),i("p",[e._v("The price for the kit is USD$300 and in addition you also pay for postage and any PayPal transaction fees.")]),e._v(" "),e._m(15),e._v(" "),i("p",[e._v("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 "),i("a",{attrs:{href:"https://twitter.com/@TheHighNibble",target:"_blank",rel:"noopener noreferrer"}},[e._v("Twitter @TheHighNibble"),i("OutboundLink")],1),e._v(" and subscribing to "),i("a",{attrs:{href:"https://www.youtube.com/thehighnibble",target:"_blank",rel:"noopener noreferrer"}},[e._v("TheHighNibble YouTube Channel"),i("OutboundLink")],1)]),e._v(" "),i("br"),e._v(" "),i("br"),e._v(" "),e._m(16),e._v(" "),i("br"),e._v(" "),e._m(17),e._v(" "),i("p",[i("a",{attrs:{href:"https://github.com/orgs/thehighnibble/discussions",target:"_blank",rel:"noopener noreferrer"}},[e._v("TheHighNibble forum"),i("OutboundLink")],1),e._v(" 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.")]),e._v(" "),e._m(18),e._v(" "),e._m(19),e._v(" "),e._m(20),e._v(" "),i("p",[e._v('17 1/8" x 7" x 2 11/16"')]),e._v(" "),i("p",[e._v("435mm x 178mm x 68mm")]),e._v(" "),i("p",[e._v("(width x height x depth)")]),e._v(" "),e._m(21),e._v(" "),i("p",[e._v("4.22 lbs")]),e._v(" "),i("p",[e._v("1.915 kg")]),e._v(" "),e._m(22),e._v(" "),i("p",[e._v("5VDC @ 500 mA (max., < 100mA typical) - USB micro-B plug required")]),e._v(" "),e._m(23),e._v(" "),i("p",[e._v('18 1/3" x 7 1/2" x 3"')]),e._v(" "),i("p",[e._v("465mm x 190mm x 75mm")]),e._v(" "),i("p",[e._v("(width x height x depth)")]),e._v(" "),e._m(24),e._v(" "),i("p",[e._v("less than 5.1 lbs")]),e._v(" "),i("p",[e._v("less than 2.3 kg")]),e._v(" "),e._m(25),e._v(" "),i("p",[e._v("The Bill-of-Materials for the Cromemco Z-1 replica is the same as for the IMSAI8080 replica "),i("router-link",{attrs:{to:"./../imsai8080/bom/"}},[e._v("Bill-of-Materials")]),e._v("\nwith the exception of the front panel facia.")],1),e._v(" "),e._m(26),e._v(" "),e._m(27),e._v(" "),e._m(28),e._v(" "),i("h2",{attrs:{id:"recommended-tools-for-assembly"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#recommended-tools-for-assembly"}},[e._v("#")]),e._v(" "),i("router-link",{attrs:{to:"./../imsai8080/tools/"}},[e._v("Recommended tools for assembly")])],1),e._v(" "),i("h2",{attrs:{id:"step-by-step-assembly-guide"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#step-by-step-assembly-guide"}},[e._v("#")]),e._v(" "),i("router-link",{attrs:{to:"./../imsai8080/assembly/"}},[e._v("Step-by-step assembly guide")])],1),e._v(" "),i("h2",{attrs:{id:"configuration"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[e._v("#")]),e._v(" "),i("router-link",{attrs:{to:"./configure/"}},[e._v("Configuration")])],1),e._v(" "),e._m(29),e._v(" "),i("p",[e._v("The ESP32 can be reflashed (using "),i("router-link",{attrs:{to:"./../imsai8080/update/#updating-the-firmware"}},[e._v("Over The Air")]),e._v(" updates) with the Cromemco Z-1 firmware.")],1),e._v(" "),i("div",{staticClass:"tip custom-block"},[i("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),i("p",[e._v("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.")]),e._v(" "),i("p",[e._v("The microSD card image has separate folders for maintaining the files for each machine, and each machine also maintains its own "),i("router-link",{attrs:{to:"./configure/#startup-configuration-non-volatile-storage-nvs"}},[e._v("Startup Configuration in Non-volatile storage, NVS")])],1)]),e._v(" "),i("h2",{attrs:{id:"troubleshooting-draft"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting-draft"}},[e._v("#")]),e._v(" "),i("router-link",{attrs:{to:"./../imsai8080/troubleshooting/"}},[e._v("Troubleshooting (draft)")])],1),e._v(" "),e._m(30),e._v(" "),e._m(31),e._v(" "),e._m(32)])}),r,!1,null,null,null);t.default=s.exports},62:function(e,t,i){e.exports=i.p+"assets/img/Z1_CPA.17189896.png"},63:function(e,t,i){e.exports=i.p+"assets/img/WebUI.7fea8b99.png"},64:function(e,t,i){e.exports=i.p+"assets/img/facias.aa29d227.png"}}]); \ No newline at end of file diff --git a/assets/js/12.7c10a1e9.js b/assets/js/12.7c10a1e9.js new file mode 100644 index 0000000..6f42e13 --- /dev/null +++ b/assets/js/12.7c10a1e9.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{252:function(t,e,n){"use strict";n.r(e);var p={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:(t,{props:e,slots:n})=>t("span",{class:["badge",e.type,e.vertical]},e.text||n().default)},i=(n(61),n(0)),a=Object(i.a)(p,void 0,void 0,!1,null,"099ab69c",null);e.default=a.exports},55:function(t,e,n){},61:function(t,e,n){"use strict";n(55)}}]); \ No newline at end of file diff --git a/assets/js/13.1cf8bcce.js b/assets/js/13.1cf8bcce.js new file mode 100644 index 0000000..ad01508 --- /dev/null +++ b/assets/js/13.1cf8bcce.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{219:function(e,t,r){e.exports=r.p+"assets/img/SA_Patch_Straight.e1f44e17.jpg"},220:function(e,t,r){e.exports=r.p+"assets/img/SA_Patch_Cross.54270ac3.jpg"},274:function(e,t,r){"use strict";r.r(t);var o=r(0),s=Object(o.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("div",{staticClass:"tip custom-block"},[o("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),o("p",[e._v("If you are unsure, or unfamiliar with soldering the Surface Mount Device SMD components, there is an excellent series of five (5) "),o("a",{attrs:{href:"https://www.youtube.com/playlist?list=PLADkYVZqAxdO1fTDprnp_jRCTQ-9n1OIV",target:"_blank",rel:"noopener noreferrer"}},[e._v("videos on YouTube produced by The ShadowTron Blog"),o("OutboundLink")],1),e._v(" that walk you through the assembly and soldering of the VT132.")])]),e._v(" "),e._m(2),e._v(" "),e._m(3),e._v(" "),e._m(4),e._v(" "),o("p",[e._v("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 "),o("router-link",{attrs:{to:"/vt132/bom/"}},[e._v("Bill-of-Materials")]),e._v(" should provide sufficient information to assemble a working VT132.")],1),e._v(" "),e._m(5),e._v(" "),e._m(6),e._v(" "),o("p",[e._v("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 "),o("router-link",{attrs:{to:"/vt132/bom/"}},[e._v("Bill-of-Materials")]),e._v(" should provide sufficient information to assemble a working VT132.")],1),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("The 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:")]),e._v(" "),e._m(11),e._v(" "),o("p",[e._v("I recommend you watch the "),o("a",{attrs:{href:"https://youtu.be/02tlehBJUas",target:"_blank",rel:"noopener noreferrer"}},[e._v("YouTube video"),o("OutboundLink")],1),e._v(" on assembling and attaching the USB interface for the best results.")]),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(" "),o("p",[e._v("There is minimal hardware configuration that needs to be performed on the VT132")]),e._v(" "),o("p",[e._v("For normal operation on the RC2014 Pro bus (or similar) both the Port A and Port B UARTS from an existing serial card ("),o("a",{attrs:{href:"https://rc2014.co.uk/modules/dual-serial-module-sio2/",target:"_blank",rel:"noopener noreferrer"}},[e._v("RC2014 Dual Serial"),o("OutboundLink")],1),e._v(", or similar) should be enabled by placing shunts on the 4 jumpers JP1 to JP4 (RxA/TxA and RxB/TxB)")]),e._v(" "),e._m(17),e._v(" "),e._m(18),e._v(" "),e._m(19),e._v(" "),o("ul",[o("li",[e._v("provides RTS/CTS flow-control lines, when enabled for the modem")]),e._v(" "),o("li",[e._v("is designed to be compatible with serial cards such as the "),o("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"),o("OutboundLink")],1),e._v(" or similar")])]),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(" "),o("p",[e._v("There are six (6) different 2-pin, horizontal headers on the PCB for selecting power options.")]),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(" "),o("img",{attrs:{src:r(219),width:"360",alt:"Stand Alone Patch stright-through"}}),e._v(" "),o("img",{attrs:{src:r(220),width:"360",alt:"Stand Alone Patch cross-over"}}),e._v(" "),e._m(31),e._v(" "),e._m(32),e._v(" "),e._m(33),e._v(" "),o("p",[e._v("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.")]),e._v(" "),o("p",[e._v("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.")]),e._v(" "),e._m(34),e._v(" "),o("h2",{attrs:{id:"vt132-quick-reference-guide-print-ready-pdf"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#vt132-quick-reference-guide-print-ready-pdf"}},[e._v("#")]),e._v(" "),o("a",{attrs:{href:"https://git.imzadi.de/acn/vt132-quickref/src/master/vt132.pdf",target:"_blank",rel:"noopener noreferrer"}},[e._v("VT132 Quick Reference Guide"),o("OutboundLink")],1),e._v(" Print-ready PDF")]),e._v(" "),e._m(35),e._v(" "),o("p",[e._v("This is a living document and will be updated regularly as required.")]),e._v(" "),o("h2",{attrs:{id:"vt100-enhanced-operator-information"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#vt100-enhanced-operator-information"}},[e._v("#")]),e._v(" "),o("router-link",{attrs:{to:"./vt100/operator/"}},[e._v("VT100 (enhanced) Operator Information")])],1),e._v(" "),o("h2",{attrs:{id:"vt100-enhanced-programmer-information"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#vt100-enhanced-programmer-information"}},[e._v("#")]),e._v(" "),o("router-link",{attrs:{to:"./vt100/programmer/"}},[e._v("VT100 (enhanced) Programmer Information")])],1),e._v(" "),o("h2",{attrs:{id:"vt100-enhanced-quick-menu-guide"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#vt100-enhanced-quick-menu-guide"}},[e._v("#")]),e._v(" "),o("router-link",{attrs:{to:"./vt100/operator/quick-menu/"}},[e._v("VT100 (enhanced) Quick Menu Guide")])],1),e._v(" "),o("h2",{attrs:{id:"at-hayes-serial-modem-operation-manual"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#at-hayes-serial-modem-operation-manual"}},[e._v("#")]),e._v(" "),o("router-link",{attrs:{to:"./modem/"}},[e._v("'AT' (Hayes) Serial Modem Operation Manual")])],1),e._v(" "),o("h2",{attrs:{id:"over-the-air-ota-firmware-update-guide"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#over-the-air-ota-firmware-update-guide"}},[e._v("#")]),e._v(" "),o("router-link",{attrs:{to:"./ota/"}},[e._v("Over-the-Air (OTA) Firmware Update Guide")])],1),e._v(" "),o("h2",{attrs:{id:"usb-host-controller-uhc-firmware-update-guide"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#usb-host-controller-uhc-firmware-update-guide"}},[e._v("#")]),e._v(" "),o("router-link",{attrs:{to:"./uhc/"}},[e._v("USB Host Controller (UHC) Firmware Update Guide")])],1)])}),[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{attrs:{id:"vt132-operation-manual-draft"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vt132-operation-manual-draft"}},[this._v("#")]),this._v(" VT132 Operation Manual (Draft)")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"assembly"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#assembly"}},[this._v("#")]),this._v(" Assembly")])},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 large, square ground pad under the ESP32 module "),t("strong",[this._v("does NOT need to be soldered")]),this._v(".\nThis 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).")]),this._v(" "),t("p",[this._v("It can provide additional thermal relief for the ESP32 module but this is generally not required.\nThe pad can be soldered if using SMT reflow soldering techniques eg. solder paste and a reflow oven.")])])},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 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.")])])},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,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"warning custom-block"},[r("p",{staticClass:"custom-block-title"},[e._v("Locating the VT132 in the RC2014 backplane")]),e._v(" "),r("p",[e._v("It was noted during the Beta testing that owing to the "),r("em",[e._v("height")]),e._v(" of the PS/2 keyboard connector, some thought must be given to which slot in the RC2014 backplane you place the VT132.")]),e._v(" "),r("p",[e._v("Slot 1 in the "),r("strong",[e._v("Backplane Pro")]),e._v(" 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.")]),e._v(" "),r("p",[e._v("Some suggested adding electrical insulation tape over the PS/2 connector shell to insulate it from an adjacent PCB.")])])},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("p",[this._v("A number of components are optional on the "),t("strong",[this._v("VT132 Stand Alone edition")]),this._v(" as follows:")])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ul",[r("li",[e._v("DC barrel jack\n"),r("ul",[r("li",[e._v("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)")])])]),e._v(" "),r("li",[e._v("LM7805 linear power regulator and accompanying capacitors (10µF and 100µF electrolytic)\n"),r("ul",[r("li",[e._v("only required if you want to power the VT132 from a DC voltage source other then +5VDC ie. +8VDC to +12VDC")])])]),e._v(" "),r("li",[e._v("MAX3232 ICs & sockets and accompanying capacitors (5 x 100nF ceramic, per MAX3232)\n"),r("ul",[r("li",[e._v("only required if you want "),r("strong",[e._v("RS-232/EIA")]),e._v(" level serial communications over the DTE and DCE connectors")]),e._v(" "),r("li",[e._v("not required if you only want "),r("strong",[e._v("TTL")]),e._v(" level serial communications over the 6-pin straight headers")])])]),e._v(" "),r("li",[e._v("DB25 (F) DTE, DE9 (M) DTE connectors for the terminal\n"),r("ul",[r("li",[e._v("you need only install one or both of these connectors as required for your setup")])])]),e._v(" "),r("li",[e._v("DB25 (M) DCE, DE9 (F) DCE connectors for the modem\n"),r("ul",[r("li",[e._v("you need only install one or both of these connectors as required for your setup")])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"new-usb-daughter-board-red-pcb-for-usb-hid-keyboards"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#new-usb-daughter-board-red-pcb-for-usb-hid-keyboards"}},[this._v("#")]),this._v(" New: USB daughter board (Red PCB) for USB-HID keyboards")])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"warning custom-block"},[r("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),r("p",[e._v("If you are building the VT132 with USB keyboard support "),r("strong",[e._v("DO NOT")]),e._v(" install the:")]),e._v(" "),r("ul",[r("li",[e._v("PS/2 keyboard connector")]),e._v(" "),r("li",[r("code",[e._v("2 x 120 ohm")]),e._v(" and "),r("code",[e._v("2 x 2K ohm")]),e._v(" resistors immediately behind the PS/2 keyboard connector footprint")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[this._v("USB Type-A connector")]),this._v(" "),t("li",[this._v("6-pin male header, for connecting the USB daughter board (Red PCB) to the main VT132 PCB (White: RC2014, Black: Stand Alone)")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h2",{attrs:{id:"hardware-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#hardware-configuration"}},[this._v("#")]),this._v(" Hardware configuration")])},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("NVR (Non-volatile RAM) is not initialized on a new VT132")]),this._v(" "),t("ul",[t("li",[this._v("At power-on or reset, following the 'Wait' message, a new VT132 will display 'Error' along with a series of bells")]),this._v(" "),t("li",[this._v("This is expected because the NVR has not been initialized")]),this._v(" "),t("li",[this._v("Once you write settings to the NVR (see Setup Screens) this error should not persist")])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"danger custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("Hardware reset")]),this._v(" "),t("ul",[t("li",[this._v("The hardware 'Reset' press button on the PCB reboots the ESP32 (EN line reset)")]),this._v(" "),t("li",[this._v("This will cause both the VT100 terminal and the modem to reset")]),this._v(" "),t("li",[this._v("and will lose any unsaved settings on both devices")])])])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"tip custom-block"},[r("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),r("ul",[r("li",[e._v("The hardware 'Prog' press button has two functions:\n"),r("ul",[r("li",[e._v("if flashing firmware to the ESP32 module over the FTDI connector this button grounds the 'BOOT' line (pin 25) for programming")]),e._v(" "),r("li",[e._v("in "),r("strong",[e._v("normal operation")]),e._v(" pressing this button changes the baud rate of the modem\n"),r("ul",[r("li",[e._v("each press cycles to the next supported serial baud rate of the modem (4800, 9600, 14400, 19200, 38400, 57600, 1152000)")]),e._v(" "),r("li",[e._v("the selected speed is echoed in a message to the modem UART eg. "),r("code",[e._v("BAUD 19200")])]),e._v(" "),r("li",[e._v("you should keep pressing the button until you see the desired baud rate displayed")]),e._v(" "),r("li",[e._v("the selected speed is stored in NVRAM and persists through resets and power cycling")])])])])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{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("p",[this._v("The "),t("code",[this._v("FTDI Program")]),this._v(" 6-pin header on the top of the PCB "),t("strong",[this._v("is not")]),this._v(" connected to Port A on the RC2014 Pro bus. It is connected to a separate UART on the ESP32 and is only used for")])},function(){var e=this.$createElement,t=this._self._c||e;return t("ul",[t("li",[this._v("updating/re-flashing the firmware on the ESP32")]),this._v(" "),t("li",[this._v("monitoring debug logs from the ESP32")]),this._v(" "),t("li",[this._v("future expansion")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("code",[this._v("Modem Port B")]),this._v(" 6-pin header on the top of the PCB "),t("strong",[this._v("is")]),this._v(" connected to Port B Rx/Tx lines on the RC2014 Pro bus. In addition it:")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("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 "),t("code",[this._v("Vcc")]),this._v(" pin in the "),t("code",[this._v("FTDI Program")]),this._v(" and "),t("code",[this._v("Modem Port B")]),this._v(" 6-pin headers respectively.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"danger custom-block"},[t("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),t("p",[this._v("You should normally only connect one power source to the system at a time.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{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.$createElement,t=this._self._c||e;return t("p",[this._v("There are significantly more hardware configuration options on the "),t("strong",[this._v("VT132 Stand Alone edition")]),this._v(". As noted "),t("a",{attrs:{href:"#vt132-stand-alone-edition"}},[this._v("above")]),this._v(" you need only install a number of optional components as required for your setup. "),t("strong",[this._v("All")]),this._v(" the optional components can be installed together if you want the maximum flexibility.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"power-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#power-configuration"}},[this._v("#")]),this._v(" Power configuration")])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"danger custom-block"},[r("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),r("p",[e._v("In most configurations only one (1) of these jumpers should be in place. Only connect more than one (1) if you have consulted the "),r("a",{attrs:{href:"#vt132-stand-alone-schematic"}},[e._v("schematic diagram")]),e._v(" and made an informed decision to configure power in a specific configuration.")]),e._v(" "),r("p",[e._v("If you use "),r("code",[e._v("JP6")]),e._v(" to bypass the LM7805 5VDC linear power regulator, it is your responsibility to ensure you are providing regulated +5VDC to the VT132.")])])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ul",[r("li",[r("code",[e._v("JP6")]),e._v(" "),r("strong",[e._v("(5V Select)")]),e._v(" bypasses the LM7805 5VDC linear power regulator and should "),r("strong",[e._v("only")]),e._v(" be put in place if you are supplying "),r("strong",[e._v("regulated +5VDC")]),e._v(" to the VT132 via the DC Barrel Jack or one of the EIA serial connectors for the modem (DCE) or the terminal (DTE)")]),e._v(" "),r("li",[r("code",[e._v("JP5")]),e._v(" "),r("strong",[e._v("(FTDI Power Vcc)")]),e._v(" allows +5VDC power to be taken (or given) over the 6-pin "),r("strong",[e._v("FTDI Program")]),e._v(" header")]),e._v(" "),r("li",[r("code",[e._v("JP4")]),e._v(" "),r("strong",[e._v("(5V Vcc)")]),e._v(" allows +5VDC power to be taken (or given) over the 6-pin "),r("strong",[e._v("Modem TTL")]),e._v(" header")]),e._v(" "),r("li",[r("code",[e._v("JP3")]),e._v(" "),r("strong",[e._v("(5V Vcc)")]),e._v(" allows +5VDC power to be taken (or given) over the 6-pin "),r("strong",[e._v("Terminal TTL")]),e._v(" header")]),e._v(" "),r("li",[r("code",[e._v("JP2")]),e._v(" "),r("strong",[e._v("(+VDC)")]),e._v(" allows unregulated power to be taken (or given) over the 3x2-pin "),r("strong",[e._v("DCE - EIA Modem")]),e._v(" header or the Modem DB25/DE9 RS-232 serial connectors")]),e._v(" "),r("li",[r("code",[e._v("JP1")]),e._v(" "),r("strong",[e._v("(+VDC)")]),e._v(" allows unregulated power to be taken (or given) over the 3x2-pin "),r("strong",[e._v("DTE - EIA Terminal")]),e._v(" header or the Terminal DB25/DE9 RS-232 serial connectors")])])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"tip custom-block"},[r("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),r("p",[e._v("The supplied DC Barrel Jack and the PCB layout is configured for "),r("strong",[e._v("center-pin-positive")]),e._v(".")]),e._v(" "),r("p",[e._v("For the DB25/DE9 RS-232 serial connectors, "),r("strong",[e._v("Pin 9")]),e._v(" (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 "),r("code",[e._v("JP6")]),e._v(".")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"serial-communications-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#serial-communications-configuration"}},[this._v("#")]),this._v(" Serial communications configuration")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("There is a 12-pin (6 x 2) header under the MAX3232 ICs labelled "),t("code",[this._v("Patch")]),this._v(" that must be configured for pass-through &/or cross-over connection of each pair of RS-232/EIA signals by using "),t("code",[this._v("shunts")]),this._v(" to jumper the pins in pairs as follows:")])},function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("table",[r("thead",[r("tr",[r("th",[e._v("Pins")]),e._v(" "),r("th",[e._v("Device")]),e._v(" "),r("th",[e._v("Signal")]),e._v(" "),r("th",[e._v("Mode")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("1-2")]),e._v(" "),r("td",[e._v("Terminal")]),e._v(" "),r("td",[e._v("Tx")]),e._v(" "),r("td",[e._v("straight-through")])]),e._v(" "),r("tr",[r("td",[e._v("3-4")]),e._v(" "),r("td",[e._v("Terminal")]),e._v(" "),r("td",[e._v("Rx")]),e._v(" "),r("td",[e._v("straight-through")])]),e._v(" "),r("tr",[r("td",[e._v("1-3")]),e._v(" "),r("td",[e._v("Terminal")]),e._v(" "),r("td",[e._v("Tx")]),e._v(" "),r("td",[e._v("cross-over")])]),e._v(" "),r("tr",[r("td",[e._v("2-4")]),e._v(" "),r("td",[e._v("Terminal")]),e._v(" "),r("td",[e._v("Rx")]),e._v(" "),r("td",[e._v("cross-over")])]),e._v(" "),r("tr",[r("td",[e._v("5-6")]),e._v(" "),r("td",[e._v("Modem")]),e._v(" "),r("td",[e._v("Tx")]),e._v(" "),r("td",[e._v("straight-through")])]),e._v(" "),r("tr",[r("td",[e._v("7-8")]),e._v(" "),r("td",[e._v("Modem")]),e._v(" "),r("td",[e._v("Rx")]),e._v(" "),r("td",[e._v("straight-through")])]),e._v(" "),r("tr",[r("td",[e._v("5-7")]),e._v(" "),r("td",[e._v("Modem")]),e._v(" "),r("td",[e._v("Tx")]),e._v(" "),r("td",[e._v("cross-over")])]),e._v(" "),r("tr",[r("td",[e._v("6-8")]),e._v(" "),r("td",[e._v("Modem")]),e._v(" "),r("td",[e._v("Rx")]),e._v(" "),r("td",[e._v("cross-over")])]),e._v(" "),r("tr",[r("td",[e._v("9-10")]),e._v(" "),r("td",[e._v("Modem")]),e._v(" "),r("td",[e._v("CTS")]),e._v(" "),r("td",[e._v("straight-through")])]),e._v(" "),r("tr",[r("td",[e._v("11-12")]),e._v(" "),r("td",[e._v("Modem")]),e._v(" "),r("td",[e._v("RTS")]),e._v(" "),r("td",[e._v("straight-through")])]),e._v(" "),r("tr",[r("td",[e._v("9-11")]),e._v(" "),r("td",[e._v("Modem")]),e._v(" "),r("td",[e._v("CTS")]),e._v(" "),r("td",[e._v("cross-over")])]),e._v(" "),r("tr",[r("td",[e._v("10-12")]),e._v(" "),r("td",[e._v("Modem")]),e._v(" "),r("td",[e._v("RTS")]),e._v(" "),r("td",[e._v("cross-over")])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h4",{attrs:{id:"vt132-stand-alone-schematic"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vt132-stand-alone-schematic"}},[this._v("#")]),this._v(" VT132 Stand Alone schematic")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[t("a",{attrs:{href:"/img/VT132-SA.pdf"}},[t("img",{attrs:{src:"/img/VT132-SA.png",width:"360",alt:"VT132 Stand Alone Schematic"}})])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"usb-daughter-board-red-pcb-for-usb-hid-keyboards"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usb-daughter-board-red-pcb-for-usb-hid-keyboards"}},[this._v("#")]),this._v(" USB daughter board (Red PCB) for USB-HID keyboards")])},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("In rare circumstances the USB interface can lock-up and become unresponsive. In this case you may need to "),t("strong",[this._v("reset")]),this._v(" the VT132 with the "),t("code",[this._v("Reset")]),this._v(" push button near the ESP32 or sometimes it will require you to power cycle the VT132.")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("One of the VT132 Beta testers, ACN, prepared this print-ready, PDF, Quick Reference Guide for you.\nThe site hosts the source in "),t("em",[this._v("LaTeX")]),this._v(" and a copy of the published PDF file.")])}],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/14.19ffffca.js b/assets/js/14.19ffffca.js new file mode 100644 index 0000000..bf7fa16 --- /dev/null +++ b/assets/js/14.19ffffca.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{231:function(e,t,s){e.exports=s.p+"assets/img/SetupA_help.74984ac6.jpg"},232:function(e,t,s){e.exports=s.p+"assets/img/SetupB_help.bcacca03.jpg"},278:function(e,t,s){"use strict";s.r(t);var n=[function(){var e=this.$createElement,t=this._self._c||e;return t("h1",{attrs:{id:"vt100-enhanced-operator-information-draft"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#vt100-enhanced-operator-information-draft"}},[this._v("#")]),this._v(" VT100 (enhanced) Operator Information (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("ul",[t("li",[this._v("many are features of later DEC VT family terminals that have been implemented for convenience")]),this._v(" "),t("li",[this._v('some are features of "standard" ANSI terminals (mainly IBM PC/MS DOS based terminal emulators)')]),this._v(" "),t("li",[this._v("enhancements are highlighted by the addition of "),t("em",[this._v("(enhancement)")]),this._v(" to the heading or description")])])},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("Each heading is a link to the corresponding section of Chapter 1 of the original VT100 Users Guide")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("h3",{attrs:{id:"key-and-indicator-mappings-for-the-pc-keyboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#key-and-indicator-mappings-for-the-pc-keyboard"}},[this._v("#")]),this._v(" Key and indicator mappings for the PC keyboard")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("code",[this._v("SETUP")]),this._v(" key is mapped to "),t("code",[this._v("")]),this._v(" or "),t("code",[this._v("")])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("code",[this._v("ONLINE")]),this._v(" and "),t("code",[this._v("LOCAL")]),this._v(" indicators are not shown on a PC keyboard but the mode is shown in the SET-UP screens by a visual "),t("a",{attrs:{href:"#online-local-indicator"}},[this._v("ONLINE/LOCAL")]),this._v(" indicator.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("code",[this._v("KEYBOARD LOCKED")]),this._v(" indicator and the keyboard lock function "),t("strong",[this._v("are not implemented")]),this._v(" by the VT132.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("code",[this._v("L1-L4")]),this._v(" indicators "),t("strong",[this._v("are not implemented")]),this._v(" by the VT132.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("code",[this._v("BACKSPACE")]),this._v(" key transmits the code for backspace set by the "),t("a",{attrs:{href:"###"}},[this._v("DECBKM")]),this._v(" Backarrow Key Mode "),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("BREAK")]),this._v(" key function "),t("strong",[this._v("is not implemented")]),this._v(" by the VT132.")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("code",[this._v("PF1-PF4")]),this._v(" keys are mapped to "),t("code",[this._v("F1-F4")]),this._v(".")])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("code",[this._v("F5-F12")]),this._v(" keys transmit ANSI escape sequences for these additional function keys "),t("em",[this._v("(enhancement)")]),this._v(".")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ul",[s("li",[e._v("Also generates escape codes for function keys "),s("code",[e._v("")]),e._v(" to "),s("code",[e._v("")]),e._v(" using "),s("code",[e._v("")]),e._v(" through "),s("code",[e._v("")])]),e._v(" "),s("li",[e._v("this makes the physical "),s("code",[e._v("")]),e._v(" and "),s("code",[e._v("")]),e._v(" the same, and also "),s("code",[e._v("")]),e._v(" and "),s("code",[e._v("")])]),e._v(" "),s("li",[e._v("escape codes transmitted follow the VT220 format:\n"),s("ul",[s("li",[e._v("F11 ESC [ 23 ~ (as existing)")]),e._v(" "),s("li",[e._v("F12 ESC [ 24 ~ (as existing)")]),e._v(" "),s("li",[e._v("F13 ESC [ 25 ~")]),e._v(" "),s("li",[e._v("F14 ESC [ 26 ~")]),e._v(" "),s("li",[e._v("F15 ESC [ 28 ~")]),e._v(" "),s("li",[e._v("F16 ESC [ 29 ~")]),e._v(" "),s("li",[e._v("F17 ESC [ 31 ~")]),e._v(" "),s("li",[e._v("F18 ESC [ 32 ~")]),e._v(" "),s("li",[e._v("F19 ESC [ 33 ~")]),e._v(" "),s("li",[e._v("F20 ESC [ 34 ~")]),e._v(" "),s("li",[e._v('The "skips" are intentional (skipping 27 and 30) and as per the DEC VT terminal specs.')])])])])},function(){var e=this.$createElement,t=this._self._c||e;return t("p",[this._v("The "),t("code",[this._v("LINEFEED")]),this._v(" key does not exist on a PC keyboard but is equivalent to pressing "),t("code",[this._v("")]),this._v(".")])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("p",[e._v("The "),s("code",[e._v("NO SCROLL")]),e._v(" key is mapped to the "),s("code",[e._v("")]),e._v(" key on a PC keyboard and is equivalent to pressing "),s("code",[e._v("")]),e._v(" and "),s("code",[e._v("")]),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;n0,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||s0&&(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;i0,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;snsn&&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;i1?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=""+r+"";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.length1}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;th?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;n0)){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;ti?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;nja(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;nPromise.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 + + + + + + + + + +

# 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 or cromemco.local as the web address.
  • If you have a PC, open your browser and enter cromemco or 192.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 to FFFFh
  • 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 of password
  • 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:

  1. ensure the ESP32 is connected to a USB power source, the red LED on the ESP32 board should be illuminated
  2. turn the front panel power switch off, PWR OFF, the down position
  3. hold the EXAMINE toggle in the Examine, up position
  4. press and release the Reset buttons while holding the EXAMINE toggle up
  5. hold the EXAMINE toggle for a second or two
  6. release the EXAMINE toggle

TIP

There are 2 Reset buttons available that both do the same thing:

  • The Tactile Switch SPST-NO you installed in the Reset 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
  1. Enter startup configuration mode (above)
  2. Toggle in this value on the Address toggle switches
  3. Raise the DEPOSIT toggle to the Deposit, up position to store the entered startup configuration value.
  4. 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:

  1. To set a bit, put the corresponding Address toggle switch in the up position.
  2. To clear a bit, put the corresponding Address toggle switch in the down position.
  3. 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 a Reset 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 to INFO (3) this will likely send console log messages during normal use of the machine. It is recommended to set the NVS_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 the ESP32-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

  1. connect the ESPP32-PICO-KIT to a PC using a suitable USB cable
  2. 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 and Comms headers accessible on the rear of the PCB, and connecting a suitable RS232 device to one of the DE-9M connectors labeled RS232-1 and RS232-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 and Comms headers for UART0 to RS232-1

Patch & Comms jumpers

# 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 the boot.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 and PASSWORD=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 to 230400 e.g. 110, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400 others may work, but you'll have to experiment
    • cs7 - for 7 data bits
    • cs8 - for 8 data bits
    • cstopb - for 2 stop bits, default is 1
    • parenb - for even parity, default is none
    • parenb,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)and LPT: and apply only to websocket communication to the Desktop UI

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:

#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: or HD2:

Harddisk images are visible in the disk library LIB: and indicated with a harddisk icon. You can drag-and-drop a new harddisk onto the LIB: 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: named empty.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 the boot.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 AM
+ + + 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 @@ + + + + + + Cromemco Z-1 replica | 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

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

Web Desktop UI

# 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. +Facia side-by-side

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.

# 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 PM
+ + + 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 @@ + + + + + + Step-by-step Assembly Guide (Draft) | 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): +
    1. the LED LA14 is incorrectly labeled as LS14
    2. 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 front Note: 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 front The 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 front 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.
5. Capacitor 100nF C1 front There is only one type of capacitor in this kit, and they can be soldered in either orientation.
6. Resistor Network 6x10K Ohm RN1 back Note: 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 back Solder 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 front Note: 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 front There 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 front
10b. Resistor 3K Ohm (x8) R40-R47 front Orange, Black, Red, Gold
11b. Test Lead [TEST STEP]
9c. LED Red 5mm (x8) LO0-LO7 front
10c. Resistor 3K Ohm (x8) R16-R23 front Orange, Black, Red, Gold
11c. Test Lead [TEST STEP]
9d. LED Red 5mm (x8) LA0-LA7 front
10d. Resistor 3K Ohm (x8) R24-R31 front Orange, Black, Red, Gold
11d. Test Lead [TEST STEP]
9e. LED Red 5mm (x8) LD0-LD7 front
10e. Resistor 3K Ohm (x8) R52-R59 front Orange, Black, Red, Gold
11e. Test Lead [TEST STEP]
9f. LED Red 5mm (x4) LHT1, LWT1, LRN1, LIE1 front
10f. Resistor 3K Ohm (x4) R48-R51 front Orange, Black, Red, Gold
11f. Test Lead [TEST STEP]

# Other Resistors, Capacitors, IC sockets & Miscellaneous Parts

Note

The transistor Q1 and the accompanying Resistor R13 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 front Brown, 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 front These capacitors are not polarized and can be inserted & soldered either way around.
15. Capacitor 100nF (0.1μF, 104) C2, C13-C16 back These capacitors are not polarized and can be inserted & soldered either way around.
16. 16 pin DIP Socket (x10) U1-U10 front 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.
17. 16 pin DIP Socket U11 back 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.
18. S8050 NPN Transistor Q1 back (Optional) See note above.
19. Tactile Switch SPST-NO Reset front 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
20. Header 4x2 Male Boot back
21. Header 8x2 Male Patch back
22. Header 8x2 Male Comms back
23. DE9 (DB9) Male Socket (x2) RS232-1, RS232-2 back 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

# 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 front U1-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 front U7-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 back U11 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 of IMSAI8080. Once you are connected to this Wi-Fi network, start a Chrome browser and enter the URL http://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 the RUN/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 large 3mm Black acrylic LED/switch masking plate
28. Spacer 8mm Nylon (x8) Thread a 8mm spacer over each of the 8 M4 socket screws behind the 3mm Black acrylic LED/switch masking plate
29. PCB Fit the PCB over the 8 M4 socket screws behind the 8mm spacers and the 3mm 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 8 M4 socket screws behind the PCB

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 the 3mm Black acrylic LED/switch masking plate

TIP

  1. Remove the M4 Nuts (8) without letting the M4 Socket Screws (8) drop out of place, tape may help.
  2. Place the PCB down on a surface with the 3mm Black acrylic LED/switch masking plate facing up, the M4 Socket Screws will need to slide up to let the PCB sit down flat on the surface.
  3. Carefully remove the M4 Socket Screws (8) without disturbing the 3mm Black acrylic LED/switch masking plate, the PCB and especially don't allow the 8mm Spacers to move out of place.
  4. 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 thick 6mm 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 the M4 socket screws and slide it down to meet the clear acrylic
40. This step removed as the Text Facia and transparent red filter are now a single piece

TIP

  1. Take this whole assembly and flip it over, with the clear acrylic and the Text Facia facing up.
  2. 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)
  3. 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 corresponding M4 socket screw and use tweezers to correctly locate the 8mm Spacer before reinserting the M4 socket screw

Step Parts Location Notes
41. Spacer 6mm Nylon (x8) Thread a 6mm spacer over each of the 8 M4 socket screws behind the PCB
42. 3mm Clear acrylic back cover Align the 3mm Clear acrylic back cover over the M4 socket screws and slide it down to meet the 3mm Spacers
43. M4 Hex Nut Nylon (x8) Push a M4 Nut into each hexagonal cutout in the 3mm Clear acrylic back cover behind each of the 8 M4 socket screws, tape them into position so that they don't fall out while tightening the M4 socket screws

TIP

  1. Holding the whole assembly firmly together (again tape may help) stand it up on one long edge.
  2. Screw each of the 8 M4 socket screws firmly into their corresponding M4 Nut, take care not to over-tighten and strip the thread in the M4 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 of hook 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 the switch surround vertically , aligned behind the fingers extending upwards along the switch surround
46. 6mm Charcoal grey hammer tone painted acrylic switch surround Remove the paper backing from the hook and loop tape and press the switch surround into place under the toggle 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 the 3mm Clear acrylic back cover before you you attach the lid. Failure to do so might result in cracking the 3mm 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 the Blue aluminium lid and use a M3 Nut on the end of each M3 Screw to secure the Blue aluminium lid.
49. 3mm Blue aluminium lid Place the Blue aluminium lid around the assembly completed at step 38 above. The M3 Screws are closer to the back than to the front. Secure each M3 Screw & M3 Nut in the corresponding slot in the 3mm Clear acrylic back cover. Don't over-tighten the M3 Screws used to secure the lid or you could crack the 3mm 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.

  1. Remember to once again plug in the ESP32-PICO-KIT and insert the microSD Card
  2. Connect the ESP32-PICO-KIT to a USB power source with a USB micro-B cable
  3. Go and download/open your copy of the IMSAI 8080 Microcomputer System User Manual (also included in the manual folder on the microSD card)
  4. 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 AM
+ + + 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 @@ + + + + + + Bill of Materials (Draft) | 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): +
    1. the LED LA14 is incorrectly labeled as LS14
    2. 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
LED Red 5mm 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).
Resistor 3K 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.
Resistor 10K 14 (15 packed) R1-12,14; R13 (back)

Resistor 10K ohm [Brown, Black, Orange, Gold]

Resistor Network 6x10K 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.
Capacitor 100nF 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.
Transistor 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.
74HC595 6 U1-6

74HC595

8-bit serial in/out Shift Register 3-State Outputs
74HC165 4 U7-10

74HC165

Shift Register 8-bit, parallel load
MAX3232 1 U11 (back)

MAX3232

Low-Power, up to 1Mbps, True RS-232 Transceivers Using Four 0.1μF External Capacitors (C13-16)
16pin DIP Socket 11 (U1-11)

16 pin DIP Socket

One for each IC, U1-11
DE9 Male Socket 2 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.
Header 4x2 Male 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)
Header 8x2 Male 2 Patch, Comms (back)

Header 8x2 Male

Using the provided shunt-jumpers you can configure the RS232 serials comms via these two headers
Connector 20x1 Female 2 ESP32 (back)

Connector 20x1 Female

These two connectors form a socket for mounting the ESP32-PICO-KIT board
Header 20x1 Male 1

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.
Tactile Switch 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
PSRAM 1 U13

PSRAM 64Mb (8M x 8) SPI/ QPI SOP-8_150mil

microSD socket 1 uSD Card

microSD Card Socket

# Rocker Switches

Part Quantity PCB Description
Red Power On-On 1 S1

Red Power Switch (On-On)

Blue Rocker Mom-off-Mom 3 S2, S4, S6

Blue Rocker (Mom-off-Mom)

Red Rocker Mom-off-Mom 2 S3, S5

Red Rocker (Mom-off-Mom)

Blue Rocker On-On 8 SA4-7, SA12-15

Blue Rocker (On-On)

Red Rocker On-On 8 SA0-3, SA8-11

Red Rocker (On-On)

# Miscellaneous components

Part Quantity PCB Description
ESP32_Pico_DevKit 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.
microSD 16GB Memory_Card 1

microSD 16GB Memory Card

Shunt-Jumper 8

Shunt-Jumper

Test Lead 1

Test lead

Used to test LEDs during assembly, but not used in the final assembled kit
Velcro hook tape Velcro loop tape 120mm 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.
PCB 1

PCB

# Mounting hardware

Part Quantity Description
M4x30 Hex Socket Screw 8

M4x30mm Hex Socket Screw

Spacer 8mm 8

Spacer 8mm Nylon

The 8mm spacers fit on the M4x30mm Hex Socket Screws in front of the PCB, between the PCB and the 3mm Black acrylic LED/switch masking plate
Spacer 6mm 8

Spacer 6mm Nylon

The 6mm spacers fit on the M4x30mm Hex Socket Screws behind the PCB, between the PCB and the 3mm Clear acrylic back cover
M4 Hex Nut Nylon 8

M4 Hex Nut Nylon

M3x12 Machine Screw 4

M3x12mm Black Machine Screw

M3 Nut 4
Blue aluminium lid 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
Clear acrylic front cover 1

6mm Clear acrylic front cover

Charcoal grey acrylic switch surround 1

6mm Charcoal grey hammer tone painted acrylic switch surround

White text/decals on Black facia over transparent red filter 1

NEW

3.0mm White text/decals on Black facia over a transparent red filter

Black acrylic LED/switch masking plate 1

3mm Black acrylic LED/switch masking plate

Clear acrylic back cover 1

3mm Clear acrylic back cover

White acrylic back cover corner reinforcer (Top) 1+3

2mm White acrylic back cover corner reinforcer (top edge crucifix slots)

See this forum post for details
White acrylic back cover corner reinforcer (Bottom) 4

2mm White acrylic back cover corner reinforcer (bottom side edge crucifix slots)

See this forum post for details
LED Spacer/Switch Alignment guide 1

2mm Black/White/Clear acrylic LED spacer & switch alignment guide (8 slots)

LED alignment guide 1

2mm Black/white/Clear acrylic LED alignment guide (8 round holes)

Last Updated: 7/10/2021, 5:20:59 AM
+ + + 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 @@ + + + + + + Configuration - v1.10.0 or later | The High Nibble + + + + + + + + + +

# Configuration - v1.10.0 or later

TIP

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 or imsai8080.local as the web address.
  • If you have a PC, open your browser and enter imsai8080 or 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 to FFFFh
  • 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 of password
  • 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:

  1. ensure the ESP32 is connected to a USB power source, the red LED on the ESP32 board should be illuminated
  2. turn the front panel power switch off, PWR OFF, the down position
  3. hold the EXAMINE toggle in the Examine, up position
  4. press and release the Reset switch while holding the EXAMINE toggle up
  5. hold the EXAMINE toggle for a second or two
  6. release the EXAMINE toggle

TIP

There are 2 Reset switches available that both do the same thing:

  • The Tactile Switch SPST-NO you installed in the Reset 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
  1. Enter startup configuration mode (above)
  2. Toggle in this value on the Address toggle switches
  3. Raise the DEPOSIT toggle to the Deposit, up position to store the entered startup configuration value.
  4. Reboot the IMSAI 8080esp by pressing a Reset switch

Booting 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 the cpm_22.dsk disk image in drive DSK:A: via the Desktop UI.

  • Binary: 0000 1001 0101 0000
  • Octal: 004520
  • Hexadecimal: 0950
  1. Enter startup configuration mode (above)
  2. Toggle in this value on the Address toggle switches
  3. Raise the DEPOSIT toggle to the Deposit, up position to store the entered startup configuration value.
  4. 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:

  1. To set a bit, put the corresponding Address toggle switch in the up position.
  2. To clear a bit, put the corresponding Address toggle switch in the down position.
  3. 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 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 to INFO (3) this will likely send console log messages during normal use of the machine. It is recommended to set the NVS_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 the ESP32-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

  1. connect the ESPP32-PICO-KIT to a PC using a suitable USB cable
  2. 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 and Comms headers accessible on the rear of the PCB, and connecting a suitable RS232 device to one of the DE-9M connectors labeled RS232-1 and RS232-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 and Comms headers for UART0 to RS232-1

Patch & Comms jumpers

# 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 the boot.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 and PASSWORD=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 to 230400 e.g. 110, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400 others may work, but you'll have to experiment
    • cs7 - for 7 data bits
    • cs8 - for 8 data bits
    • cstopb - for 2 stop bits, default is 1
    • parenb - for even parity, default is none
    • parenb,parodd - for odd parity

# Performance parameters

The Performance parameters exist only for the two devices TTY: (default: SIO1A) and LPT: and apply only to websocket communication to the Desktop UI

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:

### 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 the LIB: 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 image

TIP

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 the boot.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 PM
+ + + 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 @@ + + + + + + Configuration - v1.9.1 or earlier | 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 to FFFFh
  • 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 of password
  • 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:

  1. ensure the ESP32 is connected to a USB power source, the red LED on the ESP32 board should be illuminated
  2. turn the front panel power switch off, PWR OFF, the down position
  3. hold the EXAMINE toggle in the Examine, up position
  4. press and release the Reset switch while holding the EXAMINE toggle up
  5. hold the EXAMINE toggle for a second or two
  6. release the EXAMINE toggle

TIP

There are 2 Reset switches available that both do the same thing:

  • The Tactile Switch SPST-NO you installed in the Reset 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
  1. Enter startup configuration mode (above)
  2. Toggle in this value on the Address toggle switches
  3. Raise the DEPOSIT toggle to the Deposit, up position to store the entered startup configuration value.
  4. Reboot the IMSAI 8080esp by pressing a Reset switch

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 0101 0101 0000
  • Octal: 002520
  • Hexadecimal: 0550
  1. Enter startup configuration mode (above)
  2. Toggle in this value on the Address toggle switches
  3. Raise the DEPOSIT toggle to the Deposit, up position to store the entered startup configuration value.
  4. Reboot the IMSAI 8080esp by pressing a Reset switch

Booting 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 the cpm_22.dsk disk image in drive DSK:A: via the Desktop UI.

  • Binary: 0000 1001 0101 0000
  • Octal: 004520
  • Hexadecimal: 0950
  1. Enter startup configuration mode (above)
  2. Toggle in this value on the Address toggle switches
  3. Raise the DEPOSIT toggle to the Deposit, up position to store the entered startup configuration value.
  4. 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:

  1. To set a bit, put the corresponding Address toggle switch in the up position.
  2. To clear a bit, put the corresponding Address toggle switch in the down position.
  3. 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 to INFO (3) this will likely send console log messages during normal use of the machine. It is recommended to set the NVS_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 the ESP32-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

  1. connect the ESPP32-PICO-KIT to a PC using a suitable USB cable
  2. 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 and Comms headers accessible on the rear of the PCB, and connecting a suitable RS232 device to one of the DE-9M connectors labeled RS232-1 and RS232-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 and Comms headers for UART0 to RS232-1

Patch & Comms jumpers

# 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 the boot.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 and PASSWORD=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 to ROM7. 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 to 230400 e.g. 110, 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400 others may work, but you'll have to experiment
    • cs7 - for 7 data bits
    • cs8 - for 8 data bits
    • cstopb - for 2 stop bits, default is 1
    • parenb - for even parity, default is none
    • parenb,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 the LIB: 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 image

TIP

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 the boot.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) and LPT: and apply only to websocket communication to the Desktop UI

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:

#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 AM
+ + + 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 @@ + + + + + + IMSAI 8080 replica | 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)

IMSAI 8080 CP-A

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.

imsai desktop imsai printer

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.

cyclops

# 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) or CMD-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. +vio dazzler

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

# 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 input Done, see: S-132 Add-on
  • Hardware based interface for the replica Cromemco Cyclops ACC: digital camera
Last Updated: 11/8/2024, 10:43:57 PM
+ + + 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 @@ + + + + + + Tools (Draft) | 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

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

Solder

You should use a flux/rosin core solder that release flux onto the solder joint as it melts.
Soldering Tip Cleaner

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

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 Pen

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
IPA

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

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

Cotton Buds

Very useful for wiping away and scrubbing off dried flux with some IPA.

# Tools

Tool Description
Side Cutters

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

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

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

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

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

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

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 AM
+ + + 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 @@ + + + + + + Troubleshooting (Draft) | 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

  1. connect the ESPP32-PICO-KIT to a PC using a suitable USB cable
  2. 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 and R14 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 instructions

If 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 the microSD 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 named imsai

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 the microSD 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

  1. connect the ESPP32-PICO-KIT to a PC using a suitable USB cable
  2. 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 AM
+ + + 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 @@ + + + + + + Updating Software (Draft) | 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 the SYS: 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:

  1. 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 the v1.7.0 firmware.

  1. The SYS: System (host) virtual device on the desktop UI SYS:

In this example you can see the Build version: v1.5.0 indicating that the system is running the v1.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 Partitions

For 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 UI

Following a successful update of the µSD card Image this version number should reflect the version number you have installed.

SYS:

In this example you can see the GUI Version: webfrontend-v1.5.0 indicating that the system is also running the v1.5.0 desktop UI.

Last Updated: 6/12/2023, 12:10:50 AM
+ + + 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 + + + + + + + + + + + + + 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 + + + + + + + + + +

# 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
ESP32-WROVER 1 ESP32-WROVER U1

ESP-32 WROVER Module

NCP1117-33 1 NCP1117-33 U2

NCP1117-33 LDO Linear Regulator

74CBTLV3257 1 74CBTLV3257 U3

74CBTLV3257 SOIC-16 Quad 1-of-2 Multiplexer/Demultiplexer

74HC00 1 74HC00 U4

74HC00 SOIC-14 Quad NAND Gate

# Through Hole (THT) components

Part Quantity PCB Description
120 Ohm 2 R1, R2

120 Ohm Resistor [Brown, Red, Black, Black, Brown]

Only required if using the PS/2 keyboard
2K Ohm 2 R3, R4

2K Ohm Resistor [Red, Black, Black, Brown, Brown]

Only required if using the PS/2 keyboard
10K Ohm 1 R5, R13

10K Ohm Resistor [Brown, Black, Black, Red, Brown]

806 Ohm 3 R6, R8, R10

806 Ohm Resistor [Grey, Black, Blue, Black, Brown]

402 Ohm 3 R7, R9, R11

402 Ohm Resistor [Yellow, Black, Red, Black, Brown.]

4K7 Ohm 1 R12

4.7K Ohm Resistor [Yellow, Violet, Black, Brown, Brown]

121 Ohm 1 R14

121 Ohm Resistor [Brown, Red, Brown, Black, Brown]

243 Ohm 1 R15

243 Ohm Resistor [Red, Yellow, Orange, Black, Brown]

487 Ohm 1 R16

487 Ohm Resistor [Yellow, Gray, Violet, Black, Brown]

976 Ohm 1 R17

976 Ohm Resistor [White, Violet, Blue, Black, Brown.]

Diode 4 D1, D2, D3, D4

1N4148 Signal Diode

Diodes have polarity, ie. they must be inserted the correct way around to function properly.
1 uF Capacitor 1 C2

1 uF MLC (105) Capacitor

100 nF Capacitor 7 C1, C6, C7, C8, C9, C10, C11

100 nF (104) MLC Capacitor

100 uF 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 Pad
22 uF Capacitor 1 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 Pad
10 uF Capacitor 2 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 Pad
S8050 1 Q1

S8050 NPN Transistor TO-92

Tactile Switch 2 Prog, Reset

Tactile Push Button Switch SPST

Buzzer 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
74HC165 1 U5

74HC165

Shift Register 8-bit, parallel load
MCP3008 1 U6

MCP3008

8 Channel 10-bit Analog-to-Digital Converter (ADC)
74HC138 1 U7

74HC138

3-to-8 line Decoder/Demultiplexer, inverting
74HC595 1 U8

74HC595

8-bit serial in/out Shift Register 3-State Outputs
LM7805 1 LM7805 U9

LM7805 +5V DC Linear Regulator

# Through Hole (THT) headers

Part Quantity PCB Description
Header 2pin 1 JP1 5V Pwr

2 Pin Header - Horizontal

Header 6pin 1 FTDI Program

6 Pin Header - Vertical

Cut from 20 Pin male header
Header 6pin 1 Keyboard

6 Pin Header - Vertical

Cut from 20 Pin male header.

Only required if using the USB-HID keyboard
Header 4x2 Male 1 Patch

8 Pin Header (4x2)- Vertical

See notes for use of this header
Header 8x2 Female 1 S-132

16 Pin Header (8x2)- Female, Vertical

Fit to the underside of the PCB - attaches to the IMSAI8080/Cromemco Z-1
Header 2pin 1 KB Reset

2 Pin Header - Vertical

Cut from 20 Pin male header.

Only required if using the USB-HID keyboard
Shunt 4 For JP1 & Patch as required

Header Pin Shunts

Connector 20x2 Female 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
VGA DB15 1 VGA

DB15 VGA Female Socket - Right Angled

PS2 KBD 1 PS/2

Mini-DIN-6 PS/2 Keyboard Female Socket - Right Angled

Only required if using the PS/2 keyboard
Power 1 Power

6.2mm DC Barrel Jack Connector

16pin DIP Socket 4 (U4, U6, U7, U8)

16 pin DIP Socket

One for each IC - U4, U6, U7, U8

# Printed Circuit Board (PCB)

Part Quantity Description
USB-HID 1

USB-HID Keyboard Interface

If ordered
PCB Front 1

Front view

# Mounting hardware

Part Quantity Description
M4x10 Hex Socket Screw 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.
M4 Hex Nut 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-1
M3x5 Machine Screw 1

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.
M3 Nut 1

# Joystick Adapter (yellow)

Part Quantity PCB Description
Header 20x2 Male RA 1 Pin 1

40 Pin Header (20x2)- Horizontal

Fit to underside of PCB.
Header 4x2 Male 2 Pad 1, Pad 2

8 Pin Header (4x2)- Horizontal

Fit to top of PCB.
10K Ohm 8 R100 - 107

10K Ohm Resistor [Brown, Black, Orange, Gold]

Header 2pin 1 A.Gnd

2 Pin Header - Vertical

Cut from 20 Pin male header
Header 3pin 1 Ref.Voltage

3 Pin Header - Vertical

Cut from 20 Pin male header
Header 3pin 1 Audio Patch

3 Pin Header - Vertical

Cut from 20 Pin male header
Header 3pin 1 Amp

3 Pin Header - Vertical

Cut from 20 Pin male header
Shunt 4 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.Voltage
NOT SUPPLIED

NOT REQUIRED
1 C100

100 nF (104) MLC Capacitor

NOT SUPPLIED

NOT REQUIRED
1 C101

1 uF (105) MLC Capacitor

NOT SUPPLIED

NOT REQUIRED
1 MCP1541

MCP1541 4.096V Voltage Reference

Part Quantity Description
8-core IDC Ribbon 2 x 36 inch

8-core IDC Ribbon Cable

Connects JS-1 Joysticks to the Joystick Adapter
8-pin IDC Header 4

8-pin IDC Ribbon Cable Header - Female

Connects JS-1 Joysticks to the Joystick Adapter
PCB Front 1

Front view

# JS-1 Analog Joystick (yellow x 2)

Part Quantity PCB Description
Tactile Switch 4 each SW1 - 4

Tactile Push Button Switch SPST

Analog Joystick 1 each

2-axis Analog Joystick - 10Kohm

Header 4x2 Male 1 each

8 Pin Header (4x2)- Horizontal

Fit to top of PCB.
Part Quantity Description
PCB Front 2

Front view

# Parallel Printer (red)

Part Quantity PCB Description
Header 40pin 1 Pin 1

40 Pin Header (20x2)- Horizontal

Fit to underside of PCB.
DB25 1 Printer

DB25 Female Socket - Solder lug

Part Quantity Description
PCB Front 1*

Front view

# Prototype Adapter (green)

Part Quantity PCB Description
Header 40pin 1 Pin 1

40 Pin Header (20x2)- Horizontal

Fit to underside of PCB.
Part Quantity Description
PCB Front 1*

Front view

Last Updated: 3/27/2023, 3:34:34 AM
+ + + 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 @@ + + + + + + Build notes | 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.

Finished PCB

# 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 AM
+ + + 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 @@ + + + + + + Configuration (Draft) | 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 PM
+ + + 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 @@ + + + + + + S-132 | The High Nibble + + + + + + + + + +

# S-132

Powered by an ESP32: S-100 + ESP32 = S-132

V1.5 pre-production

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:

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 the RUN position
  • <ctrl><alt><F10> = CPA: - STOP - press CP-A frontpanel switch to the STOP position
  • <ctrl><alt><F11> = CPA: - RESET - lift CP-A frontpanel switch to the RESET position
  • <ctrl><alt><F12> = CPA: - EXT.CLR - press CP-A frontpanel switch to the EXT.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 AM
+ + + 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 @@ + + + + + + S-132 Firmware Install & Console Logs | The High Nibble + + + + + + + + + +

# S-132 Firmware Install & Console Logs

# Full install

A full install is useful for:

  • initializing a new (blank) ESP32-WROVER module for the S-132
  • returning an S-132 to "factory defaults" based on the latest firmware +
    • ie. this process will clear any values you have previously saved to the NVRAM

TIP

This tool can also be used to view the console log of the ESP32, useful for trouble-shooting

Simply:

  • click the CONNECT button (below)
  • chose your serial port/device
  • click on LOGS & CONSOLE on the Device Dashboard

WARNING

When you click INSTALL THE FULL S-132 IMAGE +This will erase the entire flash on the ESP32 and install +the indicated build of the S-132 firmware

It is completely safe, however, you will loose any settings +you have saved to NVRAM

WARNING

This install process is not suitable for the ESP32-WROVER-E module at this time.

If you have an ESP32-WROVER-E you must use the Espressif esptool.py and espefuse.py tools to setup and install the firmware to be compatible with the S-132

# Note:

  • The DEVICE RESET function on the LOGS & CONSOLE screen does not work with the S-132
  • When you click INSTALL on the Confirm Installation dialog +
    • it will say Preparing installation and wait for the ESP32 to enter bootloader mode
    • you will need to manually set the ESP32 into bootloader mode by: +
      • pressing both the Reset and Prog buttons on the S-132, together
      • release the Reset button first, and about 1 second later
      • release the Prog button
  • If you abort an install by pressing the <ESC> key on you keyboard you may not be able to reconnect to the ESP32, with a message about the serial port is already open. You will need to reload the web page to release the serial port
Last Updated: 1/21/2023, 1:00:34 AM
+ + + 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 + + + + + + + + + +

# 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

D+7A I/O connector

# 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:

  1. Analog Ground is isolated from Ground
    • for most use cases you should tie it to Ground
  2. Analog Input 1 to 7
    • these are digitized by the MCP3008 ADC
    • typically 0V to Voltage Ref. V for signed input port values of -128 to 127
    • see the MCP3008 ADC data sheet for exact specifications
  3. There are only two (2) analog outputs Analog Output 1 and Analog 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
  4. Voltage Ref. is the V.Ref on the MCP3008 ADC +
    • for most use cases you should tie it to +5V Regulated
  5. Input _STB (active low) isn't implemented - because... reasons.
  6. Output _STB (active low) is implemented +
    • as a working example: this is used on the Parallel Printer interface as the parallel output data strobe
  7. Digital Input Bits 0 to 7
    • these are buffered by the 74HC165 with a +5V DC regulated supply for Vcc
    • typically > 3.15V = 1 and < 1.35V = 0
    • see the 74HC165 data sheet for exact specifications
  8. Digital Output Bits 0 to 7
    • these are driven by the 74HC595 with a +5V DC regulated supply for Vcc
    • typically 0V = 0 and +5V (Vcc) = 1
    • see the 74HC595 data sheet for exact specifications
Last Updated: 3/11/2023, 9:20:51 AM
+ + + 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 @@ + + + + + + S-132 Firmware Update Guide | 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

S-132 Firmware update available
+
+Followed by: +
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 update

If 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 reaches 0 (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 AM
+ + + 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 @@ + + + + + + VT132 Bill of Materials (Draft) | 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
ESP32-WROVER 1 ESP32-WROVER U1

ESP-32 WROVER Module

NCP1117-33 1 NCP1117-33 U2

NCP1117-33 LDO Linear Regulator

# Through Hole (THT) components

Part Quantity PCB Description
120 Ohm 2 R1, R2

120 Ohm Resistor [Brown, Red, Black, Black, Gold]

2K Ohm 2 R3, R4

2K Ohm Resistor [Red, Black, Black, Brown, Gold]

10K Ohm 1 R5 Vertical

10K Ohm Resistor [Brown, Black, Black, Red, Gold]

806 Ohm 3 R6, R8, R10

806 Ohm Resistor [Grey, Black, Blue, Black, Gold]

405 Ohm 3 R7, R9, R11

405 Ohm Resistor [Yellow, Black, Green, Black, Gold]

4K7 Ohm 1 R12

4.7K Ohm Resistor [Yellow, Purple, Black, Brown, Gold]

10K Ohm 1 R13

10K Ohm Resistor [Brown, Black, Black, Red, Gold]

100 nF Capacitor 1 C1

100 nF (104) MLC Capacitor

1 uF Capacitor 1 C2

1 uF MLC (105) Capacitor

100 uF Capacitor 1 C3

100 uF Electrolytic Capacitor

Electrolytic capacitors have polarity, ie. they must be inserted the correct way around to function properly.
22 uF Capacitor 1 C4

22 uF Electrolytic Capacitor

Electrolytic capacitors have polarity, ie. they must be inserted the correct way around to function properly.
10 uF Capacitor 1 C5

10 uF Electrolytic Capacitor

Electrolytic capacitors have polarity, ie. they must be inserted the correct way around to function properly.
S8050 1 Q1

S8050 NPN Transistor TO-92

Tactile Switch 2 Prog, Reset

Tactile Push Button Switch SPST - Right Angled

Buzzer 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
Header 2pin 2 JP5, JP6 5V Pwr

2 Pin Header - Horizontal

Header 6pin 2 FTDI Program, Modem Port B

6 Pin Header - Horizontal

Header 8pin 1 JP1 to JP4 RxA/TxA RxB/TxB

8 Pin Header (4x2)- Vertical

Header 80pin 1 Pin 1

80 Pin Header (40x2)- Horizontal

RC2014 Pro Bus Connector. Remove the unneeded pins from the upper row.
Shunt 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
VGA DB15 1 VGA

DB15 VGA Female Socket - Right Angled

PS2 KBD 1 Keyboard

Mini-DIN-6 PS/2 Keyboard Female Socket - Right Angled

# Printed Circuit Board (PCB)

Part Quantity Description
PCB Back 1*

Back view

PCB Front 1*

Front view

Last Updated: 10/17/2020, 10:15:51 PM
+ + + 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 @@ + + + + + + VT132 | 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)

V1.0

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.

V1.2

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


RC2014 PS2 RC2014 USB

# (White PCB)

In July 2020 the VT132 Designed for RC2014 edition began shipping to the patiently waiting early-adopters.

# VT132 Stand Alone edition


Stand Alone PS2 Stand Alone USB

# (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 +
  • 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) +

# 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:

  1. which edition you require: ie. +
    • Designed for RC2014, or
    • Stand Alone
  2. 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 AM
+ + + 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 @@ + + + + + + VT132 Firmware Install & Console Logs | The High Nibble + + + + + + + + + +

# VT132 Firmware Install & Console Logs

# Full install

A full install is useful for:

  • initializing a new (blank) ESP32-WROVER module for the VT132
  • returning a VT132 to "factory defaults" based on the latest firmware +
    • ie. this process will clear any values you have previously saved to the NVRAM including Wi-Fi network details.

TIP

This tool can also be used to view the console log of the ESP32, useful for trouble-shooting

Simply:

  • click the CONNECT button (below)
  • chose your serial port/device
  • click on LOGS & CONSOLE on the Device Dashboard

WARNING

When you click INSTALL THE FULL VT132 IMAGE +This will erase the entire flash on the ESP32 and install +the indicated build of the VT132 firmware

It is completely safe, however, you will loose any settings +you have saved to NVRAM including Wi-Fi network details.

WARNING

This install process is not suitable for the ESP32-WROVER-E module at this time.

If you have an ESP32-WROVER-E you must use the Espressif esptool.py and espefuse.py tools to setup and install the firmware to be compatible with the VT132

# Note:

  • The DEVICE RESET function on the LOGS & CONSOLE screen does not work with the VT132
  • When you click INSTALL on the Confirm Installation dialog +
    • it will say Preparing installation and wait for the ESP32 to enter bootloader mode
    • you will need to manually set the ESP32 into bootloader mode by: +
      • pressing both the Reset and Prog buttons on the VT132, together
      • release the Reset button first, and about 1 second later
      • release the Prog button
  • If you abort an install by pressing the <ESC> key on you keyboard you may not be able to reconnect to the ESP32, with a message about the serial port is already open. You will need to reload the web page to release the serial port
Last Updated: 1/21/2023, 1:00:34 AM
+ + + 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 + + + + + + + + + +

# 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 and 2 x 2K ohm resistors immediately behind the PS/2 keyboard connector footprint

The 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 the FTDI Program and Modem 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 header
  • JP4 (5V Vcc) allows +5VDC power to be taken (or given) over the 6-pin Modem TTL header
  • JP3 (5V Vcc) allows +5VDC power to be taken (or given) over the 6-pin Terminal TTL header
  • JP2 (+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 connectors
  • JP1 (+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 connectors

TIP

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 using shunts 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
Stand Alone Patch stright-through Stand Alone Patch cross-over

# VT132 Stand Alone schematic

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
+ + + 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 @@ + + + + + + 'AT' (Hayes) Serial Modem Operation Manual (Draft) | 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 the Enter or Return 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 the Backspace 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.

Modem AT Commands

TIP

  • All commands must be prefixed with AT except for the immediate command A/.
  • 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 respond OK and tests that command processor is responding
A/ Repeat last command (immediate) This immediate command is not prefixed by AT but repeats the last command entered as soon as A/ 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 complete
D Dial (TCP/IP connect) The full form is ATDhostname:port where hostname is either the IPV4 address in nnn.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 is 23. 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 stream
O Return Online When connected and in Command Mode ATO will return to Data Mode. If not connected the modem will respond NO CARRIER
H Hangup When connected and in Command Mode ATH will close the connection. If a connection is closed the modem will respond HANGUP
&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: Displays RING & 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 (sets ATE0 & ATQ1). Ignores the interrupt sequence +++ preventing the Modem from returning to command mode from data mode
A Answer When an incoming connection request is indicated by the modem responding RING the request can by manually accepted with the ATA command. If the connection is successful the modem will enter Data Mode
Sn 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 1
En 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 with AT+W? or AT+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 to S50.

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 command 0 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+ or AT+W= commands
WIFI CONNECTED following a successful connection to an AP with the AT+W+ or AT+W= commands
WIFI 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:

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 in S20 and S21 respectively
TERMINAL-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 use vt100+ from the terminfo database which provides support for color over and above the standard vt100 terminal type, making text applications like htop 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 to 1 with ATS15=1
  • To disable the Telnet protocol you must manually set 'S' Register S15 to 0 with ATS15=0

The Telnet protocol is applied to both outgoing connections 'Dialed' with ATD and incoming connections 'Answered' with ATA 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 to AT&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 mode
  • AT&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 in S1 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) and S1 is greater-then-or-equal to S0 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 sending ATH to Hangup.
  • A Hangup ATH will reset the Ring Counter in S1 to zero (0).
Last Updated: 7/10/2021, 5:21:43 AM
+ + + 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 @@ + + + + + + Over-the-Air (OTA) Firmware Update Guide (Draft) | 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.

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+ or AT+W=ssid,pwd to join your Wi-Fi network
  • AT+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 shown
  • AT+U^ or AT+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 Update AT+U? commands is show here:

OTA AT Commands

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 port 5500 with DNS name mylocalserver and IPv4 address of 192.168.1.20 proceed as follows:

From the modem prompt/command line:

  • AT+W+ or AT+W=ssid,pwd to join your Wi-Fi network
  • AT+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, or
    • AT+U=http://192.168.1.20:5500/VT132.bin if using the IPV4 address
  • AT+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 shown
  • AT+U^ or AT+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 utility

Instructions for flashing the firmware using the ESP-IDF esptool.py utility are included with the firmware downloadable from the GitHub firmware repository

If 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= or AT+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 subsequent AT+U^ or AT+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 PM
+ + + 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 @@ + + + + + + USB Host Controller (UHC) Firmware Update Guide (Draft) | 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:

  1. Update the VT132 to the latest release, following the OTA Firmware Update Guide
  2. Navigate to the SET-UP D screen of the VT132
  3. Press 9 on the keyboard to show the keyboard device status
  4. Press U (uppercase 'U') to start the update process
  5. 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

  • 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:

Keyboard device status

# 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:

UHC firmware upgrade

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 RC2014 pads VT132 RC2014 example

# VT132 Stand Alone edition


VT132 SA pads VT132 SA example

# 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

UHC firmware upgrade failure

# 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

UHC firmware upgrade success

Last Updated: 9/22/2021, 1:51:52 AM
+ + + 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 @@ + + + + + + VT100 (enhanced) Operator Information (Draft) | 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 and LOCAL 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 to F1-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 and SET-UP B screens are faithful to the original VT100 with the following exceptions:

# ONLINE/LOCAL indicator

All setup screens display either ONLINE or LOCAL 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 and SET-UP B screens with integrated help are shown here:

SET-UP-A-HELP

SET-UP-B-HELP

# 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 Receive R 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 the 7 and the 8 key will cycle through the available baud rates changing both T SPEED and R SPEED simultaneously.

  • 7 will cycle downwards through the available speeds, rolling back to 115200 after 300
  • 8 will cycle upwards through the available speeds, rolling back to 300 after 115200

# 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 reset 0 or recall <Shift><R>.

# SET-UP B - advance to next setup screen (enhancement)

On the SET-UP B screen, pressing 5 will advance to the SET-UP C and then onto the SET-UP D screens, before returning to the SET-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 and SET-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 to None given that the bits per character is fixed at 8.

# PARITY SENSE (ODD/EVEN)

The parity sense for the VT132 is not relevant as the parity is fixed to None.

# 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 thick

TIP

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 following ESC [ 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 PM
+ + + 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 @@ + + + + + + Quick Menu Guide (Draft) | 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:

QuickMenu Root

# 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

QuickMenu Actions

The available actions are:

  • Clear display - equivalent to ESC [ 2 J followed by ESC [ 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 pressing 0 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

QuickMenu Display

  • 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

QuickMenu CRT Saver

# Terminal type menu

QuickMenu Terminal

  • 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

QuickMenu Emulation

  • 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

QuickMenu Keyboard

  • 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

QuickMenu Modem

  • 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 in LOCAL 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? and AT+T=ttt in the 'AT' Command Summary

  • Initialization 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 reset

TIP

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 between ONLINE or LOCAL
    • [X] - selected ONLINE (default), the terminal is connected to the UART on the RC2014 Bus pins TxA/RxA
    • [ ] - unselected LOCAL, 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 AM
+ + + 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 @@ + + + + + + SET-UP C - Code Pages, ANSI colours, System Information (enhancement) | 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 theSET-UP C screen.

SET-UP-C

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.

SET-UP-C-HELP

# 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.

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.

SET-UP-C-CP437

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.

SET-UP-C-LATIN-1

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:

SET-UP-C-25Line

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:

SET-UP-C-30Line

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:

SET-UP-C-VGA

# 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 Dscs

The example below shows the DEC APL soft font loaded from a file sourced from the VAX VMS system disks.

SET-UP-C-DRCS

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, pressing 5 will advance to the SET-UP D screen, before returning to the SET-UP A screen.

Last Updated: 7/14/2021, 7:58:02 AM
+ + + 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 @@ + + + + + + SET-UP D - Multinational Character Set, NRCS, International Keyboards, Personalities (enhancement) | 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 theSET-UP D screen.

SET-UP-D-MCS

# 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.

SET-UP-D-HELP

# 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 the Previous or Next personality in the list.

# SET-UP D - advance to next setup screen

On the SET-UP D screen, pressing 5 will return to the SET-UP A screen.

Last Updated: 8/19/2024, 3:47:54 AM
+ + + 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 @@ + + + + + + VT100 (enhanced) Programmer Information (Draft) | 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 or LOCAL 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 ( sequence Yes 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

Control Sequence Name Action Taken Default Value
ESC [ Pn ; Pn R CPR Cursor Position Report
Response to DSR
ESC [ 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 lines
ESC = 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 DECSC
ESC [ <sol>; ... x DECREPTPARM Report Terminal Parameters
NOT IMPLEMENTED
ESC [ <sol> x DECREQTPARM Request Terminal Parameters
NOT IMPLEMENTED
ESC 7 DECSC Save Cursor
Paired with DECRC
ESC [ ? 4 h/l DECSCLM Scrolling Mode
Smooth/Jump scrolling
ESC [ ? 5 h/l DECSCNM Screen Mode
Reverse/Normal
ESC [ Pn; Pn r DECSTBM Set Top and Bottom Margins
Minimum 2 lines
whole screen
ESC # 5 DECSWL Single-width Line
ESC [ 2 ; Ps y DECTST Invoke Confidence Test
NOT IMPLEMENTED
ESC [ 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
+ + +