CINXE.COM
Ken Shirriff's blog: April 2020
<!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='http://www.righto.com/favicon.ico' rel='icon' type='image/x-icon'/> <link href='http://www.righto.com/2020/04/' rel='canonical'/> <link rel="alternate" type="application/atom+xml" title="Ken Shirriff's blog - Atom" href="http://www.righto.com/feeds/posts/default" /> <link rel="alternate" type="application/rss+xml" title="Ken Shirriff's blog - RSS" href="http://www.righto.com/feeds/posts/default?alt=rss" /> <link rel="service.post" type="application/atom+xml" title="Ken Shirriff's blog - Atom" href="https://www.blogger.com/feeds/6264947694886887540/posts/default" /> <!--Can't find substitution for tag [blog.ieCssRetrofitLinks]--> <meta content='http://www.righto.com/2020/04/' property='og:url'/> <meta content='Ken Shirriff'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: April 2020</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&zx=5c17d3ef-c617-4260-b3af-15e58810b101' media='none' onload='if(media!='all')media='all'' rel='stylesheet'/><noscript><link href='https://www.blogger.com/dyn-css/authorization.css?targetBlogID=6264947694886887540&zx=5c17d3ef-c617-4260-b3af-15e58810b101' 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 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='http://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/am2901/die2-w700.jpg' itemprop='image_url'/> <meta content='6264947694886887540' itemprop='blogId'/> <meta content='6705088827005864699' itemprop='postId'/> <a name='6705088827005864699'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='http://www.righto.com/2020/04/inside-am2901-amds-1970s-bit-slice.html'>Inside the Am2901: AMD's 1970s bit-slice processor</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-6705088827005864699' itemprop='description articleBody'> <p><style> .hilite {cursor:zoom-in} </style></p> <p>You're probably familiar with modern processors made by Advanced Micro Devices. But AMD's processors go back to 1975, when AMD introduced the Am2901. This chip was a type of processor called a bit-slice processor: each chip processed just 4 bits, but multiple chips were combined to produce a larger word size. This approach was used in the 1970s and 1980s to create a 16-bit, 36-bit, or 64-bit processor (for example), when the whole processor couldn't fit on a single fast chip.<span id="fnref:mos"><a class="ref" href="#fn:mos">1</a></span></p> <p><a href="http://static.righto.com/images/am2901/die2.jpg"><img alt="Die photo of the Am2901 chip. This image shows the metal layers of the chip; the silicon is underneath. Around the edges of the die, tiny bond wires connect the chip to the external pins. (Click the photo for a high-res image.)" class="hilite" height="736" src="http://static.righto.com/images/am2901/die2-w700.jpg" title="Die photo of the Am2901 chip. This image shows the metal layers of the chip; the silicon is underneath. Around the edges of the die, tiny bond wires connect the chip to the external pins. (Click the photo for a high-res image.)" width="700" /></a><div class="cite">Die photo of the Am2901 chip. This image shows the metal layers of the chip; the silicon is underneath. Around the edges of the die, tiny bond wires connect the chip to the external pins. (Click the photo for a high-res image.)</div></p> <p>The Am2901 chip became very popular, used in <a href="https://en.wikipedia.org/wiki/AMD_Am2900#Computers_made_with_Am2900-family_chips">diverse systems</a> ranging from the <a href="http://files.arcadeinfo.de/Anleitungen%20Spiele%200-9%20A-D/Battlezone%203rd%20printing.pdf">Battlezone</a> video game<span id="fnref:array"><a class="ref" href="#fn:array">2</a></span> to the <a href="https://en.wikipedia.org/wiki/VAX-11#VAX-11/730">VAX-11/730</a> minicomputer, from the Xerox <a href="http://www.bitsavers.org/pdf/xerox/8010_dandelion/schematic/dlionCP.pdf">Star</a> workstation to the F-16 fighter's <a href="http://www.righto.com/2020/03/the-delco-magic-line-of-aerospace.html">Magic 372 computer</a>.<span id="fnref:74181"><a class="ref" href="#fn:74181">3</a></span> The fastest version of this processor, the Am2901C, used a logic family called emitter-coupled logic (ECL) for high performance. In this blog post, I open up an Am2901C chip, examine its die under a microscope, and explain the ECL circuits that made its arithmetic-logic unit work.</p> <h2>The bit-slice processor</h2> <p>You might wonder how multiple processor chips could work together to support arbitrary word lengths. The key is that a bit-slice processor is a building block, rather than a complete processor,<span id="fnref:microprocessor"><a class="ref" href="#fn:microprocessor">6</a></span> and requires separate circuitry to decode instructions and control the system.<span id="fnref:slice"><a class="ref" href="#fn:slice">4</a></span> The bit-slice processor chips performed arithmetic or logic operations on the data and contained registers, while a control chip (such as the Am2910) told the bit-slice chips what to do. Each machine instruction was broken down into smaller steps called micro-instructions which were stored in a microcode ROM. Note that the computer's instruction set was defined by the microcode, not by the Am2901, so almost any instruction set could be supported.<span id="fnref:introduction"><a class="ref" href="#fn:introduction">5</a></span></p> <p>Bit-slice processors fell in between using a microprocessor chip and building a computer out of simple TTL chips. Building a processor out of TTL chips was much faster than a microprocessor at the time, but required boards full of chips. Using a bit-slice processor kept the speed advantage, but reduced the chip count. The bit-slice processor also provided much more flexibility than a microprocessor, allowing the designer to customize the instruction set and other architectural features.</p> <!-- The block diagram below shows the basic architecture of a system built from bit-slice processors. At the top, a "macroinstruction" is a machine instruction to execute. The sequencer steps through the low-level operations to execute this instruction by reading the appropriate micro-instructions from the microprogram memory. The low-level operation is buffered in the pipeline register, where it controls the rest of the system. Among other things, it directs the arithmetic-logic unit (the Am2901 chips) to perform the desired low-level operation. The status codes from this operation are fed to the sequencer, which can execute different micro-instructions depending on the status.  --> <h1>An overview of the die</h1> <p>The photo below shows the Am2901 die, with key functional blocks labeled.<span id="fnref:block-diagram"><a class="ref" href="#fn:block-diagram">7</a></span> For this photo, I removed the metal layers so you can see the silicon and the transistors.<span id="fnref:acid"><a class="ref" href="#fn:acid">8</a></span> The largest functional block of the chip is the register memory in the center. The chip has sixteen 4-bit registers. (If you look closely, you can see 16 columns and 4 rows in the memory array.) To the left and right of the memory block are the memory driver circuits that read and write the memory.</p> <p><a href="http://static.righto.com/images/am2901/die-labeled.jpg"><img alt="Die photo of the Am2901 chip with main functional blocks labeled. The circuitry around the outside largely consists of buffers to convert between the external TTL signals and the internal ECL signals." class="hilite" height="598" src="http://static.righto.com/images/am2901/die-labeled-w700.jpg" title="Die photo of the Am2901 chip with main functional blocks labeled. The circuitry around the outside largely consists of buffers to convert between the external TTL signals and the internal ECL signals." width="700" /></a><div class="cite">Die photo of the Am2901 chip with main functional blocks labeled. The circuitry around the outside largely consists of buffers to convert between the external TTL signals and the internal ECL signals.</div></p> <p>The chip's arithmetic-logic unit (ALU) performs arithmetic operations (addition or subtraction) or logical operations (And, Or, Exclusive-or). The first section of the ALU is a large block in the lower left of the chip; it consists of four rows since it is a 4-bit ALU. The ALU also contains logic to generate the carry outputs for addition, using a fast technique called <a href="https://en.wikipedia.org/wiki/Carry-lookahead_adder">carry lookahead</a>.<span id="fnref:lookahead"><a class="ref" href="#fn:lookahead">9</a></span> Next, the ALU uses the carry values to generate the sum in parallel. Finally, the output circuitry processes and buffers the sum and sends it to the output pin.</p> <p>The empty squares near the edge of the chip are the pads that connect the chip to the outside world. Next to the pads is the circuitry to send and receive signals. In particular, since the chip communicates with external circuits using TTL signals, but uses ECL circuitry inside, this circuitry converts between TTL and ECL voltages.</p> <p>The chip has two shifters that can shift a word one bit to the left or right. The Q register is a 4-bit register built from flip flops. Finally, the reference voltage circuitry generates the precision voltage references required by the ECL logic.</p> <h2>How to see the die</h2> <p>To see what's inside a chip usually requires dissolving the plastic case with dangerous acids. However, I bought an Am2901 chip that came in a ceramic package instead of plastic. By simply tapping the chip's seam with a chisel, I popped the two halves of the chip apart, exposing the die inside. The silicon die is the small square in the center of the chip. Thin bond wires connect the pads on the die to the <a href="https://en.wikipedia.org/wiki/Lead_frame">lead frame</a>, which goes to the 40 external pins of the chip.</p> <p><a href="http://static.righto.com/images/am2901/opened.jpg"><img alt="The Am2901 after separating the two halves of the ceramic package." class="hilite" height="266" src="http://static.righto.com/images/am2901/opened-w400.jpg" title="The Am2901 after separating the two halves of the ceramic package." width="400" /></a><div class="cite">The Am2901 after separating the two halves of the ceramic package.</div></p> <!--  --> <p>I used a special type of microscope called a metallurgical microscope to take high-resolution photographs of the chip. The photograph below shows the AMD logo. Above is a bond wire connected to a pad. The chip has two layers of metal wiring up the circuitry, visible to the right.</p> <p><a href="http://static.righto.com/images/am2901/copyright.jpg"><img alt="A closeup of the die showing "4301X" (presumably an internal part number) and "© 1983 AMD"." class="hilite" height="324" src="http://static.righto.com/images/am2901/copyright-w400.jpg" title="A closeup of the die showing "4301X" (presumably an internal part number) and "© 1983 AMD"." width="400" /></a><div class="cite">A closeup of the die showing "4301X" (presumably an internal part number) and "© 1983 AMD".</div></p> <p>I stitched together multiple microscope photos to create the high-resolution images. I describe my process for creating die photos in more detail <a href="http://www.righto.com/2015/12/creating-high-resolution-integrated.html">here</a>. I then removed the metal layers<span id="fnref2:acid"><a class="ref" href="#fn:acid">8</a></span> and created another set of images of the silicon.</p> <p>The photo below is a closeup of the silicon, showing four transistors and three resistors. Parts of the silicon are "doped" to give them different properties, and the different doping regions are visible under the microscope. This chip is built with bipolar NPN transistors, different from the MOS transistors in modern computers. The transistor on the left has the base (P-type silicon), emitter (N-type silicon), and collector (N-type silicon) labeled. The whiteish rectangles are the contacts between the silicon and the metal layer which was on top before being removed. The two transistors on the right share a single large collector. On this chip, it is common for multiple transistors to share the collector.</p> <p><a href="http://static.righto.com/images/am2901/parts-labeled.jpg"><img alt="A closeup of the die with metal removed, showing transistors and resistors." class="hilite" height="298" src="http://static.righto.com/images/am2901/parts-labeled-w350.jpg" title="A closeup of the die with metal removed, showing transistors and resistors." width="350" /></a><div class="cite">A closeup of the die with metal removed, showing transistors and resistors.</div></p> <p>At the bottom are three resistors. A resistor is produced by doping the silicon to increase its resistance. Resistors on integrated circuits generally have poor accuracy. They are also relatively large; these ones are the same size as transistors, while other resistors are even larger. For these reasons, integrated circuit designs try to minimize the number of resistors.</p> <h2>Emitter-coupled logic</h2> <p>Logic circuits can be built in a wide variety of ways. Almost all computers today use a logic family called CMOS (complementary metal-oxide-semiconductor), building gates out of MOS transistors. In the minicomputer era, TTL (transistor-transistor logic) was very popular. Emitter-coupled logic (ECL) was a faster,<span id="fnref:speed"><a class="ref" href="#fn:speed">10</a></span> but less common logic family. A disadvantage of ECL was its higher power consumption. (Circuitry in the Cray-2 supercomputer (1985) had to be immersed in Fluorinert coolant because the ECL gates gave off so much heat.) <!-- ECL circuits also required more space on an IC. --></p> <p>The first versions of the Am2901 used TTL logic, but in 1979 AMD introduced a faster version, the Am2901C. The Am2901C used ECL logic internally for speed, but supported TTL voltages externally, allowing it to be easily used in TTL computers. The Am2901C, the ECL version, is the one in this blog post.</p> <!-- ECL logic was used in some high-performance computers. Most famously, the Cray-1 supercomputer (1975) used ECL gates, but ECL was also used in Digital Equipment's VAX 8000 and VAX 9000 computers, the Xerox Star (Dorado model), and the IBM Enterprise System/9000. --> <!-- An ECL NOR gate required 5 transistors and 2 resistors, compared to 4 transistors and no resistors for CMOS. The CMOS transistors were simpler and rapidly shrank in size (Moore's law). These factors led to the victory of CMOS integrated circuits in the 1980s, which has continued to the present. --> <!-- [dorado]: Another ECL-based computer that had problems due to ECL's power consumption was the Xerox Dorado. This computer, a high-performance follow-on to the Xerox Alto, required noisy cooling fans for the ECL circuitry. This made it too hot and loud for most offices, requiring Xerox to invent a KVM-like system so the computer could be put in a separate room from the keyboard, display, and mouse. ECL was originally called "current-steering logic", because the principle behind it is to steer a fixed current along one path or another. (In contrast, most logic families switch signals on or off.) --> <p>ECL is based on a differential pair, similar to the circuit inside an op-amp. The idea behind a differential pair (below) is that a fixed current flows through the circuit. If the left input is a higher voltage than the right, the left transistor will turn on and most current will flow through the left branch. Conversely, if the right input is a higher voltage than the left, the right transistor will turn on and most current will flow through the right branch. (Note that the emitters of the transistors are coupled together, thus the name emitter-coupled logic.)</p> <p><a href="http://static.righto.com/images/am2901/ecl-gate1.jpg"><img alt="A differential pair. If the left input (red) is higher, most of the current flows along the left path. Conversely, if the right input (blue) is higher, most of the current flows along the right path." class="hilite" height="233" src="http://static.righto.com/images/am2901/ecl-gate1-w250.jpg" title="A differential pair. If the left input (red) is higher, most of the current flows along the left path. Conversely, if the right input (blue) is higher, most of the current flows along the right path." width="250" /></a><div class="cite">A differential pair. If the left input (red) is higher, most of the current flows along the left path. Conversely, if the right input (blue) is higher, most of the current flows along the right path.</div></p> <p>A few modifications turn the differential pair into an ECL gate. First, the voltage into one branch is fixed at a reference voltage, midway between the "0" level and the "1" level. Thus, if the input is higher than the reference voltage, it will be considered a "1", and lower will be a "0". Next, an output transistor (green) is attached to a branch to produce an output by buffering the branch's voltage. The circuit below is an inverter, since if the input is high, the current through the left resistor will pull the output low. To improve performance, the bottom resistor has been replaced with a current sink (purple), built from a transistor and a resistor.<span id="fnref:sink"><a class="ref" href="#fn:sink">11</a></span></p> <p><a href="http://static.righto.com/images/am2901/ecl-gate2.jpg"><img alt="An ECL inverter. This is based on the differential pair with an output transistor added (green) and the bias resistor replaced with a constant-current circuit (purple). The upper-right resistor can be omitted since no output is connected to it." class="hilite" height="278" src="http://static.righto.com/images/am2901/ecl-gate2-w250.jpg" title="An ECL inverter. This is based on the differential pair with an output transistor added (green) and the bias resistor replaced with a constant-current circuit (purple). The upper-right resistor can be omitted since no output is connected to it." width="250" /></a><div class="cite">An ECL inverter. This is based on the differential pair with an output transistor added (green) and the bias resistor replaced with a constant-current circuit (purple). The upper-right resistor can be omitted since no output is connected to it.</div></p> <p>A more complex ECL gate can be created by adding more inputs. In the circuit below, a second input transistor (2) has been added in parallel with transistor 1. The current will go through the resistor R1 if input A or input B are 1 (i.e. higher than the reference voltage). In this case, the output is pulled low, creating a NOR gate. Other circuit configurations can implement AND gates, XOR gates, or more complex logic circuits.<span id="fnref:wired-or"><a class="ref" href="#fn:wired-or">12</a></span></p> <p><a href="http://static.righto.com/images/am2901/ecl-gate3.jpg"><img alt="An ECL NOR gate as implemented on the chip." class="hilite" height="337" src="http://static.righto.com/images/am2901/ecl-gate3-w300.jpg" title="An ECL NOR gate as implemented on the chip." width="300" /></a><div class="cite">An ECL NOR gate as implemented on the chip.</div></p> <p>The schematic above shows a NOR gate as implemented on the chip. The photos below show the corresponding physical layout of the gate. On the left is the silicon layer of the die, showing the transistors and resistors. The photo on the right shows the metal wiring for the same part of the chip. At the top of the photo, transistors 1 and 2 receive the inputs to the gate. Each transistor has its base at the top and emitter in the middle. The transistors share a collector, the white rectangle below. The resistors R1 and R2 are the indicated rectangles of silicon. The transistors in the middle (including 3 and 4) all share a collector, connected twice to the positive voltage. (The non-numbered transistors and resistors are parts of other gates.)</p> <p><a href="http://static.righto.com/images/am2901/ecl-gate-labeled.jpg"><img alt="A NOR gate as implemented on the Am2901 die." class="hilite" height="429" src="http://static.righto.com/images/am2901/ecl-gate-labeled-w500.jpg" title="A NOR gate as implemented on the Am2901 die." width="500" /></a><div class="cite">A NOR gate as implemented on the Am2901 die.</div></p> <p>Looking at the wiring on the right, the top layer provides horizontal wiring for the positive supply voltage, reference voltages, the current sink voltage V<sub>CS</sub>, and the negative (ground) supply voltage. (Note that the suppy and ground are much wider to support higher current.) Underneath this is the wiring connecting the transistors together. At the top, the inputs A and B are wired to the transistor bases. It's harder to trace out the other wiring as it is obscured by the top layer. But, for instance, you can see the connection between transistor 4, the collector of transistors 1 and 2, and R1. By studying the die photos carefully, one can determine all the wiring and reverse-engineer the chip's logic.</p> <h2>The Arithmetic-Logic Unit (ALU)</h2> <p>The arithmetic-logic unit (ALU) in the Am2901 chip performs 4-bit arithmetic or logical operations. It supports 8 different operations: addition, subtraction, and bitwise logic operations.<span id="fnref:operations"><a class="ref" href="#fn:operations">17</a></span> (Note that it does not perform multiplication or division.)</p> <p>The block diagram below shows the structure of the Am2901's ALU. First, a selector (multiplexer) selects the two inputs to the ALU from the potential sources. "D" is the value fed into the chip's data pins, typically the processor's data bus. (This data first goes through circuitry to convert the external TTL voltage levels used to the ECL voltage levels inside the chip.) "A" is the value of one of the 16 entries in the chip's register file, selected by pins A0-A3, and "B" is similar. The constant value 0 can be fed into the ALU. Finally, "Q" is the contents of the Q register (an extra register, separate from the register file). The multiple data sources give the chip a lot of flexibility.</p> <p><a href="http://static.righto.com/images/am2901/alu-block-diagram.jpg"><img alt="Block diagram of the Am2901 ALU, from the datasheet. The ALU performs one of eight functions on its two 4-bit inputs: R and S. At the right are various outputs from the chip: G, P, carry out, sign, overflow, and zero test." class="hilite" height="241" src="http://static.righto.com/images/am2901/alu-block-diagram-w450.jpg" title="Block diagram of the Am2901 ALU, from the datasheet. The ALU performs one of eight functions on its two 4-bit inputs: R and S. At the right are various outputs from the chip: G, P, carry out, sign, overflow, and zero test." width="450" /></a><div class="cite">Block diagram of the Am2901 ALU, from the <a href="http://www.andysarcade.de/data/electronics/components/2901bc.pdf">datasheet</a>. The ALU performs one of eight functions on its two 4-bit inputs: R and S. At the right are various outputs from the chip: G, P, carry out, sign, overflow, and zero test.</div></p> <p>The two selected values (labeled R and S) are fed into the ALU, which performs the selected operation, yielding the result (F). The ALU also takes a carry-in value and produces a carry-out value (C<sub>N+4</sub>); these allow multiple ALUs to be combined for larger words. The G and P outputs are used for carry lookahead, while the other sign, overflow, and zero outputs can be used as condition codes in a processor.</p> <p>I'll give a brief explanation of the ALU circuitry, starting with the selector. The first two selector boxes below (D and A) select the ALU's first argument, while the last three (A, Q, and B) select the ALU's second argument. Each selector box implements the function <em>Select · (Value ⊕ Invert)</em>, where <em>Value</em> is a potential input value, <em>Select</em> is 1 to select that value, and <em>Invert</em> is 1 to invert the value. (Since the ALU is four bits wide, four bits are selected. Each selector box is implemented with four ECL gates; see the footnote for details.<span id="fnref:xor"><a class="ref" href="#fn:xor">13</a></span>) By enabling one of the <em>Select</em> lines, the desired value is selected. If no <em>Select</em> line is enabled, the value to the ALU is 0.<span id="fnref2:wired-or"><a class="ref" href="#fn:wired-or">12</a></span> Note that the selector can also invert the input; the chip performs subtraction by adding the inverted value.</p> <p><a href="http://static.righto.com/images/am2901/alu-labeled.jpg"><img alt="The first part of the ALU consists of four horizontal layers, one for each bit." class="hilite" height="489" src="http://static.righto.com/images/am2901/alu-labeled-w450.jpg" title="The first part of the ALU consists of four horizontal layers, one for each bit." width="450" /></a><div class="cite">The first part of the ALU consists of four horizontal layers, one for each bit.</div></p> <p>Once the two ALU inputs have been selected, the ALU computes "Propagate" (P) and "Generate" (G) bits for each pair of input bits. This is part of the <a href="https://en.wikipedia.org/wiki/Carry-lookahead_adder">carry lookahead</a>,<span id="fnref2:lookahead"><a class="ref" href="#fn:lookahead">9</a></span> used for high-speed addition.</p> <p>The photo below indicates the remaining parts of the ALU circuitry. (For variety, this die photo shows the metal layer, while the previous showed silicon.) The P and G signals from the previous circuit go to two blocks of carry computation circuitry. The lower carry block computes external P, G, and carry signals that provide carry lookahead across multiple chips; this allows fast addition for larger words.<span id="fnref:recursive"><a class="ref" href="#fn:recursive">14</a></span> The upper carry block computes the carries that are used internally. The "sum" circuitry computes the sum for each bit using the carry, P, and G values. The important thing is that the sum for each bit can be computed in parallel, thanks to the carry lookahead. Finally, the output circuitry converts the internal ECL signals to TTL signals and drives the four output pins.<span id="fnref:output"><a class="ref" href="#fn:output">15</a></span></p> <p><a href="http://static.righto.com/images/am2901/alu-labeled2.jpg"><img alt="The remaining ALU circuitry." class="hilite" height="511" src="http://static.righto.com/images/am2901/alu-labeled2-w500.jpg" title="The remaining ALU circuitry." width="500" /></a><div class="cite">The remaining ALU circuitry.</div></p> <p>The chip uses some interesting techniques to reuse the adder hardware for its eight operations. The selector circuit described earlier can optionally complement its input. This is used for subtraction, as well as for some logic functions. <!-- (The chip's I<sub>3</sub> instruction pin controls complementing of the first argument.) --> To perform logic operations (instead of addition/subtraction), the carry computation is disabled. (For a logic operation, each bit position is unaffected by what happens in other bit positions.) Finally, the adder's EXCLUSIVE OR circuit is turned into AND by forcing the P signals high.<span id="fnref:and"><a class="ref" href="#fn:and">16</a></span> Thus, instead of using eight different circuits for the ALU's eight operations, the chip uses a single circuit with a few carefully-chosen tweaks. <span id="fnref2:operations"><a class="ref" href="#fn:operations">17</a></span></p> <!-- ## The register file Unlike ALU chips such as the popular 74181, the Am2901 includes register storage: 16 4-bit registers. The registers are arranged on the chip as 4 rows of 16 bits. The photo below shows part of the register circuitry with one bit of storage highlighted. Each bit of storage uses two inverters in a loop; this will remain stable with one on and one off. By forcing one inverter on and the other off, a 0 or a 1 can be written.  One feature of the register file is that it is dual-ported: two different words can be read from the register file at the same time. This allows two different words to be fed into the ALU. To implement this, each bit has two vertical metal select lines through it, writing out the selected value to one of two horizontal bit lines. --> <h2>Conclusion</h2> <p>The Am2901C chip is interesting because it is an example of high-speed ECL circuitry, a relatively uncommon logic family. The chip's ALU is spread across the lower half of the chip, implementing eight different functions and using carry lookahead for high performance. Although the chip is complex, it can be reverse-engineered with careful examination under a microscope.</p> <p>Bit-slice processors such as the Am2901 were used in minicomputers and many other systems in the 1970s and 1980s. Eventually, though, improvements in CMOS technology permitted a fast processor to be implemented on a single chip, rendering the bit-slice processor obsolete. While the Am2901 had maybe a thousand transistors and ran at 16MHz, AMD now makes processors that have billions of transistors and run at 4GHz.</p> <p>Follow me <a href="https://twitter.com/kenshirriff">@kenshirriff</a> for more reverse engineering. I also have an <a href="http://www.righto.com/feeds/posts/default">RSS feed</a>.</p> <h2>Notes and References</h2> <div class="footnote"> <ol> <li id="fn:mos"> <p>Microprocessors on a single chip existed at the time, but they used MOS transistors that were slower than the bipolar transistors used in most minicomputers. They also generally had smaller word sizes. Eventually, CMOS processors became faster than bipolar processors; CMOS is what almost all computers now use. <a class="footnote-backref" href="#fnref:mos" title="Jump back to footnote 1 in the text">↩</a></p> </li> <li id="fn:array"> <p>The Atari Battlezone <a href="http://files.arcadeinfo.de/Anleitungen%20Spiele%200-9%20A-D/Battlezone%203rd%20printing.pdf">documentation</a> (p40) doesn't refer to the Am2901 explicitly, but gives it the Atari part number 137004-001 and calls it a "Transistor Array". Moreover, the <a href="http://arcarc.xmission.com/PDF_Arcade_Atari_Kee/Battlezone/Battlezone_Engineering_Schematics.pdf">schematic</a> (p9) obfuscates the Am2901 pinout, showing 20 address pins and 8 data pins, so it looks like a ROM. (In contrast, all the 7400-series chips are described accurately.) Perhaps Atari was attempting to prevent cloning of the video games by hiding the identity of a few key chips. <a class="footnote-backref" href="#fnref:array" title="Jump back to footnote 2 in the text">↩</a></p> </li> <li id="fn:74181"> <p>A popular alternative to the Am2901 in many minicomputers was the <a href="http://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html">74181</a> ALU chip. This provided arithmetic and logic functions, but not the registers of the Am2901. <a class="footnote-backref" href="#fnref:74181" title="Jump back to footnote 3 in the text">↩</a></p> </li> <li id="fn:slice"> <p>Some complications arise in bit-slice processors, since the slices aren't entirely independent. For instance, when adding two numbers, the carry from one slice needs to be passed into the next slice. Operations such as determining the sign of a number or testing if a number is zero, also require the slices to cooperate. The Am2901 has outputs to support these functions. <a class="footnote-backref" href="#fnref:slice" title="Jump back to footnote 4 in the text">↩</a></p> </li> <li id="fn:introduction"> <p>For a detailed discussion of bit-slice processors, see <a href="http://www.bitsavers.org/pdf/amd/ED2900A_vol1_Jan85.pdf">Introduction to designing with the Am2901</a>. <a class="footnote-backref" href="#fnref:introduction" title="Jump back to footnote 5 in the text">↩</a></p> </li> <li id="fn:microprocessor"> <p>Is the Am2901 a microprocessor? In my view, the Am2901 is part of a processor and not a complete microprocessor, but it depends on your definition of a microprocessor. I've written a lot more about these definitions in <a href="https://spectrum.ieee.org/tech-history/silicon-revolution/the-surprising-story-of-the-first-microprocessors">The surprising story of the first microprocessors</a>. Interestingly, the Soviet Union leaned much more towards bit-slice processors (instead of single-chip microprocessors) than the US. While "microprocessor" usually referred to a single-chip processor in the West, bit-slice and single-chip microprocessors weren't really distinguished in the Soviet Union. <!-- "Microcomputing in the Soviet Union and Eastern Europe", Stapleton and Goodman, ABACUS, Fall 1985. page 222 --> (According to "Microcomputing in the Soviet Union and Eastern Europe".) <a class="footnote-backref" href="#fnref:microprocessor" title="Jump back to footnote 6 in the text">↩</a></p> </li> <li id="fn:block-diagram"> <p>A full block diagram of the Am201 is below. (Click this or any other image for a larger version.) Note that the multiplexers above the RAM and the Q register implement a 1-bit left shift or right shift; they are labeled as "shifters" on the die photo. The multiplexers above the ALU in the block diagram are physically part of the ALU circuitry on the die.</p> <p><a href="http://static.righto.com/images/am2901/block-diagram.jpg"><img alt="Block diagram of the Am2901, from the datasheet." class="hilite" height="600" src="http://static.righto.com/images/am2901/block-diagram-w500.jpg" title="Block diagram of the Am2901, from the datasheet." width="500" /></a><div class="cite">Block diagram of the Am2901, from the datasheet.</div></p> <p><!-- --> <a class="footnote-backref" href="#fnref:block-diagram" title="Jump back to footnote 7 in the text">↩</a></p> </li> <li id="fn:acid"> <p>To remove the metal layers from the chip, I alternated applications of <a href="https://amzn.to/2xuSuYO">Armour Etch</a> to remove the silicon dioxide layer and hydrochloric acid (pool acid) to remove metal. <a class="footnote-backref" href="#fnref:acid" title="Jump back to footnote 8 in the text">↩</a><a class="footnote-backref" href="#fnref2:acid" title="Jump back to footnote 8 in the text">↩</a></p> </li> <li id="fn:lookahead"> <p>Carry lookahead uses "Generate" and "Propagate" signals to determine if each bit position will always generate a carry or will propagate an incoming carry. For instance, if you're adding 0+0+C (where C is the carry-in), there's no way to get a carry out from that addition, regardless of what C is. On the other hand, if you're adding 1+1+C, there will always be a carry out generated, regardless of C. Finally, for 0+1+C (or 1+0+C), there will be a carry out propagated if there is a carry in. Putting this all together, for each bit position you create a G (generate) signal if both bits are 1, and a P (propagate) signal unless both bits are 0, using simple logic gates.</p> <p>The formula for computing the carry depends on the bit position. For instance, consider the carry from bit 0 to bit 1. This carry will occur if if P<sub>0</sub> is set (i.e. a carry is generated or propagated) and there is either a carry-in or a generated carry. So C<sub>1</sub> = P<sub>0</sub> AND (C<sub>in</sub> OR G<sub>0</sub>). Higher-order carries have more cases and are progressively more complicated. For example, consider the carry in to bit 2. First, P<sub>1</sub> must be set for a carry out from bit 1. As well, a carry either was generated by bit 1 or propagated from bit 0. Finally, the first carry must have come from somewhere: either carry-in, generated from bit 0 or generated from bit 1. Putting this all together produces the function used by the Am2901: C<sub>2</sub> = P<sub>1</sub> AND (G<sub>1</sub> OR P<sub>0</sub>) AND (C<sub>0</sub> OR G<sub>0</sub> OR G<sub>1</sub>). Formulas for the various carries and external P, G, and carry are given in the <a href="http://www.andysarcade.de/data/electronics/components/2901bc.pdf">datasheet</a>, Figure 9. <a class="footnote-backref" href="#fnref:lookahead" title="Jump back to footnote 9 in the text">↩</a><a class="footnote-backref" href="#fnref2:lookahead" title="Jump back to footnote 9 in the text">↩</a></p> </li> <li id="fn:speed"> <p>ECL gates obtained much of their speed advantage because the transistors were not completely turned on (i.e. saturated). This allowed the transistors to switch the current path rapidly. Additionally, the difference between a "0" voltage and a "1" voltage was small (about 0.8) volts, so signals could switch between the two voltages quickly. In comparison, TTL gates typically had a difference of about 3.2 volts between a "0" and a "1", requiring more time to switch. (Signals could typically switch at about 1 volt per nanosecond, so a larger voltage swing caused nanoseconds of delay.) On the other hand, the small voltage swings of ECL made the circuits more sensitive to electrical noise. <a class="footnote-backref" href="#fnref:speed" title="Jump back to footnote 10 in the text">↩</a></p> </li> <li id="fn:sink"> <p>The current sink at the bottom of the ECL gate provides an essentially-constant current, controlled by the input voltage V<sub>CS</sub>. This is an improvement over a simple resistor, since the current through the resistor varies based on the voltage across it, which depends on the input voltages. The current sink circuit also saves space by using a smaller resistor. <a class="footnote-backref" href="#fnref:sink" title="Jump back to footnote 11 in the text">↩</a></p> </li> <li id="fn:wired-or"> <p>The outputs of the ALU select gates are connected together with a wired-OR. The unselected values output 0, so the value on the wire is the desired one. In this way, the circuit implements a multiplexer with minimal circuit. <a class="footnote-backref" href="#fnref:wired-or" title="Jump back to footnote 12 in the text">↩</a><a class="footnote-backref" href="#fnref2:wired-or" title="Jump back to footnote 12 in the text">↩</a></p> </li> <li id="fn:xor"> <p>The diagram below shows the AND-XOR circuit used in the AM2901 ALU that implements A' · (B ⊕ C). I'll briefly explain its operation. If input A is high, current flows through the leftmost transistors, pulling the output low. If B and C are both high, current through the left B and C transistors pulls the output low. If B and C are both low, current through the Vref transistors pulls the output low. If B and C are different, the current is sourced from on the "+" transistors so the output remains high. The key point is that a single ECL gate can implement a complex function; in contrast, XOR is difficult with most logic families. (I find ECL logic reminiscent of <a href="https://www.righto.com/2016/05/inside-card-sorters-1920s-data.html">1920s-era relay logic</a> because it switches between two paths, rather than switching on or off.)</p> <p><a href="http://static.righto.com/images/am2901/ecl2.png"><img alt="Schematic of an ECL AND-XOR circuit. It is slightly simplified: the input voltage levels for the lower half need to be a diode drop lower than the upper inputs. I'm not sure of the purpose of the horizontal resistor." class="hilite" height="414" src="http://static.righto.com/images/am2901/ecl2-w400.png" title="Schematic of an ECL AND-XOR circuit. It is slightly simplified: the input voltage levels for the lower half need to be a diode drop lower than the upper inputs. I'm not sure of the purpose of the horizontal resistor." width="400" /></a><div class="cite">Schematic of an ECL AND-XOR circuit. It is slightly simplified: the input voltage levels for the lower half need to be a diode drop lower than the upper inputs. I'm not sure of the purpose of the horizontal resistor.</div></p> <p>The only reference I've found for complex ECL circuits is <a href="https://amzn.to/2VaFSim">The VLSI Handbook</a> chapter 38. <a class="footnote-backref" href="#fnref:xor" title="Jump back to footnote 13 in the text">↩</a></p> </li> <li id="fn:recursive"> <p>The carry lookahead techniques can be implemented across multiple chips for fast additions larger than 4 bits. Each chip generates a Generate and Propagate signal, indicating if that chip will generate a carry or propagate a carry-in. These signals are combined by a look-ahead carry generator chip such as the <a href="http://bitsavers.informatik.uni-stuttgart.de/components/amd/Am2900/1979_AMD_2900family.pdf">Am2902 look-ahead carry generator chip</a>. <a class="footnote-backref" href="#fnref:recursive" title="Jump back to footnote 14 in the text">↩</a></p> </li> <li id="fn:output"> <p>The output circuitry also includes multiplexers; the chip can either output the ALU result or the A register value. <a class="footnote-backref" href="#fnref:output" title="Jump back to footnote 15 in the text">↩</a></p> </li> <li id="fn:and"> <p>The chip uses the P and G values to generate the sum of inputs R and S with carry-in C. The sum is <em>(R ⊕ S ⊕ C)'</em>, computed as <em>((P' ∨ G) ⊕ C)'</em>, where <em>P = R∨S</em> and <em>G = R•S</em>. If P is forced to 1, <em>(P' ∨ G)</em> reduces to <em>G</em>, which is <em>R•S</em>. Thus, by changing P, the same circuit can be used to compute the AND of the inputs R and S. <a class="footnote-backref" href="#fnref:and" title="Jump back to footnote 16 in the text">↩</a></p> </li> <li id="fn:operations"> <p><style class="text/css"> table.t2901 {border-collapse: collapse; font-family:monospace;} table.t2901 td.ul {border-bottom: 1px solid #333;} table.t2901 .l {border-left: 1px solid #666; padding-left: 5px;} .ol {text-decoration: overline;} </style></p> <p>The table below shows the eight operations that the ALU can compute. Three of the instruction bits fed into the chip are used to select the operation: I<sub>5</sub>, I<sub>4</sub>, and I<sub>3</sub>. The "Function" column in the table shows the function as documented, while the "Computation" column shows how each bit of the function is computed internally. First, note that the operations all boil down to EXCLUSIVE OR (⊕) or AND (∧). Addition is performed by bitwise EXCLUSIVE OR of the two arguments and the carry bits. Subtraction is performed by complementing an argument and then adding. For example, adding the complement of R (R') is the same as subtracting R. Bit I<sub>3</sub> complements R, while bit I<sub>4</sub> complements S. Note that the EXCLUSIVE OR operations (EXOR and EXNOR) use the same circuitry as addition, but carry computation is blocked. The AND operation is performed by blocking the G signal. Finally, OR is computed using <a href="https://en.wikipedia.org/wiki/De_Morgan%27s_laws">De Morgan's law</a>, which shows that R' ∧ S' = (R ∨ S)'. The point of this is that the Am2901 doesn't need separate circuitry for addition, subtraction, AND, OR, and EXCLUSIVE OR, but reuses most of the circuitry.</p> <p><table class="t2901 t2901example"> <tr style="border-bottom: 1px solid #333"><th>Mnemonic</th><th class="l">I<sub>5</sub></th><th>I<sub>4</sub></th><th>I<sub>3</sub></th><th class="l">Function</th><th class="l">Computation</th></tr> <tr><td>ADD</td><td class='l'>0</td><td>0</td><td>0</td><td class="l">R Plus S</td><td class="l">R ⊕ S ⊕ Carry</td></tr> <tr><td>SUBR</td><td class='l'>0</td><td>0</td><td>1</td><td class="l">S Minus R</td><td class="l">R' ⊕ S ⊕ Carry</td></tr> <tr><td>SUBS</td><td class='l'>0</td><td>1</td><td>0</td><td class="l">R Minus S</td><td class="l">R ⊕ S' ⊕ Carry</td></tr> <tr><td>OR</td><td class='l'>0</td><td>1</td><td>1</td><td class="l">R OR S</td><td class="l">(R' ∧ S') ⊕ 1</td></tr> <tr><td>AND</td><td class='l'>1</td><td>0</td><td>0</td><td class="l">R AND S</td><td class="l">R ∧ S</td></tr> <tr><td>NOTRS</td><td class='l'>1</td><td>0</td><td>1</td><td class="l">R' AND S</td><td class="l">R' ∧ S</td></tr> <tr><td>EXOR</td><td class='l'>1</td><td>1</td><td>0</td><td class="l">R EX OR S</td><td class="l">R ⊕ S' ⊕ 1</td></tr> <tr><td>EXNOR</td><td class='l'>1</td><td>1</td><td>1</td><td class="l">R EX NOR S</td><td class="l">R' ⊕ S' ⊕ 1</td></tr> </table> <a class="footnote-backref" href="#fnref:operations" title="Jump back to footnote 17 in the text">↩</a><a class="footnote-backref" href="#fnref2:operations" title="Jump back to footnote 17 in the text">↩</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/6705088827005864699' onclick=''> 26 comments: </a> </span> <span class='post-icons'> <span class='item-action'> <a href='https://www.blogger.com/email-post/6264947694886887540/6705088827005864699' 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=6705088827005864699&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=6705088827005864699&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=6705088827005864699&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=6705088827005864699&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=6705088827005864699&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=6705088827005864699&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='http://www.righto.com/search/label/chips' rel='tag'>chips</a>, <a href='http://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/lvda/board-photo-w450.jpg' itemprop='image_url'/> <meta content='6264947694886887540' itemprop='blogId'/> <meta content='6559577386004667938' itemprop='postId'/> <a name='6559577386004667938'></a> <h3 class='post-title entry-title' itemprop='name'> <a href='http://www.righto.com/2020/04/a-circuit-board-from-saturn-v-rocket.html'>A circuit board from the Saturn V rocket, reverse-engineered and explained</a> </h3> <div class='post-header'> <div class='post-header-line-1'></div> </div> <div class='post-body entry-content' id='post-body-6559577386004667938' itemprop='description articleBody'> <style> .hilite {cursor:zoom-in} </style> <p>In the Apollo Moon missions, the Saturn V rocket was guided by an advanced onboard computer system built by IBM. This system was built from hybrid modules, similar to integrated circuits but containing individual components. I reverse-engineered a circuit board from this system and determined its function: Inside the computer's I/O unit, the board selected different data sources for the computer.</p> <p><a href="http://static.righto.com/images/lvda/board-photo.jpg"><img alt="A circuit board from the Saturn V LVDA. (Click this image (or any others) for a larger version.) This board was partially disassembled when I received it and some chips are missing." class="hilite" height="388" src="http://static.righto.com/images/lvda/board-photo-w450.jpg" title="A circuit board from the Saturn V LVDA. (Click this image (or any others) for a larger version.) This board was partially disassembled when I received it and some chips are missing." width="450" /></a><div class="cite">A circuit board from the Saturn V LVDA. (Click this image (or any others) for a larger version.) This board was partially disassembled when I received it and some chips are missing.</div></p> <p>This post explains how the board worked, from the tiny silicon dies inside its hybrid modules to the board's circuitry and its wiring in the rocket. This board was first studied by Fran Blanch in <a href="http://www.frantone.com/designwritings/design_writings_LVDC.html">The Apollo Saturn V LVDC Project</a>. Then <a href="https://youtu.be/U-3_2UtTMtA">EEVblog</a> made a video about it. Now it's my turn to analyze the board.</p> <h2>The Launch Vehicle Digital Computer (LVDC) and Launch Vehicle Data Adapter (LVDA)</h2> <p>The race to the Moon started on May 25, 1961, when President Kennedy stated that America would land a man on the Moon before the end of the decade. This mission required the three-stage Saturn V rocket, the most powerful rocket ever built. The Saturn V was guided and controlled by the Launch Vehicle Digital Computer (below), from liftoff into Earth orbit, and then on a trajectory towards the Moon.<span id="fnref:computers"><a class="ref" href="#fn:computers">1</a></span> In an era when most computers ranged from refrigerator-sized to room-filling, the LVDC was very compact and weighed just 80 pounds since it was mounted inside the rocket. The downside was that it was very slow, performing 12,000 instructions a second. <!-- It was slow partly because it was a "serial" computer, operating on one bit at a time. It had a 26-bit word made up of two 13-bit "syllables", so every operation took 26 steps. --></p> <p><a href="http://static.righto.com/images/lvda/vintage-lvdc.jpg"><img alt="The LVDC mounted in a support frame for testing. Behind the operator is a test system called ACME (Aerospace Computer Manual Exerciser). The ACME paper tape reader is visible at the back. Photo from IBM." class="hilite" height="374" src="http://static.righto.com/images/lvda/vintage-lvdc-w400.jpg" title="The LVDC mounted in a support frame for testing. Behind the operator is a test system called ACME (Aerospace Computer Manual Exerciser). The ACME paper tape reader is visible at the back. Photo from IBM." width="400" /></a><div class="cite">The LVDC mounted in a support frame for testing. Behind the operator is a test system called ACME (Aerospace Computer Manual Exerciser). The ACME paper tape reader is visible at the back. Photo from <a href="https://www.zdnet.com/pictures/ibm-and-univac-in-the-apollo-program/5/">IBM</a>.</div></p> <p>The LVDC worked in conjunction with the Launch Vehicle Data Adapter (LVDA, below), which provided the input/output functions for the computer. All communication between the computer and the rocket went through the LVDA, which converted the rocket's analog signals and 28-volt control signals to the serial binary data the computer required. The LVDA contained buffers (implemented with glass delay lines) and control registers for its various functions. The LVDA had analog-to-digital converters to read data from the inertial measurement unit's gyroscopes and digital-to-analog converters to provide control signals to the rockets. It also processed telemetry signals that were sent to the ground and received ground-based commands for the computer. Finally, power to the LVDC was provided by redundant switching power supplies in the LVDA.</p> <p><a href="http://static.righto.com/images/lvda/lvda-photo.jpg"><img alt="The Saturn V LVDA was a 176-pound box that provided I/O for the LVDA. It had 21 round connectors for cables to other parts of the rocket. From System Description and Component Data." class="hilite" height="392" src="http://static.righto.com/images/lvda/lvda-photo-w500.jpg" title="The Saturn V LVDA was a 176-pound box that provided I/O for the LVDA. It had 21 round connectors for cables to other parts of the rocket. From System Description and Component Data." width="500" /></a><div class="cite">The Saturn V LVDA was a 176-pound box that provided I/O for the LVDA. It had 21 round connectors for cables to other parts of the rocket. From <a href="https://www.ibiblio.org/apollo/Documents/MSFC-III-5-509-4-Saturn1BVInstrumentUnitSystemDescriptionAndComponentData.pdf">System Description and Component Data</a>.</div></p> <p>Because the LVDA had so many different functions, it was almost twice the size of the LVDC computer. The diagram below shows the circuitry crammed into the 176-pound LVDA.<span id="fnref:block"><a class="ref" href="#fn:block">2</a></span> It had two sections filled with circuit boards called "pages": the front logic section and the back logic section. (The board I examined was from the front logic section.) The power supplies and filters were in the central section. A methanol coolant solution flowed through channels in the LVDA to keep it cool. The LVDA was wired to the LVDC and other parts of the rocket through the 21 round connectors on the ends.</p> <p><a href="http://static.righto.com/images/lvda/p246d.jpg"><img alt="Exploded diagram of the LVDA, from NASA." class="hilite" height="452" src="http://static.righto.com/images/lvda/p246d-w600.jpg" title="Exploded diagram of the LVDA, from NASA." width="600" /></a><div class="cite">Exploded diagram of the LVDA, from <a href="https://history.nasa.gov/SP-4206/p246d.htm">NASA</a>.</div></p> <!-- --> <!-- Front defined on p1-2 of Saturn V LVDC Vol1 --> <!-- The diagram below summarizes the many different inputs and outputs of the LVDA. The key point is the five different categories: discrete inputs and outputs (i.e. binary signal lines), analog inputs and outputs, power supplies, telemetry, and internal delay-line storage.   --> <h2>Diode-Transistor Logic</h2> <p>There are many different ways to build logic gates. The LVDC and LVDA used a technique called Diode-Transistor Logic (DTL) that builds a gate from diodes and a transistor. This was more advanced than the Resistor-Transistor Logic (RTL) used by the Apollo Guidance Computer, but inferior to Transistor-Transistor Logic (TTL), which became very popular in the 1970s.</p> <p>The standard logic gate in the LVDC was an AND-OR-INVERT gate<span id="fnref:tube"><a class="ref" href="#fn:tube">3</a></span> that implements a logic function such as (A·B + C·D)'. It gets its name because it ANDs together sets of inputs, ORs them, and finally inverts the results. The AND-OR-INVERT gate was powerful because it could be built with many inputs, e.g. (A·B + C·D·E + F·G·H)'. While the AND-OR-INVERT gate may seem complex, it only required one transistor which was important in an era when every transistor counted.</p> <p>If you want to understand how the gate works internally, look at the diagram below. It shows a four-input AND-OR-INVERT gate with two AND terms. First consider inputs A and B, which are both set to 1 (high). The pull-up resistor<span id="fnref:clock"><a class="ref" href="#fn:clock">4</a></span> pulls the AND value high (red, 1). In comparison, in the lower AND gate, input C is 0, so current flows through input C, pulling the AND value low (blue, 0). Thus, the diodes and the pull-up resistor implement an AND gate. Next, look at the OR stage. Current from the top AND (red) pulls the OR stage high (1). Finally, this current turns the transistor on, pulling the output low (blue, 0) and providing the inversion. If both AND stages were 0, the OR stage wouldn't be pulled high. Instead, the pull-down resistor would pull the OR value low (0), turning off the transistor and causing the output to be pulled high (1).</p> <p><a href="http://static.righto.com/images/lvda/and-or-invert.jpg"><img alt="An AND-OR-INVERT gate computing (A·B + C·D)'. Since inputs A and B are both high, the output is pulled low." class="hilite" height="360" src="http://static.righto.com/images/lvda/and-or-invert-w400.jpg" title="An AND-OR-INVERT gate computing (A·B + C·D)'. Since inputs A and B are both high, the output is pulled low." width="400" /></a><div class="cite">An AND-OR-INVERT gate computing (A·B + C·D)'. Since inputs A and B are both high, the output is pulled low.</div></p> <!-- The diagram below shows how the gate's behavior changes if inputs A and B are 0. Now the upper AND gate's output is low (0), so the OR gate's output is also low (0). The inverter's transistor is off, so the pull-up resistor pulls the output high (1).  --> <p>An AND-OR-INVERT gate could be built with more resistors or diodes to provide as many inputs as required, potentially many inputs to each AND, and many blocks ORed together. You might expect that AND-OR-INVERT gate would be implemented on a single chip, but the LVDC used multiple chips for each gate, as will be shown below. Different chips had various combinations of diodes, resistors, and transistors that were wired up in flexible ways to form the desired logic gate.</p> <h2>Unit Logic Devices (ULD)</h2> <p>The LVDC and LVDA were built with an interesting hybrid technology called ULD (Unit Logic Devices).<span id="fnref:braun"><a class="ref" href="#fn:braun">5</a></span> Although they superficially resembled integrated circuits, ULD modules contained multiple components. They used simple silicon dies, each implementing just one transistor or two diodes. These dies, along with thick-film printed resistors, were mounted on a .3-inch-square ceramic wafer. These modules were a variant of the SLT (Solid Logic Technology) modules used in IBM's popular S/360 series of computers. IBM started developing SLT modules in 1961, before integrated circuits were commercially viable, and by 1966 IBM produced over 100 million SLT modules a year. <!-- page 103 --></p> <p>ULD modules were considerably smaller than SLT modules, as shown in the photo below, making them more suitable for a compact space computer. ULD modules used flat-pack ceramic packages instead of SLT's metal cans, and had metal contacts on the upper surface instead of pins. Clips on the circuit board held the ULD module in place and connected with these contacts. The LVDC and LVDA used more than 50 different types of ULDs. <!-- Fact sheet https://www.ibiblio.org/apollo/Documents/UAH-19660601-FactSheetIBMComputerWillDirectSaturnOrbitalTestFlight.pdf --></p> <p><a href="http://static.righto.com/images/lvda/slt-comparison.jpg"><img alt="ULD modules (right) are smaller than SLT modules or more modern DIP integrated circuits (left). An SLT module was about 0.5" on a side, while a ULD module was 0.3" on a side and much thinner." class="hilite" height="225" src="http://static.righto.com/images/lvda/slt-comparison-w500.jpg" title="ULD modules (right) are smaller than SLT modules or more modern DIP integrated circuits (left). An SLT module was about 0.5" on a side, while a ULD module was 0.3" on a side and much thinner." width="500" /></a><div class="cite">ULD modules (right) are smaller than SLT modules or more modern DIP integrated circuits (left). An SLT module was about 0.5" on a side, while a ULD module was 0.3" on a side and much thinner.</div></p> <p>Internally, a ULD module contained up to four tiny square silicon dies. Each die implemented either two diodes or one transistor. The photo below shows the internal components of a ULD module, next to an intact ULD module. On the left, the circuit traces are visible on the ceramic wafer, connected to four tiny square silicon dies. While this looks like a printed circuit board, keep in mind that it is much smaller than a fingernail. Thick-film resistors were printed on the underside of the module, so they are not visible.</p> <p><a href="http://static.righto.com/images/lvda/uld-inv.jpg"><img alt="A ULD of type "INV" opened to show the four silicon dies inside. The upper-right die is a transistor, while the other three dies are dual diodes. The module was protected by pink silicone, which has been removed to show the circuitry. Photo courtesy of Fran Blanche." class="hilite" height="197" src="http://static.righto.com/images/lvda/uld-inv-w400.jpg" title="A ULD of type "INV" opened to show the four silicon dies inside. The upper-right die is a transistor, while the other three dies are dual diodes. The module was protected by pink silicone, which has been removed to show the circuitry. Photo courtesy of Fran Blanche." width="400" /></a><div class="cite">A ULD of type "INV" opened to show the four silicon dies inside. The upper-right die is a transistor, while the other three dies are dual diodes. The module was protected by pink silicone, which has been removed to show the circuitry. Photo courtesy of <a href="http://www.frantone.com/designwritings/design_writings_LVDC.html">Fran Blanche</a>.</div></p> <p>The microscope photo below shows a silicon die from a ULD module that implements two diodes. The die is very small; for comparison, grains of sugar are displayed next to the die. The die had three external connections through copper balls soldered to the three circles. The two lower circles were doped (darker regions) to form the anodes of the two diodes, while the upper circle was the cathode, connected to the substrate. Note that this die is much less complex than even a basic integrated circuit.</p> <p><a href="http://static.righto.com/images/lvda/die-composite.jpg"><img alt="Photo of a two-diode silicon die next to sugar crystals. This photo is a composite of top-lighting to show the die details, with back-lighting to show the sugar." class="hilite" height="208" src="http://static.righto.com/images/lvda/die-composite-w250.jpg" title="Photo of a two-diode silicon die next to sugar crystals. This photo is a composite of top-lighting to show the die details, with back-lighting to show the sugar." width="250" /></a><div class="cite">Photo of a two-diode silicon die next to sugar crystals. This photo is a composite of top-lighting to show the die details, with back-lighting to show the sugar.</div></p> <p>The schematic below shows the circuitry inside the "INV" module shown earlier.<span id="fnref:pinout"><a class="ref" href="#fn:pinout">7</a></span> The left side forms an AND-OR-INVERT gate with a single input. A gate with a single input may seem pointless, but additional AND inputs can be attached to pin 1 and additional OR gates can be attached to pin 3. The right side of the schematic provides components that can be used as additional inputs.</p> <p><a href="http://static.righto.com/images/lvda/inv-schematic.jpg"><img alt="Schematic of the "INV" inverter module. Based on Saturn V Guidance Computer, Semiannual Progress Report, page 2-37. Pins 7 and 14 switched from original, which didn't match the actual circuitry." class="hilite" height="301" src="http://static.righto.com/images/lvda/inv-schematic-w500.jpg" title="Schematic of the "INV" inverter module. Based on Saturn V Guidance Computer, Semiannual Progress Report, page 2-37. Pins 7 and 14 switched from original, which didn't match the actual circuitry." width="500" /></a><div class="cite">Schematic of the "INV" inverter module. Based on <a href="https://www.ibiblio.org/apollo/Documents/IBM-63-928-137-SaturnVGuidanceComputer-SemiannualProgressReport.pdf"> Saturn V Guidance Computer, Semiannual Progress Report</a>, page 2-37. Pins 7 and 14 switched from original, which didn't match the actual circuitry.</div></p> <p>The board also uses AND gate modules (types "AA" and "AB"), shown below. Keep in mind that these aren't independent gates, but components that can be wired to an INV chip to provide more AND or OR inputs.<span id="fnref:liminal"><a class="ref" href="#fn:liminal">6</a></span> These modules can be wired up in many flexible ways; there are no specific inputs and outputs. One common configuration is to use half of an AA chip as a three-input AND gate. Part of an AB chip can provide two more inputs if needed.</p> <p><a href="http://static.righto.com/images/lvda/and-gates.jpg"><img alt="Internal schematics of the type "AA" and type "AB" AND gates. From Laboratory Maintenance Instructions for LVDA, Vol 1." class="hilite" height="218" src="http://static.righto.com/images/lvda/and-gates-w600.jpg" title="Internal schematics of the type "AA" and type "AB" AND gates. From Laboratory Maintenance Instructions for LVDA, Vol 1." width="600" /></a><div class="cite">Internal schematics of the type "AA" and type "AB" AND gates. From <a href="https://www.ibiblio.org/apollo/Documents/19730064316_1973064316.pdf">Laboratory Maintenance Instructions for LVDA, Vol 1</a>.</div></p> <p>The photo below shows the semiconductors (dual diodes) inside an AA gate. You can match up the components with the schematic above if you wish; pins 1 and 5, the common pins, are most interesting. Note that the pin numbering does not match the standard IC scheme.</p> <p><a href="http://static.righto.com/images/lvda/uld-aa.jpg"><img alt="A ULD of type "AA" opened to show the four silicon dies inside. The four dies are dual diodes with the cathodes connected. Original photo courtesy of Fran Blanche." class="hilite" height="274" src="http://static.righto.com/images/lvda/uld-aa-w250.jpg" title="A ULD of type "AA" opened to show the four silicon dies inside. The four dies are dual diodes with the cathodes connected. Original photo courtesy of Fran Blanche." width="250" /></a><div class="cite">A ULD of type "AA" opened to show the four silicon dies inside. The four dies are dual diodes with the cathodes connected. Original photo courtesy of <a href="http://www.frantone.com/designwritings/design_writings_LVDC.html">Fran Blanche</a>.</div></p> <h2>The board's circuitry</h2> <p>To determine what the board did, I tediously beeped out the connections between chips with a multimeter to create wiring diagrams. (Shortly after I finished, LVDA manuals with schematics turned up<span id="fnref:documentation"><a class="ref" href="#fn:documentation">8</a></span> making my reverse-engineering effort unnecessary.) The board forms a 7-input multiplexer, selecting one of 7 input lines and storing the value in a latch. With 1960s technology, this simple function required a whole board of chips.</p> <p>The schematic below is a simplified diagram of the board. At the left, the board receives 7 inputs; six of them are 28-volt signals that need to be buffered to generate logic signals, while the seventh is already a 6-volt logic signal. One of the seven select lines is energized to select the corresponding input, which is then stored in the latch.<span id="fnref:latch"><a class="ref" href="#fn:latch">9</a></span> (The main simplification is that there are multiple select lines for each input. The full schematic is in the footnotes.<span id="fnref:board"><a class="ref" href="#fn:board">10</a></span>) When the "reset multiplexer" signal and the "multiplexer address" are energized, the latch is reset.</p> <p><a href="http://static.righto.com/images/lvda/simplified-schematic.jpg"><img alt="Simplified schematic of the board. It is a multiplexer that selects one of the six inputs and stores the value in the latch." class="hilite" height="306" src="http://static.righto.com/images/lvda/simplified-schematic-w600.jpg" title="Simplified schematic of the board. It is a multiplexer that selects one of the six inputs and stores the value in the latch." width="600" /></a><div class="cite">Simplified schematic of the board. It is a multiplexer that selects one of the six inputs and stores the value in the latch.</div></p> <p>While the schematic shows many logic gates, it is implemented with just two AND-OR-INVERT gates. The yellow gates form one large AND-OR-INVERT gate, while the blue gates form a second. (The two yellow OR gates merge into one.) The two gates are implemented across eight chips: two chips of type INV, four AA, and two AB. This illustrates the flexibility and expandability of the AND-OR-INVERT logic model, but it also shows that circuits use many chips. Note that there are only two transistors in the logic circuit (one in each INV chip); almost all of the logic is implemented with diodes.</p> <h2>The buffer circuitry</h2> <p>Of the 26 chips on the board, 18 of them were analog chips that buffered and processed the input signals. The inputs were 28-volt signals, while the logic requires 6-volt signals. Each input (except #7) passes through a "Discrete Interface Circuit" that converts the input to a logic signal. The diagram below shows the circuit, built from chips of types 321, 322, and 323.<span id="fnref:part"><a class="ref" href="#fn:part">11</a></span> The photos show the contents of each chip. Since the 321 chip only consists of resistors (on the underside), the chip appears empty from the top. The 322 chip contains a single diode, while the 323 chip contains two transistors. (The dies are missing from the 323 photo; they are small squares as in the 322.)</p> <p><a href="http://static.righto.com/images/lvda/dia-fig.jpg"><img alt="Discrete Input Circuit, type A (DIA). The published "322" pinout is wrong, showing two pins 5. From Laboratory Maintenance Instructions for LVDA, Vol 1, Figure A-15. 321 and 322 photos courtesy of Fran Blanche." class="hilite" height="447" src="http://static.righto.com/images/lvda/dia-fig-w500.jpg" title="Discrete Input Circuit, type A (DIA). The published "322" pinout is wrong, showing two pins 5. From Laboratory Maintenance Instructions for LVDA, Vol 1, Figure A-15. 321 and 322 photos courtesy of Fran Blanche." width="500" /></a><div class="cite">Discrete Input Circuit, type A (DIA). The published "322" pinout is wrong, showing two pins 5. From <a href="https://www.ibiblio.org/apollo/Documents/19730064316_1973064316.pdf">Laboratory Maintenance Instructions for LVDA, Vol 1</a>, Figure A-15. 321 and 322 photos courtesy of <a href="http://www.frantone.com/designwritings/design_writings_LVDC.html">Fran Blanche</a>.</div></p> <p>The diagram below summarizes the structure of the board. The eight logic chips in the middle are outlined in green. Each of the six input buffers consists of three chips (321, 322, and 323). The signal flow through these chips is shown with the blue arrows. The board has 35 spots for chips, of which 26 were used. By putting chips in the empty locations, the same circuit board could be reused for slightly different functions.<span id="fnref:unused"><a class="ref" href="#fn:unused">13</a></span></p> <p><a href="http://static.righto.com/images/lvda/board-labeled.jpg"><img alt="The circuit board with input paths in blue and logic circuitry in green. Original photo courtesy of Fran Blanche." class="hilite" height="479" src="http://static.righto.com/images/lvda/board-labeled-w500.jpg" title="The circuit board with input paths in blue and logic circuitry in green. Original photo courtesy of Fran Blanche." width="500" /></a><div class="cite">The circuit board with input paths in blue and logic circuitry in green. Original photo courtesy of <a href="http://www.frantone.com/designwritings/design_writings_LVDC.html">Fran Blanche</a>.</div></p> <h2>The board's role in the LVDA</h2> <p>This board was part of the multiplexer in an LVDA subsystem called the "System Data Sampler" that selects signals and sends them either to the computer or to the ground for telemetry. The System Data Sampler consists of a multiplexer that selects one of eight signals, and the Serializer-Selector that converts the 14-bit data to serial form. The multiplexer has several data sources: the RCA-110 ground computer that was connected to the rocket before launch;<span id="fnref:rca"><a class="ref" href="#fn:rca">14</a></span> the "command receiver" that received computer commands from the ground after the rocket had launched; the "control distributor" box that provided various discrete signals;<span id="fnref:discretes"><a class="ref" href="#fn:discretes">12</a></span> "spare discrete inputs"; feedback from the "switch selector", a relay box that the computer used to control the rocket; telemetry from the Digital Data Acquisition System (DDAS); and real-time data.</p> <p>Physically, many of these data sources were large boxes in the Instrument Unit. For instance, the "control distributor" was a 35-pound box next to the LVDA, connected by a thick cable. The LVDA's "command receiver" input came from the "command decoder", a 7.5-pound box connected to other boxes that provided radio input and output. Because the LVDA was cabled to many different devices in the Instrumentation Unit, it required 21 connectors.</p> <p><a href="http://static.righto.com/images/lvda/flight-manual-diagram.jpg"><img alt="The locations of the LVDA, LVDC, Command Decoder, and Control Distributor in the Instrument Unit. Also shows the electronic assembly (ST-124-M3) that interfaces the inertial measurement unit to the LVDA. From the Saturn V Flight Manual page 7-8." class="hilite" height="359" src="http://static.righto.com/images/lvda/flight-manual-diagram-w600.jpg" title="The locations of the LVDA, LVDC, Command Decoder, and Control Distributor in the Instrument Unit. Also shows the electronic assembly (ST-124-M3) that interfaces the inertial measurement unit to the LVDA. From the Saturn V Flight Manual page 7-8." width="600" /></a><div class="cite">The locations of the LVDA, LVDC, Command Decoder, and Control Distributor in the Instrument Unit. Also shows the electronic assembly (ST-124-M3) that interfaces the inertial measurement unit to the LVDA. From the <a href="https://www.ibiblio.org/apollo/Documents/MSFC-MAN-507-SaturnVFlightManual-SA507.pdf">Saturn V Flight Manual</a> page 7-8.</div></p> <h2>The board's physical structure</h2> <p>The circuit boards in the LVDA and LVDC used interesting construction techniques to withstand the high accelerations and vibrations of the rocket and to keep the circuitry cool. The board I examined was damaged and missing its mounting frame but the photo below shows an intact unit called a "page". The page's frame is made from a magnesium-lithium alloy that combines light weight, strength, and good heat transfer properties. Heat from a board flowed through the frame to the LVDA or LVDC's chassis, which was liquid-cooled via methanol flowing through channels drilled in the chassis.</p> <p><a href="http://static.righto.com/images/lvda/P9280515.jpg"><img alt="A page including the metal frame. This board implemented voting circuitry in the LDVC. Photo from Dmitris Vitoris via Virtual AGC." class="hilite" height="405" src="http://static.righto.com/images/lvda/P9280515-w500.jpg" title="A page including the metal frame. This board implemented voting circuitry in the LDVC. Photo from Dmitris Vitoris via Virtual AGC." width="500" /></a><div class="cite">A page including the metal frame. This board implemented voting circuitry in the LDVC. Photo from Dmitris Vitoris via <a href="https://www.ibiblio.org/apollo/LVDC.html">Virtual AGC</a>.</div></p> <p>Each page could hold two circuit boards, one on the front and one on the back. The printed circuit board has 12 layers, which is a remarkably high number for the 1960s. (Even in the 1970s, commercial PCBs typically had just two layers.) The page has a 98-pin connector, with 49 connections to each PCB. The two boards were connected by 30 "thru pins" at the top of the board. The top of each board also has 18 test connections; these allowed signals to be probed while the boards were installed. (IBM reused this page construction in its System/4 Pi aerospace computers.<span id="fnref:4pi"><a class="ref" href="#fn:4pi">15</a></span>)</p> <!-- 12 pins and logic properties of and or invert described in page 50 of Semiannual Progress Report. --> <p>The board I examined had been forcibly separated from the other board in the page. The photo below shows the back of the board. The thru-pins are visible at the top; they would have been connected to the other board. At the bottom, the 49 connections from the connector to the missing board are visible. Some of the board's insulation has been removed, showing the 12 vias at each ULD module position. These provide a connection from a chip pin to any of the 12 layers of the circuit board.</p> <p><a href="http://static.righto.com/images/lvda/board-back.jpg"><img alt="Back of the LVDA board. A second board was mounted on this side originally, but has been removed." class="hilite" height="315" src="http://static.righto.com/images/lvda/board-back-w500.jpg" title="Back of the LVDA board. A second board was mounted on this side originally, but has been removed." width="500" /></a><div class="cite">Back of the LVDA board. A second board was mounted on this side originally, but has been removed.</div></p> <h2>Conclusion</h2> <p>This small circuit board illustrates several stories about computing in the 1960s.</p> <p>The board used hybrid modules rather than still-new integrated circuits. While this technology may seem backward, it was a key to IBM's success with the IBM System/360 line. Introduced almost exactly 56 years ago (April 7, 1964), these computers used hybrid SLT modules with AND-OR-INVERT logic. These computers dominated the market for years, and the System/360 architecture is still supported by IBM's mainframes.</p> <p>The LVDC and LVDA also led to IBM's System/4 Pi line of aerospace computers, announced in 1967. These computers used the same "page" design and connectors as this board, even though they abandoned ULD modules for flat-pack TTL integrated circuits. The System/4 Pi line of computers evolved into the AP-101S computers used on the Space Shuttle.</p> <!-- The board shows the important role of the usually-ignored LVDA in the race to the Moon. Although the LVDC guided the rocket, it needed the LVDA to communicate with the rocket's components. This specific board funneled multiple data sources into the computer including ground control messages. Even a small board like this had a distinct, critical role in the flight to the Moon. --> <p>Finally, the board shows the remarkable improvements in technology since the 1960s. Each ULD module contained up to 4 transistors, so even a basic circuit like a multiplexer took a whole board of modules. Now, an iPhone processor <!-- A13 --> has over 8 billion transistors. It's amazing that such simple technology was enough to get to the Moon.</p> <p>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="http://www.righto.com/feeds/posts/default">RSS feed</a>. This work builds on Fran Blanche's <a href="http://www.frantone.com/designwritings/design_writings_LVDC.html">Apollo Saturn V LVDC Project</a>. Thanks to Fran for providing photos, Ben Krasnow for passing the board along to me, and Mike Stewart for documentation. For more information on the LVDC, see the Virtual AGC project's <a href="https://www.ibiblio.org/apollo/LVDC.html">LVDC page</a>. I recently wrote about the <a href="http://www.righto.com/2020/03/the-core-memory-inside-saturn-v-rockets.html">core memory stack</a> in the Saturn V LVDC.</p> <h2>Notes and references</h2> <div class="footnote"> <ol> <li id="fn:computers"> <p>The LVDC was one of several computers onboard the Apollo mission. The better-known <a href="http://www.righto.com/2019/09/a-computer-built-from-nor-gates-inside.html">Apollo Guidance Computer</a> (AGC) guided the spacecraft to the Moon's surface. (I recently helped restore an Apollo Guidance Computer to <a href="http://www.righto.com/2019/07/bitcoin-mining-on-apollo-guidance.html">running condition</a>.) The Command Module had an AGC while the Lunar Module had a second AGC. The Lunar Module also contained the backup Abort Guidance System computer. The LVDC/LVDA was connected to the Flight Control Computer, a 100-pound analog computer mounted in the Instrument Unit.</p> <p><a href="http://static.righto.com/images/lvda/saturn-v-labeled.jpg"><img alt="Multiple computers were onboard an Apollo mission. The Launch Vehicle Data Adapter (LVDA) is discussed in this blog post." class="hilite" height="363" src="http://static.righto.com/images/lvda/saturn-v-labeled-w650.jpg" title="Multiple computers were onboard an Apollo mission. The Launch Vehicle Data Adapter (LVDA) is discussed in this blog post." width="650" /></a><div class="cite">Multiple computers were onboard an Apollo mission. The Launch Vehicle Data Adapter (LVDA) is discussed in this blog post.</div></p> <p>The LVDA and LVDC were mounted in the rocket's Instrument Unit, a ring between the rocket stages and the payload, the Apollo spacecraft. The Instrument Unit contained the guidance and control systems for the Saturn V rocket as well as extensive telemetry systems sending hundreds of parameters to the ground.</p> <p><a href="http://static.righto.com/images/lvda/IU-labeled.jpg"><img alt="The Saturn V Instrument Unit under construction. The LVDC (Launch Vehicle Digital Computer) and LVDA (Launch Vehicle Data Adapter) are silver boxes. For scale, note the engineer sitting on the left. Photo from NASA." class="hilite" height="329" src="http://static.righto.com/images/lvda/IU-labeled-w500.jpg" title="The Saturn V Instrument Unit under construction. The LVDC (Launch Vehicle Digital Computer) and LVDA (Launch Vehicle Data Adapter) are silver boxes. For scale, note the engineer sitting on the left. Photo from NASA." width="500" /></a><div class="cite">The Saturn V Instrument Unit under construction. The LVDC (Launch Vehicle Digital Computer) and LVDA (Launch Vehicle Data Adapter) are silver boxes. For scale, note the engineer sitting on the left. Photo from <a href="https://commons.wikimedia.org/wiki/File:Four_IUs.jpg">NASA</a>.</div></p> <p><!-- --> <a class="footnote-backref" href="#fnref:computers" title="Jump back to footnote 1 in the text">↩</a></p> </li> <li id="fn:block"> <p>The detailed block diagram of the LVDA below is from the <a href="https://www.ibiblio.org/apollo/Documents/IBMStudyReport-63-928-130-Volume2.pdf">IBM Study Report</a>. (Click the image for a larger version.) This diagram shows that the LVDA has many different functions, registers, and circuits, with many connections to the LVDC (left) and the Instrument Unit (top and bottom). The board I examined is part of the "Digital Input Multiplexer", highlighted in yellow. Note the various data sources feeding into the multiplexer.</p> <p><a href="http://static.righto.com/images/lvda/block-diagram-large.png"><img alt="Block diagram from IBM Study Report." class="hilite" height="454" src="http://static.righto.com/images/lvda/block-diagram-large-w750.png" title="Block diagram from IBM Study Report." width="750" /></a><div class="cite">Block diagram from <a href="https://www.ibiblio.org/apollo/Documents/IBMStudyReport-63-928-130-Volume2.pdf">IBM Study Report</a>.</div></p> <p><!-- --> <a class="footnote-backref" href="#fnref:block" title="Jump back to footnote 2 in the text">↩</a></p> </li> <li id="fn:tube"> <p>IBM's use of diode-based AND-OR logic goes back to vacuum tube computers from the 1950s. The large 700-series computers primarily used AND-OR diode networks for their logic, with vacuum tubes for amplification instead of transistors. The photo below shows an 8-tube module. <!-- Unlike DTL logic, the tubes were non-inverting (they implemented a "cathode follower"), so inverters were implemented separately. --> Note the large number of diodes (black components with white stripes) in the module below. I think the role of semiconductor diodes is largely ignored in the era of vacuum tube computers. The IBM 709, for instance, used 2000 vacuum tubes and 14,500 diodes in its arithmetic unit. <!-- BRL page 504 --></p> <p><a href="http://static.righto.com/images/lvda/503041.jpg"><img alt="Tube module from an IBM 700-series computer in the 1950s. Note the many diodes, especially in the lower left." class="hilite" height="300" src="http://static.righto.com/images/lvda/503041-w400.jpg" title="Tube module from an IBM 700-series computer in the 1950s. Note the many diodes, especially in the lower left." width="400" /></a><div class="cite">Tube module from an IBM 700-series computer in the 1950s. Note the many diodes, especially in the lower left.</div></p> <p><!-- --> <a class="footnote-backref" href="#fnref:tube" title="Jump back to footnote 3 in the text">↩</a></p> </li> <li id="fn:clock"> <p>One unusual feature of the LVDC's gates is that the pull-up resistor often isn't connected to the positive voltage source, as you'd expect. Instead, it is connected to a clock signal. When the clock is high, the AND gate functions normally, but when the clock is low, the AND gate is disabled. This has two benefits. First, the pull-up acts as an additional input, ANDing the clock into the result. Second, this reduces power consumption, since there is no current through the pull-up resistor when the clock is low. <a class="footnote-backref" href="#fnref:clock" title="Jump back to footnote 4 in the text">↩</a></p> </li> <li id="fn:braun"> <p>Dr. Wernher von Braun wrote an interesting article about the use of ULD modules for Apollo: <a href="https://books.google.com/books?id=4SUDAAAAMBAJ&pg=PA94&lpg=PA94">Tiny Computers Steer Mightiest Rockets</a> (Popular Science, Oct 1965). <a class="footnote-backref" href="#fnref:braun" title="Jump back to footnote 5 in the text">↩</a></p> </li> <li id="fn:liminal"> <p>The ULD logic chips exist in a liminal space, a transition between individual components and integrated circuits. They are not arbitrary components, but neither are they logic gates with defined functions. Instead, they are sets of components that can be pieced together into gates in flexible ways. <a class="footnote-backref" href="#fnref:liminal" title="Jump back to footnote 6 in the text">↩</a></p> </li> <li id="fn:pinout"> <p>While the ULD chips have 14 pins, the numbering doesn't match normal 14-pin integrated circuits. The top contacts are numbered 1 through 7 (left to right), and the bottom contacts are 8 through 14 (left to right). (Note that <a href="http://www.frantone.com/designwritings/design_writings_LVDC.html">The Apollo Saturn V LVDC Project</a> does not use the IBM numbering.) In addition, the circuit board can only use 12 of the pins because of the 12 vias at each position; contacts 4 and 11 (the middle ones) are not connected. <a class="footnote-backref" href="#fnref:pinout" title="Jump back to footnote 7 in the text">↩</a></p> </li> <li id="fn:documentation"> <p>There is very little documentation available for the LVDC and even less for the LVDA. The <a href="https://www.ibiblio.org/apollo/links.html#LVDC">Virtual AGC document library</a> is the best source that I found. In particular, the strangely-named "Laboratory Maintenance Instructions for LVDC" <a href="https://www.ibiblio.org/apollo/Documents/LaboratoryMaintenanceInstructionsForLVDC-Volume1-GeneralDescriptionAndTheory.pdf">volume 1</a> and <a href="https://www.ibiblio.org/apollo/Documents/LaboratoryMaintenanceInstructionsForLVDC-Volume2-MaintenanceData.pdf">volume 2</a> provide detailed explanations and schematics. The recently-uncovered "Laboratory Maintenance Instructions for LVDA" <a href="http://www.ibiblio.org/apollo/Documents/19730064316_1973064316.pdf">volume 1</a> and <a href="http://www.ibiblio.org/apollo/Documents/19730064317_1973064317.pdf">volume 2</a> provide similar detail for the LVDA. The <a href="https://www.ibiblio.org/apollo/Documents/MSFC-III-5-509-4-Saturn1BVInstrumentUnitSystemDescriptionAndComponentData.pdf">System Description and Component Data</a> has photos of the Instrument Unit components and brief descriptions. The <a href="https://www.ibiblio.org/apollo/Documents/MSFC-MAN-507-SaturnVFlightManual-SA507.pdf">Saturn V Flight Manual</a> discusses the LVDC and LVDA at a high level. The <a href="https://www.ibiblio.org/apollo/Documents/IBMStudyReport-63-928-130-Volume2.pdf">IBM Apollo Study Report</a> has more high-level information on the LVDC and LVDA and some nice diagrams. To get more information the LVDC and LVDA, I'll need to visit the US Space and Rocket Center in Huntsville, Alabama, but currently travel is off the table. <a class="footnote-backref" href="#fnref:documentation" title="Jump back to footnote 8 in the text">↩</a></p> </li> <li id="fn:latch"> <p>The latch is a circuit to store a single bit; it is a standard <a href="https://en.wikipedia.org/wiki/Flip-flop_(electronics)#SR_NOR_latch">SR NOR latch</a>, built by cross-coupling two NOR gates. <a class="footnote-backref" href="#fnref:latch" title="Jump back to footnote 9 in the text">↩</a></p> </li> <li id="fn:board"> <p>The schematic for the board is below. (Click for full-size.) Each box corresponds to a logic element, part of a chip. The top line "A", "I" shows the element type (AND, INVERT) while the bottom line ("A31") shows the chip position on the board. ("NU" indicates "Not Used"; the board is wired with the circuitry but the chip is not installed.) The left side of the schematic is the input buffers, while the right side is the logic. </p> <p><a href="http://static.righto.com/images/lvda/board-schematic-15.jpg"><img alt="Schematic of the board. From Laboratory Maintenance Instructions for LVDA, Volume II, page 10-114." class="hilite" height="441" src="http://static.righto.com/images/lvda/board-schematic-15-w400.jpg" title="Schematic of the board. From Laboratory Maintenance Instructions for LVDA, Volume II, page 10-114." width="400" /></a><div class="cite">Schematic of the board. From <a href="https://www.ibiblio.org/apollo/Documents/19730064317_1973064317.pdf">Laboratory Maintenance Instructions for LVDA, Volume II</a>, page 10-114.</div></p> <p><!-- --> <a class="footnote-backref" href="#fnref:board" title="Jump back to footnote 10 in the text">↩</a></p> </li> <li id="fn:part"> <p>Most of the chips in the LVDA/LVDC have descriptive alphabetic codes such as INV (invert), DLD (delay line driver), or ED (error detector). However, the analog chips on the board have numbers instead: 321, 322, 323, and 324. It looks like instead of coming up with descriptive names for these chips, they just took the last three digits of the part number, e.g. "323" has part number "6000323". I also noticed that on the 6000322 parts, the last "2" has been retouched on the chips; I'm not sure what significance that has. <a class="footnote-backref" href="#fnref:part" title="Jump back to footnote 11 in the text">↩</a></p> </li> <li id="fn:discretes"> <p>The "discretes", the binary inputs to the LVDA/LVDC, consisted of high-level signals such as "Liftoff", "S-IB Outboard Engine Out", "S-IVB Engine Manual Cutoff", or "S-IB Stage Separation". I was surprised that the hundreds of measurements throughout the rocket are ignored by the computer; it only cares about the major state transitions such as the engine stopping and a stage separating. (As well as the inertial guidance data, which was key to the computer's navigation.) <a class="footnote-backref" href="#fnref:discretes" title="Jump back to footnote 12 in the text">↩</a></p> </li> <li id="fn:unused"> <p>The board has nine empty positions where modules aren't installed, but these positions are wired into the circuitry. The purpose of this is that the same circuit board can be used for multiple functions based on which chips are installed. Specifically, the multiplexer used 13 boards of which 4 were identical to the one I examined, 8 had a few different chips, and 1 was entirely different. The reason for this is that the multiplexer was 14 bits wide, while the inputs were of varying widths. For instance, there were 8 Discrete Input Spares and 10 Telemetry Scanner bits. Thus, some of the boards didn't use some of the inputs and those chips could be omitted, saving a small amount of weight and cost. The diagram below shows the missing chips that can be added.<span id="fnref2:unused"><a class="ref" href="#fn:unused">13</a></span></p> <p><a href="http://static.righto.com/images/lvda/board-changes.jpg"><img alt="The circuit board with the missing chips filled in. The chip with an X could be replaced by the 321 below it. Original photo courtesy of Fran Blanche." class="hilite" height="354" src="http://static.righto.com/images/lvda/board-changes-w400.jpg" title="The circuit board with the missing chips filled in. The chip with an X could be replaced by the 321 below it. Original photo courtesy of Fran Blanche." width="400" /></a><div class="cite">The circuit board with the missing chips filled in. The chip with an X could be replaced by the 321 below it. Original photo courtesy of <a href="http://www.frantone.com/designwritings/design_writings_LVDC.html">Fran Blanche</a>.</div></p> <p>The board had two unused inputs; to use these, additional 321/322/323 chips were installed. The board also had one input wired up so it could use either a 324 input chip (as in the board I examined) or a 321 input chip. The 321 chip was used for a discrete input that used standard 28-volt signaling, while the 324 chip was used for a signal that was either grounded or floating. The 324 chip included a diode and pull-up resistors. By putting the necessary chip in the appropriate spot, the same PCB could be used for either type of input.</p> <p>Two of the boards included an extra logic gate separate from the multiplexer (the INV and AA chips). These gates generated the signals to switch the command input between the RCA-110 mainframe when on the ground, and the radio command decoder after liftoff. In other words, when the umbilical cable pulled out of the Instrument Unit during launch, the signal ("ICS") from the ground computer was lost. Through these two gates, the multiplexer switched the command input from the ground computer to the command decoder, enabling radio commands for the LVDC. <a class="footnote-backref" href="#fnref:unused" title="Jump back to footnote 13 in the text">↩</a><a class="footnote-backref" href="#fnref2:unused" title="Jump back to footnote 13 in the text">↩</a></p> </li> <li id="fn:rca"> <p>The RCA-110A computer that communicated with the rocket was in the mobile launch platform, complete with card reader, keypunch, and line printer. In other words, they were moving a whole computer room on the crawler out to the launch pad, with the rocket mounted on top. (In the photo below, the computer room is at the front left of the blue launch platform, under the launcher-umbilical tower.) It communicated with a second RCA-110A computer in the firing room. For details on the mobile launcher and swing arms, see <a href="https://www.apollomaniacs.com/apollo/mobile_launcher_en.htm">Apollo Maniacs</a> or the book <a href="https://amzn.to/3dZwrtN">Rocket Ranch</a>. To summarize the wiring, cables went from the RCA-110A computer room near the rocket nozzles, up the tower and across swing arm 7, through the umbilical panel, and to the LVDA. One bit of these signals went to the multiplexer board I examined.</p> <!-- floor plan https://www.scribd.com/document/43980774/Apollo-Saturn-V-Systems-Familiarization --> <!-- Rocket Ranch page 288 --> <p><a href="http://static.righto.com/images/lvda/mobile-platform.jpg"><img alt="Apollo 11 Saturn V on the mobile platform, July 1, 1969. Swing arm #7 (marked with arrow) is connected to the Instrument Unit and the top of the S-IVB stage. Photo from NASA." class="hilite" height="620" src="http://static.righto.com/images/lvda/mobile-platform-w350.jpg" title="Apollo 11 Saturn V on the mobile platform, July 1, 1969. Swing arm #7 (marked with arrow) is connected to the Instrument Unit and the top of the S-IVB stage. Photo from NASA." width="350" /></a><div class="cite">Apollo 11 Saturn V on the mobile platform, July 1, 1969. Swing arm #7 (marked with arrow) is connected to the Instrument Unit and the top of the S-IVB stage. Photo from <a href="https://commons.wikimedia.org/wiki/File:Apollo_11_Saturn_V_on_the_pad_at_the_Kennedy_Space_Center.jpg">NASA</a>.</div></p> <p><!-- video https://youtu.be/4yLP_GPsasc --> <!-- link https://theorbitalmechanics.com/show-notes/sv-umbilicals --> <!-- https://www.apollomaniacs.com/apollo/mobile_launcher_en.htm --></p> <p><!-- <img alt="This diagram shows the umbilical connections from the swing arm to the Instrument Unit. The electrical cable connectorsw (A) are the relevant ones. From <a href="https://www.ibiblio.org/apollo/Documents/MSFC-III-5-509-4-Saturn1BVInstrumentUnitSystemDescriptionAndComponentData.pdf">System Description and Component Data</a>." src="umbilical.jpg" title="w450" /> --> <a class="footnote-backref" href="#fnref:rca" title="Jump back to footnote 14 in the text">↩</a></p> </li> <li id="fn:4pi"> <p>IBM's 4 Pi series aerospace computers in the 1960s used the same mechanical board structure as the LVDC, with two multi-layer boards mounted on a "page" mounted in a metal frame. The 4 Pi boards were also double-width or triple-wide compared to the LVDC boards, using two or three of the same 98-pin connections. (Compare the board below with the board that I examined.) The circuitry was entirely different though; the 4 Pi boards used flat-pack TTL integrated circuits instead of ULD modules. The 4 Pi architectures and instruction sets were also entirely different from the LVDC. These early 4 Pi systems were used in aircraft such as the A-7E, F-111 and space missions such as Skylab. The 4 Pi series led to the AP-101 computer used on the Space Shuttle.</p> <p><a href="http://static.righto.com/images/lvda/4pi-board.jpg"><img alt="An IBM 4 Pi page. From Technical Description of IBM System 4 Pi Computers (1967). " class="hilite" height="265" src="http://static.righto.com/images/lvda/4pi-board-w500.jpg" title="An IBM 4 Pi page. From Technical Description of IBM System 4 Pi Computers (1967). " width="500" /></a><div class="cite">An IBM 4 Pi page. From <a href="http://www.bitsavers.org/pdf/ibm/4pi/Technical_Description_of_IBM_System_4_Pi_Computers_1967.pdf">Technical Description of IBM System 4 Pi Computers</a> (1967). </div></p> <p><!-- --> <a class="footnote-backref" href="#fnref:4pi" title="Jump back to footnote 15 in the text">↩</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/6559577386004667938' onclick=''> 8 comments: </a> </span> <span class='post-icons'> <span class='item-action'> <a href='https://www.blogger.com/email-post/6264947694886887540/6559577386004667938' 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=6559577386004667938&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=6559577386004667938&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=6559577386004667938&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=6559577386004667938&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=6559577386004667938&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=6559577386004667938&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='http://www.righto.com/search/label/electronics' rel='tag'>electronics</a>, <a href='http://www.righto.com/search/label/reverse-engineering' rel='tag'>reverse-engineering</a>, <a href='http://www.righto.com/search/label/space' rel='tag'>space</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='http://www.righto.com/search?updated-max=2020-07-18T09:16:00-07: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='http://www.righto.com/search?updated-max=2020-04-08T09:05:00-07:00&max-results=7' id='Blog1_blog-pager-older-link' title='Older Posts'>Older Posts</a> </span> <a class='home-link' href='http://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='http://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_vuczV1215b8ck26VVF2qV7Tx4v6oPd8Q9XEo-Kk3wHbSCm9CunmcZdweQP017BPPuwmfRsHEwbDGUOy2ZZka0HVclzHVyKEpWjo4qB9X61yODriKaXjv0n9Hm10Pan31kb0g=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href='http://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='http://www.righto.com/2024/05/blog-post.html' target='_blank'> <img alt='' border='0' src='https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_urzeeE3XF5_MwSP16JZCSMJBJ2jjdZba6MYBH2cOveyMamDHsoTDJMuXjKMMoXeN8Y9EU6CwH--xPUF7IHVwy6_SWYALb6OPNwq44iQOY8mEV_B-SeRtfWPibL8-PrV-N_VfFg3oFIieF9vSZgrH2V=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href='http://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='http://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_tf2sc9sIGAjwPkLgw63URHnpR2zjB3RrAkGbkyoetJndpMCdLnBGzTZc9PhCQ9ZA5UlJZbAfnIIy0n5QforV5zKY_SFZDhsyLN5PiEJKc28To=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href='http://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='http://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_u35LX-iEkB-Q78bD0Lm8lHpjGfRCixrg_I3zEYoBCCO0MIU-kP-gAFg-DV3L7liD_92oktJO1epJ7D11FaBm2IGDwZnyqbfFKWaTci8T8S2xNa0x8_H__cMTbGunuz9NJW7vLfehHvYwvxfIAHjovwqOw=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href='http://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='http://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_v0Fq8NjrdxW-vD7cQBSPmxuonCp1jYs4bHqw9uQyImZ29oRVJ42TYcxQmGa2uH_klJ3Zchwd9y8O1UMu4D1kWrkulGX7LRe0yXPkvR66rHiDwp9p5M5N4rZZTQ93KjK_De=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href='http://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='http://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_v__DN5s-V1Y1FJiPH3_Eph3J17GId0a2BhfSrNQTSrcSXAwkl-HwJpj2NydZybxmqmu1xavyWel1KNnIoVHlyoI9knZz2ZmMgBGHoCUqvzTHOUZk2uIRuYah67LNoNSQ=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href='http://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='http://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_uldR_BUCPMuBPs4x_ULBAEpub2ixkvgT3JUf_XHLwShlz8yXZVJIxiV8IjQ8jQxVN1GP5mx1llcSN6f6CB3_-uczwlYPC1qjvT5BtqG75Td5QwYphuTTmlF4L8mDs=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href='http://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='http://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_vl1p8LXpI4wpY4pDhvfx_BQ7kymAB5ByaUSRnqvjqC3VkA7QvYzz6NDnvTfFD_qkzYxb07FjfmvWQXxuXBCuJ2E4ft7r5nZWYxefSCmmiiQuu09hyBpuJwZF1bb4h8Vg=w72-h72-p-k-no-nu'/> </a> </div> <div class='item-title'><a href='http://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='http://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='http://www.righto.com/search/label/386'>386</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/6502'>6502</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/8008'>8008</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/8085'>8085</a> </span> <span class='label-size label-size-4'> <a dir='ltr' href='http://www.righto.com/search/label/8086'>8086</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/8087'>8087</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/8088'>8088</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/aerospace'>aerospace</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/alto'>alto</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/analog'>analog</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/Apollo'>Apollo</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/apple'>apple</a> </span> <span class='label-size label-size-4'> <a dir='ltr' href='http://www.righto.com/search/label/arc'>arc</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/arduino'>arduino</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/arm'>arm</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/beaglebone'>beaglebone</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/bitcoin'>bitcoin</a> </span> <span class='label-size label-size-1'> <a dir='ltr' href='http://www.righto.com/search/label/c%23'>c#</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/cadc'>cadc</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/calculator'>calculator</a> </span> <span class='label-size label-size-4'> <a dir='ltr' href='http://www.righto.com/search/label/chips'>chips</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/css'>css</a> </span> <span class='label-size label-size-1'> <a dir='ltr' href='http://www.righto.com/search/label/datapoint'>datapoint</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/dx7'>dx7</a> </span> <span class='label-size label-size-5'> <a dir='ltr' href='http://www.righto.com/search/label/electronics'>electronics</a> </span> <span class='label-size label-size-1'> <a dir='ltr' href='http://www.righto.com/search/label/f%23'>f#</a> </span> <span class='label-size label-size-1'> <a dir='ltr' href='http://www.righto.com/search/label/fairchild'>fairchild</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/fpga'>fpga</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/fractals'>fractals</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/genome'>genome</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/globus'>globus</a> </span> <span class='label-size label-size-1'> <a dir='ltr' href='http://www.righto.com/search/label/haskell'>haskell</a> </span> <span class='label-size label-size-1'> <a dir='ltr' href='http://www.righto.com/search/label/HP'>HP</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/html5'>html5</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/ibm'>ibm</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/ibm1401'>ibm1401</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/ibm360'>ibm360</a> </span> <span class='label-size label-size-4'> <a dir='ltr' href='http://www.righto.com/search/label/intel'>intel</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/ipv6'>ipv6</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/ir'>ir</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/java'>java</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/javascript'>javascript</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/math'>math</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/microcode'>microcode</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/oscilloscope'>oscilloscope</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/Pentium'>Pentium</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/photo'>photo</a> </span> <span class='label-size label-size-4'> <a dir='ltr' href='http://www.righto.com/search/label/power%20supply'>power supply</a> </span> <span class='label-size label-size-4'> <a dir='ltr' href='http://www.righto.com/search/label/random'>random</a> </span> <span class='label-size label-size-5'> <a dir='ltr' href='http://www.righto.com/search/label/reverse-engineering'>reverse-engineering</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/sheevaplug'>sheevaplug</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/snark'>snark</a> </span> <span class='label-size label-size-3'> <a dir='ltr' href='http://www.righto.com/search/label/space'>space</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/spanish'>spanish</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/synth'>synth</a> </span> <span class='label-size label-size-4'> <a dir='ltr' href='http://www.righto.com/search/label/teardown'>teardown</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://www.righto.com/search/label/theory'>theory</a> </span> <span class='label-size label-size-1'> <a dir='ltr' href='http://www.righto.com/search/label/unicode'>unicode</a> </span> <span class='label-size label-size-2'> <a dir='ltr' href='http://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 collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='http://www.righto.com/2025/'> 2025 </a> <span class='post-count' dir='ltr'>(5)</span> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='http://www.righto.com/2025/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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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 expanded'> <a class='toggle' href='javascript:void(0)'> <span class='zippy toggle-open'> ▼  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://www.righto.com/2020/05/'> May </a> <span class='post-count' dir='ltr'>(4)</span> </li> </ul> <ul class='hierarchy'> <li class='archivedate expanded'> <a class='toggle' href='javascript:void(0)'> <span class='zippy toggle-open'> ▼  </span> </a> <a class='post-count-link' href='http://www.righto.com/2020/04/'> April </a> <span class='post-count' dir='ltr'>(2)</span> <ul class='posts'> <li><a href='http://www.righto.com/2020/04/inside-am2901-amds-1970s-bit-slice.html'>Inside the Am2901: AMD's 1970s bit-slice processor</a></li> <li><a href='http://www.righto.com/2020/04/a-circuit-board-from-saturn-v-rocket.html'>A circuit board from the Saturn V rocket, reverse-...</a></li> </ul> </li> </ul> <ul class='hierarchy'> <li class='archivedate collapsed'> <a class='toggle' href='javascript:void(0)'> <span class='zippy'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'> ►  </span> </a> <a class='post-count-link' href='http://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'] = 'AOuZoY7eHbx37KPDi0WDrAmO4AwMp5vuAQ:1740591093643';_WidgetManager._Init('//www.blogger.com/rearrange?blogID\x3d6264947694886887540','//www.righto.com/2020/04/','6264947694886887540'); _WidgetManager._SetDataContext([{'name': 'blog', 'data': {'blogId': '6264947694886887540', 'title': 'Ken Shirriff\x27s blog', 'url': 'http://www.righto.com/2020/04/', 'canonicalUrl': 'http://www.righto.com/2020/04/', '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': '', '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/f04e4d11442969dd', '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': 'archive', 'pageName': 'April 2020', 'pageTitle': 'Ken Shirriff\x27s blog: April 2020'}}, {'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/2020/04/', 'type': 'feed', 'isSingleItem': false, 'isMultipleItems': true, 'isError': false, 'isPage': false, 'isPost': false, 'isHomepage': false, 'isArchive': true, 'isLabelSearch': false, 'archive': {'year': 2020, 'month': 4, 'rangeMessage': 'Showing posts from April, 2020'}}}]); _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>