CINXE.COM

Ken Shirriff's blog

<!DOCTYPE html> <html class='v2' dir='ltr' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'> <head> <link href='https://www.blogger.com/static/v1/widgets/3566091532-css_bundle_v2.css' rel='stylesheet' type='text/css'/> <meta content='width=1100' name='viewport'/> <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/> <meta content='blogger' name='generator'/> <link href="https://www.righto.com/favicon.ico" rel='icon' type='image/x-icon' /> <link href="https://www.righto.com/search?updated-max=2019-09-29T08:30:00-07:00&max-results=7&reverse-paginate=true" rel='canonical' /> <link rel="alternate" type="application/atom+xml" title="Ken Shirriff&#39;s blog - Atom" href="https://www.righto.com/feeds/posts/default" /> <link rel="alternate" type="application/rss+xml" title="Ken Shirriff&#39;s blog - RSS" href="https://www.righto.com/feeds/posts/default?alt=rss" /> <link rel="service.post" type="application/atom+xml" title="Ken Shirriff&#39;s blog - Atom" href="https://www.blogger.com/feeds/6264947694886887540/posts/default" /> <link rel="me" href="https://www.blogger.com/profile/08097301407311055124" /> <!--Can't find substitution for tag [blog.ieCssRetrofitLinks]--> <meta content='http://www.righto.com/search?updated-max=2019-09-29T08:30:00-07:00&max-results=7&reverse-paginate=true' property='og:url'/> <meta content='Ken Shirriff&#39;s blog' property='og:title'/> <meta content='Computer history, restoring vintage computers, IC reverse engineering, and whatever' property='og:description'/> <title>Ken Shirriff's blog</title> <style type='text/css'>@font-face{font-family:'Play';font-style:normal;font-weight:400;font-display:swap;src:url(//fonts.gstatic.com/s/play/v19/6aez4K2oVqwIvtU2Gw.eot);}</style> <style id='page-skin-1' type='text/css'><!-- /* ----------------------------------------------- Blogger Template Style Name: Simple Designer: Blogger URL: www.blogger.com ----------------------------------------------- */ /* Variable definitions ==================== <Variable name="keycolor" description="Main Color" type="color" default="#66bbdd"/> <Group description="Page Text" selector="body"> <Variable name="body.font" description="Font" type="font" default="normal normal 12px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="body.text.color" description="Text Color" type="color" default="#222222"/> </Group> <Group description="Backgrounds" selector=".body-fauxcolumns-outer"> <Variable name="body.background.color" description="Outer Background" type="color" default="#66bbdd"/> <Variable name="content.background.color" description="Main Background" type="color" default="#ffffff"/> <Variable name="header.background.color" description="Header Background" type="color" default="transparent"/> </Group> <Group description="Links" selector=".main-outer"> <Variable name="link.color" description="Link Color" type="color" default="#2288bb"/> <Variable name="link.visited.color" description="Visited Color" type="color" default="#888888"/> <Variable name="link.hover.color" description="Hover Color" type="color" default="#33aaff"/> </Group> <Group description="Blog Title" selector=".header h1"> <Variable name="header.font" description="Font" type="font" default="normal normal 60px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="header.text.color" description="Title Color" type="color" default="#3399bb" /> </Group> <Group description="Blog Description" selector=".header .description"> <Variable name="description.text.color" description="Description Color" type="color" default="#777777" /> </Group> <Group description="Tabs Text" selector=".tabs-inner .widget li a"> <Variable name="tabs.font" description="Font" type="font" default="normal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="tabs.text.color" description="Text Color" type="color" default="#999999"/> <Variable name="tabs.selected.text.color" description="Selected Color" type="color" default="#000000"/> </Group> <Group description="Tabs Background" selector=".tabs-outer .PageList"> <Variable name="tabs.background.color" description="Background Color" type="color" default="#f5f5f5"/> <Variable name="tabs.selected.background.color" description="Selected Color" type="color" default="#eeeeee"/> </Group> <Group description="Post Title" selector="h3.post-title, .comments h4"> <Variable name="post.title.font" description="Font" type="font" default="normal normal 22px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> </Group> <Group description="Date Header" selector=".date-header"> <Variable name="date.header.color" description="Text Color" type="color" default="#222222"/> <Variable name="date.header.background.color" description="Background Color" type="color" default="transparent"/> <Variable name="date.header.font" description="Text Font" type="font" default="normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="date.header.padding" description="Date Header Padding" type="string" default="inherit"/> <Variable name="date.header.letterspacing" description="Date Header Letter Spacing" type="string" default="inherit"/> <Variable name="date.header.margin" description="Date Header Margin" type="string" default="inherit"/> </Group> <Group description="Post Footer" selector=".post-footer"> <Variable name="post.footer.text.color" description="Text Color" type="color" default="#666666"/> <Variable name="post.footer.background.color" description="Background Color" type="color" default="#f9f9f9"/> <Variable name="post.footer.border.color" description="Shadow Color" type="color" default="#eeeeee"/> </Group> <Group description="Gadgets" selector="h2"> <Variable name="widget.title.font" description="Title Font" type="font" default="normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif"/> <Variable name="widget.title.text.color" description="Title Color" type="color" default="#000000"/> <Variable name="widget.alternate.text.color" description="Alternate Color" type="color" default="#999999"/> </Group> <Group description="Images" selector=".main-inner"> <Variable name="image.background.color" description="Background Color" type="color" default="#ffffff"/> <Variable name="image.border.color" description="Border Color" type="color" default="#eeeeee"/> <Variable name="image.text.color" description="Caption Text Color" type="color" default="#222222"/> </Group> <Group description="Accents" selector=".content-inner"> <Variable name="body.rule.color" description="Separator Line Color" type="color" default="#eeeeee"/> <Variable name="tabs.border.color" description="Tabs Border Color" type="color" default="#eeeeee"/> </Group> <Variable name="body.background" description="Body Background" type="background" color="#f6fbf6" default="$(color) none repeat scroll top left"/> <Variable name="body.background.override" description="Body Background Override" type="string" default=""/> <Variable name="body.background.gradient.cap" description="Body Gradient Cap" type="url" default="url(https://resources.blogblog.com/blogblog/data/1kt/simple/gradients_light.png)"/> <Variable name="body.background.gradient.tile" description="Body Gradient Tile" type="url" default="url(https://resources.blogblog.com/blogblog/data/1kt/simple/body_gradient_tile_light.png)"/> <Variable name="content.background.color.selector" description="Content Background Color Selector" type="string" default=".content-inner"/> <Variable name="content.padding" description="Content Padding" type="length" default="10px" min="0" max="100px"/> <Variable name="content.padding.horizontal" description="Content Horizontal Padding" type="length" default="10px" min="0" max="100px"/> <Variable name="content.shadow.spread" description="Content Shadow Spread" type="length" default="40px" min="0" max="100px"/> <Variable name="content.shadow.spread.webkit" description="Content Shadow Spread (WebKit)" type="length" default="5px" min="0" max="100px"/> <Variable name="content.shadow.spread.ie" description="Content Shadow Spread (IE)" type="length" default="10px" min="0" max="100px"/> <Variable name="main.border.width" description="Main Border Width" type="length" default="0" min="0" max="10px"/> <Variable name="header.background.gradient" description="Header Gradient" type="url" default="none"/> <Variable name="header.shadow.offset.left" description="Header Shadow Offset Left" type="length" default="-1px" min="-50px" max="50px"/> <Variable name="header.shadow.offset.top" description="Header Shadow Offset Top" type="length" default="-1px" min="-50px" max="50px"/> <Variable name="header.shadow.spread" description="Header Shadow Spread" type="length" default="1px" min="0" max="100px"/> <Variable name="header.padding" description="Header Padding" type="length" default="30px" min="0" max="100px"/> <Variable name="header.border.size" description="Header Border Size" type="length" default="1px" min="0" max="10px"/> <Variable name="header.bottom.border.size" description="Header Bottom Border Size" type="length" default="0" min="0" max="10px"/> <Variable name="header.border.horizontalsize" description="Header Horizontal Border Size" type="length" default="0" min="0" max="10px"/> <Variable name="description.text.size" description="Description Text Size" type="string" default="140%"/> <Variable name="tabs.margin.top" description="Tabs Margin Top" type="length" default="0" min="0" max="100px"/> <Variable name="tabs.margin.side" description="Tabs Side Margin" type="length" default="30px" min="0" max="100px"/> <Variable name="tabs.background.gradient" description="Tabs Background Gradient" type="url" default="url(https://resources.blogblog.com/blogblog/data/1kt/simple/gradients_light.png)"/> <Variable name="tabs.border.width" description="Tabs Border Width" type="length" default="1px" min="0" max="10px"/> <Variable name="tabs.bevel.border.width" description="Tabs Bevel Border Width" type="length" default="1px" min="0" max="10px"/> <Variable name="post.margin.bottom" description="Post Bottom Margin" type="length" default="25px" min="0" max="100px"/> <Variable name="image.border.small.size" description="Image Border Small Size" type="length" default="2px" min="0" max="10px"/> <Variable name="image.border.large.size" description="Image Border Large Size" type="length" default="5px" min="0" max="10px"/> <Variable name="page.width.selector" description="Page Width Selector" type="string" default=".region-inner"/> <Variable name="page.width" description="Page Width" type="string" default="auto"/> <Variable name="main.section.margin" description="Main Section Margin" type="length" default="15px" min="0" max="100px"/> <Variable name="main.padding" description="Main Padding" type="length" default="15px" min="0" max="100px"/> <Variable name="main.padding.top" description="Main Padding Top" type="length" default="30px" min="0" max="100px"/> <Variable name="main.padding.bottom" description="Main Padding Bottom" type="length" default="30px" min="0" max="100px"/> <Variable name="paging.background" color="#ffffff" description="Background of blog paging area" type="background" default="transparent none no-repeat scroll top center"/> <Variable name="footer.bevel" description="Bevel border length of footer" type="length" default="0" min="0" max="10px"/> <Variable name="mobile.background.overlay" description="Mobile Background Overlay" type="string" default="transparent none repeat scroll top left"/> <Variable name="mobile.background.size" description="Mobile Background Size" type="string" default="auto"/> <Variable name="mobile.button.color" description="Mobile Button Color" type="color" default="#ffffff" /> <Variable name="startSide" description="Side where text starts in blog language" type="automatic" default="left"/> <Variable name="endSide" description="Side where text ends in blog language" type="automatic" default="right"/> */ /* Content ----------------------------------------------- */ body { font: normal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif; color: #222222; background: #f6fbf6 none repeat scroll top left; padding: 0 40px 40px 40px; } html body .region-inner { min-width: 0; max-width: 100%; width: auto; } h2 { font-size: 22px; } a:link { text-decoration:none; color: #121fb3; } a:visited { text-decoration:none; color: #121fb3; } a:hover { text-decoration:underline; color: #1a00ff; } .body-fauxcolumn-outer .fauxcolumn-inner { background: transparent url(//www.blogblog.com/1kt/simple/body_gradient_tile_light.png) repeat scroll top left; _background-image: none; } .body-fauxcolumn-outer .cap-top { position: absolute; z-index: 1; height: 400px; width: 100%; } .body-fauxcolumn-outer .cap-top .cap-left { width: 100%; background: transparent url(//www.blogblog.com/1kt/simple/gradients_light.png) repeat-x scroll top left; _background-image: none; } .content-outer { -moz-box-shadow: 0 0 40px rgba(0, 0, 0, .15); -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .15); -goog-ms-box-shadow: 0 0 10px #333333; box-shadow: 0 0 40px rgba(0, 0, 0, .15); margin-bottom: 1px; } .content-inner { padding: 10px 10px; } .content-inner { background-color: #ffffff; } /* Header ----------------------------------------------- */ .header-outer { background: #f6fbf7 url(//www.blogblog.com/1kt/simple/gradients_light.png) repeat-x scroll 0 -400px; _background-image: none; } .Header h1 { font: normal normal 42px Play; color: #666666; text-shadow: 1px 2px 3px rgba(0, 0, 0, .2); } .Header h1 a { color: #666666; } .Header .description { font-size: 140%; color: #666666; } .header-inner .Header .titlewrapper { padding: 22px 30px; } .header-inner .Header .descriptionwrapper { padding: 0 30px; } /* Tabs ----------------------------------------------- */ .tabs-inner .section:first-child { border-top: 0 solid #eeeeee; } .tabs-inner .section:first-child ul { margin-top: -0; border-top: 0 solid #eeeeee; border-left: 0 solid #eeeeee; border-right: 0 solid #eeeeee; } .tabs-inner .widget ul { background: #f5f5f5 url(//www.blogblog.com/1kt/simple/gradients_light.png) repeat-x scroll 0 -800px; _background-image: none; border-bottom: 1px solid #eeeeee; margin-top: 0; margin-left: -30px; margin-right: -30px; } .tabs-inner .widget li a { display: inline-block; padding: .6em 1em; font: normal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif; color: #999999; border-left: 1px solid #ffffff; border-right: 1px solid #eeeeee; } .tabs-inner .widget li:first-child a { border-left: none; } .tabs-inner .widget li.selected a, .tabs-inner .widget li a:hover { color: #000000; background-color: #eeeeee; text-decoration: none; } /* Columns ----------------------------------------------- */ .main-outer { border-top: 0 solid #eeeeee; } .fauxcolumn-left-outer .fauxcolumn-inner { border-right: 1px solid #eeeeee; } .fauxcolumn-right-outer .fauxcolumn-inner { border-left: 1px solid #eeeeee; } /* Headings ----------------------------------------------- */ div.widget > h2, div.widget h2.title { margin: 0 0 1em 0; font: normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif; color: #000000; } /* Widgets ----------------------------------------------- */ .widget .zippy { color: #999999; text-shadow: 2px 2px 1px rgba(0, 0, 0, .1); } .widget .popular-posts ul { list-style: none; } /* Posts ----------------------------------------------- */ h2.date-header { font: normal bold 11px Arial, Tahoma, Helvetica, FreeSans, sans-serif; } .date-header span { background-color: transparent; color: transparent; padding: inherit; letter-spacing: inherit; margin: inherit; } .main-inner { padding-top: 30px; padding-bottom: 30px; } .main-inner .column-center-inner { padding: 0 15px; } .main-inner .column-center-inner .section { margin: 0 15px; } .post { margin: 0 0 25px 0; } h3.post-title, .comments h4 { font: normal normal 22px Arial, Tahoma, Helvetica, FreeSans, sans-serif; margin: .75em 0 0; } .post-body { font-size: 110%; line-height: 1.4; position: relative; } .post-body img, .post-body .tr-caption-container, .Profile img, .Image img, .BlogList .item-thumbnail img { padding: 2px; background: #ffffff; border: 1px solid #ffffff; -moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, .1); -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, .1); box-shadow: 1px 1px 5px rgba(0, 0, 0, .1); } .post-body img, .post-body .tr-caption-container { padding: 5px; } .post-body .tr-caption-container { color: #222222; } .post-body .tr-caption-container img { padding: 0; background: transparent; border: none; -moz-box-shadow: 0 0 0 rgba(0, 0, 0, .1); -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .1); box-shadow: 0 0 0 rgba(0, 0, 0, .1); } .post-header { margin: 0 0 1.5em; line-height: 1.6; font-size: 90%; } .post-footer { margin: 20px -2px 0; padding: 5px 10px; color: #666666; background-color: #f9f9f9; border-bottom: 1px solid #eeeeee; line-height: 1.6; font-size: 90%; } #comments .comment-author { padding-top: 1.5em; border-top: 1px solid #eeeeee; background-position: 0 1.5em; } #comments .comment-author:first-child { padding-top: 0; border-top: none; } .avatar-image-container { margin: .2em 0 0; } #comments .avatar-image-container img { border: 1px solid #ffffff; } /* Comments ----------------------------------------------- */ .comments .comments-content .icon.blog-author { background-repeat: no-repeat; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9sLFwMeCjjhcOMAAAD+SURBVDjLtZSvTgNBEIe/WRRnm3U8RC1neQdsm1zSBIU9VVF1FkUguQQsD9ITmD7ECZIJSE4OZo9stoVjC/zc7ky+zH9hXwVwDpTAWWLrgS3QAe8AZgaAJI5zYAmc8r0G4AHYHQKVwII8PZrZFsBFkeRCABYiMh9BRUhnSkPTNCtVXYXURi1FpBDgArj8QU1eVXUzfnjv7yP7kwu1mYrkWlU33vs1QNu2qU8pwN0UpKoqokjWwCztrMuBhEhmh8bD5UDqur75asbcX0BGUB9/HAMB+r32hznJgXy2v0sGLBcyAJ1EK3LFcbo1s91JeLwAbwGYu7TP/3ZGfnXYPgAVNngtqatUNgAAAABJRU5ErkJggg==); } .comments .comments-content .loadmore a { border-top: 1px solid #999999; border-bottom: 1px solid #999999; } .comments .comment-thread.inline-thread { background-color: #f9f9f9; } .comments .continue { border-top: 2px solid #999999; } /* Accents ---------------------------------------------- */ .section-columns td.columns-cell { border-left: 1px solid #eeeeee; } .blog-pager { background: transparent none no-repeat scroll top center; } .blog-pager-older-link, .home-link, .blog-pager-newer-link { background-color: #ffffff; padding: 5px; } .footer-outer { border-top: 0 dashed #bbbbbb; } /* Mobile ----------------------------------------------- */ body.mobile { background-size: auto; } .mobile .body-fauxcolumn-outer { background: transparent none repeat scroll top left; } .mobile .body-fauxcolumn-outer .cap-top { background-size: 100% auto; } .mobile .content-outer { -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, .15); box-shadow: 0 0 3px rgba(0, 0, 0, .15); } .mobile .tabs-inner .widget ul { margin-left: 0; margin-right: 0; } .mobile .post { margin: 0; } .mobile .main-inner .column-center-inner .section { margin: 0; } .mobile .date-header span { padding: 0.1em 10px; margin: 0 -10px; } .mobile h3.post-title { margin: 0; } .mobile .blog-pager { background: transparent none no-repeat scroll top center; } .mobile .footer-outer { border-top: none; } .mobile .main-inner, .mobile .footer-inner { background-color: #ffffff; } .mobile-index-contents { color: #222222; } .mobile-link-button { background-color: #121fb3; } .mobile-link-button a:link, .mobile-link-button a:visited { color: #ffffff; } .mobile .tabs-inner .section:first-child { border-top: none; } .mobile .tabs-inner .PageList .widget-content { background-color: #eeeeee; color: #000000; border-top: 1px solid #eeeeee; border-bottom: 1px solid #eeeeee; } .mobile .tabs-inner .PageList .widget-content .pagelist-arrow { border-left: 1px solid #eeeeee; } .content-outer { max-width: 1400px !important; } /* fix header */ #header-inner { width: 100% !important; background-position: right !important; } .titlewrapper { padding: 11px 30px 0 !important; } .descriptionwrapper { margin-bottom: 0 !important; } .description { font-size: 120% !important; } /* suppress things */ .date-header { display: none; } #Attribution1 { display: none; } .post-author, .post-timestamp, .reaction-buttons { display: none; } /* h2: sidebar titles */ /* h3: post title */ .post-title , .entry-title { font-size: 180% !important; margin-top: 0 !important; } .entry-title a:link, .entry-title a:visited, .entry-title a:active{ color: #a03; } #main h2 { color:#333; margin-bottom:.4em; margin-top: 13px; font-size:140%; } #main h3 { color:#333; margin-bottom:.4em; margin-top: 13px; font-size:110%; } #main h4 { color:#333; margin-bottom:.5em; } #sidebar-right-1 a:link, #sidebar-right-1 a:visited, #sidebar-right-1 a:active { color: #666; } #sidebar-right-1 h2 { font-size: 100%; color: #666; } /* disable image box */ element.style { } table.chargers img { height: 18px; } table.chargers img { height: 18px; } .post-body img, .post-body .tr-caption-container { padding: 5px; } .post-body img, .post-body .tr-caption-container, .Profile img, .Image img, .BlogList .item-thumbnail img { padding: 0; background: #ffffff; border: none; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; } /* Special items */ a:link img.hilite, a:visited img.hilite { color: #fff; } a:hover img.hilite, a:hover img.hilite2 { color: #f66; } a:active img.hilite { color: #33c; } .hilite {cursor:zoom-in} pre {color:#000000;border:1px solid #000000;} pre.repl { background-color:#e0e0f0; font-size:120%;} pre.arc { background-color:#e0e0f0; font-size:120%;} pre.code { background-color:#e0f0e0; font-size:120%; white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word;text-wrap:unrestricted;} code { font-size: 100%;} blockquote { font-size: 110%; background: transparent url("//static.righto.com/images/blockquote.gif") no-repeat 0 0; margin: 20px 0px; padding: 0px 40px;} div.cite {font-size: .8em;.; font-style: italic; color: #888; margin-bottom: 9px;} a.ref { color: gray;vertical-align: super; text-decoration: none; font-size:60%;margin-left: 2px;} a img.hilite { border: 1px solid; color: #888; z-index: 2; } a img.hilite2, a:active img.hilite2 { border: 1px solid; color: #f6fbf6; } table.chargers { border-width: 1px; border-spacing: 2px; border-style: outset; border-color: gray; border-collapse: collapse; background-color: white; } table.chargers th.maker { padding-right: 5px; text-align: right; } table.chargers th { border-width: 1px; padding: 3px; border-style: inset; border-color: gray; background-color: white; text-align: center; } table.chargers img { height: 18px; } table.chargers td { text-align: center; border-width: 1px; padding: 2px 8px; border-style: inset; border-color: gray; background-color: white; } --></style> <style id='template-skin-1' type='text/css'><!-- body { min-width: 750px; } .content-outer, .content-fauxcolumn-outer, .region-inner { min-width: 750px; max-width: 750px; _width: 750px; } .main-inner .columns { padding-left: 0px; padding-right: 240px; } .main-inner .fauxcolumn-center-outer { left: 0px; right: 240px; /* IE6 does not respect left and right together */ _width: expression(this.parentNode.offsetWidth - parseInt("0px") - parseInt("240px") + 'px'); } .main-inner .fauxcolumn-left-outer { width: 0px; } .main-inner .fauxcolumn-right-outer { width: 240px; } .main-inner .column-left-outer { width: 0px; right: 100%; margin-left: -0px; } .main-inner .column-right-outer { width: 240px; margin-right: -240px; } #layout { min-width: 0; } #layout .content-outer { min-width: 0; width: 800px; } #layout .region-inner { min-width: 0; width: auto; } --></style> <meta content='width=device-width, initial-scale=1.0, maximum-scale=12.0, minimum-scale=.25, user-scalable=yes' name='viewport'/> <meta content='mw8ww70r3jW0GzXY6j1d' name='follow_it-verification-code'/> <link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=6264947694886887540&amp;zx=3c6b5127-1bf4-49a7-9645-31cfcd883d0b' media='none' onload='if(media!=&#39;all&#39;)media=&#39;all&#39;' rel='stylesheet'/><noscript><link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=6264947694886887540&amp;zx=3c6b5127-1bf4-49a7-9645-31cfcd883d0b' rel='stylesheet'/></noscript> <meta name='google-adsense-platform-account' content='ca-host-pub-1556223355139109'/> <meta name='google-adsense-platform-domain' content='blogspot.com'/> </head> <body class='loading'> <div class='navbar no-items section' id='navbar'> </div> <div itemscope='itemscope' itemtype='http://schema.org/Blog' style='display: none;'> <meta content='Ken Shirriff&#39;s blog' itemprop='name'/> </div> <div class='body-fauxcolumns'> <div class='fauxcolumn-outer body-fauxcolumn-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </div> <div class='content'> <div class='content-fauxcolumns'> <div class='fauxcolumn-outer content-fauxcolumn-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </div> <div class='content-outer'> <div class='content-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left content-fauxborder-left'> <div class='fauxborder-right content-fauxborder-right'></div> <div class='content-inner'> <header> <div class='header-outer'> <div class='header-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left header-fauxborder-left'> <div class='fauxborder-right header-fauxborder-right'></div> <div class='region-inner header-inner'> <div class='header section' id='header'><div class='widget Header' data-version='1' id='Header1'> <div id='header-inner' style='background-image: url("https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-4KXwYe0lQ4HFzhAye9vvRlij2ZYvMbfPCnqEE__1o85Fjo3XgefxJQhWRdwR3EzNWNMWT3yMaj2QZaT9GazqQx3C6oWa3-hBNlRHG7f-Oib-lv1Wq_C2_A0rt8xZgs87iNqzRVKK7H0A/s800/background.jpg"); background-position: left; width: 550px; min-height: 105px; _height: 105px; background-repeat: no-repeat; '> <div class='titlewrapper' style='background: transparent'> <h1 class='title' style='background: transparent; border-width: 0px'> <a href="https://www.righto.com/"> Ken Shirriff's blog </a> </h1> </div> <div class='descriptionwrapper'> <p class='description'><span>Computer history, restoring vintage computers, IC reverse engineering, and whatever</span></p> </div> </div> </div></div> </div> </div> <div class='header-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </header> <div class='tabs-outer'> <div class='tabs-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left tabs-fauxborder-left'> <div class='fauxborder-right tabs-fauxborder-right'></div> <div class='region-inner tabs-inner'> <div class='tabs no-items section' id='crosscol'></div> <div class='tabs no-items section' id='crosscol-overflow'></div> </div> </div> <div class='tabs-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <div class='main-outer'> <div class='main-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left main-fauxborder-left'> <div class='fauxborder-right main-fauxborder-right'></div> <div class='region-inner main-inner'> <div class='columns fauxcolumns'> <div class='fauxcolumn-outer fauxcolumn-center-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <div class='fauxcolumn-outer fauxcolumn-left-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <div class='fauxcolumn-outer fauxcolumn-right-outer'> <div class='cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left'> <div class='fauxborder-right'></div> <div class='fauxcolumn-inner'> </div> </div> <div class='cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <!-- corrects IE6 width calculation --> <div class='columns-inner'> <div class='column-center-outer'> <div class='column-center-inner'> <div class='main section' id='main'><div class='widget Blog' data-version='1' id='Blog1'> <div class='blog-posts hfeed'> <div class="date-outer"> <div class="date-posts"> <div class='post-outer'> <div class='post hentry' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='http://static.righto.com/images/agc-rope-simulator/agc-connected-w400.jpg' itemprop='image_url'/> <meta content='6264947694886887540' itemprop='blogId'/> <meta content='4185382083164256337' itemprop='postId'/> <a name='4185382083164256337'></a> <h3 class='post-title entry-title' itemprop='name'> <a href="https://www.righto.com/2019/07/apollo-guidance-computer-dipstiks-and.html">Apollo Guidance Computer: Dipstiks and reverse engineering the core rope simulator</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-4185382083164256337' itemprop='description articleBody'> <p>Onboard the Apollo spacecraft, the revolutionary <a href="https://en.wikipedia.org/wiki/Apollo_Guidance_Computer">Apollo Guidance Computer</a> helped navigate to the Moon and land on its surface. The AGC's software was physically woven into permanent storage called <a href="https://en.wikipedia.org/wiki/Core_rope_memory">core rope memory</a>. We<span id="fnref:owner"><a class="ref" href="#fn:owner" rel="footnote">1</a></span> are restoring an Apollo Guidance Computer (below), which is missing the core ropes, but instead has core rope simulator boxes. These boxes were used during development and ground testing to avoid constantly manufacturing ropes. The core rope simulator is undocumented, so I reverse-engineered it, built an interface, and we used the simulator to run programs on our Apollo Guidance Computer. But we ran into some complications along the way.</p> <p><a href="http://static.righto.com/images/agc-rope-simulator/agc-connected.jpg"><img alt="The Apollo Guidance Computer with the cover removed, showing the wire-wrapped backplane. At the back, rope simulator boxes are visible in the core rope slots. The interface boards at the front are modern." class="hilite" height="458" src="http://static.righto.com/images/agc-rope-simulator/agc-connected-w400.jpg" title="The Apollo Guidance Computer with the cover removed, showing the wire-wrapped backplane. At the back, rope simulator boxes are visible in the core rope slots. The interface boards at the front are modern." width="400" /></a><div class="cite">The Apollo Guidance Computer with the cover removed, showing the wire-wrapped backplane. At the back, rope simulator boxes are visible in the core rope slots. The interface boards at the front are modern.</div></p> <h2>The AGC's core ropes</h2> <p>The Apollo Guidance Computer held six core rope modules, each storing just 6 kilowords of program information (about 12 kilobytes).<span id="fnref:wordlength"><a class="ref" href="#fn:wordlength" rel="footnote">2</a></span> Core rope modules were a bit like a video game ROM cartridge, holding software in a permanent yet removable format. Programs were hard-wired into core rope by weaving wires through magnetic cores. A wire passed through a core for a 1 bit, while a wire going around a core was a 0 bit. By weaving 192 wires through or around each core, each core stored 192 bits, achieving much higher density than read/write core memory that held 1 bit per core.</p> <p><a href="http://static.righto.com/images/agc-rope-simulator/Plate_19.jpg"><img alt="Detail of core rope memory wiring from an early (Block I) Apollo Guidance Computer. Photo from Raytheon." class="hilite" height="282" src="http://static.righto.com/images/agc-rope-simulator/Plate_19-w350.jpg" title="Detail of core rope memory wiring from an early (Block I) Apollo Guidance Computer. Photo from Raytheon." width="350" /></a><div class="cite">Detail of core rope memory wiring from an early (Block I) Apollo Guidance Computer. <a href="https://authors.library.caltech.edu/5456/1/hrst.mit.edu/hrs/apollo/public/visual3.htm">Photo</a> from Raytheon.</div></p> <p>Manufacturing a core rope was a tedious process that took about 8 weeks and cost $15,000 per module. Skilled women wove the rope by hand, threading a hollow wire-filled needle back and forth through the cores, as shown below<span id="fnref:needleworker"><a class="ref" href="#fn:needleworker" rel="footnote">3</a></span>. They had the assistance of an automated system that read the program from a punched tape and positioned an aperture over the matrix of cores. The weaver threaded the needle through the aperture to install the wire in the right location. Once completed, the core rope was mounted in a module along with hundreds of resistors and diodes and encased in epoxy to make it solid for flight. (See <a href="https://www.righto.com/2019/07/software-woven-into-wire-core-rope-and.html">my earlier article on core rope</a> for details.)</p> <p><a href="http://static.righto.com/images/agc-rope-simulator/rope-threader.jpg"><img alt="A woman weaving a core rope memory, wiring software into read-only memory." class="hilite" height="387" src="http://static.righto.com/images/agc-rope-simulator/rope-threader-w300.jpg" title="A woman weaving a core rope memory, wiring software into read-only memory." width="300" /></a><div class="cite">A woman weaving a core rope memory, wiring software into read-only memory.</div></p> <h2>The core rope simulator</h2> <p>Since weaving a core rope was a time-consuming and expensive process, an alternative was required during development and ground testing. In place of the core ropes, NASA used rope simulators<span id="fnref:simulators"><a class="ref" href="#fn:simulators" rel="footnote">4</a></span> that allowed the AGC to load data from an external system. Our Apollo Guidance Computer was used for ground testing so it didn't have core ropes but instead had a core rope simulator. The simulator consists of two boxes that plugged into the AGC's core rope slots, each box filling three rope slots. These boxes are visible in the upper-left side of the AGC below, with round military-style connectors for connection to the external computer.</p> <p><a href="http://static.righto.com/images/agc-rope-simulator/agc-rope-sim.jpg"><img alt="The core rope simulators are installed in the left side of the AGC in place of the real core ropes. Two round connectors on the left allowed the simulators to be connected to an external computer that provided the data." class="hilite" height="365" src="http://static.righto.com/images/agc-rope-simulator/agc-rope-sim-w500.jpg" title="The core rope simulators are installed in the left side of the AGC in place of the real core ropes. Two round connectors on the left allowed the simulators to be connected to an external computer that provided the data." width="500" /></a><div class="cite">The core rope simulators are installed in the left side of the AGC in place of the real core ropes. Two round connectors on the left allowed the simulators to be connected to an external computer that provided the data.</div></p> <p>Although we have <a href="https://www.ibiblio.org/apollo/ElectroMechanical.html">extensive documentation</a> for the Apollo Guidance Computer, I couldn't find any documentation on the simulator boxes. Thus, I had to reverse engineer the boxes by tracing out all the circuitry and then figuring out what the boxes were doing. From the outside, the boxes didn't reveal much. One end of each box has a round MIL-Spec plug for connection to an external system. The other end has three groups of 96 pins that plugged into the AGC. Each group of pins took the place of one core rope module.</p> <p><a href="http://static.righto.com/images/agc-rope-simulator/box-connectors.jpg"><img alt="Each core rope box communicated with the external system via a round 39-pin connector. Each box had three sets of 96 pins that plugged into the AGC, replacing three rope modules." class="hilite" height="235" src="http://static.righto.com/images/agc-rope-simulator/box-connectors-w600.jpg" title="Each core rope box communicated with the external system via a round 39-pin connector. Each box had three sets of 96 pins that plugged into the AGC, replacing three rope modules." width="600" /></a><div class="cite">Each core rope box communicated with the external system via a round 39-pin connector. Each box had three sets of 96 pins that plugged into the AGC, replacing three rope modules.</div></p> <p>Opening up the boxes showed their unusual construction techniques. Part of the circuitry used high-density <a href="https://en.wikipedia.org/wiki/Printed_circuit_board#Cordwood_construction">cordwood construction</a> which mounted components vertically through holes in a metal block. On either side of the block, the component leads were welded to point-to-point wiring. Other circuitry in the boxes used standard integrated circuits (7400-series TTL). But unlike modern printed circuit boards, the chips were mounted inside plastic units called Dipstiks and wire-wrapped together.</p> <p><a href="http://static.righto.com/images/agc-rope-simulator/rope-simulator-opened.jpg"><img alt="A rope simulator box, partially disassembled. The round external connector is visible at the right, and the pins to connect to the AGC at the left. Analog circuitry with cordwood construction is center-left. To the right, several Dipstik modules are visible, white with rows of pins." class="hilite" height="284" src="http://static.righto.com/images/agc-rope-simulator/rope-simulator-opened-w400.jpg" title="A rope simulator box, partially disassembled. The round external connector is visible at the right, and the pins to connect to the AGC at the left. Analog circuitry with cordwood construction is center-left. To the right, several Dipstik modules are visible, white with rows of pins." width="400" /></a><div class="cite">A rope simulator box, partially disassembled. The round external connector is visible at the right, and the pins to connect to the AGC at the left. Analog circuitry with cordwood construction is center-left. To the right, several Dipstik modules are visible, white with rows of pins.</div></p> <h2>Cordwood construction</h2> <p>Cordwood construction was extensively used in the Apollo Guidance Computer for analog circuitry, and the cordwood construction in the rope simulators is similar (below). The white circles in the center are the ends of resistors and diodes mounted vertically through the module, with connections welded on either side. These components are stacked together densely, like wood logs, giving cordwood construction its name. Pulse transformers are under the large gray circles. Similar pulse transformers are on the other side of the module with their orange, yellow, red, and brown wires emerging from the holes. The black wires connect the cordwood circuitry to the digital logic. At the top of the photo, the posts have diodes and resistors mounted behind them, along with connections to the pins that plug into the AGC.</p> <p><a href="http://static.righto.com/images/agc-rope-simulator/cordwood4.jpg"><img alt="A closeup of the cordwood circuitry in a rope simulator box." class="hilite" height="328" src="http://static.righto.com/images/agc-rope-simulator/cordwood4-w500.jpg" title="A closeup of the cordwood circuitry in a rope simulator box." width="500" /></a><div class="cite">A closeup of the cordwood circuitry in a rope simulator box.</div></p> <p>The main purpose of the cordwood circuitry was to provide electrical isolation between the Apollo Guidance Computer's circuitry and the rope simulator boxes. In modern circuitry, this function would be implemented with optoisolators but the rope simulator used small pulse transformers instead. Because each box receives signals directed to three different rope modules, numerous diodes merge the three signals into one. Resistors control the current through the pulse transformers.</p> <p>Reverse-engineering the analog cordwood circuitry was a pain. First, none of the components were visible since they are embedded in the module. I had to use a multimeter to try to figure out what the components were. Second, since cordwood construction has connections on both sides, I spent a lot of time flipping the box back and forth to find the connection I wanted. Finally, I couldn't come up with a good way of drawing a diagram of cordwood construction without ending up in a maze of lines. <!-- What worked best was using GIMP with photos of both sides aligned (with one side mirrored), so I could toggle between front view and back view. --></p> <h2>Digital logic and the Dipstiks</h2> <p>The Dipstik was a plug-in module introduced in 1968 to simplify prototyping with integrated circuits. It replaced printed circuit boards with a packaging system that provided twice the density. (See this vintage <a href="https://twitter.com/TubeTimeUS/status/1107813150282252288">Dipstik ad</a>.) The idea of the Dipstik was a plastic connector block with wire-wrap pins on the bottom for wiring up the circuit. The integrated circuits were clipped into a carrier that fit into the connector block. The carrier had solder lugs on top for additional components, such as decoupling capacitors. (The photo below shows Dipstik modules with one IC carrier removed. Each carrier held 5 integrated circuits.) The pins of the integrated circuit were sandwiched between contacts on the carrier and contacts on the connector block. It seemed like a great idea but turned out to be unreliable. As the plastic flexed and bowed out, the contacts with the pins became unreliable. (This was a problem both for contemporary Dipstik users and for us decades later.) The Dipstik was a <a href="https://www.nytimes.com/1971/10/21/archives/market-place-pkl-stock-up-on-merger-bid.html">stock market failure</a>.</p> <p><a href="http://static.righto.com/images/agc-rope-simulator/dipstik-opened2.jpg"><img alt="A Dipstik package opened up. The carrier (left) holds the ICs, and is inserted into the connector block (right). Photo courtesy of Marc Verdiell." class="hilite" height="312" src="http://static.righto.com/images/agc-rope-simulator/dipstik-opened2-w500.jpg" title="A Dipstik package opened up. The carrier (left) holds the ICs, and is inserted into the connector block (right). Photo courtesy of Marc Verdiell." width="500" /></a><div class="cite">A Dipstik package opened up. The carrier (left) holds the ICs, and is inserted into the connector block (right). Photo courtesy of Marc Verdiell.</div></p> <p>The photo below shows the wire-wrapped connections on the underside of the Dipstiks. Tracing this was extremely tedious since I couldn't follow a wire through the sea of identical blue wires. Instead, I had to beep everything out with a multimeter to find what was connected to what. Then I could construct a <a href="https://github.com/shirriff/rope-simulator/blob/master/schematic.pdf">schematic diagram</a> of the logic circuitry and ponder what it was doing.<span id="fnref:mysteries"><a class="ref" href="#fn:mysteries" rel="footnote">5</a></span> In total, the rope simulator used about 50 ICs.</p> <p><a href="http://static.righto.com/images/agc-rope-simulator/box-opened.jpg"><img alt="Each rope simulator box contains complex circuitry. On the left, wire-wrapped wiring connects the TTL integrated circuits. On the left, the analog components are mounted using cordwood construction. At the back, two voltage regulators in large metal TO-3 packages are mounted on a heat sink." class="hilite" height="338" src="http://static.righto.com/images/agc-rope-simulator/box-opened-w500.jpg" title="Each rope simulator box contains complex circuitry. On the left, wire-wrapped wiring connects the TTL integrated circuits. On the left, the analog components are mounted using cordwood construction. At the back, two voltage regulators in large metal TO-3 packages are mounted on a heat sink." width="500" /></a><div class="cite">Each rope simulator box contains complex circuitry. On the left, wire-wrapped wiring connects the TTL integrated circuits. On the left, the analog components are mounted using cordwood construction. At the back, two voltage regulators in large metal <a href="https://en.wikipedia.org/wiki/TO-3">TO-3</a> packages are mounted on a heat sink.</div></p> <p>Based on the dates on the components, the simulator boxes were built in 1971. Even though this is just a few years after the design of the AGC, the technology in the simulator boxes is much more advanced, illustrating the rapid changes in IC design between the mid-1960s and the early 1970s. The AGC was built with simple integrated circuits, each containing two NOR gates and built with primitive resistor-transistor logic (RTL). The simulator boxes, on the other hand, were built from more complex 7400-series chips<span id="fnref:sn5400"><a class="ref" href="#fn:sn5400" rel="footnote">6</a></span> containing up to a dozen TTL (transistor-transistor logic) gates. Unlike the obsolete flat-pack integrated circuits in the AGC, the simulator boxes used DIP (<a href="https://en.wikipedia.org/wiki/Dual_in-line_package">dual in-line package</a>) ICs, a packaging style that is still in use.</p> <h2>Results of reverse engineering</h2> <p>After tracing out all the circuitry, I figured out how the rope simulator worked and created a <a href="https://github.com/shirriff/rope-simulator/blob/master/schematic.pdf">schematic</a>.</p> Essentially, one box decodes the address being accessed, while the second box sends the desired data to the AGC. (I'll call these the "address box" and "data box".)<span id="fnref:addressbox"><a class="ref" href="#fn:addressbox" rel="footnote">7</a></span></p> <p>The address box takes the rope signals and converts them into a binary address. This task is not straightforward because the signals it receives are 14-volt high-current pulses designed to flip the rope cores. These pulses are also separated in time since some flip the core and others flip the core back. Finally, the pulses sent to the ropes are not a simple address, but also signals to select one of the 6 rope modules, signals to select one of 12 strands in a module.</p> <p>The address box uses pulse transformers to convert the 14-volt pulses into TTL signals. It has a bunch of AND-OR logic to convert the signals into a binary address. (This is not trivial because each module holds 6 kilowords, not a power of 2, so a lot of bit manipulation is required.) A flip flop latches the address when it is available. Finally, resistor-capacitor one-shots control the timing, determining from the various signals when the address is ready and when the result should be sent to the AGC.</p> <p>The data box is simpler. It receives 16 bits of data from the external system and sends signals to the AGC's sense amplifiers simulating the millivolt output from a core. These signals are generated via pulse transformers. The address box and data box communicate with each other via wires on the AGC backplane.</p> <p>The boxes communicate with the external system via differential signals, to avoid picking up noise on long cables. The boxes contain <a href="https://www.ti.com/lit/ds/symlink/lm309.pdf">LM109</a> 5-volt regulators to power their TTL circuits. One box receives unregulated DC through the external connector, and sends unregulated DC to the other box through the AGC's backplane wiring. (This seems strange to me.)</p> <p><a href="http://static.righto.com/images/agc-rope-simulator/box-wirewrap.jpg"><img alt="With the address box opened, the wire-wrapped circuitry is visible." class="hilite" height="343" src="http://static.righto.com/images/agc-rope-simulator/box-wirewrap-w500.jpg" title="With the address box opened, the wire-wrapped circuitry is visible." width="500" /></a><div class="cite">With the address box opened, the wire-wrapped circuitry is visible.</div></p> <h2>The BeagleBone interface</h2> <p>Once I had reverse-engineered the core rope simulator, the next step was to build an interface that could provide program data to the simulator. I used a <a href="https://beagleboard.org/bone">BeagleBone</a>, a tiny single-board Linux system. The advantage of the BeagleBone is that it includes fast microcontrollers that could respond to the AGC's memory requests quickly, in real time. (I've written about the BeagleBone's <a href="https://www.righto.com/2016/08/pru-tips-understanding-beaglebones.html">PRU microcontrollers</a> before, and used them to make a <a href="https://www.righto.com/2018/01/xerox-altos-3-mbs-ethernet-building.html">Xerox Alto Ethernet interface</a>.)</p> <p><a href="http://static.righto.com/images/agc-rope-simulator/beaglebone-interface.jpg"><img alt="The interface to the rope simulator consists of a board plugged into a BeagleBone. The two cables from the interface board go to the two simulator boxes." class="hilite" height="407" src="http://static.righto.com/images/agc-rope-simulator/beaglebone-interface-w350.jpg" title="The interface to the rope simulator consists of a board plugged into a BeagleBone. The two cables from the interface board go to the two simulator boxes." width="350" /></a><div class="cite">The interface to the rope simulator consists of a board plugged into a BeagleBone. The two cables from the interface board go to the two simulator boxes.</div></p> <p>I designed an interface board that plugged into the BeagleBone. The board is pretty straightforward: some <a href="https://www.ti.com/lit/ds/symlink/am26c32.pdf">AM26C32</a> differential line receivers to convert the differential signals from the simulator into 3.3V logic signals for the BeagleBone, and some <a href="https://www.ti.com/lit/ds/symlink/am26c31.pdf">AM26C31</a> differential line drivers to send signals to the simulator.<span id="fnref:cable"><a class="ref" href="#fn:cable" rel="footnote">8</a></span> I designed the board in KiCad and <a href="https://www.pcbway.com/">PCBWay</a> manufactured it. They are a sponsor of our AGC restoration, so send them some business :-)</p> <p>I wrote some software that runs on the PRU, the BeagleBone's microcontroller. This software is basically a state machine that waits for an address from the simulator box, waits for the timing signal, reads the word from BeagleBone RAM, and sends the word to the simulator box. The software is on <a href="https://github.com/shirriff/rope-simulator/blob/master/beaglebone/pru/agc_pru.c">Github</a>.</p> <h2>Problems with the core rope simulator</h2> <p>The core rope simulator boxes were not built to the standard of the Apollo Guidance Computer, and I ended up spending a lot of time debugging them.<span id="fnref:infrastructure"><a class="ref" href="#fn:infrastructure" rel="footnote">10</a></span> Many welds in the cordwood circuitry were broken and needed to be soldered. (I don't know if the welds went bad over time or if we broke connections while reverse engineering.) We also found a short circuit on a Dipstik and a bad IC.</p> <p><a href="http://static.righto.com/images/agc-rope-simulator/agc-with-scope.jpg"><img alt="Debugging the simulator boxes. We&#39;re used Marc&#39;s vintage Tektronix 7854 scope (1980) to examine the pulse transformer&#39;s differential signals. The problem turned out to be a broken connection in the cordwood circuitry. Behind the AGC are the power supplies for the AGC and the rope simulator." class="hilite" height="275" src="http://static.righto.com/images/agc-rope-simulator/agc-with-scope-w500.jpg" title="Debugging the simulator boxes. We&#39;re used Marc&#39;s vintage Tektronix 7854 scope (1980) to examine the pulse transformer&#39;s differential signals. The problem turned out to be a broken connection in the cordwood circuitry. Behind the AGC are the power supplies for the AGC and the rope simulator." width="500" /></a><div class="cite">Debugging the simulator boxes. We're used Marc's vintage <a href="http://w140.com/tekwiki/wiki/7854">Tektronix 7854 scope</a> (1980) to examine the pulse transformer's differential signals. The problem turned out to be a broken connection in the cordwood circuitry. Behind the AGC are the power supplies for the AGC and the rope simulator.</div></p> <p>The Dipstiks were the worst problem, as many of the contacts between a Dipstik and the IC were intermittent. The problem was that the IC pins are sandwiched between contacts in the Dipstik carrier and contacts in the Dipstik connector block. The plastic Dipstiks tended to bow outwards, resulting in intermittent bad contacts. By bending the IC pins into S curves, Marc was able to keep the pins in contact with both sides, at least for a little while. But after a few hours, the soft IC pins would bend back and connections became unreliable again, so we don't have a good long-term fix.</p> <p>The most interesting problem was a race condition between two signals from the AGC that should have dropped simultaneously. They fed two ends of a pulse transformer coil, so the transformer should have produced no signal. However, one signal dropped a bit slower than the other, causing a glitch pulse from the pulse transformer.<span id="fnref:mysteries"><a class="ref" href="#fn:mysteries" rel="footnote">5</a></span> Unfortunately, the digital logic in the simulator box was asynchronous, so the glitch latched a bad address bit into the box's flip flops, causing an access to the wrong memory location. Eventually, we tracked the problem down and put capacitors across the offending signals to filter out the glitch. Unfortunately, we used capacitors that were a bit too large and delayed the address signal too much in other circumstances, causing different errors. We put in smaller capacitors and we were finally able to successfully run programs on the AGC, using the vintage core rope simulator.</p> <!-- Some @CuriousMarc video of debugging the simulator boxes is [here](https://youtu.be/NNlgJ52wuGE?t=500). --> <h2>Conclusion</h2> <p>The Apollo Guidance Computer used core ropes for program storage. Since it wasn't practical to constantly manufacture core ropes during development, rope simulators were used in place of the core rope modules. I reverse-engineered the rope simulator and built a BeagleBone-based interface to drive it. We successfully ran programs on the AGC through the rope simulator. The rope simulator, however, had many problems and wasn't very reliable.</p> <p>We will be demonstrating the Apollo Guidance Computer next week to celebrate the 50th anniversary of the Moon landing. Come see these historic demos at the Cradle Of Aviation Museum (Long Island) on July 18 and the MIT Museum on July 20.</p> <p>@CuriousMarc made a video (below) showing our work with the core rope simulator. I announce my latest blog posts on Twitter, so follow me <a href="https://twitter.com/kenshirriff">@kenshirriff</a> for future articles. I also have an <a href="https://www.righto.com/feeds/posts/default">RSS feed</a>. My rope simulator files are on <a href="https://github.com/shirriff/rope-simulator">Github</a>. Thanks to <a href="https://www.pcbway.com/">PCBWay</a> for sponsoring this board.</p> <iframe width="560" height="315" src="https://www.youtube.com/embed/2qe4W_USweE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <h2>Notes and references</h2> <div class="footnote"> <ol> <li id="fn:owner"> <p>The AGC restoration team consists of Mike Stewart (creator of <a href="https://github.com/virtualagc/agc_simulation">FPGA AGC</a>), <a href="https://rescue1130.blogspot.com/2018/11/restoring-apollo-guidance-computer-part.html">Carl Claunch</a>, Marc Verdiell (<a href="https://www.youtube.com/channel/UC3bosUr3WlKYm4sBaLs-Adw">CuriousMarc</a> on YouTube) and myself. The AGC that we're restoring belongs to a private owner who picked it up at a scrapyard in the 1970s after NASA scrapped it. For simplicity, I refer to the AGC we're restoring as "our AGC".&#160;<a class="footnote-backref" href="#fnref:owner" rev="footnote" title="Jump back to footnote 1 in the text">&#8617;</a></p> </li> <li id="fn:wordlength"> <p>The AGC was a 15-bit machine: each word consisted of 15 data bits and a parity bit. While a word that isn't a power of two may seem bizarre now, computers in the 1960s were designed with whatever word size fit the problem.&#160;<a class="footnote-backref" href="#fnref:wordlength" rev="footnote" title="Jump back to footnote 2 in the text">&#8617;</a></p> </li> <li id="fn:needleworker"> <p>The original caption on the photo was: "Space age needleworker 'weaves' core rope memory for guidance computers used in Apollo missions. Memory modules will permanently store mission profile data on which critical maneuvers in space are based. Core rope memories are fabricated by passing needle-like, hollow rod containing a length of fine wire through cores in the module frame. Module frame is moved automatically by computer-controlled machinery to position proper cores for weaving operation. Apollo guidance computer and associated display keyboard are produced at Raytheon Company plant in Waltham, Massachusetts." Caption and photo are from a Raytheon document, courtesy of <a href="http://semiconductormuseum.com/Museum_Index.htm">Transistor Museum</a>.&#160;<a class="footnote-backref" href="#fnref:needleworker" rev="footnote" title="Jump back to footnote 3 in the text">&#8617;</a></p> </li> <li id="fn:simulators"> <p>Several different core rope simulators were built for the AGC. The <a href="http://www.ibiblio.org/apollo/Documents/HSI-208487.pdf">AGC monitor</a> provided a debugging console with lights and switches along with the rope simulator. The <a href="http://klabs.org/history/ech/memos_misc/e-2402.pdf">Portafam</a> was a rope simulator that could load programs from magnetic tape. While these rope simulators had some documentation, unfortunately, I couldn't find any documentation on the Raytheon rope simulator that we had, so I had to reverse engineer everything.&#160;<a class="footnote-backref" href="#fnref:simulators" rev="footnote" title="Jump back to footnote 4 in the text">&#8617;</a></p> </li> <li id="fn:mysteries"> <p>I figured out all the circuitry except for two mysteries. The first mystery is the parity circuit, using two uncommon <a href="https://www.ti.com/lit/ds/symlink/sn54180.pdf">74180</a> parity generator chips. These are not used for the memory parity bit, which is supplied externally. They do not check the address parity supplied by the AGC. It appears that based on an external switch they will optionally replace address bit 7 with the parity of the other address bits. Lacking an address bit, the system would then be unusable. We left the parity switched off and everything worked fine.</p> <p>The second mystery is a transistor that looks like it would amplify the strand select signal. The problem is that the transistor's collector isn't connected to anything, so the transistor is unpowered and doesn't function. When we encountered timing issues with the strand select signal, we powered up this transistor to see if it helped, but it made things worse. In addition, the transistor appears to have been added to the cordwood circuitry at a later date. We ended up ignoring the transistor.&#160;<a class="footnote-backref" href="#fnref:mysteries" rev="footnote" title="Jump back to footnote 5 in the text">&#8617;</a></p> </li> <li id="fn:sn5400"> <p>The TTL chips in the interface boxes were 5400-series chips. These are the military version of the well-known 7400-series, identical except operating over a wider temperature range.&#160;<a class="footnote-backref" href="#fnref:sn5400" rev="footnote" title="Jump back to footnote 6 in the text">&#8617;</a></p> </li> <li id="fn:addressbox"> <p>The split into "address box" and "data box" isn't exact. Due to the way the rope slots are wired, the data box determines which of the 6 modules are being addressed and provides this information to the address box.&#160;<a class="footnote-backref" href="#fnref:addressbox" rev="footnote" title="Jump back to footnote 7 in the text">&#8617;</a></p> </li> <li id="fn:cable"> <p>I had some difficulty getting the round MIL-spec 20-39S connectors to attach to the simulator boxes, since they have unusual keying. There are a zillion slightly-different variants of these connectors, many costing hundreds of dollars. I ended up getting connectors off eBay and Marc <a href="https://youtu.be/GTJLaSJwjAg?t=504">milled the keying off</a> so the connectors worked. I used <a href="https://en.wikipedia.org/wiki/25-pair_color_code">25-pair</a> <a href="https://en.wikipedia.org/wiki/Telco_cable">Amphenol telco cables</a> between the BeagleBone and the simulator. Soldering the wires to the connectors was more of a pain than I expected.&#160;<a class="footnote-backref" href="#fnref:cable" rev="footnote" title="Jump back to footnote 8 in the text">&#8617;</a></p> </li> <li id="fn:scope"> <p>Viewing the pulse transformer signals on a scope was difficult because you need to see the small differential signal across the transformer. Since we didn't have a differential probe for the modern scopes, we used Marc's vintage scope that did have a differential probe. (You might think you could subtract the two signals with a modern scope, but the problem was that the difference was much smaller than the common-mode voltage, so you essentially get zero when you subtract.)&#160;<a class="footnote-backref" href="#fnref:scope" rev="footnote" title="Jump back to footnote 9 in the text">&#8617;</a></p> </li> <li id="fn:infrastructure"> <p>We built some infrastructure to help debug the simulator boxes. I tested the boxes extensively outside the AGC, using an Arduino and a power transistor to generate test signals. I added debugging code to the BeagleBone to detect when something went wrong, and illuminated a status LED on my interface board. I also used the BeagleBone to generate an oscilloscope trigger signal at a known-bad address, letting us see the analog signals at that specific point. Mike wrote some FPGA code to check the data from the simulator box against the data the AGC should have read, detecting whenever something went wrong. Finally, I logged the addresses that the BeagleBone saw, while Mike logged that addresses that the AGC was sending. By comparing the addresses, we could see which addresses were bad.</p> <p>I learned a few lessons from my interface board that I'll apply to future boards. Putting an RGB status LED on the board was my best idea, since it made it much easier to tell what was happening. I should have exposed the BeagleBone's serial port connector on my interface board. As it was, if I ran into any problems booting the BeagleBone, I had to pull off the interface board, attach the FTDI serial adapter, fix the problem via the serial console, remove the serial adapter, and then reinstall the interface board. Finally, I should have exposed a couple generic I/O pins for functions such as oscilloscope triggering. Instead, I had to solder temporary wires onto my interface board.&#160;<a class="footnote-backref" href="#fnref:infrastructure" rev="footnote" title="Jump back to footnote 10 in the text">&#8617;</a></p> </li> </ol> </div> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'><span class='post-comment-link'> <a class='comment-link' href='https://www.blogger.com/comment/fullpage/post/6264947694886887540/4185382083164256337' onclick=''> 7 comments: </a> </span> <span class='post-icons'> <span class='item-action'> <a href='https://www.blogger.com/email-post/6264947694886887540/4185382083164256337' title='Email Post'> <img alt='' class='icon-action' height='13' src='http://img1.blogblog.com/img/icon18_email.gif' width='18'/> </a> </span> <span class='item-control blog-admin pid-1138732533'> <a href='https://www.blogger.com/post-edit.g?blogID=6264947694886887540&postID=4185382083164256337&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <span class='post-backlinks post-comment-link'> </span> <div class='post-share-buttons goog-inline-block'> <a class='goog-inline-block share-button sb-email' href='https://www.blogger.com/share-post.g?blogID=6264947694886887540&postID=4185382083164256337&target=email' target='_blank' title='Email This'><span class='share-button-link-text'>Email This</span></a><a class='goog-inline-block share-button sb-blog' href='https://www.blogger.com/share-post.g?blogID=6264947694886887540&postID=4185382083164256337&target=blog' onclick='window.open(this.href, "_blank", "height=270,width=475"); return false;' target='_blank' title='BlogThis!'><span class='share-button-link-text'>BlogThis!</span></a><a class='goog-inline-block share-button sb-twitter' href='https://www.blogger.com/share-post.g?blogID=6264947694886887540&postID=4185382083164256337&target=twitter' target='_blank' title='Share to X'><span class='share-button-link-text'>Share to X</span></a><a class='goog-inline-block share-button sb-facebook' href='https://www.blogger.com/share-post.g?blogID=6264947694886887540&postID=4185382083164256337&target=facebook' onclick='window.open(this.href, "_blank", "height=430,width=640"); return false;' target='_blank' title='Share to Facebook'><span class='share-button-link-text'>Share to Facebook</span></a><a class='goog-inline-block share-button sb-pinterest' href='https://www.blogger.com/share-post.g?blogID=6264947694886887540&postID=4185382083164256337&target=pinterest' target='_blank' title='Share to Pinterest'><span class='share-button-link-text'>Share to Pinterest</span></a> </div> </div> <div class='post-footer-line post-footer-line-2'><span class='post-labels'> Labels: <a href="https://www.righto.com/search/label/Apollo" rel='tag'>Apollo</a>, <a href="https://www.righto.com/search/label/electronics" rel='tag'>electronics</a>, <a href="https://www.righto.com/search/label/reverse-engineering" rel='tag'>reverse-engineering</a> </span> </div> <div class='post-footer-line post-footer-line-3'></div> </div> </div> </div> </div></div> <div class="date-outer"> <div class="date-posts"> <div class='post-outer'> <div class='post hentry' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='http://static.righto.com/images/agc-bitcoin/agc-connected-w400.jpg' itemprop='image_url'/> <meta content='6264947694886887540' itemprop='blogId'/> <meta content='1033302168361681428' itemprop='postId'/> <a name='1033302168361681428'></a> <h3 class='post-title entry-title' itemprop='name'> <a href="https://www.righto.com/2019/07/bitcoin-mining-on-apollo-guidance.html">Bitcoin mining on an Apollo Guidance Computer: 10.3 seconds per hash</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-1033302168361681428' itemprop='description articleBody'> <p>We've been restoring an Apollo Guidance Computer<span id="fnref:owner"><a class="ref" href="#fn:owner" rel="footnote">1</a></span>. Now that we have the world's only working AGC, I decided to write some code for it. Trying to mine Bitcoin on this 1960s computer seemed both pointless and anachronistic, so I had to give it a shot. Implementing the Bitcoin hash algorithm in assembly code on this 15-bit computer was challenging, but I got it to work. Unfortunately, the computer is so slow that it would take about a million times the age of the universe to successfully mine a Bitcoin block.</p> <p><a href="http://static.righto.com/images/agc-bitcoin/agc-connected.jpg"><img alt="The Apollo Guidance Computer powered up. The cover is off, showing the computer&#39;s purple wire-wrap wiring of the backplane. We built the interfaces that are plugged into the front of the computer. At the back, vintage core rope simulator boxes are visible in the core rope slots." class="hilite" height="458" src="http://static.righto.com/images/agc-bitcoin/agc-connected-w400.jpg" title="The Apollo Guidance Computer powered up. The cover is off, showing the computer&#39;s purple wire-wrap wiring of the backplane. We built the interfaces that are plugged into the front of the computer. At the back, vintage core rope simulator boxes are visible in the core rope slots." width="400" /></a><div class="cite">The Apollo Guidance Computer powered up. The cover is off, showing the computer's purple wire-wrap wiring of the backplane. We built the interfaces that are plugged into the front of the computer. At the back, vintage core rope simulator boxes are visible in the core rope slots.</div></p> <p>The <a href="https://en.wikipedia.org/wiki/Apollo_Guidance_Computer">Apollo Guidance Computer</a> was developed in the 1960s for the Apollo missions to the Moon. Onboard the Apollo spacecraft, these computers provided guidance, navigation, and controlled the engines. In an era when most computers ranged from refrigerator-sized to room-sized, the Apollo Guidance Computer was small enough to fly in space. One of the very first computers to use integrated circuits, the AGC was 70 pounds and under a cubic foot in size.</p> <p><a href="http://static.righto.com/images/agc-bitcoin/dsky-display.jpg"><img alt="The output from the Bitcoin mining program, displayed on the Display/Keyboard (DSKY). The display shows part of the Bitcoin hash in octal. The DSKY is a modern replica, hooked up to the genuine AGC." class="hilite" height="314" src="http://static.righto.com/images/agc-bitcoin/dsky-display-w300.jpg" title="The output from the Bitcoin mining program, displayed on the Display/Keyboard (DSKY). The display shows part of the Bitcoin hash in octal. The DSKY is a modern replica, hooked up to the genuine AGC." width="300" /></a><div class="cite">The output from the Bitcoin mining program, displayed on the Display/Keyboard (DSKY). The display shows part of the Bitcoin hash in octal. The DSKY is a modern replica, hooked up to the genuine AGC.</div></p> <p>The Apollo Guidance Computer also pushed the boundaries of software engineering under the leadership of <a href="https://en.wikipedia.org/wiki/Margaret_Hamilton_(software_engineer)">Margaret Hamilton</a>. It had a cutting-edge real-time operating system that supported multiple prioritized jobs<span id="fnref:newjob"><a class="ref" href="#fn:newjob" rel="footnote">2</a></span> along with fault detection and handling. Much of the software was in assembly language but the AGC also had an <a href="https://www.ibiblio.org/apollo/assembly_language_manual.html#Interpreter_Instruction_Set">interpreter</a> designed for navigation algorithms. The interpreter implemented a virtual machine that provided vector and matrix arithmetic along with trigonometry and double- and triple-precision numbers.</p> <h2>How Bitcoin mining works</h2> <p>As the leading digital currency, Bitcoin has received a lot of attention in the past few years. The Bitcoin system can be thought of as a ledger that keeps track of who owns which Bitcoins, and allows them to be transferred from one person to another. The revolutionary feature of Bitcoin is there's no central machine or authority keeping track of things. Instead, the records are spread across thousands of machines on the Internet, and the system works with nobody in charge.</p> <p>To ensure everyone agrees on which transactions are valid, Bitcoin uses a process called mining&mdash;about every 10 minutes a block of outstanding transactions is mined, which makes the block "official". Bitcoin mining is designed so it takes an insanely huge amount of computational effort to mine a block, so nobody can take over the mining process. Miners compete against each other, generating trillions and trillions of random "hashes" until someone finds a lucky one that starts with 18 zeros.<span id="fnref:difficulty"><a class="ref" href="#fn:difficulty" rel="footnote">3</a></span> This hash forms a successfully mined block, and then everyone moves on to the next block. The idea is that getting 18 zeros in a row randomly is extremely unlikely, so it takes a huge number of tries before someone succeeds. It's kind of like a lottery, where miners keep trying until someone "wins", but finding a valid hash is less likely than finding a single grain of sand out of all the sand on Earth.</p> <p>Each time a block is successfully mined, new Bitcoins are created; currently, a successful miner gets 12.5 new Bitcoins (worth $140,000) as well as transaction fees. The possibility of receiving $140,000 every 10 minutes motivates miners to build datacenters full of specialized hardware using huge amounts of electricity.<span id="fnref:electricity"><a class="ref" href="#fn:electricity" rel="footnote">4</a></span></p> <p><a href="https://picasaweb.google.com/lh/photo/3V5HFm-d02drHoFB3Vqs0qNTQ8Yf_fOdBXli6Rl3Pxs"><img alt="Structure of a Bitcoin block" class="hilite" height="351" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTzbRlXciFuI9hQYyvAk1GtDu0rvixAJPqjSDl61xstT9ROlpM-2t7m6KFnW8xJRaPi0CIUYG8CbZIyD16LEyDneGsbIeZO2onwyelluuNG4bjbZEIwz5Gqk-_fMWLtk2gclGg8nhyphenhyphenfWOr/w600/block-diagram-ghash.png" title="Structure of a Bitcoin block" width="600"> </a></p> <div class="cite"> Structure of a Bitcoin block. The data in yellow is hashed to yield the block hash, which becomes the identifier for the block. The block is linked to the previous block by including the previous block's hash, forming the blockchain. The Merkle root is a hash of all the transactions in the block. </div> <p>The diagram above shows what actually goes into a block that is mined. The yellow part is the block header (which gets hashed), and it is followed by the transactions that go into the block. Each block contains the hash of the previous block, causing all the blocks to be linked together forming the <em>blockchain</em>. On the right, you can see that the hash above was successful because it starts with lots of zeros.</p> <p>To summarize the mining process: you collect new Bitcoin transactions and create a header as in the diagram above. You generate the cryptographic hash of the block. If by some incredible chance the result starts with 18 zeros you send the block into the Bitcoin network and "win" $140,000 in Bitcoin. Otherwise, you change the header slightly and try again as fast as possible. When someone else succeeds in mining the block, you start over from the new block and new transactions.<span id="fnref:bitcoin-refs"><a class="ref" href="#fn:bitcoin-refs" rel="footnote">5</a></span></p> <h2>The SHA-256 hash algorithm used by Bitcoin</h2> <p>Where do these hashes come from? Bitcoin mining is based on cryptography, with a "hash function" that converts a block of data into an essentially random hash value. The hash algorithm is designed to be simple to implement, but cryptographically secure: there's no known short cut to finding a successful hash other than trying zillions of hashes through brute force. In particular, Bitcoin uses a standard cryptographic hash function called SHA-256.<span id="fnref:double"><a class="ref" href="#fn:double" rel="footnote">6</a></span> This algorithm is so simple you can literally <a href="https://www.righto.com/2014/09/mining-bitcoin-with-pencil-and-paper.html">do it by hand</a>, but it manages to scramble the data entirely unpredictably.</p> <p>The SHA-256 algorithm can be described in about a page of <a href="https://en.wikipedia.org/wiki/SHA-2#Pseudocode">pseudocode</a>. It consists of a scrambling step called a "round", repeated 64 times. The diagram below shows one round, which takes eight 4-byte hash values, A through H, performs a few operations, and generates new values for A through H. As can be seen from the diagram, only A and E are changed in a round, while the others are just shifted over. Even so, after 64 rounds the input data will be completely scrambled, generating the unpredictable hash output.</p> <p><a href="http://static.righto.com/images/agc-bitcoin/SHA-2.svg.png"><img alt="This diagram shows the computations during one round of SHA-256. This process is repeated 64 times. Source: Wikipedia created by kockmeyer, CC BY-SA 3.0." class="hilite" height="318" src="http://static.righto.com/images/agc-bitcoin/SHA-2.svg-w450.png" title="This diagram shows the computations during one round of SHA-256. This process is repeated 64 times. Source: Wikipedia created by kockmeyer, CC BY-SA 3.0." width="450" /></a><div class="cite">This diagram shows the computations during one round of SHA-256. This process is repeated 64 times. Source: <a href="https://commons.wikimedia.org/wiki/File:SHA-2.svg#mediaviewer/File:SHA-2.svg">Wikipedia</a> created by kockmeyer, <a href="http://creativecommons.org/licenses/by-sa/3.0/">CC BY-SA 3.0</a>.</div></p> <p>The operations in SHA-256 are simple bit operations. The red boxes above indicate 32-bit addition, generating new values for A and E. The <i>Ch</i> "choose" box chooses bits from F or G, based on the value of input E. The <i>&Sigma;</i> "sum" boxes rotate and sum bits. The <i>Ma</i> "majority" box looks at the bits in each position of A, B, and C, and selects whichever value is in the majority. The <i>K<sub>t</sub></i> values are constants. The input data enters the algorithm through the <i>W<sub>t</sub></i> values. These operations can be easily implemented on a computer using simple arithmetic and logic operations.<span id="fnref:ecdsa"><a class="ref" href="#fn:ecdsa" rel="footnote">7</a></span> (The operations can also be easily implemented in a custom logic circuit, which is why Bitcoin mining chips are popular.)</p> <h2>The Apollo Guidance Computer's processor</h2> <p>The AGC doesn't have a microprocessor, as it was built years before microprocessors were developed. Instead, the processor is built from about 5600 NOR gates. These gates were combined to make circuits such as flip flops for registers, binary adders, control logic, and so forth. The AGC was one of the first computers to use integrated circuits; each integrated circuit held two NOR gates. The computer had 24 logic modules similar to the one below. Each logic module had 120 integrated circuits (240 NOR gates). For example, the registers and ALU were implemented with four modules, each implementing 4 bits of the processor.</p> <p><a href="http://static.righto.com/images/agc-bitcoin/logic-module.jpg"><img alt="A logic module from the Apollo Guidance Computer. The module consists of 120 integrated circuits, each one implementing two NOR gates. Photo courtesy of Mike Stewart." class="hilite" height="123" src="http://static.righto.com/images/agc-bitcoin/logic-module-w600.jpg" title="A logic module from the Apollo Guidance Computer. The module consists of 120 integrated circuits, each one implementing two NOR gates. Photo courtesy of Mike Stewart." width="600" /></a><div class="cite">A logic module from the Apollo Guidance Computer. The module consists of 120 integrated circuits, each one implementing two NOR gates. Photo courtesy of Mike Stewart.</div></p> <p>The computer's architecture was unusual by modern standards: it used a 15-bit word, along with parity. (Back then, computers often had a word size that fit the application, not necessarily a power of 2.) The AGC had just 2K words of RAM, along with 36K words of ROM. Its ROM was constructed from core rope memory. (I wrote about the AGC's RAM core memory <a href="https://www.righto.com/2019/01/inside-apollo-guidance-computers-core.html">here</a> and core rope <a href="https://www.righto.com/2019/07/software-woven-into-wire-core-rope-and.html">here</a>).</p> <p>The Apollo Guidance Computer was slow even by 1960s standards; it could perform about 40,000 additions per second. (In the AGC's defense, this was an era when most computers ranged from refrigerator-sized to room-filling, so the AGC did well for its size.) The AGC's main strength was I/O: it had hundreds of I/O connections to provide real-time control of the spacecraft.</p> <h2>Implementing SHA-256 on the Apollo Guidance Computer</h2> <p><a href="https://github.com/shirriff/virtualagc">My implementation</a> of the SHA-256 hash algorithm implementation follows the <a href="https://en.wikipedia.org/wiki/SHA-2#Pseudocode">pseudocode</a> pretty closely. I ran into some difficulties, though, since the AGC's <a href="https://www.ibiblio.org/apollo/assembly_language_manual.html#AGC4_Instruction_Set">instruction set</a> lacks many features of modern computers. For instance, the AGC (like many 1960s computers) didn't have a stack, so you had to keep track of the return address for each subroutine call.</p> <p>Another complication was that the SHA-256 algorithm uses 32-bit unsigned numbers, while the AGC used 15-bit signed numbers in obsolete 1's complement form, so even addition required some tricky code. To fit a 32-bit number into the AGC, I split each word into a 4-bit chunk and two 14-bit chunks. (I used 14-bit chunks and not 15-bit chunks because I needed to use unsigned arithmetic.)</p> <p>The next issue was that the AGC has very limited memory. The AGC, like most computers of the 1960s, used magnetic core memory, storing each bit in a tiny magnetized ferrite ring. Since core memory was fairly bulky, the AGC had just 2K words (approximately 4K bytes) of RAM. The AGC's addressing scheme made things more complicated since you could only access 256 words unless you used an inconvenient bank switching mechanism. The problem is that the SHA-256 algorithm uses eight (32-bit) hash values, a 64-word message table, and 8 words of intermediate values. These three arrays alone used up 240 AGC words, leaving about 16 words for everything else (temporary values, subroutine return addresses, loop counters, pointers, etc.) I managed to get everything to fit in one bank by reusing these 16 words for multiple purposes, but I spent a lot of time debugging problems when a variable clobbered a location still in use.</p> <p><a href="http://static.righto.com/images/agc-bitcoin/erasable-module.jpg"><img alt="For RAM, the Apollo Guidance Computer used this 2 kiloword core memory module." class="hilite" height="160" src="http://static.righto.com/images/agc-bitcoin/erasable-module-w550.jpg" title="For RAM, the Apollo Guidance Computer used this 2 kiloword core memory module." width="550" /></a><div class="cite">For RAM, the Apollo Guidance Computer used this 2 kiloword core memory module.</div></p> <!-- The AGC had some strange multi-purpose instructions due to the small size of the instruction set. Each instruction was 15 bits, of which 12 bits were used for the address. Three bits doesn't leave much for the opcode (i.e. 8 instructions), so the instruction set was extended in various ways: a prefix instruction to extend the instruction set, special addresses that resulted in different operations, and opcodes that had various side effects. --> <p>Most modern computers have shift and rotate instructions to manipulate words, but the AGC instead used three special registers. Writing to a special register would cycle the value right one bit, shift the value right, or cycle the value left. The SHA-256 algorithm uses many 32-bit shifts and rotates, which I had to convert into loops using the 15-bit cycle register. The point is that a shift operation like <code>x&gt;&gt;10</code> is trivial in C, but I needed to implement a <a href="https://github.com/shirriff/virtualagc/blob/master/Borealis/BITCOIN.agc#L641">whole subroutine</a> to do it on the AGC.</p> <p><a href="http://static.righto.com/images/agc-bitcoin/agc-photo.jpg"><img alt="Our Apollo Guidance Computer and replica DSKY. The computer&#39;s I/O connectors are visible at the front of the computer. six core rope slots at the back are empty. The photo is an homage to this classic AGC photo." class="hilite" height="321" src="http://static.righto.com/images/agc-bitcoin/agc-photo-w500.jpg" title="Our Apollo Guidance Computer and replica DSKY. The computer&#39;s I/O connectors are visible at the front of the computer. six core rope slots at the back are empty. The photo is an homage to this classic AGC photo." width="500" /></a><div class="cite">Our Apollo Guidance Computer and replica DSKY. The computer's I/O connectors are visible at the front of the computer. six core rope slots at the back are empty. The photo is an homage to <a href="https://commons.wikimedia.org/wiki/File:Agc_view.jpg">this classic AGC photo</a>.</div></p> <!-- The `CCS` instruction&mdash;Count, Compare and Skip&mdash;shows some of the strangeness of the AGC's instruction set. This instruction was used for most of the looping in the code. It loaded a counter value from memory, decremented it, and then did a jump to one of the four following instructions based on the original value. A positive value executed the next instruction, a positive zero skipped one instruction, a negative value skipped two instructions, and negative zero skipped three instructions. (Note that with 1's complement, positive zero and negative zero were two different numbers.) --> <p>To keep the instruction set and code size small, the AGC had some instructions with side effects you wouldn't expect. For example, the <code>TS</code> (Transfer to Storage) instruction wrote a value to memory, which seems straightforward. But if the previous addition had an overflow (i.e. a carry), <code>TS</code> also skipped the next instruction and loaded the accumulator with a +1 or -1. In other words, simply writing a value to memory could result in a jump in control flow and register modification. The purpose of this was to handle carries for <a href="https://github.com/shirriff/virtualagc/blob/master/Borealis/BITCOIN.agc#L641">multiple-precision arithmetic</a>, but most computers simply implement this with an "Add with carry" instruction.</p> <h2>Running the program</h2> <p>The video below shows my Bitcoin program running on an actual Apollo Guidance Computer with the results displayed on our DSKY (Display/Keyboard). The DSKY had a simple numeric keypad with buttons large enough for astronauts to use with gloves on. The computer displayed output numerically; astronauts had to know if the output was feet, seconds, degrees, or something else. We used a replica DSKY created by Carl since nobody would let us use a real DSKY.<span id="fnref:fran"><a class="ref" href="#fn:fran" rel="footnote">8</a></span></p> <p>The Apollo Guidance Computer had a very simple user interface through the DSKY. An astronaut selected an action pressing the "Verb" key, entering a verb number, and pressing "Enter". The astronaut selected a target for the action by entering a "Noun". (Astronauts had a <a href="https://www.ibiblio.org/apollo/A17_VN_Checklist.png">reference card</a> listing all the verbs and nouns.) I added Bitcoin mining as Verb 65 in a program called <em>Borealis</em><span id="fnref:borealis"><a class="ref" href="#fn:borealis" rel="footnote">9</a></span>; you can see Mike enter Verb 65 at the beginning of the video.</p> <iframe width="560" height="315" src="https://www.youtube.com/embed/XiBuzzOt43g" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <p>The Apollo Guidance Computer took 5.15 seconds for one SHA-256 hash. Since Bitcoin uses a double-hash, this results in a hash rate of 10.3 seconds per Bitcoin hash. Currently, the Bitcoin network is performing about <a href="https://www.blockchain.com/en/charts/hash-rate#">65 EH/s</a> (65 quintillion hashes per second). At this difficulty, it would take the AGC 4&times;10^23 seconds on average to find a block. Since the universe is only 4.3&times;10^17 seconds old, it would take the AGC about a million times the age of the universe to successfully mine a block.</p> <p>Given the astronomical difficulty of mining, you might wonder how I successfully mined a block. For this demonstration, I simply used as input a block that had been successfully mined in the past, specifically <a href="https://blockchain.info/block/0000000000000000e067a478024addfecdc93628978aa52d91fabd4292982a50">block #286819</a>. Thus, the algorithm succeeded quickly, but since it was an old block, I didn't make any money off it.</p> <p>To put the AGC's mining performance in perspective, a <a href="https://amzn.to/2Jrtkwd">USB stick miner</a> performs 130 billion hashes per second. The stick miner costs under $70, compared to $150,000 for the Apollo Guidance Computer. For its time, the Apollo Guidance Computer was an extremely compact, low-power system, using 55 watts and taking up under a cubic foot of space. The USB miner, though, uses 12 watts and fits in your hand. The enormous difference in performance is due to the exponential increase in computer speed described by Moore's law as well as the advantage of custom Bitcoin mining hardware.</p> <h2>Programming the AGC&mdash;then and now</h2> <p>In the 1960s, code for the AGC was written on punch cards, and assembled onto tape using a software system called <a href="https://www.ibiblio.org/apollo/yaYUL.html#What_is_YUL">YUL</a>. This system was more advanced than you'd expect for the 1960s, including a source control system to track and incorporate changes. For flight, the software was woven into core ropes, with wires physically going around cores for a 0 or through cores for a 1. In other words, each core rope was custom-manufactured, with the data stored in the weaving pattern of the wires. This provided high-density, reliable ROM storage, but required weeks of manufacturing.</p> <p><a href="http://static.righto.com/images/agc-bitcoin/Plate_19.jpg"><img alt="Detail of core rope memory wiring from an early (Block I) Apollo Guidance Computer. Photo from Raytheon." class="hilite" height="282" src="http://static.righto.com/images/agc-bitcoin/Plate_19-w350.jpg" title="Detail of core rope memory wiring from an early (Block I) Apollo Guidance Computer. Photo from Raytheon." width="350" /></a><div class="cite">Detail of core rope memory wiring from an early (Block I) Apollo Guidance Computer. <a href="https://authors.library.caltech.edu/5456/1/hrst.mit.edu/hrs/apollo/public/visual3.htm">Photo</a> from Raytheon.</div></p> <p>Since it wasn't practical to manufacture a new core rope for every change, a different approach was used during development. A core rope simulator allowed a program to be fed into the AGC from external storage. This simulator was part of the refrigerator-sized monitor (below), which provided a debugging interface to the AGC through a test connector on the AGC. The monitor allowed programmers to set breakpoints, single-step, examine registers, and so forth, using lights and switches.</p> <p><a href="http://static.righto.com/images/agc-bitcoin/monitor.jpg"><img alt="The AGC monitor provided a debugging interface to the AGC as well as a core rope simulator. See User&#39;s guide to the AGC monitor." class="hilite" height="507" src="http://static.righto.com/images/agc-bitcoin/monitor-w350.jpg" title="The AGC monitor provided a debugging interface to the AGC as well as a core rope simulator. See User&#39;s guide to the AGC monitor." width="350" /></a><div class="cite">The AGC monitor provided a debugging interface to the AGC as well as a core rope simulator. See <a href="http://www.ibiblio.org/apollo/Documents/HSI-208487.pdf">User's guide to the AGC monitor</a>.</div></p> <p>In my case, I wrote the software on my laptop and assembled it with <a href="https://www.ibiblio.org/apollo/yaYUL.html#What_is_yaYUL_">yaYUL</a>, a modern version of YUL written by the Virtual AGC team. I tested the software on a <a href="https://www.ibiblio.org/apollo/yaAGC.html">simulated AGC</a> using the Code::Blocks IDE<span id="fnref:coding"><a class="ref" href="#fn:coding" rel="footnote">11</a></span>, which provides debugging features somewhat similar to what the monitor provided in the 1960s. To run the code on the real AGC, we obviously didn't manufacture core ropes. We have vintage core rope simulator boxes, but they turned out to be extremely unreliable. Fortunately, Mike Stewart built a board to load code into the AGC using the same AGC test connector originally used by the monitor.</p> <p><a href="http://static.righto.com/images/agc-bitcoin/ide-screenshot.png"><img alt="AGC code can be developed in an IDE. The debugger makes it much easier to develop code. The IDE communicates with the virtual DSKY." class="hilite" height="345" src="http://static.righto.com/images/agc-bitcoin/ide-screenshot-w700.png" title="AGC code can be developed in an IDE. The debugger makes it much easier to develop code. The IDE communicates with the virtual DSKY." width="700" /></a><div class="cite">AGC code can be developed in an IDE. The debugger makes it much easier to develop code. The IDE communicates with the virtual DSKY.</div></p> <h2>Conclusion</h2> <p>I implemented the SHA-256 hash algorithm and ran it on the Apollo Guidance Computer that we're restoring, taking 10.3 seconds per hash. This isn't my first experiment with absurd Bitcoin mining. I tried <a href="https://www.youtube.com/watch?v=y3dqhixzGVo">mining by hand</a> with pencil and paper; this had a hash rate of 0.67 hashes per day. Using an <a href="https://www.righto.com/2015/05/bitcoin-mining-on-55-year-old-ibm-1401.html">IBM punch card mainframe computer</a> from the early 1960s got the hash rate up to 80 seconds per hash. My fastest implementation was on a <a href="https://www.righto.com/2017/07/bitcoin-mining-on-vintage-xerox-alto.html">Xerox Alto</a> (the famous 1973 computer that inspired the Macintosh), which performed 1.5 hashes per second. Thus, the Apollo Guidance Computer outperformed the older transistor-based IBM computer but not the Alto.</p> <p><a href="http://static.righto.com/images/agc-bitcoin/bitcoin-mining-techniques.jpg"><img alt="My Bitcoin mining experiments by hand, on a punch-card mainframe, and on a Xerox Alto." class="hilite" height="329" src="http://static.righto.com/images/agc-bitcoin/bitcoin-mining-techniques-w450.jpg" title="My Bitcoin mining experiments by hand, on a punch-card mainframe, and on a Xerox Alto." width="450" /></a><div class="cite">My Bitcoin mining experiments by hand, on a punch-card mainframe, and on a Xerox Alto.</div></p> <p>The Apollo program <a href="https://en.wikipedia.org/wiki/Apollo_program#Costs">cost</a> 25.4 billion dollars as of 1973, equivalent to about 150 billion dollars today. The current market cap of Bitcoin is 200 billion dollars, so if NASA had been mining Bitcoins, they could have paid for the whole Apollo program and still had money left over. One flaw in this plan is the Apollo Guidance Computer's low performance, since mining a block would take much more than the lifetime of the universe.</p> <p>My code is available on <a href="https://github.com/shirriff/virtualagc">Github</a>; the mining code is in <a href="https://github.com/shirriff/virtualagc/blob/master/Borealis/BITCOIN.agc">BITCOIN.agc</a>. CuriousMarc has a <a href="https://www.youtube.com/watch?v=2KSahAoOLdU">series of AGC videos</a> which you should watch for more information on the restoration project. I announce my latest blog posts on Twitter, so follow me <a href="https://twitter.com/kenshirriff">@kenshirriff</a> for future articles. I also have an <a href="https://www.righto.com/feeds/posts/default">RSS feed</a>. Thanks to Mike Stewart for supplying images and extensive information.</p> <h2>Notes and references</h2> <div class="footnote"> <ol> <li id="fn:owner"> <p>The AGC restoration team consists of Mike Stewart (creator of <a href="https://github.com/virtualagc/agc_simulation">FPGA AGC</a>), <a href="https://rescue1130.blogspot.com/2018/11/restoring-apollo-guidance-computer-part.html">Carl Claunch</a>, Marc Verdiell (<a href="https://www.youtube.com/channel/UC3bosUr3WlKYm4sBaLs-Adw">CuriousMarc</a> on YouTube) and myself. The AGC that we're restoring belongs to a private owner who picked it up at a scrap yard in the 1970s after NASA scrapped it. For simplicity, I refer to the AGC we're restoring as "our AGC".</p> <p>The Apollo flights had one AGC in the command module (the capsule that returned to Earth) and one AGC in the lunar module. In 1968, before the Moon missions, NASA <a href="https://www.nasa.gov/feature/50-years-ago-thermo-vacuum-testing-certifies-critical-lunar-hardware">tested a lunar module</a> with astronauts aboard in a giant vacuum chamber in Houston to ensure that everything worked in space-like conditions. We believe our AGC was installed in that lunar module (LTA-8). Since this AGC was never flown, most of the modules were not potted with epoxy.&#160;<a class="footnote-backref" href="#fnref:owner" rev="footnote" title="Jump back to footnote 1 in the text">&#8617;</a></p> </li> <li id="fn:newjob"> <p>Because the AGC supported multiple programs at once, my code needed to periodically call <em>NEWJOB</em> to see if there were any other waiting jobs to run. To ensure reliability, the AGC constantly checked to make sure a faulty program doesn't take over the system. Thus, I needed to give other jobs the chance to run or else my job would get killed.&#160;<a class="footnote-backref" href="#fnref:newjob" rev="footnote" title="Jump back to footnote 2 in the text">&#8617;</a></p> </li> <li id="fn:difficulty"> <p>At the current Bitcoin difficulty level, about 1 in 10^22 hashes will be successful at mining a block; a valid hash must start with approximately 18 zeros. The <a href="https://www.coindesk.com/bitcoin-hash-rate-new-record">mining difficulty</a> changes periodically to keep the time between blocks at approximately 10 minutes. As mining hardware gets faster, the difficulty factor is automatically updated to make mining more difficult so miners can never really catch up.&#160;<a class="footnote-backref" href="#fnref:difficulty" rev="footnote" title="Jump back to footnote 3 in the text">&#8617;</a></p> </li> <li id="fn:electricity"> <p>A while back I <a href="https://www.righto.com/2014/02/bitcoin-mining-hard-way-algorithms.html#ref6">estimated</a> that Bitcoin mining uses about as much electricity as the entire country of Cambodia. <a href="https://karlodwyer.github.io/publications/pdf/bitcoin_KJOD_2014.pdf">One paper</a> puts mining's energy consumption comparable to Ireland's electricity usage. A <a href="https://www.theverge.com/2019/7/4/20682109/bitcoin-energy-consumption-annual-calculation-cambridge-index-cbeci-country-comparison">recent estimate</a> is that Bitcoin mining uses more electricity than Switzerland.&#160;<a class="footnote-backref" href="#fnref:electricity" rev="footnote" title="Jump back to footnote 4 in the text">&#8617;</a></p> </li> <li id="fn:bitcoin-refs"> <p>I've simplified a lot of details in my discussion of Bitcoin algorithms. For in-depth information on Bitcoin and mining, see my articles <a href="https://www.righto.com/2014/02/bitcoins-hard-way-using-raw-bitcoin.html">Bitcoins the hard way</a> and <a href="https://www.righto.com/2014/02/bitcoin-mining-hard-way-algorithms.html">Bitcoin mining the hard way</a>.&#160;<a class="footnote-backref" href="#fnref:bitcoin-refs" rev="footnote" title="Jump back to footnote 5 in the text">&#8617;</a></p> </li> <li id="fn:double"> <p>Bitcoin uses "double SHA-256" which simply consists of applying the SHA-256 function twice. I could have implemented the double-hash in the AGC code, but I ran out of time; I got the basic hash working at 4 am the night before we sent the AGC back to Houston. How to upload transactions into the AGC is also left as an exercise for the reader.&#160;<a class="footnote-backref" href="#fnref:double" rev="footnote" title="Jump back to footnote 6 in the text">&#8617;</a></p> </li> <li id="fn:ecdsa"> <p>While SHA-256 is easy to implement, that's not the case for all the cryptography used by Bitcoin. To create a Bitcoin transaction, the transaction must be signed with elliptic curve cryptography. This requires 256-bit modular arithmetic, which is about as hard as it sounds. Even a <a href="https://github.com/esxgx/easy-ecc">simple implementation</a> is 1000 lines of C. Needless to say, I decided not to implement signing in assembly language on the AGC.&#160;<a class="footnote-backref" href="#fnref:ecdsa" rev="footnote" title="Jump back to footnote 7 in the text">&#8617;</a></p> </li> <li id="fn:fran"> <p>Many people have asked if we talked to <a href="https://www.youtube.com/watch?v=UjcfepTdvZI">Fran Blanche</a> about the DSKY. Yes, we have.&#160;<a class="footnote-backref" href="#fnref:fran" rev="footnote" title="Jump back to footnote 8 in the text">&#8617;</a></p> </li> <li id="fn:borealis"> <p>The <em>Aurora</em> program was used to extensively test the operation of the Apollo Guidance Computer in the Lunar Module. I wrote the Bitcoin code as part of <em>Borealis</em>, a modern version of <em>Aurora</em> slightly cleaned up. The code for <em>Aurora</em> and <em>Borealis</em> includes a <a href="https://github.com/shirriff/virtualagc/blob/master/Borealis/EXTENDED_VERBS.agc#L20">table of verb definitions</a> so it was straightforward for me to add Verb 65 for my Bitcoin code. In the video, you can see Mike enter Verb 65 to start the Bitcoin program. I also took advantage of the Executive's octal display routine to show the output. This routine is accessed through Verb 05 Noun 01, which is why you'll see that on the display at the end of the video.&#160;<a class="footnote-backref" href="#fnref:borealis" rev="footnote" title="Jump back to footnote 9 in the text">&#8617;</a></p> </li> <li id="fn:display"> <p>At the end of the video clip, the display shows 8 octal triples indicating the hash: 00000/00000/00000, 00000/00000/00000, 00007/21221/23740, 00017/35565/05002, 00002/20333/04715, 0o00002, 0o33226, 0o05227, 00004/05367/35221, 00005/00252/14222. (The 11111/11111/11111 value is just a signal that all values have been displayed.) Converting these to hex and reversing the bytes yields the 8-byte Bitcoin hash: 00000000 00000000 e067a478 024addfe cdc93628 978aa52d 91fabd42 92982a50. Note the multiple zeros at the beginning of the hash; this is what makes the hash valid.&#160;<a class="footnote-backref" href="#fnref:display" rev="footnote" title="Jump back to footnote 10 in the text">&#8617;</a></p> </li> <li id="fn:coding"> <p>The <a href="https://www.ibiblio.org/apollo/index.html">Virtual AGC project</a> has developed simulations of the <a href="https://www.ibiblio.org/apollo/yaAGC.html">AGC</a>, <a href="https://www.ibiblio.org/apollo/yaDSKY.html">DSKY</a>, and <a href="https://www.ibiblio.org/apollo/yaYUL.html">YUL assembler</a>, so you can experiment with the AGC system. While you can do this from the command line, debugging is much, much easier if you use the Code::Blocks IDE. You can download a VirtualBox environment with everything set up <a href="https://www.ibiblio.org/apollo/download.html">here</a>. In the folder "AGC Visual Debugging", double-click on Borealis to start Code::Blocks. You can edit code in the IDE (or with an editor). Then "Build &rarr; Build" compiles the code and "Debug &rarr; Start" runs code in the debugger. "Tools &rarr; DSKY" starts up a DSKY window to interact with the AGC. "Debug &rarr; Debugging windows &rarr; Memory dump" lets you look at memory contents. The IDE lets you set breakpoints, single-step through code, examine memory, and so forth. For more information on AGC code development, see <a href="https://github.com/virtualagc/virtualagc/wiki/VisualDebugging">this page</a>.&#160;<a class="footnote-backref" href="#fnref:coding" rev="footnote" title="Jump back to footnote 11 in the text">&#8617;</a></p> </li> <li id="fn:byteorder"> <p>The Bitcoin protocol is a mish-mash of big-endian and little-endian values. It inconveniently reverses the byte order of the SHA-256 hash, so while the hash from the algorithm ends with zeros, the Bitcoin hash starts with zeros. I displayed the hash to match the Bitcoin order.&#160;<a class="footnote-backref" href="#fnref:byteorder" rev="footnote" title="Jump back to footnote 12 in the text">&#8617;</a></p> </li> </ol> </div> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'><span class='post-comment-link'> <a class='comment-link' href='https://www.blogger.com/comment/fullpage/post/6264947694886887540/1033302168361681428' onclick=''> 14 comments: </a> </span> <span class='post-icons'> <span class='item-action'> <a href='https://www.blogger.com/email-post/6264947694886887540/1033302168361681428' title='Email Post'> <img alt='' class='icon-action' height='13' src='http://img1.blogblog.com/img/icon18_email.gif' width='18'/> </a> </span> <span class='item-control blog-admin pid-1138732533'> <a href='https://www.blogger.com/post-edit.g?blogID=6264947694886887540&postID=1033302168361681428&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <span class='post-backlinks post-comment-link'> </span> <div class='post-share-buttons goog-inline-block'> <a class='goog-inline-block share-button sb-email' href='https://www.blogger.com/share-post.g?blogID=6264947694886887540&postID=1033302168361681428&target=email' target='_blank' title='Email This'><span class='share-button-link-text'>Email This</span></a><a class='goog-inline-block share-button sb-blog' href='https://www.blogger.com/share-post.g?blogID=6264947694886887540&postID=1033302168361681428&target=blog' onclick='window.open(this.href, "_blank", "height=270,width=475"); return false;' target='_blank' title='BlogThis!'><span class='share-button-link-text'>BlogThis!</span></a><a class='goog-inline-block share-button sb-twitter' href='https://www.blogger.com/share-post.g?blogID=6264947694886887540&postID=1033302168361681428&target=twitter' target='_blank' title='Share to X'><span class='share-button-link-text'>Share to X</span></a><a class='goog-inline-block share-button sb-facebook' href='https://www.blogger.com/share-post.g?blogID=6264947694886887540&postID=1033302168361681428&target=facebook' onclick='window.open(this.href, "_blank", "height=430,width=640"); return false;' target='_blank' title='Share to Facebook'><span class='share-button-link-text'>Share to Facebook</span></a><a class='goog-inline-block share-button sb-pinterest' href='https://www.blogger.com/share-post.g?blogID=6264947694886887540&postID=1033302168361681428&target=pinterest' target='_blank' title='Share to Pinterest'><span class='share-button-link-text'>Share to Pinterest</span></a> </div> </div> <div class='post-footer-line post-footer-line-2'><span class='post-labels'> Labels: <a href="https://www.righto.com/search/label/Apollo" rel='tag'>Apollo</a>, <a href="https://www.righto.com/search/label/bitcoin" rel='tag'>bitcoin</a> </span> </div> <div class='post-footer-line post-footer-line-3'></div> </div> </div> </div> </div></div> <div class="date-outer"> <div class="date-posts"> <div class='post-outer'> <div class='post hentry' itemprop='blogPost' itemscope='itemscope' itemtype='http://schema.org/BlogPosting'> <meta content='http://static.righto.com/images/agc-rope/Plate_19-w350.jpg' itemprop='image_url'/> <meta content='6264947694886887540' itemprop='blogId'/> <meta content='7645797181470915638' itemprop='postId'/> <a name='7645797181470915638'></a> <h3 class='post-title entry-title' itemprop='name'> <a href="https://www.righto.com/2019/07/software-woven-into-wire-core-rope-and.html">Software woven into wire: Core rope and the Apollo Guidance Computer</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-7645797181470915638' itemprop='description articleBody'> <p>Onboard the Apollo spacecraft, the revolutionary <a href="https://en.wikipedia.org/wiki/Apollo_Guidance_Computer">Apollo Guidance Computer</a> helped navigate to the Moon and land on its surface. One of the first computers to use integrated circuits, the Apollo Guidance Computer was lightweight enough and small enough (70 pounds and under a cubic foot) to fly in space. An unusual feature that contributed to its small size was <a href="https://en.wikipedia.org/wiki/Core_rope_memory">core rope memory</a>, a technique of physically weaving software into high-density storage. In this blog post, I take a close look at core rope and the circuitry that made it work.<span id="fnref:earlyrope"><a class="ref" href="#fn:earlyrope" rel="footnote">1</a></span></p> <p><a href="http://static.righto.com/images/agc-rope/Plate_19.jpg"><img alt="Detail of core rope memory wiring from an early (Block I) Apollo Guidance Computer. Photo from Raytheon." class="hilite" height="282" src="http://static.righto.com/images/agc-rope/Plate_19-w350.jpg" title="Detail of core rope memory wiring from an early (Block I) Apollo Guidance Computer. Photo from Raytheon." width="350" /></a><div class="cite">Detail of core rope memory wiring from an early (Block I) Apollo Guidance Computer. <a href="https://authors.library.caltech.edu/5456/1/hrst.mit.edu/hrs/apollo/public/visual3.htm">Photo</a> from Raytheon.</div></p> <p>The Apollo Guidance Computer (AGC) had very little memory by modern standards: 2048 words of RAM in erasable core memory and 36,864 words of ROM in core rope memory. <!-- (I discussed the erasable core memory <a href="http://www.righto.com/2019/01/inside-apollo-guidance-computers-core.html">earlier</a>.) --> In the 1960s, most computers (including the AGC) used magnetic core memory for RAM storage, but core ropes were unusual and operated differently. Erasable core memory and core rope both used magnetic cores, small magnetizable rings. But while erasable core memory used one core for each bit, core rope stored an incredible 192 bits per core, achieving much higher density.<span id="fnref:density"><a class="ref" href="#fn:density" rel="footnote">2</a></span> The trick was to put many wires through each core (as shown above), hardwiring the data: a 1 bit was stored by threading a wire through a core, while the wire bypassed the core for a 0 bit. Thus, once a core rope was carefully manufactured, using a half-mile of wire, data was permanently stored in the core rope.</p> <p><a href="http://static.righto.com/images/agc-rope/agc.jpg"><img alt="The Apollo Guidance Computer. The empty space on the left held the core rope modules. The connectors on the right linked the AGC to the rest of the spacecraft." class="hilite" height="314" src="http://static.righto.com/images/agc-rope/agc-w600.jpg" title="The Apollo Guidance Computer. The empty space on the left held the core rope modules. The connectors on the right linked the AGC to the rest of the spacecraft." width="600" /></a><div class="cite">The Apollo Guidance Computer. The empty space on the left held the core rope modules. The connectors on the right linked the AGC to the rest of the spacecraft.</div></p> <p>We<span id="fnref:owner"><a class="ref" href="#fn:owner" rel="footnote">3</a></span> are restoring the Apollo Guidance Computer shown above. The core rope modules (which we don't have)<span id="fnref:rope"><a class="ref" href="#fn:rope" rel="footnote">4</a></span> would be installed in the empty space on the left. On the right of the AGC, you can see the two connectors that connected the AGC to other parts of the spacecraft, including the DSKY (Display/Keyboard). By removing the bolts holding the two trays together, we could disassemble the AGC. Pulling the two halves apart takes a surprising amount of force because of the three connectors in the middle that join the two trays. The tray on the left is the "A" tray, which holds the logic and interface modules. The tray on the right is the "B" tray, which holds the memory circuitry, oscillator, and alarm. The six core rope modules go under the metal cover in the upper right. Note that the core ropes took up roughly a quarter of the computer's volume.</p> <p><a href="http://static.righto.com/images/agc-rope/agc-opened.jpg"><img alt="The AGC is implemented with dozens of modules in two trays. The trays are connected through the three connectors in the middle." class="hilite" height="394" src="http://static.righto.com/images/agc-rope/agc-opened-w700.jpg" title="The AGC is implemented with dozens of modules in two trays. The trays are connected through the three connectors in the middle." width="700" /></a><div class="cite">The AGC is implemented with dozens of modules in two trays. The trays are connected through the three connectors in the middle.</div></p> <h2>How core rope works</h2> <p>At a high level, core rope is simple: sense wires go through cores to indicate 1's, or bypass cores to indicate 0's. By selecting a particular core, the sense wires through that core were activated to provide the desired data bits.</p> <p>Magnetic cores have a few properties that made core memory work.<span id="fnref:erasabledifferences"><a class="ref" href="#fn:erasabledifferences" rel="footnote">7</a></span> By passing a strong current along a wire through the core, the core becomes magnetized, either clockwise or counterclockwise depending on the direction of the current. Normally the cores were all magnetized in one direction, called the "reset" state, and when a core was magnetized the opposite direction, this is called the "set" state. When a core flips from one state to another, the changing magnetic field induces a small voltage in any sense wires through the core. A sense amplifier detects this signal and produces a binary output.</p> <p>The key advantage of core rope is that many sense wires pass through a single core, so you can store multiple bits per core and achieve higher-density storage. (In the case of the AGC, each core has 192 sense wires passing through (or around) it<span id="fnref:wires"><a class="ref" href="#fn:wires" rel="footnote">5</a></span>, so each core stored 12 words of data.) This is in contrast to regular read/write core memory, where each core held one bit.</p> <p>Core rope used an unusual technique to select a particular core to flip and read. Instead of directly selecting the desired core, inhibit lines blocked the flipping of every core <em>except</em> the desired one. In the diagram below, the current on the set line (green) would potentially flip all the cores. However, various inhibit lines (red) have a current in the opposite direction. This cancels out the set current in all the cores except #2, so only core #2 flips.</p> <p><a href="http://static.righto.com/images/agc-rope/rope-simplified-diagram.png"><img alt="This diagram illustrates how core rope memory worked. Simplified diagram from MIT&#39;s Role in Project Apollo vol III, Fig. 3-12" class="hilite" height="215" src="http://static.righto.com/images/agc-rope/rope-simplified-diagram-w600.png" title="This diagram illustrates how core rope memory worked. Simplified diagram from MIT&#39;s Role in Project Apollo vol III, Fig. 3-12" width="600" /></a><div class="cite">This diagram illustrates how core rope memory worked. Simplified diagram from <a href="http://ibiblio.org/apollo/hrst/archive/1029.pdf">MIT's Role in Project Apollo vol III</a>, Fig. 3-12</div></p> <p>In the diagram above, only the sense lines (blue) passing through core #2 pick up an induced voltage. Thus, the weaving pattern of the sense lines controls what data is read from core #2. To summarize, the inhibit lines control which core is selected, and the sense wires woven through that core control what data value is read.</p> <p>The inhibit lines are driven from the address lines and arranged so that all inhibit lines will be inactive for just the desired core. For any other address, at least one inhibit line will be activated, preventing the core from flipping and being read. <span id="fnref:complications"><a class="ref" href="#fn:complications" rel="footnote">6</a></span></p> <h2>The AGC's core ropes</h2> <p>The Apollo Guidance Computer contained six core rope modules, each storing 6 kilowords of program information. The AGC was a 15-bit machine: each word consisted of 15 data bits and a parity bit. (While a word that isn't a power of two may seem bizarre now, computers in the 1960s were designed with whatever word size fit the problem.<span id="fnref:wordsize"><a class="ref" href="#fn:wordsize" rel="footnote">8</a></span>) Each module contained 512 cores, each storing 12 words of data. That is, each module had 192 (12&times;16) sense wires going either through or around each core. Each group of 16 sense wires for a word was called a "strand", so there were 12 strands.</p> <p><a href="http://static.righto.com/images/agc-rope/agc_with_ropes.jpg"><img alt="AGC with rope modules. A rope module is partially inserted into one of the 6 slots in the AGC. Photo &#169; Draper Labs via Caltech." class="hilite" height="315" src="http://static.righto.com/images/agc-rope/agc_with_ropes-w400.jpg" title="AGC with rope modules. A rope module is partially inserted into one of the 6 slots in the AGC. Photo &#169; Draper Labs via Caltech." width="400" /></a><div class="cite">AGC with rope modules. A rope module is partially inserted into one of the 6 slots in the AGC. Photo &#169; Draper Labs via <a href="https://authors.library.caltech.edu/5456/1/hrst.mit.edu/hrs/apollo/public/visual3.htm">Caltech</a>.</div></p> <p>The photo above shows how the core rope modules slid into the Apollo Guidance Computer; the pins on the end of each module meshed with connectors in the AGC. The core rope module below (and its companion) held an early Lunar Module program called Retread 50. We took our AGC to the Computer History Museum to read the data from these modules and we put the results <a href="https://virtualagc.github.io/virtualagc/Restoration.html#Computer_History_Museum:_RETREAD_50">online</a>.</p> <p><a href="http://static.righto.com/images/agc-rope/fixed-memory-module-b2.jpg"><img alt="This core rope module held the Retread 50 software for the Apollo Guidance Computer. This module is from the Computer History Museum." class="hilite" height="337" src="http://static.righto.com/images/agc-rope/fixed-memory-module-b2-w300.jpg" title="This core rope module held the Retread 50 software for the Apollo Guidance Computer. This module is from the Computer History Museum." width="300" /></a><div class="cite">This core rope module held the Retread 50 software for the Apollo Guidance Computer. This module is from the Computer History Museum.</div></p> <p>The 512 cores in each module were arranged physically as two layers of 256 cores (but electrically as four planes of 128 cores).<span id="fnref:block1"><a class="ref" href="#fn:block1" rel="footnote">9</a></span> A set and reset line went through all the cores in a plane, allowing a particular plane in the module to be selected.<span id="fnref:complications"><a class="ref" href="#fn:complications" rel="footnote">6</a></span> The photo below shows the interior of a core rope module. One layer of 256 cores is visible, with the tiny wires threaded through them. (The second layer of 256 cores is underneath.) Note that the cores only take up about half the module space. Surrounding the cores are hundreds of resistors and diodes that were used to select the desired word.<span id="fnref:select"><a class="ref" href="#fn:select" rel="footnote">10</a></span>: These components were mounted with <a href="https://en.wikipedia.org/wiki/Printed_circuit_board#Cordwood_construction">cordwood construction</a>, with the components installed vertically through holes in the module.</p> <p><a href="http://static.righto.com/images/agc-rope/core-rope-internal.jpg"><img alt="Inside a core rope. The 32&#215;8 cores visible form a layer of 256 cores; a second layer is underneath. Photo from CHM/Raytheon CN-4-421-C." class="hilite" height="255" src="http://static.righto.com/images/agc-rope/core-rope-internal-w500.jpg" title="Inside a core rope. The 32&#215;8 cores visible form a layer of 256 cores; a second layer is underneath. Photo from CHM/Raytheon CN-4-421-C." width="500" /></a><div class="cite">Inside a core rope. The 32&#215;8 cores visible form a layer of 256 cores; a second layer is underneath. Photo from CHM/Raytheon CN-4-421-C.</div></p> <p>The photo below shows one of the Retread 50 modules from the Computer History Museum with the cover removed. The cores were encased (potted) in protective epoxy to protect them during flight, so the cores are not visible.</p> <p><a href="http://static.righto.com/images/agc-rope/module-chm.jpg"><img alt="A core rope module with the cover removed. This module is at the Computer History Museum." class="hilite" height="181" src="http://static.righto.com/images/agc-rope/module-chm-w500.jpg" title="A core rope module with the cover removed. This module is at the Computer History Museum." width="500" /></a><div class="cite">A core rope module with the cover removed. This module is at the Computer History Museum.</div></p> <h2>Manufacturing the core rope</h2> <p>Wiring of the core rope was a tedious process that took about 8 weeks and cost $15,000 per module. As a result, the computer code needed to be frozen months in advance and last-minute patches to the code were not possible.<span id="fnref:leap"><a class="ref" href="#fn:leap" rel="footnote">11</a></span> The core ropes (and the AGC) were manufactured by Raytheon in Waltham, Massachusetts. Many of the women building the ropes were hired from the local textile industry for their sewing skills; other skilled women came from the <a href="https://en.wikipedia.org/wiki/Waltham_Watch_Company#Waltham_Watch_and_the_race_to_the_moon">Waltham Watch Company</a>, a company that also helped with the high-precision gyroscopes used on the Apollo missions.<span id="fnref:gendered"><a class="ref" href="#fn:gendered" rel="footnote">12</a></span></p> <video controls autoplay width=400 height=294><source src="http://static.righto.com/images/agc-rope/WeavingHands4.mp4">Your browser does not support the video tag.</video> <p>Much of the core rope wiring (address inhibit wires, set, reset, etc.) was the same for all core rope modules. Two women passed a needle back and forth through the cores to create this wiring. The needle was hollow and contained the necessary length of wire. The clip above (from <a href="https://youtu.be/ndvmFlg1WmE?t=1292">Computers for Apollo</a> via <a href="http://www.angelfire.com/moon2/xpascal/MoonHoax/ProgressReport/ProgressReport.HTM">xpascal</a>) shows this process.</p> <p><a href="http://static.righto.com/images/agc-rope/rope-threader.jpg"><img alt="&quot;Space age needleworker &#39;weaves&#39; core rope memory for guidance computers used in Apollo missions. Memory modules will permanently store mission profile data on which critical maneuvers in space are based. Core rope memories are fabricated by passing needle-like, hollow rod containing a length of fine wire through cores in the module frame. Module frame is moved automatically by computer-controlled machinery to position proper cores for weaving operation. Apollo guidance computer and associated display keyboard are produced at Raytheon Company plant in Waltham, Massachusetts.&quot; Caption and photo are from a Raytheon document, courtesy of Transistor Museum." class="hilite" height="387" src="http://static.righto.com/images/agc-rope/rope-threader-w300.jpg" title="&quot;Space age needleworker &#39;weaves&#39; core rope memory for guidance computers used in Apollo missions. Memory modules will permanently store mission profile data on which critical maneuvers in space are based. Core rope memories are fabricated by passing needle-like, hollow rod containing a length of fine wire through cores in the module frame. Module frame is moved automatically by computer-controlled machinery to position proper cores for weaving operation. Apollo guidance computer and associated display keyboard are produced at Raytheon Company plant in Waltham, Massachusetts.&quot; Caption and photo are from a Raytheon document, courtesy of Transistor Museum." width="300" /></a><div class="cite">"Space age needleworker 'weaves' core rope memory for guidance computers used in Apollo missions. Memory modules will permanently store mission profile data on which critical maneuvers in space are based. Core rope memories are fabricated by passing needle-like, hollow rod containing a length of fine wire through cores in the module frame. Module frame is moved automatically by computer-controlled machinery to position proper cores for weaving operation. Apollo guidance computer and associated display keyboard are produced at Raytheon Company plant in Waltham, Massachusetts." Caption and photo are from a Raytheon document, courtesy of <a href="http://semiconductormuseum.com/Museum_Index.htm">Transistor Museum</a>.</div></p> <p>To store the desired binary data, the core rope's sense lines were threaded through or around cores in the proper sequence. Originally, this wiring was done entirely manually, which was slow and error-prone. <!-- Hall, p95 --> Raytheon improved the process by combining automated positioning with manual threading. First, the program's <a href="https://virtualagc.github.io/virtualagc/listings/Retread50/LIST-PROCESSING_INTERPRETER.agc.html">assembly code</a> was fed into an assembler called <a href="https://virtualagc.github.io/virtualagc/yaYUL.html#What_is_YUL">YUL</a> that produced a Mylar punched tape. An automated system (above, below) read this tape and step-by-step moved the proper core into position. A woman manually threaded the sense line through an aperture into the indicated core. The aperture then jogged down to pull the wire around a nylon pin, moving the wire out of the way for the next sense wire to be threaded. Once all the cores were threaded, the nylon pins were removed and the final core rope module was tested by an automated system, again controlled by punched tape.</p> <p><a href="http://static.righto.com/images/agc-rope/weaving-core.jpg"><img alt="A woman wiring sense lines in a core rope. She is threading the wire through a white circular aperture that indicates the core to wire. Source: Raytheon CN-4-20C / Smithsonian Institution WEB15435-2016." class="hilite" height="275" src="http://static.righto.com/images/agc-rope/weaving-core-w400.jpg" title="A woman wiring sense lines in a core rope. She is threading the wire through a white circular aperture that indicates the core to wire. Source: Raytheon CN-4-20C / Smithsonian Institution WEB15435-2016." width="400" /></a><div class="cite">A woman wiring sense lines in a core rope. She is threading the wire through a white circular aperture that indicates the core to wire. Source: Raytheon CN-4-20C / <a href="https://airandspace.si.edu/multimedia-gallery/13006hjpg?id=13006">Smithsonian Institution</a> WEB15435-2016.</div></p> <h2>Core rope circuitry</h2> <p>Core rope required a lot of digital and analog circuitry to drive and read the ropes. This section briefly describes this circuitry and shows the modules that implemented it. The bottom four modules in the picture below (Sense Amplifier, Strand Select, and two Rope Drivers) implemented the analog circuitry. Logic modules (in the "A" tray shown earlier) decoded the address into rope, module, and strand select signals. We carefully tested the analog and digital modules individually before powering up the AGC. <!-- acelectroniclmma00acel_0.pdf p4-605 --></p> <p><a href="http://static.righto.com/images/agc-rope/trayb.jpg"><img alt="Tray B of the Apollo Guidance Computer. The erasable memory module is the large black module. Most of the other modules on the left are support for the erasable (RAM) and fixed (core rope) memory. The core rope modules would slide into the right hand side under the metal cover." class="hilite" height="270" src="http://static.righto.com/images/agc-rope/trayb-w500.jpg" title="Tray B of the Apollo Guidance Computer. The erasable memory module is the large black module. Most of the other modules on the left are support for the erasable (RAM) and fixed (core rope) memory. The core rope modules would slide into the right hand side under the metal cover." width="500" /></a><div class="cite">Tray B of the Apollo Guidance Computer. The erasable memory module is the large black module. Most of the other modules on the left are support for the erasable (RAM) and fixed (core rope) memory. The core rope modules would slide into the right hand side under the metal cover.</div></p> <!-- Meanwhile the address inhibit lines were amplified by transistors in modules B16 and B17 and combined with the rope select signal. Modules B16 and B17 also amplified the set, reset, and clear signals. Once a core had been selected and reset, the sixteen sense amplifiers picked up the signals from the sense wires through the cores. The core rope sense amplifiers were in module B14. --> <h3>Sense Amplifier Modules</h3> <p>When a core flipped (either in fixed memory or erasable memory), the changing magnetic field induced a weak signal in a sense line, one sense line for each bit in the word. This signal needed to be amplified and converted to a logic signal; this was the job of the sense amplifiers. The sense amplifiers were implemented using a custom sense amplifier IC. (The AGC used only two different types of integrated circuits, the sense amplifier and a dual NOR gate.) The AGC had two identical sense amplifier modules; one (in slot B13) was used by the erasable core memory, while the other (B14) was used by the fixed core rope memory.</p> <p>The photo below shows a sense amp module. Eight sense amplifiers are visible and eight other sense amplifiers are on the other side of the module. The sense amplifiers required carefully-tuned voltage levels for bias and thresholds so the modules included voltage regulation circuitry (center and right in photo). On top of the module (front in the photo), you can see the horizontal lines of the nickel ribbon that connected the circuits; it is somewhat similar to a printed circuit board.</p> <p><a href="http://static.righto.com/images/agc-rope/sense-amp.jpg"><img alt="Sense amplifier module with the top removed. Note the nickel ribbon interconnect at the top of the module." class="hilite" height="251" src="http://static.righto.com/images/agc-rope/sense-amp-w850.jpg" title="Sense amplifier module with the top removed. Note the nickel ribbon interconnect at the top of the module." width="850" /></a><div class="cite">Sense amplifier module with the top removed. Note the nickel ribbon interconnect at the top of the module.</div></p> <p>The closeup photo below shows the module's <a href="https://en.wikipedia.org/wiki/Printed_circuit_board#Cordwood_construction">cordwood construction</a>. In this high-density construction technique, components were inserted into holes in the module. Resistors and capacitors passed through from one side of the module to the other, with one lead on either side. On each side of the module, components were connected by point-to-point wiring. This wiring was welded, not soldered. White insulating sleeves were placed over the wires to prevent short circuits.</p> <p><a href="http://static.righto.com/images/agc-rope/sense-amp-closeup2.jpg"><img alt="Closeup of the sense amplifier module for the AGC. The sense amplifier integrated circuits are at the top and the reddish pulse transformers are below. The pins are at the bottom and the wires at the top go to the nickel ribbon, which is like a printed circuit board." class="hilite" height="392" src="http://static.righto.com/images/agc-rope/sense-amp-closeup2-w350.jpg" title="Closeup of the sense amplifier module for the AGC. The sense amplifier integrated circuits are at the top and the reddish pulse transformers are below. The pins are at the bottom and the wires at the top go to the nickel ribbon, which is like a printed circuit board." width="350" /></a><div class="cite">Closeup of the sense amplifier module for the AGC. The sense amplifier integrated circuits are at the top and the reddish pulse transformers are below. The pins are at the bottom and the wires at the top go to the nickel ribbon, which is like a printed circuit board.</div></p> <p>Near the top of the photo are two amplifier integrated circuits in metal cans. Below are two reddish pulse transformers. An output driver transistor is between the pulse transformers.<span id="fnref:fixed"><a class="ref" href="#fn:fixed" rel="footnote">13</a></span> Only the ends of resistors are visible, due to the cordwood construction. At the top of the module are connections to the nickel ribbon interconnect. Modules that were flown on spacecraft were potted in plastic so the components were protected against vibration. Since our AGC was used on the ground, most modules were unpotted and the components are visible.</p> <h3>Address decoding</h3> <p>Address decoding for the core rope required a fair amount of logic for two reasons. The first problem was the AGC's instructions used 12-bit addresses, which could only address 4 kilowords of storage. Since the AGC had 36 kilowords of fixed memory and 2 kilowords of erasable memory, it used a <a href="https://www.ibiblio.org/apollo/assembly_language_manual.html#Memory_Map">complex system</a> of bank registers and mapping logic to convert a 12-bit address into the correct physical memory location. The second problem was that each core rope module held 6 kilowords, which is not a power of two. Thus, moderately complex decoding circuitry was required to generate module and strand select signals from the address.</p> <p><a href="http://static.righto.com/images/agc-rope/a14.jpg"><img alt="The core rope addressing, control, and timing logic is spread across several logic modules. Most of the address decoding was implemented in logic module A15. Other core rope logic is in modules A6, A8, and A14. Photo courtesy of Mike Stewart." class="hilite" height="177" src="http://static.righto.com/images/agc-rope/a14-w850.jpg" title="The core rope addressing, control, and timing logic is spread across several logic modules. Most of the address decoding was implemented in logic module A15. Other core rope logic is in modules A6, A8, and A14. Photo courtesy of Mike Stewart." width="850" /></a><div class="cite">The core rope addressing, control, and timing logic is spread across several logic modules. Most of the address decoding was implemented in logic module A15. Other core rope logic is in modules A6, A8, and A14. Photo courtesy of Mike Stewart.</div></p> <p>The AGC's logic circuitry (including the processor) was implemented with NOR gates. Each integrated circuit implemented two NOR gates using RTL (resistor-transistor logic), an early logic family. These ICs were costly; they cost $20-$30 each (around $150 in current dollars). There wasn't much inside each IC, just six transistors and eight resistors. Even so, the ICs provided a density improvement over the planned core-transistor logic, making the AGC practical. The decision to use ICs in the AGC was made in 1962, <!-- Page 188 in Journey to the Moon --> amazingly just four years after the IC was invented. The AGC was the <a href="https://www.computerhistory.org/siliconengine/aerospace-systems-are-first-the-applications-for-ics-in-computers/">largest consumer of ICs</a> from 1962 to 1965 and ended up being a major driver of the integrated circuit industry.</p> <p><a href="http://static.righto.com/images/agc-rope/nor-schematic.png"><img alt="Each IC contained two NOR gates implemented with resistor-transistor logic. From SCD 2005011." class="hilite" height="154" src="http://static.righto.com/images/agc-rope/nor-schematic-w500.png" title="Each IC contained two NOR gates implemented with resistor-transistor logic. From SCD 2005011." width="500" /></a><div class="cite">Each IC contained two NOR gates implemented with resistor-transistor logic. From <a href="http://klabs.org/history/ech/agc_schematics/logic/5011-1.jpg">SCD 2005011</a>.</div></p> <h3>Strand select</h3> <p><a href="http://static.righto.com/images/agc-rope/strand-select-b15.jpg"><img alt="The strand select module in position B15. Photo from Mike Stewart." class="hilite" height="171" src="http://static.righto.com/images/agc-rope/strand-select-b15-w800.jpg" title="The strand select module in position B15. Photo from Mike Stewart." width="800" /></a><div class="cite">The strand select module in position B15. Photo from Mike Stewart.</div></p> <p>The address decoding logic described above produced signals indicating the desired strand and module. These logic-level signals needed to be converted to 14-volt pulses to drive the core rope modules. This task was performed by the strand select module, which consisted of transistor driver circuits using NPN and PNP transistors. The resistors in these circuits were individually selected to produce exactly the desired currents.</p> <p><a href="http://static.righto.com/images/agc-rope/strand-select-closeup.jpg"><img alt="A closeup of the strand select module, showing its cordwood construction." class="hilite" height="307" src="http://static.righto.com/images/agc-rope/strand-select-closeup-w500.jpg" title="A closeup of the strand select module, showing its cordwood construction." width="500" /></a><div class="cite">A closeup of the strand select module, showing its cordwood construction.</div></p> <h3>Rope driver</h3> <p>The rope driver modules generated the high-current pulses (up to 450mA) necessary to flip the cores. Like the strand select module, the rope driver modules used NPN and PNP transistor driver circuits with carefully-selected resistors to ensure the desired current. They also used inductors to control the pulse shape, necessary to keep switching noise from overwhelming the small signals generated by the cores. The modules generated 16 inhibit signals (7 address bits and parity, along with complements) as well as two core set signals and four core reset signals.</p> <p><a href="http://static.righto.com/images/agc-rope/rope-driver-big.jpg"><img alt="The rope driver modules in B16 and B17 provided high-current pulses to the rope module. Photo from Mike Stewart." class="hilite" height="165" src="http://static.righto.com/images/agc-rope/rope-driver-big-w800.jpg" title="The rope driver modules in B16 and B17 provided high-current pulses to the rope module. Photo from Mike Stewart." width="800" /></a><div class="cite">The rope driver modules in B16 and B17 provided high-current pulses to the rope module. Photo from Mike Stewart.</div></p> <h2>The core rope simulator</h2> <p>Unfortunately, the core ropes were missing from the Apollo Guidance Computer we are restoring. Instead, this AGC has core rope simulator boxes in place of the ropes. The purpose of these simulator boxes was to feed code into an AGC for development and ground testing without requiring a new core rope to be manufactured every time. The simulator allowed an external computer to supply data words in place of the core rope, allowing the AGC to run arbitrary programs.</p> <p><a href="http://static.righto.com/images/agc-rope/agc-rope-sim.jpg"><img alt="The core rope simulators are installed in the left side of the AGC in place of the real core ropes. Two round connectors on the left allowed the simulators to be connected to an external computer that provided the data." class="hilite" height="365" src="http://static.righto.com/images/agc-rope/agc-rope-sim-w500.jpg" title="The core rope simulators are installed in the left side of the AGC in place of the real core ropes. Two round connectors on the left allowed the simulators to be connected to an external computer that provided the data." width="500" /></a><div class="cite">The core rope simulators are installed in the left side of the AGC in place of the real core ropes. Two round connectors on the left allowed the simulators to be connected to an external computer that provided the data.</div></p> <p>The simulator consists of two boxes that plugged into the AGC's core rope slots. These boxes are visible in the upper-left side of the AGC above, with round military-style connectors for connection to the external computer. One box exported address information each time the AGC performed a core rope read, while the other box fed 16 data bits into the AGC, "tricking" the AGC into thinking it had read from core rope. I built an interface from the core rope simulator boxes to a Beaglebone and will write more about that project later.</p> <h2>Conclusion</h2> <p>Core memory was the most common storage technology for computers in the 1960s. However, the Apollo Guidance Computer also used core ropes for read-only storage, an uncommon storage technique that achieved high density but required considerable labor. Core ropes made it possible to fit complex software into the compact physical space of the AGC. While 36K of code seems ludicrously small by modern standards, it held enough code to navigate and land on the Moon. And now, decades later, we can recover this code from core rope modules and learn more about it.</p> <p>Marc has a <a href="https://www.youtube.com/watch?v=2KSahAoOLdU">series of AGC videos</a>; the video below discusses the core rope simulators. I announce my latest blog posts on Twitter, so follow me <a href="https://twitter.com/kenshirriff">@kenshirriff</a> for future articles. I also have an <a href="https://www.righto.com/feeds/posts/default">RSS feed</a>. See the footnotes for more information sources<span id="fnref:links"><a class="ref" href="#fn:links" rel="footnote">15</a></span>. Thanks to Mike Stewart for supplying images and extensive information.</p> <iframe width="560" height="315" src="https://www.youtube.com/embed/GTJLaSJwjAg?start=257" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> <h2>Notes and references</h2> <div class="footnote"> <ol> <li id="fn:earlyrope"> <p><a href="https://en.wikipedia.org/wiki/Core_rope_memory#/media/File:Apollo_guidiance_computer_ferrit_core_memory.jpg">Prototype core rope memories</a> had a single bundle of wire that looked similar to a rope. The final core rope memories didn't look as rope-like, but kept the name.&#160;<a class="footnote-backref" href="#fnref:earlyrope" rev="footnote" title="Jump back to footnote 1 in the text">&#8617;</a></p> </li> <li id="fn:density"> <p>The core rope memory achieved a density of 1500 bits per cubic inch, including the driving hardware and packaging. This was about 5 times the density of erasable core memory. See <a href="http://ibiblio.org/apollo/hrst/archive/1029.pdf">MIT's Role in Project Apollo vol III</a> pages 91 and 274.</p> <p>The cores in core rope were not regular ferrite cores, but <a href="https://en.wikipedia.org/wiki/Permalloy">permalloy</a> ribbon wound around a non-magnetic steel bobbin. If you're used to ferrite cores, winding a metallic ribbon around a bobbin may seem like a strange way to make a core, but that was how the earliest cores were built, until ferrite cores started to be used in the early 1950s. The ferromagnetic materials used in wound-ribbon cores were developed by Germany in World War II and used by the German navy in magnetic amplifiers. After the war, American personnel brought back the material along with a rolling mill, and started US manufacturing under the name Deltamax. In other words, core memory had its origin in Nazi technology captured by the US. See <a href="https://amzn.to/2HhfAnY">Memories that shaped an industry</a>, pages 39-40, 52, 87, 90.</p> <p>The cores used in the core rope were rather large, .249" in diameter, about 5 times the diameter of the cores used in the erasable core memory. (In comparison, some IBM 360 mainframes of the same era used tiny cores that were .021" in diameter.) When a rope core flipped, it yielded a fairly large voltage pulse of 215-430 mV. Properties of the cores were defined in NASA specification control drawing <a href="http://www.ibiblio.org/apollo/SCDs/scd_1006320-.pdf">SCD-1006320</a>.&#160;<a class="footnote-backref" href="#fnref:density" rev="footnote" title="Jump back to footnote 2 in the text">&#8617;</a></p> </li> <li id="fn:owner"> <p>The AGC restoration team consists of Mike Stewart (creator of <a href="https://github.com/virtualagc/agc_simulation">FPGA AGC</a>), <a href="https://rescue1130.blogspot.com/2018/11/restoring-apollo-guidance-computer-part.html">Carl Claunch</a>, Marc Verdiell (<a href="https://www.youtube.com/channel/UC3bosUr3WlKYm4sBaLs-Adw">CuriousMarc</a> on YouTube) and myself. The AGC that we're restoring belongs to a private owner who picked it up at a scrap yard in the 1970s after NASA scrapped it. For simplicity, I refer to the AGC we're restoring as "our AGC".</p> <p>The Apollo flights had one AGC in the command module (the capsule that returned to Earth) and one AGC in the lunar module. In 1968, before the Moon missions, NASA <a href="https://www.nasa.gov/feature/50-years-ago-thermo-vacuum-testing-certifies-critical-lunar-hardware">tested a lunar module</a> with astronauts aboard in a giant vacuum chamber in Houston to ensure that everything worked in space-like conditions. We believe our AGC was installed in that lunar module (LTA-8). Since this AGC was never flown, most of the modules were not potted with epoxy.&#160;<a class="footnote-backref" href="#fnref:owner" rev="footnote" title="Jump back to footnote 3 in the text">&#8617;</a></p> </li> <li id="fn:rope"> <p>Yes, we know about <a href="https://youtu.be/WquhaobDqLU">Francois</a> and the rope modules he read; those are ropes for the earlier Block I Apollo Guidance Computer and are not compatible with our Block II AGC. Also, many people have asked if we talked to <a href="https://www.youtube.com/watch?v=UjcfepTdvZI">Fran</a> about the DSKY. Yes, we have.&#160;<a class="footnote-backref" href="#fnref:rope" rev="footnote" title="Jump back to footnote 4 in the text">&#8617;</a></p> </li> <li id="fn:wires"> <p>Mike Stewart pointed out that a core wouldn't have all 192 sense wires passing through it. Because the system used odd parity, at most 15 of the 16 bits can be high. Thus, at most 180 sense wires would pass through a core.&#160;<a class="footnote-backref" href="#fnref:wires" rev="footnote" title="Jump back to footnote 5 in the text">&#8617;</a></p> </li> <li id="fn:complications"> <p>The Apollo Guidance Computer had one additional pair of inhibit lines for address parity so all non-matching cores will have at least two inhibit lines activated. (If a core was one line away from being activated, the parity would also be different, yielding two active inhibit lines.) The purpose of this was to ensure that every non-selected core received two inhibit signals and was solidly inhibited. Otherwise, a core with just one inhibit line high might receive a bit of net set current, changing its magnetism slightly and introducing noise.</p> <p>Note that 7 address lines select one of 128 cores. Each module consists of four (logical) planes of 128 cores, yielding 512 cores. To select one of the four planes, four different reset lines are used, to reset just the core in the desired plane. Thus, only that plane is read. Two set lines are used, one to set cores in planes A and B, and one for planes C and D. To avoid setting cores in two planes, the reset line in the undesired plane was activated at the same time as the set line, blocking the set in that plane. The obvious approaches would be to use four set lines (one per plane), or one set line (and use reset to block the others). I don't know why they used two set lines.</p> <p>Each module also had a "clear" line that passed through all the cores. This was similar to reset, but was needed due to a complexity of the AGC's opcode decoding. To fit more opcodes into a 15-bit instruction, the AGC used "<a href="https://www.ibiblio.org/apollo/assembly_language_manual.html#Instruction_Representation">quartercode</a>" instructions. The idea was that some instructions didn't make sense on a fixed memory address, such as increment. The AGC would perform an entirely different instruction in that case, allowing a larger instruction set. The problem was that by the time instruction decoding had decided that the instruction didn't apply to the specified address, the read of fixed memory had already started, and the core was set. The "clear" line allowed this core to be reset so it wouldn't interfere with the desired read. I don't know why the existing reset lines couldn't be used for this purpose. (<a href="https://archive.org/details/acelectroniclmma00acel_0/page/n275">Summary</a> and <a href="https://www.ibiblio.org/apollo/Documents/dd_memo_376.pdf">details</a>.) The schematic is <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n293">here</a>.&#160;<a class="footnote-backref" href="#fnref:complications" rev="footnote" title="Jump back to footnote 6 in the text">&#8617;</a></p> </li> <li id="fn:erasabledifferences"> <p>If you are familiar with regular core memory (i.e. erasable RAM core memory), there are many similarities, but also many important differences. First, erasable core memory was arranged in a grid, and a particular core was selected by energizing an X line and a Y line in the grid. Second, erasable core memory stored a single bit per core, with the direction of magnetization indicating a 0 or 1. Core rope, on the other hand, stored many bits per core, with a 0 or 1 depending on if a sense wire goes through the core or not. The cores in core rope were much larger, since about 200 wires went through each core, while erasable core memory typically had 3 wires through each core. Finally, erasable core memory used the inhibit line for writing a 0, while core rope used inhibit lines for addressing.&#160;<a class="footnote-backref" href="#fnref:erasabledifferences" rev="footnote" title="Jump back to footnote 7 in the text">&#8617;</a></p> </li> <li id="fn:wordsize"> <p>For more information on why the Apollo Guidance Computer used 15-bit words, see <a href="http://ibiblio.org/apollo/hrst/archive/1029.pdf">MIT's Role in Project Apollo vol III</a> page 32. The short answer is they required about 27-32 bits accuracy for navigation computations, and about 15 bits for control variables. Using a 15-bit word for small values and double-precision values for navigation provided sufficient accuracy. A 14-bit word was too small. A 17- or 18- bit word would simplify some things but increase costs.&#160;<a class="footnote-backref" href="#fnref:wordsize" rev="footnote" title="Jump back to footnote 8 in the text">&#8617;</a></p> </li> <li id="fn:block1"> <p>Core rope memory in the earlier Block I Apollo Guidance Computer was configured slightly differently. The memory was folded into 4 layers of 128 cores instead of 2 layers of 256 cores. As a result, the Block I rope modules had a different shape: roughly square in cross-section, unlike the flat Block II modules. In early Block I modules, each core had 128 sense wires (8 words) threaded through it, yielding 4K words per module. <!-- Hall p100 --> With 6 modules, an early Block I AGC had 24K words of rope storage. In later Block I AGCs, the rope modules provided more storage: 192 sense wires (12 words) per core, yielding 6K words per module. Thus, 24K of rope storage required just 4 modules. For the Block II computers used for the Moon missions, 6 modules &times; 512 cores per module &times; 192 bits per core &divide; 16 bits per word = 36864 (36K) words in total.&#160;<a class="footnote-backref" href="#fnref:block1" rev="footnote" title="Jump back to footnote 9 in the text">&#8617;</a></p> </li> <li id="fn:select"> <p>Selection of a particular module and strand was done through a resistor/diode biasing network using hundreds of resistors and diodes in each module. The diagram below shows how this network operated. The selected strand line was pulled high, while the selected module line was pulled low. This resulted in current (red) through the selected strand and through the sense amplifier transformer. The remaining diodes were reverse-biased, so no current flowed. A voltage pulse on the sense wire through the selected core perturbed the current flow, resulting in a voltage imbalance across the sense amplifier transformer. This signal was detected by the sense amplifier, resulting in a 1 bit. (This circuit is rather confusing; you might expect the circuit to be a loop through the sense wire and the sense amplifier transformer, but instead, the currents are flowing towards the 0-volt module line in the middle. Study the directional arrows carefully to see how the current flows. The current from a flipped core is essentially superimposed on this current flow.)</p> <p><a href="http://static.righto.com/images/agc-rope/module-select-labeled.jpg"><img alt="A particular strand and module were selected by a resistor/diode network. The non-selected diodes were reverse-biased, blocking those signals from the sense amplifiers. Based on MIT&#39;s Role in Project Apollo vol III, Fig. 3-13" class="hilite" height="356" src="http://static.righto.com/images/agc-rope/module-select-labeled-w500.jpg" title="A particular strand and module were selected by a resistor/diode network. The non-selected diodes were reverse-biased, blocking those signals from the sense amplifiers. Based on MIT&#39;s Role in Project Apollo vol III, Fig. 3-13" width="500" /></a><div class="cite">A particular strand and module were selected by a resistor/diode network. The non-selected diodes were reverse-biased, blocking those signals from the sense amplifiers. Based on <a href="http://ibiblio.org/apollo/hrst/archive/1029.pdf">MIT's Role in Project Apollo vol III</a>, Fig. 3-13</div></p> <p>The resistor and diodes in the left green box were repeated once for each strand (i.e. 192 times in each module), while the resistor and diodes in the right box were repeated once for each sense line (i.e. 16 times in each module).&#160;<a class="footnote-backref" href="#fnref:select" rev="footnote" title="Jump back to footnote 10 in the text">&#8617;</a></p> </li> <li id="fn:leap"> <p>The need to freeze the software design weeks in advance was viewed as a feature: "The inability to change the program without rebuilding one or more modules provides an effective management tool for the control of software changes. It also provides another incentive to make the software error free." See <a href="http://ibiblio.org/apollo/hrst/archive/1029.pdf">MIT's Role in Project Apollo vol III</a> page 274. Much of the information in this section on core rope manufacturing is from <a href="https://amzn.to/2NlGLmC">One Giant Leap</a>. The 1965 video <a href="https://youtu.be/ndvmFlg1WmE?t=1244">Computers For Apollo</a> shows AGC manufacturing process (including core ropes) in detail.&#160;<a class="footnote-backref" href="#fnref:leap" rev="footnote" title="Jump back to footnote 11 in the text">&#8617;</a></p> </li> <li id="fn:gendered"> <p>There are interesting gender issues behind the manufacture of core rope and core memory that I'll only mention briefly. The core rope has been referred to as LOL memory, referencing the "Little Old Ladies" who assembled it, but this name erases the women of color who also assembled core ropes. (I'm also not convinced that the LOL name was used at the time.) The software for a particular flight was managed by "<a href="https://wehackthemoon.com/people/dan-lickly-computer-engineering">rope mother</a>" who was generally male <!-- Digital Apollo page 171 --> (although the famous Margaret Hamilton was rope mother on LUMINARY). <!-- https://bssw.io/blog_posts/celebrating-apollo-s-50th-anniversary-the-oldest-code-on-github --> Also see <a href="https://faculty.washington.edu/dkrosner/files/CHI-2018-Core-Memory.pdf">Making Core Memory: Design Inquiry into Gendered Legacies of Engineering and Craftwork</a>.</p> <p><a class="footnote-backref" href="#fnref:gendered" rev="footnote" title="Jump back to footnote 12 in the text">&#8617;</a><a href="http://static.righto.com/images/agc-rope/raytheon-weaving.jpg"><img alt="Women weaving a core rope. Raytheon photo, via BBC." class="hilite" height="305" src="http://static.righto.com/images/agc-rope/raytheon-weaving-w400.jpg" title="Women weaving a core rope. Raytheon photo, via BBC." width="400" /></a><div class="cite">Women weaving a core rope. Raytheon photo, via <a href="http://news.bbc.co.uk/2/hi/technology/8148730.stm">BBC</a>.</div></p> </li> <li id="fn:fixed"> <p>The sense amplifier output circuitry is a bit confusing because the erasable core memory (RAM) and fixed rope core memory (ROM) sense amp outputs were wired together to connect to the CPU. The RAM had one sense amp module with 16 amplifiers in slot B13, and the ROM had its own identical sense amp module in slot B14. However, each module only had 8 output transistors. The two modules were wired together so 8 output bits are driven by transistors in the RAM's sense amp module and 8 output bits are driven by transistors in the ROM's sense amp module. (The motivation behind this was to use identical sense amp modules for RAM and ROM, but only needing 16 output transistors in total. Thus, the transistors are split up 8 to a module.)&#160;<a class="footnote-backref" href="#fnref:fixed" rev="footnote" title="Jump back to footnote 13 in the text">&#8617;</a></p> </li> <li id="fn:senseamp"> <p>I'll give a bit more detail on the sense amps here. The key challenge with the sense amps is that the signal from flipping a core is small and there are multiple sources of noise that the sense line can pick up. By using a differential signal (i.e. looking at the difference between the two inputs), noise that is picked up by both ends of the sense line (common-mode noise) can be rejected. The differential transformer improved the common-mode noise rejection by a factor of 30. (See page 9-16 of the <a href="http://www.ibiblio.org/apollo/Documents/agc_blk2_design_review.pdf">Design Review</a>.) The other factor is that the sense line goes through some cores in the same direction as the select lines, and through some cores the opposite direction. This helps cancel out noise from the select lines. However, the consequence is that the pulse on the select line may be positive or may be negative. Thus, the sense amp needed to handle pulses of either polarity; the threshold stage converted the bipolar signal to a binary output.</p> <p><a href="http://static.righto.com/images/agc-rope/sense-amp-labeled.jpg"><img alt="Schematic of the circuitry inside a sense amplifier IC." class="hilite" height="266" src="http://static.righto.com/images/agc-rope/sense-amp-labeled-w500.jpg" title="Schematic of the circuitry inside a sense amplifier IC." width="500" /></a><div class="cite">Schematic of the circuitry inside a sense amplifier IC.</div></p> <p>The sense amplifier (above) was a custom integrated circuit designed by Sperry Rand in 1962. This chip pushed the state of the art for analog ICs and it may be the first integrated circuit amplifier. <!-- Hall p90 --> The sense amp chips initially cost $200 each, equivalent to $1700 now.&#160;<a class="footnote-backref" href="#fnref:senseamp" rev="footnote" title="Jump back to footnote 14 in the text">&#8617;</a></p> </li> <li id="fn:links"> <p>For more information on the AGC, the <a href="https://virtualagc.github.io/virtualagc/index.html">Virtual AGC site</a> has tons of information on the AGC, in particular the <a href="https://virtualagc.github.io/virtualagc/ElectroMechanical.html">ElectroMechanical</a> page has lots of schematics and drawings. There's a <a href="http://www.ibiblio.org/apollo/klabs/video/hall.wmv">video of Eldon Hall</a>, designer of the AGC, disassembling our AGC in 2004. Eldon Hall's book <a href="https://amzn.to/2J6nYav">Journey to the Moon</a> describes development of the Apollo Guidance Computer in detail, and was very helpful for this blog post. If you want to try a simulated AGC in your browser, see <a href="http://svtsim.com/moonjs/agc.html">moonjs</a>.</p> <p>The Apollo manuals provide detailed information on the memory system. The manual has a <a href="https://archive.org/stream/acelectroniclmma00acel_0#page/n242/mode/1up">block diagram</a> of the AGC's memory system. Engineering drawings of the AGC's core rope are <a href="https://archive.org/stream/AgcApertureCardsBatch1Images#page/n228/mode/1up">here</a>. Fixed memory is described in the AC Electronic LM Manual volume 2 starting at <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n275">4-594</a> and a core rope wiring diagram is <a href="https://archive.org/stream/agc_handbook_jp2#page/n112/mode/2up">here</a>. Sense amplifiers: <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n296">description</a>, <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n298">schematics</a>. Strand and module select circuits: <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n296">description</a>, <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n284">schematic</a>, <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n298">schematic</a>. Set circuit: <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n275">description</a>, <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n278">description</a>, <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n282">schematic</a>, <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n291">schematic</a>. Reset circuit: <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n275">description</a>, <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n278">description</a>, <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n289">schematic</a>. Inhibit circuit: <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n279">description</a>, <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n287">schematic</a>. Address decoder: <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n93">description</a>, <a href="https://archive.org/details/acelectroniclmma00acel_0/page/n98">schematic</a>.&#160;<a class="footnote-backref" href="#fnref:links" rev="footnote" title="Jump back to footnote 15 in the text">&#8617;</a></p> </li> </ol> </div> <div style='clear: both;'></div> </div> <div class='post-footer'> <div class='post-footer-line post-footer-line-1'><span class='post-comment-link'> <a class='comment-link' href='https://www.blogger.com/comment/fullpage/post/6264947694886887540/7645797181470915638' onclick=''> 13 comments: </a> </span> <span class='post-icons'> <span class='item-action'> <a href='https://www.blogger.com/email-post/6264947694886887540/7645797181470915638' title='Email Post'> <img alt='' class='icon-action' height='13' src='http://img1.blogblog.com/img/icon18_email.gif' width='18'/> </a> </span> <span class='item-control blog-admin pid-1138732533'> <a href='https://www.blogger.com/post-edit.g?blogID=6264947694886887540&postID=7645797181470915638&from=pencil' title='Edit Post'> <img alt='' class='icon-action' height='18' src='https://resources.blogblog.com/img/icon18_edit_allbkg.gif' width='18'/> </a> </span> </span> <span class='post-backlinks post-comment-link'> </span> <div class='post-share-buttons goog-inline-block'> <a class='goog-inline-block share-button sb-email' href='https://www.blogger.com/share-post.g?blogID=6264947694886887540&postID=7645797181470915638&target=email' target='_blank' title='Email This'><span class='share-button-link-text'>Email This</span></a><a class='goog-inline-block share-button sb-blog' href='https://www.blogger.com/share-post.g?blogID=6264947694886887540&postID=7645797181470915638&target=blog' onclick='window.open(this.href, "_blank", "height=270,width=475"); return false;' target='_blank' title='BlogThis!'><span class='share-button-link-text'>BlogThis!</span></a><a class='goog-inline-block share-button sb-twitter' href='https://www.blogger.com/share-post.g?blogID=6264947694886887540&postID=7645797181470915638&target=twitter' target='_blank' title='Share to X'><span class='share-button-link-text'>Share to X</span></a><a class='goog-inline-block share-button sb-facebook' href='https://www.blogger.com/share-post.g?blogID=6264947694886887540&postID=7645797181470915638&target=facebook' onclick='window.open(this.href, "_blank", "height=430,width=640"); return false;' target='_blank' title='Share to Facebook'><span class='share-button-link-text'>Share to Facebook</span></a><a class='goog-inline-block share-button sb-pinterest' href='https://www.blogger.com/share-post.g?blogID=6264947694886887540&postID=7645797181470915638&target=pinterest' target='_blank' title='Share to Pinterest'><span class='share-button-link-text'>Share to Pinterest</span></a> </div> </div> <div class='post-footer-line post-footer-line-2'><span class='post-labels'> Labels: <a href="https://www.righto.com/search/label/Apollo" rel='tag'>Apollo</a>, <a href="https://www.righto.com/search/label/electronics" rel='tag'>electronics</a> </span> </div> <div class='post-footer-line post-footer-line-3'></div> </div> </div> </div> </div></div> </div> <div class='blog-pager' id='blog-pager'> <span id='blog-pager-newer-link'> <a class='blog-pager-newer-link' href="https://www.righto.com/search?updated-max=2019-11-07T09:30:00-08:00&max-results=7&reverse-paginate=true" id='Blog1_blog-pager-newer-link' title='Newer Posts'>Newer Posts</a> </span> <span id='blog-pager-older-link'> <a class='blog-pager-older-link' href="https://www.righto.com/search?updated-max=2019-07-04T09:04:00-07:00&max-results=7&reverse-paginate=true&start=3&by-date=false" id='Blog1_blog-pager-older-link' title='Older Posts'>Older Posts</a> </span> <a class='home-link' href="https://www.righto.com/">Home</a> </div> <div class='clear'></div> </div></div> </div> </div> <div class='column-left-outer'> <div class='column-left-inner'> <aside> </aside> </div> </div> <div class='column-right-outer'> <div class='column-right-inner'> <aside> <div class='sidebar section' id='sidebar-right-1'><div class='widget HTML' data-version='1' id='HTML2'> <div class='widget-content'> <style> @import url('https://fonts.googleapis.com/css?family=Montserrat:300,400,500,700'); .form-preview { display: flex; flex-direction: column; justify-content: center; margin-top: 30px; padding: clamp(17px, 5%, 40px) clamp(17px, 7%, 50px); max-width: 350px; min-height: 200px; border-radius: 6px; box-shadow: 0 5px 25px rgba(34, 60, 47, 0.25); } .form-preview, .form-preview *{ box-sizing: border-box; } .form-preview .preview-heading { width: 100%; } .form-preview .preview-heading h5{ margin-top: 0; margin-bottom: 0; } .form-preview .preview-input-field { margin-top: 20px; width: 100%; } .form-preview .preview-input-field input { width: 100%; height: 40px; border-radius: 6px; border: 2px solid #e9e8e8; background-color: #fff; outline: none; } .form-preview .preview-input-field input::placeholder, .form-preview .preview-input-field input { opacity: 0.5; color: #000; font-family: "Montserrat"; font-size: 14px; font-weight: 500; line-height: 20px; text-align: center; } .form-preview .preview-submit-button { margin-top: 10px; width: 100%; } .form-preview .preview-submit-button button { width: 100%; height: 40px; border: 0; border-radius: 6px; line-height: 0px; } .form-preview .preview-submit-button button:hover { cursor: pointer; } </style><form data-v-4c58e686="" action="https://api.follow.it/subscription-form/U3NBTmZKVkI1YVpCa000a0RCZHFiQ3FYMko1cWRTZTN6K3hJdWM2QWxJbE1uVXdXUHZZVzJVQzVLZGh5Y0RCVXB2d2JSTzBobGhuY0FsZnlHbVdFZ2VTN2Q4Vy84RnIxUTgzVlcrbXNIR0Y0aW93d3REM2J6VS9RL0gxWURnV1d8ZWN0YStwUWdWWUFiOTIyWDVGWjdYYVdGZEVNcC9qODZacjlwWXRIcEJQRT0=/8" method="post"><div data-v-4c58e686="" class="form-preview" style="background-color: rgb(255, 255, 255); border-style: solid; border-width: 1px; border-color: rgb(204, 204, 204); position: relative;"><div data-v-4c58e686="" class="preview-heading"><h5 data-v-4c58e686="" style="font-family: Montserrat; font-weight: bold; color: rgb(0, 0, 0); font-size: 12px; text-align: center;">Get new posts by email:</h5></div> <div data-v-4c58e686="" class="preview-input-field"><input data-v-4c58e686="" type="email" name="email" placeholder="Enter your email" spellcheck="false" /></div> <div data-v-4c58e686="" class="preview-submit-button"><button data-v-4c58e686="" type="submit" style="font-family: Montserrat; font-weight: bold; color: rgb(255, 255, 255); font-size: 12px; text-align: center; background-color: rgb(0, 0, 0);">Subscribe</button></div></div></form> </div> <div class='clear'></div> </div><div class='widget HTML' data-version='1' id='HTML3'> <h2 class='title'>About the site</h2> <div class='widget-content'> <a href="https://www.righto.com/p/index.html">Contact info and site index</a> </div> <div class='clear'></div> </div><div class='widget PopularPosts' data-version='1' id='PopularPosts1'> <h2>Popular Posts</h2> <div class='widget-content popular-posts'> <ul> <li> <div class='item-thumbnail-only'> <div class='item-thumbnail'> <a href="https://www.righto.com/2025/02/origin-of-mainframe-term.html" target='_blank'> <img alt='' border='0' src='https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_tBn8FvBqiMwzms-EFuXp1eiIU4jMqaiPFJCU3N_-Qf3sHaElH9d4-wXsPd2mB6_axF3QudwELGKIi4g_BAcLosIUU1tKA-rlnn84wF_7HA7_PaB-f8E5aFKo-HjAoY3wNR3g=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href="https://www.righto.com/2025/02/origin-of-mainframe-term.html">The origin and unexpected evolution of the word "mainframe"</a></div> </div> <div style='clear: both;'></div> </li> <li> <div class='item-thumbnail-only'> <div class='item-thumbnail'> <a href="https://www.righto.com/2024/05/blog-post.html" target='_blank'> <img alt='' border='0' src='https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_tktDGU_AMxNBFlBi0Sih_5d1yAqXXDwfOCw7O0fsKQpQmkPuLmQfVBplLB4vwlxkL953PmzPBc3O4M1YHatxuJLvdWicjlWnZ8FcJ6tZz9c3BW1wHxnCiImVckYt1G0r0VrqzBnFVP9NXq2uvS8qJI=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href="https://www.righto.com/2024/05/blog-post.html">Inside a vintage aerospace navigation computer of uncertain purpose</a></div> </div> <div style='clear: both;'></div> </li> <li> <div class='item-thumbnail-only'> <div class='item-thumbnail'> <a href="https://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html" target='_blank'> <img alt='' border='0' src='https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_tQB5O1zG0qnwRD_qsXSmn5T91Zv7mG7ts7Sf5gJj45sYWJAnTwAsRd90SCQEysE9rZVBQTEVuAwgYDPTyUgLi3Rp-51wIKsr49vPdl-3R7RR0=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href="https://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html">A Multi-Protocol Infrared Remote Library for the Arduino</a></div> </div> <div style='clear: both;'></div> </li> <li> <div class='item-thumbnail-only'> <div class='item-thumbnail'> <a href="https://www.righto.com/2012/05/apple-iphone-charger-teardown-quality.html" target='_blank'> <img alt='' border='0' src='https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_uspYiruEXsrv1Tz2gooXTLDrxlHBMi0A_b5tCiTUxgzyH1OCwR8rqIAnoL937NiEEu22m-Yo_RXNnUaapg22EGGlIWn8XjfaHMaUhftz77OxepcO_NM0tMyRTXnnOtywhP2mepSyFJTZNWFLruW5QSzP4=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href="https://www.righto.com/2012/05/apple-iphone-charger-teardown-quality.html">Apple iPhone charger teardown: quality in a tiny expensive package</a></div> </div> <div style='clear: both;'></div> </li> <li> <div class='item-thumbnail-only'> <div class='item-thumbnail'> <a href="https://www.righto.com/2014/12/inside-intel-1405-die-photos-of-shift.html" target='_blank'> <img alt='' border='0' src='https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_tMky87VHkoZ5ncRe_xfanTOYlbH-VB9gu3rSSEUWEUJRYsZGXrgrjLB-4qyIQofChcGLEzFFFdMPEUp9k5RlggSTGQhODkQYw29Bs1u6ittniyao_V9F_gJoAbiOmd7Q=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href="https://www.righto.com/2014/12/inside-intel-1405-die-photos-of-shift.html">Inside the Intel 1405: die photos of a shift register memory from 1970</a></div> </div> <div style='clear: both;'></div> </li> <li> <div class='item-thumbnail-only'> <div class='item-thumbnail'> <a href="https://www.righto.com/2014/09/mining-bitcoin-with-pencil-and-paper.html" target='_blank'> <img alt='' border='0' src='https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_sLRoRjJfMgzCpjuz43Aw9i0FPIzUYP3A8U_o8BaAYHa_KKAXaEQ5k4ulIs7TiP8iAM-uM_tedbVRKzrWNVqAWYdBJcxfbjEOZHDAbagm-vuW7BTjw6OdDX4VO--V3dySm-=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href="https://www.righto.com/2014/09/mining-bitcoin-with-pencil-and-paper.html">Mining Bitcoin with pencil and paper: 0.67 hashes per day</a></div> </div> <div style='clear: both;'></div> </li> <li> <div class='item-thumbnail-only'> <div class='item-thumbnail'> <a href="https://www.righto.com/2012/10/a-dozen-usb-chargers-in-lab-apple-is.html" target='_blank'> <img alt='' border='0' src='https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_uDThXWTM7kGsHLT7GrcQ5h8DUxeD7X3mAcz-Ry_HKcDs_kWEcZYa94KkAFg2_HC-k_sM0mpeG3SP1061QdyyYK2mbiQMG_HDAW67J1IOk8snsDm1spWtux5Vojemg=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href="https://www.righto.com/2012/10/a-dozen-usb-chargers-in-lab-apple-is.html">A dozen USB chargers in the lab: Apple is very good, but not quite the best</a></div> </div> <div style='clear: both;'></div> </li> <li> <div class='item-thumbnail-only'> <div class='item-thumbnail'> <a href="https://www.righto.com/2025/01/its-time-to-abandon-cargo-cult-metaphor.html" target='_blank'> <img alt='' border='0' src='https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_vZ73e97M6gs3DEBFC9gIYsCLGHYefiEun8d3lZzogGqm1DJHXO5EJVe3fB8QdiK0xrccu4DXQRgeDrK56cxC6qGIf-GaLcPyvMXLWUhTr9En93ox_mDc9a0vT32qwBkQ=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href="https://www.righto.com/2025/01/its-time-to-abandon-cargo-cult-metaphor.html">The origin of the cargo cult metaphor</a></div> </div> <div style='clear: both;'></div> </li> </ul> <div class='clear'></div> </div> </div><div class='widget BlogSearch' data-version='1' id='BlogSearch1'> <h2 class='title'>Search This Blog</h2> <div class='widget-content'> <div id='BlogSearch1_form'> <form action="https://www.righto.com/search" class='gsc-search-box' target='_top'> <table cellpadding='0' cellspacing='0' class='gsc-search-box'> <tbody> <tr> <td class='gsc-input'> <input autocomplete='off' class='gsc-input' name='q' size='10' title='search' type='text' value=''/> </td> <td class='gsc-search-button'> <input class='gsc-search-button' title='search' type='submit' value='Search'/> </td> </tr> </tbody> </table> </form> </div> </div> <div class='clear'></div> </div><div class='widget Label' data-version='1' id='Label1'> <h2>Labels</h2> <div class='widget-content cloud-label-widget-content'> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/386">386</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/6502">6502</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/8008">8008</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/8085">8085</a> </span> <span class='label-size label-size-4'> <a dir='ltr' href="https://www.righto.com/search/label/8086">8086</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/8087">8087</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/8088">8088</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/aerospace">aerospace</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/alto">alto</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/analog">analog</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/Apollo">Apollo</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/apple">apple</a> </span> <span class='label-size label-size-4'> <a dir='ltr' href="https://www.righto.com/search/label/arc">arc</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/arduino">arduino</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/arm">arm</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/beaglebone">beaglebone</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/bitcoin">bitcoin</a> </span> <span class='label-size label-size-1'> <a dir='ltr' href="https://www.righto.com/search/label/c%23">c#</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/cadc">cadc</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/calculator">calculator</a> </span> <span class='label-size label-size-4'> <a dir='ltr' href="https://www.righto.com/search/label/chips">chips</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/css">css</a> </span> <span class='label-size label-size-1'> <a dir='ltr' href="https://www.righto.com/search/label/datapoint">datapoint</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/dx7">dx7</a> </span> <span class='label-size label-size-5'> <a dir='ltr' href="https://www.righto.com/search/label/electronics">electronics</a> </span> <span class='label-size label-size-1'> <a dir='ltr' href="https://www.righto.com/search/label/f%23">f#</a> </span> <span class='label-size label-size-1'> <a dir='ltr' href="https://www.righto.com/search/label/fairchild">fairchild</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/fpga">fpga</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/fractals">fractals</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/genome">genome</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/globus">globus</a> </span> <span class='label-size label-size-1'> <a dir='ltr' href="https://www.righto.com/search/label/haskell">haskell</a> </span> <span class='label-size label-size-1'> <a dir='ltr' href="https://www.righto.com/search/label/HP">HP</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/html5">html5</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/ibm">ibm</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/ibm1401">ibm1401</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/ibm360">ibm360</a> </span> <span class='label-size label-size-4'> <a dir='ltr' href="https://www.righto.com/search/label/intel">intel</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/ipv6">ipv6</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/ir">ir</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/java">java</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/javascript">javascript</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/math">math</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/microcode">microcode</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/oscilloscope">oscilloscope</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/Pentium">Pentium</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/photo">photo</a> </span> <span class='label-size label-size-4'> <a dir='ltr' href="https://www.righto.com/search/label/power%20supply">power supply</a> </span> <span class='label-size label-size-4'> <a dir='ltr' href="https://www.righto.com/search/label/random">random</a> </span> <span class='label-size label-size-5'> <a dir='ltr' href="https://www.righto.com/search/label/reverse-engineering">reverse-engineering</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/sheevaplug">sheevaplug</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/snark">snark</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href="https://www.righto.com/search/label/space">space</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/spanish">spanish</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/synth">synth</a> </span> <span class='label-size label-size-4'> <a dir='ltr' href="https://www.righto.com/search/label/teardown">teardown</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/theory">theory</a> </span> <span class='label-size label-size-1'> <a dir='ltr' href="https://www.righto.com/search/label/unicode">unicode</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href="https://www.righto.com/search/label/Z-80">Z-80</a> </span> <div class='clear'></div> </div> </div><div class='widget BlogArchive' data-version='1' id='BlogArchive1'> <h2>Blog Archive</h2> <div class='widget-content'> <div id='ArchiveList'> <div id='BlogArchive1_ArchiveList'> <ul class='hierarchy'> <li class='archivedate expanded'> <a class='toggle' href='javascript:void(0)'> <span class='zippy toggle-open'> &#9660;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2025/"> 2025 </a> <span class='post-count' dir='ltr'>(5)</span> <ul class='hierarchy'> <li class='archivedate expanded'> <a class='toggle' href='javascript:void(0)'> <span class='zippy toggle-open'> &#9660;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2025/02/"> February </a> <span class='post-count' dir='ltr'>(1)</span> <ul class='posts'> <li><a href="https://www.righto.com/2025/02/origin-of-mainframe-term.html">The origin and unexpected evolution of the word &quot;m...</a></li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2025/01/"> January </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2024/"> 2024 </a> <span class='post-count' dir='ltr'>(21)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2024/12/"> December </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2024/11/"> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2024/10/"> October </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2024/09/"> September </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2024/08/"> August </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2024/07/"> July </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2024/06/"> June </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2024/05/"> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2024/04/"> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2024/03/"> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2024/02/"> February </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2024/01/"> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2023/"> 2023 </a> <span class='post-count' dir='ltr'>(35)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2023/12/"> December </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2023/11/"> November </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2023/10/"> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2023/09/"> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2023/08/"> August </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2023/07/"> July </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2023/05/"> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2023/04/"> April </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2023/03/"> March </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2023/02/"> February </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2023/01/"> January </a> <span class='post-count' dir='ltr'>(8)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2022/"> 2022 </a> <span class='post-count' dir='ltr'>(18)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2022/11/"> November </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2022/08/"> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2022/07/"> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2022/06/"> June </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2022/05/"> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2022/04/"> April </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2022/03/"> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2022/02/"> February </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2022/01/"> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2021/"> 2021 </a> <span class='post-count' dir='ltr'>(26)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2021/12/"> December </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2021/11/"> November </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2021/09/"> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2021/08/"> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2021/07/"> July </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2021/06/"> June </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2021/05/"> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2021/04/"> April </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2021/03/"> March </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2021/02/"> February </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2021/01/"> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2020/"> 2020 </a> <span class='post-count' dir='ltr'>(33)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2020/12/"> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2020/11/"> November </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2020/10/"> October </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2020/09/"> September </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2020/08/"> August </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2020/07/"> July </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2020/06/"> June </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2020/05/"> May </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2020/04/"> April </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2020/03/"> March </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2020/01/"> January </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2019/"> 2019 </a> <span class='post-count' dir='ltr'>(18)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2019/11/"> November </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2019/10/"> October </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2019/09/"> September </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2019/08/"> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2019/07/"> July </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2019/04/"> April </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2019/02/"> February </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2019/01/"> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2018/"> 2018 </a> <span class='post-count' dir='ltr'>(17)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2018/12/"> December </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2018/09/"> September </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2018/08/"> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2018/06/"> June </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2018/05/"> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2018/04/"> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2018/03/"> March </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2018/02/"> February </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2018/01/"> January </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2017/"> 2017 </a> <span class='post-count' dir='ltr'>(21)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2017/12/"> December </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2017/11/"> November </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2017/10/"> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2017/08/"> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2017/07/"> July </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2017/06/"> June </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2017/04/"> April </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2017/03/"> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2017/02/"> February </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2017/01/"> January </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2016/"> 2016 </a> <span class='post-count' dir='ltr'>(34)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2016/12/"> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2016/10/"> October </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2016/09/"> September </a> <span class='post-count' dir='ltr'>(8)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2016/08/"> August </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2016/07/"> July </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2016/06/"> June </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2016/05/"> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2016/04/"> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2016/03/"> March </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2016/02/"> February </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2016/01/"> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2015/"> 2015 </a> <span class='post-count' dir='ltr'>(12)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2015/12/"> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2015/11/"> November </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2015/10/"> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2015/08/"> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2015/05/"> May </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2015/03/"> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2015/02/"> February </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2014/"> 2014 </a> <span class='post-count' dir='ltr'>(13)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2014/12/"> December </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2014/10/"> October </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2014/09/"> September </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2014/05/"> May </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2014/03/"> March </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2014/02/"> February </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2013/"> 2013 </a> <span class='post-count' dir='ltr'>(24)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2013/11/"> November </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2013/09/"> September </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2013/08/"> August </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2013/07/"> July </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2013/06/"> June </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2013/04/"> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2013/03/"> March </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2013/02/"> February </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2013/01/"> January </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2012/"> 2012 </a> <span class='post-count' dir='ltr'>(10)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2012/12/"> December </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2012/11/"> November </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2012/10/"> October </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2012/05/"> May </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2012/03/"> March </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2012/02/"> February </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2011/"> 2011 </a> <span class='post-count' dir='ltr'>(11)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2011/12/"> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2011/07/"> July </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2011/05/"> May </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2011/04/"> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2011/03/"> March </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2011/02/"> February </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2010/"> 2010 </a> <span class='post-count' dir='ltr'>(22)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2010/12/"> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2010/11/"> November </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2010/10/"> October </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2010/08/"> August </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2010/06/"> June </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2010/05/"> May </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2010/04/"> April </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2010/03/"> March </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2010/01/"> January </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2009/"> 2009 </a> <span class='post-count' dir='ltr'>(22)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2009/12/"> December </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2009/11/"> November </a> <span class='post-count' dir='ltr'>(5)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2009/09/"> September </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2009/08/"> August </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2009/07/"> July </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2009/06/"> June </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2009/04/"> April </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2009/03/"> March </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2009/02/"> February </a> <span class='post-count' dir='ltr'>(2)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2009/01/"> January </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2008/"> 2008 </a> <span class='post-count' dir='ltr'>(27)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2008/07/"> July </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2008/06/"> June </a> <span class='post-count' dir='ltr'>(1)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2008/05/"> May </a> <span class='post-count' dir='ltr'>(3)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2008/04/"> April </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2008/03/"> March </a> <span class='post-count' dir='ltr'>(10)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> &#9658;&#160; </span> </a> <a class='post-count-link' href="https://www.righto.com/2008/02/"> February </a> <span class='post-count' dir='ltr'>(6)</span> </li> </ul> </li> </ul> </div> </div> <div class='clear'></div> </div> </div></div> </aside> </div> </div> </div> <div style='clear: both'></div> <!-- columns --> </div> <!-- main --> </div> </div> <div class='main-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> <footer> <div class='footer-outer'> <div class='footer-cap-top cap-top'> <div class='cap-left'></div> <div class='cap-right'></div> </div> <div class='fauxborder-left footer-fauxborder-left'> <div class='fauxborder-right footer-fauxborder-right'></div> <div class='region-inner footer-inner'> <div class='foot no-items section' id='footer-1'></div> <table border='0' cellpadding='0' cellspacing='0' class='section-columns columns-2'> <tbody> <tr> <td class='first columns-cell'> <div class='foot no-items section' id='footer-2-1'></div> </td> <td class='columns-cell'> <div class='foot no-items section' id='footer-2-2'></div> </td> </tr> </tbody> </table> <!-- outside of the include in order to lock Attribution widget --> <div class='foot section' id='footer-3'><div class='widget Attribution' data-version='1' id='Attribution1'> <div class='widget-content' style='text-align: center;'> Powered by <a href='https://www.blogger.com' target='_blank'>Blogger</a>. </div> <div class='clear'></div> </div></div> </div> </div> <div class='footer-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </footer> <!-- content --> </div> </div> <div class='content-cap-bottom cap-bottom'> <div class='cap-left'></div> <div class='cap-right'></div> </div> </div> </div> <script type='text/javascript'> window.setTimeout(function() { document.body.className = document.body.className.replace('loading', ''); }, 10); </script> <script type="text/javascript" src="https://www.blogger.com/static/v1/widgets/2725212210-widgets.js"></script> <script type='text/javascript'> window['__wavt'] = 'AOuZoY5Dfz8bb8Qs49ahPy2DZLWLUHqSBQ:1740618732252';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d6264947694886887540','//www.righto.com/search?updated-max\x3d2019-09-29T08:30:00-07:00\x26max-results\x3d7\x26reverse-paginate\x3dtrue','6264947694886887540'); _WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '6264947694886887540', 'title': 'Ken Shirriff\x27s blog', 'url': 'http://www.righto.com/search?updated-max\x3d2019-09-29T08:30:00-07:00\x26max-results\x3d7\x26reverse-paginate\x3dtrue', 'canonicalUrl': 'http://www.righto.com/search?updated-max\x3d2019-09-29T08:30:00-07:00\x26max-results\x3d7\x26reverse-paginate\x3dtrue', 'homepageUrl': 'http://www.righto.com/', 'searchUrl': 'http://www.righto.com/search', 'canonicalHomepageUrl': 'http://www.righto.com/', 'blogspotFaviconUrl': 'http://www.righto.com/favicon.ico', 'bloggerUrl': 'https://www.blogger.com', 'hasCustomDomain': true, 'httpsEnabled': false, 'enabledCommentProfileImages': true, 'gPlusViewType': 'FILTERED_POSTMOD', 'adultContent': false, 'analyticsAccountNumber': 'UA-3782444-1', 'encoding': 'UTF-8', 'locale': 'en', 'localeUnderscoreDelimited': 'en', 'languageDirection': 'ltr', 'isPrivate': false, 'isMobile': false, 'isMobileRequest': false, 'mobileClass': '', 'isPrivateBlog': false, 'isDynamicViewsAvailable': true, 'feedLinks': '\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Ken Shirriff\x26#39;s blog - Atom\x22 href\x3d\x22http://www.righto.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22Ken Shirriff\x26#39;s blog - RSS\x22 href\x3d\x22http://www.righto.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22Ken Shirriff\x26#39;s blog - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/6264947694886887540/posts/default\x22 /\x3e\n', 'meTag': '\x3clink rel\x3d\x22me\x22 href\x3d\x22https://www.blogger.com/profile/08097301407311055124\x22 /\x3e\n', 'adsenseHostId': 'ca-host-pub-1556223355139109', 'adsenseHasAds': false, 'adsenseAutoAds': false, 'boqCommentIframeForm': true, 'loginRedirectParam': '', 'view': '', 'dynamicViewsCommentsSrc': '//www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js', 'dynamicViewsScriptSrc': '//www.blogblog.com/dynamicviews/74cfe181c1bbb7a1', 'plusOneApiSrc': 'https://apis.google.com/js/platform.js', 'disableGComments': true, 'interstitialAccepted': false, 'sharing': {'platforms': [{'name': 'Get link', 'key': 'link', 'shareMessage': 'Get link', 'target': ''}, {'name': 'Facebook', 'key': 'facebook', 'shareMessage': 'Share to Facebook', 'target': 'facebook'}, {'name': 'BlogThis!', 'key': 'blogThis', 'shareMessage': 'BlogThis!', 'target': 'blog'}, {'name': 'X', 'key': 'twitter', 'shareMessage': 'Share to X', 'target': 'twitter'}, {'name': 'Pinterest', 'key': 'pinterest', 'shareMessage': 'Share to Pinterest', 'target': 'pinterest'}, {'name': 'Email', 'key': 'email', 'shareMessage': 'Email', 'target': 'email'}], 'disableGooglePlus': true, 'googlePlusShareButtonWidth': 0, 'googlePlusBootstrap': '\x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27en\x27};\x3c/script\x3e'}, 'hasCustomJumpLinkMessage': false, 'jumpLinkMessage': 'Read more', 'pageType': 'index', 'pageName': '', 'pageTitle': 'Ken Shirriff\x27s blog'}}, {'name': 'features', 'data': {}}, {'name': 'messages', 'data': {'edit': 'Edit', 'linkCopiedToClipboard': 'Link copied to clipboard!', 'ok': 'Ok', 'postLink': 'Post Link'}}, {'name': 'template', 'data': {'name': 'custom', 'localizedName': 'Custom', 'isResponsive': false, 'isAlternateRendering': false, 'isCustom': true}}, {'name': 'view', 'data': {'classic': {'name': 'classic', 'url': '?view\x3dclassic'}, 'flipcard': {'name': 'flipcard', 'url': '?view\x3dflipcard'}, 'magazine': {'name': 'magazine', 'url': '?view\x3dmagazine'}, 'mosaic': {'name': 'mosaic', 'url': '?view\x3dmosaic'}, 'sidebar': {'name': 'sidebar', 'url': '?view\x3dsidebar'}, 'snapshot': {'name': 'snapshot', 'url': '?view\x3dsnapshot'}, 'timeslide': {'name': 'timeslide', 'url': '?view\x3dtimeslide'}, 'isMobile': false, 'title': 'Ken Shirriff\x27s blog', 'description': 'Computer history, restoring vintage computers, IC reverse engineering, and whatever', 'url': 'http://www.righto.com/search?updated-max\x3d2019-09-29T08:30:00-07:00\x26max-results\x3d7\x26reverse-paginate\x3dtrue', 'type': 'feed', 'isSingleItem': false, 'isMultipleItems': true, 'isError': false, 'isPage': false, 'isPost': false, 'isHomepage': false, 'isArchive': false, 'isSearch': true, 'isLabelSearch': false, 'search': {}}}]); _WidgetManager._RegisterWidget('_HeaderView', new _WidgetInfo('Header1', 'header', document.getElementById('Header1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogView', new _WidgetInfo('Blog1', 'main', document.getElementById('Blog1'), {'cmtInteractionsEnabled': false}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML2', 'sidebar-right-1', document.getElementById('HTML2'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_HTMLView', new _WidgetInfo('HTML3', 'sidebar-right-1', document.getElementById('HTML3'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_PopularPostsView', new _WidgetInfo('PopularPosts1', 'sidebar-right-1', document.getElementById('PopularPosts1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogSearchView', new _WidgetInfo('BlogSearch1', 'sidebar-right-1', document.getElementById('BlogSearch1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_LabelView', new _WidgetInfo('Label1', 'sidebar-right-1', document.getElementById('Label1'), {}, 'displayModeFull')); _WidgetManager._RegisterWidget('_BlogArchiveView', new _WidgetInfo('BlogArchive1', 'sidebar-right-1', document.getElementById('BlogArchive1'), {'languageDirection': 'ltr', 'loadingMessage': 'Loading\x26hellip;'}, 'displayModeFull')); _WidgetManager._RegisterWidget('_AttributionView', new _WidgetInfo('Attribution1', 'footer-3', document.getElementById('Attribution1'), {}, 'displayModeFull')); </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10